ZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL05PVElDRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTk4NzgxMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzICAgICAgICAgICAgICAgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0Y2ExNTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPk15RmFjZXMgRmFjZWxldHMgQXJjaGV0eXBlPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gTXlGYWNlcyBhbmQgRmFjZWxldHM8L2Rlc2NyaXB0aW9uPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4vYXJjaGV0eXBlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWZhNTUwMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi9hcmNoZXR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotPGFyY2hldHlwZT4KLSAgPGlkPm1hdmVuLWFyY2hldHlwZS1teWZhY2VzLWZhY2VsZXRzPC9pZD4KLSAgPHNvdXJjZXM+Ci0gICAgPHNvdXJjZT5zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmE8L3NvdXJjZT4KLSAgPC9zb3VyY2VzPgotICA8dGVzdFNvdXJjZXM+DQotICA8IS0tIAotICAgIDxzb3VyY2U+c3JjL3Rlc3QvamF2YS9BcHBUZXN0LmphdmE8L3NvdXJjZT4NCi0gICAgIC0tPgotICA8L3Rlc3RTb3VyY2VzPg0KLSAgPHJlc291cmNlcz4NCi0gICAgPHJlc291cmNlPnNyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXM8L3Jlc291cmNlPg0KLSAgCTxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9yZXNvdXJjZT4NCi0gIAk8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbDwvcmVzb3VyY2U+DQotICAJPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sPC9yZXNvdXJjZT4NCi0gIAk8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2luZGV4LmpzcDwvcmVzb3VyY2U+DQotICAJPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbDwvcmVzb3VyY2U+DQotICAJPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC90ZW1wbGF0ZS54aHRtbDwvcmVzb3VyY2U+DQotICA8L3Jlc291cmNlcz4KLTwvYXJjaGV0eXBlPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2Y2NDUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE3NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH08L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxuYW1lPkEgY3VzdG9tIHByb2plY3QgdXNpbmcgbXlmYWNlczwvbmFtZT4KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPGpzZi1teWZhY2VzLnZlcnNpb24+MS4yLjc8L2pzZi1teWZhY2VzLnZlcnNpb24+Ci0gICAgICAgIDxqc2YtcmkudmVyc2lvbj4xLjJfMTM8L2pzZi1yaS52ZXJzaW9uPiAgICAgICAgCi0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMTY8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgCi0gICAgPHByb2ZpbGVzPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIEFjdGl2ZSBhZGRpbmcgLURqc2Y9cmkgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4KLSAgICAgICAgICAgIDxpZD5qc2Ytcmk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yaTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBEZWJ1ZyBwcm9maWxlIGZvciBteWZhY2VzIGFuZCBqZXR0eS4KLSAgICAgICAgICAgICAgICBJdCBhbGxvd3MgdG8gc2VlIGRlYnVnIG1lc3NhZ2VzIHVzaW5nIC1QamV0dHlDb25maWcgLS0+Ci0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxyZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vbG9nNGo8L2RpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8L3Jlc291cmNlcz4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcubW9ydGJheS5qZXR0eTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxuYW1lPm9yZy5hcGFjaGUuY29tbW9ucy5sb2dnaW5nLkxvZzwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvYnVpbGQ+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci0KLSAgICA8cmVwb3NpdG9yaWVzPgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxyZWxlYXNlcz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4KLSAgICAgICAgICAgIDwvcmVsZWFzZXM+Ci0gICAgICAgICAgICA8c25hcHNob3RzPgotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3NuYXBzaG90cz4KLSAgICAgICAgICAgIDxpZD5hcGFjaGUtbWF2ZW4tc25hcHNob3RzPC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgIDxyZXBvc2l0b3J5PgotICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL2Rvd25sb2FkLmphdmEubmV0L21hdmVuLzE8L3VybD4KLSAgICAgICAgICAgIDxsYXlvdXQ+bGVnYWN5PC9sYXlvdXQ+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRvbWFoYXdrPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+dG9tYWhhd2sxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS45PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPiAgICAKLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5zZXJ2bGV0PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgIAotICAgIAotICAgICAJPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uc3VuLmZhY2VsZXRzPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWZhY2VsZXRzPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE0PC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+NC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc5OTg5YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlICRwYWNrYWdlOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICogQGF1dGhvciA8YSBocmVmPSJtYWlsdG86bWF0emV3QGFwYWNoZS5vcmciPk1hdHRoaWFzIFdl32VuZG9yZjwvYT4gCi0gKi8KLXB1YmxpYyBjbGFzcyBIZWxsb1dvcmxkQmFja2luZwotewotCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLQotICAgIC8qKgotICAgICAqIGRlZmF1bHQgZW1wdHkgY29uc3RydWN0b3IKLSAgICAgKi8KLSAgICBwdWJsaWMgSGVsbG9Xb3JsZEJhY2tpbmcoKQotICAgIHsKLSAgICB9Ci0KLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS1nZXR0ZXIgJiBzZXR0ZXIKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCkKLSAgICB7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYwotICAgICAgICByZXR1cm4gKCJzdWNjZXNzIik7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNTJlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1sb2c0ai5yb290TG9nZ2VyPUlORk8sIEExLCBBMgotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLQotI2xvZyBvbiBhIGZpbGUgb24gdGFyZ2V0IHRvbywgdG8gbWFrZSBlYXNpZXIgY2hlY2sgaXQKLWxvZzRqLmFwcGVuZGVyLkEyPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTIuRmlsZT10YXJnZXQvbG9nNGoubG9nCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhGaWxlU2l6ZT0xMDAwS0IKLSMgS2VlcCBvbmUgYmFja3VwIGZpbGUKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEJhY2t1cEluZGV4PTEKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lcCAldCAlYyAtICVtJW4KLQotIyBMb2cgbGV2ZWwgZm9yIG15ZmFjZXMgbGlicmFyaWVzCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zPUlORk8KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9VFJBQ0UKLWxvZzRqLmxvZ2dlci5qYXZheC5mYWNlcz1UUkFDRQotCi0jIFByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdAotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCBbJXRdICglRlw6JUwpIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZXhhbXBsZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmYWI1MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBKYXZhU2VydmVyIEZhY2VzIENvbmZpZyAxLjAvL0VOIgotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMS5kdGQiID4KLQotPGZhY2VzLWNvbmZpZz4KLQotCTxhcHBsaWNhdGlvbj4KLQkJPHZpZXctaGFuZGxlcj5jb20uc3VuLmZhY2VsZXRzLkZhY2VsZXRWaWV3SGFuZGxlcjwvdmlldy1oYW5kbGVyPgotCTwvYXBwbGljYXRpb24+Ci0KLQk8IS0tIG1hbmFnZWQgYmVhbnMgb2YgdGhlIHNpbXBsZSBoZWxsbyB3b3JsZCBhcHAgLS0+Ci0JPG1hbmFnZWQtYmVhbj4KLQkJPG1hbmFnZWQtYmVhbi1uYW1lPmhlbGxvV29ybGRCYWNraW5nPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz4KLQkJCSR7cGFja2FnZX0uSGVsbG9Xb3JsZEJhY2tpbmcKLQkJPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBoZWxsb1dvcmxkLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9oZWxsb1dvcmxkLnhodG1sPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9wYWdlMi54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0KLQk8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcCAtLT4KLQk8bmF2aWdhdGlvbi1ydWxlPgotCQk8ZnJvbS12aWV3LWlkPi9wYWdlMi54aHRtbDwvZnJvbS12aWV3LWlkPgotCQk8bmF2aWdhdGlvbi1jYXNlPgotCQkJPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+Ci0JCQk8dG8tdmlldy1pZD4vaGVsbG9Xb3JsZC54aHRtbDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzgyMjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjcxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0JKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0JKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLQkqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0JKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0JKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0JKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0JKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0JKgotCSogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQkqCi0JKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0JKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotCSogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0JKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLQkqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLQkqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLQl4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotCXhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlL3dlYi1hcHBfMl80LnhzZCIKLQl2ZXJzaW9uPSIyLjQiPgotCi0JPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5qYm9zcy5qYm9zc2ZhY2VzLldBUl9CVU5ETEVTX0pTRl9JTVBMCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTwhLS0gVXNlIERvY3VtZW50cyBTYXZlZCBhcyAqLnhodG1sIC0tPgotCTxjb250ZXh0LXBhcmFtPgotCQk8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPi54aHRtbDwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPCEtLSBTcGVjaWFsIERlYnVnIE91dHB1dCBmb3IgRGV2ZWxvcG1lbnQgLS0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPmZhY2VsZXRzLkRFVkVMT1BNRU5UPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZwotCQkJZmlsZXMuIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpIFNlZSBKU0YgMS4wIFBSRDIsCi0JCQkxMC4zLjIgQXR0ZW50aW9uOiBZb3UgZG8gbm90IG5lZWQgdG8gcHV0Ci0JCQkvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJU3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkgU2VlCi0JCQlKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMwotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCU9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9Ci0JCQlkZWZhdWx0KS4gRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3QKLQkJCXZpZXdzIGFyZSBzdG9yZWQgaW4gc2Vzc2lvbi4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuTlVNQkVSX09GX1ZJRVdTX0lOX1NFU1NJT04KLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+MjA8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJT25seSBhcHBsaWNhYmxlIGlmIHN0YXRlIHNhdmluZyBtZXRob2QgaXMgInNlcnZlciIgKD0KLQkJCWRlZmF1bHQpLiBJZiB0cnVlIChkZWZhdWx0KSB0aGUgc3RhdGUgd2lsbCBiZSBzZXJpYWxpemVkIHRvCi0JCQlhIGJ5dGUgc3RyZWFtIGJlZm9yZSBpdCBpcyB3cml0dGVuIHRvIHRoZSBzZXNzaW9uLiBJZiBmYWxzZQotCQkJdGhlIHN0YXRlIHdpbGwgbm90IGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04KLQkJPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlPbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPQotCQkJZGVmYXVsdCkgYW5kIGlmCi0JCQlvcmcuYXBhY2hlLm15ZmFjZXMuU0VSSUFMSVpFX1NUQVRFX0lOX1NFU1NJT04gaXMgdHJ1ZSAoPQotCQkJZGVmYXVsdCkgSWYgdHJ1ZSAoZGVmYXVsdCkgdGhlIHNlcmlhbGl6ZWQgc3RhdGUgd2lsbCBiZQotCQkJY29tcHJlc3NlZCBiZWZvcmUgaXQgaXMgd3JpdHRlbiB0byB0aGUgc2Vzc2lvbi4gSWYgZmFsc2UgdGhlCi0JCQlzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlCi0JCQlhbGxvd2VkIGluIHRoZSByZW5kZXJlZCBIVE1MIG91dHB1dC4gSWYgamF2YXNjcmlwdCBpcwotCQkJYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZSB0aGF0Ci0JCQlzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uIElmIGphdmFzY3JpcHQgaXMgbm90Ci0JCQlhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzIHdpbGwgYmUKLQkJCWFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLiBEZWZhdWx0OiAidHJ1ZSIKLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHRydWUsIHJlbmRlcmVkIEhUTUwgY29kZSB3aWxsIGJlIGZvcm1hdHRlZCwgc28gdGhhdCBpdCBpcwotCQkJImh1bWFuIHJlYWRhYmxlIi4gaS5lLiBhZGRpdGlvbmFsIGxpbmUgc2VwYXJhdG9ycyBhbmQKLQkJCXdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdCBpbmZsdWVuY2UgdGhlIEhUTUwKLQkJCWNvZGUuIERlZmF1bHQ6ICJ0cnVlIgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCUlmIHRydWUsIGEgamF2YXNjcmlwdCBmdW5jdGlvbiB3aWxsIGJlIHJlbmRlcmVkIHRoYXQgaXMgYWJsZQotCQkJdG8gcmVzdG9yZSB0aGUgZm9ybWVyIHZlcnRpY2FsIHNjcm9sbCBvbiBldmVyeSByZXF1ZXN0LgotCQkJQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzIHdpdGggbG9uZyBsaXN0cyBhbmQgeW91Ci0JCQlkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AgaWYKLQkJCXlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUKLQkJCXBhZ2UuIERlZmF1bHQ6ICJmYWxzZSIKLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFVVE9fU0NST0xMPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0JPC9jb250ZXh0LXBhcmFtPgotCi0JPGNvbnRleHQtcGFyYW0+Ci0JCTxkZXNjcmlwdGlvbj4KLQkJCVVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50Ci0JCQlzaWRlIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uCi0JCQlmb3IgaW5zdHJ1Y3Rpb25zIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yCi0JCQlkaWZmZW5lbnQgZW5jcnlwdGlvbiBzdHJlbmd0aHMuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRUNSRVQ8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT5OelkxTkRNeU1UQT08L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlWYWxpZGF0ZSBtYW5hZ2VkIGJlYW5zLCBuYXZpZ2F0aW9uIHJ1bGVzIGFuZCBlbnN1cmUgdGhhdAotCQkJZm9ybXMgYXJlIG5vdCBuZXN0ZWQuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5WQUxJREFURTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlUcmVhdCByZWFkb25seSBzYW1lIGFzIGlmIGRpc2FibGVkIGF0dHJpYnV0ZSB3YXMgc2V0IGZvcgotCQkJc2VsZWN0IGVsZW1lbnRzLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT4KLQkJCW9yZy5hcGFjaGUubXlmYWNlcy5SRUFET05MWV9BU19ESVNBQkxFRF9GT1JfU0VMRUNUUwotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuCi0JCQlhIHJlc291cmNlIGlzIGFkZGVkIHRvIHRoZSBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nCi0JCQlTdHJlYW1pbmdBZGRSZXNvdXJjZSBoZXJlIGhlbHBzIHdpdGggcGVyZm9ybWFuY2UuIElmIHlvdQotCQkJd2FudCB0byBhZGQgY3VzdG9tIGNvbXBvbmVudHMgYW5kIHdhbnQgdG8gdXNlIHRoZQotCQkJRXh0ZW5zaW9uRmlsdGVyLCB5b3UgbmVlZCB0byBwcm92aWRlIHlvdXIgY3VzdG9tCi0JCQlpbXBsZW1lbnRhdGlvbiBoZXJlLgotCQk8L2Rlc2NyaXB0aW9uPgotCQk8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+Ci0JCQlvcmcuYXBhY2hlLm15ZmFjZXMucmVuZGVya2l0Lmh0bWwudXRpbC5EZWZhdWx0QWRkUmVzb3VyY2UKLQkJPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJVmlydHVhbCBwYXRoIGluIHRoZSBVUkwgd2hpY2ggdHJpZ2dlcnMgbG9hZGluZyBvZiByZXNvdXJjZXMKLQkJCWZvciB0aGUgTXlGYWNlcyBleHRlbmRlZCBjb21wb25lbnRzIGluIHRoZSBFeHRlbnNpb25GaWx0ZXIuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSAotCQk8L3BhcmFtLW5hbWU+Ci0JCTxwYXJhbS12YWx1ZT4vZmFjZXMvbXlGYWNlc0V4dGVuc2lvblJlc291cmNlPC9wYXJhbS12YWx1ZT4KLQk8L2NvbnRleHQtcGFyYW0+Ci0KLQk8Y29udGV4dC1wYXJhbT4KLQkJPGRlc2NyaXB0aW9uPgotCQkJQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0JCTwvZGVzY3JpcHRpb24+Ci0JCTxwYXJhbS1uYW1lPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLkNIRUNLX0VYVEVOU0lPTlNfRklMVEVSCi0JCTwvcGFyYW0tbmFtZT4KLQkJPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTxjb250ZXh0LXBhcmFtPgotCQk8ZGVzY3JpcHRpb24+Ci0JCQlEZWZpbmUgcGFydGlhbCBzdGF0ZSBzYXZpbmcgYXMgdHJ1ZS9mYWxzZS4KLQkJPC9kZXNjcmlwdGlvbj4KLQkJPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuUEFSVElBTF9TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotCQk8cGFyYW0tdmFsdWU+ZmFsc2U8L3BhcmFtLXZhbHVlPgotCTwvY29udGV4dC1wYXJhbT4KLQotCTwhLS0gRXh0ZW5zaW9ucyBGaWx0ZXIgLS0+Ci0JPGZpbHRlcj4KLQkJPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotCQk8ZmlsdGVyLWNsYXNzPgotCQkJb3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5maWx0ZXIuRXh0ZW5zaW9uc0ZpbHRlcgotCQk8L2ZpbHRlci1jbGFzcz4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJU2V0IHRoZSBzaXplIGxpbWl0IGZvciB1cGxvYWRlZCBmaWxlcy4gRm9ybWF0OiAxMCAtIDEwCi0JCQkJYnl0ZXMgMTBrIC0gMTAgS0IgMTBtIC0gMTAgTUIgMWcgLSAxIEdCCi0JCQk8L2Rlc2NyaXB0aW9uPgotCQkJPHBhcmFtLW5hbWU+dXBsb2FkTWF4RmlsZVNpemU8L3BhcmFtLW5hbWU+Ci0JCQk8cGFyYW0tdmFsdWU+MTAwbTwvcGFyYW0tdmFsdWU+Ci0JCTwvaW5pdC1wYXJhbT4KLQkJPGluaXQtcGFyYW0+Ci0JCQk8ZGVzY3JpcHRpb24+Ci0JCQkJU2V0IHRoZSB0aHJlc2hvbGQgc2l6ZSAtIGZpbGVzIGJlbG93IHRoaXMgbGltaXQgYXJlCi0JCQkJc3RvcmVkIGluIG1lbW9yeSwgZmlsZXMgYWJvdmUgdGhpcyBsaW1pdCBhcmUgc3RvcmVkIG9uCi0JCQkJZGlzay4KLQotCQkJCUZvcm1hdDogMTAgLSAxMCBieXRlcyAxMGsgLSAxMCBLQiAxMG0gLSAxMCBNQiAxZyAtIDEgR0IKLQkJCTwvZGVzY3JpcHRpb24+Ci0JCQk8cGFyYW0tbmFtZT51cGxvYWRUaHJlc2hvbGRTaXplPC9wYXJhbS1uYW1lPgotCQkJPHBhcmFtLXZhbHVlPjEwMGs8L3BhcmFtLXZhbHVlPgotCQk8L2luaXQtcGFyYW0+Ci0JPC9maWx0ZXI+Ci0KLQk8ZmlsdGVyLW1hcHBpbmc+Ci0JCTxmaWx0ZXItbmFtZT5leHRlbnNpb25zRmlsdGVyPC9maWx0ZXItbmFtZT4KLQkJPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLQk8L2ZpbHRlci1tYXBwaW5nPgotCTxmaWx0ZXItbWFwcGluZz4KLQkJPGZpbHRlci1uYW1lPmV4dGVuc2lvbnNGaWx0ZXI8L2ZpbHRlci1uYW1lPgotCQk8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPgotCTwvZmlsdGVyLW1hcHBpbmc+Ci0KLQk8IS0tIEZhY2VzIFNlcnZsZXQgLS0+Ci0JPHNlcnZsZXQ+Ci0JCTxzZXJ2bGV0LW5hbWU+RmFjZXMgU2VydmxldDwvc2VydmxldC1uYW1lPgotCQk8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPgotCQk8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLQk8L3NlcnZsZXQ+Ci0KLQk8IS0tIEZhY2VzIFNlcnZsZXQgTWFwcGluZyAtLT4KLQk8c2VydmxldC1tYXBwaW5nPgotCQk8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLQkJPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLQk8L3NlcnZsZXQtbWFwcGluZz4KLQotCTwhLS0gV2VsY29tZSBmaWxlcyAtLT4KLQk8d2VsY29tZS1maWxlLWxpc3Q+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0JCTx3ZWxjb21lLWZpbGU+aW5kZXguaHRtbDwvd2VsY29tZS1maWxlPgotCTwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLnhodG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MWZkMzk5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtZmFjZWxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQueGh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBUcmFuc2l0aW9uYWwvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtdHJhbnNpdGlvbmFsLmR0ZCI+DQotPGh0bWwgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGh0bWwiDQotCXhtbG5zOnVpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9mYWNlbGV0cyINCi0JeG1sbnM6Zj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSINCi0JeG1sbnM6aD0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCI+DQotPGhlYWQ+DQotPHRpdGxlPkhlbGxvIFdvcmxkPC90aXRsZT4NCi08L2hlYWQ+DQotPGJvZHk+DQotPHVpOmNvbXBvc2l0aW9uIHRlbXBsYXRlPSIvdGVtcGxhdGUueGh0bWwiPg0KLQ0KLQk8dWk6ZGVmaW5lIG5hbWU9ImJvZHkiPg0KLQkJPGg6Zm9ybSBpZD0iZm9ybSI+DQotCQkJPGg6cGFuZWxHcmlkIGlkPSJncmlkIiBjb2x1bW5zPSIyIj4NCi0JCQkJPGg6b3V0cHV0VGV4dCBpZD0ib3V0cHV0MSIgdmFsdWU9IlBsZWFzZSBlbnRlciB5b3VyIG5hbWUiIC8+DQotCQkJCTxoOmlucHV0VGV4dCBpZD0iaW5wdXQxIiB2YWx1ZT0iI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfSINCi0JCQkJCXJlcXVpcmVkPSJ0cnVlIiAvPg0KLQkJCQk8aDpjb21tYW5kQnV0dG9uIGlkPSJidXR0b24xIiB2YWx1ZT0icHJlc3MgbWUiDQotCQkJCQlhY3Rpb249IiN7aGVsbG9Xb3JsZEJhY2tpbmcuc2VuZH0iIC8+DQotCQkJCTxoOm1lc3NhZ2UgaWQ9Im1lc3NhZ2UxIiBmb3I9ImlucHV0MSIgLz4NCi0JCQk8L2g6cGFuZWxHcmlkPg0KLQkJPC9oOmZvcm0+DQotCTwvdWk6ZGVmaW5lPg0KLTwvdWk6Y29tcG9zaXRpb24+DQotPC9ib2R5Pg0KLTwvaHRtbD4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyOWMyMjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEsNCArMCwwIEBACi08JUAgcGFnZSBzZXNzaW9uPSJmYWxzZSIlPgotPCUKLXJlc3BvbnNlLnNlbmRSZWRpcmVjdCgiaGVsbG9Xb3JsZC5qc2YiKTsKLSU+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU3MTNjNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0JeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLQl4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLQl4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIj4NCi08aGVhZD4NCi08dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPg0KLTwvaGVhZD4NCi08Ym9keT4NCi0NCi08Zjp2aWV3Pg0KLQk8aDpvdXRwdXRUZXh0DQotCQl2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMiIC8+DQotCTxoOmZvcm0gaWQ9ImZvcm0yIj4NCi0JCTxoOmNvbW1hbmRMaW5rIGlkPSJsaW5rMSIgYWN0aW9uPSJiYWNrIj4NCi0JCQk8aDpvdXRwdXRUZXh0IGlkPSJsaW5rVGV4dCIgdmFsdWU9IkdPIEhPTUUiIC8+DQotCQk8L2g6Y29tbWFuZExpbms+DQotCTwvaDpmb3JtPg0KLTwvZjp2aWV3Pg0KLTwvYm9keT4NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1mYWNlbGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvdGVtcGxhdGUueGh0bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC90ZW1wbGF0ZS54aHRtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NmODhiMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC90ZW1wbGF0ZS54aHRtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTwhRE9DVFlQRSBodG1sIFBVQkxJQyAiLS8vVzNDLy9EVEQgWEhUTUwgMS4wIFRyYW5zaXRpb25hbC8vRU4iICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS10cmFuc2l0aW9uYWwuZHRkIj4NCi08aHRtbCB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94aHRtbCINCi0JeG1sbnM6dWk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2ZhY2VsZXRzIg0KLQl4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLQl4bWxuczpoPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIj4NCi08aGVhZD4NCi08bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1pc28tODg1OS0xIiAvPg0KLTx0aXRsZT5NeWZhY2VzIEV4YW1wbGUgRmFjZWxldHM8L3RpdGxlPg0KLTwvaGVhZD4NCi0NCi08Ym9keT4NCi08aDE+PHVpOmluc2VydCBuYW1lPSJ0aXRsZSI+TXlmYWNlcyBFeGFtcGxlIEZhY2VsZXRzPC91aTppbnNlcnQ+PC9oMT4NCi08cD48dWk6aW5zZXJ0IG5hbWU9ImJvZHkiPkhlbGxvIFdvcmxkIEV4YW1wbGUhPC91aTppbnNlcnQ+PC9wPg0KLTwvYm9keT4NCi0NCi08L2h0bWw+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjVhMDQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gICAgPHBhcmVudD4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0czwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICAgIDxuYW1lPk15RmFjZXMgUG9ydGxldCBBcmNoZXR5cGU8L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgcG9ydGxldCB3ZWJhcHAgYmFzZWQgb24gbXlmYWNlczwvZGVzY3JpcHRpb24+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzM3NWY2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotIAotIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAKLS0tPgotCi08YXJjaGV0eXBlPgotICA8aWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0czwvaWQ+Ci0gIDxzb3VyY2VzPgotICAgIDxzb3VyY2U+c3JjL21haW4vamF2YS9OYW1lQmVhbi5qYXZhPC9zb3VyY2U+Ci0gIDwvc291cmNlcz4KLSAgPHJlc291cmNlcz4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllczwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9pbmRleC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvZWRpdC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaGVscC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9oZWxsby5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9pbmRleC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvcG9ydGxldC54bWw8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktcGx1dG8td2ViLWRlZmF1bHQueG1sPC9yZXNvdXJjZT4KLSAgPC9yZXNvdXJjZXM+Ci08L2FyY2hldHlwZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlOGIwODEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjE5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4KLSAgICA8cGFja2FnaW5nPndhcjwvcGFja2FnaW5nPgotICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPG5hbWU+QSBjdXN0b20gcHJvamVjdCB1c2luZyBteWZhY2VzPC9uYW1lPgotICAgIDx1cmw+aHR0cDovL3d3dy5teW9yZ2FuaXphdGlvbi5vcmc8L3VybD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4xLjIuNzwvanNmLW15ZmFjZXMudmVyc2lvbj4KLSAgICAgICAgPGpzZi1yaS52ZXJzaW9uPjEuMl8xMzwvanNmLXJpLnZlcnNpb24+Ci0gICAgICAgIDxtYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj42LjEuMTY8L21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPgotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+Ci0gICAgICAgIDxwb3J0bGV0LWJyaWRnZS52ZXJzaW9uPjEuMC4wLWJldGE8L3BvcnRsZXQtYnJpZGdlLnZlcnNpb24+Ci0gICAgPC9wcm9wZXJ0aWVzPgotICAgIAotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+c2VydmxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi40PC92ZXJzaW9uPgotICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQuanNwPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPmpzcC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+ICAgIAotICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAKLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgPGdyb3VwSWQ+cG9ydGxldC1hcGk8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cG9ydGxldC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgICAgICAgIDxzY29wZT5wcm92aWRlZDwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMucG9ydGxldC1icmlkZ2U8L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+cG9ydGxldC1icmlkZ2UtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPiR7cG9ydGxldC1icmlkZ2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5wb3J0bGV0LWJyaWRnZTwvZ3JvdXBJZD4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5wb3J0bGV0LWJyaWRnZS1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPiR7cG9ydGxldC1icmlkZ2UudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgCi0gICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamRldi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRidWlsZDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8bGlicmFyaWVzPgotICAgICAgICAgICAgICAgIDxsaWJyYXJ5PkpTUCBSdW50aW1lPC9saWJyYXJ5PgotICAgICAgICAgICAgICA8L2xpYnJhcmllcz4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgIAotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBzZXRzIHVwIHRoZSB3ZWJhcHAgZm9yIGRlcGxveW1lbnQgdG8gcGx1dG8gICJtdm4gY2xlYW4gaW5zdGFsbCAtUHBsdXRvIiAtLT4gICAgCi0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgIDxpZD5wbHV0bzwvaWQ+Ci0gICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgIDwhLS0gY29uZmlndXJlIG1hdmVuLXdhci1wbHVnaW4gdG8gdXNlIHVwZGF0ZWQgd2ViLnhtbCAtLT4KLSAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi13YXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgPHdlYlhtbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9wbHV0by1yZXNvdXJjZXMvd2ViLnhtbAotICAgICAgICAgICAgICAgICAgICA8L3dlYlhtbD4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgCi0gICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5wbHV0bzwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHV0by1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+ICAKLSAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+ICAKLSAgICAgICAgICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXJlc291cmNlczwvcGhhc2U+ICAKLSAgICAgICAgICAgICAgICAgICAgPGdvYWxzPiAgCi0gICAgICAgICAgICAgICAgICAgICAgPGdvYWw+YXNzZW1ibGU8L2dvYWw+ICAKLSAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4gIAotICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+ICAKLSAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+ICAKLSAgICAgICAgICAgICAgPC9wbHVnaW4+ICAKLSAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICA8L2J1aWxkPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIAotICAgICAgICA8IS0tIFRvIHJ1biBqZXR0eSwgaXNzdWUgIm12biBjbGVhbiAtUGpldHR5Q29uZmlnIGpldHR5OnJ1biIgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5jb20uYmVray5ib3NzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1dG8tZW1iZWRkZWQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjA8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bG9nNGoudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPHdlYlhtbD4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9wbHV0by1yZXNvdXJjZXMvd2ViLnhtbDwvd2ViWG1sPgotICAgICAgICAgICAgICAgICAgICAgICAgPHdlYkRlZmF1bHRYbWw+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvamV0dHktcGx1dG8td2ViLWRlZmF1bHQueG1sPC93ZWJEZWZhdWx0WG1sPgotICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLnBsdXRvLmVtYmVkZGVkLnBvcnRsZXRJZDwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPHZhbHVlPiR7YXJ0aWZhY3RJZH08L3ZhbHVlPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyPC92YWx1ZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3N5c3RlbVByb3BlcnR5PiAgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUucGx1dG88L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1dG8tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPjEuMS40PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1yZXNvdXJjZXM8L3BoYXNlPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4gIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPmFzc2VtYmxlPC9nb2FsPiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+ICAKLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPiAgCi0gICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPiAgCi0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPiAgCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICAKLSAgICAgICAgPCEtLSBCeSBkZWZhdWx0IHRoZSB3YXIgZXhhbXBsZXMgdXNlIG15ZmFjZXMhIDopIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pbXBsPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8IS0tIEFjdGl2ZSBhZGRpbmcgLURqc2Y9cmkgd2hlbiBleGVjdXRlIG1hdmVuIGdvYWxzLiAtLT4KLSAgICAgICAgICAgIDxpZD5qc2Ytcmk8L2lkPgotICAgICAgICAgICAgPGFjdGl2YXRpb24+Ci0gICAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5yaTwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1yaS52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPiAgCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2phdmEvTmFtZUJlYW4uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9OYW1lQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDI3ZTc3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9OYW1lQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotcGFja2FnZSAkcGFja2FnZTsKLQotcHVibGljIGNsYXNzIE5hbWVCZWFuCi17Ci0gIHB1YmxpYyBTdHJpbmcgX25hbWU7Ci0gIAotICBwdWJsaWMgTmFtZUJlYW4oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXROYW1lKFN0cmluZyBfbmFtZSkKLSAgewotICAgIHRoaXMuX25hbWUgPSBfbmFtZTsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX25hbWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNTJlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1sb2c0ai5yb290TG9nZ2VyPUlORk8sIEExLCBBMgotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLQotI2xvZyBvbiBhIGZpbGUgb24gdGFyZ2V0IHRvbywgdG8gbWFrZSBlYXNpZXIgY2hlY2sgaXQKLWxvZzRqLmFwcGVuZGVyLkEyPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTIuRmlsZT10YXJnZXQvbG9nNGoubG9nCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhGaWxlU2l6ZT0xMDAwS0IKLSMgS2VlcCBvbmUgYmFja3VwIGZpbGUKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEJhY2t1cEluZGV4PTEKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lcCAldCAlYyAtICVtJW4KLQotIyBMb2cgbGV2ZWwgZm9yIG15ZmFjZXMgbGlicmFyaWVzCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zPUlORk8KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9VFJBQ0UKLWxvZzRqLmxvZ2dlci5qYXZheC5mYWNlcz1UUkFDRQotCi0jIFByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdAotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCBbJXRdICglRlw6JUwpIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3ODc1Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/Pg0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDDQotICAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMC8vRU4iDQotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWZhY2VzY29uZmlnXzFfMC5kdGQiPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20vSlNGL0NvbmZpZ3VyYXRpb24iPg0KLSAgPG5hdmlnYXRpb24tcnVsZT4NCi0gICAgPGZyb20tdmlldy1pZD4qPC9mcm9tLXZpZXctaWQ+DQotICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgPGZyb20tb3V0Y29tZT5oZWxsb1dvcmxkPC9mcm9tLW91dGNvbWU+DQotICAgICAgPHRvLXZpZXctaWQ+L2hlbGxvd29ybGQvaW5kZXguanNwPC90by12aWV3LWlkPg0KLSAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gIDwvbmF2aWdhdGlvbi1ydWxlPg0KLSAgPG5hdmlnYXRpb24tcnVsZT4NCi0gICAgPGZyb20tdmlldy1pZD4vaGVsbG93b3JsZC9pbmRleC5qc3A8L2Zyb20tdmlldy1pZD4NCi0gICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICA8ZnJvbS1vdXRjb21lPnNheWhlbGxvPC9mcm9tLW91dGNvbWU+DQotICAgICAgPHRvLXZpZXctaWQ+L2hlbGxvd29ybGQvaGVsbG8uanNwPC90by12aWV3LWlkPg0KLSAgICA8L25hdmlnYXRpb24tY2FzZT4NCi0gIDwvbmF2aWdhdGlvbi1ydWxlPg0KLSAgPG1hbmFnZWQtYmVhbj4NCi0gICAgPG1hbmFnZWQtYmVhbi1uYW1lPm5hbWViZWFuPC9tYW5hZ2VkLWJlYW4tbmFtZT4NCi0gICAgPG1hbmFnZWQtYmVhbi1jbGFzcz4ke3BhY2thZ2V9Lk5hbWVCZWFuPC9tYW5hZ2VkLWJlYW4tY2xhc3M+DQotICAgIDxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPg0KLSAgPC9tYW5hZ2VkLWJlYW4+DQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9qZXR0eS1wbHV0by13ZWItZGVmYXVsdC54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBhYjgzZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2pldHR5LXBsdXRvLXdlYi1kZWZhdWx0LnhtbAorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvcG9ydGxldC54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3BvcnRsZXQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODMwYzZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvcG9ydGxldC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCSAgIAotLS0+Ci08cG9ydGxldC1hcHAgdmVyc2lvbj0iMS4wIgotICAgICAgICAgICAgIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wb3J0bGV0L3BvcnRsZXQtYXBwXzFfMC54c2QiCi0gICAgICAgICAgICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICAgICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL3BvcnRsZXQvcG9ydGxldC1hcHBfMV8wLnhzZCBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9wb3J0bGV0L3BvcnRsZXQtYXBwXzFfMC54c2QiPgotCi0gIDxwb3J0bGV0PgotICAgIDxkZXNjcmlwdGlvbiBsYW5nPSJFTiI+TXlGYWNlcyBQb3J0bGV0IEJyaWRnZSBEZW1vIFBvcnRsZXQ8L2Rlc2NyaXB0aW9uPgotICAgIDxwb3J0bGV0LW5hbWU+JHthcnRpZmFjdElkfTwvcG9ydGxldC1uYW1lPgotICAgIDxkaXNwbGF5LW5hbWUgbGFuZz0iRU4iPk15RmFjZXMgUG9ydGxldCBCcmlkZ2UgRGVtbzwvZGlzcGxheS1uYW1lPgotICAgIDxwb3J0bGV0LWNsYXNzPmphdmF4LnBvcnRsZXQuZmFjZXMuR2VuZXJpY0ZhY2VzUG9ydGxldDwvcG9ydGxldC1jbGFzcz4KLQotICAgIDxpbml0LXBhcmFtPgotICAgICAgPG5hbWU+amF2YXgucG9ydGxldC5mYWNlcy5kZWZhdWx0Vmlld0lkLnZpZXc8L25hbWU+Ci0gICAgICA8dmFsdWU+L2luZGV4LmpzcDwvdmFsdWU+Ci0gICAgPC9pbml0LXBhcmFtPgotCi0gICAgPGluaXQtcGFyYW0+Ci0gICAgICA8bmFtZT5qYXZheC5wb3J0bGV0LmZhY2VzLmRlZmFsdFZpZXdJZC5lZGl0PC9uYW1lPgotICAgICAgPHZhbHVlPi9lZGl0LmpzcDwvdmFsdWU+Ci0gICAgPC9pbml0LXBhcmFtPgotCi0gICAgPGluaXQtcGFyYW0+Ci0gICAgICA8bmFtZT5qYXZheC5wb3J0bGV0LmZhY2VzLmRlZmF1bHRWaWV3SWQuaGVscDwvbmFtZT4KLSAgICAgIDx2YWx1ZT4vaGVscC5qc3A8L3ZhbHVlPgotICAgIDwvaW5pdC1wYXJhbT4KLQotICAgIDxzdXBwb3J0cz4KLSAgICAgIDxtaW1lLXR5cGU+dGV4dC9odG1sPC9taW1lLXR5cGU+Ci0gICAgICA8cG9ydGxldC1tb2RlPmVkaXQ8L3BvcnRsZXQtbW9kZT4KLSAgICAgIDxwb3J0bGV0LW1vZGU+dmlldzwvcG9ydGxldC1tb2RlPgotICAgICAgPHBvcnRsZXQtbW9kZT5oZWxwPC9wb3J0bGV0LW1vZGU+Ci0gICAgPC9zdXBwb3J0cz4KLQotICAgIDxzdXBwb3J0ZWQtbG9jYWxlPmVuPC9zdXBwb3J0ZWQtbG9jYWxlPgotCi0gICAgPHBvcnRsZXQtaW5mbz4KLSAgICAgIDx0aXRsZT5NeUZhY2VzIFBvcnRsZXQgQnJpZGdlIERlbW88L3RpdGxlPgotICAgICAgPHNob3J0LXRpdGxlPkJyaWRnZSBEZW1vPC9zaG9ydC10aXRsZT4KLSAgICA8L3BvcnRsZXQtaW5mbz4KLSAgPC9wb3J0bGV0Pg0KLSAgICAKLTwvcG9ydGxldC1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhNDA5ZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ0lTTy04ODU5LTEnPz4KLTwhRE9DVFlQRSB3ZWItYXBwIFBVQkxJQyAnLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIFdlYiBBcHBsaWNhdGlvbiAyLjMvL0VOJyAnaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvd2ViLWFwcF8yXzMuZHRkJz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPCEtLSBUaGUgSmV0dHkgUGx1dG8gUGx1Z2luIG5lZWRzIHRvIGhhdmUgYSBXZWJhcHAgMi4zIHdlYi14bWwuICBEb24ndCBrbm93IHdoeS4gLS0+Ci08d2ViLWFwcD4NCi0gCi0gIDxjb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5ERUZBVUxUX1NVRkZJWDwvcGFyYW0tbmFtZT4KLSAgICA8cGFyYW0tdmFsdWU+LmpzcDwvcGFyYW0tdmFsdWU+Ci0gIDwvY29udGV4dC1wYXJhbT4NCi0gIAotICA8IS0tIExpc3RlbmVyLCB0byBhbGxvdyBKZXR0eSBzZXJ2aW5nIE15RmFjZXMgYXBwcyAtLT4KLSAgPCEtLSBUT0RPOiBpcyB0aGlzIG5lZWRlZCBhbnltb3JlIGZvciBqZXR0eT8gIEkgZG9uJ3QgdGhpbmsgc28uLiAtLT4KLSAgPCEtLSBsaXN0ZW5lcj4KLSAgICA8bGlzdGVuZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5TdGFydHVwU2VydmxldENvbnRleHRMaXN0ZW5lcjwvbGlzdGVuZXItY2xhc3M+Ci0gIDwvbGlzdGVuZXIgLS0+DQotCi0gIDwhLS0gRmFjZXMgU2VydmxldCAtLT4KLSAgPHNlcnZsZXQ+Ci0gICAgPHNlcnZsZXQtbmFtZT5mYWNlczwvc2VydmxldC1uYW1lPgotICAgIDxzZXJ2bGV0LWNsYXNzPmphdmF4LmZhY2VzLndlYmFwcC5GYWNlc1NlcnZsZXQ8L3NlcnZsZXQtY2xhc3M+DQotICAgIDxsb2FkLW9uLXN0YXJ0dXA+MTwvbG9hZC1vbi1zdGFydHVwPgotICA8L3NlcnZsZXQ+Ci0KLSAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPgotICA8IS0tIAotICAgIEluIHRoaXMgZGVtbyBhcHBsaWNhdGlvbiwgSSBjaG9zZSB0byB1c2Ugc3VmZml4IG1hcHBpbmcuICBJIGRpZCB0aGlzIGJlY2F1c2UgaXQgbWFrZXMgdXJscwotICAgIGluIHRoZSBwb3J0bGV0IHdvcmxkIGxvb2sgbmljZXIgaW4gdGhlIHNvdXJjZS4gIFRoZSBwb3J0bGV0IHVybCBzaG91bGQgYmUgdGhlIHNhbWUgCi0gICAgcmVndWFyZGxlc3MuCi0gIC0tPgotICA8c2VydmxldC1tYXBwaW5nPgotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4KLSAgICA8dXJsLXBhdHRlcm4+Ki5qc2Y8L3VybC1wYXR0ZXJuPgotICA8L3NlcnZsZXQtbWFwcGluZz4NCi0gIAotPC93ZWItYXBwPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvZWRpdC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9lZGl0LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjdiNzgwZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9lZGl0LmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGY6dmlldz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgPHRpdGxlPmluZGV4PC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0gICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iVGhpcyBpcyB0aGUgcG9ydGxldCBlZGl0IHNjcmVlbi4iLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgIDwvaDpmb3JtPgotICAgIDwvYm9keT4KLSAgPC9odG1sPgotPC9mOnZpZXc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9oZWxsby5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2hlbGxvLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzUwYjJmYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb3dvcmxkL2hlbGxvLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLTwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxIFRyYW5zaXRpb25hbC8vRU4iCi0iaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvbG9vc2UuZHRkIj4KLTwlQCBwYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD1VVEYtOCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIlPgotPGY6dmlldz4KLSAgPGh0bWw+Ci0gICAgPGhlYWQ+Ci0gICAgICA8bWV0YSBodHRwLWVxdWl2PSJDb250ZW50LVR5cGUiIGNvbnRlbnQ9InRleHQvaHRtbDsgY2hhcnNldD1VVEYtOCIvPgotICAgICAgPHRpdGxlPmhlbGxvPC90aXRsZT4KLSAgICA8L2hlYWQ+Ci0gICAgPGJvZHk+Ci0gICAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0gICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3tuYW1lYmVhbi5uYW1lfSIvPgotICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9InJldHVybiIgYWN0aW9uPSJoZWxsb1dvcmxkIi8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICA8L2g6Zm9ybT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwvZjp2aWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvd29ybGQvaW5kZXguanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNTc0M2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVsbG93b3JsZC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxmOnZpZXc+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDx0aXRsZT5pbmRleDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotICAgICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IlBsZWFzZSBlbnRlciB5b3VyIG5hbWU6ICIvPgotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IHZhbHVlPSIje25hbWViZWFuLm5hbWV9Ii8+Ci0gICAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJDbGljayBIZXJlIiBhY3Rpb249InNheWhlbGxvIi8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICA8L2g6Zm9ybT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwvZjp2aWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbHAuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVscC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzODdjMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC1wb3J0bGV0cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaGVscC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxmOnZpZXc+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDx0aXRsZT5pbmRleDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IlRoaXMgaXMgdGhlIHBvcnRsZXQgaGVscCBzY3JlZW4uIi8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICA8L2g6Zm9ybT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwvZjp2aWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQtcG9ydGxldHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNlMjBlOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08IURPQ1RZUEUgSFRNTCBQVUJMSUMgIi0vL1czQy8vRFREIEhUTUwgNC4wMSBUcmFuc2l0aW9uYWwvL0VOIgotImh0dHA6Ly93d3cudzMub3JnL1RSL2h0bWw0L2xvb3NlLmR0ZCI+Ci08JUAgcGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9VVRGLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxmOnZpZXc+Ci0gIDxodG1sPgotICAgIDxoZWFkPgotICAgICAgPG1ldGEgaHR0cC1lcXVpdj0iQ29udGVudC1UeXBlIiBjb250ZW50PSJ0ZXh0L2h0bWw7IGNoYXJzZXQ9VVRGLTgiLz4KLSAgICAgIDx0aXRsZT5pbmRleDwvdGl0bGU+Ci0gICAgPC9oZWFkPgotICAgIDxib2R5PgotICAgICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjEiPgotICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9IlBsZWFzZSBzZWxlY3Q6Ii8+Ci0gICAgICAgICAgPGg6cGFuZWxHcm91cD4KLSAgICAgICAgICAgIDx1bD4KLSAgICAgICAgICAgICAgPGxpPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJIZWxsb1dvcmxkIGV4YW1wbGUiIGFjdGlvbj0iaGVsbG9Xb3JsZCIvPgotICAgICAgICAgICAgICA8L2xpPg0KLSAgICAgICAgICAgIDwvdWw+Ci0gICAgICAgICAgPC9oOnBhbmVsR3JvdXA+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICA8L2g6Zm9ybT4KLSAgICA8L2JvZHk+Ci0gIDwvaHRtbD4KLTwvZjp2aWV3PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvTElDRU5TRS50eHQgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU2OGY1NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMC4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQ8L2FydGlmYWN0SWQ+Ci0gICAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgICA8bmFtZT5NeUZhY2VzIEJhc2ljIEFyY2hldHlwZTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIG5ldyB3ZWJhcHAgYmFzZWQgb24gbXlmYWNlczwvZGVzY3JpcHRpb24+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTcxNTM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotIAotIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGdyYW50c21pdGggJCkKLSBAdmVyc2lvbiAkUmV2aXNpb246IDQ3MjU2MCAkICREYXRlOiAyMDA2LTExLTA4IDE4OjQ1OjI1ICswMTAwIChNaSwgMDggTm92IDIwMDYpICQKLSAKLS0tPgotCi08YXJjaGV0eXBlPgotICA8aWQ+bXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZDwvaWQ+Ci0gIDxzb3VyY2VzPgotICAgIDxzb3VyY2U+c3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhPC9zb3VyY2U+Ci0gIDwvc291cmNlcz4KLSAgPHJlc291cmNlcz4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllczwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9pbmRleC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvaGVsbG9Xb3JsZC5qc3A8L3Jlc291cmNlPgotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwPC9yZXNvdXJjZT4KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbDwvcmVzb3VyY2U+Ci0gICAgPHJlc291cmNlPnNyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWw8L3Jlc291cmNlPgotICA8L3Jlc291cmNlcz4KLTwvYXJjaGV0eXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM2OTQzZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9PC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8bmFtZT5BIGN1c3RvbSBwcm9qZWN0IHVzaW5nIG15ZmFjZXM8L25hbWU+Ci0gICAgPHVybD5odHRwOi8vd3d3Lm15b3JnYW5pemF0aW9uLm9yZzwvdXJsPgotCi0gICAgPHByb3BlcnRpZXM+Ci0gICAgICAgIDxqc2YtbXlmYWNlcy52ZXJzaW9uPjEuMi43PC9qc2YtbXlmYWNlcy52ZXJzaW9uPgotICAgICAgICA8anNmLXJpLnZlcnNpb24+MS4yXzEzPC9qc2YtcmkudmVyc2lvbj4gICAgICAgIAotICAgICAgICA8bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ni4xLjE2PC9tYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbj4KLSAgICAgICAgPGxvZzRqLnZlcnNpb24+MS4yLjEzPC9sb2c0ai52ZXJzaW9uPgotICAgIDwvcHJvcGVydGllcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPGZpbmFsTmFtZT4ke2FydGlmYWN0SWR9PC9maW5hbE5hbWU+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5tb3J0YmF5LmpldHR5PC9ncm91cElkPgotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+Ci0gICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICA8L2J1aWxkPgotICAgIAotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPHByb2ZpbGU+Ci0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+Ci0gICAgICAgICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+Ci0gICAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb3JlPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPCEtLSBBY3RpdmUgYWRkaW5nIC1EanNmPXJpIHdoZW4gZXhlY3V0ZSBtYXZlbiBnb2Fscy4gLS0+Ci0gICAgICAgICAgICA8aWQ+anNmLXJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLXJpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIAotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDwhLS0gRGVidWcgcHJvZmlsZSBmb3IgbXlmYWNlcyBhbmQgamV0dHkuCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcjwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8cmVsZWFzZXM+Ci0gICAgICAgICAgICAgICAgPGVuYWJsZWQ+ZmFsc2U8L2VuYWJsZWQ+Ci0gICAgICAgICAgICA8L3JlbGVhc2VzPgotICAgICAgICAgICAgPHNuYXBzaG90cz4KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD50cnVlPC9lbmFibGVkPgotICAgICAgICAgICAgPC9zbmFwc2hvdHM+Ci0gICAgICAgICAgICA8aWQ+YXBhY2hlLW1hdmVuLXNuYXBzaG90czwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+Ci0gICAgICAgICAgICA8bGF5b3V0PmxlZ2FjeTwvbGF5b3V0PgotICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPC9yZXBvc2l0b3JpZXM+Ci0KLSAgICA8IS0tIFByb2plY3QgZGVwZW5kZW5jaWVzIC0tPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy50b21haGF3azwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRvbWFoYXdrMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuOTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4gICAgCi0gICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmpzdGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgIDwvZGVwZW5kZW5jeT4gICAgICAgIAotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjQuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPC9kZXBlbmRlbmNpZXM+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQ29udHJvbGxlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxYzhkYjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSovCi1wYWNrYWdlICRwYWNrYWdlOwotCi0vKioKLSAqIEEgdHlwaWNhbCBzaW1wbGUgYmFja2luZyBiZWFuLCB0aGF0IGlzIGJhY2tlZCB0byA8Y29kZT5oZWxsb3dvcmxkLmpzcDwvY29kZT4KLSAqIAotICovCi1wdWJsaWMgY2xhc3MgSGVsbG9Xb3JsZENvbnRyb2xsZXIgewotCi0gICAgCi0gICAgLy9wcm9wZXJ0aWVzCi0gICAgcHJpdmF0ZSBTdHJpbmcgbmFtZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAgICovCi0gICAgcHVibGljIEhlbGxvV29ybGRDb250cm9sbGVyKCl7Ci0gICAgfQotICAgIAotICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLWdldHRlciAmIHNldHRlcgotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWV0aG9kIHRoYXQgaXMgYmFja2VkIHRvIGEgc3VibWl0IGJ1dHRvbiBvZiBhIGZvcm0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBzZW5kKCl7Ci0gICAgICAgIC8vZG8gcmVhbCBsb2dpYywgcmV0dXJuIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgdXNlZCBmb3IgdGhlIG5hdmlnYXRpb24gc3lzdGVtIG9mIEpTRgotICAgICAgICByZXR1cm4gInN1Y2Nlc3MiOwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzUyZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9sb2c0ai9sb2c0ai5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotIyBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSMgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0jIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSMgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSMgKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSMgdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotbG9nNGoucm9vdExvZ2dlcj1JTkZPLCBBMSwgQTIKLWxvZzRqLmFwcGVuZGVyLkExPW9yZy5hcGFjaGUubG9nNGouQ29uc29sZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci0KLSNsb2cgb24gYSBmaWxlIG9uIHRhcmdldCB0b28sIHRvIG1ha2UgZWFzaWVyIGNoZWNrIGl0Ci1sb2c0ai5hcHBlbmRlci5BMj1vcmcuYXBhY2hlLmxvZzRqLlJvbGxpbmdGaWxlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkEyLkZpbGU9dGFyZ2V0L2xvZzRqLmxvZwotbG9nNGouYXBwZW5kZXIuQTIuTWF4RmlsZVNpemU9MTAwMEtCCi0jIEtlZXAgb25lIGJhY2t1cCBmaWxlCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhCYWNrdXBJbmRleD0xCi1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQ9b3JnLmFwYWNoZS5sb2c0ai5QYXR0ZXJuTGF5b3V0Ci1sb2c0ai5hcHBlbmRlci5BMi5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JXAgJXQgJWMgLSAlbSVuCi0KLSMgTG9nIGxldmVsIGZvciBteWZhY2VzIGxpYnJhcmllcwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUuY29tbW9ucz1JTkZPCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5teWZhY2VzPVRSQUNFCi1sb2c0ai5sb2dnZXIuamF2YXguZmFjZXM9VFJBQ0UKLQotIyBQcmludCB0aGUgZGF0ZSBpbiBJU08gODYwMSBmb3JtYXQKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lNXAgWyV0XSAoJUZcOiVMKSAtICVtJW4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlMzU2MDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiAKLSAgICB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIgotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIAotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZS93ZWItZmFjZXNjb25maWdfMV8yLnhzZCI+Ci0JCi0JPCEtLSBtYW5hZ2VkIGJlYW5zIG9mIHRoZSBzaW1wbGUgaGVsbG8gd29ybGQgYXBwIC0tPgotCTxtYW5hZ2VkLWJlYW4+Ci0JCTxtYW5hZ2VkLWJlYW4tbmFtZT5oZWxsb1dvcmxkPC9tYW5hZ2VkLWJlYW4tbmFtZT4KLQkJPG1hbmFnZWQtYmVhbi1jbGFzcz4ke3BhY2thZ2V9LkhlbGxvV29ybGRDb250cm9sbGVyPC9tYW5hZ2VkLWJlYW4tY2xhc3M+Ci0JCTxtYW5hZ2VkLWJlYW4tc2NvcGU+cmVxdWVzdDwvbWFuYWdlZC1iZWFuLXNjb3BlPgotCTwvbWFuYWdlZC1iZWFuPgotCQotCTwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaGVsbG9Xb3JsZC5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vaGVsbG9Xb3JsZC5qc3A8L2Zyb20tdmlldy1pZD4KLQkJPG5hdmlnYXRpb24tY2FzZT4KLQkJCTxmcm9tLW91dGNvbWU+c3VjY2VzczwvZnJvbS1vdXRjb21lPgotCQkJPHRvLXZpZXctaWQ+L3BhZ2UyLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0JCi0JPCEtLSBuYXZpZ2F0aW9uIHJ1bGVzIGZvciBwYWdlMi5qc3AgLS0+Ci0JPG5hdmlnYXRpb24tcnVsZT4KLQkJPGZyb20tdmlldy1pZD4vcGFnZTIuanNwPC9mcm9tLXZpZXctaWQ+Ci0JCTxuYXZpZ2F0aW9uLWNhc2U+Ci0JCQk8ZnJvbS1vdXRjb21lPmJhY2s8L2Zyb20tb3V0Y29tZT4KLQkJCTx0by12aWV3LWlkPi9oZWxsb1dvcmxkLmpzcDwvdG8tdmlldy1pZD4KLQkJPC9uYXZpZ2F0aW9uLWNhc2U+Ci0JPC9uYXZpZ2F0aW9uLXJ1bGU+Ci08L2ZhY2VzLWNvbmZpZz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5M2MwOTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjEzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08d2ViLWFwcCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZSIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiCi0gICAgICAgICB2ZXJzaW9uPSIyLjQiPgotCi0gICAgPGRlc2NyaXB0aW9uPk15UHJvamVjdCB3ZWIueG1sPC9kZXNjcmlwdGlvbj4KLQotICAgIDwhLS1vcHRpb25hbDogY29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPkNvbW1hIHNlcGFyYXRlZCBsaXN0IG9mIFVSSXMgb2YgKGFkZGl0aW9uYWwpIGZhY2VzIGNvbmZpZyBmaWxlcy4KLSAgICAgICAgICAgIChlLmcuIC9XRUItSU5GL215LWNvbmZpZy54bWwpCi0gICAgICAgICAgICBTZWUgSlNGIDEuMCBQUkQyLCAxMC4zLjIKLSAgICAgICAgICAgIEF0dGVudGlvbjogWW91IGRvIG5vdCBuZWVkIHRvIHB1dCAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sIGluIGhlcmUuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLkNPTkZJR19GSUxFUzwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWw8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbS0tPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+U3RhdGUgc2F2aW5nIG1ldGhvZDogImNsaWVudCIgb3IgInNlcnZlciIgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIFNlZSBKU0YgU3BlY2lmaWNhdGlvbiAyLjUuMzwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlNUQVRFX1NBVklOR19NRVRIT0Q8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT5jbGllbnQ8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpLgotICAgICAgICAgICAgRGVmaW5lcyB0aGUgYW1vdW50IChkZWZhdWx0ID0gMjApIG9mIHRoZSBsYXRlc3Qgdmlld3MgYXJlIHN0b3JlZCBpbiBzZXNzaW9uLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5OVU1CRVJfT0ZfVklFV1NfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPjIwPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5Pbmx5IGFwcGxpY2FibGUgaWYgc3RhdGUgc2F2aW5nIG1ldGhvZCBpcyAic2VydmVyIiAoPSBkZWZhdWx0KS4KLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzdGF0ZSB3aWxsIGJlIHNlcmlhbGl6ZWQgdG8gYSBieXRlIHN0cmVhbSBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uCi0gICAgICAgICAgICBJZiBmYWxzZSB0aGUgc3RhdGUgd2lsbCBub3QgYmUgc2VyaWFsaXplZCB0byBhIGJ5dGUgc3RyZWFtLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5TRVJJQUxJWkVfU1RBVEVfSU5fU0VTU0lPTjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPk9ubHkgYXBwbGljYWJsZSBpZiBzdGF0ZSBzYXZpbmcgbWV0aG9kIGlzICJzZXJ2ZXIiICg9IGRlZmF1bHQpIGFuZCBpZgotICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLlNFUklBTElaRV9TVEFURV9JTl9TRVNTSU9OIGlzIHRydWUgKD0gZGVmYXVsdCkKLSAgICAgICAgICAgIElmIHRydWUgKGRlZmF1bHQpIHRoZSBzZXJpYWxpemVkIHN0YXRlIHdpbGwgYmUgY29tcHJlc3NlZCBiZWZvcmUgaXQKLSAgICAgICAgICAgIGlzIHdyaXR0ZW4gdG8gdGhlIHNlc3Npb24uIElmIGZhbHNlIHRoZSBzdGF0ZSB3aWxsIG5vdCBiZSBjb21wcmVzc2VkLjwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DT01QUkVTU19TVEFURV9JTl9TRVNTSU9OPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+VGhpcyBwYXJhbWV0ZXIgdGVsbHMgTXlGYWNlcyBpZiBqYXZhc2NyaXB0IGNvZGUgc2hvdWxkIGJlIGFsbG93ZWQgaW4gdGhlCi0gICAgICAgICAgICByZW5kZXJlZCBIVE1MIG91dHB1dC4KLSAgICAgICAgICAgIElmIGphdmFzY3JpcHQgaXMgYWxsb3dlZCwgY29tbWFuZF9saW5rIGFuY2hvcnMgd2lsbCBoYXZlIGphdmFzY3JpcHQgY29kZQotICAgICAgICAgICAgdGhhdCBzdWJtaXRzIHRoZSBjb3JyZXNwb25kaW5nIGZvcm0uCi0gICAgICAgICAgICBJZiBqYXZhc2NyaXB0IGlzIG5vdCBhbGxvd2VkLCB0aGUgc3RhdGUgc2F2aW5nIGluZm8gYW5kIG5lc3RlZCBwYXJhbWV0ZXJzCi0gICAgICAgICAgICB3aWxsIGJlIGFkZGVkIGFzIHVybCBwYXJhbWV0ZXJzLgotICAgICAgICAgICAgRGVmYXVsdDogInRydWUiPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLkFMTE9XX0pBVkFTQ1JJUFQ8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5ERVRFQ1RfSkFWQVNDUklQVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCByZW5kZXJlZCBIVE1MIGNvZGUgd2lsbCBiZSBmb3JtYXR0ZWQsIHNvIHRoYXQgaXQgaXMgImh1bWFuIHJlYWRhYmxlIi4KLSAgICAgICAgICAgIGkuZS4gYWRkaXRpb25hbCBsaW5lIHNlcGFyYXRvcnMgYW5kIHdoaXRlc3BhY2Ugd2lsbCBiZSB3cml0dGVuLCB0aGF0IGRvIG5vdAotICAgICAgICAgICAgaW5mbHVlbmNlIHRoZSBIVE1MIGNvZGUuCi0gICAgICAgICAgICBEZWZhdWx0OiAidHJ1ZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuUFJFVFRZX0hUTUw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj5JZiB0cnVlLCBhIGphdmFzY3JpcHQgZnVuY3Rpb24gd2lsbCBiZSByZW5kZXJlZCB0aGF0IGlzIGFibGUgdG8gcmVzdG9yZSB0aGUKLSAgICAgICAgICAgIGZvcm1lciB2ZXJ0aWNhbCBzY3JvbGwgb24gZXZlcnkgcmVxdWVzdC4gQ29udmVuaWVudCBmZWF0dXJlIGlmIHlvdSBoYXZlIHBhZ2VzCi0gICAgICAgICAgICB3aXRoIGxvbmcgbGlzdHMgYW5kIHlvdSBkbyBub3Qgd2FudCB0aGUgYnJvd3NlciBwYWdlIHRvIGFsd2F5cyBqdW1wIHRvIHRoZSB0b3AKLSAgICAgICAgICAgIGlmIHlvdSB0cmlnZ2VyIGEgbGluayBvciBidXR0b24gYWN0aW9uIHRoYXQgc3RheXMgb24gdGhlIHNhbWUgcGFnZS4KLSAgICAgICAgICAgIERlZmF1bHQ6ICJmYWxzZSI8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQVVUT19TQ1JPTEw8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPlVzZWQgZm9yIGVuY3J5cHRpbmcgdmlldyBzdGF0ZS4gT25seSByZWxldmFudCBmb3IgY2xpZW50IHNpZGUKLSAgICAgICAgICAgIHN0YXRlIHNhdmluZy4gU2VlIE15RmFjZXMgd2lraS93ZWIgc2l0ZSBkb2N1bWVudGF0aW9uIGZvciBpbnN0cnVjdGlvbnMKLSAgICAgICAgICAgIG9uIGhvdyB0byBjb25maWd1cmUgYW4gYXBwbGljYXRpb24gZm9yIGRpZmZlbmVudCBlbmNyeXB0aW9uIHN0cmVuZ3Rocy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlNFQ1JFVDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPk56WTFORE15TVRBPTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPgotCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFZhbGlkYXRlIG1hbmFnZWQgYmVhbnMsIG5hdmlnYXRpb24gcnVsZXMgYW5kIGVuc3VyZSB0aGF0IGZvcm1zIGFyZSBub3QgbmVzdGVkLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuVkFMSURBVEU8L3BhcmFtLW5hbWU+Ci0gICAgICAgIDxwYXJhbS12YWx1ZT50cnVlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+Ci0gICAgCi0gICAgPGNvbnRleHQtcGFyYW0+Ci0gICAgICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgICAgIFRyZWF0IHJlYWRvbmx5IHNhbWUgYXMgaWYgZGlzYWJsZWQgYXR0cmlidXRlIHdhcyBzZXQgZm9yIHNlbGVjdCBlbGVtZW50cy4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFQURPTkxZX0FTX0RJU0FCTEVEX0ZPUl9TRUxFQ1RTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+dHJ1ZTwvcGFyYW0tdmFsdWU+Ci0gICAgPC9jb250ZXh0LXBhcmFtPiAgICAKLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgVXNlIHRoZSBkZWZpbmVkIGNsYXNzIGFzIHRoZSBjbGFzcyB3aGljaCB3aWxsIGJlIGNhbGxlZCB3aGVuIGEgcmVzb3VyY2UgaXMgYWRkZWQgdG8gdGhlCi0gICAgICAgICAgICBFeHRlbnNpb25GaWx0ZXIgaGFuZGxpbmcuIFVzaW5nIFN0cmVhbWluZ0FkZFJlc291cmNlIGhlcmUgaGVscHMgd2l0aCBwZXJmb3JtYW5jZS4gSWYgeW91IHdhbnQgdG8gYWRkCi0gICAgICAgICAgICBjdXN0b20gY29tcG9uZW50cyBhbmQgd2FudCB0byB1c2UgdGhlIEV4dGVuc2lvbkZpbHRlciwgeW91IG5lZWQgdG8gcHJvdmlkZSB5b3VyIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBoZXJlLgotICAgICAgICA8L2Rlc2NyaXB0aW9uPgotICAgICAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMuQUREX1JFU09VUkNFX0NMQVNTPC9wYXJhbS1uYW1lPgotICAgICAgICA8cGFyYW0tdmFsdWU+b3JnLmFwYWNoZS5teWZhY2VzLnJlbmRlcmtpdC5odG1sLnV0aWwuRGVmYXVsdEFkZFJlc291cmNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgICAgICAKLQotICAgIDxjb250ZXh0LXBhcmFtPgotICAgICAgICA8ZGVzY3JpcHRpb24+Ci0gICAgICAgICAgICBWaXJ0dWFsIHBhdGggaW4gdGhlIFVSTCB3aGljaCB0cmlnZ2VycyBsb2FkaW5nIG9mIHJlc291cmNlcyBmb3IgdGhlIE15RmFjZXMgZXh0ZW5kZWQgY29tcG9uZW50cwotICAgICAgICAgICAgaW4gdGhlIEV4dGVuc2lvbkZpbHRlci4KLSAgICAgICAgPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgPHBhcmFtLW5hbWU+b3JnLmFwYWNoZS5teWZhY2VzLlJFU09VUkNFX1ZJUlRVQUxfUEFUSDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPi9mYWNlcy9teUZhY2VzRXh0ZW5zaW9uUmVzb3VyY2U8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4KLSAgICAKLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgQ2hlY2sgaWYgdGhlIGV4dGVuc2lvbnMtZmlsdGVyIGhhcyBiZWVuIHByb3Blcmx5IGNvbmZpZ3VyZWQuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy5DSEVDS19FWFRFTlNJT05TX0ZJTFRFUjwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPgotICAgIDwvY29udGV4dC1wYXJhbT4gICAgCi0KLSAgICA8Y29udGV4dC1wYXJhbT4KLSAgICAgICAgPGRlc2NyaXB0aW9uPgotICAgICAgICAgICAgRGVmaW5lIHBhcnRpYWwgc3RhdGUgc2F2aW5nIGFzIHRydWUvZmFsc2UuCi0gICAgICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgICAgIDxwYXJhbS1uYW1lPmphdmF4LmZhY2VzLlBBUlRJQUxfU1RBVEVfU0FWSU5HX01FVEhPRDwvcGFyYW0tbmFtZT4KLSAgICAgICAgPHBhcmFtLXZhbHVlPmZhbHNlPC9wYXJhbS12YWx1ZT4KLSAgICA8L2NvbnRleHQtcGFyYW0+ICAgIAotCi0gICAgPCEtLSBFeHRlbnNpb25zIEZpbHRlciAtLT4KLSAgICA8ZmlsdGVyPgotICAgICAgICA8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLndlYmFwcC5maWx0ZXIuRXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLWNsYXNzPgotICAgICAgICA8aW5pdC1wYXJhbT4KLSAgICAgICAgICAgIDxkZXNjcmlwdGlvbj5TZXQgdGhlIHNpemUgbGltaXQgZm9yIHVwbG9hZGVkIGZpbGVzLgotICAgICAgICAgICAgICAgIEZvcm1hdDogMTAgLSAxMCBieXRlcwotICAgICAgICAgICAgICAgIDEwayAtIDEwIEtCCi0gICAgICAgICAgICAgICAgMTBtIC0gMTAgTUIKLSAgICAgICAgICAgICAgICAxZyAtIDEgR0I8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+dXBsb2FkTWF4RmlsZVNpemU8L3BhcmFtLW5hbWU+Ci0gICAgICAgICAgICA8cGFyYW0tdmFsdWU+MTAwbTwvcGFyYW0tdmFsdWU+Ci0gICAgICAgIDwvaW5pdC1wYXJhbT4KLSAgICAgICAgPGluaXQtcGFyYW0+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRpb24+U2V0IHRoZSB0aHJlc2hvbGQgc2l6ZSAtIGZpbGVzCi0gICAgICAgICAgICAgICAgYmVsb3cgdGhpcyBsaW1pdCBhcmUgc3RvcmVkIGluIG1lbW9yeSwgZmlsZXMgYWJvdmUKLSAgICAgICAgICAgICAgICB0aGlzIGxpbWl0IGFyZSBzdG9yZWQgb24gZGlzay4KLQotICAgICAgICAgICAgICAgIEZvcm1hdDogMTAgLSAxMCBieXRlcwotICAgICAgICAgICAgICAgIDEwayAtIDEwIEtCCi0gICAgICAgICAgICAgICAgMTBtIC0gMTAgTUIKLSAgICAgICAgICAgICAgICAxZyAtIDEgR0I8L2Rlc2NyaXB0aW9uPgotICAgICAgICAgICAgPHBhcmFtLW5hbWU+dXBsb2FkVGhyZXNob2xkU2l6ZTwvcGFyYW0tbmFtZT4KLSAgICAgICAgICAgIDxwYXJhbS12YWx1ZT4xMDBrPC9wYXJhbS12YWx1ZT4KLSAgICAgICAgPC9pbml0LXBhcmFtPgotICAgIDwvZmlsdGVyPgotCi0gICAgPGZpbHRlci1tYXBwaW5nPgotICAgICAgICA8ZmlsdGVyLW5hbWU+ZXh0ZW5zaW9uc0ZpbHRlcjwvZmlsdGVyLW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9maWx0ZXItbWFwcGluZz4KLSAgICA8ZmlsdGVyLW1hcHBpbmc+Ci0gICAgICAgIDxmaWx0ZXItbmFtZT5leHRlbnNpb25zRmlsdGVyPC9maWx0ZXItbmFtZT4KLSAgICAgICAgPHVybC1wYXR0ZXJuPi9mYWNlcy8qPC91cmwtcGF0dGVybj4KLSAgICA8L2ZpbHRlci1tYXBwaW5nPgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IC0tPgotICAgIDxzZXJ2bGV0PgotICAgICAgICA8c2VydmxldC1uYW1lPkZhY2VzIFNlcnZsZXQ8L3NlcnZsZXQtbmFtZT4KLSAgICAgICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICAgICAgPGxvYWQtb24tc3RhcnR1cD4xPC9sb2FkLW9uLXN0YXJ0dXA+Ci0gICAgPC9zZXJ2bGV0PgotCi0gICAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmcgLS0+Ci0gICAgPHNlcnZsZXQtbWFwcGluZz4KLSAgICAgICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgICAgIDx1cmwtcGF0dGVybj4qLmpzZjwvdXJsLXBhdHRlcm4+Ci0gICAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgICA8IS0tIFdlbGNvbWUgZmlsZXMgLS0+Ci0gICAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4LmpzcDwvd2VsY29tZS1maWxlPgotICAgICAgICA8d2VsY29tZS1maWxlPmluZGV4Lmh0bWw8L3dlbGNvbWUtZmlsZT4KLSAgICA8L3dlbGNvbWUtZmlsZS1saXN0PgotCi08L3dlYi1hcHA+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9oZWxsb1dvcmxkLmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzM0ZDczLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2hlbGxvV29ybGQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0ibmFtZSIgdmFsdWU9IlBsZWFzZSBlbnRlciB5b3VyIG5hbWUiIC8+Ci0gICAgICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJuYW1lIiB2YWx1ZT0iI3toZWxsb1dvcmxkLm5hbWV9IiByZXF1aXJlZD0idHJ1ZSIvPgotICAgICAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlByZXNzIG1lIiBhY3Rpb249IiN7aGVsbG9Xb3JsZC5zZW5kfSIvPgotICAgICAgICAgICAgICAgIDxoOm1lc3NhZ2VzIHNob3dEZXRhaWw9InRydWUiIHNob3dTdW1tYXJ5PSJmYWxzZSIvPgotICAgICAgICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICAgICAgPC9oOmZvcm0+Ci0gICAgICAgIDwvZjp2aWV3PgotICAgIDwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI5YzIyOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiU+Ci08JQotcmVzcG9uc2Uuc2VuZFJlZGlyZWN0KCJoZWxsb1dvcmxkLmpzZiIpOwotJT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMTJjNDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvcGFnZTIuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTxodG1sPgotICAgIDxoZWFkPgotICAgICAgICA8dGl0bGU+SGVsbG8gV29ybGQ8L3RpdGxlPgotICAgIDwvaGVhZD4KLSAgICA8Ym9keT4KLSAgICAgICAgPGY6dmlldz4KLSAgICAgICAgICAgIDxoOmZvcm0gaWQ9Im1haW5Gb3JtIj4KLSAgICAgICAgICAgICAgICA8aDI+PGg6b3V0cHV0VGV4dCB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkLm5hbWV9LiBXZSBob3BlIHlvdSBlbmpveSBBcGFjaGUgTXlGYWNlcyIvPjwvaDI+Ci0gICAgICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgYWN0aW9uPSJiYWNrIj4KLSAgICAgICAgICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iSG9tZSIvPgotICAgICAgICAgICAgICAgIDwvaDpjb21tYW5kTGluaz4KLSAgICAgICAgICAgIDwvaDpmb3JtPgotICAgICAgICA8L2Y6dmlldz4KLSAgICA8L2JvZHk+Ci08L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtaGVsbG93b3JsZC9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZGIxYjIxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWhlbGxvd29ybGQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLSAtLS0tLS0NCi0gTXlmYWNlcyBIZWxsb1dvcmxkIEFyY2hldHlwZQ0KLSAtLS0tLS0NCi0NCi1PdmVydmlldw0KLQ0KLSAgVGhpcyBwcm9qZWN0IGRlZmluZXMgYSBNYXZlbiBhcmNoZXR5cGUgcGx1Z2luLiBSdW5uaW5nIHRoZSBwbHVnaW4gd2lsbCBjcmVhdGUgYSBkaXJlY3RvcnkgdHJlZQ0KLSAgY29udGFpbmluZyB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIHByb2plY3Qgd2hpY2ggdXNlcyBKU1AgYXMgdGhlDQotICB0ZW1wbGF0aW5nIGxhbmd1YWdlLg0KLQ0KLVVzYWdlDQotDQotICBUT0RPOiB3cml0ZW1lDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9MSUNFTlNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9OT1RJQ0UudHh0IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZWZkZDRiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE1ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1hcmNoZXR5cGUtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+SlNGIENvbXBvbmVudCBMaWJyYXJ5IEFyY2hldHlwZTwvbmFtZT4KLSAgICA8ZGVzY3JpcHRpb24+QXJjaGV0eXBlIHRvIGNyZWF0ZSBhIGxpYmFyeSBwcm9qZWN0IG9mIEpTRiBjb21wb25lbnRzPC9kZXNjcmlwdGlvbj4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNDk2MjBmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2FyY2hldHlwZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotCi08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotIAotIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGdyYW50c21pdGggJCkKLSBAdmVyc2lvbiAkUmV2aXNpb246IDQ3MjU2MCAkICREYXRlOiAyMDA2LTExLTA4IDE4OjQ1OjI1ICswMTAwIChNaSwgMDggTm92IDIwMDYpICQKLSAKLS0tPgotCi08YXJjaGV0eXBlPgotICAgIDxpZD5teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzPC9pZD4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9idWlsZC5wcm9wZXJ0aWVzPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXM8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmE8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3NheWhlbGxvLmpzcDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby5qc3A8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQuanNwPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vLmpzcDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvdmFsaWRhdG9yRGVtb1Jlc3VsdC5qc3A8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcDwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWw8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+ZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2hvbWUuanNwPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmV4YW1wbGVzL3BvbS54bWw8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MxMi52bTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ1ZhbGlkYXRvckNsYXNzMTIudm08L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ29udmVydGVyQ2xhc3MxMi52bTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczEyLnZtPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm08L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vQWJzdHJhY3RTYXlIZWxsby5qYXZhPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlci5qYXZhPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyLmphdmE8L3Jlc291cmNlPgotICAgICAgICA8cmVzb3VyY2U+Y29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3NyYy90ZXN0L2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyVGVzdC5qYXZhPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyVGVzdC5qYXZhPC9yZXNvdXJjZT4KLSAgICAgICAgPHJlc291cmNlPmNvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL09kZE51bWJlclZhbGlkYXRvclRlc3QuamF2YTwvcmVzb3VyY2U+Ci0gICAgICAgIDxyZXNvdXJjZT5jb3JlL3BvbS54bWw8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotPC9hcmNoZXR5cGU+Ci0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzI3ZDA4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjI0ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1jb3JlPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXkgSlNGIENvbXBvbmVudHMgTGlicmFyeTwvbmFtZT4KLQotICAgIDxkZXNjcmlwdGlvbj4KLSAgICAgICAgVGhpcyBpcyBteSBzdXBlciBqc2YgY29tcG9uZW50cyBsaWJyYXJ5LgotICAgIDwvZGVzY3JpcHRpb24+Ci0KLSAgICA8cGFyZW50PgotICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgPC9wYXJlbnQ+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHNob3J0bmFtZT5teWNvbXBvbmVudHM8L3Nob3J0bmFtZT4KLSAgICA8L3Byb3BlcnRpZXM+Ci0KLSAgICA8ZGVwZW5kZW5jaWVzPgotCi0gICAgICAgIDwhLS0gY29tcGlsZSAtLT4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb21tb25zLWxvZ2dpbmc8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWxvZ2dpbmc8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjEuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvbW1vbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXZhbGlkYXRvcnMxMjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC4wPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPmNvbXBpbGU8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1jb252ZXJ0ZXJzMTI8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDwhLS0gcHJvdmlkZWQgZGVwZW5kZW5jaWVzIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMi43PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldC5qc3A8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc3AtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguc2VydmxldDwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNlcnZsZXQtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi41PC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnByb3ZpZGVkPC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgICAgICA8IS0tIHRlc3QgZGVwZW5kZW5jaWVzIC0tPgotCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjMuOC4yPC92ZXJzaW9uPgotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgCi0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5zaGFsZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnNoYWxlLXRlc3Q8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjAuNTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgCi0KLSAgICA8L2RlcGVuZGVuY2llcz4KLQotICAgIDxidWlsZD4KLSAgICAgICAgPHJlc291cmNlcz4KLSAgICAgICAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgIDxleGNsdWRlcz4KLSAgICAgICAgICAgICAgICAgICAgICAgPGV4Y2x1ZGU+KiovKi52bTwvZXhjbHVkZT4KLSAgICAgICAgICAgICAgICA8L2V4Y2x1ZGVzPgotICAgICAgICAgICAgPC9yZXNvdXJjZT4gICAgCi0gICAgICAgIDwvcmVzb3VyY2VzPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5idWlsZC1tZXRhZGF0YTwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbXBvbmVudHM8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+bWFrZS10YWdzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtdmFsaWRhdG9yczwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbnZlcnRlci10YWdzPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2FsPm1ha2UtdmFsaWRhdG9yLXRhZ3M8L2dvYWw+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGpzZlZlcnNpb24+MS4yPC9qc2ZWZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZWZhY2VzY29uZmlnPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgPHhtbEZpbGU+TUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbDwveG1sRmlsZT4KLSAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5tYWtldGxkPC9pZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx4bWxGaWxlPk1FVEEtSU5GLyR7c2hvcnRuYW1lfS50bGQ8L3htbEZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRlbXBsYXRlRmlsZT5teWNvbXBvbmVudHMudGxkLnZtPC90ZW1wbGF0ZUZpbGU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHBhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2hvcnRuYW1lPiR7c2hvcnRuYW1lfTwvc2hvcnRuYW1lPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx1cmk+aHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnLyR7c2hvcnRuYW1lfTwvdXJpPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxkaXNwbGF5bmFtZT5DdXN0b20gdGFnIGxpYnJhcnkuPC9kaXNwbGF5bmFtZT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZGVzY3JpcHRpb24+RW5oYW5jZWQgc3RhbmRhcmQgSlNQIGFjdGlvbnMgYW5kIGN1c3RvbSBNeUZhY2VzIGFjdGlvbnMuPC9kZXNjcmlwdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L3BhcmFtcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbD5tYWtlLWNvbmZpZzwvZ29hbD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9idWlsZD4KLQotICAgIDxyZXBvcnRpbmc+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tanhyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLQotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcmVwb3J0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgPC9yZXBvcnRpbmc+Ci0KLSAgICA8cHJvZmlsZXM+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLXNpdGU8L2lkPgotICAgICAgICAgICAgPHJlcG9ydGluZz4KLSAgICAgICAgICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxncm91cElkPm5ldC5zb3VyY2Vmb3JnZS5tYXZlbi10YWdsaWI8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi10YWdsaWItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+Mi4zLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dGFnbGliLnNyYy5kaXI+XCR7YmFzZWRpcn0vdGFyZ2V0L2NsYXNzZXMvTUVUQS1JTkY8L3RhZ2xpYi5zcmMuZGlyPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0bGREb2NEaXI+XCR7YmFzZWRpcn0vdGFyZ2V0L3NpdGUvdGxkZG9jPC90bGREb2NEaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgIDwvcGx1Z2lucz4KLSAgICAgICAgICAgIDwvcmVwb3J0aW5nPgotICAgICAgICA8L3Byb2ZpbGU+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLWFzc2VtYmx5PC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+cGVyZm9ybVJlbGVhc2U8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPnRydWU8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGJ1aWxkPgotICAgICAgICAgICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2M8L2lkPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+PGdvYWw+amFyPC9nb2FsPjwvZ29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bmV0LnNvdXJjZWZvcmdlLm1hdmVuLXRhZ2xpYjwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXRhZ2xpYi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4yLjMuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx0YWdsaWIuc3JjLmRpcj5cJHtiYXNlZGlyfS90YXJnZXQvY2xhc3Nlcy9NRVRBLUlORjwvdGFnbGliLnNyYy5kaXI+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHRsZERvY0Rpcj5cJHtiYXNlZGlyfS90YXJnZXQvc2l0ZS90bGRkb2M8L3RsZERvY0Rpcj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvYzwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxnb2Fscz48Z29hbD50YWdsaWJkb2NqYXI8L2dvYWw+PC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICAgICAgPC9idWlsZD4KLSAgICAgICAgPC9wcm9maWxlPgotICAgIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL0Fic3RyYWN0U2F5SGVsbG8uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vQWJzdHJhY3RTYXlIZWxsby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODRmODE0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vQWJzdHJhY3RTYXlIZWxsby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvOwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJT3V0cHV0OwotCi0vKioKLSAqIEBKU0ZDb21wb25lbnQKLSAqICAgbmFtZSA9ICJteWNvbXBvbmVudHM6c2F5SGVsbG8iCi0gKiAgIGNsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG8iCi0gKiAgIHRhZ0NsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG8uU2F5SGVsbG9UYWciCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFNheUhlbGxvIGV4dGVuZHMgVUlPdXRwdXQKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG8iOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIERFRkFVTFRfUkVOREVSRVJfVFlQRSA9ICJvcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlciI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9ICJqYXZheC5mYWNlcy5PdXRwdXQiOwotCi0gICAgLyoqCi0gICAgICogVXNlcidzIGZpcnN0IG5hbWUuCi0gICAgICogCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IFN0cmluZyBnZXRGaXJzdE5hbWUoKTsKLQotCi0gICAgLyoqCi0gICAgICogVXNlcidzIGxhc3QgbmFtZS4KLSAgICAgKiAKLSAgICAgKiBASlNGUHJvcGVydHkKLSAgICAgKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgU3RyaW5nIGdldExhc3ROYW1lKCk7Ci0gICAgCi0gICAgLyoqCi0gICAgICogUmVuZGVyZWQgcHJvcGVydHkuCi0gICAgICogCi0gICAgICogQEpTRlByb3BlcnR5Ci0gICAgICogICAgIGRlZmF1bHRWYWx1ZT0idHJ1ZSIgICAgIAotICAgICAqLwotICAgICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1JlbmRlcmVkKCk7ICAgICAgICAgICAgICAgICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9zYXloZWxsby9TYXlIZWxsb1JlbmRlcmVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ0NjkwYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5zYXloZWxsbzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5SZXNwb25zZVdyaXRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5yZW5kZXIuUmVuZGVyZXI7Ci0KLS8qKgotICogQEpTRlJlbmRlcmVyCi0gKiAgIHJlbmRlcktpdElkID0gIkhUTUxfQkFTSUMiIAotICogICBmYW1pbHkgPSAiamF2YXguZmFjZXMuT3V0cHV0IgotICogICB0eXBlID0gIm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsb1JlbmRlcmVyIgotICovCi1wdWJsaWMgY2xhc3MgU2F5SGVsbG9SZW5kZXJlciBleHRlbmRzIFJlbmRlcmVyCi17Ci0KLSAgICBwdWJsaWMgdm9pZCBkZWNvZGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpCi0gICAgewotICAgICAgICBzdXBlci5kZWNvZGUoZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIC8vIG5vdGhpbmcgdG8gZGVjb2RlCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5jb2RlQmVnaW4oRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgVUlDb21wb25lbnQgdWlDb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIuZW5jb2RlQmVnaW4oZmFjZXNDb250ZXh0LCB1aUNvbXBvbmVudCk7Ci0gICAgICAgIC8vIG5vIG5lZWQgdG8gdXNlIGVuY29kZUJlZ2luLgotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGVuY29kZUNoaWxkcmVuKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmVuY29kZUNoaWxkcmVuKGZhY2VzQ29udGV4dCwgdWlDb21wb25lbnQpOwotICAgICAgICAvLyB0aGlzIGNvbXBvbmVudCBkb2VzIG5vdCBoYXZlIGNoaWxkcmVuCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5jb2RlRW5kKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQsIFVJQ29tcG9uZW50IHVpQ29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLmVuY29kZUVuZChmYWNlc0NvbnRleHQsIHVpQ29tcG9uZW50KTsKLQotICAgICAgICBpZiAoIXVpQ29tcG9uZW50LmlzUmVuZGVyZWQoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0KLSAgICAgICAgUmVzcG9uc2VXcml0ZXIgd3JpdGVyID0gZmFjZXNDb250ZXh0LmdldFJlc3BvbnNlV3JpdGVyKCk7Ci0KLSAgICAgICAgU2F5SGVsbG8gc2F5SGVsbG8gPSAoU2F5SGVsbG8pIHVpQ29tcG9uZW50OwotCi0gICAgICAgIFN0cmluZyBmaXJzdE5hbWUgPSBzYXlIZWxsby5nZXRGaXJzdE5hbWUoKTsKLSAgICAgICAgU3RyaW5nIGxhc3ROYW1lID0gc2F5SGVsbG8uZ2V0TGFzdE5hbWUoKTsKLQotICAgICAgICB3cml0ZXIud3JpdGUoIkhlbGxvICIpOwotCi0gICAgICAgIGlmIChmaXJzdE5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKGZpcnN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAobGFzdE5hbWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgIitsYXN0TmFtZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB3cml0ZXIud3JpdGUoIiEiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVjODAzNjguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24uY29udmVydGVyOwotCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXIKLXsKLSAgICBwcml2YXRlIFN0cmluZyBhcmVhQ29kZTsKLSAgICBwcml2YXRlIFN0cmluZyBudW1iZXI7Ci0gICAgCi0gICAgcHVibGljIFBob25lTnVtYmVyKFN0cmluZyBudW1iZXIpIAotICAgIHsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBQaG9uZU51bWJlcihTdHJpbmcgYXJlYUNvZGUsIFN0cmluZyBudW1iZXIpIAotICAgIHsKLSAgICAgICAgdGhpcyhudW1iZXIpOwotICAgICAgICB0aGlzLmFyZWFDb2RlID0gYXJlYUNvZGU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXJlYUNvZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGFyZWFDb2RlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRBcmVhQ29kZShTdHJpbmcgYXJlYUNvZGUpCi0gICAgewotICAgICAgICB0aGlzLmFyZWFDb2RlID0gYXJlYUNvZGU7Ci0gICAgfQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TnVtYmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldE51bWJlcihTdHJpbmcgbnVtYmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlckNvbnZlcnRlci5qYXZhIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL2phdmEvb3JnL215b3JnYW5pemF0aW9uL2NvbnZlcnRlci9QaG9uZU51bWJlckNvbnZlcnRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzI3Y2EyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbnZlcnRlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlcjsKLWltcG9ydCBqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBASlNGQ29udmVydGVyCi0gKiAgIG5hbWUgPSAibXljb21wb25lbnRzOnBob25lTnVtYmVyQ29udmVydGVyIgotICogICB0YWdDbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24uY29udmVydGVyLlBob25lTnVtYmVyQ29udmVydGVyVGFnIgotICovCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJDb252ZXJ0ZXIKLSAgICAgICAgaW1wbGVtZW50cyBDb252ZXJ0ZXIKLXsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBDT05WRVJURVJfSUQgPSAiamF2YXguZmFjZXMuUGhvbmVOdW1iZXIiOwotICAgIAotICAgIHB1YmxpYyBPYmplY3QgZ2V0QXNPYmplY3QoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU3RyaW5nIFtdIHN0clBob25lID0gdmFsdWUuc3BsaXQoIi0iKTsKLSAgICAgICAgUGhvbmVOdW1iZXIgb2JqUGhvbmUgPSBudWxsOwotICAgICAgICBpZihzdHJQaG9uZS5sZW5ndGggPT0gMikgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9ialBob25lID0gbmV3IFBob25lTnVtYmVyKHN0clBob25lWzBdLCBzdHJQaG9uZVsxXSk7Ci0gICAgICAgIH0gCi0gICAgICAgIGVsc2UgaWYoc3RyUGhvbmUubGVuZ3RoID09IDEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9ialBob25lID0gbmV3IFBob25lTnVtYmVyKHN0clBob25lWzBdKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIG9ialBob25lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0QXNTdHJpbmcoRmFjZXNDb250ZXh0IGNvbnRleHQsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIENvbnZlcnRlckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYodmFsdWUgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgICAgUGhvbmVOdW1iZXIgcGhvbmUgPSAoUGhvbmVOdW1iZXIpdmFsdWU7Ci0gICAgICAgICAgICByZXR1cm4gcGhvbmUuZ2V0QXJlYUNvZGUoKSArICItIiArIHBob25lLmdldE51bWJlcigpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvQWJzdHJhY3RPZGROdW1iZXJWYWxpZGF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBmOTAxOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL0Fic3RyYWN0T2RkTnVtYmVyVmFsaWRhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi52YWxpZGF0b3I7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5GYWNlc01lc3NhZ2U7Ci1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3I7Ci1pbXBvcnQgamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5jb21tb25zLnZhbGlkYXRvci5WYWxpZGF0b3JCYXNlOwotCi0vKioKLSAqIEBKU0ZWYWxpZGF0b3IKLSAqICAgbmFtZSA9ICJteWNvbXBvbmVudHM6dmFsaWRhdGVPZGROdW0iCi0gKiAgIGNsYXNzID0gIm9yZy5teW9yZ2FuaXphdGlvbi52YWxpZGF0b3IuT2RkTnVtYmVyVmFsaWRhdG9yIgotICogICB0YWdDbGFzcyA9ICJvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yLk9kZE51bWJlclZhbGlkYXRvclRhZyIKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0T2RkTnVtYmVyVmFsaWRhdG9yIGV4dGVuZHMgVmFsaWRhdG9yQmFzZQotewotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgU3RyaW5nIFZBTElEQVRPUl9JRCA9ICJvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yLk9kZE51bWJlclZhbGlkYXRvciI7Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdmFsaWRhdGUoRmFjZXNDb250ZXh0IGFyZzAsIFVJQ29tcG9uZW50IGNvbXBvbmVudCwgT2JqZWN0IHZhbHVlKQotICAgICAgICAgICAgdGhyb3dzIFZhbGlkYXRvckV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYoISh2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoIlBsZWFzZSBlbnRlciBhbiBpbnRlZ2VyLiIpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaW50IGludFZhbCA9ICgoSW50ZWdlcil2YWx1ZSkuaW50VmFsdWUoKTsKLSAgICAgICAgaWYoaW50VmFsICUgMiA9PSAwKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVmFsaWRhdG9yRXhjZXB0aW9uKG5ldyBGYWNlc01lc3NhZ2UoIlBsZWFzZSBlbnRlciBhbiBvZGQgbnVtYmVyLiIpKTsKLSAgICAgICAgfQotICAgIH0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiMTIwYWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLSNsaXRlcmFsKCkNCi0jIyBWZWxvY2l0eSB0ZW1wbGF0ZSB1c2VkIHRvIGdlbmVyYXRlIEpTRjEuMi1jb21wYXRpYmxlIGNvbXBvbmVudCBjbGFzc2VzDQotIyMgZnJvbSBjb21wb25lbnQgbWV0YS1kYXRhLg0KLSMjDQotIyMgTm90ZSB0aGF0IHRoZXJlIGFyZSB0d28gdHlwZXMgb2YgY29tcG9uZW50IGdlbmVyYXRpb246DQotIyMgICogInN1YmNsYXNzIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgcGFyZW50IGNsYXNzKQ0KLSMjICAqICJ0ZW1wbGF0ZSBtb2RlIiAodXNlIGFubm90YXRlZCBjbGFzcyBhcyBhIHRlbXBsYXRlKQ0KLSMjIFRoaXMgdGVtcGxhdGUgZmlsZSBpcyB1c2VkIGZvciBib3RoLg0KLSMjDQotIyMgVmFyaWFibGUgJGNvbXBvbmVudCByZWZlcnMgdG8gYSBDb21wb25lbnRNZXRhIG9iamVjdCB0byBwcm9jZXNzDQotIyMgVmFyaWFibGUgJHV0aWxzIHJlZmVycyB0byBhbiBpbnN0YW5jZSBvZiBNeWZhY2VzVXRpbHMuDQotIyMNCi0jIyBXaGVuICJ0ZW1wbGF0ZSBtb2RlIiBpcyBiZWluZyB1c2VkIHRoZW4gdmFyaWFibGUgJGlubmVyc291cmNlDQotIyMgaG9sZHMgYSBTdHJpbmcgY29udGFpbmluZyBhbGwgdGhlIG5vbi1hYnN0cmFjdCBmdW5jdGlvbnMgZGVmaW5lZA0KLSMjIGluIHRoZSBhbm5vdGF0ZWQgY2xhc3MuDQotIyMNCi0jIyBUaGUgamF2YSBwYWNrYWdlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgaXMgYWx3YXlzIHRoZSBzYW1lIGFzDQotIyMgdGhlIHBhY2thZ2UgaW4gd2hpY2ggdGhlIGFubm90YXRlZCBjbGFzcyBleGlzdHMuDQotIyMNCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR7Y29tcG9uZW50LnBhY2thZ2VOYW1lfTsNCi0NCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi0kdXRpbHMuaW1wb3J0VGFnQ2xhc3NlcygkY29tcG9uZW50KQ0KLQ0KLSNpZiAoJGNvbXBvbmVudC5pc1RlbXBsYXRlKCkpDQotI3NldCAoJGdlbmVyYXRlZENsYXNzUGFyZW50ID0gJGNvbXBvbmVudC5zb3VyY2VDbGFzc1BhcmVudENsYXNzTmFtZSkNCi0jZWxzZQ0KLSNzZXQgKCRnZW5lcmF0ZWRDbGFzc1BhcmVudCA9ICRjb21wb25lbnQuc291cmNlQ2xhc3NOYW1lKQ0KLSNlbmQNCi0vLyBHZW5lcmF0ZWQgZnJvbSBjbGFzcyAke2NvbXBvbmVudC5zb3VyY2VDbGFzc05hbWV9Lg0KLS8vDQotLy8gV0FSTklORzogVGhpcyBmaWxlIHdhcyBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4gRG8gbm90IGVkaXQgaXQgZGlyZWN0bHksDQotLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuDQotcHVibGljIGNsYXNzICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0gZXh0ZW5kcyAkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQNCi0jaWYgKCRjb21wb25lbnQuaW1wbGVtZW50cykNCi0gICAgaW1wbGVtZW50cyAkY29tcG9uZW50LmltcGxlbWVudHMNCi0jZW5kDQotew0KLSNpZiAoJGNvbXBvbmVudC5zZXJpYWx1aWQpDQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9ICR7Y29tcG9uZW50LnNlcmlhbHVpZH07IA0KLSNlbmQgIA0KLQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfRkFNSUxZID0NCi0gICAgICAgICIkY29tcG9uZW50LmZhbWlseSI7DQotICAgIHN0YXRpYyBwdWJsaWMgZmluYWwgU3RyaW5nIENPTVBPTkVOVF9UWVBFID0NCi0gICAgICAgICIkY29tcG9uZW50LnR5cGUiOw0KLSNpZiAoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUpDQotI2lmICghKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKSkNCi0gICAgc3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgREVGQVVMVF9SRU5ERVJFUl9UWVBFID0gDQotICAgICAgICAiJGNvbXBvbmVudC5yZW5kZXJlclR5cGUiOw0KLSNlbmQNCi0jZW5kDQotDQotI2lmICgkaW5uZXJzb3VyY2UpDQotICAgIC8vQkVHSU4gQ09ERSBDT1BJRUQgRlJPTSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZSANCi0kaW5uZXJzb3VyY2UNCi0gICAgLy9FTkQgQ09ERSBDT1BJRUQgRlJPTSAkY29tcG9uZW50LnNvdXJjZUNsYXNzTmFtZQ0KLSNlbmQNCi0NCi0gICAgcHVibGljICR7dXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQuY2xhc3NOYW1lKX0oKQ0KLSAgICB7DQotI2lmICgkY29tcG9uZW50LnJlbmRlcmVyVHlwZSkNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlID09ICIiKQ0KLSAgICAgICAgc2V0UmVuZGVyZXJUeXBlKG51bGwpOw0KLSNlbHNlDQotICAgICAgICBzZXRSZW5kZXJlclR5cGUoIiRjb21wb25lbnQucmVuZGVyZXJUeXBlIik7DQotI2VuZA0KLSNlbHNlDQotICAgICAgICBzZXRSZW5kZXJlclR5cGUobnVsbCk7DQotI2VuZA0KLSAgICB9DQotDQotIyMgT24gbXlmYWNlcyAxLjEgdGhlIGZhbWlseSBpcyBpbmhlcml0ZWQsIHNvIHRoaXMgY291bGQgYmUgY29tbWVudGVkDQotIyMgT24gb3RoZXIgdGhpcyBzaG91bGQgbm90IGJlIGNvbW1lbnRlZCAgICANCi0gICAgcHVibGljIFN0cmluZyBnZXRGYW1pbHkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gQ09NUE9ORU5UX0ZBTUlMWTsNCi0gICAgfQ0KLSAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHtjb21wb25lbnQucHJvcGVydHlDb21wb25lbnRMaXN0fSkNCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZigkdXRpbHMuZ2V0RGVmYXVsdFZhbHVlRmllbGQoJHByb3BlcnR5KSkgDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9ICR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKQ0KLSNlbHNlDQotI3NldCAoJGRlZmF1bHRWYWx1ZSA9IGZhbHNlKQ0KLSNlbmQNCi0gICAgLy8gUHJvcGVydHk6ICRwcm9wZXJ0eS5uYW1lDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpIHx8ICRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZCAjaWYoJGRlZmF1bHRWYWx1ZSkgPSAkZGVmYXVsdFZhbHVlOyN7ZWxzZX07I3tlbmR9DQotDQotICAgICANCi0jZWxzZQ0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSAgICBwcml2YXRlIGJvb2xlYW4gJHtmaWVsZH1TZXQ7DQotICAgIA0KLSNpZiAoJHByb3BlcnR5LmlzU2V0TWV0aG9kKCkpDQotICAgICRwcm9wZXJ0eS5zZXRNZXRob2RTY29wZSBib29sZWFuICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNTZXQiLCAkcHJvcGVydHkubmFtZSkoKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJHtmaWVsZH1TZXQ7DQotICAgIH0NCi0jZW5kDQotI2VuZA0KLSNpZigkcHJvcGVydHkuaXNMb2NhbE1ldGhvZCgpKQ0KLSNpZigiYm9vbGVhbiIgPT0gJHR5cGUpDQotI3NldCAoJG1ldGhvZE5hbWUgPSAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImlzTG9jYWwiLCAkcHJvcGVydHkubmFtZSkpDQotI2Vsc2UNCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiZ2V0TG9jYWwiLCAkcHJvcGVydHkubmFtZSkpDQotI2VuZA0KLSAgICBmaW5hbCAkcHJvcGVydHkubG9jYWxNZXRob2RTY29wZSAkdHlwZSAke21ldGhvZE5hbWV9KCkNCi0gICAgew0KLSAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0gICAgfQ0KLSAgICAgDQotI2VuZA0KLSAgICBwdWJsaWMgJHR5cGUgJHV0aWxzLmdldE1ldGhvZFJlYWRlckZyb21Qcm9wZXJ0eSgkcHJvcGVydHkubmFtZSwgJHR5cGUpKCkNCi0gICAgew0KLSNpZiAoJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSB8fCAkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0jZWxzZQ0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgaWYgKCR7ZmllbGR9U2V0KQ0KLSNlbHNlDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotI2VuZA0KLSAgICAgICAgew0KLSAgICAgICAgICAgIHJldHVybiAkZmllbGQ7DQotICAgICAgICB9DQotICAgICAgICBWYWx1ZUV4cHJlc3Npb24gdmIgPSBnZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIik7DQotICAgICAgICBpZiAodmIgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSkNCi0gICAgICAgICAgICByZXR1cm4gKCR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKSkuJHt0eXBlfVZhbHVlKCk7DQotI2Vsc2UNCi0jc2V0ICgkcHJpdHlwZSA9ICR1dGlscy5nZXRQcmltaXRpdmVUeXBlKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByaXR5cGUpKQ0KLSAgICAgICAgICAgIE9iamVjdCB2YWx1ZSA9IHZiID09IG51bGwgPyBudWxsIDogdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgJHR5cGUpKXsNCi0gICAgICAgICAgICAgICAgdmFsdWUgPSAke3R5cGV9LnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgfSAgICAgICAgICAgIA0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZTsNCi0jZWxzZQ0KLSAgICAgICAgICAgIHJldHVybiAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSk7DQotI2VuZA0KLSNlbmQNCi0gICAgICAgIH0NCi0jaWYgKCRkZWZhdWx0VmFsdWUpDQotICAgICAgICByZXR1cm4gJGRlZmF1bHRWYWx1ZTsgDQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgcmV0dXJuICR1dGlscy5wcmltaXRpdmVEZWZhdWx0VmFsdWUoJHR5cGUpOw0KLSNlbHNlICAgICAgIA0KLSAgICAgICAgcmV0dXJuIG51bGw7DQotI2VuZA0KLSNlbmQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5uYW1lKSgkdHlwZSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSkpDQotICAgIHsNCi0gICAgICAgIHRoaXMuJGZpZWxkID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpOw0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0gICAgICAgIHRoaXMuJHtmaWVsZH1TZXQgPSB0cnVlOyAgICAgICAgDQotI2VuZA0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBwdWJsaWMgT2JqZWN0IHNhdmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0KQ0KLSAgICB7DQotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByb3BlcnR5TGlzdC5zaXplKCkgKyAxKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSNzZXQgKCRwcmltaXRpdmVDb3VudCA9ICRwcmltaXRpdmVDb3VudCArIDEpDQotI2VuZA0KLSNlbmQNCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IG5ldyBPYmplY3RbJHByaW1pdGl2ZUNvdW50XTsNCi0gICAgICAgIHZhbHVlc1swXSA9IHN1cGVyLnNhdmVTdGF0ZShmYWNlc0NvbnRleHQpOw0KLSNzZXQgKCRhcnJheUluZGV4ID0gMCkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkcHJvcGVydHkuY2xhc3NOYW1lKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSNpZiAoJHByb3BlcnR5LmpzcE5hbWUgPT0gInZhbGlkYXRvciIgJiYgJHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsJHtmaWVsZH1MaXN0KTsNCi0jZWxzZWlmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApIyMgfHwgJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwkZmllbGQpOw0KLSNlbHNlaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkdHlwZSl9LnZhbHVlT2YoJGZpZWxkKTsNCi0jZWxzZQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9ICRmaWVsZDsNCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgIHZhbHVlc1skYXJyYXlJbmRleF0gPSBCb29sZWFuLnZhbHVlT2YoJHtmaWVsZH1TZXQpOw0KLSNlbmQNCi0jZW5kDQotICAgICAgICByZXR1cm4gdmFsdWVzOyANCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgdm9pZCByZXN0b3JlU3RhdGUoRmFjZXNDb250ZXh0IGZhY2VzQ29udGV4dCwgT2JqZWN0IHN0YXRlKQ0KLSAgICB7DQotICAgICAgICBPYmplY3RbXSB2YWx1ZXMgPSAoT2JqZWN0W10pc3RhdGU7DQotICAgICAgICBzdXBlci5yZXN0b3JlU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1swXSk7DQotI3NldCAoJGFycmF5SW5kZXggPSAwKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICRwcm9wZXJ0eS5jbGFzc05hbWUpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotI2lmICggJHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSApDQotI2lmICgkcHJvcGVydHkuanNwTmFtZSA9PSAidmFsaWRhdG9yIiAmJiAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgKQ0KLSAgICAgICAgJHtmaWVsZH1MaXN0ID0gKExpc3Q8VmFsaWRhdG9yPikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlaWYgKCR1dGlscy5pc0xpc3QoJHR5cGUpKQ0KLSAgICAgICAgJGZpZWxkID0gKExpc3QpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZQ0KLSAgICAgICAgJGZpZWxkID0gJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOyANCi0jZW5kDQotI2Vsc2VpZiAoJHV0aWxzLmlzQ29udmVydGVyKCR0eXBlKSkgDQotICAgICAgICAkZmllbGQgPSAoQ29udmVydGVyKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgJGZpZWxkID0gKCR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlc1skYXJyYXlJbmRleF0pLiR7dHlwZX1WYWx1ZSgpOw0KLSNlbHNlDQotICAgICAgICAkZmllbGQgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSB2YWx1ZXNbJGFycmF5SW5kZXhdOw0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpICkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0gICAgICAgICR7ZmllbGR9U2V0ID0gKChCb29sZWFuKSB2YWx1ZXNbJGFycmF5SW5kZXhdKS5ib29sZWFuVmFsdWUoKTsNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotfQ0KLSNlbmQNCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxYWY0ZmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSIgPz4KLQotPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMKLSAiLS8vU3VuIE1pY3Jvc3lzdGVtcywgSW5jLi8vRFREIEphdmFTZXJ2ZXIgRmFjZXMgQ29uZmlnIDEuMS8vRU4iCi0gImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzEuZHRkIj4KLQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiI+Ci0KLSAgPCEtLSBjb21wb25lbnRzIC0tPgotCi0gIDxjb21wb25lbnQ+Ci0gICAgPGNvbXBvbmVudC10eXBlPm9yZy5teW9yZ2FuaXphdGlvbi5TYXlIZWxsbzwvY29tcG9uZW50LXR5cGU+Ci0gICAgPGNvbXBvbmVudC1jbGFzcz5vcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvLlNheUhlbGxvPC9jb21wb25lbnQtY2xhc3M+Ci0gIDwvY29tcG9uZW50PgotCi0KLSAgPCEtLSByZW5kZXJraXQgLS0+Ci0KLSAgPHJlbmRlci1raXQ+Ci0KLSAgICA8cmVuZGVyZXI+Ci0gICAgICA8Y29tcG9uZW50LWZhbWlseT5qYXZheC5mYWNlcy5PdXRwdXQ8L2NvbXBvbmVudC1mYW1pbHk+Ci0gICAgICA8cmVuZGVyZXItdHlwZT5vcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG9SZW5kZXJlcjwvcmVuZGVyZXItdHlwZT4KLSAgICAgIDxyZW5kZXJlci1jbGFzcz5vcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LnNheWhlbGxvLlNheUhlbGxvUmVuZGVyZXI8L3JlbmRlcmVyLWNsYXNzPgotICAgIDwvcmVuZGVyZXI+Ci0KLSAgPC9yZW5kZXIta2l0PgotCi08L2ZhY2VzLWNvbmZpZz4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRhZ2xpYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50YWdsaWIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDdiZDEwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXljb21wb25lbnRzLnRhZ2xpYi54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMKLSAgIi0vL1N1biBNaWNyb3N5c3RlbXMsIEluYy4vL0RURCBGYWNlbGV0IFRhZ2xpYiAxLjAvL0VOIgotICAiaHR0cDovL2phdmEuc3VuLmNvbS9kdGQvZmFjZWxldC10YWdsaWJfMV8wLmR0ZCI+Ci08ZmFjZWxldC10YWdsaWI+Ci0JPG5hbWVzcGFjZT5odHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzPC9uYW1lc3BhY2U+Ci0JCi0JPHRhZz4KLQkJPHRhZy1uYW1lPnNheUhlbGxvPC90YWctbmFtZT4KLQkJPGNvbXBvbmVudD4KLQkJCTxjb21wb25lbnQtdHlwZT5vcmcubXlvcmdhbml6YXRpb24uU2F5SGVsbG88L2NvbXBvbmVudC10eXBlPgotCQkJPHJlbmRlcmVyLXR5cGU+b3JnLm15b3JnYW5pemF0aW9uLlNheUhlbGxvUmVuZGVyZXI8L3JlbmRlcmVyLXR5cGU+Ci0JCTwvY29tcG9uZW50PgotCTwvdGFnPgotPC9mYWNlbGV0LXRhZ2xpYj4gCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215Y29tcG9uZW50cy50bGQudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwODMzMTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWNvbXBvbmVudHMudGxkLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMjI3ICswLDAgQEAKLSNsaXRlcmFsKCkNCi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/Pg0KLTwhLS0NCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICoNCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqDQotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqIHVuZGVyIHRoZSBMaWNlbnNlLg0KLS0tPg0KLTx0YWdsaWIgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgDQotICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiANCi0gICAgICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiIA0KLSAgICAgICAgdmVyc2lvbj0iMi4xIj4NCi0gIDx0bGliLXZlcnNpb24+MS4xLjc8L3RsaWItdmVyc2lvbj4NCi0gICA8c2hvcnQtbmFtZT4kc2hvcnRuYW1lPC9zaG9ydC1uYW1lPg0KLSAgIDx1cmk+JHVyaTwvdXJpPg0KLSAgIDxkaXNwbGF5LW5hbWU+JGRpc3BsYXluYW1lPC9kaXNwbGF5LW5hbWU+DQotICAgPGRlc2NyaXB0aW9uPiRkZXNjcmlwdGlvbjwvZGVzY3JpcHRpb24+DQotDQotJGJhc2VDb250ZW50DQotDQotICAgIDwhLS0gQ29tcG9uZW50IFRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbXBvbmVudHMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkY29tcG9uZW50Lm5hbWUpID09ICRzaG9ydG5hbWUpIA0KLSAgIDx0YWc+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PkpTUDwvYm9keS1jb250ZW50Pg0KLSNlbmQNCi0gICAgICA8ZGVzY3JpcHRpb24+PCFbQ0RBVEFbJGNvbXBvbmVudC5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSAgICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eUxpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI2lmICghJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRwcm9wZXJ0eS5qc3BOYW1lPC9uYW1lPg0KLSNpZiAoJHByb3BlcnR5LmlzUmVxdWlyZWQoKSkNCi0gICAgICAgICA8cmVxdWlyZWQ+JHByb3BlcnR5LmlzUmVxdWlyZWQoKTwvcmVxdWlyZWQ+DQotI2VuZA0KLSNpZiAoJHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpIHx8ICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkNCi0jaWYgKCRwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCkpDQotICAgICAgICA8ZGVmZXJyZWQtbWV0aG9kPg0KLSNzZXQgKCRzaWcgPSAkcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpKQ0KLSAgICAgICAgICAgIDxtZXRob2Qtc2lnbmF0dXJlPiRzaWcucmV0dXJuVHlwZSBteU1ldGhvZCggJHNpZy5wYXJhbWV0ZXJUeXBlc0FzU3RyaW5nICk8L21ldGhvZC1zaWduYXR1cmU+DQotDQotICAgICAgICA8L2RlZmVycmVkLW1ldGhvZD4NCi0jZWxzZQ0KLSMjIFRoaXMgaXMgYSB2ZXJ5IHNwZWNpYWwgY2FzZS4gSWYgYSBwcm9wZXJ0eSBpcyBNZXRob2RCaW5kaW5nIG9yIE1ldGhvZEV4cHJlc3Npb24NCi0jIyB0aGlzIHNob3VsZCBoYXZlIGEgc2lnbmF0dXJlLiBJZiBub3QsIGZvciBhbGxvdyBtdWx0aXBsZSBNZXRob2RCaW5kaW5nDQotIyMgc2ltdWxhdGUgYSBWYWx1ZUV4cHJlc3Npb24gYW5kIHdyaXRlIGEgY3VzdG9tIGNvZGUgbGlrZSBpbiANCi0jIyBvcmcuYXBhY2hlLm15ZmFjZXMuY3VzdG9tLnN1Z2dlc3RhamF4LkFic3RyYWN0U3VnZ2VzdEFqYXhUYWcNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWUvPg0KLSNlbmQNCi0jZWxzZWlmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICAgICAgPHR5cGU+JHByb3BlcnR5LmNsYXNzTmFtZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gQ29udmVydGVyIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldENvbnZlcnRlcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkY29tcG9uZW50Lm5hbWUpID09ICRzaG9ydG5hbWUpIA0KLSAgIDx0YWc+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5Lm5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICAgICAgPHR5cGU+JHByb3BlcnR5LmNsYXNzTmFtZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gVmFsaWRhdG9yIHRhZ3MgLS0+DQotI3NldCAoJGNvbXBvbmVudExpc3QgPSAke21vZGVsLmdldFZhbGlkYXRvcnMoKX0pDQotI2ZvcmVhY2goICRjb21wb25lbnQgaW4gJGNvbXBvbmVudExpc3QgKQ0KLSNpZiAoJG1vZGVsSWRzLmNvbnRhaW5zKCRjb21wb25lbnQubW9kZWxJZCkgDQotICAgICYmICgkY29tcG9uZW50Lm5hbWUpKQ0KLSNpZiAoJHV0aWxzLmdldFRhZ1ByZWZpeCgkY29tcG9uZW50Lm5hbWUpID09ICRzaG9ydG5hbWUpIA0KLSAgIDx0YWc+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJGNvbXBvbmVudC5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiRjb21wb25lbnQudGFnQ2xhc3M8L3RhZy1jbGFzcz4NCi0jaWYgKCRjb21wb25lbnQuYm9keUNvbnRlbnQpDQotICAgICAgPGJvZHktY29udGVudD4kY29tcG9uZW50LmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotI2Vsc2UNCi0gICAgICA8Ym9keS1jb250ZW50PmVtcHR5PC9ib2R5LWNvbnRlbnQ+DQotI2VuZA0KLSAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskY29tcG9uZW50LmxvbmdEZXNjcmlwdGlvbl1dPjwvZGVzY3JpcHRpb24+DQotICAgICAgDQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29tcG9uZW50LnByb3BlcnR5TGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYgKCEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSAgICAgIDxhdHRyaWJ1dGU+DQotICAgICAgICAgPG5hbWU+JHByb3BlcnR5Lm5hbWU8L25hbWU+DQotI2lmICgkcHJvcGVydHkuaXNSZXF1aXJlZCgpKQ0KLSAgICAgICAgIDxyZXF1aXJlZD4kcHJvcGVydHkuaXNSZXF1aXJlZCgpPC9yZXF1aXJlZD4NCi0jZW5kDQotI2lmICgkcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT5mYWxzZTwvcnRleHBydmFsdWU+DQotI2Vsc2UNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiU3RyaW5nIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZWZlcnJlZC12YWx1ZT4NCi0gICAgICAgICAgICAgPHR5cGU+JHByb3BlcnR5LmNsYXNzTmFtZTwvdHlwZT4NCi0gICAgICAgICA8L2RlZmVycmVkLXZhbHVlPg0KLSNlbmQNCi0jZW5kDQotI2lmICgkcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uKQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVskcHJvcGVydHkubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jZWxzZQ0KLSAgICAgICAgIDxkZXNjcmlwdGlvbj48IVtDREFUQVtdXT48L2Rlc2NyaXB0aW9uPg0KLSNlbmQNCi0gICAgICA8L2F0dHJpYnV0ZT4NCi0jZW5kDQotI2VuZA0KLSAgIDwvdGFnPg0KLSNlbmQNCi0jZW5kDQotI2VuZA0KLSAgIDwhLS0gU2luZ2xlIFRhZ3MgLS0+DQotI3NldCAoJHRhZ0xpc3QgPSAkbW9kZWwuZ2V0VGFncygpKQ0KLSNmb3JlYWNoKCAkdGFnIGluICR0YWdMaXN0ICkNCi0jaWYgKCRtb2RlbElkcy5jb250YWlucygkdGFnLm1vZGVsSWQpKQ0KLSAgIDx0YWc+DQotICAgICAgPG5hbWU+JHV0aWxzLmdldFRhZ05hbWUoJHRhZy5uYW1lKTwvbmFtZT4NCi0gICAgICA8dGFnLWNsYXNzPiR0YWcuY2xhc3NOYW1lPC90YWctY2xhc3M+DQotICAgICAgPGJvZHktY29udGVudD4kdGFnLmJvZHlDb250ZW50PC9ib2R5LWNvbnRlbnQ+DQotICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyR0YWcubG9uZ0Rlc2NyaXB0aW9uXV0+PC9kZXNjcmlwdGlvbj4NCi0jc2V0ICgkYXR0cmlidXRlTGlzdCA9ICR7dGFnLmF0dHJpYnV0ZUxpc3R9KQ0KLSNmb3JlYWNoKCAkYXR0cmlidXRlIGluICRhdHRyaWJ1dGVMaXN0ICkNCi0gICAgICA8YXR0cmlidXRlPg0KLSAgICAgICAgIDxuYW1lPiRhdHRyaWJ1dGUubmFtZTwvbmFtZT4NCi0gICAgICAgICA8cmVxdWlyZWQ+JGF0dHJpYnV0ZS5pc1JlcXVpcmVkKCk8L3JlcXVpcmVkPg0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkYXR0cmlidXRlLmNsYXNzTmFtZSkpDQotI2lmICgkdHlwZSA9PSAiVmFsdWVFeHByZXNzaW9uIikNCi0gICAgICAgICA8ZGVmZXJyZWQtdmFsdWU+PC9kZWZlcnJlZC12YWx1ZT4NCi0jZWxzZQ0KLSAgICAgICAgIDxydGV4cHJ2YWx1ZT4kYXR0cmlidXRlLmlzUnRleHBydmFsdWUoKTwvcnRleHBydmFsdWU+DQotI2lmICgkYXR0cmlidXRlLmNsYXNzTmFtZSkgICAgICAgICANCi0gICAgICAgICA8dHlwZT4kYXR0cmlidXRlLmNsYXNzTmFtZTwvdHlwZT4NCi0jZWxzZQ0KLSAgICAgICAgIDx0eXBlPmphdmEubGFuZy5TdHJpbmc8L3R5cGU+DQotI2VuZA0KLSNlbmQNCi0jaWYgKCRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb24pDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBWyRwcm9wZXJ0eS5sb25nRGVzY3JpcHRpb25dXT48L2Rlc2NyaXB0aW9uPg0KLSNlbHNlDQotICAgICAgICAgPGRlc2NyaXB0aW9uPjwhW0NEQVRBW11dPjwvZGVzY3JpcHRpb24+DQotI2VuZA0KLSAgICAgIDwvYXR0cmlidXRlPg0KLSNlbmQNCi0gICA8L3RhZz4NCi0jZW5kDQotI2VuZA0KLTwvdGFnbGliPg0KLSNlbmQNCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4YzU2OWQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTcyICswLDAgQEAKLSNsaXRlcmFsKCkNCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR7Y29tcG9uZW50LnRhZ1BhY2thZ2V9Ow0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQ7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotJHV0aWxzLmltcG9ydFRhZ0NsYXNzZXMxMigkY29tcG9uZW50KQ0KLQ0KLXB1YmxpYyBjbGFzcyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRjb21wb25lbnQudGFnQ2xhc3MpDQotI2lmICgke2NvbXBvbmVudC50YWdTdXBlcmNsYXNzfSkNCi0gICAgZXh0ZW5kcyAke2NvbXBvbmVudC50YWdTdXBlcmNsYXNzfQ0KLSNlbHNlDQotICAgIGV4dGVuZHMgamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnDQotI2VuZA0KLXsNCi0gICAgcHVibGljICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbXBvbmVudC50YWdDbGFzcykoKQ0KLSAgICB7ICAgIA0KLSAgICB9DQotICAgIA0KLSAgICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQ0KLSAgICB7DQotI2lmICgkY29tcG9uZW50LnR5cGUpDQotICAgICAgICByZXR1cm4gIiRjb21wb25lbnQudHlwZSI7DQotI2Vsc2UNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0gICAgfQ0KLQ0KLSAgICBwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpDQotICAgIHsNCi0jaWYgKCRjb21wb25lbnQucmVuZGVyZXJUeXBlICYmICEoJGNvbXBvbmVudC5yZW5kZXJlclR5cGUgPT0gIiIpKQ0KLSAgICAgICAgcmV0dXJuICIkY29tcG9uZW50LnJlbmRlcmVyVHlwZSI7DQotI2Vsc2UNCi0gICAgICAgIHJldHVybiBudWxsOw0KLSNlbmQNCi0gICAgfQ0KLQ0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke2NvbXBvbmVudC5wcm9wZXJ0eVRhZ0xpc3R9KQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpKQ0KLSANCi0gICAgcHJpdmF0ZSAkdHlwZSAkZmllbGQ7DQotICAgIA0KLSNzZXQgKCR2YXIgPSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSkpDQotICAgIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5LmpzcE5hbWUpKCR0eXBlICR2YXIpDQotICAgIHsNCi0gICAgICAgICRmaWVsZCA9ICR2YXI7DQotICAgIH0NCi0jZW5kDQotDQotICAgIHByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXMoVUlDb21wb25lbnQgY29tcG9uZW50KQ0KLSAgICB7DQotICAgICAgICBpZiAoIShjb21wb25lbnQgaW5zdGFuY2VvZiAkY29tcG9uZW50LmNsYXNzTmFtZSkpDQotICAgICAgICB7DQotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQ29tcG9uZW50ICIrDQotICAgICAgICAgICAgICAgIGNvbXBvbmVudC5nZXRDbGFzcygpLmdldE5hbWUoKSArIiBpcyBubyAkY29tcG9uZW50LmNsYXNzTmFtZSIpOw0KLSAgICAgICAgfQ0KLSAgICAgICAgDQotICAgICAgICAkY29tcG9uZW50LmNsYXNzTmFtZSBjb21wID0gKCRjb21wb25lbnQuY2xhc3NOYW1lKSBjb21wb25lbnQ7DQotICAgICAgICANCi0gICAgICAgIHN1cGVyLnNldFByb3BlcnRpZXMoY29tcG9uZW50KTsNCi0gICAgICAgIA0KLSAgICAgICAgRmFjZXNDb250ZXh0IGNvbnRleHQgPSBnZXRGYWNlc0NvbnRleHQoKTsNCi0NCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKSMjICAgICAgICAgICAgMQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0jaWYgKCR1dGlscy5pc0NvbnZlcnRlcigkcHJvcGVydHkuY2xhc3NOYW1lKSkjIyAgICAgICAgICAgICAgICAgICAyDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCEke2ZpZWxkfS5pc0xpdGVyYWxUZXh0KCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBjb21wLnNldFZhbHVlRXhwcmVzc2lvbigiJHByb3BlcnR5Lm5hbWUiLCAkZmllbGQpOw0KLSAgICAgICAgICAgIH0NCi0gICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKTsNCi0gICAgICAgICAgICAgICAgaWYgKHMgIT0gbnVsbCkNCi0gICAgICAgICAgICAgICAgeyAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlQ29udmVydGVyKHMpOw0KLSAgICAgICAgICAgICAgICAgICAgY29tcC5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0jZWxzZWlmICgkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpIyMgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb25MaXN0ZW5lciIpDQotICAgICAgICAgICAgY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWx1ZUNoYW5nZUxpc3RlbmVyIikNCi0gICAgICAgICAgICBjb21wLmFkZFZhbHVlQ2hhbmdlTGlzdGVuZXIobmV3IE1ldGhvZEV4cHJlc3Npb25WYWx1ZUNoYW5nZUxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiKQ0KLSAgICAgICAgICAgIGNvbXAuYWRkVmFsaWRhdG9yKG5ldyBNZXRob2RFeHByZXNzaW9uVmFsaWRhdG9yKCRmaWVsZCkpOw0KLSNlbHNlaWYgKCR1dGlscy5pc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSkjIzMNCi0gICAgICAgICAgICBNZXRob2RCaW5kaW5nIG1iOw0KLSAgICAgICAgICAgIGlmIChpc1ZhbHVlUmVmZXJlbmNlKCRmaWVsZCkpDQotICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICBtYiA9IGNvbnRleHQuZ2V0QXBwbGljYXRpb24oKS5jcmVhdGVNZXRob2RCaW5kaW5nKA0KLSAgICAgICAgICAgICAgICAgICAgJGZpZWxkLCAkdXRpbHMuZ2V0U2lnbmF0dXJlUGFyYW1zKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSk7ICAgICAgICAgICAgDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkludmFsaWQgZXhwcmVzc2lvbiAiICsgJGZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obWIpOw0KLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgICAgIE1ldGhvZEJpbmRpbmcgbWIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlTWV0aG9kQmluZGluZygNCi0gICAgICAgICAgICAgICAgJGZpZWxkLCAkdXRpbHMuZ2V0U2lnbmF0dXJlUGFyYW1zKCRwcm9wZXJ0eS5tZXRob2RCaW5kaW5nU2lnbmF0dXJlKSk7DQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obWIpOw0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgfQ0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkjIyAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb24iKQ0KLSAgICAgICAgICAgIGNvbXAuc2V0QWN0aW9uRXhwcmVzc2lvbigkZmllbGQpOw0KLSNlbHNlaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJhY3Rpb25MaXN0ZW5lciIpDQotICAgICAgICAgICAgY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCRmaWVsZCkpOw0KLSNlbHNlDQotICAgICAgICAgICAgY29tcC4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oJGZpZWxkKTsNCi0jZW5kICAgICAgICANCi0gICAgICAgIH0gICAgICAgIA0KLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDINCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0gICAgICAgIHsNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpIyMgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgICAgIGNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dCgiJHByb3BlcnR5Lm5hbWUiLCAkZmllbGQpOw0KLSNlbHNlIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMw0KLSAgICAgICAgICAgIGNvbXAuc2V0VmFsdWVFeHByZXNzaW9uKCIkcHJvcGVydHkubmFtZSIsICRmaWVsZCk7DQotI2VuZCMjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAzDQotICAgICAgICB9IA0KLSNlbmQjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDINCi0jZW5kIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQ0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlbGVhc2UoKQ0KLSAgICB7DQotICAgICAgICBzdXBlci5yZWxlYXNlKCk7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNpZigkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSA9PSAiYm9vbGVhbiIpDQotI3NldCAoJGVtcHR5ID0gImZhbHNlIikNCi0jZWxzZQ0KLSNzZXQgKCRlbXB0eSA9ICJudWxsIikNCi0jZW5kDQotICAgICAgICAkZmllbGQgPSAkZW1wdHk7DQotI2VuZA0KLSAgICB9DQotfQ0KLSNlbmQNCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NvbnZlcnRlckNsYXNzMTIudm0gYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NvbnZlcnRlckNsYXNzMTIudm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkMTEwZjMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9jb3JlL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDb252ZXJ0ZXJDbGFzczEyLnZtCisrKyAvZGV2L251bGwKQEAgLTEsMTY5ICswLDAgQEAKLSNsaXRlcmFsKCkNCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi0vKg0KLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotICogDQotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLSAqIA0KLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAqICB1bmRlciB0aGUgTGljZW5zZS4NCi0gKi8NCi1wYWNrYWdlICR1dGlscy5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygkY29udmVydGVyLnRhZ0NsYXNzKTsNCi0NCi1pbXBvcnQgamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQ7DQotaW1wb3J0IGphdmF4LmVsLkVMQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZmFjZXMuY29udmVydC5Db252ZXJ0ZXI7DQotaW1wb3J0IGphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbjsNCi1pbXBvcnQgamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnOw0KLWltcG9ydCBqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb247DQotaW1wb3J0IGphdmF4LnNlcnZsZXQuanNwLlBhZ2VDb250ZXh0Ow0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCRjb252ZXJ0ZXIpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykNCi0jaWYgKCR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7Y29udmVydGVyLnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy5jb252ZXJ0ZXIuQ29udmVydGVyVGFnDQotI2VuZA0KLXsNCi0jaWYgKCRjb252ZXJ0ZXIuc2VyaWFsdWlkdGFnKQ0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAke2NvbnZlcnRlci5zZXJpYWx1aWR0YWd9OyANCi0jZW5kICANCi0NCi0gICAgcHVibGljICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJGNvbnZlcnRlci50YWdDbGFzcykoKQ0KLSAgICB7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotI3NldCAoJHByb3BlcnR5TGlzdCA9ICR7Y29udmVydGVyLnByb3BlcnR5VGFnTGlzdH0pDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotIA0KLSAgICBwcml2YXRlICR0eXBlICRmaWVsZDsNCi0gICAgDQotI3NldCAoJHZhciA9ICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgcHVibGljIHZvaWQgJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCAkcHJvcGVydHkuanNwTmFtZSkoJHR5cGUgJHZhcikNCi0gICAgew0KLSAgICAgICAgJGZpZWxkID0gJHZhcjsNCi0gICAgfQ0KLSNlbmQNCi0NCi0gICAgcHVibGljIHZvaWQgc2V0UGFnZUNvbnRleHQoUGFnZUNvbnRleHQgY29udGV4dCkgew0KLSAgICAgICAgc3VwZXIuc2V0UGFnZUNvbnRleHQoY29udGV4dCk7DQotICAgICAgICBzZXRDb252ZXJ0ZXJJZFN0cmluZygiJGNvbnZlcnRlci5jb252ZXJ0ZXJJZCIpOw0KLSAgICB9DQotDQotICAgIHByb3RlY3RlZCBDb252ZXJ0ZXIgY3JlYXRlQ29udmVydGVyKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiB7DQotICAgIA0KLSAgICAgICAgRUxDb250ZXh0IGVsQ29udGV4dCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRFTENvbnRleHQoKTsgICAgICAgICAgICANCi0gICAgICAgICRjb252ZXJ0ZXIuY2xhc3NOYW1lIGNvbnZlcnRlciA9ICgkY29udmVydGVyLmNsYXNzTmFtZSlzdXBlci5jcmVhdGVDb252ZXJ0ZXIoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0jc2V0ICgkY2xhc3NOYW1lID0gJHV0aWxzLmdldFByaW1pdGl2ZVR5cGUoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotICAgICAgICBpZiAoJGZpZWxkICE9IG51bGwpDQotICAgICAgICB7DQotICAgICAgICAgICAgaWYgKCR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKS4ke3Byb3BlcnR5LmNsYXNzTmFtZX1WYWx1ZSgpKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgU3RyaW5nICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpDQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlKSk7DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0obnVsbCk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiU3RyaW5nIikNCi0gICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpOw0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIk9iamVjdCIpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsNCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJMb2NhbGUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiQ2xhc3MiKQ0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgIG9yZy5hcGFjaGUubXlmYWNlcy5zaGFyZWRfdG9tYWhhd2sudXRpbC5DbGFzc1V0aWxzLmNsYXNzRm9yTmFtZSgke2ZpZWxkfS5nZXRFeHByZXNzaW9uU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKGUpOw0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiVGltZVpvbmUiKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgamF2YS51dGlsLlRpbWVab25lLmdldFRpbWVab25lKCR7ZmllbGR9LmdldEV4cHJlc3Npb25TdHJpbmcoKSkpOyAgICAgICAgICAgICAgICANCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICB7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSkNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSggKCgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfVZhbHVlICkuJHtwcm9wZXJ0eS5jbGFzc05hbWV9VmFsdWUoKSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJGNsYXNzTmFtZSkpDQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oICgke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpICk7DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiTG9jYWxlIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSA9PSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpLmdldFZpZXdSb290KCkuZ2V0TG9jYWxlKCk7ICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGlmKCEoJHtmaWVsZH1WYWx1ZSBpbnN0YW5jZW9mIGphdmEudXRpbC5Mb2NhbGUpKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAke2ZpZWxkfVZhbHVlID0gb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay51dGlsLkxvY2FsZVV0aWxzLmNvbnZlcnRlclRhZ0xvY2FsZUZyb21TdHJpbmcoJHtmaWVsZH0uZ2V0RXhwcmVzc2lvblN0cmluZygpKTsgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGNvbnZlcnRlci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oKGphdmEudXRpbC5Mb2NhbGUpJHtmaWVsZH1WYWx1ZSk7ICAgICAgICAgICAgICAgIA0KLSNlbHNlaWYgKCR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkgPT0gIlRpbWVab25lIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpOw0KLSAgICAgICAgICAgICAgICBpZigke2ZpZWxkfVZhbHVlIGluc3RhbmNlb2YgamF2YS51dGlsLlRpbWVab25lKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgIChqYXZhLnV0aWwuVGltZVpvbmUpICR7ZmllbGR9VmFsdWUpOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgIGVsc2UNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgY29udmVydGVyLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICBqYXZhLnV0aWwuVGltZVpvbmUuZ2V0VGltZVpvbmUoJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKSk7DQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpID09ICJTdHJpbmciKQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCAoU3RyaW5nKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICBjb252ZXJ0ZXIuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCgkcHJvcGVydHkuY2xhc3NOYW1lKSAke2ZpZWxkfS5nZXRWYWx1ZShlbENvbnRleHQpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLSNlbmQNCi0gICAgICAgIHJldHVybiBjb252ZXJ0ZXI7DQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQotI2VuZA0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnVmFsaWRhdG9yQ2xhc3MxMi52bSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnVmFsaWRhdG9yQ2xhc3MxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzAwYTNjNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ1ZhbGlkYXRvckNsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotI2xpdGVyYWwoKQ0KLS8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LA0KLS8vICAgICAgICAgIG9yIHlvdSB3aWxsIGxvc2UgeW91ciBjaGFuZ2VzLg0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHV0aWxzLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IudGFnQ2xhc3MpOw0KLQ0KLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsNCi1pbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KLWltcG9ydCBqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yOw0KLWltcG9ydCBqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbjsNCi1pbXBvcnQgamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uOw0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCR2YWxpZGF0b3IpDQotDQotcHVibGljIGNsYXNzICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHZhbGlkYXRvci50YWdDbGFzcykNCi0jaWYgKCR7dmFsaWRhdG9yLnRhZ1N1cGVyY2xhc3N9KQ0KLSAgICBleHRlbmRzICR7dmFsaWRhdG9yLnRhZ1N1cGVyY2xhc3N9DQotI2Vsc2UNCi0gICAgZXh0ZW5kcyBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy52YWxpZGF0b3IuVmFsaWRhdG9yQmFzZVRhZw0KLSNlbmQNCi17DQotI2lmICgkdmFsaWRhdG9yLnNlcmlhbHVpZHRhZykNCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gJHt2YWxpZGF0b3Iuc2VyaWFsdWlkdGFnfTsgDQotI2VuZCAgDQotDQotICAgIHB1YmxpYyAkdXRpbHMuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKCR2YWxpZGF0b3IudGFnQ2xhc3MpKCkNCi0gICAgeyAgICANCi0gICAgfSAgICANCi0jc2V0ICgkcHJvcGVydHlMaXN0ID0gJHt2YWxpZGF0b3IucHJvcGVydHlUYWdMaXN0fSkNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI3NldCAoJHR5cGUgPSAkdXRpbHMuZ2V0SnNwUHJvcGVydHlUeXBlMTIoJHByb3BlcnR5KSkNCi0gDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkOw0KLSAgICANCi0jc2V0ICgkdmFyID0gJHV0aWxzLmdldFZhcmlhYmxlRnJvbU5hbWUoJHByb3BlcnR5Lm5hbWUpKQ0KLSAgICBwdWJsaWMgdm9pZCAkdXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsICRwcm9wZXJ0eS5qc3BOYW1lKSgkdHlwZSAkdmFyKQ0KLSAgICB7DQotICAgICAgICAkZmllbGQgPSAkdmFyOw0KLSAgICB9DQotI2VuZA0KLQ0KLSAgICBwcm90ZWN0ZWQgVmFsaWRhdG9yIGNyZWF0ZVZhbGlkYXRvcigpIHRocm93cyBKc3BFeGNlcHRpb24gew0KLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvcklkID0gIiR2YWxpZGF0b3IudmFsaWRhdG9ySWQiOw0KLSAgICAgICAgQXBwbGljYXRpb24gYXBwbCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRBcHBsaWNhdGlvbigpOw0KLSAgICAgICAgVmFsaWRhdG9yIHZhbGlkYXRvciA9IChWYWxpZGF0b3IpYXBwbC5jcmVhdGVWYWxpZGF0b3IodmFsaWRhdG9ySWQpOw0KLSAgICAgICAgX3NldFByb3BlcnRpZXModmFsaWRhdG9yKTsNCi0gICAgICAgIHJldHVybiB2YWxpZGF0b3I7DQotICAgIH0NCi0gICAgDQotICAgIHByb3RlY3RlZCB2b2lkIF9zZXRQcm9wZXJ0aWVzKFZhbGlkYXRvciB2YWwpIHRocm93cyBKc3BFeGNlcHRpb24gew0KLSAgICAgICAgc3VwZXIuX3NldFByb3BlcnRpZXModmFsKTsgICAgDQotICAgICAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOw0KLQ0KLSAgICAgICAgJHZhbGlkYXRvci5jbGFzc05hbWUgdmFsaWRhdG9yID0gKCR2YWxpZGF0b3IuY2xhc3NOYW1lKSB2YWw7DQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHV0aWxzLmdldEpzcFByb3BlcnR5VHlwZTEyKCRwcm9wZXJ0eSkpDQotI3NldCAoJGNsYXNzTmFtZSA9ICR1dGlscy5nZXRQcmltaXRpdmVUeXBlKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSAgICAgICAgaWYgKCRmaWVsZCAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigkZmllbGQpLiR7cHJvcGVydHkuY2xhc3NOYW1lfVZhbHVlKCkpOw0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRjbGFzc05hbWUpKQ0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigkZmllbGQpKTsNCi0jZWxzZQ0KLSAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KCRmaWVsZCk7DQotI2VuZA0KLSNlbHNlICAgICAgICANCi0gICAgICAgICAgICBpZiAoISR7ZmllbGR9LmlzTGl0ZXJhbFRleHQoKSkNCi0gICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgIHZhbGlkYXRvci5zZXRWYWx1ZUV4cHJlc3Npb24oIiRwcm9wZXJ0eS5uYW1lIiwgJGZpZWxkKTsNCi0gICAgICAgICAgICB9DQotICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgIHsNCi0jaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRwcm9wZXJ0eS5jbGFzc05hbWUpKQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgJHtmaWVsZH1WYWx1ZSA9ICR7ZmllbGR9LmdldFZhbHVlKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCR7ZmllbGR9VmFsdWUgaW5zdGFuY2VvZiAke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KXsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0pJHtmaWVsZH1WYWx1ZSkuJHtwcm9wZXJ0eS5jbGFzc05hbWV9VmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICBlbHNlDQotICAgICAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSgNCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJHt1dGlscy5nZXRCb3hlZENsYXNzKCRjbGFzc05hbWUpfS52YWx1ZU9mKCR7ZmllbGR9VmFsdWUudG9TdHJpbmcoKSkuJHtwcm9wZXJ0eS5jbGFzc05hbWV9VmFsdWUoKSk7DQotICAgICAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgICAgICAgICAgfQ0KLSNlbHNlaWYgKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCRjbGFzc05hbWUpKQ0KLSAgICAgICAgICAgICAgICBPYmplY3QgJHtmaWVsZH1WYWx1ZSA9ICR7ZmllbGR9LmdldFZhbHVlKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSk7DQotICAgICAgICAgICAgICAgIGlmICgke2ZpZWxkfVZhbHVlICE9IG51bGwpew0KLSAgICAgICAgICAgICAgICAgICAgaWYgKCR7ZmllbGR9VmFsdWUgaW5zdGFuY2VvZiAke3V0aWxzLmdldEJveGVkQ2xhc3MoJGNsYXNzTmFtZSl9KXsNCi0gICAgICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKCR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0pJHtmaWVsZH1WYWx1ZSkpOyAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQ0KLSAgICAgICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICR7dXRpbHMuZ2V0Qm94ZWRDbGFzcygkY2xhc3NOYW1lKX0udmFsdWVPZigke2ZpZWxkfVZhbHVlLnRvU3RyaW5nKCkpKTsNCi0gICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgIA0KLSAgICAgICAgICAgICAgICB9DQotI2Vsc2VpZiAoJHV0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkcHJvcGVydHkuY2xhc3NOYW1lKSA9PSAiU3RyaW5nIikNCi0gICAgICAgICAgICAgICAgT2JqZWN0ICR7ZmllbGR9VmFsdWUgPSAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpOw0KLSAgICAgICAgICAgICAgICBpZiAoJHtmaWVsZH1WYWx1ZSAhPSBudWxsKQ0KLSAgICAgICAgICAgICAgICB7DQotICAgICAgICAgICAgICAgICAgICB2YWxpZGF0b3IuJHt1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwkcHJvcGVydHkubmFtZSl9KA0KLSAgICAgICAgICAgICAgICAgICAgICAgICgkcHJvcGVydHkuY2xhc3NOYW1lKSAgJHtmaWVsZH1WYWx1ZS50b1N0cmluZygpKTsgICAgICAgICAgICAgICAgDQotICAgICAgICAgICAgICAgIH0NCi0jZWxzZWlmICgkcHJvcGVydHkuY2xhc3NOYW1lID09ICJqYXZhLmxhbmcuU3RyaW5nW10iKQ0KLSAgICAgICAgICAgICAgICB0cnkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nW10gdmFsdWUgPSBvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy51dGlsLlRhZ1V0aWxzLmdldFN0cmluZ0FycmF5KCR7ZmllbGR9LmdldFZhbHVlKGZhY2VzQ29udGV4dC5nZXRFTENvbnRleHQoKSkpOw0KLSAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9yLiR7dXRpbHMuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsJHByb3BlcnR5Lm5hbWUpfSh2YWx1ZSk7DQotICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgY2F0Y2ggKGphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiBwZSkNCi0gICAgICAgICAgICAgICAgew0KLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBKc3BFeGNlcHRpb24oDQotICAgICAgICAgICAgICAgICAgICBwZS5nZXRNZXNzYWdlKCkgKyAiOiAiICsgIlBvc2l0aW9uICIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsNCi0gICAgICAgICAgICAgICAgfQ0KLSNlbHNlDQotICAgICAgICAgICAgICAgIHZhbGlkYXRvci4ke3V0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCRwcm9wZXJ0eS5uYW1lKX0oKCRwcm9wZXJ0eS5jbGFzc05hbWUpICAke2ZpZWxkfS5nZXRWYWx1ZShmYWNlc0NvbnRleHQuZ2V0RUxDb250ZXh0KCkpKTsNCi0jZW5kDQotICAgICAgICAgICAgfQ0KLSNlbmQNCi0gICAgICAgIH0NCi0jZW5kDQotICAgIH0NCi0NCi0gICAgcHVibGljIHZvaWQgcmVsZWFzZSgpDQotICAgIHsNCi0gICAgICAgIHN1cGVyLnJlbGVhc2UoKTsNCi0jZm9yZWFjaCggJHByb3BlcnR5IGluICRwcm9wZXJ0eUxpc3QgKQ0KLSNzZXQgKCRmaWVsZCA9ICRwcm9wZXJ0eS5maWVsZE5hbWUpDQotI2lmKCR1dGlscy5nZXRKc3BQcm9wZXJ0eVR5cGUxMigkcHJvcGVydHkpID09ICJib29sZWFuIikNCi0jc2V0ICgkZW1wdHkgPSAiZmFsc2UiKQ0KLSNlbHNlDQotI3NldCAoJGVtcHR5ID0gIm51bGwiKQ0KLSNlbmQNCi0gICAgICAgICRmaWVsZCA9ICRlbXB0eTsNCi0jZW5kDQotICAgIH0NCi19DQotI2VuZA0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMi52bSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3MxMi52bQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjYwNmZmMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTIudm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotI2xpdGVyYWwoKQ0KLSMjIFZlbG9jaXR5IHRlbXBsYXRlIHVzZWQgdG8gZ2VuZXJhdGUgSlNGMS4yLWNvbXBhdGlibGUgdmFsaWRhdG9yIGNsYXNzZXMNCi0jIyBmcm9tIHZhbGlkYXRvciBtZXRhLWRhdGEuDQotIyMNCi0jIyBOb3RlIHRoYXQgdGhlcmUgYXJlIG9ubHkgb25lIHR5cGUgb2YgdmFsaWRhdG9yIGdlbmVyYXRpb246DQotIyMgICogInN1YmNsYXNzIG1vZGUiICh1c2UgYW5ub3RhdGVkIGNsYXNzIGFzIGEgcGFyZW50IGNsYXNzKQ0KLSMjDQotIyMgVmFyaWFibGUgJHZhbGlkYXRvciByZWZlcnMgdG8gYSBWYWxpZGF0b3JNZXRhIG9iamVjdCB0byBwcm9jZXNzDQotIyMgVmFyaWFibGUgJHV0aWxzIHJlZmVycyB0byBhbiBpbnN0YW5jZSBvZiBNeWZhY2VzVXRpbHMuDQotIyMNCi0jIw0KLSMjIFRoZSBqYXZhIHBhY2thZ2Ugb2YgdGhlIGdlbmVyYXRlZCBjbGFzcyBpcyBhbHdheXMgdGhlIHNhbWUgYXMNCi0jIyB0aGUgcGFja2FnZSBpbiB3aGljaCB0aGUgYW5ub3RhdGVkIGNsYXNzIGV4aXN0cy4NCi0jIw0KLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2UgJHt2YWxpZGF0b3IucGFja2FnZU5hbWV9Ow0KLQ0KLWltcG9ydCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb247DQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Ow0KLSR1dGlscy5pbXBvcnRUYWdDbGFzc2VzKCR2YWxpZGF0b3IpDQotDQotI2lmICgkdmFsaWRhdG9yLmlzVGVtcGxhdGUoKSkNCi0jc2V0ICgkZ2VuZXJhdGVkQ2xhc3NQYXJlbnQgPSAkdmFsaWRhdG9yLnNvdXJjZUNsYXNzUGFyZW50Q2xhc3NOYW1lKQ0KLSNlbHNlDQotI3NldCAoJGdlbmVyYXRlZENsYXNzUGFyZW50ID0gJHZhbGlkYXRvci5zb3VyY2VDbGFzc05hbWUpDQotI2VuZA0KLS8vIEdlbmVyYXRlZCBmcm9tIGNsYXNzICR7dmFsaWRhdG9yLnNvdXJjZUNsYXNzTmFtZX0uDQotLy8NCi0vLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSwNCi0vLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy4NCi1wdWJsaWMgY2xhc3MgJHt1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHZhbGlkYXRvci5jbGFzc05hbWUpfSBleHRlbmRzICRnZW5lcmF0ZWRDbGFzc1BhcmVudA0KLSNpZiAoJHZhbGlkYXRvci5pbXBsZW1lbnRzKQ0KLSAgICBpbXBsZW1lbnRzICR2YWxpZGF0b3IuaW1wbGVtZW50cw0KLSNlbmQNCi17DQotDQotI2lmICgkdmFsaWRhdG9yLnZhbGlkYXRvcklkKQ0KLSAgICBzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBWQUxJREFUT1JfSUQgPSANCi0gICAgICAgICIkdmFsaWRhdG9yLnZhbGlkYXRvcklkIjsNCi0jZW5kDQotDQotICAgIHB1YmxpYyAke3V0aWxzLmdldENsYXNzRnJvbUZ1bGxDbGFzcygkdmFsaWRhdG9yLmNsYXNzTmFtZSl9KCkNCi0gICAgew0KLSAgICB9DQotICAgIA0KLSNzZXQgKCRwcm9wZXJ0eUxpc3QgPSAke3ZhbGlkYXRvci5wcm9wZXJ0eVZhbGlkYXRvckxpc3R9KQ0KLQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICR1dGlscy5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmKCR1dGlscy5nZXREZWZhdWx0VmFsdWVGaWVsZCgkcHJvcGVydHkpKSANCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gJHV0aWxzLmdldERlZmF1bHRWYWx1ZUZpZWxkKCRwcm9wZXJ0eSkpDQotI2Vsc2UNCi0jc2V0ICgkZGVmYXVsdFZhbHVlID0gZmFsc2UpDQotI2VuZA0KLSAgICAvLyBQcm9wZXJ0eTogJHByb3BlcnR5Lm5hbWUNCi0jaWYgKCRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkgfHwgJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkICNpZigkZGVmYXVsdFZhbHVlKSA9ICRkZWZhdWx0VmFsdWU7I3tlbHNlfTsje2VuZH0NCi0NCi0gICAgIA0KLSNlbHNlDQotICAgIHByaXZhdGUgJHR5cGUgJGZpZWxkOw0KLSAgICANCi0jZW5kDQotI2lmKCR1dGlscy5pc1ByaW1pdGl2ZUNsYXNzKCR0eXBlKSAmJiAhJHByb3BlcnR5LmlzVGFnRXhjbHVkZWQoKSApDQotICAgIHByaXZhdGUgYm9vbGVhbiAke2ZpZWxkfVNldDsNCi0gICAgDQotI2lmICgkcHJvcGVydHkuaXNTZXRNZXRob2QoKSkNCi0gICAgJHByb3BlcnR5LnNldE1ldGhvZFNjb3BlIGJvb2xlYW4gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsICRwcm9wZXJ0eS5uYW1lKSgpDQotICAgIHsNCi0gICAgICAgIHJldHVybiAke2ZpZWxkfVNldDsNCi0gICAgfQ0KLSNlbmQNCi0jZW5kDQotI2lmKCRwcm9wZXJ0eS5pc0xvY2FsTWV0aG9kKCkpDQotI2lmKCJib29sZWFuIiA9PSAkdHlwZSkNCi0jc2V0ICgkbWV0aG9kTmFtZSA9ICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgiaXNMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZWxzZQ0KLSNzZXQgKCRtZXRob2ROYW1lID0gJHV0aWxzLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXRMb2NhbCIsICRwcm9wZXJ0eS5uYW1lKSkNCi0jZW5kDQotICAgIGZpbmFsICRwcm9wZXJ0eS5sb2NhbE1ldGhvZFNjb3BlICR0eXBlICR7bWV0aG9kTmFtZX0oKQ0KLSAgICB7DQotICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSAgICB9DQotICAgICANCi0jZW5kDQotICAgIHB1YmxpYyAkdHlwZSAkdXRpbHMuZ2V0TWV0aG9kUmVhZGVyRnJvbVByb3BlcnR5KCRwcm9wZXJ0eS5uYW1lLCAkdHlwZSkoKQ0KLSAgICB7DQotI2lmICgkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpIHx8ICRwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpDQotICAgICAgICByZXR1cm4gJGZpZWxkOw0KLSNlbHNlDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICBpZiAoJHtmaWVsZH1TZXQpDQotI2Vsc2UNCi0gICAgICAgIGlmICgkZmllbGQgIT0gbnVsbCkNCi0jZW5kDQotICAgICAgICB7DQotICAgICAgICAgICAgcmV0dXJuICRmaWVsZDsNCi0gICAgICAgIH0NCi0gICAgICAgIFZhbHVlRXhwcmVzc2lvbiB2YiA9IGdldFZhbHVlRXhwcmVzc2lvbigiJHByb3BlcnR5Lm5hbWUiKTsNCi0gICAgICAgIGlmICh2YiAhPSBudWxsKQ0KLSAgICAgICAgew0KLSNpZiAoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpKQ0KLSAgICAgICAgICAgIHJldHVybiAoJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmIuZ2V0VmFsdWUoZ2V0RmFjZXNDb250ZXh0KCkuZ2V0RUxDb250ZXh0KCkpKS4ke3R5cGV9VmFsdWUoKTsNCi0jZWxzZQ0KLSNzZXQgKCRwcml0eXBlID0gJHV0aWxzLmdldFByaW1pdGl2ZVR5cGUoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkcHJpdHlwZSkpDQotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gdmIgPT0gbnVsbCA/IG51bGwgOiB2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSk7DQotICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiAkdHlwZSkpew0KLSAgICAgICAgICAgICAgICB2YWx1ZSA9ICR7dHlwZX0udmFsdWVPZih2YWx1ZS50b1N0cmluZygpKTsNCi0gICAgICAgICAgICB9ICAgICAgICAgICAgDQotICAgICAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlOw0KLSNlbHNlDQotICAgICAgICAgICAgcmV0dXJuICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpLmdldEVMQ29udGV4dCgpKTsNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgfQ0KLSNpZiAoJGRlZmF1bHRWYWx1ZSkNCi0gICAgICAgIHJldHVybiAkZGVmYXVsdFZhbHVlOyANCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICByZXR1cm4gJHV0aWxzLnByaW1pdGl2ZURlZmF1bHRWYWx1ZSgkdHlwZSk7DQotI2Vsc2UgICAgICAgDQotICAgICAgICByZXR1cm4gbnVsbDsNCi0jZW5kDQotI2VuZA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkICR1dGlscy5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgJHByb3BlcnR5Lm5hbWUpKCR0eXBlICR1dGlscy5nZXRWYXJpYWJsZUZyb21OYW1lKCRwcm9wZXJ0eS5uYW1lKSkNCi0gICAgew0KLSAgICAgICAgdGhpcy4kZmllbGQgPSAkdXRpbHMuZ2V0VmFyaWFibGVGcm9tTmFtZSgkcHJvcGVydHkubmFtZSk7DQotI2lmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSAgICAgICAgdGhpcy4ke2ZpZWxkfVNldCA9IHRydWU7ICAgICAgICANCi0jZW5kDQotICAgIH0NCi0jZW5kDQotDQotICAgIHB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpDQotICAgIHsNCi0jc2V0ICgkcHJpbWl0aXZlQ291bnQgPSAkcHJvcGVydHlMaXN0LnNpemUoKSArIDEpDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHByb3BlcnR5LmNsYXNzTmFtZSkpDQotI3NldCAoJHByaW1pdGl2ZUNvdW50ID0gJHByaW1pdGl2ZUNvdW50ICsgMSkNCi0jZW5kDQotI2VuZA0KLSAgICAgICAgT2JqZWN0W10gdmFsdWVzID0gbmV3IE9iamVjdFskcHJpbWl0aXZlQ291bnRdOw0KLSAgICAgICAgdmFsdWVzWzBdID0gc3VwZXIuc2F2ZVN0YXRlKGZhY2VzQ29udGV4dCk7DQotI3NldCAoJGFycmF5SW5kZXggPSAwKQ0KLSNmb3JlYWNoKCAkcHJvcGVydHkgaW4gJHByb3BlcnR5TGlzdCApDQotI3NldCAoJGZpZWxkID0gJHByb3BlcnR5LmZpZWxkTmFtZSkNCi0jc2V0ICgkdHlwZSA9ICRwcm9wZXJ0eS5jbGFzc05hbWUpDQotI3NldCAoJGFycmF5SW5kZXggPSAkYXJyYXlJbmRleCArIDEpDQotI2lmICgkcHJvcGVydHkuanNwTmFtZSA9PSAidmFsaWRhdG9yIiAmJiAkcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwke2ZpZWxkfUxpc3QpOw0KLSNlbHNlaWYgKCAkcHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpICkjIyB8fCAkdXRpbHMuaXNDb252ZXJ0ZXIoJHR5cGUpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCRmaWVsZCk7DQotI2Vsc2VpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gJHt1dGlscy5nZXRCb3hlZENsYXNzKCR0eXBlKX0udmFsdWVPZigkZmllbGQpOw0KLSNlbHNlDQotICAgICAgICB2YWx1ZXNbJGFycmF5SW5kZXhdID0gJGZpZWxkOw0KLSNlbmQNCi0jaWYoJHV0aWxzLmlzUHJpbWl0aXZlQ2xhc3MoJHR5cGUpICYmICEkcHJvcGVydHkuaXNUYWdFeGNsdWRlZCgpKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgdmFsdWVzWyRhcnJheUluZGV4XSA9IEJvb2xlYW4udmFsdWVPZigke2ZpZWxkfVNldCk7DQotI2VuZA0KLSNlbmQNCi0gICAgICAgIHJldHVybiB2YWx1ZXM7IA0KLSAgICB9DQotDQotICAgIHB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgc3RhdGUpDQotICAgIHsNCi0gICAgICAgIE9iamVjdFtdIHZhbHVlcyA9IChPYmplY3RbXSlzdGF0ZTsNCi0gICAgICAgIHN1cGVyLnJlc3RvcmVTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWzBdKTsNCi0jc2V0ICgkYXJyYXlJbmRleCA9IDApDQotI2ZvcmVhY2goICRwcm9wZXJ0eSBpbiAkcHJvcGVydHlMaXN0ICkNCi0jc2V0ICgkZmllbGQgPSAkcHJvcGVydHkuZmllbGROYW1lKQ0KLSNzZXQgKCR0eXBlID0gJHByb3BlcnR5LmNsYXNzTmFtZSkNCi0jc2V0ICgkYXJyYXlJbmRleCA9ICRhcnJheUluZGV4ICsgMSkNCi0jaWYgKCAkcHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpICkNCi0jaWYgKCRwcm9wZXJ0eS5qc3BOYW1lID09ICJ2YWxpZGF0b3IiICYmICRwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSApDQotICAgICAgICAke2ZpZWxkfUxpc3QgPSAoTGlzdDxWYWxpZGF0b3I+KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7DQotI2Vsc2VpZiAoJHV0aWxzLmlzTGlzdCgkdHlwZSkpDQotICAgICAgICAkZmllbGQgPSAoTGlzdCkgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LHZhbHVlc1skYXJyYXlJbmRleF0pOw0KLSNlbHNlDQotICAgICAgICAkZmllbGQgPSAkdXRpbHMuY2FzdElmTmVjZXNzYXJ5KCR0eXBlKSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsdmFsdWVzWyRhcnJheUluZGV4XSk7IA0KLSNlbmQNCi0jZWxzZWlmICgkdXRpbHMuaXNDb252ZXJ0ZXIoJHR5cGUpKSANCi0gICAgICAgICRmaWVsZCA9IChDb252ZXJ0ZXIpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCx2YWx1ZXNbJGFycmF5SW5kZXhdKTsNCi0jZWxzZWlmICgkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkpDQotICAgICAgICAkZmllbGQgPSAoJHV0aWxzLmNhc3RJZk5lY2Vzc2FyeSgkdHlwZSkgdmFsdWVzWyRhcnJheUluZGV4XSkuJHt0eXBlfVZhbHVlKCk7DQotI2Vsc2UNCi0gICAgICAgICRmaWVsZCA9ICR1dGlscy5jYXN0SWZOZWNlc3NhcnkoJHR5cGUpIHZhbHVlc1skYXJyYXlJbmRleF07DQotI2VuZA0KLSNpZigkdXRpbHMuaXNQcmltaXRpdmVDbGFzcygkdHlwZSkgJiYgISRwcm9wZXJ0eS5pc1RhZ0V4Y2x1ZGVkKCkgKQ0KLSNzZXQgKCRhcnJheUluZGV4ID0gJGFycmF5SW5kZXggKyAxKQ0KLSAgICAgICAgJHtmaWVsZH1TZXQgPSAoKEJvb2xlYW4pIHZhbHVlc1skYXJyYXlJbmRleF0pLmJvb2xlYW5WYWx1ZSgpOw0KLSNlbmQNCi0jZW5kDQotICAgIH0NCi19DQotI2VuZA0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvc2F5aGVsbG8vU2F5SGVsbG9SZW5kZXJlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JiZTQyYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L3NheWhlbGxvL1NheUhlbGxvUmVuZGVyZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NiArMCwwIEBACi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuc2F5aGVsbG87Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLWltcG9ydCBvcmcuYXBhY2hlLnNoYWxlLnRlc3QuYmFzZS5BYnN0cmFjdEpzZlRlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZW5kZXJLaXRGYWN0b3J5OwotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5tb2NrLk1vY2tSZXNwb25zZVdyaXRlcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLS8qKgotICogQ2xhc3MgdG8gdGVzdCB0aGUgYmVoYXZpb3VyIG9mIHRoZSBTYXlIZWxsbyByZW5kZXJlcgotICovCi1wdWJsaWMgY2xhc3MgU2F5SGVsbG9SZW5kZXJlclRlc3QgZXh0ZW5kcyBBYnN0cmFjdEpzZlRlc3RDYXNlCi17Ci0KLSAgICBwdWJsaWMgc3RhdGljIFRlc3Qgc3VpdGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBNb2NrUmVzcG9uc2VXcml0ZXIgd3JpdGVyIDsKLSAgICBwcml2YXRlIFNheUhlbGxvIHNheUhlbGxvOwotCi0gICAgcHVibGljIFNheUhlbGxvUmVuZGVyZXJUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIHNheUhlbGxvID0gbmV3IFNheUhlbGxvKCk7Ci0gICAgICAgIHNheUhlbGxvLnNldEZpcnN0TmFtZSgiSm9obiIpOwotICAgICAgICBzYXlIZWxsby5zZXRMYXN0TmFtZSgiU21pdGgiKTsKLQotICAgICAgICB3cml0ZXIgPSBuZXcgTW9ja1Jlc3BvbnNlV3JpdGVyKG5ldyBTdHJpbmdXcml0ZXIoKSwgbnVsbCwgbnVsbCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5zZXRSZXNwb25zZVdyaXRlcih3cml0ZXIpOwotICAgICAgICAvLyBUT0RPIHJlbW92ZSB0aGVzZSB0d28gbGluZXMgb25jZSBzaGFsZS10ZXN0IGdvZXMgYWxwaGEsIHNlZSBNWUZBQ0VTLTExNTUKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFZpZXdSb290KCkuc2V0UmVuZGVyS2l0SWQoTW9ja1JlbmRlcktpdEZhY3RvcnkuSFRNTF9CQVNJQ19SRU5ERVJfS0lUKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LmdldFJlbmRlcktpdCgpLmFkZFJlbmRlcmVyKAotICAgICAgICAgICAgICAgIHNheUhlbGxvLmdldEZhbWlseSgpLAotICAgICAgICAgICAgICAgIHNheUhlbGxvLmdldFJlbmRlcmVyVHlwZSgpLAotICAgICAgICAgICAgICAgIG5ldyBTYXlIZWxsb1JlbmRlcmVyKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc3VwZXIudGVhckRvd24oKTsKLSAgICAgICAgc2F5SGVsbG8gPSBudWxsOwotICAgICAgICB3cml0ZXIgPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVFbmQoKSAgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgc2F5SGVsbG8uZW5jb2RlRW5kKGZhY2VzQ29udGV4dCk7Ci0gICAgICAgIGZhY2VzQ29udGV4dC5yZW5kZXJSZXNwb25zZSgpOwotCi0gICAgICAgIFN0cmluZyBvdXRwdXQgPSB3cml0ZXIuZ2V0V3JpdGVyKCkudG9TdHJpbmcoKTsKLQotICAgICAgICBhc3NlcnRFcXVhbHMoIkhlbGxvIEpvaG4gU21pdGghIiwgb3V0cHV0KTsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSgiQnllIEpvaG4gU21pdGghIiwgb3V0cHV0KTsKLSAgICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0LmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29udmVydGVyL1Bob25lTnVtYmVyQ29udmVydGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU0MDIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb252ZXJ0ZXIvUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi1wYWNrYWdlIG9yZy5teW9yZ2FuaXphdGlvbi5jb252ZXJ0ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbXBvbmVudC5odG1sLkh0bWxJbnB1dFRleHQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5iYXNlLkFic3RyYWN0SnNmVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0IGV4dGVuZHMgQWJzdHJhY3RKc2ZUZXN0Q2FzZQotewotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXIgOwotICAgIHByaXZhdGUgUGhvbmVOdW1iZXJDb252ZXJ0ZXIgcGhvbmVOdW1Db252ZXJ0ZXI7Ci0KLSAgICBwdWJsaWMgUGhvbmVOdW1iZXJDb252ZXJ0ZXJUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIHBob25lTnVtQ29udmVydGVyID0gbmV3IFBob25lTnVtYmVyQ29udmVydGVyKCk7Ci0gICAgICAgIHdyaXRlciA9IG5ldyBNb2NrUmVzcG9uc2VXcml0ZXIobmV3IFN0cmluZ1dyaXRlcigpLCBudWxsLCBudWxsKTsKLSAgICAgICAgZmFjZXNDb250ZXh0LnNldFJlc3BvbnNlV3JpdGVyKHdyaXRlcik7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVhckRvd24oKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci50ZWFyRG93bigpOwotICAgICAgICBwaG9uZU51bUNvbnZlcnRlciA9IG51bGw7Ci0gICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE51bU9ubHkoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBPYmplY3Qgb2JqID0gcGhvbmVOdW1Db252ZXJ0ZXIuZ2V0QXNPYmplY3QoZmFjZXNDb250ZXh0LCBuZXcgSHRtbElucHV0VGV4dCgpLCAiNjM3MzgyNCIpOwotICAgICAgICBhc3NlcnROb3ROdWxsKG9iaik7Ci0gICAgICAgIFBob25lTnVtYmVyIHBob25lTnVtID0gKFBob25lTnVtYmVyKSBvYmo7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaG9uZU51bS5nZXROdW1iZXIoKSwgIjYzNzM4MjQiKTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIHZvaWQgdGVzdEFyZWFDb2RlTnVtKCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgT2JqZWN0IG9iaiA9IHBob25lTnVtQ29udmVydGVyLmdldEFzT2JqZWN0KGZhY2VzQ29udGV4dCwgbmV3IEh0bWxJbnB1dFRleHQoKSwgIjA5LTYzNzM4MjQiKTsKLSAgICAgICAgYXNzZXJ0Tm90TnVsbChvYmopOwotICAgICAgICBQaG9uZU51bWJlciBwaG9uZU51bSA9IChQaG9uZU51bWJlcikgb2JqOwotICAgICAgICBhc3NlcnRFcXVhbHMocGhvbmVOdW0uZ2V0QXJlYUNvZGUoKSwgIjA5Iik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhwaG9uZU51bS5nZXROdW1iZXIoKSwgIjYzNzM4MjQiKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2NvcmUvc3JjL3Rlc3QvamF2YS9vcmcvbXlvcmdhbml6YXRpb24vdmFsaWRhdG9yL09kZE51bWJlclZhbGlkYXRvclRlc3QuamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvT2RkTnVtYmVyVmFsaWRhdG9yVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTE5MmNlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvY29yZS9zcmMvdGVzdC9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi92YWxpZGF0b3IvT2RkTnVtYmVyVmFsaWRhdG9yVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotcGFja2FnZSBvcmcubXlvcmdhbml6YXRpb24udmFsaWRhdG9yOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci0KLWltcG9ydCBqYXZheC5mYWNlcy5jb21wb25lbnQuaHRtbC5IdG1sSW5wdXRUZXh0OwotaW1wb3J0IGphdmF4LmZhY2VzLnZhbGlkYXRvci5WYWxpZGF0b3JFeGNlcHRpb247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdDsKLQotaW1wb3J0IG9yZy5hcGFjaGUuc2hhbGUudGVzdC5iYXNlLkFic3RyYWN0SnNmVGVzdENhc2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5zaGFsZS50ZXN0Lm1vY2suTW9ja1Jlc3BvbnNlV3JpdGVyOwotCi1wdWJsaWMgY2xhc3MgT2RkTnVtYmVyVmFsaWRhdG9yVGVzdCBleHRlbmRzIEFic3RyYWN0SnNmVGVzdENhc2UKLXsKLQotICAgIHB1YmxpYyBzdGF0aWMgVGVzdCBzdWl0ZSgpCi0gICAgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE1vY2tSZXNwb25zZVdyaXRlciB3cml0ZXIgOwotICAgIHByaXZhdGUgT2RkTnVtYmVyVmFsaWRhdG9yIG9kZE51bVZhbGlkYXRvcjsKLQotICAgIHB1YmxpYyBPZGROdW1iZXJWYWxpZGF0b3JUZXN0KFN0cmluZyBuYW1lKQotICAgIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgICBzdXBlci5zZXRVcCgpOwotCi0gICAgICAgIG9kZE51bVZhbGlkYXRvciA9IG5ldyBPZGROdW1iZXJWYWxpZGF0b3IoKTsKLSAgICAgICAgd3JpdGVyID0gbmV3IE1vY2tSZXNwb25zZVdyaXRlcihuZXcgU3RyaW5nV3JpdGVyKCksIG51bGwsIG51bGwpOwotICAgICAgICBmYWNlc0NvbnRleHQuc2V0UmVzcG9uc2VXcml0ZXIod3JpdGVyKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZWFyRG93bigpIHRocm93cyBFeGNlcHRpb24KLSAgICB7Ci0gICAgICAgIHN1cGVyLnRlYXJEb3duKCk7Ci0gICAgICAgIG9kZE51bVZhbGlkYXRvciA9IG51bGw7Ci0gICAgICAgIHdyaXRlciA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdE9kZE51bUlucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBub0V4Y2VwdGlvbnNUaHJvd24gPSB0cnVlOwotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9kZE51bVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG5ldyBIdG1sSW5wdXRUZXh0KCksIG5ldyBJbnRlZ2VyKDMpKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2goVmFsaWRhdG9yRXhjZXB0aW9uIHZlKSAKLSAgICAgICAgewotICAgICAgICAgICAgbm9FeGNlcHRpb25zVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0VHJ1ZShub0V4Y2VwdGlvbnNUaHJvd24pOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgdm9pZCB0ZXN0RXZlbk51bUlucHV0KCkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgYm9vbGVhbiBub0V4Y2VwdGlvbnNUaHJvd24gPSB0cnVlOwotICAgICAgICB0cnkgCi0gICAgICAgIHsKLSAgICAgICAgICAgIG9kZE51bVZhbGlkYXRvci52YWxpZGF0ZShmYWNlc0NvbnRleHQsIG5ldyBIdG1sSW5wdXRUZXh0KCksIG5ldyBJbnRlZ2VyKDgpKTsKLSAgICAgICAgfSAKLSAgICAgICAgY2F0Y2goVmFsaWRhdG9yRXhjZXB0aW9uIHZlKSAKLSAgICAgICAgewotICAgICAgICAgICAgbm9FeGNlcHRpb25zVGhyb3duID0gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYXNzZXJ0RmFsc2Uobm9FeGNlcHRpb25zVGhyb3duKTsKLSAgICB9Ci0gICAgCi0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5ZGQ5ZjEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci0KLTwhLS0gVGhpcyBpcyB0aGUgcHJvamVjdCBkZXNjcmlwdG9yIGZvciB0aGUgZXhhbXBsZXMgb2YgbXkgY29tcG9uZW50cyAtLT4KLQotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgICA8YXJ0aWZhY3RJZD4ke2FydGlmYWN0SWR9LWV4YW1wbGVzPC9hcnRpZmFjdElkPgotICAgIDxwYWNrYWdpbmc+d2FyPC9wYWNrYWdpbmc+Ci0gICAgPG5hbWU+TXkgQ29tcG9uZW50cyBFeGFtcGxlczwvbmFtZT4KLQotICAgIDxwYXJlbnQ+Ci0gICAgICAgIDxncm91cElkPiR7Z3JvdXBJZH08L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPiR7YXJ0aWZhY3RJZH0tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L3BhcmVudD4KLQotICAgIDxwcm9wZXJ0aWVzPgotICAgICAgICA8anNmLW15ZmFjZXMudmVyc2lvbj4xLjIuNzwvanNmLW15ZmFjZXMudmVyc2lvbj4KLSAgICAgICAgPGpzZi1yaS52ZXJzaW9uPjEuMl8xMzwvanNmLXJpLnZlcnNpb24+ICAgICAgICAKLSAgICAgICAgPG1hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPjYuMS4xNjwvbWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+Ci0gICAgICAgIDxsb2c0ai52ZXJzaW9uPjEuMi4xMzwvbG9nNGoudmVyc2lvbj4KLSAgICA8L3Byb3BlcnRpZXM+Ci0gICAgCi0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICAgICA8Z3JvdXBJZD4ke2dyb3VwSWR9PC9ncm91cElkPgotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1jb3JlPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgPHZlcnNpb24+JHtwcm9qZWN0LnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sb2dnaW5nPC9ncm91cElkPgotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sb2dnaW5nPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgPHZlcnNpb24+MS4xLjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+Ci0gICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICA8dmVyc2lvbj4xLjI8L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgPC9kZXBlbmRlbmN5PiAgICAgICAgICAgCi0gICAgICAgICAgIAotICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPCEtLSBSZXBvc2l0b3J5IGZvciBqc3RsIDEuMiAtLT4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+amF2YS5uZXQ8L2lkPgotICAgICAgICAgICAgPHVybD5odHRwOi8vZG93bmxvYWQuamF2YS5uZXQvbWF2ZW4vMTwvdXJsPgotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PiAKLSAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgIDxwcm9maWxlcz4KLSAgICAgICAgPCEtLSBCeSBkZWZhdWx0IHRoZSB3YXIgZXhhbXBsZXMgdXNlIG15ZmFjZXMhIDopIC0tPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDxpZD5teWZhY2VzPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+IWpzZjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtYXBpPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2pzZi1teWZhY2VzLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtbXlmYWNlcy52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgPCEtLSBTYW5kYm94IGV4YW1wbGVzIG11c3Qgb25seSBoYXZlIHJ1bnRpbWUgZGVwZW5kZW5jeSB0byBteWZhY2VzLWltcGwKLSAgICAgICAgICAgICAgICAgc28gdGhhdCBpdCB3aWxsIGJlIGF1dG9tYXRpY2FsbHkgYWRkZWQgdG8gd2FyLiBCdXQgdGhlcmUgbXVzdCBub3QgYmUKLSAgICAgICAgICAgICAgICAgYW55IGNvbXBpbGUgZGVwZW5kZW5jeSBvbiBpbXBsIHNvIHRoYXQgaXMgaXMgYWx3YXlzIHBvc3NpYmxlIHRvIHVzZQotICAgICAgICAgICAgICAgICBvdGhlciBKU0YgaW1wbGVtZW50YXRpb25zLiAtLT4KLSAgICAgICAgICAgICAgICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPgotCi0gICAgICAgICAgICA8cHJvcGVydGllcz4KLSAgICAgICAgICAgICAgICA8anNmX2ltcGxlbWVudGF0aW9uPk15RmFjZXM8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotCi0gICAgICAgIDwhLS0gVG8gdXNlIHRoZSBleGFtcGxlcyB1c2luZyB0aGUgU3VuJ3MgSlNGIFJlZmVyZW5jZSBJbXBsZW1lbnRhdGlvbjogLURqc2Y9cmkgLS0+Ci0gICAgICAgIDxwcm9maWxlPgotICAgICAgICAgICAgPGlkPmpzZnJpPC9pZD4KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPgotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICAgICAgPG5hbWU+anNmPC9uYW1lPgotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPgotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2FjdGl2YXRpb24+Ci0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtqc2YtcmkudmVyc2lvbn08L3ZlcnNpb24+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5qYXZheC5mYWNlczwvZ3JvdXBJZD4KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLXJpLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgICAgICAgICAgIDxyZXBvc2l0b3JpZXM+Ci0gICAgICAgICAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDxpZD5qYXZhLm5ldDwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxuYW1lPmphdmEubmV0IE1hdmVuIDEgUmVwb3NpdG9yeTwvbmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPHVybD5odHRwczovL21hdmVuLXJlcG9zaXRvcnkuZGV2LmphdmEubmV0L25vbmF2L3JlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4KLSAgICAgICAgICAgICAgICA8L3JlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8L3JlcG9zaXRvcmllcz4KLQotICAgICAgICAgICAgPHByb3BlcnRpZXM+Ci0gICAgICAgICAgICAgICAgPGpzZl9pbXBsZW1lbnRhdGlvbj5KU0YtUkk8L2pzZl9pbXBsZW1lbnRhdGlvbj4KLSAgICAgICAgICAgIDwvcHJvcGVydGllcz4KLSAgICAgICAgPC9wcm9maWxlPgotICAgICAgICA8cHJvZmlsZT4KLSAgICAgICAgICAgIDwhLS0gRGVidWcgcHJvZmlsZSBmb3IgbXlmYWNlcyBhbmQgamV0dHkuCi0gICAgICAgICAgICAgICAgSXQgYWxsb3dzIHRvIHNlZSBkZWJ1ZyBtZXNzYWdlcyB1c2luZyAtUGpldHR5Q29uZmlnIC0tPgotICAgICAgICAgICAgPGlkPmpldHR5Q29uZmlnPC9pZD4KLSAgICAgICAgICAgIDxidWlsZD4KLSAgICAgICAgICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5PgotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICAgICAgICAgICAgICA8cmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICAgICAgICAgICAgPC9yZXNvdXJjZXM+Ci0gICAgICAgICAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8IS0tVGhpcyBwbHVnaW4gYWxsb3dzIHRvIHJ1biB0aGUgZXhhbXBsZSB1c2luZyBtdm4gamV0dHk6cnVuIC0tPgotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qZXR0eS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke21hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzY2FuSW50ZXJ2YWxTZWNvbmRzPjEwPC9zY2FuSW50ZXJ2YWxTZWNvbmRzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxzeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8bmFtZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c8L25hbWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8dmFsdWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuaW1wbC5Mb2c0SkxvZ2dlcjwvdmFsdWU+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9zeXN0ZW1Qcm9wZXJ0aWVzPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICAgICAgICA8L2J1aWxkPgotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+bG9nNGo8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgICAgICA8dmVyc2lvbj4ke2xvZzRqLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgICAgICA8dHlwZT5qYXI8L3R5cGU+Ci0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5PgotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgICAgIDwvcHJvZmlsZT4KLSAgICA8L3Byb2ZpbGVzPgotCi0gICAgPGJ1aWxkPgotICAgICAgICA8ZmluYWxOYW1lPiR7YXJ0aWZhY3RJZH08L2ZpbmFsTmFtZT4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+Ci0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgICA8cmVzb3VyY2VzPgotICAgICAgICAgICAgPHJlc291cmNlPgotICAgICAgICAgICAgICAgIDxkaXJlY3Rvcnk+c3JjL21haW4vcmVzb3VyY2VzPC9kaXJlY3Rvcnk+Ci0gICAgICAgICAgICAgICAgPGZpbHRlcmluZz50cnVlPC9maWx0ZXJpbmc+Ci0gICAgICAgICAgICA8L3Jlc291cmNlPgotICAgICAgICA8L3Jlc291cmNlcz4KLSAgICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YSBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vamF2YS9vcmcvbXlvcmdhbml6YXRpb24vY29tcG9uZW50L2V4YW1wbGUvU2F5SGVsbG9CZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzYzQ3NWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9qYXZhL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9TYXlIZWxsb0JlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLXBhY2thZ2Ugb3JnLm15b3JnYW5pemF0aW9uLmNvbXBvbmVudC5leGFtcGxlOwotCi1pbXBvcnQgamF2YXguZmFjZXMuZXZlbnQuQWN0aW9uRXZlbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nRmFjdG9yeTsKLWltcG9ydCBvcmcubXlvcmdhbml6YXRpb24uY29udmVydGVyLlBob25lTnVtYmVyOwotCi0vKioKLSAqIE1hbmFnZWQgYmVhbiBmb3IgdGhlIHNheUhlbGxvIHBhZ2UgZXhhbXBsZQotICovCi1wdWJsaWMgY2xhc3MgU2F5SGVsbG9CZWFuCi17Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2cgbG9nID0gTG9nRmFjdG9yeS5nZXRMb2coU2F5SGVsbG9CZWFuLmNsYXNzKTsKLQotICAgIHByaXZhdGUgU3RyaW5nIGZpcnN0TmFtZTsKLSAgICBwcml2YXRlIFN0cmluZyBsYXN0TmFtZTsKLSAgICBwcml2YXRlIGJvb2xlYW4gcmVuZGVyR3JlZXRpbmc7Ci0gICAgcHJpdmF0ZSBJbnRlZ2VyIG9kZE51bWJlcjsKLSAgICBwcml2YXRlIFBob25lTnVtYmVyIHBob25lTnVtYmVyOwotCi0gICAgcHVibGljIFNheUhlbGxvQmVhbigpCi0gICAgewotICAgICAgICB0aGlzLnJlbmRlckdyZWV0aW5nID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2F5SXQoQWN0aW9uRXZlbnQgZXZ0KQotICAgIHsKLSAgICAgICAgcmVuZGVyR3JlZXRpbmcgPSB0cnVlOwotCi0gICAgICAgIGlmIChsb2cuaXNJbmZvRW5hYmxlZCgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBsb2cuaW5mbygiVGhlIG5hbWUgdG8gc2F5IGhlbGxvIGlzICciK2ZpcnN0TmFtZSsiJyBhbmQgdGhlIGxhc3QgbmFtZSBpcyAnIitsYXN0TmFtZSsiJy4iKTsKLSAgICAgICAgfQotICAgIH0KLQotCi0gICAgcHVibGljIFN0cmluZyBnZXRGaXJzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGZpcnN0TmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGaXJzdE5hbWUoU3RyaW5nIGZpcnN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMuZmlyc3ROYW1lID0gZmlyc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TGFzdE5hbWUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIGxhc3ROYW1lOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldExhc3ROYW1lKFN0cmluZyBsYXN0TmFtZSkKLSAgICB7Ci0gICAgICAgIHRoaXMubGFzdE5hbWUgPSBsYXN0TmFtZTsKLSAgICB9Ci0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVuZGVyR3JlZXRpbmcoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHJlbmRlckdyZWV0aW5nOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlbmRlckdyZWV0aW5nKGJvb2xlYW4gcmVuZGVyR3JlZXRpbmcpCi0gICAgewotICAgICAgICB0aGlzLnJlbmRlckdyZWV0aW5nID0gcmVuZGVyR3JlZXRpbmc7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVnZXIgZ2V0T2RkTnVtYmVyKCkKLSAgICB7Ci0gICAgICAgIHJldHVybiBvZGROdW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2RkTnVtYmVyKEludGVnZXIgb2RkTnVtYmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5vZGROdW1iZXIgPSBvZGROdW1iZXI7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBTdHJpbmcgc3VibWl0T2RkTnVtYmVyKCkgewotICAgICAgICByZXR1cm4gImRpc3BsYXlfbnVtYmVyIjsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFN0cmluZyBzdWJtaXRQaG9uZU51bWJlcigpIHsKLSAgICAgICAgcmV0dXJuICJkaXNwbGF5X3Bob25lIjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUGhvbmVOdW1iZXIgZ2V0UGhvbmVOdW1iZXIoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIHBob25lTnVtYmVyOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFBob25lTnVtYmVyKFBob25lTnVtYmVyIHBob25lTnVtYmVyKQotICAgIHsKLSAgICAgICAgdGhpcy5waG9uZU51bWJlciA9IHBob25lTnVtYmVyOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzgzNTJlNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0jIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUgb3IgbW9yZQotIyBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSMgdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIyBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMAotIyAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotIyB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIwotIyAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi1sb2c0ai5yb290TG9nZ2VyPUlORk8sIEExLCBBMgotbG9nNGouYXBwZW5kZXIuQTE9b3JnLmFwYWNoZS5sb2c0ai5Db25zb2xlQXBwZW5kZXIKLWxvZzRqLmFwcGVuZGVyLkExLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLQotI2xvZyBvbiBhIGZpbGUgb24gdGFyZ2V0IHRvbywgdG8gbWFrZSBlYXNpZXIgY2hlY2sgaXQKLWxvZzRqLmFwcGVuZGVyLkEyPW9yZy5hcGFjaGUubG9nNGouUm9sbGluZ0ZpbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTIuRmlsZT10YXJnZXQvbG9nNGoubG9nCi1sb2c0ai5hcHBlbmRlci5BMi5NYXhGaWxlU2l6ZT0xMDAwS0IKLSMgS2VlcCBvbmUgYmFja3VwIGZpbGUKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEJhY2t1cEluZGV4PTEKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dD1vcmcuYXBhY2hlLmxvZzRqLlBhdHRlcm5MYXlvdXQKLWxvZzRqLmFwcGVuZGVyLkEyLmxheW91dC5Db252ZXJzaW9uUGF0dGVybj0lcCAldCAlYyAtICVtJW4KLQotIyBMb2cgbGV2ZWwgZm9yIG15ZmFjZXMgbGlicmFyaWVzCi1sb2c0ai5sb2dnZXIub3JnLmFwYWNoZS5jb21tb25zPUlORk8KLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLm15ZmFjZXM9VFJBQ0UKLWxvZzRqLmxvZ2dlci5qYXZheC5mYWNlcz1UUkFDRQotCi0jIFByaW50IHRoZSBkYXRlIGluIElTTyA4NjAxIGZvcm1hdAotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSU1cCBbJXRdICglRlw6JUwpIC0gJW0lbgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vcmVzb3VyY2VzL29yZy9teW9yZ2FuaXphdGlvbi9jb21wb25lbnQvZXhhbXBsZS9idWlsZC5wcm9wZXJ0aWVzIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5ZGVhZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL215b3JnYW5pemF0aW9uL2NvbXBvbmVudC9leGFtcGxlL2J1aWxkLnByb3BlcnRpZXMKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLSMgRG8gbm90IGVkaXQgdGhpcyBmaWxlLCBhcyBpdCB3aWxsIGJlIGNvbXBsZXRlZCBhdXRvbWF0aWNhbGx5Ci0jIGJ5IG1hdmVuIGR1cmluZyB0aGUgYnVpbGQgcHJvY2VzcwotbXljb21wb25lbnRzX3ZlcnNpb249JHtwb20udmVyc2lvbn0KLWpzZl9pbXBsZW1lbnRhdGlvbj0ke2pzZl9pbXBsZW1lbnRhdGlvbn0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2V4YW1wbGVzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlNWFkY2IuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci0KLTwhRE9DVFlQRSBmYWNlcy1jb25maWcgUFVCTElDCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4wLy9FTiIKLSAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1mYWNlc2NvbmZpZ18xXzAuZHRkIj4KLQotPCEtLSA9PT09PT09PT09PSBGVUxMIENPTkZJR1VSQVRJT04gRklMRSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09IC0tPgotCi08IS0tIG15IGNvbXBvbmVudHMgZXhhbXBsZXMgLS0+Ci0KLTxmYWNlcy1jb25maWc+Ci0KLQotICAgIDwhLS0gTWFuYWdlZCBCZWFucyBmb3Igc2F5aGVsbG8uanNwIC0tPgotICAgIDxtYW5hZ2VkLWJlYW4+Ci0gICAgICAgIDxtYW5hZ2VkLWJlYW4tbmFtZT5zYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1uYW1lPgotICAgICAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPm9yZy5teW9yZ2FuaXphdGlvbi5jb21wb25lbnQuZXhhbXBsZS5TYXlIZWxsb0JlYW48L21hbmFnZWQtYmVhbi1jbGFzcz4KLSAgICAgICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+Ci0gICAgPC9tYW5hZ2VkLWJlYW4+Ci0KLSAgICA8IS0tIE5BVklHQVRJT04gUlVMRVMgLS0+Ci0KLSAgICA8bmF2aWdhdGlvbi1ydWxlPgotICAgICAgICA8bmF2aWdhdGlvbi1jYXNlPgotICAgICAgICAgICAgPGZyb20tb3V0Y29tZT5nb19ob21lPC9mcm9tLW91dGNvbWU+Ci0gICAgICAgICAgICA8dG8tdmlldy1pZD4vaG9tZS5qc3A8L3RvLXZpZXctaWQ+Ci0gICAgICAgIDwvbmF2aWdhdGlvbi1jYXNlPgotICAgIDwvbmF2aWdhdGlvbi1ydWxlPgotCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vdmFsaWRhdG9yRGVtby5qc3A8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZGlzcGxheV9udW1iZXI8L2Zyb20tb3V0Y29tZT4KLSAgICAgICAgICAgIDx0by12aWV3LWlkPi92YWxpZGF0b3JEZW1vUmVzdWx0LmpzcDwvdG8tdmlldy1pZD4KLSAgICAgICAgPC9uYXZpZ2F0aW9uLWNhc2U+Ci0gICAgPC9uYXZpZ2F0aW9uLXJ1bGU+Ci0gICAgCi0gICAgPG5hdmlnYXRpb24tcnVsZT4KLSAgICAgICAgPGZyb20tdmlldy1pZD4vY29udmVydGVyRGVtby5qc3A8L2Zyb20tdmlldy1pZD4KLSAgICAgICAgPG5hdmlnYXRpb24tY2FzZT4KLSAgICAgICAgICAgIDxmcm9tLW91dGNvbWU+ZGlzcGxheV9waG9uZTwvZnJvbS1vdXRjb21lPgotICAgICAgICAgICAgPHRvLXZpZXctaWQ+L2NvbnZlcnRlckRlbW9SZXN1bHQuanNwPC90by12aWV3LWlkPgotICAgICAgICA8L25hdmlnYXRpb24tY2FzZT4KLSAgICA8L25hdmlnYXRpb24tcnVsZT4KLQotPC9mYWNlcy1jb25maWc+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkYTAzOGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi93ZWIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvajJlZS93ZWItYXBwXzJfNC54c2QiIHZlcnNpb249IjIuNCI+Ci0KLSAgPGRlc2NyaXB0aW9uPmRlYnVnIHdlYi54bWw8L2Rlc2NyaXB0aW9uPgotCi0gIDxjb250ZXh0LXBhcmFtPgotICAgIDxkZXNjcmlwdGlvbj5Db21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBVUklzIG9mIChhZGRpdGlvbmFsKSBmYWNlcyBjb25maWcgZmlsZXMuCi0gICAgICAgICAgICAoZS5nLiAvV0VCLUlORi9teS1jb25maWcueG1sKQotICAgICAgICAgICAgU2VlIEpTRiAxLjAgUFJEMiwgMTAuMy4yCi0gICAgICAgICAgICBBdHRlbnRpb246IFlvdSBkbyBub3QgbmVlZCB0byBwdXQgL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBpbiBoZXJlLgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPHBhcmFtLW5hbWU+amF2YXguZmFjZXMuQ09ORklHX0ZJTEVTPC9wYXJhbS1uYW1lPgotICAgIDxwYXJhbS12YWx1ZT4vV0VCLUlORi9leGFtcGxlcy1jb25maWcueG1sPC9wYXJhbS12YWx1ZT4KLSAgPC9jb250ZXh0LXBhcmFtPgotCi0gIDxjb250ZXh0LXBhcmFtPgotICAgIDxkZXNjcmlwdGlvbj5TdGF0ZSBzYXZpbmcgbWV0aG9kOiAiY2xpZW50IiBvciAic2VydmVyIiAoPSBkZWZhdWx0KQotICAgICAgICAgICAgU2VlIEpTRiBTcGVjaWZpY2F0aW9uIDIuNS4zPC9kZXNjcmlwdGlvbj4KLSAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPgotICAgIDxwYXJhbS12YWx1ZT5zZXJ2ZXI8L3BhcmFtLXZhbHVlPgotICA8L2NvbnRleHQtcGFyYW0+Ci0KLSAgPHNlcnZsZXQ+Ci0gICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPHNlcnZsZXQtY2xhc3M+amF2YXguZmFjZXMud2ViYXBwLkZhY2VzU2VydmxldDwvc2VydmxldC1jbGFzcz4KLSAgICA8bG9hZC1vbi1zdGFydHVwPjE8L2xvYWQtb24tc3RhcnR1cD4KLSAgPC9zZXJ2bGV0PgotCi0gIDxzZXJ2bGV0LW1hcHBpbmc+Ci0gICAgPHNlcnZsZXQtbmFtZT5GYWNlcyBTZXJ2bGV0PC9zZXJ2bGV0LW5hbWU+Ci0gICAgPHVybC1wYXR0ZXJuPiouanNmPC91cmwtcGF0dGVybj4KLSAgPC9zZXJ2bGV0LW1hcHBpbmc+Ci0KLSAgPHdlbGNvbWUtZmlsZS1saXN0PgotICAgIDx3ZWxjb21lLWZpbGU+aW5kZXguanNwPC93ZWxjb21lLWZpbGU+Ci0gIDwvd2VsY29tZS1maWxlLWxpc3Q+Ci0KLTwvd2ViLWFwcD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW8uanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiYTU1OTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtby5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50cyBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJDdXN0b20gQ29udmVydGVyIERlbW8iLz4KLSAgICA8Zjp2ZXJiYXRpbT48aHI+PC9mOnZlcmJhdGltPgotCi0gICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJudW0iIHZhbHVlPSJFbnRlciB5b3VyIHBob25lIG51bWJlciAoQXJlYSBDb2RlIC0gTnVtYmVyKSIgLz4KLSAgICAgICAgICAgIDxoOmlucHV0VGV4dCBpZD0ibnVtIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4ucGhvbmVOdW1iZXJ9Ij4KLSAgICAgICAgICAgICAgICA8bXljb21wOnBob25lTnVtYmVyQ29udmVydGVyLz4KLSAgICAgICAgICAgIDwvaDppbnB1dFRleHQ+Ci0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJTdWJtaXQiIGFjdGlvbj0iI3tzYXlIZWxsb0JlYW4uc3VibWl0UGhvbmVOdW1iZXJ9Ii8+Ci0gICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0gICAgICAgIDxoOmNvbW1hbmRMaW5rIHZhbHVlPSJbSE9NRV0iIGFjdGlvbj0iZ29faG9tZSIvPgotICAgICAgICA8aDptZXNzYWdlcyAvPgotICAgIDwvaDpmb3JtPgotPC9mOnZpZXc+Ci0KLTwvYm9keT4KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL2NvbnZlcnRlckRlbW9SZXN1bHQuanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtb1Jlc3VsdC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MmQ5MTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvY29udmVydGVyRGVtb1Jlc3VsdC5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08Zjp2aWV3PgotICAgIDxoOmZvcm0+Ci0gICAgICAgIDxoOnBhbmVsR3JpZCBjb2x1bW5zPSIyIj4KLSAgICAgICAgICAgIDxoOm91dHB1dExhYmVsIGZvcj0iYXJlYUNvZGUiIHZhbHVlPSJZb3VyIGFyZWEgY29kZSBpczoiLz4gCi0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IGlkPSJhcmVhQ29kZSIgdmFsdWU9IiN7c2F5SGVsbG9CZWFuLnBob25lTnVtYmVyLmFyZWFDb2RlfSIvPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJudW0iIHZhbHVlPSJZb3VyIG51bWJlciBpczoiLz4gCi0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IGlkPSJudW0iIHZhbHVlPSIje3NheUhlbGxvQmVhbi5waG9uZU51bWJlci5udW1iZXJ9Ii8+Ci0gICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iW0hPTUVdIiBhY3Rpb249ImdvX2hvbWUiLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICA8L2g6Zm9ybT4KLTwvZjp2aWV3PgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaG9tZS5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLmpzcApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWM2Yzk5MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9ob21lLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLQotPGhlYWQ+Ci0gICAgPHRpdGxlPk15IEpTRiBDb21wb25lbnRzIEV4YW1wbGVzPC90aXRsZT4KLTwvaGVhZD4KLQotPGJvZHk+Ci0KLTxmOnZpZXc+Ci0gICAgPGg6Zm9ybT4KLQotICAgICAgICA8Zjpsb2FkQnVuZGxlIGJhc2VuYW1lPSJvcmcubXlvcmdhbml6YXRpb24uY29tcG9uZW50LmV4YW1wbGUuYnVpbGQiIHZhcj0iYnVpbGRJbmZvIi8+Ci0KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0VGV4dCBzdHlsZT0iZm9udC13ZWlnaHQ6IGJvbGQiIHZhbHVlPSJNeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5Ii8+Ci0gICAgICAgICAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSIgKFZlcnNpb24gI3tidWlsZEluZm9bJ215Y29tcG9uZW50c192ZXJzaW9uJ119LCB1c2luZyAje2J1aWxkSW5mbyBbJ2pzZl9pbXBsZW1lbnRhdGlvbiddfSkiLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgICAgICA8aDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgICAgIDxoOm91dHB1dFRleHQgdmFsdWU9Ik15IGNvbXBvbmVudCBleGFtcGxlcyIgLz4KLSAgICAgICAgICAgIDxoOnBhbmVsR3JpZCBzdHlsZT0icGFkZGluZy1sZWZ0OjI1cHgiPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExpbmsgdmFsdWU9InNheWhlbGxvLmpzZiI+Ci0gICAgICAgICAgICAgICAgICAgIDxmOnZlcmJhdGltPnNheUhlbGxvIC0gZGVtbyBjb21wb25lbnQ8L2Y6dmVyYmF0aW0+Ci0gICAgICAgICAgICAgICAgPC9oOm91dHB1dExpbms+Ci0gICAgICAgICAgICAgICAgPGg6b3V0cHV0TGluayB2YWx1ZT0idmFsaWRhdG9yRGVtby5qc2YiPgotICAgICAgICAgICAgICAgICAgICA8Zjp2ZXJiYXRpbT5zYXlIZWxsbyAtIGRlbW8gdmFsaWRhdG9yPC9mOnZlcmJhdGltPgotICAgICAgICAgICAgICAgIDwvaDpvdXRwdXRMaW5rPgotICAgICAgICAgICAgICAgIDxoOm91dHB1dExpbmsgdmFsdWU9ImNvbnZlcnRlckRlbW8uanNmIj4KLSAgICAgICAgICAgICAgICAgICAgPGY6dmVyYmF0aW0+c2F5SGVsbG8gLSBkZW1vIGNvbnZlcnRlcjwvZjp2ZXJiYXRpbT4KLSAgICAgICAgICAgICAgICA8L2g6b3V0cHV0TGluaz4KLSAgICAgICAgICAgIDwvaDpwYW5lbEdyaWQ+Ci0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgIDwvaDpmb3JtPgotPC9mOnZpZXc+Ci08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC9pbmRleC5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0YTliNDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNwCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotPGpzcDpmb3J3YXJkIHBhZ2U9ImhvbWUuanNmIi8+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvc2F5aGVsbG8uanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTY3ZDcxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3NheWhlbGxvLmpzcAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLTwlQCBwYWdlIHNlc3Npb249ImZhbHNlIiBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIiBwcmVmaXg9ImYiJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08aHRtbD4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50czwvdGl0bGU+Ci08L2hlYWQ+Ci0KLTxib2R5PgotCi08Zjp2aWV3PgotCi0gICAgPG15Y29tcDpzYXlIZWxsbyBmaXJzdE5hbWU9IkpvaG4iIGxhc3ROYW1lPSJTbWl0aCIvPgotCi0gICAgPGg6b3V0cHV0VGV4dCB2YWx1ZT0iIChwcm9iYWJseSBub3QgeW91LCBJIGtub3cpIi8+Ci0KLSAgICA8Zjp2ZXJiYXRpbT48aHI+PC9mOnZlcmJhdGltPgotCi0gICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJpbnB1dEZpcnN0TmFtZSIgdmFsdWU9IkZpcnN0IG5hbWUiIC8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImlucHV0Rmlyc3ROYW1lIiB2YWx1ZT0iI3tzYXlIZWxsb0JlYW4uZmlyc3ROYW1lfSIvPgotCi0gICAgICAgICAgICA8aDpvdXRwdXRMYWJlbCBmb3I9ImlucHV0TGFzdE5hbWUiIHZhbHVlPSJMYXN0IG5hbWUiIC8+Ci0gICAgICAgICAgICA8aDppbnB1dFRleHQgaWQ9ImlucHV0TGFzdE5hbWUiIHZhbHVlPSIje3NheUhlbGxvQmVhbi5sYXN0TmFtZX0iLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMSI+Ci0KLSAgICAgICAgICAgIDxoOmNvbW1hbmRCdXR0b24gdmFsdWU9IlNheSBIZWxsbyEiIGFjdGlvbkxpc3RlbmVyPSIje3NheUhlbGxvQmVhbi5zYXlJdH0iLz4KLQotICAgICAgICAgICAgPG15Y29tcDpzYXlIZWxsbyBmaXJzdE5hbWU9IiN7c2F5SGVsbG9CZWFuLmZpcnN0TmFtZX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3ROYW1lPSIje3NheUhlbGxvQmVhbi5sYXN0TmFtZX0iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbmRlcmVkPSIje3NheUhlbGxvQmVhbi5yZW5kZXJHcmVldGluZ30iLz4KLQotICAgICAgICAgICAgPGg6Y29tbWFuZExpbmsgdmFsdWU9IltIT01FXSIgYWN0aW9uPSJnb19ob21lIi8+Ci0KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLQotICAgIDwvaDpmb3JtPgotCi08L2Y6dmlldz4KLQotCi08L2JvZHk+Ci0KLTwvaHRtbD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW8uanNwIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvdmFsaWRhdG9yRGVtby5qc3AKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRlZWQ0ZDcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9leGFtcGxlcy9zcmMvbWFpbi93ZWJhcHAvdmFsaWRhdG9yRGVtby5qc3AKKysrIC9kZXYvbnVsbApAQCAtMSwzMSArMCwwIEBACi08JUAgdGFnbGliIHVyaT0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIgcHJlZml4PSJmIiAlPgotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2h0bWwiIHByZWZpeD0iaCIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vd3d3Lm15b3JnYW5pdHphdGlvbi5vcmcvbXljb21wb25lbnRzIiBwcmVmaXg9Im15Y29tcCIlPgotCi08IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIgotICAgICJodHRwOi8vd3d3LnczLm9yZy9UUi94aHRtbDEvRFREL3hodG1sMS1zdHJpY3QuZHRkIj4KLTxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIj4KLTxoZWFkPgotICAgIDx0aXRsZT5NeSBKU0YgQ29tcG9uZW50cyBFeGFtcGxlczwvdGl0bGU+Ci08L2hlYWQ+Ci08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpvdXRwdXRUZXh0IHZhbHVlPSJDdXN0b20gVmFsaWRhdG9yIERlbW8iLz4KLSAgICA8Zjp2ZXJiYXRpbT48aHI+PC9mOnZlcmJhdGltPgotCi0gICAgPGg6Zm9ybT4KLSAgICAgICAgPGg6cGFuZWxHcmlkIGNvbHVtbnM9IjIiPgotICAgICAgICAgICAgPGg6b3V0cHV0TGFiZWwgZm9yPSJudW0iIHZhbHVlPSJFbnRlciBhbiBvZGQgbnVtYmVyIiAvPgotICAgICAgICAgICAgPGg6aW5wdXRUZXh0IGlkPSJudW0iIHZhbHVlPSIje3NheUhlbGxvQmVhbi5vZGROdW1iZXJ9Ij4KLSAgICAgICAgICAgICAgICA8bXljb21wOnZhbGlkYXRlT2RkTnVtLz4KLSAgICAgICAgICAgIDwvaDppbnB1dFRleHQ+Ci0gICAgICAgICAgICA8aDpjb21tYW5kQnV0dG9uIHZhbHVlPSJTdWJtaXQiIGFjdGlvbj0iI3tzYXlIZWxsb0JlYW4uc3VibWl0T2RkTnVtYmVyfSIvPgotICAgICAgICA8L2g6cGFuZWxHcmlkPgotICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iW0hPTUVdIiBhY3Rpb249ImdvX2hvbWUiLz4KLSAgICAgICAgPGg6bWVzc2FnZXMgLz4KLSAgICA8L2g6Zm9ybT4KLTwvZjp2aWV3PgotCi08L2JvZHk+Ci08L2h0bWw+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS1qc2Zjb21wb25lbnRzL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL2V4YW1wbGVzL3NyYy9tYWluL3dlYmFwcC92YWxpZGF0b3JEZW1vUmVzdWx0LmpzcCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQuanNwCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjZkNWJlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvZXhhbXBsZXMvc3JjL21haW4vd2ViYXBwL3ZhbGlkYXRvckRlbW9SZXN1bHQuanNwCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotPCVAIHRhZ2xpYiB1cmk9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiIHByZWZpeD0iZiIgJT4KLTwlQCB0YWdsaWIgdXJpPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9odG1sIiBwcmVmaXg9ImgiICU+Ci08JUAgdGFnbGliIHVyaT0iaHR0cDovL3d3dy5teW9yZ2FuaXR6YXRpb24ub3JnL215Y29tcG9uZW50cyIgcHJlZml4PSJteWNvbXAiJT4KLQotPGh0bWw+Ci08aGVhZD4KLSAgICA8dGl0bGU+TXkgSlNGIENvbXBvbmVudHM8L3RpdGxlPgotPC9oZWFkPgotCi08Ym9keT4KLQotPGY6dmlldz4KLSAgICA8aDpmb3JtPgotICAgICAgICA8aDpwYW5lbEdyaWQgY29sdW1ucz0iMiI+Ci0gICAgICAgICAgICBWYWx1ZSBlbnRlcmVkIGlzOiA8aDpvdXRwdXRUZXh0IHZhbHVlPSIje3NheUhlbGxvQmVhbi5vZGROdW1iZXJ9Ii8+Ci0gICAgICAgICAgICA8aDpjb21tYW5kTGluayB2YWx1ZT0iW0hPTUVdIiBhY3Rpb249ImdvX2hvbWUiLz4KLSAgICAgICAgPC9oOnBhbmVsR3JpZD4KLSAgICA8L2g6Zm9ybT4KLTwvZjp2aWV3PgotCi0KLTwvYm9keT4KLQotPC9odG1sPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50cy9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2UxOWMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLWpzZmNvbXBvbmVudHMvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gICAgICAgICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfS1wcm9qZWN0PC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8bmFtZT5NeSBKU0YgQ29tcG9uZW50cyBMaWJyYXJ5IFByb2plY3Q8L25hbWU+Ci0gIDx2ZXJzaW9uPiR7dmVyc2lvbn08L3ZlcnNpb24+Ci0KLSAgPGRlc2NyaXB0aW9uPgotICAgICAgVGhpcyBpcyB0aGUgcHJvamVjdCBmb3IgbXkgZnVua3kgY29tcG9uZW50cy4gVGhpcyB3aWxsIGJ1aWxkIGJvdGggdGhlIGNvcmUgYW5kIHRoZSBleGFtcGxlcwotICA8L2Rlc2NyaXB0aW9uPgotCi0gICAgPG1vZHVsZXM+Ci0gICAgICAgIDxtb2R1bGU+Y29yZTwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlPmV4YW1wbGVzPC9tb2R1bGU+Ci0gICAgPC9tb2R1bGVzPgotCi0gICAgPHJlcG9zaXRvcmllcz4KLSAgICAgICAgPHJlcG9zaXRvcnk+Ci0gICAgICAgICAgICA8aWQ+TXlmYWNlcyByZXBvc2l0b3J5PC9pZD4KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL215ZmFjZXMuem9uZXMuYXBhY2hlLm9yZy9kaXN0L21hdmVuLXJlcG9zaXRvcnk8L3VybD4KLSAgICAgICAgPC9yZXBvc2l0b3J5PgotICAgIDwvcmVwb3NpdG9yaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9MSUNFTlNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWI1MjQ4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQ0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCi0NCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMNCi0NCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuDQotDQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcNCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iDQotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUNCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQ0KLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQ0KLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUNCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXINCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuDQotDQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdDQotDQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLg0KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvTk9USUNFLnR4dCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFiMmMyYjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09DQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyAgICAgICAgICAgICAgICAgICA9PQ0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0NCi0NCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IA0KLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuDQotDQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoNCi0NCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4NCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgDQotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50Ig0KLQ0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIA0KLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OGFmNTIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCSAgIAotLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCi0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFyY2hldHlwZS1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5NeUZhY2VzIFRyaW5pZGFkIEFyY2hldHlwZTwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkFyY2hldHlwZSB0byBjcmVhdGUgYSBuZXcgd2ViYXBwIGJhc2VkIG9uIFRyaW5pZGFkPC9kZXNjcmlwdGlvbj4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9MSUNFTlNFIGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjJjMmI1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQ0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgICAgICAgICAgICAgICAgICAgPT0NCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSANCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6DQotDQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uDQotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIA0KLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCINCi0NCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyANCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvYXJjaGV0eXBlLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTk2ZjU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9hcmNoZXR5cGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi0NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi0NCi08YXJjaGV0eXBlPg0KLSAgPGlkPm15ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkPC9pZD4NCi0gIDxzb3VyY2VzPg0KLSAgICA8c291cmNlPnNyYy9tYWluL2phdmEvSGVsbG9Xb3JsZEJhY2tpbmcuamF2YTwvc291cmNlPg0KLSAgPC9zb3VyY2VzPg0KLSAgPHJlc291cmNlcz4NCi0gICAgPHJlc291cmNlPnNyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXM8L3Jlc291cmNlPg0KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL2luZGV4LmpzcHg8L3Jlc291cmNlPg0KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcHg8L3Jlc291cmNlPg0KLSAgICA8cmVzb3VyY2U+c3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbDwvcmVzb3VyY2U+DQotICAgIDxyZXNvdXJjZT5zcmMvbWFpbi93ZWJhcHAvV0VCLUlORi9mYWNlcy1jb25maWcueG1sPC9yZXNvdXJjZT4NCi0gIDwvcmVzb3VyY2VzPg0KLTwvYXJjaGV0eXBlPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGU2ZDc5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxOTUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+DQotICAgIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4NCi0gICAgPGdyb3VwSWQ+JHtncm91cElkfTwvZ3JvdXBJZD4NCi0gICAgPGFydGlmYWN0SWQ+JHthcnRpZmFjdElkfTwvYXJ0aWZhY3RJZD4NCi0gICAgPHBhY2thZ2luZz53YXI8L3BhY2thZ2luZz4NCi0gICAgPHZlcnNpb24+JHt2ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgPG5hbWU+QSBjdXN0b20gcHJvamVjdCB1c2luZyBteWZhY2VzPC9uYW1lPg0KLSAgICA8dXJsPmh0dHA6Ly93d3cubXlvcmdhbml6YXRpb24ub3JnPC91cmw+DQotDQotICAgIDxwcm9wZXJ0aWVzPg0KLSAgICAgICAgPGpzZi1teWZhY2VzLnZlcnNpb24+MS4yLjc8L2pzZi1teWZhY2VzLnZlcnNpb24+DQotICAgICAgICA8anNmLXJpLnZlcnNpb24+MS4yXzEzPC9qc2YtcmkudmVyc2lvbj4NCi0gICAgICAgIDx0cmluaWRhZC52ZXJzaW9uPjEuMi4xMTwvdHJpbmlkYWQudmVyc2lvbj4gICAgICAgIA0KLSAgICAgICAgPG1hdmVuLmpldHR5LnBsdWdpbi52ZXJzaW9uPjYuMS4xNjwvbWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb24+DQotICAgICAgICA8bG9nNGoudmVyc2lvbj4xLjIuMTM8L2xvZzRqLnZlcnNpb24+DQotICAgIDwvcHJvcGVydGllcz4NCi0gICAgDQotICAgIDxidWlsZD4NCi0gICAgICAgIDxmaW5hbE5hbWU+JHthcnRpZmFjdElkfTwvZmluYWxOYW1lPg0KLSAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICAgPCEtLVRoaXMgcGx1Z2luIGFsbG93cyB0byBydW4gdGhlIGV4YW1wbGUgdXNpbmcgbXZuIGpldHR5OnJ1biAtLT4NCi0gICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWpldHR5LXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgPHZlcnNpb24+JHttYXZlbi5qZXR0eS5wbHVnaW4udmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgPHNjYW5JbnRlcnZhbFNlY29uZHM+MTA8L3NjYW5JbnRlcnZhbFNlY29uZHM+DQotICAgICAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4NCi0gICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgIDwvcGx1Z2lucz4gICAgDQotICAgIDwvYnVpbGQ+DQotICAgIA0KLSAgICA8cHJvZmlsZXM+DQotICAgICAgICA8cHJvZmlsZT4NCi0gICAgICAgICAgICA8aWQ+bXlmYWNlczwvaWQ+DQotICAgICAgICAgICAgPGFjdGl2YXRpb24+DQotICAgICAgICAgICAgICAgIDxwcm9wZXJ0eT4NCi0gICAgICAgICAgICAgICAgICAgIDxuYW1lPiFqc2Y8L25hbWU+DQotICAgICAgICAgICAgICAgIDwvcHJvcGVydHk+DQotICAgICAgICAgICAgPC9hY3RpdmF0aW9uPg0KLSAgICAgICAgICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmNvcmU8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuY29yZTwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLW15ZmFjZXMudmVyc2lvbn08L3ZlcnNpb24+DQotICAgICAgICAgICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICAgICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8L2RlcGVuZGVuY2llcz4NCi0gICAgICAgIDwvcHJvZmlsZT4NCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDwhLS0gQWN0aXZlIGFkZGluZyAtRGpzZj1yaSB3aGVuIGV4ZWN1dGUgbWF2ZW4gZ29hbHMuIC0tPg0KLSAgICAgICAgICAgIDxpZD5qc2Ytcmk8L2lkPg0KLSAgICAgICAgICAgIDxhY3RpdmF0aW9uPg0KLSAgICAgICAgICAgICAgICA8cHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICA8bmFtZT5qc2Y8L25hbWU+DQotICAgICAgICAgICAgICAgICAgICA8dmFsdWU+cmk8L3ZhbHVlPg0KLSAgICAgICAgICAgICAgICA8L3Byb3BlcnR5Pg0KLSAgICAgICAgICAgIDwvYWN0aXZhdGlvbj4NCi0gICAgICAgICAgICA8ZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICAgICAgICAgIDxncm91cElkPmphdmF4LmZhY2VzPC9ncm91cElkPg0KLSAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+anNmLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLXJpLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+amF2YXguZmFjZXM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICA8YXJ0aWZhY3RJZD5qc2YtaW1wbDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7anNmLXJpLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICAgICAgPC9kZXBlbmRlbmNpZXM+DQotICAgICAgICA8L3Byb2ZpbGU+DQotICAgICAgICANCi0gICAgICAgIDxwcm9maWxlPg0KLSAgICAgICAgICAgIDwhLS0gRGVidWcgcHJvZmlsZSBmb3IgbXlmYWNlcyBhbmQgamV0dHkuDQotICAgICAgICAgICAgICAgIEl0IGFsbG93cyB0byBzZWUgZGVidWcgbWVzc2FnZXMgdXNpbmcgLVBqZXR0eUNvbmZpZyAtLT4NCi0gICAgICAgICAgICA8aWQ+amV0dHlDb25maWc8L2lkPg0KLSAgICAgICAgICAgIDxidWlsZD4NCi0gICAgICAgICAgICAgICAgPHJlc291cmNlcz4NCi0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL3Jlc291cmNlczwvZGlyZWN0b3J5Pg0KLSAgICAgICAgICAgICAgICAgICAgPC9yZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgIDxyZXNvdXJjZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8ZGlyZWN0b3J5PnNyYy9tYWluL2xvZzRqPC9kaXJlY3Rvcnk+DQotICAgICAgICAgICAgICAgICAgICA8L3Jlc291cmNlPg0KLSAgICAgICAgICAgICAgICA8L3Jlc291cmNlcz4NCi0gICAgICAgICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgICAgICAgICA8cGx1Z2luPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDwhLS1UaGlzIHBsdWdpbiBhbGxvd3MgdG8gcnVuIHRoZSBleGFtcGxlIHVzaW5nIG12biBqZXR0eTpydW4gLS0+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLm1vcnRiYXkuamV0dHk8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamV0dHktcGx1Z2luPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDx2ZXJzaW9uPiR7bWF2ZW4uamV0dHkucGx1Z2luLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c2NhbkludGVydmFsU2Vjb25kcz4xMDwvc2NhbkludGVydmFsU2Vjb25kcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPHN5c3RlbVByb3BlcnRpZXM+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3lzdGVtUHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPG5hbWU+b3JnLmFwYWNoZS5jb21tb25zLmxvZ2dpbmcuTG9nPC9uYW1lPg0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDx2YWx1ZT5vcmcuYXBhY2hlLmNvbW1vbnMubG9nZ2luZy5pbXBsLkxvZzRKTG9nZ2VyPC92YWx1ZT4NCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydHk+DQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvc3lzdGVtUHJvcGVydGllcz4NCi0gICAgICAgICAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+DQotICAgICAgICAgICAgICAgICAgICA8L3BsdWdpbj4NCi0gICAgICAgICAgICAgICAgPC9wbHVnaW5zPg0KLSAgICAgICAgICAgIDwvYnVpbGQ+DQotICAgICAgICAgICAgPGRlcGVuZGVuY2llcz4NCi0gICAgICAgICAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgICAgICAgICA8Z3JvdXBJZD5sb2c0ajwvZ3JvdXBJZD4NCi0gICAgICAgICAgICAgICAgICAgIDxhcnRpZmFjdElkPmxvZzRqPC9hcnRpZmFjdElkPg0KLSAgICAgICAgICAgICAgICAgICAgPHZlcnNpb24+JHtsb2c0ai52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICAgICAgICAgIDx0eXBlPmphcjwvdHlwZT4NCi0gICAgICAgICAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgICAgIDwvZGVwZW5kZW5jaWVzPg0KLSAgICAgICAgPC9wcm9maWxlPg0KLSAgICA8L3Byb2ZpbGVzPg0KLQ0KLSAgICA8cmVwb3NpdG9yaWVzPg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPHJlbGVhc2VzPg0KLSAgICAgICAgICAgICAgICA8ZW5hYmxlZD5mYWxzZTwvZW5hYmxlZD4NCi0gICAgICAgICAgICA8L3JlbGVhc2VzPg0KLSAgICAgICAgICAgIDxzbmFwc2hvdHM+DQotICAgICAgICAgICAgICAgIDxlbmFibGVkPnRydWU8L2VuYWJsZWQ+DQotICAgICAgICAgICAgPC9zbmFwc2hvdHM+DQotICAgICAgICAgICAgPGlkPmFwYWNoZS1tYXZlbi1zbmFwc2hvdHM8L2lkPg0KLSAgICAgICAgICAgIDx1cmw+aHR0cDovL3Blb3BsZS5hcGFjaGUub3JnL3JlcG8vbTItc25hcHNob3QtcmVwb3NpdG9yeTwvdXJsPg0KLSAgICAgICAgPC9yZXBvc2l0b3J5Pg0KLSAgICAgICAgPHJlcG9zaXRvcnk+DQotICAgICAgICAgICAgPGlkPmphdmEubmV0PC9pZD4NCi0gICAgICAgICAgICA8dXJsPmh0dHA6Ly9kb3dubG9hZC5qYXZhLm5ldC9tYXZlbi8xPC91cmw+DQotICAgICAgICAgICAgPGxheW91dD5sZWdhY3k8L2xheW91dD4NCi0gICAgICAgIDwvcmVwb3NpdG9yeT4NCi0gICAgPC9yZXBvc2l0b3JpZXM+DQotDQotICAgIDwhLS0gUHJvamVjdCBkZXBlbmRlbmNpZXMgLS0+DQotICAgIDxkZXBlbmRlbmNpZXM+DQotICAgICAgICANCi0gICAgICAgIDwhLS0gQXBhY2hlIFRyaW5pZGFkIC0tPg0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWFwaTwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj4ke3RyaW5pZGFkLnZlcnNpb259PC92ZXJzaW9uPg0KLSAgICAgICAgICAgIDxzY29wZT5jb21waWxlPC9zY29wZT4NCi0gICAgICAgIDwvZGVwZW5kZW5jeT4NCi0gICAgICAgIA0KLSAgICAgICAgPGRlcGVuZGVuY3k+DQotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkPC9ncm91cElkPg0KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnRyaW5pZGFkLWltcGw8L2FydGlmYWN0SWQ+DQotICAgICAgICAgICAgPHZlcnNpb24+JHt0cmluaWRhZC52ZXJzaW9ufTwvdmVyc2lvbj4NCi0gICAgICAgICAgICA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+DQotICAgICAgICA8L2RlcGVuZGVuY3k+DQotICAgICAgICANCi0gICAgICAgIDxkZXBlbmRlbmN5Pg0KLSAgICAgICAgCTxncm91cElkPmphdmF4LnNlcnZsZXQ8L2dyb3VwSWQ+DQotICAgICAgICAJPGFydGlmYWN0SWQ+anN0bDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgIAk8dmVyc2lvbj4xLjI8L3ZlcnNpb24+DQotICAgICAgICAJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgICAgICA8ZGVwZW5kZW5jeT4NCi0gICAgICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4NCi0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4NCi0gICAgICAgICAgICA8dmVyc2lvbj40LjA8L3ZlcnNpb24+DQotICAgICAgICAgICAgPHNjb3BlPnRlc3Q8L3Njb3BlPg0KLSAgICAgICAgPC9kZXBlbmRlbmN5Pg0KLSAgICAgICAgDQotICAgIDwvZGVwZW5kZW5jaWVzPg0KLQ0KLTwvcHJvamVjdD4NCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEgYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi9qYXZhL0hlbGxvV29ybGRCYWNraW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1NmJjMTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vamF2YS9IZWxsb1dvcmxkQmFja2luZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSAkcGFja2FnZTsKLQotaW1wb3J0IGphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnJlbmRlci5FeHRlbmRlZFJlbmRlcktpdFNlcnZpY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnV0aWwuU2VydmljZTsKLQotLyoqCi0gKiBBIHR5cGljYWwgc2ltcGxlIGJhY2tpbmcgYmVhbiwgdGhhdCBpcyBiYWNrZWQgdG8gPGNvZGU+aGVsbG93b3JsZC5qc3A8L2NvZGU+Ci0gKiAKLSAqLwotcHVibGljIGNsYXNzIEhlbGxvV29ybGRCYWNraW5nCi17Ci0KLSAgLy9wcm9wZXJ0aWVzCi0gIHByaXZhdGUgU3RyaW5nIF9uYW1lOwotCi0gIC8qKgotICAgKiBkZWZhdWx0IGVtcHR5IGNvbnN0cnVjdG9yCi0gICAqLwotICBwdWJsaWMgSGVsbG9Xb3JsZEJhY2tpbmcoKQotICB7ICAgCi0gIH0KLQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS1nZXR0ZXIgJiBzZXR0ZXIKLSAgcHVibGljIFN0cmluZyBnZXROYW1lKCkKLSAgewotICAgIHJldHVybiBfbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWUoU3RyaW5nIG5hbWUpCi0gIHsKLSAgICB0aGlzLl9uYW1lID0gbmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdGhhdCBpcyBiYWNrZWQgdG8gYSBzdWJtaXQgYnV0dG9uIG9mIGEgZm9ybS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgc2VuZCgpCi0gIHsKLSAgICBGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0ID0gRmFjZXNDb250ZXh0LmdldEN1cnJlbnRJbnN0YW5jZSgpOwotICAgIEV4dGVuZGVkUmVuZGVyS2l0U2VydmljZSBzZXJ2aWNlID0gKEV4dGVuZGVkUmVuZGVyS2l0U2VydmljZSkKLSAgICAgIFNlcnZpY2UuZ2V0UmVuZGVyS2l0U2VydmljZShmYWNlc0NvbnRleHQsIEV4dGVuZGVkUmVuZGVyS2l0U2VydmljZS5jbGFzcyk7Ci0gICAgc2VydmljZS5hZGRTY3JpcHQoZmFjZXNDb250ZXh0LCAiYWxlcnQoJ1NjcmlwdCBhZGRlZCBieSBFeHRlbmRlZFJlbmRlcktpdFNlcnZpY2UnKSIpOwotCi0gICAgLy9kbyByZWFsIGxvZ2ljCi0gICAgcmV0dXJuICgic3VjY2VzcyIpOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcyBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL2xvZzRqL2xvZzRqLnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4MzUyZTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vbG9nNGovbG9nNGoucHJvcGVydGllcworKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLSMgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0jIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotIyB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuCi0jIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0jICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0jIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLWxvZzRqLnJvb3RMb2dnZXI9SU5GTywgQTEsIEEyCi1sb2c0ai5hcHBlbmRlci5BMT1vcmcuYXBhY2hlLmxvZzRqLkNvbnNvbGVBcHBlbmRlcgotbG9nNGouYXBwZW5kZXIuQTEubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotCi0jbG9nIG9uIGEgZmlsZSBvbiB0YXJnZXQgdG9vLCB0byBtYWtlIGVhc2llciBjaGVjayBpdAotbG9nNGouYXBwZW5kZXIuQTI9b3JnLmFwYWNoZS5sb2c0ai5Sb2xsaW5nRmlsZUFwcGVuZGVyCi1sb2c0ai5hcHBlbmRlci5BMi5GaWxlPXRhcmdldC9sb2c0ai5sb2cKLWxvZzRqLmFwcGVuZGVyLkEyLk1heEZpbGVTaXplPTEwMDBLQgotIyBLZWVwIG9uZSBiYWNrdXAgZmlsZQotbG9nNGouYXBwZW5kZXIuQTIuTWF4QmFja3VwSW5kZXg9MQotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0PW9yZy5hcGFjaGUubG9nNGouUGF0dGVybkxheW91dAotbG9nNGouYXBwZW5kZXIuQTIubGF5b3V0LkNvbnZlcnNpb25QYXR0ZXJuPSVwICV0ICVjIC0gJW0lbgotCi0jIExvZyBsZXZlbCBmb3IgbXlmYWNlcyBsaWJyYXJpZXMKLWxvZzRqLmxvZ2dlci5vcmcuYXBhY2hlLmNvbW1vbnM9SU5GTwotbG9nNGoubG9nZ2VyLm9yZy5hcGFjaGUubXlmYWNlcz1UUkFDRQotbG9nNGoubG9nZ2VyLmphdmF4LmZhY2VzPVRSQUNFCi0KLSMgUHJpbnQgdGhlIGRhdGUgaW4gSVNPIDg2MDEgZm9ybWF0Ci1sb2c0ai5hcHBlbmRlci5BMS5sYXlvdXQuQ29udmVyc2lvblBhdHRlcm49JTVwIFsldF0gKCVGXDolTCkgLSAlbSVuClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlYmU2ZTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgdmVyc2lvbj0iMS4yIiANCi0gICAgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiDQotICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiIA0KLSAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSBodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUvd2ViLWZhY2VzY29uZmlnXzFfMi54c2QiPg0KLSAgDQotICA8YXBwbGljYXRpb24+DQotICAgIDwhLS0gVXNlIHRoZSBUcmluaWRhZCBSZW5kZXJLaXQgLS0+DQotICAgIDxkZWZhdWx0LXJlbmRlci1raXQtaWQ+DQotICAgICAgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvcmUNCi0gICAgPC9kZWZhdWx0LXJlbmRlci1raXQtaWQ+DQotICA8L2FwcGxpY2F0aW9uPg0KLQ0KLSAgPCEtLSBHbG9iYWwgcHJlZmVyZW5jZXMgb2JqZWN0IHRoYXQgcHJveGllcyB0byBvdGhlcnMgLS0+DQotICA8bWFuYWdlZC1iZWFuPg0KLSAgICA8bWFuYWdlZC1iZWFuLW5hbWU+aGVsbG9Xb3JsZEJhY2tpbmc8L21hbmFnZWQtYmVhbi1uYW1lPg0KLSAgICA8bWFuYWdlZC1iZWFuLWNsYXNzPiR7cGFja2FnZX0uSGVsbG9Xb3JsZEJhY2tpbmc8L21hbmFnZWQtYmVhbi1jbGFzcz4NCi0gICAgPG1hbmFnZWQtYmVhbi1zY29wZT5yZXF1ZXN0PC9tYW5hZ2VkLWJlYW4tc2NvcGU+DQotICA8L21hbmFnZWQtYmVhbj4NCi0NCi0gIDwhLS0gbmF2aWdhdGlvbiBydWxlcyBmb3IgaW5kZXguanNweCAtLT4NCi0gIDxuYXZpZ2F0aW9uLXJ1bGU+DQotICAgIDxmcm9tLXZpZXctaWQ+L2luZGV4LmpzcHg8L2Zyb20tdmlldy1pZD4NCi0gICAgPG5hdmlnYXRpb24tY2FzZT4NCi0gICAgICA8ZnJvbS1vdXRjb21lPnN1Y2Nlc3M8L2Zyb20tb3V0Y29tZT4NCi0gICAgICA8dG8tdmlldy1pZD4vcGFnZTIuanNweDwvdG8tdmlldy1pZD4NCi0gICAgPC9uYXZpZ2F0aW9uLWNhc2U+DQotICA8L25hdmlnYXRpb24tcnVsZT4NCi0JDQotICA8IS0tIG5hdmlnYXRpb24gcnVsZXMgZm9yIHBhZ2UyLmpzcHggLS0+DQotICA8bmF2aWdhdGlvbi1ydWxlPg0KLSAgICA8ZnJvbS12aWV3LWlkPi9wYWdlMi5qc3B4PC9mcm9tLXZpZXctaWQ+DQotICAgIDxuYXZpZ2F0aW9uLWNhc2U+DQotICAgICAgPGZyb20tb3V0Y29tZT5iYWNrPC9mcm9tLW91dGNvbWU+DQotICAgICAgPHRvLXZpZXctaWQ+L2luZGV4LmpzcHg8L3RvLXZpZXctaWQ+DQotICAgIDwvbmF2aWdhdGlvbi1jYXNlPg0KLSAgPC9uYXZpZ2F0aW9uLXJ1bGU+DQotDQotPC9mYWNlcy1jb25maWc+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9XRUItSU5GL3dlYi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjYjQ1NTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL1dFQi1JTkYvd2ViLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnSVNPLTg4NTktMSc/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTx3ZWItYXBwIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIg0KLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiDQotICAgICAgICAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qMmVlIGh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2oyZWUvd2ViLWFwcF8yXzQueHNkIg0KLSAgICAgICAgIHZlcnNpb249IjIuNCI+DQotICA8IS0tIFVzZSBjbGllbnQtc2lkZSBzdGF0ZSBzYXZpbmcuICBJbiBUcmluaWRhZCwgaXQgaXMgYW4NCi0gICAgICAgb3B0aW1pemVkLCB0b2tlbi1iYXNlZCBtZWNoYW5pc20gdGhhdCBpcyBhbG1vc3QgYWx3YXlzIGENCi0gICAgICAgYmV0dGVyIGNob2ljZSB0aGFuIHRoZSBzdGFuZGFyZCBKU0Ygc2VydmVyLXNpZGUgc3RhdGUgc2F2aW5nLiAtLT4NCi0gIDxjb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5qYXZheC5mYWNlcy5TVEFURV9TQVZJTkdfTUVUSE9EPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+Y2xpZW50PC9wYXJhbS12YWx1ZT4NCi0gICAgPCEtLXBhcmFtLXZhbHVlPnNlcnZlcjwvcGFyYW0tdmFsdWUtLT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gIDwhLS0gVHJpbmlkYWQgYnkgZGVmYXVsdCB1c2VzIGFuIG9wdGltaXplZCBjbGllbnQtc2lkZSBzdGF0ZSBzYXZpbmcNCi0gICAgICAgbWVjaGFuaXNtLiBUbyBkaXNhYmxlIHRoYXQsIHVuY29tbWVudCB0aGUgZm9sbG93aW5nIC0tPg0KLSAgPCEtLWNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DTElFTlRfU1RBVEVfTUVUSE9EPC9wYXJhbS1uYW1lPg0KLSAgICA8cGFyYW0tdmFsdWU+YWxsPC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbS0tPg0KLQ0KLSAgPCEtLSBUcmluaWRhZCBhbHNvIHN1cHBvcnRzIGFuIG9wdGltaXplZCBzdHJhdGVneSBmb3IgY2FjaGluZyBzb21lDQotICAgdmlldyBzdGF0ZSBhdCBhbiBhcHBsaWNhdGlvbiBsZXZlbCwgd2hpY2ggc2lnbmlmaWNhbnRseSBpbXByb3Zlcw0KLSAgIHNjYWxhYmlsaXR5LiAgSG93ZXZlciwgaXQgbWFrZXMgaXQgaGFyZGVyIHRvIGRldmVsb3AgKHVwZGF0ZXMgdG8NCi0gICBwYWdlcyB3aWxsIG5vdCBiZSBub3RpY2VkIHVudGlsIHRoZSBzZXJ2ZXIgaXMgcmVzdGFydGVkKSwgYW5kIGluDQotICAgc29tZSByYXJlIGNhc2VzIGNhbm5vdCBiZSB1c2VkIGZvciBzb21lIHBhZ2VzIChzZWUgVHJpbmlkYWQNCi0gICBkb2N1bWVudGF0aW9uIGZvciBtb3JlIGluZm9ybWF0aW9uKSAtLT4NCi0gIDxjb250ZXh0LXBhcmFtPg0KLSAgICA8cGFyYW0tbmFtZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuVVNFX0FQUExJQ0FUSU9OX1ZJRVdfQ0FDSEU8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5mYWxzZTwvcGFyYW0tdmFsdWU+DQotICA8L2NvbnRleHQtcGFyYW0+DQotDQotICA8IS0tIElmIHRoaXMgcGFyYW1ldGVyIGlzIGVuYWJsZWQsIFRyaW5pZGFkIHdpbGwgYXV0b21hdGljYWxseQ0KLSAgICAgICBjaGVjayB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgeW91ciBKU1BzLCBhbmQgZGlzY2FyZCBzYXZlZA0KLSAgICAgICBzdGF0ZSB3aGVuIHRoZXkgY2hhbmdlOyAgdGhpcyBtYWtlcyBkZXZlbG9wbWVudCBlYXNpZXIsDQotICAgICAgIGJ1dCBhZGRzIG92ZXJoZWFkIHRoYXQgc2hvdWxkIGJlIGF2b2lkZWQgd2hlbiB5b3VyIGFwcGxpY2F0aW9uDQotICAgICAgIGlzIGRlcGxveWVkIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEVDS19GSUxFX01PRElGSUNBVElPTjwvcGFyYW0tbmFtZT4NCi0gICAgPHBhcmFtLXZhbHVlPnRydWU8L3BhcmFtLXZhbHVlPg0KLSAgPC9jb250ZXh0LXBhcmFtPg0KLQ0KLSAgPCEtLSBFbmFibGVzIENoYW5nZSBQZXJzaXN0ZW5jZSBhdCBhIHNlc3Npb24gc2NvcGUuICBCeSBkZWZhdWx0LA0KLSAgICAgICBDaGFuZ2UgUGVyc2lzdGVuY2UgaXMgZW50aXJlbHkgZGlzYWJsZWQuIFRoZSBDaGFuZ2VNYW5hZ2VyIGlzDQotICAgICAgIGFuIEFQSSwgd2hpY2ggY2FuIHBlcnNpc3QgY29tcG9uZW50IG1vZGlmaWNhdGlvbnMgKGxpa2UsDQotICAgICAgIGlzIGEgc2hvd0RldGFpbCBvciB0cmVlIGV4cGFuZGVkIG9yIGNvbGxhcHNlZCkuIEZvciBwcm92aWRpbmcNCi0gICAgICAgYSBjdXN0b20gQ2hhbmdlIFBlcnNpc3RlbmNlIGltcGxlbWVudGF0aW9uIGluaGVyaXQgZnJvbSB0aGUgDQotICAgICAgIFRyaW5pZGFkIEFQSSdzIENoYW5nZU1hbmFnZXIgY2xhc3MuIEFzIHRoZSB2YWx1ZSB5b3UgaGF2ZSANCi0gICAgICAgdG8gdXNlIHRoZSBmdWxscXVhbGlmaWVkIGNsYXNzIG5hbWUuIC0tPg0KLSAgPGNvbnRleHQtcGFyYW0+DQotICAgIDxwYXJhbS1uYW1lPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5DSEFOR0VfUEVSU0lTVEVOQ0U8L3BhcmFtLW5hbWU+DQotICAgIDxwYXJhbS12YWx1ZT5zZXNzaW9uPC9wYXJhbS12YWx1ZT4NCi0gIDwvY29udGV4dC1wYXJhbT4NCi0NCi0gIDxmaWx0ZXI+DQotICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+DQotICAgIDxmaWx0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLndlYmFwcC5UcmluaWRhZEZpbHRlcjwvZmlsdGVyLWNsYXNzPg0KLSAgPC9maWx0ZXI+DQotDQotICA8ZmlsdGVyLW1hcHBpbmc+DQotICAgIDxmaWx0ZXItbmFtZT50cmluaWRhZDwvZmlsdGVyLW5hbWU+DQotICAgIDxzZXJ2bGV0LW5hbWU+ZmFjZXM8L3NlcnZsZXQtbmFtZT4NCi0gIDwvZmlsdGVyLW1hcHBpbmc+DQotDQotICA8IS0tIEZhY2VzIFNlcnZsZXQgLS0+DQotICA8c2VydmxldD4NCi0gICAgPHNlcnZsZXQtbmFtZT5mYWNlczwvc2VydmxldC1uYW1lPg0KLSAgICA8c2VydmxldC1jbGFzcz5qYXZheC5mYWNlcy53ZWJhcHAuRmFjZXNTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgPC9zZXJ2bGV0Pg0KLSAgDQotICA8IS0tIHJlc291cmNlIGxvYWRlciBzZXJ2bGV0IC0tPg0KLSAgPHNlcnZsZXQ+DQotICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDxzZXJ2bGV0LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC53ZWJhcHAuUmVzb3VyY2VTZXJ2bGV0PC9zZXJ2bGV0LWNsYXNzPg0KLSAgPC9zZXJ2bGV0Pg0KLQ0KLSAgPCEtLSBGYWNlcyBTZXJ2bGV0IE1hcHBpbmdzIC0tPg0KLSAgPHNlcnZsZXQtbWFwcGluZz4NCi0gICAgPHNlcnZsZXQtbmFtZT5mYWNlczwvc2VydmxldC1uYW1lPg0KLSAgICA8dXJsLXBhdHRlcm4+L2ZhY2VzLyo8L3VybC1wYXR0ZXJuPg0KLSAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotICANCi0gIDxzZXJ2bGV0LW1hcHBpbmc+DQotICAgIDxzZXJ2bGV0LW5hbWU+cmVzb3VyY2VzPC9zZXJ2bGV0LW5hbWU+DQotICAgIDx1cmwtcGF0dGVybj4vYWRmLyo8L3VybC1wYXR0ZXJuPg0KLSAgPC9zZXJ2bGV0LW1hcHBpbmc+DQotDQotDQotICA8IS0tIFdlbGNvbWUgRmlsZXMgLS0+DQotICA8d2VsY29tZS1maWxlLWxpc3Q+DQotICAgIDx3ZWxjb21lLWZpbGU+ZmFjZXMvaW5kZXguanNweDwvd2VsY29tZS1maWxlPg0KLSAgPC93ZWxjb21lLWZpbGUtbGlzdD4NCi0NCi08L3dlYi1hcHA+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL2luZGV4LmpzcHggYi9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQxYzdlYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItYXJjaGV0eXBlcy9teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZC9zcmMvbWFpbi9yZXNvdXJjZXMvYXJjaGV0eXBlLXJlc291cmNlcy9zcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9Imlzby04ODU5LTEiIHN0YW5kYWxvbmU9InllcyIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08anNwOnJvb3QgeG1sbnM6anNwPSJodHRwOi8vamF2YS5zdW4uY29tL0pTUC9QYWdlIiB2ZXJzaW9uPSIyLjAiDQotICAgICAgICAgIHhtbG5zOmY9Imh0dHA6Ly9qYXZhLnN1bi5jb20vanNmL2NvcmUiDQotICAgICAgICAgIHhtbG5zOnRyPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIiA+DQotICA8anNwOmRpcmVjdGl2ZS5wYWdlIGNvbnRlbnRUeXBlPSJ0ZXh0L2h0bWw7Y2hhcnNldD11dGYtOCIvPg0KLSAgPGY6dmlldz4NCi0gICAgPHRyOmRvY3VtZW50IHRpdGxlPSJBcGFjaGUgTXlGYWNlcyBUcmluaWRhZCBBcmNoZXR5cGUgRGVtbyI+DQotICAgICAgIDx0cjpmb3JtPg0KLSAgICAgICANCi0gICAgICAgIDx0cjpwYW5lbFBhZ2U+DQotICAgICAgICAgIDx0cjppbnB1dFRleHQgbGFiZWw9IllvdXIgbmFtZSIgaWQ9ImlucHV0MSIgdmFsdWU9IiN7aGVsbG9Xb3JsZEJhY2tpbmcubmFtZX0iIHJlcXVpcmVkPSJ0cnVlIi8+DQotICAgICAgICAgIDx0cjpjb21tYW5kQnV0dG9uIGlkPSJidXR0b24xIiB0ZXh0PSJwcmVzcyBtZSIgYWN0aW9uPSIje2hlbGxvV29ybGRCYWNraW5nLnNlbmR9IiAvPg0KLSAgICAgICAgPC90cjpwYW5lbFBhZ2U+DQotICAgICAgIA0KLSAgICAgICA8L3RyOmZvcm0+DQotICAgIDwvdHI6ZG9jdW1lbnQ+DQotICA8L2Y6dmlldz4NCi08L2pzcDpyb290PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1hcmNoZXR5cGVzL215ZmFjZXMtYXJjaGV0eXBlLXRyaW5pZGFkL3NyYy9tYWluL3Jlc291cmNlcy9hcmNoZXR5cGUtcmVzb3VyY2VzL3NyYy9tYWluL3dlYmFwcC9wYWdlMi5qc3B4IGIvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcHgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzY2FmNDQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvbXlmYWNlcy1hcmNoZXR5cGUtdHJpbmlkYWQvc3JjL21haW4vcmVzb3VyY2VzL2FyY2hldHlwZS1yZXNvdXJjZXMvc3JjL21haW4vd2ViYXBwL3BhZ2UyLmpzcHgKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJpc28tODg1OS0xIiBzdGFuZGFsb25lPSJ5ZXMiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMi4wIg0KLSAgICAgICAgICB4bWxuczpmPSJodHRwOi8vamF2YS5zdW4uY29tL2pzZi9jb3JlIg0KLSAgICAgICAgICB4bWxuczp0cj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCIgPg0KLSAgPGpzcDpkaXJlY3RpdmUucGFnZSBjb250ZW50VHlwZT0idGV4dC9odG1sO2NoYXJzZXQ9dXRmLTgiLz4NCi0gIDxmOnZpZXc+DQotICAgIDx0cjpkb2N1bWVudCB0aXRsZT0iQXBhY2hlIE15RmFjZXMgVHJpbmlkYWQgQXJjaGV0eXBlIERlbW8iPg0KLSAgICAgICA8dHI6Zm9ybT4NCi0gICAgICAgDQotICAgICAgICA8dHI6cGFuZWxQYWdlPg0KLSAgICAgICAgICA8dHI6b3V0cHV0VGV4dCBpZD0iaW5wdXQxIiB2YWx1ZT0iSGVsbG8gI3toZWxsb1dvcmxkQmFja2luZy5uYW1lfS4gV2UgaG9wZSB5b3UgZW5qb3kgQXBhY2hlIE15RmFjZXMgVHJpbmlkYWQiLz4NCi0gICAgICAgICAgPHRyOmNvbW1hbmRMaW5rIGlkPSJsaW5rIiB0ZXh0PSJHTyBIT01FIiBhY3Rpb249ImJhY2siIC8+DQotICAgICAgICA8L3RyOnBhbmVsUGFnZT4NCi0gICAgICAgDQotICAgICAgIDwvdHI6Zm9ybT4NCi0gICAgPC90cjpkb2N1bWVudD4NCi0gIDwvZjp2aWV3Pg0KLTwvanNwOnJvb3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvcG9tLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNTZhMzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPCEtLQotICAtIFRoZSBhcmNoZXR5cGVzIHByb2plY3QgZGVmaW5lcyBhIHNldCBvZiBtYXZlbiBhcmNoZXR5cGUgcGx1Z2lucyB0aGF0IGNhbiBiZQotICAtIHVzZWQgdG8gY3JlYXRlIGFuIGluaXRpYWwgZGlyZWN0b3J5IHRyZWUgb2YgZmlsZXMgd2hlbiBzdGFydGluZyBhIG5ldyBKU0YKLSAgLSBwcm9qZWN0LgotICAtCi0gIC0gVGhpcyBwb20gaXMgdXNlZDoKLSAgLSAqIGFzIHRoZSBwYXJlbnQgcG9tIGZvciBhbGwgaW5kaXZpZHVhbCBhcmNoZXR5cGUgbW9kdWxlcywgdG8gZGVmaW5lIGNvbW1vbiBzZXR0aW5ncwotICAtICogdG8gZGVmaW5lIHRoZSBjb21tb24gYXJjaGV0eXBlIHdlYnNpdGUKLSAgLSAqIGFzIGEgY29udmVuaWVudCB0b29sIGZvciBidWlsZGluZyBhbGwgdGhlIGFyY2hldHlwZSBwcm9qZWN0cy4KLSAgLS0+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYXJjaGV0eXBlLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEFyY2hldHlwZSBQYXJlbnQ8L25hbWU+Ci0gIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9hcmNoZXR5cGVzPC91cmw+Ci0KLSAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NWUZBQ0VTPC91cmw+Ci0gIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gIDxjaU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICA8bm90aWZpZXJzPgotICAgICAgPG5vdGlmaWVyPgotICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9ub3RpZmllcj4KLSAgICA8L25vdGlmaWVycz4KLSAgPC9jaU1hbmFnZW1lbnQ+Ci0KLSAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLQotICA8YnVpbGQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotCTxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPCEtLSAyLjQgdGhyb3dzIGVycm9yLCBzbyB0ZW1wb3JhbGx5IHB1dCBvbiAyLjMgLS0+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxhcmNoaXZlPgotICAgICAgICAgICAgICA8bWFuaWZlc3Q+Ci0gICAgICAgICAgICAgICAgPGFkZERlZmF1bHRJbXBsZW1lbnRhdGlvbkVudHJpZXM+dHJ1ZTwvYWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz4KLSAgICAgICAgICAgICAgPC9tYW5pZmVzdD4KLSAgICAgICAgICAgIDwvYXJjaGl2ZT4KLSAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgPC9wbHVnaW5zPgotICAgIDwvcGx1Z2luTWFuYWdlbWVudD4KLQotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0LWluZm8tcmVwb3J0cy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbWQtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjM8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxydWxlc2V0cz4KLSAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy9iYXNpYy54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgICA8cnVsZXNldD4vcnVsZXNldHMvdW51c2VkY29kZS54bWw8L3J1bGVzZXQ+Ci0gICAgICAgICAgPC9ydWxlc2V0cz4KLSAgICAgICAgICA8bGlua1hyZWY+dHJ1ZTwvbGlua1hyZWY+Ci0gICAgICAgICAgPG1pbmltdW1Ub2tlbnM+MTAwPC9taW5pbXVtVG9rZW5zPgotICAgICAgICAgIDx0YXJnZXRKZGs+MS41PC90YXJnZXRKZGs+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1hcmNoZXR5cGVzLzwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItYXJjaGV0eXBlcy88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItYXJjaGV0eXBlcy88L3VybD4KLSAgPC9zY20+Ci0KLSAgPG1vZHVsZXM+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLWZhY2VsZXRzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS1oZWxsb3dvcmxkLXBvcnRsZXRzPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWFyY2hldHlwZS10cmluaWRhZDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1hcmNoZXR5cGUtanNmY29tcG9uZW50czwvbW9kdWxlPgotICA8L21vZHVsZXM+Ci0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8c2l0ZT4KLSAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvYXJjaGV0eXBlczwvdXJsPgotICAgIDwvc2l0ZT4KLSAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5yZWxlYXNlPC9pZD4KLSAgICAgIDwhLS0KLSAgICAgIE5PVEU6IEV4ZWN1dGUgdGhpcyBwcm9maWxlIGxpa2UKLSAgICAgICAgICAgIG12biBjbGVhbiBzb3VyY2U6amFyIGluc3RhbGwgZGVwbG95IC1EYWx0RGVwbG95bWVudFJlcG9zaXRvcnk9bWF0emV3OjpkZWZhdWx0OjpmaWxlOi8vRk9MREVSIC1QcmVsZWFzZQotICAgICAgIC0tPgotICAgICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS00PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2NtLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgPGlkPmdldHRpbmctc2NtLnJldmlzaW9uPC9pZD4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD51cGRhdGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgIDwvYnVpbGQ+Ci0gICAgPC9wcm9maWxlPgotICA8L3Byb2ZpbGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLWFyY2hldHlwZXMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdCBiL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxOTIzYTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLWFyY2hldHlwZXMvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLSAtLS0tLS0KLSBNeWZhY2VzIEFyY2hldHlwZXMKLSAtLS0tLS0KLQotT3ZlcnZpZXcKLQotICBUaGUgYXJjaGV0eXBlIHN1YnByb2plY3RzIGRlZmluZSBNYXZlbiBwbHVnaW5zIHRoYXQgY2FuIGJ1aWxkIGEgZGlyZWN0b3J5IHRyZWUgY29udGFpbmluZwotICB0aGUgZmlsZXMgbmVlZGVkIHRvIHF1aWNrbHkgZ2V0IHN0YXJ0ZWQgb24gYSBuZXcgSlNGIHByb2plY3QuCi0KLSAgRGlmZmVyZW50IGFyY2hldHlwZXMgY3JlYXRlIGRpZmZlcmVudCBpbml0aWFsIHNldHVwcywgc3VjaCBhcyBpbmNsdWRpbmcgZGlmZmVyZW50IGxpYnJhcmllcwotICBpbiB0aGUgY3JlYXRlZCBwb20ueG1sIGZpbGUsIGFuZCBhZGRpbmcgZGlmZmVyZW50IGNvbmZpZ3VyYXRpb24gdG8gdGhlIGNyZWF0ZWQgd2ViLnhtbCBmaWxlLgotCi1BcmNoZXR5cGVzCi0KLSogSGVsbG9Xb3JsZCBCYXNpYyBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgd2ViYXBwIHByb2plY3QgdGhhdCB1c2VzIE15RmFjZXMgQ29yZSAxLjIueCB3aXRoIEpTUCBhcyB0aGUgcGFnZSB0ZW1wbGF0aW5nIHN5c3RlbS4KLSAgVGhlIHdlYmFwcCBjb250YWlucyBhIHNpbmdsZSAuanNwIGZpbGUgaXMgY3JlYXRlZCB3aGljaCByZW5kZXJzIGFuIEhUTUwgcGFnZSBzYXlpbmcgCi0gICJoZWxsbyB3b3JsZCIuCi0KLSogSGVsbG9Xb3JsZC1GYWNlbGV0cyBBcmNoZXR5cGUKLQotICBBcyBmb3IgdGhlIEhlbGxvV29ybGQgYXJjaGV0eXBlLCBidXQgY29uZmlndXJlZCB0byB1c2UgdGhlIEZhY2VsZXRzIHBhZ2UgdGVtcGxhdGluZyBzeXN0ZW0uCi0KLSogSGVsbG9Xb3JsZC1Qb3J0bGV0IEFyY2hldHlwZQotCi0gIFNldHMgdXAgYSBzaW1wbGUgcG9ydGxldC1lbmFibGVkIHdlYmFwcC4gCi0KLSogVHJpbmlkYWQgQXJjaGV0eXBlCi0KLSAgU2V0cyB1cCBhIHdlYmFwcCB0aGF0IHVzZXMgTXlGYWNlcyBDb3JlIDEuMi54IGFuZCBNeUZhY2VzIFRyaW5pZGFkLgotCi0qIEpTRi1Db21wb25lbnQgTGlicmFyeSBBcmNoZXR5cGUKLQotICBTZXRzIHVwIGEgcHJvamVjdCB0aGF0IGlzIGludGVuZGVkIHRvIGRlZmluZSBuZXcgSlNGIGNvbXBvbmVudHMgKHJhdGhlciB0aGFuIGp1c3QgdXNlIHRoZW0pLgotICBJZiB5b3Ugd2FudCB0byBjcmVhdGUgYSBqYXIgdGhhdCBkZWZpbmVzIGEgc2V0IG9mIG5ldyBjdXN0b20gSlNGIGNvbXBvbmVudHMgdGhlbiB0aGlzCi0gIGFyY2hldHlwZSBpcyBhIGdvb2Qgc3RhcnRpbmcgcG9pbnQuCmRpZmYgLS1naXQgYS9tYXZlbjItYXJjaGV0eXBlcy9zcmMvc2l0ZS9zaXRlLnhtbCBiL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYWQyMWRlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1hcmNoZXR5cGVzL3NyYy9zaXRlL3NpdGUueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgQXJjaGV0eXBlcyI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgQmFubmVyPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvYXBhY2hlX2Jhbm5lci5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAgCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJBYm91dCIgICAgICAgICBocmVmPSJpbmRleC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJtb2R1bGVzIiBpbmhlcml0PSJ0b3AiLz4KLQotICAgIDxtZW51IHJlZj0icmVwb3J0cyIvPgotCi0gICAgPG1lbnUgbmFtZT0iRm91bmRhdGlvbiIgaW5oZXJpdD0iYm90dG9tIj4KLSAgICAgIDxpdGVtIG5hbWU9IkFTRiIgICAgICAgICAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iU3BvbnNvcnNoaXAiICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3Nwb25zb3JzaGlwLmh0bWwiIC8+Ci0gICAgICA8aXRlbSBuYW1lPSJUaGFua3MiICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnL2ZvdW5kYXRpb24vdGhhbmtzLmh0bWwiIC8+Ci0gICAgPC9tZW51PgotICA8L2JvZHk+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTdiMGRjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+IAotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMzwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9uczwvYXJ0aWZhY3RJZD4gCi0gIDx2ZXJzaW9uPjEuMC41LVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIEFubm90YXRpb25zPC9uYW1lPgotCi0gIDxkZXNjcmlwdGlvbj4KLSAgICBBIHNldCBvZiBKYXZhIDEuNSBBbm5vdGF0aW9uIGNsYXNzZXMgdGhhdCBjYW4gYmUgYXBwbGllZCB0byBjbGFzc2VzIHRoYXQgYXJlCi0gICAgaW50ZW5kZWQgdG8gYmUgSlNGIGNvbXBvbmVudHMsIHZhbGlkYXRvcnMsIGV0Yy4gVGhlIG1hdmVuLWJ1aWxkZXItcGx1Z2luIHdpbGwKLSAgICByZWNvZ25pc2UgdGhlc2UgYW5ub3RhdGlvbnMgYW5kIHByb2Nlc3MgdGhlIGNsYXNzIGFwcHJvcHJpYXRlbHkuCi0gIDwvZGVzY3JpcHRpb24+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjU8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZDb21wb25lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbXBvbmVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTBjYWNiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbXBvbmVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzQ5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFRoaXMgYW5ub3RhdGlvbiBpZGVudGlmaWVzIGEgY2xhc3MgYXMgYmVpbmcgYSBKU0YgY29tcG9uZW50LCBhbiBhbmNlc3RvciBvZgotICogb25lLCBvciBhIHRlbXBsYXRlIGZvciBvbmUuCi0gKiA8cD4KLSAqIEEgSlNGIGNvbXBvbmVudCBpcyBhIGNvbmNyZXRlIGNsYXNzIHRoYXQgaXMgYSBzdWJjbGFzcyBvZiBVSUNvbXBvbmVudCwgYW5kCi0gKiBpcyByZWdpc3RlcmVkIGluIGEgZmFjZXMtY29uZmlnLnhtbCBmaWxlLiBJdCBhbHdheXMgaW1wbGVtZW50cyB0aGUgU3RhdGVIb2xkZXIKLSAqIGludGVyZmFjZSwgYW5kIHR5cGljYWxseSBoYXMgc2V2ZXJhbCBwcm9wZXJ0aWVzIHRoYXQgY2FuIGJlIGRlZmluZWQgZnJvbSBhCi0gKiB2aWV3IGZpbGUgKGpzcCwgZmFjZWxldHMgb3Igb3RoZXIgc2ltaWxhciB0ZWNobm9sb2d5KS4KLSAqIDxwPgotICogVGhlIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4gdXNlcyB0aGlzIGFubm90YXRpb24gaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgdGhlCi0gKiBjb3JyZWN0IGZhY2VzLWNvbmZpZy54bWwgZGVjbGFyYXRpb25zLCB0aHVzIGVuc3VyaW5nIHRoYXQgdGhlIGNvbmZpZyBkZWNsYXJhdGlvbnMKLSAqIGFyZSBjb25zaXN0ZW50IHdpdGggdGhlIGNvZGUuIFRoZSBwbHVnaW4gY2FuIGFsc28gb3B0aW9uYWxseSB1c2UgdGhpcyBpbmZvcm1hdGlvbgotICogdG8gZ2VuZXJhdGUgSlNQIHRhZyBjbGFzc2VzLCBhbmQgY29uY3JldGUgVUlDb21wb25lbnQgaW1wbGVtZW50YXRpb25zLgotICogPHA+Ci0gKiBUaGlzIHRhZyBjYW4gYmUgdXNlZCBpbiBzZXZlcmFsIHdheXM6Ci0gKiA8dWw+Ci0gKiA8bGk+VG8gbWFyayBhbiBpbnRlcmZhY2UgYXMgb25lIHRoYXQgZGVjbGFyZXMgY29tcG9uZW50IHByb3BlcnRpZXMuCi0gKiA8bGk+VG8gbWFyayBhIGNsYXNzIHRoYXQgd2lsbCBiZSB1c2VkIGFzIGEgYmFzZSBjbGFzcyBieSBvdGhlciBoYW5kLXdyaXR0ZW4KLSAqIGNsYXNzZXMuCi0gKiA8bGk+VG8gbWFyayBhIGNsYXNzIGFzIGFuIGFjdHVhbCBjb25jcmV0ZSBKU0YgQ29tcG9uZW50IGNsYXNzIHdoaWNoIHNob3VsZCBiZQotICogcmVnaXN0ZXJlZCBhcyBhIGNvbXBvbmVudCBpbiBmYWNlcy1jb25maWcgZXRjLgotICogPGxpPlRvIG1hcmsgYSBjbGFzcyBhcyBhIGJhc2UgY2xhc3MgZm9yIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IHN1YmNsYXNzIHNob3VsZAotICogYmUgY3JlYXRlZCB1c2luZyBjb2RlIGdlbmVyYXRpb24uCi0gKiA8bGk+VG8gbWFyayBhIGNsYXNzIGFzIGEgInRlbXBsYXRlIiBmcm9tIHdoaWNoIGEgY29uY3JldGUgY29tcG9uZW50IGNsYXNzIHNob3VsZAotICogYmUgY3JlYXRlZCB1c2luZyBjb2RlIGdlbmVyYXRpb24uCi0gKiA8L3VsPgotICogQW55IGNsYXNzIG9yIGludGVyZmFjZSBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24gd2lsbCBhbHNvIGhhdmUgaXRzICJtZXRhZGF0YSIKLSAqIHN0b3JlZCBpbiB0aGUgbWV0YWRhdGEgZmlsZSB0aGF0IHRoZSBidWlsZGVyIHBsdWdpbiBjcmVhdGVzIGFuZCBzdG9yZXMgaW4gdGhlCi0gKiBNRVRBLUlORiBkaXJlY3Rvcnkgb2YgdGhlIHByb2Nlc3NlZCBwcm9qZWN0LgotICogPHA+Ci0gKiBOb3RlIHRoYXQgYSBKU1BQcm9wZXJ0eSBhbm5vdGF0aW9uIChvbiBhIG1ldGhvZCkgaXMgbm90IHByb2Nlc3NlZCB1bmxlc3MgdGhlIGNsYXNzCi0gKiBpcyBtYXJrZWQgd2l0aCB0aGlzIEpTUENvbXBvbmVudCBhbm5vdGF0aW9uLiAKLSAqIAotICogPGgyPkFubm90YXRpbmcgYW4gSW50ZXJmYWNlPC9oMj4KLSAqIAotICogV2hlbiBhbiBpbnRlcmZhY2UgaXMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uLCB0aGVuIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IHRoYXQKLSAqIGludGVyZmFjZSBhbmQgYXJlIHRoZW1zZWx2ZXMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uIGluaGVyaXQgdGhlIEpTRlByb3BlcnR5Ci0gKiBzZXR0aW5ncyBkZWNsYXJlZCBvbiB0aGUgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlLgotICogPHA+Ci0gKiBUaGlzIGFsbG93cyBjb21tb24gZ3JvdXBzIG9mIEpTRiBwcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQgYXMgYW4gaW50ZXJmYWNlLCBhbmQgZWFjaAotICogSlNGIGNvbXBvbmVudCBjbGFzcyB0aGF0IGlzIGV4cGVjdGVkIHRvIHByb3ZpZGUgdGhvc2UgcHJvcGVydGllcyBzaW1wbHkgZGVjbGFyZXMgdGhhdAotICogaXQgaW1wbGVtZW50cyB0aGF0IGludGVyZmFjZS4gVGhlIG5vcm1hbCBqYXZhIGNvbXBpbGF0aW9uIHJ1bGVzIGVuc3VyZSB0aGF0IHRoZSBjb25jcmV0ZQotICogSlNGIGNvbXBvbmVudCBjbGFzcyBpbXBsZW1lbnRzIGFsbCBvZiB0aGUgbWV0aG9kcyBvbiB0aGUgaW50ZXJmYWNlLCBhbmQgdGhlIGJ1aWxkZXIKLSAqIHBsdWdpbiBlbnN1cmVzIHRoYXQgdGhlIGluaGVyaXRlZCBKU0ZQcm9wZXJ0eSBzZXR0aW5ncyBhcmUgdXNlZC4KLSAqIAotICogPGgyPkFubm90YXRpbmcgYW4gQWJzdHJhY3QgQmFzZSBDbGFzczwvaDI+Ci0gKiAKLSAqIFdoZW4gYW4gYWJzdHJhY3QgY2xhc3MgaXMgbWFya2VkIHdpdGggdGhpcyBhbm5vdGF0aW9uLCBhbmQgdGhlIG5hbWUgYXR0cmlidXRlIGlzCi0gKiBub3Qgc2V0LCB0aGVuIHRoaXMgaXMgYSBiYXNlIGNsYXNzIHRoYXQgY29uY3JldGUgY29tcG9uZW50cyBjYW4gZXh0ZW5kLiBBbnkKLSAqIEpTRlByb3BlcnR5IHNldHRpbmdzIGRlZmluZWQgb24gdGhpcyBjbGFzcyBhcmUgaW5oZXJpdGVkIGJ5IHN1YmNsYXNzZXMuCi0gKiAKLSAqIDxoMj5Bbm5vdGF0aW5nIGEgQ29uY3JldGUgQ29tcG9uZW50IENsYXNzPC9oMj4KLSAqIAotICogV2hlbiBhIG5vbi1hYnN0cmFjdCBjbGFzcyBpcyBtYXJrZWQgd2l0aCB0aGlzIGFubm90YXRpb24sIGFuZCB0aGUgbmFtZSBhdHRyaWJ1dGUKLSAqIGlzIGRlZmluZWQgdGhlbiBhbiBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGdlbmVyYXRlZCBmYWNlcy1jb25maWcueG1sIGZpbGUKLSAqIG1hcmtpbmcgdGhpcyBjbGFzcyBhcyBhIGNvbXBvbmVudC4gCi0gKiA8cD4KLSAqIEluIGFkZGl0aW9uLCBhIEpTUCBUYWdIYW5kbGVyIGNsYXNzIHdpbGwgYmUgY3JlYXRlZCB1c2luZyBjb2RlLWdlbmVyYXRpb24gYW5kIGFuCi0gKiBlbnRyeSB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhlIGdlbmVyYXRlZCAudGxkIGZpbGUgc28gdGhhdCB0aGUgdGFnIGNsYXNzIGNhbiBiZQotICogdXNlZCBmcm9tIEpTUCBhcHBsaWNhdGlvbnMuCi0gKiAKLSAqIDxoMj5Bbm5vdGF0aW5nIGEgQ2xhc3MgZm9yIFN1YmNsYXNzIEdlbmVyYXRpb248L2gyPgotICogCi0gKiBXaGVuIGFuIGFic3RyYWN0IGNsYXNzIGlzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiwgdGhlIG5hbWUgYXR0cmlidXRlIGlzCi0gKiBkZWZpbmVkLCBhbmQgdGhlICJjbGF6eiIgYXR0cmlidXRlIGlzIGRlZmluZWQgdGhlbiBjb2RlLWdlbmVyYXRpb24gd2lsbCBiZQotICogdXNlZCB0byBjcmVhdGUgYSBjb25jcmV0ZSBVSUNvbXBvbmVudCBjbGFzcyB3aGljaCBpcyBhIHN1YmNsYXNzIG9mIHRoaXMgY2xhc3MuCi0gKiBUaGUgc3ViY2xhc3Mgd2lsbCBiZSByZWdpc3RlcmVkIGluIHRoZSBnZW5lcmF0ZWQgZmFjZXMtY29uZmlnLnhtbCBmaWxlLCBhCi0gKiBKU1AgVGFnSGFuZGxlciBjbGFzcyB3aWxsIGJlIGNyZWF0ZWQgYW5kIHJlZ2lzdGVyZWQgaW4gdGhlIC50bGQgZmlsZSwgZXRjLgotICogPHA+Ci0gKiBVc2luZyBjb2RlLWdlbmVyYXRpb24gdG8gY3JlYXRlIGEgc3ViY2xhc3MgYWxsb3dzIGF1dG9tYXRpYyBnZW5lcmF0aW9uIG9mCi0gKiB0aGUgImJvaWxlcnBsYXRlIGNvZGUiIHRoYXQgaXMgY29tbW9ubHkgbmVlZGVkIGZvciBpbXBsZW1lbnRpbmcgY29tcG9uZW50Ci0gKiBwcm9wZXJ0eSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgYW5kIHRoZSBzYXZlU3RhdGUvcmVzdG9yZVN0YXRlIG1ldGhvZHMuCi0gKiA8cD4KLSAqIEFueSBhYnN0cmFjdCBwcm9wZXJ0eSBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMgb24gdGhlIGFubm90YXRlZCBjbGFzcyB3aWxsIGhhdmUKLSAqIHRoZSBhcHByb3ByaWF0ZSBpbXBsZW1lbnRhdGlvbiBhdXRvbWF0aWNhbGx5IHdyaXR0ZW4gZm9yIGl0IGluIHRoZSBuZXcKLSAqIHN1YmNsYXNzLiBIb3dldmVyIHRoZSBwYXJlbnQgY2xhc3MgY2FuIG92ZXJyaWRlIHRoaXMgZm9yIGFueSBwYXJ0aWN1bGFyCi0gKiBtZXRob2Qgc2ltcGx5IGJ5IHByb3ZpZGluZyBhIGNvbmNyZXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBtZXRob2QuCi0gKiAKLSAqIDxoMj5Bbm5vdGF0aW5nIGEgQ2xhc3MgYXMgYSBDb21wb25lbnQgVGVtcGxhdGU8L2gyPgotICogCi0gKiBXaGVuIGFuIGFic3RyYWN0IGNsYXNzIGlzIG1hcmtlZCB3aXRoIHRoaXMgYW5ub3RhdGlvbiwgdGhlIG5hbWUgYXR0cmlidXRlCi0gKiBpcyBzZXQsIHRoZSBjbGF6eiBhdHRyaWJ1dGUgaXMgc2V0LCBhbmQgYXR0cmlidXRlIHRlbXBsYXRlIGlzIHNldCB0byAidHJ1ZSIKLSAqIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUgdXNlZCB0byBjcmVhdGUgYSBuZXcgY2xhc3MgdGhhdCBpcyBhICJjb3B5IiBvZgotICogdGhlIHNvdXJjZSBjb2RlIGhlcmUuIEFzIGZvciAic3ViY2xhc3MgZ2VuZXJhdGlvbiIsIGFueSBhYnN0cmFjdCBtZXRob2RzIHdpbGwKLSAqIGhhdmUgYW4gYXBwcm9wcmlhdGUgaW1wbGVtZW50YXRpb24gZ2VuZXJhdGVkLgotICogPHA+Ci0gKiBUaGlzIGFwcHJvYWNoIGFsbG93cyBhIGNvbXBvbmVudCAidGVtcGxhdGUiIHRvIGJlIHdyaXR0ZW4gYXMgYSBub3JtYWwgY2xhc3MKLSAqICh3aXRoIHRoZSB1c3VhbCBzdXBwb3J0IHRvb2xzIHByb3ZpZGVkIGJ5IElERXMgZXRjKSB3aGlsZSBhbGxvd2luZyB0aGUKLSAqIGFjdHVhbCBVSUNvbXBvbmVudCBjbGFzc2VzIHRvIGhhdmUgYSBoaWVyYXJjaHkgdGhhdCBpcyBjb21wbGV0ZWx5IHVuZGVyCi0gKiB0aGUgY29udHJvbCBvZiB0aGUgYW5ub3RhdGlvbnMuIEluIHBhcnRpY3VsYXIsIHRoaXMgaXMgdXNlZnVsIGZvciBnZW5lcmF0aW5nCi0gKiBjb21wb25lbnRzIGZvciBhIEpTRiBzcGVjaWZpY2F0aW9uIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyB2ZXJ5IHNwZWNpZmljCi0gKiBhYm91dCB0aGUgaW5oZXJpdGFuY2UgaGllcmFyY2h5IG9mIHRoZSBzdGFuZGFyZCBjb21wb25lbnQgY2xhc3Nlcy4KLSAqIDxwPgotICogV2hlbiB1c2luZyB0aGlzICJ0ZW1wbGF0ZSIgYXBwcm9hY2gsIHRoZSBhbm5vdGF0ZWQgY2xhc3MgaXRzZWxmIGNhbiAoYW5kCi0gKiBwcm9iYWJseSBzaG91bGQgYmUpIHBhY2thZ2Utc2NvcGVkLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkNvbXBvbmVudAotewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBjb21wb25lbnQgaW4gYSBwYWdlLiBUaGlzIGlzIHRoZSBuYW1lIGJ5IHdoaWNoIHRoZQotICAgICAqIGNvbXBvbmVudCB3aWxsIGJlIHJlZmVyZW5jZWQgYnkgdGhlIHVzZWQgKHRoZSBuYW1lIHVzZWQgdG8gcmVnaXN0ZXIKLSAgICAgKiBKU1AgVGFnSGFuZGxlcnMgZm9yIGV4YW1wbGUpLiBGb3IgZXhhbXBsZTogIm15Y29tcCIuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiBhIHByb2plY3QgaXMgZ2VuZXJhdGluZyBjb21wb25lbnRzIHRoYXQgbGl2ZSBpbiBtb3JlIHRoYW4gb25lCi0gICAgICogbmFtZXNwYWNlLCB0aGVuIHRoZSBuYW1lIGNhbiBvcHRpb25hbGx5IGluY2x1ZGUgYSBuYW1lc3BhY2UgcHJlZml4LAotICAgICAqIGZvciBleGFtcGxlICJ4Om15Y29tcCIuCi0gICAgICogPHA+Ci0gICAgICogSWYgYSBjbGFzcyBpcyBtYXJrZWQgd2l0aCB0aGUgSlNGQ29tcG9uZW50IGFubm90YXRpb24sIGJ1dCBkb2VzIG5vdAotICAgICAqIGRlZmluZSB0aGUgbmFtZSBhdHRyaWJ1dGUgdGhlbiBpdCBpcyBhICJiYXNlIGNsYXNzIiB0aGF0IG90aGVyCi0gICAgICogVUlDb21wb25lbnQgY2xhc3NlcyBjYW4gZXh0ZW5kIChhbmQgdGhlcmVmb3JlIGluaGVyaXQgYW55IEpTRlByb3BlcnR5Ci0gICAgICogZGVmaW5pdGlvbnMgZnJvbSB0aGUgYmFzZSBjbGFzcyksIGJ1dCBpcyBub3QgYSBjb21wb25lbnQgdGhhdCBjYW4gYmUKLSAgICAgKiBpbnN0YW50aWF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgbmV2ZXIgYmUgc2V0IGZvciBhbiBpbnRlcmZhY2UuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBwcm9wZXJ0eSBzaG91bGQgb25seSBiZSBzZXQgZm9yIGFuIGFic3RyYWN0IGNsYXNzIHdoZW4gY29kZQotICAgICAqIGdlbmVyYXRpb24gaXMgZXhwZWN0ZWQgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgYSBjb21wb25lbnQgYmFzZWQgb24KLSAgICAgKiB0aGlzIG9uZSAoaWUgd2hlbiBjbGF6eiBhbmQgcGVyaGFwcyB0ZW1wbGF0ZSBhcmUgc2V0KS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICovCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGx5LXF1YWxpZmllZC1uYW1lIG9mIGEgY29uY3JldGUgY29tcG9uZW50IGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG9ubHkgcmVsZXZhbnQgd2hlbiAibmFtZSIgaXMgYWxzbyBzZXQsIGllIHRoZQotICAgICAqIGFubm90YXRpb24gaXMgaW5kaWNhdGluZyB0aGF0IGEgY29tcG9uZW50IGlzIHJlYWxseSBiZWluZyBkZWNsYXJlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBXaGVuIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBkZWZpbmVkIHRoZW4gaXQgaXMgYXNzdW1lZCB0aGF0IHRoaXMKLSAgICAgKiBhbm5vdGF0ZWQgY2xhc3MgaXMgdGhlIGFjdHVhbCBjb21wb25lbnQgY2xhc3MuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBzZXQgdG8gc29tZXRoaW5nIG90aGVyIHRoYW4gdGhlIG5hbWUgb2YgdGhlCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIHRoZW4gdGhlIHNwZWNpZmllZCBjbGFzcyBpcyB0aGUgb25lIHRoYXQgdGhlIEpTRgotICAgICAqIGNvbXBvbmVudCByZWdpc3RyYXRpb24gaW4gZmFjZXMtY29uZmlnLnhtbCB3aWxsIHJlZmVyIHRvLiBBbmQgaWYgdGhhdAotICAgICAqIGNsYXNzIGRvZXMgbm90IGV4aXN0IGluIHRoZSBjbGFzc3BhdGggKHdoaWNoIHdpbGwgbm9ybWFsbHkgYmUgdGhlCi0gICAgICogY2FzZSkgdGhlbiBjb2RlLWdlbmVyYXRpb24gd2lsbCBiZSB0cmlnZ2VyZWQgdG8gY3JlYXRlIGl0LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBpbmhlcml0YWJsZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZG9jbGV0LWFubm90YXRpb24gZXF1aXZhbGVudCBvZiB0aGlzIGF0dHJpYnV0ZSBpcyBuYW1lZCAiY2xhc3MiLgotICAgICAqLwotICAgIFN0cmluZyBjbGF6eigpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIEpTRiBDb21wb25lbnQgRmFtaWx5IHRoYXQgdGhpcyBjb21wb25lbnQgYmVsb25ncyB0by4KLSAgICAgKiA8cD4KLSAgICAgKiBBIFVJQ29tcG9uZW50IGluc3RhbmNlJ3MgImZhbWlseSIgc2V0dGluZyBpcyB1c2VkIHRvZ2V0aGVyIHdpdGggYSAicmVuZGVyZXItdHlwZSIgdG8KLSAgICAgKiBmaW5kIGEgcmVuZGVyZXIgZm9yIHRoZSBjb21wb25lbnQgKHNlZSBtZXRob2QgVUlDb21wb25lbnQuZ2V0UmVuZGVyZXIpLiBFYWNoCi0gICAgICogUmVuZGVyZXIgaW1wbGVtZW50YXRpb24gaXMgcmVnaXN0ZXJlZCBpbiBhIGZhY2VzLWNvbmZpZy54bWwgZmlsZSB1c2luZyBhCi0gICAgICogKGNvbXBvbmVudC1mYW1pbHksIHJlbmRlcmVyLXR5cGUpIHBhaXIuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhpcyBhdHRyaWJ1dGUgaXMgbm90IHNldCB0aGVuIHRoZSBidWlsZGVyIHBsdWdpbiB3aWxsIGxvb2sgZm9yIGEKLSAgICAgKiBjb25zdGFudCBvbiB0aGUgY2xhc3Mgd2l0aCBuYW1lIENPTVBPTkVOVF9GQU1JTFkuIEl0IGlzIGFuIGVycm9yIGlmIGEKLSAgICAgKiBjb25jcmV0ZSBjb21wb25lbnQgaGFzIG5vIHN1Y2ggc2V0dGluZyAoYnV0IHRoZSB2YWx1ZSBjYW4gYmUgaW5oZXJpdGVkIGZyb20gYW4KLSAgICAgKiBhbmNlc3RvciBjbGFzcykuCi0gICAgICovCi0gICAgU3RyaW5nIGZhbWlseSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIHR5cGUgc3RyaW5nIHVzZWQgdG8gY3JlYXRlIG5ldyBpbnN0YW5jZXMgb2YgdGhpcyBjb21wb25lbnQuCi0gICAgICogPHA+Ci0gICAgICogQ29tcG9uZW50cyBhcmUgcmVnaXN0ZXJlZCBpbiBmYWNlcy1jb25maWcueG1sIHVzaW5nIHRoaXMgdHlwZSB2YWx1ZSwgYW5kCi0gICAgICogbmV3IGluc3RhbmNlcyBhcmUgY3JlYXRlZCB2aWEgQXBwbGljYXRpb24uY3JlYXRlQ29tcG9uZW50KHR5cGUpLgotICAgICAqIDxwPgotICAgICAqIElmIHRoaXMgYXR0cmlidXRlIGlzIG5vdCBzZXQsIHRoZW4gdGhlIGJ1aWxkZXIgcGx1Z2luIHdpbGwgbG9vayBmb3IgYQotICAgICAqIGNvbnN0YW50IG9uIHRoZSBjbGFzcyB3aXRoIG5hbWUgQ09NUE9ORU5UX1RZUEUuIEl0IGlzIGFuIGVycm9yIGlmIGEKLSAgICAgKiBjb21wb25lbnQgaGFzIG5vIHN1Y2ggc2V0dGluZy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIHNob3VsZCBvbmx5IGJlIHNldCBvbiBjb25jcmV0ZSBjb21wb25lbnQgY2xhc3NlcyAob3IgY2xhc3NlcyBmb3Igd2hpY2gKLSAgICAgKiBjb2RlIGdlbmVyYXRpb24gY3JlYXRlcyBhIGNvbmNyZXRlIGNvbXBvbmVudCBjbGFzcykuIFRoZSBhdHRyaWJ1dGUgaXMKLSAgICAgKiBub3QgaW5oZXJpdGFibGUuCi0gICAgICovCi0gICAgU3RyaW5nIHR5cGUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSB0aGUgcmVuZGVyZXItdHlwZSBhdHRyaWJ1dGUgdGhhdCAodG9nZXRoZXIgd2l0aCAiZmFtaWx5IikgaXMgdXNlZCB0bwotICAgICAqIGxvb2sgdXAgYSByZW5kZXJlciBmb3IgaW5zdGFuY2VzIG9mIGEgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIFNlZSBhdHRyaWJ1dGUgImZhbWlseSIgZm9yIG1vcmUgZGV0YWlscy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCwgdGhlIGJ1aWxkZXIgcGx1Z2luIGxvb2tzIGZvciBhIGNvbnN0YW50Ci0gICAgICogb24gdGhlIGNsYXNzIHdpdGggbmFtZSBERUZBVUxUX1JFTkRFUkVSX1RZUEUuIEl0IGlzIGFuIGVycm9yIGlmIGEKLSAgICAgKiBjb25jcmV0ZSBjb21wb25lbnQgaGFzIG5vIHN1Y2ggc2V0dGluZyAoYnV0IHRoZSB2YWx1ZSBjYW4gYmUgaW5oZXJpdGVkIGZyb20gYW4KLSAgICAgKiBhbmNlc3RvciBjbGFzcykuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBhdHRyaWJ1dGUgaXMgaW5oZXJpdGFibGUuCi0gICAgICovCi0gICAgU3RyaW5nIGRlZmF1bHRSZW5kZXJlclR5cGUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBjb21wb25lbnQgaXMgYWxsb3dlZCB0byBoYXZlIG90aGVyIFVJQ29tcG9uZW50IGluc3RhbmNlcwotICAgICAqIGFzIGNoaWxkcmVuIChpZSAibmVzdGVkIHdpdGhpbiBpdCIgaW4gYSBwYWdlKS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGluZm9ybWF0aW9uIGNhbiBiZSBpbnNlcnRlZCBpbnRvIC50bGQgZmlsZXMgYW5kIHNpbWlsYXIgdG8gcHJlc2VudAotICAgICAqIHVzZXJzIHdpdGggYW4gZXJyb3IgbWVzc2FnZSBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gZGVmaW5lIGNoaWxkCi0gICAgICogY29tcG9uZW50cyBmb3IgYSBjb21wb25lbnQgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHRoZW0uCi0gICAgICogPHA+Ci0gICAgICogQ29kZSBnZW5lcmF0aW9uIG1pZ2h0IGFsc28gdXNlIHRoaXMgaW5mb3JtYXRpb24gdG8gZW5zdXJlIHRoYXQgYW4gZXhjZXB0aW9uCi0gICAgICogaXMgdGhyb3duIGlmIGFuIGF0dGVtcHQgdG8gYWRkIGNoaWxkIGNvbXBvbmVudHMgb2NjdXJzIGF0IHJ1bnRpbWUuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRoaXMgaXMgcmVsYXRlZCB0bywgYnV0IG5vdCBxdWl0ZSB0aGUgc2FtZSBhcywgdGhlICJib2R5Q29udGVudCIKLSAgICAgKiBhdHRyaWJ1dGUuIFRoYXQgYXR0cmlidXRlIHByZXZlbnRzIGFueXRoaW5nIGJlaW5nIG5lc3RlZCBpbnNpZGUgdGhlIGNvbXBvbmVudAotICAgICAqIGluIHRoZSBwYWdlLCB3aGlsZSB0aGlzIHByZXZlbnRzIFVJQ29tcG9uZW50cyBiZWluZyBuZXN0ZWQuCi0gICAgICogCi0gICAgICogPz8gVE9ETzogYnV0IGluIEpTRjEuMiwgaXNuJ3Qgc3RhdGljIHRleHQgYSB0cmFuc2llbnQgY2hpbGQ/PwotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIGluaGVyaXRhYmxlLgotICAgICAqLwotICAgIGJvb2xlYW4gY2FuSGF2ZUNoaWxkcmVuKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUT0RPOiB0aGlzIGlzIGhvcGVmdWxseSB1bnVzZWQsIGFuZCBjYW4gYmUgZGVsZXRlZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY29tcG9uZW50IHNob3VsZCBub3QgYmUgZGVmaW5lZCBvbiBmYWNlcy1jb25maWcueG1sLgotICAgICAqIEFueXdheSwgaWYgdGhpcyBpcyB0cnVlIG9yIGZhbHNlIGRvZXMgbm90IGhhdmUgYW55IHNpZ25pZmljYXRpdmUgaW1wYWN0LiAKLSAgICAgKi8KLSAgICBib29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgSlNQIFRhZyBjbGFzcyB0aGF0IHNob3VsZCBiZSBnZW5lcmF0ZWQgZm9yIHRoaXMgY29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIEl0IGlzIGFuIGVycm9yIHRvIHNldCB0aGlzIGF0dHJpYnV0ZSBpZiB0aGUgYW5ub3RhdGVkIGNsYXNzIGlzIG5vdCBhCi0gICAgICogY29uY3JldGUgSlNGIGNvbXBvbmVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBUT0RPOiA/IFdIYXQgaGFwcGVucyBpZiBhIGNsYXNzIGlzIGEgY29uY3JldGUgY29tcG9uZW50IGJ1dCB0aGlzIGlzIG5vdAotICAgICAqIHNldD8gSXMgYSB0YWdDbGFzcyBuYW1lIGF1dG9tYXRpY2FsbHkgY3JlYXRlZD8gT3IgaXMgbm8gdGFnIGNsYXNzIGNyZWF0ZWQ/Ci0gICAgICovCi0gICAgU3RyaW5nIHRhZ0NsYXNzKCkgZGVmYXVsdCAiIjsKLSAgICAgCi0gICAgLyoqCi0gICAgICogVGFnIHN1cGVyIGNsYXNzIHRoYXQgdGhlIGdlbmVyYXRlZCB0YWcgY2xhc3MgZXh0ZW5kcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGUgZ2VuZXJhdGVkIHRhZyBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQgbWF5IG5lZWQgdG8gYmUgYSBzdWJjbGFzcyBvZgotICAgICAqIGRpZmZlcmVudCB0YWcgYmFzZSBjbGFzc2VzIGRlcGVuZGluZyB1cG9uIHRoZSB0eXBlIG9mIHRoaXMgY29tcG9uZW50LgotICAgICAqIEZvciBleGFtcGxlLCB0aGUgSlNGIHN0YW5kYXJkIHByb3ZpZGVzIHRoZSBmb2xsb3dpbmcgdGFnIGNsYXNzZXM6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT5VSUNvbXBvbmVudFRhZyAodGhlIGRlZmF1bHQgdGFnIGJhc2UgY2xhc3MpCi0gICAgICogPGxpPlVJQ29tcG9uZW50Qm9keVRhZywgZm9yIHRhZ3MgdGhhdCAibmVlZCB0byBwcm9jZXNzIHRoZWlyIHRhZyBib2RpZXMiLgotICAgICAqIEV4YW1wbGVzIGZyb20gdGhlIEpTRiBzdGFuZGFyZCBhcmUgaDpwYW5lbEdyaWQsIGg6cGFuZWxHcm91cCwgaDpkYXRhVGFibGUsCi0gICAgICogaDpjb2x1bW4uCi0gICAgICogPC91bD4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIG9wdGlvbmFsOyB3aGVuIG5vdCBkZWZpbmVkLCB0aGUgc3RhbmRhcmQgVUlDb21wb25lbnRUYWcgY2xhc3MgaXMKLSAgICAgKiB1c2VkLiBUaGlzIGlzIGFwcHJvcHJpYXRlIGZvciBtb3N0IEpTRiBjb21wb25lbnRzLgotICAgICAqLwotICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0YWcgaGFuZGxlciBjbGFzcyB1c2VkIGZvciB0aGlzIGNvbXBvbmVudCBvbiBmYWNlbGV0cy4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBTdHJpbmcgdGFnSGFuZGxlcigpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIChKU1ApIG9yIG5vdCAoZW1wdHkpLgotICAgICAqLwotICAgIFN0cmluZyBib2R5Q29udGVudCgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogQSBTaG9ydCBkZXNjcmlwdGlvbiBvZiB0aGUgcHVycG9zZSBvZiB0aGlzIFVJQ29tcG9uZW50LgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaW5mb3JtYXRpb24gaXMgb3V0cHV0IGludG8gdGhlIC50bGQgYW5kIGZhY2VzLWNvbmZpZy54bWwgZmlsZXMgYXMgaGVscAotICAgICAqIGZvciB1c2VycyBvZiB0aGlzIGNvbXBvbmVudCwgYW5kIG1heSBiZSBkaXNwbGF5ZWQgYnkgSURFcyBhbmQgc2ltaWxhciB0b29scy4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiBub3Qgc2V0LCB0aGVuIHRoZSBqYXZhZG9jICJzdW1tYXJ5IiBzZW50ZW5jZSBmb3IgdGhlIGNsYXNzIHdpbGwgYmUKLSAgICAgKiB1c2VkLiBJZiB0aGVyZSBpcyBubyBqYXZhZG9jIGZvciB0aGUgY2xhc3MgdGhlbiB0aGUgZGVzY3JpcHRpb24gd2lsbCBiZQotICAgICAqIGFuIGVtcHR5IHN0cmluZyAoYnV0IHRoYXQgd2lsbCBuZXZlciBoYXBwZW4sIHJpZ2h0PykuCi0gICAgICogPHA+Ci0gICAgICogTm90ZSB0aGF0IHRsZCBvciBmYWNlcy1jb25maWcgZmlsZXMgYWxzbyBoYXZlIGEgImxvbmcgZGVzY3JpcHRpb24iIGZpZWxkLgotICAgICAqIFRoYXQgdmFsdWUgaXMgYWx3YXlzIHRoZSBjb21wbGV0ZSBqYXZhZG9jIGZvciB0aGUgY29tcG9uZW50IGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBpbmhlcml0YWJsZS4KLSAgICAgKi8KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogU2VyaWFsIFVJRCB0byBiZSBwdXQgb24gY2xhc3Mgd2hlbiBnZW5lcmF0ZWQuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBzaG91bGQgYmUgc2V0IG9ubHkgZm9yICJjb21wb25lbnQgdGVtcGxhdGUiIGNvZGUgZ2VuZXJhdGlvbiwgaWUKLSAgICAgKiB3aGVyZSB0aGUgc3VwZXJDbGFzcyBhdHRyaWJ1dGUgaXMgc2V0LiBJbiB0aGlzIGNhc2UsIHRoZSBnZW5lcmF0ZWQKLSAgICAgKiBjbGFzcyB3aWxsIGhhdmUgYSBzZXJpYWxWZXJzaW9uVUlEIGNvbnN0YW50IGRlZmluZWQgd2hpY2ggaXMgc2V0IHRvCi0gICAgICogdGhpcyB2YWx1ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUT0RPOiBpcyB0aGlzIHZhbGlkPyBXaHkgY2FuJ3QgdGhlIGNvZGUtZ2VuZXJhdGlvbiBqdXN0IGFkZCBhCi0gICAgICogc2VyaWFsVWlkIHZhbHVlIGJhc2VkIHVwb24gd2hhdCB2ZXJzaW9uIG9mIHRoZSB0ZW1wbGF0ZSB3YXMgdXNlZD8KLSAgICAgKiBNYXliZSBiZWNhdXNlIHRoZSB0ZW1wbGF0ZSBnZW5lcmF0ZXMgZGlmZmVyZW50IHN0dWZmIGJhc2VkIHVwb24KLSAgICAgKiB3aGF0IGF0dHJpYnV0ZXMgYXJlIGRlZmluZWQgaGVyZT8KLSAgICAgKi8KLSAgICBTdHJpbmcgc2VyaWFsdWlkKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbnRlcmZhY2VzIHRoYXQgZ2VuZXJhdGVkIGNsYXNzZXMgc2hvdWxkIGltcGxlbWVudC4KLSAgICAgKiA8cD4KLSAgICAgKiBVc2VkIG9ubHkgd2hlbiAiY29tcG9uZW50IHRlbXBsYXRlIiBjb2RlIGdlbmVyYXRpb24gaXMgdXNlZC4gV2hlbgotICAgICAqIGRlZmluZWQsIHRoZW4gdGhlIGdlbmVyYXRlZCBjbGFzcyB3aWxsIGltcGxlbWVudCB0aGUgbGlzdGVkCi0gICAgICogaW50ZXJmYWNlcyBpbiBhZGRpdGlvbiB0byB0aGUgaW50ZXJmYWNlcyB0aGF0IHRoaXMgYW5ub3RhdGVkIGNsYXNzCi0gICAgICogaW1wbGVtZW50cy4KLSAgICAgKi8KLSAgICBTdHJpbmcgaW1wbGVtZW50eigpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIHBhdHRlcm4gdXNlZCB0byBnZW5lcmF0ZSBjb21wb25lbnQgY2xhc3MgY29kZSBpcwotICAgICAqIHRlbXBsYXRlICh0cnVlKSBvciBzdWJjbGFzcyAoZmFsc2UpLgotICAgICAqLwotICAgIGJvb2xlYW4gdGVtcGxhdGUoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBkZWZhdWx0IGNsaWVudCBldmVudCB0byBiZSByZXR1cm4gb24gbWV0aG9kCi0gICAgICogQ2xpZW50QmVoYXZpb3JIb2xkZXIuZ2V0RGVmYXVsdEV2ZW50TmFtZSgpLiBUaGlzIHByb3BlcnR5IGlzCi0gICAgICogSlNGIDIuMCBzcGVjaWZpYywgYW5kIHRoZSBjb21wb25lbnQgbXVzdCBpbXBsZW1lbnQgCi0gICAgICogamF2YXguZmFjZXMuY29tcG9uZW50LmJlaGF2aW9yLkNsaWVudEJlaGF2aW9ySG9sZGVyIGludGVyZmFjZS4gIAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBkZWZhdWx0RXZlbnROYW1lKCkgZGVmYXVsdCAiIjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkNvbnZlcnRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29udmVydGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNTcwN2IuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGQ29udmVydGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBVc2VkIHRvIGRlZmluZSBhIGpzZiBjb252ZXJ0ZXIuCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGQ29udmVydGVyCi17Ci0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIGNvbnZlcnRlcklkIHdoaWNoIGlkZW50aWZpZXMgdGhpcyBjbGFzcy4gSWYgbm90IGRlZmluZWQsCi0gICAgICogaXQgdHJpZXMgdG8gZ2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgQ09OVkVSVEVSX0lELiAKLSAgICAgKi8KLSAgICBTdHJpbmcgaWQoKSBkZWZhdWx0ICIiOwotCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbiBhIHBhZ2UgKGV4OiB4Om15Y29tcCkuCi0gICAgICovCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotCi0gICAgLyoqCi0gICAgICogVGhlIHRhZyBjbGFzcyB1c2VkIGZvciB0aGlzIGNvbnZlcnRlciwgaWYgYXBwbGllcy4KLSAgICAgKi8KLSAgICBTdHJpbmcgdGFnQ2xhc3MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRhZyBzdXBlciBjbGFzcyB0aGF0IGluaGVyaXRzIHRoZSB0YWcgY2xhc3MKLSAgICAgKi8KLSAgICBTdHJpbmcgdGFnU3VwZXJjbGFzcygpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY29tcG9uZW50IHNob3VsZCBub3QgYmUgZGVmaW5lZCBvbiBmYWNlcy1jb25maWcueG1sLgotICAgICAqIEFueXdheSwgaWYgdGhpcyBpcyB0cnVlIG9yIGZhbHNlIGRvZXMgbm90IGhhdmUgYW55IHNpZ25pZmljYXRpdmUgaW1wYWN0LiAKLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuCi0gICAgICovCi0gICAgYm9vbGVhbiBjb25maWdFeGNsdWRlZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNlcmlhbCB1aWQgdGhhdCBzaG91bGQgYmUgYWRkZWQgb24gZ2VuZXJhdGVkIHRhZyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBzZXJpYWx1aWR0YWcoKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRXhjbHVkZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRXhjbHVkZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzdjYzlmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkV4Y2x1ZGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIEluZGljYXRlIHRoYXQgdGhpcyBjb2RlIG11c3QgYmUgZXhjbHVkZWQgZnJvbSBjb3B5aW5nIHdoZW4gZ2VuZXJhdGlvbiB1c2luZyBhIAotICogdGVtcGxhdGUgcGFja2FnZSBzY29wZWQgY2xhc3MgaXMgdXNlZC4gCi0gKiAKLSAqIFRISVMgT05MWSBTSE9VTEQgQkUgVVNFRCBJTiBWRVJZIFNQRUNJQUwgQ0FTRVMgCi0gKiAKLSAqIChVc2UgYWJzdHJhY3QgcGF0dGVybiB0byBhZGQgY3VzdG9tIGNvZGUgb24gY29tcG9uZW50IGNsYXNzIGluc3RlYWQpLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQodmFsdWU9ewotICAgICAgICBFbGVtZW50VHlwZS5UWVBFLAotICAgICAgICBFbGVtZW50VHlwZS5NRVRIT0QsCi0gICAgICAgIEVsZW1lbnRUeXBlLkxPQ0FMX1ZBUklBQkxFLAotICAgICAgICBFbGVtZW50VHlwZS5GSUVMRCwKLSAgICAgICAgRWxlbWVudFR5cGUuQ09OU1RSVUNUT1J9KQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGRXhjbHVkZQotewotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0QXR0cmlidXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0QXR0cmlidXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyZDU1NDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIAotICogRGVmaW5lIGEgZmFjZWxldCB0YWcgYXR0cmlidXRlLiBUaGlzIGRvY2xldCBzaG91bGQgYmUgdXNlZCBpbnNpZGUgYSBASlNGRmFjZWxldFRhZyBjbGFzcywgCi0gKiB0byBkZWZpbmUgaW5kaXZpZHVhbCB0YWcgY2xhc3NlcyB1c2VkIGluIEpTRgotICogCi0gKiBUaGlzIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBqc2YgMi4wIGxpYnJhcmllcy4KLSAqIAotICogQHNpbmNlIDEuMC40Ci0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQodmFsdWU9ewotICAgICAgICBFbGVtZW50VHlwZS5UWVBFLAotICAgICAgICBFbGVtZW50VHlwZS5NRVRIT0QsCi0gICAgICAgIEVsZW1lbnRUeXBlLkxPQ0FMX1ZBUklBQkxFLAotICAgICAgICBFbGVtZW50VHlwZS5GSUVMRAotICAgICAgICB9KQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGRmFjZWxldEF0dHJpYnV0ZQotewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIG5hbWUgb24gdGhlIHRsZAotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3Mgb3IgdHlwZSB0aGUgY29tcG9uZW50IG11c3QgcmVmZXIgb24gdGhlIHRhZyBjbGFzcy4gCi0gICAgICogT24gMS4xIGlzIGphdmEubGFuZy5TdHJpbmcgYWx3YXlzIGFuZCBvbiAxLjIgaXMgCi0gICAgICogamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIG9yIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGNsYXNzTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9uZyBkZXNjcmlwdGlvbi4gQnkgZGVmYXVsdCwgaXQgdGFrZXMgd2hhdCBpcyBpbnNpZGUgY29tbWVudCBhcmVhLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBUaGlzIHZhbHVlIGlzIHB1dCBvbiB0aGUgdGxkIHdoZW4gYXBwbGllcyAKLSAgICAgKiBhbmQgY2xhc3NOYW1lIGlzIG5vdCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gb3IgCi0gICAgICogamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBib29sZWFuIHJ0ZXhwcnZhbHVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSB0eXBlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gdG8gYXBwbHkgaXQuIAotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIHRvIGFwcGx5IGl0LiAKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIFN0cmluZyBkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFyayB0aGlzIHByb3BlcnR5IHRvIG5vdCBiZSBpbmNsdWRlZCBvbiB0aGUgdGxkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIGJvb2xlYW4gZXhjbHVkZSgpIGRlZmF1bHQgZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0QXR0cmlidXRlcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjY1MmJhYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0QXR0cmlidXRlcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogRGVmaW5lIGEgc2V0IG9mIHByb3BlcnRpZXMgdXNlZCB0byBncm91cCBzZXZlcmFsIGRlZmluaXRpb25zCi0gKiBvZiBKU0ZGYWNlbGV0QXR0cmlidXRlIGFubm90YXRpb25zLgotICogCi0gKiBUaGlzIGFubm90YXRpb24gc2hvdWxkIG9ubHkgYmUgdXNlZCBpbiBqc2YgMi4wIGxpYnJhcmllcy4KLSAqIAotICogQHNpbmNlIDEuMC40Ci0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkZhY2VsZXRBdHRyaWJ1dGVzCi17Ci0KLSAgICAvKioKLSAgICAgKiBBcnJheSBvZiBKU0ZGYWNlbGV0QXR0cmlidXRlIHRvIGJlIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgSlNGRmFjZWxldEF0dHJpYnV0ZSBbXSBhdHRyaWJ1dGVzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0VGFnLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0VGFnLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZDA5ODYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFVzZWQgdG8gZGVmaW5lIGEganNmIGZhY2VsZXQgdGFnIGhhbmRsZXIuIAotICogPHA+Ci0gKiBUaGUgaW50ZW50aW9uIG9mIHRoaXMgYW5ub3RhdGlvbiBpcyB1c2UgaXRzIGluZm9ybWF0aW9uIHRvIGdlbmVyYXRlIGEKLSAqIGZhY2VsZXQgdGFnbGliIHhtbCBmaWxlKG9wdGlvbmFsKSwgYW5kIGNyZWF0ZSBhIHNwZWNpZmljIAotICogZmFjZWxldCBkb2N1bWVudGF0aW9uIChnZW5lcmF0ZSBhbHRlcm5hdGUgLnRsZCBmaWxlcyBhbmQgdXNlIAotICogbWF2ZW4tdGFnbGliLXBsdWdpbiBvbiB0aGVzZSBmaWxlcykuCi0gKiBJbiBvcmRlciB0byBkbyB0aGF0LCB0aGlzIGFubm90YXRpb24gaGFzIG11bHRpcGxlIHVzZSBjYXNlczoKLSAqIDwvcD4KLSAqIDx1bD4KLSAqIDxsaT5EZWZpbmUgYSBjb21wb25lbnQgb25seSBhdmFpbGFibGUgb24gZmFjZWxldHMuPC9saT4KLSAqIDxsaT5XaGVuIGEgY29tcG9uZW50IGhhcyBhZGRpdGlvbmFsIHByb3BlcnRpZXMgb25seSBhdmFpbGFibGUgb24gZmFjZWxldHMuCi0gKiBJbiB0aGlzIGNhc2UsIHdlIHNldCBjb21wb25lbnRDbGFzcy9jb252ZXJ0ZXJDbGFzcy92YWxpZGF0b3JDbGFzcy90YWdDbGFzcyBhdHRyaWJ1dGUuCi0gKiBUaGUgZWZmZWN0IGlzIHRoYXQgYWxsIHByb3BlcnRpZXMgYW5kIGRlc2NyaXB0aW9ucyBhcmUgZmxhdHRlbmVkIHRvIHRoaXMgY2xhc3MuIEluIG90aGVyCi0gKiB3b3Jkcywgd2hlbiB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgYW5ub3RhdGVkIGZhY2VsZXQgdGFnIGhhbmRsZXIgaXMgZ2VuZXJhdGVkLCAKLSAqIHRoaXMgaW5mb3JtYXRpb24gcHJlY2VkZXMgdGhlIG9uZSBwb2ludGVkIGJ5IHRoZSBhbm5vdGF0aW9uLiBUaGlzIG9ubHkgaGFwcGVucyB3aGVuCi0gKiBuYW1lIGF0dHJpYnV0ZSBtYXRjaC48L2xpPgotICogPGxpPldoZW4gYSBjb21wb25lbnQgZG9lcyBub3QgaGF2ZSBhbiBzcGVjaWZpYyB0YWcgaGFuZGxlciwgc28gd2UgY2FuIGNyZWF0ZQotICogYSBkdW1teSB0YWcgaGFuZGxlciwgYW5ub3RhdGUgaXQgYW5kIHNldCBjb25maWdFeGNsdWRlZD10cnVlLCBzbyB3ZSBjYW4gCi0gKiBkb2N1bWVudCBpdCBpbnN0ZWFkIHB1dCB0aGlzIGluZm9ybWF0aW9uIG9uIHRoZSBiYXNlIHRsZCB1c2VkIHRvIGdlbmVyYXRlLgotICogVGhpcyBpcyB0aGUgY2FzZSBvZiBoOm91dHB1dFNjcmlwdCBvciBoOm91dHB1dFN0eWxlc2hlZXQ8L2xpPgotICogPC91bD4KLSAqIAotICogVGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4ganNmIDIuMCBsaWJyYXJpZXMuCi0gKiAKLSAqIEBzaW5jZSAxLjAuNAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZGYWNlbGV0VGFnCi17Ci0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIG9yIG5vdC4gKEpTUCBvciBlbXB0eSkKLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIExvbmcgZGVzY3JpcHRpb24uIEJ5IGRlZmF1bHQsIGl0IHRha2VzIHdoYXQgaXMgaW5zaWRlIGNvbW1lbnQgYXJlYS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uKCkgZGVmYXVsdCAiIjsgICAgCi0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgb2YgdGhlIGNvbXBvbmVudCBpbiBhIHBhZ2UgKGV4OiB4Om15Y29tcCkuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBmYWNlbGV0IHRhZyBoYW5kbGVyIHNob3VsZCBub3QgYmUgZGVmaW5lZCAKLSAgICAgKiBvbiBmYWNlbGV0cyB0YWdsaWIgeG1sIGZpbGUuCi0gICAgICogTm90ZSB0aGF0IGZvciBzb21lIGxpYnJhcmllcyBhIHhtbCBmaWxlIGlzIG5vdCBnZW5lcmF0ZWQgCi0gICAgICogKGxpa2UgaW4gY29yZSAyLjApLCBpbnN0ZWFkIGEgbGlicmFyeSBjbGFzcyBpcyBkZWZpbmVkLCAKLSAgICAgKiBzbyBpbiB0aG9zZSBjYXNlcyBzZXQgdGhpcyB2YWx1ZSBoYXMgbm8gZWZmZWN0LgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuNAotICAgICAqLwotICAgIGJvb2xlYW4gY29uZmlnRXhjbHVkZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBtb3N0IG5lYXIganNwIHRhZyBjbGFzcyB3aGVyZSBhbGwKLSAgICAgKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGlzIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIHRhZ0NsYXNzKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbW9zdCBuZWFyIGNvbXBvbmVudCBjbGFzcyB3aGVyZSBhbGwKLSAgICAgKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGlzIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGNvbXBvbmVudENsYXNzKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbW9zdCBuZWFyIGNvbXBvbmVudCBjbGFzcyB3aGVyZSBhbGwKLSAgICAgKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGlzIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIGNvbnZlcnRlckNsYXNzKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgbW9zdCBuZWFyIGNvbXBvbmVudCBjbGFzcyB3aGVyZSBhbGwKLSAgICAgKiBhdHRyaWJ1dGVzIHNob3VsZCBiZSBpbmhlcml0ZWQgZnJvbSB0aGlzIGNsYXNzCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzKCkgZGVmYXVsdCAiIjsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0VGFncy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZWxldFRhZ3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ2ZjhmNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNlbGV0VGFncy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogRGVmaW5lIGEgc2V0IG9mIHRhZ3MgdGhhdCB1c2VzIHRoZSB0YWcgaGFuZGxlciBjbGFzcyBhbm5vdGF0ZWQuCi0gKiA8cD4KLSAqIEluIGpzcCwgZWFjaCB0YWcgKHJlYWQgaXQgYXMgY29tcG9uZW50L2NvbnZlcnRlci92YWxpZGF0b3IvdGFnKQotICogaGFzIG9uZSBzcGVjaWZpYyB0YWcgZmlsZSB0aGF0IG9ubHkgd29ya3MgZm9yLiBCdXQgaW4gZmFjZWxldHMsCi0gKiBvbmUgdGFnIGhhbmRsZXIgY291bGQgdGFrZSBjYXJlIG9mIG11bHRpcGxlIHRhZ3MuIAotICogPC9wPgotICogPHA+Ci0gKiBUaGlzIHRhZyBpcyB1c2VkIHRvIGdyb3VwIHNldmVyYWwgSlNGRmFjZWxldFRhZyBkZWZpbml0aW9ucyBhbmQKLSAqIGluZGljYXRlIHRoYXQgdGhlIHRhZyBoYW5kbGVyIGFubm90YXRlZCBieSB0aGlzIGFubm90YXRpb25zIGhhbmRsZQotICogdGhlIHNlbGVjdGVkIHRhZ3MuCi0gKiA8L3A+Ci0gKiA8cD4KLSAqIFRoaXMgYW5ub3RhdGlvbiBzaG91bGQgb25seSBiZSB1c2VkIGluIGpzZiAyLjAgbGlicmFyaWVzLgotICogPC9wPgotICogCi0gKiBAc2luY2UgMS4wLjQKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGRmFjZWxldFRhZ3MKLXsKLQotICAgIC8qKgotICAgICAqIEFycmF5IG9mIEpTRkZhY2VsZXRUYWdzIHRvIGJlIGRlZmluZWQuCi0gICAgICogCi0gICAgICogQHNpbmNlIDEuMC40Ci0gICAgICovCi0gICAgSlNGRmFjZWxldFRhZyBbXSB0YWdzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGRmFjZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGM1ZjQ3Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZGYWNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogSW5kaWNhdGUgdGhhdCB0aGlzIG1ldGhvZCBpcyBhIGZhY2V0IG1ldGhvZC4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkZhY2V0Ci17Ci0KLSAgICAvKioKLSAgICAgKiAodHJ1ZXxmYWxzZSkgRGVmaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZCBvciBub3QuIERlZmF1bHQ6ZmFsc2UKLSAgICAgKi8KLSAgICBib29sZWFuIHJlcXVpcmVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwQXR0cmlidXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BBdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQ1ODA4Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BBdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIAotICogRGVmaW5lIGEgdGFnIGF0dHJpYnV0ZS4gVGhpcyBkb2NsZXQgc2hvdWxkIGJlIHVzZWQgaW5zaWRlIGEgQEpTRkpzcFRhZyBjbGFzcywgCi0gKiB0byBkZWZpbmUgaW5kaXZpZHVhbCB0YWcgY2xhc3NlcyB1c2VkIGluIEpTRiwgbGlrZSBmOnZlcmJhdGltIG9yIGY6YWN0aW9uTGlzdGVuZXIKLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLk1FVEhPRCkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkpzcEF0dHJpYnV0ZQotewotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUuIFRoaXMgaXMgdGhlIG5hbWUgb24gdGhlIHRsZAotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgY2xhc3Mgb3IgdHlwZSB0aGUgY29tcG9uZW50IG11c3QgcmVmZXIgb24gdGhlIHRhZyBjbGFzcy4gCi0gICAgICogT24gMS4xIGlzIGphdmEubGFuZy5TdHJpbmcgYWx3YXlzIGFuZCBvbiAxLjIgaXMgCi0gICAgICogamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIG9yIGphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24uCi0gICAgICovCi0gICAgU3RyaW5nIGNsYXNzTmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTG9uZyBkZXNjcmlwdGlvbi4gQnkgZGVmYXVsdCwgaXQgdGFrZXMgd2hhdCBpcyBpbnNpZGUgY29tbWVudCBhcmVhLgotICAgICAqLwotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24oKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBUaGlzIHZhbHVlIGlzIHB1dCBvbiB0aGUgdGxkIHdoZW4gYXBwbGllcyAKLSAgICAgKiBhbmQgY2xhc3NOYW1lIGlzIG5vdCBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gb3IgCi0gICAgICogamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbi4KLSAgICAgKi8KLSAgICBib29sZWFuIHJ0ZXhwcnZhbHVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSB0eXBlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24gdG8gYXBwbHkgaXQuIAotICAgICAqCi0gICAgICogQHNpbmNlIDEuMC4zCi0gICAgICovCi0gICAgU3RyaW5nIGRlZmVycmVkVmFsdWVUeXBlKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHRoYXQgdmFsdWVzIHNob3VsZCBiZQotICAgICAqIGNhc3Qgb24gdGxkLiBJdCBpcyBzdXBwb3NlZCB0aGF0IHRoZSBjbGFzc05hbWUgaXMKLSAgICAgKiBqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIHRvIGFwcGx5IGl0LiAKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBkZWZlcnJlZE1ldGhvZFNpZ25hdHVyZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogTWFyayB0aGlzIHByb3BlcnR5IHRvIG5vdCBiZSBpbmNsdWRlZCBvbiB0aGUgdGxkLgotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIGJvb2xlYW4gZXhjbHVkZSgpIGRlZmF1bHQgZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0aWVzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BQcm9wZXJ0aWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiYzA2NmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydGllcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogRGVmaW5lIGEgc2V0IG9mIHByb3BlcnRpZXMgdXNlZCB0byBncm91cCBzZXZlcmFsIGRlZmluaXRpb25zCi0gKiBvZiBKU0ZKc3BQcm9wZXJ0eSBhbm5vdGF0aW9ucy4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZKc3BQcm9wZXJ0aWVzCi17Ci0KLSAgICAvKioKLSAgICAgKiBBcnJheSBvZiBKU0ZKc3BQcm9wZXJ0aWVzIHRvIGJlIGRlZmluZWQuCi0gICAgICovCi0gICAgSlNGSnNwUHJvcGVydHkgW10gcHJvcGVydGllcygpOwotICAgIAotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydHkuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2ZDg3ZTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGSnNwUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBEZWZpbmVzIGEgbG9naWNhbCBwcm9wZXJ0eSBvZiBhIGNvbXBvbmVudCB0aGF0IGlzIGFjY2Vzc2VkIHZpYSB0aGUKLSAqIGNvbXBvbmVudCdzIEF0dHJpYnV0ZXMgbWFwLCByYXRoZXIgdGhhbiBqYXZhQmVhbiBnZXR0ZXIvc2V0dGVyIG1ldGhvZHMuCi0gKiA8cD4KLSAqIFRoZXNlIGxvZ2ljYWwgcHJvcGVydGllcyBhcmUgYWNjZXNzaWJsZSBmcm9tIHZpZXdzIChlZyBhdmFpbGFibGUgYXMKLSAqIEpTUCB0YWcgYXR0cmlidXRlcykganVzdCBsaWtlIHByb3BlcnRpZXMgZGVjbGFyZWQgd2l0aCB0aGUgSlNGUHJvcGVydHkKLSAqIGFubm90YXRpb24uCi0gKiA8cD4KLSAqIEEgY2xhc3Mgb3IgaW50ZXJmYWNlIHRoYXQgZGVmaW5lcyBqdXN0IG9uZSBsb2dpY2FsIHByb3BlcnR5IG1heSB1c2UgdGhpcwotICogYW5ub3RhdGlvbiBkaXJlY3RseTsgdG8gZGVjbGFyZSBtb3JlIHRoYW4gb25lIGxvZ2ljYWwgcHJvcGVydHkgc2hvdWxkCi0gKiB1c2UgdGhlIEpTRkpzcFByb3BlcnRpZXMgYW5ub3RhdGlvbiB0byBncm91cCBhIHNldCBvZiB0aGVzZS4gQ2xhc3NlcyB0aGF0Ci0gKiBpbXBsZW1lbnQgaW50ZXJmYWNlcyB3aXRoIHRoaXMgYW5ub3RhdGlvbiwgb3Igc3ViY2xhc3MgYSBiYXNlIGNsYXNzIHRoYXQKLSAqIGhhcyB0aGlzIGFubm90YXRpb24sIHdpbGwgaW5oZXJpdCB0aGUgZGVjbGFyZWQgYXR0cmlidXRlcy4KLSAqIDxwPgotICogVGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGFwcGxpZWQgdG8gY2xhc3NlcyB0aGF0IGFsc28gaGF2ZSB0aGUgSlNGQ29tcG9uZW50Ci0gKiBhbmQgSlNGVmFsaWRhdG9yIGFubm90YXRpb24uCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGSnNwUHJvcGVydHkKLXsKLQotICAgIC8qKgotICAgICAqIFRoZSBuYW1lIHRoYXQgaWRlbnRpZmllcyB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIFN0cmluZyBpcyB0aGUga2V5IHVzZWQgdG8gbG9vayB1cCB0aGUgYXR0cmlidXRlIGluIHRoZSBjb21wb25lbnQncwotICAgICAqIEF0dHJpYnV0ZXMgbWFwLgotICAgICAqIDxwPgotICAgICAqIEV4YW1wbGVzOiBib3JkZXIsIGlkLCB2YWx1ZQotICAgICAqLwotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgdHlwZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiBhIGphdmEgdHlwZS4KLSAgICAgKiA8cD4KLSAgICAgKiBUT0RPOiBkb2Vzbid0IHRoZSBKU0Ygc3BlYyBhbHNvIGFsbG93IHNob3J0LWN1dHMgZm9yIGNvbW1vbiB0eXBlcyBoZXJlPwotICAgICAqLwotICAgIFN0cmluZyByZXR1cm5UeXBlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgd2hldGhlciB0aGlzIGF0dHJpYnV0ZSBpcyBtYW5kYXRvcnkgZm9yIHRoZSBhc3NvY2lhdGVkIGNvbXBvbmVudCwKLSAgICAgKiBpZSB3aGV0aGVyIGl0IGlzIGFuIGVycm9yIHRvIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY29tcG9uZW50IGFuZAotICAgICAqIG5vdCB0byBwcm92aWRlIGEgdmFsdWUgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSBpZiB0aGlzIHRhZyBpcyBleGNsdWRlZCBmcm9tIHRsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGlzIHZlcnkgdWdseSBmZWF0dXJlLCBhbmQgc2hvdWxkIGJlIHVzZWQgYXMgbGl0dGxlIGFzIHBvc3NpYmxlLiBJdAotICAgICAqIGFsbG93cyBhIHBhcmVudCBjbGFzcyAob3IgaW50ZXJmYWNlKSB0byBkZWNsYXJlIGxvZ2ljYWwgcHJvcGVydGllcywgdGhlbgotICAgICAqIGEgc3ViY2xhc3MgdG8gInVuZGVjbGFyZSIgdGhlbS4gVGhpcyBpcyBjb21wbGV0ZWx5IGJyb2tlbiBPTyBkZXNpZ24sCi0gICAgICogYnV0IGlzIHJlcXVpcmVkIGluIGEgZmV3IHJhcmUgY2FzZXMgYnkgdGhlIEpTRiBzcGVjaWZpY2F0aW9uLiAKLSAgICAgKi8KLSAgICBib29sZWFuIHRhZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhlIHB1cnBvc2Ugb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAgICogPHA+Ci0gICAgICogVGhpcyBpcyBjb21tb25seSBzaG93biBhcyBoZWxwIGluIElERXMuCi0gICAgICovCi0gICAgU3RyaW5nIGxvbmdEZXNjKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBBIHNob3J0IGRlc2NyaXB0aW9uIG9mIHRoZSBwdXJwb3NlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgICAqIDxwPgotICAgICAqIFRoaXMgaXMgY29tbW9ubHkgc2hvd24gYXMgYSAidG9vbCB0aXAiIG9yIHBvcHVwLWhlbHAgaW4gSURFcy4KLSAgICAgKi8KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZKc3BUYWcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFRhZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYjc3ODE0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkpzcFRhZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmJ1aWxkZXIuYW5ub3RhdGlvbjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogVXNlZCB0byBkZWZpbmUgYSBqc2YgdGFnIHRoYXQgZG9lcyBub3QgZmFsbCBpbiBhIGNhdGVnb3J5IGxpa2UgY29udmVydGVyLCB2YWxpZGF0b3IKLSAqIG9yIGNvbXBvbmVudC4gRXhhbXBsZXMgYXJlIGY6dmVyYmF0aW0gb3IgZjphY3Rpb25MaXN0ZW5lcgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRkpzcFRhZwotewotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBlbGVtZW50IGFjY2VwdCBpbm5lciBlbGVtZW50cyBvciBub3QuCi0gICAgICovCi0gICAgU3RyaW5nIGJvZHlDb250ZW50KCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZSAoZXg6IHg6bXljb21wKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGFnIGhhbmRsZXIgY2xhc3MgdXNlZCBmb3IgdGhpcyBjb21wb25lbnQgb24gZmFjZWxldHMuCi0gICAgICogCi0gICAgICovCi0gICAgU3RyaW5nIHRhZ0hhbmRsZXIoKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGTGlzdGVuZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRkxpc3RlbmVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4NzlmZWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGTGlzdGVuZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIEBzaW5jZSAxLjAuNCANCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3I6IGx1NDI0MiAkKQ0KLSAqIEB2ZXJzaW9uICRSZXZpc2lvbjogNzk2NjA3ICQgJERhdGU6IDIwMDktMDctMjEgMjI6MDA6MzAgLTA1MDAgKG1hciwgMjEganVsIDIwMDkpICQNCi0gKi8NCi1ARG9jdW1lbnRlZA0KLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQ0KLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkNCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZMaXN0ZW5lcg0KLXsgICANCi0gICAgU3RyaW5nIG5hbWUoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgU3RyaW5nIGV2ZW50KCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiAodHJ1ZXxmYWxzZSkgRGVmaW5lIGlmIHRoZSBwcm9wZXJ0eSBpcyByZXF1aXJlZCBvciBub3QuIERlZmF1bHQ6ZmFsc2UNCi0gICAgICovDQotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uDQotICAgICAqLw0KLSAgICBTdHJpbmcgZGVzYygpIGRlZmF1bHQgIiI7DQotDQotICAgIFN0cmluZyBjbGF6eigpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICBTdHJpbmcgcGhhc2VzKCkgZGVmYXVsdCAiIjsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUHJvcGVydHkuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlByb3BlcnR5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4N2E2NDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUHJvcGVydHkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBEZWZpbmUgdGhhdCB0aGlzIGdldHRlciBvciBzZXR0ZXIgbWV0aG9kIGRlZmluZSBhIHByb3BlcnR5LgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuTUVUSE9EKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGUHJvcGVydHkKLXsKLQotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBEZWZpbmUgaWYgdGhlIHByb3BlcnR5IGlzIHJlcXVpcmVkIG9yIG5vdC4gRGVmYXVsdDpmYWxzZQotICAgICAqLwotICAgIGJvb2xlYW4gcmVxdWlyZWQoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIGlmIHRoZSBwcm9wZXJ0eSBpcyBub3Qgc2F2ZWQgYW5kIHJlc3RvcmVkIGl0cyBzdGF0ZS4KLSAgICAgKi8KLSAgICBib29sZWFuIGlzdHJhbnNpZW50KCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBVc2Ugc2F2ZUF0dGFjaGVkWFhYIGFuZCByZXN0b3JlQXR0YWNoZWRYWFggdG8gc2F2ZSBhbmQgcmVzdG9yZSBzdGF0ZQotICAgICAqLwotICAgIGJvb2xlYW4gc3RhdGVIb2xkZXIoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhlIGdldHRlciBhbmQgc2V0dGVyIGRvZXMgbm90IGV2YWx1YXRlIEVMIG9yIFZhbHVlQmluZGluZyBleHByZXNzaW9ucy4KLSAgICAgKi8KLSAgICBib29sZWFuIGxpdGVyYWxPbmx5KCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgaWYgdGhpcyB0YWcgaXMgZXhjbHVkZWQgZnJvbSB0bGQuCi0gICAgICovCi0gICAgYm9vbGVhbiB0YWdFeGNsdWRlZCgpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgaXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBhIG1ldGhvZCBsaWtlCi0gICAgICogZ2V0TG9jYWxYWFggdG8gcmV0cmlldmUgdGhlIGxvY2FsIHZhbHVlIG9mIHRoZSBwcm9wZXJ0eQotICAgICAqIGRpcmVjdGx5ICh3aXRob3V0IGV2YWx1YXRlIFZhbHVlQmluZGluZyBvciBWYWx1ZUV4cHJlc3Npb24pLgotICAgICAqIAotICAgICAqIElmIHRoZXJlIGlzIG5vIGdlbmVyYXRpb24gb2YgY29tcG9uZW50IGNsYXNzIHRoaXMgcHJvcGVydHkKLSAgICAgKiBoYXMgYW55IGVmZmVjdC4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBib29sZWFuIGxvY2FsTWV0aG9kKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBEZWZpbmUgdGhlIHNjb3BlIHRvIGJlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIHRoZSBtZXRob2QgZ2V0TG9jYWxYWFguCi0gICAgICogCi0gICAgICogVGhlIGRlZmF1bHQgdG8gYmUgYXBwbGllZCBpcyAicHJvdGVjdGVkIi4KLSAgICAgKiAKLSAgICAgKi8KLSAgICBTdHJpbmcgbG9jYWxNZXRob2RTY29wZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgaXQgc2hvdWxkIGJlIGdlbmVyYXRlZCBhIG1ldGhvZCBsaWtlCi0gICAgICogaXNTZXRYWFgsIHVzZWQgd2hlbiBpdCBpcyBuZWNlc3NhcnkgdG8gY2hlY2sgaWYgYSBib29sZWFuIHR5cGUKLSAgICAgKiBwcm9wZXJ0eSB3YXMgc2V0IHByb2dyYW1hdGljYWxseSAodXNpbmcgc2V0WFhYIG1ldGhvZCkgb3Igbm90LiAKLSAgICAgKiAKLSAgICAgKiBJZiB0aGVyZSBpcyBubyBnZW5lcmF0aW9uIG9mIGNvbXBvbmVudCBjbGFzcyB0aGlzIHByb3BlcnR5Ci0gICAgICogaGFzIGFueSBlZmZlY3QuCi0gICAgICovCi0gICAgYm9vbGVhbiBzZXRNZXRob2QoKSBkZWZhdWx0IGZhbHNlOwotICAgIAotICAgIC8qKgotICAgICAqIERlZmluZSB0aGUgc2NvcGUgdG8gYmUgdXNlZCB3aGVuIGdlbmVyYXRpbmcgdGhlIG1ldGhvZCBpc1NldFhYWC4KLSAgICAgKiAKLSAgICAgKiBUaGUgZGVmYXVsdCB0byBiZSBhcHBsaWVkIGlzICJwcm90ZWN0ZWQiLgotICAgICAqIAotICAgICAqLwotICAgIFN0cmluZyBzZXRNZXRob2RTY29wZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIG5hbWUgdXNlZCBpbiBqc3AgcGFnZXMgdG8gbWFrZSByZWZlcmVuY2UgdG8gdGhpcwotICAgICAqIHByb3BlcnR5ICh1c2VkIG9uIHRsZCkuCi0gICAgICovCi0gICAgU3RyaW5nIGpzcE5hbWUoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqICh0cnVlfGZhbHNlKSBUaGlzIHZhbHVlIGlzIHB1dCBvbiB0aGUgdGxkIHdoZW4gYXBwbGllcy4KLSAgICAgKi8KLSAgICBib29sZWFuIHJ0ZXhwcnZhbHVlKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSBpZiB0aGlzIHByb3BlcnR5IGlzIGluaGVyaXRlZCBmcm9tIGEgcGFyZW50IHRhZyBjbGFzcyBvciBub3QuCi0gICAgICogCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIGJvb2xlYW4gaW5oZXJpdFRhZygpIGRlZmF1bHQgZmFsc2U7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgcmV0dXJuIHR5cGUgZm9yIE1ldGhvZEJpbmRpbmcgb3IgTWV0aG9kRXhwcmVzc2lvbiBpdCB1c2VzCi0gICAgICovCi0gICAgU3RyaW5nIHJldHVyblNpZ25hdHVyZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBDU1YgZnVsbCBuYW1lcyBvZiB0aGUgdHlwZXMgdGhhdCBhcmUgcGFyYW1zIGZvciBtZXRob2RzIHVzaW5nIHRoaXMgTWV0aG9kQmluZGluZyBvciBNZXRob2RFeHByZXNzaW9uIHBhcmFtCi0gICAgICovCi0gICAgU3RyaW5nIG1ldGhvZFNpZ25hdHVyZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGRlZmF1bHQgdmFsdWUgdG8gc2V0IGlmIHRoaXMgcHJvcGVydHkgaXMgZ2VuZXJhdGVkLgotICAgICAqLwotICAgIFN0cmluZyBkZWZhdWx0VmFsdWUoKSBkZWZhdWx0ICIiOwotCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgdGhlIHR5cGUgdGhhdCB2YWx1ZXMgc2hvdWxkIGJlIGNhc3Qgb24gdGxkLiAKLSAgICAgKiBUaGlzIHBhcmFtIG9ubHkgYXBwbGllcyBvbiBqc2YgMS4yIChpdCBpcyBzdXBwb3NlZCB0aGF0IAotICAgICAqIHRoZSBjbGFzc05hbWUgaXMgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIHRvIGFwcGx5IGl0KSwKLSAgICAgKiBiZWNhdXNlIGluIGpzZiAxLjEsIHZhbHVlcyBvbiB0YWcgY2xhc3MgYXJlIGNvbnNpZGVyZWQgCi0gICAgICogdG8gYmUgU3RyaW5nLiAKLSAgICAgKgotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBkZWZlcnJlZFZhbHVlVHlwZSgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIGNsaWVudCBldmVudCB0aGF0IHNob3VsZAotICAgICAqIGJlIHJldHVybmVkIGJ5IENsaWVudEJlaGF2aW9ySG9sZGVyLmdldEV2ZW50TmFtZXMoKS4gVGhpcwotICAgICAqIHByb3BlcnR5IGlzIGJ5IGRlZmF1bHQgIiIsIGl0IGlzIEpTRiAyLjAgc3BlY2lmaWMsIGFuZCAKLSAgICAgKiB0aGUgY29tcG9uZW50IGhvbGRpbmcgaXQgbXVzdCBpbXBsZW1lbnQgCi0gICAgICogamF2YXguZmFjZXMuY29tcG9uZW50LmJlaGF2aW9yLkNsaWVudEJlaGF2aW9ySG9sZGVyIGludGVyZmFjZS4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjQKLSAgICAgKi8KLSAgICBTdHJpbmcgY2xpZW50RXZlbnQoKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUmVuZGVyS2l0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQyYmMzZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJLaXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFRoZSByZW5kZXJLaXRJZCB0aGF0IGlkZW50aWZpZXMgdGhpcyBSZW5kZXJLaXQuIFRoaXMgaXMgcmVnaXN0ZXJlZCBvbiBmYWNlcy1jb25maWcueG1sLgotICogCi0gKiBAYXV0aG9yIExlb25hcmRvIFVyaWJlIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotQERvY3VtZW50ZWQKLUBUYXJnZXQoRWxlbWVudFR5cGUuVFlQRSkKLUBSZXRlbnRpb24oUmV0ZW50aW9uUG9saWN5LlNPVVJDRSkKLXB1YmxpYyBAaW50ZXJmYWNlIEpTRlJlbmRlcktpdAotewotICAgIC8qKgotICAgICAqIFRoZSByZW5kZXJLaXRJZCByZWxhdGVkIHRvIHRoaXMgY2xhc3MgCi0gICAgICovCi0gICAgU3RyaW5nIHJlbmRlcktpdElkKCkgZGVmYXVsdCAiIjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcmVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmVhY2ViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlJlbmRlcmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uYnVpbGRlci5hbm5vdGF0aW9uOwotCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRG9jdW1lbnRlZDsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5FbGVtZW50VHlwZTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uUG9saWN5OwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlRhcmdldDsKLQotLyoqCi0gKiBJbmRpY2F0ZSB0aGF0IHRoaXMgY2xhc3MgaXMgYSBSZW5kZXJlci4gVGhpcyBpcyByZWdpc3RlcmVkIG9uIGZhY2VzLWNvbmZpZy54bWwuCi0gKiAKLSAqIEBhdXRob3IgTGVvbmFyZG8gVXJpYmUgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1ARG9jdW1lbnRlZAotQFRhcmdldChFbGVtZW50VHlwZS5UWVBFKQotQFJldGVudGlvbihSZXRlbnRpb25Qb2xpY3kuU09VUkNFKQotcHVibGljIEBpbnRlcmZhY2UgSlNGUmVuZGVyZXIKLXsKLSAgICAvKioKLSAgICAgKiBUaGUgcmVuZGVyS2l0SWQgdGhhdCBiZWxvbmdzIHRoaXMgcmVuZGVyZXIuIElmIG5vIGN1c3RvbSByZW5kZXJraXQgZGVmaW5lZCB5b3Ugc2hvdWxkIHVzZSBIVE1MX0JBU0lDLgotICAgICAqLwotICAgIFN0cmluZyByZW5kZXJLaXRJZCgpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGhlIGNvbXBvbmVudCBmYW1pbHkgdGhhdCB0aGlzIHJlbmRlcmVyIHNob3VsZCBiZSBhcHBsaWVkLgotICAgICAqLwotICAgIFN0cmluZyBmYW1pbHkoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSByZW5kZXJlciB0eXBlIHRoYXQgaXMgYXBwbGllZCB0aGlzIHJlbmRlcmVyLgotICAgICAqLwotICAgIFN0cmluZyB0eXBlKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbgotICAgICAqLwotICAgIFN0cmluZyBkZXNjKCkgZGVmYXVsdCAiIjsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGUmVuZGVyZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNmMDY3Zi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZSZW5kZXJlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIERlZmluZSBhIHNldCBvZiByZW5kZXJlcnMgdXNlZCB0byBncm91cCBzZXZlcmFsIGRlZmluaXRpb25zCi0gKiBvZiBKU0ZSZW5kZXJlciBhbm5vdGF0aW9ucy4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZSZW5kZXJlcnMKLXsKLQotICAgIC8qKgotICAgICAqIEFycmF5IG9mIEpTRlJlbmRlcmVyIHRvIGJlIGRlZmluZWQuCi0gICAgICovCi0gICAgSlNGUmVuZGVyZXIgW10gcmVuZGVyZXJzKCk7Ci0gICAgCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvYW5ub3RhdGlvbi9KU0ZWYWxpZGF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlZhbGlkYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MGQ0M2VkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRlZhbGlkYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247Ci0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5Eb2N1bWVudGVkOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvbjsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb25Qb2xpY3k7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0OwotCi0vKioKLSAqIFVzZWQgdG8gZGVmaW5lIGEganNmIHZhbGlkYXRvci4KLSAqIAotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLUBEb2N1bWVudGVkCi1AVGFyZ2V0KEVsZW1lbnRUeXBlLlRZUEUpCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1wdWJsaWMgQGludGVyZmFjZSBKU0ZWYWxpZGF0b3IKLXsKLSAgICAKLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZSB0aGUgdmFsaWRhdG9ySWQgd2hpY2ggaWRlbnRpZmllcyB0aGlzIGNsYXNzLiBJZiBub3QgZGVmaW5lZCwgaXQKLSAgICAgKiB0cmllcyB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBWQUxJREFUT1JfSUQuCi0gICAgICovCi0gICAgU3RyaW5nIGlkKCkgZGVmYXVsdCAiIjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBUaGUgbmFtZSBvZiB0aGUgY29tcG9uZW50IGluIGEgcGFnZSAoZXg6IHg6bXljb21wKS4KLSAgICAgKi8KLSAgICBTdHJpbmcgbmFtZSgpIGRlZmF1bHQgIiI7Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgdGFnIGNsYXNzIHVzZWQgZm9yIHRoaXMgdmFsaWRhdG9yLCBpZiBhcHBsaWVzLgotICAgICAqLwotICAgIFN0cmluZyB0YWdDbGFzcygpIGRlZmF1bHQgIiI7Ci0gICAgCi0gICAgLyoqCi0gICAgICogVGFnIHN1cGVyIGNsYXNzIHRoYXQgaW5oZXJpdHMgdGhlIHRhZyBjbGFzcwotICAgICAqLwotICAgIFN0cmluZyB0YWdTdXBlcmNsYXNzKCkgZGVmYXVsdCAiIjsKLQotICAgIC8qKgotICAgICAqIEluZGljYXRlIHRoYXQgdGhpcyBjb21wb25lbnQgc2hvdWxkIG5vdCBiZSBkZWZpbmVkIG9uIGZhY2VzLWNvbmZpZy54bWwuCi0gICAgICogQW55d2F5LCBpZiB0aGlzIGlzIHRydWUgb3IgZmFsc2UgZG9lcyBub3QgaGF2ZSBhbnkgc2lnbmlmaWNhdGl2ZSBpbXBhY3QuIAotICAgICAqIAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBib29sZWFuIGNvbmZpZ0V4Y2x1ZGVkKCkgZGVmYXVsdCBmYWxzZTsKLSAgICAgICAgCi0gICAgLyoqCi0gICAgICogSW5kaWNhdGUgaWYgdGhlIGVsZW1lbnQgYWNjZXB0IGlubmVyIGVsZW1lbnRzIG9yIG5vdC4KLSAgICAgKi8KLSAgICBTdHJpbmcgYm9keUNvbnRlbnQoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNob3J0IGRlc2NyaXB0aW9uCi0gICAgICovCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFNlcmlhbCB1aWQgdGhhdCBzaG91bGQgYmUgYWRkZWQgb24gZ2VuZXJhdGVkIHRhZyBjbGFzcwotICAgICAqIAotICAgICAqIEBzaW5jZSAxLjAuMwotICAgICAqLwotICAgIFN0cmluZyBzZXJpYWx1aWR0YWcoKSBkZWZhdWx0ICIiOwotICAgIAotICAgIC8qKgotICAgICAqIFRoZSBmdWxseS1xdWFsaWZpZWQtbmFtZSBvZiBhIGNvbmNyZXRlIHZhbGlkYXRvciBjbGFzcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBvbmx5IHJlbGV2YW50IHdoZW4gIm5hbWUiIGlzIGFsc28gc2V0LCBpZSB0aGUKLSAgICAgKiBhbm5vdGF0aW9uIGlzIGluZGljYXRpbmcgdGhhdCBhIHZhbGlkYXRvciBpcyByZWFsbHkgYmVpbmcgZGVjbGFyZWQuCi0gICAgICogPHA+Ci0gICAgICogV2hlbiB0aGlzIGF0dHJpYnV0ZSBpcyBub3QgZGVmaW5lZCB0aGVuIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGlzCi0gICAgICogYW5ub3RhdGVkIGNsYXNzIGlzIHRoZSBhY3R1YWwgdmFsaWRhdG9yIGNsYXNzLgotICAgICAqIDxwPgotICAgICAqIFdoZW4gdGhpcyBhdHRyaWJ1dGUgaXMgc2V0IHRvIHNvbWV0aGluZyBvdGhlciB0aGFuIHRoZSBuYW1lIG9mIHRoZQotICAgICAqIGFubm90YXRlZCBjbGFzcyB0aGVuIHRoZSBzcGVjaWZpZWQgY2xhc3MgaXMgdGhlIG9uZSB0aGF0IHRoZSBKU0YKLSAgICAgKiB2YWxpZGF0b3IgcmVnaXN0cmF0aW9uIGluIGZhY2VzLWNvbmZpZy54bWwgd2lsbCByZWZlciB0by4gQW5kIGlmIHRoYXQKLSAgICAgKiBjbGFzcyBkb2VzIG5vdCBleGlzdCBpbiB0aGUgY2xhc3NwYXRoICh3aGljaCB3aWxsIG5vcm1hbGx5IGJlIHRoZQotICAgICAqIGNhc2UpIHRoZW4gY29kZS1nZW5lcmF0aW9uIHdpbGwgYmUgdHJpZ2dlcmVkIHRvIGNyZWF0ZSBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIGF0dHJpYnV0ZSBpcyBub3QgaW5oZXJpdGFibGUuCi0gICAgICogPHA+Ci0gICAgICogVGhlIGRvY2xldC1hbm5vdGF0aW9uIGVxdWl2YWxlbnQgb2YgdGhpcyBhdHRyaWJ1dGUgaXMgbmFtZWQgImNsYXNzIi4KLSAgICAgKiAKLSAgICAgKiBAc2luY2UgMS4wLjMKLSAgICAgKi8KLSAgICBTdHJpbmcgY2xhenooKSBkZWZhdWx0ICIiOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGV2ViQ29uZmlnUGFyYW0uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1hbm5vdGF0aW9ucy9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9hbm5vdGF0aW9uL0pTRldlYkNvbmZpZ1BhcmFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMGU3YmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2Fubm90YXRpb24vSlNGV2ViQ29uZmlnUGFyYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYwICswLDAgQEAKLS8qDQotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0gKiANCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotICogDQotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICogIHVuZGVyIHRoZSBMaWNlbnNlLg0KLSAqLw0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5idWlsZGVyLmFubm90YXRpb247DQotDQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkVsZW1lbnRUeXBlOw0KLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5SZXRlbnRpb247DQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsNCi1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uVGFyZ2V0Ow0KLQ0KLS8qKg0KLSAqIFVzZWQgdG8gZGVmaW5lIGEgcGFyYW0gY29uZmlndXJlZCBpbiB3ZWIueG1sIGZpbGUuDQotICogDQotICogQHNpbmNlIDEuMC40DQotICogQGF1dGhvciBMZW9uYXJkbyBVcmliZSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yOiBsdTQyNDIgJCkNCi0gKiBAdmVyc2lvbiAkUmV2aXNpb246IDc1ODUxMyAkICREYXRlOiAyMDA5LTAzLTI1IDIzOjAyOjE2IC0wNTAwIChtacOpLCAyNSBtYXIgMjAwOSkgJA0KLSAqLw0KLUBEb2N1bWVudGVkDQotQFRhcmdldChFbGVtZW50VHlwZS5GSUVMRCkNCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpDQotcHVibGljIEBpbnRlcmZhY2UgSlNGV2ViQ29uZmlnUGFyYW0NCi17DQotICAgIFN0cmluZyBuYW1lKCkgZGVmYXVsdCAiIjsNCi0gICAgDQotICAgIC8qKg0KLSAgICAgKiBTaG9ydCBkZXNjcmlwdGlvbg0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGRlc2MoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgU3RyaW5nIGRlZmF1bHRWYWx1ZSgpIGRlZmF1bHQgIiI7DQotICAgIA0KLSAgICAvKioNCi0gICAgICogDQotICAgICAqLw0KLSAgICBTdHJpbmcgZXhwZWN0ZWRWYWx1ZXMoKSBkZWZhdWx0ICIiOw0KLSAgICANCi0gICAgLyoqDQotICAgICAqIA0KLSAgICAgKi8NCi0gICAgU3RyaW5nIHNpbmNlKCkgZGVmYXVsdCAiIjsNCi19DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmY0OThhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCi0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4gCi0gIDx2ZXJzaW9uPjEuMC41LVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIFBsdWdpbjwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPgotICAgIEEgbWF2ZW4gcGx1Z2luIHRoYXQgdXNlcyBhbm5vdGF0aW9ucyAoamF2YTE1IG9yIGRvY2xldCBzdHlsZSkgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBKU0YgY29uZmlndXJhdGlvbgotICAgIGZpbGVzICgudGxkLCBmYWNlcy1jb25maWcueG1sLCBldGMpIGFuZCBvcHRpb25hbGx5IFRhZywgVmFsaWRhdG9yIGFuZCBDb21wb25lbnQgY2xhc3Nlcy4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8IS0tIHJlcXVpcmVkIGZvciBwbGV4dXMsIGJ1dCB3ZSBhcmUgbm90IHVzaW5nIHRoaXMgcmlnaHQgbm93Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Z29hbFByZWZpeD5teWZhY2VzLWJ1aWxkZXI8L2dvYWxQcmVmaXg+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotICAKLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PiAgICAKLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4gICAKLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5xZG94PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cWRveDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuOS4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPCEtLQotICAgIDxkZXBlbmRlbmN5PgotICAgIAk8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KLSAgICAJPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+Ci0gICAgCTx2ZXJzaW9uPjEuMC5iMjwvdmVyc2lvbj4KLSAgICAJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAtLT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICAKLSAgICA8IS0tCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi42LjI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIC0tPgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgCTxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgCTxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgotICAgIAk8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICAJPCEtLSA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+ICAtLT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAJPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KLSAgICAJPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAJPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+Ci0gICAgCTwhLS0gPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPiAgLS0+Ci0gICAgPC9kZXBlbmRlbmN5PgotCi0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD52ZWxvY2l0eTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnZlbG9jaXR5PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLQotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8IS0tICAgICAKLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdmVsb2NpdHk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjEuNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgIC0tPgotICAgIAotICAgIDwhLS0gUmVwb3J0aW5nIHJlcXVpcmVkIEFQSS0tPiAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIAotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaXRlLXJlbmRlcmVyPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDwhLS0gRW5kIFJlcG9ydGluZyByZXF1aXJlZCBBUEkgLS0+Ci0KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLTwvcHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVmY2NjYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTIyICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+IAotCi0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLQotICA8cGFyZW50PgotICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAuMjwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtZmFjZXMtcGx1Z2luPC9hcnRpZmFjdElkPiAKLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEZhY2VzIFBsdWdpbjwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPgotICAgIEEgbWF2ZW4gcGx1Z2luIHRoYXQgdXNlcyBtZXRhZGF0YSBpbnB1dCBmaWxlcyB0byBnZW5lcmF0ZSBKU0YgQ29tcG9uZW50LCBWYWxpZGF0b3IgYW5kIFRhZyBjbGFzc2VzLAotICAgIHRvZ2V0aGVyIHdpdGggdGhlIGFzc29jaWF0ZWQgY29uZmlndXJhdGlvbiBmaWxlcyAoLnRsZCwgZmFjZXMtY29uZmlnLnhtbCwgZXRjKS4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8YnVpbGQ+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+Ci0gICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8IS0tCi0gICAgICAgICAgLSBPdmVycmlkZSBjaGVja3N0eWxlIGNvbmZpZyBmaWxlIGRlZmluaXRpb25zIGZyb20gcGFyZW50IHBvbS4gVGhlIHNvdXJjZSBvZgotICAgICAgICAgIC0gdGhpcyBwcm9qZWN0IGlzIG5vdCBjb21wbGlhbnQgd2l0aCB0aGUgbm9ybWFsIE15RmFjZXMgY29kZSBzdHlsZSBydWxlcywgYW5kCi0gICAgICAgICAgLSBwcm9iYWJseSBuZXZlciB3aWxsIGJlLgotICAgICAgICAgIC0tPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW1pbmltYWwueG1sPC9jb25maWdMb2NhdGlvbj4KLSAgICAgICAgICA8aGVhZGVyTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0PC9oZWFkZXJMb2NhdGlvbj4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLSAgCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb21tb25zLWRpZ2VzdGVyPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1kaWdlc3RlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zYXhvbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnNheG9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Ni41LjM8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+eGVyY2VzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+eGVyY2VzSW1wbDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuNi4yPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zdGF4LWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnN0YXg8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zdGF4PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4yLjBfcmMyLWRldjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvQWJzdHJhY3RGYWNlc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdEZhY2VzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmQ4NDhhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdEZhY2VzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjc5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5BdHRyaWJ1dGVCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5GYWNlc0NvbmZpZ1BhcnNlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkF0dHJpYnV0ZUZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db252ZXJ0ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5WYWxpZGF0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ2xhc3NMb2FkZXI7Ci1pbXBvcnQgamF2YS5uZXQuVVJMQ29ubmVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEFic3RyYWN0RmFjZXNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIHByb3RlY3RlZCBMaXN0IGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBDbGFzc0xvYWRlciBjbCA9IGNyZWF0ZUNvbXBpbGVDbGFzc0xvYWRlcihwcm9qZWN0KTsKLSAgICAgIEVudW1lcmF0aW9uIGUgPSBjbC5nZXRSZXNvdXJjZXMocmVzb3VyY2VQYXRoKTsKLSAgICAgIExpc3QgdXJscyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIHdoaWxlIChlLmhhc01vcmVFbGVtZW50cygpKQotICAgICAgewotICAgICAgICBVUkwgdXJsID0gKFVSTCllLm5leHRFbGVtZW50KCk7Ci0gICAgICAgIHVybHMuYWRkKHVybCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh1cmxzKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVuYWJsZSB0byBnZXQgcmVzb3VyY2VzIGZvciBwYXRoICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIHJlc291cmNlUGF0aCArICJcIiIsIGUpOwotICAgIH0KLQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VSb290KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVJvb3QpCi0gIHsKLSAgICBMaXN0IHJlc291cmNlcyA9IHByb2plY3QuZ2V0QnVpbGQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOwotICAgIHJlc291cmNlLnNldERpcmVjdG9yeShyZXNvdXJjZVJvb3QpOwotICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqLwotICBwcm90ZWN0ZWQgVVJMW10gcmVhZEluZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZEluZGV4KHByb2plY3QpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TWFzdGVyQ29uZmlncygKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmIChsb2NhbFJlc291cmNlICE9IG51bGwpCi0gICAgewotICAgICAgTGlzdCB1cmxzID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgdHJ5IHsKLSAgICAgICAgdXJscy5hZGQobG9jYWxSZXNvdXJjZS50b1VSTCgpKTsKLSAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGdldExvZygpLmVycm9yKCIiLCBlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB1cmxzOyAgCi0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLSAgICAgIHJldHVybiBnZXRDb21waWxlRGVwZW5kZW5jeVJlc291cmNlcyhwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBVUkxbXSByZWFkSW5kZXgoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyAxLiByZWFkIG1hc3RlciBmYWNlcy1jb25maWcueG1sIHJlc291cmNlcwotICAgICAgTGlzdCBtYXN0ZXJzID0gZ2V0TWFzdGVyQ29uZmlncyhwcm9qZWN0KTsKLSAgICAgIGlmIChtYXN0ZXJzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkud2FybigiTWFzdGVyIGZhY2VzLWNvbmZpZy54bWwgbm90IGZvdW5kIik7Ci0gICAgICAgIHJldHVybiBuZXcgVVJMWzBdOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBMaXN0IGVudHJpZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotCi0gICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc3BmID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBzcGYuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgIC8vIHJlcXVpcmVzIEpBWFAgMS4zLCBpbiBKYXZhU0UgNS4wCi0gICAgICAgIC8vIHNwZi5zZXRYSW5jbHVkZUF3YXJlKGZhbHNlKTsKLQotICAgICAgICBmb3IgKEl0ZXJhdG9yIGk9bWFzdGVycy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgIHsKLSAgICAgICAgICBVUkwgdXJsID0gKFVSTClpLm5leHQoKTsKLSAgICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IG5ldyBEaWdlc3RlcihzcGYubmV3U0FYUGFyc2VyKCkpOwotICAgICAgICAgIGRpZ2VzdGVyLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotCi0gICAgICAgICAgLy8gWEluY2x1ZGUKLSAgICAgICAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAiYWRkIiwgMSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVJMQ3JlYXRpb25GYWN0b3J5LmNsYXNzKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9pbmNsdWRlIiwgMCwgMCk7Ci0KLSAgICAgICAgICBkaWdlc3Rlci5wdXNoKHVybCk7Ci0gICAgICAgICAgZGlnZXN0ZXIucHVzaChlbnRyaWVzKTsKLSAgICAgICAgICBkaWdlc3Rlci5wYXJzZSh1cmwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJldHVybiAoVVJMW10pZW50cmllcy50b0FycmF5KG5ldyBVUkxbMF0pOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzTW9kaWZpZWRTaW5jZSgKLSAgICBVUkxbXSB1cmxzLAotICAgIGxvbmcgIGxhc3RNb2RpZmllZCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IgKGludCBpPTA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybHNbaV0ub3BlbkNvbm5lY3Rpb24oKTsKLSAgICAgIGlmIChjb25uLmdldExhc3RNb2RpZmllZCgpID4gbGFzdE1vZGlmaWVkKQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgKiBAZGVwcmVjYXRlZCBjYWxsIFV0aWwuY29udmVydFN0cmluZ1RvTGl0ZXJhbCBpbnN0ZWFkCi0gICovCi0gIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFN0cmluZ1RvTGl0ZXJhbChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsKCJTdHJpbmciLCB2YWx1ZSk7Ci0gIH0KLQotIC8qKgotICAqIEBkZXByZWNhdGVkIGNhbGwgVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsIGluc3RlYWQKLSAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBjb252ZXJ0U3RyaW5nVG9MaXRlcmFsKFN0cmluZyBjbGFzc05hbWUsIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIHJldHVybiBVdGlsLmNvbnZlcnRTdHJpbmdUb0xpdGVyYWwoY2xhc3NOYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIHJlYWRMaWNlbnNlSGVhZGVyKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIGlmIChsaWNlbnNlSGVhZGVyRmlsZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBfREVGQVVMVF9MSUNFTlNFX0hFQURFUjsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCFsaWNlbnNlSGVhZGVyRmlsZS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiTGljZW5zZSBoZWFkZXIgZmlsZSBub3QgZm91bmQ6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICtsaWNlbnNlSGVhZGVyRmlsZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIGlmIChsaWNlbnNlSGVhZGVyRmlsZS5pc0RpcmVjdG9yeSgpKQotICAgIHsKLSAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXhwZWN0aW5nIGEgZmlsZSBhbmQgZm91bmQgYSBkaXJlY3Rvcnk6ICIKLSAgICAgICAgICAgICAgICtsaWNlbnNlSGVhZGVyRmlsZS5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAKLSAgICB0cnkKLSAgICB7Ci0gICAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIobGljZW5zZUhlYWRlckZpbGUpKTsKLSAgICAgIFN0cmluZyBsaW5lOwotICAgICAgCi0gICAgICB3aGlsZSAoKGxpbmUgPSByZWFkZXIucmVhZExpbmUoKSkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKGxpbmUrIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFeGNlcHRpb24gcmVhZGluZyBsaWNlbnNlIGhlYWRlciBmaWxlIiwgZSk7Ci0gICAgfQotICAgIAotICAgIHJldHVybiBzYi50b1N0cmluZygpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldExpY2Vuc2VIZWFkZXIoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9saWNlbnNlSGVhZGVyID09IG51bGwpCi0gICAgewotICAgICAgX2xpY2Vuc2VIZWFkZXIgPSByZWFkTGljZW5zZUhlYWRlcigpOwotICAgIH0KLSAgICAKLSAgICByZXR1cm4gX2xpY2Vuc2VIZWFkZXI7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIGNsYXNzIFVSTENyZWF0aW9uRmFjdG9yeSBleHRlbmRzIEFic3RyYWN0T2JqZWN0Q3JlYXRpb25GYWN0b3J5Ci0gIHsKLSAgICBwdWJsaWMgT2JqZWN0IGNyZWF0ZU9iamVjdCgKLSAgICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIE1hbGZvcm1lZFVSTEV4Y2VwdGlvbgotICAgIHsKLSAgICAgIFN0cmluZyBocmVmID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgiaHJlZiIpOwotICAgICAgaWYgKGhyZWYgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiTWlzc2luZyBocmVmIGF0dHJpYnV0ZSIpOwotCi0gICAgICBVUkwgbWFzdGVyID0gKFVSTClkaWdlc3Rlci5nZXRSb290KCk7Ci0gICAgICByZXR1cm4gbmV3IFVSTChtYXN0ZXIsIGhyZWYpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgX2ZhY2VzQ29uZmlnID0gbmV3IEZhY2VzQ29uZmlnQmVhbigpOwotCi0gICAgVVJMW10gaW5kZXggPSByZWFkSW5kZXgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICBmb3IgKGludCBpPTA7IGkgPCBpbmRleC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBwcm9jZXNzSW5kZXhFbnRyeShpbmRleFtpXSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0luZGV4RW50cnkoCi0gICAgVVJMIGVudHJ5KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIG9sZCA9IF9mYWNlc0NvbmZpZy5zZXRDdXJyZW50UmVzb3VyY2UoZW50cnkpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG5ldyBGYWNlc0NvbmZpZ1BhcnNlcigpLm1lcmdlKF9mYWNlc0NvbmZpZywgZW50cnkpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgX2ZhY2VzQ29uZmlnLnNldEN1cnJlbnRSZXNvdXJjZShvbGQpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBGYWNlc0NvbmZpZ0JlYW4gZ2V0RmFjZXNDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNlc0NvbmZpZzsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJlYW1ibGUoCi0gICAgUHJldHR5V3JpdGVyIG91dCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIG91dC53cml0ZShfQVVUT19HRU5FUkFURV9XQVJOSU5HKTsKLSAgICBvdXQud3JpdGUoZ2V0TGljZW5zZUhlYWRlcigpKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIGNvcHlGaWxlKAotICAgIEZpbGUgICBzb3VyY2VEaXJlY3RvcnksCi0gICAgU3RyaW5nIHNvdXJjZVBhdGgsCi0gICAgRmlsZSAgIHRhcmdldERpcmVjdG9yeSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotCi0gICAgICBpZiAoc291cmNlRmlsZS5leGlzdHMoKSAmJgotICAgICAgICAgIHNvdXJjZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKQotICAgICAgewotICAgICAgICBpZiAoZ2V0TG9nKCkuaXNEZWJ1Z0VuYWJsZWQoKSkKLSAgICAgICAgICBnZXRMb2coKS5kZWJ1ZygiQ29weWluZyBmaWxlIFwiIiArIHNvdXJjZVBhdGggKyAiXCIiKTsKLQotICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBjb3B5aW5nIGZpbGUgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZVBhdGggKyAiXCIiLCBlKTsKLSAgICB9Ci0gIH0KLQotIC8qKgotICAqIEBkZXByZWNhdGVkIHVzZSBVdGlsLndyaXRlSW1wb3J0cyBpbnN0ZWFkCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFN0cmluZyAgICAgICBwYWNrYWdlTmFtZSwKLSAgICBTZXQgICAgICAgICAgaW1wb3J0cykKLSAgewotICAgIEdlbmVyYXRvckhlbHBlci53cml0ZUltcG9ydHMob3V0LHBhY2thZ2VOYW1lLGltcG9ydHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBUaHJlYWQgY3VycmVudCA9IFRocmVhZC5jdXJyZW50VGhyZWFkKCk7Ci0gICAgQ2xhc3NMb2FkZXIgY2wgPSBjdXJyZW50LmdldENvbnRleHRDbGFzc0xvYWRlcigpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgTGlzdCBjbGFzc3BhdGhFbGVtZW50cyA9IHByb2plY3QuZ2V0Q29tcGlsZUNsYXNzcGF0aEVsZW1lbnRzKCk7Ci0gICAgICBpZiAoIWNsYXNzcGF0aEVsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nW10gZW50cmllcyA9IChTdHJpbmdbXSljbGFzc3BhdGhFbGVtZW50cy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBVUkxbXSB1cmxzID0gbmV3IFVSTFtlbnRyaWVzLmxlbmd0aF07Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHVybHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICB1cmxzW2ldID0gbmV3IEZpbGUoZW50cmllc1tpXSkudG9VUkwoKTsKLSAgICAgICAgfQotICAgICAgICBjbCA9IG5ldyBVUkxDbGFzc0xvYWRlcih1cmxzLCBjbCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChEZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgIH0KLQotICAgIHJldHVybiBjbDsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBTa2lwRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgIC8vIHNraXAgQVBJIGFuZCBiYXNlIGNsYXNzIGdlbmVyYXRpb24/Ci0gICAgICByZXR1cm4gIXNraXBBcGlPckJhc2VDbGFzc2VzIHx8ICghY29tcG9uZW50VHlwZS5zdGFydHNXaXRoKCJqYXZheCIpICYmCi0gICAgICAgICAgICAgICAgIWNvbXBvbmVudFR5cGUuZW5kc1dpdGgoIkJhc2UiKSk7Ci0KLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFR5cGVGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb21wb25lbnRUeXBlRmlsdGVyKAotICAgICAgU3RyaW5nIHR5cGVQcmVmaXgpCi0gICAgewotICAgICAgX3R5cGVQcmVmaXggPSB0eXBlUHJlZml4OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsgICAgICAgIAotICAgICAgcmV0dXJuIChjb21wb25lbnRUeXBlLnN0YXJ0c1dpdGgoX3R5cGVQcmVmaXgpKTsKLSAgICB9Ci0gICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF90eXBlUHJlZml4OwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb21wb25lbnRDbGFzc0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHVibGljIENvbXBvbmVudENsYXNzRmlsdGVyKAotICAgICAgU3RyaW5nIHBhY2thZ2VDb250YWlucykKLSAgICB7Ci0gICAgICBfcGFja2FnZUNvbnRhaW5zID0gcGFja2FnZUNvbnRhaW5zOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcyA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzcygpOwotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhjb21wb25lbnRDbGFzcyk7Ci0KLSAgICAgIC8vIGFjY2VwdCBvbmx5IGNsYXNzZXMgdGhhdCBtYXRjaCB0aGUgcGFja2FnZQotICAgICAgcmV0dXJuIChwYWNrYWdlTmFtZS5jb250YWlucyhfcGFja2FnZUNvbnRhaW5zKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VDb250YWluczsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29tcG9uZW50VGFnQ2xhc3NGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb21wb25lbnRUYWdDbGFzc0ZpbHRlcigKLSAgICAgIFN0cmluZyBwYWNrYWdlQ29udGFpbnMpCi0gICAgewotICAgICAgX3BhY2thZ2VDb250YWlucyA9IHBhY2thZ2VDb250YWluczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3ModGFnQ2xhc3MpOwotCi0gICAgICAvLyBhY2NlcHQgb25seSBjbGFzc2VzIGluIHRoaXMgcHJvamVjdCdzIChzdWIpcGFja2FnZQotICAgICAgcmV0dXJuIChwYWNrYWdlTmFtZS5jb250YWlucyhfcGFja2FnZUNvbnRhaW5zKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX3BhY2thZ2VDb250YWluczsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnQ2xhc3NGaWx0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXJGaWx0ZXIKLSAgewotICAgIHB1YmxpYyBDb252ZXJ0ZXJUYWdDbGFzc0ZpbHRlcigKLSAgICAgIFN0cmluZyBwYWNrYWdlQ29udGFpbnMpCi0gICAgewotICAgICAgX3BhY2thZ2VDb250YWlucyA9IHBhY2thZ2VDb250YWluczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3ModGFnQ2xhc3MpOwotCi0gICAgICAvLyBhY2NlcHQgb25seSBjbGFzc2VzIHRoYXQgY29udGFpbiB0aGUgZGVzaXJlZCBzdHJpbmcKLSAgICAgIHJldHVybiAocGFja2FnZU5hbWUuY29udGFpbnMoX3BhY2thZ2VDb250YWlucykpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlQ29udGFpbnM7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFZhbGlkYXRvclRhZ0NsYXNzRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgVmFsaWRhdG9yVGFnQ2xhc3NGaWx0ZXIoCi0gICAgICBTdHJpbmcgcGFja2FnZUNvbnRhaW5zKQotICAgIHsKLSAgICAgIF9wYWNrYWdlQ29udGFpbnMgPSBwYWNrYWdlQ29udGFpbnM7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpCi0gICAgewotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKHRhZ0NsYXNzKTsKLQotICAgICAgLy8gYWNjZXB0IG9ubHkgY2xhc3NlcyB0aGF0IGNvbnRhaW4gdGhlIGRlc2lyZWQgc3RyaW5nCi0gICAgICByZXR1cm4gKHBhY2thZ2VOYW1lLmNvbnRhaW5zKF9wYWNrYWdlQ29udGFpbnMpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfcGFja2FnZUNvbnRhaW5zOwotICB9Ci0KLSAgCi0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb21wb25lbnRUYWdGaWx0ZXIgZXh0ZW5kcyBDb21wb25lbnRGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIHJldHVybiAoY29tcG9uZW50LmdldFRhZ0NsYXNzKCkgIT0gbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb252ZXJ0ZXJUYWdGaWx0ZXIgZXh0ZW5kcyBDb252ZXJ0ZXJGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQotICAgIHsKLSAgICAgIHJldHVybiAoY29udmVydGVyLmdldFRhZ0NsYXNzKCkgIT0gbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBWYWxpZGF0b3JUYWdGaWx0ZXIgZXh0ZW5kcyBWYWxpZGF0b3JGaWx0ZXIKLSAgewotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKQotICAgIHsKLSAgICAgIHJldHVybiAodmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkgIT0gbnVsbCk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb21wb25lbnRUYWdMaWJyYXJ5RmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50VGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gICAgewotICAgICAgdGhpcyhuYW1lc3BhY2VVUkksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb21wb25lbnRUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIGJvb2xlYW4gcmVxdWlyZVRhZ0NsYXNzKQotICAgIHsKLSAgICAgIF9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICBfcmVxdWlyZVRhZ0NsYXNzID0gcmVxdWlyZVRhZ0NsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHsKLSAgICAgIFFOYW1lIHRhZ05hbWUgPSBjb21wb25lbnQuZ2V0VGFnTmFtZSgpOwotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29tcG9uZW50LmdldFRhZ0NsYXNzKCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0YWdDbGFzcyBpcyBwcmVzZW50Ci0gICAgICAvLyBhbmQgaWYgdGFnTmFtZSBpcyBpbiB0aGUgZGVzaXJlZCBuYW1lc3BhY2VVUkkKLSAgICAgIHJldHVybiAoKCFfcmVxdWlyZVRhZ0NsYXNzIHx8ICh0YWdDbGFzcyAhPSBudWxsKSkgJiYKLSAgICAgICAgICAgICAgdGFnTmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgIF9uYW1lc3BhY2VVUkkuZXF1YWxzKHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbmFtZXNwYWNlVVJJOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcmVxdWlyZVRhZ0NsYXNzOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBWYWxpZGF0b3JUYWdMaWJyYXJ5RmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgVmFsaWRhdG9yVGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gICAgewotICAgICAgdGhpcyhuYW1lc3BhY2VVUkksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBWYWxpZGF0b3JUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIGJvb2xlYW4gcmVxdWlyZVRhZ0NsYXNzKQotICAgIHsKLSAgICAgIF9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICBfcmVxdWlyZVRhZ0NsYXNzID0gcmVxdWlyZVRhZ0NsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKQotICAgIHsKLSAgICAgIFFOYW1lIHRhZ05hbWUgPSB2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpOwotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0YWdDbGFzcyBpcyBwcmVzZW50Ci0gICAgICAvLyBhbmQgaWYgdGFnTmFtZSBpcyBpbiB0aGUgZGVzaXJlZCBuYW1lc3BhY2VVUkkKLSAgICAgIHJldHVybiAoKCFfcmVxdWlyZVRhZ0NsYXNzIHx8ICh0YWdDbGFzcyAhPSBudWxsKSkgJiYKLSAgICAgICAgICAgICAgdGFnTmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgIF9uYW1lc3BhY2VVUkkuZXF1YWxzKHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbmFtZXNwYWNlVVJJOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcmVxdWlyZVRhZ0NsYXNzOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIHByb3RlY3RlZCBjbGFzcyBDb252ZXJ0ZXJUYWdMaWJyYXJ5RmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29udmVydGVyVGFnTGlicmFyeUZpbHRlcigKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkpCi0gICAgewotICAgICAgdGhpcyhuYW1lc3BhY2VVUkksIHRydWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBDb252ZXJ0ZXJUYWdMaWJyYXJ5RmlsdGVyKAotICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSwKLSAgICAgIGJvb2xlYW4gcmVxdWlyZVRhZ0NsYXNzKQotICAgIHsKLSAgICAgIF9uYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VVUkk7Ci0gICAgICBfcmVxdWlyZVRhZ0NsYXNzID0gcmVxdWlyZVRhZ0NsYXNzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKQotICAgIHsKLSAgICAgIFFOYW1lIHRhZ05hbWUgPSBjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpOwotICAgICAgU3RyaW5nIHRhZ0NsYXNzID0gY29udmVydGVyLmdldFRhZ0NsYXNzKCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0YWdDbGFzcyBpcyBwcmVzZW50Ci0gICAgICAvLyBhbmQgaWYgdGFnTmFtZSBpcyBpbiB0aGUgZGVzaXJlZCBuYW1lc3BhY2VVUkkKLSAgICAgIHJldHVybiAoKCFfcmVxdWlyZVRhZ0NsYXNzIHx8ICh0YWdDbGFzcyAhPSBudWxsKSkgJiYKLSAgICAgICAgICAgICAgdGFnTmFtZSAhPSBudWxsICYmCi0gICAgICAgICAgICAgIF9uYW1lc3BhY2VVUkkuZXF1YWxzKHRhZ05hbWUuZ2V0TmFtZXNwYWNlVVJJKCkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBfbmFtZXNwYWNlVVJJOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfcmVxdWlyZVRhZ0NsYXNzOwotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBjbGFzcyBWaXJ0dWFsQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgQXR0cmlidXRlRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSkKLSAgICB7Ci0gICAgICByZXR1cm4gIWF0dHJpYnV0ZS5pc1ZpcnR1YWwoKTsKLSAgICB9Ci0gIH0KLQotIC8qKgotICAqIEBwYXJhbWV0ZXIKLSAgKi8KLSAgcHJpdmF0ZSBGaWxlIGxpY2Vuc2VIZWFkZXJGaWxlOwotCi0gIC8qKgotICAqIEBwYXJhbWV0ZXIgZGVmYXVsdC12YWx1ZSA9ICJ0cnVlIgotICAqLwotICBwcml2YXRlIGJvb2xlYW4gc2tpcEFwaU9yQmFzZUNsYXNzZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgRmlsZSBsb2NhbFJlc291cmNlOwotCi0KLQotICBwcml2YXRlIEZhY2VzQ29uZmlnQmVhbiBfZmFjZXNDb25maWc7Ci0gIHByaXZhdGUgU3RyaW5nIF9saWNlbnNlSGVhZGVyOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfQVVUT19HRU5FUkFURV9XQVJOSU5HID0KLSIvLyBXQVJOSU5HOiBUaGlzIGZpbGUgd2FzIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLiBEbyBub3QgZWRpdCBpdCBkaXJlY3RseSxcbiIrCi0iLy8gICAgICAgICAgb3IgeW91IHdpbGwgbG9zZSB5b3VyIGNoYW5nZXMuXG5cbiI7Ci0KLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0RFRkFVTFRfTElDRU5TRV9IRUFERVIgPQotICAgICIvKlxuIiArCi0gICAgIiAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmVcbiIgKwotICAgICIgKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGVcbiIgKwotICAgICIgKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvblxuIiArCi0gICAgIiAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGVcbiIgKwotICAgICIgKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlXG4iICsKLSAgICAiICogXCJMaWNlbnNlXCIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlXG4iICsKLSAgICAiICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdFxuIiArCi0gICAgIiAqXG4iICsKLSAgICAiICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjBcbiIgKwotICAgICIgKlxuIiArCi0gICAgIiAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZyxcbiIgKwotICAgICIgKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhblxuIiArCi0gICAgIiAqIFwiQVMgSVNcIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZXG4iICsKLSAgICAiICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlXG4iICsKLSAgICAiICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9uc1xuIiArCi0gICAgIiAqIHVuZGVyIHRoZSBMaWNlbnNlLlxuIiArCi0gICAgIiovXG4iOwotfQotICAKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWNlZjIyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudC5Db21wb25lbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50Lk15RmFjZXNDb21wb25lbnRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50LlRyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Tb3VyY2VUZW1wbGF0ZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1dyaXRlcjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtY29tcG9uZW50cwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlQ29tcG9uZW50c01vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcHJvY2Vzc0luZGV4KHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0gICAgICBfZ2VuZXJhdGVDb21wb25lbnRzKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHBhcnNlZCBjb21wb25lbnRzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZUNvbXBvbmVudHMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIE1ha2Ugc3VyZSBnZW5lcmF0ZWQgc291cmNlIGRpcmVjdG9yeQotICAgIC8vIGlzIGFkZGVkIHRvIGNvbXBpbGF0aW9uIHNvdXJjZSBwYXRoCi0gICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBmYWNlc0NvbmZpZyA9IGdldEZhY2VzQ29uZmlnKCk7Ci0gICAgaWYgKCFmYWNlc0NvbmZpZy5oYXNDb21wb25lbnRzKCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIG5vIGNvbXBvbmVudHMgZm91bmQiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChzdXBwcmVzc0xpc3RlbmVyTWV0aG9kcykKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkud2FybigiRXZlbnQgbGlzdGVuZXIgbWV0aG9kcyB3aWxsIG5vdCBiZSBnZW5lcmF0ZWQiKTsKLSAgICAgIH0KLQotICAgICAgSXRlcmF0b3IgY29tcG9uZW50cyA9IGZhY2VzQ29uZmlnLmNvbXBvbmVudHMoKTsKLSAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb21wb25lbnRUeXBlRmlsdGVyKHR5cGVQcmVmaXgpKTsKLQotICAgICAgLy8gaW5jcmVtZW50YWwgdW5sZXNzIGZvcmNlZAotICAgICAgaWYgKCFmb3JjZSkKLSAgICAgIHsKLSAgICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBJZk1vZGlmaWVkRmlsdGVyKCkpOwotICAgICAgfQotCi0gICAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gYWxsIGNvbXBvbmVudHMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgd2hpbGUgKGNvbXBvbmVudHMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbiljb21wb25lbnRzLm5leHQoKTsKLSAgICAgICAgICBpZiAoIWNvbXBvbmVudC5pc0NvbXBvbmVudENsYXNzRXhjbHVkZWQoKSl7Ci0gICAgICAgICAgICAgIF9nZW5lcmF0ZUNvbXBvbmVudChjb21wb25lbnQpOwotICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIH0gICAgICAgICAgCi0gICAgICAgIH0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGVkICIgKyBjb3VudCArICIgY29tcG9uZW50KHMpIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIHBhcnNlZCBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnQgIHRoZSBwYXJzZWQgY29tcG9uZW50IG1ldGFkYXRhCi0gICAqLwotICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlQ29tcG9uZW50KAotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgQ29tcG9uZW50R2VuZXJhdG9yIGdlbmVyYXRvcjsKLQotICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCk7Ci0KLSAgICBpZiAoY29tcG9uZW50LmlzVHJpbmlkYWRDb21wb25lbnQoKSkKLSAgICB7Ci0gICAgICBnZW5lcmF0b3IgPSBuZXcgVHJpbmlkYWRDb21wb25lbnRHZW5lcmF0b3IoZ2V0TG9nKCksIF9pczEyKCkpOwotICAgIH0KLSAgICBlbHNlIAotICAgIHsKLSAgICAgIGdlbmVyYXRvciA9IG5ldyBNeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yKGdldExvZygpLF9pczEyKCkgKTsKLSAgICB9Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgZnVsbENsYXNzTmFtZSsiLCB3aXRoIGdlbmVyYXRvcjogIitnZW5lcmF0b3IuZ2V0Q2xhc3MoKS5nZXROYW1lKCkpOwotCi0gICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGZ1bGxDbGFzc05hbWUsICIuamF2YSIpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLQotICAgICAgU3RyaW5nV3JpdGVyIHN3ID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgUHJldHR5V3JpdGVyIG91dCA9IG5ldyBQcmV0dHlXcml0ZXIoc3cpOwotCi0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5ID0gY29tcG9uZW50LmZpbmRDb21wb25lbnRGYW1pbHkoKTsKLQotICAgICAgaWYgKGNvbXBvbmVudEZhbWlseSA9PSBudWxsKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNaXNzaW5nIDxjb21wb25lbnQtZmFtaWx5PiBmb3IgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgZnVsbENsYXNzTmFtZSArICJcIiwgZ2VuZXJhdGlvbiBvZiB0aGlzIENvbXBvbmVudCBpcyBza2lwcGVkIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUgPSBjb21wb25lbnQuZmluZENvbXBvbmVudFN1cGVyY2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbFN1cGVyY2xhc3NOYW1lKTsKLQotICAgICAgICAvLyBtYWtlIGNsYXNzIG5hbWUgZnVsbHkgcXVhbGlmaWVkIGluIGNhc2Ugb2YgY29sbGlzaW9uCi0gICAgICAgIGlmIChzdXBlcmNsYXNzTmFtZS5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgICAgICBzdXBlcmNsYXNzTmFtZSA9IGZ1bGxTdXBlcmNsYXNzTmFtZTsKLQotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdGhpcyBib2dvc2l0eQotICAgICAgICBpZiAoc3VwZXJjbGFzc05hbWUuZXF1YWxzKCJVSVhNZW51SGllcmFyY2h5IikgfHwKLSAgICAgICAgICAgIHN1cGVyY2xhc3NOYW1lLmVxdWFscygiVUlYVGFibGUiKSB8fAotICAgICAgICAgICAgc3VwZXJjbGFzc05hbWUuZXF1YWxzKCJVSVhIaWVyYXJjaHkiKSB8fAotICAgICAgICAgICAgc3VwZXJjbGFzc05hbWUuZXF1YWxzKCJVSVhNZW51VHJlZSIpIHx8Ci0gICAgICAgICAgICBjbGFzc05hbWUuZXF1YWxzKCJDb3JlVHJlZSIpKQotICAgICAgICB7Ci0gICAgICAgICAgc3VwZXJjbGFzc05hbWUgPSBmdWxsU3VwZXJjbGFzc05hbWU7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICAvLyBVc2UgdGVtcGxhdGUgZmlsZSBpZiBpdCBleGlzdHMKLSAgICAgICAgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGZ1bGxDbGFzc05hbWUsICJUZW1wbGF0ZS5qYXZhIik7Ci0gICAgICAgIEZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIHRlbXBsYXRlUGF0aCk7Ci0KLSAgICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUgPSBudWxsOwotICAgICAgICBpZiAodGVtcGxhdGVGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2V0TG9nKCkuZGVidWcoIlVzaW5nIHRlbXBsYXRlICIgKyB0ZW1wbGF0ZVBhdGgpOwotICAgICAgICAgIHRlbXBsYXRlID0gbmV3IFNvdXJjZVRlbXBsYXRlKHRlbXBsYXRlRmlsZSk7Ci0gICAgICAgICAgdGVtcGxhdGUuc3Vic3RpdHV0ZShjbGFzc05hbWUgKyAiVGVtcGxhdGUiLCBjbGFzc05hbWUpOwotICAgICAgICAgIHRlbXBsYXRlLnJlYWRQcmVmYWNlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBoZWFkZXIvY29weXJpZ2h0Ci0gICAgICAgIHdyaXRlUHJlYW1ibGUob3V0KTsKLQotICAgICAgICAvLyBwYWNrYWdlCi0gICAgICAgIG91dC5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAgICAgLy8gaW1wb3J0cwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVJbXBvcnRzKG91dCwgdGVtcGxhdGUsIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGZ1bGxTdXBlcmNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29tcG9uZW50KTsKLQotICAgICAgICAvLyBjbGFzcwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDbGFzc0JlZ2luKG91dCwgY2xhc3NOYW1lLCBzdXBlcmNsYXNzTmFtZSwgY29tcG9uZW50LCB0ZW1wbGF0ZSk7Ci0KLSAgICAgICAgLy8gc3RhdGljIGZpbmFsIGNvbnN0YW50cwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVQcm9wZXJ0eVZhbHVlQ29uc3RhbnRzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlUHJvcGVydHlDb25zdGFudHMob3V0LCBzdXBlcmNsYXNzTmFtZSwgY29tcG9uZW50KTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlRmFjZXRDb25zdGFudHMob3V0LCBjb21wb25lbnQpOwotICAgICAgICBnZW5lcmF0b3Iud3JpdGVHZW5lcmljQ29uc3RhbnRzKG91dCwgY29tcG9uZW50RmFtaWx5LCBjb21wb25lbnRUeXBlKTsKLQotICAgICAgICAvLyBwdWJsaWMgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUNvbnN0cnVjdG9yKG91dCwgY29tcG9uZW50LCBNb2RpZmllci5QVUJMSUMpOwotCi0gICAgICAgIC8vIGluc2VydCB0ZW1wbGF0ZSBjb2RlCi0gICAgICAgIGlmICh0ZW1wbGF0ZSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGVtcGxhdGUud3JpdGVDb250ZW50KG91dCk7Ci0gICAgICAgICAgdGVtcGxhdGUuY2xvc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGdlbmVyYXRvci53cml0ZUZhY2V0TWV0aG9kcyhvdXQsIGNvbXBvbmVudCk7Ci0KLSAgICAgICAgaWYgKHRlbXBsYXRlID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBnZW5lcmF0b3Iud3JpdGVQcm9wZXJ0eU1ldGhvZHMob3V0LCBjb21wb25lbnQpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvci53cml0ZVByb3BlcnR5TWV0aG9kcyhvdXQsIGNvbXBvbmVudCwgdGVtcGxhdGUuZ2V0SWdub3JlTWV0aG9kcygpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKCFzdXBwcmVzc0xpc3RlbmVyTWV0aG9kcykKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvci53cml0ZUxpc3RlbmVyTWV0aG9kcyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIH0KLQotICAgICAgICBnZW5lcmF0b3Iud3JpdGVTdGF0ZU1hbmFnZW1lbnRNZXRob2RzKG91dCwgY29tcG9uZW50KTsKLQotICAgICAgICBnZW5lcmF0b3Iud3JpdGVHZXRGYW1pbHkob3V0KTsKLQotICAgICAgICAvLyBwcm90ZWN0ZWQgY29uc3RydWN0b3JzIGFuZCBtZXRob2RzCi0gICAgICAgIC8vIFRPRE86IHJldmVyc2UgdGhpcyBvcmRlciwgdG8gbWFrZSBwcm90ZWN0ZWQgY29uc3RydWN0b3IgZ28gZmlyc3QKLSAgICAgICAgLy8gICAgICAgZm9yIG5vdyB3ZSB3YW50IGNvbnNpc3RlbmN5IHdpdGggcHJldmlvdXMgY29kZSBnZW5lcmF0aW9uCi0gICAgICAgIGdlbmVyYXRvci53cml0ZU90aGVyKG91dCwgY29tcG9uZW50KTsKLQotICAgICAgICBnZW5lcmF0b3Iud3JpdGVDbGFzc0VuZChvdXQpOwotCi0gICAgICAgIG91dC5jbG9zZSgpOwotCi0gICAgICAgIC8vIGRlbGF5IHdyaXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgICAgLy8gdGltZXN0YW1wIHNob3VsZCBub3QgYmUgdXBkYXRlZCB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAgICAvLyBkZWxldGUgdGFyZ2V0IGZpbGUgZmlyc3QsIGJlY2F1c2UgaXQgaXMgcmVhZG9ubHkKLSAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0YXJnZXRGaWxlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHN3LmdldEJ1ZmZlcigpOwotICAgICAgICBmdy53cml0ZShidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZ2V0TG9nKCkuZXJyb3IoIkVycm9yIGdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgSWZNb2RpZmllZEZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCk7Ci0gICAgICBTdHJpbmcgc291cmNlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKGNvbXBvbmVudENsYXNzLCAiLmphdmEiKTsKLSAgICAgIFN0cmluZyB0ZW1wbGF0ZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChjb21wb25lbnRDbGFzcywgIlRlbXBsYXRlLmphdmEiKTsKLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgc291cmNlUGF0aCk7Ci0gICAgICBGaWxlIHRlbXBsYXRlRmlsZSA9IG5ldyBGaWxlKHRlbXBsYXRlU291cmNlRGlyZWN0b3J5LCB0ZW1wbGF0ZVBhdGgpOwotCi0gICAgICAvLyBhY2NlcHQgaWYgdGVtcGxhdGVGaWxlIGlzIG5ld2VyIG9yIGNvbXBvbmVudCBoYXMgYmVlbiBtb2RpZmllZAotICAgICAgcmV0dXJuICh0ZW1wbGF0ZUZpbGUubGFzdE1vZGlmaWVkKCkgPiB0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpIHx8Ci0gICAgICAgICAgICAgIGNvbXBvbmVudC5pc01vZGlmaWVkU2luY2UodGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpCi0gIHsKLSAgICByZXR1cm4gIjEuMiIuZXF1YWxzKGpzZlZlcnNpb24pIHx8ICIxMiIuZXF1YWxzKGpzZlZlcnNpb24pOwotICB9Ci0gIAotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aCA9ICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vaW5kZXgubHN0IjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhLXRlbXBsYXRlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGVtcGxhdGVTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vamF2YSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcGFja2FnZUNvbnRhaW5zOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgICBwcml2YXRlIFN0cmluZyB0eXBlUHJlZml4OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzdXBwcmVzc0xpc3RlbmVyTWV0aG9kczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcganNmVmVyc2lvbjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VsZXRzVGFnbGlic01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VsZXRzVGFnbGlic01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEzMTQ2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlbGV0c1RhZ2xpYnNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTE91dHB1dEZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5PdXRwdXRLZXlzOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhTb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtZmFjZWxldHMtdGFnbGlicwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlRmFjZWxldHNUYWdsaWJzTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBhbHdheXMgYWRkIHJlc291cmNlcyBkaXJlY3RvcnkgdG8gcHJvamVjdCByZXNvdXJjZSByb290Ci0gICAgICBhZGRSZXNvdXJjZVJvb3QocHJvamVjdCwgZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotCi0gICAgICAvLyB0YWdsaWJzIG1hcCBzeW50YXggcmVxdWlyZXMgZGlzdGluY3Qgc2hvcnROYW1lcywKLSAgICAgIC8vIHdoaWNoIGlzIGEgR29vZCBUaGluZyEKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhZ2xpYnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IFNraXBGaWx0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgQ29tcG9uZW50VGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkksIGZhbHNlKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgdmFsaWRhdG9ycyA9IGZhY2VzQ29uZmlnLnZhbGlkYXRvcnMoKTsKLSAgICAgICAgdmFsaWRhdG9ycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHZhbGlkYXRvcnMsIG5ldyBWYWxpZGF0b3JUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSwgZmFsc2UpKTsKLQotICAgICAgICBJdGVyYXRvciBjb252ZXJ0ZXJzID0gZmFjZXNDb25maWcuY29udmVydGVycygpOwotICAgICAgICBjb252ZXJ0ZXJzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29udmVydGVycywgbmV3IENvbnZlcnRlclRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJLCBmYWxzZSkpOwotCi0KLSAgICAgICAgU3RyaW5nIHRhcmdldFBhdGggPSAiTUVUQS1JTkYvIiArIHNob3J0TmFtZSArICIudGFnbGliLnhtbCI7Ci0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeSwgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ1BhdGggPSAiTUVUQS1JTkYvIiArIHNob3J0TmFtZSArICItYmFzZS50YWdsaWIueG1sIjsKLSAgICAgICAgRmlsZSBjb25maWdGaWxlID0gbmV3IEZpbGUoY29uZmlnU291cmNlRGlyZWN0b3J5LCBjb25maWdQYXRoKTsKLQotICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotCi0gICAgICAgIGlmICgoY29tcG9uZW50cy5oYXNOZXh0KCl8fHZhbGlkYXRvcnMuaGFzTmV4dCgpfHxjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgICAgICYmIGNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgIFhNTE91dHB1dEZhY3Rvcnkgb3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtID0gb3V0cHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgIF93cml0ZVN0YXJ0VGFnTGlicmFyeShzdHJlYW0sIF9YSU5DTFVERV9GQUNFTEVUU19UQUdfTElCUkFSWV9EVEQpOwotICAgICAgICAgIC8vIGJhc2UgZ29lcyBmaXJzdAotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgieGkiLCAiaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlTmFtZXNwYWNlKCJ4aSIsIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJocmVmIiwgY29uZmlnRmlsZS50b1VSTCgpLnRvRXh0ZXJuYWxGb3JtKCkpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgieHBvaW50ZXIiLCAiL2ZhY2VsZXQtdGFnbGliLyoiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgX3dyaXRlVGFncyhjb21wb25lbnRzLCB2YWxpZGF0b3JzLCBjb252ZXJ0ZXJzLCBzdHJlYW0pOwotCi0gICAgICAgICAgX3dyaXRlRW5kVGFnTGlicmFyeShzdHJlYW0pOwotICAgICAgICAgIHN0cmVhbS5jbG9zZSgpOwotCi0gICAgICAgICAgSW5wdXRTdHJlYW0gbWVyZ2VkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICAgIC8vIGV4cGFuZCBhbGwgdGhlIHhpOmluY2x1ZGUgZWxlbWVudHMKLSAgICAgICAgICBTQVhQYXJzZXJGYWN0b3J5IHNheEZhY3RvcnkgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgICAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgICAgIFhNTFJlYWRlciBtZXJnZWRSZWFkZXIgPSBzYXhQYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgICAgICAgbWVyZ2VkUmVhZGVyID0gbmV3IFhJbmNsdWRlRmlsdGVyKG1lcmdlZFJlYWRlciwgY29uZmlnRmlsZS50b1VSTCgpKTsKLSAgICAgICAgICAvLyBldmVuIHdpdGggdmFsaWRhdGluZz1mYWxzZSwgRFREIGlzIHN0aWxsIGRvd25sb2FkZWQgc28gdGhhdAotICAgICAgICAgIC8vIGFueSBlbnRpdGllcyBjb250YWluZWQgaW4gdGhlIGRvY3VtZW50IGNhbiBiZSBleHBhbmRlZC4KLSAgICAgICAgICAvLyB0aGUgZm9sbG93aW5nIGRpc2FibGVzIHRoYXQgYmVoYXZpb3IsIGFsc28gc2F2aW5nIHRoZSB0aW1lCi0gICAgICAgICAgLy8gc3BlbnQgdG8gcGFyc2UgdGhlIERURAotICAgICAgICAgIG1lcmdlZFJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgSW5wdXRTb3VyY2UgbWVyZ2VkSW5wdXQgPSBuZXcgSW5wdXRTb3VyY2UobWVyZ2VkU3RyZWFtKTsKLSAgICAgICAgICBTb3VyY2UgbWVyZ2VkU291cmNlID0gbmV3IFNBWFNvdXJjZShtZXJnZWRSZWFkZXIsIG1lcmdlZElucHV0KTsKLQotICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgUmVzdWx0IG1lcmdlZFJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQodGFyZ2V0RmlsZSk7Ci0KLSAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgVHJhbnNmb3JtZXIgaWRlbnRpdHkgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICBpZGVudGl0eS5zZXRPdXRwdXRQcm9wZXJ0eShPdXRwdXRLZXlzLkRPQ1RZUEVfUFVCTElDLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyk7Ci0gICAgICAgICAgaWRlbnRpdHkuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0pOwotICAgICAgICAgIGlkZW50aXR5LnRyYW5zZm9ybShtZXJnZWRTb3VyY2UsIG1lcmdlZFJlc3VsdCk7Ci0KLSAgICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoY29tcG9uZW50cy5oYXNOZXh0KCl8fHZhbGlkYXRvcnMuaGFzTmV4dCgpfHxjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0KLSAgICAgICAgICBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoc3RyZWFtLCBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRFREKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJuYW1lc3BhY2UiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKG5hbWVzcGFjZVVSSSk7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgICAgICAgX3dyaXRlVGFncyhjb21wb25lbnRzLCB2YWxpZGF0b3JzLCBjb252ZXJ0ZXJzLCBzdHJlYW0pOwotICAgICAgICAgIF93cml0ZUVuZFRhZ0xpYnJhcnkoc3RyZWFtKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb25maWdGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY29weSBpZiBuZXdlcgotICAgICAgICAgIGlmIChjb25maWdGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoY29uZmlnRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGVkICIgKyB0YXJnZXRQYXRoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFncyhJdGVyYXRvciBjb21wb25lbnRzLCBJdGVyYXRvciB2YWxpZGF0b3JzLAotICAgICAgICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMsIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0pCi0gICAgICB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbiljb21wb25lbnRzLm5leHQoKTsKLSAgICAgIF93cml0ZVRhZyhzdHJlYW0sIGNvbXBvbmVudCk7Ci0gICAgfQotICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVWYWxpZGF0b3JUYWcoc3RyZWFtLCAoVmFsaWRhdG9yQmVhbikgdmFsaWRhdG9ycy5uZXh0KCkpOwotICAgIH0KLSAgICB3aGlsZSAoY29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgX3dyaXRlQ29udmVydGVyVGFnKHN0cmVhbSwgKENvbnZlcnRlckJlYW4pIGNvbnZlcnRlcnMubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgU3RyaW5nICAgICAgICAgIGR0ZCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnREb2N1bWVudCgiMS4wIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBzdHJlYW0ud3JpdGVEVEQoZHRkKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZmFjZWxldC10YWdsaWIiKTsKLSAgICBzdHJlYW0ud3JpdGVEZWZhdWx0TmFtZXNwYWNlKF9GQUNFTEVUU19OQU1FU1BBQ0VfVVJJKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlRW5kVGFnTGlicmFyeSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUVuZERvY3VtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCBjb21wb25lbnQgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgQ29tcG9uZW50QmVhbiAgIGNvbXBvbmVudCkgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctbmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29tcG9uZW50LmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiY29tcG9uZW50Iik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImNvbXBvbmVudC10eXBlIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgCi0gICAgaWYgKGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJlbmRlcmVyLXR5cGUiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29tcG9uZW50LmdldFJlbmRlcmVyVHlwZSgpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIHRhZ0hhbmRsZXIgPSBjb21wb25lbnQuZ2V0VGFnSGFuZGxlcigpOwotICAgIGlmICh0YWdIYW5kbGVyID09IG51bGwpCi0gICAgewotICAgICAgdGFnSGFuZGxlciA9IGZhY2VsZXRIYW5kbGVyQ2xhc3M7Ci0gICAgfQotICAgIGlmICh0YWdIYW5kbGVyICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiaGFuZGxlci1jbGFzcyIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh0YWdIYW5kbGVyKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIHZhbGlkYXRvciBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVWYWxpZGF0b3JUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBWYWxpZGF0b3JCZWFuICAgdmFsaWRhdG9yKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1uYW1lIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpLmdldExvY2FsUGFydCgpKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ2YWxpZGF0b3IiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidmFsaWRhdG9yLWlkIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh2YWxpZGF0b3IuZ2V0VmFsaWRhdG9ySWQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHRhZyBsaWJyYXJ5IGRlc2NyaXB0b3IgZm9yIHBhcnNlZCBjb252ZXJ0ZXIgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29udmVydGVyVGFnKAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgQ29udmVydGVyQmVhbiAgIGNvbnZlcnRlcikgdGhyb3dzIFhNTFN0cmVhbUV4Y2VwdGlvbgotICB7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWctbmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29udmVydGVyLmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiY29udmVydGVyIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImNvbnZlcnRlci1pZCIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29udmVydGVyLmdldENvbnZlcnRlcklkKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Ik1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZVBhdGg7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIE1hcCB0YWdsaWJzOwotCi0KLSAgLyoqCi0gICAqQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgZmFjZWxldEhhbmRsZXJDbGFzczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9jb25mIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBjb25maWdTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRSZXNvdXJjZXNEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0ZBQ0VMRVRTX05BTUVTUEFDRV9VUkkgPQotICAgICAgICAgICAgICAiaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvRmFjZWxldCI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyA9Ci0gICAgICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgRmFjZWxldCBUYWdsaWIgMS4wLy9FTiI7Ci0KLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSA9Ci0gICAgICAgICAgICAgICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC9mYWNlbGV0LXRhZ2xpYl8xXzAuZHRkIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RURCA9Ci0gICAgIjwhRE9DVFlQRSBmYWNlbGV0LXRhZ2xpYiBQVUJMSUMgXG4iICsKLSAgICAiICBcIiIgKyBfRkFDRUxFVFNfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMgKyAiXCJcbiIgKwotICAgICIgIFwiIiArIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSArICJcIiA+XG4iOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfWElOQ0xVREVfRkFDRUxFVFNfVEFHX0xJQlJBUllfRFREID0KLSAgICAiPCFET0NUWVBFIHRhZ2xpYiBQVUJMSUNcbiIgKwotICAgICIgIFwiIiArIF9GQUNFTEVUU19UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyArICJcIlxuIiArCi0gICAgIiAgXCIiICsgX0ZBQ0VMRVRTX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNICsgIlwiIFtcbiIgKwotICAgICIgICAgICA8IUVMRU1FTlQgeGk6aW5jbHVkZSBFTVBUWT5cbiIgKwotICAgICIgICAgICA8IUFUVExJU1QgeGk6aW5jbHVkZVxuIiArCi0gICAgIiAgICAgICAgICB4bWxuczp4aSBDREFUQSAjRklYRUQgIFwiIiArIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSArICJcIlxuIiArCi0gICAgIiAgICAgICAgICBocmVmICAgICBDREFUQSAjSU1QTElFRFxuIiArCi0gICAgIiAgICAgICAgICB4cG9pbnRlciBDREFUQSAjSU1QTElFRD5cbiIgKwotICAgICJdPlxuIjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjI0MjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlRmFjZXNDb25maWdNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5YSW5jbHVkZUZpbHRlcjsKLWltcG9ydCBvcmcudzNjLmRvbS5Eb2N1bWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5FbGVtZW50OwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy4qOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uKjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLmRvbS5ET01Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YS5pby4qOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtZmFjZXMtY29uZmlnCi0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBhbHdheXMgYWRkIHJlc291cmNlcyBkaXJlY3RvcnkgdG8gcHJvamVjdCByZXNvdXJjZSByb290Ci0gICAgICBhZGRSZXNvdXJjZVJvb3QocHJvamVjdCwgdGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgIFVSTFtdIGluZGV4ID0gcmVhZEluZGV4KHByb2plY3QpOwotCi0gICAgICBpZiAoIWZvcmNlICYmICFpc01vZGlmaWVkU2luY2UoaW5kZXgsIHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gIiArIHRhcmdldFBhdGggKyAiIGlzIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgTGlzdCBjb25maWdVUkxzID0gZ2V0TWFzdGVyQ29uZmlncyhwcm9qZWN0KTsKLQotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShjb25maWdEaXJlY3RvcnksIGNvbmZpZ1BhdGgpOwotICAgICAgICBpZiAoY29uZmlnRmlsZS5leGlzdHMoKSkKLSAgICAgICAgewotICAgICAgICAgIGNvbmZpZ1VSTHMgPSBuZXcgTGlua2VkTGlzdChjb25maWdVUkxzKTsKLSAgICAgICAgICAvLyBiYXNlIGNvbmZpZyBnb2VzIGZpcnN0Ci0gICAgICAgICAgY29uZmlnVVJMcy5hZGQoMCwgY29uZmlnRmlsZS50b1VSTCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghY29uZmlnVVJMcy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBVUkwgYmFzZVVSTCA9IEdlbmVyYXRlRmFjZXNDb25maWdNb2pvLmNsYXNzLmdldFJlc291cmNlKCJyZXNvdXJjZXMvZmFjZXMtY29uZmlnLnhtbCIpOwotICAgICAgICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZG9jRmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBEb2N1bWVudEJ1aWxkZXIgZG9jQnVpbGRlciA9IGRvY0ZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCk7Ci0gICAgICAgICAgRG9jdW1lbnQgZG9jdW1lbnQgPSBkb2NCdWlsZGVyLnBhcnNlKGJhc2VVUkwub3BlblN0cmVhbSgpKTsKLSAgICAgICAgICBFbGVtZW50IHJvb3QgPSBkb2N1bWVudC5nZXREb2N1bWVudEVsZW1lbnQoKTsKLQotICAgICAgICAgIC8vIGVtYmVkIGVhY2ggPHhpOmluY2x1ZGU+IGVsZW1lbnQKLSAgICAgICAgICBmb3IgKEl0ZXJhdG9yIGkgPSBjb25maWdVUkxzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgICAgewotICAgICAgICAgICAgVVJMIHVybCA9IChVUkwpaS5uZXh0KCk7Ci0gICAgICAgICAgICBFbGVtZW50IGluY2x1ZGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50TlMoImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ4aTppbmNsdWRlIik7Ci0gICAgICAgICAgICBpbmNsdWRlLnNldEF0dHJpYnV0ZSgiaHJlZiIsIHVybC50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICAgIGluY2x1ZGUuc2V0QXR0cmlidXRlKCJ4cG9pbnRlciIsICIvZmFjZXMtY29uZmlnLyoiKTsKLSAgICAgICAgICAgIHJvb3QuaW5zZXJ0QmVmb3JlKGluY2x1ZGUsIHJvb3QuZ2V0Rmlyc3RDaGlsZCgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBOb3RlOiB1c2UgYSBkaXJlY3QgRE9NLT5TQVggcmVhZGVyCi0gICAgICAgICAgLy8gICAgICAgcmF0aGVyIHRoYW4gdHJhbnNmb3JtaW5nIHRvIHN0cmluZwotICAgICAgICAgIFRyYW5zZm9ybWVyRmFjdG9yeSB0cmFuc0ZhY3RvcnkgPSBUcmFuc2Zvcm1lckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBUcmFuc2Zvcm1lciBpZGVudGl0eSA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcigpOwotICAgICAgICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICAgICAgaWRlbnRpdHkudHJhbnNmb3JtKG5ldyBET01Tb3VyY2UoZG9jdW1lbnQpLCBuZXcgU3RyZWFtUmVzdWx0KG91dCkpOwotCi0gICAgICAgICAgSW5wdXRTdHJlYW0gbWVyZ2VkU3RyZWFtID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKG91dC50b0J5dGVBcnJheSgpKTsKLSAgICAgICAgICAvLyBleHBhbmQgYWxsIHRoZSB4aTppbmNsdWRlIGVsZW1lbnRzCi0gICAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzYXhGYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0gICAgICAgICAgc2F4RmFjdG9yeS5zZXRWYWxpZGF0aW5nKGZhbHNlKTsKLSAgICAgICAgICBTQVhQYXJzZXIgc2F4UGFyc2VyID0gc2F4RmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICBYTUxSZWFkZXIgbWVyZ2VkUmVhZGVyID0gc2F4UGFyc2VyLmdldFhNTFJlYWRlcigpOwotICAgICAgICAgIG1lcmdlZFJlYWRlciA9IG5ldyBYSW5jbHVkZUZpbHRlcihtZXJnZWRSZWFkZXIsIGJhc2VVUkwpOwotICAgICAgICAgIG1lcmdlZFJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcihuZXcgRW50aXR5UmVzb2x2ZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBwdWJsaWMgSW5wdXRTb3VyY2UgcmVzb2x2ZUVudGl0eSgKLSAgICAgICAgICAgICAgICBTdHJpbmcgcHVibGljSWQsCi0gICAgICAgICAgICAgICAgU3RyaW5nIHN5c3RlbUlkKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnB1dFNvdXJjZShuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obmV3IGJ5dGVbMF0pKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfSk7Ci0gICAgICAgICAgSW5wdXRTb3VyY2UgbWVyZ2VkSW5wdXQgPSBuZXcgSW5wdXRTb3VyY2UobWVyZ2VkU3RyZWFtKTsKLSAgICAgICAgICBTb3VyY2UgbWVyZ2VkU291cmNlID0gbmV3IFNBWFNvdXJjZShtZXJnZWRSZWFkZXIsIG1lcmdlZElucHV0KTsKLQotICAgICAgICAgIC8vIFRyYW5zZm9ybSB0aGUgY29tYmluZWQgZmFjZXMtY29uZmlnLnhtbCBmaWxlIHRvIHJlc29sdmUKLSAgICAgICAgICAvLyBjb21wb25lbnQtc3VwZXJ0eXBlLCBpbmplY3QgdGhlIERURCBhbmQgZW5zdXJlIHRoYXQKLSAgICAgICAgICAvLyBtZXRhZGF0YSBpcyByZXByZXNlbnRlZCBjb21wYXRpYmx5IHdpdGggSlNGIDEuMSBzeW50YXguCi0gICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQotICAgICAgICAgIEZpbGUgdG1wRmlsZSA9IG51bGw7Ci0gICAgICAgICAgT3V0cHV0U3RyZWFtIHJlc3VsdFN0cmVhbTsKLSAgICAgICAgICBpZiAodHJhbnNmb3JtU3R5bGVzaGVldCAhPSBudWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHRtcEZpbGUgPSBGaWxlLmNyZWF0ZVRlbXBGaWxlKCJnZW5lcmF0ZS1mYWNlcy1jb25maWciLCBudWxsKTsKLSAgICAgICAgICAgIHJlc3VsdFN0cmVhbSA9IG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRtcEZpbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgcmVzdWx0U3RyZWFtID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgUmVzdWx0IG1lcmdlZFJlc3VsdCA9IG5ldyBTdHJlYW1SZXN1bHQocmVzdWx0U3RyZWFtKTsKLQotICAgICAgICAgIFVSTCB4c2xVUkw7Ci0gICAgICAgICAgaWYgKF9pczEyKCkpCi0gICAgICAgICAgICB4c2xVUkwgPSBnZXRDbGFzcygpLmdldFJlc291cmNlKCJyZXNvdXJjZXMvdHJhbnNmb3JtMTIueHNsIik7Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgICAgeHNsVVJMID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZSgicmVzb3VyY2VzL3RyYW5zZm9ybS54c2wiKTsKLQotICAgICAgICAgIElucHV0U3RyZWFtIHhzbCA9IHhzbFVSTC5vcGVuU3RyZWFtKCk7Ci0gICAgICAgICAgU3RyZWFtU291cmNlIHhzbFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UoeHNsKTsKLSAgICAgICAgICBUcmFuc2Zvcm1lciB0cmFuc2Zvcm1lciA9IHRyYW5zRmFjdG9yeS5uZXdUcmFuc2Zvcm1lcih4c2xTb3VyY2UpOwotICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigicGFja2FnZUNvbnRhaW5zIiwgcGFja2FnZUNvbnRhaW5zKTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInR5cGVQcmVmaXgiLCB0eXBlUHJlZml4KTsKLSAgICAgICAgICB0cmFuc2Zvcm1lci5zZXRQYXJhbWV0ZXIoInJlbW92ZVJlbmRlcmVycyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbW92ZVJlbmRlcmVycyA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgIHRyYW5zZm9ybWVyLnNldFBhcmFtZXRlcigiY29udmVydGVyUGFja2FnZUNvbnRhaW5zIiwgZ2V0UGFyYW1ldGVyKGNvbnZlcnRlclBhY2thZ2VDb250YWlucywgcGFja2FnZUNvbnRhaW5zKSk7Ci0gICAgICAgICAgdHJhbnNmb3JtZXIuc2V0UGFyYW1ldGVyKCJ2YWxpZGF0b3JQYWNrYWdlQ29udGFpbnMiLCBnZXRQYXJhbWV0ZXIodmFsaWRhdG9yUGFja2FnZUNvbnRhaW5zLCBwYWNrYWdlQ29udGFpbnMpKTsKLQotICAgICAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShtZXJnZWRTb3VyY2UsIG1lcmdlZFJlc3VsdCk7Ci0gICAgICAgICAgcmVzdWx0U3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICAvLyBPSywgaWYgdGhlcmUncyBhIHRyYW5zZm9ybVN5bGVzaGVldCwgd2UndmUgd3JpdHRlbgotICAgICAgICAgIC8vIHRoZSBvdXRwdXQgdG8gYSB0ZW1wb3JhcnkgZmlsZSwgbm93IHRyYW5zZm9ybSBpdCBhZ2Fpbi4KLSAgICAgICAgICAvLyA9LT1GSVhNRSBBZGFtV2luZXI6ICBubywgdGhpcyBpcyBub3QgdGhlIHNtYXJ0ZXN0IGFuZAotICAgICAgICAgIC8vIGZhc3Rlc3Qgd2F5IHRvIGRvIGl0LiAgQnV0IGFmdGVyIGZpbmRpbmcgb3V0Ci0gICAgICAgICAgLy8gdGhhdCBYTUxGaWx0ZXIgYXBwYXJlbnRseSBkb2Vzbid0IHN1cHBvcnQgWFNMIHBhcmFtZXRlcnMsCi0gICAgICAgICAgLy8gYW5kIHJ1bm5pbmcgaW50byBhIGJpemFycmUgImlsbGVnYWwgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjoKLSAgICAgICAgICAvLyBzYXhvbjp3YXJuaW5nIiBlcnJvciBtZXNzYWdlIHdoZW4gdXNpbmcgY2hhaW5lZCBoYW5kbGVycywgSSBnb3QKLSAgICAgICAgICAvLyB0aXJlZCBvZiB0cnlpbmcgdG8gYmUgc21hcnQuICBUaGlzIGlzIGdvb2QgZW5vdWdoLgotICAgICAgICAgIGlmICh0cmFuc2Zvcm1TdHlsZXNoZWV0ICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyZWFtU291cmNlIHRtcFNvdXJjZSA9IG5ldyBTdHJlYW1Tb3VyY2UodG1wRmlsZSk7Ci0gICAgICAgICAgICBTdHJlYW1Tb3VyY2UgdHJhbnNmb3JtU291cmNlID0gbmV3IFN0cmVhbVNvdXJjZSgKLSAgICAgICAgICAgICAgICBuZXcgRmlsZShjb25maWdEaXJlY3RvcnksIHRyYW5zZm9ybVN0eWxlc2hlZXQpKTsKLSAgICAgICAgICAgIFRyYW5zZm9ybWVyIGZpbmFsVHJhbnNmb3JtID0KLSAgICAgICAgICAgICAgdHJhbnNGYWN0b3J5Lm5ld1RyYW5zZm9ybWVyKHRyYW5zZm9ybVNvdXJjZSk7Ci0gICAgICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIGZpbmFsT3V0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICBSZXN1bHQgZmluYWxSZXN1bHQgPQotICAgICAgICAgICAgICBuZXcgU3RyZWFtUmVzdWx0KGZpbmFsT3V0KTsKLQotICAgICAgICAgICAgZmluYWxUcmFuc2Zvcm0udHJhbnNmb3JtKHRtcFNvdXJjZSwgZmluYWxSZXN1bHQpOwotICAgICAgICAgICAgZmluYWxPdXQuY2xvc2UoKTsKLSAgICAgICAgICAgIHRtcEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgCi0gICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotCi0gICAgICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGVkICIgKyB0YXJnZXRQYXRoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGR1cmluZyBnZW5lcmF0aW9uIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJvb2xlYW4gX2lzMTIoKQotICB7Ci0gICAgcmV0dXJuICIxLjIiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMTIiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFBhcmFtZXRlcihTdHJpbmcgcGFyYW1OYW1lLCBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgU3RyaW5nIHBhcmFtOwotCi0gICAgaWYgKHBhcmFtTmFtZS5sZW5ndGgoKSA+IDApCi0gICAgewotICAgICAgIHBhcmFtID0gcGFyYW1OYW1lOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgICBwYXJhbSA9IGRlZmF1bHRWYWx1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIHBhcmFtOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2NvbmYiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGNvbmZpZ0RpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgY29uZmlnUGF0aCA9ICJNRVRBLUlORi9mYWNlcy1jb25maWctYmFzZS54bWwiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBwYWNrYWdlQ29udGFpbnMgPSAiIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgY29udmVydGVyUGFja2FnZUNvbnRhaW5zID0gIiI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHZhbGlkYXRvclBhY2thZ2VDb250YWlucyA9ICIiOwotCi0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFBhdGggPSAiTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbCI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdHlwZVByZWZpeCA9ICIiOwotCi0gIC8qKgotICAgKiBOYW1lIG9mIGFuIFhTTFQgc3R5bGVzaGVldCBpbiBzcmMvbWFpbi9jb25mIHRoYXQgd2lsbCBiZSBhcHBsaWVkCi0gICAqIGFzIHRoZSBmaW5hbCBzdGVwLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBpbXBsZW1lbnQgYW55IGZpbmFsIGZpeHVwCi0gICAqIG9mIHRoZSBvdXRwdXQuCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRyYW5zZm9ybVN0eWxlc2hlZXQ7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiByZW1vdmVSZW5kZXJlcnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVKc3BUYWdsaWJzTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlSnNwVGFnbGlic01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE5NGI4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVKc3BUYWdsaWJzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE0NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLkFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5BYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuQ29tcG9uZW50VGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5NeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5NeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5NeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5UYWdBdHRyaWJ1dGVGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliLlRyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYi5UcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWIuVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLk1ldGhvZFNpZ25hdHVyZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db21wb25lbnRGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkNvbnZlcnRlckZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVmFsaWRhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5YSW5jbHVkZUZpbHRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotaW1wb3J0IG9yZy54bWwuc2F4LkVudGl0eVJlc29sdmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcueG1sLnNheC5YTUxSZWFkZXI7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MT3V0cHV0RmFjdG9yeTsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwuc3RyZWFtLlhNTFN0cmVhbVdyaXRlcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLk91dHB1dEtleXM7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5SZXN1bHQ7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1qc3AtdGFnbGlicwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlSnNwVGFnbGlic01vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgcHJvY2Vzc0luZGV4KHByb2plY3QsIHJlc291cmNlUGF0aCk7Ci0gICAgICBfZ2VuZXJhdGVUYWdIYW5kbGVycygpOwotICAgICAgX2dlbmVyYXRlVGFnTGlicmFyeURlc2NyaXB0b3JzKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8vIGhvb2sgZm9yIGN1c3RvbSBjb21wb25lbnQgdGFnIGphdmEgY29udGVudAotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUN1c3RvbUNvbXBvbmVudFRhZ0hhbmRsZXJDb250ZW50KAotICAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0gIC8vIGhvb2sgZm9yIGN1c3RvbSBjb21wb25lbnQgdGFnIGphdmEgaW1wb3J0cwotICBwcm90ZWN0ZWQgdm9pZCBhZGRDdXN0b21Db21wb25lbnRUYWdIYW5kbGVySW1wb3J0cygKLSAgICAgIFNldCAgICAgICAgICAgaW1wb3J0cywKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gIH0KLQotICAvLyBob29rIGZvciBjdXN0b20gY29tcG9uZW50IGRlc2NyaXB0b3IgY29udGVudAotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUN1c3RvbUNvbXBvbmVudFRhZ0Rlc2NyaXB0b3JDb250ZW50KAotICAgICAgWE1MU3RyZWFtV3JpdGVyICBzdHJlYW0sCi0gICAgICBDb21wb25lbnRCZWFuICAgIGNvbXBvbmVudCl0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9ycyBmb3IgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfZ2VuZXJhdGVUYWdMaWJyYXJ5RGVzY3JpcHRvcnMoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gYWx3YXlzIGFkZCByZXNvdXJjZXMgZGlyZWN0b3J5IHRvIHByb2plY3QgcmVzb3VyY2Ugcm9vdAotICAgICAgYWRkUmVzb3VyY2VSb290KHByb2plY3QsIGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICAvLyB0YWdsaWJzIG1hcCBzeW50YXggcmVxdWlyZXMgZGlzdGluY3Qgc2hvcnROYW1lcywKLSAgICAgIC8vIHdoaWNoIGlzIGEgR29vZCBUaGluZyEKLSAgICAgIGZvciAoSXRlcmF0b3IgaSA9IHRhZ2xpYnMuZW50cnlTZXQoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgICBTdHJpbmcgc2hvcnROYW1lID0gKFN0cmluZyllbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgU3RyaW5nIG5hbWVzcGFjZVVSSSA9IChTdHJpbmcpZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IFNraXBGaWx0ZXIoKSk7Ci0gICAgICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgQ29tcG9uZW50VGFnTGlicmFyeUZpbHRlcihuYW1lc3BhY2VVUkkpKTsKLQotICAgICAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgICAgICB2YWxpZGF0b3JzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IodmFsaWRhdG9ycywgbmV3IFZhbGlkYXRvclRhZ0xpYnJhcnlGaWx0ZXIobmFtZXNwYWNlVVJJKSk7Ci0KLSAgICAgICAgSXRlcmF0b3IgY29udmVydGVycyA9IGZhY2VzQ29uZmlnLmNvbnZlcnRlcnMoKTsKLSAgICAgICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdMaWJyYXJ5RmlsdGVyKG5hbWVzcGFjZVVSSSkpOwotCi0gICAgICAgIFN0cmluZyB0YXJnZXRQYXRoID0gIk1FVEEtSU5GLyIgKyBzaG9ydE5hbWUgKyAiLnRsZCI7Ci0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKGdlbmVyYXRlZFJlc291cmNlc0RpcmVjdG9yeSwgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgICAgU3RyaW5nIGNvbmZpZ1BhdGggPSAiTUVUQS1JTkYvIiArIHNob3J0TmFtZSArICItYmFzZS50bGQiOwotICAgICAgICBGaWxlIGNvbmZpZ0ZpbGUgPSBuZXcgRmlsZShjb25maWdTb3VyY2VEaXJlY3RvcnksIGNvbmZpZ1BhdGgpOwotCi0gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0KLSAgICAgICAgYm9vbGVhbiBoYXNHZW5lcmF0ZWRUYWdzID0gKGNvbXBvbmVudHMuaGFzTmV4dCgpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0ZXJzLmhhc05leHQoKSB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsaWRhdG9ycy5oYXNOZXh0KCkpOwotCi0gICAgICAgIGlmIChoYXNHZW5lcmF0ZWRUYWdzICYmIGNvbmZpZ0ZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICAgIFhNTE91dHB1dEZhY3Rvcnkgb3V0cHV0RmFjdG9yeSA9IFhNTE91dHB1dEZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtID0gb3V0cHV0RmFjdG9yeS5jcmVhdGVYTUxTdHJlYW1Xcml0ZXIob3V0KTsKLQotICAgICAgICAgIF93cml0ZVN0YXJ0VGFnTGlicmFyeShzdHJlYW0sIF9YSU5DTFVERV9KU1BfVEFHX0xJQlJBUllfRFREKTsKLSAgICAgICAgICAvLyBiYXNlIGdvZXMgZmlyc3QKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInhpIiwgImluY2x1ZGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgIHN0cmVhbS53cml0ZU5hbWVzcGFjZSgieGkiLCBYSW5jbHVkZUZpbHRlci5YSU5DTFVERV9OQU1FU1BBQ0UpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgiaHJlZiIsIGNvbmZpZ0ZpbGUudG9VUkwoKS50b0V4dGVybmFsRm9ybSgpKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVBdHRyaWJ1dGUoInhwb2ludGVyIiwgIi90YWdsaWIvKiIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbiljb21wb25lbnRzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIGNvbXBvbmVudCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlciA9IChDb252ZXJ0ZXJCZWFuKWNvbnZlcnRlcnMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgY29udmVydGVyKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKHZhbGlkYXRvcnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yID0gKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCB2YWxpZGF0b3IpOwotICAgICAgICAgIH0KLSAgICAgICAgICBfd3JpdGVFbmRUYWdMaWJyYXJ5KHN0cmVhbSk7Ci0gICAgICAgICAgc3RyZWFtLmNsb3NlKCk7Ci0KLSAgICAgICAgICBJbnB1dFN0cmVhbSBtZXJnZWRTdHJlYW0gPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0LnRvQnl0ZUFycmF5KCkpOwotCi0gICAgICAgICAgLy8gZXhwYW5kIGFsbCB0aGUgeGk6aW5jbHVkZSBlbGVtZW50cwotICAgICAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICBzYXhGYWN0b3J5LnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgICAgICAgIHNheEZhY3Rvcnkuc2V0VmFsaWRhdGluZyhmYWxzZSk7Ci0gICAgICAgICAgU0FYUGFyc2VyIHNheFBhcnNlciA9IHNheEZhY3RvcnkubmV3U0FYUGFyc2VyKCk7Ci0gICAgICAgICAgWE1MUmVhZGVyIG1lcmdlZFJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgICAgICBtZXJnZWRSZWFkZXIgPSBuZXcgWEluY2x1ZGVGaWx0ZXIobWVyZ2VkUmVhZGVyLCBjb25maWdGaWxlLnRvVVJMKCkpOwotICAgICAgICAgIC8vIGV2ZW4gd2l0aCB2YWxpZGF0aW5nPWZhbHNlLCBEVEQgaXMgc3RpbGwgZG93bmxvYWRlZCBzbyB0aGF0Ci0gICAgICAgICAgLy8gYW55IGVudGl0aWVzIGNvbnRhaW5lZCBpbiB0aGUgZG9jdW1lbnQgY2FuIGJlIGV4cGFuZGVkLgotICAgICAgICAgIC8vIHRoZSBmb2xsb3dpbmcgZGlzYWJsZXMgdGhhdCBiZWhhdmlvciwgYWxzbyBzYXZpbmcgdGhlIHRpbWUKLSAgICAgICAgICAvLyBzcGVudCB0byBwYXJzZSB0aGUgRFRECi0gICAgICAgICAgbWVyZ2VkUmVhZGVyLnNldEVudGl0eVJlc29sdmVyKG5ldyBFbnRpdHlSZXNvbHZlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHB1YmxpYyBJbnB1dFNvdXJjZSByZXNvbHZlRW50aXR5KAotICAgICAgICAgICAgICAgIFN0cmluZyBwdWJsaWNJZCwKLSAgICAgICAgICAgICAgICBTdHJpbmcgc3lzdGVtSWQpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IElucHV0U291cmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgICBJbnB1dFNvdXJjZSBtZXJnZWRJbnB1dCA9IG5ldyBJbnB1dFNvdXJjZShtZXJnZWRTdHJlYW0pOwotICAgICAgICAgIFNvdXJjZSBtZXJnZWRTb3VyY2UgPSBuZXcgU0FYU291cmNlKG1lcmdlZFJlYWRlciwgbWVyZ2VkSW5wdXQpOwotCi0gICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICBSZXN1bHQgbWVyZ2VkUmVzdWx0ID0gbmV3IFN0cmVhbVJlc3VsdChuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKSk7Ci0KLSAgICAgICAgICBUcmFuc2Zvcm1lckZhY3RvcnkgdHJhbnNGYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgVHJhbnNmb3JtZXIgaWRlbnRpdHkgPSB0cmFuc0ZhY3RvcnkubmV3VHJhbnNmb3JtZXIoKTsKLSAgICAgICAgICBpZiAoIV9pczEyKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgaWRlbnRpdHkuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1BVQkxJQywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9QVUJMSUMpOwotICAgICAgICAgICAgaWRlbnRpdHkuc2V0T3V0cHV0UHJvcGVydHkoT3V0cHV0S2V5cy5ET0NUWVBFX1NZU1RFTSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9KU1BfVEFHX0xJQlJBUllfRE9DVFlQRV9TWVNURU0pOwotICAgICAgICAgIH0KLQotICAgICAgICAgIGlkZW50aXR5LnRyYW5zZm9ybShtZXJnZWRTb3VyY2UsIG1lcmdlZFJlc3VsdCk7Ci0KLSAgICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAoaGFzR2VuZXJhdGVkVGFncykKLSAgICAgICAgewotICAgICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICAgIE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbSh0YXJnZXRGaWxlKTsKLSAgICAgICAgICBYTUxPdXRwdXRGYWN0b3J5IG91dHB1dEZhY3RvcnkgPSBYTUxPdXRwdXRGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSA9IG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0KLSAgICAgICAgICBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoc3RyZWFtLCBfaXMxMigpID8gIjIuMSIgOiAiMS4yIiwgc2hvcnROYW1lLCBuYW1lc3BhY2VVUkkpOwotICAgICAgICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKWNvbXBvbmVudHMubmV4dCgpOwotICAgICAgICAgICAgX3dyaXRlVGFnKHN0cmVhbSwgY29tcG9uZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgd2hpbGUgKGNvbnZlcnRlcnMuaGFzTmV4dCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyID0gKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCk7Ci0gICAgICAgICAgICBfd3JpdGVUYWcoc3RyZWFtLCBjb252ZXJ0ZXIpOwotICAgICAgICAgIH0KLSAgICAgICAgICB3aGlsZSAodmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IgPSAoVmFsaWRhdG9yQmVhbil2YWxpZGF0b3JzLm5leHQoKTsKLSAgICAgICAgICAgIF93cml0ZVRhZyhzdHJlYW0sIHZhbGlkYXRvcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIF93cml0ZUVuZFRhZ0xpYnJhcnkoc3RyZWFtKTsKLSAgICAgICAgICBzdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjb25maWdGaWxlLmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gY29weSBpZiBuZXdlcgotICAgICAgICAgIGlmIChjb25maWdGaWxlLmxhc3RNb2RpZmllZCgpID4gdGFyZ2V0RmlsZS5sYXN0TW9kaWZpZWQoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoY29uZmlnRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChTQVhFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB0YWcgbGlicmFyeSIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHRhZyBsaWJyYXJ5IiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2Zvcm1lckV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHRhZyBsaWJyYXJ5IiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChYTUxTdHJlYW1FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB0YWcgbGlicmFyeSIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZ2VuZXJhdGluZyB0YWcgbGlicmFyaWVzIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVN0YXJ0VGFnTGlicmFyeSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFN0cmluZyAgICAgICAgICBkdGQpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZVN0YXJ0RG9jdW1lbnQoIjEuMCIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgaWYgKCFfaXMxMigpKQotICAgICAgc3RyZWFtLndyaXRlRFREKGR0ZCk7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnbGliIik7Ci0gICAgaWYgKF9pczEyKCkpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlTmFtZXNwYWNlKCIiLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7Ci0gICAgICBzdHJlYW0ud3JpdGVOYW1lc3BhY2UoInhzaSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIpOwotICAgICAgc3RyZWFtLndyaXRlQXR0cmlidXRlKCJ4c2k6c2NoZW1hTG9jYXRpb24iLCAiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1qc3B0YWdsaWJyYXJ5XzJfMS54c2QiKTsKLSAgICAgIHN0cmVhbS53cml0ZUF0dHJpYnV0ZSgidmVyc2lvbiIsICIyLjEiKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU3RhcnRUYWdMaWJyYXJ5KAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0sCi0gICAgU3RyaW5nICAgICAgICAgIHZlcnNpb24sCi0gICAgU3RyaW5nICAgICAgICAgIHNob3J0TmFtZSwKLSAgICBTdHJpbmcgICAgICAgICAgbmFtZXNwYWNlVVJJKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBfd3JpdGVTdGFydFRhZ0xpYnJhcnkoc3RyZWFtLCBfSlNQX1RBR19MSUJSQVJZX0RURCk7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0bGliLXZlcnNpb24iKTsKLSAgICBTdHJpbmcgdGxpYlZlcnNpb24gPSBwcm9qZWN0LmdldFZlcnNpb24oKTsKLSAgICAvLyBSZW1vdmUgZXZlcnl0aGluZyBidXQgZGV3ZXktZGVjaW1hbCBjaGFyYWN0ZXJzIChpLmUuLCBudW1iZXJzIGFuZCBwZXJpb2RzKQotICAgIHRsaWJWZXJzaW9uID0gdGxpYlZlcnNpb24ucmVwbGFjZUFsbCgiW14uMC05XSIsICIiKTsKLSAgICAvLyBSZW1vdmUgbGVhZGluZyBhbmQvb3IgdHJhaWxpbmcgcGVyaW9kcwotICAgIHdoaWxlICh0bGliVmVyc2lvbi5zdGFydHNXaXRoKCIuIikpCi0gICAgewotICAgICAgdGxpYlZlcnNpb24gPSB0bGliVmVyc2lvbi5zdWJzdHJpbmcoMSk7Ci0gICAgfQotCi0gICAgd2hpbGUgKHRsaWJWZXJzaW9uLmVuZHNXaXRoKCIuIikpCi0gICAgewotICAgICAgdGxpYlZlcnNpb24gPSB0bGliVmVyc2lvbi5zdWJzdHJpbmcoMCwgdGxpYlZlcnNpb24ubGVuZ3RoKCkgLSAxKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHRsaWJWZXJzaW9uKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0KLSAgICBpZiAoIV9pczEyKCkpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJqc3AtdmVyc2lvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyh2ZXJzaW9uKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgic2hvcnQtbmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoc2hvcnROYW1lKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidXJpIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhuYW1lc3BhY2VVUkkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVFbmRUYWdMaWJyYXJ5KAotICAgIFhNTFN0cmVhbVdyaXRlciBzdHJlYW0pIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4iKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRG9jdW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIGNvbXBvbmVudCBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBDb21wb25lbnRCZWFuICAgY29tcG9uZW50KSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLQotICAgIC8vIEluIEpTUCAyLjEsIGRlc2NyaXB0aW9uIGdvZXMgdXAgdG9wCi0gICAgaWYgKF9pczEyKCkgJiYgY29tcG9uZW50LmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1jbGFzcyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29tcG9uZW50LmdldFRhZ0NsYXNzKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIC8vIEluIEpTUCAyLjEsIGJvZHktY29udGVudCBpcyBub3Qgb3B0aW9uYWwKLSAgICBpZiAoX2lzMTIoKSkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiYm9keS1jb250ZW50Iik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJKU1AiKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBHZW5lcmF0ZUpzcFRhZ2xpYnNNb2pvLnRoaXMud3JpdGVDdXN0b21Db21wb25lbnRUYWdEZXNjcmlwdG9yQ29udGVudChzdHJlYW0sIGNvbXBvbmVudCk7Ci0KLSAgICAvLyBJbiBKU1AgMi4wLCBkZXNjcmlwdGlvbiBnb2VzIGp1c3QgYmVmb3JlIHRoZSBhdHRyaWJ1dGVzCi0gICAgaWYgKCFfaXMxMigpICYmIGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YShjb21wb25lbnQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKHRydWUpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgd3JpdGVUYWdBdHRyaWJ1dGUoc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICIpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgdGFnIGxpYnJhcnkgZGVzY3JpcHRvciBmb3IgcGFyc2VkIGNvbnZlcnRlciBtZXRhZGF0YS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVUYWcoCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBDb252ZXJ0ZXJCZWFuICAgY29udmVydGVyKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0YWciKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBpZiAoX2lzMTIoKSAmJiBjb252ZXJ0ZXIuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEoY29udmVydGVyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoY29udmVydGVyLmdldFRhZ05hbWUoKS5nZXRMb2NhbFBhcnQoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgidGFnLWNsYXNzIik7Ci0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgLy8gSW4gSlNQIDIuMSwgYm9keS1jb250ZW50IGlzIG5vdCBvcHRpb25hbAotICAgIGlmIChfaXMxMigpKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJib2R5LWNvbnRlbnQiKTsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoImVtcHR5Iik7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgaWYgKCFfaXMxMigpICYmIGNvbnZlcnRlci5nZXREZXNjcmlwdGlvbigpICE9IG51bGwpCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoImRlc2NyaXB0aW9uIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDRGF0YShjb252ZXJ0ZXIuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgfQotCi0gICAgLy8gY29udmVydGVycyBuZWVkIGFuIGlkIGF0dHJpYnV0ZQotICAgIHdyaXRlVGFnQXR0cmlidXRlKHN0cmVhbSwgImlkIiwgInRoZSBpZGVudGlmaWVyIGZvciB0aGUgY29udmVydGVyIiwgbnVsbCwgbnVsbCk7Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29udmVydGVyLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIHdyaXRlVGFnQXR0cmlidXRlKHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5LmdldFVuc3VwcG9ydGVkQWdlbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkpOwotICAgIH0KLQotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlVGFnQXR0cmlidXRlRGVzY3JpcHRpb24oCi0gICAgWE1MU3RyZWFtV3JpdGVyIHN0cmVhbSwKLSAgICBTdHJpbmcgICAgICAgICAgZGVzY3JpcHRpb24sCi0gICAgU3RyaW5nW10gICAgICAgIHVuc3VwcG9ydGVkQWdlbnRzKSB0aHJvd3MgWE1MU3RyZWFtRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsIHx8Ci0gICAgICAgIHVuc3VwcG9ydGVkQWdlbnRzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLQotICAgICAgaWYgKHVuc3VwcG9ydGVkQWdlbnRzICE9IG51bGwgJiYKLSAgICAgICAgICB1bnN1cHBvcnRlZEFnZW50cy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBpZiAoZGVzY3JpcHRpb24gPT0gbnVsbCkKLSAgICAgICAgICBkZXNjcmlwdGlvbiA9ICIiOwotCi0gICAgICAgIGRlc2NyaXB0aW9uICs9ICJcblxuICAgIFRoaXMgYXR0cmlidXRlIGlzIG5vdCBzdXBwb3J0ZWQgb24gdGhlIGZvbGxvd2luZyBhZ2VudCB0eXBlczpcbiI7Ci0KLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgdW5zdXBwb3J0ZWRBZ2VudHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBkZXNjcmlwdGlvbiArPSAiICIgKyB1bnN1cHBvcnRlZEFnZW50c1tpXTsKLSAgICAgICAgICBkZXNjcmlwdGlvbiArPSAoaSA8IHVuc3VwcG9ydGVkQWdlbnRzLmxlbmd0aCAtIDEpID8gIiwiIDogIi4iOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKGRlc2NyaXB0aW9uKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVRhZ0F0dHJpYnV0ZSgKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFN0cmluZyAgICAgICAgICBwcm9wZXJ0eU5hbWUsCi0gICAgU3RyaW5nICAgICAgICAgIGRlc2NyaXB0aW9uLAotICAgIFN0cmluZ1tdICAgICAgICB1bnN1cHBvcnRlZEFnZW50cywKLSAgICBQcm9wZXJ0eUJlYW4gICAgcHJvcGVydHkpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiYXR0cmlidXRlIik7Ci0KLSAgICAvLyBJbiBKU1AgMi4xLCB0aGUgZGVzY3JpcHRpb24gZ29lcyBhdCB0aGUgYmVnaW5uaW5nCi0gICAgaWYgKF9pczEyKCkpCi0gICAgICBfd3JpdGVUYWdBdHRyaWJ1dGVEZXNjcmlwdGlvbihzdHJlYW0sIGRlc2NyaXB0aW9uLCB1bnN1cHBvcnRlZEFnZW50cyk7Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgibmFtZSIpOwotICAgIAotICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKQotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgZWxzZQotICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhwcm9wZXJ0eU5hbWUpOwotCi0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotCi0gICAgaWYgKCFfaXMxMigpKQotICAgIHsKLSAgICAgIGlmIChwcm9wZXJ0eSAhPSBudWxsKQotICAgICAgeyAgICAgICAgCi0gICAgICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJlcXVpcmVkIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygidHJ1ZSIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgICAKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJ0ZXhwcnZhbHVlIik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJmYWxzZSIpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgCi0gICAgICAvLyBJbiBKU1AgMi4wLCB0aGUgdGFnIGRlc2NyaXB0aW9uIGdvZXMgYXQgdGhlIGVuZAotICAgICAgX3dyaXRlVGFnQXR0cmlidXRlRGVzY3JpcHRpb24oc3RyZWFtLCBkZXNjcmlwdGlvbiwgdW5zdXBwb3J0ZWRBZ2VudHMpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHByb3BlcnR5ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInJlcXVpcmVkIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygidHJ1ZSIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpIHx8IHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgICB7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZWZlcnJlZC1tZXRob2QiKTsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4gc2lnID0gcHJvcGVydHkuZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpOwotICAgICAgICAgIGlmIChzaWcgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm1ldGhvZC1zaWduYXR1cmUiKTsKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoc2lnLmdldFJldHVyblR5cGUoKSk7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCIgbXlNZXRob2QoIik7Ci0gICAgICAgICAgICBTdHJpbmdbXSBwYXJhbXMgPSBzaWcuZ2V0UGFyYW1ldGVyVHlwZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1zLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiLCAiKTsKLSAgICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycyhwYXJhbXNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCIpIik7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICghcHJvcGVydHkuaXNMaXRlcmFsT25seSgpIHx8Ci0gICAgICAgICAgICAgICAgIC8vICJiaW5kaW5nIiBpcyBhbHdheXMgYSBkZWZlcnJlZC12YWx1ZQotICAgICAgICAgICAgICAgICAiYmluZGluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVmZXJyZWQtdmFsdWUiKTsKLSAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgICAgICAvLyBXcml0aW5nIGphdmEubGFuZy5TdHJpbmcgaXMgdXN1YWxseSBhIGJhZCBpZGVhIC0gaXQKLSAgICAgICAgICAvLyBtZWFucyB0aGF0IG51bGwgZ2V0cyBjb2VyY2VkIHRvIHRoZSBlbXB0eSBzdHJpbmcuCi0gICAgICAgICAgaWYgKCgiamF2YS5sYW5nLlN0cmluZyIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpICYmIGNvZXJjZVN0cmluZ3MpIHx8Ci0gICAgICAgICAgICAgIF9DQU5fQ09FUkNFLmNvbnRhaW5zKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAgICIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJ0eXBlIik7Ci0gICAgICAgICAgICAvLyBUcmltIG91dCBhbnkgdXNlIG9mIGdlbmVyaWNzIGhlcmUgLSBzaW5jZSBKU1AgY29lcmNpb24KLSAgICAgICAgICAgIC8vIGNlcnRhaW5seSBjYW4ndCBkbyBhbnl0aGluZyB0aGVyZQotICAgICAgICAgICAgaW50IGdlbmVyaWNJbmRleCA9IHByb3BlcnR5Q2xhc3MuaW5kZXhPZignPCcpOwotICAgICAgICAgICAgaWYgKGdlbmVyaWNJbmRleCA+IDApCi0gICAgICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eUNsYXNzLnN1YnN0cmluZygwLCBnZW5lcmljSW5kZXgpOwotCi0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHByb3BlcnR5Q2xhc3MpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgICAiKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzdHJlYW0ud3JpdGVFbmRFbGVtZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNSdGV4cHJ2YWx1ZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAgICIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJydGV4cHJ2YWx1ZSIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygidHJ1ZSIpOwotICAgICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICAgIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJydGV4cHJ2YWx1ZSIpOwotICAgICAgICAgIC8vIEFzIG9mIEpTRiAxLjIsICJpZCIgY2FuIGJlIHNldCB2aWEgYW4gcnRleHBydmFsdWUgKGJ1dAotICAgICAgICAgIC8vICpub3QqIGJ5IGEgVmFsdWVFeHByZXNzaW9uKSAtIGl0IGhhcyB0byBiZSBldmFsdWF0ZWQKLSAgICAgICAgICAvLyBpbiB0aGUgSlNQCi0gICAgICAgICAgaWYgKCJpZCIuZXF1YWxzKHByb3BlcnR5TmFtZSkgJiYgIWRpc2FibGVJZEV4cHJlc3Npb25zKQotICAgICAgICAgICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygidHJ1ZSIpOwotICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoImZhbHNlIik7Ci0gICAgICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgc3RyZWFtLndyaXRlQ2hhcmFjdGVycygiXG4gICAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgbGlicmFyeSBkZXNjcmlwdG9yIGZvciBwYXJzZWQgdmFsaWRhdG9yIG1ldGFkYXRhLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRhZygKLSAgICBYTUxTdHJlYW1Xcml0ZXIgc3RyZWFtLAotICAgIFZhbGlkYXRvckJlYW4gICB2YWxpZGF0b3IpIHRocm93cyBYTUxTdHJlYW1FeGNlcHRpb24KLSAgewotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZyIpOwotCi0gICAgaWYgKF9pczEyKCkgJiYgdmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiZGVzY3JpcHRpb24iKTsKLSAgICAgIHN0cmVhbS53cml0ZUNEYXRhKHZhbGlkYXRvci5nZXREZXNjcmlwdGlvbigpKTsKLSAgICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoIm5hbWUiKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKHZhbGlkYXRvci5nZXRUYWdOYW1lKCkuZ2V0TG9jYWxQYXJ0KCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICBzdHJlYW0ud3JpdGVTdGFydEVsZW1lbnQoInRhZy1jbGFzcyIpOwotICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnModmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkpOwotICAgIHN0cmVhbS53cml0ZUVuZEVsZW1lbnQoKTsKLQotICAgIC8vIEluIEpTUCAyLjEsIGJvZHktY29udGVudCBpcyBub3Qgb3B0aW9uYWwKLSAgICBpZiAoX2lzMTIoKSkKLSAgICB7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgICAiKTsKLSAgICAgIHN0cmVhbS53cml0ZVN0YXJ0RWxlbWVudCgiYm9keS1jb250ZW50Iik7Ci0gICAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJlbXB0eSIpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIGlmICghX2lzMTIoKSAmJiB2YWxpZGF0b3IuZ2V0RGVzY3JpcHRpb24oKSAhPSBudWxsKQotICAgIHsKLSAgICAgIHN0cmVhbS53cml0ZUNoYXJhY3RlcnMoIlxuICAgICIpOwotICAgICAgc3RyZWFtLndyaXRlU3RhcnRFbGVtZW50KCJkZXNjcmlwdGlvbiIpOwotICAgICAgc3RyZWFtLndyaXRlQ0RhdGEodmFsaWRhdG9yLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICAgIH0KLQotICAgIC8vIHZhbGlkYXRvcnMgbmVlZCBhbiBpZCBhdHRyaWJ1dGUKLSAgICB3cml0ZVRhZ0F0dHJpYnV0ZShzdHJlYW0sICJpZCIsICJ0aGUgaWRlbnRpZmllciBmb3IgdGhlIHZhbGlkYXRvciIsIG51bGwsIG51bGwpOwotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IHZhbGlkYXRvci5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICB3cml0ZVRhZ0F0dHJpYnV0ZShzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHkuZ2V0RGVzY3JpcHRpb24oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm9wZXJ0eS5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgIHByb3BlcnR5KTsKLSAgICB9Ci0KLSAgICBzdHJlYW0ud3JpdGVDaGFyYWN0ZXJzKCJcbiAgIik7Ci0gICAgc3RyZWFtLndyaXRlRW5kRWxlbWVudCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyB0YWcgaGFuZGxlcnMgZm9yIHBhcnNlZCBjb21wb25lbnQgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX2dlbmVyYXRlVGFnSGFuZGxlcnMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24gewotICAgIC8vIE1ha2Ugc3VyZSBnZW5lcmF0ZWQgc291cmNlIGRpcmVjdG9yeQotICAgIC8vIGlzIGFkZGVkIHRvIGNvbXBpbGF0aW9uIHNvdXJjZSBwYXRoCi0gICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBmYWNlc0NvbmZpZyA9IGdldEZhY2VzQ29uZmlnKCk7Ci0gICAgaWYgKCFmYWNlc0NvbmZpZy5oYXNDb21wb25lbnRzKCkgJiYgIWZhY2VzQ29uZmlnLmhhc0NvbnZlcnRlcnMoKSAmJiAhZmFjZXNDb25maWcuaGFzVmFsaWRhdG9ycygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBTa2lwRmlsdGVyKCkpOwotICAgICAgY29tcG9uZW50cyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbXBvbmVudHMsIG5ldyBDb21wb25lbnRUYWdGaWx0ZXIoKSk7Ci0gICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0NsYXNzRmlsdGVyKHBhY2thZ2VDb250YWlucykpOwotCi0gICAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgICAgdmFsaWRhdG9ycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHZhbGlkYXRvcnMsIG5ldyBWYWxpZGF0b3JUYWdGaWx0ZXIoKSk7Ci0gICAgICB2YWxpZGF0b3JzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IodmFsaWRhdG9ycywgbmV3IFZhbGlkYXRvclRhZ0NsYXNzRmlsdGVyKHBhY2thZ2VDb250YWlucykpOwotCi0gICAgICBJdGVyYXRvciBjb252ZXJ0ZXJzID0gZmFjZXNDb25maWcuY29udmVydGVycygpOwotICAgICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdGaWx0ZXIoKSk7Ci0gICAgICBjb252ZXJ0ZXJzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29udmVydGVycywgbmV3IENvbnZlcnRlclRhZ0NsYXNzRmlsdGVyKHBhY2thZ2VDb250YWlucykpOwotCi0gICAgICAvLyBpbmNyZW1lbnRhbCB1bmxlc3MgZm9yY2VkCi0gICAgICBpZiAoIWZvcmNlKQotICAgICAgewotICAgICAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IElmQ29tcG9uZW50TW9kaWZpZWRGaWx0ZXIoKSk7Ci0gICAgICAgIGNvbnZlcnRlcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb252ZXJ0ZXJzLCBuZXcgSWZDb252ZXJ0ZXJNb2RpZmllZEZpbHRlcigpKTsKLSAgICAgICAgdmFsaWRhdG9ycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHZhbGlkYXRvcnMsIG5ldyBJZlZhbGlkYXRvck1vZGlmaWVkRmlsdGVyKCkpOwotICAgICAgfQotCi0gICAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpICYmICFjb252ZXJ0ZXJzLmhhc05leHQoKSAmJiAhdmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBhbGwgSlNQIHRhZ3MgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50VGFnSGFuZGxlckdlbmVyYXRvciBjb21wb25lbnRHZW4gPSBuZXcgQ29tcG9uZW50VGFnSGFuZGxlckdlbmVyYXRvcigpOwotICAgICAgICBBYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvciBjb252ZXJ0ZXJHZW4gPSBudWxsOwotICAgICAgICBBYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvciB2YWxpZGF0b3JHZW4gPSBudWxsOwotICAgICAgICBpZiAodHlwZSA9PSBudWxsIHx8ICJ0cmluaWRhZCIuZXF1YWxzKHR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udmVydGVyR2VuID0gbmV3IFRyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yKGlzMTIoKSwgZ2V0TGljZW5zZUhlYWRlcigpLCBnZXRMb2coKSk7Ci0gICAgICAgICAgdmFsaWRhdG9yR2VuID0gbmV3IFRyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yKGlzMTIoKSwgZ2V0TGljZW5zZUhlYWRlcigpLCBnZXRMb2coKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgY29udmVydGVyR2VuID0gbmV3IE15RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IoaXMxMigpLCBnZXRMaWNlbnNlSGVhZGVyKCksIGdldExvZygpKTsKLSAgICAgICAgICB2YWxpZGF0b3JHZW4gPSBuZXcgTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvcihpczEyKCksIGdldExpY2Vuc2VIZWFkZXIoKSwgZ2V0TG9nKCkpOyAgICAKLSAgICAgICAgfQotICAgICAgICBpbnQgY291bnQgPSAwOwotICAgICAgICB3aGlsZSAoY29tcG9uZW50cy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKWNvbXBvbmVudHMubmV4dCgpOwotICAgICAgICAgIGlmICghY29tcG9uZW50LmlzVGFnQ2xhc3NFeGNsdWRlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29tcG9uZW50R2VuLmdlbmVyYXRlVGFnSGFuZGxlcihjb21wb25lbnQpOwotICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB3aGlsZSAoY29udmVydGVycy5oYXNOZXh0KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlciA9IChDb252ZXJ0ZXJCZWFuKWNvbnZlcnRlcnMubmV4dCgpOwotICAgICAgICAgIGlmICghY29udmVydGVyLmlzVGFnQ2xhc3NFeGNsdWRlZCgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgICAgY29udmVydGVyR2VuLmdlbmVyYXRlVGFnSGFuZGxlcihjb252ZXJ0ZXIsIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICAgICAgICAgIGNvdW50Kys7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yID0gKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCk7Ci0gICAgICAgICAgaWYgKCF2YWxpZGF0b3IuaXNUYWdDbGFzc0V4Y2x1ZGVkKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgICB2YWxpZGF0b3JHZW4uZ2VuZXJhdGVUYWdIYW5kbGVyKHZhbGlkYXRvciwgZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5KTsKLSAgICAgICAgICAgICAgY291bnQrKzsgICAgCi0gICAgICAgICAgfSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0ZWQgIiArIGNvdW50ICsgIiBKU1AgdGFnKHMpIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgY2xhc3MgQ29tcG9uZW50VGFnSGFuZGxlckdlbmVyYXRvcgotICB7Ci0gICAgCi0gICAgcHJpdmF0ZSBTZXQgaW5pdENvbXBvbmVudExpc3QoQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSkKLSAgICB7Ci0gICAgICBTZXQgY29tcG9uZW50TGlzdCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICBjb21wb25lbnRMaXN0LmFkZChjb21wb25lbnQpOwotCi0gICAgICBDb21wb25lbnRCZWFuIGxCZWFuID0gY29tcG9uZW50OwotICAgICAgd2hpbGUgKChsQmVhbiA9IGxCZWFuLnJlc29sdmVTdXBlcnR5cGUoKSkgIT0gbnVsbCAmJgotICAgICAgICAgICAgICFmdWxsU3VwZXJjbGFzc05hbWUuZXF1YWxzKGxCZWFuLmdldFRhZ0NsYXNzKCkpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5kZWJ1Zyhjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpKwotICAgICAgICAgICAgICAgICAgICAgICAiOiBBZGQgYWRkaXRpb25hbCBUYWdzIGZyb206ICIgKyBsQmVhbi5nZXRDb21wb25lbnRUeXBlKCkpOwotICAgICAgICBjb21wb25lbnRMaXN0LmFkZChsQmVhbik7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBjb21wb25lbnRMaXN0OwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlcihDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBDb21wb25lbnRUYWdHZW5lcmF0b3IgZ2VuZXJhdG9yOwotICAgICAgU2V0IGNvbXBvbmVudExpc3Q7Ci0gICAgICAKLSAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUgPSBjb21wb25lbnQuZmluZEpzcFRhZ1N1cGVyY2xhc3MoKTsKLSAgICAgICAgICAgIAotICAgICAgaWYgKGZ1bGxTdXBlcmNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNaXNzaW5nIEpTUCBUYWcgc3VwZXJjbGFzcyBmb3IgY29tcG9uZW50OiAiICsgY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkKLSAgICAgICAgICAgICAgICAgICAgICArICIsIGdlbmVyYXRpb24gb2YgdGhpcyBUYWcgaXMgc2tpcHBlZCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9ZWxzZXsKLSAgICAgICAgICBpZiAoaXMxMigpICYmICJqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRUYWciLmVxdWFsc0lnbm9yZUNhc2UoZnVsbFN1cGVyY2xhc3NOYW1lKSl7Ci0gICAgICAgICAgICAgIGZ1bGxTdXBlcmNsYXNzTmFtZSA9ICJqYXZheC5mYWNlcy53ZWJhcHAuVUlDb21wb25lbnRFTFRhZyI7Ci0gICAgICAgICAgfWVsc2UgaWYgKCFpczEyKCkgJiYgImphdmF4LmZhY2VzLndlYmFwcC5VSUNvbXBvbmVudEVMVGFnIi5lcXVhbHNJZ25vcmVDYXNlKGZ1bGxTdXBlcmNsYXNzTmFtZSkpewotICAgICAgICAgICAgICBmdWxsU3VwZXJjbGFzc05hbWUgPSAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnIjsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGNvbXBvbmVudExpc3QgPSBpbml0Q29tcG9uZW50TGlzdChjb21wb25lbnQsIGZ1bGxTdXBlcmNsYXNzTmFtZSk7Ci0gICAgICAKLSAgICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gY29tcG9uZW50LmdldFRhZ0NsYXNzKCk7Ci0gICAgICB0cnkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUpOwotICAgICAgICAKLSAgICAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChmdWxsQ2xhc3NOYW1lLCAiLmphdmEiKTsKLSAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgICAgCi0gICAgICAgIHRhcmdldEZpbGUuZ2V0UGFyZW50RmlsZSgpLm1rZGlycygpOwotICAgICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgIFByZXR0eVdyaXRlciBvdXQgPSBuZXcgUHJldHR5V3JpdGVyKHN3KTsKLSAgICAgICAgCi0gICAgICAgIGlmIChjb21wb25lbnQuaXNUcmluaWRhZENvbXBvbmVudCgpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yID0gbmV3IFRyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yKF9pczEyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdlbmVyYXRvciA9IG5ldyBNeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yKF9pczEyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZ2V0TG9nKCkuZGVidWcoIkdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUrIiwgd2l0aCBnZW5lcmF0b3I6ICIrZ2VuZXJhdG9yLmdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLQotICAgICAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgICAgIAotICAgICAgICAvLyBoZWFkZXIvY29weXJpZ2h0Ci0gICAgICAgIHdyaXRlUHJlYW1ibGUob3V0KTsKLSAgICAgICAgCi0gICAgICAgIC8vIHBhY2thZ2UKLSAgICAgICAgb3V0LnByaW50bG4oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjsiKTsKLSAgICAgICAgCi0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIAotICAgICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmdWxsU3VwZXJjbGFzc05hbWUpOwotICAgICAgICBpZiAoc3VwZXJjbGFzc05hbWUuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBzdXBlcmNsYXNzTmFtZSA9IGZ1bGxTdXBlcmNsYXNzTmFtZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY29tcG9uZW50RnVsbENsYXNzID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCk7Ci0gICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGNvbXBvbmVudEZ1bGxDbGFzcyk7Ci0gICAgICAgIAotICAgICAgICBnZW5lcmF0b3Iud3JpdGVJbXBvcnRzKG91dCwgbnVsbCwgcGFja2FnZU5hbWUsIGZ1bGxTdXBlcmNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUsIGNvbXBvbmVudExpc3QpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ2xhc3NCZWdpbihvdXQsIGNsYXNzTmFtZSwgc3VwZXJjbGFzc05hbWUsIGNvbXBvbmVudCwgbnVsbCk7Ci0gICAgICAgIAotICAgICAgICBpbnQgbW9kaWZpZXJzID0gY29tcG9uZW50LmdldFRhZ0NsYXNzTW9kaWZpZXJzKCk7Ci0gICAgICAgIGdlbmVyYXRvci53cml0ZUNvbnN0cnVjdG9yKG91dCwgY29tcG9uZW50LCBtb2RpZmllcnMpOwotICAgICAgICAKLSAgICAgICAgCi0gICAgICAgIGlmICghTW9kaWZpZXIuaXNBYnN0cmFjdChtb2RpZmllcnMpKQotICAgICAgICB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLndyaXRlR2V0Q29tcG9uZW50VHlwZShvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgICAgZ2VuZXJhdG9yLndyaXRlR2V0UmVuZGVyZXJUeXBlKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgfQotCi0gICAgICAgIEdlbmVyYXRlSnNwVGFnbGlic01vam8udGhpcy53cml0ZUN1c3RvbUNvbXBvbmVudFRhZ0hhbmRsZXJDb250ZW50KG91dCwgY29tcG9uZW50KTsKLQotICAgICAgICBnZW5lcmF0b3Iud3JpdGVQcm9wZXJ0eU1lbWJlcnMob3V0LCBjb21wb25lbnRMaXN0KTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlU2V0UHJvcGVydGllc01ldGhvZChvdXQsIGNvbXBvbmVudENsYXNzLCBjb21wb25lbnRMaXN0KTsKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlUmVsZWFzZU1ldGhvZChvdXQsIGNvbXBvbmVudExpc3QpOwotICAgICAgICAKLSAgICAgICAgZ2VuZXJhdG9yLndyaXRlQ2xhc3NFbmQob3V0KTsKLSAgICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgICAgIAotICAgICAgICAvLyBkZWxheSB3cml0ZSBpbiBjYXNlIG9mIGVycm9yCi0gICAgICAgIC8vIHRpbWVzdGFtcCBzaG91bGQgbm90IGJlIHVwZGF0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgICAgLy8gZGVsZXRlIHRhcmdldCBmaWxlIGZpcnN0LCBiZWNhdXNlIGl0IGlzIHJlYWRvbmx5Ci0gICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0YXJnZXRGaWxlKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IHN3LmdldEJ1ZmZlcigpOwotICAgICAgICBmdy53cml0ZShidWYudG9TdHJpbmcoKSk7Ci0gICAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkuZXJyb3IoIkVycm9yIGdlbmVyYXRpbmcgIiArIGZ1bGxDbGFzc05hbWUsIGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzMTIoKQotICB7Ci0gICAgcmV0dXJuICIxLjIiLmVxdWFscyhqc2ZWZXJzaW9uKSB8fCAiMTIiLmVxdWFscyhqc2ZWZXJzaW9uKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXMxMigpCi0gIHsKLSAgICByZXR1cm4gaXMxMigpOwotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJZkNvbXBvbmVudE1vZGlmaWVkRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb21wb25lbnQuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICIuamF2YSIpOwotICAgICAgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiVGVtcGxhdGUuamF2YSIpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgIEZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIHRlbXBsYXRlUGF0aCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0ZW1wbGF0ZUZpbGUgaXMgbmV3ZXIgb3IgY29tcG9uZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0gICAgICByZXR1cm4gKHRlbXBsYXRlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgfHwKLSAgICAgICAgICAgICAgY29tcG9uZW50LmlzTW9kaWZpZWRTaW5jZSh0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJZkNvbnZlcnRlck1vZGlmaWVkRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICIuamF2YSIpOwotICAgICAgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiVGVtcGxhdGUuamF2YSIpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgIEZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIHRlbXBsYXRlUGF0aCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0ZW1wbGF0ZUZpbGUgaXMgbmV3ZXIgb3IgY29tcG9uZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0gICAgICByZXR1cm4gKHRlbXBsYXRlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgfHwKLSAgICAgICAgICAgICAgY29udmVydGVyLmlzTW9kaWZpZWRTaW5jZSh0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBjbGFzcyBJZlZhbGlkYXRvck1vZGlmaWVkRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICBTdHJpbmcgdGFnQ2xhc3MgPSB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBzb3VyY2VQYXRoID0gVXRpbC5jb252ZXJ0Q2xhc3NUb1NvdXJjZVBhdGgodGFnQ2xhc3MsICIuamF2YSIpOwotICAgICAgU3RyaW5nIHRlbXBsYXRlUGF0aCA9IFV0aWwuY29udmVydENsYXNzVG9Tb3VyY2VQYXRoKHRhZ0NsYXNzLCAiVGVtcGxhdGUuamF2YSIpOwotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLSAgICAgIEZpbGUgdGVtcGxhdGVGaWxlID0gbmV3IEZpbGUodGVtcGxhdGVTb3VyY2VEaXJlY3RvcnksIHRlbXBsYXRlUGF0aCk7Ci0KLSAgICAgIC8vIGFjY2VwdCBpZiB0ZW1wbGF0ZUZpbGUgaXMgbmV3ZXIgb3IgY29tcG9uZW50IGhhcyBiZWVuIG1vZGlmaWVkCi0gICAgICByZXR1cm4gKHRlbXBsYXRlRmlsZS5sYXN0TW9kaWZpZWQoKSA+IHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgfHwKLSAgICAgICAgICAgICAgdmFsaWRhdG9yLmlzTW9kaWZpZWRTaW5jZSh0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIE1hcCB0YWdsaWJzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Ik1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHJlc291cmNlUGF0aDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9jb25mIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByb3RlY3RlZCBGaWxlIGNvbmZpZ1NvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhLXRlbXBsYXRlcyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcm90ZWN0ZWQgRmlsZSB0ZW1wbGF0ZVNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByb3RlY3RlZCBGaWxlIGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9yZXNvdXJjZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJvdGVjdGVkIEZpbGUgZ2VuZXJhdGVkUmVzb3VyY2VzRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcm90ZWN0ZWQgU3RyaW5nIHBhY2thZ2VDb250YWlucyA9ICIiOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBmb3JjZTsKLQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBkaXNhYmxlSWRFeHByZXNzaW9uczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gY29lcmNlU3RyaW5nczsKLQotICAKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGpzZlZlcnNpb247Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJpbmlkYWQiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyB0eXBlOwotCi0KLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTdHJpbmcgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyA9Ci0gICAgICAgICAgICAgICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSlNQIFRhZyBMaWJyYXJ5IDEuMi8vRU4iOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNID0KLSAgICAgICAgICAgICAgImh0dHA6Ly9qYXZhLnN1bi5jb20vZHRkL3dlYi1qc3B0YWdsaWJyYXJ5XzFfMi5kdGQiOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfSlNQX1RBR19MSUJSQVJZX0RURCA9Ci0gICAgIjwhRE9DVFlQRSB0YWdsaWIgUFVCTElDIFxuIiArCi0gICAgIiAgXCIiICsgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1BVQkxJQyArICJcIlxuIiArCi0gICAgIiAgXCIiICsgX0pTUF9UQUdfTElCUkFSWV9ET0NUWVBFX1NZU1RFTSArICJcIiA+XG4iOwotCi0gIHN0YXRpYyBmaW5hbCBwcml2YXRlIFN0cmluZyBfWElOQ0xVREVfSlNQX1RBR19MSUJSQVJZX0RURCA9Ci0gICAgIjwhRE9DVFlQRSB0YWdsaWIgUFVCTElDXG4iICsKLSAgICAiICBcIiIgKyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfUFVCTElDICsgIlwiXG4iICsKLSAgICAiICBcIiIgKyBfSlNQX1RBR19MSUJSQVJZX0RPQ1RZUEVfU1lTVEVNICsgIlwiIFtcbiIgKwotICAgICIgICAgICA8IUVMRU1FTlQgeGk6aW5jbHVkZSBFTVBUWT5cbiIgKwotICAgICIgICAgICA8IUFUVExJU1QgeGk6aW5jbHVkZVxuIiArCi0gICAgIiAgICAgICAgICB4bWxuczp4aSBDREFUQSAjRklYRUQgIFwiIiArIFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSArICJcIlxuIiArCi0gICAgIiAgICAgICAgICBocmVmICAgICBDREFUQSAjSU1QTElFRFxuIiArCi0gICAgIiAgICAgICAgICB4cG9pbnRlciBDREFUQSAjSU1QTElFRD5cbiIgKwotICAgICJdPlxuIjsKLQotICBzdGF0aWMgZmluYWwgcHJpdmF0ZSBTZXQgX0NBTl9DT0VSQ0UgPSBuZXcgSGFzaFNldCgpOwotICBzdGF0aWMKLSAgewotICAgIC8vIFdoYXQ/ICBDYW4ndCBjb2VyY2UgU3RyaW5ncz8gIEhvdyBjb3VsZCB0aGF0IGJlPyAgV2VsbCwgdGFrZSBhIGxvb2sgYXQ6Ci0gICAgLy8gICBodHRwOi8vaXNzdWVzLmFwYWNoZS5vcmcvamlyYS9icm93c2UvQURGRkFDRVMtMzc3Ci0gICAgLy8gVGhlIHNpbGx5IGNvZXJjaW9uIHJ1bGVzIGluIEpTUCBjb252ZXJ0IG51bGwgdG8gdGhlCi0gICAgLy8gZW1wdHkgc3RyaW5nLiAgU28gaXQncyBub3QgdGhhdCB3ZSBjYW4ndCBjb2VyY2UgdG8KLSAgICAvLyBTdHJpbmcsIHdlIGp1c3QgcmVhbGx5LCByZWFsbHkgZG9uJ3Qgd2FudCB0by4KLSAgICAvLyAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5TdHJpbmciKTsKLSAgICAvLyBUT0RPOiBjb25zaWRlciBnZXR0aW5nIHJpZCBvZiBjb2VyY2lvbiBydWxlcyBmb3IKLSAgICAvLyBhbGwgbm9uLXByaW1pdGl2ZXMKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5JbnRlZ2VyIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuTG9uZyIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLkJvb2xlYW4iKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5Eb3VibGUiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImphdmEubGFuZy5GbG9hdCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YS5sYW5nLlNob3J0Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuQ2hhcmFjdGVyIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZhLmxhbmcuQnl0ZSIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiaW50Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJsb25nIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJib29sZWFuIik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJkb3VibGUiKTsKLSAgICBfQ0FOX0NPRVJDRS5hZGQoImZsb2F0Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJzaG9ydCIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiY2hhciIpOwotICAgIF9DQU5fQ09FUkNFLmFkZCgiYnl0ZSIpOwotCi0gICAgLy8gU2VlIGh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9BREZGQUNFUy00Nzc6ICBmb3IKLSAgICAvLyAiYmluZGluZyIgYW5kICJjb252ZXJ0ZXIiIHByb3BlcnRpZXMsIHdlIHdhbnQgdGhlIGRlZmVycmVkLXR5cGVzCi0gICAgLy8gdGhlcmUuICBIYXJkY29kaW5nIHRoZXNlIGhlcmUgaXMgdmVyeSB1Z2x5LCBidXQgcHV0dGluZyBpbgotICAgIC8vIGFsbCBjb2VyY2lvbiBydWxlcyB3b3VsZCBicmVhayBob3cgVHJpbmlkYWQgaGFuZGxlcyBEYXRlcywKLSAgICAvLyBhbmQgTGlzdHMgb2YgQ29sb3JzLCBldGMuIC0gZm9yIHRob3NlLCB3ZSB3YW50IHRvIHN1cHBvcnQKLSAgICAvLyByYXcgU3RyaW5ncyAod2hpY2ggdGhlIEpTUCBlbmdpbmUgZG9lc24ndCBrbm93IGhvdyB0byBjb2VyY2UpCi0gICAgLy8gYW5kIGNvZXJjZSB0aGVtIG91cnNlbHZlcyBpbiB0aGUgdGFnLgotICAgIF9DQU5fQ09FUkNFLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Iik7Ci0gICAgX0NBTl9DT0VSQ0UuYWRkKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVNYXN0ZXJGYWNlc0NvbmZpZ01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZU1hc3RlckZhY2VzQ29uZmlnTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZDY1ZDYwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZU1hc3RlckZhY2VzQ29uZmlnTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjE0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotCi1pbXBvcnQgamF2YXgueG1sLnN0cmVhbS5YTUxPdXRwdXRGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC5zdHJlYW0uWE1MU3RyZWFtV3JpdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgZ2VuZXJhdGUtbWFzdGVyLWZhY2VzLWNvbmZpZwotICogQHBoYXNlIGdlbmVyYXRlLXJlc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVNYXN0ZXJGYWNlc0NvbmZpZ01vam8gZXh0ZW5kcyBBYnN0cmFjdEZhY2VzTW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgYWRkUmVzb3VyY2VSb290KHByb2plY3QsIHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICAvLyBTY2FuIGZvciAueHJ0cyBzb3VyY2VzCi0gICAgICBTdHJpbmcgW10geG1sRmlsZXM7Ci0gICAgICAKLSAgICAgIGlmIChpbmhlcml0ZWREaXJlY3RvcnkgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgICBIYXNoU2V0IHNldCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgICAgICAKLSAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICAgIHNjYW5uZXIuc2V0QmFzZWRpcihuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpKTsKLSAgICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICAgIHNjYW5uZXIuc2V0SW5jbHVkZXMobmV3IFN0cmluZ1tdIHsgIioqLyoueG1sIiB9KTsKLSAgICAgICAgICBpZiAoZXhjbHVkZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHNjYW5uZXIuc2V0RXhjbHVkZXMoZXhjbHVkZXMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzY2FubmVyLnNjYW4oKTsKLSAgICAgICAgICAKLSAgICAgICAgICBTdHJpbmcgW10gc291cmNlRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgICBzZXQuYWRkKHNvdXJjZUZpbGVzW2ldKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKG5ldyBGaWxlKGluaGVyaXRlZERpcmVjdG9yeSxzb3VyY2VQYXRoKSk7Ci0gICAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgc291cmNlRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZUZpbGVzLmxlbmd0aDtpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgICBzZXQuYWRkKHNvdXJjZUZpbGVzW2ldKTsKLSAgICAgICAgICB9ICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICBPYmplY3QgW10gcmVzdWx0ID0gc2V0LnRvQXJyYXkoKTsKLSAgICAgICAgICB4bWxGaWxlcyA9IG5ldyBTdHJpbmdbcmVzdWx0Lmxlbmd0aF07Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQubGVuZ3RoOyBpKyspCi0gICAgICAgICAgewotICAgICAgICAgICAgICB4bWxGaWxlc1tpXSA9IChTdHJpbmcpIHJlc3VsdFtpXTsKLSAgICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgICAgRGlyZWN0b3J5U2Nhbm5lciBzY2FubmVyID0gbmV3IERpcmVjdG9yeVNjYW5uZXIoKTsKLSAgICAgICAgICBzY2FubmVyLnNldEJhc2VkaXIobmV3IEZpbGUoc291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKSk7Ci0gICAgICAgICAgc2Nhbm5lci5hZGREZWZhdWx0RXhjbHVkZXMoKTsKLSAgICAgICAgICBzY2FubmVyLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ICIqKi8qLnhtbCIgfSk7Ci0gICAgICAgICAgaWYgKGV4Y2x1ZGVzICE9IG51bGwpCi0gICAgICAgICAgewotICAgICAgICAgICAgICBzY2FubmVyLnNldEV4Y2x1ZGVzKGV4Y2x1ZGVzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgeG1sRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgIH0KLQotICAgICAgCi0KLSAgICAgIGxvbmcgbGFzdE1vZGlmaWVkID0gMEw7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCB4bWxGaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgbGFzdE1vZGlmaWVkID0gTWF0aC5tYXgobGFzdE1vZGlmaWVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgRmlsZSh4bWxGaWxlc1tpXSkubGFzdE1vZGlmaWVkKCkpOwotICAgICAgfQotCi0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICBpZiAoIWZvcmNlICYmIHRhcmdldEZpbGUubGFzdE1vZGlmaWVkKCkgPiBsYXN0TW9kaWZpZWQpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSAiICsgdGFyZ2V0UGF0aCArICIgaXMgdXAgdG8gZGF0ZSIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nICIgKyB0YXJnZXRQYXRoKTsKLQotICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLQotICAgICAgICBPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpKTsKLSAgICAgICAgWE1MT3V0cHV0RmFjdG9yeSBvdXRwdXRGYWN0b3J5ID0gWE1MT3V0cHV0RmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBYTUxTdHJlYW1Xcml0ZXIgd3JpdGVyID0gIG91dHB1dEZhY3RvcnkuY3JlYXRlWE1MU3RyZWFtV3JpdGVyKG91dCk7Ci0gICAgICAgIHdyaXRlci53cml0ZVN0YXJ0RG9jdW1lbnQoIjEuMCIpOwotICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgICAgICB3cml0ZXIud3JpdGVTdGFydEVsZW1lbnQoImZhY2VzLWNvbmZpZyIpOwotICAgICAgICB3cml0ZXIud3JpdGVEZWZhdWx0TmFtZXNwYWNlKCJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiKTsKLSAgICAgICAgd3JpdGVyLndyaXRlTmFtZXNwYWNlKCJ4aSIsICJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIik7Ci0gICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIlxuIik7Ci0gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IHhtbEZpbGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHhtbEZpbGUgPSB4bWxGaWxlc1tpXTsKLSAgICAgICAgICBpZiAoRmlsZS5zZXBhcmF0b3JDaGFyID09ICdcXCcpCi0gICAgICAgICAgewotICAgICAgICAgICAgeG1sRmlsZSA9IHhtbEZpbGUucmVwbGFjZUFsbCgiXFxcXCIsICIvIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHdyaXRlci53cml0ZUNoYXJhY3RlcnMoIiAgIik7Ci0gICAgICAgICAgd3JpdGVyLndyaXRlU3RhcnRFbGVtZW50KCJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIiwgImluY2x1ZGUiKTsKLSAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoImhyZWYiLCB4bWxGaWxlKTsKLSAgICAgICAgICB3cml0ZXIud3JpdGVBdHRyaWJ1dGUoInhwb2ludGVyIiwgIi9mYWNlcy1jb25maWcvKiIpOwotICAgICAgICAgIHdyaXRlci53cml0ZUVuZEVsZW1lbnQoKTsKLSAgICAgICAgICB3cml0ZXIud3JpdGVDaGFyYWN0ZXJzKCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHdyaXRlci53cml0ZUVuZERvY3VtZW50KCk7Ci0gICAgICAgIHdyaXRlci5jbG9zZSgpOwotCi0gICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFhNTFN0cmVhbUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgZ2VuZXJhdGlvbiIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIGdlbmVyYXRpb24iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nW10gZXhjbHVkZXM7Ci0KLSAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4iOwotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHNvdXJjZVBhdGg7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0gIAotICAvKioKLSAgICogQHBhcmFtZXRlciAKLSAgICovICAKLSAgcHJpdmF0ZSBGaWxlIGluaGVyaXRlZERpcmVjdG9yeTsKLSAgCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0UGF0aCA9ICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZmFjZXMtY29uZmlnLnhtbCI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBmb3JjZTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZVJlbmRlcmVyTWFwTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlUmVuZGVyZXJNYXBNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3N2MyYzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0dlbmVyYXRlUmVuZGVyZXJNYXBNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXNDb25maWdCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUmVuZGVyS2l0QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlJlbmRlcmVyQmVhbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcmVxdWlyZXNEZXBlbmRlbmN5UmVzb2x1dGlvbiBjb21waWxlCi0gKiBAZ29hbCBnZW5lcmF0ZS1yZW5kZXJlci1tYXAKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVJlbmRlcmVyTWFwTW9qbyBleHRlbmRzIEFic3RyYWN0RmFjZXNNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBwcm9jZXNzSW5kZXgocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgICAgIF9nZW5lcmF0ZVJlbmRlcmVyTWFwKCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIGNvbXBvbmVudHMiLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIHBhcnNlZCBjb21wb25lbnRzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVJlbmRlcmVyTWFwKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIHNvdXJjZSBkaXJlY3RvcnkKLSAgICAvLyBpcyBhZGRlZCB0byBjb21waWxhdGlvbiBzb3VyY2UgcGF0aAotICAgIHByb2plY3QuYWRkQ29tcGlsZVNvdXJjZVJvb3QoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0KLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzUmVuZGVyS2l0cygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyByZW5kZXJraXRzIGZvdW5kIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBJdGVyYXRvciByZW5kZXJraXRzID0gZmFjZXNDb25maWcucmVuZGVyS2l0cygpOwotICAgICAgd2hpbGUgKHJlbmRlcmtpdHMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBSZW5kZXJLaXRCZWFuIHJlbmRlcmtpdCA9IChSZW5kZXJLaXRCZWFuKSByZW5kZXJraXRzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIGlkID0gcmVuZGVya2l0LmdldFJlbmRlcktpdElkKCk7Ci0gICAgICAgIGlmICghaWQuc3RhcnRzV2l0aChyZW5kZXJLaXRQcmVmaXgpKQotICAgICAgICB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLQotICAgICAgICBfd3JpdGVSZW5kZXJLaXRNYXAocmVuZGVya2l0KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlUmVuZGVyS2l0TWFwKFJlbmRlcktpdEJlYW4gcmspIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgRmlsZSBvdXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvTUVUQS1JTkYvIiArIHJrLmdldFJlbmRlcktpdElkKCkgKyAiLnJlbmRlcmtpdCIpOwotICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcihvdXRGaWxlKTsKLSAgICBQcmludFdyaXRlciBwdyA9IG5ldyBQcmludFdyaXRlcihmdyk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgSXRlcmF0b3IgcmVuZGVyZXJzID0gcmsucmVuZGVyZXJzKCk7Ci0gICAgICB3aGlsZSAocmVuZGVyZXJzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUmVuZGVyZXJCZWFuIHIgPSAoUmVuZGVyZXJCZWFuKSByZW5kZXJlcnMubmV4dCgpOwotICAgICAgICBwdy5wcmludChyLmdldENvbXBvbmVudEZhbWlseSgpKTsKLSAgICAgICAgcHcucHJpbnQoJ3wnKTsKLSAgICAgICAgcHcucHJpbnQoci5nZXRSZW5kZXJlclR5cGUoKSk7Ci0gICAgICAgIHB3LnByaW50KCc9Jyk7Ci0gICAgICAgIHB3LnByaW50bG4oci5nZXRSZW5kZXJlckNsYXNzKCkpOwotICAgICAgfQotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgcHcuY2xvc2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIFN0cmluZyByZXNvdXJjZVBhdGggPSAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2luZGV4LmxzdCI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tZmFjZXMtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIFN0cmluZyByZW5kZXJLaXRQcmVmaXg7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0NsYXNzR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0NsYXNzR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDhmNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9DbGFzc0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuU291cmNlVGVtcGxhdGU7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEdlbmVyYXRvcgotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBDbGFzc0dlbmVyYXRvcgotewotICB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCk7Ci0KLSAgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsCi0gICAgICBTdHJpbmcgcGFja2FnZU5hbWUsCi0gICAgICBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29sbGVjdGlvbiBjb21wb25lbnRzKTsKLQotICB2b2lkIHdyaXRlQ2xhc3NCZWdpbigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSk7Ci0KLSAgdm9pZCB3cml0ZUNvbnN0cnVjdG9yKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgaW50IG1vZGlmaWVycykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVDbGFzc0VuZCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQpOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0dlbmVyYXRvckhlbHBlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9HZW5lcmF0b3JIZWxwZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FiNmQ1ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL0dlbmVyYXRvckhlbHBlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogVE9ETzogY29tbWVudCB0aGlzIQotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRvckhlbHBlcgotewotICBwcml2YXRlIEdlbmVyYXRvckhlbHBlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbnZlcnRlcigKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIuZXF1YWxzKHByb3BDbGFzcykpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzS2V5U3Ryb2tlKAotICAgICAgU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIHJldHVybiAoImphdmF4LnN3aW5nLktleVN0cm9rZSIuZXF1YWxzKHByb3BDbGFzcykpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQVdUS2V5U3Ryb2tlKAotICAgICAgU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIHJldHVybiAoImphdmEuYXd0LkFXVEtleVN0cm9rZSIuZXF1YWxzKHByb3BDbGFzcykpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzTnVtYmVyKAotICAgICAgU3RyaW5nIHByb3BDbGFzcykKLSAgewotICAgIHJldHVybiAoImphdmEubGFuZy5OdW1iZXIiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0NvbG9yTGlzdCgKLSAgICAgIFN0cmluZyBwcm9wQ2xhc3MsCi0gICAgICBTdHJpbmdbXSBwcm9wQ2xhc3NQYXJhbXMpCi0gIHsKLSAgICByZXR1cm4gKCJqYXZhLnV0aWwuTGlzdCIuZXF1YWxzKHByb3BDbGFzcykgJiYKLSAgICAgICAgcHJvcENsYXNzUGFyYW1zLmxlbmd0aCA9PSAxICYmCi0gICAgICAgICJqYXZhLmF3dC5Db2xvciIuZXF1YWxzKHByb3BDbGFzc1BhcmFtc1swXSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQ29sb3IoCi0gICAgICBTdHJpbmcgcHJvcENsYXNzKQotICB7Ci0gICAgcmV0dXJuICgiamF2YS5hd3QuQ29sb3IiLmVxdWFscyhwcm9wQ2xhc3MpKTsKLSAgfSAgCi0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzQWN0aW9uKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIHJldHVybiAocHJvcGVydHkuZ2V0Q2xhc3MoKS5lcXVhbHMoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iKQotICAgICAgICAmJiBwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImFjdGlvbiIpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc0FjdGlvbkxpc3RlbmVyKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImFjdGlvbkxpc3RlbmVyIikgJiYKLSAgICAgICAgKChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkgfHwgKGlzMTIgJiYgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWx1ZUNoYW5nZUxpc3RlbmVyKFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgcmV0dXJuIChwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoInZhbHVlQ2hhbmdlTGlzdGVuZXIiKSAmJgotICAgICAgICAoKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKSB8fCAoaXMxMiAmJiBwcm9wZXJ0eS5pc01ldGhvZEJpbmRpbmcoKSkpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkYXRvcihQcm9wZXJ0eUJlYW4gcHJvcGVydHksIGJvb2xlYW4gaXMxMikKLSAgewotICAgIHJldHVybiAocHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJ2YWxpZGF0b3IiKSkgJiYKLSAgICAgICAgKChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkgfHwgKGlzMTIgJiYgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgU2V0IGltcG9ydHMpCi0gIHsKLSAgICBJdGVyYXRvciBpdGVyYXRvciA9IGltcG9ydHMuaXRlcmF0b3IoKTsKLSAgICBpdGVyYXRvciA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGl0ZXJhdG9yLAotICAgICAgICBuZXcgUGFja2FnZUltcG9ydHNGaWx0ZXIocGFja2FnZU5hbWUpKTsKLSAgICB3aGlsZSAoaXRlcmF0b3IuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBjbGFzc05hbWUgPSAoU3RyaW5nKSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaW1wb3J0ICIgKyBjbGFzc05hbWUgKyAiOyIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGNsYXNzIFBhY2thZ2VJbXBvcnRzRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgUGFja2FnZUltcG9ydHNGaWx0ZXIoCi0gICAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSkKLSAgICB7Ci0gICAgICBfcGFja2FnZU5hbWUgPSBwYWNrYWdlTmFtZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgICAgIE9iamVjdCBvYmplY3QpCi0gICAgewotICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IChTdHJpbmcpIG9iamVjdDsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IFV0aWwuZ2V0UGFja2FnZUZyb21GdWxsQ2xhc3MoY2xhc3NOYW1lKTsKLSAgICAgIHJldHVybiAoIXBhY2thZ2VOYW1lLmVxdWFscyhfcGFja2FnZU5hbWUpICYmCi0gICAgICAgICAgIXBhY2thZ2VOYW1lLmVxdWFscygiamF2YS5sYW5nIikpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wYWNrYWdlTmFtZTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEpzcFByb3BlcnR5VHlwZShQcm9wZXJ0eUJlYW4gcHJvcGVydHksIGJvb2xlYW4gaXMxMikKLSAgewotICAgIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIk1ldGhvZEV4cHJlc3Npb24iOwotICAgIH0KLQotICAgIGlmIChpczEyICYmIHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgIHsKLSAgICAgIHJldHVybiAiTWV0aG9kRXhwcmVzc2lvbiI7Ci0gICAgfQotCi0gICAgaWYgKGlzMTIpCi0gICAgewotICAgICAgaWYgKCFwcm9wZXJ0eS5pc0xpdGVyYWxPbmx5KCkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAiVmFsdWVFeHByZXNzaW9uIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gIlN0cmluZyI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0Fic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9BYnN0cmFjdENvbXBvbmVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY5ZmQzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L0Fic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDU4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuKjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuRmlsdGVyZWRJdGVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuUHJvcGVydHlGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlNvdXJjZVRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0Q29tcG9uZW50R2VuZXJhdG9yIGltcGxlbWVudHMgQ29tcG9uZW50R2VuZXJhdG9yCi17Ci0KLSAgcHJpdmF0ZSBMb2cgX2xvZzsKLSAgYm9vbGVhbiBfaXMxMjsKLQotICBwdWJsaWMgQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IoTG9nIGxvZywgYm9vbGVhbiBpczEyKQotICB7Ci0gICAgX2xvZyA9IGxvZzsKLSAgICBfaXMxMiA9IGlzMTI7Ci0gIH0KLQotICBwcm90ZWN0ZWQgTG9nIGdldExvZygpCi0gIHsKLSAgICByZXR1cm4gX2xvZzsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NCZWdpbigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSkKLSAgewotICAgIG91dC5wcmludGxuKCIvKioiKTsKLQotICAgIC8vIFRPRE86IHJlc3RvcmUgZGVzY3JpcHRpb24gKG5lZWRzIGVzY2FwaW5nPykKLS8vICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGNvbXBvbmVudC5nZXREZXNjcmlwdGlvbigpOwotLy8gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0vLyAgICB7Ci0vLyAgICAgIG91dC5wcmludGxuKCIgKiIpOwotLy8gICAgICBvdXQucHJpbnRsbigiICogIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0vLyAgICB9Ci0KLSAgICBTdHJpbmcgbG9uZ0Rlc2NyaXB0aW9uID0gY29tcG9uZW50LmdldExvbmdEZXNjcmlwdGlvbigpOwotICAgIGlmIChsb25nRGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQobG9uZ0Rlc2NyaXB0aW9uKSk7Ci0gICAgfQotCi0gICAgaWYgKGNvbXBvbmVudC5oYXNFdmVudHModHJ1ZSkpCi0gICAgewotICAgICAgLy8gdGhlIGV2ZW50cyBqYXZhZG9jCi0gICAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8aDQ+RXZlbnRzOjwvaDQ+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHRhYmxlIGJvcmRlcj1cIjFcIiB3aWR0aD1cIjEwMCVcIiBjZWxscGFkZGluZz1cIjNcIiBzdW1tYXJ5PVwiXCI+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHRyIGJnY29sb3I9XCIjQ0NDQ0ZGXCIgY2xhc3M9XCJUYWJsZUhlYWRpbmdDb2xvclwiPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDx0aCBhbGlnbj1cImxlZnRcIj5UeXBlPC90aD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8dGggYWxpZ249XCJsZWZ0XCI+UGhhc2VzPC90aD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8dGggYWxpZ249XCJsZWZ0XCI+RGVzY3JpcHRpb248L3RoPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDwvdHI+Iik7Ci0gICAgICBJdGVyYXRvciBldmVudHMgPSBjb21wb25lbnQuZXZlbnRzKHRydWUpOwotICAgICAgd2hpbGUgKGV2ZW50cy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IChFdmVudFJlZkJlYW4pIGV2ZW50cy5uZXh0KCk7Ci0gICAgICAgIEV2ZW50QmVhbiBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLSAgICAgICAgaWYgKGV2ZW50ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgZXZlbnRDbGFzcyA9IGV2ZW50LmdldEV2ZW50Q2xhc3MoKTsKLSAgICAgICAgICBTdHJpbmdbXSBldmVudFBoYXNlcyA9IGV2ZW50UmVmLmdldEV2ZW50RGVsaXZlcnlQaGFzZXMoKTsKLSAgICAgICAgICBTdHJpbmcgZXZlbnREZXNjcmlwdGlvbiA9IGV2ZW50LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAqIDx0ciBjbGFzcz1cIlRhYmxlUm93Q29sb3JcIj4iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICogPHRkIHZhbGlnbj1cInRvcFwiPjxjb2RlPiIgKyBldmVudENsYXNzICsgIjwvY29kZT48L3RkPiIpOwotICAgICAgICAgIG91dC5wcmludCgiICogPHRkIHZhbGlnbj1cInRvcFwiIG5vd3JhcD4iKTsKLSAgICAgICAgICBpZiAoZXZlbnRQaGFzZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV2ZW50UGhhc2VzLmxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgICAgICAgICAgb3V0LnByaW50KCI8YnI+Iik7Ci0gICAgICAgICAgICAgIG91dC5wcmludChldmVudFBoYXNlc1tpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dC5wcmludGxuKCI8L3RkPiIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgKiA8dGQgdmFsaWduPVwidG9wXCI+IiArIGV2ZW50RGVzY3JpcHRpb24gKyAiPC90ZD4iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICogPC90cj4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIiAqIDwvdGFibGU+Iik7Ci0gICAgfQotCi0gICAgaWYgKCFjb21wb25lbnQuaGFzQ2hpbGRyZW4oKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHA+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogSXQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgY2hpbGRyZW4uIik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgLy8gVE9ETzogZWxpbWluYXRlIDxtZnA6Y29tcG9uZW50LWNsYXNzLW1vZGlmaWVyPiBtZXRhZGF0YQotICAgIGludCBtb2RpZmllcnMgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3NNb2RpZmllcnMoKTsKLSAgICBTdHJpbmcgY2xhc3NTdGFydCA9IE1vZGlmaWVyLnRvU3RyaW5nKG1vZGlmaWVycyk7Ci0gICAgLy8gVE9ETzogdXNlIGNhbm9uaWNhbCBvcmRlcmluZwotICAgIGNsYXNzU3RhcnQgPSBjbGFzc1N0YXJ0LnJlcGxhY2VBbGwoInB1YmxpYyBhYnN0cmFjdCIsICJhYnN0cmFjdCBwdWJsaWMiKTsKLSAgICBvdXQucHJpbnRsbihjbGFzc1N0YXJ0ICsgIiBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgIiBleHRlbmRzICIgKyBzdXBlcmNsYXNzTmFtZSk7Ci0KLSAgICBTZXQgaW50ZXJmYWNlcyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgaWYgKHRlbXBsYXRlICE9IG51bGwpCi0gICAgICBpbnRlcmZhY2VzLmFkZEFsbCh0ZW1wbGF0ZS5nZXRJbXBsZW1lbnRzKCkpOwotCi0gICAgaWYgKGNvbXBvbmVudC5nZXRDb21wb25lbnRJbXBsZW1lbnRzKCkgIT0gbnVsbCl7Ci0gICAgICAgIFN0cmluZ1Rva2VuaXplciBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY29tcG9uZW50LmdldENvbXBvbmVudEltcGxlbWVudHMoKSwiLCIsZmFsc2UpOwotICAgICAgICB3aGlsZSAoc3QuaGFzTW9yZVRva2VucygpKXsKLSAgICAgICAgICAgIGludGVyZmFjZXMuYWRkKHN0Lm5leHRUb2tlbigpKTsgICAgCi0gICAgICAgIH0gICAgICAgIAotICAgIH0KLSAgICAKLSAgICBpZiAoY29tcG9uZW50LmlzTmFtaW5nQ29udGFpbmVyKCkpCi0gICAgICBpbnRlcmZhY2VzLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50Lk5hbWluZ0NvbnRhaW5lciIpOwotCi0gICAgSXRlcmF0b3IgZXZlbnRzID0gY29tcG9uZW50LmV2ZW50cygpOwotICAgIHdoaWxlIChldmVudHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IChFdmVudFJlZkJlYW4pIGV2ZW50cy5uZXh0KCk7Ci0gICAgICBFdmVudEJlYW4gZXZlbnQgPSBldmVudFJlZi5yZXNvbHZlRXZlbnRUeXBlKCk7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFldmVudFJlZi5pc0lnbm9yZVNvdXJjZUludGVyZmFjZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNvdXJjZSA9IGV2ZW50LmdldEV2ZW50U291cmNlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgaWYgKHNvdXJjZSAhPSBudWxsKQotICAgICAgICAgICAgaW50ZXJmYWNlcy5hZGQoVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3Moc291cmNlKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoIWludGVyZmFjZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIFNldCBpbXBsZW1lbnRzU2V0ID0gbmV3IEhhc2hTZXQoKTsKLSAgICAgIGZvciAoSXRlcmF0b3IgaXRlciA9IGludGVyZmFjZXMuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7KQotICAgICAgewotICAgICAgICBTdHJpbmcgZmNxbiA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgICBpbXBsZW1lbnRzU2V0LmFkZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhmY3FuKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIGltcGxlbWVudHMgY2xhdXNlIHNwYW5zIG11bHRpcGxlIGxpbmVzCi0gICAgICBjaGFyW10gaW5kZW50ID0gbmV3IGNoYXJbY2xhc3NTdGFydC5sZW5ndGgoKSArCi0gICAgICAgICAgIiBjbGFzcyAiLmxlbmd0aCgpICsKLSAgICAgICAgICBjbGFzc05hbWUubGVuZ3RoKCkgKyAxXTsKLSAgICAgIEFycmF5cy5maWxsKGluZGVudCwgJyAnKTsKLSAgICAgIG91dC5wcmludChpbmRlbnQpOwotICAgICAgb3V0LnByaW50KCJpbXBsZW1lbnRzICIpOwotICAgICAgZm9yIChJdGVyYXRvciBpdGVyID0gaW1wbGVtZW50c1NldC5pdGVyYXRvcigpOyBpdGVyLmhhc05leHQoKTspCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludCgoU3RyaW5nKSBpdGVyLm5leHQoKSk7Ci0gICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCIsIik7Ci0gICAgICAgICAgb3V0LnByaW50KGluZGVudCk7Ci0gICAgICAgICAgb3V0LnByaW50KCIgICAgICAgICAgICIpOyAgLy8gc2FtZSBsZW5ndGggYXMgImltcGxlbWVudHMgIgotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIAotICAgIC8vV3JpdGUgc2VyaWFsVmVyc2lvblVJRAotICAgIGlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50U2VyaWFsVUlEKCkgIT0gbnVsbCAmJgotICAgICAgICAgICAgISIiLmVxdWFscyhjb21wb25lbnQuZ2V0Q29tcG9uZW50U2VyaWFsVUlEKCkpKXsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgb3V0LnByaW50bG4oInByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9ICIrCi0gICAgICAgICAgICAgICAgY29tcG9uZW50LmdldENvbXBvbmVudFNlcmlhbFVJRCgpKyI7Iik7Ci0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVDbGFzc0VuZCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQpCi0gIHsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUltcG9ydHMoUHJldHR5V3JpdGVyIG91dCwgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUsIFN0cmluZyBwYWNrYWdlTmFtZSwgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwgQ29sbGVjdGlvbiBjb21wb25lbnRzKQotICB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJub3QgaW1wbGVtZW50ZWQiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW1wb3J0cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSwKLSAgICAgIFN0cmluZyBmdWxsU3VwZXJjbGFzc05hbWUsCi0gICAgICBTdHJpbmcgc3VwZXJjbGFzc05hbWUsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIC8vIFVzZSB0aGUgdGVtcGxhdGUgaW1wb3J0cwotICAgIGlmICh0ZW1wbGF0ZSAhPSBudWxsKQotICAgICAgaW1wb3J0cy5hZGRBbGwodGVtcGxhdGUuZ2V0SW1wb3J0cygpKTsKLQotICAgIGlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50SW1wbGVtZW50cygpICE9IG51bGwpewotICAgICAgICBTdHJpbmdUb2tlbml6ZXIgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKGNvbXBvbmVudC5nZXRDb21wb25lbnRJbXBsZW1lbnRzKCksIiwiLGZhbHNlKTsKLSAgICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSl7Ci0gICAgICAgICAgICBpbXBvcnRzLmFkZChzdC5uZXh0VG9rZW4oKSk7ICAgIAotICAgICAgICB9ICAgICAgICAKLSAgICB9ICAgIAotICAgIAotICAgIC8vIERldGVjdCBOYW1pbmdDb250YWluZXIKLSAgICBpZiAoY29tcG9uZW50LmlzTmFtaW5nQ29udGFpbmVyKCkpCi0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50Lk5hbWluZ0NvbnRhaW5lciIpOwotCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBOb25WaXJ0dWFsRmlsdGVyKCkpOwotICAgIC8vIFByb3BlcnR5S2V5IG9ubHkgbmVlZGVkIGlmIHRoZXJlIGFyZSBwcm9wZXJ0aWVzCi0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgICBpZiAocHJvcGVydHlDbGFzcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQocHJvcGVydHlDbGFzcyk7Ci0gICAgICAgICAgLy8gQ2hlY2sgZm9yIGdlbmVyaWNzCi0gICAgICAgICAgU3RyaW5nW10gdHlwZXMgPSBwcm9wZXJ0eS5nZXRBdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnMoKTsKLSAgICAgICAgICBpZiAodHlwZXMgIT0gbnVsbCkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGFkZEdlbmVyaWNJbXBvcnRzKGltcG9ydHMsIHR5cGVzW2ldKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBJdGVyYXRvciBmYWNldHMgPSBjb21wb25lbnQuZmFjZXRzKCk7Ci0gICAgLy8gVUlDb21wb25lbnQgbmVlZGVkIGlmIHRoZXJlIGFyZSBmYWNldHMKLSAgICBpZiAoZmFjZXRzLmhhc05leHQoKSkKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQiKTsKLQotICAgIEl0ZXJhdG9yIGV2ZW50cyA9IGNvbXBvbmVudC5ldmVudHMoKTsKLSAgICB3aGlsZSAoZXZlbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBldmVudHMubmV4dCgpOwotICAgICAgRXZlbnRCZWFuIGV2ZW50ID0gZXZlbnRSZWYucmVzb2x2ZUV2ZW50VHlwZSgpOwotCi0gICAgICBpZiAoZXZlbnQgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgZ2V0TG9nKCkud2FybigiVW5rbm93biBldmVudCB0eXBlIFwiIiArIGV2ZW50UmVmLmdldEV2ZW50VHlwZSgpICsgIlwiIiArCi0gICAgICAgICAgICAiIGluIGNvbXBvbmVudDoiICsgY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzID0gZXZlbnQuZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCk7Ci0gICAgICAgIGlmIChsaXN0ZW5lckNsYXNzICE9IG51bGwpCi0gICAgICAgICAgaW1wb3J0cy5hZGQobGlzdGVuZXJDbGFzcyk7Ci0KLSAgICAgICAgaWYgKCFldmVudFJlZi5pc0lnbm9yZVNvdXJjZUludGVyZmFjZSgpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNvdXJjZUludGVyZmFjZSA9IGV2ZW50LmdldEV2ZW50U291cmNlSW50ZXJmYWNlKCk7Ci0gICAgICAgICAgaWYgKHNvdXJjZUludGVyZmFjZSAhPSBudWxsKQotICAgICAgICAgICAgaW1wb3J0cy5hZGQoc291cmNlSW50ZXJmYWNlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIEltcG9ydCBjYXVzZXMgYSBjb2xsaXNpb24gaWYgY2xhc3NOYW1lIGFuZCBzdXBlcmNsYXNzTmFtZSBhcmUgZXF1YWwKLSAgICBpZiAoIXN1cGVyY2xhc3NOYW1lLmVxdWFscyhmdWxsU3VwZXJjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIFN0cmluZyBzdXBlclBhY2thZ2VOYW1lID0gVXRpbC5nZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcyhmdWxsU3VwZXJjbGFzc05hbWUpOwotICAgICAgLy8gY29tcG9uZW50IHN1cGVyY2xhc3Mgb25seSBuZWVkZWQgaWYgbm90IGluCi0gICAgICAvLyBzYW1lIHBhY2thZ2UgYXMgY29tcG9uZW50IGNsYXNzCi0gICAgICBpZiAoc3VwZXJQYWNrYWdlTmFtZSAhPSBwYWNrYWdlTmFtZSkKLSAgICAgICAgaW1wb3J0cy5hZGQoZnVsbFN1cGVyY2xhc3NOYW1lKTsKLSAgICB9Ci0KLSAgICAvLyBhZGQgb3RoZXIgaW1wb3J0cyAoZ2VuZXJhdG9yIHNwZWNpZmljKQotICAgIGFkZFNwZWNpZmljSW1wb3J0cyhpbXBvcnRzLCBjb21wb25lbnQpOwotCi0gICAgLy8gZG8gbm90IGltcG9ydCBpbXBsaWNpdCB0eXBlcyEKLSAgICBpbXBvcnRzLnJlbW92ZUFsbChVdGlsLlBSSU1JVElWRV9UWVBFUyk7Ci0KLSAgICBHZW5lcmF0b3JIZWxwZXIud3JpdGVJbXBvcnRzKG91dCwgcGFja2FnZU5hbWUsIGltcG9ydHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKAotICAgICAgU2V0IGltcG9ydHMsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgewotICAgIC8vIG5vdGhpbmcgYnkgZGVmYXVsdAotICB9Ci0KLSAgcHVibGljIHZvaWQgYWRkR2VuZXJpY0ltcG9ydHMoU2V0IGltcG9ydHMsIFN0cmluZyB0eXBlKQotICB7Ci0gICAgTWF0Y2hlciBtYXRjaGVyID0gX0dFTkVSSUNfVFlQRS5tYXRjaGVyKHR5cGUpOwotICAgIGlmIChtYXRjaGVyLm1hdGNoZXMoKSkKLSAgICB7Ci0gICAgICAvLyBHZW5lcmljIHR5cGUKLSAgICAgIGltcG9ydHMuYWRkKG1hdGNoZXIuZ3JvdXAoMSkpOwotICAgICAgU3RyaW5nW10gdHlwZXMgPSBtYXRjaGVyLmdyb3VwKDIpLnNwbGl0KCIsIik7Ci0gICAgICBmb3IgKGludCBpID0gdHlwZXMubGVuZ3RoIC0gMTsgaSA+PSAwOyBpLS0pCi0gICAgICB7Ci0gICAgICAgIGFkZEdlbmVyaWNJbXBvcnRzKGltcG9ydHMsIHR5cGVzW2ldKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIE5vbi1nZW5lcmljIHR5cGUKLSAgICAgIGltcG9ydHMuYWRkKHR5cGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlR2VuZXJpY0NvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5LAotICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigic3RhdGljIHB1YmxpYyBmaW5hbCBTdHJpbmcgQ09NUE9ORU5UX0ZBTUlMWSA9Iik7Ci0gICAgb3V0LnByaW50bG4oIiAgXCIiICsgY29tcG9uZW50RmFtaWx5ICsgIlwiOyIpOwotICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyBDT01QT05FTlRfVFlQRSA9Iik7Ci0gICAgb3V0LnByaW50bG4oIiAgXCIiICsgY29tcG9uZW50VHlwZSArICJcIjsiKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gbm90aGluZwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eVZhbHVlQ29uc3RhbnRzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vICBjb21wb25lbnQgcHJvcGVydHkga2V5cwotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgTm9uVmlydHVhbEZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBTdHJpbmdbXSBwcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5LmdldFByb3BlcnR5VmFsdWVzKCk7Ci0KLSAgICAgIGlmIChwcm9wZXJ0eVZhbHVlcyAhPSBudWxsKQotICAgICAgewotICAgICAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5VmFsdWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHByb3BWYWx1ZSA9IHByb3BlcnR5VmFsdWVzW2ldOwotICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWVOYW1lID0gcHJvcE5hbWUgKwotICAgICAgICAgICAgICBDaGFyYWN0ZXIudG9VcHBlckNhc2UocHJvcFZhbHVlLmNoYXJBdCgwKSkgKwotICAgICAgICAgICAgICBwcm9wVmFsdWUuc3Vic3RyaW5nKDEpOwotICAgICAgICAgIFN0cmluZyBwcm9wVmFsdWVLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wVmFsdWVOYW1lKTsKLQotICAgICAgICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsIFN0cmluZyAiICsgcHJvcFZhbHVlS2V5ICsgIiA9IFwiIiArIHByb3BWYWx1ZSArICJcIjsiKTsKLSAgICAgICAgfQotCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVGYWNldENvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBmYWNldHMgPSBjb21wb25lbnQuZmFjZXRzKCk7Ci0gICAgd2hpbGUgKGZhY2V0cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRmFjZXRCZWFuIGZhY2V0ID0gKEZhY2V0QmVhbikgZmFjZXRzLm5leHQoKTsKLSAgICAgIFN0cmluZyBmYWNldE5hbWUgPSBmYWNldC5nZXRGYWNldE5hbWUoKTsKLSAgICAgIFN0cmluZyBmYWNldEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KGZhY2V0TmFtZSwgIl9GQUNFVCIpOwotICAgICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgIiArCi0gICAgICAgICAgIlN0cmluZyAiICsgZmFjZXRLZXkgKyAiID0gXCIiICsgZmFjZXROYW1lICsgIlwiOyIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29udmVydFN0cmluZ1RvQm94ZWRMaXRlcmFsKAotICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgIFN0cmluZyB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICBlbHNlIGlmICgiU3RyaW5nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIlwiIiArIHZhbHVlLnJlcGxhY2VBbGwoIlwnIiwgIlxcJyIpICsgIlwiIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAoInRydWUiLmVxdWFscyh2YWx1ZSkpID8gIkJvb2xlYW4uVFJVRSIgOiAiQm9vbGVhbi5GQUxTRSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkNoYXJhY3Rlci52YWx1ZU9mKCciICsgdmFsdWUucmVwbGFjZUFsbCgiXCciLCAiXFwnIikgKyAiJykiOwotICAgIH0KLSAgICBlbHNlIGlmICgiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkludGVnZXIudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiRG91YmxlLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIHJldHVybiAiRmxvYXQudmFsdWVPZigiICsgdmFsdWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJOdW1iZXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIGlmKHZhbHVlLmluZGV4T2YoIi4iKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJJbnRlZ2VyLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gIkRvdWJsZS52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInByb3BlcnR5LWNsYXNzICIgKyBjbGFzc05hbWUgKyAiIG5vdCBzdXBwb3J0ZWQgZm9yIGF1dG8tYm94aW5nIik7Ci0gICAgfQotICB9Ci0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNvbnZlcnRWYXJpYWJsZVRvQm94ZWRGb3JtKAotICAgIFN0cmluZyAgY2xhc3NOYW1lLAotICAgIFN0cmluZyAgdmFyTmFtZSkKLSAgewotICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuIHZhck5hbWUgKyAiID8gQm9vbGVhbi5UUlVFIDogQm9vbGVhbi5GQUxTRSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkNoYXJhY3Rlci52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIikiOwotICAgIH0KLSAgICBlbHNlIGlmICgiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkludGVnZXIudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIlNob3J0LnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJsb25nIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkxvbmcudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJEb3VibGUudmFsdWVPZigiICsgdmFyTmFtZSArICIpIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAoImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkZsb2F0LnZhbHVlT2YoIiArIHZhck5hbWUgKyAiKSI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJwcm9wZXJ0eS1jbGFzcyAiICsgY2xhc3NOYW1lICsgIiBub3Qgc3VwcG9ydGVkIGZvciBhdXRvLWJveGluZyIpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ29uc3RydWN0b3IoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQsCi0gICAgICBpbnQgbW9kaWZpZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCk7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotCi0gICAgaWYgKE1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgLy8gVE9ETzogZWxpbWluYXRlIHRoaXMgaW5jb25zaXN0ZW5jeQotICAgICAgaWYgKCFNb2RpZmllci5pc0Fic3RyYWN0KGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzc01vZGlmaWVycygpKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKTsKLQotICAgICAgICBpZiAocmVuZGVyZXJUeXBlICE9IG51bGwpCi0gICAgICAgICAgcmVuZGVyZXJUeXBlID0gY29udmVydFN0cmluZ1RvQm94ZWRMaXRlcmFsKCJTdHJpbmciLCByZW5kZXJlclR5cGUpOwotCi0gICAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgICAgLy8gVE9ETzogcmVzdG9yZSB0aGlzIGNvcnJlY3RseSBwaHJhc2VkIGNvbW1lbnQgKHRlbnNlIHZzLiBjb21tYW5kKQotICAgICAgICAvL291dC5wcmludGxuKCIgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgICBvdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgICBvdXQucHJpbnRsbigicHVibGljICIgKyBjbGFzc05hbWUgKyAiKCkiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotCi0gICAgICAgIHdyaXRlQ29uc3RydWN0b3JDb250ZW50KG91dCwgY29tcG9uZW50LCBtb2RpZmllcnMsIHJlbmRlcmVyVHlwZSk7Ci0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UgaWYgKE1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICAgIC8vIFRPRE86IHJlc3RvcmUgdGhpcyBtb3JlIGRlc2NyaXB0aXZlIGNvbW1lbnQgd2l0aCBwYXJhbSBkb2NzCi0gICAgICAvL291dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUpOwotICAgICAgLy9vdXQucHJpbnRsbigiICogd2l0aCB0aGUgc3BlY2lmaWVkIHJlbmRlcmVyIHR5cGUuIik7Ci0gICAgICAvL291dC5wcmludGxuKCIgKiAiKTsKLSAgICAgIC8vb3V0LnByaW50bG4oIiAqIEBwYXJhbSByZW5kZXJlclR5cGUgIHRoZSByZW5kZXJlciB0eXBlIik7Ci0gICAgICBvdXQucHJpbnRsbigiICogQ29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoZSAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgIiArIGNsYXNzTmFtZSArICIoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHJlbmRlcmVyVHlwZSIpOwotICAgICAgb3V0LnByaW50bG4oIikiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLQotICAgICAgd3JpdGVDb25zdHJ1Y3RvckNvbnRlbnQob3V0LCBjb21wb25lbnQsIG1vZGlmaWVycywgInJlbmRlcmVyVHlwZSIpOwotCi0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICAgIC8vIFRPRE86IGVsaW1pbmF0ZSB0aGlzIGluY29uc2lzdGVuY3kKLSAgICAgIGlmIChNb2RpZmllci5pc0Fic3RyYWN0KGNvbXBvbmVudC5nZXRDb21wb25lbnRDbGFzc01vZGlmaWVycygpKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgICAvLyBUT0RPOiByZXN0b3JlIHRoaXMgY29ycmVjdGx5IHBocmFzZWQgY29tbWVudCAodGVuc2UgdnMuIGNvbW1hbmQpCi0gICAgICAgIC8vb3V0LnByaW50bG4oIiAqIENvbnN0cnVjdHMgYW4gaW5zdGFuY2Ugb2YgIiArIGNsYXNzTmFtZSArICIuIik7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgICBvdXQucHJpbnRsbigiICovIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgIiArIGNsYXNzTmFtZSArICIoKSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ0aGlzKG51bGwpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZUNvbnN0cnVjdG9yQ29udGVudCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgIGludCBtb2RpZmllcnMsIFN0cmluZyByZW5kZXJlclR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwdWJsaWMgdm9pZCB3cml0ZUdldEZhbWlseSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBpZiAoX2lzMTIpewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgU3RyaW5nIGdldEZhbWlseSgpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiBDT01QT05FTlRfRkFNSUxZOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICB3cml0ZVByb3BlcnR5TWV0aG9kcyhvdXQsIGNvbXBvbmVudCwgbnVsbCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50LCBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgTm9uVmlydHVhbEZpbHRlcigpKTsKLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICBpZiAocHJvcGVydHkuaXNMaXN0KCkpCi0gICAgICAgIHdyaXRlUHJvcGVydHlMaXN0TWV0aG9kcyhvdXQsIHByb3BlcnR5LCBpZ25vcmVMaXN0KTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKG91dCwgcHJvcGVydHkpOwotICAgICAgICB3cml0ZVByb3BlcnR5R2V0KG91dCwgcHJvcGVydHksIGlnbm9yZUxpc3QpOwotICAgICAgICB3cml0ZVByb3BlcnR5U2V0KG91dCwgcHJvcGVydHksIGlnbm9yZUxpc3QpOwotICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgIHsKLSAgICAgICAgICB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMob3V0LCBwcm9wZXJ0eSwgaWdub3JlTGlzdCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgQ29sbGVjdGlvbiBpbm9yZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgZ2V0U2luZ3VsYXIoU3RyaW5nIHBsdXJhbCkKLSAgewotICAgIGlmIChwbHVyYWwuZW5kc1dpdGgoInMiKSkKLSAgICAgIHJldHVybiBwbHVyYWwuc3Vic3RyaW5nKDAsIHBsdXJhbC5sZW5ndGgoKSAtIDEpOwotICAgIHJldHVybiBwbHVyYWw7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBDb2xsZWN0aW9uIGlnbm9yZUxpc3QpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldFByb3BlcnR5Q2xhc3MocHJvcGVydHkpOwotICAgIHdyaXRlUHJvcGVydHlTZXQob3V0LCBwcm9wZXJ0eSwgcHJvcGVydHlDbGFzcywgaWdub3JlTGlzdCk7Ci0KLSAgICBpZiAocHJvcGVydHkuZ2V0QWx0ZXJuYXRlQ2xhc3MoKSAhPSBudWxsKQotICAgIHsKLSAgICAgIFN0cmluZyBhbHRlcm5hdGVDbGFzcyA9IFV0aWwuZ2V0QWx0ZXJuYXRlUHJvcGVydHlDbGFzcyhwcm9wZXJ0eSk7Ci0gICAgICB3cml0ZVByb3BlcnR5U2V0KG91dCwgcHJvcGVydHksIGFsdGVybmF0ZUNsYXNzLCBpZ25vcmVMaXN0KTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5U2V0KAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzLAotICAgICAgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgaWYgKGlnbm9yZUxpc3QgIT0gbnVsbCAmJiBpZ25vcmVMaXN0LmNvbnRhaW5zKHNldE1ldGhvZCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogU2V0cyAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0KLSAgICBpZiAocHJvcGVydHkuaXNSZXF1aXJlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiA8cD4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBUaGlzIGlzIGEgcmVxdWlyZWQgcHJvcGVydHkgb24gdGhlIGNvbXBvbmVudC4iKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqICIpOwotICAgIG91dC5wcmludGxuKCIgKiBAcGFyYW0gIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSkgKyAiICB0aGUgbmV3ICIgKyBwcm9wTmFtZSArICIgdmFsdWUiKTsKLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgJiYgX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIEBkZXByZWNhdGVkIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIGlmIChpc0FjY2Vzc29yTWV0aG9kRmluYWwoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgc2V0TWV0aG9kICsgIigiICsgcHJvcGVydHlDbGFzcyArICIgIiArIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIHdyaXRlUHJvcGVydHlTZXR0ZXJNZXRob2RCb2R5KG91dCwgcHJvcGVydHksIHByb3BlcnR5Q2xhc3MpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyTWV0aG9kQm9keSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlHZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5LAotICAgICAgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5RnVsbENsYXNzKTsKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24gPSBwcm9wZXJ0eS5nZXREZXNjcmlwdGlvbigpOwotICAgIFN0cmluZyBnZXRNZXRob2QgPSBVdGlsLmdldE1ldGhvZFJlYWRlckZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgcHJvcGVydHlDbGFzcyk7Ci0gICAgaWYgKGlnbm9yZUxpc3QgIT0gbnVsbCAmJiBpZ25vcmVMaXN0LmNvbnRhaW5zKGdldE1ldGhvZCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBib29sZWFuIGlzVW5jaGVja2VkID0gZmFsc2U7Ci0gICAgU3RyaW5nW10gZ2VuZXJpY1R5cGVzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKTsKLSAgICBpZiAoZ2VuZXJpY1R5cGVzICE9IG51bGwgJiYgZ2VuZXJpY1R5cGVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgaXNVbmNoZWNrZWQgPSB0cnVlOwotICAgICAgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0UHJvcGVydHlDbGFzcyhwcm9wZXJ0eSk7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIEdldHMgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIGlmIChwcm9wZXJ0eS5pc1JlcXVpcmVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIDxwPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIFRoaXMgaXMgYSByZXF1aXJlZCBwcm9wZXJ0eSBvbiB0aGUgY29tcG9uZW50LiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIDwvcD4iKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbigiICoiKTsKLSAgICBvdXQucHJpbnRsbigiICogQHJldHVybiAgdGhlIG5ldyAiICsgcHJvcE5hbWUgKyAiIHZhbHVlIik7Ci0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpICYmIF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBAZGVwcmVjYXRlZCIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigiICovIik7Ci0KLSAgICBpZiAoaXNVbmNoZWNrZWQpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIkBTdXBwcmVzc1dhcm5pbmdzKFwidW5jaGVja2VkXCIpIik7Ci0gICAgfQotCi0gICAgaWYgKGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgcHJvcGVydHlDbGFzcyArICIgIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgd3JpdGVQcm9wZXJ0eUdldHRlck1ldGhvZEJvZHkob3V0LCBwcm9wZXJ0eSk7Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIGdldHRlcnMvc2V0dGVycyBoYXZlIHRoZSBmaW5hbCBtb2RpZmllcgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdldHRlcnMvc2V0dGVycyBhcmUgZmluYWwKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpCi0gIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVByb3BlcnR5R2V0dGVyTWV0aG9kQm9keSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwdWJsaWMgdm9pZCB3cml0ZUZhY2V0TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBJdGVyYXRvciBmYWNldHMgPSBjb21wb25lbnQuZmFjZXRzKCk7Ci0gICAgd2hpbGUgKGZhY2V0cy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgRmFjZXRCZWFuIGZhY2V0ID0gKEZhY2V0QmVhbikgZmFjZXRzLm5leHQoKTsKLSAgICAgIHdyaXRlRmFjZXRHZXQob3V0LCBmYWNldCk7Ci0gICAgICB3cml0ZUZhY2V0U2V0KG91dCwgZmFjZXQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlRmFjZXRTZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgRmFjZXRCZWFuIGZhY2V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmYWNldE5hbWUgPSBmYWNldC5nZXRGYWNldE5hbWUoKTsKLSAgICAvLyBUT0RPOiBkcm9wIHRoZSB1bm5lY2Vzc2FyeSAiRmFjZXQiIHN1ZmZpeAotICAgIFN0cmluZyBmYWNldFZhciA9IGZhY2V0TmFtZSArICJGYWNldCI7Ci0gICAgU3RyaW5nIGZhY2V0S2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoZmFjZXROYW1lLCAiX0ZBQ0VUIik7Ci0gICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIGZhY2V0TmFtZSk7Ci0gICAgU3RyaW5nIGRlc2NyaXB0aW9uID0gZmFjZXQuZ2V0RGVzY3JpcHRpb24oKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgaWYgKGZhY2V0LmlzUmVxdWlyZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogPHA+Iik7Ci0gICAgICBvdXQucHJpbnRsbigiICogVGhpcyBpcyBhIHJlcXVpcmVkIGZhY2V0IG9uIHRoZSBjb21wb25lbnQuIik7Ci0gICAgfQotICAgIC8vIFRPRE86IHB1dCB0aGlzIGJhY2sgaW4KLSAgICAvL291dC5wcmludGxuKCIgKiAiKTsKLSAgICAvL291dC5wcmludGxuKCIgKiBAcGFyYW0gIiArIGZhY2V0VmFyICsgIiAgdGhlIG5ldyAiICsgZmFjZXROYW1lICsgIiBmYWNldCIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIC8vIFJlbW92ZSB0eXBlIHNhZmV0eSB3YXJuaW5nIHNpbmNlIGdldEZhY2V0cyBpcyBub3QgZ2VuZXJpY3MgZW5hYmxlZAotICAgIC8vIHVuZGVyIEpTRiAxLjEgc3BlYwotICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIGxpbmUgd2hlbiBUcmluaWRhZCBzd2l0Y2ggdG8gSlNGIDEuMgotICAgIG91dC5wcmludGxuKCJAU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKSIpOwotCi0gICAgb3V0LnByaW50bG4oImZpbmFsIHB1YmxpYyB2b2lkICIgKyBzZXRNZXRob2QgKyAiKFVJQ29tcG9uZW50ICIgKyBmYWNldFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oImdldEZhY2V0cygpLnB1dCgiICsgZmFjZXRLZXkgKyAiLCAiICsgZmFjZXRWYXIgKyAiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVGYWNldEdldCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBGYWNldEJlYW4gZmFjZXQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZhY2V0TmFtZSA9IGZhY2V0LmdldEZhY2V0TmFtZSgpOwotICAgIFN0cmluZyBmYWNldEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KGZhY2V0TmFtZSwgIl9GQUNFVCIpOwotICAgIFN0cmluZyBnZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJnZXQiLCBmYWNldE5hbWUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IGZhY2V0LmdldERlc2NyaXB0aW9uKCk7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIGlmIChmYWNldC5pc1JlcXVpcmVkKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIDxwPiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqIFRoaXMgaXMgYSByZXF1aXJlZCBmYWNldCBvbiB0aGUgY29tcG9uZW50LiIpOwotICAgIH0KLSAgICAvLyBUT0RPOiBwdXQgdGhpcyBiYWNrIGluCi0gICAgLy9vdXQucHJpbnRsbigiICogIik7Ci0gICAgLy9vdXQucHJpbnRsbigiICogQHJldHVybiAgdGhlICIgKyBmYWNldE5hbWUgKyAiIGZhY2V0Iik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgb3V0LnByaW50bG4oImZpbmFsIHB1YmxpYyBVSUNvbXBvbmVudCAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiBnZXRGYWNldCgiICsgZmFjZXRLZXkgKyAiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0ZW5lck1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgZXZlbnRzID0gY29tcG9uZW50LmV2ZW50cygpOwotICAgIHdoaWxlIChldmVudHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IChFdmVudFJlZkJlYW4pIGV2ZW50cy5uZXh0KCk7Ci0gICAgICBFdmVudEJlYW4gZXZlbnQgPSBldmVudFJlZi5yZXNvbHZlRXZlbnRUeXBlKCk7Ci0gICAgICBpZiAoZXZlbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgd3JpdGVMaXN0ZW5lckFkZChvdXQsIGV2ZW50KTsKLSAgICAgICAgd3JpdGVMaXN0ZW5lclJlbW92ZShvdXQsIGV2ZW50KTsKLSAgICAgICAgd3JpdGVMaXN0ZW5lcnNHZXQob3V0LCBldmVudCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0ZW5lckFkZCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBFdmVudEJlYW4gZXZlbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGxpc3RlbmVyRnVsbENsYXNzID0gZXZlbnQuZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCk7Ci0gICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhsaXN0ZW5lckZ1bGxDbGFzcyk7Ci0KLSAgICBTdHJpbmcgZXZlbnROYW1lID0gZXZlbnQuZ2V0RXZlbnROYW1lKCk7Ci0gICAgU3RyaW5nIGFkZE1ldGhvZCA9IFV0aWwuZ2V0TWV0aG9kTmFtZUZyb21FdmVudCgiYWRkIiwgZXZlbnROYW1lLCAiTGlzdGVuZXIiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBBZGRzIGEgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXIuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEBwYXJhbSBsaXN0ZW5lciAgdGhlICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVyIHRvIGFkZCIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIGlmIChpc0FjY2Vzc29yTWV0aG9kRmluYWwoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIGFkZE1ldGhvZCArICIoIik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKGxpc3RlbmVyQ2xhc3MgKyAiIGxpc3RlbmVyKSIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJhZGRGYWNlc0xpc3RlbmVyKGxpc3RlbmVyKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0ZW5lclJlbW92ZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBFdmVudEJlYW4gZXZlbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGxpc3RlbmVyRnVsbENsYXNzID0gZXZlbnQuZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCk7Ci0gICAgU3RyaW5nIGxpc3RlbmVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhsaXN0ZW5lckZ1bGxDbGFzcyk7Ci0KLSAgICBTdHJpbmcgZXZlbnROYW1lID0gZXZlbnQuZ2V0RXZlbnROYW1lKCk7Ci0gICAgU3RyaW5nIHJlbW92ZU1ldGhvZCA9IFV0aWwuZ2V0TWV0aG9kTmFtZUZyb21FdmVudCgicmVtb3ZlIiwgZXZlbnROYW1lLCAiTGlzdGVuZXIiKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBSZW1vdmVzIGEgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXIuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIEBwYXJhbSBsaXN0ZW5lciAgdGhlICIgKyBldmVudE5hbWUgKyAiIGxpc3RlbmVyIHRvIHJlbW92ZSIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLQotICAgIGlmIChpc0FjY2Vzc29yTWV0aG9kRmluYWwoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnQoImZpbmFsICIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHJlbW92ZU1ldGhvZCArICIoIik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKGxpc3RlbmVyQ2xhc3MgKyAiIGxpc3RlbmVyKSIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZW1vdmVGYWNlc0xpc3RlbmVyKGxpc3RlbmVyKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVMaXN0ZW5lcnNHZXQoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgRXZlbnRCZWFuIGV2ZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBsaXN0ZW5lckZ1bGxDbGFzcyA9IGV2ZW50LmdldEV2ZW50TGlzdGVuZXJDbGFzcygpOwotICAgIFN0cmluZyBsaXN0ZW5lckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MobGlzdGVuZXJGdWxsQ2xhc3MpOwotCi0gICAgU3RyaW5nIGV2ZW50TmFtZSA9IGV2ZW50LmdldEV2ZW50TmFtZSgpOwotICAgIFN0cmluZyBnZXRNZXRob2QgPSBVdGlsLmdldE1ldGhvZE5hbWVGcm9tRXZlbnQoImdldCIsIGV2ZW50TmFtZSwgIkxpc3RlbmVycyIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgb3V0LnByaW50bG4oIiAqIFJldHVybnMgYW4gYXJyYXkgb2YgYXR0YWNoZWQgIiArIGV2ZW50TmFtZSArICIgbGlzdGVuZXJzLiIpOwotICAgIG91dC5wcmludGxuKCIgKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBAcmV0dXJuICBhbiBhcnJheSBvZiBhdHRhY2hlZCAiICsgZXZlbnROYW1lICsgIiBsaXN0ZW5lcnMuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgaWYgKGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgIiArIGxpc3RlbmVyQ2xhc3MgKyAiW10gIiArIGdldE1ldGhvZCArICIoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gKCIgKyBsaXN0ZW5lckNsYXNzICsgIltdKSIgKwotICAgICAgICAiZ2V0RmFjZXNMaXN0ZW5lcnMoIiArIGxpc3RlbmVyQ2xhc3MgKyAiLmNsYXNzKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLQotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVN0YXRlTWFuYWdlbWVudE1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVPdGhlcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIG5vdGhpbmcKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgY29udmVydE11bHRpbGluZUNvbW1lbnQoCi0gICAgICBTdHJpbmcgY29tbWVudEJvZHkpCi0gIHsKLSAgICByZXR1cm4gY29tbWVudEJvZHkucmVwbGFjZUFsbCgiXG4iLCAiXG4gKiAiKTsKLSAgfQotCi0gIHByb3RlY3RlZCBjbGFzcyBSZXNvbHZhYmxlVHlwZUZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgIFN0cmluZyByZXNvbHZhYmxlVHlwZSA9IHJlc29sdmVUeXBlKHByb3BlcnR5Q2xhc3MpOwotICAgICAgcmV0dXJuIChyZXNvbHZhYmxlVHlwZSAhPSBudWxsKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgY2xhc3MgTm9uVmlydHVhbEZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgICB7Ci0gICAgICByZXR1cm4gKCFwcm9wZXJ0eS5pc1ZpcnR1YWwoKSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBTdHJpbmcgcmVzb2x2ZVR5cGUoCi0gICAgICBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpIF9SRVNPTFZBQkxFX1RZUEVTLmdldChjbGFzc05hbWUpOwotICB9Ci0KLQotICBzdGF0aWMgcHJpdmF0ZSBNYXAgX2NyZWF0ZVJlc29sdmFibGVUeXBlcygpCi0gIHsKLSAgICBNYXAgcmVzb2x2YWJsZVR5cGVzID0gbmV3IEhhc2hNYXAoKTsKLQotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImJvb2xlYW4iLCAiQm9vbGVhbiIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImNoYXIiLCAiQ2hhcmFjdGVyIik7Ci0gICAgLy8gVE9ETzogcHV0IHRoaXMgYmFjayBpbgotICAgIC8vcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLkRhdGUiLCAiRGF0ZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImludCIsICJJbnRlZ2VyIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiZmxvYXQiLCAiRmxvYXQiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJkb3VibGUiLCAiRG91YmxlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLkxvY2FsZSIsICJMb2NhbGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJsb25nIiwgIkxvbmciKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nIiwgIlN0cmluZyIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEubGFuZy5OdW1iZXIiLCAiTnVtYmVyIik7Ci0gICAgLy8gVE9ETzogcHV0IHRoaXMgYmFjayBpbgotICAgIC8vcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZ1tdIiwgIlN0cmluZ0FycmF5Iik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS51dGlsLlRpbWVab25lIiwgIlRpbWVab25lIik7Ci0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc29sdmFibGVUeXBlcyk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIF9HRU5FUklDX1RZUEUgPSBQYXR0ZXJuLmNvbXBpbGUoIihbXjxdKyk8KC4rKT4iKTsKLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgTWFwIF9SRVNPTFZBQkxFX1RZUEVTID0gX2NyZWF0ZVJlc29sdmFibGVUeXBlcygpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvQ29tcG9uZW50R2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9Db21wb25lbnRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjYTc5OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9Db21wb25lbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuY29tcG9uZW50OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuQ2xhc3NHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLQotLyoqCi0gKiBHZW5lcmF0ZXMgY29tcG9uZW50IGNsYXNzZXMKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQ29tcG9uZW50R2VuZXJhdG9yIGV4dGVuZHMgQ2xhc3NHZW5lcmF0b3IKLXsKLQotICB2b2lkIHdyaXRlR2VuZXJpY0NvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5LAotICAgICAgU3RyaW5nIGNvbXBvbmVudFR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUHJvcGVydHlDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUHJvcGVydHlWYWx1ZUNvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVGYWNldENvbnN0YW50cygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVHZXRGYW1pbHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVByb3BlcnR5TWV0aG9kcygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVGYWNldE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlTGlzdGVuZXJNZXRob2RzKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVN0YXRlTWFuYWdlbWVudE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlT3RoZXIoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0KLSAgdm9pZCB3cml0ZVByb3BlcnR5TWV0aG9kcyhQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gaWdub3JlTGlzdCkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci9jb21wb25lbnQvTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWI1MDZjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L015RmFjZXNDb21wb25lbnRHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU2MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLmNvbXBvbmVudDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENvbXBvbmVudCBnZW5lcmF0b3IgZm9yIE15RmFjZXMKLSAqCi0gKiBAYXV0aG9yIEJydW5vIEFyYW5kYSAobGF0ZXN0IG1vZGlmaWNhdGlvbiBieSAkQXV0aG9yJCkKLSAqIEB2ZXJzaW9uICRSZXZpc2lvbiQgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBNeUZhY2VzQ29tcG9uZW50R2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IKLXsKLQotICBwdWJsaWMgTXlGYWNlc0NvbXBvbmVudEdlbmVyYXRvcihMb2cgbG9nLCBib29sZWFuIGlzMTIpCi0gIHsKLSAgICBzdXBlcihsb2csIGlzMTIpOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoU2V0IGltcG9ydHMsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgaWYgKF9pczEyKXsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH1lbHNlewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgfQotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIGxQcm9wZXJ0eUJlYW4gPSAoUHJvcGVydHlCZWFuKSBsSXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihsUHJvcGVydHlCZWFuLCBfaXMxMikpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy52YWxpZGF0b3IuVmFsaWRhdG9yIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZhLnV0aWwuQXJyYXlMaXN0Iik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZhLnV0aWwuTGlzdCIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24oUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5RnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHlGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wZXJ0eUdlbmVyaWNzID0gVXRpbC5nZXRHZW5lcmljc0Zyb21Qcm9wZXJ0eShwcm9wZXJ0eSk7Ci0gICAgU3RyaW5nIGRlZiA9IFV0aWwuZ2V0RGVmYXVsdFZhbHVlKHByb3BlcnR5KTsKLSAgICAKLSAgICBpZiAocHJvcGVydHlDbGFzcy5lbmRzV2l0aCgiQm9vbGVhbiIpKXsKLSAgICAgICAgZGVmID0gIkJvb2xlYW4udmFsdWVPZigiK2RlZisiKSI7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLy8gUHJvcGVydHk6ICIgKyBwcm9wTmFtZSk7Ci0gICAgaWYgKHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSB8fCBwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpewotICAgICAgICAvL0lmIHRoZSBwcm9wZXJ0eSBpcyBsaXRlcmFsIG9yIGlzIHRhZ0F0dHJpYnV0ZUV4Y2x1ZGVkLCAKLSAgICAgICAgLy90aGUgZGVmYXVsdCB2YWx1ZSBnb2VzIG9uIHRoZSBkZWZpbml0aW9uIG9mIHRoZSBmaWVsZAotICAgICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSAiICsgcHJvcGVydHlDbGFzcyArIHByb3BlcnR5R2VuZXJpY3MgKyAiICIgKwotICAgICAgICAgICAgICAgIGZpZWxkUHJvcE5hbWUgKyAoZGVmID09IG51bGwgPyAiOyIgOiAiID0gIiArIGRlZiArICI7IikpOyAgICAgICAgCi0gICAgfWVsc2V7ICAgICAgICAKLSAgICAgICAgLy9JZiBpcyBhIHByaW1pdGl2ZSBjbGFzcywgaGFzIGEgc2V0IGZpZWxkIHRvIGNoZWNrIGlmIHRoaXMKLSAgICAgICAgLy9wcm9wZXJ0eSBpcyBkZWZpbmVkLCBzbyB0aGUgZGVmYXVsdCB2YWx1ZSBnb2VzIG9uIHRoZSAKLSAgICAgICAgLy9nZXR0ZXIgbWV0aG9kLgotICAgICAgICAvL0lmIGlzIGEgY2xhc3MsIHRoZSBzYW1lIGFwcGxpZXMsIGJlY2F1c2UgdGhlIGNoZWNrCi0gICAgICAgIC8vaXMgYWdhaW5zdCBudWxsCi0gICAgICAgIG91dC5wcmludGxuKCJwcml2YXRlICIgKyBwcm9wZXJ0eUNsYXNzICsgcHJvcGVydHlHZW5lcmljcyArICIgIiArCi0gICAgICAgICAgICAgICAgZmllbGRQcm9wTmFtZSArICI7Iik7ICAgICAgICAKLSAgICB9Ci0KLSAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5RnVsbENsYXNzKSAmJiAhcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJwcml2YXRlIGJvb2xlYW4gIiArIGZpZWxkUHJvcE5hbWUgKyAiU2V0OyIpOwotICAgICAgCi0gICAgICBpZiAocHJvcGVydHkuaXNJc1NldE1ldGhvZCgpKXsKLSAgICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICAgIFN0cmluZyBzY29wZSA9IHByb3BlcnR5LmdldElzU2V0TWV0aG9kU2NvcGUoKTsKLSAgICAgICAgICBpZiAoc2NvcGUgPT0gbnVsbCkgc2NvcGUgPSAicHJvdGVjdGVkIjsKLSAgICAgICAgICBvdXQucHJpbnRsbihzY29wZSsiIGJvb2xlYW4gIitVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJpc1NldCIsIHByb3BOYW1lKSArICIoKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIGZpZWxkUHJvcE5hbWUgKyAiU2V0OyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIGlmIChwcm9wZXJ0eS5pc0lzR2V0TG9jYWxNZXRob2QoKSl7Ci0gICAgICAgIFN0cmluZyBtZXRob2RQcmVmaXggPSAoImJvb2xlYW4iLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSA/ICJpc0xvY2FsIiA6ICJnZXRMb2NhbCIpOwotICAgICAgICBTdHJpbmcgbWV0aG9kTmFtZSA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUobWV0aG9kUHJlZml4LCBwcm9wTmFtZSk7Ci0gICAgICAgIAotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBTdHJpbmcgc2NvcGUgPSBwcm9wZXJ0eS5nZXRJc0dldExvY2FsTWV0aG9kU2NvcGUoKTsKLSAgICAgICAgaWYgKHNjb3BlID09IG51bGwpIHNjb3BlID0gInByb3RlY3RlZCI7Ci0gICAgICAgIAotICAgICAgICBvdXQucHJpbnRsbigiZmluYWwgIitzY29wZSsiICIgKyBwcm9wZXJ0eUNsYXNzICsgIiAiICsgbWV0aG9kTmFtZSArICIoKSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIGZpZWxkUHJvcE5hbWUgKyAiOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICAgICAgICAKLSAgICB9ICAgIAotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTdGF0ZU1hbmFnZW1lbnRNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIWNvbXBvbmVudC5oYXNQcm9wZXJ0aWVzKCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHdyaXRlU2F2ZVN0YXRlKG91dCwgY29tcG9uZW50KTsKLSAgICB3cml0ZVJlc3RvcmVTdGF0ZShvdXQsIGNvbXBvbmVudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIG5vdGhpbmcKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ29uc3RydWN0b3JDb250ZW50KFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50LCBpbnQgbW9kaWZpZXJzLCBTdHJpbmcgcmVuZGVyZXJUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCJzZXRSZW5kZXJlclR5cGUoIiArIHJlbmRlcmVyVHlwZSArICIpOyIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUxpc3RNZXRob2RzKFByZXR0eVdyaXRlciBvdXQsIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwgQ29sbGVjdGlvbiBpZ25vcmVMaXN0KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGdlbmVyaWM7Ci0gICAgU3RyaW5nIHR5cGU7Ci0gICAgYm9vbGVhbiBpc1ZhbGlkYXRvciA9IEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpOwotICAgIGlmIChpc1ZhbGlkYXRvcikKLSAgICB7Ci0gICAgICBnZW5lcmljID0gIjxWYWxpZGF0b3I+IjsKLSAgICAgIHR5cGUgPSAiVmFsaWRhdG9yIjsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKCkubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgZ2VuZXJpYyA9IFV0aWwuZ2V0R2VuZXJpY3NGcm9tUHJvcGVydHkocHJvcGVydHkpOwotICAgICAgdHlwZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpWzBdKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIm9ubHkgb25lIEdlbmVyaWMgUGFyYW1ldGVyIGlzIGFsbG93ZWQgZm9yIExpc3RzIik7Ci0gICAgfQotCi0gICAgU3RyaW5nIHNpbmd1bGFyTmFtZSA9IGdldFNpbmd1bGFyKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgU3RyaW5nIGFkZE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImFkZCIsIHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIHJlbW92ZU1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInJlbW92ZSIsIHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIGdldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldCIsIHNpbmd1bGFyTmFtZSArICJzIik7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpICsgKGlzVmFsaWRhdG9yID8gIkxpc3QiIDogIiIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLy8gUHJvcGVydHk6ICIgKyBwcm9wTmFtZSk7Ci0gICAgb3V0LnByaW50bG4oInByaXZhdGUgTGlzdCIgKyBnZW5lcmljICsgIiAiICsgZmllbGRQcm9wTmFtZSArICI7Iik7Ci0gICAgaWYgKGlnbm9yZUxpc3QgPT0gbnVsbCB8fCAhaWdub3JlTGlzdC5jb250YWlucyhhZGRNZXRob2QpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqIEFkZHMgYSAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgYWRkTWV0aG9kICsgIiggIiArIHR5cGUgKyAiICIgKwotICAgICAgICAgIHByb3BWYXIgKyAiKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiID09IG51bGwpIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbihcIiIgKyBwcm9wVmFyICsgIlwiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIGZpZWxkUHJvcE5hbWUgKyAiID09IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigiICAiICsgZmllbGRQcm9wTmFtZSArICIgPSBuZXcgQXJyYXlMaXN0IiArIGdlbmVyaWMgKyAiKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oZmllbGRQcm9wTmFtZSArICIuYWRkKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotCi0gICAgaWYgKGlnbm9yZUxpc3QgPT0gbnVsbCB8fCAhaWdub3JlTGlzdC5jb250YWlucyhyZW1vdmVNZXRob2QpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIiAqIFJlbW92ZXMgYSAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCAiICsgcmVtb3ZlTWV0aG9kICsgIiggIiArIHR5cGUgKyAiICIgKyBwcm9wVmFyICsgIikiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiA9PSBudWxsIHx8ICIgKyBmaWVsZFByb3BOYW1lICsgIiA9PSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oIiAgcmV0dXJuOyIpOwotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKGZpZWxkUHJvcE5hbWUgKyAiLnJlbW92ZSgiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIGlmIChpZ25vcmVMaXN0ID09IG51bGwgfHwgIWlnbm9yZUxpc3QuY29udGFpbnMoZ2V0TWV0aG9kKSkKLSAgICB7Ci0gICAgICBpZiAoaXNWYWxpZGF0b3IpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJwcml2YXRlIHN0YXRpYyBmaW5hbCAiICsgdHlwZSArICJbXSBFTVBUWV8iICsgdHlwZS50b1VwcGVyQ2FzZSgpICsgIl9BUlJBWSA9IG5ldyAiICsgdHlwZSArICJbMF07Iik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCIgKiBHZXRzIGFsbCAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICAgIGlmIChpc1ZhbGlkYXRvcikKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgdHlwZSArICJbXSAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgTGlzdCIgKyBnZW5lcmljICsgIiAiICsgZ2V0TWV0aG9kICsgIigpIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgaWYgKGlzVmFsaWRhdG9yKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBmaWVsZFByb3BOYW1lICsgIj09IG51bGw/IEVNUFRZXyIgKyB0eXBlLnRvVXBwZXJDYXNlKCkgKyAiX0FSUkFZIDogIiArIGZpZWxkUHJvcE5hbWUgKyAiLnRvQXJyYXkobmV3ICIgKyB0eXBlICsgIlsiICsgZmllbGRQcm9wTmFtZSArICIuc2l6ZSgpXSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIGZpZWxkUHJvcE5hbWUgKyAiID09IG51bGwpIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oZmllbGRQcm9wTmFtZSArICIgPSBuZXcgQXJyYXlMaXN0PCIgKyB0eXBlICsgIj4oKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIGZpZWxkUHJvcE5hbWUgKyAiOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXJNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHZhck5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpKTsKLQotICAgIG91dC5wcmludGxuKCJ0aGlzLiIgKyB2YXJOYW1lICsgIiA9ICIgKyBwcm9wVmFyICsgIjsiKTsKLQotICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlDbGFzcykgJiYgIXByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigidGhpcy4iICsgX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiID0gdHJ1ZTsiKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5R2V0dGVyTWV0aG9kQm9keShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHZhck5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBpZiAocHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCkgKyAiOyIpOwotICAgIH0KLSAgICBlbHNlIGlmKHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyB2YXJOYW1lICsgIjsiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcEZ1bGxDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIF9wcmltaXRpdmVTZXRWYXJOYW1lKHZhck5hbWUpICsgIikiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImlmICgiICsgdmFyTmFtZSArICIgIT0gbnVsbCkiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpICsgIjsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIGlmIChfaXMxMil7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIlZhbHVlRXhwcmVzc2lvbiBleHByZXNzaW9uID0gZ2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpICsgIlwiKTsiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiaWYgKGV4cHJlc3Npb24gIT0gbnVsbCkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBfY2FzdElmTmVjZXNzYXJ5KHByb3BDbGFzcykgKyAiZXhwcmVzc2lvbi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKS5nZXRFTENvbnRleHQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gZ2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpICsgIlwiKTsiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiaWYgKHZiICE9IG51bGwpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wRnVsbENsYXNzKSkKLSAgICAgICAgICB7ICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgb3V0LnByaW50bG4oInJldHVybiAoIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKSArICJ2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKSkpLiIrcHJvcENsYXNzKyJWYWx1ZSgpOyIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgICBTdHJpbmcgdHlwZSA9IG51bGw7IAotICAgICAgICAgICAgICBpZiAoICh0eXBlID0gVXRpbC5nZXRQcmltaXRpdmVUeXBlKHByb3BDbGFzcykpICE9IG51bGwpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJPYmplY3QgdmFsdWUgPSB2YiA9PSBudWxsID8gbnVsbCA6IHZiLmdldFZhbHVlKGdldEZhY2VzQ29udGV4dCgpKTsiKTsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJpZiAoISh2YWx1ZSBpbnN0YW5jZW9mICIrcHJvcENsYXNzKyIpKXsiKTsKLSAgICAgICAgICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJ2YWx1ZSA9ICIgKyBVdGlsLmdldEJveGVkQ2xhc3ModHlwZSkgKyIudmFsdWVPZih2YWx1ZS50b1N0cmluZygpKTsiKTsKLSAgICAgICAgICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKSArICJ2YWx1ZTsiKTsgICAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKSArICJ2Yi5nZXRWYWx1ZShnZXRGYWNlc0NvbnRleHQoKSk7Iik7ICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsgICAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIFN0cmluZyByZXQgPSBVdGlsLmdldERlZmF1bHRWYWx1ZShwcm9wZXJ0eSk7Ci0gICAgICBpZiAobnVsbCAhPSByZXQpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIHJldCArICI7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcEZ1bGxDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gIiArIFV0aWwucHJpbWl0aXZlRGVmYXVsdFZhbHVlKHByb3BGdWxsQ2xhc3MpICsgIjsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiBudWxsOyIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2F2ZVN0YXRlKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBhcnJheU5hbWUgPSAidmFsdWVzIjsKLQotICAgIC8vIGZpcnN0IHdlIGNvdW50IHRoZSBwcmltaXRpdmUgcHJvcGVydGllcywgYmVjYXVzZSBmb3IgZWFjaCBwcmltaXRpdmUgcHJvcGVydHkKLSAgICAvLyB3ZSBzYXZlIGEgbmV3IHByb3BlcnR5IHRoYXQgc2F5cyBpZiB0aGUgcHJvcGVydHkgaGFzIGJlZW4gc2V0IG9yIG5vdAotICAgIGludCBwcmltaXRpdmVQcm9wZXJ0aWVzQ291bnQgPSAwOwotICAgIGZvciAoSXRlcmF0b3IgaXRlcmF0b3IgPSBjb21wb25lbnQucHJvcGVydGllcygpOyBpdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSkKLSAgICAgIHsKLSAgICAgICAgcHJpbWl0aXZlUHJvcGVydGllc0NvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gdGhlIHRvdGFsIGFycmF5IHNpemUgaXMgdGhlIG51bWJlciBvZiBwcm9wZXJ0aWVzLCBwbHVzIHRoZSBudW1iZXIgb2YgcHJpbWl0aXZlcywKLSAgICAvLyBwbHVzIDEgKHRoZSBzdXBlciBjYWxsKQotICAgIGludCBhcnJheVNpemUgPSBjb21wb25lbnQucHJvcGVydGllc1NpemUoKSArIHByaW1pdGl2ZVByb3BlcnRpZXNDb3VudCArIDE7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIGlmIChfaXMxMil7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyBPYmplY3Qgc2F2ZVN0YXRlKEZhY2VzQ29udGV4dCBmYWNlc0NvbnRleHQpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIk9iamVjdFtdICIgKyBhcnJheU5hbWUgKyAiID0gbmV3IE9iamVjdFsiICsgYXJyYXlTaXplICsgIl07Iik7Ci0KLSAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyAwICsgIl0gPSBzdXBlci5zYXZlU3RhdGUoZmFjZXNDb250ZXh0KTsiKTsKLQotICAgIGludCBwcm9wSW5kZXggPSAxOwotCi0gICAgZm9yIChJdGVyYXRvciBpdGVyYXRvciA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7IGl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgaXRlcmF0b3IubmV4dCgpOwotICAgICAgU3RyaW5nIHZhck5hbWUgPSBwcm9wZXJ0eS5nZXRGaWVsZFByb3BlcnR5TmFtZSgpOwotCi0gICAgICBpZiAocHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpKQotICAgICAgewotICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyArK3Byb3BJbmRleCArICJdID0gc2F2ZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiICsgdmFyTmFtZSArICJMaXN0KTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc0xpc3QoKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKGFycmF5TmFtZSArICJbIiArICsrcHJvcEluZGV4ICsgIl0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIgKyB2YXJOYW1lICsgIik7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0gPSBzYXZlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIgKyB2YXJOYW1lICsgIik7Iik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCkpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9IHNhdmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIiArIHZhck5hbWUgKyAiKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFfaXMxMiAmJiBVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSl7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9ICIrVXRpbC5nZXRCb3hlZENsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkrIi52YWx1ZU9mKCIgKyB2YXJOYW1lICsgIik7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9ICIgKyB2YXJOYW1lICsgIjsiKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgICB9Ci0KLSAgICAgIHByb3BJbmRleCsrOwotCi0gICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkgJiYgIXByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFfaXMxMil7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9IEJvb2xlYW4udmFsdWVPZigiICsgX3ByaW1pdGl2ZVNldFZhck5hbWUodmFyTmFtZSkgKyAiKTsiKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSA9ICIgKyBfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICI7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcEluZGV4Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuICIgKyBhcnJheU5hbWUgKyAiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVJlc3RvcmVTdGF0ZShQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgYXJyYXlOYW1lID0gInZhbHVlcyI7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIGlmIChfaXMxMil7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkIHJlc3RvcmVTdGF0ZShGYWNlc0NvbnRleHQgZmFjZXNDb250ZXh0LCBPYmplY3Qgc3RhdGUpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBvdXQucHJpbnRsbigiT2JqZWN0W10gIiArIGFycmF5TmFtZSArICIgPSAoT2JqZWN0W10pc3RhdGU7Iik7Ci0gICAgb3V0LnByaW50bG4oInN1cGVyLnJlc3RvcmVTdGF0ZShmYWNlc0NvbnRleHQsIiArIGFycmF5TmFtZSArICJbMF0pOyIpOwotCi0gICAgaW50IHByb3BJbmRleCA9IDE7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGl0ZXJhdG9yID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsgaXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBpdGVyYXRvci5uZXh0KCk7Ci0KLSAgICAgIFN0cmluZyB2YXJOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotCi0gICAgICBpZiAocHJvcGVydHkuaXNTdGF0ZUhvbGRlcigpKQotICAgICAgewotICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIkxpc3QgPSAoTGlzdDxWYWxpZGF0b3I+KSByZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIKLSAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyArK3Byb3BJbmRleCArICJdKTsiKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc0xpc3QoKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiID0gKExpc3QpIHJlc3RvcmVBdHRhY2hlZFN0YXRlKGZhY2VzQ29udGV4dCwgIgotICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArICsrcHJvcEluZGV4ICsgIl0pOyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiID0gIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKSArICJyZXN0b3JlQXR0YWNoZWRTdGF0ZShmYWNlc0NvbnRleHQsICIKLSAgICAgICAgICAgICAgKyBhcnJheU5hbWUgKyAiWyIgKyBwcm9wSW5kZXggKyAiXSk7Iik7Ci0gICAgICAgIH0KLQotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiID0gKENvbnZlcnRlcikgcmVzdG9yZUF0dGFjaGVkU3RhdGUoZmFjZXNDb250ZXh0LCAiCi0gICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFfaXMxMiAmJiBVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSl7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbih2YXJOYW1lICsgIiA9ICgiICsgX2Nhc3RJZk5lY2Vzc2FyeShwcm9wQ2xhc3MpCi0gICAgICAgICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl0pLiIrcHJvcENsYXNzKyJWYWx1ZSgpOyIpOyAgICAgICAgICAgIAotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIG91dC5wcmludGxuKHZhck5hbWUgKyAiID0gIiArIF9jYXN0SWZOZWNlc3NhcnkocHJvcENsYXNzKQotICAgICAgICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdOyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByb3BJbmRleCsrOwotCi0gICAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkgJiYgIXByb3BlcnR5LmlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKCFfaXMxMil7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICIgPSAoKEJvb2xlYW4pIgotICAgICAgICAgICAgICAgICAgICArIGFycmF5TmFtZSArICJbIiArIHByb3BJbmRleCArICJdKS5ib29sZWFuVmFsdWUoKTsiKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbihfcHJpbWl0aXZlU2V0VmFyTmFtZSh2YXJOYW1lKSArICIgPSAoQm9vbGVhbikiCi0gICAgICAgICAgICAgICAgICAgICsgYXJyYXlOYW1lICsgIlsiICsgcHJvcEluZGV4ICsgIl07Iik7Ci0gICAgICAgIH0KLSAgICAgICAgcHJvcEluZGV4Kys7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfY2FzdElmTmVjZXNzYXJ5KFN0cmluZyBwcm9wQ2xhc3MpCi0gIHsKLSAgICBpZiAocHJvcENsYXNzLmVxdWFscygiT2JqZWN0IikgfHwgcHJvcENsYXNzLmVxdWFscygiamF2YS5sYW5nLk9iamVjdCIpKQotICAgIHsKLSAgICAgIHJldHVybiAiIjsKLSAgICB9Ci0KLSAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BDbGFzcykpCi0gICAgewotICAgICAgcHJvcENsYXNzID0gVXRpbC5nZXRCb3hlZENsYXNzKHByb3BDbGFzcyk7Ci0gICAgfQotCi0gICAgcmV0dXJuICIoIiArIHByb3BDbGFzcyArICIpIjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfcHJpbWl0aXZlU2V0VmFyTmFtZShTdHJpbmcgdmFyTmFtZSkKLSAgewotICAgIHJldHVybiB2YXJOYW1lICsgIlNldCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL2NvbXBvbmVudC9UcmluaWRhZENvbXBvbmVudEdlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTVkMjdjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvY29tcG9uZW50L1RyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5jb21wb25lbnQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFRyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb21wb25lbnRHZW5lcmF0b3IKLXsKLSAgcHVibGljIFRyaW5pZGFkQ29tcG9uZW50R2VuZXJhdG9yKExvZyBsb2csIGJvb2xlYW4gaXMxMikKLSAgewotICAgIHN1cGVyKGxvZywgaXMxMik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoU2V0IGltcG9ydHMsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgLy8gRmFjZXNCZWFuIGlzIGFsd2F5cyBuZWVkZWQgdG8gZGVmaW5lIHRoZSBUWVBFCi0KLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmJlYW4uRmFjZXNCZWFuIik7Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IE5vblZpcnR1YWxGaWx0ZXIoKSk7Ci0gICAgLy8gUHJvcGVydHlLZXkgb25seSBuZWVkZWQgaWYgdGhlcmUgYXJlIHByb3BlcnRpZXMKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5iZWFuLlByb3BlcnR5S2V5Iik7Ci0KLSAgICAgIFByb3BlcnR5RmlsdGVyIHJlc29sdmFibGUgPSBuZXcgUmVzb2x2YWJsZVR5cGVGaWx0ZXIoKTsKLSAgICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0KLSAgICAgICAgLy8gQ29tcG9uZW50VXRpbHMgb25seSBuZWVkZWQgZm9yIHJlc29sdmFibGUgcHJvcGVydGllcwotICAgICAgICBpZiAocmVzb2x2YWJsZS5hY2NlcHQocHJvcGVydHkpKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQudXRpbC5Db21wb25lbnRVdGlscyIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlQ29uc3RydWN0b3JDb250ZW50KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcmVuZGVyZXJUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCJzdXBlcigiICsgcmVuZGVyZXJUeXBlICsgIik7Iik7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwgUHJvcGVydHlCZWFuIHByb3BlcnR5LCBDb2xsZWN0aW9uIGdub3JlTGlzdCkKLSAgewotICAgIC8vIG5vdGhpbmcKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlUHJvcGVydHlDb25zdGFudHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oInN0YXRpYyBwdWJsaWMgZmluYWwgRmFjZXNCZWFuLlR5cGUgVFlQRSA9IG5ldyBGYWNlc0JlYW4uVHlwZSgiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oc3VwZXJjbGFzc05hbWUgKyAiLlRZUEUpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotCi0gICAgLy8gIGNvbXBvbmVudCBwcm9wZXJ0eSBrZXlzCi0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBOb25WaXJ0dWFsRmlsdGVyKCkpOwotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICAgIFN0cmluZyBwcm9wQWxpYXMgPSBwcm9wZXJ0eS5nZXRBbGlhc09mKCk7Ci0KLSAgICAgIG91dC5wcmludGxuKCJzdGF0aWMgcHVibGljIGZpbmFsIFByb3BlcnR5S2V5ICIgKyBwcm9wS2V5ICsgIiA9Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBpZiAocHJvcEFsaWFzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBhbGlhc0tleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BBbGlhcywgIl9LRVkiKTsKLSAgICAgICAgb3V0LnByaW50KCJUWVBFLnJlZ2lzdGVyQWxpYXMoIiArIGFsaWFzS2V5ICsgIiwgXCIiICsgcHJvcE5hbWUgKyAiXCIpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnQoIlRZUEUucmVnaXN0ZXJLZXkoXCIiICsgcHJvcE5hbWUgKyAiXCIiKTsKLQotICAgICAgICAvLyBwcm9wZXJ0eSBjbGFzcwotICAgICAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgICAgICBpZiAocHJvcENsYXNzID09IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwcm9wQ2xhc3MgPSAiU3RyaW5nIjsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgcHJvcERlZmF1bHQgPSBwcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKTsKLQotICAgICAgICBpZiAoISJPYmplY3QiLmVxdWFscyhwcm9wQ2xhc3MpIHx8IHByb3BEZWZhdWx0ICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBUT0RPOiBkbyBub3QgdXNlIGJveGVkIGNsYXNzIGhlcmUKLSAgICAgICAgICBTdHJpbmcgYm94ZWRDbGFzcyA9IFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wQ2xhc3MpOwotICAgICAgICAgIG91dC5wcmludCgiLCAiICsgYm94ZWRDbGFzcyArICIuY2xhc3MiKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm9wRGVmYXVsdCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKHByb3BlcnR5LmlzRW51bSgpKQotICAgICAgICAgICAgb3V0LnByaW50KCIsIEVudW0udmFsdWVPZigiICsgcHJvcENsYXNzICsgIi5jbGFzcywiICsKLSAgICAgICAgICAgICAgICAgICAgICBjb252ZXJ0U3RyaW5nVG9Cb3hlZExpdGVyYWwoIlN0cmluZyIsIHByb3BEZWZhdWx0KSArCi0gICAgICAgICAgICAgICAgICAgICAgIikiKTsKLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgICBvdXQucHJpbnQoIiwgIiArIGNvbnZlcnRTdHJpbmdUb0JveGVkTGl0ZXJhbChwcm9wQ2xhc3MsIHByb3BEZWZhdWx0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBwcm9wZXJ0eSBjYXBhYmlsaXRpZXMKLSAgICAgICAgU3RyaW5nIHByb3BDYXBzID0gX2dldFByb3BlcnR5Q2FwYWJpbGl0aWVzKHByb3BlcnR5KTsKLSAgICAgICAgaWYgKHByb3BDYXBzICE9IG51bGwpCi0gICAgICAgICAgb3V0LnByaW50KCIsICIgKyBwcm9wQ2Fwcyk7Ci0gICAgICAgIG91dC5wcmludGxuKCIpOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKFByZXR0eVdyaXRlciBvdXQsIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBub3RoaW5nIGJ5IGRlZmF1bHQKLSAgfQotCi0KLSAgLyoqCi0gICAqIFdoZXRoZXIgdGhlIGdldHRlcnMvc2V0dGVycyBoYXZlIHRoZSBmaW5hbCBtb2RpZmllcgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIGdldHRlcnMvc2V0dGVycyBhcmUgZmluYWwKLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIGlzQWNjZXNzb3JNZXRob2RGaW5hbCgpCi0gIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlTZXR0ZXJNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0KLSAgICBpZiAoVXRpbC5pc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5Q2xhc3MpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJzZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIsICIgKwotICAgICAgICAgICAgICAgICAgY29udmVydFZhcmlhYmxlVG9Cb3hlZEZvcm0ocHJvcGVydHlDbGFzcywgcHJvcFZhcikgKwotICAgICAgICAgICAgICAgICAgIik7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigic2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiLCAoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eUdldHRlck1ldGhvZEJvZHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wZXJ0eUZ1bGxDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5RnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotCi0gICAgU3RyaW5nIHJlc29sdmFibGVUeXBlID0gcmVzb2x2ZVR5cGUocHJvcGVydHlGdWxsQ2xhc3MpOwotCi0gICAgaWYgKHJlc29sdmFibGVUeXBlICE9IG51bGwpCi0gICAgewotICAgICAgLy8gVE9ETzogY2hhbmdlIHNpZ25hdHVyZSBvZiBDb21wb25lbnRVdGlscy5yZXNvbHZlQ2hhcmFjdGVyCi0gICAgICAvLyAgICAgICB0byB0YWtlIE9iamVjdCBpbnN0ZWFkIG9mIENoYXJhY3RlcgotICAgICAgaWYgKHJlc29sdmFibGVUeXBlLmVxdWFscygiQ2hhcmFjdGVyIikpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJyZXR1cm4gQ29tcG9uZW50VXRpbHMucmVzb2x2ZUNoYXJhY3RlcigoQ2hhcmFjdGVyKWdldFByb3BlcnR5KCIgKyBwcm9wS2V5ICsgIikpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAvLyBUT0RPOiBzdG9wIHNwZWNpZnlpbmcgZGVmYXVsdCB2YWx1ZXMgaW4gdGhlIGdldHRlcnMKLSAgICAgICAgU3RyaW5nIHJlc29sdmVNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJyZXNvbHZlIiwgcmVzb2x2YWJsZVR5cGUpOwotICAgICAgICBTdHJpbmcgcHJvcGVydHlEZWZhdWx0ID0gcHJvcGVydHkuZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgIG91dC5wcmludCgicmV0dXJuIENvbXBvbmVudFV0aWxzLiIgKyByZXNvbHZlTWV0aG9kICsgIihnZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIpIik7Ci0gICAgICAgIGlmIChwcm9wZXJ0eURlZmF1bHQgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludCgiLCAiICsgVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsKHByb3BlcnR5Q2xhc3MsCi0gICAgICAgICAgICAgIHByb3BlcnR5RGVmYXVsdCkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKCIpOyIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaWYgKHByb3BlcnR5Q2xhc3MuZXF1YWxzKCJPYmplY3QiKSkKLSAgICAgIHsKLSAgICAgICAgLy8gQ2FzdCBpcyBub3QgbmVjZXNzYXJ5IGlmIHRoZSBwcm9wZXJ0eSBjbGFzcyBpcyBPYmplY3QKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiBnZXRQcm9wZXJ0eSgiICsgcHJvcEtleSArICIpOyIpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigicmV0dXJuICgiICsgcHJvcGVydHlDbGFzcyArICIpIiArCi0gICAgICAgICAgICAiZ2V0UHJvcGVydHkoIiArIHByb3BLZXkgKyAiKTsiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVN0YXRlTWFuYWdlbWVudE1ldGhvZHMoUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gbm90aGluZyB0byBkbyBoZXJlCi0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVByb3BlcnR5TGlzdE1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgaWYgKCEiamF2YS51dGlsLkxpc3QiLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5lcnJvcigiSW52YWxpZCBsaXN0IHR5cGU6ICIgKyBwcm9wZXJ0eUNsYXNzKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICAvLyBMb29rIGZvciB0aGUgZ2VuZXJpYyB0eXBlIC0gaWYgaXQgZG9lc24ndCBleGlzdCwgdGhlbgotICAgIC8vIHdlJ2xsIGJlIGFuIE9iamVjdC4KLSAgICBTdHJpbmdbXSBwYXJhbXMgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzUGFyYW1ldGVycygpOwotICAgIGlmICgocGFyYW1zID09IG51bGwpIHx8IChwYXJhbXMubGVuZ3RoID09IDApKQotICAgICAgcHJvcGVydHlDbGFzcyA9ICJqYXZhLmxhbmcuT2JqZWN0IjsKLSAgICBlbHNlCi0gICAgICBwcm9wZXJ0eUNsYXNzID0gcGFyYW1zWzBdOwotCi0gICAgcHJvcGVydHlDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5Q2xhc3MpOwotCi0gICAgU3RyaW5nIHNpbmd1bGFyTmFtZSA9IGdldFNpbmd1bGFyKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9IFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShzaW5ndWxhck5hbWUpOwotICAgIFN0cmluZyBkZXNjcmlwdGlvbiA9IHByb3BlcnR5LmdldERlc2NyaXB0aW9uKCk7Ci0gICAgU3RyaW5nIGFkZE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImFkZCIsIHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIHJlbW92ZU1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInJlbW92ZSIsIHNpbmd1bGFyTmFtZSk7Ci0gICAgU3RyaW5nIGdldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoImdldCIsIHByb3BOYW1lKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIGlmIChkZXNjcmlwdGlvbiAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCIgKiBBZGRzIGEgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICBvdXQucHJpbnRsbigiZmluYWwgcHVibGljIHZvaWQgIiArIGFkZE1ldGhvZCArICIoIiArIHByb3BlcnR5Q2xhc3MgKyAiICIgKwotICAgICAgICBwcm9wVmFyICsgIikiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiA9PSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOyIpOwotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oImdldEZhY2VzQmVhbigpLmFkZEVudHJ5KCIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgaWYgKGRlc2NyaXB0aW9uICE9IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIiAqIFJlbW92ZXMgYSAiICsgY29udmVydE11bHRpbGluZUNvbW1lbnQoZGVzY3JpcHRpb24pKTsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgIG91dC5wcmludGxuKCJmaW5hbCBwdWJsaWMgdm9pZCAiICsgcmVtb3ZlTWV0aG9kICsgIigiICsgcHJvcGVydHlDbGFzcyArICIgIiArCi0gICAgICAgIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiID09IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Iik7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigiZ2V0RmFjZXNCZWFuKCkucmVtb3ZlRW50cnkoIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIvKioiKTsKLSAgICBpZiAoZGVzY3JpcHRpb24gIT0gbnVsbCkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiICogR2V0cyBhbGwgIiArIGNvbnZlcnRNdWx0aWxpbmVDb21tZW50KGRlc2NyaXB0aW9uKSk7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICBvdXQucHJpbnRsbigiZmluYWwgcHVibGljICIgKyBwcm9wZXJ0eUNsYXNzICsgIltdICIgKyBnZXRNZXRob2QgKyAiKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuICgiICsgcHJvcGVydHlDbGFzcyArICJbXSkgZ2V0RmFjZXNCZWFuKCkuZ2V0RW50cmllcygiKTsKLSAgICBvdXQucHJpbnRsbigiICAgICAgICAgIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcGVydHlDbGFzcyArICIuY2xhc3MpOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZU90aGVyKFByZXR0eVdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIF93cml0ZUdldEJlYW5UeXBlKG91dCk7Ci0KLSAgICB3cml0ZUNvbnN0cnVjdG9yKG91dCwgY29tcG9uZW50LCBNb2RpZmllci5QUk9URUNURUQpOwotCi0gICAgX3dyaXRlVHlwZUxvY2sob3V0LCBjb21wb25lbnQpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgX3dyaXRlR2V0QmVhblR5cGUoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgRmFjZXNCZWFuLlR5cGUgZ2V0QmVhblR5cGUoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gVFlQRTsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVR5cGVMb2NrKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigic3RhdGljIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSA9IGNvbXBvbmVudC5nZXRSZW5kZXJlclR5cGUoKTsKLSAgICBpZiAocmVuZGVyZXJUeXBlID09IG51bGwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIlRZUEUubG9jaygpOyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgU3RyaW5nIGNvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudC5maW5kQ29tcG9uZW50RmFtaWx5KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVFlQRS5sb2NrQW5kUmVnaXN0ZXIoXCIiICsgY29tcG9uZW50RmFtaWx5ICsgIlwiLCIgKwotICAgICAgICAgICJcIiIgKyByZW5kZXJlclR5cGUgKyAiXCIpOyIpOwotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZ2V0UHJvcGVydHlDYXBhYmlsaXRpZXMoCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBMaXN0IGNhcHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0KLSAgICBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgfHwKLSAgICAgICAgcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgIHsKLSAgICAgIGNhcHMuYWRkKCJQcm9wZXJ0eUtleS5DQVBfTk9UX0JPVU5EIik7Ci0gICAgfQotCi0gICAgaWYgKHByb3BlcnR5LmlzU3RhdGVIb2xkZXIoKSkKLSAgICB7Ci0gICAgICBjYXBzLmFkZCgiUHJvcGVydHlLZXkuQ0FQX1NUQVRFX0hPTERFUiIpOwotICAgIH0KLQotICAgIGlmIChwcm9wZXJ0eS5pc1RyYW5zaWVudCgpKQotICAgIHsKLSAgICAgIGNhcHMuYWRkKCJQcm9wZXJ0eUtleS5DQVBfVFJBTlNJRU5UIik7Ci0gICAgfQotCi0gICAgaWYgKHByb3BlcnR5LmlzTGlzdCgpKQotICAgIHsKLSAgICAgIGNhcHMuYWRkKCJQcm9wZXJ0eUtleS5DQVBfTElTVCIpOwotICAgIH0KLQotICAgIGlmIChjYXBzLmlzRW1wdHkoKSkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgU3RyaW5nQnVmZmVyIHNiID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fwcy5zaXplKCk7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoaSA+IDApCi0gICAgICAgIHNiLmFwcGVuZCgiIHwgIik7Ci0gICAgICBzYi5hcHBlbmQoY2Fwcy5nZXQoaSkpOwotICAgIH0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOGRiODMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlNvdXJjZVRlbXBsYXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Nb2RpZmllcjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqCi0gKiBUT0RPOiBjb21tZW50IHRoaXMhCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RDb21wb25lbnRUYWdHZW5lcmF0b3IgaW1wbGVtZW50cyBDb21wb25lbnRUYWdHZW5lcmF0b3IKLXsKLQotICBwdWJsaWMgdm9pZCB3cml0ZUltcG9ydHMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZVRlbXBsYXRlIHRlbXBsYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHBhY2thZ2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGZ1bGxTdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgQ29sbGVjdGlvbiBjb21wb25lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgICBjb21wb25lbnRzLmFkZChjb21wb25lbnQpOwotICAgIHdyaXRlSW1wb3J0cyhvdXQsIHRlbXBsYXRlLCBwYWNrYWdlTmFtZSwgZnVsbFN1cGVyY2xhc3NOYW1lLCBzdXBlcmNsYXNzTmFtZSwgY29tcG9uZW50cyk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW1wb3J0cyhQcmV0dHlXcml0ZXIgb3V0LCBTb3VyY2VUZW1wbGF0ZSB0ZW1wbGF0ZSwgU3RyaW5nIHBhY2thZ2VOYW1lLCBTdHJpbmcgZnVsbFN1cGVyY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN1cGVyY2xhc3NOYW1lLCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpCi0gIHsKLSAgICBTZXQgaW1wb3J0cyA9IG5ldyBUcmVlU2V0KCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGxJdGVyYXRvciA9IGNvbXBvbmVudHMuaXRlcmF0b3IoKTsgbEl0ZXJhdG9yLmhhc05leHQoKTspCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSAoQ29tcG9uZW50QmVhbikgbEl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICAgIC8vIFRPRE86IHJlbW92ZSB0aGVzZSBpbXBvcnRzCi0gICAgICAvLyBGSVhNRTogQWN0dWFsbHkgbGFzdCAyIGNhbiBiZSBrZXB0IHdoZW4gbm90IGFic3RyYWN0Ci0gICAgICAvL2ltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnQiKTsKLQotICAgICAgLy8gc3VwZXJjbGFzc05hbWUgaXMgZnVsbHkgcXVhbGlmaWVkIGlmIGl0IGNvbGxpZGVzCi0gICAgICAvLyB3aXRoIHRoZSBnZW5lcmF0ZWQgY2xhc3MgbmFtZSBhbmQgc2hvdWxkIG5vdCBiZQotICAgICAgLy8gaW1wb3J0ZWQgd2hlbiBzdWNoIGEgY29sbGlzaW9uIHdvdWxkIG9jY3VyCi0gICAgICBpZiAoIXN1cGVyY2xhc3NOYW1lLmVxdWFscyhmdWxsU3VwZXJjbGFzc05hbWUpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZChmdWxsU3VwZXJjbGFzc05hbWUpOwotICAgICAgfQotCi0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotCi0gICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgICAgICBTdHJpbmdbXSBwcm9wZXJ0eUNsYXNzUGFyYW1zID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKTsKLQotICAgICAgICBpZiAocHJvcGVydHlDbGFzcyAhPSBudWxsICYmIHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICAgICAgewotICAgICAgICAgIC8vIEltcG9ydCB0aGUgcHJvcGVydHkgY2xhc3Mgb25seSBpZiBvbmx5IGxpdHRlcmFscyBhcmUgc3VwcG9ydGVkCi0gICAgICAgICAgLy8gb3RoZXJ3aXNlIHRoZSBjbGFzcyB3aWxsIGJlIGEgU3RyaW5nIGluc2lkZSB0aGUgdGFnIHRvIHN1cHBvcnQKLSAgICAgICAgICAvLyBWYWx1ZUJpbmRpbmcKLSAgICAgICAgICBpbXBvcnRzLmFkZChwcm9wZXJ0eUNsYXNzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRPRE86IHJlc3RvcmUgaW1wb3J0IGFuZCBtYWtlIHJlZmVyZW5jZSB0bwotICAgICAgICAvLyAgICAgICBDb25zdGFudE1ldGhvZEJpbmRpbmcgcmVsYXRpdmUgcmF0aGVyCi0gICAgICAgIC8vICAgICAgIHRoYW4gYWJzb2x1dGUKLSAgICAgICAgLy9pZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkgJiYKLSAgICAgICAgLy8gICAgaXNTdHJpbmdNZXRob2RCaW5kaW5nUmV0dXJuVHlwZShwcm9wZXJ0eSkpCi0gICAgICAgIC8vewotICAgICAgICAvLyAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi5Db25zdGFudE1ldGhvZEJpbmRpbmciKTsKLSAgICAgICAgLy99Ci0gICAgICB9Ci0KLSAgICAgIGFkZFNwZWNpZmljSW1wb3J0cyhpbXBvcnRzLCBjb21wb25lbnQpOwotCi0gICAgfQotICAgIC8vIGRvIG5vdCBpbXBvcnQgaW1wbGljaXQhCi0gICAgaW1wb3J0cy5yZW1vdmVBbGwoVXRpbC5QUklNSVRJVkVfVFlQRVMpOwotCi0gICAgR2VuZXJhdG9ySGVscGVyLndyaXRlSW1wb3J0cyhvdXQsIHBhY2thZ2VOYW1lLCBpbXBvcnRzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ2xhc3NCZWdpbihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBzdXBlcmNsYXNzTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlVGVtcGxhdGUgdGVtcGxhdGUpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gY29tcG9uZW50LmdldFRhZ0NsYXNzTW9kaWZpZXJzKCk7Ci0gICAgU3RyaW5nIGNsYXNzU3RhcnQgPSBNb2RpZmllci50b1N0cmluZyhtb2RpZmllcnMpOwotCi0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIG91dC5wcmludGxuKCIgKiBBdXRvLWdlbmVyYXRlZCB0YWcgY2xhc3MuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotCi0gICAgLy8gVE9ETzogdXNlIGNhbm9uaWNhbCBvcmRlcmluZwotICAgIGNsYXNzU3RhcnQgPSBjbGFzc1N0YXJ0LnJlcGxhY2VBbGwoInB1YmxpYyBhYnN0cmFjdCIsICJhYnN0cmFjdCBwdWJsaWMiKTsKLSAgICBvdXQucHJpbnRsbihjbGFzc1N0YXJ0ICsgIiBjbGFzcyAiICsgY2xhc3NOYW1lICsKLSAgICAgICAgIiBleHRlbmRzICIgKyBzdXBlcmNsYXNzTmFtZSk7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ29uc3RydWN0b3IoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbW9kaWZpZXJzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmdWxsQ2xhc3NOYW1lID0gY29tcG9uZW50LmdldFRhZ0NsYXNzKCk7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGZ1bGxDbGFzc05hbWUpOwotICAgIG91dC5wcmludGxuKCk7Ci0gICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgIC8vIFRPRE86IHJlc3RvcmUgdGhpcyBjb3JyZWN0bHkgcGhyYXNlZCBjb21tZW50ICh0ZW5zZSB2cy4gY29tbWFuZCkKLSAgICAvL291dC5wcmludGxuKCIgKiBDb25zdHJ1Y3RzIGFuIGluc3RhbmNlIG9mICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgIG91dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgIG91dC5wcmludGxuKCIgKi8iKTsKLSAgICBvdXQucHJpbnRsbigicHVibGljICIgKyBjbGFzc05hbWUgKyAiKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUdldENvbXBvbmVudFR5cGUoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGNvbXBvbmVudFR5cGUgPSBjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpOwotICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICAvLyBUaGUgc3VwZXJjbGFzcyBkb2VzIG5vdCBuZWNlc3NhcmlseSBuZWVkIHRvIGhhdmUgdGhpcyBtZXRob2QKLSAgICAvL291dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICBvdXQucHJpbnRsbigicHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigicmV0dXJuIFwiIiArIGNvbXBvbmVudFR5cGUgKyAiXCI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlR2V0UmVuZGVyZXJUeXBlKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyByZW5kZXJlclR5cGUgPSBjb21wb25lbnQuZ2V0UmVuZGVyZXJUeXBlKCk7Ci0gICAgb3V0LnByaW50bG4oKTsKLQotICAgIC8vIFRoZSBzdXBlcmNsYXNzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG5lZWQgdG8gaGF2ZSB0aGlzIG1ldGhvZAotICAgIC8vb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIG91dC5wcmludGxuKCJwdWJsaWMgU3RyaW5nIGdldFJlbmRlcmVyVHlwZSgpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInJldHVybiAiICsgVXRpbC5jb252ZXJ0U3RyaW5nVG9MaXRlcmFsKHJlbmRlcmVyVHlwZSkgKyAiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUNsYXNzRW5kKFByZXR0eVdyaXRlciBvdXQpCi0gIHsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eU1lbWJlcnMoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0KLSAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICB3cml0ZVByb3BlcnR5RGVjbGFyYXRpb24ob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICB3cml0ZVByb3BlcnR5U2V0dGVyKG91dCwgcHJvcGVydHkpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVQcm9wZXJ0eU1lbWJlcnMoUHJldHR5V3JpdGVyIG91dCwgQ29sbGVjdGlvbiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICB3cml0ZVByb3BlcnR5TWVtYmVycyhvdXQsIChDb21wb25lbnRCZWFuKSBsSXRlcmF0b3IubmV4dCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVJlbGVhc2VNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIENvbGxlY3Rpb24gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICB3cml0ZVJlbGVhc2VNZXRob2Qob3V0LCBjb21wb25lbnRzKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgd3JpdGVSZWxlYXNlTWV0aG9kKAotICAgIFByZXR0eVdyaXRlciBvdXQsIENvbGxlY3Rpb24gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDb2xsZWN0aW9uIGFsbCA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgYm9vbGVhbiBzcGVjaWFsID0gZmFsc2U7Ci0gICAgZm9yIChJdGVyYXRvciBsSXRlcmF0b3IgPSBjb21wb25lbnRzLml0ZXJhdG9yKCk7IGxJdGVyYXRvci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gKENvbXBvbmVudEJlYW4pIGxJdGVyYXRvci5uZXh0KCk7Ci0gICAgICBJdGVyYXRvciBwcm9wID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICAgIC8vIFRPRE86IHJlbW92ZSBzcGVjaWFsIGNhc2UgZm9yIFVJWEZvcm1UYWcKLSAgICAgIHNwZWNpYWwgfD0gIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi5VSVhGb3JtVGFnIi5lcXVhbHMoY29tcG9uZW50LmdldFRhZ0NsYXNzKCkpOwotICAgICAgd2hpbGUgKHByb3AuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBhbGwuYWRkKHByb3AubmV4dCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWxsLml0ZXJhdG9yKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpIHx8IHNwZWNpYWwpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIGlmIChpczEyKCkpewotICAgICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgdm9pZCByZWxlYXNlKCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigic3VwZXIucmVsZWFzZSgpOyIpOwotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgICAgIG91dC5wcmludChwcm9wVmFyICsgIiA9ICIpOwotICAgICAgICBTdHJpbmcgdHlwZSA9IEdlbmVyYXRvckhlbHBlci5nZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHksIGlzMTIoKSk7Ci0gICAgICAgIC8vIEZJWE1FOiBzdXBwb3J0IGFsbCBwcmltaXRpdmUgdHlwZXMuICBJbiBwcmFjdGljZSwgdGhlIG9ubHkgdHlwZXMKLSAgICAgICAgLy8gdGhhdCBoYXZlIGNvbWUgdXAgYXJlIFZhbHVlRXhwcmVzc2lvbiwgU3RyaW5nLCBhbmQgYm9vbGVhbgotICAgICAgICBpZiAoImJvb2xlYW4iLmVxdWFscyh0eXBlKSkKLSAgICAgICAgICBvdXQucHJpbnRsbigiZmFsc2U7Iik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBvdXQucHJpbnRsbigibnVsbDsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRTcGVjaWZpY0ltcG9ydHMoCi0gICAgICBTZXQgaW1wb3J0cywKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgLy8gbm90aGluZyBieSBkZWZhdWx0Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBtZXRob2QgaXMgYmVpbmcgdXNlZCBmb3IgZ2VuZXJhdGluZyBKU0YgMS4yIGNvZGUuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpczEyKCk7Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVByb3BlcnR5U2V0dGVyKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgd3JpdGVTZXRQcm9wZXJ0eU1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzQzNmY5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkFic3RyYWN0VGFnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5TdHJpbmdXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0VGFnR2VuZXJhdG9yIHsKLSAgcHJvdGVjdGVkIEFic3RyYWN0Q29udmVydGVyVGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICBzdXBlcihpczEyLCBsaWNlbnNlSGVhZGVyLCBsb2cpOwotICB9Ci0KLSAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlcigKLSAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlciwgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkpCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5kZWJ1ZygiR2VuZXJhdGluZyAiICsgY29udmVydGVyLmdldFRhZ0NsYXNzKCkpOwotCi0gICAgICBTdHJpbmdXcml0ZXIgc3cgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICBQcmV0dHlXcml0ZXIgb3V0ID0gbmV3IFByZXR0eVdyaXRlcihzdyk7Ci0KLSAgICAgIFNldCBpbXBvcnRzID0gY3JlYXRlSW1wb3J0cyhjb252ZXJ0ZXIpOwotICAgICAgd3JpdGVIZWFkZXIob3V0LCBjb252ZXJ0ZXIsIGltcG9ydHMpOwotCi0gICAgICB3cml0ZUNsYXNzKG91dCwgY29udmVydGVyKTsKLQotICAgICAgd3JpdGVDb25zdHJ1Y3RvcihvdXQsIGNvbnZlcnRlcik7Ci0KLSAgICAgIHdyaXRlUHJvcGVydHlNZXRob2RzKG91dCwgY29udmVydGVyKTsKLSAgICAgIHdyaXRlRG9TdGFydFRhZyhvdXQsIGNvbnZlcnRlcik7Ci0gICAgICB3cml0ZUNyZWF0ZUNvbnZlcnRlcihvdXQsIGNvbnZlcnRlcik7Ci0gICAgICB3cml0ZVNldFByb3BlcnRpZXMob3V0LCBjb252ZXJ0ZXIpOwotICAgICAgd3JpdGVSZWxlYXNlKG91dCwgY29udmVydGVyKTsKLQotICAgICAgd3JpdGVFbmQob3V0KTsKLSAgICAgIC8vIGRlbGF5IHdyaXRlIGluIGNhc2Ugb2YgZXJyb3IKLSAgICAgIC8vIHRpbWVzdGFtcCBzaG91bGQgbm90IGJlIHVwZGF0ZWQgd2hlbiBhbiBlcnJvciBvY2N1cnMKLSAgICAgIC8vIGRlbGV0ZSB0YXJnZXQgZmlsZSBmaXJzdCwgYmVjYXVzZSBpdCBpcyByZWFkb25seQotICAgICAgRmlsZSB0YXJnZXRGaWxlID0gY3JlYXRlRmlsZShnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIGNvbnZlcnRlci5nZXRUYWdDbGFzcygpKTsKLSAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICBGaWxlV3JpdGVyIGZ3ID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICBTdHJpbmdCdWZmZXIgYnVmID0gc3cuZ2V0QnVmZmVyKCk7Ci0gICAgICBmdy53cml0ZShidWYudG9TdHJpbmcoKSk7Ci0gICAgICBmdy5jbG9zZSgpOwotICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgIH0KLSAgICBjYXRjaCAoVGhyb3dhYmxlIGUpCi0gICAgewotICAgICAgZ2V0TG9nKCkuZXJyb3IoIkVycm9yIGdlbmVyYXRpbmcgIiArIGNvbnZlcnRlci5nZXRUYWdDbGFzcygpLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgU2V0IGNyZWF0ZUltcG9ydHMoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpOwotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVNldFByb3BlcnR5KFByZXR0eVdyaXRlciBvdXQsIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSk7Ci0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzKAotICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgIENvbnZlcnRlckJlYW4gY29udmVydGVyKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb252ZXJ0ZXIucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29udmVydGVyRnVsbENsYXNzID0gY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7Ci0gICAgICBTdHJpbmcgY29udmVydGVyQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhjb252ZXJ0ZXJGdWxsQ2xhc3MpOwotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIG91dC5wcmludGxuKCJwcml2YXRlIHZvaWQgX3NldFByb3BlcnRpZXMoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbihjb252ZXJ0ZXJDbGFzcyArICIgY29udmVydGVyKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgIHdyaXRlU2V0UHJvcGVydHkob3V0LCBwcm9wZXJ0eSk7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDcmVhdGVDb252ZXJ0ZXIoCi0gICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGNvbnZlcnRlci5wcm9wZXJ0aWVzKCk7Ci0gICAgcHJvcGVydGllcyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKHByb3BlcnRpZXMsIG5ldyBUYWdBdHRyaWJ1dGVGaWx0ZXIoKSk7Ci0gICAgaWYgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBjb252ZXJ0ZXJGdWxsQ2xhc3MgPSBjb252ZXJ0ZXIuZ2V0Q29udmVydGVyQ2xhc3MoKTsKLSAgICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGNvbnZlcnRlckZ1bGxDbGFzcyk7Ci0KLSAgICAgIG91dC5wcmludGxuKCk7Ci0gICAgICAvLyBUT0RPOiByZXN0b3JlIGNvZGluZyBzdGFuZGFyZHMsIGFuZCBtYWtlIGZpbmFsCi0gICAgICBpZiAoaXMxMigpKSB7Ci0gICAgICAgIG91dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgIH0KLSAgICAgIG91dC5wcmludGxuKCJwcm90ZWN0ZWQgQ29udmVydGVyIGNyZWF0ZUNvbnZlcnRlcigpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBpZiAoaXMxMigpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiU3RyaW5nIGNvbnZlcnRlcklkID0gIiArIGNvbnZlcnRlckNsYXNzICsgICIuQ09OVkVSVEVSX0lEOyIpOwotICAgICAgICBvdXQucHJpbnRsbigiQXBwbGljYXRpb24gYXBwbCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRBcHBsaWNhdGlvbigpOyIpOwotICAgICAgICBvdXQucHJpbnRsbihjb252ZXJ0ZXJDbGFzcyArICIgY29udmVydGVyID0gIiArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIGNvbnZlcnRlckNsYXNzICsgIilhcHBsLmNyZWF0ZUNvbnZlcnRlcihjb252ZXJ0ZXJJZCk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKGNvbnZlcnRlckNsYXNzICsgIiBjb252ZXJ0ZXIgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgY29udmVydGVyQ2xhc3MgKyAiKXN1cGVyLmNyZWF0ZUNvbnZlcnRlcigpOyIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIl9zZXRQcm9wZXJ0aWVzKGNvbnZlcnRlcik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigicmV0dXJuIGNvbnZlcnRlcjsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlRG9TdGFydFRhZygKLSAgICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICAgQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgIGlmICghaXMxMigpKQotICAgICAgewotICAgICAgICBTdHJpbmcgY29udmVydGVyRnVsbENsYXNzID0gY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCk7Ci0gICAgICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKGNvbnZlcnRlckZ1bGxDbGFzcyk7Ci0KLSAgICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgICAgLy8gVE9ETzogcmVzdG9yZSBjb2Rpbmcgc3RhbmRhcmRzLCBhbmQgbWFrZSBmaW5hbAotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgaW50IGRvU3RhcnRUYWcoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oInN1cGVyLnNldENvbnZlcnRlcklkKCIgKyBjb252ZXJ0ZXJDbGFzcyArICIuQ09OVkVSVEVSX0lEKTsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInJldHVybiBzdXBlci5kb1N0YXJ0VGFnKCk7Iik7Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotCi0gIHByaXZhdGUgdm9pZCB3cml0ZUNsYXNzKFByZXR0eVdyaXRlciBvdXQsIEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZykgewotICAgIFN0cmluZyBjbGFzc05hbWUgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhhYnN0cmFjdFRhZy5nZXRUYWdDbGFzcygpKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAiIGV4dGVuZHMgQ29udmVydGVyRUxUYWciKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJwdWJsaWMgY2xhc3MgIiArIGNsYXNzTmFtZSArCi0gICAgICAgICAgICAgICAgICAiIGV4dGVuZHMgQ29udmVydGVyVGFnIik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDRmZTJiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0Fic3RyYWN0VGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5HZW5lcmF0b3JIZWxwZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5BYnN0cmFjdFRhZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VGFnR2VuZXJhdG9yIHsKLSAgcHJvdGVjdGVkIExvZyBfbG9nOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBfaXMxMjsKLSAgcHJvdGVjdGVkIFN0cmluZyBfbGljZW5zZUhlYWRlcjsKLSAgc3RhdGljIGZpbmFsIHByaXZhdGUgU3RyaW5nIF9BVVRPX0dFTkVSQVRFX1dBUk5JTkcgPQotIi8vIFdBUk5JTkc6IFRoaXMgZmlsZSB3YXMgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIERvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LFxuIisKLSIvLyAgICAgICAgICBvciB5b3Ugd2lsbCBsb3NlIHlvdXIgY2hhbmdlcy5cblxuIjsKLQotICBwdWJsaWMgQWJzdHJhY3RUYWdHZW5lcmF0b3IoYm9vbGVhbiBpczEyLCBTdHJpbmcgbGljZW5zZUhlYWRlciwgTG9nIGxvZykgewotICAgIHRoaXMuX2xvZyA9IGxvZzsKLSAgICB0aGlzLl9saWNlbnNlSGVhZGVyID0gbGljZW5zZUhlYWRlcjsKLSAgICB0aGlzLl9pczEyID0gaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJlYW1ibGUoCi0gICAgUHJldHR5V3JpdGVyIG91dCkKLSAgewotICAgIG91dC53cml0ZShfQVVUT19HRU5FUkFURV9XQVJOSU5HKTsKLSAgICBvdXQud3JpdGUoX2xpY2Vuc2VIZWFkZXIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIExvZyBnZXRMb2coKSB7Ci0gICAgcmV0dXJuIF9sb2c7Ci0gIH0KLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBpczEyKCkgewotICAgIHJldHVybiBfaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCBGaWxlIGNyZWF0ZUZpbGUoRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnksIFN0cmluZyBmdWxsQ2xhc3NOYW1lKSB7Ci0gICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyBmdWxsQ2xhc3NOYW1lKTsKLSAgICAgU3RyaW5nIHNvdXJjZVBhdGggPSBVdGlsLmNvbnZlcnRDbGFzc1RvU291cmNlUGF0aChmdWxsQ2xhc3NOYW1lLCAiLmphdmEiKTsKLSAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUoZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5LCBzb3VyY2VQYXRoKTsKLQotICAgICB0YXJnZXRGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgcmV0dXJuIHRhcmdldEZpbGU7Ci0gICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDb25zdHJ1Y3RvcigKLSAgICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgICAgQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgICB7Ci0gICAgICBTdHJpbmcgZnVsbENsYXNzTmFtZSA9IGFic3RyYWN0VGFnLmdldFRhZ0NsYXNzKCk7Ci0gICAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoZnVsbENsYXNzTmFtZSk7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIi8qKiIpOwotICAgICAgLy8gVE9ETzogcmVzdG9yZSB0aGlzIGNvcnJlY3RseSBwaHJhc2VkIGNvbW1lbnQgKHRlbnNlIHZzLiBjb21tYW5kKQotICAgICAgLy9vdXQucHJpbnRsbigiICogQ29uc3RydWN0cyBhbiBpbnN0YW5jZSBvZiAiICsgY2xhc3NOYW1lICsgIi4iKTsKLSAgICAgIG91dC5wcmludGxuKCIgKiBDb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhlICIgKyBjbGFzc05hbWUgKyAiLiIpOwotICAgICAgb3V0LnByaW50bG4oIiAqLyIpOwotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyAiICsgY2xhc3NOYW1lICsgIigpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eU1ldGhvZHMoCi0gICAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICAgIEFic3RyYWN0VGFnQmVhbiBhYnN0cmFjdFRhZykgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFic3RyYWN0VGFnLnByb3BlcnRpZXMoKTsKLSAgICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgewotICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICB3cml0ZVByb3BlcnR5TWVtYmVyKG91dCwgcHJvcGVydHkpOwotICAgICAgICB3cml0ZVByb3BlcnR5U2V0KG91dCwgcHJvcGVydHkpOwotICAgICAgfQotICAgIH0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGVQcm9wZXJ0eU1lbWJlcigKLSAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgUHJvcGVydHlCZWFuICBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5KTsKLQotICAgIG91dC5wcmludGxuKCJwcml2YXRlICIgKyBqc3BQcm9wVHlwZSArICIgIiArIHByb3BWYXIgKyAiOyIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlUHJvcGVydHlTZXQoCi0gICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgIFByb3BlcnR5QmVhbiAgcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5KTsKLQotICAgIC8vIFRPRE86IHJlc3RvcmUgY29kaW5nIHN0YW5kYXJkcywgYW5kIG1ha2UgZmluYWwKLSAgICBvdXQucHJpbnRsbigicHVibGljIHZvaWQgIiArIHNldE1ldGhvZCArICIoIiArIGpzcFByb3BUeXBlICsgIiAiICsgcHJvcFZhciArICIpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIl8iICsgcHJvcFZhciArICIgPSAiICsgcHJvcFZhciArICI7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUmVsZWFzZSgKLSAgICBQcmV0dHlXcml0ZXIgIG91dCwKLSAgICBBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWcpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IGFic3RyYWN0VGFnLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICBpZiAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgIGlmIChpczEyKCkpIHsKLSAgICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkIHJlbGVhc2UoKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJzdXBlci5yZWxlYXNlKCk7Iik7Ci0gICAgICB3aGlsZSAocHJvcGVydGllcy5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pcHJvcGVydGllcy5uZXh0KCk7Ci0gICAgICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgICAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKHByb3BWYXIgKyAiID0gbnVsbDsiKTsKLSAgICAgIH0KLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBnZXRKc3BQcm9wZXJ0eVR5cGUoUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgcmV0dXJuICJNZXRob2RFeHByZXNzaW9uIjsKLQotICAgIGlmIChpczEyKCkgJiYgcHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgICByZXR1cm4gIk1ldGhvZEV4cHJlc3Npb24iOwotCi0gICAgaWYgKGlzMTIoKSAmJiAhcHJvcGVydHkuaXNMaXRlcmFsT25seSgpKQotICAgICAgcmV0dXJuICJWYWx1ZUV4cHJlc3Npb24iOwotICAgIHJldHVybiAiU3RyaW5nIjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlRW5kKFByZXR0eVdyaXRlciBvdXQpIHsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUltcG9ydHMoCi0gICAgUHJldHR5V3JpdGVyICAgb3V0LAotICAgIEFic3RyYWN0VGFnQmVhbiAgYWJzdHJhY3RUYWdCZWFuLCBTZXQgaW1wb3J0cykKLSAgewotCi0gICAgLy8gZG8gbm90IGltcG9ydCBpbXBsaWNpdCEKLSAgICBpbXBvcnRzLnJlbW92ZUFsbChVdGlsLlBSSU1JVElWRV9UWVBFUyk7Ci0KLSAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGFic3RyYWN0VGFnQmVhbi5nZXRUYWdDbGFzcygpKTsKLSAgICBHZW5lcmF0b3JIZWxwZXIud3JpdGVJbXBvcnRzKG91dCwgcGFja2FnZU5hbWUsIGltcG9ydHMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVIZWFkZXIoUHJldHR5V3JpdGVyIG91dCwgQWJzdHJhY3RUYWdCZWFuIGNvbnZlcnRlciwgU2V0IGltcG9ydHMpIHsKLSAgICBTdHJpbmcgcGFja2FnZU5hbWUgPSBVdGlsLmdldFBhY2thZ2VGcm9tRnVsbENsYXNzKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpKTsKLSAgICAvLyBoZWFkZXIvY29weXJpZ2h0Ci0gICAgd3JpdGVQcmVhbWJsZShvdXQpOwotCi0gICAgLy8gcGFja2FnZQotICAgIG91dC5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIHdyaXRlSW1wb3J0cyhvdXQsIGNvbnZlcnRlciwgaW1wb3J0cyk7Ci0KLSAgICBvdXQucHJpbnRsbigiLyoqIik7Ci0gICAgLy8gVE9ETzogcmVtb3ZlIHRoaXMgYmxhbmsgbGluZS4KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCIgKiBBdXRvLWdlbmVyYXRlZCB0YWcgY2xhc3MuIik7Ci0gICAgb3V0LnByaW50bG4oIiAqLyIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkSW1wb3J0c0Zyb21Qcm9wZXJ0ZXMoQWJzdHJhY3RUYWdCZWFuIGFic3RyYWN0VGFnQmVhbiwgU2V0IGltcG9ydHMpIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gYWJzdHJhY3RUYWdCZWFuLnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKXByb3BlcnRpZXMubmV4dCgpOwotCi0gICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICAgIGlmIChwcm9wZXJ0eUNsYXNzICE9IG51bGwpCi0gICAgICAgIGltcG9ydHMuYWRkKHByb3BlcnR5Q2xhc3MpOwotCi0gICAgICBpZiAoImphdmEubGFuZy5TdHJpbmdbXSIuZXF1YWxzKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YS50ZXh0LlBhcnNlRXhjZXB0aW9uIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlRGF0ZVR5cGUoU3RyaW5nIGNsYXNzTmFtZSwgYm9vbGVhbiB1c2VNYXhUaW1lKQotICB7Ci0gICAgU3RyaW5nIHR5cGUgPSAoU3RyaW5nKV9SRVNPTFZBQkxFX1RZUEVTLmdldChjbGFzc05hbWUpOwotICAgIHJldHVybiB1c2VNYXhUaW1lID8gdHlwZSArICJXaXRoTWF4VGltZSIgOiB0eXBlOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyByZXNvbHZlVHlwZShTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgcmV0dXJuIChTdHJpbmcpX1JFU09MVkFCTEVfVFlQRVMuZ2V0KGNsYXNzTmFtZSk7Ci0gIH0KLQotICAvLyBUT0RPOiBmb3IgZXZlcnl0aGluZyBidXQgTG9jYWxlLCBTdHJpbmdbXSwgRGF0ZSwgYW5kIFRpbWVab25lLAotICAvLyBpbiBKU0YgMS4yIHdlIHNob3VsZCBhbHJlYWR5IGJlIGdvaW5nIHRocm91Z2ggY29lcmNpb24sIGFuZAotICAvLyBub3QgbmVlZCBhbnkgb2YgdGhlICJUYWdVdGlscyIgZnVuY3Rpb25zCi0gIHByaXZhdGUgTWFwIF9jcmVhdGVSZXNvbHZhYmxlVHlwZXMoKQotICB7Ci0gICAgTWFwIHJlc29sdmFibGVUeXBlcyA9IG5ldyBIYXNoTWFwKCk7Ci0KLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJib29sZWFuIiwgIkJvb2xlYW4iKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJjaGFyIiwgIkNoYXJhY3RlciIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5EYXRlIiwgIkRhdGUiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJpbnQiLCAiSW50ZWdlciIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImZsb2F0IiwgIkZsb2F0Iik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiZG91YmxlIiwgIkRvdWJsZSIpOwotICAgIHJlc29sdmFibGVUeXBlcy5wdXQoImphdmEudXRpbC5Mb2NhbGUiLCAiTG9jYWxlIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgibG9uZyIsICJMb25nIik7Ci0gICAgcmVzb2x2YWJsZVR5cGVzLnB1dCgiamF2YS5sYW5nLlN0cmluZyIsICJTdHJpbmciKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLmxhbmcuU3RyaW5nW10iLCAiU3RyaW5nQXJyYXkiKTsKLSAgICByZXNvbHZhYmxlVHlwZXMucHV0KCJqYXZhLnV0aWwuVGltZVpvbmUiLCAiVGltZVpvbmUiKTsKLQotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzb2x2YWJsZVR5cGVzKTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgTWFwIF9SRVNPTFZBQkxFX1RZUEVTID0gX2NyZWF0ZVJlc29sdmFibGVUeXBlcygpOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMwYmM1My4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9BYnN0cmFjdFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5BYnN0cmFjdFRhZ0JlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uU3RyaW5nV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdFRhZ0dlbmVyYXRvciB7Ci0KLSAgcHVibGljIEFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICBzdXBlcihpczEyLCBsaWNlbnNlSGVhZGVyLCBsb2cpOwotICB9Ci0KLSAgIHB1YmxpYyB2b2lkIGdlbmVyYXRlVGFnSGFuZGxlcigKLSAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvciwgRmlsZSBnZW5lcmF0ZWRTb3VyY2VEaXJlY3RvcnkpCi0gIHsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIGdldExvZygpLmRlYnVnKCJHZW5lcmF0aW5nICIgKyB2YWxpZGF0b3IuZ2V0VGFnQ2xhc3MoKSk7Ci0KLSAgICAgIFN0cmluZ1dyaXRlciBzdyA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgIFByZXR0eVdyaXRlciBvdXQgPSBuZXcgUHJldHR5V3JpdGVyKHN3KTsKLSAgICAgIFNldCBpbXBvcnRzID0gY3JlYXRlSW1wb3J0cyh2YWxpZGF0b3IpOwotICAgICAgd3JpdGVIZWFkZXIob3V0LCB2YWxpZGF0b3IsIGltcG9ydHMpOwotCi0gICAgICB3cml0ZUNsYXNzKG91dCwgdmFsaWRhdG9yKTsKLQotICAgICAgd3JpdGVDb25zdHJ1Y3RvcihvdXQsIHZhbGlkYXRvcik7Ci0KLSAgICAgIHdyaXRlUHJvcGVydHlNZXRob2RzKG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIHdyaXRlRG9TdGFydFRhZyhvdXQsIHZhbGlkYXRvcik7Ci0gICAgICB3cml0ZUNyZWF0ZVZhbGlkYXRvcihvdXQsIHZhbGlkYXRvcik7Ci0gICAgICB3cml0ZVNldFByb3BlcnRpZXMob3V0LCB2YWxpZGF0b3IpOwotICAgICAgd3JpdGVSZWxlYXNlKG91dCwgdmFsaWRhdG9yKTsKLQotICAgICAgd3JpdGVFbmQob3V0KTsKLQotICAgICAgLy8gZGVsYXkgd3JpdGUgaW4gY2FzZSBvZiBlcnJvcgotICAgICAgLy8gdGltZXN0YW1wIHNob3VsZCBub3QgYmUgdXBkYXRlZCB3aGVuIGFuIGVycm9yIG9jY3VycwotICAgICAgLy8gZGVsZXRlIHRhcmdldCBmaWxlIGZpcnN0LCBiZWNhdXNlIGl0IGlzIHJlYWRvbmx5Ci0gICAgICBGaWxlIHRhcmdldEZpbGUgPSBjcmVhdGVGaWxlKGdlbmVyYXRlZFNvdXJjZURpcmVjdG9yeSwgdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCkpOwotICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgIEZpbGVXcml0ZXIgZncgPSBuZXcgRmlsZVdyaXRlcih0YXJnZXRGaWxlKTsKLSAgICAgIFN0cmluZ0J1ZmZlciBidWYgPSBzdy5nZXRCdWZmZXIoKTsKLSAgICAgIGZ3LndyaXRlKGJ1Zi50b1N0cmluZygpKTsKLSAgICAgIGZ3LmNsb3NlKCk7Ci0gICAgICB0YXJnZXRGaWxlLnNldFJlYWRPbmx5KCk7Ci0gICAgfQotICAgIGNhdGNoIChUaHJvd2FibGUgZSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5lcnJvcigiRXJyb3IgZ2VuZXJhdGluZyAiICsgdmFsaWRhdG9yLmdldFRhZ0NsYXNzKCksIGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBTZXQgY3JlYXRlSW1wb3J0cyhWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcik7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVDbGFzcyhQcmV0dHlXcml0ZXIgb3V0LCBBYnN0cmFjdFRhZ0JlYW4gYWJzdHJhY3RUYWcpIHsKLSAgICBTdHJpbmcgY2xhc3NOYW1lID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3MoYWJzdHJhY3RUYWcuZ2V0VGFnQ2xhc3MoKSk7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgIiBleHRlbmRzIFZhbGlkYXRvckVMVGFnIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgIiBleHRlbmRzIFZhbGlkYXRvclRhZyIpOwotICAgIH0KLQotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRG9TdGFydFRhZygKLSAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgIHsKLSAgICAgb3V0LnByaW50bG4oKTsKLSAgICAgaWYgKCFpczEyKCkpCi0gICAgIHsKLSAgICAgICBTdHJpbmcgdmFsaWRhdG9yRnVsbENsYXNzID0gdmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzKCk7Ci0gICAgICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzID0gVXRpbC5nZXRDbGFzc0Zyb21GdWxsQ2xhc3ModmFsaWRhdG9yRnVsbENsYXNzKTsKLQotICAgICAgIC8vIFRPRE86IHJlc3RvcmUgY29kaW5nIHN0YW5kYXJkcywgYW5kIG1ha2UgZmluYWwKLSAgICAgICAvL291dC5wcmludGxuKCJAT3ZlcnJpZGUiKTsKLSAgICAgICBvdXQucHJpbnRsbigicHVibGljIGludCBkb1N0YXJ0VGFnKCkgdGhyb3dzIEpzcEV4Y2VwdGlvbiIpOwotICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgb3V0LmluZGVudCgpOwotICAgICAgIG91dC5wcmludGxuKCJzdXBlci5zZXRWYWxpZGF0b3JJZCgiICsgdmFsaWRhdG9yQ2xhc3MgKyAiLlZBTElEQVRPUl9JRCk7Iik7Ci0gICAgICAgb3V0LnByaW50bG4oInJldHVybiBzdXBlci5kb1N0YXJ0VGFnKCk7Iik7Ci0gICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgfQotICAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlQ3JlYXRlVmFsaWRhdG9yKAotICAgIFByZXR0eVdyaXRlciAgb3V0LAotICAgIFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSB2YWxpZGF0b3IucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yRnVsbENsYXNzID0gdmFsaWRhdG9yLmdldFZhbGlkYXRvckNsYXNzKCk7Ci0gICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyh2YWxpZGF0b3JGdWxsQ2xhc3MpOwotCi0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgLy8gVE9ETzogcmVzdG9yZSBjb2Rpbmcgc3RhbmRhcmRzLCBhbmQgbWFrZSBmaW5hbAotICAgICAgaWYgKGlzMTIoKSkgewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgICB9Ci0gICAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkIFZhbGlkYXRvciBjcmVhdGVWYWxpZGF0b3IoKSB0aHJvd3MgSnNwRXhjZXB0aW9uIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgaWYgKGlzMTIoKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIlN0cmluZyB2YWxpZGF0b3JJZCA9ICIgKyB2YWxpZGF0b3JDbGFzcyArICIuVkFMSURBVE9SX0lEOyIpOwotICAgICAgICBvdXQucHJpbnRsbigiQXBwbGljYXRpb24gYXBwbCA9IEZhY2VzQ29udGV4dC5nZXRDdXJyZW50SW5zdGFuY2UoKS5nZXRBcHBsaWNhdGlvbigpOyIpOwotICAgICAgICBvdXQucHJpbnRsbih2YWxpZGF0b3JDbGFzcyArICIgdmFsaWRhdG9yID0gIiArCi0gICAgICAgICAgICAgICAgICAgICIoIiArIHZhbGlkYXRvckNsYXNzICsgIilhcHBsLmNyZWF0ZVZhbGlkYXRvcih2YWxpZGF0b3JJZCk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKHZhbGlkYXRvckNsYXNzICsgIiB2YWxpZGF0b3IgPSAiICsKLSAgICAgICAgICAgICAgICAgICAgIigiICsgdmFsaWRhdG9yQ2xhc3MgKyAiKXN1cGVyLmNyZWF0ZVZhbGlkYXRvcigpOyIpOwotICAgICAgfQotICAgICAgb3V0LnByaW50bG4oIl9zZXRQcm9wZXJ0aWVzKHZhbGlkYXRvcik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigicmV0dXJuIHZhbGlkYXRvcjsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzKAotICAgICAgUHJldHR5V3JpdGVyICBvdXQsCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uCi0gICAgewotICAgICAgSXRlcmF0b3IgcHJvcGVydGllcyA9IHZhbGlkYXRvci5wcm9wZXJ0aWVzKCk7Ci0gICAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLSAgICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIHZhbGlkYXRvckZ1bGxDbGFzcyA9IHZhbGlkYXRvci5nZXRWYWxpZGF0b3JDbGFzcygpOwotICAgICAgICBTdHJpbmcgdmFsaWRhdG9yQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyh2YWxpZGF0b3JGdWxsQ2xhc3MpOwotICAgICAgICBvdXQucHJpbnRsbigpOwotICAgICAgICBvdXQucHJpbnRsbigicHJpdmF0ZSB2b2lkIF9zZXRQcm9wZXJ0aWVzKCIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKHZhbGlkYXRvckNsYXNzICsgIiB2YWxpZGF0b3IpIHRocm93cyBKc3BFeGNlcHRpb24iKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgICAgICB7Ci0gICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbilwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgICAgICB3cml0ZVNldFByb3BlcnR5KG91dCwgcHJvcGVydHkpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3Qgdm9pZCB3cml0ZVNldFByb3BlcnR5KAotICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpOwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9Db21wb25lbnRUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDZjNDcwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci5DbGFzc0dlbmVyYXRvcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEdlbmVyYXRlcyB0YWcgY2xhc3NlcwotICoKLSAqIEBhdXRob3IgQnJ1bm8gQXJhbmRhIChsYXRlc3QgbW9kaWZpY2F0aW9uIGJ5ICRBdXRob3IkKQotICogQHZlcnNpb24gJFJldmlzaW9uJCAkRGF0ZSQKLSAqLwotcHVibGljIGludGVyZmFjZSBDb21wb25lbnRUYWdHZW5lcmF0b3IgZXh0ZW5kcyBDbGFzc0dlbmVyYXRvcgotewotCi0gIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb24gY29tcG9uZW50cykgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHZvaWQgd3JpdGVSZWxlYXNlTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZVJlbGVhc2VNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgdm9pZCB3cml0ZUdldENvbXBvbmVudFR5cGUoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlR2V0UmVuZGVyZXJUeXBlKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUHJvcGVydHlNZW1iZXJzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICB2b2lkIHdyaXRlUHJvcGVydHlNZW1iZXJzKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29sbGVjdGlvbiBjb21wb25lbnRzKSB0aHJvd3MgSU9FeGNlcHRpb247Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0ZjFjZWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjM2ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IuR2VuZXJhdG9ySGVscGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLk1ldGhvZFNpZ25hdHVyZUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotCi0vKioKLSAqIENvbXBvbmVudCB0YWcgZ2VuZXJhdG9yIGZvciBteWZhY2VzCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0Q29tcG9uZW50VGFnR2VuZXJhdG9yCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBfaXMxMjsKLQotICBwdWJsaWMgTXlGYWNlc0NvbXBvbmVudFRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIpCi0gIHsKLSAgICBfaXMxMiA9IGlzMTI7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBib29sZWFuIGlzMTIoKQotICB7Ci0gICAgcmV0dXJuIF9pczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKFNldCBpbXBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29tcG9uZW50LlVJQ29tcG9uZW50Iik7Ci0gICAgaW1wb3J0cy5hZGQoY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dCIpOwotICAgIH0KLSAgICAgICAgCi0KLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gY29tcG9uZW50LnByb3BlcnRpZXMoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotCi0gICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpZiAoIV9pczEyKQotICAgICAgICB7Ci0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5jb252ZXJ0LkNvbnZlcnRlciIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5NZXRob2RFeHByZXNzaW9uIik7Ci0gICAgICAgICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FjdGlvbkxpc3RlbmVyKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmV2ZW50Lk1ldGhvZEV4cHJlc3Npb25BY3Rpb25MaXN0ZW5lciIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsdWVDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5ldmVudC5NZXRob2RFeHByZXNzaW9uVmFsdWVDaGFuZ2VMaXN0ZW5lciIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsaWRhdG9yKHByb3BlcnR5LCBfaXMxMikpCi0gICAgICAgICAgewotICAgICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLnZhbGlkYXRvci5NZXRob2RFeHByZXNzaW9uVmFsaWRhdG9yIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQWN0aW9uTGlzdGVuZXIocHJvcGVydHksIF9pczEyKSkKLSAgICAgIHsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmV2ZW50Lk1ldGhvZEV4cHJlc3Npb25BY3Rpb25MaXN0ZW5lciIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsdWVDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZXZlbnQuTWV0aG9kRXhwcmVzc2lvblZhbHVlQ2hhbmdlTGlzdGVuZXIiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMudmFsaWRhdG9yLk1ldGhvZEV4cHJlc3Npb25WYWxpZGF0b3IiKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlUHJvcGVydHlEZWNsYXJhdGlvbihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBmaWVsZFByb3BOYW1lID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBHZW5lcmF0b3JIZWxwZXIuZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5LCBfaXMxMik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJwcml2YXRlICIgKyBqc3BQcm9wVHlwZSArICIgIiArIGZpZWxkUHJvcE5hbWUgKyAiOyIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlcihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9IHByb3BlcnR5LmdldEZpZWxkUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGpzcFByb3BOYW1lID0gcHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSBVdGlsLmdldFZhcmlhYmxlRnJvbU5hbWUocHJvcE5hbWUpOwotICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBqc3BQcm9wTmFtZSk7Ci0gICAgU3RyaW5nIGpzcFByb3BUeXBlID0gR2VuZXJhdG9ySGVscGVyLmdldEpzcFByb3BlcnR5VHlwZShwcm9wZXJ0eSwgX2lzMTIpOwotCi0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBzZXRNZXRob2QgKyAiKCIgKyBqc3BQcm9wVHlwZSArICIgIiArIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKGZpZWxkUHJvcE5hbWUgKyAiID0gIiArIHByb3BWYXIgKyAiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZUdldENvbXBvbmVudFR5cGUoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBjb21wb25lbnRUeXBlID0gY29tcG9uZW50LmdldENvbXBvbmVudFR5cGUoKTsKLSAgICBpZigiamF2YXguZmFjZXMuSHRtbENvbHVtbiIuZXF1YWxzKGNvbXBvbmVudFR5cGUpKQotICAgIHsKLSAgICAgIGNvbXBvbmVudFR5cGUgPSAiamF2YXguZmFjZXMuQ29sdW1uIjsKLSAgICB9Ci0gICAgb3V0LnByaW50bG4oKTsKLQotICAgIC8vIFRoZSBzdXBlcmNsYXNzIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG5lZWQgdG8gaGF2ZSB0aGlzIG1ldGhvZAotICAgIGlmIChpczEyKCkpewotICAgICAgICBvdXQucHJpbnRsbigiQE92ZXJyaWRlIik7Ci0gICAgfQotICAgIG91dC5wcmludGxuKCJwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJyZXR1cm4gXCIiICsgY29tcG9uZW50VHlwZSArICJcIjsiKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBDb2xsZWN0aW9uIGNvbXBvbmVudHMgPSBuZXcgSGFzaFNldCgpOwotICAgIGNvbXBvbmVudHMuYWRkKGNvbXBvbmVudCk7Ci0gICAgd3JpdGVTZXRQcm9wZXJ0aWVzTWV0aG9kKG91dCwgY29tcG9uZW50Q2xhc3MsIGNvbXBvbmVudHMpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwgU3RyaW5nIGNvbXBvbmVudENsYXNzLCBDb2xsZWN0aW9uIGNvbXBvbmVudHMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCi0gICAgQ29sbGVjdGlvbiBhbGwgPSBuZXcgSGFzaFNldCgpOwotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKSBsSXRlcmF0b3IubmV4dCgpOwotICAgICAgSXRlcmF0b3IgcHJvcCA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgICB3aGlsZSAocHJvcC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGFsbC5hZGQocHJvcC5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhbGwuaXRlcmF0b3IoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgIH0KLSAgICBvdXQucHJpbnRsbigicHJvdGVjdGVkIHZvaWQgc2V0UHJvcGVydGllcyhVSUNvbXBvbmVudCBjb21wb25lbnQpIik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICB3cml0ZVNldFByb3BlcnR5TWV0aG9kQm9keShvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0aWVzKTsKLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eU1ldGhvZEJvZHkoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBwcm9wZXJ0aWVzKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCi0gICAgaWYoIkh0bWxDb2x1bW4iLmVxdWFscyhjb21wb25lbnRDbGFzcykpCi0gICAgewotICAgICAgICBjb21wb25lbnRDbGFzcyA9ICJVSUNvbHVtbiI7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oImlmICghKGNvbXBvbmVudCBpbnN0YW5jZW9mICIgKyBjb21wb25lbnRDbGFzcyArICIpKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludCgidGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiKTsKLSAgICBvdXQucHJpbnQoIlwiQ29tcG9uZW50IFwiICsgY29tcG9uZW50LmdldENsYXNzKCkuZ2V0TmFtZSgpICsgXCIgaXMgbm8gIiArIGNvbXBvbmVudENsYXNzICsgIlwiIik7Ci0gICAgb3V0LnByaW50bG4oIik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLQotICAgIG91dC5wcmludGxuKGNvbXBvbmVudENsYXNzICsgIiBjb21wID0gKCIgKyBjb21wb25lbnRDbGFzcyArICIpY29tcG9uZW50OyIpOwotCi0gICAgb3V0LnByaW50bG4oKTsKLSAgICBvdXQucHJpbnRsbigic3VwZXIuc2V0UHJvcGVydGllcyhjb21wb25lbnQpOyIpOwotICAgIG91dC5wcmludGxuKCk7Ci0KLSAgICBpZiAoIV9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJGYWNlc0NvbnRleHQgY29udGV4dCA9IGdldEZhY2VzQ29udGV4dCgpOyIpOwotICAgIH0KLQotICAgIHdoaWxlIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkgPSAoUHJvcGVydHlCZWFuKSBwcm9wZXJ0aWVzLm5leHQoKTsKLSAgICAgIF93cml0ZVNldFByb3BlcnRpZXNDYXNlKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0UHJvcGVydGllc0Nhc2UoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotCi0gICAgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgIHsKLSAgICAgIF93cml0ZVNldE1ldGhvZEJpbmRpbmcob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc01ldGhvZEV4cHJlc3Npb24oKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRNZXRob2RFeHByZXNzaW9uKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29udmVydGVyKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkpCi0gICAgewotICAgICAgX3dyaXRlU2V0Q29udmVydGVyKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF93cml0ZVNldFByb3BlcnR5KG91dCwgcHJvcGVydHkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotICAgIAotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpICIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICB7Ci0gICAgICBpZiAoX2lzMTIpewotICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICB9ZWxzZXsKLSAgICAgICAgICBTdHJpbmcgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKS50cmltKCk7Ci0gICAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3Muc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKXsKLSAgICAgICAgICAgICAgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5Q2xhc3MucmVwbGFjZSgiamF2YS5sYW5nLiIsICIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgCi0gICAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3MuZW5kc1dpdGgoImVnZXIiKSl7Ci0gICAgICAgICAgICAgIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eUNsYXNzLnJlcGxhY2UoImVnZXIiLCAiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIAotICAgICAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHlDbGFzcy50b0xvd2VyQ2FzZSgpKSl7Ci0gICAgICAgICAgICAgIG91dC5wcmludGxuKCJjb21wLmdldEF0dHJpYnV0ZXMoKS5wdXQoXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wZXJ0eUNsYXNzLnRvTG93ZXJDYXNlKCkpKyIudmFsdWVPZigiICsgcHJvcFZhciArICIpKTsiKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgfWVsc2V7ICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICAgIAotICAgIH0KLSAgICBlbHNlIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRWYWx1ZUJpbmRpbmcob3V0LCBwcm9wZXJ0eSwgcHJvcE5hbWUsIHByb3BWYXIpOwotICAgIH0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldFZhbHVlQmluZGluZygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHksCi0gICAgICBTdHJpbmcgcHJvcE5hbWUsCi0gICAgICBTdHJpbmcgcHJvcFZhcikKLSAgewotICAgIG91dC5wcmludGxuKCJpZiAoaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgb3V0LnByaW50bG4oImNvbXAuc2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BOYW1lICsgIlwiLCB2Yik7Iik7Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGlmICghaXMxMigpICYmICJ2YWx1ZSIuZXF1YWxzKHByb3BOYW1lKSkKLSAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJjb21wLnNldFZhbHVlKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MocHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpKSl7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgVXRpbC5nZXRCb3hlZENsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSkrIi52YWx1ZU9mKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIFN0cmluZyBwcm9wZXJ0eUNsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpLnRyaW0oKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eUNsYXNzLnN0YXJ0c1dpdGgoImphdmEubGFuZy4iKSl7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5Q2xhc3MucmVwbGFjZSgiamF2YS5sYW5nLiIsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKHByb3BlcnR5Q2xhc3MuZW5kc1dpdGgoImVnZXIiKSl7Ci0gICAgICAgICAgICAgICAgcHJvcGVydHlDbGFzcyA9IHByb3BlcnR5Q2xhc3MucmVwbGFjZSgiZWdlciIsICIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKFV0aWwuaXNQcmltaXRpdmVDbGFzcyhwcm9wZXJ0eUNsYXNzLnRvTG93ZXJDYXNlKCkpKXsKLSAgICAgICAgICAgICAgICBvdXQucHJpbnRsbigiY29tcC5nZXRBdHRyaWJ1dGVzKCkucHV0KFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFV0aWwuZ2V0Qm94ZWRDbGFzcyhwcm9wZXJ0eUNsYXNzLnRvTG93ZXJDYXNlKCkpKyIudmFsdWVPZigiICsgcHJvcFZhciArICIpKTsiKTsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICB9ZWxzZXsgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgb3V0LnByaW50bG4oImNvbXAuZ2V0QXR0cmlidXRlcygpLnB1dChcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0gICAgCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldE1ldGhvZEJpbmRpbmcoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIGlmIChfaXMxMikKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBY3Rpb25MaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiY29tcC5hZGRBY3Rpb25MaXN0ZW5lcihuZXcgTWV0aG9kRXhwcmVzc2lvbkFjdGlvbkxpc3RlbmVyKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzVmFsdWVDaGFuZ2VMaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiY29tcC5hZGRWYWx1ZUNoYW5nZUxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uVmFsdWVDaGFuZ2VMaXN0ZW5lcigiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc1ZhbGlkYXRvcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiY29tcC5hZGRWYWxpZGF0b3IobmV3IE1ldGhvZEV4cHJlc3Npb25WYWxpZGF0b3IoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgICAgICJuZXcgTWV0aG9kRXhwcmVzc2lvbk1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICB9Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZ25hdHVyZSA9IHByb3BlcnR5LmdldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoKTsKLSAgICAgIFN0cmluZ1tdIHBhcmFtVHlwZXMgPSAoc2lnbmF0dXJlICE9IG51bGwpID8gc2lnbmF0dXJlLmdldFBhcmFtZXRlclR5cGVzKCkgOiBudWxsOwotCi0gICAgICBTdHJpbmcgY2xhc3NBcnJheTsKLQotICAgICAgaWYgKHBhcmFtVHlwZXMgPT0gbnVsbCB8fCBwYXJhbVR5cGVzLmxlbmd0aCA9PSAwKQotICAgICAgewotICAgICAgICBjbGFzc0FycmF5ID0gIm5ldyBDbGFzc1swXSI7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgc2IuYXBwZW5kKCJuZXcgQ2xhc3NbXXsiKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJhbVR5cGVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0gICAgICAgICAgc2IuYXBwZW5kKHBhcmFtVHlwZXNbaV0pOwotICAgICAgICAgIHNiLmFwcGVuZCgiLmNsYXNzIik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPOiByZW1vdmUgdHJhaWxpbmcgY29tbWEKLSAgICAgICAgc2IuYXBwZW5kKCcsJyk7Ci0KLSAgICAgICAgc2IuYXBwZW5kKCd9Jyk7Ci0gICAgICAgIGNsYXNzQXJyYXkgPSBzYi50b1N0cmluZygpOwotICAgICAgfQotCi0gICAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLQotICAgICAgaWYgKGlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoc2lnbmF0dXJlKSB8fCBwcm9wZXJ0eS5nZXRKc3BQcm9wZXJ0eU5hbWUoKS5lcXVhbHMoImFjdGlvbiIpKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiTWV0aG9kQmluZGluZyBtYjsiKTsKLSAgICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIm1iID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZU1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiLCAiICsgY2xhc3NBcnJheSArICIpOyIpOwotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAKLSAgICAgICAgaWYgKCFpczEyKCkgJiYgcHJvcGVydHkuZ2V0SnNwUHJvcGVydHlOYW1lKCkuZXF1YWxzKCJhY3Rpb24iKSl7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigibWIgPSBuZXcgb3JnLmFwYWNoZS5teWZhY2VzLnNoYXJlZF90b21haGF3ay5lbC5TaW1wbGVBY3Rpb25NZXRob2RCaW5kaW5nKCIrcHJvcFZhcisiKTsiKTsKLSAgICAgICAgfWVsc2V7Ci0gICAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihcIkludmFsaWQgZXhwcmVzc2lvbiBcIiArICIrcHJvcFZhcisiKTsiKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgLy8gbmV2ZXIgYSBsaXRlcmFsLCBubyBuZWVkIGZvciBDb25zdGFudE1ldGhvZEJpbmRpbmcKLSAgICAgICAgb3V0LnByaW50bG4oIk1ldGhvZEJpbmRpbmcgbWIgPSBjb250ZXh0LmdldEFwcGxpY2F0aW9uKCkuY3JlYXRlTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIsICIgKwotICAgICAgICAgICAgY2xhc3NBcnJheSArICIpOyIpOwotICAgICAgfQotICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgIAotICAgICAgb3V0LnByaW50bG4oImNvbXAuIitzZXRNZXRob2QrIihtYik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldE1ldGhvZEV4cHJlc3Npb24oCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gcHJvcGVydHkuZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpICIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKEdlbmVyYXRvckhlbHBlci5pc0FjdGlvbihwcm9wZXJ0eSkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0QWN0aW9uRXhwcmVzc2lvbigiICsgcHJvcFZhciArICIpOyIpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBY3Rpb25MaXN0ZW5lcihwcm9wZXJ0eSwgX2lzMTIpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLmFkZEFjdGlvbkxpc3RlbmVyKG5ldyBNZXRob2RFeHByZXNzaW9uQWN0aW9uTGlzdGVuZXIoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC4iICsgVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpICsgIigiICsgcHJvcFZhciArICIpOyIpOwotICAgIH0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldEtleVN0cm9rZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIk9iamVjdCB2YWwgPSAiICsgcHJvcFZhciArICIuZ2V0VmFsdWUobnVsbCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHZhbCAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKHZhbC50b1N0cmluZygpKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0S2V5U3Ryb2tlLmdldEtleVN0cm9rZSgiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0Q29udmVydGVyKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wTmFtZSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHMgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmIChzICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotCi0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY3JlYXRlQ29udmVydGVyKHMpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY29tcC5zZXRDb252ZXJ0ZXIoY29udmVydGVyKTsiKTsKLQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImNvbXAuc2V0VmFsdWVCaW5kaW5nKFwiIiArcHJvcE5hbWUrICJcIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY3JlYXRlQ29udmVydGVyKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjb21wLnNldENvbnZlcnRlcihjb252ZXJ0ZXIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIGlzU3RyaW5nTWV0aG9kQmluZGluZ1JldHVyblR5cGUoCi0gICAgICBNZXRob2RTaWduYXR1cmVCZWFuIHNpZykKLSAgewotICAgIHJldHVybiAoc2lnICE9IG51bGwgJiYgImphdmEubGFuZy5TdHJpbmciLmVxdWFscyhzaWcuZ2V0UmV0dXJuVHlwZSgpKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvTXlGYWNlc0NvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMThkOTU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNDb252ZXJ0ZXJUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLmxvZ2dpbmcuTG9nOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuaW8uUHJldHR5V3JpdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLXB1YmxpYyBjbGFzcyBNeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgewotCi0gIHB1YmxpYyBNeUZhY2VzQ29udmVydGVyVGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICBzdXBlcihpczEyLCBsaWNlbnNlSGVhZGVyLCBsb2cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNldCBjcmVhdGVJbXBvcnRzKENvbnZlcnRlckJlYW4gY29udmVydGVyKSB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLkNvbnZlcnRlckVMVGFnIik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5Db252ZXJ0ZXJUYWciKTsKLSAgICB9Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIik7Ci0gICAgaW1wb3J0cy5hZGQoY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIik7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy51dGlsLlRhZ1V0aWxzIik7Ci0KLQotICAgIGFkZEltcG9ydHNGcm9tUHJvcGVydGVzKGNvbnZlcnRlciwgaW1wb3J0cyk7Ci0gICAgcmV0dXJuIGltcG9ydHM7Ci0gIH0KLQotCi0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5KAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIuZ2V0VmFsdWUobnVsbCkpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoVGFnVXRpbHMuaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBUYWdVdGlscy5nZXRWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuc2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BOYW1lICsgIlwiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL015RmFjZXNWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzNTUzMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9NeUZhY2VzVmFsaWRhdG9yVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlByb3BlcnR5QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvciBleHRlbmRzIEFic3RyYWN0VmFsaWRhdG9yVGFnR2VuZXJhdG9yIHsKLQotICBwdWJsaWMgTXlGYWNlc1ZhbGlkYXRvclRhZ0dlbmVyYXRvcihib29sZWFuIGlzMTIsIFN0cmluZyBsaWNlbnNlSGVhZGVyLCBMb2cgbG9nKSB7Ci0gICAgc3VwZXIoaXMxMiwgbGljZW5zZUhlYWRlciwgbG9nKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZXQgY3JlYXRlSW1wb3J0cyhWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5WYWxpZGF0b3JFTFRhZyIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuVmFsaWRhdG9yVGFnIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24iKTsKLSAgICBpbXBvcnRzLmFkZCh2YWxpZGF0b3IuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciIpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMuY29tbW9ucy51dGlsLlRhZ1V0aWxzIik7Ci0KLQotICAgIGFkZEltcG9ydHNGcm9tUHJvcGVydGVzKHZhbGlkYXRvciwgaW1wb3J0cyk7Ci0gICAgcmV0dXJuIGltcG9ydHM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNldFByb3BlcnR5KAotICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLnNldFZhbHVlRXhwcmVzc2lvbihcIiIgKyBwcm9wTmFtZSArICJcIiwgIiArCi0gICAgICAgICAgICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsKLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotCi0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIi5nZXRWYWx1ZShudWxsKSk7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3IuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChUYWdVdGlscy5pc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IFRhZ1V0aWxzLmdldFZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci5zZXRWYWx1ZUJpbmRpbmcoXCIiICsgcHJvcE5hbWUgKyAiXCIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC5wcmludGxuKHByb3BDbGFzcyArICIgdmFsdWUgPSBUYWdVdGlscy5nZXQiICsgcHJvcFR5cGUgKyAiKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICAgIFN0cmluZyBzZXRNZXRob2QgPSBVdGlsLmdldFByZWZpeGVkUHJvcGVydHlOYW1lKCJzZXQiLCBwcm9wTmFtZSk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3IuIiArIHNldE1ldGhvZCArICIodmFsdWUpOyIpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ0aHJvdyBuZXcgSnNwRXhjZXB0aW9uKCIpOwotICAgICAgICAgIG91dC5wcmludGxuKCIgIHBlLmdldE1lc3NhZ2UoKSArIFwiOiBcIiArIFwiUG9zaXRpb24gXCIgKyBwZS5nZXRFcnJvck9mZnNldCgpKTsiKTsKLSAgICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgfQotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RhZ0F0dHJpYnV0ZUZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVGFnQXR0cmlidXRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5MWMzODcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVGFnQXR0cmlidXRlRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Qcm9wZXJ0eUZpbHRlcjsKLQotLyoqCi0gKiBUT0RPOiBjb21tZW50IHRoaXMhCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1maW5hbCBwdWJsaWMgY2xhc3MgVGFnQXR0cmlidXRlRmlsdGVyIGV4dGVuZHMgUHJvcGVydHlGaWx0ZXIKLXsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgcmV0dXJuICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmN2FkYzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg5OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLnRhZ2xpYjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuZ2VuZXJhdG9yLkdlbmVyYXRvckhlbHBlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbXBvbmVudEJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5NZXRob2RTaWduYXR1cmVCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5GaWx0ZXJlZEl0ZXJhdG9yOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUT0RPOiBjb21tZW50IHRoaXMhCi0gKgotICogQGF1dGhvciBCcnVubyBBcmFuZGEgKGxhdGVzdCBtb2RpZmljYXRpb24gYnkgJEF1dGhvciQpCi0gKiBAdmVyc2lvbiAkUmV2aXNpb24kICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRDb21wb25lbnRUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbXBvbmVudFRhZ0dlbmVyYXRvcgotewotICBwcml2YXRlIGJvb2xlYW4gX2lzMTI7Ci0KLSAgcHVibGljIFRyaW5pZGFkQ29tcG9uZW50VGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMikKLSAgewotICAgIF9pczEyID0gaXMxMjsKLSAgfQotCi0gIHByb3RlY3RlZCBib29sZWFuIGlzMTIoKQotICB7Ci0gICAgcmV0dXJuIF9pczEyOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgYWRkU3BlY2lmaWNJbXBvcnRzKFNldCBpbXBvcnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gIHsKLSAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmJlYW4uRmFjZXNCZWFuIik7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgIH0KLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBjb21wb25lbnQucHJvcGVydGllcygpOwotICAgIHByb3BlcnRpZXMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihwcm9wZXJ0aWVzLCBuZXcgVGFnQXR0cmlidXRlRmlsdGVyKCkpOwotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICBTdHJpbmdbXSBwcm9wZXJ0eUNsYXNzUGFyYW1zID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKTsKLQotICAgICAgaW1wb3J0cy5hZGQoY29tcG9uZW50LmdldENvbXBvbmVudENsYXNzKCkpOwotCi0gICAgICBpZiAoR2VuZXJhdG9ySGVscGVyLmlzS2V5U3Ryb2tlKHByb3BlcnR5Q2xhc3MpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmVsLlZhbHVlRXhwcmVzc2lvbiIpOwotICAgICAgICBlbHNlCi0gICAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZyIpOwotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguc3dpbmcuS2V5U3Ryb2tlIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNBV1RLZXlTdHJva2UocHJvcGVydHlDbGFzcykpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaXMxMikKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgICAgIGltcG9ydHMuYWRkKCJqYXZhLmF3dC5BV1RLZXlTdHJva2UiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIik7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc1ZpcnR1YWwoKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi51dGlsLlZpcnR1YWxBdHRyaWJ1dGVVdGlscyIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29sb3JMaXN0KHByb3BlcnR5Q2xhc3MsIHByb3BlcnR5Q2xhc3NQYXJhbXMpIHx8Ci0gICAgICAgICAgICAgICBHZW5lcmF0b3JIZWxwZXIuaXNDb2xvcihwcm9wZXJ0eUNsYXNzKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pczEyKQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5lbC5WYWx1ZUV4cHJlc3Npb24iKTsKLSAgICAgICAgZWxzZQotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5WYWx1ZUJpbmRpbmciKTsKLSAgICAgICAgaW1wb3J0cy5hZGQoImphdmEudGV4dC5QYXJzZUV4Y2VwdGlvbiIpOwotICAgICAgICBpbXBvcnRzLmFkZCgib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLnV0aWwuVGFnVXRpbHMiKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kQmluZGluZygpKQotICAgICAgewotICAgICAgICBpZiAoX2lzMTIpCi0gICAgICAgIHsKLSAgICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpOwotICAgICAgICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5NZXRob2RFeHByZXNzaW9uTWV0aG9kQmluZGluZyIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgICAgewotICAgICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuTWV0aG9kRXhwcmVzc2lvbiIpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAocHJvcGVydHkuaXNFbnVtKCkpCi0gICAgICB7Ci0gICAgICAgIGltcG9ydHMuYWRkKHByb3BlcnR5Q2xhc3MpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eURlY2xhcmF0aW9uKFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIGZpZWxkUHJvcE5hbWUgPSAiXyIgKyBwcm9wTmFtZTsKLSAgICBTdHJpbmcganNwUHJvcFR5cGUgPSBHZW5lcmF0b3JIZWxwZXIuZ2V0SnNwUHJvcGVydHlUeXBlKHByb3BlcnR5LCBfaXMxMik7Ci0KLSAgICBvdXQucHJpbnRsbigpOwotICAgIG91dC5wcmludGxuKCJwcml2YXRlICIgKyBqc3BQcm9wVHlwZSArICIgIiArIGZpZWxkUHJvcE5hbWUgKyAiOyIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVQcm9wZXJ0eVNldHRlcihQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgZmllbGRQcm9wTmFtZSA9ICJfIiArIHByb3BOYW1lOwotICAgIFN0cmluZyBqc3BQcm9wTmFtZSA9IHByb3BlcnR5LmdldEpzcFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wVmFyID0gVXRpbC5nZXRWYXJpYWJsZUZyb21OYW1lKHByb3BOYW1lKTsKLSAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwganNwUHJvcE5hbWUpOwotICAgIFN0cmluZyBqc3BQcm9wVHlwZSA9IEdlbmVyYXRvckhlbHBlci5nZXRKc3BQcm9wZXJ0eVR5cGUocHJvcGVydHksIF9pczEyKTsKLQotICAgIG91dC5wcmludCgiZmluYWwgIik7Ci0gICAgb3V0LnByaW50bG4oInB1YmxpYyB2b2lkICIgKyBzZXRNZXRob2QgKyAiKCIgKyBqc3BQcm9wVHlwZSArICIgIiArIHByb3BWYXIgKyAiKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotICAgIG91dC5wcmludGxuKGZpZWxkUHJvcE5hbWUgKyAiID0gIiArIHByb3BWYXIgKyAiOyIpOwotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVNldFByb3BlcnRpZXNNZXRob2QoUHJldHR5V3JpdGVyIG91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIENvbGxlY3Rpb24gY29tcG9uZW50cyA9IG5ldyBIYXNoU2V0KCk7Ci0gICAgY29tcG9uZW50cy5hZGQoY29tcG9uZW50KTsKLSAgICB3cml0ZVNldFByb3BlcnRpZXNNZXRob2Qob3V0LCBjb21wb25lbnRDbGFzcywgY29tcG9uZW50cyk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlU2V0UHJvcGVydGllc01ldGhvZChQcmV0dHlXcml0ZXIgb3V0LCBTdHJpbmcgY29tcG9uZW50Q2xhc3MsIENvbGxlY3Rpb24gY29tcG9uZW50cykKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgQ29sbGVjdGlvbiBhbGwgPSBuZXcgSGFzaFNldCgpOwotICAgIGZvciAoSXRlcmF0b3IgbEl0ZXJhdG9yID0gY29tcG9uZW50cy5pdGVyYXRvcigpOyBsSXRlcmF0b3IuaGFzTmV4dCgpOykKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IChDb21wb25lbnRCZWFuKSBsSXRlcmF0b3IubmV4dCgpOwotICAgICAgSXRlcmF0b3IgcHJvcCA9IGNvbXBvbmVudC5wcm9wZXJ0aWVzKCk7Ci0gICAgICB3aGlsZSAocHJvcC5oYXNOZXh0KCkpCi0gICAgICB7Ci0gICAgICAgIGFsbC5hZGQocHJvcC5uZXh0KCkpOwotICAgICAgfQotICAgIH0KLQotICAgIEl0ZXJhdG9yIHByb3BlcnRpZXMgPSBhbGwuaXRlcmF0b3IoKTsKLSAgICBwcm9wZXJ0aWVzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IocHJvcGVydGllcywgbmV3IFRhZ0F0dHJpYnV0ZUZpbHRlcigpKTsKLQotICAgIGlmIChwcm9wZXJ0aWVzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigpOwotICAgICAgb3V0LnByaW50bG4oIkBPdmVycmlkZSIpOwotICAgICAgb3V0LnByaW50bG4oInByb3RlY3RlZCB2b2lkIHNldFByb3BlcnRpZXMoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiRmFjZXNCZWFuIGJlYW4pIik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICAgIHdyaXRlU2V0UHJvcGVydHlNZXRob2RCb2R5KG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnRpZXMpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHdyaXRlU2V0UHJvcGVydHlNZXRob2RCb2R5KFByZXR0eVdyaXRlciBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXRlcmF0b3IgcHJvcGVydGllcykgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLQotICAgIG91dC5wcmludGxuKCJzdXBlci5zZXRQcm9wZXJ0aWVzKGJlYW4pOyIpOwotCi0gICAgd2hpbGUgKHByb3BlcnRpZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIHByb3BlcnRpZXMubmV4dCgpOwotICAgICAgX3dyaXRlU2V0UHJvcGVydGllc0Nhc2Uob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRQcm9wZXJ0aWVzQ2FzZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotICAgIAotICAgIGlmIChwcm9wZXJ0eS5pc1ZpcnR1YWwoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVWaXJ0dWFsU2V0TWV0aG9kKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJvcGVydHkuaXNNZXRob2RCaW5kaW5nKCkpCi0gICAgewotICAgICAgX3dyaXRlU2V0TWV0aG9kQmluZGluZyhvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wZXJ0eSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTWV0aG9kRXhwcmVzc2lvbigpKQotICAgIHsKLSAgICAgIF93cml0ZVNldE1ldGhvZEV4cHJlc3Npb24ob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcGVydHkpOwotICAgIH0KLSAgICBlbHNlIGlmIChwcm9wZXJ0eS5pc0VudW0oKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRFbnVtKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BlcnR5KTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzS2V5U3Ryb2tlKHByb3BDbGFzcykpCi0gICAgewotICAgICAgX3dyaXRlU2V0S2V5U3Ryb2tlKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQVdUS2V5U3Ryb2tlKHByb3BDbGFzcykpCi0gICAgewotICAgICAgX3dyaXRlU2V0QVdUS2V5U3Ryb2tlKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoR2VuZXJhdG9ySGVscGVyLmlzQ29sb3JMaXN0KHByb3BDbGFzcywgcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKSkpCi0gICAgewotICAgICAgX3dyaXRlU2V0Q29sb3Iob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHRydWUpOwotICAgIH0KLSAgICBlbHNlIGlmIChHZW5lcmF0b3JIZWxwZXIuaXNDb2xvcihwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIF93cml0ZVNldENvbG9yKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBmYWxzZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKEdlbmVyYXRvckhlbHBlci5pc0NvbnZlcnRlcihwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIF93cml0ZVNldENvbnZlcnRlcihvdXQsIGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKHByb3BlcnR5LmlzTGl0ZXJhbE9ubHkoKSkKLSAgICB7Ci0gICAgICBfd3JpdGVTZXRMaXRlcmFsKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBwcm9wQ2xhc3MsIHByb3BWYXIpOwotICAgIH0KLSAgICBlbHNlIGlmICgiamF2YS51dGlsLkRhdGUiLmVxdWFscyhwcm9wQ2xhc3MpKQotICAgIHsKLSAgICAgIF93cml0ZVNldERhdGUob3V0LCBjb21wb25lbnRDbGFzcywgcHJvcE5hbWUsIHByb3BDbGFzcywgcHJvcFZhciwgcHJvcGVydHkuZ2V0VXNlTWF4VGltZSgpKTsKLSAgICB9Ci0gICAgZWxzZSAvL2lmIChfaGFzUHJvcGVydHlTZXR0ZXIocHJvcGVydHkpKQotICAgIHsKLSAgICAgIF93cml0ZVNldFByb3BlcnR5KG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBwcm9wQ2xhc3MsIHByb3BWYXIpOwotICAgIH0KLSAgICAvLyAgICBlbHNlCi0gICAgLy8gICAgewotICAgIC8vICAgICAgX3dyaXRlU2V0VmFsdWVCaW5kaW5nKG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBwcm9wVmFyKTsKLSAgICAvLyAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0TGl0ZXJhbCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUsCi0gICAgICBTdHJpbmcgcHJvcEZ1bGxDbGFzcywKLSAgICAgIFN0cmluZyBwcm9wVmFyKQotICB7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBib3hlZENsYXNzID0gVXRpbC5nZXRCb3hlZENsYXNzKHByb3BDbGFzcyk7Ci0gICAgaWYgKCghX2lzMTIgJiYgIWJveGVkQ2xhc3MuZXF1YWxzKHByb3BDbGFzcykpIHx8Ci0gICAgICAgICJqYXZhLnV0aWwuRGF0ZSIuZXF1YWxzKHByb3BGdWxsQ2xhc3MpIHx8Ci0gICAgICAgIChib3hlZENsYXNzLmluZGV4T2YoIltdIikgIT0gLTEpKQotICAgIHsKLSAgICAgIC8vIFRPRE86IHJlamVjdCB2YWx1ZSBiaW5kaW5nIGV4cHJlc3Npb25zIGZvciBsaXRlcmFsLW9ubHkKLSAgICAgIF93cml0ZVNldFByb3BlcnR5KG91dCwgY29tcG9uZW50Q2xhc3MsIHByb3BOYW1lLCBwcm9wRnVsbENsYXNzLCBwcm9wVmFyKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsKLSAgICAgICAgICBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldERhdGUoCi0gICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgU3RyaW5nIHByb3BOYW1lLAotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzLAotICAgIFN0cmluZyBwcm9wVmFyLAotICAgIGJvb2xlYW4gdXNlTWF4VGltZSkKLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBib3hlZENsYXNzID0gVXRpbC5nZXRCb3hlZENsYXNzKHByb3BDbGFzcyk7Ci0gICAgU3RyaW5nIHNldFByb3BlcnR5ID0gInNldFByb3BlcnR5IjsKLSAgICBTdHJpbmcgcHJvcFR5cGUgPSBib3hlZENsYXNzLnJlcGxhY2VBbGwoIlxcW1xcXSIsICJBcnJheSIpOwotICAgIGlmICh1c2VNYXhUaW1lKQotICAgIHsKLSAgICAgIHNldFByb3BlcnR5ID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0TWF4IiwgcHJvcFR5cGUgKyAiUHJvcGVydHkiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldFByb3BlcnR5ID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcFR5cGUgKyAiUHJvcGVydHkiKTsKLSAgICB9Ci0KLSAgICBvdXQucHJpbnRsbihzZXRQcm9wZXJ0eSArICIoYmVhbiwgIiArCi0gICAgICAgIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKwotICAgICAgICBwcm9wVmFyICsgIik7Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0UHJvcGVydHkoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lLAotICAgICAgU3RyaW5nIHByb3BGdWxsQ2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcFZhcikKLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BGdWxsQ2xhc3MpOwotICAgIFN0cmluZyBib3hlZENsYXNzID0gVXRpbC5nZXRCb3hlZENsYXNzKHByb3BDbGFzcyk7Ci0gICAgU3RyaW5nIHNldFByb3BlcnR5ID0gInNldFByb3BlcnR5IjsKLSAgICBpZiAoKCFfaXMxMiAmJiAhYm94ZWRDbGFzcy5lcXVhbHMocHJvcENsYXNzKSkgfHwKLSAgICAgICAgR2VuZXJhdG9ySGVscGVyLmlzTnVtYmVyKHByb3BGdWxsQ2xhc3MpIHx8Ci0gICAgICAgICJqYXZhLnV0aWwuRGF0ZSIuZXF1YWxzKHByb3BGdWxsQ2xhc3MpIHx8Ci0gICAgICAgIChib3hlZENsYXNzLmluZGV4T2YoIltdIikgIT0gLTEpKQotICAgIHsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IGJveGVkQ2xhc3MucmVwbGFjZUFsbCgiXFxbXFxdIiwgIkFycmF5Iik7Ci0gICAgICBzZXRQcm9wZXJ0eSA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BUeXBlICsgIlByb3BlcnR5Iik7Ci0gICAgfQotCi0gICAgb3V0LnByaW50bG4oc2V0UHJvcGVydHkgKyAiKGJlYW4sICIgKwotICAgICAgICBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsKLSAgICAgICAgcHJvcFZhciArICIpOyIpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBfZ2V0QWNjZXNzS2V5UHJvcGVydHlLZXlzKAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKQotICB7Ci0gICAgU3RyaW5nW10gcHJvcEtleXMgPSBuZXcgU3RyaW5nWzJdOwotCi0gICAgaW50IG9mZnNldCA9IHByb3BOYW1lLmluZGV4T2YoIkFuZEFjY2Vzc0tleSIpOwotICAgIGlmIChvZmZzZXQgIT0gLTEpCi0gICAgewotICAgICAgU3RyaW5nIG1haW5Qcm9wID0gcHJvcE5hbWUuc3Vic3RyaW5nKDAsIG9mZnNldCk7Ci0gICAgICBwcm9wS2V5c1swXSA9IGNvbXBvbmVudENsYXNzICsgIi4iICsKLSAgICAgICAgICBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShtYWluUHJvcCwgIl9LRVkiKTsKLSAgICAgIHByb3BLZXlzWzFdID0gY29tcG9uZW50Q2xhc3MgKyAiLiIgKwotICAgICAgICAgIFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KCJhY2Nlc3NLZXkiLCAiX0tFWSIpOwotICAgIH0KLQotICAgIHJldHVybiBwcm9wS2V5czsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRWYWx1ZUJpbmRpbmcoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lLAotICAgICAgU3RyaW5nIHByb3BWYXIpCi0gIHsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlQmluZGluZygiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgICJjcmVhdGVWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlVmlydHVhbFNldE1ldGhvZCgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nW10gcHJvcEtleXMgPSBfZ2V0QWNjZXNzS2V5UHJvcGVydHlLZXlzKGNvbXBvbmVudENsYXNzLCBwcm9wTmFtZSk7Ci0KLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmlydHVhbEF0dHJpYnV0ZVV0aWxzLnNldEFjY2Vzc0tleUF0dHJpYnV0ZSgiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcFZhciArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1swXSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbihwcm9wS2V5c1sxXSArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgcyA9ICIgKyBwcm9wVmFyICsgIi5nZXRFeHByZXNzaW9uU3RyaW5nKCk7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKHMgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWaXJ0dWFsQXR0cmlidXRlVXRpbHMuc2V0QWNjZXNzS2V5QXR0cmlidXRlKCIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4sIik7Ci0gICAgICBvdXQucHJpbnRsbigicywiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzBdICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzFdICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oIlZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJ2YiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzBdICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BLZXlzWzFdICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZpcnR1YWxBdHRyaWJ1dGVVdGlscy5zZXRBY2Nlc3NLZXlBdHRyaWJ1dGUoIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbiwiKTsKLSAgICAgIG91dC5wcmludGxuKHByb3BWYXIgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMF0gKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4ocHJvcEtleXNbMV0gKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlU2V0TWV0aG9kQmluZGluZygKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BOYW1lID0gcHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgICAgIm5ldyBNZXRob2RFeHByZXNzaW9uTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWduYXR1cmUgPSBwcm9wZXJ0eS5nZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlKCk7Ci0gICAgICBTdHJpbmdbXSBwYXJhbVR5cGVzID0gKHNpZ25hdHVyZSAhPSBudWxsKSA/IHNpZ25hdHVyZS5nZXRQYXJhbWV0ZXJUeXBlcygpIDogbnVsbDsKLQotICAgICAgU3RyaW5nIGNsYXNzQXJyYXk7Ci0KLSAgICAgIGlmIChwYXJhbVR5cGVzID09IG51bGwgfHwgcGFyYW1UeXBlcy5sZW5ndGggPT0gMCkKLSAgICAgIHsKLSAgICAgICAgY2xhc3NBcnJheSA9ICJuZXcgQ2xhc3NbMF0iOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgICAgIHNiLmFwcGVuZCgibmV3IENsYXNzW117Iik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyYW1UeXBlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgICAgIHNiLmFwcGVuZCgnLCcpOwotICAgICAgICAgIHNiLmFwcGVuZChwYXJhbVR5cGVzW2ldKTsKLSAgICAgICAgICBzYi5hcHBlbmQoIi5jbGFzcyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogcmVtb3ZlIHRyYWlsaW5nIGNvbW1hCi0gICAgICAgIHNiLmFwcGVuZCgnLCcpOwotCi0gICAgICAgIHNiLmFwcGVuZCgnfScpOwotICAgICAgICBjbGFzc0FycmF5ID0gc2IudG9TdHJpbmcoKTsKLSAgICAgIH0KLQotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0KLSAgICAgIGlmIChpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKHNpZ25hdHVyZSkpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJNZXRob2RCaW5kaW5nIG1iOyIpOwotICAgICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBvdXQucHJpbnRsbigibWIgPSBjcmVhdGVNZXRob2RCaW5kaW5nKCIgKyBwcm9wVmFyICsgIiwgIiArIGNsYXNzQXJyYXkgKyAiKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIm1iID0gbmV3IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi5Db25zdGFudE1ldGhvZEJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIG5ldmVyIGEgbGl0ZXJhbCwgbm8gbmVlZCBmb3IgQ29uc3RhbnRNZXRob2RCaW5kaW5nCi0gICAgICAgIG91dC5wcmludGxuKCJNZXRob2RCaW5kaW5nIG1iID0gY3JlYXRlTWV0aG9kQmluZGluZygiICsgcHJvcFZhciArICIsICIgKwotICAgICAgICAgICAgY2xhc3NBcnJheSArICIpOyIpOwotICAgICAgfQotCi0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgbWIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRNZXRob2RFeHByZXNzaW9uKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0KLSAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArCi0gICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRFbnVtKAotICAgICAgUHJldHR5V3JpdGVyIG91dCwKLSAgICAgIFN0cmluZyBjb21wb25lbnRDbGFzcywKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcHJvcE5hbWUgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKTsKLSAgICBTdHJpbmcgcHJvcEtleSA9IFV0aWwuZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BOYW1lLCAiX0tFWSIpOwotICAgIFN0cmluZyBwcm9wVmFyID0gIl8iICsgcHJvcE5hbWU7Ci0gICAgU3RyaW5nIHByb3BDbGFzcyA9IFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKHByb3BlcnR5LmdldFByb3BlcnR5Q2xhc3MoKSk7Ci0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyBzID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAocyAhPSBudWxsKSIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiRW51bS52YWx1ZU9mKCIgKyBwcm9wQ2xhc3MgKyAiLmNsYXNzLHMpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiRW51bS52YWx1ZU9mKCIgKyBwcm9wQ2xhc3MgKyAiLmNsYXNzLCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldEtleVN0cm9rZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0KLSAgICBpZiAoX2lzMTIpCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFZhbHVlRXhwcmVzc2lvbigiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlN0cmluZyB2YWwgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmICh2YWwgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0S2V5U3Ryb2tlLmdldEtleVN0cm9rZSh2YWwpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0UHJvcGVydHkoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIik7Ci0gICAgICBvdXQucHJpbnRsbigiXHRLZXlTdHJva2UuZ2V0S2V5U3Ryb2tlKCIgKyBwcm9wVmFyICsgIikpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVNldEFXVEtleVN0cm9rZSgKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgY29tcG9uZW50Q2xhc3MsCi0gICAgICBTdHJpbmcgcHJvcE5hbWUpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIHByb3BLZXkgPSBVdGlsLmdldENvbnN0YW50TmFtZUZyb21Qcm9wZXJ0eShwcm9wTmFtZSwgIl9LRVkiKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIHByb3BOYW1lOwotCi0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmICghIiArIHByb3BWYXIgKyAiLmlzTGl0ZXJhbFRleHQoKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUV4cHJlc3Npb24oIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsICIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJTdHJpbmcgdmFsID0gIiArIHByb3BWYXIgKyAiLmdldEV4cHJlc3Npb25TdHJpbmcoKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJpZiAodmFsICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIG91dC5wcmludGxuKCJcdEFXVEtleVN0cm9rZS5nZXRBV1RLZXlTdHJva2UodmFsKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgb3V0LnByaW50bG4oIlx0QVdUS2V5U3Ryb2tlLmdldEFXVEtleVN0cm9rZSgiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRDb2xvcigKLSAgICAgIFByZXR0eVdyaXRlciBvdXQsCi0gICAgICBTdHJpbmcgIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nICBwcm9wTmFtZSwKLSAgICAgIGJvb2xlYW4gaXNMaXN0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHMgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmIChzICE9IG51bGwpIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJiZWFuLnNldFByb3BlcnR5KCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCIpOwotICAgICAgaWYgKGlzTGlzdCkKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgVGFnVXRpbHMuZ2V0Q29sb3JMaXN0KHMpKTsiKTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgVGFnVXRpbHMuZ2V0Q29sb3IocykpOyIpOwotICAgICAgfQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigic2V0VmFsaWRhdGlvbkVycm9yKCIpOwotICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0LnByaW50bG4oImlmIChpc1ZhbHVlUmVmZXJlbmNlKCIgKyBwcm9wVmFyICsgIikpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIlZhbHVlQmluZGluZyB2YiA9IGNyZWF0ZVZhbHVlQmluZGluZygiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVCaW5kaW5nKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwiKTsKLSAgICAgIGlmIChpc0xpc3QpCi0gICAgICAgIG91dC5wcmludGxuKCIgICAgICAgICAgICAgICAgIFRhZ1V0aWxzLmdldENvbG9yTGlzdCgiICsgcHJvcFZhciArICIpKTsiKTsKLSAgICAgIGVsc2UKLSAgICAgICAgb3V0LnByaW50bG4oIiAgICAgICAgICAgICAgICAgVGFnVXRpbHMuZ2V0Q29sb3IoIiArIHByb3BWYXIgKyAiKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQucHJpbnRsbigiY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIHBlKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJzZXRWYWxpZGF0aW9uRXJyb3IoIik7Ci0gICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIG91dC51bmluZGVudCgpOwotICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVTZXRDb252ZXJ0ZXIoCi0gICAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgICAgU3RyaW5nIGNvbXBvbmVudENsYXNzLAotICAgICAgU3RyaW5nIHByb3BOYW1lKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIFN0cmluZyBwcm9wS2V5ID0gVXRpbC5nZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkocHJvcE5hbWUsICJfS0VZIik7Ci0gICAgU3RyaW5nIHByb3BWYXIgPSAiXyIgKyBwcm9wTmFtZTsKLQotICAgIG91dC5wcmludGxuKCJpZiAoIiArIHByb3BWYXIgKyAiICE9IG51bGwpIik7Ci0gICAgb3V0LnByaW50bG4oInsiKTsKLSAgICBvdXQuaW5kZW50KCk7Ci0gICAgaWYgKF9pczEyKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImJlYW4uc2V0VmFsdWVFeHByZXNzaW9uKCIgKyBjb21wb25lbnRDbGFzcyArICIuIiArIHByb3BLZXkgKyAiLCAiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiU3RyaW5nIHMgPSAiICsgcHJvcFZhciArICIuZ2V0RXhwcmVzc2lvblN0cmluZygpOyIpOwotICAgICAgb3V0LnByaW50bG4oImlmIChzICE9IG51bGwpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotCi0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiQ29udmVydGVyIGNvbnZlcnRlciA9IGdldEZhY2VzQ29udGV4dCgpLmdldEFwcGxpY2F0aW9uKCkuIik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiY3JlYXRlQ29udmVydGVyKHMpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgY29udmVydGVyKTsiKTsKLQotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotCi0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKGlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gY3JlYXRlVmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRWYWx1ZUJpbmRpbmcoIiArIGNvbXBvbmVudENsYXNzICsgIi4iICsgcHJvcEtleSArICIsIHZiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIkNvbnZlcnRlciBjb252ZXJ0ZXIgPSBnZXRGYWNlc0NvbnRleHQoKS5nZXRBcHBsaWNhdGlvbigpLiIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oImNyZWF0ZUNvbnZlcnRlcigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiYmVhbi5zZXRQcm9wZXJ0eSgiICsgY29tcG9uZW50Q2xhc3MgKyAiLiIgKyBwcm9wS2V5ICsgIiwgY29udmVydGVyKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICB9Ci0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc1N0cmluZ01ldGhvZEJpbmRpbmdSZXR1cm5UeXBlKAotICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWcpCi0gIHsKLSAgICByZXR1cm4gKHNpZyAhPSBudWxsICYmICJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMoc2lnLmdldFJldHVyblR5cGUoKSkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZENvbnZlcnRlclRhZ0dlbmVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDA3ZTlhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9nZW5lcmF0b3IvdGFnbGliL1RyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmdlbmVyYXRvci50YWdsaWI7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5sb2dnaW5nLkxvZzsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLmlvLlByZXR0eVdyaXRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkNvbnZlcnRlckJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5UcmVlU2V0OwotCi1wdWJsaWMgY2xhc3MgVHJpbmlkYWRDb252ZXJ0ZXJUYWdHZW5lcmF0b3IgZXh0ZW5kcyBBYnN0cmFjdENvbnZlcnRlclRhZ0dlbmVyYXRvciB7Ci0KLSAgcHVibGljIFRyaW5pZGFkQ29udmVydGVyVGFnR2VuZXJhdG9yKGJvb2xlYW4gaXMxMiwgU3RyaW5nIGxpY2Vuc2VIZWFkZXIsIExvZyBsb2cpIHsKLSAgICBzdXBlcihpczEyLCBsaWNlbnNlSGVhZGVyLCBsb2cpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNldCBjcmVhdGVJbXBvcnRzKENvbnZlcnRlckJlYW4gY29udmVydGVyKSB7Ci0gICAgU2V0IGltcG9ydHMgPSBuZXcgVHJlZVNldCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMud2ViYXBwLkNvbnZlcnRlckVMVGFnIik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuY29udGV4dC5GYWNlc0NvbnRleHQiKTsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy5hcHBsaWNhdGlvbi5BcHBsaWNhdGlvbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5Db252ZXJ0ZXJUYWciKTsKLSAgICB9Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguc2VydmxldC5qc3AuSnNwRXhjZXB0aW9uIik7Ci0gICAgaW1wb3J0cy5hZGQoY29udmVydGVyLmdldENvbnZlcnRlckNsYXNzKCkpOwotCi0gICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnZlcnQuQ29udmVydGVyIik7Ci0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5UYWdVdGlscyIpOwotCi0KLSAgICBhZGRJbXBvcnRzRnJvbVByb3BlcnRlcyhjb252ZXJ0ZXIsIGltcG9ydHMpOwotICAgIHJldHVybiBpbXBvcnRzOwotICB9Ci0KLQotCi0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0KLSAgICBvdXQucHJpbnRsbigiaWYgKCIgKyBwcm9wVmFyICsgIiAhPSBudWxsKSIpOwotICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgb3V0LmluZGVudCgpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKCEiICsgcHJvcFZhciArICIuaXNMaXRlcmFsVGV4dCgpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJjb252ZXJ0ZXIuc2V0VmFsdWVFeHByZXNzaW9uKFwiIiArIHByb3BOYW1lICsgIlwiLCAiICsKLSAgICAgICAgICAgICAgICAgIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIFN0cmluZyBwcm9wVHlwZSA9IHJlc29sdmVUeXBlKHByb3BGdWxsQ2xhc3MpOwotICAgICAgaWYgKHByb3BUeXBlICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC5wcmludGxuKCJlbHNlIik7Ci0gICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ0cnkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICB9Ci0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiLmdldFZhbHVlKG51bGwpKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBvdXQucHJpbnRsbigiaWYgKFRhZ1V0aWxzLmlzVmFsdWVSZWZlcmVuY2UoIiArIHByb3BWYXIgKyAiKSkiKTsKLSAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigiVmFsdWVCaW5kaW5nIHZiID0gVGFnVXRpbHMuZ2V0VmFsdWVCaW5kaW5nKCIgKyBwcm9wVmFyICsgIik7Iik7Ci0gICAgICBvdXQucHJpbnRsbigiY29udmVydGVyLnNldFZhbHVlQmluZGluZyhcIiIgKyBwcm9wTmFtZSArICJcIiwgdmIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnByaW50bG4ocHJvcENsYXNzICsgIiB2YWx1ZSA9IFRhZ1V0aWxzLmdldCIgKyBwcm9wVHlwZSArICIoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgICAgU3RyaW5nIHNldE1ldGhvZCA9IFV0aWwuZ2V0UHJlZml4ZWRQcm9wZXJ0eU5hbWUoInNldCIsIHByb3BOYW1lKTsKLSAgICAgICAgb3V0LnByaW50bG4oImNvbnZlcnRlci4iICsgc2V0TWV0aG9kICsgIih2YWx1ZSk7Iik7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJjYXRjaCAoUGFyc2VFeGNlcHRpb24gcGUpIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRocm93IG5ldyBKc3BFeGNlcHRpb24oIik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIiAgcGUuZ2V0TWVzc2FnZSgpICsgXCI6IFwiICsgXCJQb3NpdGlvbiBcIiArIHBlLmdldEVycm9yT2Zmc2V0KCkpOyIpOwotICAgICAgICAgIG91dC51bmluZGVudCgpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgb3V0LnByaW50bG4oIn0iKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2dlbmVyYXRvci90YWdsaWIvVHJpbmlkYWRWYWxpZGF0b3JUYWdHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ4YjdiZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvZ2VuZXJhdG9yL3RhZ2xpYi9UcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTc3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5nZW5lcmF0b3IudGFnbGliOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4ubG9nZ2luZy5Mb2c7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pby5QcmV0dHlXcml0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5WYWxpZGF0b3JCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotcHVibGljIGNsYXNzIFRyaW5pZGFkVmFsaWRhdG9yVGFnR2VuZXJhdG9yIGV4dGVuZHMgQWJzdHJhY3RWYWxpZGF0b3JUYWdHZW5lcmF0b3IgewotCi0gIHB1YmxpYyBUcmluaWRhZFZhbGlkYXRvclRhZ0dlbmVyYXRvcihib29sZWFuIF9pczEyLCBTdHJpbmcgX2xpY2Vuc2VIZWFkZXIsIExvZyBfbG9nKSB7Ci0gICAgc3VwZXIoX2lzMTIsIF9saWNlbnNlSGVhZGVyLCBfbG9nKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTZXQgY3JlYXRlSW1wb3J0cyhWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikgewotICAgIFNldCBpbXBvcnRzID0gbmV3IFRyZWVTZXQoKTsKLQotICAgIGlmIChpczEyKCkpCi0gICAgewotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLndlYmFwcC5WYWxpZGF0b3JFTFRhZyIpOwotICAgICAgaW1wb3J0cy5hZGQoImphdmF4LmZhY2VzLmNvbnRleHQuRmFjZXNDb250ZXh0Iik7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuYXBwbGljYXRpb24uQXBwbGljYXRpb24iKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGltcG9ydHMuYWRkKCJqYXZheC5mYWNlcy53ZWJhcHAuVmFsaWRhdG9yVGFnIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJqYXZheC5zZXJ2bGV0LmpzcC5Kc3BFeGNlcHRpb24iKTsKLSAgICBpbXBvcnRzLmFkZCh2YWxpZGF0b3IuZ2V0VmFsaWRhdG9yQ2xhc3MoKSk7Ci0KLSAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMudmFsaWRhdG9yLlZhbGlkYXRvciIpOwotCi0gICAgaWYgKGlzMTIoKSkKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZWwuVmFsdWVFeHByZXNzaW9uIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpbXBvcnRzLmFkZCgiamF2YXguZmFjZXMuZWwuVmFsdWVCaW5kaW5nIik7Ci0gICAgfQotICAgIGltcG9ydHMuYWRkKCJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC50YWdsaWIudXRpbC5UYWdVdGlscyIpOwotCi0KLSAgICBhZGRJbXBvcnRzRnJvbVByb3BlcnRlcyh2YWxpZGF0b3IsIGltcG9ydHMpOwotICAgIHJldHVybiBpbXBvcnRzOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgd3JpdGVTZXRQcm9wZXJ0eSgKLSAgICBQcmV0dHlXcml0ZXIgb3V0LAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSkKLSAgewotICAgIFN0cmluZyBwcm9wTmFtZSA9IHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpOwotICAgIFN0cmluZyBwcm9wRnVsbENsYXNzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzcygpOwotICAgIFN0cmluZyBwcm9wQ2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wRnVsbENsYXNzKTsKLSAgICBTdHJpbmcgcHJvcFZhciA9ICJfIiArIFV0aWwuZ2V0VmFyaWFibGVGcm9tTmFtZShwcm9wTmFtZSk7Ci0gICAgb3V0LnByaW50bG4oImlmICgiICsgcHJvcFZhciArICIgIT0gbnVsbCkiKTsKLSAgICBvdXQucHJpbnRsbigieyIpOwotICAgIG91dC5pbmRlbnQoKTsKLSAgICBpZiAoaXMxMigpKQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoISIgKyBwcm9wVmFyICsgIi5pc0xpdGVyYWxUZXh0KCkpIik7Ci0gICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgb3V0LmluZGVudCgpOwotICAgICAgb3V0LnByaW50bG4oInZhbGlkYXRvci5zZXRWYWx1ZUV4cHJlc3Npb24oXCIiICsgcHJvcE5hbWUgKyAiXCIsICIgKwotICAgICAgICAgICAgICAgICAgcHJvcFZhciArICIpOyIpOwotICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICBvdXQucHJpbnRsbigifSIpOwotICAgICAgU3RyaW5nIHByb3BUeXBlID0gbnVsbDsKLSAgICAgIGlmICgiRGF0ZSIuZXF1YWxzIChwcm9wQ2xhc3MpKSAKLSAgICAgIHsKLSAgICAgICAgcHJvcFR5cGUgPSByZXNvbHZlRGF0ZVR5cGUocHJvcEZ1bGxDbGFzcywgcHJvcGVydHkuZ2V0VXNlTWF4VGltZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGVsc2UgCi0gICAgICB7Ci0gICAgICAgIHByb3BUeXBlID0gcmVzb2x2ZVR5cGUocHJvcEZ1bGxDbGFzcyk7ICAgICAgICAgICAgCi0gICAgICB9Ci0gICAgICBpZiAocHJvcFR5cGUgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgb3V0LnByaW50bG4oImVsc2UiKTsKLSAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgb3V0LmluZGVudCgpOwotICAgICAgICBpZiAoIlN0cmluZ0FycmF5Ii5lcXVhbHMocHJvcFR5cGUpKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInRyeSIpOwotICAgICAgICAgIG91dC5wcmludGxuKCJ7Iik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIuZ2V0VmFsdWUobnVsbCkpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dC5wcmludGxuKCJpZiAoVGFnVXRpbHMuaXNWYWx1ZVJlZmVyZW5jZSgiICsgcHJvcFZhciArICIpKSIpOwotICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJWYWx1ZUJpbmRpbmcgdmIgPSBUYWdVdGlscy5nZXRWYWx1ZUJpbmRpbmcoIiArIHByb3BWYXIgKyAiKTsiKTsKLSAgICAgIG91dC5wcmludGxuKCJ2YWxpZGF0b3Iuc2V0VmFsdWVCaW5kaW5nKFwiIiArIHByb3BOYW1lICsgIlwiLCB2Yik7Iik7Ci0gICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICBTdHJpbmcgcHJvcFR5cGUgPSBudWxsOwotICAgICAgaWYgKCJEYXRlIi5lcXVhbHMgKHByb3BDbGFzcykpIAotICAgICAgewotICAgICAgICBwcm9wVHlwZSA9IHJlc29sdmVEYXRlVHlwZShwcm9wRnVsbENsYXNzLCBwcm9wZXJ0eS5nZXRVc2VNYXhUaW1lKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfQotICAgICAgZWxzZSAKLSAgICAgIHsKLSAgICAgICAgcHJvcFR5cGUgPSByZXNvbHZlVHlwZShwcm9wRnVsbENsYXNzKTsgICAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIGlmIChwcm9wVHlwZSAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnRsbigiZWxzZSIpOwotICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICBvdXQuaW5kZW50KCk7Ci0gICAgICAgIGlmICgiU3RyaW5nQXJyYXkiLmVxdWFscyhwcm9wVHlwZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQucHJpbnRsbigidHJ5Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oInsiKTsKLSAgICAgICAgfQotICAgICAgICBvdXQucHJpbnRsbihwcm9wQ2xhc3MgKyAiIHZhbHVlID0gVGFnVXRpbHMuZ2V0IiArIHByb3BUeXBlICsgIigiICsgcHJvcFZhciArICIpOyIpOwotICAgICAgICBTdHJpbmcgc2V0TWV0aG9kID0gVXRpbC5nZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgic2V0IiwgcHJvcE5hbWUpOwotICAgICAgICBvdXQucHJpbnRsbigidmFsaWRhdG9yLiIgKyBzZXRNZXRob2QgKyAiKHZhbHVlKTsiKTsKLSAgICAgICAgaWYgKCJTdHJpbmdBcnJheSIuZXF1YWxzKHByb3BUeXBlKSkKLSAgICAgICAgewotICAgICAgICAgIG91dC5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgb3V0LnByaW50bG4oImNhdGNoIChQYXJzZUV4Y2VwdGlvbiBwZSkiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigieyIpOwotICAgICAgICAgIG91dC5pbmRlbnQoKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigidGhyb3cgbmV3IEpzcEV4Y2VwdGlvbigiKTsKLSAgICAgICAgICBvdXQucHJpbnRsbigiICBwZS5nZXRNZXNzYWdlKCkgKyBcIjogXCIgKyBcIlBvc2l0aW9uIFwiICsgcGUuZ2V0RXJyb3JPZmZzZXQoKSk7Iik7Ci0gICAgICAgICAgb3V0LnVuaW5kZW50KCk7Ci0gICAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQudW5pbmRlbnQoKTsKLSAgICAgICAgb3V0LnByaW50bG4oIn0iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBvdXQudW5pbmRlbnQoKTsKLSAgICBvdXQucHJpbnRsbigifSIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvaW8vUHJldHR5V3JpdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvaW8vUHJldHR5V3JpdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGY2M2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL2lvL1ByZXR0eVdyaXRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjAxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5pbzsKLQotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBQcmV0dHlXcml0ZXIgZXh0ZW5kcyBQcmludFdyaXRlcgotewotICBwdWJsaWMgUHJldHR5V3JpdGVyKAotICAgIE91dHB1dFN0cmVhbSBvdXQpCi0gIHsKLSAgICBzdXBlcihvdXQpOwotICB9Ci0KLSAgcHVibGljIFByZXR0eVdyaXRlcigKLSAgICBPdXRwdXRTdHJlYW0gb3V0LAotICAgIGJvb2xlYW4gICAgICBhdXRvRmx1c2gpCi0gIHsKLSAgICBzdXBlcihvdXQsIGF1dG9GbHVzaCk7Ci0gIH0KLQotICBwdWJsaWMgUHJldHR5V3JpdGVyKAotICAgIFdyaXRlciBvdXQpCi0gIHsKLSAgICBzdXBlcihvdXQpOwotICB9Ci0KLSAgcHVibGljIFByZXR0eVdyaXRlcigKLSAgICBXcml0ZXIgIG91dCwKLSAgICBib29sZWFuIGF1dG9GbHVzaCkKLSAgewotICAgIHN1cGVyKG91dCwgYXV0b0ZsdXNoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGluZGVudCgpCi0gIHsKLSAgICBfaW5kZW50YXRpb24gKys7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB1bmluZGVudCgpCi0gIHsKLSAgICBfaW5kZW50YXRpb24gLS07Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZSgKLSAgICBTdHJpbmcgc3RyaW5nLAotICAgIGludCAgICBvZmZzZXQsCi0gICAgaW50ICAgIGxlbmd0aCkKLSAgewotICAgIGlmIChfdW5sYXRjaFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCBfaW5kZW50YXRpb247IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGUoX1RBQl9JTkRFTlQsIDAsIDIpOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLndyaXRlKHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGUoCi0gICAgY2hhcltdIGNoYXJzLAotICAgIGludCAgICBvZmZzZXQsCi0gICAgaW50ICAgIGxlbmd0aCkKLSAgewotICAgIGlmIChfdW5sYXRjaFBlbmRpbmcoKSkKLSAgICB7Ci0gICAgICBmb3IgKGludCBpPTA7IGkgPCBfaW5kZW50YXRpb247IGkrKykKLSAgICAgIHsKLSAgICAgICAgc3VwZXIud3JpdGUoX1RBQl9JTkRFTlRfQ0hBUlMsIDAsIDIpOwotICAgICAgfQotICAgIH0KLQotICAgIHN1cGVyLndyaXRlKGNoYXJzLCBvZmZzZXQsIGxlbmd0aCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oKTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGJvb2xlYW4geCkKLSAgewotICAgIHN1cGVyLnByaW50bG4oeCk7Ci0gICAgX2xhdGNoUGVuZGluZygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRsbigKLSAgICBjaGFyIHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgaW50IHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgbG9uZyB4KQotICB7Ci0gICAgc3VwZXIucHJpbnRsbih4KTsKLSAgICBfbGF0Y2hQZW5kaW5nKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwcmludGxuKAotICAgIGZsb2F0IHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgZG91YmxlIHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgY2hhcltdIHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgU3RyaW5nIHgpCi0gIHsKLSAgICBpbnQgZnJvbUluZGV4ID0gMDsKLSAgICBmb3IgKGludCBpbmRleCA9IHguaW5kZXhPZignXG4nKTsKLSAgICAgICAgIGluZGV4ICE9IC0xICAmJiBpbmRleCArIDEgPCB4Lmxlbmd0aCgpOwotICAgICAgICAgZnJvbUluZGV4ID0gaW5kZXggKyAxLAotICAgICAgICAgaW5kZXggPSB4LmluZGV4T2YoJ1xuJywgZnJvbUluZGV4KSkKLSAgICB7Ci0gICAgICBzdXBlci5wcmludGxuKHguc3Vic3RyaW5nKGZyb21JbmRleCwgaW5kZXgpKTsKLSAgICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgICB9Ci0KLSAgICBzdXBlci5wcmludGxuKHguc3Vic3RyaW5nKGZyb21JbmRleCkpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHByaW50bG4oCi0gICAgT2JqZWN0IHgpCi0gIHsKLSAgICBzdXBlci5wcmludGxuKHgpOwotICAgIF9sYXRjaFBlbmRpbmcoKTsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfdW5sYXRjaFBlbmRpbmcoKQotICB7Ci0gICAgYm9vbGVhbiBwZW5kaW5nID0gX3BlbmRpbmc7Ci0gICAgaWYgKHBlbmRpbmcpCi0gICAgewotICAgICAgX3BlbmRpbmcgPSBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGVuZGluZzsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfbGF0Y2hQZW5kaW5nKCkKLSAgewotICAgIGJvb2xlYW4gcGVuZGluZyA9IF9wZW5kaW5nOwotICAgIGlmICghcGVuZGluZykKLSAgICB7Ci0gICAgICBfcGVuZGluZyA9IHRydWU7Ci0gICAgfQotCi0gICAgcmV0dXJuICFwZW5kaW5nOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX2luZGVudGF0aW9uOwotICBwcml2YXRlIGJvb2xlYW4gX3BlbmRpbmcgPSB0cnVlOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfVEFCX0lOREVOVCA9ICIgICI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNoYXJbXSBfVEFCX0lOREVOVF9DSEFSUyA9IF9UQUJfSU5ERU5ULnRvQ2hhckFycmF5KCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQWJzdHJhY3RUYWdCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQWJzdHJhY3RUYWdCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU0YzZmZDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0Fic3RyYWN0VGFnQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZEhhc2hNYXA7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci0KLXB1YmxpYyBjbGFzcyBBYnN0cmFjdFRhZ0JlYW4gZXh0ZW5kcyBPYmplY3RCZWFuIHsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9sb25nRGVzY3JpcHRpb247Ci0gIHByaXZhdGUgUU5hbWUgICBfdGFnTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdDbGFzczsKLSAgcHJvdGVjdGVkIE1hcCBfcHJvcGVydGllczsKLSAgcHJpdmF0ZSBpbnQgICAgIF90YWdDbGFzc01vZGlmaWVyczsKLQotICBwdWJsaWMgQWJzdHJhY3RUYWdCZWFuKCkgewotICAgIF9wcm9wZXJ0aWVzID0gbmV3IExpbmtlZEhhc2hNYXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZGVzY3JpcHRpb24gIHRoZSBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gbG9uZ0Rlc2NyaXB0aW9uICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TG9uZ0Rlc2NyaXB0aW9uKAotICAgIFN0cmluZyBsb25nRGVzY3JpcHRpb24pCi0gIHsKLSAgICBfbG9uZ0Rlc2NyaXB0aW9uID0gbG9uZ0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGxvbmcgZGVzY3JpcHRpb24gb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGxvbmcgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TG9uZ0Rlc2NyaXB0aW9uKCkKLSAgewotICAgIHJldHVybiBfbG9uZ0Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWdDbGFzcyAgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnQ2xhc3MoCi0gICAgU3RyaW5nIHRhZ0NsYXNzKQotICB7Ci0gICAgX3RhZ0NsYXNzID0gdGFnQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0NsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWdOYW1lICB0aGUgSlNQIHRhZyBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdOYW1lKAotICAgICAgUU5hbWUgdGFnTmFtZSkKLSAgewotICAgIF90YWdOYW1lID0gdGFnTmFtZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKU1AgdGFnIG5hbWUKLSAgICovCi0gIHB1YmxpYyBRTmFtZSBnZXRUYWdOYW1lKCkKLSAgewotICAgIHJldHVybiBfdGFnTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgcHJvcGVydHkgdG8gdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eSAgdGhlIHByb3BlcnR5IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUHJvcGVydHkoCi0gICAgUHJvcGVydHlCZWFuIHByb3BlcnR5KQotICB7Ci0gICAgX3Byb3BlcnRpZXMucHV0KHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpLCBwcm9wZXJ0eSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoaXMgcHJvcGVydHkgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgdGhlIHByb3BlcnR5IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIFByb3BlcnR5QmVhbiBmaW5kUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgewotICAgIHJldHVybiAoUHJvcGVydHlCZWFuKV9wcm9wZXJ0aWVzLmdldChwcm9wZXJ0eU5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKQotICB7Ci0gICAgcmV0dXJuICFfcHJvcGVydGllcy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHByb3BlcnRpZXMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgcHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gX3Byb3BlcnRpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHBhcnNlVGFnQ2xhc3NNb2RpZmllcigKLSAgICBTdHJpbmcgbW9kaWZpZXIpCi0gIHsKLSAgICBhZGRUYWdDbGFzc01vZGlmaWVyKF9wYXJzZU1vZGlmaWVyKG1vZGlmaWVyKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgaW50IF9wYXJzZU1vZGlmaWVyKAotICAgIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgaWYgKCJwdWJsaWMiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7Ci0gICAgZWxzZSBpZiAoInByb3RlY3RlZCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBST1RFQ1RFRDsKLSAgICBlbHNlIGlmICgicHJpdmF0ZSIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBSSVZBVEU7Ci0gICAgZWxzZSBpZiAoImFic3RyYWN0Ii5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuQUJTVFJBQ1Q7Ci0gICAgZWxzZSBpZiAoImZpbmFsIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuRklOQUw7Ci0KLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbW9kaWZpZXI6ICIgKyB0ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgdGFnIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGFnQ2xhc3NNb2RpZmllcigKLSAgICBpbnQgbW9kaWZpZXIpCi0gIHsKLSAgICBfdGFnQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB0YWcgY2xhc3MuCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdGFnIGNsYXNzCi0gICAqLwotICBwdWJsaWMgaW50IGdldFRhZ0NsYXNzTW9kaWZpZXJzKCkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBfdGFnQ2xhc3NNb2RpZmllcnM7Ci0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgfQotCi0gLyoqCi0gICogTnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgY29tcG9uZW50Ci0gICogQHJldHVybiBudW0gb2YgcHJvcGVydGllcwotICAqLwotICBwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkKLSAgewotICAgIHJldHVybiBfcHJvcGVydGllcy5zaXplKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BdHRyaWJ1dGVCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQXR0cmlidXRlQmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGIzODU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9BdHRyaWJ1dGVCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci1pbXBvcnQgamF2YS5sYW5nLkNvbXBhcmFibGU7Ci0KLS8qKgotICogQXR0cmlidXRlQmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyBjb21wb25lbnQgb3IKLSAqIHJlbmRlcmVyIGF0dHJpYnV0ZSBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEF0dHJpYnV0ZUJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuIGltcGxlbWVudHMgQ29tcGFyYWJsZQotewotICAvKioKLSAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgIHRoZSBhdHRyaWJ1dGUgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QXR0cmlidXRlTmFtZSgKLSAgICBTdHJpbmcgYXR0cmlidXRlTmFtZSkKLSAgewotICAgIF9hdHRyaWJ1dGVOYW1lID0gYXR0cmlidXRlTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0QXR0cmlidXRlTmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX2F0dHJpYnV0ZU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgYXR0cmlidXRlIGNsYXNzIGZvciB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGF0dHJpYnV0ZUNsYXNzICB0aGUgYXR0cmlidXRlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBdHRyaWJ1dGVDbGFzcygKLSAgICBTdHJpbmcgYXR0cmlidXRlQ2xhc3MpCi0gIHsKLSAgICBNYXRjaGVyIG1hdGNoZXIgPSBfR0VORVJJQ19UWVBFLm1hdGNoZXIoYXR0cmlidXRlQ2xhc3MpOwotCi0gICAgaWYgKG1hdGNoZXIubWF0Y2hlcygpKQotICAgIHsKLSAgICAgIF9hdHRyaWJ1dGVDbGFzcyA9IG1hdGNoZXIuZ3JvdXAoMSk7Ci0gICAgICBfYXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzID0gbWF0Y2hlci5ncm91cCgyKS5zcGxpdCgiLCIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX2F0dHJpYnV0ZUNsYXNzID0gYXR0cmlidXRlQ2xhc3M7Ci0gICAgICBfYXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzID0gX0VNUFRZX0FSUkFZOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZvciB0aGlzIGF0dHJpYnV0ZQotICAgKiBpZiBpdCB1c2VzIGdlbmVyaWNzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZvciB0aGlzIGF0dHJpYnV0ZQotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIGdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpCi0gIHsKLSAgICByZXR1cm4gX2F0dHJpYnV0ZUNsYXNzUGFyYW1ldGVyczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBhdHRyaWJ1dGUgY2xhc3MgZm9yIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEF0dHJpYnV0ZUNsYXNzKCkKLSAgewotICAgIHJldHVybiBfYXR0cmlidXRlQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGRlc2NyaXB0aW9uKQotICB7Ci0gICAgX2Rlc2NyaXB0aW9uID0gZGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVzY3JpcHRpb24gb2YgdGhpcyBhdHRyaWJ1dGUuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhdHRyaWJ1dGUgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcGFyYW0gZGVmYXVsdFZhbHVlICB0aGUgYXR0cmlidXRlIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldERlZmF1bHRWYWx1ZSgKLSAgICBTdHJpbmcgZGVmYXVsdFZhbHVlKQotICB7Ci0gICAgX2RlZmF1bHRWYWx1ZSA9IGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoaXMgYXR0cmlidXRlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYXR0cmlidXRlIGRlZmF1bHQgdmFsdWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVmYXVsdFZhbHVlKCkKLSAgewotICAgIHJldHVybiBfZGVmYXVsdFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGFsdGVybmF0aXZlIGNsYXNzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gYWx0ZXJuYXRlQ2xhc3MgIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0QWx0ZXJuYXRlQ2xhc3MoCi0gICAgU3RyaW5nIGFsdGVybmF0ZUNsYXNzKQotICB7Ci0gICAgX2FsdGVybmF0ZUNsYXNzID0gYWx0ZXJuYXRlQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYWx0ZXJuYXRpdmUgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBhbHRlcm5hdGl2ZSBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBbHRlcm5hdGVDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2FsdGVybmF0ZUNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gc2lnbmF0dXJlICB0aGUgbWV0aG9kIGJpbmRpbmcgc2lnbmF0dXJlIG9mIHRoaXMgcHJvcGVydHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE1ldGhvZEJpbmRpbmdTaWduYXR1cmUoCi0gICAgTWV0aG9kU2lnbmF0dXJlQmVhbiBzaWduYXR1cmUpCi0gIHsKLSAgICBfc2lnbmF0dXJlID0gc2lnbmF0dXJlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG1ldGhvZCBiaW5kaW5nIHNpZ25hdHVyZSBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBtZXRob2QgYmluZGluZyBzaWduYXR1cmUgb2YgdGhpcyBwcm9wZXJ0eQotICAgKi8KLSAgcHVibGljIE1ldGhvZFNpZ25hdHVyZUJlYW4gZ2V0TWV0aG9kQmluZGluZ1NpZ25hdHVyZSgpCi0gIHsKLSAgICByZXR1cm4gX3NpZ25hdHVyZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB2aXJ0dWFsIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHZpcnR1YWwgIHRoZSBwcm9wZXJ0eSByZXF1aXJlZCBmbGFnCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWaXJ0dWFsKAotICAgIGJvb2xlYW4gdmlydHVhbCkKLSAgewotICAgIF92aXJ0dWFsID0gdmlydHVhbDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHZpcnR1YWwgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgdmlydHVhbCBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1ZpcnR1YWwoKQotICB7Ci0gICAgcmV0dXJuIF92aXJ0dWFsOwotICB9Ci0KLSAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG8pCi0gIHsKLSAgICBpZihvIGluc3RhbmNlb2YgQXR0cmlidXRlQmVhbikKLSAgICB7Ci0gICAgICBBdHRyaWJ1dGVCZWFuIGF0dHIgPSAoQXR0cmlidXRlQmVhbilvOwotICAgICAgcmV0dXJuIF9hdHRyaWJ1dGVOYW1lLmNvbXBhcmVUbyhhdHRyLl9hdHRyaWJ1dGVOYW1lKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICAgX2F0dHJpYnV0ZU5hbWU7Ci0gIHByaXZhdGUgU3RyaW5nICAgX2F0dHJpYnV0ZUNsYXNzOwotICBwcml2YXRlIFN0cmluZ1tdIF9hdHRyaWJ1dGVDbGFzc1BhcmFtZXRlcnM7Ci0gIHByaXZhdGUgU3RyaW5nICAgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgIF9kZWZhdWx0VmFsdWU7Ci0gIC8vIEZJWE1FOiBBbHRlcm5hdGUgdHlwZSBkb2VzIG5vdCBzZWVtIHRvIHN1cHBvcnQgZ2VuZXJpYyB0eXBlcwotICBwcml2YXRlIFN0cmluZyAgIF9hbHRlcm5hdGVDbGFzczsKLSAgcHJpdmF0ZSBib29sZWFuICBfdmlydHVhbDsKLSAgcHJpdmF0ZSBNZXRob2RTaWduYXR1cmVCZWFuIF9zaWduYXR1cmU7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgUGF0dGVybiBfR0VORVJJQ19UWVBFID0gUGF0dGVybi5jb21waWxlKCIoW148XSspPCguKyk+Iik7Ci0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIF9FTVBUWV9BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29tcG9uZW50QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbXBvbmVudEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE2ZTFlOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29tcG9uZW50QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEyOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG91bmRJdGVyYXRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIENvbXBvbmVudEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50Ci0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvbmVudEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IENvbXBvbmVudEJlYW4uCi0gICAqLwotICBwdWJsaWMgQ29tcG9uZW50QmVhbigpCi0gIHsKLSAgICBfcHJvcGVydGllcyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgX2ZhY2V0cyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gICAgX2V2ZW50cyA9IG5ldyBMaW5rZWRIYXNoTWFwKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgVUlYMiBsb2NhbCBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGxvY2FsTmFtZSAgdGhlIGxvY2FsIG5hbWUKLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgcmVtb3ZlIHdoZW4gInVpIiBwYWNrYWdlIGlzIGdvbmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExvY2FsTmFtZSgKLSAgICBTdHJpbmcgbG9jYWxOYW1lKQotICB7Ci0gICAgX2xvY2FsTmFtZSA9IGxvY2FsTmFtZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVSVgyIGxvY2FsIG5hbWUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgbG9jYWwgbmFtZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb2NhbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9sb2NhbE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgVUlYMiBub2RlIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIG5vZGVDbGFzcyAgdGhlIG5vZGUgY2xhc3MKLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgcmVtb3ZlIHdoZW4gInVpIiBwYWNrYWdlIGlzIGdvbmUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldE5vZGVDbGFzcygKLSAgICBTdHJpbmcgbm9kZUNsYXNzKQotICB7Ci0gICAgX25vZGVDbGFzcyA9IG5vZGVDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBVSVgyIG5vZGUgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgbm9kZSBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXROb2RlQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9ub2RlQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgY29tcG9uZW50IHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50VHlwZSAgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRUeXBlKAotICAgIFN0cmluZyBjb21wb25lbnRUeXBlKQotICB7Ci0gICAgX2NvbXBvbmVudFR5cGUgPSBjb21wb25lbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50RmFtaWx5ICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50RmFtaWx5KAotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkpCi0gIHsKLSAgICBfY29tcG9uZW50RmFtaWx5ID0gY29tcG9uZW50RmFtaWx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbXBvbmVudCBmYW1pbHkgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGZhbWlseQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRGYW1pbHkoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRGYW1pbHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBjb21wb25lbnQgZmFtaWx5IGV4aXN0cyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgIGlmIHRoZSBjb21wb25lbnQgZmFtaWx5IGV4aXN0cywKLSAgICogICAgICAgICAgZmFsc2Ugb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnRGYW1pbHkoKQotICB7Ci0gICAgcmV0dXJuIChfY29tcG9uZW50RmFtaWx5ICE9IG51bGwpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRDbGFzcyAgdGhlIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50Q2xhc3MoCi0gICAgU3RyaW5nIGNvbXBvbmVudENsYXNzKQotICB7Ci0gICAgX2NvbXBvbmVudENsYXNzID0gY29tcG9uZW50Q2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudENsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsb25nIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBsb25nRGVzY3JpcHRpb24gIHRoZSBsb25nIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRMb25nRGVzY3JpcHRpb24oCi0gICAgU3RyaW5nIGxvbmdEZXNjcmlwdGlvbikKLSAgewotICAgIF9sb25nRGVzY3JpcHRpb24gPSBsb25nRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgbG9uZyBwcm9wZXJ0eSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRMb25nRGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9sb25nRGVzY3JpcHRpb247Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHRhZ0NsYXNzICB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzcygKLSAgICBTdHJpbmcgdGFnQ2xhc3MpCi0gIHsKLSAgICBfdGFnQ2xhc3MgPSB0YWdDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFVuc3VwcG9ydGVkQWdlbnRzKAotICAgIFN0cmluZ1tdIHVuc3VwcG9ydGVkQWdlbnRzKQotICB7Ci0gICAgaWYgKHVuc3VwcG9ydGVkQWdlbnRzID09IG51bGwpCi0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oInVuc3VwcG9ydGVkQWdlbnRzIik7Ci0KLSAgICBfdW5zdXBwb3J0ZWRBZ2VudHMgPSB1bnN1cHBvcnRlZEFnZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVbnN1cHBvcnRlZEFnZW50cygpCi0gIHsKLSAgICByZXR1cm4gX3Vuc3VwcG9ydGVkQWdlbnRzOwotICB9Ci0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIHRhZyBoYW5kbGVyIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgaGFuZGxlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRUYWdDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0NsYXNzOwotICB9Ci0KLSAgIC8qKgotICAgKiBTZXRzIHRoZSBKU1AgdGFnIGhhbmRsZXIgc3VwZXJjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWdTdXBlcmNsYXNzICB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRhZ1N1cGVyY2xhc3MoCi0gICAgU3RyaW5nIHRhZ1N1cGVyY2xhc3MpCi0gIHsKLSAgICBfdGFnU3VwZXJjbGFzcyA9IHRhZ1N1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSlNQIHRhZyBoYW5kbGVyIHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VGFnU3VwZXJjbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3RhZ1N1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgKiBTZXRzIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlciAoY29tcG9uZW50IGhhbmRsZXIpIHRoaXMgY29tcG9uZW50LgotICAqCi0gICogQHBhcmFtIHRhZ0hhbmRsZXIgdGhlIEZhY2VsZXRzIHRhZyBoYW5kbGVyIGNsYXNzCi0gICovCi0gcHVibGljIHZvaWQgc2V0VGFnSGFuZGxlcigKLSAgIFN0cmluZyB0YWdIYW5kbGVyKQotIHsKLSAgIF90YWdIYW5kbGVyID0gdGFnSGFuZGxlcjsKLSB9Ci0KLSAvKioKLSAgKiBSZXR1cm5zIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlciBmb3IgdGhpcyBjb21wb25lbnQKLSAgKgotICAqIEByZXR1cm4gIHRoZSBGYWNlbGV0cyB0YWcgaGFuZGxlcgotICAqLwotIHB1YmxpYyBTdHJpbmcgZ2V0VGFnSGFuZGxlcigpCi0gewotICAgcmV0dXJuIF90YWdIYW5kbGVyOwotIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIHRhZyBuYW1lIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCB0YWcgbmFtZQotICAgKi8KLSAgcHVibGljIFFOYW1lIGdldFRhZ05hbWUoKQotICB7Ci0gICAgcmV0dXJuIF90YWdOYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIEpTUCB0YWcgbmFtZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWdOYW1lICB0aGUgSlNQIHRhZyBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRUYWdOYW1lKAotICAgIFFOYW1lIHRhZ05hbWUpCi0gIHsKLSAgICBfdGFnTmFtZSA9IHRhZ05hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbmFtaW5nQ29udGFpbmVyIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIG5hbWluZ0NvbnRhaW5lciAgdGhlIGNvbXBvbmVudCBuYW1pbmdDb250YWluZXIgZmxhZwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0TmFtaW5nQ29udGFpbmVyKAotICAgIGJvb2xlYW4gbmFtaW5nQ29udGFpbmVyKQotICB7Ci0gICAgX25hbWluZ0NvbnRhaW5lciA9IG5hbWluZ0NvbnRhaW5lcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIG5hbWluZ0NvbnRhaW5lciBmbGFnIG9mIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IG5hbWluZ0NvbnRhaW5lciBmbGFnCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc05hbWluZ0NvbnRhaW5lcigpCi0gIHsKLSAgICByZXR1cm4gX25hbWluZ0NvbnRhaW5lcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudFN1cGVydHlwZSAgdGhlIGNvbXBvbmVudCBzdXBlciB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRTdXBlcnR5cGUoCi0gICAgU3RyaW5nIGNvbXBvbmVudFN1cGVydHlwZSkKLSAgewotICAgIF9jb21wb25lbnRTdXBlcnR5cGUgPSBjb21wb25lbnRTdXBlcnR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHN1cGVydHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFN1cGVydHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudFN1cGVydHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50U3VwZXJjbGFzcyAgdGhlIGNvbXBvbmVudCBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50U3VwZXJjbGFzcygKLSAgICBTdHJpbmcgY29tcG9uZW50U3VwZXJjbGFzcykKLSAgewotICAgIF9jb21wb25lbnRTdXBlcmNsYXNzID0gY29tcG9uZW50U3VwZXJjbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFN1cGVyY2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKAotICAgIFN0cmluZyByZW5kZXJlclR5cGUpCi0gIHsKLSAgICBfcmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJlclR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmYXVsdCByZW5kZXJlciB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGRlZmF1bHQgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZWZhdWx0UmVuZGVyZXJUeXBlKCkKLSAgewotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRSZW5kZXJlclR5cGUoKSA6IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEltcGxlbWVudGF0aW9uVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2ltcGxlbWVudGF0aW9uVHlwZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEltcGxlbWVudGF0aW9uVHlwZShTdHJpbmcgaW1wbGVtZW50YXRpb25UeXBlKQotICB7Ci0gICAgX2ltcGxlbWVudGF0aW9uVHlwZSA9IGltcGxlbWVudGF0aW9uVHlwZTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEFkZHMgYSBwcm9wZXJ0eSB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5ICB0aGUgcHJvcGVydHkgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQcm9wZXJ0eSgKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBfcHJvcGVydGllcy5wdXQocHJvcGVydHkuZ2V0UHJvcGVydHlOYW1lKCksIHByb3BlcnR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBmb3IgdGhpcyBwcm9wZXJ0eSBuYW1lLgotICAgKgotICAgKiBAcGFyYW0gcHJvcGVydHlOYW1lICB0aGUgcHJvcGVydHkgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgUHJvcGVydHlCZWFuIGZpbmRQcm9wZXJ0eSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgcmV0dXJuIChQcm9wZXJ0eUJlYW4pX3Byb3BlcnRpZXMuZ2V0KHByb3BlcnR5TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcHJvcGVydHkgZm9yIHRoaXMgcHJvcGVydHkgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgdGhlIHByb3BlcnR5IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIFByb3BlcnR5QmVhbiBmaW5kUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBQcm9wZXJ0eUJlYW4gcHJvcCA9IGZpbmRQcm9wZXJ0eShwcm9wZXJ0eU5hbWUpOwotICAgIGlmIChwcm9wID09IG51bGwgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgcHJvcCA9IHBhcmVudC5maW5kUHJvcGVydHkocHJvcGVydHlOYW1lLCBmbGF0dGVuKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcHJvcDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IHByb3BlcnRpZXMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc1Byb3BlcnRpZXMoKQotICB7Ci0gICAgcmV0dXJuIGhhc1Byb3BlcnRpZXMoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQotICAgKiBoYXMgYW55IHByb3BlcnRpZXMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgcHJvcGVydGllcywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUHJvcGVydGllcygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBib29sZWFuIGhhc1Byb3BlcnRpZXMgPSAhX3Byb3BlcnRpZXMuaXNFbXB0eSgpOwotCi0gICAgaWYgKCFoYXNQcm9wZXJ0aWVzICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGhhc1Byb3BlcnRpZXMgfD0gcGFyZW50Lmhhc1Byb3BlcnRpZXMoZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc1Byb3BlcnRpZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHByb3BlcnRpZXMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgcHJvcGVydGllcygpCi0gIHsKLSAgICByZXR1cm4gX3Byb3BlcnRpZXMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBwcm9wZXJ0aWVzIG9uIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllcyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwKLSAgICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgcHJvcGVydGllcygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBJdGVyYXRvciBwcm9wZXJ0aWVzID0gcHJvcGVydGllcygpOwotICAgIGlmIChmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICBwcm9wZXJ0aWVzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IocGFyZW50LnByb3BlcnRpZXModHJ1ZSksIHByb3BlcnRpZXMpOwotICAgIH0KLSAgICByZXR1cm4gcHJvcGVydGllczsKLSAgfQotCi0gLyoqCi0gICogTnVtYmVyIG9mIHByb3BlcnRpZXMgZm9yIHRoaXMgY29tcG9uZW50Ci0gICogQHJldHVybiBudW0gb2YgcHJvcGVydGllcwotICAqLwotICBwdWJsaWMgaW50IHByb3BlcnRpZXNTaXplKCkKLSAgewotICAgIHJldHVybiBfcHJvcGVydGllcy5zaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIGZhY2V0IHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gZmFjZXQgIHRoZSBmYWNldCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEZhY2V0KAotICAgIEZhY2V0QmVhbiBmYWNldCkKLSAgewotICAgIF9mYWNldHMucHV0KGZhY2V0LmdldEZhY2V0TmFtZSgpLCBmYWNldCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjZXQgZm9yIHRoaXMgZmFjZXQgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGZhY2V0TmFtZSAgdGhlIGZhY2V0IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIEZhY2V0QmVhbiBmaW5kRmFjZXQoCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkKLSAgewotICAgIHJldHVybiAoRmFjZXRCZWFuKV9mYWNldHMuZ2V0KGZhY2V0TmFtZSk7Ci0gIH0KLQotCi0gIHB1YmxpYyBGYWNldEJlYW4gZmluZEZhY2V0KAotICAgIFN0cmluZyBmYWNldE5hbWUsCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgRmFjZXRCZWFuIGZhY2V0ID0gZmluZEZhY2V0KGZhY2V0TmFtZSk7Ci0gICAgaWYgKGZhY2V0ID09IG51bGwgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgZmFjZXQgPSBwYXJlbnQuZmluZEZhY2V0KGZhY2V0TmFtZSwgZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhY2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGYWNldHMoKQotICB7Ci0gICAgcmV0dXJuIGhhc0ZhY2V0cyhmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqIGhhcyBhbnkgZmFjZXRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IGZhY2V0cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIGJvb2xlYW4gaGFzRmFjZXRzID0gIV9mYWNldHMuaXNFbXB0eSgpOwotCi0gICAgaWYgKCFoYXNGYWNldHMgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgaGFzRmFjZXRzIHw9IHBhcmVudC5oYXNGYWNldHMoZmxhdHRlbik7Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc0ZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBmYWNldCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGZhY2V0cygpCi0gIHsKLSAgICByZXR1cm4gX2ZhY2V0cy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGZhY2V0cyBvbiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mCi0gICogICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMgb2YgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBzdXBlcnR5cGUsCi0gICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgKgotICAqIEByZXR1cm4gIHRoZSBmYWNldCBpdGVyYXRvcgotICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZmFjZXRzKAotICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgSXRlcmF0b3IgZmFjZXRzID0gZmFjZXRzKCk7Ci0gICAgaWYgKGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGZhY2V0cyA9IG5ldyBDb21wb3VuZEl0ZXJhdG9yKGZhY2V0cywgcGFyZW50LmZhY2V0cyh0cnVlKSk7Ci0gICAgfQotICAgIHJldHVybiBmYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogU3BlY2lmaWVzIGlmIHRoZSBjb21wb25lbnQgY2FuIGhhdmUgY2hpbGRyZW4uCi0gICAqCi0gICAqIEBwYXJhbSBjaGlsZHJlbiAgdHJ1ZSAgaWYgdGhlIGNvbXBvbmVudCBjYW4gaGF2ZSBjaGlsZHJlbi4KLSAgICogICAgICAgICAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENoaWxkcmVuKAotICAgIGJvb2xlYW4gY2hpbGRyZW4pCi0gIHsKLSAgICBfY2hpbGRyZW4gPSBjaGlsZHJlbjsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICBpZiB0aGUgY29tcG9uZW50IGNhbiBoYXZlIGNoaWxkcmVuLgotICAgKiAgICAgICAgICBmYWxzZSBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiBfY2hpbGRyZW47Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIGNvbXBvbmVudCBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbXBvbmVudENsYXNzTW9kaWZpZXIoCi0gICAgaW50IG1vZGlmaWVyKQotICB7Ci0gICAgX2NvbXBvbmVudENsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgY29tcG9uZW50IGNsYXNzLgotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIGludCBnZXRDb21wb25lbnRDbGFzc01vZGlmaWVycygpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gX2NvbXBvbmVudENsYXNzTW9kaWZpZXJzOwotCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgIH0KLQotICAgIHJldHVybiBtb2RpZmllcnM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZUNvbXBvbmVudENsYXNzTW9kaWZpZXIoCi0gICAgU3RyaW5nIG1vZGlmaWVyKQotICB7Ci0gICAgYWRkQ29tcG9uZW50Q2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2VUYWdDbGFzc01vZGlmaWVyKAotICAgIFN0cmluZyBtb2RpZmllcikKLSAgewotICAgIGFkZFRhZ0NsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsKLSAgfQotCi0gIHByaXZhdGUgaW50IF9wYXJzZU1vZGlmaWVyKAotICAgIFN0cmluZyB0ZXh0KQotICB7Ci0gICAgaWYgKCJwdWJsaWMiLmVxdWFscyh0ZXh0KSkKLSAgICAgIHJldHVybiBNb2RpZmllci5QVUJMSUM7Ci0gICAgZWxzZSBpZiAoInByb3RlY3RlZCIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBST1RFQ1RFRDsKLSAgICBlbHNlIGlmICgicHJpdmF0ZSIuZXF1YWxzKHRleHQpKQotICAgICAgcmV0dXJuIE1vZGlmaWVyLlBSSVZBVEU7Ci0gICAgZWxzZSBpZiAoImFic3RyYWN0Ii5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuQUJTVFJBQ1Q7Ci0gICAgZWxzZSBpZiAoImZpbmFsIi5lcXVhbHModGV4dCkpCi0gICAgICByZXR1cm4gTW9kaWZpZXIuRklOQUw7Ci0KLSAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnJlY29nbml6ZWQgbW9kaWZpZXI6ICIgKyB0ZXh0KTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBjb21wb25lbnQgaW50byBhIFN0cmluZyBhcnJheQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRBZ2VudHMgIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMKLSAgICovCi0gIHB1YmxpYyB2b2lkIHBhcnNlVW5zdXBwb3J0ZWRBZ2VudHMoCi0gICAgU3RyaW5nIHVuc3VwcG9ydGVkQWdlbnRzKQotICB7Ci0gICAgc2V0VW5zdXBwb3J0ZWRBZ2VudHModW5zdXBwb3J0ZWRBZ2VudHMuc3BsaXQoIiAiKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBZGRzIGEgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllciB0byB0aGUgdGFnIGNsYXNzLgotICAgKgotICAgKiBAcGFyYW0gbW9kaWZpZXIgIHRoZSBtb2RpZmllciB0byBiZSBhZGRlZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkVGFnQ2xhc3NNb2RpZmllcigKLSAgICBpbnQgbW9kaWZpZXIpCi0gIHsKLSAgICBfdGFnQ2xhc3NNb2RpZmllcnMgfD0gbW9kaWZpZXI7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSB0YWcgY2xhc3MuCi0gICAqIEJ5IGRlZmF1bHQsIHRoZXNlIG1vZGlmaWVycyBpbmNsdWRlIE1vZGlmaWVyLlBVQkxJQy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdGFnIGNsYXNzCi0gICAqLwotICBwdWJsaWMgaW50IGdldFRhZ0NsYXNzTW9kaWZpZXJzKCkKLSAgewotICAgIGludCBtb2RpZmllcnMgPSBfdGFnQ2xhc3NNb2RpZmllcnM7Ci0KLSAgICBpZiAoIU1vZGlmaWVyLmlzUHJpdmF0ZShtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1Byb3RlY3RlZChtb2RpZmllcnMpICYmCi0gICAgICAgICFNb2RpZmllci5pc1B1YmxpYyhtb2RpZmllcnMpKQotICAgIHsKLSAgICAgIG1vZGlmaWVycyB8PSBNb2RpZmllci5QVUJMSUM7Ci0gICAgfQotCi0gICAgcmV0dXJuIG1vZGlmaWVyczsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRSZWYgIHRoZSBldmVudCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEV2ZW50KAotICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZikKLSAgewotICAgIGlmIChldmVudFJlZi5nZXRFdmVudFR5cGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIF9MT0cud2FybmluZygiTWlzc2luZyBldmVudCB0eXBlIGluIGNvbXBvbmVudCBcIiIgKwotICAgICAgICAgICAgICAgICAgIF9jb21wb25lbnRUeXBlICsgIlwiIik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBfZXZlbnRzLnB1dChldmVudFJlZi5nZXRFdmVudFR5cGUoKSwgZXZlbnRSZWYpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBjb21wb25lbnQgaGFzIGFueSBldmVudHMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGV2ZW50cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXZlbnRzKCkKLSAgewotICAgIHJldHVybiBoYXNFdmVudHMoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQotICAgKiBoYXMgYW55IGV2ZW50cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBzdXBlcnR5cGUgaGFzIGFueSBldmVudHMsCi0gICAqICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0V2ZW50cygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBib29sZWFuIGhhc0V2ZW50cyA9ICFfZXZlbnRzLmlzRW1wdHkoKTsKLQotICAgIGlmICghaGFzRXZlbnRzICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGhhc0V2ZW50cyB8PSBwYXJlbnQuaGFzRXZlbnRzKGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBoYXNFdmVudHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgZm9yIHRoaXMgZXZlbnQgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50TmFtZSAgdGhlIGV2ZW50IG5hbWUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIEV2ZW50QmVhbiBmaW5kRXZlbnQoCi0gICAgU3RyaW5nIGV2ZW50TmFtZSkKLSAgewotICAgIHJldHVybiAoRXZlbnRCZWFuKV9ldmVudHMuZ2V0KGV2ZW50TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgRXZlbnRCZWFuIGZpbmRFdmVudCgKLSAgICBTdHJpbmcgZXZlbnROYW1lLAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEV2ZW50QmVhbiBldmVudCA9IGZpbmRFdmVudChldmVudE5hbWUpOwotICAgIGlmIChldmVudCA9PSBudWxsICYmIGZsYXR0ZW4pCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSByZXNvbHZlU3VwZXJ0eXBlKCk7Ci0gICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgIGV2ZW50ID0gcGFyZW50LmZpbmRFdmVudChldmVudE5hbWUsIGZsYXR0ZW4pOwotICAgIH0KLQotICAgIHJldHVybiBldmVudDsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBldmVudHMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZXZlbnRzKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgZXZlbnRzIG9uIHRoaXMgY29tcG9uZW50LgotICAgKgotICAqIEBwYXJhbSBmbGF0dGVuICB0cnVlICAgaWYgdGhlIGl0ZXJhdG9yIHNob3VsZCBiZSBhIGNvbWJpbmVkIGxpc3Qgb2YKLSAgKiAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50cyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwKLSAgKiAgICAgICAgICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAqCi0gICogQHJldHVybiAgdGhlIGV2ZW50IGl0ZXJhdG9yCi0gICovCi0gIHB1YmxpYyBJdGVyYXRvciBldmVudHMoCi0gICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBJdGVyYXRvciBldmVudHMgPSBldmVudHMoKTsKLSAgICBpZiAoZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgZXZlbnRzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoZXZlbnRzLCBwYXJlbnQuZXZlbnRzKHRydWUpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV2ZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgY29tcG9uZW50IGZhbWlseSBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZENvbXBvbmVudEZhbWlseSgpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudEZhbWlseSAhPSBudWxsKQotICAgICAgcmV0dXJuIF9jb21wb25lbnRGYW1pbHk7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kQ29tcG9uZW50RmFtaWx5KCkgOiBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudCBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgYmVoYXZpb3JhbCBjb21wb25lbnQKLSAgICovCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIGZpbmRCZWhhdmlvcmFsQ29tcG9uZW50KCkKLSAgewotICAgIGlmIChfY29tcG9uZW50RmFtaWx5ICE9IG51bGwpCi0gICAgICByZXR1cm4gdGhpczsKLQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAoY29tcG9uZW50ICE9IG51bGwpID8gY29tcG9uZW50LmZpbmRCZWhhdmlvcmFsQ29tcG9uZW50KCkgOiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSByZW5kZXJlciB0eXBlIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kUmVuZGVyZXJUeXBlKCkKLSAgewotICAgIGlmIChfcmVuZGVyZXJUeXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gX3JlbmRlcmVyVHlwZTsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRSZW5kZXJlclR5cGUoKSA6IG51bGw7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgY29tcG9uZW50IHN1cGVyY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kQ29tcG9uZW50U3VwZXJjbGFzcygpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudFN1cGVyY2xhc3MgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfY29tcG9uZW50U3VwZXJjbGFzczsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRDb21wb25lbnRDbGFzcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAoaXNUcmluaWRhZENvbXBvbmVudCgpID8gCi0gICAgICAgICAgICAgICAgICAgX1RSSU5JREFEX0NPTVBPTkVOVF9CQVNFIDogX0pTRl9DT01QT05FTlRfQkFTRSk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHRhZyBzdXBlcmNsYXNzIGluIHRoZSBjb21wb25lbnQgaW5oZXJpdGFuY2UKLSAgICogaGllcmFyY2h5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdGFnIHN1cGVyY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZmluZEpzcFRhZ1N1cGVyY2xhc3MoKQotICB7Ci0gICAgaWYgKF90YWdTdXBlcmNsYXNzICE9IG51bGwpCi0gICAgICByZXR1cm4gX3RhZ1N1cGVyY2xhc3M7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kSnNwVGFnQ2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogKGlzVHJpbmlkYWRDb21wb25lbnQoKSA/Ci0gICAgICAgICAgICAgICAgICBfVFJJTklEQURfQ09NUE9ORU5UX1RBRyA6IF9KU0ZfQ09NUE9ORU5UX1RBRyk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29tcG9uZW50IHN1cGVydHlwZSBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBzdXBlcnR5cGUgaW5zdGFuY2UKLSAgICovCi0gIHB1YmxpYyBDb21wb25lbnRCZWFuIHJlc29sdmVTdXBlcnR5cGUoKQotICB7Ci0gICAgaWYgKF9jb21wb25lbnRTdXBlcnR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyID0gZ2V0T3duZXIoKTsKLSAgICByZXR1cm4gKG93bmVyICE9IG51bGwpID8gb3duZXIuZmluZENvbXBvbmVudChfY29tcG9uZW50U3VwZXJ0eXBlKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIGlmIGFueSBvZiB0aGUgY29tcG9uZW50IHN1cGVyY2xhc3NlcyBpcyBVSVhDb21wb25lbnRCYXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc1RyaW5pZGFkQ29tcG9uZW50KCkKLSAgewotICAgIFN0cmluZyBpbXBsZW1lbnRhdGlvblR5cGUgPSBnZXRJbXBsZW1lbnRhdGlvblR5cGUoKTsKLSAgICBpZiAoaW1wbGVtZW50YXRpb25UeXBlICE9IG51bGwpCi0gICAgICByZXR1cm4gInRyaW5pZGFkIi5lcXVhbHMoaW1wbGVtZW50YXRpb25UeXBlKTsKLQotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50U3VwZXJ0eXBlID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIGlmIChjb21wb25lbnRTdXBlcnR5cGUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAoX1RSSU5JREFEX0NPTVBPTkVOVF9CQVNFLmVxdWFscyhjb21wb25lbnRTdXBlcnR5cGUuZ2V0Q29tcG9uZW50Q2xhc3MoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gY29tcG9uZW50U3VwZXJ0eXBlLmlzVHJpbmlkYWRDb21wb25lbnQoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmRzIHRoZSBjb21wb25lbnQgY2xhc3MgaW4gdGhlIGNvbXBvbmVudCBpbmhlcml0YW5jZQotICAgKiBoaWVyYXJjaHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgY2xhc3MKLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgZmluZENvbXBvbmVudENsYXNzKCkKLSAgewotICAgIGlmIChfY29tcG9uZW50Q2xhc3MgIT0gbnVsbCkKLSAgICAgIHJldHVybiBfY29tcG9uZW50Q2xhc3M7Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IHJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICByZXR1cm4gKHBhcmVudCAhPSBudWxsKSA/IHBhcmVudC5maW5kQ29tcG9uZW50Q2xhc3MoKSA6IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHRhZyBjbGFzcyBpbiB0aGUgY29tcG9uZW50IGluaGVyaXRhbmNlCi0gICAqIGhpZXJhcmNoeS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHRhZyBjbGFzcwotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBmaW5kSnNwVGFnQ2xhc3MoKQotICB7Ci0gICAgaWYgKF90YWdDbGFzcyAhPSBudWxsKQotICAgICAgcmV0dXJuIF90YWdDbGFzczsKLQotICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gcmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIHJldHVybiAocGFyZW50ICE9IG51bGwpID8gcGFyZW50LmZpbmRKc3BUYWdDbGFzcygpIDogbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBBdHRhY2hlcyB0aGUgY29tcG9uZW50IGFuZCBhbGwgZXZlbnQgcmVmZXJlbmNlcy4KLSAgICoKLSAgICogQHBhcmFtIG93bmVyICB0aGUgZmFjZXMgY29uZmlnIG93bmVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2goCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyKQotICB7Ci0gICAgc3VwZXIuYXR0YWNoKG93bmVyKTsKLSAgICBJdGVyYXRvciBldmVudHMgPSBldmVudHMoZmFsc2UpOwotICAgIHdoaWxlIChldmVudHMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIEV2ZW50UmVmQmVhbiBldmVudFJlZiA9IChFdmVudFJlZkJlYW4pZXZlbnRzLm5leHQoKTsKLSAgICAgIGV2ZW50UmVmLmF0dGFjaChvd25lcik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50Q2xhc3NFeGNsdWRlZChib29sZWFuIGNvbXBvbmVudENsYXNzRXhjbHVkZWQpCi0gIHsKLSAgICBfY29tcG9uZW50Q2xhc3NFeGNsdWRlZCA9IGNvbXBvbmVudENsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0NvbXBvbmVudENsYXNzRXhjbHVkZWQoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRDbGFzc0V4Y2x1ZGVkOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzc0V4Y2x1ZGVkKGJvb2xlYW4gdGFnQ2xhc3NFeGNsdWRlZCkKLSAgewotICAgIF90YWdDbGFzc0V4Y2x1ZGVkID0gdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVGFnQ2xhc3NFeGNsdWRlZCgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRDb21wb25lbnRJbXBsZW1lbnRzKFN0cmluZyBjb21wb25lbnRJbXBsZW1lbnRzKQotICB7Ci0gICAgdGhpcy5fY29tcG9uZW50SW1wbGVtZW50cyA9IGNvbXBvbmVudEltcGxlbWVudHM7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudEltcGxlbWVudHMoKQotICB7Ci0gICAgcmV0dXJuIF9jb21wb25lbnRJbXBsZW1lbnRzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50U2VyaWFsVUlEKFN0cmluZyBjb21wb25lbnRTZXJpYWxVSUQpCi0gIHsKLSAgICB0aGlzLl9jb21wb25lbnRTZXJpYWxVSUQgPSBjb21wb25lbnRTZXJpYWxVSUQ7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldENvbXBvbmVudFNlcmlhbFVJRCgpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudFNlcmlhbFVJRDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9jb21wb25lbnRTZXJpYWxVSUQ7Ci0gIHByaXZhdGUgU3RyaW5nIF9jb21wb25lbnRJbXBsZW1lbnRzOwotICBwcml2YXRlIGJvb2xlYW4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBfY29tcG9uZW50Q2xhc3NFeGNsdWRlZDsgIAotICBwcml2YXRlIFN0cmluZyAgX2Rlc2NyaXB0aW9uOwotICBwcml2YXRlIFN0cmluZyAgX2xvbmdEZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRUeXBlOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudEZhbWlseTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRTdXBlcnR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nICBfY29tcG9uZW50U3VwZXJjbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJlclR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nICBfaW1wbGVtZW50YXRpb25UeXBlOwotICBwcml2YXRlIFFOYW1lICAgX3RhZ05hbWU7Ci0gIHByaXZhdGUgU3RyaW5nICBfdGFnQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfdGFnSGFuZGxlcjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF90YWdTdXBlcmNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX2xvY2FsTmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9ub2RlQ2xhc3M7Ci0gIHByaXZhdGUgYm9vbGVhbiBfbmFtaW5nQ29udGFpbmVyOwotICBwcml2YXRlIGJvb2xlYW4gX2NoaWxkcmVuID0gdHJ1ZTsKLSAgcHJpdmF0ZSBNYXAgICAgIF9wcm9wZXJ0aWVzOwotICBwcml2YXRlIE1hcCAgICAgX2ZhY2V0czsKLSAgcHJpdmF0ZSBNYXAgICAgIF9ldmVudHM7Ci0gIHByaXZhdGUgaW50ICAgICBfY29tcG9uZW50Q2xhc3NNb2RpZmllcnM7Ci0gIHByaXZhdGUgaW50ICAgICBfdGFnQ2xhc3NNb2RpZmllcnM7Ci0gIHByaXZhdGUgU3RyaW5nW10gX3Vuc3VwcG9ydGVkQWdlbnRzID0gbmV3IFN0cmluZ1swXTsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1RSSU5JREFEX0NPTVBPTkVOVF9CQVNFID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbXBvbmVudC5VSVhDb21wb25lbnRCYXNlIjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX1RSSU5JREFEX0NPTVBPTkVOVF9UQUcgPQotICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQud2ViYXBwLlVJWENvbXBvbmVudFRhZyI7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9KU0ZfQ09NUE9ORU5UX0JBU0UgPQotICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC5mYWNlcy5jb21wb25lbnQuVUlDb21wb25lbnRCYXNlIjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0pTRl9DT01QT05FTlRfVEFHID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAiamF2YXguZmFjZXMud2ViYXBwLlVJQ29tcG9uZW50VGFnIjsKLSAgCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvZ2dlciBfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihDb21wb25lbnRCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29udmVydGVyQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0NvbnZlcnRlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWM2NTFlMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvQ29udmVydGVyQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBDb252ZXJ0ZXJCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIGNvbnZlcnRlcgotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBDb252ZXJ0ZXJCZWFuIGV4dGVuZHMgQWJzdHJhY3RUYWdCZWFuCi17Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbnZlcnRlciBpZGVudGlmZXIgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29udmVydGVySWQgIGNvbnZlcnRlciBpZGVudGlmZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlcklkKAotICAgIFN0cmluZyBjb252ZXJ0ZXJJZCkKLSAgewotICAgIF9jb252ZXJ0ZXJJZCA9IGNvbnZlcnRlcklkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29udmVydGVyIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLCBvdGhlcndpc2UgZmFsc2UuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgaWYgdGhlIGNvbnZlcnRlciBpZGVudGlmaWVyIGlzIHNwZWNpZmllZCwKLSAgICogICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQ29udmVydGVySWQoKQotICB7Ci0gICAgcmV0dXJuIChfY29udmVydGVySWQgIT0gbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgY29udmVydGVyIGlkZW50aWZpZXIgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29udmVydGVyIGlkZW50aWZpZXIKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVySWQoKQotICB7Ci0gICAgcmV0dXJuIF9jb252ZXJ0ZXJJZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb252ZXJ0ZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29udmVydGVyQ2xhc3MgIHRoZSBjb252ZXJ0ZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbnZlcnRlckNsYXNzKAotICAgIFN0cmluZyBjb252ZXJ0ZXJDbGFzcykKLSAgewotICAgIF9jb252ZXJ0ZXJDbGFzcyA9IGNvbnZlcnRlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbnZlcnRlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb252ZXJ0ZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29udmVydGVyQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9jb252ZXJ0ZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gY29udmVydGVyU3VwZXJDbGFzcyAgdGhlIGNvbnZlcnRlciBzdXBlciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29udmVydGVyU3VwZXJDbGFzcygKLSAgICBTdHJpbmcgY29udmVydGVyU3VwZXJDbGFzcykKLSAgewotICAgIF9jb252ZXJ0ZXJTdXBlckNsYXNzID0gY29udmVydGVyU3VwZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb252ZXJ0ZXIgc3VwZXIgY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29udmVydGVyIHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldENvbnZlcnRlclN1cGVyQ2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9jb252ZXJ0ZXJTdXBlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVyIHRvIHRoZSBjb252ZXJ0ZXIgY2xhc3MuCi0gICAqCi0gICAqIEBwYXJhbSBtb2RpZmllciAgdGhlIG1vZGlmaWVyIHRvIGJlIGFkZGVkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRDb252ZXJ0ZXJDbGFzc01vZGlmaWVyKAotICAgIGludCBtb2RpZmllcikKLSAgewotICAgIF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVycyB8PSBtb2RpZmllcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIGNvbnZlcnRlciBjbGFzcy4KLSAgICogQnkgZGVmYXVsdCwgdGhlc2UgbW9kaWZpZXJzIGluY2x1ZGUgTW9kaWZpZXIuUFVCTElDLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSmF2YSBMYW5ndWFnZSBjbGFzcyBtb2RpZmllcnMgZm9yIHRoZSBjb252ZXJ0ZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q29udmVydGVyQ2xhc3NNb2RpZmllcnMoKQotICB7Ci0gICAgaW50IG1vZGlmaWVycyA9IF9jb252ZXJ0ZXJDbGFzc01vZGlmaWVyczsKLQotICAgIGlmICghTW9kaWZpZXIuaXNQcml2YXRlKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHJvdGVjdGVkKG1vZGlmaWVycykgJiYKLSAgICAgICAgIU1vZGlmaWVyLmlzUHVibGljKG1vZGlmaWVycykpCi0gICAgewotICAgICAgbW9kaWZpZXJzIHw9IE1vZGlmaWVyLlBVQkxJQzsKLSAgICB9Ci0KLSAgICByZXR1cm4gbW9kaWZpZXJzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcGFyc2VDb252ZXJ0ZXJDbGFzc01vZGlmaWVyKAotICAgIFN0cmluZyBtb2RpZmllcikKLSAgewotICAgIGFkZENvbnZlcnRlckNsYXNzTW9kaWZpZXIoX3BhcnNlTW9kaWZpZXIobW9kaWZpZXIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFRhZ0NsYXNzRXhjbHVkZWQoYm9vbGVhbiB0YWdDbGFzc0V4Y2x1ZGVkKQotICB7Ci0gICAgX3RhZ0NsYXNzRXhjbHVkZWQgPSB0YWdDbGFzc0V4Y2x1ZGVkOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNUYWdDbGFzc0V4Y2x1ZGVkKCkKLSAgewotICAgIHJldHVybiBfdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBfdGFnQ2xhc3NFeGNsdWRlZDsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb252ZXJ0ZXJJZDsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb252ZXJ0ZXJDbGFzczsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb252ZXJ0ZXJTdXBlckNsYXNzOwotICBwcml2YXRlIGludCAgICAgX2NvbnZlcnRlckNsYXNzTW9kaWZpZXJzOwotCi0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgTG9nZ2VyIF9MT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvbnZlcnRlckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9FdmVudEJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWUwMmQwNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5VdGlsOwotCi0vKioKLSAqIEV2ZW50QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZy1leHRlbnNpb24KLSAqIGV2ZW50IFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRXZlbnRCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gVXRpbC5nZXRFdmVudE5hbWVGcm9tRXZlbnRUeXBlKF9ldmVudFR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBldmVudCB0eXBlIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnRUeXBlICB0aGUgZXZlbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRUeXBlKAotICAgIFN0cmluZyBldmVudFR5cGUpCi0gIHsKLSAgICBfZXZlbnRUeXBlID0gZXZlbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IHR5cGUgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBldmVudCBjbGFzcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50TmFtZSAgdGhlIGV2ZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudENsYXNzKAotICAgIFN0cmluZyBldmVudENsYXNzKQotICB7Ci0gICAgX2V2ZW50Q2xhc3MgPSBldmVudENsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGNsYXNzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX2V2ZW50Q2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZXZlbnQgbGlzdGVuZXIgY2xhc3MgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudExpc3RlbmVyQ2xhc3MgIHRoZSBldmVudCBsaXN0ZW5lciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RXZlbnRMaXN0ZW5lckNsYXNzKAotICAgIFN0cmluZyBldmVudExpc3RlbmVyQ2xhc3MpCi0gIHsKLSAgICBfZXZlbnRMaXN0ZW5lckNsYXNzID0gZXZlbnRMaXN0ZW5lckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IGxpc3RlbmVyIGNsYXNzIGZvciB0aGlzIGV2ZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgbGlzdGVuZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRMaXN0ZW5lckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudFNvdXJjZUludGVyZmFjZSAgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldEV2ZW50U291cmNlSW50ZXJmYWNlKAotICAgIFN0cmluZyBldmVudFNvdXJjZUludGVyZmFjZSkKLSAgewotICAgIF9ldmVudFNvdXJjZUludGVyZmFjZSA9IGV2ZW50U291cmNlSW50ZXJmYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2UgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBzb3VyY2UgaW50ZXJmYWNlCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEV2ZW50U291cmNlSW50ZXJmYWNlKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRTb3VyY2VJbnRlcmZhY2U7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nIF9ldmVudFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nIF9ldmVudENsYXNzOwotICBwcml2YXRlIFN0cmluZyBfZXZlbnRMaXN0ZW5lckNsYXNzOwotICBwcml2YXRlIFN0cmluZyBfZXZlbnRTb3VyY2VJbnRlcmZhY2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRSZWZCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRXZlbnRSZWZCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NzE3ZTYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0V2ZW50UmVmQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuVXRpbDsKLQotLyoqCi0gKiBFdmVudEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50LWV4dGVuc2lvbgotICogZXZlbnQgWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBFdmVudFJlZkJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnROYW1lKCkKLSAgewotICAgIHJldHVybiBVdGlsLmdldEV2ZW50TmFtZUZyb21FdmVudFR5cGUoX2V2ZW50VHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudCByZWZlcmVuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBldmVudFR5cGUgIHRoZSBldmVudCB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudFR5cGUoCi0gICAgU3RyaW5nIGV2ZW50VHlwZSkKLSAgewotICAgIF9ldmVudFR5cGUgPSBldmVudFR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgdHlwZSBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RXZlbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlbGl2ZXJ5IHBoYXNlcyBmb3IgdGhpcyBldmVudC4KLSAgICoKLSAgICogQHBhcmFtIGRlbGl2ZXJ5UGhhc2VzICB0aGUgZXZlbnQgZGVsaXZlcnkgcGhhc2VzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRFdmVudERlbGl2ZXJ5UGhhc2VzKAotICAgIFN0cmluZ1tdIGRlbGl2ZXJ5UGhhc2VzKQotICB7Ci0gICAgaWYgKChfZGVsaXZlcnlQaGFzZXMgIT0gbnVsbCkgJiYgKF9kZWxpdmVyeVBoYXNlcy5sZW5ndGggPiAwKSkKLSAgICB7Ci0gICAgICBpbnQgb2xkTGVuID0gX2RlbGl2ZXJ5UGhhc2VzLmxlbmd0aDsKLSAgICAgIGludCBuZXdMZW4gPSBkZWxpdmVyeVBoYXNlcy5sZW5ndGg7Ci0gICAgICBTdHJpbmdbXSBuZXdEZWxpdmVyeVBoYXNlcyA9IG5ldyBTdHJpbmdbb2xkTGVuICsgbmV3TGVuXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoX2RlbGl2ZXJ5UGhhc2VzLCAwLCBuZXdEZWxpdmVyeVBoYXNlcywgMCwgb2xkTGVuKTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoZGVsaXZlcnlQaGFzZXMsIDAsIG5ld0RlbGl2ZXJ5UGhhc2VzLCBvbGRMZW4sIG5ld0xlbik7Ci0gICAgICBfZGVsaXZlcnlQaGFzZXMgPSBuZXdEZWxpdmVyeVBoYXNlczsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF9kZWxpdmVyeVBoYXNlcyA9IGRlbGl2ZXJ5UGhhc2VzOwotICAgIH0KLSAgICAKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZWxpdmVyeSBwaGFzZXMgZm9yIHRoaXMgZXZlbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBldmVudCBkZWxpdmVyeSBwaGFzZXMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRFdmVudERlbGl2ZXJ5UGhhc2VzKCkKLSAgewotICAgIHJldHVybiBfZGVsaXZlcnlQaGFzZXM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBhdXRvbWF0aWNhbGx5IGltcGxlbWVudAotICAgKiB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZSBvbiB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudCBzb3VyY2UuCi0gICAqCi0gICAqIEBwYXJhbSBpZ25vcmVTb3VyY2VJbnRlcmZhY2UgIHRydWUsICB0byBpZ25vcmUgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2U7Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldElnbm9yZVNvdXJjZUludGVyZmFjZSgKLSAgICBib29sZWFuIGlnbm9yZVNvdXJjZUludGVyZmFjZSkKLSAgewotICAgIF9pZ25vcmVTb3VyY2VJbnRlcmZhY2UgPSBpZ25vcmVTb3VyY2VJbnRlcmZhY2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGZsYWcgaW5kaWNhdGluZyB3aGV0aGVyIG9yIG5vdCB0byBhdXRvbWF0aWNhbGx5IGltcGxlbWVudAotICAgKiB0aGUgZXZlbnQgc291cmNlIGludGVyZmFjZSBvbiB0aGUgZ2VuZXJhdGVkIGNvbXBvbmVudCBzb3VyY2UuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUsICB0byBpZ25vcmUgdGhlIGV2ZW50IHNvdXJjZSBpbnRlcmZhY2U7Ci0gICAqICAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSWdub3JlU291cmNlSW50ZXJmYWNlKCkKLSAgewotICAgIHJldHVybiBfaWdub3JlU291cmNlSW50ZXJmYWNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlc29sdmVzIHRoZSBldmVudCB0eXBlLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgZXZlbnQgd2l0aCB0aGUgcmVmZXJlbmNpbmcgZXZlbnQgdHlwZSwKLSAgICogICAgICAgICAgb3IgbnVsbCBpZiBub3QgZm91bmQKLSAgICovCi0gIHB1YmxpYyBFdmVudEJlYW4gcmVzb2x2ZUV2ZW50VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gZ2V0T3duZXIoKS5maW5kRXZlbnQoX2V2ZW50VHlwZSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgIF9ldmVudFR5cGU7Ci0gIHByaXZhdGUgU3RyaW5nW10gX2RlbGl2ZXJ5UGhhc2VzOwotICBwcml2YXRlIGJvb2xlYW4gIF9pZ25vcmVTb3VyY2VJbnRlcmZhY2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRmYTEwZmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzE1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogRmFjZXNDb25maWdCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgRmFjZXNDb25maWdCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQWRkcyBhIGNvbnZlcnRlciB0byB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbnZlcnRlciAgdGhlIGNvbnZlcnRlciB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZENvbnZlcnRlcigKLSAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgewotICAgIGNvbnZlcnRlci5hdHRhY2godGhpcyk7Ci0gICAgaWYgKGNvbnZlcnRlci5oYXNDb252ZXJ0ZXJJZCgpKQotICAgICAgX2NvbnZlcnRlcnMucHV0KGNvbnZlcnRlci5nZXRDb252ZXJ0ZXJJZCgpLCBjb252ZXJ0ZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGNvbnZlcnRlciBmb3IgdGhpcyBjb252ZXJ0ZXIgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIGNvbnZlcnRlcklkICB0aGUgY29udmVydGVyIHR5cGUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIENvbnZlcnRlckJlYW4gZmluZENvbnZlcnRlcigKLSAgICBTdHJpbmcgY29udmVydGVySWQpCi0gIHsKLSAgICByZXR1cm4gKENvbnZlcnRlckJlYW4pX2NvbnZlcnRlcnMuZ2V0KGNvbnZlcnRlcklkKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSBjb252ZXJ0ZXJzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgY29udmVydGVycywKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGhhc0NvbnZlcnRlcnMoKQotICB7Ci0gICAgcmV0dXJuICFfY29udmVydGVycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGNvbnZlcnRlcnMgaW4gdGhpcyBmYWNlcwotICAgKiBjb25maWcuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb252ZXJ0ZXIgaXRlcmF0b3IKLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvciBjb252ZXJ0ZXJzKCkKLSAgewotICAgIHJldHVybiBfY29udmVydGVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSB2YWxpZGF0b3IgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWxpZGF0b3IgIHRoZSB2YWxpZGF0b3IgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRWYWxpZGF0b3IoCi0gICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpCi0gIHsKLSAgICB2YWxpZGF0b3IuYXR0YWNoKHRoaXMpOwotICAgIGlmICh2YWxpZGF0b3IuaGFzVmFsaWRhdG9ySWQoKSkKLSAgICAgIF92YWxpZGF0b3JzLnB1dCh2YWxpZGF0b3IuZ2V0VmFsaWRhdG9ySWQoKSwgdmFsaWRhdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgZm9yIHRoaXMgdmFsaWRhdG9yIHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JJZCAgdGhlIHZhbGlkYXRvciB0eXBlIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBWYWxpZGF0b3JCZWFuIGZpbmRWYWxpZGF0b3IoCi0gICAgU3RyaW5nIHZhbGlkYXRvcklkKQotICB7Ci0gICAgcmV0dXJuIChWYWxpZGF0b3JCZWFuKV92YWxpZGF0b3JzLmdldCh2YWxpZGF0b3JJZCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgdmFsaWRhdG9ycy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHZhbGlkYXRvcnMsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZGF0b3JzKCkKLSAgewotICAgIHJldHVybiAhX3ZhbGlkYXRvcnMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCB2YWxpZGF0b3JzIGluIHRoaXMgZmFjZXMKLSAgICogY29uZmlnLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdmFsaWRhdG9yIGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgdmFsaWRhdG9ycygpCi0gIHsKLSAgICByZXR1cm4gX3ZhbGlkYXRvcnMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgY29tcG9uZW50IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gY29tcG9uZW50ICB0aGUgY29tcG9uZW50IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkQ29tcG9uZW50KAotICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICB7Ci0gICAgLy8gR2VuZXJpYyAiaW5jbHVkZXMiIHdpbGwgbm90IGhhdmUgYSBjb21wb25lbnQgdHlwZQotICAgIGlmIChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpICE9IG51bGwpCi0gICAgewotICAgICAgY29tcG9uZW50LmF0dGFjaCh0aGlzKTsKLSAgICAgIF9jb21wb25lbnRzLnB1dChjb21wb25lbnQuZ2V0Q29tcG9uZW50VHlwZSgpLCBjb21wb25lbnQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgZm9yIHRoaXMgY29tcG9uZW50IHR5cGUuCi0gICAqCi0gICAqIEBwYXJhbSBjb21wb25lbnRUeXBlICB0aGUgY29tcG9uZW50IHR5cGUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIENvbXBvbmVudEJlYW4gZmluZENvbXBvbmVudCgKLSAgICBTdHJpbmcgY29tcG9uZW50VHlwZSkKLSAgewotICAgIHJldHVybiAoQ29tcG9uZW50QmVhbilfY29tcG9uZW50cy5nZXQoY29tcG9uZW50VHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgY29tcG9uZW50cy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IGNvbXBvbmVudHMsCi0gICAqICAgICAgICAgb3RoZXJ3aXNlIGZhbHNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNDb21wb25lbnRzKCkKLSAgewotICAgIHJldHVybiAhX2NvbXBvbmVudHMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGFsbCBjb21wb25lbnRzIGluIHRoaXMgZmFjZXMKLSAgICogY29uZmlnLgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgY29tcG9uZW50IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgY29tcG9uZW50cygpCi0gIHsKLSAgICByZXR1cm4gX2NvbXBvbmVudHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGFuIGV2ZW50IHRvIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gZXZlbnQgIHRoZSBldmVudCB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEV2ZW50KAotICAgIEV2ZW50QmVhbiBldmVudCkKLSAgewotICAgIGlmIChldmVudC5nZXRFdmVudFR5cGUoKSA9PSBudWxsKQotICAgIHsKLSAgICAgIF93YXJuaW5nKCJNaXNzaW5nIGV2ZW50IHR5cGUiKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoZXZlbnQuZ2V0RXZlbnRMaXN0ZW5lckNsYXNzKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfd2FybmluZygiRXZlbnQgXCIiICsgZXZlbnQuZ2V0RXZlbnRUeXBlKCkgKyAiXCIgIiArCi0gICAgICAgICAgICAgICAgICAgImhhcyBubyBsaXN0ZW5lciBjbGFzcyIpOwotICAgIH0KLSAgICBlbHNlIGlmIChldmVudC5nZXRFdmVudENsYXNzKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBfd2FybmluZygiRXZlbnQgXCIiICsgZXZlbnQuZ2V0RXZlbnRUeXBlKCkgKyAiXCIgIiArCi0gICAgICAgICAgICAgICAgICAgImhhcyBubyBldmVudCBjbGFzcyIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgZXZlbnQuYXR0YWNoKHRoaXMpOwotICAgICAgX2V2ZW50cy5wdXQoZXZlbnQuZ2V0RXZlbnRUeXBlKCksIGV2ZW50KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dhcm5pbmcoU3RyaW5nIHMpCi0gIHsKLSAgICBfTE9HLndhcm5pbmcocysiXG4gIHBhcnNpbmcgcmVzb3VyY2U6IitnZXRDdXJyZW50UmVzb3VyY2UoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZXZlbnQgZm9yIHRoaXMgZXZlbnQgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIGV2ZW50VHlwZSAgdGhlIGV2ZW50IHR5cGUgdG8gZmluZAotICAgKi8KLSAgcHVibGljIEV2ZW50QmVhbiBmaW5kRXZlbnQoCi0gICAgU3RyaW5nIGV2ZW50VHlwZSkKLSAgewotICAgIHJldHVybiAoRXZlbnRCZWFuKV9ldmVudHMuZ2V0KGV2ZW50VHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgZXZlbnRzLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgIGlmIHRoaXMgZmFjZXMgY29uZmlnIGhhcyBhbnkgZXZlbnRzLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRXZlbnRzKCkKLSAgewotICAgIHJldHVybiAhX2V2ZW50cy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGV2ZW50cyBpbiB0aGlzIGZhY2VzCi0gICAqIGNvbmZpZy4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGV2ZW50IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZXZlbnRzKCkKLSAgewotICAgIHJldHVybiBfZXZlbnRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIHJlbmRlciBraXQgdG8gdGhpcyBmYWNlcyBjb25maWcgZG9jdW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJLaXQgIHRoZSByZW5kZXIga2l0IHRvIGFkZAotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkUmVuZGVyS2l0KAotICAgIFJlbmRlcktpdEJlYW4gcmVuZGVyS2l0KQotICB7Ci0gICAgU3RyaW5nIHJlbmRlcktpdElkID0gcmVuZGVyS2l0LmdldFJlbmRlcktpdElkKCk7Ci0gICAgUmVuZGVyS2l0QmVhbiBleGlzdGluZyA9IGZpbmRSZW5kZXJLaXQocmVuZGVyS2l0SWQpOwotCi0gICAgaWYgKGV4aXN0aW5nID09IG51bGwpCi0gICAgewotICAgICAgcmVuZGVyS2l0LmF0dGFjaCh0aGlzKTsKLSAgICAgIF9yZW5kZXJLaXRzLnB1dChyZW5kZXJLaXRJZCwgcmVuZGVyS2l0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIGV4aXN0aW5nLmFkZEFsbFJlbmRlcmVycyhyZW5kZXJLaXQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZW5kZXIga2l0IGZvciB0aGlzIHJlbmRlciBraXQgaWQuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJLaXRJZCAgdGhlIHJlbmRlciBraXQgaWQgdG8gZmluZAotICAgKi8KLSAgcHVibGljIFJlbmRlcktpdEJlYW4gZmluZFJlbmRlcktpdCgKLSAgICBTdHJpbmcgcmVuZGVyS2l0SWQpCi0gIHsKLSAgICByZXR1cm4gKFJlbmRlcktpdEJlYW4pX3JlbmRlcktpdHMuZ2V0KHJlbmRlcktpdElkKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBmYWNlcyBjb25maWcgaGFzIGFueSByZW5kZXIga2l0cy4KLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBoYXMgYW55IHJlbmRlciBraXRzLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyS2l0cygpCi0gIHsKLSAgICByZXR1cm4gIV9yZW5kZXJLaXRzLmlzRW1wdHkoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgcmVuZGVyIGtpdHMgaW4gdGhpcyBmYWNlcwotICAgKiBjb25maWcuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXIga2l0IGl0ZXJhdG9yCi0gICAqLwotICBwdWJsaWMgSXRlcmF0b3IgcmVuZGVyS2l0cygpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcktpdHMudmFsdWVzKCkuaXRlcmF0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyBVUkwgZ2V0Q3VycmVudFJlc291cmNlKCkKLSAgewotICAgIHJldHVybiBfY3VycmVudFJlc291cmNlOwotICB9Ci0gIAotICBwdWJsaWMgVVJMIHNldEN1cnJlbnRSZXNvdXJjZShVUkwgcmVzb3VyY2UpCi0gIHsKLSAgICBVUkwgX2N1ciA9IF9jdXJyZW50UmVzb3VyY2U7Ci0gICAgX2N1cnJlbnRSZXNvdXJjZSA9IHJlc291cmNlOwotICAgIHJldHVybiBfY3VyOwotICB9Ci0KLSAgcHJpdmF0ZSBNYXAgX2NvbnZlcnRlcnMgPSBuZXcgVHJlZU1hcCgpOwotICBwcml2YXRlIE1hcCBfdmFsaWRhdG9ycyA9IG5ldyBUcmVlTWFwKCk7Ci0gIHByaXZhdGUgTWFwIF9jb21wb25lbnRzID0gbmV3IFRyZWVNYXAoKTsKLSAgcHJpdmF0ZSBNYXAgX2V2ZW50cyA9IG5ldyBUcmVlTWFwKCk7Ci0gIHByaXZhdGUgTWFwIF9yZW5kZXJLaXRzID0gbmV3IFRyZWVNYXAoKTsKLSAgcHJpdmF0ZSBVUkwgX2N1cnJlbnRSZXNvdXJjZSA9IG51bGw7Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgTG9nZ2VyIF9MT0cgPSBMb2dnZXIuZ2V0TG9nZ2VyKEZhY2VzQ29uZmlnQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2VzQ29uZmlnUGFyc2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMyMTExOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvRmFjZXNDb25maWdQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmRpZ2VzdGVyLkRpZ2VzdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5ydWxlcy5CZWFuUHJvcGVydHlTZXR0ZXJSdWxlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5YSW5jbHVkZUZpbHRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5BdHRyaWJ1dGVzOwotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0LlVSTENvbm5lY3Rpb247Ci0KLXB1YmxpYyBjbGFzcyBGYWNlc0NvbmZpZ1BhcnNlcgotewotICBwdWJsaWMgdm9pZCBtZXJnZSgKLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIsCi0gICAgVVJMICAgICAgICAgICAgIHVybCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFVSTENvbm5lY3Rpb24gY29ubiA9IHVybC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgbG9uZyBsYXN0TW9kaWZpZWQgPSBjb25uLmdldExhc3RNb2RpZmllZCgpOwotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0KLSAgICAgIGlmIChpcyAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBFc3RhYmxpc2ggdGhlIGN1cnJlbnQgbGFzdC1tb2RpZmllZCB2YWx1ZQotICAgICAgICAvLyBBcyBuZXcgY29tcG9uZW50cyBhcmUgYWRkZWQsIHRoZXkgd2lsbCByZW1lbWJlcgotICAgICAgICAvLyB0aGlzIGN1cnJlbnQgdmFsdWUgYXMgdGhlaXIgb3duIGxhc3QtbW9kaWZpZWQKLSAgICAgICAgb3duZXIudG91Y2gobGFzdE1vZGlmaWVkKTsKLQotICAgICAgICBEaWdlc3RlciBkaWdlc3RlciA9IGNyZWF0ZURpZ2VzdGVyKCk7Ci0gICAgICAgIGRpZ2VzdGVyLnB1c2godXJsKTsKLSAgICAgICAgZGlnZXN0ZXIucHVzaChvd25lcik7Ci0gICAgICAgIGRpZ2VzdGVyLnBhcnNlKGlzKTsKLSAgICAgICAgaXMuY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSAiICsgdXJsLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgIiArIHVybCwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSAiICsgdXJsLCBlKTsKLSAgICB9Ci0gIH0KLQotCi0gIHN0YXRpYyBwcm90ZWN0ZWQgRGlnZXN0ZXIgY3JlYXRlRW1wdHlEaWdlc3RlcigpCi0gICAgdGhyb3dzIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24sIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgc3BmLnNldE5hbWVzcGFjZUF3YXJlKHRydWUpOwotICAgIC8vIHJlcXVpcmVzIEpBWFAgMS4zLCBpbiBKYXZhU0UgNS4wCi0gICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUodHJ1ZSk7Ci0gICAgRGlnZXN0ZXIgZGlnZXN0ZXIgPSBuZXcgRGlnZXN0ZXIoc3BmLm5ld1NBWFBhcnNlcigpKTsKLSAgICBkaWdlc3Rlci5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAKLSAgICByZXR1cm4gZGlnZXN0ZXI7Ci0gIH0KLQotICBzdGF0aWMgcHJvdGVjdGVkIHZvaWQgYWRkQ29tcG9uZW50RGlnZXN0ZXJSdWxlcyhEaWdlc3RlciBkaWdlc3RlciwgYm9vbGVhbiB3aXRoQ3JlYXRlKQotICB7Ci0gICAgZGlnZXN0ZXIuc2V0UnVsZU5hbWVzcGFjZVVSSSgiaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIik7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50Ci0gICAgLy8gT25seSB1c2UgaWYgd2UncmUgY3JlYXRpbmcgdGhlIGNvbXBvbmVudDsgIHR1cm4gdGhpcyBvZmYKLSAgICAvLyB3aGVuIHdlJ3JlIHNpbXBseSBpbmNsdWRpbmcgY29udGVudAotICAgIGlmICh3aXRoQ3JlYXRlKQotICAgIHsKLSAgICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQKLSAgICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudCIsIENvbXBvbmVudEJlYW4uY2xhc3MpOwotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50VHlwZSIpOwotICAgICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudENsYXNzIik7Ci0gICAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZGVzY3JpcHRpb24iKTsKLSAgICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQiLCAiYWRkQ29tcG9uZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ29tcG9uZW50QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotICAgIH0KLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkiLCBQcm9wZXJ0eUJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5TmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwcm9wZXJ0eUNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L2RlZmF1bHQtdmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZGVmYXVsdFZhbHVlIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eSIsICJhZGRQcm9wZXJ0eSIsCi0gICAgICAgICAgICAgICAgICAgICAgICBQcm9wZXJ0eUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQiLCBGYWNldEJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldC9mYWNldC1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhY2V0TmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9mYWNldC9kZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZFNldE5leHQoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvZmFjZXQiLCAiYWRkRmFjZXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRmFjZXRCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBNYXZlbiBGYWNlcyBQbHVnaW4KLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vbG9uZy1kZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nRGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtZmFtaWx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudEZhbWlseSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1zdXBlcnR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50U3VwZXJ0eXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LXN1cGVyY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50U3VwZXJjbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3JlbmRlcmVyLXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJUeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vbmFtaW5nLWNvbnRhaW5lciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuYW1pbmdDb250YWluZXIiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9hY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY2hpbGRyZW4iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctc3VwZXJjbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdTdXBlcmNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWhhbmRsZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnSGFuZGxlciIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2ltcGxlbWVudGF0aW9uLXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaW1wbGVtZW50YXRpb25UeXBlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWNsYXNzLWV4Y2x1ZGVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudENsYXNzRXhjbHVkZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctY2xhc3MtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3NFeGNsdWRlZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2NvbXBvbmVudC1pbXBsZW1lbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudEltcGxlbWVudHMiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtc2VyaWFsLXVpZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21wb25lbnRTZXJpYWxVSUQiKTsKLSAgICAKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVRhZ0NsYXNzTW9kaWZpZXIiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLCAwKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdW5zdXBwb3J0ZWQtYWdlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVVuc3VwcG9ydGVkQWdlbnRzIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdW5zdXBwb3J0ZWQtYWdlbnRzIiwgMCk7Ci0KLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vY29tcG9uZW50LWNsYXNzLW1vZGlmaWVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZUNvbXBvbmVudENsYXNzTW9kaWZpZXIiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9jb21wb25lbnQtY2xhc3MtbW9kaWZpZXIiLCAwKTsKLSAgICBkaWdlc3Rlci5hZGRSdWxlKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdGFnLW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgbmV3IEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUoInRhZ05hbWUiKSk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vdWl4Mi1sb2NhbC1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvY2FsTmFtZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL3VpeDItbm9kZS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJub2RlQ2xhc3MiKTsKLQotICAgIC8vIGZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudAotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50IiwgRXZlbnRSZWZCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudC9ldmVudC10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50VHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9jb21wb25lbnQtZXh0ZW5zaW9uL2V2ZW50L2V2ZW50LWRlbGl2ZXJ5LXBoYXNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50RGVsaXZlcnlQaGFzZXMiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvY29tcG9uZW50LWV4dGVuc2lvbi9ldmVudC9pZ25vcmUtc291cmNlLWludGVyZmFjZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZ25vcmVTb3VyY2VJbnRlcmZhY2UiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29tcG9uZW50L2NvbXBvbmVudC1leHRlbnNpb24vZXZlbnQiLCAiYWRkRXZlbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbgotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vc3RhdGUtaG9sZGVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN0YXRlSG9sZGVyIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9qc3AtcHJvcGVydHktbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqc3BQcm9wZXJ0eU5hbWUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2xpc3QiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibGlzdCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcmVxdWlyZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2FsaWFzLW9mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFsaWFzT2YiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3ZpcnR1YWwiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3RyYW5zaWVudCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbGl0ZXJhbC1vbmx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpdGVyYWxPbmx5Iik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9lbnVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2FsdGVybmF0ZS1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHRlcm5hdGVDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdGFnLWF0dHJpYnV0ZS1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdBdHRyaWJ1dGVFeGNsdWRlZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vaXMtc2V0LW1ldGhvZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc1NldE1ldGhvZCIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vaXMtc2V0LW1ldGhvZC1zY29wZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpc1NldE1ldGhvZFNjb3BlIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9pcy1nZXQtbG9jYWwtbWV0aG9kIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzR2V0TG9jYWxNZXRob2QiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2lzLWdldC1sb2NhbC1tZXRob2Qtc2NvcGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzR2V0TG9jYWxNZXRob2RTY29wZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcnRleHBydmFsdWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJ0ZXhwcnZhbHVlIik7Ci0gICAgCi0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vcHJvcGVydHktdmFsdWVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVByb3BlcnR5VmFsdWVzIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS12YWx1ZXMiLCAwKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi91bnN1cHBvcnRlZC1hZ2VudHMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVW5zdXBwb3J0ZWRBZ2VudHMiLCAxKTsKLSAgICBkaWdlc3Rlci5hZGRDYWxsUGFyYW0oImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLWFnZW50cyIsIDApOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Vuc3VwcG9ydGVkLXJlbmRlci1raXRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzZVVuc3VwcG9ydGVkUmVuZGVyS2l0cyIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vdW5zdXBwb3J0ZWQtcmVuZGVyLWtpdHMiLCAwKTsKLQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kU2lnbmF0dXJlQmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9tZXRob2QtYmluZGluZy1zaWduYXR1cmUvcmV0dXJuLXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmV0dXJuVHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL21ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZS9wYXJhbWV0ZXItdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiYWRkUGFyYW1ldGVyVHlwZSIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlL3BhcmFtZXRlci10eXBlIiwgMCk7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24vbWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICJzZXRNZXRob2RCaW5kaW5nU2lnbmF0dXJlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZFNpZ25hdHVyZUJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLSAgICAvLyBmYWNlcy1jb25maWcvY29tcG9uZW50L3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGEKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb21wb25lbnQvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYXRhL3VzZS1tYXgtdGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ1c2VNYXhUaW1lIik7ICAgICAgICAKLQotCi0gICAgLy8gWEluY2x1ZGUgcnVsZXMKLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKFhJbmNsdWRlRmlsdGVyLlhJTkNMVURFX05BTUVTUEFDRSk7Ci0gICAgZGlnZXN0ZXIuYWRkRmFjdG9yeUNyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbXBvbmVudC9pbmNsdWRlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBvbmVudEluY2x1ZGVGYWN0b3J5LmNsYXNzKTsKLSAgfQotCi0gIHByb3RlY3RlZCBEaWdlc3RlciBjcmVhdGVEaWdlc3RlcigpIHRocm93cyBQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uLCBTQVhFeGNlcHRpb24KLSAgewotICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gY3JlYXRlRW1wdHlEaWdlc3RlcigpOwotCi0gICAgYWRkQ29tcG9uZW50RGlnZXN0ZXJSdWxlcyhkaWdlc3RlciwgdHJ1ZSk7Ci0gICAgCi0gICAgLy8gSmF2YSBFbnRlcnByaXNlIDUuMAotICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoImh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIpOwotICAgIC8vZGlnZXN0ZXIuYWRkT2JqZWN0Q3JlYXRlKCJmYWNlcy1jb25maWciLCBGYWNlc0NvbmZpZ0JlYW4uY2xhc3MpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlcgotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlciIsIENvbnZlcnRlckJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29udmVydGVySWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbnZlcnRlckNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2NvbnZlcnRlciIsICJhZGRDb252ZXJ0ZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgQ29udmVydGVyQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eSIsIFByb3BlcnR5QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlOYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5L3Byb3BlcnR5LWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5Q2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvZGVmYXVsdC12YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvY29udmVydGVyL3Byb3BlcnR5IiwgImFkZFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvcgotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvciIsIFZhbGlkYXRvckJlYW4uY2xhc3MpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidmFsaWRhdG9ySWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInZhbGlkYXRvckNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvciIsICJhZGRWYWxpZGF0b3IiLAotICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdG9yQmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eQotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eSIsIFByb3BlcnR5QmVhbi5jbGFzcyk7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHJvcGVydHlOYW1lIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByb3BlcnR5Q2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvZGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvZGVmYXVsdC12YWx1ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0VmFsdWUiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5IiwgImFkZFByb3BlcnR5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgIFByb3BlcnR5QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0KLSAgICAvLyBmYWNlcy1jb25maWcvcmVuZGVyLWtpdAotICAgIGRpZ2VzdGVyLmFkZE9iamVjdENyZWF0ZSgiZmFjZXMtY29uZmlnL3JlbmRlci1raXQiLCBSZW5kZXJLaXRCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlci1raXQtaWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyS2l0SWQiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdCIsICJhZGRSZW5kZXJLaXQiLAotICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyS2l0QmVhbi5jbGFzcy5nZXROYW1lKCkpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyIiwgUmVuZGVyZXJCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9jb21wb25lbnQtZmFtaWx5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBvbmVudEZhbWlseSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItdHlwZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW5kZXJlclR5cGUiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9yZW5kZXIta2l0L3JlbmRlcmVyL3JlbmRlcmVyLWNsYXNzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlbmRlcmVyQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRTZXROZXh0KCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlciIsICJhZGRSZW5kZXJlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJlckJlYW4uY2xhc3MuZ2V0TmFtZSgpKTsKLQotCi0gICAgLy8gVEJEOiBKU1ItMjc2IG1ldGFkYXRhIChhc2sgSmVmZiBTdGVwaGVuc29uKQotCi0KLSAgICAvLyBNYXZlbiBGYWNlcyBQbHVnaW4KLSAgICBkaWdlc3Rlci5zZXRSdWxlTmFtZXNwYWNlVVJJKCJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQKLSAgICBkaWdlc3Rlci5hZGRPYmplY3RDcmVhdGUoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50IiwgRXZlbnRCZWFuLmNsYXNzKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9mYWNlcy1jb25maWctZXh0ZW5zaW9uL2V2ZW50L2Rlc2NyaXB0aW9uIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9ldmVudC10eXBlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50VHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQvZXZlbnQtbGlzdGVuZXItY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXZlbnRMaXN0ZW5lckNsYXNzIik7Ci0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvZmFjZXMtY29uZmlnLWV4dGVuc2lvbi9ldmVudC9ldmVudC1zb3VyY2UtaW50ZXJmYWNlIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImV2ZW50U291cmNlSW50ZXJmYWNlIik7Ci0gICAgZGlnZXN0ZXIuYWRkU2V0TmV4dCgiZmFjZXMtY29uZmlnL2ZhY2VzLWNvbmZpZy1leHRlbnNpb24vZXZlbnQiLCAiYWRkRXZlbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgICAvLyBmYWNlcy1jb25maWcvY29udmVydGVyL2NvbnZlcnRlci1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi9sb25nLWRlc2NyaXB0aW9uIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdEZXNjcmlwdGlvbiIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzcyIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcy1leGNsdWRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0YWdDbGFzc0V4Y2x1ZGVkIik7Ci0gICAgZGlnZXN0ZXIuYWRkUnVsZSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1uYW1lIiwKLSAgICAgICAgICAgICAgICAgICAgIG5ldyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlKCJ0YWdOYW1lIikpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxNZXRob2QoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvY29udmVydGVyLWV4dGVuc2lvbi90YWctY2xhc3MtbW9kaWZpZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNlVGFnQ2xhc3NNb2RpZmllciIsIDEpOwotICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2NvbnZlcnRlci9jb252ZXJ0ZXItZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsIDApOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL2NvbnZlcnRlci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3RhZy1hdHRyaWJ1dGUtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQXR0cmlidXRlRXhjbHVkZWQiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy9jb252ZXJ0ZXIvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL2xpdGVyYWwtb25seSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaXRlcmFsT25seSIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vbG9uZy1kZXNjcmlwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb25nRGVzY3JpcHRpb24iKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3MiKTsKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvdmFsaWRhdG9yLWV4dGVuc2lvbi90YWctY2xhc3MtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQ2xhc3NFeGNsdWRlZCIpOyAgICAKLSAgICBkaWdlc3Rlci5hZGRSdWxlKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLW5hbWUiLAotICAgICAgICAgICAgICAgICAgICAgbmV3IEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUoInRhZ05hbWUiKSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbE1ldGhvZCgiZmFjZXMtY29uZmlnL3ZhbGlkYXRvci92YWxpZGF0b3ItZXh0ZW5zaW9uL3RhZy1jbGFzcy1tb2RpZmllciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAicGFyc2VUYWdDbGFzc01vZGlmaWVyIiwgMSk7Ci0gICAgZGlnZXN0ZXIuYWRkQ2FsbFBhcmFtKCJmYWNlcy1jb25maWcvdmFsaWRhdG9yL3ZhbGlkYXRvci1leHRlbnNpb24vdGFnLWNsYXNzLW1vZGlmaWVyIiwgMCk7Ci0gICAgCi0gICAgLy8gZmFjZXMtY29uZmlnL3ZhbGlkYXRvci9wcm9wZXJ0eS9wcm9wZXJ0eS1leHRlbnNpb24KLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3RhZy1hdHRyaWJ1dGUtZXhjbHVkZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGFnQXR0cmlidXRlRXhjbHVkZWQiKTsKLSAgICAvLyBmYWNlcy1jb25maWcvdmFsaWRhdG9yL3Byb3BlcnR5L3Byb3BlcnR5LWV4dGVuc2lvbi9wcm9wZXJ0eS1tZXRhZGEKLSAgICBkaWdlc3Rlci5hZGRCZWFuUHJvcGVydHlTZXR0ZXIoImZhY2VzLWNvbmZpZy92YWxpZGF0b3IvcHJvcGVydHkvcHJvcGVydHktZXh0ZW5zaW9uL3Byb3BlcnR5LW1ldGFkYXRhL3VzZS1tYXgtdGltZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidXNlTWF4VGltZSIpOwotCi0gICAgLy8gZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uCi0gICAgZGlnZXN0ZXIuYWRkQmVhblByb3BlcnR5U2V0dGVyKCJmYWNlcy1jb25maWcvcmVuZGVyLWtpdC9yZW5kZXJlci9yZW5kZXJlci1leHRlbnNpb24vY29tcG9uZW50LXR5cGUiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29tcG9uZW50VHlwZSIpOwotICAgIGRpZ2VzdGVyLmFkZEJlYW5Qcm9wZXJ0eVNldHRlcigiZmFjZXMtY29uZmlnL3JlbmRlci1raXQvcmVuZGVyZXIvcmVuZGVyZXItZXh0ZW5zaW9uL3JlbmRlcmVyLXN1cGVyY2xhc3MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVuZGVyZXJTdXBlcmNsYXNzIik7Ci0KLSAgICByZXR1cm4gZGlnZXN0ZXI7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIGNsYXNzIENvbXBvbmVudEluY2x1ZGVGYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3RvcnkKLSAgewotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KAotICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0KLSAgICAgIFVSTCBtYXN0ZXIgPSAoVVJMKWRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgIFVSTCBpbmNsdWRlZCA9IG5ldyBVUkwobWFzdGVyLCBocmVmKTsKLQotICAgICAgRGlnZXN0ZXIgaW5jbHVkZWREaWdlc3RlciA9IGNyZWF0ZUVtcHR5RGlnZXN0ZXIoKTsKLSAgICAgIGFkZENvbXBvbmVudERpZ2VzdGVyUnVsZXMoaW5jbHVkZWREaWdlc3RlciwgZmFsc2UpOwotICAgICAgaW5jbHVkZWREaWdlc3Rlci5wdXNoKGluY2x1ZGVkKTsKLSAgICAgIGluY2x1ZGVkRGlnZXN0ZXIucHVzaChkaWdlc3Rlci5wZWVrKCkpOwotCi0gICAgICBVUkxDb25uZWN0aW9uIGNvbm4gPSBpbmNsdWRlZC5vcGVuQ29ubmVjdGlvbigpOwotICAgICAgSW5wdXRTdHJlYW0gaXMgPSBjb25uLmdldElucHV0U3RyZWFtKCk7Ci0gICAgICBpbmNsdWRlZERpZ2VzdGVyLnBhcnNlKGlzKTsKLSAgICAgIGlzLmNsb3NlKCk7Ci0KLSAgICAgIC8vIFdlIGRvbid0IHJlYWxseSB3YW50IHRoZSBpbmNsdWRlZCBvYmplY3QgLSBidXQgcmV0dXJuIGl0IGFueXdheQotICAgICAgcmV0dXJuIGluY2x1ZGVkOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2V0QmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL0ZhY2V0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDViNGU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9GYWNldEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotLyoqCi0gKiBGYWNldEJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50IG9yCi0gKiByZW5kZXJlciBmYWNldCBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIEZhY2V0QmVhbiBleHRlbmRzIE9iamVjdEJlYW4KLXsKLSAgLyoqCi0gICAqIFNldHMgdGhlIGZhY2V0IG5hbWUgZm9yIHRoaXMgZmFjZXQuCi0gICAqCi0gICAqIEBwYXJhbSBmYWNldE5hbWUgIHRoZSBmYWNldCBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRGYWNldE5hbWUoCi0gICAgU3RyaW5nIGZhY2V0TmFtZSkKLSAgewotICAgIF9mYWNldE5hbWUgPSBmYWNldE5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmFjZXQgbmFtZSBmb3IgdGhpcyBmYWNldC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGZhY2V0IG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmFjZXROYW1lKCkKLSAgewotICAgIHJldHVybiBfZmFjZXROYW1lOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGRlc2NyaXB0aW9uIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBkZXNjcmlwdGlvbiAgdGhlIHByb3BlcnR5IGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgZGVzY3JpcHRpb24KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RGVzY3JpcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9kZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZXF1aXJlZCBmbGFnIG9mIHRoaXMgZmFjZXQuCi0gICAqCi0gICAqIEBwYXJhbSByZXF1aXJlZCAgdGhlIGZhY2V0IHJlcXVpcmVkIGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKAotICAgIGJvb2xlYW4gcmVxdWlyZWQpCi0gIHsKLSAgICBfcmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBmYWNldC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGZhY2V0IHJlcXVpcmVkIGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQotICB7Ci0gICAgcmV0dXJuIF9yZXF1aXJlZDsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nICBfZGVzY3JpcHRpb247Ci0gIHByaXZhdGUgU3RyaW5nICBfZmFjZXROYW1lOwotICBwcml2YXRlIGJvb2xlYW4gX3JlcXVpcmVkOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL01ldGhvZFNpZ25hdHVyZUJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9NZXRob2RTaWduYXR1cmVCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMTIxZDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL01ldGhvZFNpZ25hdHVyZUJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIE1ldGhvZFNpZ25hdHVyZUJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50Ci0gKiBwcm9wZXJ0eS1leHRlbnNpb24gbWV0aG9kLXNpZ25hdHVyZSBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIE1ldGhvZFNpZ25hdHVyZUJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IE1ldGhvZFNpZ25hdHVyZUJlYW4uCi0gICAqLwotICBwdWJsaWMgTWV0aG9kU2lnbmF0dXJlQmVhbigpCi0gIHsKLSAgICBfcGFyYW1ldGVyVHlwZXMgPSBuZXcgTGlua2VkTGlzdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBuZXcgcGFyYW1ldGVyIHR5cGUgdG8gdGhpcyBtZXRob2Qgc2lnbmF0dXJlLgotICAgKgotICAgKiBAcGFyYW0gcGFyYW1ldGVyVHlwZSAgdGhlIHBhcmFtZXRlciB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRQYXJhbWV0ZXJUeXBlKAotICAgIFN0cmluZyBwYXJhbWV0ZXJUeXBlKQotICB7Ci0gICAgX3BhcmFtZXRlclR5cGVzLmFkZChwYXJhbWV0ZXJUeXBlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBsaXN0IG9mIHBhcmFtZXRlciB0eXBlcyBhcyBhbiBhcnJheS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHBhcmFtZXRlciB0eXBlIGxpc3QKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRQYXJhbWV0ZXJUeXBlcygpCi0gIHsKLSAgICByZXR1cm4gKFN0cmluZ1tdKV9wYXJhbWV0ZXJUeXBlcy50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4KLSAgICoKLSAgICogQHBhcmFtIHJldHVyblR5cGUgIHRoZSBtZXRob2Qgc2lnbmF0dXJlIHJldHVybiB0eXBlCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRSZXR1cm5UeXBlKAotICAgIFN0cmluZyByZXR1cm5UeXBlKQotICB7Ci0gICAgX3JldHVyblR5cGUgPSByZXR1cm5UeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJldHVybiB0eXBlIG9mIHRoaXMgbWV0aG9kIHNpZ25hdHVyZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIG1ldGhvZCBzaWduYXR1cmUgcmV0dXJuIHR5cGUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmV0dXJuVHlwZSgpCi0gIHsKLSAgICByZXR1cm4gX3JldHVyblR5cGU7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfcmV0dXJuVHlwZTsKLSAgcHJpdmF0ZSBMaXN0ICAgX3BhcmFtZXRlclR5cGVzOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL09iamVjdEJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9PYmplY3RCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZDMzYWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL09iamVjdEJlYW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotLyoqCi0gKiBPYmplY3RCZWFuIGlzIHRoZSBiYXNlIGNsYXNzIGZvciBhbGwgcGFyc2VkIGJlYW5zLgotICovCi1wdWJsaWMgY2xhc3MgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBPYmplY3RCZWFuLgotICAgKi8KLSAgcHVibGljIE9iamVjdEJlYW4oKQotICB7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZmFjZXMgY29uZmlnIGRvY3VtZW50IGhhcyBiZWVuIG1vZGlmaWVkIHNpbmNlCi0gICAqIHRoZSBzcGVjaWZpZWQgdGltZXN0YW1wLgotICAgKgotICAgKiBAcGFyYW0gdGltZXN0YW1wICB0aGUgdGltZXN0YW1wIGluIFVUQyBtaWxsaXMKLSAgICoKLSAgICogQHJldHVybiB0cnVlICBpZiB0aGlzIGZhY2VzIGNvbmZpZyBkb2N1bWVudCBoYXMgYmVlbiBtb2RpZmllZCwKLSAgICogICAgICAgICBvdGhlcndpc2UgZmFsc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTW9kaWZpZWRTaW5jZSgKLSAgICBsb25nIHRpbWVzdGFtcCkKLSAgewotICAgIHJldHVybiAoX2xhc3RNb2RpZmllZCA+IHRpbWVzdGFtcCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmFjZXNDb25maWdCZWFuIGdldE93bmVyKCkKLSAgewotICAgIHJldHVybiBfb3duZXI7Ci0gIH0KLQotICAvKioKLSAgICogQXR0YWNoZXMgdGhlIG9iamVjdC4KLSAgICoKLSAgICogQHBhcmFtIG93bmVyICB0aGUgZmFjZXMgY29uZmlnIG93bmVyCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBhdHRhY2goCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyKQotICB7Ci0gICAgX293bmVyID0gb3duZXI7Ci0gICAgT2JqZWN0QmVhbiBvYmplY3QgPSBvd25lcjsKLSAgICB0b3VjaChvYmplY3QuX2xhc3RNb2RpZmllZCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgbGFzdCBtb2RpZmllZCB0aW1lc3RhbXAgZm9yIHRoZSBwYXJzZWQgZmFjZXMgY29uZmlnIGRvY3VtZW50Ci0gICAqIGlmIGl0IGlzIG5ld2VyIHRoYW4gdGhlIGV4aXN0aW5nIGxhc3QgbW9kaWZpZWQgdGltZXN0YW1wLgotICAgKgotICAgKiBAcGFyYW0gbGFzdE1vZGlmaWVkICB0aGUgbGFzdCBtb2RpZmllZCB0aW1lIGluIFVUQyBtaWxsaXMKLSAgICovCi0gIHZvaWQgdG91Y2goCi0gICAgbG9uZyBsYXN0TW9kaWZpZWQpCi0gIHsKLSAgICBfbGFzdE1vZGlmaWVkID0gTWF0aC5tYXgoX2xhc3RNb2RpZmllZCwgbGFzdE1vZGlmaWVkKTsKLSAgfQotCi0gIHByaXZhdGUgbG9uZyBfbGFzdE1vZGlmaWVkOwotICBwcml2YXRlIEZhY2VzQ29uZmlnQmVhbiBfb3duZXI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUHJvcGVydHlCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUHJvcGVydHlCZWFuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxMzAyZmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1Byb3BlcnR5QmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTA0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotLyoqCi0gKiBQcm9wZXJ0eUJlYW4gaXMgYSBKYXZhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmYWNlcy1jb25maWcgY29tcG9uZW50IHByb3BlcnR5Ci0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFByb3BlcnR5QmVhbiBleHRlbmRzIEF0dHJpYnV0ZUJlYW4KLXsKLSAgICBwdWJsaWMgdm9pZCBzZXRVc2VNYXhUaW1lKGJvb2xlYW4gX3VzZU1heFRpbWUpIAotICAgIHsKLSAgICAgIHRoaXMuX3VzZU1heFRpbWUgPSBfdXNlTWF4VGltZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIGJvb2xlYW4gZ2V0VXNlTWF4VGltZSgpIAotICAgIHsKLSAgICAgIHJldHVybiBfdXNlTWF4VGltZTsKLSAgICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5TmFtZSAgdGhlIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5TmFtZSgKLSAgICBTdHJpbmcgcHJvcGVydHlOYW1lKQotICB7Ci0gICAgc2V0QXR0cmlidXRlTmFtZShwcm9wZXJ0eU5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlOYW1lKCkKLSAgewotICAgIHJldHVybiBnZXRBdHRyaWJ1dGVOYW1lKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcHJvcGVydHkgY2xhc3MgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eUNsYXNzICB0aGUgcHJvcGVydHkgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFByb3BlcnR5Q2xhc3MoCi0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MpCi0gIHsKLSAgICBzZXRBdHRyaWJ1dGVDbGFzcyhwcm9wZXJ0eUNsYXNzKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwcm9wZXJ0eSBjbGFzcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldFByb3BlcnR5Q2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZUNsYXNzKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgYXJyYXkgb2YgcGFyYW1ldGVyaXplZCB0eXBlcyBmb3IgdGhpcyBwcm9wZXJ0eQotICAgKiBpZiBpdCB1c2VzIGdlbmVyaWNzLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBhcnJheSBvZiBwYXJhbWV0ZXJpemVkIHR5cGVzIGZvciB0aGlzIHByb3BlcnR5Ci0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKQotICB7Ci0gICAgcmV0dXJuIGdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIHByb3BlcnR5VmFsdWVzICB0aGUgcHJvcGVydHkgdmFsdWVzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRQcm9wZXJ0eVZhbHVlcygKLSAgICBTdHJpbmdbXSBwcm9wZXJ0eVZhbHVlcykKLSAgewotICAgIF9wcm9wZXJ0eVZhbHVlcyA9IHByb3BlcnR5VmFsdWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgcG9zc2libGUgdmFsdWVzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcHJvcGVydHkgdmFsdWVzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0UHJvcGVydHlWYWx1ZXMoKQotICB7Ci0gICAgcmV0dXJuIF9wcm9wZXJ0eVZhbHVlczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBzdGF0ZUhvbGRlciBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBzdGF0ZUhvbGRlciAgdGhlIHByb3BlcnR5IHN0YXRlSG9sZGVyIGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFN0YXRlSG9sZGVyKAotICAgIGJvb2xlYW4gc3RhdGVIb2xkZXIpCi0gIHsKLSAgICBfc3RhdGVIb2xkZXIgPSBzdGF0ZUhvbGRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHN0YXRlSG9sZGVyIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHN0YXRlSG9sZGVyIGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzU3RhdGVIb2xkZXIoKQotICB7Ci0gICAgcmV0dXJuIF9zdGF0ZUhvbGRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB0cmFuc2llbnQgZmxhZyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gdHJhbnNpZW50ICB0aGUgcHJvcGVydHkgdHJhbnNpZW50IGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFRyYW5zaWVudCgKLSAgICBib29sZWFuIHRyYW5zaWVudF8pCi0gIHsKLSAgICBfdHJhbnNpZW50ID0gdHJhbnNpZW50XzsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRyYW5zaWVudCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSB0cmFuc2llbnQgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNUcmFuc2llbnQoKQotICB7Ci0gICAgcmV0dXJuIF90cmFuc2llbnQ7Ci0gIH0KLQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsaXN0IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGxpc3QgIHRoZSBwcm9wZXJ0eSBsaXN0IGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpc3QoCi0gICAgYm9vbGVhbiBsaXN0XykKLSAgewotICAgIF9saXN0ID0gbGlzdF87Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBsaXN0IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGxpc3QgZmxhZwotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNMaXN0KCkKLSAgewotICAgIHJldHVybiBfbGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZXF1aXJlZCBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSByZXF1aXJlZCAgdGhlIHByb3BlcnR5IHJlcXVpcmVkIGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlcXVpcmVkKAotICAgIGJvb2xlYW4gcmVxdWlyZWQpCi0gIHsKLSAgICBfcmVxdWlyZWQgPSByZXF1aXJlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHJlcXVpcmVkIGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IHJlcXVpcmVkIGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKQotICB7Ci0gICAgcmV0dXJuIF9yZXF1aXJlZDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBsaXRlcmFsT25seSBmbGFnIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSBsaXRlcmFsT25seSAgdGhlIHByb3BlcnR5IGxpdGVyYWxPbmx5IGZsYWcKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldExpdGVyYWxPbmx5KAotICAgIGJvb2xlYW4gbGl0ZXJhbE9ubHkpCi0gIHsKLSAgICBfbGl0ZXJhbE9ubHkgPSBsaXRlcmFsT25seTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGxpdGVyYWxPbmx5IGZsYWcgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHByb3BlcnR5IGxpdGVyYWxPbmx5IGZsYWcKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTGl0ZXJhbE9ubHkoKQotICB7Ci0gICAgcmV0dXJuIF9saXRlcmFsT25seTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBhbGlhcyBvZiB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gYWxpYXNPZiAgdGhlIHByb3BlcnR5IGFsaWFzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRBbGlhc09mKAotICAgIFN0cmluZyBhbGlhc09mKQotICB7Ci0gICAgX2FsaWFzT2YgPSBhbGlhc09mOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGFsaWFzIG9mIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBwcm9wZXJ0eSBhbGlhcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRBbGlhc09mKCkKLSAgewotICAgIHJldHVybiBfYWxpYXNPZjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB1bnN1cHBvcnRlZCBhZ2VudHMgZm9yIHRoaXMgcHJvcGVydHkuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZEFnZW50cyAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5zdXBwb3J0ZWRBZ2VudHMoCi0gICAgU3RyaW5nW10gdW5zdXBwb3J0ZWRBZ2VudHMpCi0gIHsKLSAgICBpZiAodW5zdXBwb3J0ZWRBZ2VudHMgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5zdXBwb3J0ZWRBZ2VudHMiKTsKLQotICAgIF91bnN1cHBvcnRlZEFnZW50cyA9IHVuc3VwcG9ydGVkQWdlbnRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdW5zdXBwb3J0ZWQgYWdlbnRzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgdW5zdXBwb3J0ZWQgYWdlbnRzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKQotICB7Ci0gICAgcmV0dXJuIF91bnN1cHBvcnRlZEFnZW50czsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSB1bnN1cHBvcnRlZCBSZW5kZXJLaXRzIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRSZW5kZXJLaXRzICB0aGUgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKAotICAgIFN0cmluZ1tdIHVuc3VwcG9ydGVkUmVuZGVyS2l0cykKLSAgewotICAgIGlmICh1bnN1cHBvcnRlZFJlbmRlcktpdHMgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigidW5zdXBwb3J0ZWRSZW5kZXJLaXRzIik7Ci0KLSAgICBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzID0gdW5zdXBwb3J0ZWRSZW5kZXJLaXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMKLSAgICovCi0gIHB1YmxpYyBTdHJpbmdbXSBnZXRVbnN1cHBvcnRlZFJlbmRlcktpdHMoKQotICB7Ci0gICAgcmV0dXJuIF91bnN1cHBvcnRlZFJlbmRlcktpdHM7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgdGFnIGF0dHJpYnV0ZSBleGNsdWRlZCBmbGFnIGZvciB0aGlzIHByb3BlcnR5LgotICAgKgotICAgKiBAcGFyYW0gZXhjbHVkZWQgIHRydWUsICBpZiB0aGUgdGFnIGF0dHJpYnV0ZSBzaG91bGQgYmUgZXhjbHVkZWQ7Ci0gICAqICAgICAgICAgICAgICAgICAgZmFsc2UsIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VGFnQXR0cmlidXRlRXhjbHVkZWQoCi0gICAgYm9vbGVhbiBleGNsdWRlZCkKLSAgewotICAgIF90YWdBdHRyaWJ1dGVFeGNsdWRlZCA9IGV4Y2x1ZGVkOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHRhZyBhdHRyaWJ1dGUgZXhjbHVkZWQgZmxhZyBmb3IgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlLCAgaWYgdGhlIHRhZyBhdHRyaWJ1dGUgc2hvdWxkIGJlIGV4Y2x1ZGVkOwotICAgKiAgICAgICAgIGZhbHNlLCBvdGhlcndpc2UKLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzVGFnQXR0cmlidXRlRXhjbHVkZWQoKQotICB7Ci0gICAgcmV0dXJuIF90YWdBdHRyaWJ1dGVFeGNsdWRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGVudW1lcmF0ZWQgSmF2YSB0eXBlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbnVtKCkKLSAgewotICAgIHJldHVybiBfZW51bTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHByb3BlcnR5IGlzIGFuIGVudW1lcmF0ZWQgSmF2YSB0eXBlLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RW51bShib29sZWFuIGlzRW51bSkKLSAgewotICAgIF9lbnVtID0gaXNFbnVtOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHByb3BlcnR5IGlzIGEgbWV0aG9kIGJpbmRpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBiaW5kaW5nLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RCaW5kaW5nKCkKLSAgewotICAgIHJldHVybiAoImphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmciLmVxdWFscyhnZXRQcm9wZXJ0eUNsYXNzKCkpKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIHByb3BlcnR5IGlzIGEgbWV0aG9kIGJpbmRpbmcuCi0gICAqCi0gICAqIEByZXR1cm4gdHJ1ZSAgaWYgdGhpcyBwcm9wZXJ0eSBpcyBhIG1ldGhvZCBiaW5kaW5nLAotICAgKiAgICAgICAgIG90aGVyd2lzZSBmYWxzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNNZXRob2RFeHByZXNzaW9uKCkKLSAgewotICAgIHJldHVybiAoImphdmF4LmVsLk1ldGhvZEV4cHJlc3Npb24iLmVxdWFscyhnZXRQcm9wZXJ0eUNsYXNzKCkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIHBvc3NpYmxlIHZhbHVlcyBmb3IgdGhpcyBwcm9wZXJ0eSBpbnRvIGEgU3RyaW5nIGFycmF5Ci0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSBwcm9wZXJ0eVZhbHVlcyAgdGhlIHByb3BlcnR5IHZhbHVlcwotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VQcm9wZXJ0eVZhbHVlcygKLSAgICBTdHJpbmcgcHJvcGVydHlWYWx1ZXMpCi0gIHsKLSAgICBzZXRQcm9wZXJ0eVZhbHVlcyhwcm9wZXJ0eVZhbHVlcy5zcGxpdCgiICIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIHVuc3VwcG9ydGVkIGFnZW50cyBmb3IgdGhpcyBwcm9wZXJ0eSBpbnRvIGEgU3RyaW5nIGFycmF5Ci0gICAqIHVzaW5nIHNwYWNlIGFzIHRoZSBzZXBhcmF0b3IgYmV0d2VlbiB2YWx1ZXMuCi0gICAqCi0gICAqIEBwYXJhbSB1bnN1cHBvcnRlZEFnZW50cyAgdGhlIHVuc3VwcG9ydGVkIGFnZW50cwotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VVbnN1cHBvcnRlZEFnZW50cygKLSAgICBTdHJpbmcgdW5zdXBwb3J0ZWRBZ2VudHMpCi0gIHsKLSAgICBzZXRVbnN1cHBvcnRlZEFnZW50cyh1bnN1cHBvcnRlZEFnZW50cy5zcGxpdCgiICIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIHVuc3VwcG9ydGVkIFJlbmRlcktpdHMgZm9yIHRoaXMgcHJvcGVydHkgaW50byBhIFN0cmluZyBhcnJheQotICAgKiB1c2luZyBzcGFjZSBhcyB0aGUgc2VwYXJhdG9yIGJldHdlZW4gdmFsdWVzLgotICAgKgotICAgKiBAcGFyYW0gdW5zdXBwb3J0ZWRSZW5kZXJLaXRzICB0aGUgdW5zdXBwb3J0ZWQgUmVuZGVyS2l0cwotICAgKi8KLSAgcHVibGljIHZvaWQgcGFyc2VVbnN1cHBvcnRlZFJlbmRlcktpdHMoCi0gICAgU3RyaW5nIHVuc3VwcG9ydGVkUmVuZGVyS2l0cykKLSAgewotICAgIHNldFVuc3VwcG9ydGVkUmVuZGVyS2l0cyh1bnN1cHBvcnRlZFJlbmRlcktpdHMuc3BsaXQoIiAiKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgSlNQIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHBhcmFtIGpzcFByb3BlcnR5TmFtZSAgdGhlIEpTUCBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRKc3BQcm9wZXJ0eU5hbWUoCi0gICAgU3RyaW5nIGpzcFByb3BlcnR5TmFtZSkKLSAgewotICAgIF9qc3BQcm9wZXJ0eU5hbWUgPSBqc3BQcm9wZXJ0eU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgSlNQIG5hbWUgb2YgdGhpcyBwcm9wZXJ0eS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpTUCBwcm9wZXJ0eSBuYW1lCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldEpzcFByb3BlcnR5TmFtZSgpCi0gIHsKLSAgICBpZiAoX2pzcFByb3BlcnR5TmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIGdldFByb3BlcnR5TmFtZSgpOwotCi0gICAgcmV0dXJuIF9qc3BQcm9wZXJ0eU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgZmllbGQgbmFtZSBvZiB0aGlzIHByb3BlcnR5LCB3aGVuIG5vdCBnZW5lcmF0aW5nIFRyaW5pZGFkIGNvbXBvbmVudHMKLSAgICoKLSAgICogQHBhcmFtIGZpZWxkUHJvcGVydHlOYW1lICB0aGUgZmllbGQgcHJvcGVydHkgbmFtZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0RmllbGRQcm9wZXJ0eU5hbWUoCi0gICAgU3RyaW5nIGZpZWxkUHJvcGVydHlOYW1lKQotICB7Ci0gICAgX2ZpZWxkUHJvcGVydHlOYW1lID0gZmllbGRQcm9wZXJ0eU5hbWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZmllbGQgbmFtZSBvZiB0aGlzIHByb3BlcnR5LCB3aGVuIG5vdCBnZW5lcmF0aW5nIFRyaW5pZGFkIGNvbXBvbmVudHMKLSAgICoKLSAgICogQHJldHVybiAgdGhlIGZpZWxkIHByb3BlcnR5IG5hbWUKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0RmllbGRQcm9wZXJ0eU5hbWUoKQotICB7Ci0gICAgaWYgKF9maWVsZFByb3BlcnR5TmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuICJfIitnZXRQcm9wZXJ0eU5hbWUoKTsKLQotICAgIHJldHVybiBfZmllbGRQcm9wZXJ0eU5hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRJc1NldE1ldGhvZChib29sZWFuIF9pc1NldE1ldGhvZCkKLSAgewotICAgIHRoaXMuX2lzU2V0TWV0aG9kID0gX2lzU2V0TWV0aG9kOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNJc1NldE1ldGhvZCgpCi0gIHsKLSAgICByZXR1cm4gX2lzU2V0TWV0aG9kOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNTZXRNZXRob2RTY29wZShTdHJpbmcgX2lzU2V0TWV0aG9kU2NvcGUpCi0gIHsKLSAgICB0aGlzLl9pc1NldE1ldGhvZFNjb3BlID0gX2lzU2V0TWV0aG9kU2NvcGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElzU2V0TWV0aG9kU2NvcGUoKQotICB7Ci0gICAgcmV0dXJuIF9pc1NldE1ldGhvZFNjb3BlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0SXNHZXRMb2NhbE1ldGhvZChib29sZWFuIF9pc0dldExvY2FsTWV0aG9kKQotICB7Ci0gICAgdGhpcy5faXNHZXRMb2NhbE1ldGhvZCA9IF9pc0dldExvY2FsTWV0aG9kOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gaXNJc0dldExvY2FsTWV0aG9kKCkKLSAgewotICAgIHJldHVybiBfaXNHZXRMb2NhbE1ldGhvZDsgICAKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldElzR2V0TG9jYWxNZXRob2RTY29wZShTdHJpbmcgX2lzR2V0TG9jYWxNZXRob2RTY29wZSkKLSAgewotICAgIHRoaXMuX2lzR2V0TG9jYWxNZXRob2RTY29wZSA9IF9pc0dldExvY2FsTWV0aG9kU2NvcGU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldElzR2V0TG9jYWxNZXRob2RTY29wZSgpCi0gIHsKLSAgICByZXR1cm4gX2lzR2V0TG9jYWxNZXRob2RTY29wZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFJ0ZXhwcnZhbHVlKGJvb2xlYW4gX3J0ZXhwcnZhbHVlKQotICB7Ci0gICAgdGhpcy5fcnRleHBydmFsdWUgPSBfcnRleHBydmFsdWU7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc1J0ZXhwcnZhbHVlKCkKLSAgewotICAgIHJldHVybiBfcnRleHBydmFsdWU7Ci0gIH0KLSAKLSAgcHJpdmF0ZSBib29sZWFuIF9ydGV4cHJ2YWx1ZTsKLSAgcHJpdmF0ZSBTdHJpbmcgX2lzR2V0TG9jYWxNZXRob2RTY29wZTsKLSAgcHJpdmF0ZSBib29sZWFuIF9pc0dldExvY2FsTWV0aG9kOwotICBwcml2YXRlIFN0cmluZyBfaXNTZXRNZXRob2RTY29wZTsKLSAgcHJpdmF0ZSBib29sZWFuIF9pc1NldE1ldGhvZDsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9hbGlhc09mOwotICBwcml2YXRlIFN0cmluZyAgX2pzcFByb3BlcnR5TmFtZTsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9maWVsZFByb3BlcnR5TmFtZTsKLSAgcHJpdmF0ZSBib29sZWFuIF9yZXF1aXJlZDsKLSAgcHJpdmF0ZSBib29sZWFuIF9saXRlcmFsT25seTsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdGF0ZUhvbGRlcjsKLSAgcHJpdmF0ZSBib29sZWFuIF90cmFuc2llbnQ7Ci0gIHByaXZhdGUgYm9vbGVhbiBfbGlzdDsKLSAgcHJpdmF0ZSBib29sZWFuIF90YWdBdHRyaWJ1dGVFeGNsdWRlZDsKLSAgcHJpdmF0ZSBib29sZWFuIF9lbnVtOwotICBwcml2YXRlIGJvb2xlYW4gX3VzZU1heFRpbWU7Ci0gIHByaXZhdGUgU3RyaW5nW10gX3Byb3BlcnR5VmFsdWVzOwotICBwcml2YXRlIFN0cmluZ1tdIF91bnN1cHBvcnRlZEFnZW50cyA9IF9FTVBUWV9BUlJBWTsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBfdW5zdXBwb3J0ZWRSZW5kZXJLaXRzID0gX0VNUFRZX0FSUkFZOwotCi0gIHN0YXRpYyBwcml2YXRlIFN0cmluZ1tdIF9FTVBUWV9BUlJBWSA9IG5ldyBTdHJpbmdbMF07Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJLaXRCZWFuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyS2l0QmVhbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTQ2NjYxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJLaXRCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qKgotICogUmVuZGVyS2l0QmVhbiBpcyBhIEphdmEgcmVwcmVzZW50YXRpb24gb2YgdGhlIGZhY2VzLWNvbmZpZyByZW5kZXIta2l0Ci0gKiBYTUwgZWxlbWVudC4KLSAqLwotcHVibGljIGNsYXNzIFJlbmRlcktpdEJlYW4gZXh0ZW5kcyBPYmplY3RCZWFuCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IFJlbmRlcktpdEJlYW4uCi0gICAqLwotICBwdWJsaWMgUmVuZGVyS2l0QmVhbigpCi0gIHsKLSAgICBfcmVuZGVyZXJzID0gbmV3IFRyZWVNYXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZW5kZXIga2l0IGlkIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIHJlbmRlcktpdElkICB0aGUgcmVuZGVyIGtpdCBpZAotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyS2l0SWQoCi0gICAgU3RyaW5nIHJlbmRlcktpdElkKQotICB7Ci0gICAgX3JlbmRlcktpdElkID0gcmVuZGVyS2l0SWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyIGtpdCBpZCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlciBraXQgaWQKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0UmVuZGVyS2l0SWQoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJLaXRJZDsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgcmVuZGVyZXIgdG8gdGhpcyByZW5kZXIga2l0LgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyZXIgIHRoZSByZW5kZXJlciB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFJlbmRlcmVyKAotICAgIFJlbmRlcmVyQmVhbiByZW5kZXJlcikKLSAgewotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHkgPSByZW5kZXJlci5nZXRDb21wb25lbnRGYW1pbHkoKTsKLSAgICBTdHJpbmcgcmVuZGVyZXJUeXBlID0gcmVuZGVyZXIuZ2V0UmVuZGVyZXJUeXBlKCk7Ci0gICAgU3RyaW5nIGNvbXBvc2l0ZUtleSA9IGNvbXBvbmVudEZhbWlseSArICJ8IiArIHJlbmRlcmVyVHlwZTsKLSAgICBfcmVuZGVyZXJzLnB1dChjb21wb3NpdGVLZXksIHJlbmRlcmVyKTsKLQotICAgIEZhY2VzQ29uZmlnQmVhbiBvd25lciA9IGdldE93bmVyKCk7Ci0gICAgaWYgKG93bmVyICE9IG51bGwpCi0gICAgewotICAgICAgcmVuZGVyZXIuYXR0YWNoKG93bmVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgZm9yIHRoaXMgY29tcG9uZW50IGZhbWlseSBhbmQgcmVuZGVyZXIgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudEZhbWlseSAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICogQHBhcmFtIHJlbmRlcmVyVHlwZSAgICAgdGhlIHJlbmRlcmVyIHR5cGUKLSAgICovCi0gIHB1YmxpYyBSZW5kZXJlckJlYW4gZmluZFJlbmRlcmVyKAotICAgIFN0cmluZyBjb21wb25lbnRGYW1pbHksCi0gICAgU3RyaW5nIHJlbmRlcmVyVHlwZSkKLSAgewotICAgIFN0cmluZyBjb21wb3NpdGVLZXkgPSBjb21wb25lbnRGYW1pbHkgKyAifCIgKyByZW5kZXJlclR5cGU7Ci0gICAgcmV0dXJuIChSZW5kZXJlckJlYW4pIF9yZW5kZXJlcnMuZ2V0KGNvbXBvc2l0ZUtleSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgcmVuZGVyIGtpdCBoYXMgYW55IHJlbmRlcmVycy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgcmVuZGVyIGtpdCBoYXMgYW55IHJlbmRlcmVycywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzUmVuZGVyZXJzKCkKLSAgewotICAgIHJldHVybiAhX3JlbmRlcmVycy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIHJlbmRlcmVycyBpbiB0aGlzIHJlbmRlciBraXQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIHJlbmRlcmVycygpCi0gIHsKLSAgICByZXR1cm4gX3JlbmRlcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEF0dGFjaGVzIHRoZSBjb21wb25lbnQgYW5kIGFsbCBldmVudCByZWZlcmVuY2VzLgotICAgKgotICAgKiBAcGFyYW0gb3duZXIgIHRoZSBmYWNlcyBjb25maWcgb3duZXIKLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIGF0dGFjaCgKLSAgICBGYWNlc0NvbmZpZ0JlYW4gb3duZXIpCi0gIHsKLSAgICBzdXBlci5hdHRhY2gob3duZXIpOwotICAgIEl0ZXJhdG9yIHJlbmRlcmVycyA9IHJlbmRlcmVycygpOwotICAgIHdoaWxlIChyZW5kZXJlcnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFJlbmRlcmVyQmVhbiByZW5kZXJlciA9IChSZW5kZXJlckJlYW4pcmVuZGVyZXJzLm5leHQoKTsKLSAgICAgIHJlbmRlcmVyLmF0dGFjaChvd25lcik7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCBhZGRBbGxSZW5kZXJlcnMoCi0gICAgUmVuZGVyS2l0QmVhbiByZW5kZXJLaXQpCi0gIHsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZW5kZXJLaXQuX3JlbmRlcmVycy52YWx1ZXMoKS5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgewotICAgICAgLy8gdXNlIGFkZFJlbmRlcmVyIHRvIGVzdGFibGlzaCBvd25lcgotICAgICAgYWRkUmVuZGVyZXIoKFJlbmRlcmVyQmVhbilpLm5leHQoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9yZW5kZXJLaXRJZCA9ICIiOwotICBwcml2YXRlIE1hcCAgICAgX3JlbmRlcmVyczsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJlckJlYW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9SZW5kZXJlckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDZiNWVlNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvUmVuZGVyZXJCZWFuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG91bmRJdGVyYXRvcjsKLQotLyoqCi0gKiBSZW5kZXJLaXRCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIHJlbmRlci1raXQKLSAqIFhNTCBlbGVtZW50LgotICovCi1wdWJsaWMgY2xhc3MgUmVuZGVyZXJCZWFuIGV4dGVuZHMgT2JqZWN0QmVhbgotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBSZW5kZXJlckJlYW4uCi0gICAqLwotICBwdWJsaWMgUmVuZGVyZXJCZWFuKCkKLSAgewotICAgIF9hdHRyaWJ1dGVzID0gbmV3IFRyZWVNYXAoKTsKLSAgICBfZmFjZXRzID0gbmV3IFRyZWVNYXAoKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudEZhbWlseSAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldENvbXBvbmVudEZhbWlseSgKLSAgICBTdHJpbmcgY29tcG9uZW50RmFtaWx5KQotICB7Ci0gICAgX2NvbXBvbmVudEZhbWlseSA9IGNvbXBvbmVudEZhbWlseTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgZmFtaWx5IGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCBmYW1pbHkKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0Q29tcG9uZW50RmFtaWx5KCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50RmFtaWx5OwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyZXJUeXBlICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJUeXBlKAotICAgIFN0cmluZyByZW5kZXJlclR5cGUpCi0gIHsKLSAgICBfcmVuZGVyZXJUeXBlID0gcmVuZGVyZXJUeXBlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIHR5cGUgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclR5cGUoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJlclR5cGU7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGUgcmVuZGVyZXIgY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuCi0gICAqCi0gICAqIEBwYXJhbSByZW5kZXJlckNsYXNzICB0aGUgcmVuZGVyZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyB2b2lkIHNldFJlbmRlcmVyQ2xhc3MoCi0gICAgU3RyaW5nIHJlbmRlcmVyQ2xhc3MpCi0gIHsKLSAgICBfcmVuZGVyZXJDbGFzcyA9IHJlbmRlcmVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcmVuZGVyZXIgY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZW5kZXJlciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlckNsYXNzKCkKLSAgewotICAgIHJldHVybiBfcmVuZGVyZXJDbGFzczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHBhcmFtIGRlc2NyaXB0aW9uICB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdGlvbigKLSAgICBTdHJpbmcgZGVzY3JpcHRpb24pCi0gIHsKLSAgICBfZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdGlvbiBvZiB0aGlzIGF0dHJpYnV0ZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpCi0gIHsKLSAgICByZXR1cm4gX2Rlc2NyaXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIGNvbXBvbmVudCB0eXBlIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGNvbXBvbmVudFR5cGUgIHRoZSBjb21wb25lbnQgdHlwZQotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0Q29tcG9uZW50VHlwZSgKLSAgICBTdHJpbmcgY29tcG9uZW50VHlwZSkKLSAgewotICAgIF9jb21wb25lbnRUeXBlID0gY29tcG9uZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBjb21wb25lbnQgdHlwZQotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRDb21wb25lbnRUeXBlKCkKLSAgewotICAgIHJldHVybiBfY29tcG9uZW50VHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHRoZSByZW5kZXJlciBzdXBlcmNsYXNzIGZvciB0aGlzIHJlbmRlcmVyLgotICAgKgotICAgKiBAcGFyYW0gcmVuZGVyZXJTdXBlcmNsYXNzICB0aGUgcmVuZGVyZXIgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0UmVuZGVyZXJTdXBlcmNsYXNzKAotICAgIFN0cmluZyByZW5kZXJlclN1cGVyY2xhc3MpCi0gIHsKLSAgICBfcmVuZGVyZXJTdXBlcmNsYXNzID0gcmVuZGVyZXJTdXBlcmNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHJlbmRlcmVyIHN1cGVyY2xhc3MgZm9yIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcmV0dXJuICB0aGUgcmVuZGVyZXIgc3VwZXJjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRSZW5kZXJlclN1cGVyY2xhc3MoKQotICB7Ci0gICAgcmV0dXJuIF9yZW5kZXJlclN1cGVyY2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogRmluZHMgdGhlIHJlbmRlcmVyLXNwZWNpZmljIGNvbXBvbmVudCBjbGFzcyBmb3IgdGhpcyByZW5kZXJlci4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHJlbmRlcmVyLXNwZWNpZmMgY29tcG9uZW50IGNsYXNzCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGZpbmRDb21wb25lbnRDbGFzcygpCi0gIHsKLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgcmV0dXJuIChjb21wb25lbnQgIT0gbnVsbCkgPyBjb21wb25lbnQuZ2V0Q29tcG9uZW50Q2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogIm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29tcG9uZW50IjsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kcyB0aGUgYmVoYXZpb3JhbCBjb21wb25lbnQgY2xhc3MgZm9yIHRoaXMgcmVuZGVyZXIuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBiZWhhdmlvcmFsIGNvbXBvbmVudCBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBmaW5kQ29tcG9uZW50RmFtaWx5Q2xhc3MoKQotICB7Ci0gICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgIENvbXBvbmVudEJlYW4gYmVoYXZpb3JhbCA9IChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IGNvbXBvbmVudC5maW5kQmVoYXZpb3JhbENvbXBvbmVudCgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBudWxsOwotICAgIHJldHVybiAoYmVoYXZpb3JhbCAhPSBudWxsKSA/IGJlaGF2aW9yYWwuZ2V0Q29tcG9uZW50Q2xhc3MoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbXBvbmVudCI7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIGF0dHJpYnV0ZSB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGF0dHJpYnV0ZSAgdGhlIGF0dHJpYnV0ZSB0byBhZGQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZEF0dHJpYnV0ZSgKLSAgICBBdHRyaWJ1dGVCZWFuIGF0dHJpYnV0ZSkKLSAgewotICAgIF9hdHRyaWJ1dGVzLnB1dChhdHRyaWJ1dGUuZ2V0QXR0cmlidXRlTmFtZSgpLCBhdHRyaWJ1dGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGF0dHJpYnV0ZSBmb3IgdGhpcyBhdHRyaWJ1dGUgbmFtZS4KLSAgICoKLSAgICogQHBhcmFtIGF0dHJpYnV0ZU5hbWUgIHRoZSBhdHRyaWJ1dGUgbmFtZSB0byBmaW5kCi0gICAqLwotICBwdWJsaWMgQXR0cmlidXRlQmVhbiBmaW5kQXR0cmlidXRlKAotICAgIFN0cmluZyBhdHRyaWJ1dGVOYW1lKQotICB7Ci0gICAgQXR0cmlidXRlQmVhbiBhdHRyaWJ1dGUgPSAoQXR0cmlidXRlQmVhbilfYXR0cmlidXRlcy5nZXQoYXR0cmlidXRlTmFtZSk7Ci0KLSAgICBpZiAoYXR0cmlidXRlID09IG51bGwpCi0gICAgewotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQgPSByZXNvbHZlQ29tcG9uZW50VHlwZSgpOwotICAgICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICBhdHRyaWJ1dGUgPSBjb21wb25lbnQuZmluZFByb3BlcnR5KGF0dHJpYnV0ZU5hbWUpOwotICAgIH0KLQotICAgIHJldHVybiBhdHRyaWJ1dGU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgYXR0cmlidXRlcy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgYXR0cmlidXRlcywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygpCi0gIHsKLSAgICBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSAhX2F0dHJpYnV0ZXMuaXNFbXB0eSgpOwotCi0gICAgaWYgKCFoYXNBdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgICAgaGFzQXR0cmlidXRlcyB8PSBjb21wb25lbnQuaGFzUHJvcGVydGllcygpOwotICAgIH0KLQotICAgIHJldHVybiBoYXNBdHRyaWJ1dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgY29tcG9uZW50IHN1cGVydHlwZQotICAgKiBoYXMgYW55IGF0dHJpYnV0ZXMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRydWUgICBpZiB0aGlzIGNvbXBvbmVudCBvciBhbnkgc3VwZXJ0eXBlIGhhcyBhbnkgYXR0cmlidXRlcywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzQXR0cmlidXRlcygKLSAgICBib29sZWFuIGZsYXR0ZW4pCi0gIHsKLSAgICBib29sZWFuIGhhc0F0dHJpYnV0ZXMgPSBoYXNBdHRyaWJ1dGVzKCk7Ci0KLSAgICBpZiAoIWhhc0F0dHJpYnV0ZXMgJiYgZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gY29tcG9uZW50LnJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgIGhhc0F0dHJpYnV0ZXMgfD0gcGFyZW50Lmhhc1Byb3BlcnRpZXModHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc0F0dHJpYnV0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhbiBpdGVyYXRvciBmb3IgYWxsIGF0dHJpYnV0ZXMgb24gdGhpcyBjb21wb25lbnQgb25seS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGF0dHJpYnV0ZXMoKQotICB7Ci0gICAgSXRlcmF0b3IgYXR0cmlidXRlcyA9IF9hdHRyaWJ1dGVzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICBhdHRyaWJ1dGVzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoYXR0cmlidXRlcywgY29tcG9uZW50LnByb3BlcnRpZXMoKSk7Ci0KLSAgICByZXR1cm4gYXR0cmlidXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhdHRyaWJ1dGVzIG9uIHRoaXMgY29tcG9uZW50LgotICAgKgotICAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcyBvZiB0aGlzIGNvbXBvbmVudCBhbmQgaXRzIHN1cGVydHlwZSwKLSAgICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgICoKLSAgICogQHJldHVybiAgdGhlIGF0dHJpYnV0ZSBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGF0dHJpYnV0ZXMoCi0gICAgYm9vbGVhbiBmbGF0dGVuKQotICB7Ci0gICAgSXRlcmF0b3IgYXR0cmlidXRlcyA9IGF0dHJpYnV0ZXMoKTsKLSAgICBpZiAoZmxhdHRlbikKLSAgICB7Ci0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgICBpZiAoY29tcG9uZW50ICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIENvbXBvbmVudEJlYW4gcGFyZW50ID0gY29tcG9uZW50LnJlc29sdmVTdXBlcnR5cGUoKTsKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKQotICAgICAgICAgIGF0dHJpYnV0ZXMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihhdHRyaWJ1dGVzLCBwYXJlbnQucHJvcGVydGllcyh0cnVlKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBhdHRyaWJ1dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZHMgYSBmYWNldCB0byB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHBhcmFtIGZhY2V0ICB0aGUgZmFjZXQgdG8gYWRkCi0gICAqLwotICBwdWJsaWMgdm9pZCBhZGRGYWNldCgKLSAgICBGYWNldEJlYW4gZmFjZXQpCi0gIHsKLSAgICBfZmFjZXRzLnB1dChmYWNldC5nZXRGYWNldE5hbWUoKSwgZmFjZXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGZhY2V0IGZvciB0aGlzIGZhY2V0IG5hbWUuCi0gICAqCi0gICAqIEBwYXJhbSBmYWNldE5hbWUgIHRoZSBmYWNldCBuYW1lIHRvIGZpbmQKLSAgICovCi0gIHB1YmxpYyBGYWNldEJlYW4gZmluZEZhY2V0KAotICAgIFN0cmluZyBmYWNldE5hbWUpCi0gIHsKLSAgICByZXR1cm4gKEZhY2V0QmVhbilfZmFjZXRzLmdldChmYWNldE5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGNvbXBvbmVudCBoYXMgYW55IGZhY2V0cy4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSAgIGlmIHRoaXMgY29tcG9uZW50IGhhcyBhbnkgZmFjZXRzLAotICAgKiAgICAgICAgICBmYWxzZSAgb3RoZXJ3aXNlCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGYWNldHMoKQotICB7Ci0gICAgYm9vbGVhbiBoYXNGYWNldHMgPSAhX2ZhY2V0cy5pc0VtcHR5KCk7Ci0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgaGFzRmFjZXRzIHw9IGNvbXBvbmVudC5oYXNGYWNldHMoKTsKLQotICAgIHJldHVybiBoYXNGYWNldHM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoaXMgY29tcG9uZW50IG9yIGFueSBjb21wb25lbnQgc3VwZXJ0eXBlCi0gICAqIGhhcyBhbnkgZmFjZXRzLgotICAgKgotICAgKiBAcmV0dXJuICB0cnVlICAgaWYgdGhpcyBjb21wb25lbnQgb3IgYW55IHN1cGVydHlwZSBoYXMgYW55IGZhY2V0cywKLSAgICogICAgICAgICAgZmFsc2UgIG90aGVyd2lzZQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmFjZXRzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIGJvb2xlYW4gaGFzRmFjZXRzID0gaGFzRmFjZXRzKCk7Ci0KLSAgICBpZiAoIWhhc0ZhY2V0cyAmJiBmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgaGFzRmFjZXRzIHw9IHBhcmVudC5oYXNGYWNldHModHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGhhc0ZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIGFuIGl0ZXJhdG9yIGZvciBhbGwgZmFjZXRzIG9uIHRoaXMgY29tcG9uZW50IG9ubHkuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBmYWNldCBpdGVyYXRvcgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yIGZhY2V0cygpCi0gIHsKLSAgICBJdGVyYXRvciBmYWNldHMgPSBfZmFjZXRzLnZhbHVlcygpLml0ZXJhdG9yKCk7Ci0KLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCA9IHJlc29sdmVDb21wb25lbnRUeXBlKCk7Ci0gICAgaWYgKGNvbXBvbmVudCAhPSBudWxsKQotICAgICAgICBmYWNldHMgPSBuZXcgQ29tcG91bmRJdGVyYXRvcihmYWNldHMsIGNvbXBvbmVudC5mYWNldHMoKSk7Ci0KLSAgICByZXR1cm4gZmFjZXRzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYW4gaXRlcmF0b3IgZm9yIGZhY2V0cyBvbiB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgKiBAcGFyYW0gZmxhdHRlbiAgdHJ1ZSAgIGlmIHRoZSBpdGVyYXRvciBzaG91bGQgYmUgYSBjb21iaW5lZCBsaXN0IG9mCi0gICogICAgICAgICAgICAgICAgICAgICAgICBmYWNldHMgb2YgdGhpcyBjb21wb25lbnQgYW5kIGl0cyBzdXBlcnR5cGUsCi0gICogICAgICAgICAgICAgICAgIGZhbHNlICBvdGhlcndpc2UKLSAgKgotICAqIEByZXR1cm4gIHRoZSBmYWNldCBpdGVyYXRvcgotICAqLwotICBwdWJsaWMgSXRlcmF0b3IgZmFjZXRzKAotICAgIGJvb2xlYW4gZmxhdHRlbikKLSAgewotICAgIEl0ZXJhdG9yIGZhY2V0cyA9IGZhY2V0cygpOwotICAgIGlmIChmbGF0dGVuKQotICAgIHsKLSAgICAgIENvbXBvbmVudEJlYW4gY29tcG9uZW50ID0gcmVzb2x2ZUNvbXBvbmVudFR5cGUoKTsKLSAgICAgIGlmIChjb21wb25lbnQgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgQ29tcG9uZW50QmVhbiBwYXJlbnQgPSBjb21wb25lbnQucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgICAgICBpZiAocGFyZW50ICE9IG51bGwpCi0gICAgICAgICAgZmFjZXRzID0gbmV3IENvbXBvdW5kSXRlcmF0b3IoZmFjZXRzLCBwYXJlbnQuZmFjZXRzKHRydWUpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhY2V0czsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBjb21wb25lbnQgdHlwZSBpbnN0YW5jZS4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIGNvbXBvbmVudCB0eXBlIGluc3RhbmNlCi0gICAqLwotICBwdWJsaWMgQ29tcG9uZW50QmVhbiByZXNvbHZlQ29tcG9uZW50VHlwZSgpCi0gIHsKLSAgICBpZiAoX2NvbXBvbmVudFR5cGUgPT0gbnVsbCkKLSAgICAgIHJldHVybiBudWxsOwotCi0gICAgRmFjZXNDb25maWdCZWFuIG93bmVyID0gZ2V0T3duZXIoKTsKLSAgICByZXR1cm4gKG93bmVyICE9IG51bGwpID8gb3duZXIuZmluZENvbXBvbmVudChfY29tcG9uZW50VHlwZSkgOiBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgIF9kZXNjcmlwdGlvbjsKLSAgcHJpdmF0ZSBTdHJpbmcgIF9jb21wb25lbnRGYW1pbHk7Ci0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyZXJUeXBlOwotICBwcml2YXRlIFN0cmluZyAgX3JlbmRlcmVyQ2xhc3M7Ci0gIHByaXZhdGUgU3RyaW5nICBfcmVuZGVyZXJTdXBlcmNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX2NvbXBvbmVudFR5cGU7Ci0gIHByaXZhdGUgTWFwICAgICBfYXR0cmlidXRlczsKLSAgcHJpdmF0ZSBNYXAgICAgIF9mYWNldHM7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvVmFsaWRhdG9yQmVhbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL1ZhbGlkYXRvckJlYW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0YThiYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvVmFsaWRhdG9yQmVhbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZTsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1vZGlmaWVyOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBWYWxpZGF0b3JCZWFuIGlzIGEgSmF2YSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmFjZXMtY29uZmlnIHZhbGlkYXRvcgotICogWE1MIGVsZW1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBWYWxpZGF0b3JCZWFuIGV4dGVuZHMgQWJzdHJhY3RUYWdCZWFuIHsKLQotICAvKioKLSAgICogU2V0cyB0aGUgdmFsaWRhdG9yIGlkZW50aWZlciBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JJZCAgdmFsaWRhdG9yIGlkZW50aWZlcgotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9ySWQoCi0gICAgU3RyaW5nIHZhbGlkYXRvcklkKQotICB7Ci0gICAgX3ZhbGlkYXRvcklkID0gdmFsaWRhdG9ySWQ7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllciBpcyBzcGVjaWZpZWQsIG90aGVyd2lzZSBmYWxzZS4KLSAgICoKLSAgICogQHJldHVybiAgdHJ1ZSBpZiB0aGUgdmFsaWRhdG9yIGlkZW50aWZpZXIgaXMgc3BlY2lmaWVkLAotICAgKiAgICAgICAgICBvdGhlcndpc2UgZmFsc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNWYWxpZGF0b3JJZCgpCi0gIHsKLSAgICByZXR1cm4gKF92YWxpZGF0b3JJZCAhPSBudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllciBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB2YWxpZGF0b3IgaWRlbnRpZmllcgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JJZCgpCi0gIHsKLSAgICByZXR1cm4gX3ZhbGlkYXRvcklkOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbGlkYXRvciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JDbGFzcyAgdGhlIHZhbGlkYXRvciBjbGFzcwotICAgKi8KLSAgcHVibGljIHZvaWQgc2V0VmFsaWRhdG9yQ2xhc3MoCi0gICAgU3RyaW5nIHZhbGlkYXRvckNsYXNzKQotICB7Ci0gICAgX3ZhbGlkYXRvckNsYXNzID0gdmFsaWRhdG9yQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdmFsaWRhdG9yIGNsYXNzIGZvciB0aGlzIGNvbXBvbmVudC4KLSAgICoKLSAgICogQHJldHVybiAgdGhlIHZhbGlkYXRvciBjbGFzcwotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRWYWxpZGF0b3JDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3ZhbGlkYXRvckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbGlkYXRvciBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWxpZGF0b3JTdXBlckNsYXNzICB0aGUgdmFsaWRhdG9yIHN1cGVyIGNsYXNzCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRWYWxpZGF0b3JTdXBlckNsYXNzKAotICAgIFN0cmluZyB2YWxpZGF0b3JTdXBlckNsYXNzKQotICB7Ci0gICAgX3ZhbGlkYXRvclN1cGVyQ2xhc3MgPSB2YWxpZGF0b3JTdXBlckNsYXNzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIHZhbGlkYXRvciBzdXBlciBjbGFzcyBmb3IgdGhpcyBjb21wb25lbnQuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSB2YWxpZGF0b3Igc3VwZXIgY2xhc3MKLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgZ2V0VmFsaWRhdG9yU3VwZXJDbGFzcygpCi0gIHsKLSAgICByZXR1cm4gX3ZhbGlkYXRvclN1cGVyQ2xhc3M7Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyBhIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXIgdG8gdGhlIHZhbGlkYXRvciBjbGFzcy4KLSAgICoKLSAgICogQHBhcmFtIG1vZGlmaWVyICB0aGUgbW9kaWZpZXIgdG8gYmUgYWRkZWQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkZFZhbGlkYXRvckNsYXNzTW9kaWZpZXIoCi0gICAgaW50IG1vZGlmaWVyKQotICB7Ci0gICAgX3ZhbGlkYXRvckNsYXNzTW9kaWZpZXJzIHw9IG1vZGlmaWVyOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEphdmEgTGFuZ3VhZ2UgY2xhc3MgbW9kaWZpZXJzIGZvciB0aGUgdmFsaWRhdG9yIGNsYXNzLgotICAgKiBCeSBkZWZhdWx0LCB0aGVzZSBtb2RpZmllcnMgaW5jbHVkZSBNb2RpZmllci5QVUJMSUMuCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSBKYXZhIExhbmd1YWdlIGNsYXNzIG1vZGlmaWVycyBmb3IgdGhlIHZhbGlkYXRvciBjbGFzcwotICAgKi8KLSAgcHVibGljIGludCBnZXRWYWxpZGF0b3JDbGFzc01vZGlmaWVycygpCi0gIHsKLSAgICBpbnQgbW9kaWZpZXJzID0gX3ZhbGlkYXRvckNsYXNzTW9kaWZpZXJzOwotCi0gICAgaWYgKCFNb2RpZmllci5pc1ByaXZhdGUobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQcm90ZWN0ZWQobW9kaWZpZXJzKSAmJgotICAgICAgICAhTW9kaWZpZXIuaXNQdWJsaWMobW9kaWZpZXJzKSkKLSAgICB7Ci0gICAgICBtb2RpZmllcnMgfD0gTW9kaWZpZXIuUFVCTElDOwotICAgIH0KLQotICAgIHJldHVybiBtb2RpZmllcnM7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBwYXJzZVZhbGlkYXRvckNsYXNzTW9kaWZpZXIoCi0gICAgU3RyaW5nIG1vZGlmaWVyKQotICB7Ci0gICAgYWRkVmFsaWRhdG9yQ2xhc3NNb2RpZmllcihfcGFyc2VNb2RpZmllcihtb2RpZmllcikpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBzZXRUYWdDbGFzc0V4Y2x1ZGVkKGJvb2xlYW4gdGFnQ2xhc3NFeGNsdWRlZCkKLSAgewotICAgIF90YWdDbGFzc0V4Y2x1ZGVkID0gdGFnQ2xhc3NFeGNsdWRlZDsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGlzVGFnQ2xhc3NFeGNsdWRlZCgpCi0gIHsKLSAgICByZXR1cm4gX3RhZ0NsYXNzRXhjbHVkZWQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyAgX3ZhbGlkYXRvcklkOwotICBwcml2YXRlIFN0cmluZyAgX3ZhbGlkYXRvckNsYXNzOwotICBwcml2YXRlIFN0cmluZyAgX3ZhbGlkYXRvclN1cGVyQ2xhc3M7Ci0gIHByaXZhdGUgaW50ICAgICBfdmFsaWRhdG9yQ2xhc3NNb2RpZmllcnM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfdGFnQ2xhc3NFeGNsdWRlZDsKLQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvZ2dlciBfTE9HID0gTG9nZ2VyLmdldExvZ2dlcihWYWxpZGF0b3JCZWFuLmNsYXNzLmdldE5hbWUoKSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvY29udmVydGVycy9RTmFtZUNvbnZlcnRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3BhcnNlL2NvbnZlcnRlcnMvUU5hbWVDb252ZXJ0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNiOWE0Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvY29udmVydGVycy9RTmFtZUNvbnZlcnRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLmNvbnZlcnRlcnM7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Db252ZXJzaW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydFV0aWxzOwotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQ29udmVydGVyOwotCi1wdWJsaWMgZmluYWwgY2xhc3MgUU5hbWVDb252ZXJ0ZXIgaW1wbGVtZW50cyBDb252ZXJ0ZXIKLXsKLSAgcHVibGljIE9iamVjdCBjb252ZXJ0KAotICAgIENsYXNzICB0eXBlLAotICAgIE9iamVjdCB2YWx1ZSkKLSAgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgdGhyb3cgbmV3IENvbnZlcnNpb25FeGNlcHRpb24oIk1pc3NpbmcgdmFsdWUiKTsKLQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFFOYW1lKQotICAgICAgcmV0dXJuIHZhbHVlOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgcmV0dXJuIFFOYW1lLnZhbHVlT2YodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgQ29udmVyc2lvbkV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIHZvaWQgcmVnaXN0ZXIoKQotICB7Ci0gICAgQ29udmVydFV0aWxzLnJlZ2lzdGVyKG5ldyBRTmFtZUNvbnZlcnRlcigpLCBRTmFtZS5jbGFzcyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9ydWxlcy9CZWFuUHJvcGVydHlTZXR0ZXJSdWxlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcGFyc2UvcnVsZXMvQmVhblByb3BlcnR5U2V0dGVyUnVsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMzAzYjE3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9wYXJzZS9ydWxlcy9CZWFuUHJvcGVydHlTZXR0ZXJSdWxlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UucnVsZXM7Ci0KLWltcG9ydCBqYXZhLmJlYW5zLlByb3BlcnR5RGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmF4LnhtbC5uYW1lc3BhY2UuUU5hbWU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLmNvbnZlcnRlcnMuUU5hbWVDb252ZXJ0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5CZWFuVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Qcm9wZXJ0eVV0aWxzOwotCi0KLS8qKgotICogRXh0ZW5kcyBBcGFjaGUgQ29tbW9ucyBEaWdlc3RlciBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlIHRvIGFkZCBRTmFtZSBzdXBwb3J0LgotICoKLSAqIEEgUU5hbWUgY29udmV0ZXIgaXMgbm90IHN1ZmZpY2llbnQgYmVjYXVzZSBpdCByZXF1aXJlcyBjb250ZXh0dWFsCi0gKiBrbm93bGVkZ2Ugb2YgdGhlIGN1cnJlbnQgcHJlZml4LXRvLW5hbWVzcGFjZSBtYXBwaW5ncy4KLSAqLwotcHVibGljIGNsYXNzIEJlYW5Qcm9wZXJ0eVNldHRlclJ1bGUKLSAgICAgICBleHRlbmRzIG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5CZWFuUHJvcGVydHlTZXR0ZXJSdWxlCi17Ci0gIHB1YmxpYyBCZWFuUHJvcGVydHlTZXR0ZXJSdWxlKAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICBzdXBlcihwcm9wZXJ0eU5hbWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZW5kKAotICAgIFN0cmluZyBuYW1lc3BhY2UsCi0gICAgU3RyaW5nIG5hbWUpIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIE9iamVjdCB0b3AgPSBkaWdlc3Rlci5wZWVrKCk7Ci0KLSAgICBQcm9wZXJ0eURlc2NyaXB0b3IgZGVzY3JpcHRvciA9Ci0gICAgICAgICAgUHJvcGVydHlVdGlscy5nZXRQcm9wZXJ0eURlc2NyaXB0b3IodG9wLCBwcm9wZXJ0eU5hbWUpOwotCi0gICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTm9TdWNoTWV0aG9kRXhjZXB0aW9uKCJNaXNzaW5nIGJlYW4gcHJvcGVydHkgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lICsgIlwiIik7Ci0gICAgfQotCi0gICAgQ2xhc3MgcHJvcGVydHlUeXBlID0gZGVzY3JpcHRvci5nZXRQcm9wZXJ0eVR5cGUoKTsKLQotICAgIGlmIChRTmFtZS5jbGFzcy5lcXVhbHMocHJvcGVydHlUeXBlKSkKLSAgICB7Ci0gICAgICBpbnQgY29sb24gPSBib2R5VGV4dC5pbmRleE9mKCc6Jyk7Ci0gICAgICBpZiAoY29sb24gIT0gLTEpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBkaWdlc3Rlci5maW5kTmFtZXNwYWNlVVJJKGJvZHlUZXh0LnN1YnN0cmluZygwLCBjb2xvbikpOwotICAgICAgICBib2R5VGV4dCA9ICJ7IiArIG5hbWVzcGFjZVVSSSArICJ9IiArIGJvZHlUZXh0LnN1YnN0cmluZyhjb2xvbiArIDEpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoYm9keVRleHQuaW5kZXhPZigneycpID09IC0xKQotICAgICAgewotICAgICAgICBTdHJpbmcgbmFtZXNwYWNlVVJJID0gZGlnZXN0ZXIuZmluZE5hbWVzcGFjZVVSSSgiIik7Ci0gICAgICAgIGJvZHlUZXh0ID0gInsiICsgbmFtZXNwYWNlVVJJICsgIn0iICsgYm9keVRleHQuc3Vic3RyaW5nKGNvbG9uICsgMSk7Ci0gICAgICB9Ci0gICAgICBCZWFuVXRpbHMuc2V0UHJvcGVydHkodG9wLCBwcm9wZXJ0eU5hbWUsIGJvZHlUZXh0KTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHN1cGVyLmVuZChuYW1lc3BhY2UsIG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYwotICB7Ci0gICAgUU5hbWVDb252ZXJ0ZXIucmVnaXN0ZXIoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQXR0cmlidXRlRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9BdHRyaWJ1dGVGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdhY2JiNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9BdHRyaWJ1dGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5BdHRyaWJ1dGVCZWFuOwotCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQXR0cmlidXRlRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoQXR0cmlidXRlQmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIEF0dHJpYnV0ZUJlYW4gYXR0cmlidXRlKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbXBvbmVudEZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG9uZW50RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE0ZTQ3ZTIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG9uZW50RmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29tcG9uZW50QmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENvbXBvbmVudEZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKENvbXBvbmVudEJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb3VuZEl0ZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Db21wb3VuZEl0ZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNmRjMmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29tcG91bmRJdGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogQ29tcG91bmRJdGVyYXRvciBjb25zdW1lcyB0aGUgaW5pdGlhbCBpdGVyYXRvciBiZWZvcmUKLSAqIG9ic2VydmluZyB0aGUgbmV4dCBpdGVyYXRvci4KLSAqLwotcHVibGljIGNsYXNzIENvbXBvdW5kSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcgotewotICBwdWJsaWMgQ29tcG91bmRJdGVyYXRvcigKLSAgICBJdGVyYXRvciBwcmltYXJ5LAotICAgIEl0ZXJhdG9yIHNlY29uZGFyeSkKLSAgewotICAgIHRoaXMobmV3IEl0ZXJhdG9yW10ge3ByaW1hcnksIHNlY29uZGFyeX0pOwotICB9Ci0KLSAgcHVibGljIENvbXBvdW5kSXRlcmF0b3IoCi0gICAgSXRlcmF0b3JbXSBpdGVyYXRvcnMpCi0gIHsKLSAgICBfaXRlcmF0b3JzID0gaXRlcmF0b3JzOwotICAgIF9pbmRleCA9IDA7Ci0gICAgX2FkdmFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICB7Ci0gICAgcmV0dXJuIChfbmV4dCAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgbmV4dCgpCi0gIHsKLSAgICBpZiAoX25leHQgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICBPYmplY3Qgb2JqID0gX25leHQ7Ci0gICAgX2FkdmFuY2UoKTsKLSAgICByZXR1cm4gb2JqOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlKCkKLSAgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9hZHZhbmNlKCkKLSAgewotICAgIEl0ZXJhdG9yIGN1cnJlbnQgPSBfaXRlcmF0b3JzW19pbmRleF07Ci0gICAgaWYgKGN1cnJlbnQgIT0gbnVsbCAmJiAhY3VycmVudC5oYXNOZXh0KCkpCi0gICAgewotICAgICAgX2luZGV4ICsrOwotICAgICAgY3VycmVudCA9IChfaW5kZXggPCBfaXRlcmF0b3JzLmxlbmd0aCkgPyBfaXRlcmF0b3JzW19pbmRleF0gOiBudWxsOwotICAgIH0KLQotICAgIF9uZXh0ID0gKGN1cnJlbnQgIT0gbnVsbCAmJiBjdXJyZW50Lmhhc05leHQoKSkgPyBjdXJyZW50Lm5leHQoKSA6IG51bGw7Ci0gIH0KLQotICBwcml2YXRlIE9iamVjdCBfbmV4dDsKLSAgcHJpdmF0ZSBJdGVyYXRvcltdIF9pdGVyYXRvcnM7Ci0gIHByaXZhdGUgaW50IF9pbmRleDsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0NvbnZlcnRlckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29udmVydGVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlYzM4NTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvQ29udmVydGVyRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIENvbnZlcnRlckZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKENvbnZlcnRlckJlYW4pb2JqKTsKLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBib29sZWFuIGFjY2VwdCgKLSAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GYWNldEZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmFjZXRGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZmNWYyZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9GYWNldEZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2V0QmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIEZhY2V0RmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoRmFjZXRCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgRmFjZXRCZWFuIGZhY2V0KTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzODNiYjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotcHVibGljIGludGVyZmFjZSBGaWx0ZXIKLXsKLSAgYWJzdHJhY3QgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyZWRJdGVyYXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvRmlsdGVyZWRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDYwYzc2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL0ZpbHRlcmVkSXRlcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgRmlsdGVyZWRJdGVyYXRvciBpbXBsZW1lbnRzIEl0ZXJhdG9yCi17Ci0gIHB1YmxpYyBGaWx0ZXJlZEl0ZXJhdG9yKAotICAgIEl0ZXJhdG9yIGl0ZXIsCi0gICAgRmlsdGVyICAgZmlsdGVyKQotICB7Ci0gICAgX2l0ZXIgPSBpdGVyOwotICAgIF9maWx0ZXIgPSBmaWx0ZXI7Ci0gICAgX2FkdmFuY2UoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICB7Ci0gICAgcmV0dXJuIChfbmV4dCAhPSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgbmV4dCgpCi0gIHsKLSAgICBpZiAoX25leHQgPT0gbnVsbCkKLSAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0KLSAgICBPYmplY3Qgb2JqID0gX25leHQ7Ci0gICAgX2FkdmFuY2UoKTsKLSAgICByZXR1cm4gb2JqOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcmVtb3ZlKCkKLSAgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9hZHZhbmNlKCkKLSAgewotICAgIHdoaWxlIChfaXRlci5oYXNOZXh0KCkpCi0gICAgewotICAgICAgT2JqZWN0IG9iaiA9IF9pdGVyLm5leHQoKTsKLSAgICAgIGlmIChfZmlsdGVyLmFjY2VwdChvYmopKQotICAgICAgewotICAgICAgICBfbmV4dCA9IG9iajsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIF9uZXh0ID0gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgX2l0ZXI7Ci0gIHByaXZhdGUgZmluYWwgRmlsdGVyIF9maWx0ZXI7Ci0gIHByaXZhdGUgT2JqZWN0IF9uZXh0OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUHJvcGVydHlGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1Byb3BlcnR5RmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZmM1OTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUHJvcGVydHlGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUZpbHRlciBpbXBsZW1lbnRzIEZpbHRlcgotewotICBmaW5hbCBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoCi0gICAgT2JqZWN0IG9iaikKLSAgewotICAgIHJldHVybiBhY2NlcHQoKFByb3BlcnR5QmVhbilvYmopOwotICB9Ci0KLSAgYWJzdHJhY3QgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSk7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9SZW5kZXJlckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvUmVuZGVyZXJGaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAzZDRlYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9SZW5kZXJlckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlJlbmRlcmVyQmVhbjsKLQotYWJzdHJhY3QgcHVibGljIGNsYXNzIFJlbmRlcmVyRmlsdGVyIGltcGxlbWVudHMgRmlsdGVyCi17Ci0gIGZpbmFsIHB1YmxpYyBib29sZWFuIGFjY2VwdCgKLSAgICBPYmplY3Qgb2JqKQotICB7Ci0gICAgcmV0dXJuIGFjY2VwdCgoUmVuZGVyZXJCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgUmVuZGVyZXJCZWFuIHJlbmRlcmVyKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvcnRlZEl0ZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9Tb3J0ZWRJdGVyYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWU4Y2QxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvcnRlZEl0ZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLQotLyoqCi0gKiBTb3J0ZWRJdGVyYXRvciBwcmVzZW50cyB0aGUgZWxlbWVudHMgb2YgYW5vdGhlciBpdGVyYXRvciBpbiBhIHNvcnRlZCBvcmRlci4KLSAqLwotcHVibGljIGNsYXNzIFNvcnRlZEl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3IKLXsKLSAgcHVibGljIFNvcnRlZEl0ZXJhdG9yKAotICAgIEl0ZXJhdG9yIHVuc29ydGVkKQotICB7Ci0gICAgIC8vIHRoaXMgaW1wbGVtZW50YXRpb24ganVzdCBwdWxscyB0aGUgZW50aXJlIGNvbnRlbnRzIGludG8gYSBsaXN0IC0tCi0gICAgIC8vIGl0IHdpbGwgYmUgYXdrd2FyZCBpZiB0aGUgdW5zb3J0ZWQgaXRlcmF0b3IgaXMgaW5maW5pdGUKLSAgICAgQXJyYXlMaXN0IHNvcnRlZExpc3QgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgIHdoaWxlKHVuc29ydGVkLmhhc05leHQoKSkKLSAgICAgewotICAgICAgIHNvcnRlZExpc3QuYWRkKHVuc29ydGVkLm5leHQoKSk7Ci0gICAgIH0KLSAgICAgQ29sbGVjdGlvbnMuc29ydChzb3J0ZWRMaXN0KTsKLSAgICAgX3NvcnRlZCA9IHNvcnRlZExpc3QuaXRlcmF0b3IoKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIGhhc05leHQoKQotICB7Ci0gICAgcmV0dXJuIF9zb3J0ZWQuaGFzTmV4dCgpOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCBuZXh0KCkKLSAgewotICAgIHJldHVybiBfc29ydGVkLm5leHQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlbW92ZSgpCi0gIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgSXRlcmF0b3IgX3NvcnRlZDsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU291cmNlVGVtcGxhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1NvdXJjZVRlbXBsYXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkMjllZGQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvU291cmNlVGVtcGxhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotcHVibGljIGNsYXNzIFNvdXJjZVRlbXBsYXRlCi17Ci0gIHB1YmxpYyBTb3VyY2VUZW1wbGF0ZShGaWxlIGZpbGUpCi0gIHsKLSAgICBfZmlsZSA9IGZpbGU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdWJzdGl0dXRlKFN0cmluZyBpbiwgU3RyaW5nIG91dCkKLSAgewotICAgIF9zdWJzdGl0dXRpb25zLnB1dChpbiwgb3V0KTsKLSAgfQotCi0gIHB1YmxpYyBTZXQgZ2V0SW1wb3J0cygpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbXBvcnRzKTsKLSAgfQotCi0gIHB1YmxpYyBTZXQgZ2V0SW1wbGVtZW50cygpCi0gIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlU2V0KF9pbXBsZW1lbnRzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHJlYWRQcmVmYWNlKCkgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBfcmVhZGVyID0gbmV3IEJ1ZmZlcmVkUmVhZGVyKG5ldyBGaWxlUmVhZGVyKF9maWxlKSk7Ci0gICAgd2hpbGUgKHRydWUpCi0gICAgewotICAgICAgU3RyaW5nIGxpbmUgPSBfcmVhZGVyLnJlYWRMaW5lKCk7Ci0gICAgICBpZiAobGluZSA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJGaWxlICIgKyBfZmlsZSArICIgZW5kZWQgcHJlbWF0dXJlbHkiKTsKLQotICAgICAgaWYgKGxpbmUuZXF1YWxzKCJ7IikpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBpZiAobGluZS5zdGFydHNXaXRoKCJpbXBvcnQgIikpCi0gICAgICB7Ci0gICAgICAgIGxpbmUgPSBsaW5lLnRyaW0oKTsKLSAgICAgICAgU3RyaW5nIGltcG9ydGVkID0gbGluZS5zdWJzdHJpbmcoImltcG9ydCAiLmxlbmd0aCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIF9pbXBvcnRzLmFkZChpbXBvcnRlZCk7Ci0gICAgICAgIF9mcWNuTWFwLnB1dChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhpbXBvcnRlZCksIGltcG9ydGVkKTsKLSAgICAgIH0KLQotICAgICAgaW50IGluZGV4ID0gbGluZS5pbmRleE9mKCIgaW1wbGVtZW50cyAiKTsKLSAgICAgIGlmIChpbmRleCAhPSAtMSkKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGNsYXVzZSA9IGxpbmUuc3Vic3RyaW5nKGluZGV4ICsgIiBpbXBsZW1lbnRzICIubGVuZ3RoKCkpOwotICAgICAgICBTdHJpbmdbXSBpbnRlcmZhY2VzID0gY2xhdXNlLnNwbGl0KCIsICIpOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCBpbnRlcmZhY2VzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIGNsYXNzTmFtZSA9IGludGVyZmFjZXNbaV07Ci0gICAgICAgICAgaWYgKCFVdGlsLmlzRnVsbENsYXNzKGNsYXNzTmFtZSkpCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIGltcG9ydGVkTmFtZSA9IChTdHJpbmcpX2ZxY25NYXAuZ2V0KGNsYXNzTmFtZSk7Ci0gICAgICAgICAgICBpZiAoaW1wb3J0ZWROYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgIGNsYXNzTmFtZSA9IGltcG9ydGVkTmFtZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgX2ltcGxlbWVudHMuYWRkKGNsYXNzTmFtZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlQ29udGVudChXcml0ZXIgb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIHdoaWxlICh0cnVlKQotICAgIHsKLSAgICAgIFN0cmluZyBsaW5lID0gX3JlYWRlci5yZWFkTGluZSgpOwotICAgICAgaWYgKGxpbmUgPT0gbnVsbCkKLSAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigiRmlsZSAiICsgX2ZpbGUgKyAiIGVuZGVkIHByZW1hdHVyZWx5Iik7Ci0KLSAgICAgIGlmIChsaW5lLnRyaW0oKS5zdGFydHNXaXRoKF9JR05PUkVfUFJFRklYKSl7Ci0gICAgICAgICAgaWYgKGxpbmUudHJpbSgpLnN0YXJ0c1dpdGgoX0lHTk9SRV9QUkVGSVgyKSl7Ci0gICAgICAgICAgICAgIFN0cmluZyBtZXRob2QgPSBsaW5lLnRyaW0oKS5zdWJzdHJpbmcoX0lHTk9SRV9QUkVGSVgyLmxlbmd0aCgpKS50cmltKCk7Ci0gICAgICAgICAgICAgIGlmIChtZXRob2QubGVuZ3RoKCkgPiAwICl7Ci0gICAgICAgICAgICAgICAgICBfaWdub3JlTWV0aG9kcy5hZGQobWV0aG9kKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGxpbmUuZXF1YWxzKCJ9IikpCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBsaW5lID0gX3N1YnN0aXR1dGUobGluZSk7Ci0gICAgICBvdXQud3JpdGUobGluZSk7Ci0gICAgICBvdXQud3JpdGUoIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xvc2UoKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIF9yZWFkZXIuY2xvc2UoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9zdWJzdGl0dXRlKFN0cmluZyBpbikKLSAgewotICAgIEl0ZXJhdG9yIGtleXMgPSBfc3Vic3RpdHV0aW9ucy5rZXlTZXQoKS5pdGVyYXRvcigpOwotICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5ID0gKFN0cmluZykga2V5cy5uZXh0KCk7Ci0gICAgICBTdHJpbmcgdmFsdWUgPSAoU3RyaW5nKSBfc3Vic3RpdHV0aW9ucy5nZXQoa2V5KTsKLSAgICAgIGluID0gX3N1YnN0aXR1dGUoaW4sIGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIHJldHVybiBpbjsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIFN0cmluZyBfc3Vic3RpdHV0ZShTdHJpbmcgaW4sIFN0cmluZyBmcm9tLCBTdHJpbmcgdG8pCi0gIHsKLSAgICBpbnQgaW5kZXggPSBpbi5pbmRleE9mKGZyb20pOwotICAgIGlmIChpbmRleCA8IDApCi0gICAgICByZXR1cm4gaW47Ci0KLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcihpbi5sZW5ndGgoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8ubGVuZ3RoKCkgLSBmcm9tLmxlbmd0aCgpKTsKLSAgICBidWZmZXIuYXBwZW5kKGluLnN1YnN0cmluZygwLCBpbmRleCkpOwotICAgIGJ1ZmZlci5hcHBlbmQodG8pOwotICAgIFN0cmluZyBzdWZmaXggPSBpbi5zdWJzdHJpbmcoaW5kZXggKyBmcm9tLmxlbmd0aCgpKTsKLSAgICBidWZmZXIuYXBwZW5kKF9zdWJzdGl0dXRlKHN1ZmZpeCwgZnJvbSwgdG8pKTsKLQotICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgfQotCi0gICAgcHVibGljIENvbGxlY3Rpb24gZ2V0SWdub3JlTWV0aG9kcygpIHsKLSAgICAgICAgcmV0dXJuIF9pZ25vcmVNZXRob2RzOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZSAgICAgICAgICAgX2ZpbGU7Ci0gIHByaXZhdGUgQnVmZmVyZWRSZWFkZXIgX3JlYWRlcjsKLSAgcHJpdmF0ZSBTZXQgICAgICAgICAgICBfaW1wb3J0cyA9IG5ldyBIYXNoU2V0KCk7Ci0gIHByaXZhdGUgTWFwICAgICAgICAgICAgX2ZxY25NYXAgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIFNldCAgICAgICAgICAgIF9pbXBsZW1lbnRzID0gbmV3IEhhc2hTZXQoKTsKLSAgcHJpdmF0ZSBNYXAgICAgICAgICAgICBfc3Vic3RpdHV0aW9ucyA9IG5ldyBIYXNoTWFwKCk7Ci0gIHByaXZhdGUgU2V0ICAgICAgICAgICAgX2lnbm9yZU1ldGhvZHMgPSBuZXcgSGFzaFNldCgpOwotCi0gIC8vIE1hZ2ljIHN5bnRheCBpbmRpY2F0aW5nICJwbGVhc2UgaWdub3JlIHRoaXMgbGluZSIKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9JR05PUkVfUFJFRklYID0gIi8qKi8iOwotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0lHTk9SRV9QUkVGSVgyID0gIi8qKi8vLyI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9VdGlsLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9VdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlOWZiYWUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDg5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Qcm9wZXJ0eUJlYW47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4Lk1hdGNoZXI7Ci1pbXBvcnQgamF2YS51dGlsLnJlZ2V4LlBhdHRlcm47Ci0KLXB1YmxpYyBjbGFzcyBVdGlsCi17Ci0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGNvbnZlcnRDbGFzc1RvU291cmNlUGF0aCgKLSAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgIFN0cmluZyBmaWxlRXh0ZW5zaW9uKQotICB7Ci0gICAgcmV0dXJuIChjbGFzc05hbWUucmVwbGFjZSgnLicsIEZpbGUuc2VwYXJhdG9yQ2hhcikgKyBmaWxlRXh0ZW5zaW9uKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc0Z1bGxDbGFzcygKLSAgICBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgcmV0dXJuIChjbGFzc05hbWUgIT0gbnVsbCAmJiBjbGFzc05hbWUuaW5kZXhPZignLicpICE9IC0xKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGdldEdlbmVyaWNzRnJvbVByb3BlcnR5KFByb3BlcnR5QmVhbiBwcm9wZXJ0eSl7Ci0gICAgICBTdHJpbmcgZ2VuID0gIiI7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3BlcnR5LmdldEF0dHJpYnV0ZUNsYXNzUGFyYW1ldGVycygpLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKGk+MCl7Ci0gICAgICAgICAgICAgIGdlbiArPSAiLCI7Ci0gICAgICAgICAgfQotICAgICAgICAgIGdlbiArPSBnZXRDbGFzc0Zyb21GdWxsQ2xhc3MocHJvcGVydHkuZ2V0QXR0cmlidXRlQ2xhc3NQYXJhbWV0ZXJzKClbaV0pOyAgICAgICAgICAKLSAgICAgIH0KLSAgICAgIHJldHVybiAoZ2VuLmxlbmd0aCgpID4gMD8iPCIrZ2VuKyI+IjpnZW4pOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKAotICAgIFN0cmluZyBmdWxsQ2xhc3MpCi0gIHsKLSAgICBpZiAoZnVsbENsYXNzID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGludCBsYXN0U2VwID0gZnVsbENsYXNzLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgLy8gTm90ZTogdGhpcyBjb2RlIGFsc28gd29ya3MgZm9yIHRoZSBlbXB0eSBwYWNrYWdlCi0gICAgcmV0dXJuIChmdWxsQ2xhc3Muc3Vic3RyaW5nKGxhc3RTZXAgKyAxKSk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlRnJvbUZ1bGxDbGFzcygKLSAgICBTdHJpbmcgZnVsbENsYXNzKQotICB7Ci0gICAgaWYgKGZ1bGxDbGFzcyA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBpbnQgbGFzdFNlcCA9IGZ1bGxDbGFzcy5sYXN0SW5kZXhPZignLicpOwotCi0gICAgLy8gZGV0ZWN0IHRoZSBlbXB0eSBwYWNrYWdlCi0gICAgaWYgKGxhc3RTZXAgPT0gLTEpCi0gICAgICByZXR1cm4gIiI7Ci0KLSAgICByZXR1cm4gKGZ1bGxDbGFzcy5zdWJzdHJpbmcoMCwgbGFzdFNlcCkpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gZ2V0Q29uc3RhbnROYW1lRnJvbVByb3BlcnR5KHByb3BlcnR5TmFtZSwgbnVsbCk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRDb25zdGFudE5hbWVGcm9tUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICBTdHJpbmcgY29uc3RhbnRTdWZmaXgpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgY29uc3RhbnROYW1lID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gICAgZm9yIChpbnQgaT0wOyBpIDwgcHJvcGVydHlOYW1lLmxlbmd0aCgpOyBpKyspCi0gICAgewotICAgICAgY2hhciBjaCA9IHByb3BlcnR5TmFtZS5jaGFyQXQoaSk7Ci0gICAgICBpZiAoaSA+IDAgJiYKLSAgICAgICAgICBDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpICYmCi0gICAgICAgICAgQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKHByb3BlcnR5TmFtZS5jaGFyQXQoaS0xKSkpCi0gICAgICB7Ci0gICAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoJ18nKTsKLSAgICAgIH0KLSAgICAgIGNoID0gQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKTsKLSAgICAgIGNvbnN0YW50TmFtZS5hcHBlbmQoY2gpOwotICAgIH0KLQotICAgIGlmIChjb25zdGFudFN1ZmZpeCAhPSBudWxsKQotICAgICAgY29uc3RhbnROYW1lLmFwcGVuZChjb25zdGFudFN1ZmZpeCk7Ci0KLSAgICByZXR1cm4gY29uc3RhbnROYW1lLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRQcmVmaXhlZFByb3BlcnR5TmFtZSgKLSAgICBTdHJpbmcgcHJlZml4LAotICAgIFN0cmluZyBwcm9wZXJ0eU5hbWUpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4ICsgQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKHByb3BlcnR5TmFtZS5jaGFyQXQoMCkpICsKLSAgICAgICAgICAgcHJvcGVydHlOYW1lLnN1YnN0cmluZygxKTsKLSAgfQotICAKLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UHJvcGVydHlDbGFzcyhQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgU3RyaW5nIHByb3BlcnR5Q2xhc3MgPSBVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyhwcm9wZXJ0eUZ1bGxDbGFzcyk7Ci0gICAgU3RyaW5nW10gZ2VuZXJpY1R5cGVzID0gcHJvcGVydHkuZ2V0UHJvcGVydHlDbGFzc1BhcmFtZXRlcnMoKTsKLSAgICBpZihnZW5lcmljVHlwZXMgIT0gbnVsbCAmJiBnZW5lcmljVHlwZXMubGVuZ3RoID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7Ci0gICAgICBidWZmZXIuYXBwZW5kKHByb3BlcnR5Q2xhc3MpOwotICAgICAgYnVmZmVyLmFwcGVuZCgnPCcpOwotICAgICAgaW50IG1heCA9IGdlbmVyaWNUeXBlcy5sZW5ndGggLSAxOwotICAgICAgZm9yKGludCBpID0gMDsgaSA8PSBtYXg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgX2J1aWxkUHJvcGVydHlDbGFzcyhidWZmZXIsIGdlbmVyaWNUeXBlc1tpXSk7Ci0gICAgICAgIGlmKGkgPCBtYXgpCi0gICAgICAgIHsKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCIsICIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBidWZmZXIuYXBwZW5kKCc+Jyk7Ci0gICAgICAKLSAgICAgIHByb3BlcnR5Q2xhc3MgPSBidWZmZXIudG9TdHJpbmcoKTsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIHByb3BlcnR5Q2xhc3M7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRNZXRob2ROYW1lRnJvbUV2ZW50KAotICAgIFN0cmluZyBtZXRob2RQcmVmaXgsCi0gICAgU3RyaW5nIGV2ZW50TmFtZSwKLSAgICBTdHJpbmcgbWV0aG9kU3VmZml4KQotICB7Ci0gICAgcmV0dXJuIG1ldGhvZFByZWZpeCArCi0gICAgICAgICAgIENoYXJhY3Rlci50b1VwcGVyQ2FzZShldmVudE5hbWUuY2hhckF0KDApKSArCi0gICAgICAgICAgIGV2ZW50TmFtZS5zdWJzdHJpbmcoMSkgKwotICAgICAgICAgICBtZXRob2RTdWZmaXg7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRNZXRob2RSZWFkZXJGcm9tUHJvcGVydHkoCi0gICAgU3RyaW5nIHByb3BlcnR5TmFtZSwKLSAgICBTdHJpbmcgcHJvcGVydHlDbGFzcykKLSAgewotICAgIFN0cmluZyBtZXRob2RQcmVmaXggPSAoImJvb2xlYW4iLmVxdWFscyhwcm9wZXJ0eUNsYXNzKSA/ICJpcyIgOiAiZ2V0Iik7Ci0gICAgcmV0dXJuIGdldFByZWZpeGVkUHJvcGVydHlOYW1lKG1ldGhvZFByZWZpeCwgcHJvcGVydHlOYW1lKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEV2ZW50TmFtZUZyb21FdmVudFR5cGUoCi0gICAgU3RyaW5nIGV2ZW50RnVsbENsYXNzKQotICB7Ci0gICAgU3RyaW5nIGV2ZW50TmFtZSA9IGdldENsYXNzRnJvbUZ1bGxDbGFzcyhldmVudEZ1bGxDbGFzcyk7Ci0gICAgcmV0dXJuIENoYXJhY3Rlci50b0xvd2VyQ2FzZShldmVudE5hbWUuY2hhckF0KDApKSArCi0gICAgICAgICAgIGV2ZW50TmFtZS5zdWJzdHJpbmcoMSwgZXZlbnROYW1lLmxlbmd0aCgpKTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgYm9vbGVhbiBpc1ByaW1pdGl2ZUNsYXNzKAotICAgIFN0cmluZyBjbGFzc05hbWUpCi0gIHsKLSAgICByZXR1cm4gImJvb2xlYW4iLmVxdWFscyhjbGFzc05hbWUpIHx8Ci0gICAgICAgICAgICJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAiY2hhciIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImRvdWJsZSIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgImZsb2F0Ii5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSB8fAotICAgICAgICAgICAibG9uZyIuZXF1YWxzKGNsYXNzTmFtZSkgfHwKLSAgICAgICAgICAgInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKTsKLSAgfQotICAKLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0QWx0ZXJuYXRlUHJvcGVydHlDbGFzcyhQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgYnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcig2MCk7Ci0gICAgX2J1aWxkUHJvcGVydHlDbGFzcyhidWZmZXIsIHByb3BlcnR5LmdldEFsdGVybmF0ZUNsYXNzKCkpOwotICAgIAotICAgIHJldHVybiBidWZmZXIudG9TdHJpbmcoKTsKLSAgfQotICAKLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0UHJpbWl0aXZlVHlwZShTdHJpbmcgY2xhc3NOYW1lKXsgICAgICAKLSAgICAgIGlmIChjbGFzc05hbWUuc3RhcnRzV2l0aCgiamF2YS5sYW5nLiIpKQotICAgICAgewotICAgICAgICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5yZXBsYWNlKCJqYXZhLmxhbmcuIiwgIiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBpZiAoY2xhc3NOYW1lLmVuZHNXaXRoKCJlZ2VyIikpCi0gICAgICB7Ci0gICAgICAgICAgY2xhc3NOYW1lID0gY2xhc3NOYW1lLnJlcGxhY2UoImVnZXIiLCAiIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmIChVdGlsLmlzUHJpbWl0aXZlQ2xhc3MoY2xhc3NOYW1lLnRvTG93ZXJDYXNlKCkpKQotICAgICAgewotICAgICAgICAgIHJldHVybiBjbGFzc05hbWUudG9Mb3dlckNhc2UoKTsKLSAgICAgIH1lbHNlCi0gICAgICB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICAKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldEJveGVkQ2xhc3MoCi0gICAgU3RyaW5nIGNsYXNzTmFtZSkKLSAgewotICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkJvb2xlYW4iOwotICAgIGVsc2UgaWYgKCJieXRlIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiQnl0ZSI7Ci0gICAgZWxzZSBpZiAoImNoYXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJDaGFyYWN0ZXIiOwotICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJEb3VibGUiOwotICAgIGVsc2UgaWYgKCJmbG9hdCIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIkZsb2F0IjsKLSAgICBlbHNlIGlmICgiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiSW50ZWdlciI7Ci0gICAgZWxzZSBpZiAoImxvbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJMb25nIjsKLSAgICBlbHNlIGlmICgic2hvcnQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICJTaG9ydCI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIHByaW1pdGl2ZURlZmF1bHRWYWx1ZShTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgIGlmICgiYm9vbGVhbiIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gImZhbHNlIjsKLSAgICBlbHNlIGlmICgiYnl0ZSIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgICByZXR1cm4gIjAiOwotICAgIGVsc2UgaWYgKCJjaGFyIi5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiJyciOwotICAgIGVsc2UgaWYgKCJkb3VibGUiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwLjBkIjsKLSAgICBlbHNlIGlmICgiZmxvYXQiLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwLjBmIjsKLSAgICBlbHNlIGlmICgiaW50Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgZWxzZSBpZiAoImxvbmciLmVxdWFscyhjbGFzc05hbWUpKQotICAgICAgcmV0dXJuICIwTCI7Ci0gICAgZWxzZSBpZiAoInNob3J0Ii5lcXVhbHMoY2xhc3NOYW1lKSkKLSAgICAgIHJldHVybiAiMCI7Ci0gICAgZWxzZQotICAgICAgcmV0dXJuIGNsYXNzTmFtZTsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGZpbGwoCi0gICAgU3RyaW5nIGJhc2UsCi0gICAgaW50ICAgIGxlbmd0aCkKLSAgewotICAgIGlmIChiYXNlID09IG51bGwgfHwgYmFzZS5sZW5ndGgoKSA+IGxlbmd0aCkKLSAgICAgIHJldHVybiBiYXNlOwotCi0gICAgU3RyaW5nQnVmZmVyIGZpbGxlZCA9IG5ldyBTdHJpbmdCdWZmZXIoYmFzZSk7Ci0gICAgZm9yIChpbnQgaT1iYXNlLmxlbmd0aCgpOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgZmlsbGVkLmFwcGVuZCgnICcpOwotICAgIH0KLSAgICByZXR1cm4gZmlsbGVkLnRvU3RyaW5nKCk7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBnZXRWYXJpYWJsZUZyb21DbGFzcygKLSAgICBTdHJpbmcgY2xhc3NOYW1lKQotICB7Ci0gICAgaWYgKGNsYXNzTmFtZSA9PSBudWxsKQotICAgICAgcmV0dXJuIG51bGw7Ci0KLSAgICBmb3IgKGludCBpPTA7IGkgPCBjbGFzc05hbWUubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGNoID0gY2xhc3NOYW1lLmNoYXJBdChpKTsKLSAgICAgIGlmIChDaGFyYWN0ZXIuaXNMb3dlckNhc2UoY2gpKQotICAgICAgewotICAgICAgICBpZiAoaSA+IDApCi0gICAgICAgIHsKLSAgICAgICAgICByZXR1cm4gQ2hhcmFjdGVyLnRvTG93ZXJDYXNlKGNsYXNzTmFtZS5jaGFyQXQoaSAtIDEpKSArCi0gICAgICAgICAgICAgICAgIGNsYXNzTmFtZS5zdWJzdHJpbmcoaSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQ2xhc3MgbmFtZSBcIiIgKyBjbGFzc05hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGRvZXMgbm90IHVzZSBpbml0Y2FwcyIpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgZ2V0VmFyaWFibGVGcm9tTmFtZSgKLSAgICBTdHJpbmcgbmFtZSkKLSAgewotICAgIGlmIChuYW1lID09IG51bGwpCi0gICAgICByZXR1cm4gbnVsbDsKLQotICAgIGlmIChSRVNFUlZFRF9XT1JEUy5jb250YWlucyhuYW1lKSkKLSAgICAgIG5hbWUgPSBuYW1lICsgIlBhcmFtIjsKLQotICAgIHJldHVybiBuYW1lOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvTGl0ZXJhbChTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICByZXR1cm4gY29udmVydFN0cmluZ1RvTGl0ZXJhbCgiU3RyaW5nIiwgdmFsdWUpOwotICB9Ci0KLSAgc3RhdGljIHB1YmxpYyBTdHJpbmcgY29udmVydFN0cmluZ1RvTGl0ZXJhbChTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgdmFsdWUpCi0gIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0gICAgZWxzZSBpZiAoIlN0cmluZyIuZXF1YWxzKGNsYXNzTmFtZSkpCi0gICAgewotICAgICAgcmV0dXJuICJcIiIgKyB2YWx1ZS5yZXBsYWNlQWxsKCJcJyIsICJcXCciKSArICJcIiI7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJOdW1iZXIiLmVxdWFscyhjbGFzc05hbWUpKQotICAgIHsKLSAgICAgIC8vIERvdWJsZSB2cy4gSW50ZWdlci4KLSAgICAgIGlmKHZhbHVlLmluZGV4T2YoIi4iKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuICJJbnRlZ2VyLnZhbHVlT2YoIiArIHZhbHVlICsgIikiOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZXR1cm4gIkRvdWJsZS52YWx1ZU9mKCIgKyB2YWx1ZSArICIpIjsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAgIHN0YXRpYyBwdWJsaWMgU3RyaW5nIGdldERlZmF1bHRWYWx1ZShQcm9wZXJ0eUJlYW4gcHJvcGVydHkpewotICAgICAgICBTdHJpbmcgcHJvcGVydHlGdWxsQ2xhc3MgPSBwcm9wZXJ0eS5nZXRQcm9wZXJ0eUNsYXNzKCk7Ci0gICAgICAgIFN0cmluZyBkZWYgPSBwcm9wZXJ0eS5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgaWYgKGRlZiA9PSBudWxsIHx8IGRlZi5sZW5ndGgoKSA9PSAwKXsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc1ByaW1pdGl2ZUNsYXNzKHByb3BlcnR5RnVsbENsYXNzKSl7Ci0gICAgICAgICAgICByZXR1cm4gZGVmOwotICAgICAgICB9IGVsc2UgaWYgKCJqYXZhLmxhbmcuU3RyaW5nIi5lcXVhbHMocHJvcGVydHlGdWxsQ2xhc3MpKXsKLSAgICAgICAgICAgIGlmIChkZWYuc3RhcnRzV2l0aCgiXCIiKSAmJiBkZWYuZW5kc1dpdGgoIlwiIikpewotICAgICAgICAgICAgICAgIHJldHVybiBkZWY7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiAiXCIiK2RlZisiXCIiOwotICAgICAgICAgICAgfQotICAgICAgICB9ZWxzZXsKLSAgICAgICAgICAgIC8vQW55IG90aGVyIGNsYXNzLCBzbyB3ZSByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUKLSAgICAgICAgICAgIHJldHVybiBkZWY7ICAgICAgICAgICAgCi0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBzdGF0aWMgcHJpdmF0ZSB2b2lkIF9idWlsZFByb3BlcnR5Q2xhc3MoU3RyaW5nQnVmZmVyIGJ1ZmZlciwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBNYXRjaGVyIG1hdGNoZXIgPSBfR0VORVJJQ19UWVBFLm1hdGNoZXIodHlwZSk7Ci0gICAgaWYobWF0Y2hlci5tYXRjaGVzKCkpCi0gICAgewotICAgICAgLy8gR2VuZXJpYyB0eXBlCi0gICAgICBidWZmZXIuYXBwZW5kKFV0aWwuZ2V0Q2xhc3NGcm9tRnVsbENsYXNzKG1hdGNoZXIuZ3JvdXAoMSkpKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoJzwnKTsKLSAgICAgIFN0cmluZ1tdIHR5cGVzID0gbWF0Y2hlci5ncm91cCgyKS5zcGxpdCgiLCIpOwotICAgICAgaW50IG1heCA9IHR5cGVzLmxlbmd0aCAtIDE7Ci0gICAgICBmb3IoaW50IGkgPSAwOyBpIDw9IG1heDsgaSsrKQotICAgICAgewotICAgICAgICBfYnVpbGRQcm9wZXJ0eUNsYXNzKGJ1ZmZlciwgdHlwZXNbaV0pOwotICAgICAgICBpZihpIDwgbWF4KQotICAgICAgICB7Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnVmZmVyLmFwcGVuZCgnPicpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gTm9uLWdlbmVyaWMgdHlwZQotICAgICAgYnVmZmVyLmFwcGVuZChVdGlsLmdldENsYXNzRnJvbUZ1bGxDbGFzcyh0eXBlKSk7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU2V0IF9jcmVhdGVQcmltaXRpdmVUeXBlc1NldCgpCi0gIHsKLSAgICBTZXQgcHJpbWl0aXZlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgZm9yIChpbnQgaT0wOyBpIDwgX1BSSU1JVElWRV9UWVBFUy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcgdHlwZSA9IF9QUklNSVRJVkVfVFlQRVNbaV07Ci0gICAgICBwcmltaXRpdmVzLmFkZCh0eXBlKTsKLSAgICAgIHByaW1pdGl2ZXMuYWRkKHR5cGUgKyAiW10iKTsKLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChwcmltaXRpdmVzKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIFNldCBfY3JlYXRlUmVzZXJ2ZWRXb3Jkc1NldCgpCi0gIHsKLSAgICBTZXQgcmVzZXJ2ZWQgPSBuZXcgVHJlZVNldCgpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IF9SRVNFUlZFRF9XT1JEUy5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBTdHJpbmcga2V5d29yZCA9IF9SRVNFUlZFRF9XT1JEU1tpXTsKLSAgICAgIHJlc2VydmVkLmFkZChrZXl3b3JkKTsKLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChyZXNlcnZlZCk7Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmdbXSBfUFJJTUlUSVZFX1RZUEVTID0gbmV3IFN0cmluZ1tdCi0gIHsvLyBUT0RPOiBTaG91bGRuJ3QgamF2YS5sYW5nLiogYmUgc3BlY2lmaWVkIGluIHRoYXQgbGlzdCBhcyB3ZWxsPwotICAgICJib29sZWFuIiwKLSAgICAiYnl0ZSIsCi0gICAgImNoYXIiLAotICAgICJmbG9hdCIsCi0gICAgImRvdWJsZSIsCi0gICAgImludCIsCi0gICAgInNob3J0IiwKLSAgICAibG9uZyIsCi0gIH07Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX1JFU0VSVkVEX1dPUkRTID0gbmV3IFN0cmluZ1tdCi0gIHsKLSAgICAiYWJzdHJhY3QiLAotICAgICJhc3NlcnQiLAotICAgICJib29sZWFuIiwKLSAgICAiYnJlYWsiLAotICAgICJieXRlIiwKLSAgICAiY2FzZSIsCi0gICAgImNhdGNoIiwKLSAgICAiY2hhciIsCi0gICAgImNsYXNzIiwKLSAgICAiY29uc3QiLAotICAgICJjb250aW51ZSIsCi0gICAgImRlZmF1bHQiLAotICAgICJkbyIsCi0gICAgImRvdWJsZSIsCi0gICAgImVsc2UiLAotICAgICJleHRlbmRzIiwKLSAgICAiZmluYWwiLAotICAgICJmaW5hbGx5IiwKLSAgICAiZmxvYXQiLAotICAgICJmb3IiLAotICAgICJnb3RvIiwKLSAgICAiaWYiLAotICAgICJpbXBsZW1lbnRzIiwKLSAgICAiaW1wb3J0IiwKLSAgICAiaW5zdGFuY2VvZiIsCi0gICAgImludCIsCi0gICAgImludGVyZmFjZSIsCi0gICAgImxvbmciLAotICAgICJuYXRpdmUiLAotICAgICJuZXciLAotICAgICJwYWNrYWdlIiwKLSAgICAicHJpdmF0ZSIsCi0gICAgInByb3RlY3RlZCIsCi0gICAgInB1YmxpYyIsCi0gICAgInJldHVybiIsCi0gICAgInNob3J0IiwKLSAgICAic3RhdGljIiwKLSAgICAic3VwZXIiLAotICAgICJzd2l0Y2giLAotICAgICJzeW5jaHJvbml6ZWQiLAotICAgICJ0aGlzIiwKLSAgICAidGhyb3ciLAotICAgICJ0aHJvd3MiLAotICAgICJ0cmFuc2llbnQiLAotICAgICJ0cnkiLAotICAgICJ2b2lkIiwKLSAgICAidm9sYXRpbGUiLAotICAgICJ3aGlsZSIsCi0gIH07Ci0KLSAgc3RhdGljIHB1YmxpYyBmaW5hbCBTZXQgUkVTRVJWRURfV09SRFMgPSBfY3JlYXRlUmVzZXJ2ZWRXb3Jkc1NldCgpOwotICBzdGF0aWMgcHVibGljIGZpbmFsIFNldCBQUklNSVRJVkVfVFlQRVMgPSBfY3JlYXRlUHJpbWl0aXZlVHlwZXNTZXQoKTsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBQYXR0ZXJuIF9HRU5FUklDX1RZUEUgPSBQYXR0ZXJuLmNvbXBpbGUoIihbXjxdKyk8KC4rKT4iKTsKLQotICAvLyBubyBpbnN0YW5jZXMKLSAgcHJpdmF0ZSBVdGlsKCkKLSAgewotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvdXRpbC9WYWxpZGF0b3JGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1ZhbGlkYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDMxNGNjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1ZhbGlkYXRvckZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWw7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLlZhbGlkYXRvckJlYW47Ci0KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBWYWxpZGF0b3JGaWx0ZXIgaW1wbGVtZW50cyBGaWx0ZXIKLXsKLSAgZmluYWwgcHVibGljIGJvb2xlYW4gYWNjZXB0KAotICAgIE9iamVjdCBvYmopCi0gIHsKLSAgICByZXR1cm4gYWNjZXB0KChWYWxpZGF0b3JCZWFuKW9iaik7Ci0gIH0KLQotICBhYnN0cmFjdCBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgVmFsaWRhdG9yQmVhbiB2YWxpZGF0b3IpOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWEluY2x1ZGVGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hJbmNsdWRlRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1MDE0N2QuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWEluY2x1ZGVGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YS51dGlsLlN0YWNrOwotCi1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci1pbXBvcnQgb3JnLnhtbC5zYXguWE1MUmVhZGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuTmFtZXNwYWNlU3VwcG9ydDsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLlhNTEZpbHRlckltcGw7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBYSW5jbHVkZUZpbHRlciBleHRlbmRzIFhNTEZpbHRlckltcGwKLXsKLSAgcHVibGljIGZpbmFsIHN0YXRpYyBTdHJpbmcgWElOQ0xVREVfTkFNRVNQQUNFID0gImh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiOwotCi0gIHB1YmxpYyBYSW5jbHVkZUZpbHRlcigKLSAgICBYTUxSZWFkZXIgcGFyZW50LAotICAgIFVSTCAgICAgICBiYXNlKQotICB7Ci0gICAgc3VwZXIocGFyZW50KTsKLSAgICBiYXNlcy5wdXNoKGJhc2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0RG9jdW1lbnRMb2NhdG9yKAotICAgIExvY2F0b3IgbG9jYXRvcikKLSAgewotICAgIGxvY2F0b3JzLnB1c2gobG9jYXRvcik7Ci0gICAgc3VwZXIuc2V0RG9jdW1lbnRMb2NhdG9yKGxvY2F0b3IpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnRQcmVmaXhNYXBwaW5nKAotICAgIFN0cmluZyBwcmVmaXgsCi0gICAgU3RyaW5nIG5hbWVzcGFjZVVSSSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCFuYW1lc3BhY2VVUkkuZXF1YWxzKFhJTkNMVURFX05BTUVTUEFDRSkpCi0gICAgewotICAgICAgbmFtZXNwYWNlcy5kZWNsYXJlUHJlZml4KHByZWZpeCwgbmFtZXNwYWNlVVJJKTsKLSAgICAgIHN1cGVyLnN0YXJ0UHJlZml4TWFwcGluZyhwcmVmaXgsIG5hbWVzcGFjZVVSSSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgc3RhcnRFbGVtZW50KAotICAgIFN0cmluZyAgICAgbmFtZXNwYWNlVVJJLAotICAgIFN0cmluZyAgICAgbG9jYWxOYW1lLAotICAgIFN0cmluZyAgICAgcXVhbGlmaWVkTmFtZSwKLSAgICBBdHRyaWJ1dGVzIGF0dHJpYnV0ZXMpIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotICAgIG5hbWVzcGFjZXMucHVzaENvbnRleHQoKTsKLSAgICAvLyBzdXBwb3J0IGJvdGggRFREIGFuZCBTY2hlbWEKLSAgICBpZiAobmFtZXNwYWNlVVJJLmVxdWFscyhYSU5DTFVERV9OQU1FU1BBQ0UpICYmCi0gICAgICAgIGxvY2FsTmFtZS5lcXVhbHMoImluY2x1ZGUiKSkKLSAgICB7Ci0gICAgICAvLyBocmVmIGF0dHJpYnV0ZSBpcyByZXF1aXJlZAotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0KLSAgICAgIC8vIHhwb2ludGVyIGF0dHJpYnV0ZSBpcyBvcHRpb25hbAotICAgICAgU3RyaW5nIHhwb2ludGVyID0gYXR0cmlidXRlcy5nZXRWYWx1ZSgieHBvaW50ZXIiKTsKLQotICAgICAgZG9YSW5jbHVkZShocmVmLCB4cG9pbnRlcik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBzdXBlci5zdGFydEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHF1YWxpZmllZE5hbWUsIGF0dHJpYnV0ZXMpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoCi0gICAgU3RyaW5nICAgICBuYW1lc3BhY2VVUkksCi0gICAgU3RyaW5nICAgICBsb2NhbE5hbWUsCi0gICAgU3RyaW5nICAgICBxdWFsaWZpZWROYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoIW5hbWVzcGFjZVVSSS5lcXVhbHMoWElOQ0xVREVfTkFNRVNQQUNFKSkKLSAgICAgIHN1cGVyLmVuZEVsZW1lbnQobmFtZXNwYWNlVVJJLCBsb2NhbE5hbWUsIHF1YWxpZmllZE5hbWUpOwotCi0gICAgbmFtZXNwYWNlcy5wb3BDb250ZXh0KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGRlcHRoID09IDApCi0gICAgICBzdXBlci5zdGFydERvY3VtZW50KCk7Ci0KLSAgICBkZXB0aCsrOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBsb2NhdG9ycy5wb3AoKTsKLSAgICBkZXB0aC0tOwotCi0gICAgaWYgKGRlcHRoID09IDApCi0gICAgICBzdXBlci5lbmREb2N1bWVudCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGRvWEluY2x1ZGUoCi0gICAgU3RyaW5nIGhyZWYsCi0gICAgU3RyaW5nIHhwb2ludGVyKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBVUkwgdGFyZ2V0ID0gcmVzb2x2ZVVSTChocmVmKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIFNBWFBhcnNlckZhY3Rvcnkgc2F4RmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIFNBWFBhcnNlciBzYXhQYXJzZXIgPSBzYXhGYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgWE1MUmVhZGVyIHJlYWRlciA9IHNheFBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLSAgICAgIGlmICh4cG9pbnRlciAhPSBudWxsKQotICAgICAgewotICAgICAgICAvLyBwYXNzIGFsbCBwYXJzZWQgU0FYIGV2ZW50cyB0aHJvdWdoIFhQb2ludGVyRmlsdGVyCi0gICAgICAgIHJlYWRlciA9IG5ldyBYUG9pbnRlckZpbHRlcihyZWFkZXIsIG5hbWVzcGFjZXMsIHhwb2ludGVyKTsKLSAgICAgIH0KLSAgICAgIC8vIHBhc3MgYWxsIHNlbGVjdGVkIFhQb2ludGVyIFNBWCBldmVudHMgdG8gWEluY2x1ZGVGaWx0ZXIKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcih0aGlzKTsKLSAgICAgIHJlYWRlci5zZXRFbnRpdHlSZXNvbHZlcih0aGlzKTsKLSAgICAgIHJlYWRlci5zZXRFcnJvckhhbmRsZXIodGhpcyk7Ci0gICAgICByZWFkZXIuc2V0RFRESGFuZGxlcih0aGlzKTsKLQotICAgICAgLy8gcHVzaCBvbiBuZXcgYmFzZSBVUkwgaW4gY2FzZSBvZiBuZXN0ZWQgeGk6aW5jbHVkZQotICAgICAgYmFzZXMucHVzaCh0YXJnZXQpOwotICAgICAgcmVhZGVyLnBhcnNlKG5ldyBJbnB1dFNvdXJjZSh0YXJnZXQub3BlblN0cmVhbSgpKSk7Ci0gICAgICBiYXNlcy5wb3AoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJFcnJvciBkdXJpbmcgeGluY2x1ZGUgb2YgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50b0V4dGVybmFsRm9ybSgpLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigiRXJyb3IgZHVyaW5nIHhpbmNsdWRlIG9mICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQudG9FeHRlcm5hbEZvcm0oKSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBVUkwgcmVzb2x2ZVVSTCgKLSAgICBTdHJpbmcgaHJlZikgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgVVJMIGJhc2UgPSAoVVJMKSBiYXNlcy5wZWVrKCk7Ci0KLSAgICB0cnkKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFVSTChiYXNlLCBocmVmKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBTQVhFeGNlcHRpb24oIkVycm9yIHJlc29sdmluZyBocmVmIFwiIiArIGhyZWYgKyAiXCIgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhdCBiYXNlIFwiIiArIGJhc2UgKyAiXCIiLCBlKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBkZXB0aCA9IDA7Ci0KLSAgcHJpdmF0ZSBTdGFjayBiYXNlcyA9IG5ldyBTdGFjaygpOwotICBwcml2YXRlIFN0YWNrIGxvY2F0b3JzID0gbmV3IFN0YWNrKCk7Ci0gIHByaXZhdGUgTmFtZXNwYWNlU3VwcG9ydCBuYW1lc3BhY2VzID0gbmV3IE5hbWVzcGFjZVN1cHBvcnQoKTsKLX0KLQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWFBvaW50ZXJGaWx0ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy91dGlsL1hQb2ludGVyRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ5ZTdhYjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3V0aWwvWFBvaW50ZXJGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LlhNTFJlYWRlcjsKLWltcG9ydCBvcmcueG1sLnNheC5oZWxwZXJzLk5hbWVzcGFjZVN1cHBvcnQ7Ci1pbXBvcnQgb3JnLnhtbC5zYXguaGVscGVycy5YTUxGaWx0ZXJJbXBsOwotCi0vKioKLSAqIEZvciBub3csIGp1c3Qgc2tpcCB0aGUgcm9vdCBlbGVtZW50IHNpbmNlIHRoYXQncyBvdXIgdXNlY2FzZS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhQb2ludGVyRmlsdGVyIGV4dGVuZHMgWE1MRmlsdGVySW1wbAotewotICBwdWJsaWMgWFBvaW50ZXJGaWx0ZXIoCi0gICAgWE1MUmVhZGVyICAgICAgICBwYXJlbnQsCi0gICAgTmFtZXNwYWNlU3VwcG9ydCBuYW1lc3BhY2VzLAotICAgIFN0cmluZyAgICAgICAgICAgeHBvaW50ZXIpCi0gIHsKLSAgICBzdXBlcihwYXJlbnQpOwotCi0gICAgLy8gV2Ugc3VwcG9ydCBhIHZlcnkgcnVkaW1lbnRhcnkgLSBidXQgdG90YWxseSBzdWZmaWNpZW50IC0gWFBvaW50ZXIgc3ludGF4LAotICAgIC8vIHdoaWNoIGlzIGp1c3QgL2VsZW1lbnQvb3RoZXJlbGVtZW50L290aGVyb3RoZXJlbGVtZW50LyoKLSAgICBpZiAoIXhwb2ludGVyLnN0YXJ0c1dpdGgoIi8iKSB8fCAheHBvaW50ZXIuZW5kc1dpdGgoIi8qIikpCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnN1cHBvcnRlZCB4cG9pbnRlciBzeW50YXg6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4cG9pbnRlcik7Ci0KLSAgICB4cG9pbnRlciA9IHhwb2ludGVyLnN1YnN0cmluZygwLCB4cG9pbnRlci5sZW5ndGgoKSAtIDIpLnN1YnN0cmluZygxKTsKLSAgICBTdHJpbmdbXSBlbGVtZW50cyA9IHhwb2ludGVyLnNwbGl0KCIvIik7Ci0gICAgaW50IGNvdW50ID0gZWxlbWVudHMubGVuZ3RoOwotCi0gICAgX3Jvb3ROYW1lc3BhY2VVUkkgPSBuZXcgU3RyaW5nW2NvdW50XTsKLSAgICBfcm9vdExvY2FsTmFtZSA9IG5ldyBTdHJpbmdbY291bnRdOwotICAgIF9hY2NlcHRDaGlsZE5vZGVzID0gbmV3IGJvb2xlYW5bY291bnRdOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHBhcnRzID0gZWxlbWVudHNbaV0uc3BsaXQoIjoiKTsKLSAgICAgIFN0cmluZyBwcmVmaXggPSAocGFydHMubGVuZ3RoID09IDEpID8gIiIgOiBwYXJ0c1swXTsKLSAgICAgIFN0cmluZyBuYW1lc3BhY2VVUkkgPSBuYW1lc3BhY2VzLmdldFVSSShwcmVmaXgpOwotICAgICAgX3Jvb3ROYW1lc3BhY2VVUklbaV0gPSAobmFtZXNwYWNlVVJJICE9IG51bGwpID8gbmFtZXNwYWNlVVJJIDogIiI7Ci0gICAgICBfcm9vdExvY2FsTmFtZVtpXSA9IChwYXJ0cy5sZW5ndGggPT0gMSkgPyBwYXJ0c1swXSA6IHBhcnRzWzFdOwotICAgICAgX2FjY2VwdENoaWxkTm9kZXNbaV0gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoCi0gICAgU3RyaW5nICAgICBuYW1lc3BhY2VVUkksCi0gICAgU3RyaW5nICAgICBsb2NhbE5hbWUsCi0gICAgU3RyaW5nICAgICBxdWFsaWZpZWROYW1lLAotICAgIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9kZXB0aCA8IF9hY2NlcHRDaGlsZE5vZGVzLmxlbmd0aCkKLSAgICB7Ci0gICAgICBfYWNjZXB0Q2hpbGROb2Rlc1tfZGVwdGhdID0KLSAgICAgICAgICAgKF9yb290TmFtZXNwYWNlVVJJW19kZXB0aF0uZXF1YWxzKG5hbWVzcGFjZVVSSSkgJiYKLSAgICAgICAgICAgIF9yb290TG9jYWxOYW1lW19kZXB0aF0uZXF1YWxzKGxvY2FsTmFtZSkpOwotICAgIH0KLSAgICBlbHNlIGlmIChfYWNjZXB0aW5nQ2hpbGROb2RlcygpKQotICAgIHsKLSAgICAgIHN1cGVyLnN0YXJ0RWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSwgYXR0cmlidXRlcyk7Ci0gICAgfQotCi0gICAgX2RlcHRoKys7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBlbmRFbGVtZW50KAotICAgIFN0cmluZyBuYW1lc3BhY2VVUkksCi0gICAgU3RyaW5nIGxvY2FsTmFtZSwKLSAgICBTdHJpbmcgcXVhbGlmaWVkTmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgX2RlcHRoLS07Ci0KLSAgICBpZiAoX2RlcHRoID49IF9hY2NlcHRDaGlsZE5vZGVzLmxlbmd0aCAmJiBfYWNjZXB0aW5nQ2hpbGROb2RlcygpKQotICAgICAgc3VwZXIuZW5kRWxlbWVudChuYW1lc3BhY2VVUkksIGxvY2FsTmFtZSwgcXVhbGlmaWVkTmFtZSk7Ci0gIH0KLQotICAKLSAgcHJpdmF0ZSBib29sZWFuIF9hY2NlcHRpbmdDaGlsZE5vZGVzKCkKLSAgewotICAgIGZvciAoaW50IGkgPSBfYWNjZXB0Q2hpbGROb2Rlcy5sZW5ndGggLSAxOyBpID49IDA7IGktLSkKLSAgICB7Ci0gICAgICBpZiAoIV9hY2NlcHRDaGlsZE5vZGVzW2ldKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBwcml2YXRlIGludCAgICAgX2RlcHRoOwotICBwcml2YXRlIGJvb2xlYW5bXSBfYWNjZXB0Q2hpbGROb2RlczsKLSAgcHJpdmF0ZSBTdHJpbmdbXSAgX3Jvb3ROYW1lc3BhY2VVUkk7Ci0gIHByaXZhdGUgU3RyaW5nW10gIF9yb290TG9jYWxOYW1lOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NjaGVtYXMvbWF2ZW4tZmFjZXMtcGx1Z2luLnhzZCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9zY2hlbWFzL21hdmVuLWZhY2VzLXBsdWdpbi54c2QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwY2ViZjQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3NjaGVtYXMvbWF2ZW4tZmFjZXMtcGx1Z2luLnhzZAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gIjEuMCIgZW5jb2RpbmcgPSAiVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHhzZDpzY2hlbWEgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIKLSAgICAgICAgICAgIHhtbG5zOnhzZD0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiCi0gICAgICAgICAgICB0YXJnZXROYW1lc3BhY2U9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIgotICAgICAgICAgICAgZWxlbWVudEZvcm1EZWZhdWx0PSJxdWFsaWZpZWQiCi0gICAgICAgICAgICBhdHRyaWJ1dGVGb3JtRGVmYXVsdD0idW5xdWFsaWZpZWQiCi0gICAgICAgICAgICB2ZXJzaW9uPSIxLjIiPgotCi0gICAgPHhzZDphbm5vdGF0aW9uPgotICAgICAgICA8eHNkOmRvY3VtZW50YXRpb24+Ci0gICAgICAgICAgICAkSWQ6ICQKLSAgICAgICAgPC94c2Q6ZG9jdW1lbnRhdGlvbj4KLSAgICA8L3hzZDphbm5vdGF0aW9uPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudCIgdHlwZT0ibWZwOmNvbXBvbmVudFR5cGUiIC8+Ci0gICAgPHhzZDplbGVtZW50IG5hbWU9InByb3BlcnR5IiB0eXBlPSJtZnA6cHJvcGVydHlUeXBlIiAvPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJwcm9wZXJ0eVR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVkIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iYWxpYXMtb2YiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InRyYW5zaWVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InN0YXRlLWhvbGRlciIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6Ym9vbGVhbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlcXVpcmVzLWxpdGVyYWwiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InZpcnR1YWwiIHR5cGU9InhzZDpib29sZWFuIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0ibWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9Im1mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmVUeXBlIiBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0KLSAgICA8eHNkOmNvbXBsZXhUeXBlIG5hbWU9ImNvbXBvbmVudFR5cGUiPgotICAgICAgICA8eHNkOnNlcXVlbmNlPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9InJlbmRlcmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1zdXBlcnR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1zdXBlcmNsYXNzIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXJlbmRlcmVyLXR5cGUiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9Im5hbWluZy1jb250YWluZXIiIHR5cGU9InhzZDpib29sZWFuIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImpzcC10YWctY2xhc3MiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJtZnA6Y29tcG9uZW50LWV2ZW50VHlwZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSJ1bmJvdW5kZWQiIC8+Ci0gICAgICAgIDwveHNkOnNlcXVlbmNlPgotICAgIDwveHNkOmNvbXBsZXhUeXBlPgotCi0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJjb21wb25lbnQtZXZlbnRUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1uYW1lIgotICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU9InhzZDpzdHJpbmciCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWluT2NjdXJzPSIxIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0iMSIgLz4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJldmVudC1saXN0ZW5lci1jbGFzcyIKLSAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlPSJ4c2Q6c3RyaW5nIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1pbk9jY3Vycz0iMCIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXhPY2N1cnM9IjEiIC8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0iZXZlbnQtY2xhc3MiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LXNvdXJjZS1pbnRlcmZhY2UiCi0gICAgICAgICAgICAgICAgICAgICAgICAgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWF4T2NjdXJzPSIxIiAvPgotICAgICAgICAgICAgPHhzZDplbGVtZW50IG5hbWU9ImV2ZW50LWRlbGl2ZXJ5LXBoYXNlcyIgdHlwZT0ieHNkOnN0cmluZyIKLSAgICAgICAgICAgICAgICAgICAgICAgICBtaW5PY2N1cnM9IjAiLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPHhzZDpjb21wbGV4VHlwZSBuYW1lPSJtZXRob2QtYmluZGluZy1zaWduYXR1cmVUeXBlIj4KLSAgICAgICAgPHhzZDpzZXF1ZW5jZT4KLSAgICAgICAgICAgIDx4c2Q6ZWxlbWVudCBuYW1lPSJwYXJhbWV0ZXItdHlwZSIgdHlwZT0ieHNkOnN0cmluZyIgbWluT2NjdXJzPSIwIgotICAgICAgICAgICAgICAgICAgICAgICAgIG1heE9jY3Vycz0idW5ib3VuZGVkIi8+Ci0gICAgICAgICAgICA8eHNkOmVsZW1lbnQgbmFtZT0icmV0dXJuLXR5cGUiIHR5cGU9InhzZDpzdHJpbmciLz4KLSAgICAgICAgPC94c2Q6c2VxdWVuY2U+Ci0gICAgPC94c2Q6Y29tcGxleFR5cGU+Ci0gICAgPCEtLSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIC0tPgotCi08L3hzZDpzY2hlbWE+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvZmFjZXMtY29uZmlnLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWJhNzZkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIgotICAgICAgICAgICAgICB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSIKLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgLz4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0ueHNsIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybS54c2wKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzMzcwYWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvcmVzb3VyY2VzL3RyYW5zZm9ybS54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5NDAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTx4c2w6c3R5bGVzaGVldCB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS9KU0YvQ29uZmlndXJhdGlvbiINCi0gICAgICAgICAgICAgICAgeG1sbnM6eHNsPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L1hTTC9UcmFuc2Zvcm0iIA0KLSAgICAgICAgICAgICAgICB4bWxuczp4cz0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEiDQotICAgICAgICAgICAgICAgIHhtbG5zOmphdmFlZT0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiANCi0gICAgICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhzbCB4cyBqYXZhZWUgbWZwIg0KLSAgICAgICAgICAgICAgICB2ZXJzaW9uPSIxLjAiID4NCi0NCi0gIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIvPg0KLSAgPHhzbDpwYXJhbSBuYW1lPSJwYWNrYWdlQ29udGFpbnMiIC8+DQotICA8eHNsOnBhcmFtIG5hbWU9InR5cGVQcmVmaXgiIC8+DQotICA8eHNsOnBhcmFtIG5hbWU9InJlbW92ZVJlbmRlcmVycyIgLz4NCi0NCi0gIDx4c2w6dmFyaWFibGUgbmFtZT0iZG9jdHlwZSIgPjwhW0NEQVRBWw0KLSAgPCFET0NUWVBFIGZhY2VzLWNvbmZpZyBQVUJMSUMNCi0gICItLy9TdW4gTWljcm9zeXN0ZW1zLCBJbmMuLy9EVEQgSmF2YVNlcnZlciBGYWNlcyBDb25maWcgMS4xLy9FTiINCi0gICJodHRwOi8vamF2YS5zdW4uY29tL2R0ZC93ZWItZmFjZXNjb25maWdfMV8xLmR0ZCJbDQotICA8IUVMRU1FTlQgY29tcG9uZW50LW1ldGFkYXRhIEFOWT4NCi0gIDwhRUxFTUVOVCBhdHRyaWJ1dGUtbWV0YWRhdGEgQU5ZPg0KLSAgPCFFTEVNRU5UIHByb3BlcnR5LW1ldGFkYXRhIEFOWT4NCi0gIDwhRUxFTUVOVCBmYWNldC1tZXRhZGF0YSBBTlk+DQotICA8IUVMRU1FTlQgcmVuZGVyZXItbWV0YWRhdGEgQU5ZPg0KLSAgPCFFTEVNRU5UIGFjY2VwdHMtY2hpbGQtY29tcG9uZW50cyAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgYXR0cmlidXRlLXZhbHVlcyAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgYmFzZS1jb21wb25lbnQtdHlwZSAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgZGVwcmVjYXRlZCAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgZGlzcGxheS1vcmRlciAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgZXhwZXJ0ICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBmYXZvcml0ZS1wcm9wZXJ0eSAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgZ3JvdXAgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGhlbHAtdG9waWMgKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGhpZGRlbiAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgaW5pdGlhbC12YWx1ZSAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgcHJlZmVycmVkICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBwcmVmZXJyZWQtY2hpbGRyZW4gKCNQQ0RBVEEpPg0KLSAgPCFFTEVNRU5UIGFsbG93YWJsZS1jaGlsZHJlbiAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgcHJlZmVycmVkLWNvbXBvbmVudC10eXBlcyAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgcHJvcGVydHktZWRpdG9yICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCBzaG9ydC1kZXNjcmlwdGlvbiAoI1BDREFUQSk+DQotICA8IUVMRU1FTlQgdHJhbnNsYXRhYmxlICgjUENEQVRBKT4NCi0gIDwhRUxFTUVOVCB1bnN1cHBvcnRlZC1hZ2VudHMgKCNQQ0RBVEEpPg0KLSAgPCFBVFRMSVNUIGNvbXBvbmVudC1tZXRhZGF0YSBjb21wb25lbnQtdHlwZSBDREFUQSAjSU1QTElFRD4NCi1dPg0KLV1dPjwveHNsOnZhcmlhYmxlPg0KLQ0KLSAgPHhzbDprZXkgbmFtZT0iY29tcG9uZW50LXR5cGUiIA0KLSAgICAgICAgICAgbWF0Y2g9ImphdmFlZTpjb21wb25lbnQiIA0KLSAgICAgICAgICAgdXNlPSJqYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPg0KLQ0KLSAgPHhzbDprZXkgbmFtZT0icmVuZGVyLWtpdC1pZCIgDQotICAgICAgICAgICBtYXRjaD0iamF2YWVlOnJlbmRlci1raXQiIA0KLSAgICAgICAgICAgdXNlPSJqYXZhZWU6cmVuZGVyLWtpdC1pZC90ZXh0KCkiIC8+DQotDQotICA8IS0tIHN3aXRjaCBvZmYgZGVmYXVsdCB0ZXh0IHByb2Nlc3NpbmcgLS0+ICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vdGV4dCgpIiAvPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2phdmFlZTpmYWNlcy1jb25maWciID4NCi0gICAgPHhzbDp2YWx1ZS1vZiBkaXNhYmxlLW91dHB1dC1lc2NhcGluZz0ieWVzIiBzZWxlY3Q9IiRkb2N0eXBlIiAvPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29uZmlnIg0KLSAgICAgICAgICAgICAgICAgbmFtZXNwYWNlPSJodHRwOi8vamF2YS5zdW4uY29tL0pTRi9Db25maWd1cmF0aW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXBwbGljYXRpb24iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZmFjdG9yeSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnRbbm90KGNvbnRhaW5zKGphdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtY2xhc3MtbW9kaWZpZXIvdGV4dCgpLCAnYWJzdHJhY3QnKSkgYW5kDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0cy13aXRoKGphdmFlZTpjb21wb25lbnQtdHlwZSwgJHR5cGVQcmVmaXgpXSIgLz4NCi0gICAgICA8IS0tIEluIHRvbWFoYXdrIDEuMSBzb21lIGNvbnZlcnRlcnMgc2hvdWxkIGJlIGFkZGVkDQotICAgICAgb24gZmFjZXMtY29uZmlnLnhtbCBsaWtlIGphdmF4Lm1hdGguQmlnRGVjaW1hbCwgaWYgd2UNCi0gICAgICBpbmNsdWRlIGphdmFlZTpjb252ZXJ0ZXJbY29udGFpbnMoamF2YWVlOmNvbnZlcnRlci1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIA0KLSAgICAgIHRoaXMgY2xhc3MgcmVmZXJlbmNlcyBhcmUgbm90IGFkZGVkIHRvIGZhY2VzLWNvbmZpZy54bWwuIA0KLSAgICAgIFNvIHdlIG5lZWQgdG8gYWRkIHRoaXMgZm9yIGF2b2lkIGNoZWNrIHBhY2thYWdlQ29udGFpbnMgLS0+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIA0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlciIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTptYW5hZ2VkLWJlYW5bY29udGFpbnMoamF2YWVlOm1hbmFnZWQtYmVhbi1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOm5hdmlnYXRpb24tcnVsZSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZWZlcmVuY2VkLWJlYW4iIC8+DQotICAgICAgPCEtLSBtZXJnZSB0aGUgcmVuZGVyLWtpdHMgdG9nZXRoZXIgLS0+DQotICAgICAgPCEtLSBJbiB0b21haGF3ayAxLjEgd2UgZG9uJ3QgbWVyZ2UgcmVuZGVyLWtpdCwNCi0gICAgICBiZWNhdXNlIHdlIGFkZCBhbGwgY29tcG9uZW50cyB0byBIVE1MX0JBU0lDIHJlbmRlcmtpdCwNCi0gICAgICBhbmQgdGhlIHJlbmRlci1raXQtY2xhc3MgaXMgbWlzc2luZyAobXlmYWNlcyBjb3JlIG9yIGpzZiByaQ0KLSAgICAgIGRlY2lkZSB3aGF0IGNsYXNzIGltcGxlbWVudCB0aGlzKS4gDQotICAgICAgU28sIGhlcmUgd2UgY2Fubm90IHB1dCANCi0gICAgICBqYXZhZWU6cmVuZGVyLWtpdFtjb250YWlucyhqYXZhZWU6cmVuZGVyLWtpdC1jbGFzcywgJHBhY2thZ2VDb250YWlucyldDQotICAgICAgYWdhaW4NCi0gICAgICAgLS0+ICAgICAgDQotICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0IiA+DQotICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIgPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWlkIiAvPg0KLSAgICAgICAgICA8IS0tIE5vdCByZXF1aXJlZCBpbiB0b21haGF3ayAxLjEgLS0+IA0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXIta2l0LWNsYXNzIiAvPg0KLSAgICAgICAgICAgDQotICAgICAgICAgIDwhLS0gRHJvcCByZW5kZXJlcnMgaWYgZGVzaXJlZCAtLT4NCi0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcmVtb3ZlUmVuZGVyZXJzICE9ICd0cnVlJyI+DQotICAgICAgICAgICAgPHhzbDpmb3ItZWFjaCBzZWxlY3Q9ImtleSgncmVuZGVyLWtpdC1pZCcsIGphdmFlZTpyZW5kZXIta2l0LWlkL3RleHQoKSkiID4NCi0gICAgICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyW2NvbnRhaW5zKGphdmFlZTpyZW5kZXJlci1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgICAgICA8L3hzbDppZj4NCi0gICAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgPC94c2w6Zm9yLWVhY2g+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bGlmZWN5Y2xlW2NvbnRhaW5zKGphdmFlZTpwaGFzZS1saXN0ZW5lciwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhbGlkYXRvcltjb250YWlucyhqYXZhZWU6dmFsaWRhdG9yLWNsYXNzLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6cHJvcGVydHkgdGVtcGxhdGVzDQotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+DQotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPg0KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4NCi0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiDQotICAgICAgICAgICAgICAgICAgc2VsZWN0PSIkY29tcG9uZW50L2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4NCi0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LXByb3BlcnR5LXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgDQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgPC94c2w6aWY+DQotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6cHJvcGVydHkiIC8+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTphdHRyaWJ1dGUgdGVtcGxhdGVzDQotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+DQotICA8eHNsOnRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4NCi0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIg0KLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+DQotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+DQotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50Ig0KLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgIDwveHNsOmlmPg0KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZSIgLz4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOmZhY2V0IHRlbXBsYXRlcw0KLSAgICAgICBmb3IgYSBjb21wb25lbnQgYW5kIGFsbCBzdXBlcnR5cGVzIC0tPg0KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4NCi0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+DQotICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50U3VwZXJ0eXBlIg0KLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+DQotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiDQotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+DQotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4NCi0gICAgPC94c2w6aWY+DQotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6ZmFjZXQiIC8+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0gIA0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50W2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlXSIgDQotICAgICAgICAgICAgICAgIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6aWNvbiIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtdHlwZSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtY2xhc3MiIC8+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPg0KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPg0KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+DQotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4NCi0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4NCi0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFwcGxpY2F0aW9uIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFjdGlvbi1saXN0ZW5lcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZWZhdWx0LXJlbmRlci1raXQtaWQiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bWVzc2FnZS1idW5kbGVbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmlldy1oYW5kbGVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnN0YXRlLW1hbmFnZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bmF2aWdhdGlvbi1oYW5kbGVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LXJlc29sdmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZhcmlhYmxlLXJlc29sdmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmxvY2FsZS1jb25maWciIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFjdGlvbi1saXN0ZW5lciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWN0aW9uLWxpc3RlbmVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC1yZW5kZXIta2l0LWlkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXJlbmRlci1raXQtaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptZXNzYWdlLWJ1bmRsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWVzc2FnZS1idW5kbGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLWhhbmRsZXIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24taGFuZGxlciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZpZXctaGFuZGxlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmlldy1oYW5kbGVyIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3RhdGUtbWFuYWdlciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3RhdGUtbWFuYWdlciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LXJlc29sdmVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1yZXNvbHZlciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhcmlhYmxlLXJlc29sdmVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YXJpYWJsZS1yZXNvbHZlciIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxvY2FsZS1jb25maWciID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxvY2FsZS1jb25maWciID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWN0b3J5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWN0b3J5IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXBwbGljYXRpb24tZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpmYWNlcy1jb250ZXh0LWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bGlmZWN5Y2xlLWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1mYWN0b3J5W2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphcHBsaWNhdGlvbi1mYWN0b3J5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhcHBsaWNhdGlvbi1mYWN0b3J5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXMtY29udGV4dC1mYWN0b3J5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNlcy1jb250ZXh0LWZhY3RvcnkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaWZlY3ljbGUtZmFjdG9yeSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlmZWN5Y2xlLWZhY3RvcnkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWZhY3RvcnkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtZmFjdG9yeSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LXR5cGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC10eXBlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmZhY2V0WzFdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IGZhY2V0czwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldCIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldC1uYW1lIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldC1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXQtZXh0ZW5zaW9uW21mcDpmYWNldC1tZXRhZGF0YXxtZnA6YWxsb3dhYmxlLWNoaWxkcmVufG1mcDpwcmVmZXJyZWQtY2hpbGRyZW58bWZwOnByZWZlcnJlZHxtZnA6dW5zdXBwb3J0ZWQtYWdlbnRzfG1mcDpkZXByZWNhdGVkXSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LW1ldGFkYXRhIiA+DQotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgICAgPC94c2w6ZWxlbWVudD4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZVsxXSIgcHJpb3JpdHk9IjEiID4NCi0gICAgPHhzbDpjb21tZW50Pjx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJwYXJlbnQ6Om5vZGUoKS9qYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPiBhdHRyaWJ1dGVzPC94c2w6Y29tbWVudD4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50L2phdmFlZTphdHRyaWJ1dGVbMV0iIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gYXR0cmlidXRlczwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1leHRlbnNpb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOnByb3BlcnR5WzFdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmNvbW1lbnQ+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InBhcmVudDo6bm9kZSgpL2phdmFlZTpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+IHByb3BlcnRpZXM8L3hzbDpjb21tZW50Pg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5W2phdmFlZTpwcm9wZXJ0eS1uYW1lL3RleHQoKSA9ICdiaW5kaW5nJ10iIHByaW9yaXR5PScyJyA+DQotICAgIDwhLS0gc2tpcCBvdmVyIHByb3BlcnRpZXMgbmFtZWQgJ2JpbmRpbmcnIC0tPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiID4NCi0gICAgICA8IS0tIGVsaW1pbmF0ZSBnZW5lcmljcyBmb3IgMS40LWJhc2VkIGNsYXNzZXMgaW4gSlNGIDEuMSAtLT4NCi0gICAgICA8eHNsOmNob29zZT4NCi0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyh0ZXh0KCksICcmbHQ7JykiID4NCi0gICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InN1YnN0cmluZy1iZWZvcmUodGV4dCgpLCAnJmx0OycpIiAvPg0KLSAgICAgICAgPC94c2w6d2hlbj4NCi0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPg0KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICAgICAgPC94c2w6b3RoZXJ3aXNlPg0KLSAgICAgIDwveHNsOmNob29zZT4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1leHRlbnNpb25bbWZwOnByb3BlcnR5LXZhbHVlc3xtZnA6Z3JvdXB8bWZwOnRyYW5zbGF0YWJsZXxtZnA6cHJvcGVydHktZWRpdG9yfG1mcDpleHBlcnR8bWZwOnVuc3VwcG9ydGVkLWFnZW50c3wqW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ11dIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWV0YWRhdGEiID4NCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvblttZnA6cHJvcGVydHktbWV0YWRhdGFdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZXh0ZW5zaW9uIiA+DQotICAgICAgPCEtLSBkbyBub3QgY29weSB0aGUgcHJvcGVydHkgdmFsdWVzLCBidXQgaW5zdGVhZCBsZXQgdGhlbSBiZSBwaWNrZWQgdXAgaW4gdGhlIHByb3BlcnR5LW1ldGFkYXRhIGVsZW1lbnQgLS0+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIqW25hbWUoKSAhPSAnbWZwOnByb3BlcnR5LXZhbHVlcyddIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotICANCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1tZXRhZGF0YSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICA8IS0tIHBpY2sgdXAgYW55IHByb3BlcnR5LXZhbHVlcyBlbGVtZW50cyBmcm9tIHRoZSBwYXJlbnQgbm9kZSAtLT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4uL21mcDpwcm9wZXJ0eS12YWx1ZXMiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgZ3JhYnMgdGhlIGNvbXBvbmVudC1mYW1pbHkgZnJvbSBhbiBhbmNlc3RvciAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb25bbWZwOmNvbXBvbmVudC1zdXBlcnR5cGVdIiBwcmlvcml0eT0iMSIgPg0KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSINCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9Im1mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWZhbWlseSI+DQotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtZmFtaWx5L3RleHQoKSIgLz4NCi0gICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uW21mcDpjb21wb25lbnQtZmFtaWx5XSIgcHJpb3JpdHk9IjIiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24iID4NCi0gICAgPHhzbDpjb21tZW50Pldhcm5pbmc6IHRoaXMgY29tcG9uZW50IGhhcyBubyBjb21wb25lbnQtZmFtaWx5ITwveHNsOmNvbW1lbnQ+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZXh0ZW5zaW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtbWV0YWRhdGEiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1tZXRhZGF0YSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXIiID4NCi0gICAgICA8IS0tIHhzbDphcHBseS10ZW1wbGF0ZXMvIFRPRE8gdXNlIHRoaXMgaW5zdGVhZCAtLT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1pZCIvPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb252ZXJ0ZXItY2xhc3MiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eSIvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1mb3ItY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1mb3ItY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXItY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbnZlcnRlci1jbGFzcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tc2NvcGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbi1zY29wZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtcHJvcGVydHkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtcHJvcGVydHkiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpudWxsLXZhbHVlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJudWxsLXZhbHVlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsdWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbHVlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFwLWVudHJpZXMiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hcC1lbnRyaWVzIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFwLWVudHJ5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYXAtZW50cnkiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTprZXkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImtleSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmtleS1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ia2V5LWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsdWUtY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbHVlLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWVzc2FnZS1idW5kbGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1lc3NhZ2UtYnVuZGxlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bGlzdC1lbnRyaWVzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaXN0LWVudHJpZXMiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLXJ1bGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Im5hdmlnYXRpb24tcnVsZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tdmlldy1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS12aWV3LWlkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bmF2aWdhdGlvbi1jYXNlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLWNhc2UiID4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLWFjdGlvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZnJvbS1hY3Rpb24iID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmcm9tLW91dGNvbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tb3V0Y29tZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnRvLXZpZXctaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InRvLXZpZXctaWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWRpcmVjdCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVkaXJlY3QiIC8+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuLW5hbWUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVmZXJlbmNlZC1iZWFuLWNsYXNzIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0IiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdC1pZCIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtY2xhc3MiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotPCEtLSBUT0RPOiBmbGF0dGVuIGNvbXBvbmVudCBwcm9wZXJ0aWVzIGludG8gcmVuZGVyZXIgYXMgYXR0cmlidXRlcyAtLT4NCi08IS0tDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlcltqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtdHlwZV0iDQotICAgICAgICAgICAgICAgIHByaW9yaXR5PSIxIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1mYW1pbHkiIC8+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItdHlwZSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1jbGFzcyIgLz4NCi0gICAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFR5cGUiIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPg0KLSAgICAgIDx4c2w6Zm9yLWVhY2ggc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFR5cGUpL2phdmFlZTpwcm9wZXJ0eSIgPg0KLSAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4NCi0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6ZGlzcGxheS1uYW1lIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPg0KLSAgICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLW5hbWUiID4NCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LW5hbWUiIC8+DQotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtY2xhc3MiID4NCi0gICAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LWNsYXNzIiAvPg0KLSAgICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZWZhdWx0LXZhbHVlIiAvPg0KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpzdWdnZXN0ZWQtdmFsdWUiIC8+DQotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+DQotICAgICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJtZnA6cHJvcGVydHktZXh0ZW5zaW9uLyoiIC8+DQotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+DQotICAgICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICAgIDwveHNsOmZvci1lYWNoPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmF0dHJpYnV0ZSIgLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1leHRlbnNpb24iIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0tLT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1mYW1pbHkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlci10eXBlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItY2xhc3MiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uW21mcDp1bnN1cHBvcnRlZC1hZ2VudHNdIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1leHRlbnNpb24iID4NCi0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItbWV0YWRhdGEiID4NCi0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgICA8L3hzbDplbGVtZW50Pg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaWZlY3ljbGUiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxpZmVjeWNsZSIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnBoYXNlLWxpc3RlbmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwaGFzZS1saXN0ZW5lciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icGhhc2UtbGlzdGVuZXIiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LWxvY2FsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVmYXVsdC1sb2NhbGUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpzdXBwb3J0ZWQtbG9jYWxlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdXBwb3J0ZWQtbG9jYWxlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWxpZGF0b3IiID4NCi0gICAgICA8IS0tIHhzbDphcHBseS10ZW1wbGF0ZXMvIFRPRE8gdXNlIHRoaXMgaW5zdGVhZCAtLT4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3ItaWQiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3ItY2xhc3MiLz4NCi0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eSIvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3ItaWQiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1pZCIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhbGlkYXRvci1jbGFzcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVzY3JpcHRpb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKiIgLz4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eVtqYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uXS9qYXZhZWU6ZGVzY3JpcHRpb24iIHByaW9yaXR5PSIxIj4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiA+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLi9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uL0AqIiAvPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uL3RleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVzY3JpcHRpb24vQHhtbDpsYW5nIiA+DQotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIiA+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB4bWw6bGFuZyIgLz48L3hzbDphdHRyaWJ1dGU+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRpc3BsYXktbmFtZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGlzcGxheS1uYW1lIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6aWNvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iaWNvbiIgPg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c21hbGwtaWNvbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic21hbGwtaWNvbiIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxhcmdlLWljb24iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImxhcmdlLWljb24iID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LXZhbHVlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZWZhdWx0LXZhbHVlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3VnZ2VzdGVkLXZhbHVlIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdWdnZXN0ZWQtdmFsdWUiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtZmFtaWx5IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtZmFtaWx5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZmF2b3JpdGUtcHJvcGVydHkiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhdm9yaXRlLXByb3BlcnR5IiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cmVuZGVyZXItdHlwZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyZXItdHlwZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LXZhbHVlcyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLXZhbHVlcyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnVuc3VwcG9ydGVkLWFnZW50cyIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idW5zdXBwb3J0ZWQtYWdlbnRzIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPCEtLSBIYW5kbGUgbWV0YWRhdGEgd2UgZG8gbm90IGtub3cgYWJvdXQgYnkgbGV0dGluZyBpdCB0aHJvdWdoLiAgQ3VycmVudGx5LA0KLSAgIGp1c3QgZm9yIHByb3BlcnR5LWV4dGVuc2lvbiBhbmQgY29tcG9uZW50LW1ldGFkYXRhLCBidXQgc2hvdWxkIGJlIGdsb2JhbC4NCi0gICBTZWUgSklSQSBpc3N1ZXMgQURGRkFDRVMtMzU4LCBBREZGQUNFUy0zNjEgYW5kIEFERkZBQ0VTLTQ3MiAtLT4NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vKltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddIj4NCi0gICAgPHhzbDpjb3B5Pg0KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iQCp8bm9kZSgpIi8+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPg0KLSAgICA8L3hzbDpjb3B5PiANCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0ibWZwOmNvbXBvbmVudC1tZXRhZGF0YS8qW25hbWVzcGFjZS11cmkoKSAhPSAnaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlJyBhbmQgbmFtZXNwYWNlLXVyaSgpICE9J2h0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luJ10iPg0KLSAgICA8eHNsOmNvcHk+DQotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIi8+DQotICAgIDwveHNsOmNvcHk+IA0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtbWV0YWRhdGEvbWZwOmdyb3VwIiA+DQotPCEtLSBEaXNhYmxlIGNvbXBvbmVudCBncm91cHMgZm9yIG5vdw0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZ3JvdXAiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLS0tPg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YS9tZnA6Z3JvdXAiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9Imdyb3VwIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEvbWZwOnRyYW5zbGF0YWJsZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idHJhbnNsYXRhYmxlIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLSAgDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDphY2NlcHRzLWNoaWxkLWNvbXBvbmVudHMiID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFjY2VwdHMtY2hpbGQtY29tcG9uZW50cyIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LWVkaXRvciIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZWRpdG9yIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZXhwZXJ0IiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJleHBlcnQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcmVmZXJyZWQtY2hpbGRyZW4iID4NCi0gICAgPHhzbDplbGVtZW50IG5hbWU9InByZWZlcnJlZC1jaGlsZHJlbiIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmFsbG93YWJsZS1jaGlsZHJlbiIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYWxsb3dhYmxlLWNoaWxkcmVuIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJlZmVycmVkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcmVmZXJyZWQiID4NCi0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPg0KLSAgICA8L3hzbDplbGVtZW50Pg0KLSAgPC94c2w6dGVtcGxhdGU+DQotDQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpkZXByZWNhdGVkIiA+DQotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkZXByZWNhdGVkIiA+DQotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4NCi0gICAgPC94c2w6ZWxlbWVudD4NCi0gIDwveHNsOnRlbXBsYXRlPg0KLQ0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6aW5pdGlhbC12YWx1ZSIgPg0KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iaW5pdGlhbC12YWx1ZSIgPg0KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+DQotICAgIDwveHNsOmVsZW1lbnQ+DQotICA8L3hzbDp0ZW1wbGF0ZT4NCi0NCi08L3hzbDpzdHlsZXNoZWV0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0xMi54c2wgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9yZXNvdXJjZXMvdHJhbnNmb3JtMTIueHNsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDkxNmVmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL3Jlc291cmNlcy90cmFuc2Zvcm0xMi54c2wKKysrIC9kZXYvbnVsbApAQCAtMSw5MDUgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotCSAgIAotLS0+Ci08eHNsOnN0eWxlc2hlZXQgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIKLSAgICAgICAgICAgICAgICB4bWxuczp4c2w9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvWFNML1RyYW5zZm9ybSIgCi0gICAgICAgICAgICAgICAgeG1sbnM6eHM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hIgotICAgICAgICAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICAgICAgICAgeG1sbnM6amF2YWVlPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiCi0gICAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgCi0gICAgICAgICAgICAgICAgZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM9InhzbCB4cyBqYXZhZWUgbWZwIgotICAgICAgICAgICAgICAgIHZlcnNpb249IjEuMCIgPgotCi0gIDx4c2w6b3V0cHV0IG1ldGhvZD0ieG1sIiBpbmRlbnQ9InllcyIvPgotICA8eHNsOnBhcmFtIG5hbWU9InBhY2thZ2VDb250YWlucyIgLz4KLSAgPHhzbDpwYXJhbSBuYW1lPSJjb252ZXJ0ZXJQYWNrYWdlQ29udGFpbnMiIC8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0idmFsaWRhdG9yUGFja2FnZUNvbnRhaW5zIiAvPgotICA8eHNsOnBhcmFtIG5hbWU9InR5cGVQcmVmaXgiIC8+Ci0gIDx4c2w6cGFyYW0gbmFtZT0icmVtb3ZlUmVuZGVyZXJzIiAvPgotCi0KLQotICA8eHNsOmtleSBuYW1lPSJjb21wb25lbnQtdHlwZSIgCi0gICAgICAgICAgIG1hdGNoPSJqYXZhZWU6Y29tcG9uZW50IiAKLSAgICAgICAgICAgdXNlPSJqYXZhZWU6Y29tcG9uZW50LXR5cGUvdGV4dCgpIiAvPgotCi0gIDx4c2w6a2V5IG5hbWU9InJlbmRlci1raXQtaWQiIAotICAgICAgICAgICBtYXRjaD0iamF2YWVlOnJlbmRlci1raXQiIAotICAgICAgICAgICB1c2U9ImphdmFlZTpyZW5kZXIta2l0LWlkL3RleHQoKSIgLz4KLQotICA8IS0tIHN3aXRjaCBvZmYgZGVmYXVsdCB0ZXh0IHByb2Nlc3NpbmcgLS0+ICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy90ZXh0KCkiIC8+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iL2phdmFlZTpmYWNlcy1jb25maWciID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXMtY29uZmlnIgotICAgICAgICAgICAgICAgICBuYW1lc3BhY2U9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0ieHNpOnNjaGVtYUxvY2F0aW9uIj5odHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUgaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlL3dlYi1mYWNlc2NvbmZpZ18xXzIueHNkPC94c2w6YXR0cmlidXRlPgotICAgICAgPHhzbDphdHRyaWJ1dGUgbmFtZT0idmVyc2lvbiI+MS4yPC94c2w6YXR0cmlidXRlPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6YXBwbGljYXRpb24iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpmYWN0b3J5IiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50W25vdChjb250YWlucyhqYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LWNsYXNzLW1vZGlmaWVyL3RleHQoKSwgJ2Fic3RyYWN0JykpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0cy13aXRoKGphdmFlZTpjb21wb25lbnQtdHlwZSwgJHR5cGVQcmVmaXgpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlcltjb250YWlucyhqYXZhZWU6Y29udmVydGVyLWNsYXNzLCAkY29udmVydGVyUGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTptYW5hZ2VkLWJlYW5bY29udGFpbnMoamF2YWVlOm1hbmFnZWQtYmVhbi1jbGFzcywgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6bmF2aWdhdGlvbi1ydWxlIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVmZXJlbmNlZC1iZWFuIiAvPgotICAgICAgPCEtLSBtZXJnZSB0aGUgcmVuZGVyLWtpdHMgdG9nZXRoZXIgLS0+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXRbY29udGFpbnMoamF2YWVlOnJlbmRlci1raXQtY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgPgotICAgICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdCIgPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtaWQiIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVuZGVyLWtpdC1jbGFzcyIgLz4KLSAgICAgICAgICA8IS0tIERyb3AgcmVuZGVyZXJzIGlmIGRlc2lyZWQgLS0+Ci0gICAgICAgICAgPHhzbDppZiB0ZXN0PSIkcmVtb3ZlUmVuZGVyZXJzICE9ICd0cnVlJyI+Ci0gICAgICAgICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ia2V5KCdyZW5kZXIta2l0LWlkJywgamF2YWVlOnJlbmRlci1raXQtaWQvdGV4dCgpKSIgPgotICAgICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlcltjb250YWlucyhqYXZhZWU6cmVuZGVyZXItY2xhc3MsICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgICAgICAgIDwveHNsOmZvci1lYWNoPgotICAgICAgICAgIDwveHNsOmlmPgotICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsaWZlY3ljbGVbY29udGFpbnMoamF2YWVlOnBoYXNlLWxpc3RlbmVyLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3JbY29udGFpbnMoamF2YWVlOnZhbGlkYXRvci1jbGFzcywgJHZhbGlkYXRvclBhY2thZ2VDb250YWlucyldIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgYXBwbGllcyBqYXZhZWU6cHJvcGVydHkgdGVtcGxhdGVzCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1wcm9wZXJ0eS10ZW1wbGF0ZXMiID4KLSAgICA8eHNsOnBhcmFtIG5hbWU9ImNvbXBvbmVudCIgLz4KLSAgICA8eHNsOnZhcmlhYmxlIG5hbWU9ImNvbXBvbmVudFN1cGVydHlwZSIKLSAgICAgICAgICAgICAgICAgIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvbi9tZnA6Y29tcG9uZW50LXN1cGVydHlwZS90ZXh0KCkiIC8+Ci0gICAgPHhzbDppZiB0ZXN0PSIkY29tcG9uZW50U3VwZXJ0eXBlIiA+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6cHJvcGVydHkiIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPCEtLSB0aGlzIHRlbXBsYXRlcyBhcHBsaWVzIGphdmFlZTphdHRyaWJ1dGUgdGVtcGxhdGVzCi0gICAgICAgZm9yIGEgY29tcG9uZW50IGFuZCBhbGwgc3VwZXJ0eXBlcyAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPgotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWF0dHJpYnV0ZS10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICA8L3hzbDppZj4KLSAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmF0dHJpYnV0ZSIgLz4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8IS0tIHRoaXMgdGVtcGxhdGVzIGFwcGxpZXMgamF2YWVlOmZhY2V0IHRlbXBsYXRlcwotICAgICAgIGZvciBhIGNvbXBvbmVudCBhbmQgYWxsIHN1cGVydHlwZXMgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbmFtZT0iYXBwbHktZmFjZXQtdGVtcGxhdGVzIiA+Ci0gICAgPHhzbDpwYXJhbSBuYW1lPSJjb21wb25lbnQiIC8+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9IiRjb21wb25lbnQvamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24vbWZwOmNvbXBvbmVudC1zdXBlcnR5cGUvdGV4dCgpIiAvPgotICAgIDx4c2w6aWYgdGVzdD0iJGNvbXBvbmVudFN1cGVydHlwZSIgPgotICAgICAgPHhzbDpjYWxsLXRlbXBsYXRlIG5hbWU9ImFwcGx5LWZhY2V0LXRlbXBsYXRlcyIgPgotICAgICAgICA8eHNsOndpdGgtcGFyYW0gbmFtZT0iY29tcG9uZW50IgotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZWN0PSJrZXkoJ2NvbXBvbmVudC10eXBlJywgJGNvbXBvbmVudFN1cGVydHlwZSkiIC8+Ci0gICAgICA8L3hzbDpjYWxsLXRlbXBsYXRlPgotICAgIDwveHNsOmlmPgotICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iJGNvbXBvbmVudC9qYXZhZWU6ZmFjZXQiIC8+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50W2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtc3VwZXJ0eXBlXSIgCi0gICAgICAgICAgICAgICAgcHJpb3JpdHk9IjEiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZXNjcmlwdGlvbiIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmljb24iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtdHlwZSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbXBvbmVudC1jbGFzcyIgLz4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1mYWNldC10ZW1wbGF0ZXMiID4KLSAgICAgICAgPHhzbDp3aXRoLXBhcmFtIG5hbWU9ImNvbXBvbmVudCIgc2VsZWN0PSIuIiAvPgotICAgICAgPC94c2w6Y2FsbC10ZW1wbGF0ZT4KLSAgICAgIDx4c2w6Y2FsbC10ZW1wbGF0ZSBuYW1lPSJhcHBseS1hdHRyaWJ1dGUtdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICA8eHNsOmNhbGwtdGVtcGxhdGUgbmFtZT0iYXBwbHktcHJvcGVydHktdGVtcGxhdGVzIiA+Ci0gICAgICAgIDx4c2w6d2l0aC1wYXJhbSBuYW1lPSJjb21wb25lbnQiIHNlbGVjdD0iLiIgLz4KLSAgICAgIDwveHNsOmNhbGwtdGVtcGxhdGU+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFwcGxpY2F0aW9uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphY3Rpb24tbGlzdGVuZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkZWZhdWx0LXJlbmRlci1raXQtaWQiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTptZXNzYWdlLWJ1bmRsZVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnZpZXctaGFuZGxlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnN0YXRlLW1hbmFnZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpuYXZpZ2F0aW9uLWhhbmRsZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTplbC1yZXNvbHZlcltjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5LXJlc29sdmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFyaWFibGUtcmVzb2x2ZXJbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsb2NhbGUtY29uZmlnIiAvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6cmVzb3VyY2UtYnVuZGxlIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmFjdGlvbi1saXN0ZW5lciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhY3Rpb24tbGlzdGVuZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZGVmYXVsdC1yZW5kZXIta2l0LWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtcmVuZGVyLWtpdC1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptZXNzYWdlLWJ1bmRsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWJ1bmRsZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLWhhbmRsZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1oYW5kbGVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZpZXctaGFuZGxlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2aWV3LWhhbmRsZXIiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3RhdGUtbWFuYWdlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzdGF0ZS1tYW5hZ2VyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmVsLXJlc29sdmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImVsLXJlc29sdmVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LXJlc29sdmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LXJlc29sdmVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnZhcmlhYmxlLXJlc29sdmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhcmlhYmxlLXJlc29sdmVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxvY2FsZS1jb25maWciID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibG9jYWxlLWNvbmZpZyIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWN0b3J5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY3RvcnkiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmFwcGxpY2F0aW9uLWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpmYWNlcy1jb250ZXh0LWZhY3RvcnlbY29udGFpbnModGV4dCgpLCAkcGFja2FnZUNvbnRhaW5zKV0iIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpsaWZlY3ljbGUtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlci1raXQtZmFjdG9yeVtjb250YWlucyh0ZXh0KCksICRwYWNrYWdlQ29udGFpbnMpXSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphcHBsaWNhdGlvbi1mYWN0b3J5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFwcGxpY2F0aW9uLWZhY3RvcnkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZmFjZXMtY29udGV4dC1mYWN0b3J5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2VzLWNvbnRleHQtZmFjdG9yeSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaWZlY3ljbGUtZmFjdG9yeSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUtZmFjdG9yeSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWZhY3RvcnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1mYWN0b3J5IiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LXR5cGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LXR5cGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOmZhY2V0WzFdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gZmFjZXRzPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmYWNldCIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZhY2V0LW5hbWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmFjZXQtbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpmYWNldC1leHRlbnNpb25bbWZwOmZhY2V0LW1ldGFkYXRhfG1mcDphbGxvd2FibGUtY2hpbGRyZW58bWZwOnByZWZlcnJlZC1jaGlsZHJlbnxtZnA6cHJlZmVycmVkfG1mcDp1bnN1cHBvcnRlZC1hZ2VudHN8bWZwOmRlcHJlY2F0ZWRdIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImZhY2V0LW1ldGFkYXRhIiA+Ci0gICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlWzFdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gYXR0cmlidXRlczwveHNsOmNvbW1lbnQ+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC9qYXZhZWU6YXR0cmlidXRlWzFdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gYXR0cmlidXRlczwveHNsOmNvbW1lbnQ+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTphdHRyaWJ1dGUtY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmF0dHJpYnV0ZS1leHRlbnNpb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iYXR0cmlidXRlLWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQvamF2YWVlOnByb3BlcnR5WzFdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6Y29tbWVudD48eHNsOnZhbHVlLW9mIHNlbGVjdD0icGFyZW50Ojpub2RlKCkvamF2YWVlOmNvbXBvbmVudC10eXBlL3RleHQoKSIgLz4gcHJvcGVydGllczwveHNsOmNvbW1lbnQ+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHlbamF2YWVlOnByb3BlcnR5LW5hbWUvdGV4dCgpID0gJ2JpbmRpbmcnXSIgcHJpb3JpdHk9JzInID4KLSAgICA8IS0tIHNraXAgb3ZlciBwcm9wZXJ0aWVzIG5hbWVkICdiaW5kaW5nJyAtLT4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHkiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eS1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByb3BlcnR5LW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cHJvcGVydHktY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktY2xhc3MiID4KLSAgICAgIDwhLS0gZWxpbWluYXRlIGdlbmVyaWNzIGZvciAxLjQtYmFzZWQgY2xhc3NlcyBpbiBKU0YgMS4xIC0tPgotICAgICAgPHhzbDpjaG9vc2U+Ci0gICAgICAgIDx4c2w6d2hlbiB0ZXN0PSJjb250YWlucyh0ZXh0KCksICcmbHQ7JykiID4KLSAgICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ic3Vic3RyaW5nLWJlZm9yZSh0ZXh0KCksICcmbHQ7JykiIC8+Ci0gICAgICAgIDwveHNsOndoZW4+Ci0gICAgICAgIDx4c2w6b3RoZXJ3aXNlPgotICAgICAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgICAgIDwveHNsOm90aGVyd2lzZT4KLSAgICAgIDwveHNsOmNob29zZT4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvblttZnA6cHJvcGVydHktdmFsdWVzfG1mcDpncm91cHxtZnA6dHJhbnNsYXRhYmxlfG1mcDpwcm9wZXJ0eS1lZGl0b3J8bWZwOmV4cGVydHxtZnA6dW5zdXBwb3J0ZWQtYWdlbnRzfCpbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXV0iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktZXh0ZW5zaW9uIiA+Ci0gICAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWV0YWRhdGEiID4KLSAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgICAgPC94c2w6ZWxlbWVudD4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvblttZnA6cHJvcGVydHktbWV0YWRhdGFdIiBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1leHRlbnNpb24iID4KLSAgICAgIDwhLS0gZG8gbm90IGNvcHkgdGhlIHByb3BlcnR5IHZhbHVlcywgYnV0IGluc3RlYWQgbGV0IHRoZW0gYmUgcGlja2VkIHVwIGluIHRoZSBwcm9wZXJ0eS1tZXRhZGF0YSBlbGVtZW50IC0tPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIqW25hbWUoKSAhPSAnbWZwOnByb3BlcnR5LXZhbHVlcyddIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotICAKLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJvcGVydHktbWV0YWRhdGEiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJvcGVydHktbWV0YWRhdGEiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICAgIDwhLS0gcGljayB1cCBhbnkgcHJvcGVydHktdmFsdWVzIGVsZW1lbnRzIGZyb20gdGhlIHBhcmVudCBub2RlIC0tPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuLi9tZnA6cHJvcGVydHktdmFsdWVzIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDwhLS0gdGhpcyB0ZW1wbGF0ZXMgZ3JhYnMgdGhlIGNvbXBvbmVudC1mYW1pbHkgZnJvbSBhbiBhbmNlc3RvciAtLT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29tcG9uZW50LWV4dGVuc2lvblttZnA6Y29tcG9uZW50LXN1cGVydHlwZV0iIHByaW9yaXR5PSIxIiA+Ci0gICAgPHhzbDp2YXJpYWJsZSBuYW1lPSJjb21wb25lbnRTdXBlcnR5cGUiCi0gICAgICAgICAgICAgICAgICBzZWxlY3Q9Im1mcDpjb21wb25lbnQtc3VwZXJ0eXBlL3RleHQoKSIgLz4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiPgotICAgICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRTdXBlcnR5cGUpL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtZmFtaWx5L3RleHQoKSIgLz4KLSAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0gIAotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZXh0ZW5zaW9uW21mcDpjb21wb25lbnQtZmFtaWx5XSIgcHJpb3JpdHk9IjIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbXBvbmVudC1leHRlbnNpb24iID4KLSAgICA8eHNsOmNvbW1lbnQ+V2FybmluZzogdGhpcyBjb21wb25lbnQgaGFzIG5vIGNvbXBvbmVudC1mYW1pbHkhPC94c2w6Y29tbWVudD4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29tcG9uZW50LWV4dGVuc2lvbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmNvbXBvbmVudC1tZXRhZGF0YSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb21wb25lbnQtbWV0YWRhdGEiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb252ZXJ0ZXIiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iY29udmVydGVyIiA+Ci0gICAgICA8IS0tIHhzbDphcHBseS10ZW1wbGF0ZXMvIFRPRE8gdXNlIHRoaXMgaW5zdGVhZCAtLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpkaXNwbGF5LW5hbWUiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmNvbnZlcnRlci1pZCIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWZvci1jbGFzcyIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29udmVydGVyLWNsYXNzIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eSIvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItaWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6Y29udmVydGVyLWZvci1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItZm9yLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmNvbnZlcnRlci1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJjb252ZXJ0ZXItY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1iZWFuIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9Im1hbmFnZWQtYmVhbiIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tbmFtZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYW5hZ2VkLWJlYW4tY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFuYWdlZC1iZWFuLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm1hbmFnZWQtYmVhbi1zY29wZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLWJlYW4tc2NvcGUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6bWFuYWdlZC1wcm9wZXJ0eSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYW5hZ2VkLXByb3BlcnR5IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm51bGwtdmFsdWUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibnVsbC12YWx1ZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWx1ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWx1ZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYXAtZW50cmllcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtYXAtZW50cmllcyIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptYXAtZW50cnkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibWFwLWVudHJ5IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmtleSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJrZXkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6a2V5LWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImtleS1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWx1ZS1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ2YWx1ZS1jbGFzcyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTptZXNzYWdlLWJ1bmRsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJtZXNzYWdlLWJ1bmRsZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpsaXN0LWVudHJpZXMiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGlzdC1lbnRyaWVzIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOm5hdmlnYXRpb24tcnVsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJuYXZpZ2F0aW9uLXJ1bGUiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6ZnJvbS12aWV3LWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tdmlldy1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpuYXZpZ2F0aW9uLWNhc2UiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibmF2aWdhdGlvbi1jYXNlIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tYWN0aW9uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImZyb20tYWN0aW9uIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmZyb20tb3V0Y29tZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJmcm9tLW91dGNvbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dG8tdmlldy1pZCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ0by12aWV3LWlkIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZGlyZWN0IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZGlyZWN0IiAvPgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZWZlcmVuY2VkLWJlYW4iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVmZXJlbmNlZC1iZWFuIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbi1uYW1lIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlZmVyZW5jZWQtYmVhbi1uYW1lIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlZmVyZW5jZWQtYmVhbi1jbGFzcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZWZlcmVuY2VkLWJlYW4tY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyLWtpdCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXIta2l0IiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlci1raXQtaWQiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icmVuZGVyLWtpdC1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXIta2l0LWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlci1raXQtY2xhc3MiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLTwhLS0gVE9ETzogZmxhdHRlbiBjb21wb25lbnQgcHJvcGVydGllcyBpbnRvIHJlbmRlcmVyIGFzIGF0dHJpYnV0ZXMgLS0+Ci08IS0tCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyW2phdmFlZTpyZW5kZXJlci1leHRlbnNpb24vbWZwOmNvbXBvbmVudC10eXBlXSIKLSAgICAgICAgICAgICAgICBwcmlvcml0eT0iMSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6Y29tcG9uZW50LWZhbWlseSIgLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnJlbmRlcmVyLXR5cGUiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1jbGFzcyIgLz4KLSAgICAgIDx4c2w6dmFyaWFibGUgbmFtZT0iY29tcG9uZW50VHlwZSIgc2VsZWN0PSJqYXZhZWU6cmVuZGVyZXItZXh0ZW5zaW9uL21mcDpjb21wb25lbnQtdHlwZS90ZXh0KCkiIC8+Ci0gICAgICA8eHNsOmZvci1lYWNoIHNlbGVjdD0ia2V5KCdjb21wb25lbnQtdHlwZScsICRjb21wb25lbnRUeXBlKS9qYXZhZWU6cHJvcGVydHkiID4KLSAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZSIgPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlc2NyaXB0aW9uIiAvPgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIgLz4KLSAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTppY29uIiAvPgotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtbmFtZSIgPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1uYW1lIiAvPgotICAgICAgICAgIDwveHNsOmVsZW1lbnQ+Ci0gICAgICAgICAgPHhzbDplbGVtZW50IG5hbWU9ImF0dHJpYnV0ZS1jbGFzcyIgPgotICAgICAgICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9ImphdmFlZTpwcm9wZXJ0eS1jbGFzcyIgLz4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRlZmF1bHQtdmFsdWUiIC8+Ci0gICAgICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6c3VnZ2VzdGVkLXZhbHVlIiAvPgotICAgICAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtZXh0ZW5zaW9uIiA+Ci0gICAgICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Im1mcDpwcm9wZXJ0eS1leHRlbnNpb24vKiIgLz4KLSAgICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgICA8L3hzbDplbGVtZW50PgotICAgICAgPC94c2w6Zm9yLWVhY2g+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTphdHRyaWJ1dGUiIC8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTpyZW5kZXJlci1leHRlbnNpb24iIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0tLT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpyZW5kZXJlciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlciIgPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpjb21wb25lbnQtZmFtaWx5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6cmVuZGVyZXItdHlwZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLWNsYXNzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InJlbmRlcmVyLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnJlbmRlcmVyLWV4dGVuc2lvblttZnA6dW5zdXBwb3J0ZWQtYWdlbnRzXSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1leHRlbnNpb24iID4KLSAgICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci1tZXRhZGF0YSIgPgotICAgICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgICA8L3hzbDplbGVtZW50PgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxpZmVjeWNsZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJsaWZlY3ljbGUiID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnBoYXNlLWxpc3RlbmVyW2NvbnRhaW5zKHRleHQoKSwgJHBhY2thZ2VDb250YWlucyldIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnBoYXNlLWxpc3RlbmVyIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InBoYXNlLWxpc3RlbmVyIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlZmF1bHQtbG9jYWxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtbG9jYWxlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOnN1cHBvcnRlZC1sb2NhbGUiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ic3VwcG9ydGVkLWxvY2FsZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3IiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yIiA+Ci0gICAgICA8IS0tIHhzbDphcHBseS10ZW1wbGF0ZXMvIFRPRE8gdXNlIHRoaXMgaW5zdGVhZCAtLT4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOmRpc3BsYXktbmFtZSIvPgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJqYXZhZWU6dmFsaWRhdG9yLWlkIi8+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9ImphdmFlZTp2YWxpZGF0b3ItY2xhc3MiLz4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iamF2YWVlOnByb3BlcnR5Ii8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6dmFsaWRhdG9yLWlkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InZhbGlkYXRvci1pZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTp2YWxpZGF0b3ItY2xhc3MiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0idmFsaWRhdG9yLWNsYXNzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlc2NyaXB0aW9uIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlc2NyaXB0aW9uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqIiAvPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpwcm9wZXJ0eVtqYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uXS9qYXZhZWU6ZGVzY3JpcHRpb24iIHByaW9yaXR5PSIxIj4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZGVzY3JpcHRpb24iID4KLSAgICAgIDx4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLi4vamF2YWVlOnByb3BlcnR5LWV4dGVuc2lvbi9tZnA6bG9uZy1kZXNjcmlwdGlvbi9AKiIgLz4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSIuLi9qYXZhZWU6cHJvcGVydHktZXh0ZW5zaW9uL21mcDpsb25nLWRlc2NyaXB0aW9uL3RleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRlc2NyaXB0aW9uL0B4bWw6bGFuZyIgPgotICAgIDx4c2w6YXR0cmlidXRlIG5hbWU9InhtbDpsYW5nIiA+PHhzbDp2YWx1ZS1vZiBzZWxlY3Q9IkB4bWw6bGFuZyIgLz48L3hzbDphdHRyaWJ1dGU+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmRpc3BsYXktbmFtZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJkaXNwbGF5LW5hbWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6aWNvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJpY29uIiA+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcy8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c21hbGwtaWNvbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJzbWFsbC1pY29uIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vamF2YWVlOmxhcmdlLWljb24iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0ibGFyZ2UtaWNvbiIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL2phdmFlZTpkZWZhdWx0LXZhbHVlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlZmF1bHQtdmFsdWUiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9qYXZhZWU6c3VnZ2VzdGVkLXZhbHVlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InN1Z2dlc3RlZC12YWx1ZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpjb21wb25lbnQtZmFtaWx5IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImNvbXBvbmVudC1mYW1pbHkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZmF2b3JpdGUtcHJvcGVydHkiID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0iZmF2b3JpdGUtcHJvcGVydHkiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cmVuZGVyZXItdHlwZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJyZW5kZXJlci10eXBlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LXZhbHVlcyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhdHRyaWJ1dGUtdmFsdWVzIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnVuc3VwcG9ydGVkLWFnZW50cyIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJ1bnN1cHBvcnRlZC1hZ2VudHMiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPCEtLSBIYW5kbGUgbWV0YWRhdGEgd2UgZG8gbm90IGtub3cgYWJvdXQgYnkgbGV0dGluZyBpdCB0aHJvdWdoLiAgQ3VycmVudGx5LAotICAganVzdCBmb3IgcHJvcGVydHktZXh0ZW5zaW9uIGFuZCBjb21wb25lbnQtbWV0YWRhdGEsIGJ1dCBzaG91bGQgYmUgZ2xvYmFsLgotICAgU2VlIEpJUkEgaXNzdWVzIEFERkZBQ0VTLTM1OCwgQURGRkFDRVMtMzYxIGFuZCBBREZGQUNFUy00NzIgLS0+Ci0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9ImphdmFlZTpwcm9wZXJ0eS1leHRlbnNpb24vKltuYW1lc3BhY2UtdXJpKCkgIT0gJ2h0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZScgYW5kIG5hbWVzcGFjZS11cmkoKSAhPSdodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiddIj4KLSAgICA8eHNsOmNvcHk+Ci0gICAgICA8eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9IkAqfG5vZGUoKSIvPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIvPgotICAgIDwveHNsOmNvcHk+IAotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSJtZnA6Y29tcG9uZW50LW1ldGFkYXRhLypbbmFtZXNwYWNlLXVyaSgpICE9ICdodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUnIGFuZCBuYW1lc3BhY2UtdXJpKCkgIT0naHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4nXSI+Ci0gICAgPHhzbDpjb3B5PgotICAgICAgPHhzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSJAKnxub2RlKCkiLz4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiLz4KLSAgICA8L3hzbDpjb3B5PiAKLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6Y29tcG9uZW50LW1ldGFkYXRhL21mcDpncm91cCIgPgotPCEtLSBEaXNhYmxlIGNvbXBvbmVudCBncm91cHMgZm9yIG5vdwotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJncm91cCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotLS0+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LW1ldGFkYXRhL21mcDpncm91cCIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJncm91cCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcm9wZXJ0eS1tZXRhZGF0YS9tZnA6dHJhbnNsYXRhYmxlIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InRyYW5zbGF0YWJsZSIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6YWNjZXB0cy1jaGlsZC1jb21wb25lbnRzIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImFjY2VwdHMtY2hpbGQtY29tcG9uZW50cyIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOnByb3BlcnR5LWVkaXRvciIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJwcm9wZXJ0eS1lZGl0b3IiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6ZXhwZXJ0IiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImV4cGVydCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpwcmVmZXJyZWQtY2hpbGRyZW4iID4KLSAgICA8eHNsOmVsZW1lbnQgbmFtZT0icHJlZmVycmVkLWNoaWxkcmVuIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi0gIDx4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8vbWZwOmFsbG93YWJsZS1jaGlsZHJlbiIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJhbGxvd2FibGUtY2hpbGRyZW4iID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6cHJlZmVycmVkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9InByZWZlcnJlZCIgPgotICAgICAgPHhzbDp2YWx1ZS1vZiBzZWxlY3Q9InRleHQoKSIgLz4KLSAgICA8L3hzbDplbGVtZW50PgotICA8L3hzbDp0ZW1wbGF0ZT4KLQotICA8eHNsOnRlbXBsYXRlIG1hdGNoPSIvL21mcDpkZXByZWNhdGVkIiA+Ci0gICAgPHhzbDplbGVtZW50IG5hbWU9ImRlcHJlY2F0ZWQiID4KLSAgICAgIDx4c2w6dmFsdWUtb2Ygc2VsZWN0PSJ0ZXh0KCkiIC8+Ci0gICAgPC94c2w6ZWxlbWVudD4KLSAgPC94c2w6dGVtcGxhdGU+Ci0KLSAgPHhzbDp0ZW1wbGF0ZSBtYXRjaD0iLy9tZnA6aW5pdGlhbC12YWx1ZSIgPgotICAgIDx4c2w6ZWxlbWVudCBuYW1lPSJpbml0aWFsLXZhbHVlIiA+Ci0gICAgICA8eHNsOnZhbHVlLW9mIHNlbGVjdD0idGV4dCgpIiAvPgotICAgIDwveHNsOmVsZW1lbnQ+Ci0gIDwveHNsOnRlbXBsYXRlPgotCi08L3hzbDpzdHlsZXNoZWV0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvY29uZi9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvY29uZi9NRVRBLUlORi9mYWNlcy1jb25maWcueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGEwNDU0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2NvbmYvTUVUQS1JTkYvZmFjZXMtY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4MSArMCwwIEBACi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi0gIDxhcHBsaWNhdGlvbj4NCi0gICAgPHZpZXctaGFuZGxlcj5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5hcHBsaWNhdGlvbi5WaWV3SGFuZGxlckltcGw8L3ZpZXctaGFuZGxlcj4NCi0gICAgPHN0YXRlLW1hbmFnZXI+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuYXBwbGljYXRpb24uU3RhdGVNYW5hZ2VySW1wbDwvc3RhdGUtbWFuYWdlcj4NCi0gICAgPG5hdmlnYXRpb24taGFuZGxlcj5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5hcHBsaWNhdGlvbi5OYXZpZ2F0aW9uSGFuZGxlckltcGw8L25hdmlnYXRpb24taGFuZGxlcj4NCi0gICAgPHZhcmlhYmxlLXJlc29sdmVyPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmVsLlRyaW5pZGFkVmFyaWFibGVSZXNvbHZlcjwvdmFyaWFibGUtcmVzb2x2ZXI+DQotICA8L2FwcGxpY2F0aW9uPg0KLQ0KLSAgPGxpZmVjeWNsZT4NCi0gICAgPHBoYXNlLWxpc3RlbmVyPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnRleHQuVHJpbmlkYWRQaGFzZUxpc3RlbmVyPC9waGFzZS1saXN0ZW5lcj4NCi0gIDwvbGlmZWN5Y2xlPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1pZD5qYXZheC5mYWNlcy5TaG9ydDwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuU2hvcnRDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuU2hvcnQ8L2NvbnZlcnRlci1mb3ItY2xhc3M+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5TaG9ydENvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuQnl0ZTwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuQnl0ZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5CeXRlPC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuQnl0ZUNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICANCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuSW50ZWdlcjwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuSW50ZWdlckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5JbnRlZ2VyPC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuSW50ZWdlckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuTG9uZzwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuTG9uZ0NvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+ICAgICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5Mb25nPC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuTG9uZ0NvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuRmxvYXQ8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkZsb2F0Q29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5sYW5nLkZsb2F0PC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRmxvYXRDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgDQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuRG91YmxlPC9jb252ZXJ0ZXItaWQ+DQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwuY29udmVydC5Eb3VibGVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPiAgICAgDQotICA8Y29udmVydGVyPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLmxhbmcuRG91YmxlPC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRG91YmxlQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4gICAgICAgIA0KLSAgDQotICA8dmFsaWRhdG9yPg0KLSAgICA8dmFsaWRhdG9yLWlkPmphdmF4LmZhY2VzLkxvbmdSYW5nZTwvdmFsaWRhdG9yLWlkPg0KLSAgICA8dmFsaWRhdG9yLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnZhbGlkYXRvci5Mb25nUmFuZ2VWYWxpZGF0b3I8L3ZhbGlkYXRvci1jbGFzcz4NCi0gIDwvdmFsaWRhdG9yPg0KLSAgDQotICA8dmFsaWRhdG9yPg0KLSAgICA8ZGlzcGxheS1uYW1lPnZhbGlkYXRlRGF0ZVRpbWVSYW5nZTwvZGlzcGxheS1uYW1lPg0KLSAgICA8dmFsaWRhdG9yLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5EYXRlVGltZVJhbmdlPC92YWxpZGF0b3ItaWQ+DQotICAgIDx2YWxpZGF0b3ItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnZhbGlkYXRvci5EYXRlVGltZVJhbmdlVmFsaWRhdG9yPC92YWxpZGF0b3ItY2xhc3M+ICAgDQotICA8L3ZhbGlkYXRvcj4NCi0NCi0gIDx2YWxpZGF0b3I+DQotICAgIDxkaXNwbGF5LW5hbWU+dmFsaWRhdGVSZWd1bGFyRXhwcmVzc2lvbjwvZGlzcGxheS1uYW1lPg0KLSAgICA8dmFsaWRhdG9yLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5SZWdFeHA8L3ZhbGlkYXRvci1pZD4NCi0gICAgPHZhbGlkYXRvci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC52YWxpZGF0b3IuUmVnRXhwVmFsaWRhdG9yPC92YWxpZGF0b3ItY2xhc3M+DQotICA8L3ZhbGlkYXRvcj4NCi0NCi0gIDx2YWxpZGF0b3I+DQotICAgIDxkaXNwbGF5LW5hbWU+dmFsaWRhdGVCeXRlTGVuZ3RoPC9kaXNwbGF5LW5hbWU+DQotICAgIDx2YWxpZGF0b3ItaWQ+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkJ5dGVMZW5ndGg8L3ZhbGlkYXRvci1pZD4NCi0gICAgPHZhbGlkYXRvci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC52YWxpZGF0b3IuQnl0ZUxlbmd0aFZhbGlkYXRvcjwvdmFsaWRhdG9yLWNsYXNzPiAgIA0KLSAgPC92YWxpZGF0b3I+DQotDQotICAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5Db2xvciBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1pZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ29sb3I8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkNvbG9yQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRlc2NyaXB0aW9uPkNvbG9yIENvbnZlcnRlcjwvZGVzY3JpcHRpb24+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEuYXd0LkNvbG9yPC9jb252ZXJ0ZXItZm9yLWNsYXNzPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuQ29sb3JDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5EYXRlIFRpbWUgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItaWQ+amF2YXguZmFjZXMuRGF0ZVRpbWU8L2NvbnZlcnRlci1pZD4NCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+RGF0ZSBUaW1lIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5EYXRlVGltZTwvY29udmVydGVyLWlkPiAgICANCi0gICAgPGNvbnZlcnRlci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRpbnRlcm5hbC5jb252ZXJ0LkRhdGVUaW1lQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5EYXRlIFRpbWUgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEudXRpbC5EYXRlPC9jb252ZXJ0ZXItZm9yLWNsYXNzPiAgIA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuRGF0ZVRpbWVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLSAgDQotICA8Y29udmVydGVyPg0KLSAgICA8ZGlzcGxheS1uYW1lPkRhdGUgVGltZSBDb252ZXJ0ZXI8L2Rpc3BsYXktbmFtZT4NCi0gICAgPGNvbnZlcnRlci1mb3ItY2xhc3M+amF2YS5zcWwuVGltZXN0YW1wPC9jb252ZXJ0ZXItZm9yLWNsYXNzPiAgIA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuVGltZXN0YW1wQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+RGF0ZSBUaW1lIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWZvci1jbGFzcz5qYXZhLnNxbC5EYXRlPC9jb252ZXJ0ZXItZm9yLWNsYXNzPiAgIA0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLmNvbnZlcnQuSmF2YVNxbERhdGVDb252ZXJ0ZXI8L2NvbnZlcnRlci1jbGFzcz4NCi0gIDwvY29udmVydGVyPg0KLQ0KLSAgPGNvbnZlcnRlcj4NCi0gICAgPGRpc3BsYXktbmFtZT5OdW1iZXIgQ29udmVydGVyPC9kaXNwbGF5LW5hbWU+DQotICAgIDxjb252ZXJ0ZXItZm9yLWNsYXNzPmphdmEubGFuZy5OdW1iZXI8L2NvbnZlcnRlci1mb3ItY2xhc3M+ICAgDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuTnVtYmVyQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0NCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+TnVtYmVyIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWlkPmphdmF4LmZhY2VzLk51bWJlcjwvY29udmVydGVyLWlkPg0KLSAgICA8Y29udmVydGVyLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb252ZXJ0Lk51bWJlckNvbnZlcnRlcjwvY29udmVydGVyLWNsYXNzPg0KLSAgPC9jb252ZXJ0ZXI+DQotICANCi0gIDxjb252ZXJ0ZXI+DQotICAgIDxkaXNwbGF5LW5hbWU+TnVtYmVyIENvbnZlcnRlcjwvZGlzcGxheS1uYW1lPg0KLSAgICA8Y29udmVydGVyLWlkPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5OdW1iZXI8L2NvbnZlcnRlci1pZD4gDQotICAgIDxjb252ZXJ0ZXItY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnZlcnQuTnVtYmVyQ29udmVydGVyPC9jb252ZXJ0ZXItY2xhc3M+DQotICA8L2NvbnZlcnRlcj4NCi0gIA0KLSAgPHJlZmVyZW5jZWQtYmVhbj4NCi0gICAgPGRlc2NyaXB0aW9uPmltcGxpY2l0IG9iamVjdCBwcm92aWRlZCBieSBUcmluaWRhZDwvZGVzY3JpcHRpb24+DQotICAgIDxkaXNwbGF5LW5hbWU+UmVxdWVzdCBDb250ZXh0PC9kaXNwbGF5LW5hbWU+DQotICAgIDxyZWZlcmVuY2VkLWJlYW4tbmFtZT5yZXF1ZXN0Q29udGV4dDwvcmVmZXJlbmNlZC1iZWFuLW5hbWU+DQotICAgIDxyZWZlcmVuY2VkLWJlYW4tY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmNvbnRleHQuUmVxdWVzdENvbnRleHQ8L3JlZmVyZW5jZWQtYmVhbi1jbGFzcz4NCi0gIDwvcmVmZXJlbmNlZC1iZWFuPg0KLQ0KLSAgPHJlZmVyZW5jZWQtYmVhbj4NCi0gICAgPGRlc2NyaXB0aW9uPlRyaW5pZGFkIFByb2Nlc3MgU2NvcGUgTWFwPC9kZXNjcmlwdGlvbj4NCi0gICAgPGRpc3BsYXktbmFtZT5Qcm9jZXNzIFNjb3BlPC9kaXNwbGF5LW5hbWU+DQotICAgIDxyZWZlcmVuY2VkLWJlYW4tbmFtZT5wcm9jZXNzU2NvcGU8L3JlZmVyZW5jZWQtYmVhbi1uYW1lPg0KLSAgICA8cmVmZXJlbmNlZC1iZWFuLWNsYXNzPmphdmEudXRpbC5NYXA8L3JlZmVyZW5jZWQtYmVhbi1jbGFzcz4NCi0gIDwvcmVmZXJlbmNlZC1iZWFuPg0KLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEtdGVtcGxhdGVzL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb21wb25lbnQvVUlYQ29tbWFuZFRlbXBsYXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhLXRlbXBsYXRlcy9vcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29tcG9uZW50L1VJWENvbW1hbmRUZW1wbGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmI5ZjAwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEtdGVtcGxhdGVzL29yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb21wb25lbnQvVUlYQ29tbWFuZFRlbXBsYXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50OwotCi1pbXBvcnQgamF2YXguZmFjZXMuY29tcG9uZW50LkFjdGlvblNvdXJjZTsKLWltcG9ydCBqYXZheC5mYWNlcy5jb250ZXh0LkZhY2VzQ29udGV4dDsKLWltcG9ydCBqYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nOwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LkFib3J0UHJvY2Vzc2luZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5BY3Rpb25FdmVudDsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5BY3Rpb25MaXN0ZW5lcjsKLWltcG9ydCBqYXZheC5mYWNlcy5ldmVudC5GYWNlc0V2ZW50OwotaW1wb3J0IGphdmF4LmZhY2VzLmV2ZW50LlBoYXNlSWQ7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29udGV4dC5SZXF1ZXN0Q29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuTGF1bmNoRXZlbnQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LkxhdW5jaExpc3RlbmVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5SZXR1cm5FdmVudDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuUmV0dXJuTGlzdGVuZXI7Ci0KLS8qKgotICogQmFzZSBjbGFzcyBmb3IgY29tbWFuZCBjb21wb25lbnRzLgotICoKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjMgJCkgJERhdGU6IDIwMDQvMDcvMTkgMTg6MjU6MTcgJAotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgVUlYQ29tbWFuZFRlbXBsYXRlIGV4dGVuZHMgVUlYQ29tcG9uZW50QmFzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltcGxlbWVudHMgQWN0aW9uU291cmNlLCBEaWFsb2dTb3VyY2UKLXsKLS8qKi8gLy8gQWJzdHJhY3QgbWV0aG9kcyBpbXBsZW1lbnRlZCBieSBjb2RlIGdlbgotLyoqLyAgYWJzdHJhY3QgcHVibGljIE1ldGhvZEJpbmRpbmcgZ2V0QWN0aW9uTGlzdGVuZXIoKTsKLS8qKi8gIGFic3RyYWN0IHB1YmxpYyBNZXRob2RCaW5kaW5nIGdldFJldHVybkxpc3RlbmVyKCk7Ci0vKiovICBhYnN0cmFjdCBwdWJsaWMgTWV0aG9kQmluZGluZyBnZXRMYXVuY2hMaXN0ZW5lcigpOwotCi0KLSAgLyoqCi0gICAqIEFkZCBhIExhdW5jaExpc3RlbmVyLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRkTGF1bmNoTGlzdGVuZXIoTGF1bmNoTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHsKLSAgICBhZGRGYWNlc0xpc3RlbmVyKGxpc3RlbmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZW1vdmUgYSBMYXVuY2hMaXN0ZW5lci4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZUxhdW5jaExpc3RlbmVyKExhdW5jaExpc3RlbmVyIGxpc3RlbmVyKQotICB7Ci0gICAgcmVtb3ZlRmFjZXNMaXN0ZW5lcihsaXN0ZW5lcik7Ci0gIH0KLQotICAvKioKLSAgICogTGF1bmNoIGFsbCBhZGRlZCBMYXVuY2hMaXN0ZW5lcnMuCi0gICAqLwotICBwdWJsaWMgTGF1bmNoTGlzdGVuZXJbXSBnZXRMYXVuY2hMaXN0ZW5lcnMoKQotICB7Ci0gICAgcmV0dXJuIChMYXVuY2hMaXN0ZW5lcltdKSBnZXRGYWNlc0xpc3RlbmVycyhMYXVuY2hMaXN0ZW5lci5jbGFzcyk7Ci0gIH0KLQotICAvKioKLSAgICogPHA+SW50ZXJjZXB0IDxjb2RlPnF1ZXVlRXZlbnQ8L2NvZGU+IGFuZCBtYXJrIHRoZSBwaGFzZUlkIGZvciB0aGUKLSAgICogZXZlbnQgdG8gYmUgPGNvZGU+UGhhc2VJZC5BUFBMWV9SRVFVRVNUX1ZBTFVFUzwvY29kZT4gaWYgdGhlCi0gICAqIDxjb2RlPmltbWVkaWF0ZTwvY29kZT4gZmxhZyBpcyB0cnVlLAotICAgKiA8Y29kZT5QaGFzZUlkLklOVk9LRV9BUFBMSUNBVElPTjwvY29kZT4gb3RoZXJ3aXNlLjwvcD4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHF1ZXVlRXZlbnQoRmFjZXNFdmVudCBlKQotICB7Ci0gICAgaWYgKGUgaW5zdGFuY2VvZiBBY3Rpb25FdmVudCkKLSAgICB7Ci0gICAgICBpZiAoaXNJbW1lZGlhdGUoKSkKLSAgICAgIHsKLSAgICAgICAgZS5zZXRQaGFzZUlkKFBoYXNlSWQuQU5ZX1BIQVNFKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZS5zZXRQaGFzZUlkKFBoYXNlSWQuSU5WT0tFX0FQUExJQ0FUSU9OKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdXBlci5xdWV1ZUV2ZW50KGUpOwotICB9Ci0KLQotICBwdWJsaWMgdm9pZCBicm9hZGNhc3QoRmFjZXNFdmVudCBldmVudCkgdGhyb3dzIEFib3J0UHJvY2Vzc2luZ0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gUGVyZm9ybSBzcGVjaWFsIHByb2Nlc3NpbmcgZm9yIEFjdGlvbkV2ZW50czogIHRlbGwKLSAgICAvLyB0aGUgUmVxdWVzdENvbnRleHQgdG8gcmVtZW1iZXIgdGhpcyBjb21tYW5kIGluc3RhbmNlCi0gICAgLy8gc28gdGhhdCB0aGUgTmF2aWdhdGlvbkhhbmRsZXIgY2FuIGxvY2F0ZSB1cyB0byBxdWV1ZQotICAgIC8vIGEgTGF1bmNoRXZlbnQuCi0gICAgaWYgKGV2ZW50IGluc3RhbmNlb2YgQWN0aW9uRXZlbnQpCi0gICAgewotICAgICAgUmVxdWVzdENvbnRleHQgYWZDb250ZXh0ID0gUmVxdWVzdENvbnRleHQuZ2V0Q3VycmVudEluc3RhbmNlKCk7Ci0gICAgICBhZkNvbnRleHQuZ2V0RGlhbG9nU2VydmljZSgpLnNldEN1cnJlbnRMYXVuY2hTb3VyY2UodGhpcyk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICAvLyBQZXJmb3JtIHN0YW5kYXJkIHN1cGVyY2xhc3MgcHJvY2Vzc2luZwotICAgICAgICBzdXBlci5icm9hZGNhc3QoZXZlbnQpOwotCi0gICAgICAgIC8vIE5vdGlmeSB0aGUgc3BlY2lmaWVkIGFjdGlvbiBsaXN0ZW5lciBtZXRob2QgKGlmIGFueSksCi0gICAgICAgIC8vIGFuZCB0aGUgZGVmYXVsdCBhY3Rpb24gbGlzdGVuZXIKLSAgICAgICAgX19icm9hZGNhc3QoZXZlbnQsIGdldEFjdGlvbkxpc3RlbmVyKCkpOwotCi0gICAgICAgIEZhY2VzQ29udGV4dCBjb250ZXh0ID0gZ2V0RmFjZXNDb250ZXh0KCk7Ci0gICAgICAgIEFjdGlvbkxpc3RlbmVyIGRlZmF1bHRBY3Rpb25MaXN0ZW5lciA9Ci0gICAgICAgICAgY29udGV4dC5nZXRBcHBsaWNhdGlvbigpLmdldEFjdGlvbkxpc3RlbmVyKCk7Ci0gICAgICAgIGlmIChkZWZhdWx0QWN0aW9uTGlzdGVuZXIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIGRlZmF1bHRBY3Rpb25MaXN0ZW5lci5wcm9jZXNzQWN0aW9uKChBY3Rpb25FdmVudCkgZXZlbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBmaW5hbGx5Ci0gICAgICB7Ci0gICAgICAgIGFmQ29udGV4dC5nZXREaWFsb2dTZXJ2aWNlKCkuc2V0Q3VycmVudExhdW5jaFNvdXJjZShudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIC8vIFBlcmZvcm0gc3RhbmRhcmQgc3VwZXJjbGFzcyBwcm9jZXNzaW5nCi0gICAgICBzdXBlci5icm9hZGNhc3QoZXZlbnQpOwotCi0gICAgICBpZiAoZXZlbnQgaW5zdGFuY2VvZiBMYXVuY2hFdmVudCkKLSAgICAgIHsKLSAgICAgICAgX19icm9hZGNhc3QoZXZlbnQsIGdldExhdW5jaExpc3RlbmVyKCkpOwotICAgICAgICBib29sZWFuIHVzZVdpbmRvdyA9Ci0gICAgICAgICAgQm9vbGVhbi5UUlVFLmVxdWFscyhnZXRBdHRyaWJ1dGVzKCkuZ2V0KCJ1c2VXaW5kb3ciKSk7Ci0KLSAgICAgICAgKChMYXVuY2hFdmVudCkgZXZlbnQpLmxhdW5jaERpYWxvZyh1c2VXaW5kb3cpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoZXZlbnQgaW5zdGFuY2VvZiBSZXR1cm5FdmVudCkKLSAgICAgIHsKLSAgICAgICAgX19icm9hZGNhc3QoZXZlbnQsIGdldFJldHVybkxpc3RlbmVyKCkpOwotICAgICAgICAvLyA9LT1BRVc6IGFsd2F5cyBqdW1wIHRvIHJlbmRlciByZXNwb25zZT8/PyAgU2VlbXMgdGhlIHNhZmVzdAotICAgICAgICAvLyBvcHRpb24sIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBpbW1lZGlhdGVseSB1cGRhdGUgYSBtb2RlbAotICAgICAgICAvLyBvciByZWFsbHkgcGVyZm9ybSBhbnkgdmFsaWRhdGlvbi4KLSAgICAgICAgZ2V0RmFjZXNDb250ZXh0KCkucmVuZGVyUmVzcG9uc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9BYnN0cmFjdE1vam9UZXN0Q2FzZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0TW9qb1Rlc3RDYXNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmZjc1YWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2ZhY2VzL0Fic3RyYWN0TW9qb1Rlc3RDYXNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLk1vZGVsOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuQnVpbGQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLS8qKgotICogVGVzdHMgdGhlIGNvbXBvbmVudCBnZW5lcmF0aW9uIG1vam8uCi0gKi8KLWFic3RyYWN0IHB1YmxpYyBjbGFzcyBBYnN0cmFjdE1vam9UZXN0Q2FzZSBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IEFic3RyYWN0TW9qb1Rlc3RDYXNlLgotICAgKgotICAgKiBAcGFyYW0gdGVzdE5hbWUgIHRoZSB0ZXN0IHRvIGV4ZWN1dGUKLSAgICovCi0gIHB1YmxpYyBBYnN0cmFjdE1vam9UZXN0Q2FzZSgKLSAgICBTdHJpbmcgdGVzdE5hbWUpCi0gIHsKLSAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2pvUHJvamVjdCgKLSAgICBNb2pvICAgbW9qbywKLSAgICBTdHJpbmcgbmFtZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIE1vZGVsIG1vZGVsID0gbmV3IE1vZGVsKCk7Ci0gICAgQnVpbGQgYnVpbGQgPSBuZXcgQnVpbGQoKTsKLSAgICBidWlsZC5zZXRPdXRwdXREaXJlY3RvcnkoInRhcmdldC90ZXN0LWJ1aWxkLW91dHB1dCIpOwotICAgIG1vZGVsLnNldEJ1aWxkKGJ1aWxkKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgbmFtZSwgbmV3IE1hdmVuUHJvamVjdChtb2RlbCkpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9qb0ZpZWxkKAotICAgIE1vam8gICBtb2pvLAotICAgIFN0cmluZyBuYW1lLAotICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIENsYXNzIG1vam9DbGFzcyA9IG1vam8uZ2V0Q2xhc3MoKTsKLSAgICAgIEZpZWxkIGZpZWxkID0gbW9qb0NsYXNzLmdldERlY2xhcmVkRmllbGQobmFtZSk7Ci0gICAgICBmaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwotICAgICAgZmllbGQuc2V0KG1vam8sIHZhbHVlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE5vU3VjaEZpZWxkRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIlVua25vd24gTW9qbyBwcm9wZXJ0eSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHNldHRpbmcgTW9qbyBwcm9wZXJ0eSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgc2V0TW9qb1Byb3BlcnR5KAotICAgIE1vam8gICBtb2pvLAotICAgIFN0cmluZyBuYW1lLAotICAgIE9iamVjdCB2YWx1ZSkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIHNldE1vam9Qcm9wZXJ0eShtb2pvLCBuYW1lLCB2YWx1ZS5nZXRDbGFzcygpLCB2YWx1ZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2pvUHJvcGVydHkoCi0gICAgTW9qbyAgICBtb2pvLAotICAgIFN0cmluZyAgbmFtZSwKLSAgICBib29sZWFuIHZhbHVlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgc2V0TW9qb1Byb3BlcnR5KG1vam8sIG5hbWUsIEJvb2xlYW4uVFlQRSwgQm9vbGVhbi52YWx1ZU9mKHZhbHVlKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBzZXRNb2pvUHJvcGVydHkoCi0gICAgTW9qbyAgIG1vam8sCi0gICAgU3RyaW5nIG5hbWUsCi0gICAgQ2xhc3MgIHR5cGUsCi0gICAgT2JqZWN0IHZhbHVlKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3MgbW9qb0NsYXNzID0gbW9qby5nZXRDbGFzcygpOwotICAgICAgTWV0aG9kIG1ldGhvZCA9IG1vam9DbGFzcy5nZXREZWNsYXJlZE1ldGhvZCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzZXQiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYXJhY3Rlci50b1VwcGVyQ2FzZShuYW1lLmNoYXJBdCgwKSkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zdWJzdHJpbmcoMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgQ2xhc3NbXXt0eXBlfSk7Ci0gICAgICBtZXRob2Quc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgIG1ldGhvZC5pbnZva2UobW9qbywgbmV3IE9iamVjdFtde3ZhbHVlfSk7Ci0gICAgfQotICAgIGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5rbm93biBNb2pvIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIiLCBlKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3Igc2V0dGluZyBNb2pvIHByb3BlcnR5ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG5hbWUgKyAiXCIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5nZXRUYXJnZXRFeGNlcHRpb24oKSk7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIHNldHRpbmcgTW9qbyBwcm9wZXJ0eSAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIiwgZSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODIyMTZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlczsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRmFpbHVyZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLkFic3RyYWN0TW9qb1Rlc3RDYXNlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMuR2VuZXJhdGVDb21wb25lbnRzTW9qbzsKLQotLyoqCi0gKiBUZXN0cyB0aGUgY29tcG9uZW50IGdlbmVyYXRpb24gbW9qby4KLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0IGV4dGVuZHMgQWJzdHJhY3RNb2pvVGVzdENhc2UKLXsKLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgR2VuZXJhdGVDb21wb25lbnRzTW9qb1Rlc3QuCi0gICAqCi0gICAqIEBwYXJhbSB0ZXN0TmFtZSAgdGhlIHRlc3QgdG8gZXhlY3V0ZQotICAgKi8KLSAgcHVibGljIEdlbmVyYXRlQ29tcG9uZW50c01vam9UZXN0KAotICAgIFN0cmluZyB0ZXN0TmFtZSkKLSAgewotICAgIHN1cGVyKHRlc3ROYW1lKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIE1vam8gbW9qbyA9IG5ldyBHZW5lcmF0ZUNvbXBvbmVudHNNb2pvKCk7Ci0gICAgRmlsZSBnZW5TcmNEaXIgPSBuZXcgRmlsZSgidGFyZ2V0L21vam8tdGVzdC1vdXRwdXQvamF2YSIpOwotCi0gICAgc2V0TW9qb1Byb2plY3QobW9qbywgInByb2plY3QiKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgInBhY2thZ2VDb250YWlucyIsICJvcmciKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgInR5cGVQcmVmaXgiLCAib3JnLmFwYWNoZSIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAidGVtcGxhdGVTb3VyY2VEaXJlY3RvcnkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGUoInNyYy90ZXN0L2phdmEtdGVtcGxhdGVzIikpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAiZ2VuZXJhdGVkU291cmNlRGlyZWN0b3J5IiwgZ2VuU3JjRGlyKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgImZvcmNlIiwgQm9vbGVhbi5UUlVFKTsKLQotICAgIF9tb2pvID0gbW9qbzsKLSAgICBfZ2VuU3JjRGlyID0gZ2VuU3JjRGlyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVhckRvd24oKQotICB7Ci0gICAgX21vam8gPSBudWxsOwotICAgIF9nZW5TcmNEaXIgPSBudWxsOwotICB9Ci0KLSAgICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ0RlZmF1bHRJbmRleCgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbgotICB7Ci0gICAgX21vam8uZXhlY3V0ZSgpOwotICB9Ci0vKgotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcEFQSSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBzZXRNb2pvRmllbGQoX21vam8sICJyZXNvdXJjZVBhdGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0U2tpcEFQSS5sc3QiKTsKLSAgICBfbW9qby5leGVjdXRlKCk7Ci0KLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZ2VuU3JjRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJqYXZheC9mYWNlcy9jb21wb25lbnQvVUlOYW1pbmdDb250YWluZXIuamF2YSIpOwotICAgIGlmICh0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgZmFpbCgiSmF2YVNlcnZlciBGYWNlcyBBUEkgY29tcG9uZW50IGdlbmVyYXRlZCIpOwotICB9Ci0qLwotICBwdWJsaWMgdm9pZCB0ZXN0R2VuZXJhdGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgTW9qb0ZhaWx1cmVFeGNlcHRpb24KLSAgewotICAgIHNldE1vam9GaWVsZChfbW9qbywgInJlc291cmNlUGF0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL3Rlc3RHZW5lcmF0ZS5sc3QiKTsKLSAgICBfbW9qby5leGVjdXRlKCk7Ci0KLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZShfZ2VuU3JjRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcmcvYXBhY2hlL215ZmFjZXMvdHJpbmlkYWQvY29tcG9uZW50L1VJWENvbW1hbmQuamF2YSIpOwotICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgIGZhaWwoIkNvbXBvbmVudCBub3QgZ2VuZXJhdGVkIik7Ci0KLSAgICAvLyBUT0RPOiB2ZXJpZnkgaWRlbnRpdHkgY29udGVudCB3aXRoIHRyaW5pZGFkIEZhY2VzIGV4YW1wbGUKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZW5lcmF0ZVdpdGhUZW1wbGF0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uLCBNb2pvRmFpbHVyZUV4Y2VwdGlvbgotICB7Ci0gICAgc2V0TW9qb0ZpZWxkKF9tb2pvLCAicmVzb3VyY2VQYXRoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJNRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdEdlbmVyYXRlLmxzdCIpOwotICAgIF9tb2pvLmV4ZWN1dGUoKTsKLQotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKF9nZW5TcmNEaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yZy9hcGFjaGUvbXlmYWNlcy90cmluaWRhZC9jb21wb25lbnQvVUlYQ29tbWFuZC5qYXZhIik7Ci0gICAgaWYgKCF0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgZmFpbCgiQ29tcG9uZW50IG5vdCBnZW5lcmF0ZWQiKTsKLQotICAgIC8vIFRPRE86IHZlcmlmeSBpZGVudGl0eSBjb250ZW50IHdpdGggdHJpbmlkYWQgRmFjZXMgZXhhbXBsZQotICB9Ci0KLSAgcHJpdmF0ZSBNb2pvIF9tb2pvOwotICBwcml2YXRlIEZpbGUgX2dlblNyY0RpcjsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9mYWNlcy9HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5YTUyNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vZmFjZXMvR2VuZXJhdGVGYWNlc0NvbmZpZ01vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0ZhaWx1cmVFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5HZW5lcmF0ZUZhY2VzQ29uZmlnTW9qbzsKLQotLyoqCi0gKiBUZXN0cyB0aGUgZmFjZXMtY29uZmlnLnhtbCBnZW5lcmF0aW9uIG1vam8uCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QgZXh0ZW5kcyBBYnN0cmFjdE1vam9UZXN0Q2FzZQotewotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBHZW5lcmF0ZUZhY2VzQ29uZmlnTW9qb1Rlc3QuCi0gICAqCi0gICAqIEBwYXJhbSB0ZXN0TmFtZSAgdGhlIHRlc3QgdG8gZXhlY3V0ZQotICAgKi8KLSAgcHVibGljIEdlbmVyYXRlRmFjZXNDb25maWdNb2pvVGVzdCgKLSAgICBTdHJpbmcgdGVzdE5hbWUpCi0gIHsKLSAgICBzdXBlcih0ZXN0TmFtZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBNb2pvIG1vam8gPSBuZXcgR2VuZXJhdGVGYWNlc0NvbmZpZ01vam8oKTsKLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKCJ0YXJnZXQvbW9qby10ZXN0LW91dHB1dC9qYXZhIik7Ci0KLSAgICBzZXRNb2pvUHJvamVjdChtb2pvLCAicHJvamVjdCIpOwotICAgIHNldE1vam9GaWVsZChtb2pvLCAiY29uZmlnRGlyZWN0b3J5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBGaWxlKCJzcmMvdGVzdC9yZXNvdXJjZXMiKSk7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJjb25maWdQYXRoIiwgIk1FVEEtSU5GL2ZhY2VzLWNvbmZpZy54bWwiKTsKLSAgICBzZXRNb2pvRmllbGQobW9qbywgInRhcmdldERpcmVjdG9yeSIsIHRhcmdldERpcik7Ci0gICAgc2V0TW9qb0ZpZWxkKG1vam8sICJmb3JjZSIsIEJvb2xlYW4uVFJVRSk7Ci0KLSAgICBfbW9qbyA9IG1vam87Ci0gICAgX3RhcmdldERpciA9IHRhcmdldERpcjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlYXJEb3duKCkKLSAgewotICAgIF9tb2pvID0gbnVsbDsKLSAgICBfdGFyZ2V0RGlyID0gbnVsbDsKLSAgfQotCi0gICAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlKCkgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24sIE1vam9GYWlsdXJlRXhjZXB0aW9uCi0gIHsKLSAgICBfbW9qby5leGVjdXRlKCk7Ci0KLSAgICAvLyBUT0RPOiB2ZXJpZnkgY29udGVudCBpcyBjb3JyZWN0ISAKLSAgfQotCi0gIHByaXZhdGUgTW9qbyBfbW9qbzsKLSAgcHJpdmF0ZSBGaWxlIF90YXJnZXREaXI7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmIwMmY3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnQueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLQ0KLSAgPGNvbXBvbmVudD4gIA0KLSAgDQotICAgIDxjb21wb25lbnQtdHlwZT5qYXZheC5mYWNlcy5Db21wb25lbnQ8L2NvbXBvbmVudC10eXBlPg0KLSAgICA8Y29tcG9uZW50LWNsYXNzPmphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudDwvY29tcG9uZW50LWNsYXNzPg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+aWQ8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPlN0cmluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6bGl0ZXJhbC1vbmx5PnRydWU8L21mcDpsaXRlcmFsLW9ubHk+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5yZW5kZXJlZDwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+Ym9vbGVhbjwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlZmF1bHQtdmFsdWU+dHJ1ZTwvZGVmYXVsdC12YWx1ZT4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmJpbmRpbmc8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmF4LmZhY2VzLmVsLlZhbHVlQmluZGluZzwvcHJvcGVydHktY2xhc3M+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT50cmFuc2llbnQ8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmJvb2xlYW48L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOmxpdGVyYWwtb25seT50cnVlPC9tZnA6bGl0ZXJhbC1vbmx5Pg0KLSAgICAgICAgPG1mcDp0cmFuc2llbnQ+dHJ1ZTwvbWZwOnRyYW5zaWVudD4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPnJlbmRlcmVyVHlwZTwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+U3RyaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpsaXRlcmFsLW9ubHk+dHJ1ZTwvbWZwOmxpdGVyYWwtb25seT4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gIDwvY29tcG9uZW50Pg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVmMTcyNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50PiAgDQotICANCi0gICAgPGNvbXBvbmVudC10eXBlPmphdmF4LmZhY2VzLkNvbXBvbmVudEJhc2U8L2NvbXBvbmVudC10eXBlPg0KLSAgICA8Y29tcG9uZW50LWNsYXNzPmphdmF4LmZhY2VzLmNvbXBvbmVudC5VSUNvbXBvbmVudEJhc2U8L2NvbXBvbmVudC1jbGFzcz4NCi0NCi0gICAgPGNvbXBvbmVudC1leHRlbnNpb24+DQotICAgICAgPG1mcDpjb21wb25lbnQ+DQotICAgICAgICA8bWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+amF2YXguZmFjZXMuQ29tcG9uZW50PC9tZnA6Y29tcG9uZW50LXN1cGVydHlwZT4NCi0gICAgICA8L21mcDpjb21wb25lbnQ+DQotICAgIDwvY29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgDQotICA8L2NvbXBvbmVudD4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvamF2YXgvZmFjZXMvTmFtaW5nQ29udGFpbmVyLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9OYW1pbmdDb250YWluZXIueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ODllNGRhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy9qYXZheC9mYWNlcy9OYW1pbmdDb250YWluZXIueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+DQotDQotICAgIDxjb21wb25lbnQtdHlwZT5qYXZheC5mYWNlcy5OYW1pbmdDb250YWluZXI8L2NvbXBvbmVudC10eXBlPg0KLSAgICA8Y29tcG9uZW50LWNsYXNzPmphdmF4LmZhY2VzLmNvbXBvbmVudC5VSU5hbWluZ0NvbnRhaW5lcjwvY29tcG9uZW50LWNsYXNzPg0KLSAgICANCi0gICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgIEEgc2ltcGxlIG5hbWluZyBjb250YWluZXIuDQotICAgIDwvZGVzY3JpcHRpb24+DQotICAgIA0KLSAgICA8Y29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmNvbXBvbmVudC1mYW1pbHk+amF2YXguZmFjZXMuTmFtaW5nQ29udGFpbmVyPC9tZnA6Y29tcG9uZW50LWZhbWlseT4NCi0gICAgICA8bWZwOm5hbWluZy1jb250YWluZXI+dHJ1ZTwvbWZwOm5hbWluZy1jb250YWluZXI+DQotICAgICAgPG1mcDplY21hc2NyaXB0LWNsYXNzPmNvbXBvbmVudC5VSU5hbWluZ0NvbnRhaW5lcjwvbWZwOmVjbWFzY3JpcHQtY2xhc3M+DQotICAgIDwvY29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgICANCi0gIDwvY29tcG9uZW50Pg0KLQ0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21tYW5kLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21tYW5kLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThmOTM4OC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tbWFuZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOmFmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL3RyaW5pZGFkIg0KLSAgICAgICAgICAgICAgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0NCi0gIDxjb21wb25lbnQ+ICANCi0gIA0KLSAgICA8Y29tcG9uZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkNvbW1hbmQ8L2NvbXBvbmVudC10eXBlPg0KLSAgICA8Y29tcG9uZW50LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5jb21wb25lbnQuVUlYQ29tbWFuZDwvY29tcG9uZW50LWNsYXNzPg0KLQ0KLSAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgQSBiYXNlIGFic3RyYWN0aW9uIGZvciBjb21wb25lbnRzIHRoYXQgaW1wbGVtZW50IEFjdGlvblNvdXJjZS4NCi0gICAgPC9kZXNjcmlwdGlvbj4NCi0NCi0gICAgPHhpOmluY2x1ZGUgaHJlZj0iVGVzdEluY2x1ZGUueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy9jb21wb25lbnQvKiI+PC94aTppbmNsdWRlPg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+YWN0aW9uPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIEphdmEgbWV0aG9kIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4NCi0gICAgICAgICAgYW4gQWN0aW9uRXZlbnQgaXMgYnJvYWRjYXN0IGJ5IHRoaXMgY29tcG9uZW50LiAgVGhlIG1ldGhvZA0KLSAgICAgICAgICBzaWduYXR1cmUgdGFrZXMgemVybyBwYXJhbWV0ZXJzIGFuZCBtYXkgcmV0dXJuIFN0cmluZyBvciB2b2lkLg0KLSAgICAgICAgICBJZiBhIG5vbi1udWxsIFN0cmluZyB2YWx1ZSBpcyByZXR1cm5lZCwgaXQgd2lsbCBiZSB1c2VkIGFzDQotICAgICAgICAgIGFuIG91dGNvbWUgZm9yIG5hdmlnYXRpb24uDQotICAgICAgPC9kZXNjcmlwdGlvbj4NCi0gICAgICA8cHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICAgICAgPG1mcDpzdGF0ZS1ob2xkZXI+dHJ1ZTwvbWZwOnN0YXRlLWhvbGRlcj4NCi0gICAgICAgIDxtZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgICA8bWZwOnJldHVybi10eXBlPlN0cmluZzwvbWZwOnJldHVybi10eXBlPg0KLSAgICAgICAgPC9tZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgICAgPG1kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgICAgICA8bWQ6cHJlZmVycmVkPnRydWU8L21kOnByZWZlcnJlZD4NCi0gICAgICAgIDwvbWQ6YXR0cmlidXRlTWV0YWRhdGE+DQotICAgICAgPC9wcm9wZXJ0eS1leHRlbnNpb24+DQotICAgIDwvcHJvcGVydHk+DQotDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5hY3Rpb25MaXN0ZW5lcjwvcHJvcGVydHktbmFtZT4NCi0gICAgICA8cHJvcGVydHktY2xhc3M+amF2YXguZmFjZXMuZWwuTWV0aG9kQmluZGluZzwvcHJvcGVydHktY2xhc3M+DQotICAgICAgPGRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBUaGUgcmVmZXJlbmNlIHRvIHRoZSBKYXZhIG1ldGhvZCB0aGF0IHdpbGwgYmUgaW52b2tlZCB3aGVuDQotICAgICAgICAgIGFuIEFjdGlvbkV2ZW50IGlzIGJyb2FkY2FzdCBieSB0aGlzIGNvbXBvbmVudC4gIFRoZSBtZXRob2QNCi0gICAgICAgICAgc2lnbmF0dXJlIHRha2VzIGEgc2luZ2xlIEFjdGlvbkV2ZW50IHBhcmFtZXRlciBhbmQgcmV0dXJucw0KLSAgICAgICAgICB2b2lkLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6c3RhdGUtaG9sZGVyPnRydWU8L21mcDpzdGF0ZS1ob2xkZXI+DQotICAgICAgICA8bWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgICAgPG1mcDpwYXJhbWV0ZXItdHlwZT5qYXZheC5mYWNlcy5ldmVudC5BY3Rpb25FdmVudDwvbWZwOnBhcmFtZXRlci10eXBlPg0KLSAgICAgICAgICA8bWZwOnJldHVybi10eXBlPnZvaWQ8L21mcDpyZXR1cm4tdHlwZT4NCi0gICAgICAgIDwvbWZwOm1ldGhvZC1iaW5kaW5nLXNpZ25hdHVyZT4NCi0gICAgICAgIDxtZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICAgICAgPG1kOnByZWZlcnJlZD50cnVlPC9tZDpwcmVmZXJyZWQ+DQotICAgICAgICA8L21kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+cmV0dXJuTGlzdGVuZXI8L3Byb3BlcnR5LW5hbWU+DQotICAgICAgPHByb3BlcnR5LWNsYXNzPmphdmF4LmZhY2VzLmVsLk1ldGhvZEJpbmRpbmc8L3Byb3BlcnR5LWNsYXNzPg0KLSAgICAgIDxkZXNjcmlwdGlvbj4NCi0gICAgICAgICAgVGhlIHJlZmVyZW5jZSB0byB0aGUgSmF2YSBtZXRob2QgdGhhdCB3aWxsIGJlIGludm9rZWQgd2hlbg0KLSAgICAgICAgICBhIGRpYWxvZyBSZXR1cm5FdmVudCBpcyBicm9hZGNhc3QgYnkgdGhpcyBjb21wb25lbnQuICBUaGUgbWV0aG9kDQotICAgICAgICAgIHNpZ25hdHVyZSB0YWtlcyBhIHNpbmdsZSBSZXR1cm5FdmVudCBwYXJhbWV0ZXIgYW5kIHJldHVybnMNCi0gICAgICAgICAgdm9pZC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOnN0YXRlLWhvbGRlcj50cnVlPC9tZnA6c3RhdGUtaG9sZGVyPg0KLSAgICAgICAgPG1mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICAgIDxtZnA6cGFyYW1ldGVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LlJldHVybkV2ZW50PC9tZnA6cGFyYW1ldGVyLXR5cGU+DQotICAgICAgICAgIDxtZnA6cmV0dXJuLXR5cGU+dm9pZDwvbWZwOnJldHVybi10eXBlPg0KLSAgICAgICAgPC9tZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8cHJvcGVydHk+DQotICAgICAgPHByb3BlcnR5LW5hbWU+aW1tZWRpYXRlPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5ib29sZWFuPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICBhIHJlZmVyZW5jZSB0byBhbiBhY3Rpb24gbWV0aG9kIHNlbnQgYnkgdGhlIGNvbW1hbmQgY29tcG9uZW50LCANCi1vciB0aGUgc3RhdGljIG91dGNvbWUgb2YgYW4gYWN0aW9uLiAgV2hlbiBpbW1lZGlhdGUgaXMgdHJ1ZSwgdGhlIA0KLWRlZmF1bHQgQWN0aW9uTGlzdGVuZXIgcHJvdmlkZWQgYnkgdGhlIEphdmFTZXJ2ZXIgRmFjZXMgaW1wbGVtZW50YXRpb24gDQotc2hvdWxkIGJlIGV4ZWN1dGVkIGR1cmluZyBBcHBseSBSZXF1ZXN0IFZhbHVlcyBwaGFzZSBvZiB0aGUgcmVxdWVzdCANCi1wcm9jZXNzaW5nIGxpZmVjeWNsZSwgcmF0aGVyIHRoYW4gd2FpdGluZyB1bnRpbCB0aGUgSW52b2tlIEFwcGxpY2F0aW9uIA0KLXBoYXNlLg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZnA6cmVxdWlyZWQ+ZmFsc2U8L21mcDpyZXF1aXJlZD4NCi0gICAgICA8L3Byb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgPC9wcm9wZXJ0eT4NCi0NCi0gICAgPGNvbXBvbmVudC1leHRlbnNpb24+DQotICAgICAgPG1mcDpjb21wb25lbnQtZmFtaWx5Pm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Db21tYW5kPC9tZnA6Y29tcG9uZW50LWZhbWlseT4NCi0gICAgICA8bWZwOmRlZmF1bHQtcmVuZGVyZXItdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQnV0dG9uPC9tZnA6ZGVmYXVsdC1yZW5kZXJlci10eXBlPg0KLSAgICAgIDxtZnA6Y29tcG9uZW50LXN1cGVydHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQ29tcG9uZW50QmFzZTwvbWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+DQotDQotICAgICAgPG1mcDpqc3AtdGFnLWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnRhZ2xpYi5VSVhDb21tYW5kVGFnPC9tZnA6anNwLXRhZy1jbGFzcz4NCi0gICAgICA8bWZwOmpzcC10YWctbmFtZT5hZjpjb21tYW5kPC9tZnA6anNwLXRhZy1uYW1lPg0KLQ0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+amF2YXguZmFjZXMuQWN0aW9uPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkludm9rZSBBcHBsaWNhdGlvbixBcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0NCi0gICAgICA8bWZwOmV2ZW50Pg0KLSAgICAgICAgPG1mcDpldmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5MYXVuY2g8L21mcDpldmVudC10eXBlPg0KLSAgICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+SW52b2tlIEFwcGxpY2F0aW9uLEFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICAgIDwvbWZwOmV2ZW50Pg0KLQ0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJldHVybjwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5BcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0NCi0gICAgICA8bWQ6ZWxlbWVudE1ldGFkYXRhPg0KLSAgICAgICAgPG1kOmdyb3VwPiR7bWQ6Z2V0VHJhbnNsYXRlZFN0cmluZygiUEFMRVRURV9JTlBVVCIpfTwvbWQ6Z3JvdXA+DQotICAgICAgPC9tZDplbGVtZW50TWV0YWRhdGE+DQotICAgIDwvY29tcG9uZW50LWV4dGVuc2lvbj4NCi0NCi0gIDwvY29tcG9uZW50Pg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21wb25lbnRCYXNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmM0MWVjNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2NvbXBvbmVudHMvdHJpbmlkYWQvZmFjZXMvQ29tcG9uZW50QmFzZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiID8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50PiAgDQotICANCi0gICAgPGNvbXBvbmVudC10eXBlPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5Db21wb25lbnRCYXNlPC9jb21wb25lbnQtdHlwZT4NCi0gICAgPGNvbXBvbmVudC1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LlVJWENvbXBvbmVudEJhc2U8L2NvbXBvbmVudC1jbGFzcz4NCi0NCi0gICAgPHByb3BlcnR5Pg0KLSAgICAgIDxwcm9wZXJ0eS1uYW1lPmF0dHJpYnV0ZUNoYW5nZUxpc3RlbmVyPC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZheC5mYWNlcy5lbC5NZXRob2RCaW5kaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgIFRoZSByZWZlcmVuY2UgdG8gdGhlIEphdmEgbWV0aG9kIHRoYXQgd2lsbCBiZSBpbnZva2VkIHdoZW4NCi0gICAgICAgICAgYW4gQXR0cmlidXRlQ2hhbmdlRXZlbnQgaXMgYnJvYWRjYXN0IGJ5IHRoaXMgY29tcG9uZW50LiAgVGhlIA0KLSAgICAgICAgICBtZXRob2Qgc2lnbmF0dXJlIHRha2VzIGEgc2luZ2xlIEF0dHJpYnV0ZUNoYW5nZUV2ZW50IHBhcmFtZXRlciANCi0gICAgICAgICAgYW5kIHJldHVybnMgdm9pZC4NCi0gICAgICA8L2Rlc2NyaXB0aW9uPg0KLSAgICAgIDxwcm9wZXJ0eS1leHRlbnNpb24+DQotICAgICAgICA8bWZwOnN0YXRlLWhvbGRlcj50cnVlPC9tZnA6c3RhdGUtaG9sZGVyPg0KLSAgICAgICAgPG1mcDptZXRob2QtYmluZGluZy1zaWduYXR1cmU+DQotICAgICAgICAgIDxtZnA6cGFyYW1ldGVyLXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLmV2ZW50LkF0dHJpYnV0ZUNoYW5nZUV2ZW50PC9tZnA6cGFyYW1ldGVyLXR5cGU+DQotICAgICAgICAgIDxtZnA6cmV0dXJuLXR5cGU+dm9pZDwvbWZwOnJldHVybi10eXBlPg0KLSAgICAgICAgPC9tZnA6bWV0aG9kLWJpbmRpbmctc2lnbmF0dXJlPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLQ0KLSAgICA8Y29tcG9uZW50LWV4dGVuc2lvbj4NCi0gICAgICA8bWZwOmNvbXBvbmVudC1zdXBlcnR5cGU+amF2YXguZmFjZXMuQ29tcG9uZW50PC9tZnA6Y29tcG9uZW50LXN1cGVydHlwZT4NCi0NCi0gICAgICA8bWZwOmpzcC10YWctY2xhc3M+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkaW50ZXJuYWwudGFnbGliLlVJWENvbXBvbmVudFRhZzwvbWZwOmpzcC10YWctY2xhc3M+DQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZXZlbnQtdHlwZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuQXR0cmlidXRlQ2hhbmdlPC9tZnA6ZXZlbnQtdHlwZT4NCi0gICAgICAgIDxtZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPkludm9rZSBBcHBsaWNhdGlvbixBcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0gICAgPC9jb21wb25lbnQtZXh0ZW5zaW9uPg0KLQ0KLSAgPC9jb21wb25lbnQ+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL1Rlc3RJbmNsdWRlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9UZXN0SW5jbHVkZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NjQ5MGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9jb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL1Rlc3RJbmNsdWRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczphZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy90cmluaWRhZCINCi0gICAgICAgICAgICAgIHhtbG5zOnhpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hJbmNsdWRlIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWQ9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYmFsaS94bWwvbWV0YWRhdGEiDQotICAgICAgICAgICAgICB4bWxuczptZnA9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvbWF2ZW4tZmFjZXMtcGx1Z2luIiA+DQotDQotICA8Y29tcG9uZW50PiAgDQotICAgIDxwcm9wZXJ0eT4NCi0gICAgICA8cHJvcGVydHktbmFtZT5pbmNsdWRlZFByb3BlcnR5PC9wcm9wZXJ0eS1uYW1lPg0KLSAgICAgIDxwcm9wZXJ0eS1jbGFzcz5qYXZhLmxhbmcuU3RyaW5nPC9wcm9wZXJ0eS1jbGFzcz4NCi0gICAgICA8ZGVzY3JpcHRpb24+DQotICAgICAgICAgIGp1c3QgYSB0ZXN0Lg0KLSAgICAgIDwvZGVzY3JpcHRpb24+DQotICAgICAgPHByb3BlcnR5LWV4dGVuc2lvbj4NCi0gICAgICAgIDxtZDphdHRyaWJ1dGVNZXRhZGF0YT4NCi0gICAgICAgICAgPG1kOnByZWZlcnJlZD50cnVlPC9tZDpwcmVmZXJyZWQ+DQotICAgICAgICA8L21kOmF0dHJpYnV0ZU1ldGFkYXRhPg0KLSAgICAgIDwvcHJvcGVydHktZXh0ZW5zaW9uPg0KLSAgICA8L3Byb3BlcnR5Pg0KLSAgPC9jb21wb25lbnQ+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvamF2YXgvZmFjZXMvQWN0aW9uLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL2phdmF4L2ZhY2VzL0FjdGlvbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZTQwNTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvamF2YXgvZmFjZXMvQWN0aW9uLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0gIDxmYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLSAgICA8bWZwOmV2ZW50Pg0KLSAgICAgIDxtZnA6ZGVzY3JpcHRpb24+DQotICAgICAgICBFdmVudCBkZWxpdmVyZWQgd2hlbiB0aGUgImFjdGlvbiIgb2YgdGhlIGNvbXBvbmVudCBoYXMgYmVlbg0KLWludm9rZWQ7ICBmb3IgZXhhbXBsZSwgYnkgY2xpY2tpbmcgb24gYSBidXR0b24uICBUaGUgYWN0aW9uIG1heSByZXN1bHQNCi1pbiBwYWdlIG5hdmlnYXRpb24uDQotICAgICAgPC9tZnA6ZGVzY3JpcHRpb24+DQotICAgICAgPG1mcDpldmVudC10eXBlPmphdmF4LmZhY2VzLkFjdGlvbjwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgPG1mcDpldmVudC1jbGFzcz5qYXZheC5mYWNlcy5ldmVudC5BY3Rpb25FdmVudDwvbWZwOmV2ZW50LWNsYXNzPg0KLSAgICAgIDxtZnA6ZXZlbnQtbGlzdGVuZXItY2xhc3M+amF2YXguZmFjZXMuZXZlbnQuQWN0aW9uTGlzdGVuZXI8L21mcDpldmVudC1saXN0ZW5lci1jbGFzcz4NCi0gICAgICA8bWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+amF2YXguZmFjZXMuY29tcG9uZW50LkFjdGlvblNvdXJjZTwvbWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+DQotICAgICAgPG1mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+SW52b2tlIEFwcGxpY2F0aW9uLEFwcGx5IFJlcXVlc3QgVmFsdWVzPC9tZnA6ZXZlbnQtZGVsaXZlcnktcGhhc2VzPg0KLSAgICA8L21mcDpldmVudD4NCi0gIDwvZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9MYXVuY2gueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvTGF1bmNoLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhkYzFjNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2V2ZW50cy90cmluaWRhZC9mYWNlcy9MYXVuY2gueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiA/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSINCi0gICAgICAgICAgICAgIHhtbG5zOm1kPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2JhbGkveG1sL21ldGFkYXRhIg0KLSAgICAgICAgICAgICAgeG1sbnM6bWZwPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL21hdmVuLWZhY2VzLXBsdWdpbiIgPg0KLSAgPGZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotICAgICAgPG1mcDpldmVudD4NCi0gICAgICAgIDxtZnA6ZGVzY3JpcHRpb24+DQotICAgICAgICAgIEV2ZW50IGRlbGl2ZXJlZCB0byBwcm9tcHQgdGhlIGNvbW1hbmQgdG8gbGF1bmNoIGEgZGlhbG9nLg0KLSAgICAgICAgPC9tZnA6ZGVzY3JpcHRpb24+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLkxhdW5jaDwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5MYXVuY2hFdmVudDwvbWZwOmV2ZW50LWNsYXNzPg0KLSAgICAgICAgPG1mcDpldmVudC1saXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuTGF1bmNoTGlzdGVuZXI8L21mcDpldmVudC1saXN0ZW5lci1jbGFzcz4NCi0gICAgICAgIDxtZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LkRpYWxvZ1NvdXJjZTwvbWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5JbnZva2UgQXBwbGljYXRpb24sQXBwbHkgUmVxdWVzdCBWYWx1ZXM8L21mcDpldmVudC1kZWxpdmVyeS1waGFzZXM+DQotICAgICAgPC9tZnA6ZXZlbnQ+DQotICA8L2ZhY2VzLWNvbmZpZy1leHRlbnNpb24+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvUmV0dXJuLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL1JldHVybi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjMDM0N2MuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9ldmVudHMvdHJpbmlkYWQvZmFjZXMvUmV0dXJuLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08ZmFjZXMtY29uZmlnIHhtbG5zPSJodHRwOi8vamF2YS5zdW4uY29tL3htbC9ucy9qYXZhZWUiDQotICAgICAgICAgICAgICB4bWxuczptZD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9iYWxpL3htbC9tZXRhZGF0YSINCi0gICAgICAgICAgICAgIHhtbG5zOm1mcD0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9tYXZlbi1mYWNlcy1wbHVnaW4iID4NCi0gIDxmYWNlcy1jb25maWctZXh0ZW5zaW9uPg0KLSAgICAgIDxtZnA6ZXZlbnQ+DQotICAgICAgICA8bWZwOmRlc2NyaXB0aW9uPg0KLSAgICAgICAgICBFdmVudCBkZWxpdmVyZWQgd2hlbiB0aGUgZGlhbG9nIGhhcyBjb21wbGV0ZWQgc3VjY2Vzc2Z1bGx5Lg0KLSAgICAgICAgPC9tZnA6ZGVzY3JpcHRpb24+DQotICAgICAgICA8bWZwOmV2ZW50LXR5cGU+b3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLlJldHVybjwvbWZwOmV2ZW50LXR5cGU+DQotICAgICAgICA8bWZwOmV2ZW50LWNsYXNzPm9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZC5ldmVudC5SZXR1cm5FdmVudDwvbWZwOmV2ZW50LWNsYXNzPg0KLSAgICAgICAgPG1mcDpldmVudC1saXN0ZW5lci1jbGFzcz5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuZXZlbnQuUmV0dXJuTGlzdGVuZXI8L21mcDpldmVudC1saXN0ZW5lci1jbGFzcz4NCi0gICAgICAgIDxtZnA6ZXZlbnQtc291cmNlLWludGVyZmFjZT5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWQuY29tcG9uZW50LkRpYWxvZ1NvdXJjZTwvbWZwOmV2ZW50LXNvdXJjZS1pbnRlcmZhY2U+DQotICAgICAgICA8bWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz5BcHBseSBSZXF1ZXN0IFZhbHVlczwvbWZwOmV2ZW50LWRlbGl2ZXJ5LXBoYXNlcz4NCi0gICAgICA8L21mcDpldmVudD4NCi0gIDwvZmFjZXMtY29uZmlnLWV4dGVuc2lvbj4NCi08L2ZhY2VzLWNvbmZpZz4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyZWU0NTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJz8+DQotPCEtLQ0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQ0KLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbg0KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUNCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQ0KLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotDQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuDQotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQ0KLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucw0KLSAgICB1bmRlciB0aGUgTGljZW5zZS4NCi0JICAgDQotLS0+DQotPGZhY2VzLWNvbmZpZyB4bWxucz0iaHR0cDovL2phdmEuc3VuLmNvbS94bWwvbnMvamF2YWVlIiB4bWxuczp4aT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YSW5jbHVkZSI+DQotICA8eGk6aW5jbHVkZSBocmVmPSJjb21wb25lbnRzL3RyaW5pZGFkL2ZhY2VzL0NvbW1hbmQueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvamF2YXgvZmFjZXMvQWN0aW9uLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL3RyaW5pZGFkL2ZhY2VzL0xhdW5jaC54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy90cmluaWRhZC9mYWNlcy9SZXR1cm4ueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotPC9mYWNlcy1jb25maWc+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0R2VuZXJhdGUubHN0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0R2VuZXJhdGUubHN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MmVlNDU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdEdlbmVyYXRlLmxzdAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249JzEuMCc/Pg0KLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxmYWNlcy1jb25maWcgeG1sbnM9Imh0dHA6Ly9qYXZhLnN1bi5jb20veG1sL25zL2phdmFlZSIgeG1sbnM6eGk9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWEluY2x1ZGUiPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iY29tcG9uZW50cy90cmluaWRhZC9mYWNlcy9Db21tYW5kLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLSAgPHhpOmluY2x1ZGUgaHJlZj0iZXZlbnRzL2phdmF4L2ZhY2VzL0FjdGlvbi54bWwiIHhwb2ludGVyPSIvZmFjZXMtY29uZmlnLyoiPjwveGk6aW5jbHVkZT4NCi0gIDx4aTppbmNsdWRlIGhyZWY9ImV2ZW50cy90cmluaWRhZC9mYWNlcy9MYXVuY2gueG1sIiB4cG9pbnRlcj0iL2ZhY2VzLWNvbmZpZy8qIj48L3hpOmluY2x1ZGU+DQotICA8eGk6aW5jbHVkZSBocmVmPSJldmVudHMvdHJpbmlkYWQvZmFjZXMvUmV0dXJuLnhtbCIgeHBvaW50ZXI9Ii9mYWNlcy1jb25maWcvKiI+PC94aTppbmNsdWRlPg0KLTwvZmFjZXMtY29uZmlnPg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtZmFjZXMtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9NRVRBLUlORi9tYXZlbi1mYWNlcy1wbHVnaW4vdGVzdFNraXBBUEkubHN0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0U2tpcEFQSS5sc3QKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxYTUxYmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1mYWNlcy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL01FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi90ZXN0U2tpcEFQSS5sc3QKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1jb21wb25lbnRzL2phdmF4L2ZhY2VzL05hbWluZ0NvbnRhaW5lci54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY4ZTBmOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1pMThuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIGkxOG4gUGx1Z2luPC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVKYXZhc2NyaXB0TG9jYWxlc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vR2VuZXJhdGVKYXZhc2NyaXB0TG9jYWxlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRkODRiYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlSmF2YXNjcmlwdExvY2FsZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG47Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmkxOG4udWl4dG9vbHMuSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ubW9kZWwuUmVzb3VyY2U7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBnZW5lcmF0ZS1qYXZhc2NyaXB0LWxvY2FsZXMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZUphdmFzY3JpcHRMb2NhbGVzTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgLy8gYWRkIGdlbmVyYXRlZCBzb3VyY2VzIHRvIGNvbXBpbGF0aW9uIGNsYXNzcGF0aAotICAgICAgYWRkUmVzb3VyY2VSb290KHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICBGaWxlIG91dHB1dERpcmVjdG9yeSA9IG5ldyBGaWxlKHRhcmdldERpcmVjdG9yeSwgdGFyZ2V0UGF0aCk7Ci0KLSAgICAgIC8vIEluY3JlbWVudGFsIGNoZWNrCi0gICAgICBib29sZWFuIHVwdG9kYXRlID0gZmFsc2U7Ci0KLSAgICAgIC8vIFRPRE86IGRldGVybWluZSBob3cgYmVzdCB0byBjaGVjayBmb3IgaW5jcmVtZW50YWwKLS8vICAgICAgaWYgKCFmb3JjZSkKLS8vICAgICAgewotLy8gICAgICAgIFN0cmluZ1tdIGxvY2FsZVN0cmluZ3MgPSBnZXRMb2NhbGVTdHJpbmdzKCk7Ci0vLyAgICAgICAgU3RyaW5nIGJ1bmRsZVBhdGggPSBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLl9ERUZBVUxUX0JVTkRMRV9MT0NBVElPTl9QQVRIOwotLy8gICAgICAgIGZvciAoaW50IGk9MDsgaSA8IGxvY2FsZVN0cmluZ3MubGVuZ3RoOyBpKyspCi0vLyAgICAgICAgewotLy8gICAgICAgICAgU3RyaW5nIHBhdGggPSBidW5kbGVQYXRoICsgIkxvY2FsZUVsZW1lbnRzIiArCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIGxvY2FsZVN0cmluZ3NbaV0gKyAiLmphdmEiOwotLy8gICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCBwYXRoKTsKLS8vICAgICAgICAgIGlmICghdGFyZ2V0RmlsZS5leGlzdHMoKSkKLS8vICAgICAgICAgIHsKLS8vICAgICAgICAgICAgdXB0b2RhdGUgPSBmYWxzZTsKLS8vICAgICAgICAgICAgYnJlYWs7Ci0vLyAgICAgICAgICB9Ci0vLyAgICAgICAgfQotLy8gICAgICB9Ci0KLSAgICAgIGlmIChmb3JjZSB8fCAhdXB0b2RhdGUpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgSmF2YXNjcmlwdCBMb2NhbGVzIik7Ci0KLSAgICAgICAgTGlzdCBhcmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBhcmdzTGlzdC5hZGQoIm91dERpcj0iICsgb3V0cHV0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgid3JpdGVKYXZhc2NyaXB0PXRydWUiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ3cml0ZVNvdXJjZT1mYWxzZSIpOwotICAgICAgICBhcmdzTGlzdC5hZGQoInZlcmJvc2U9ZmFsc2UiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJwcmV0dHlQcmludD10cnVlIik7Ci0KLSAgICAgICAgU3RyaW5nW10gYXJncyA9IChTdHJpbmdbXSlhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbMF0pOwotICAgICAgICBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLm1haW4oYXJncyk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBKYXZhc2NyaXB0IExvY2FsZXMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETzogdXNlIHByb2plY3QuYWRkUmVzb3VyY2VSb290KCkKLSAgcHJvdGVjdGVkIHZvaWQgYWRkUmVzb3VyY2VSb290KAotICAgIFN0cmluZyByZXNvdXJjZVJvb3QpCi0gIHsKLSAgICBMaXN0IHJlc291cmNlcyA9IHByb2plY3QuZ2V0QnVpbGQoKS5nZXRSZXNvdXJjZXMoKTsKLSAgICBSZXNvdXJjZSByZXNvdXJjZSA9IG5ldyBSZXNvdXJjZSgpOwotICAgIHJlc291cmNlLnNldERpcmVjdG9yeShyZXNvdXJjZVJvb3QpOwotICAgIHJlc291cmNlcy5hZGQocmVzb3VyY2UpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRMb2NhbGVTdHJpbmdzKCkKLSAgewotICAgIGlmICgiZW5fVVMiLmVxdWFscyhsb2NhbGUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiIiB9OwotICAgIH0KLQotICAgIExvY2FsZVtdIGxvY2FsZXMgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgIFN0cmluZ1tdIGxvY2FsZVN0cmluZ3MgPSBuZXcgU3RyaW5nW2xvY2FsZXMubGVuZ3RoXTsKLQotICAgIGZvciAoaW50IGk9MDsgaSA8IGxvY2FsZVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbG9jYWxlU3RyaW5nc1tpXSA9IGxvY2FsZXNbaV0uZ2V0RGlzcGxheU5hbWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9jYWxlU3RyaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4taTE4bi1wbHVnaW4vbWFpbi9qYXZhc2NyaXB0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFBhdGggPSAiIjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgbG9jYWxlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlTG9jYWxlRWxlbWVudHNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL0dlbmVyYXRlTG9jYWxlRWxlbWVudHNNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlZDU4YmEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi9HZW5lcmF0ZUxvY2FsZUVsZW1lbnRzTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTG9jYWxlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuLnVpeHRvb2xzLkpTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBnb2FsIGdlbmVyYXRlLWxvY2FsZS1lbGVtZW50cwotICogQHBoYXNlIGdlbmVyYXRlLXNvdXJjZXMKLSAqLwotcHVibGljIGNsYXNzIEdlbmVyYXRlTG9jYWxlRWxlbWVudHNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICAvLyBhZGQgZ2VuZXJhdGVkIHNvdXJjZXMgdG8gY29tcGlsYXRpb24gY2xhc3NwYXRoCi0gICAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KHRhcmdldERpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCkpOwotCi0gICAgICAvLyBJbmNyZW1lbnRhbCBjaGVjawotICAgICAgYm9vbGVhbiB1cHRvZGF0ZSA9IHRydWU7Ci0KLSAgICAgIGlmICghZm9yY2UpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGxvY2FsZVN0cmluZ3MgPSBnZXRMb2NhbGVTdHJpbmdzKCk7Ci0gICAgICAgIFN0cmluZyBidW5kbGVQYXRoID0gSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5fREVGQVVMVF9CVU5ETEVfTE9DQVRJT05fUEFUSDsKLSAgICAgICAgZm9yIChpbnQgaT0wOyBpIDwgbG9jYWxlU3RyaW5ncy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBwYXRoID0gYnVuZGxlUGF0aCArICJMb2NhbGVFbGVtZW50cyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgbG9jYWxlU3RyaW5nc1tpXSArICIuamF2YSI7Ci0gICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCBwYXRoKTsKLSAgICAgICAgICBpZiAoIXRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgdXB0b2RhdGUgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZm9yY2UgfHwgIXVwdG9kYXRlKQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIExvY2FsZUVsZW1lbnRzIik7Ci0KLSAgICAgICAgTGlzdCBhcmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgICAgICBhcmdzTGlzdC5hZGQoInNvdXJjZURpcj0iICsgdGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgiYnVuZGxlT3V0RGlyPSIgKyB0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ3cml0ZUphdmFzY3JpcHQ9ZmFsc2UiKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ3cml0ZVNvdXJjZT10cnVlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgiZ2VuZXJhdGVCdW5kbGVCYXNlT25seT0iICsgKCJlbl9VUyIuZXF1YWxzKGxvY2FsZSkpKTsKLSAgICAgICAgYXJnc0xpc3QuYWRkKCJ2ZXJib3NlPWZhbHNlIik7Ci0gICAgICAgIGFyZ3NMaXN0LmFkZCgicHJldHR5UHJpbnQ9dHJ1ZSIpOwotCi0gICAgICAgIFN0cmluZ1tdIGFyZ3MgPSAoU3RyaW5nW10pYXJnc0xpc3QudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvci5tYWluKGFyZ3MpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gTG9jYWxlRWxlbWVudHMgYXJlIHVwIHRvIGRhdGUiKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZXRMb2NhbGVTdHJpbmdzKCkKLSAgewotICAgIGlmICgiZW5fVVMiLmVxdWFscyhsb2NhbGUpKQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nW10geyAiIiB9OwotICAgIH0KLQotICAgIExvY2FsZVtdIGxvY2FsZXMgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgIFN0cmluZ1tdIGxvY2FsZVN0cmluZ3MgPSBuZXcgU3RyaW5nW2xvY2FsZXMubGVuZ3RoXTsKLQotICAgIGZvciAoaW50IGk9MDsgaSA8IGxvY2FsZVN0cmluZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgbG9jYWxlU3RyaW5nc1tpXSA9IGxvY2FsZXNbaV0uZ2V0RGlzcGxheU5hbWUoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbG9jYWxlU3RyaW5nczsKLSAgfQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4taTE4bi1wbHVnaW4vbWFpbi9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIGxvY2FsZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9KU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL0pTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2RkNWRlZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9pMThuL3VpeHRvb2xzL0pTTG9jYWxlRWxlbWVudHNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkwNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uaTE4bi51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXQ7Ci1pbXBvcnQgamF2YS50ZXh0LkRlY2ltYWxGb3JtYXRTeW1ib2xzOwotaW1wb3J0IGphdmEudGV4dC5OdW1iZXJGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1pc3NpbmdSZXNvdXJjZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuUmVzb3VyY2VCdW5kbGU7Ci0KLS8qKgotICogR2VuZXJhdGVzIEphdmFTY3JpcHQgbGlicmFyaWVzIGNvbnRhaW5pbmcgdGhlIExvY2FsZSBpbmZvcm1hdGlvbiBmcm9tCi0gKiBKYXZhLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb246IDEuMyAkKSAkRGF0ZTogMjAwNC8wMy8yNSAyMjozNjo0MiAkCi0gKi8KLXB1YmxpYyBjbGFzcyBKU0xvY2FsZUVsZW1lbnRzR2VuZXJhdG9yCi17Ci0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKAotICAgIFN0cmluZ1tdIGFyZ3MKLSAgICApCi0gIHsKLQotICAgIGlmICgoYXJncy5sZW5ndGggPT0gMSkgJiYgKCI/Ii5lcXVhbHMoYXJnc1swXSkpKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiR2VuZXJhdGVzIEphdmFTY3JpcHQgTG9jYWxlIGluZm9ybWF0aW9uIGZpbGVzIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oImZvciB0aGUgTG9jYWxlcyBhdmFpbGFibGUgaW4gdGhlIEpWTS4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVGhlc2UgZmlsZXMgYXJlIHVzZWQgYnkgdGhlIENhYm8gSFRNTCBjbGllbnQiKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigibG9naWMgdG8gaGFuZGxlIGRhdGUgZm9ybWF0dGluZyBhbmQgdmFsaWRhdGlvbi4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJQYXJhbWV0ZXJzOiIpOwotICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJcdHByZXR0eVByaW50PWZhbHNlXHRUdXJucyBvZmYgcHJldHR5IHByaW50ZWQgb3V0cHV0Iik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0b3V0RGlyPVtwYXRoXVx0XHREaXJlY3RvcnkgcGF0aCB0byB3cml0ZSBKYXZhU2NyaXB0IGZpbGVzIHRvIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0c291cmNlRGlyPVtwYXRoXVx0XHRSb290IGRpcmVjdG9yeSBwYXRoIHRvIHdyaXRlIEphdmEgc291cmNlIHRvIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oCi0gICAgICAgICAgIlx0YnVuZGxlT3V0RGlyPVtwYXRoXVx0XHRSb290IGRpcmVjdG9yeSBwYXRoIHRvIHdyaXRlICIgKwotICAgICAgICAgICJKYXZhIFJlc291cmNlQnVuZGxlcyB0byAoZGVmYXVsdHMgdG8gc291cmNlRGlyKS4iKTsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigKLSAgICAgICAgICAiXHR2YXJpYW50PVt2YXJpYW50IG5hbWVdXHRcdElmIHN1cHBsaWVkIHV0aWxpdHkgd2lsbCBnZW5lcmF0ZSAiICsKLSAgICAgICAgICAiUmVzb3VyY2VCdW5kbGVzIGZvciB0aGlzIHZhcmlhbnQsIGFuZCBub3RoaW5nIGVsc2UuIik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0dmVyYm9zZT10cnVlXHRcdFR1cm5zIG9uIHZlcmJvc2Ugb3V0cHV0Iik7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIlx0Z2VuZXJhdGVCdW5kbGVCYXNlT25seT10cnVlXHRcdEdlbmVyYXRlcyB0aGUgYmFzZSBMb2NhbGVFbGVtZW50LmphdmEgZmlsZSBvbmx5Iik7Ci0gICAgICBTeXN0ZW0uZXhpdCgwKTsKLSAgICB9Ci0KLSAgICAvLyB3aGV0aGVyIHRoZSBvdXRwdXQgc2hvdWxkIGJlIHByZXR0eSBwcmludGVkIGZvciBsZWdpYmlsaXR5Ci0gICAgYm9vbGVhbiBwcmV0dHlQcmludCA9IGdldEFyZ0Jvb2xlYW5WYWx1ZShhcmdzLCAicHJldHR5UHJpbnQiLCB0cnVlKTsKLQotICAgIC8vIHdoZXRoZXIgdmVyYm9zZSBvdXB1dCBzaG91bGQgYmUgZ2VuZXJhdGVkLgotICAgIGJvb2xlYW4gdmVyYm9zZSA9IGdldEFyZ0Jvb2xlYW5WYWx1ZShhcmdzLCAidmVyYm9zZSIsIGZhbHNlKTsKLQotICAgIGJvb2xlYW4gd3JpdGVTb3VyY2UgPSBnZXRBcmdCb29sZWFuVmFsdWUoYXJncywgIndyaXRlU291cmNlIiwgdHJ1ZSk7Ci0gICAgYm9vbGVhbiB3cml0ZUphdmFzY3JpcHQgPSBnZXRBcmdCb29sZWFuVmFsdWUoYXJncywgIndyaXRlSmF2YXNjcmlwdCIsIHRydWUpOwotCi0gICAgLy8gd2hldGhlciBvbmx5IHRoZSBCYXNlIExvY2FsZUVsZW1lbnRzLmphdmEgZmlsZSBzaG91bGQgYmUgY3JlYXRlZC4KLSAgICAvLyB0aGlzIGlzIGJhc2VkIG9uIHRoZSBMb2NhbGUuVVMKLSAgICBib29sZWFuIGdlbmVyYXRlQnVuZGxlQmFzZU9ubHkgPSBnZXRBcmdCb29sZWFuVmFsdWUoYXJncywiZ2VuZXJhdGVCdW5kbGVCYXNlT25seSIsZmFsc2UpOwotCi0gICAgLy8gdGhlIG91dHB1dCBkaXJlY3RvcnkKLSAgICBTdHJpbmcgb3V0RGlyID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgIm91dERpciIsIG51bGwpOwotCi0gICAgaWYgKG91dERpciA9PSBudWxsKQotICAgIHsKLSAgICAgIG91dERpciA9IFN5c3RlbS5nZXRQcm9wZXJ0eSgidXNlci5kaXIiKSArCi0gICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvciArCi0gICAgICAgICAgICAgICBfREVGQVVMVF9MT0NBVElPTl9QQVRIOwotICAgIH0KLQotICAgIGlmICghb3V0RGlyLmVuZHNXaXRoKEZpbGUuc2VwYXJhdG9yKSkKLSAgICB7Ci0gICAgICBvdXREaXIgPSBvdXREaXIgKyBGaWxlLnNlcGFyYXRvcjsKLSAgICB9Ci0KLQotICAgIC8vIHRoZSByZXF1ZXN0ZWQgdmFyaWFudAotICAgIFN0cmluZyB2YXJpYW50ID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgInZhcmlhbnQiLCBudWxsKTsKLSAgICBib29sZWFuIHdyaXRlQWxsID0gdHJ1ZTsKLSAgICBpZiAodmFyaWFudCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdyaXRlQWxsID0gZmFsc2U7Ci0gICAgICB2YXJpYW50ID0gdmFyaWFudC50b1VwcGVyQ2FzZSgpOwotICAgIH0KLQotICAgIC8vIHRoZSBzb3VyY2UgZGlyZWN0b3J5Ci0gICAgU3RyaW5nIHNvdXJjZURpciA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsICJzb3VyY2VEaXIiLCBudWxsKTsKLQotICAgIGlmIChzb3VyY2VEaXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBzb3VyY2VEaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInVzZXIuZGlyIik7Ci0gICAgfQotCi0gICAgU3RyaW5nIGJ1bmRsZU91dERpciA9IGdldEFyZ1N0cmluZ1ZhbHVlKGFyZ3MsICJidW5kbGVPdXREaXIiLCBudWxsKTsKLQotICAgIGlmIChidW5kbGVPdXREaXIgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBidW5kbGVPdXREaXIgPSBzb3VyY2VEaXI7Ci0gICAgfQotCi0gICAgLy8gVGhlIGJ1bmRsZSBvdXRwdXQgZGlyIGlzIHRoZSBiYXNlIG9mIHRoZSBoZWlyYXJjaHksIHdlJ2xsIGFjdHVhbGx5IHB1dAotICAgIC8vIHRoZSBmaWxlcyBpbnRvIHRoZSBhcHByb3ByaWF0ZSBzdWIgZGlyZWN0b3J5IGZvciB0aGUgcGFja2FnZS4KLSAgICBTdHJpbmcgZnVsbEJ1bmRsZU91dERpciA9IChidW5kbGVPdXREaXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIChidW5kbGVPdXREaXIuZW5kc1dpdGgoRmlsZS5zZXBhcmF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAiIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRmlsZS5zZXBhcmF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICArIF9ERUZBVUxUX0JVTkRMRV9MT0NBVElPTl9QQVRIKTsKLQotICAgIFN0cmluZyB2ZXJzaW9uID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgInZlcnNpb24iLCBudWxsKTsKLSAgICB2ZXJzaW9uID0gVmVyc2lvblV0aWxzLm5vcm1hbGl6ZVZlcnNpb25TdWZmaXgodmVyc2lvbik7Ci0KLSAgICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgZmlsZXMgdG86ICIgKyBvdXREaXIpOwotICAgICAgaWYgKHdyaXRlQWxsKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgc291cmNlIHRvOiAiICsgc291cmNlRGlyKTsKLSAgICAgIH0KLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiV3JpdGluZyBidW5kbGVzIHRvOiAiICsgZnVsbEJ1bmRsZU91dERpcik7Ci0gICAgfQotCi0gICAgdHJ5Ci0gICAgewotICAgICAgRmlsZSBsb2NhbGVMaXN0RmlsZSA9IG51bGw7Ci0KLSAgICAgIGlmICh3cml0ZVNvdXJjZSkKLSAgICAgIHsKLSAgICAgICAgKG5ldyBGaWxlKGZ1bGxCdW5kbGVPdXREaXIpKS5ta2RpcnMoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHdyaXRlSmF2YXNjcmlwdCkKLSAgICAgIHsKLSAgICAgICAgKG5ldyBGaWxlKG91dERpcikpLm1rZGlycygpOwotICAgICAgfQotCi0gICAgICBpZiAod3JpdGVBbGwgJiYgd3JpdGVTb3VyY2UgJiYgIWdlbmVyYXRlQnVuZGxlQmFzZU9ubHkpCi0gICAgICB7Ci0gICAgICAgIGxvY2FsZUxpc3RGaWxlID0gbmV3IEZpbGUoc291cmNlRGlyLCBfTE9DQUxFX0xJU1RfUEFUSCk7Ci0gICAgICAgIGxvY2FsZUxpc3RGaWxlLmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgbG9jYWxlTGlzdEZpbGUuY3JlYXRlTmV3RmlsZSgpOwotICAgICAgfQotCi0gICAgICBMb2NhbGVbXSBsb2NhbGVzID0gbnVsbDsKLQotICAgICAgaWYgKGdlbmVyYXRlQnVuZGxlQmFzZU9ubHkpCi0gICAgICB7Ci0gICAgICAgICBsb2NhbGVzID0gbmV3IExvY2FsZVsxXTsKLSAgICAgICAgIGxvY2FsZXNbMF0gPSBMb2NhbGUuVVM7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIGxvY2FsZXMgPSBMb2NhbGUuZ2V0QXZhaWxhYmxlTG9jYWxlcygpOwotICAgICAgfQotCi0gICAgICAvLwotICAgICAgLy8gbG9vcCB0aHJvdWdoIHRoZSBhdmFpbGFibGUgTG9jYWxlcywgd3JpdGluZyB0aGVpciBjb250ZW50cyBvdXQKLSAgICAgIC8vIGFzIEphdmFTY3JpcHQgbGlicmFyaWVzIGFuZC9vciBSZXNvdXJjZUJ1bmRsZXMKLSAgICAgIC8vCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGxvY2FsZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIC8vIHdyaXRlIHRoZSBKYXZhU0NyaXB0IGxpYnJhcnkgZm9yIHRoaXMgbG9jYWxlCi0gICAgICAgIF9nZW5lcmF0ZUpTTG9jYWxlRWxlbWVudHMob3V0RGlyLCBmdWxsQnVuZGxlT3V0RGlyLCBsb2NhbGVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhcmlhbnQsIHByZXR0eVByaW50LCB2ZXJib3NlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdyaXRlSmF2YXNjcmlwdCwgd3JpdGVTb3VyY2UsIGdlbmVyYXRlQnVuZGxlQmFzZU9ubHksIHZlcnNpb24pOwotICAgICAgfQotCi0gICAgICAvLyBBbmQgd3JpdGUgb3V0IGEgbGlzdGluZyBvZiBhbGwgdGhlIGxvY2FsZXMsIGJ1dCAgbm90IHdoZW4gd2Ugd2FudCB0bwotICAgICAgLy8ganVzdCBnZW5lcmF0ZSB0aGUgYmFzZSBSZXNvdXJjZSBmaWxlLgotICAgICAgaWYgKHdyaXRlQWxsICYmIHdyaXRlU291cmNlICYmICFnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5KQotICAgICAgewotICAgICAgICBXcml0ZXIgc291cmNlV3JpdGVyID0gbmV3IEZpbGVXcml0ZXIobG9jYWxlTGlzdEZpbGUpOwotICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoX0xPQ0FMRV9MSVNUX0NPREVfU1RBUlQpOwotCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbG9jYWxlcy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIHNvdXJjZVdyaXRlci53cml0ZSgiICAgIG5ldyBMb2NhbGUoXCIiKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUobG9jYWxlc1tpXS5nZXRMYW5ndWFnZSgpKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoIlwiLFwiIik7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKGxvY2FsZXNbaV0uZ2V0Q291bnRyeSgpKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoIlwiLFwiIik7Ci0gICAgICAgICAgc291cmNlV3JpdGVyLndyaXRlKGxvY2FsZXNbaV0uZ2V0VmFyaWFudCgpKTsKLSAgICAgICAgICBzb3VyY2VXcml0ZXIud3JpdGUoIlwiKSxcbiIpOwotICAgICAgICB9Ci0gICAgICAgIHNvdXJjZVdyaXRlci53cml0ZShfTE9DQUxFX0xJU1RfQ09ERV9FTkQpOwotICAgICAgICBzb3VyY2VXcml0ZXIuY2xvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgU3lzdGVtLmVyci5wcmludGxuKGUpOwotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICB9Ci0KLSAgICBpZiAodmVyYm9zZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkRvbmUgd3JpdGluZyBmaWxlcyIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRBcmdTdHJpbmdWYWx1ZSgKLSAgICBTdHJpbmdbXSBhcmdzLAotICAgIFN0cmluZyAgIGFyZ05hbWUsCi0gICAgU3RyaW5nICAgZGVmYXVsdFZhbHVlCi0gICAgKQotICB7Ci0gICAgaW50IGFyZ0xlbmd0aCA9IGFyZ05hbWUubGVuZ3RoKCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgU3RyaW5nIGN1cnJBcmcgPSBhcmdzW2ldOwotCi0gICAgICBpZiAoY3VyckFyZy5zdGFydHNXaXRoKGFyZ05hbWUpKQotICAgICAgewotICAgICAgICBpZiAoIWN1cnJBcmcuZXF1YWxzKGFyZ05hbWUpICYmCi0gICAgICAgICAgICAoJz0nID09IGN1cnJBcmcuY2hhckF0KGFyZ0xlbmd0aCkpKQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dXJuIGN1cnJBcmcuc3Vic3RyaW5nKGFyZ0xlbmd0aCArIDEpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gZ2V0QXJnQm9vbGVhblZhbHVlKAotICAgIFN0cmluZ1tdIGFyZ3MsCi0gICAgU3RyaW5nICAgYXJnTmFtZSwKLSAgICBib29sZWFuICBkZWZhdWx0VmFsdWUKLSAgICApCi0gIHsKLSAgICAvLwotICAgIC8vIGNoZWNrIGZvciA9IHRydWUgb3IgPSBmYWxzZQotICAgIC8vCi0gICAgU3RyaW5nIGFyZ1ZhbHVlID0gZ2V0QXJnU3RyaW5nVmFsdWUoYXJncywgYXJnTmFtZSwgbnVsbCk7Ci0KLSAgICBpZiAoYXJnVmFsdWUgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBjaGVjayBmb3IgPSBzZWxmCi0gICAgICBpZiAoYXJnTmFtZS5lcXVhbHMoYXJnVmFsdWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIEJvb2xlYW4udmFsdWVPZihhcmdWYWx1ZSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBjaGVjayBmb3IgdGhlIG5hbWUgYnkgaXRzZWxmCi0gICAgLy8KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKGFyZ05hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLwotICAgIC8vIGNoZWNrIGZvciB0aGUgbmFtZSB0dXJuZWQgb2ZmCi0gICAgLy8KLSAgICBTdHJpbmcgbm90TmFtZSA9ICItIiArIGFyZ05hbWU7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3MubGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgaWYgKGFyZ3NbaV0uZXF1YWxzKG5vdE5hbWUpKQotICAgICAgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX2dlbmVyYXRlSlNMb2NhbGVFbGVtZW50cygKLSAgICBTdHJpbmcgIG91dERpciwKLSAgICBTdHJpbmcgIGJ1bmRsZU91dERpciwKLSAgICBMb2NhbGUgIHRhcmdldExvY2FsZSwKLSAgICBTdHJpbmcgIHZhcmlhbnQsCi0gICAgYm9vbGVhbiBwcmV0dHlQcmludCwKLSAgICBib29sZWFuIHZlcmJvc2UsCi0gICAgYm9vbGVhbiB3cml0ZUphdmFzY3JpcHQsCi0gICAgYm9vbGVhbiB3cml0ZVNvdXJjZSwKLSAgICBib29sZWFuIGdlbmVyYXRlQnVuZGxlQmFzZU9ubHksCi0gICAgU3RyaW5nIHZlcnNpb24KLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGZpbGVOYW1lOwotICAgIFByaW50V3JpdGVyIGxvY2FsZVdyaXRlcjsKLQotICAgIGlmICh2YXJpYW50ID09IG51bGwgJiYgd3JpdGVKYXZhc2NyaXB0KQotICAgIHsKLSAgICAgIGZpbGVOYW1lID0gX2dldEZpbGVOYW1lKHRhcmdldExvY2FsZSwgdmVyc2lvbiwgZ2VuZXJhdGVCdW5kbGVCYXNlT25seSkgKyBfSkFWQVNDUklQVF9FWFRFTlNJT047Ci0KLSAgICAgIGlmICh2ZXJib3NlKQotICAgICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIldyaXRpbmcgIiArIGZpbGVOYW1lKTsKLSAgICAgIH0KLQotICAgICAgLy8gY3JlYXRlIHRoZSBmaWxlIHRvIHdyaXRlIHRvCi0gICAgICBsb2NhbGVXcml0ZXIgPSBuZXcgUHJpbnRXcml0ZXIKLSAgICAgICAgKG5ldyBCdWZmZXJlZFdyaXRlcihuZXcgRmlsZVdyaXRlcihvdXREaXIgKyBmaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RFRkFVTFRfQlVGRkVSX1NJWkUpKTsKLSAgICAgIF93cml0ZUxvY2FsZShsb2NhbGVXcml0ZXIsIHRhcmdldExvY2FsZSwgcHJldHR5UHJpbnQpOwotICAgICAgbG9jYWxlV3JpdGVyLmNsb3NlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfd3JpdGVKYXZhQnVuZGxlKAotICAgIFdyaXRlciAgICAgIG91dHB1dCwKLSAgICBMb2NhbGUgICAgICB0YXJnZXRMb2NhbGUsCi0gICAgU3RyaW5nICAgICAgZmlsZU5hbWUKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0cHV0LndyaXRlKF9MT0NBTEVfSkFWQV9DT0RFX1NUQVJUKTsKLSAgICBvdXRwdXQud3JpdGUoInB1YmxpYyBjbGFzcyAiCi0gICAgICAgICAgICAgICAgICsgZmlsZU5hbWUKLSAgICAgICAgICAgICAgICAgKyAiIGV4dGVuZHMgTGlzdFJlc291cmNlQnVuZGxlXG57XG4iCi0gICAgICAgICAgICAgICAgICsgIiAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKVxuICB7XG4iCi0gICAgICAgICAgICAgICAgICsgIiAgICByZXR1cm4gY29udGVudHM7XG4gIH1cblxuIik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VCdW5kbGUgZWxlbWVudHNEYXRhID0KLSAgICAgICAgUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKF9MT0NBTEVfRUxFTUVOVFNfUEFUSCwgdGFyZ2V0TG9jYWxlKTsKLQotICAgICAgYm9vbGVhbiBkb25lT25lID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTLmxlbmd0aDsgaSArKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJLZXkgPSBMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVNbaV07Ci0KLSAgICAgICAgT2JqZWN0IGRhdGEgPSBfZ2V0RWxlbWVudERhdGEoY3VycktleSwgZWxlbWVudHNEYXRhLCB0YXJnZXRMb2NhbGUpOwotICAgICAgICBfd3JpdGVKYXZhQnVuZGxlRWxlbWVudChvdXRwdXQsIGN1cnJLZXksIGRhdGEsIGRvbmVPbmUpOwotICAgICAgICBkb25lT25lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGRvbmVPbmUgPSBmYWxzZTsKLSAgICAgIG91dHB1dC53cml0ZSgiICBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IFxuICB7XG4iKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTE9DQUxFX0VMRU1FTlRTX0dFVF9LRVlTLmxlbmd0aDsgaSArKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGN1cnJLZXkgPSBMT0NBTEVfRUxFTUVOVFNfR0VUX0tFWVNbaV07Ci0gICAgICAgIG91dHB1dC53cml0ZSgoZG9uZU9uZSA/ICIsXG4iIDogIiIpCi0gICAgICAgICAgICAgICAgICAgICArICIgICAgeyBcIiIKLSAgICAgICAgICAgICAgICAgICAgICsgY3VycktleQotICAgICAgICAgICAgICAgICAgICAgKyAiXCIsICIKLSAgICAgICAgICAgICAgICAgICAgICsgX2dldEtleUFycmF5TmFtZShjdXJyS2V5KQotICAgICAgICAgICAgICAgICAgICAgKyAifSIpOwotICAgICAgICBkb25lT25lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIG91dHB1dC53cml0ZSgiXG4gIH07Iik7Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBtYWtlIHN1cmUgdGhhdCB0aGUgY2xhc3Mgd2lsbCwgYXQgbGVhc3QsIGNvbXBpbGUgZXZlbiBpZiBpbmNvbXBsZXRlLgotICAgICAgb3V0cHV0LndyaXRlKCIgIC8vIEJ1bmRsZSBnZW5lcmF0aW9uIGVycm9yOlxuICAvLyAiICsgZSk7Ci0gICAgICBvdXRwdXQud3JpdGUoIlxuICBzdGF0aWMgZmluYWwgT2JqZWN0W11bXSBjb250ZW50cyA9IG51bGw7Iik7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgfQotICAgIG91dHB1dC53cml0ZSgiXG59XG4iKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgX3dyaXRlTG9jYWxlKAotICAgIFdyaXRlciAgICAgIG91dHB1dCwKLSAgICBMb2NhbGUgICAgICB0YXJnZXRMb2NhbGUsCi0gICAgYm9vbGVhbiAgICAgcHJldHR5UHJpbnQKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBvdXRwdXQud3JpdGUoInZhciBMb2NhbGVTeW1ib2xzXyIpOwotICAgIG91dHB1dC53cml0ZSh0YXJnZXRMb2NhbGUudG9TdHJpbmcoKSk7Ci0gICAgb3V0cHV0LndyaXRlKCIgPSBuZXcgTG9jYWxlU3ltYm9scyh7Iik7Ci0KLSAgICBpZiAocHJldHR5UHJpbnQpCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCdcbicpOwotICAgIH0KLQotICAgIEVudW1lcmF0aW9uIHpvbmVFbnVtZXJhdGlvbiA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEFycmF5RW51bWVyYXRpb24oREFURV9GT1JNQVRfWk9ORV9HRVRfS0VZUyk7Ci0KLSAgICAvLyB3cml0ZSB0aGUgbG9jYWxlIGVsZW1lbnRzIGludG8gdGhlIGZpbGUKLSAgICBfd3JpdGVSZXNvdXJjZUNvbnRlbnRzKG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIF9MT0NBTEVfRUxFTUVOVFNfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUVudW1lcmF0aW9uKExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZUyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRMb2NhbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB6b25lRW51bWVyYXRpb24uaGFzTW9yZUVsZW1lbnRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludCk7Ci0KLSAgICAvLyB3cml0ZSB0aGUgZGF0ZSBmb3JtYXQgZWxlbWVudHMgaW50byB0aGUgZmlsZQotICAgIF93cml0ZVJlc291cmNlQ29udGVudHMob3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgX0RBVEVfRk9STUFUX1pPTkVfUEFUSCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHpvbmVFbnVtZXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExvY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLCAgLy8gdGhpcyBpcyB0aGUgbGFzdCByZXNvdXJjZSB0byB3cml0ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldHR5UHJpbnQpOwotCi0gICAgb3V0cHV0LndyaXRlKCJ9KTsiKTsKLQotICAgIGlmIChwcmV0dHlQcmludCkKLSAgICB7Ci0gICAgICBvdXRwdXQud3JpdGUoJ1xuJyk7Ci0gICAgfQotICB9Ci0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIF93cml0ZVJlc291cmNlQ29udGVudHMoCi0gICAgV3JpdGVyICAgICAgb3V0cHV0LAotICAgIFN0cmluZyAgICAgIGJhc2VOYW1lLAotICAgIEVudW1lcmF0aW9uIGtleXMsCi0gICAgTG9jYWxlICAgICAgdGFyZ2V0TG9jYWxlLAotICAgIGJvb2xlYW4gICAgIGhhc01vcmVSZXNvdXJjZXMsCi0gICAgYm9vbGVhbiAgICAgcHJldHR5UHJpbnQKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2VCdW5kbGUgZWxlbWVudHNEYXRhID0gUmVzb3VyY2VCdW5kbGUuZ2V0QnVuZGxlKGJhc2VOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldExvY2FsZSk7Ci0KLSAgICAgIHdoaWxlKGtleXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJyS2V5ID0gKFN0cmluZylrZXlzLm5leHRFbGVtZW50KCk7Ci0KLSAgICAgICAgT2JqZWN0IGRhdGEgPSBudWxsOwotCi0gICAgICAgIGlmKCJDdXJyZW5jeUVsZW1lbnRzIi5lcXVhbHMoY3VycktleSkpCi0gICAgICAgIHsKLSAgICAgICAgICBkYXRhID0gX2dldEN1cnJlbmN5RGF0YSh0YXJnZXRMb2NhbGUpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGRhdGEgPSBfZ2V0RWxlbWVudERhdGEoY3VycktleSwgZWxlbWVudHNEYXRhLCB0YXJnZXRMb2NhbGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbGVhbiB3cm90ZUVsZW1lbnQgPSBfd3JpdGVSZXNvdXJjZUVsZW1lbnQoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc01vcmVSZXNvdXJjZXMgfHwga2V5cy5oYXNNb3JlRWxlbWVudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZXR0eVByaW50KTsKLQotICAgICAgICBpZiAod3JvdGVFbGVtZW50ICYmIHByZXR0eVByaW50KQotICAgICAgICB7Ci0gICAgICAgICAgb3V0cHV0LndyaXRlKCdcbicpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChNaXNzaW5nUmVzb3VyY2VFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0uZXJyLnByaW50bG4oZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IF9nZXRDdXJyZW5jeURhdGEoCi0gICAgTG9jYWxlIHRhcmdldExvY2FsZSkKLSAgewotICAgIERlY2ltYWxGb3JtYXQgZGYgPSAoRGVjaW1hbEZvcm1hdCkgTnVtYmVyRm9ybWF0LmdldEN1cnJlbmN5SW5zdGFuY2UodGFyZ2V0TG9jYWxlKTsKLSAgICBEZWNpbWFsRm9ybWF0U3ltYm9scyBkZWNpbWFsRm9ybWF0U3ltYm9scyA9IGRmLmdldERlY2ltYWxGb3JtYXRTeW1ib2xzKCk7Ci0gICAgT2JqZWN0W10gY3VycmVuY3lEYXRhID0gbmV3IE9iamVjdFs2XTsKLSAgICBjdXJyZW5jeURhdGFbMF0gPSBkZWNpbWFsRm9ybWF0U3ltYm9scy5nZXRDdXJyZW5jeVN5bWJvbCgpOyAKLSAgICBjdXJyZW5jeURhdGFbMV0gPSBkZWNpbWFsRm9ybWF0U3ltYm9scy5nZXRDdXJyZW5jeSgpLmdldEN1cnJlbmN5Q29kZSgpOwotICAgIGN1cnJlbmN5RGF0YVsyXSA9IGRmLmdldFBvc2l0aXZlUHJlZml4KCk7Ci0gICAgY3VycmVuY3lEYXRhWzNdID0gZGYuZ2V0UG9zaXRpdmVTdWZmaXgoKTsKLSAgICBjdXJyZW5jeURhdGFbNF0gPSBkZi5nZXROZWdhdGl2ZVByZWZpeCgpOwotICAgIGN1cnJlbmN5RGF0YVs1XSA9IGRmLmdldE5lZ2F0aXZlU3VmZml4KCk7Ci0KLSAgICByZXR1cm4gY3VycmVuY3lEYXRhOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IF9nZXRFbGVtZW50RGF0YSgKLSAgICBTdHJpbmcgY3VycktleSwKLSAgICBSZXNvdXJjZUJ1bmRsZSBlbGVtZW50c0RhdGEsCi0gICAgTG9jYWxlIHRhcmdldExvY2FsZQotICAgKQotICB7Ci0gICAgcmV0dXJuIGVsZW1lbnRzRGF0YS5nZXRPYmplY3QoY3VycktleSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIF93cml0ZVJlc291cmNlRWxlbWVudCgKLSAgICBXcml0ZXIgIG91dHB1dCwKLSAgICBTdHJpbmcgIGtleSwKLSAgICBPYmplY3QgIHZhbHVlLAotICAgIGJvb2xlYW4gbm90TGFzdCwKLSAgICBib29sZWFuIHByZXR0eVByaW50Ci0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmIChrZXkgIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyBzdGFydCB3cml0aW5nIGVsZW1lbnQsIHVzaW5nIGtleSBhcyB0aGUgcHJvcGVydHkgbmFtZQotICAgICAgb3V0cHV0LndyaXRlKGtleSk7Ci0gICAgICBvdXRwdXQud3JpdGUoJzonKTsKLSAgICB9Ci0KLSAgICBPYmplY3RbXSB2YWx1ZXMgPSBudWxsOwotICAgIGludCB2YWx1ZUNvdW50ID0gMDsKLQotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIE9iamVjdFtdKQotICAgIHsKLSAgICAgIHZhbHVlcyA9IChPYmplY3RbXSl2YWx1ZTsKLQotICAgICAgdmFsdWVDb3VudCA9IHZhbHVlcy5sZW5ndGg7Ci0KLSAgICAgIGlmICh2YWx1ZUNvdW50ID09IDApCi0gICAgICB7Ci0gICAgICAgIHZhbHVlID0gIiI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlQ291bnQgIT0gMCkKLSAgICB7Ci0gICAgICAvLyBvdXRwdXQud3JpdGUoIm5ldyBBcnJheSgiKTsKLSAgICAgIG91dHB1dC53cml0ZSgnWycpOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQ291bnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgX3dyaXRlUmVzb3VyY2VFbGVtZW50KG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpIDwgdmFsdWVDb3VudCAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmV0dHlQcmludCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vb3V0cHV0LndyaXRlKCcpJyk7Ci0gICAgICBvdXRwdXQud3JpdGUoJ10nKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgnXCInKTsKLSAgICAgIF93cml0ZUVzY2FwZWRTdHJpbmcob3V0cHV0LCB2YWx1ZS50b1N0cmluZygpLCBmYWxzZSk7Ci0gICAgICBvdXRwdXQud3JpdGUoJ1wiJyk7Ci0gICAgfQotCi0gICAgaWYgKG5vdExhc3QpCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCcsJyk7Ci0KLSAgICAgIGlmIChwcmV0dHlQcmludCkKLSAgICAgIHsKLSAgICAgICAgb3V0cHV0LndyaXRlKCcgJyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gd2Ugd3JvdGUgc29tZSBvdXB1dAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfd3JpdGVKYXZhQnVuZGxlRWxlbWVudCgKLSAgICBXcml0ZXIgIG91dHB1dCwKLSAgICBTdHJpbmcgIGtleSwKLSAgICBPYmplY3QgIHZhbHVlLAotICAgIGJvb2xlYW4gd2FzUHJldmlvdXMKLSAgICApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0cHV0LndyaXRlKCIgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyAiCi0gICAgICAgICAgICAgICAgICsgX2dldEtleUFycmF5TmFtZShrZXkpCi0gICAgICAgICAgICAgICAgICsgIltdIik7Ci0gICAgT2JqZWN0W10gdmFsdWVzID0gbnVsbDsKLSAgICBpbnQgdmFsdWVDb3VudCA9IDA7Ci0gICAgYm9vbGVhbiBkb25lT25lID0gZmFsc2U7Ci0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBPYmplY3RbXSkKLSAgICB7Ci0gICAgICB2YWx1ZXMgPSAoT2JqZWN0W10pIHZhbHVlOwotCi0gICAgICB2YWx1ZUNvdW50ID0gdmFsdWVzLmxlbmd0aDsKLQotICAgICAgaWYgKHZhbHVlQ291bnQgPD0gMCkKLSAgICAgIHsKLSAgICAgICAgdmFsdWVzID0gX0VNUFRZX1ZBTFVFUzsKLSAgICAgICAgdmFsdWVDb3VudCA9IDE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHZhbHVlQ291bnQgPiAwKQotICAgIHsKLSAgICAgIG91dHB1dC53cml0ZSgiID0gXG4gIHtcbiIpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZUNvdW50OyBpKyspCi0gICAgICB7Ci0gICAgICAgIG91dHB1dC53cml0ZSgoZG9uZU9uZSA/ICIsIFxuIiA6ICIiKSArICIgICAgXCIiKTsKLSAgICAgICAgX3dyaXRlRXNjYXBlZFN0cmluZyhvdXRwdXQsIHZhbHVlc1tpXS50b1N0cmluZygpLCB0cnVlKTsKLSAgICAgICAgb3V0cHV0LndyaXRlKCJcIiIpOwotICAgICAgICBkb25lT25lID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIG91dHB1dC53cml0ZSgiXG4gIH07XG5cbiIpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgb3V0cHV0LndyaXRlKCIgPSBudWxsIik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfd3JpdGVFc2NhcGVkU3RyaW5nKAotICAgIFdyaXRlciBvdXRwdXQsCi0gICAgU3RyaW5nIHZhbHVlLAotICAgIGJvb2xlYW4gaXNKYXZhCi0gICAgKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGludCBsZW5ndGggPSB2YWx1ZS5sZW5ndGgoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgewotICAgICAgY2hhciBjdXJyQ2hhciA9IHZhbHVlLmNoYXJBdChpKTsKLQotICAgICAgaWYgKGN1cnJDaGFyID4gMjU1KQotICAgICAgewotICAgICAgICBvdXRwdXQud3JpdGUoIlxcdSIpOwotICAgICAgICBvdXRwdXQud3JpdGUoX2dldEhleFN0cmluZyhjdXJyQ2hhciwgNCkpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBpZiAoaXNKYXZhKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChjdXJyQ2hhciA+IDMxKQotICAgICAgICAgICAgICAmJiAoY3VyckNoYXIgPCAxMjgpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjdXJyQ2hhciA9PSAnXCInKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBvdXRwdXQud3JpdGUoIlxcXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgb3V0cHV0LndyaXRlKGN1cnJDaGFyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZSgiXFx1Iik7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoX2dldEhleFN0cmluZyhjdXJyQ2hhciwgNCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICAvLyB3cml0ZSBhc2NpaSBwcmludGFibGUgY2hhcmFjdGVycywgZXhjZXB0IGZvciB0aGUgZG91YmxlIHF1b3RlLAotICAgICAgICAgIC8vIHdoaWNoIG5lZWRzIHRvIGJlIGVzY2FwZWQgYmVjYXVzZSB3ZSBhcmUgYWxyZWFkeSBpbiBhIFN0cmluZy4KLSAgICAgICAgICBpZiAoKGN1cnJDaGFyID4gMzEpICAgICYmCi0gICAgICAgICAgICAgIChjdXJyQ2hhciA8IDEyOCkgICAmJgotICAgICAgICAgICAgICAoY3VyckNoYXIgIT0gJ1wiJykgJiYKLSAgICAgICAgICAgICAgKGN1cnJDaGFyICE9ICdcJycpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dC53cml0ZShjdXJyQ2hhcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVsc2UKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBvdXRwdXQud3JpdGUoIlxceCIpOwotICAgICAgICAgICAgb3V0cHV0LndyaXRlKF9nZXRIZXhTdHJpbmcoY3VyckNoYXIsIDIpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfZ2V0SGV4U3RyaW5nKAotICAgIGludCBudW1iZXIsCi0gICAgaW50IG1pbkRpZ2l0cwotICAgICkKLSAgewotICAgIFN0cmluZyBoZXhTdHJpbmcgPSBJbnRlZ2VyLnRvSGV4U3RyaW5nKG51bWJlcik7Ci0KLSAgICBpbnQgaGV4TGVuZ3RoID0gaGV4U3RyaW5nLmxlbmd0aCgpOwotCi0gICAgaW50IHplcm9QYWRkaW5nID0gbWluRGlnaXRzIC0gaGV4TGVuZ3RoOwotCi0gICAgaWYgKHplcm9QYWRkaW5nID4gMCkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFkZGVkU3RyaW5nID0gIjAiOwotCi0gICAgICB3aGlsZSAoemVyb1BhZGRpbmcgPiAxKQotICAgICAgewotICAgICAgICBwYWRkZWRTdHJpbmcgKz0gIjAiOwotICAgICAgICB6ZXJvUGFkZGluZy0tOwotICAgICAgfQotCi0gICAgICBoZXhTdHJpbmcgPSBwYWRkZWRTdHJpbmcgKyBoZXhTdHJpbmc7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoemVyb1BhZGRpbmcgPCAwKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGhleFN0cmluZzsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfZ2V0S2V5QXJyYXlOYW1lKFN0cmluZyBrZXkpCi0gIHsKLSAgICByZXR1cm4gIl9hcnJheSIgKyBrZXk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgX2dldEZpbGVOYW1lKAotICAgIExvY2FsZSBsb2NhbGUsCi0gICAgU3RyaW5nIHZlcnNpb24sCi0gICAgYm9vbGVhbiBnZW5lcmF0ZUJ1bmRsZUJhc2VPbmx5Ci0gICAgKQotICB7Ci0KLSAgICBpZiAoZ2VuZXJhdGVCdW5kbGVCYXNlT25seSkKLSAgICB7Ci0gICAgICByZXR1cm4gIkxvY2FsZUVsZW1lbnRzIjsKLSAgICB9Ci0KLSAgICBpZiAodmVyc2lvbiA9PSBudWxsKQotICAgIHsKLSAgICAgIHJldHVybiAiTG9jYWxlRWxlbWVudHNfIiArIGxvY2FsZTsKLSAgICB9Ci0gICAgcmV0dXJuICJMb2NhbGVFbGVtZW50c18iICsgbG9jYWxlICsgdmVyc2lvbjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBfZ2V0TG9jYWxlU3VmZml4KAotICAgIExvY2FsZSBsb2NhbGUKLSAgICApCi0gIHsKLSAgICBTdHJpbmcgbG9jYWxlU3RyaW5nID0gIGxvY2FsZS50b1N0cmluZygpOwotCi0gICAgcmV0dXJuIGxvY2FsZVN0cmluZy5zdWJzdHJpbmcobG9jYWxlU3RyaW5nLmluZGV4T2YoJ18nKSk7Ci0gIH0KLQotICAvLwotICAvLyBBcnJheSBvZiBEYXRlRm9ybWF0Wm9uZURhdGEga2V5IG5hbWVzIHRvIHJldHJpZXZlLgotICAvLyBPbmx5IGtleXMgZnJvbSB0aGlzIGxpc3QgYXJlIHVzZWQgdG8gZ2VuZXJhdGUgbG9jYWxlIGluZm9ybWF0aW9uCi0gIC8vCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIExPQ0FMRV9FTEVNRU5UU19HRVRfS0VZUyA9IAotICB7Ci0gICAgIk1vbnRoTmFtZXMiLAotICAgICJNb250aEFiYnJldmlhdGlvbnMiLAotICAgICJEYXlOYW1lcyIsCi0gICAgIkRheUFiYnJldmlhdGlvbnMiLAotICAgICJBbVBtTWFya2VycyIsCi0gICAgIkVyYXMiLAotICAgICJEYXRlVGltZVBhdHRlcm5zIiwKLSAgICAiRGF0ZVRpbWVFbGVtZW50cyIsCi0gICAgIk51bWJlckVsZW1lbnRzIiwKLSAgICAiQ3VycmVuY3lFbGVtZW50cyIsCi0gIH07Ci0KLSAgLy8KLSAgLy8gQXJyYXkgb2YgRGF0ZUZvcm1hdFpvbmVEYXRhIGtleSBuYW1lcyB0byByZXRyaWV2ZS4KLSAgLy8gT25seSBrZXlzIGZyb20gdGhpcyBsaXN0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIGxvY2FsZSBpbmZvcm1hdGlvbgotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBMT0NBTEVfRUxFTUVOVFNfTUFQUElOR1MgPSAKLSAgewotICAgICJNb250aE5hbWVzIiwgImdldE1vbnRocyIsCi0gICAgIk1vbnRoQWJicmV2aWF0aW9ucyIsICJnZXRTaG9ydE1vbnRocyIsCi0gICAgIkRheU5hbWVzIiwgImdldFdlZWtkYXlzIiwKLSAgICAiRGF5QWJicmV2aWF0aW9ucyIsICJnZXRTaG9ydFdlZWtkYXlzIiwKLSAgICAiQW1QbU1hcmtlcnMiLCAiZ2V0QW1QbVN0cmluZ3MiLAotICAgICJFcmFzIiwgImdldEVyYXMiLAotICAgICJEYXRlVGltZVBhdHRlcm5zIiwgbnVsbCwKLSAgICAiRGF0ZVRpbWVFbGVtZW50cyIsIG51bGwsCi0gICAgIk51bWJlckVsZW1lbnRzIiwgbnVsbAotICB9OwotCi0gIC8vCi0gIC8vIEFycmF5IG9mIExvY2FsZUVsZW1lbnRzIGtleSBuYW1lcyB0byByZXRyaWV2ZS4KLSAgLy8gT25seSBrZXlzIGZyb20gdGhpcyBsaXN0IGFyZSB1c2VkIHRvIGdlbmVyYXRlIGxvY2FsZSBpbmZvcm1hdGlvbgotICAvLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBEQVRFX0ZPUk1BVF9aT05FX0dFVF9LRVlTID0ge307Ci0KLSAgLy8gSjJTRSAxLjM6Ci0gIC8vIHByaXZhdGUgc3RhdGljIFN0cmluZyBfUkVTT1VSQ0VTX1BBQ0tBR0UgPSAiamF2YS50ZXh0LnJlc291cmNlcyI7Ci0KLSAgLy8gSjJTRSAxLjQ6Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfUkVTT1VSQ0VTX1BBQ0tBR0UgPSAic3VuLnRleHQucmVzb3VyY2VzIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0RBVEVfRk9STUFUX1pPTkVfUEFUSCA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIF9SRVNPVVJDRVNfUEFDS0FHRSArICIuRGF0ZUZvcm1hdFpvbmVEYXRhIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0xPQ0FMRV9FTEVNRU5UU19QQVRIID0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgX1JFU09VUkNFU19QQUNLQUdFICsgIi5Mb2NhbGVFbGVtZW50cyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9ERUZBVUxUX0xPQ0FUSU9OX1BBVEggPQotICAgICAgICAgICJvcmdcXGFwYWNoZVxcbXlmYWNlc1xcdHJpbmlkYWRpbnRlcm5hbFxcdWlcXGpzTGlic1xccmVzb3VyY2VzXFwiLnJlcGxhY2UoJ1xcJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gIC8vIE1pbWlja2luZyB0byBiZSBpbiBhcGkgcGF0aC4gSW4gdGhlIHRyaW5pZGFkLWZhY2VzIGltcGwgc2lkZSB3ZSBoYXZlCi0gIC8vIHRoZSBmb2xsb3dpbmcgZGlyZWN0b3J5IHN0cnVjdHVyZS4gVGhlcmUgaXMgaWRlbnRpY2FsIGRpcmVjdG9yeSBzdHVyY3R1cmUKLSAgLy8gaW4gdHJpbmlkYWQtZmFjZXMgYXBpIHNpZGUuCi0gIC8vIE9ubHkgX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UIGJhc2UgZmlsZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBhcGkgc2lkZSwKLSAgLy8gd2hpbGUgYWxsIHRoZSB2YXJpYW50cyB3aWxsIGJlIGluIGltcGwgc2lkZSBpbiB0aGUgZGlyZWN0b3J5IHN0cnVjdHVyZQotICAvLyBkZWZpbmVkIGJlbG93LgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UU19QQUNLQUdFID0KLSAgICAib3JnLmFwYWNoZS5teWZhY2VzLnRyaW5pZGFkLnJlc291cmNlIjsKLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBfREVGQVVMVF9CVU5ETEVfTE9DQVRJT05fUEFUSCA9Ci0gICAgKF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVFNfUEFDS0FHRS5yZXBsYWNlKCcuJywgRmlsZS5zZXBhcmF0b3JDaGFyKQotICAgICArIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVFNfUEFUSCA9Ci0gICAgX1RSSU5JREFEX0xPQ0FMRV9FTEVNRU5UU19QQUNLQUdFICsgIi5Mb2NhbGVFbGVtZW50cyI7Ci0KLSAgLy8gYnVmZmVyIHNpemUgb2YgdGhlIEJ1ZmZlcmVkV3JpdGVyIHRvIHdoaWNoIG91dHB1dCBpcyB3cml0dGVuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBfREVGQVVMVF9CVUZGRVJfU0laRSA9IDEgPDwgMTQ7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9MT0NBTEVfTElTVF9QQVRIID0KLSAgICAgICAgICAib3JnXFxhcGFjaGVcXG15ZmFjZXNcXHRyaW5pZGFkaW50ZXJuYWxcXHVpXFxsYWZcXGJhc2VcXHhodG1sXFxMb2NhbGVMaXN0LmphdmEiLnJlcGxhY2UoJ1xcJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlLnNlcGFyYXRvckNoYXIpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfRU1QVFlfVkFMVUVTW10gPSB7ICIiIH07Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9MT0NBTEVfTElTVF9DT0RFX1NUQVJUID0KLSIvKlxuIiArCi0iKipcbiIgKwotIioqMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODlcbiIgKwotIiovXG4iICsKLSJwYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy50cmluaWRhZGludGVybmFsLnVpLmxhZi5iYXNlLnhodG1sO1xuIiArCi0iXG4iICsKLSJpbXBvcnQgamF2YS51dGlsLkxvY2FsZTtcbiIgKwotIlxuIiArCi0iaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwO1xuIiArCi0iXG4iICsKLSIvKlxuIiArCi0iICogTGlzdCBvZiBzdXBwb3J0ZWQgbG9jYWxlcy4gIEF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIC0gZG8gbm90IG1vZGlmeSFcbiIgKwotIiAqL1xuIiArCi0icHVibGljIGNsYXNzIExvY2FsZUxpc3RcbiIgKwotIntcbiIgKwotIiAgLypcbiIgKwotIiAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBzdXBwb3J0ZWQgbG9jYWxlcy5cbiIgKwotIiAgICovXG4iICsKLSIgIHN0YXRpYyBwdWJsaWMgSGFzaE1hcDxMb2NhbGUsIExvY2FsZT4gZ2V0U3VwcG9ydGVkTG9jYWxlcygpXG4iICsKLSIgIHtcbiIgKwotIiAgICByZXR1cm4gX3NMb2NhbGVNYXBwZXI7XG4iICsKLSIgIH1cbiIgKwotIiAgXG4iICsKLSIgIHByaXZhdGUgTG9jYWxlTGlzdCgpXG4iICsKLSIgIHtcbiIgKwotIiAgfVxuIiArCi0iXG4iICsKLSIgIHN0YXRpYyBwcml2YXRlIGZpbmFsIExvY2FsZVtdIF9zTG9jYWxlcyA9IG5ldyBMb2NhbGVbXVxuIiArCi0iICB7XG4iOwotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9MT0NBTEVfTElTVF9DT0RFX0VORCA9Ci0iICB9O1xuIiArCi0iXG4iICsKLSIgIHN0YXRpYyBwcml2YXRlIEhhc2hNYXA8TG9jYWxlLCBMb2NhbGU+IF9zTG9jYWxlTWFwcGVyO1xuIiArCi0iXG4iICsKLSIgIHN0YXRpY1xuIiArCi0iICB7XG4iICsKLSIgICAgX3NMb2NhbGVNYXBwZXIgPSBuZXcgSGFzaE1hcDxMb2NhbGUsIExvY2FsZT4oKTtcbiIgKwotIiAgICBmb3IoTG9jYWxlIGxvY2FsZSA6IF9zTG9jYWxlcylcbiIgKwotIiAgICB7XG4iICsKLSIgICAgICBfc0xvY2FsZU1hcHBlci5wdXQobG9jYWxlLCBsb2NhbGUpO1xuIiArCi0iICAgIH1cbiIgKwotIiAgfVxuIiArCi0ifVxuIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0xPQ0FMRV9KQVZBX0NPREVfU1RBUlQgPQotICAgICIvLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUhXG4iCi0gICAgKyAiLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkLlxuIgotICAgICsgIi8vIEVkaXQgSlNMb2NhbGVFbGVtZW50c0dlbmVyYXRvciBpbnN0ZWFkLlxuLy9cbiIKLSAgICArICJwYWNrYWdlICIKLSAgICArIF9UUklOSURBRF9MT0NBTEVfRUxFTUVOVFNfUEFDS0FHRQotICAgICsgIjtcblxuIgotICAgICsgImltcG9ydCBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlO1xuIjsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgX0pBVkFTQ1JJUFRfRVhURU5TSU9OID0gIi5qcyI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBfSkFWQV9FWFRFTlNJT04gPSAiLmphdmEiOwotIAotICAvL0ludHJvZHVjZWQgdG8gcmVtb3ZlIHRoZSBkZXBlbmRlbmN5IG9uIGJhbGktc2hhcmUgaW4gdGhlIGFwaSBzaWRlLgotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBcnJheUVudW1lcmF0aW9uIGltcGxlbWVudHMgRW51bWVyYXRpb24KLSAgewotICAgIHB1YmxpYyBBcnJheUVudW1lcmF0aW9uKE9iamVjdFtdIGFycmF5KQotICAgIHsKLSAgICAgIF9vYmplY3RzID0gKGFycmF5ID09IG51bGwpPyBfRU1QVFlfQVJSQVkgOiBhcnJheTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNNb3JlRWxlbWVudHMoKQotICAgIHsKLSAgICAgIHJldHVybiBfY3VycmVudEluZGV4IDwgX29iamVjdHMubGVuZ3RoOwotICAgIH0KLQotICAgIHB1YmxpYyBPYmplY3QgbmV4dEVsZW1lbnQoKQotICAgIHsKLSAgICAgIHJldHVybiBfb2JqZWN0c1tfY3VycmVudEluZGV4KytdOwotICAgIH0KLQotICAgIHByaXZhdGUgT2JqZWN0W10gX29iamVjdHM7Ci0KLSAgICBwcml2YXRlIGludCBfY3VycmVudEluZGV4OwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0W10gX0VNUFRZX0FSUkFZID0gbmV3IE9iamVjdFswXTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9WZXJzaW9uVXRpbHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtaTE4bi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2kxOG4vdWl4dG9vbHMvVmVyc2lvblV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA2OTgwMWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1pMThuLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vaTE4bi91aXh0b29scy9WZXJzaW9uVXRpbHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5pMThuLnVpeHRvb2xzOwotCi1wdWJsaWMgY2xhc3MgVmVyc2lvblV0aWxzCi17Ci0gIC8qKgotICAgKiBOb3JtYWxpemUgYSB2ZXJzaW9uIG51bWJlciBmb3IgdXNlIGFzIGEgZmlsZSBzdWZmaXguCi0gICAqLwotICBzdGF0aWMgcHVibGljIFN0cmluZyBub3JtYWxpemVWZXJzaW9uU3VmZml4KFN0cmluZyB2ZXJzaW9uKQotICB7Ci0gICAgaWYgKHZlcnNpb24gPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICByZXR1cm4gdmVyc2lvbi5yZXBsYWNlKCcuJywgJ18nKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNzc1ZWE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI0MiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0KLQotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICBMSUNFTlNFUyBGT1IgSU5DTFVERUQgREVQRU5ERU5DSUVTCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1BbGwgdGhlIHNvdXJjZSBjb2RlIGZvciB0aGUgVHJpbmlkYWQgUGx1Z2lucyBwcm9qZWN0IGlzIHJlbGVhc2VkIHVuZGVyIHRoZQotbGljZW5zZSBhYm92ZS4gQWRkaXRpb25hbGx5LCB0aGUgVHJpbmlkYWQgUGx1Z2lucyBiaW5hcnkgZGlzdHJpYnV0aW9uCi1pbmNsdWRlcyBhIG51bWJlciBvZiB0aGlyZC1wYXJ0eSBmaWxlcyB0aGF0IGFyZSByZXF1aXJlZCBpbgotb3JkZXIgdG8gdGhlIHNvZnR3YXJlIHRvIGZ1bmN0aW9uLiBVbmxlc3Mgbm90ZWQgYmVsb3csIHRoZXNlIGphcnMKLWFuZCByZXNvdXJjZSBmaWxlcyBhcmUgYWxzbyByZWxlYXNlZCB1bmRlciB0aGUgQVNGIGxpY2Vuc2UgYWJvdmUuCi0KLVRoZSBleGNlcHRpb25zIGFyZSBhcyBmb2xsb3dzOgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgamF2YWNjIGluY2x1ZGVkIGluIHRoZSBtYXZlbi1qYXZhY2MtcGx1Z2luLCB0YWtlbiBmcm9tOgotICBodHRwOi8vamF2YWNjLmRldi5qYXZhLm5ldAotPT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotQ29weXJpZ2h0IChjKSAyMDAzIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gQWxsICBSaWdodHMgUmVzZXJ2ZWQuCi0KLVJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dCBtb2RpZmljYXRpb24sIAotYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUgbWV0OgotCi0tUmVkaXN0cmlidXRpb24gb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotCi0tUmVkaXN0cmlidXRpb24gaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsIAotdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3IgCi1vdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgotCi1OZWl0aGVyIHRoZSBuYW1lIG9mIFN1biBNaWNyb3N5c3RlbXMsIEluYy4gb3IgdGhlIG5hbWVzIG9mIGNvbnRyaWJ1dG9ycyBtYXkgCi1iZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IAotc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotCi1UaGlzIHNvZnR3YXJlIGlzIHByb3ZpZGVkICJBUyBJUywiIHdpdGhvdXQgYSB3YXJyYW50eSBvZiBhbnkga2luZC4gQUxMIEVYUFJFU1MgT1IgSU1QTElFRCBDT05ESVRJT05TLCBSRVBSRVNFTlRBVElPTlMgQU5EIFdBUlJBTlRJRVMsIElOQ0xVRElORyBBTlkgSU1QTElFRCBXQVJSQU5UWSBPRiBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIE9SIE5PTi1JTkZSSU5HRU1FTlQsIEFSRSBIRVJFQlkgRVhDTFVERUQuIFNVTiBNSURST1NZU1RFTVMsIElOQy4gKCJTVU4iKSBBTkQgSVRTIExJQ0VOU09SUyBTSEFMTCBOT1QgQkUgTElBQkxFIEZPUiBBTlkgREFNQUdFUyBTVUZGRVJFRCBCWSBMSUNFTlNFRSBBUyBBIFJFU1VMVCBPRiBVU0lORywgTU9ESUZZSU5HIE9SIERJU1RSSUJVVElORyBUSElTIFNPRlRXQVJFIE9SIElUUyBERVJJVkFUSVZFUy4gSU4gTk8gRVZFTlQgV0lMTCBTVU4gT1IgSVRTIExJQ0VOU09SUyBCRSBMSUFCTEUgRk9SIEFOWSBMT1NUIFJFVkVOVUUsIFBST0ZJVCBPUiBEQVRBLCBPUiBGT1IgRElSRUNULCBJTkRJUkVDVCwgU1BFQ0lBTCwgQ09OU0VRVUVOVElBTCwgSU5DSURFTlRBTCBPUiBQVU5JVElWRSBEQU1BR0VTLCBIT1dFVkVSIENBVVNFRCBBTkQgUkVHQVJETEVTUyBPRiBUSEUgVEhFT1JZIE9GIExJQUJJTElUWSwgQVJJU0lORyBPVVQgT0YgVEhFIFVTRSBPRiBPUiBJTkFCSUxJVFkgVE8gVVNFIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgU1VOIEhBUyBCRUVOIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFUy4KLQotWW91IGFja25vd2xlZGdlIHRoYXQgIHRoaXMgc29mdHdhcmUgaXMgbm90IGRlc2lnbmVkLCBsaWNlbnNlZCBvciBpbnRlbmRlZCBmb3IgdXNlIGluIHRoZSBkZXNpZ24sIGNvbnN0cnVjdGlvbiwgb3BlcmF0aW9uIG9yIG1haW50ZW5hbmNlIG9mIGFueSBudWNsZWFyIGZhY2lsaXR5LgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkYzEyNmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0tIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1UcmluaWRhZCBQbHVnaW5zIGlzIGJ1bmRsZWQgd2l0aCB0aGUgYmluYXJpZXMgZnJvbSB0aGUgamF2YWNjIHByb2plY3QsIGJ5Ci1TdW4gTWljcm9zeXN0ZW1zIGFuZCBsaWNlbnNlZCB1bmRlciB0aGUgQlNELiBUaGUgc291cmNlIGNvZGUgaXMKLWF2YWlsYWJsZSBhdDogaHR0cHM6Ly9qYXZhY2MuZGV2LmphdmEubmV0L3NvdXJjZS9icm93c2UvamF2YWNjLwotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2I5YTE1ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgSmF2YWNjIFBsdWdpbjwvbmFtZT4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnBsZXh1czwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnBsZXh1cy1jb21waWxlci1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjQ8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+cGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjE8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+bmV0LmphdmEuZGV2LmphdmFjYzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmphdmFjYzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjMuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qby5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhY2MvSmF2YUNDTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDNhZWIyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YWNjOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucHJvamVjdC5NYXZlblByb2plY3Q7Ci0KLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLmNvbXBpbGVyLnV0aWwuc2Nhbi5JbmNsdXNpb25TY2FuRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLlNvdXJjZUluY2x1c2lvblNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy5jb21waWxlci51dGlsLnNjYW4uU3RhbGVTb3VyY2VTY2FubmVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMuY29tcGlsZXIudXRpbC5zY2FuLm1hcHBpbmcuU3VmZml4TWFwcGluZzsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuRmlsZVV0aWxzOwotCi0KLS8qKgotICogQGdvYWwgZ2VuZXJhdGUKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBwYXJzZSBhIEpKIGZpbGUgYW5kIHRyYW5zZm9ybSBpdCB0byBKYXZhIFNvdXJjZSBGaWxlcy4KLSAqIEB2ZXJzaW9uICRJZCQKLSAqLwotcHVibGljIGNsYXNzIEphdmFDQ01vam8KLSAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0xCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBpbnQgbG9va0FoZWFkOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249MgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgaW50IGNob2ljZUFtYmlndWl0eUNoZWNrOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249MQotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgaW50IG90aGVyQW1iaWd1aXR5Q2hlY2s7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNTdGF0aWM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRlYnVnUGFyc2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBkZWJ1Z0xvb2tBaGVhZDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZGVidWdUb2tlbk1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gb3B0aW1pemVUb2tlbk1hbmFnZXI7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0idHJ1ZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZXJyb3JSZXBvcnRpbmc7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGphdmFVbmljb2RlRXNjYXBlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1bmljb2RlSW5wdXQ7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlnbm9yZUNhc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iZmFsc2UiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGNvbW1vblRva2VuQWN0aW9uOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VyVG9rZW5NYW5hZ2VyOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB1c2VyQ2hhclN0cmVhbTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBidWlsZFBhcnNlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBidWlsZFRva2VuTWFuYWdlcjsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzYW5pdHlDaGVjazsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJmYWxzZSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gZm9yY2VMYUNoZWNrOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249ImZhbHNlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBjYWNoZVRva2VuczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJ0cnVlIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBrZWVwTGluZUNvbHVtbjsKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBKSiBmaWxlKHMpIGFyZSBsb2NhdGVkLgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249InNyYy9tYWluL2phdmFjYyIKLSAgICovCi0gIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIFBhdGggdW5kZXIgc291cmNlIGRpcmVjdG9yeSB3aGVyZSB0aGUgSkogZmlsZShzKSBhcmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBEaXJlY3Rvcnkgd2hlcmUgdGhlIG91dHB1dCBKYXZhIEZpbGVzIHdpbGwgYmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi1qYXZhY2MtcGx1Z2luL3NyYy9tYWluL2phdmEiCi0gICAqLwotICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBQYXRoIHVuZGVyIG91dHB1dCBkaXJlY3Rvcnkgd2hlcmUgdGhlIG91dHB1dCBKYXZhIEZpbGVzIHdpbGwgYmUgbG9jYXRlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBvdXRwdXRQYXRoOwotCi0gIC8qKgotICAgKiB0aGUgZGlyZWN0b3J5IHRvIHN0b3JlIHRoZSBwcm9jZXNzZWQgLmpqIGZpbGVzCi0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4tamF2YWNjLXBsdWdpbi9zcmMvbWFpbi9jb25mIgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRpbWVzdGFtcERpcmVjdG9yeTsKLQotICAvKioKLSAgICogVGhlIGdyYW51bGFyaXR5IGluIG1pbGxpc2Vjb25kcyBvZiB0aGUgbGFzdCBtb2RpZmljYXRpb24KLSAgICogZGF0ZSBmb3IgdGVzdGluZyB3aGV0aGVyIGEgc291cmNlIG5lZWRzIHJlY29tcGlsYXRpb24KLSAgICoKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2xhc3RNb2RHcmFudWxhcml0eU1zfSIgZGVmYXVsdC12YWx1ZT0iMCIKLSAgICovCi0gIHByaXZhdGUgaW50IHN0YWxlTWlsbGlzOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPWZhbHNlCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGRvTm90R2VuZXJhdGVUb2tlbkZpbGU7Ci0KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBvdXRwdXRQYXRoKTsKLQotICAgIGlmICghb3V0RGlyLmV4aXN0cygpKQotICAgIHsKLSAgICAgIG91dERpci5ta2RpcnMoKTsKLSAgICB9Ci0KLSAgICBpZiAoIXRpbWVzdGFtcERpcmVjdG9yeS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICB0aW1lc3RhbXBEaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgfQotCi0gICAgU2V0IHN0YWxlR3JhbW1hcnMgPSBjb21wdXRlU3RhbGVHcmFtbWFycygpOwotCi0gICAgaWYgKHN0YWxlR3JhbW1hcnMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gcHJvY2VzcyAtIGFsbCBncmFtbWFycyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgaWYgKHByb2plY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdChvdXREaXIuZ2V0UGF0aCgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzdGFsZUdyYW1tYXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmlsZSBqYXZhY2NGaWxlID0gKEZpbGUpIGkubmV4dCgpOwotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIG9yZy5qYXZhY2MucGFyc2VyLk1haW4ubWFpblByb2dyYW0oZ2VuZXJhdGVKYXZhQ0NBcmd1bWVudExpc3QoamF2YWNjRmlsZS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAgIEZpbGVVdGlscy5jb3B5RmlsZVRvRGlyZWN0b3J5KGphdmFjY0ZpbGUsIHRpbWVzdGFtcERpcmVjdG9yeSk7Ci0gICAgICAgIGlmIChkb05vdEdlbmVyYXRlVG9rZW5GaWxlID09IHRydWUpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlIHRva2VuRmlsZSAgPSBuZXcgRmlsZShvdXREaXIsICJUb2tlbi5qYXZhIik7Ci0gICAgICAgICAgRmlsZVV0aWxzLmZvcmNlRGVsZXRlKHRva2VuRmlsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkphdmFDQyBleGVjdXRpb24gZmFpbGVkIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHByb2plY3QgIT0gbnVsbCkKLSAgICB7Ci0gICAgICBwcm9qZWN0LmFkZENvbXBpbGVTb3VyY2VSb290KG91dHB1dERpcmVjdG9yeS5nZXRQYXRoKCkpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBTdHJpbmdbXSBnZW5lcmF0ZUphdmFDQ0FyZ3VtZW50TGlzdChTdHJpbmcgamF2YWNjSW5wdXQpCi0gIHsKLQotICAgIEZpbGUgb3V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LCBvdXRwdXRQYXRoKTsKLQotICAgIEFycmF5TGlzdCBhcmdzTGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQotICAgIGFyZ3NMaXN0LmFkZCgiLUxPT0tBSEVBRD0iICsgbG9va0FoZWFkKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1DSE9JQ0VfQU1CSUdVSVRZX0NIRUNLPSIgKyBjaG9pY2VBbWJpZ3VpdHlDaGVjayk7Ci0gICAgYXJnc0xpc3QuYWRkKCItT1RIRVJfQU1CSUdVSVRZX0NIRUNLPSIgKyBvdGhlckFtYmlndWl0eUNoZWNrKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1TVEFUSUM9IiArIGlzU3RhdGljKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19QQVJTRVI9IiArIGRlYnVnUGFyc2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19MT09LQUhFQUQ9IiArIGRlYnVnTG9va0FoZWFkKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1ERUJVR19UT0tFTl9NQU5BR0VSPSIgKyBkZWJ1Z1Rva2VuTWFuYWdlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItT1BUSU1JWkVfVE9LRU5fTUFOQUdFUj0iICsgb3B0aW1pemVUb2tlbk1hbmFnZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUVSUk9SX1JFUE9SVElORz0iICsgZXJyb3JSZXBvcnRpbmcpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUpBVkFfVU5JQ09ERV9FU0NBUEU9IiArIGphdmFVbmljb2RlRXNjYXBlKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1VTklDT0RFX0lOUFVUPSIgKyB1bmljb2RlSW5wdXQpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUlHTk9SRV9DQVNFPSIgKyBpZ25vcmVDYXNlKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1DT01NT05fVE9LRU5fQUNUSU9OPSIgKyBjb21tb25Ub2tlbkFjdGlvbik7Ci0gICAgYXJnc0xpc3QuYWRkKCItVVNFUl9UT0tFTl9NQU5BR0VSPSIgKyB1c2VyVG9rZW5NYW5hZ2VyKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1VU0VSX0NIQVJfU1RSRUFNPSIgKyB1c2VyQ2hhclN0cmVhbSk7Ci0gICAgYXJnc0xpc3QuYWRkKCItQlVJTERfUEFSU0VSPSIgKyBidWlsZFBhcnNlcik7Ci0gICAgYXJnc0xpc3QuYWRkKCItQlVJTERfVE9LRU5fTUFOQUdFUj0iICsgYnVpbGRUb2tlbk1hbmFnZXIpOwotICAgIGFyZ3NMaXN0LmFkZCgiLVNBTklUWV9DSEVDSz0iICsgc2FuaXR5Q2hlY2spOwotICAgIGFyZ3NMaXN0LmFkZCgiLUZPUkNFX0xBX0NIRUNLPSIgKyBmb3JjZUxhQ2hlY2spOwotICAgIGFyZ3NMaXN0LmFkZCgiLUNBQ0hFX1RPS0VOUz0iICsgY2FjaGVUb2tlbnMpOwotICAgIGFyZ3NMaXN0LmFkZCgiLUtFRVBfTElORV9DT0xVTU49IiArIGtlZXBMaW5lQ29sdW1uKTsKLSAgICBhcmdzTGlzdC5hZGQoIi1PVVRQVVRfRElSRUNUT1JZOiIgKyBvdXREaXIuZ2V0UGF0aCgpKTsKLSAgICBhcmdzTGlzdC5hZGQoamF2YWNjSW5wdXQpOwotCi0gICAgZ2V0TG9nKCkuZGVidWcoImFyZ3NsaXN0OiAiICsgYXJnc0xpc3QudG9TdHJpbmcoKSk7Ci0KLSAgICByZXR1cm4gKFN0cmluZ1tdKSBhcmdzTGlzdC50b0FycmF5KG5ldyBTdHJpbmdbYXJnc0xpc3Quc2l6ZSgpXSk7Ci0gIH0KLQotICBwcml2YXRlIFNldCBjb21wdXRlU3RhbGVHcmFtbWFycygpCi0gICAgdGhyb3dzIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIFN1ZmZpeE1hcHBpbmcgbWFwcGluZyA9IG5ldyBTdWZmaXhNYXBwaW5nKCIuamoiLCAiLmpqIik7Ci0gICAgU3VmZml4TWFwcGluZyBtYXBwaW5nQ0FQID0gbmV3IFN1ZmZpeE1hcHBpbmcoIi5KSiIsICIuSkoiKTsKLQotICAgIFNvdXJjZUluY2x1c2lvblNjYW5uZXIgc2Nhbm5lciA9IG5ldyBTdGFsZVNvdXJjZVNjYW5uZXIoc3RhbGVNaWxsaXMpOwotCi0gICAgc2Nhbm5lci5hZGRTb3VyY2VNYXBwaW5nKG1hcHBpbmcpOwotICAgIHNjYW5uZXIuYWRkU291cmNlTWFwcGluZyhtYXBwaW5nQ0FQKTsKLQotICAgIFNldCBzdGFsZVNvdXJjZXMgPSBuZXcgSGFzaFNldCgpOwotCi0gICAgRmlsZSBzb3VyY2VEaXIgPSBuZXcgRmlsZShzb3VyY2VEaXJlY3RvcnksIHNvdXJjZVBhdGgpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgc3RhbGVTb3VyY2VzLmFkZEFsbChzY2FubmVyLmdldEluY2x1ZGVkU291cmNlcyhzb3VyY2VEaXIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXBEaXJlY3RvcnkpKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEluY2x1c2lvblNjYW5FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3Igc2Nhbm5pbmcgc291cmNlIHJvb3Q6IFwnIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlRGlyICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCcgZm9yIHN0YWxlIGdyYW1tYXJzIHRvIHJlcHJvY2Vzcy4iLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGUpOwotICAgIH0KLQotICAgIHJldHVybiBzdGFsZVNvdXJjZXM7Ci0gIH0KLQotCi19Ci0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmYzJjM2UuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotfn5MaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lDQotfn5vciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi1+fmRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotfn5yZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlDQotfn50byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotfn4iTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotfn53aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQotfn4NCi1+fmh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLX5+DQotfn5Vbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsDQotfn5zb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLX5+IkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotfn5LSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUNCi1+fnNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi1+fnVuZGVyIHRoZSBMaWNlbnNlLg0KLX5+DQotDQotLS0tLS0tDQotIE1hdmVuIDIgSmF2YUNDIHBsdWdpbiANCi0gLS0tLS0tDQotIDxqcnVpekBleGlzdC5jb20+DQotIEplc3NlIE1jQ29ubmVsbCA8amVzc2UubWNjb25uZWxsQGdtYWlsLmNvbT4NCi0gLS0tLS0tDQotIEp1bHkgMjcgMjAwNQ0KLSAtLS0tLS0NCi0NCi1NYXZlbiAyIEphdmFDQyBwbHVnaW4NCi0NCi0gVGhpcyBwbHVnaW4gaXMgZm9yIHByb2Nlc3NpbmcgamF2YWNjIGZpbGVzIGludG8gamF2YSBzb3VyY2VzLg0KLQ0KLSBodHRwczovL2phdmFjYy5kZXYuamF2YS5uZXQNCi0NCi0gVGhpcyBwbHVnaW4gd2lsbCBwcm9jZXNzIGFsbCAqLmpqIGZpbGVzIGluIHRoZSBzb3VyY2VEaXJlY3RvcnkgaW50byBhIA0KLSBjb21tb24gZ2VuZXJhdGVkIHNvdXJjZXMgb3V0cHV0IGRpcmVjdG9yeS4gIFRoaXMgd2lsbCBvY2N1ciBkdXJpbmcgdGhlIA0KLSBnZW5lcmF0ZS1yZXNvdXJjZXMgcGhhc2UgYW5kIHRoZSBzb3VyY2VzIGRpcmVjdG9yeSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBwcm9qZWN0DQotIGZvciB0aGUgY29tcGlsZSBwaGFzZS4NCi0gDQotQXZhaWxhYmxlIENvbmZpZ3VyYXRpb24gT3B0aW9uczogKHBhcmFtIC0gZGVmYXVsdCB2YWx1ZSkNCi0gDQotICogc291cmNlRGlyZWN0b3J5IC0gc3JjL21haW4vamF2YWNjDQotIA0KLSAqIG91dHB1dERpcmVjdG9yeSAtIHRhcmdldC9nZW5lcmF0ZWQtc291cmNlcy9qYXZhY2MNCi0gDQotICogdGltZXN0YW1wRGlyZWN0b3J5IC0gdGFyZ2V0ICh1c2VkIHNvIGdyYW1tZXJzIGFyZSBub3QgY29uc3RhbnRseSByZWdlbmVyYXRlZCkNCi0gDQotICogbG9va0FoZWFkIC0gMQ0KLQ0KLSAqIGNob2ljZUFtYmlndWl0eUNoZWNrIC0gMg0KLQ0KLSAqIG90aGVyQW1iaWd1aXR5Q2hlY2sgLSAxDQotDQotICogaXNTdGF0aWMgLSB0cnVlDQotDQotICogZGVidWdQYXJzZXIgLSBmYWxzZQ0KLQ0KLSAqIGRlYnVnTG9va0FoZWFkIC0gZmFsc2UNCi0NCi0gKiBkZWJ1Z1Rva2VuTWFuYWdlciAtIGZhbHNlDQotDQotICogb3B0aW1pemVUb2tlbk1hbmFnZXIgLSB0cnVlDQotDQotICogZXJyb3JSZXBvcnRpbmcgLSB0cnVlDQotDQotICogamF2YVVuaWNvZGVFc2NhcGUgLSBmYWxzZQ0KLQ0KLSAqIHVuaWNvZGVJbnB1dCAtIGZhbHNlDQotDQotICogaWdub3JlQ2FzZSAtIGZhbHNlDQotDQotICogY29tbW9uVG9rZW5BY3Rpb24gLSBmYWxzZQ0KLQ0KLSAqIHVzZXJUb2tlbk1hbmFnZXIgLSBmYWxzZQ0KLQ0KLSAqIHVzZXJDaGFyU3RyZWFtIC0gZmFsc2UNCi0NCi0gKiBidWlsZFBhcnNlciAtIHRydWUNCi0NCi0gKiBidWlsZFRva2VuTWFuYWdlciAtIHRydWUNCi0NCi0gKiBzYW5pdHlDaGVjayAtIHRydWUNCi0NCi0gKiBmb3JjZUxhQ2hlY2sgLSBmYWxzZQ0KLQ0KLSAqIGNhY2hlVG9rZW5zIC0gZmFsc2UNCi0NCi0gKiBrZWVwTGluZUNvbHVtbiAtIHRydWUNCi0gDQotIFtdDQotIA0KLVVzYWdlOg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0NCi08cHJvamVjdD4NCi0gICAuLi4NCi0gICAgICA8YnVpbGQ+DQotICAgICAgICAgPHBsdWdpbnM+DQotICAgICAgICAgICAgPHBsdWdpbj4NCi0gICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+DQotICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWNjLXBsdWdpbjwvYXJ0aWZhY3RJZD4NCi0JICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4NCi0JICAgICAgIDxleGVjdXRpb25zPg0KLQkgICAgICAgICAgPGV4ZWN1dGlvbj4NCi0JICAgICAgICAgICAgIDxnb2Fscz4NCi0JICAgICAgICAgICAgICAgIDxnb2FsPmdlbmVyYXRlPC9nb2FsPg0KLQkgICAgICAgICAgICAgPC9nb2Fscz4NCi0JICAgICAgICAgIDwvZXhlY3V0aW9uPg0KLQkgICAgICAgPC9leGVjdXRpb25zPg0KLSAgICAgICAgICAgIDwvcGx1Z2luPg0KLSAgICAgICAgIDwvcGx1Z2lucz4NCi0gICAgICAgICAuLi4NCi0gICAgICA8L2J1aWxkPg0KLSAgIC4uLg0KLTwvcHJvamVjdD4NCi0tLS0tLS0tLS0tLS0tLS0tLS0tDQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMjY2ZTlkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLTwhLS0NCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0NCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuDQotCSAgIA0KLS0tPg0KLTxwcm9qZWN0IG5hbWU9Ik1vam8iPg0KLSAgIDxiYW5uZXJMZWZ0Pg0KLSAgICAgIDxuYW1lPk1vam88L25hbWU+DQotICAgICAgPHNyYz4vaW1hZ2VzL21vam9fbG9nby5wbmc8L3NyYz4NCi0gICAgICA8aHJlZj5odHRwOi8vbW9qby5jb2RlaGF1cy5vcmc8L2hyZWY+DQotICAgPC9iYW5uZXJMZWZ0Pg0KLSAgIDxiYW5uZXJSaWdodD4NCi0gICAgICA8bmFtZT5Db2RlaGF1czwvbmFtZT4NCi0gICAgICA8c3JjPmh0dHA6Ly9tb2pvLmNvZGVoYXVzLm9yZy9pbWFnZXMvY29kZWhhdXMtc21hbGwucG5nPC9zcmM+DQotICAgICAgPGhyZWY+aHR0cDovL3d3dy5jb2RlaGF1cy5vcmc8L2hyZWY+DQotICAgPC9iYW5uZXJSaWdodD4NCi0gICA8Ym9keT4NCi0gICAgICA8bGlua3M+DQotICAgICAgICAgPGl0ZW0gbmFtZT0iTW9qbyIgaHJlZj0iaHR0cDovL21vam8uY29kZWhhdXMub3JnIi8+DQotICAgICAgICAgPGl0ZW0gbmFtZT0iTWF2ZW4iIGhyZWY9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuMiIvPg0KLSAgICAgIDwvbGlua3M+DQotICAgICAgPG1lbnUgbmFtZT0iTW9qbyI+DQotICAgICAgICAgPGl0ZW0gbmFtZT0ibW9qbyIgaHJlZj0iaHR0cDovL21vam8uY29kZWhhdXMub3JnIi8+DQotICAgICAgPC9tZW51Pg0KLSAgICAgICR7cmVwb3J0c30NCi0gICA8L2JvZHk+DQotPC9wcm9qZWN0Pg0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam9UZXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFjYy9KYXZhQ0NNb2pvVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjg2NjMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YWNjL0phdmFDQ01vam9UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YWNjOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFjYy5KYXZhQ0NNb2pvOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhQ0NNb2pvVGVzdCBleHRlbmRzIFRlc3RDYXNlCi17Ci0gIHB1YmxpYyB2b2lkIHRlc3RFeGVjdXRpb24oKSB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgSmF2YUNDTW9qbyBtb2pvID0gbmV3IEphdmFDQ01vam8oKTsKLSAgICAvL1RPRE86IHdyaXRlIGEgdGVzdCBoZXJlLi4uCi0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvU2VsZWN0b3JQYXJzZXIuamogYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL1NlbGVjdG9yUGFyc2VyLmpqCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDA2NDk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvU2VsZWN0b3JQYXJzZXIuamoKKysrIC9kZXYvbnVsbApAQCAtMSw1NzggKzAsMCBAQAotLyoqIAotICogPGEgaHJlZj0iaHR0cDovL2FjdGl2ZW1xLm9yZyI+QWN0aXZlTVE6IFRoZSBPcGVuIFNvdXJjZSBNZXNzYWdlIEZhYnJpYzwvYT4KLSAqCi0gKiBDb3B5cmlnaHQgMjAwNCBIaXJhbSBDaGlyaW5vCi0gKiBDb3B5cmlnaHQgMjAwNCBQcm90aXF1ZSBMdGQKLSAqIAotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICogCi0gKiovCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE9QVElPTlMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLW9wdGlvbnMgewotICBTVEFUSUMgPSB0cnVlOwotICBVTklDT0RFX0lOUFVUID0gZmFsc2U7Ci0gIAotICAgLy9zb21lIHBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMKLSAgT1BUSU1JWkVfVE9LRU5fTUFOQUdFUiA9IGZhbHNlOwotICBFUlJPUl9SRVBPUlRJTkcgPSB0cnVlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQQVJTRVIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUEFSU0VSX0JFR0lOKFNlbGVjdG9yUGFyc2VyKQotCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLQotaW1wb3J0IGphdmF4Lmptcy5JbnZhbGlkU2VsZWN0b3JFeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYWN0aXZlbXEuZmlsdGVyLio7Ci0KLS8qKiAKLSAqIEpNUyBTZWxlY3RvciBQYXJzZXIgZ2VuZXJhdGVkIGJ5IEphdmFDQwotICogCi0gKiBEbyBub3QgZWRpdCB0aGlzIC5qYXZhIGZpbGUgZGlyZWN0bHkgLSBpdCBpcyBhdXRvZ2VuZXJhdGVkIGZyb20gU2VsZWN0b3JQYXJzZXIuamoKLSAqLwotcHVibGljIGNsYXNzIFNlbGVjdG9yUGFyc2VyIHsKLQotICAgIHB1YmxpYyBTZWxlY3RvclBhcnNlcigpIHsKLSAgICAgICAgdGhpcyhuZXcgU3RyaW5nUmVhZGVyKCIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uIHBhcnNlKFN0cmluZyBzcWwpIHRocm93cyBJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24gewotICAgICAgICB0aGlzLlJlSW5pdChuZXcgU3RyaW5nUmVhZGVyKHNxbCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5KbXNTZWxlY3RvcigpOwotICAgICAgICB9IAotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIGUpIHsKLQkgICAgICAgIHRocm93IChJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24pbmV3IEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbigidGVzdCIpLmluaXRDYXVzZShlKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBCb29sZWFuRXhwcmVzc2lvbiBhc0Jvb2xlYW5FeHByZXNzaW9uKEV4cHJlc3Npb24gdmFsdWUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiAgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuRXhwcmVzc2lvbikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvcGVydHlFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZUJvb2xlYW5DYXN0KCB2YWx1ZSApOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiRXhwcmVzc2lvbiB3aWxsIG5vdCByZXN1bHQgaW4gYSBib29sZWFuIHZhbHVlOiAiICsgdmFsdWUpOwotICAgIH0KLSAgICAKLQotfQotCi1QQVJTRVJfRU5EKFNlbGVjdG9yUGFyc2VyKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUb2tlbnMKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLyogV2hpdGUgU3BhY2UgKi8KLVNQRUNJQUxfVE9LRU4gOgotewotICAiICIgfCAiXHQiIHwgIlxuIiB8ICJcciIgfCAiXGYiCi19Ci0KLS8qIENvbW1lbnRzICovCi1TS0lQOgotewotICA8TElORV9DT01NRU5UOiAiLS0iICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIikgPgotfQotCi1TS0lQOgotewotICA8QkxPQ0tfQ09NTUVOVDogIi8qIiAoflsiKiJdKSogIioiICgiKiIgfCAoflsiKiIsIi8iXSAoflsiKiJdKSogIioiKSkqICIvIj4KLX0KLQotLyogUmVzZXJ2ZWQgV29yZHMgKi8KLVRPS0VOIFtJR05PUkVfQ0FTRV0gOgotewotICAgIDwgIE5PVCAgICAgOiAiTk9UIj4KLSAgfCA8ICBBTkQgICAgIDogIkFORCI+Ci0gIHwgPCAgT1IgICAgICA6ICJPUiI+Ci0gIHwgPCAgQkVUV0VFTiA6ICJCRVRXRUVOIj4KLSAgfCA8ICBMSUtFICAgIDogIkxJS0UiPgotICB8IDwgIEVTQ0FQRSAgOiAiRVNDQVBFIj4KLSAgfCA8ICBJTiAgICAgIDogIklOIj4KLSAgfCA8ICBJUyAgICAgIDogIklTIj4KLSAgfCA8ICBUUlVFICAgIDogIlRSVUUiID4KLSAgfCA8ICBGQUxTRSAgIDogIkZBTFNFIiA+Ci0gIHwgPCAgTlVMTCAgICA6ICJOVUxMIiA+Ci0gIHwgPCAgWFBBVEggICA6ICJYUEFUSCIgPgotICB8IDwgIFhRVUVSWSAgOiAiWFFVRVJZIiA+Ci19Ci0KLS8qIExpdGVyYWxzICovCi1UT0tFTiBbSUdOT1JFX0NBU0VdIDoKLXsKLQotICAgIDwgREVDSU1BTF9MSVRFUkFMOiBbIjEiLSI5Il0gKFsiMCItIjkiXSkqIChbImwiLCJMIl0pPyA+Ci0gIHwgPCBIRVhfTElURVJBTDogIjAiIFsieCIsIlgiXSAoWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSkrID4KLSAgfCA8IE9DVEFMX0xJVEVSQUw6ICIwIiAoWyIwIi0iNyJdKSogPiAgCi0gIHwgPCBGTE9BVElOR19QT0lOVF9MSVRFUkFMOiAgCQkgIAotICAgICAgICAgIChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gLy8gbWF0Y2hlczogNS41IG9yIDUuIG9yIDUuNUUxMCBvciA1LkUxMAotICAgICAgICB8ICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAgICAgICAgICAgICAgLy8gbWF0Y2hlczogLjUgb3IgLjVFMTAKLSAgICAgICAgfCAoWyIwIi0iOSJdKSsgPEVYUE9ORU5UPiAgICAgICAgICAgICAgICAgICAgIC8vIG1hdGNoZXM6IDVFMTAKLSAgICA+Ci0gIHwgPCAjRVhQT05FTlQ6ICJFIiAoWyIrIiwiLSJdKT8gKFsiMCItIjkiXSkrID4KLSAgfCA8IFNUUklOR19MSVRFUkFMOiAiJyIgKCAoIicnIikgfCB+WyInIl0gKSogICInIiA+Ci19Ci0KLVRPS0VOIFtJR05PUkVfQ0FTRV0gOgotewotICAgIDwgSUQgOiBbImEiLSJ6IiwgIl8iLCAiJCJdIChbImEiLSJ6IiwiMCItIjkiLCJfIiwgIiQiXSkqID4KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR3JhbW1lcgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQm9vbGVhbkV4cHJlc3Npb24gSm1zU2VsZWN0b3IoKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci19Ci17Ci0gICAgKAotICAgICAgICBsZWZ0ID0gb3JFeHByZXNzaW9uKCkKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCk7Ci0gICAgfQotCi19Ci0KLUV4cHJlc3Npb24gb3JFeHByZXNzaW9uKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IGFuZEV4cHJlc3Npb24oKSAKLSAgICAgICAgKCAKLSAgICAgICAgICAgIDxPUj4gcmlnaHQgPSBhbmRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IExvZ2ljRXhwcmVzc2lvbi5jcmVhdGVPUihhc0Jvb2xlYW5FeHByZXNzaW9uKGxlZnQpLCBhc0Jvb2xlYW5FeHByZXNzaW9uKHJpZ2h0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICkqCi0gICAgKSAKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLQotfQotCi0KLUV4cHJlc3Npb24gYW5kRXhwcmVzc2lvbigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBlcXVhbGl0eUV4cHJlc3Npb24oKSAKLSAgICAgICAgKCAKLSAgICAgICAgICAgIDxBTkQ+IHJpZ2h0ID0gZXF1YWxpdHlFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IExvZ2ljRXhwcmVzc2lvbi5jcmVhdGVBTkQoYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSwgYXNCb29sZWFuRXhwcmVzc2lvbihyaWdodCkpOwotICAgICAgICAgICAgfQotICAgICAgICApKgotICAgICkgCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLUV4cHJlc3Npb24gZXF1YWxpdHlFeHByZXNzaW9uKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCkgCi0gICAgICAgICggCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICI9IiByaWdodCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCkgCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgICI8PiIgcmlnaHQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RFcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB8ICAgICAgICAgICAgCi0gICAgICAgICAgICBMT09LQUhFQUQoMikKLSAgICAgICAgICAgIDxJUz4gPE5VTEw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUlzTnVsbChsZWZ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgIDxJUz4gPE5PVD4gPE5VTEw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUlzTm90TnVsbChsZWZ0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKSoKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi1FeHByZXNzaW9uIGNvbXBhcmlzb25FeHByZXNzaW9uKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIEV4cHJlc3Npb24gbG93OwotICAgIEV4cHJlc3Npb24gaGlnaDsKLSAgICBTdHJpbmcgdCwgdTsKLQlib29sZWFuIG5vdDsKLQlBcnJheUxpc3QgbGlzdDsKLX0KLXsKLSAgICAoCi0gICAgICAgIGxlZnQgPSBhZGRFeHByZXNzaW9uKCkgCi0gICAgICAgICggCi0gICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiPiIgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlR3JlYXRlclRoYW4obGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiPj0iIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUdyZWF0ZXJUaGFuRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiPCIgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGVzc1RoYW4obGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHwgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICAiPD0iIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpIAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUxlc3NUaGFuRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgfAotCQkJCXsKLQkJCQkJdT1udWxsOwotCQkJCX0gICAgICAgICAgIAkJCi0JCSAgICAgICAgPExJS0U+IHQgPSBzdHJpbmdMaXR0ZXJhbCgpIAotCQkgICAgICAgIAlbIDxFU0NBUEU+IHUgPSBzdHJpbmdMaXR0ZXJhbCgpIF0KLQkJICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMaWtlKGxlZnQsIHQsIHUpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgfAotCSAgICAgICAgCUxPT0tBSEVBRCgyKQotCQkJCXsKLQkJCQkJdT1udWxsOwotCQkJCX0gICAgICAgICAgIAkJCi0JCSAgICAgICAgPE5PVD4gPExJS0U+IHQgPSBzdHJpbmdMaXR0ZXJhbCgpIFsgPEVTQ0FQRT4gdSA9IHN0cmluZ0xpdHRlcmFsKCkgXQotCQkgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdExpa2UobGVmdCwgdCwgdSk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgfAotCQkgICAgICAgIDxCRVRXRUVOPiBsb3cgPSBhZGRFeHByZXNzaW9uKCkgPEFORD4gaGlnaCA9IGFkZEV4cHJlc3Npb24oKQotCQkgICAgICAgIHsKLQkJCQkJbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUJldHdlZW4obGVmdCwgbG93LCBoaWdoKTsKLQkJICAgICAgICB9Ci0JICAgICAgICB8Ci0JICAgICAgICAJTE9PS0FIRUFEKDIpCi0JCSAgICAgICAgPE5PVD4gPEJFVFdFRU4+IGxvdyA9IGFkZEV4cHJlc3Npb24oKSA8QU5EPiBoaWdoID0gYWRkRXhwcmVzc2lvbigpCi0JCSAgICAgICAgewotCQkJCQlsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90QmV0d2VlbihsZWZ0LCBsb3csIGhpZ2gpOwotCQkgICAgICAgIH0KLSAgICAgICAgICAgIHwKLQkJCQk8SU4+IAotCQkgICAgICAgICIoIiAKLQkJICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCkKLQkJICAgICAgICAgICAgewotCQkJICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLQkJCSAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0JCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgKCAKLQkJCSAgICAgICAgCSIsIgotCQkJICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCkgCi0JCQkgICAgICAgICAgICB7Ci0JCQkJICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLQkJCSAgICAgICAgICAgIH0KLQkJCSAgICAgICAgCQotCQkJICAgICAgICApKgotCQkgICAgICAgICIpIgotCQkgICAgICAgIHsKLQkJICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSW5GaWx0ZXIobGVmdCwgbGlzdCk7Ci0JCSAgICAgICAgfQotICAgICAgICAgICAgfAotCSAgICAgICAgCUxPT0tBSEVBRCgyKQotCSAgICAgICAgICAgIDxOT1Q+IDxJTj4gCi0JCSAgICAgICAgIigiIAotCQkgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKQotCQkgICAgICAgICAgICB7Ci0JCQkgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotCQkJICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAoIAotCQkJICAgICAgICAJIiwiCi0JCQkgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKSAKLQkJCSAgICAgICAgICAgIHsKLQkJCQkgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotCQkJICAgICAgICAgICAgfQotCQkJICAgICAgICAJCi0JCQkgICAgICAgICkqCi0JCSAgICAgICAgIikiCi0JCSAgICAgICAgewotCQkgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVOb3RJbkZpbHRlcihsZWZ0LCBsaXN0KTsKLQkJICAgICAgICB9Ci0gICAgICAgICAgICAKLSAgICAgICAgKSoKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi1FeHByZXNzaW9uIGFkZEV4cHJlc3Npb24oKSA6Ci17Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci19Ci17Ci0gICAgbGVmdCA9IG11bHRFeHByKCkgCi0gICAgKCAKLQkgICAgTE9PS0FIRUFEKCAoIisifCItIikgbXVsdEV4cHIoKSkKLQkgICAgKAotCSAgICAgICAgIisiIHJpZ2h0ID0gbXVsdEV4cHIoKSAKLQkgICAgICAgIHsKLQkgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlUGx1cyhsZWZ0LCByaWdodCk7Ci0JICAgICAgICB9Ci0JICAgICAgICB8ICAgICAgICAgICAgCi0JICAgICAgICAiLSIgcmlnaHQgPSBtdWx0RXhwcigpIAotCSAgICAgICAgewotCSAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNaW51cyhsZWZ0LCByaWdodCk7Ci0JICAgICAgICB9Ci0gICAgICAgICkKLSAgICAgICAgCi0gICAgKSoKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotRXhwcmVzc2lvbiBtdWx0RXhwcigpIDoKLXsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLX0KLXsKLSAgICBsZWZ0ID0gdW5hcnlFeHByKCkgCi0gICAgKCAKLSAgICAgICAgIioiIHJpZ2h0ID0gdW5hcnlFeHByKCkgCi0gICAgICAgIHsKLQkgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNdWx0aXBseShsZWZ0LCByaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAiLyIgcmlnaHQgPSB1bmFyeUV4cHIoKSAKLSAgICAgICAgewotCSAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZURpdmlkZShsZWZ0LCByaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgfCAgICAgICAgICAgIAotICAgICAgICAiJSIgcmlnaHQgPSB1bmFyeUV4cHIoKSAKLSAgICAgICAgewotCSAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU1vZChsZWZ0LCByaWdodCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgKSoKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KLQotCi1FeHByZXNzaW9uIHVuYXJ5RXhwcigpIDoKLXsKLSAgICBTdHJpbmcgcz1udWxsOwotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotfQotewotCSgKLQkJTE9PS0FIRUFEKCAiKyIgdW5hcnlFeHByKCkgKQotCSAgICAiKyIgbGVmdD11bmFyeUV4cHIoKQotCSAgICB8Ci0JICAgICItIiBsZWZ0PXVuYXJ5RXhwcigpCi0JICAgIHsKLQkgICAgICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlTmVnYXRlKGxlZnQpOwotCSAgICB9Ci0JICAgIHwKLQkgICAgPE5PVD4gbGVmdD11bmFyeUV4cHIoKQotCSAgICB7Ci0JCSAgICBsZWZ0ID0gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZU5PVCggYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KSApOwotCSAgICB9Ci0JICAgIHwKLQkgICAgPFhQQVRIPiBzPXN0cmluZ0xpdHRlcmFsKCkKLQkgICAgewotCQkgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVYUGF0aCggcyApOwotCSAgICB9Ci0JICAgIHwKLQkgICAgPFhRVUVSWT4gcz1zdHJpbmdMaXR0ZXJhbCgpCi0JICAgIHsKLQkJICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlWFF1ZXJ5KCBzICk7Ci0JICAgIH0KLQkgICAgfAotCSAgICBsZWZ0ID0gcHJpbWFyeUV4cHIoKQotICAgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLQotfQotCi1FeHByZXNzaW9uIHByaW1hcnlFeHByKCkgOgotewotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotfQotewotICAgICgKLSAgICAgICAgbGVmdCA9IGxpdGVyYWwoKQotICAgICAgICB8Ci0gICAgICAgIGxlZnQgPSB2YXJpYWJsZSgpCi0gICAgICAgIHwKLSAgICAgICAgIigiIGxlZnQgPSBvckV4cHJlc3Npb24oKSAiKSIKLSAgICApIAotICAgIHsKLSAgICAgICAgcmV0dXJuIGxlZnQ7Ci0gICAgfQotfQotCi0KLQotQ29uc3RhbnRFeHByZXNzaW9uIGxpdGVyYWwoKSA6Ci17Ci0gICAgVG9rZW4gdDsKLSAgICBTdHJpbmcgczsKLSAgICBDb25zdGFudEV4cHJlc3Npb24gbGVmdD1udWxsOwotfQotewotICAgICgKLSAgICAgICAgKAotICAgICAgICAgICAgcyA9IHN0cmluZ0xpdHRlcmFsKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgdCA9IDxERUNJTUFMX0xJVEVSQUw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tRGVjaW1hbCh0LmltYWdlKTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIHQgPSA8SEVYX0xJVEVSQUw+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAJbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5jcmVhdGVGcm9tSGV4KHQuaW1hZ2UpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgdCA9IDxPQ1RBTF9MSVRFUkFMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgCWxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRnJvbU9jdGFsKHQuaW1hZ2UpOwotICAgICAgICAgICAgfSAgICAKLSAgICAgICAgKSAKLSAgICAgICAgfCAKLSAgICAgICAgKAotICAgICAgICAgICAgdCA9IDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgCWxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRmxvYXQodC5pbWFnZSk7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICA8VFJVRT4KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLlRSVUU7Ci0gICAgICAgICAgICB9ICAgIAotICAgICAgICApIAotICAgICAgICB8IAotICAgICAgICAoCi0gICAgICAgICAgICA8RkFMU0U+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbnN0YW50RXhwcmVzc2lvbi5GQUxTRTsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkgCi0gICAgICAgIHwgCi0gICAgICAgICgKLSAgICAgICAgICAgIDxOVUxMPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uTlVMTDsKLSAgICAgICAgICAgIH0gICAgCi0gICAgICAgICkKLSAgICApCi0gICAgewotICAgICAgICByZXR1cm4gbGVmdDsKLSAgICB9Ci19Ci0KLVN0cmluZyBzdHJpbmdMaXR0ZXJhbCgpIDoKLXsKLSAgICBUb2tlbiB0OwotICAgIFN0cmluZ0J1ZmZlciByYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBib29sZWFuIGZpcnN0PXRydWU7Ci19Ci17Ci0gICAgdCA9IDxTVFJJTkdfTElURVJBTD4gCi0gICAgewotICAgIAkvLyBEZWNvZGUgdGhlIHN0aW5nIHZhbHVlLgotICAgIAlTdHJpbmcgaW1hZ2UgPSB0LmltYWdlOwotICAgIAlmb3IoIGludCBpPTE7IGkgPCBpbWFnZS5sZW5ndGgoKS0xOyBpKysgKSB7Ci0gICAgCQljaGFyIGMgPSBpbWFnZS5jaGFyQXQoaSk7Ci0gICAgCQlpZiggYyA9PSAnXCcnICkKLSAgICAJCQlpKys7ICAgIAkJCQotICAgCQkJcmMuYXBwZW5kKGMpOwotICAgIAl9Ci0JICAgIHJldHVybiByYy50b1N0cmluZygpOwotICAgIH0gICAgCi19Ci0KLVByb3BlcnR5RXhwcmVzc2lvbiB2YXJpYWJsZSgpIDoKLXsKLSAgICBUb2tlbiB0OwotICAgIFByb3BlcnR5RXhwcmVzc2lvbiBsZWZ0PW51bGw7Ci19Ci17Ci0gICAgKCAKLSAgICAgICAgdCA9IDxJRD4gCi0gICAgICAgIHsKLSAgICAgICAgICAgIGxlZnQgPSBuZXcgUHJvcGVydHlFeHByZXNzaW9uKHQuaW1hZ2UpOwotICAgICAgICB9ICAgIAotICAgICkKLSAgICB7Ci0gICAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9QYXJzZUV4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvUGFyc2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzVhMjYzMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9QYXJzZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gUGFyc2VFeGNlcHRpb24uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KLSAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5Ci0gKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCi0gKiBwYXJzZXIuCi0gKgotICogWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyB0byBjdXN0b21pemUgeW91ciBlcnJvciByZXBvcnRpbmcKLSAqIG1lY2hhbmlzbXMgc28gbG9uZyBhcyB5b3UgcmV0YWluIHRoZSBwdWJsaWMgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotCi0gIC8qKgotICAgKiBUaGlzIGNvbnN0cnVjdG9yIGlzIHVzZWQgYnkgdGhlIG1ldGhvZCAiZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiIKLSAgICogaW4gdGhlIGdlbmVyYXRlZCBwYXJzZXIuICBDYWxsaW5nIHRoaXMgY29uc3RydWN0b3IgZ2VuZXJhdGVzCi0gICAqIGEgbmV3IG9iamVjdCBvZiB0aGlzIHR5cGUgd2l0aCB0aGUgZmllbGRzICJjdXJyZW50VG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgc2V0LiAgVGhlIGJvb2xlYW4KLSAgICogZmxhZyAic3BlY2lhbENvbnN0cnVjdG9yIiBpcyBhbHNvIHNldCB0byB0cnVlIHRvIGluZGljYXRlIHRoYXQKLSAgICogdGhpcyBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUgdGhpcyBvYmplY3QuCi0gICAqIFRoaXMgY29uc3RydWN0b3IgY2FsbHMgaXRzIHN1cGVyIGNsYXNzIHdpdGggdGhlIGVtcHR5IHN0cmluZwotICAgKiB0byBmb3JjZSB0aGUgInRvU3RyaW5nIiBtZXRob2Qgb2YgcGFyZW50IGNsYXNzICJUaHJvd2FibGUiIHRvCi0gICAqIHByaW50IHRoZSBlcnJvciBtZXNzYWdlIGluIHRoZSBmb3JtOgotICAgKiAgICAgUGFyc2VFeGNlcHRpb246IDxyZXN1bHQgb2YgZ2V0TWVzc2FnZT4KLSAgICovCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihUb2tlbiBjdXJyZW50VG9rZW5WYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnRbXVtdIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsCi0gICAgICAgICAgICAgICAgICAgICAgICkKLSAgewotICAgIHN1cGVyKCIiKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSB0cnVlOwotICAgIGN1cnJlbnRUb2tlbiA9IGN1cnJlbnRUb2tlblZhbDsKLSAgICBleHBlY3RlZFRva2VuU2VxdWVuY2VzID0gZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1ZhbDsKLSAgICB0b2tlbkltYWdlID0gdG9rZW5JbWFnZVZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgZm9sbG93aW5nIGNvbnN0cnVjdG9ycyBhcmUgZm9yIHVzZSBieSB5b3UgZm9yIHdoYXRldmVyCi0gICAqIHB1cnBvc2UgeW91IGNhbiB0aGluayBvZi4gIENvbnN0cnVjdGluZyB0aGUgZXhjZXB0aW9uIGluIHRoaXMKLSAgICogbWFubmVyIG1ha2VzIHRoZSBleGNlcHRpb24gYmVoYXZlIGluIHRoZSBub3JtYWwgd2F5IC0gaS5lLiwgYXMKLSAgICogZG9jdW1lbnRlZCBpbiB0aGUgY2xhc3MgIlRocm93YWJsZSIuICBUaGUgZmllbGRzICJlcnJvclRva2VuIiwKLSAgICogImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiLCBhbmQgInRva2VuSW1hZ2UiIGRvIG5vdCBjb250YWluCi0gICAqIHJlbGV2YW50IGluZm9ybWF0aW9uLiAgVGhlIEphdmFDQyBnZW5lcmF0ZWQgY29kZSBkb2VzIG5vdCB1c2UKLSAgICogdGhlc2UgY29uc3RydWN0b3JzLgotICAgKi8KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgc3VwZXIoKTsKLSAgICBzcGVjaWFsQ29uc3RydWN0b3IgPSBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgdmFyaWFibGUgZGV0ZXJtaW5lcyB3aGljaCBjb25zdHJ1Y3RvciB3YXMgdXNlZCB0byBjcmVhdGUKLSAgICogdGhpcyBvYmplY3QgYW5kIHRoZXJlYnkgYWZmZWN0cyB0aGUgc2VtYW50aWNzIG9mIHRoZQotICAgKiAiZ2V0TWVzc2FnZSIgbWV0aG9kIChzZWUgYmVsb3cpLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gc3BlY2lhbENvbnN0cnVjdG9yOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIHRoZSBsYXN0IHRva2VuIHRoYXQgaGFzIGJlZW4gY29uc3VtZWQgc3VjY2Vzc2Z1bGx5LiAgSWYKLSAgICogdGhpcyBvYmplY3QgaGFzIGJlZW4gY3JlYXRlZCBkdWUgdG8gYSBwYXJzZSBlcnJvciwgdGhlIHRva2VuCi0gICAqIGZvbGxvd25nIHRoaXMgdG9rZW4gd2lsbCAodGhlcmVmb3JlKSBiZSB0aGUgZmlyc3QgZXJyb3IgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgVG9rZW4gY3VycmVudFRva2VuOwotCi0gIC8qKgotICAgKiBFYWNoIGVudHJ5IGluIHRoaXMgYXJyYXkgaXMgYW4gYXJyYXkgb2YgaW50ZWdlcnMuICBFYWNoIGFycmF5Ci0gICAqIG9mIGludGVnZXJzIHJlcHJlc2VudHMgYSBzZXF1ZW5jZSBvZiB0b2tlbnMgKGJ5IHRoZWlyIG9yZGluYWwKLSAgICogdmFsdWVzKSB0aGF0IGlzIGV4cGVjdGVkIGF0IHRoaXMgcG9pbnQgb2YgdGhlIHBhcnNlLgotICAgKi8KLSAgcHVibGljIGludFtdW10gZXhwZWN0ZWRUb2tlblNlcXVlbmNlczsKLQotICAvKioKLSAgICogVGhpcyBpcyBhIHJlZmVyZW5jZSB0byB0aGUgInRva2VuSW1hZ2UiIGFycmF5IG9mIHRoZSBnZW5lcmF0ZWQKLSAgICogcGFyc2VyIHdpdGhpbiB3aGljaCB0aGUgcGFyc2UgZXJyb3Igb2NjdXJyZWQuICBUaGlzIGFycmF5IGlzCi0gICAqIGRlZmluZWQgaW4gdGhlIGdlbmVyYXRlZCAuLi5Db25zdGFudHMgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIFN0cmluZ1tdIHRva2VuSW1hZ2U7Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGhhcyB0aGUgc3RhbmRhcmQgYmVoYXZpb3Igd2hlbiB0aGlzIG9iamVjdCBoYXMgYmVlbgotICAgKiBjcmVhdGVkIHVzaW5nIHRoZSBzdGFuZGFyZCBjb25zdHJ1Y3RvcnMuICBPdGhlcndpc2UsIGl0IHVzZXMKLSAgICogImN1cnJlbnRUb2tlbiIgYW5kICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiB0byBnZW5lcmF0ZSBhIHBhcnNlCi0gICAqIGVycm9yIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuICBJZiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkCi0gICAqIGR1ZSB0byBhIHBhcnNlIGVycm9yLCBhbmQgeW91IGRvIG5vdCBjYXRjaCBpdCAoaXQgZ2V0cyB0aHJvd24KLSAgICogZnJvbSB0aGUgcGFyc2VyKSwgdGhlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQgZHVyaW5nIHRoZSBwcmludGluZwotICAgKiBvZiB0aGUgZmluYWwgc3RhY2sgdHJhY2UsIGFuZCBoZW5jZSB0aGUgY29ycmVjdCBlcnJvciBtZXNzYWdlCi0gICAqIGdldHMgZGlzcGxheWVkLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBnZXRNZXNzYWdlKCkgewotICAgIGlmICghc3BlY2lhbENvbnN0cnVjdG9yKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgICBTdHJpbmcgZXhwZWN0ZWQgPSAiIjsKLSAgICBpbnQgbWF4U2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAobWF4U2l6ZSA8IGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV0ubGVuZ3RoKSB7Ci0gICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGg7IGorKykgewotICAgICAgICBleHBlY3RlZCArPSB0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dICsgIiAiOwotICAgICAgfQotICAgICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGggLSAxXSAhPSAwKSB7Ci0gICAgICAgIGV4cGVjdGVkICs9ICIuLi4iOwotICAgICAgfQotICAgICAgZXhwZWN0ZWQgKz0gZW9sICsgIiAgICAiOwotICAgIH0KLSAgICBTdHJpbmcgcmV0dmFsID0gIkVuY291bnRlcmVkIFwiIjsKLSAgICBUb2tlbiB0b2sgPSBjdXJyZW50VG9rZW4ubmV4dDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1heFNpemU7IGkrKykgewotICAgICAgaWYgKGkgIT0gMCkgcmV0dmFsICs9ICIgIjsKLSAgICAgIGlmICh0b2sua2luZCA9PSAwKSB7Ci0gICAgICAgIHJldHZhbCArPSB0b2tlbkltYWdlWzBdOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOwotICAgICAgdG9rID0gdG9rLm5leHQ7IAotICAgIH0KLSAgICByZXR2YWwgKz0gIlwiIGF0IGxpbmUgIiArIGN1cnJlbnRUb2tlbi5uZXh0LmJlZ2luTGluZSArICIsIGNvbHVtbiAiICsgY3VycmVudFRva2VuLm5leHQuYmVnaW5Db2x1bW47Ci0gICAgcmV0dmFsICs9ICIuIiArIGVvbDsKLSAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGggPT0gMSkgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHZhbCArPSAiV2FzIGV4cGVjdGluZyBvbmUgb2Y6IiArIGVvbCArICIgICAgIjsKLSAgICB9Ci0gICAgcmV0dmFsICs9IGV4cGVjdGVkOwotICAgIHJldHVybiByZXR2YWw7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0gCi0gIC8qKgotICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCi0gICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQotICAgKiBzdHJpbmcgbGl0ZXJhbC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikgewotICAgICAgU3RyaW5nQnVmZmVyIHJldHZhbCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgIGNoYXIgY2g7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0ci5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgICAgewotICAgICAgICAgICBjYXNlIDAgOgotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1x0JzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcbiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xyJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcIic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBpZiAoKGNoID0gc3RyLmNoYXJBdChpKSkgPCAweDIwIHx8IGNoID4gMHg3ZSkgewotICAgICAgICAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoY2gpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZWI1OTU4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NlbGVjdG9yUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2VsZWN0b3JQYXJzZXIuamF2YSAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLio7Ci1pbXBvcnQgamF2YS51dGlsLio7Ci0KLWltcG9ydCBqYXZheC5qbXMuSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFjdGl2ZW1xLmZpbHRlci4qOwotCi0vKiogCi0gKiBKTVMgU2VsZWN0b3IgUGFyc2VyIGdlbmVyYXRlZCBieSBKYXZhQ0MKLSAqIAotICogRG8gbm90IGVkaXQgdGhpcyAuamF2YSBmaWxlIGRpcmVjdGx5IC0gaXQgaXMgYXV0b2dlbmVyYXRlZCBmcm9tIFNlbGVjdG9yUGFyc2VyLmpqCi0gKi8KLXB1YmxpYyBjbGFzcyBTZWxlY3RvclBhcnNlciBpbXBsZW1lbnRzIFNlbGVjdG9yUGFyc2VyQ29uc3RhbnRzIHsKLQotICAgIHB1YmxpYyBTZWxlY3RvclBhcnNlcigpIHsKLSAgICAgICAgdGhpcyhuZXcgU3RyaW5nUmVhZGVyKCIiKSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xlYW5FeHByZXNzaW9uIHBhcnNlKFN0cmluZyBzcWwpIHRocm93cyBJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24gewotICAgICAgICB0aGlzLlJlSW5pdChuZXcgU3RyaW5nUmVhZGVyKHNxbCkpOwotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5KbXNTZWxlY3RvcigpOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAgICAgICAgIHRocm93IChJbnZhbGlkU2VsZWN0b3JFeGNlcHRpb24pbmV3IEludmFsaWRTZWxlY3RvckV4Y2VwdGlvbigidGVzdCIpLmluaXRDYXVzZShlKTsKLSAgICAgICAgfQotCi0gICAgfQotCi0gICAgcHJpdmF0ZSBCb29sZWFuRXhwcmVzc2lvbiBhc0Jvb2xlYW5FeHByZXNzaW9uKEV4cHJlc3Npb24gdmFsdWUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiAgewotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuRXhwcmVzc2lvbikgewotICAgICAgICAgICAgcmV0dXJuIChCb29sZWFuRXhwcmVzc2lvbikgdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUHJvcGVydHlFeHByZXNzaW9uKSB7Ci0gICAgICAgICAgICByZXR1cm4gVW5hcnlFeHByZXNzaW9uLmNyZWF0ZUJvb2xlYW5DYXN0KCB2YWx1ZSApOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiRXhwcmVzc2lvbiB3aWxsIG5vdCByZXN1bHQgaW4gYSBib29sZWFuIHZhbHVlOiAiICsgdmFsdWUpOwotICAgIH0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR3JhbW1lcgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBmaW5hbCBwdWJsaWMgQm9vbGVhbkV4cHJlc3Npb24gSm1zU2VsZWN0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotICAgIGxlZnQgPSBvckV4cHJlc3Npb24oKTsKLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gYXNCb29sZWFuRXhwcmVzc2lvbihsZWZ0KTt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIG9yRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgbGVmdCA9IGFuZEV4cHJlc3Npb24oKTsKLSAgICBsYWJlbF8xOgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgT1I6Ci0gICAgICAgIDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhayBsYWJlbF8xOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihPUik7Ci0gICAgICByaWdodCA9IGFuZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gTG9naWNFeHByZXNzaW9uLmNyZWF0ZU9SKGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCksIGFzQm9vbGVhbkV4cHJlc3Npb24ocmlnaHQpKTsKLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBhbmRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBsZWZ0ID0gZXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgbGFiZWxfMjoKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEFORDoKLSAgICAgICAgOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrIGxhYmVsXzI7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEFORCk7Ci0gICAgICByaWdodCA9IGVxdWFsaXR5RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBMb2dpY0V4cHJlc3Npb24uY3JlYXRlQU5EKGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCksIGFzQm9vbGVhbkV4cHJlc3Npb24ocmlnaHQpKTsKLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgRXhwcmVzc2lvbiBlcXVhbGl0eUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIGxlZnQgPSBjb21wYXJpc29uRXhwcmVzc2lvbigpOwotICAgIGxhYmVsXzM6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBJUzoKLSAgICAgIGNhc2UgMjg6Ci0gICAgICBjYXNlIDI5OgotICAgICAgICA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWsgbGFiZWxfMzsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSAyODoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigyOCk7Ci0gICAgICAgIHJpZ2h0ID0gY29tcGFyaXNvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlRXF1YWwobGVmdCwgcmlnaHQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMjk6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMjkpOwotICAgICAgICByaWdodCA9IGNvbXBhcmlzb25FeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZU5vdEVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoampfMl8xKDIpKSB7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihJUyk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihOVUxMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSXNOdWxsKGxlZnQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgSVM6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElTKTsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTk9UKTsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTlVMTCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUlzTm90TnVsbChsZWZ0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIGNvbXBhcmlzb25FeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBFeHByZXNzaW9uIGxlZnQ7Ci0gICAgRXhwcmVzc2lvbiByaWdodDsKLSAgICBFeHByZXNzaW9uIGxvdzsKLSAgICBFeHByZXNzaW9uIGhpZ2g7Ci0gICAgU3RyaW5nIHQsIHU7Ci0gICAgICAgIGJvb2xlYW4gbm90OwotICAgICAgICBBcnJheUxpc3QgbGlzdDsKLSAgICBsZWZ0ID0gYWRkRXhwcmVzc2lvbigpOwotICAgIGxhYmVsXzQ6Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBOT1Q6Ci0gICAgICBjYXNlIEJFVFdFRU46Ci0gICAgICBjYXNlIExJS0U6Ci0gICAgICBjYXNlIElOOgotICAgICAgY2FzZSAzMDoKLSAgICAgIGNhc2UgMzE6Ci0gICAgICBjYXNlIDMyOgotICAgICAgY2FzZSAzMzoKLSAgICAgICAgOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrIGxhYmVsXzQ7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMzA6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzApOwotICAgICAgICByaWdodCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IENvbXBhcmlzb25FeHByZXNzaW9uLmNyZWF0ZUdyZWF0ZXJUaGFuKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDMxOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDMxKTsKLSAgICAgICAgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVHcmVhdGVyVGhhbkVxdWFsKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDMyOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDMyKTsKLSAgICAgICAgcmlnaHQgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMZXNzVGhhbihsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzMzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzMyk7Ci0gICAgICAgIHJpZ2h0ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTGVzc1RoYW5FcXVhbChsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMSUtFOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHU9bnVsbDsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMSUtFKTsKLSAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVTQ0FQRToKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVTQ0FQRSk7Ci0gICAgICAgICAgdSA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBDb21wYXJpc29uRXhwcmVzc2lvbi5jcmVhdGVMaWtlKGxlZnQsIHQsIHUpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChqal8yXzIoMikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1PW51bGw7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTElLRSk7Ci0gICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBFU0NBUEU6Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVTQ0FQRSk7Ci0gICAgICAgICAgICB1ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90TGlrZShsZWZ0LCB0LCB1KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIEJFVFdFRU46Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEJFVFdFRU4pOwotICAgICAgICAgICAgbG93ID0gYWRkRXhwcmVzc2lvbigpOwotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihBTkQpOwotICAgICAgICAgICAgaGlnaCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlQmV0d2VlbihsZWZ0LCBsb3csIGhpZ2gpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlmIChqal8yXzMoMikpIHsKLSAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QpOwotICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEJFVFdFRU4pOwotICAgICAgICAgICAgICBsb3cgPSBhZGRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQU5EKTsKLSAgICAgICAgICAgICAgaGlnaCA9IGFkZEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90QmV0d2VlbihsZWZ0LCBsb3csIGhpZ2gpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgICAgIGNhc2UgSU46Ci0gICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNCk7Ci0gICAgICAgICAgICAgICAgdCA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLSAgICAgICAgICAgICAgICBsYWJlbF81OgotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgICAgICAgIDsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhayBsYWJlbF81OwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNSk7Ci0gICAgICAgICAgICAgICAgICB0ID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5hZGQoIHQgKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlSW5GaWx0ZXIobGVmdCwgbGlzdCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaWYgKGpqXzJfNCgyKSkgewotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihOT1QpOwotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihJTik7Ci0gICAgICAgICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM0KTsKLSAgICAgICAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3QuYWRkKCB0ICk7Ci0gICAgICAgICAgICAgICAgICBsYWJlbF82OgotICAgICAgICAgICAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgICAgICAgICAgOwotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgIGJyZWFrIGxhYmVsXzY7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNSk7Ci0gICAgICAgICAgICAgICAgICAgIHQgPSBzdHJpbmdMaXR0ZXJhbCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0LmFkZCggdCApOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbigzNik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQ29tcGFyaXNvbkV4cHJlc3Npb24uY3JlYXRlTm90SW5GaWx0ZXIobGVmdCwgbGlzdCk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gYWRkRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgRXhwcmVzc2lvbiBsZWZ0OwotICAgIEV4cHJlc3Npb24gcmlnaHQ7Ci0gICAgbGVmdCA9IG11bHRFeHByKCk7Ci0gICAgbGFiZWxfNzoKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKGpqXzJfNSgyMTQ3NDgzNjQ3KSkgewotICAgICAgICA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBicmVhayBsYWJlbF83OwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDM3OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM3KTsKLSAgICAgICAgcmlnaHQgPSBtdWx0RXhwcigpOwotICAgICAgICAgICAgICAgICAgICBsZWZ0ID0gQXJpdGhtZXRpY0V4cHJlc3Npb24uY3JlYXRlUGx1cyhsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAzODoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigzOCk7Ci0gICAgICAgIHJpZ2h0ID0gbXVsdEV4cHIoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU1pbnVzKGxlZnQsIHJpZ2h0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gbXVsdEV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdDsKLSAgICBFeHByZXNzaW9uIHJpZ2h0OwotICAgIGxlZnQgPSB1bmFyeUV4cHIoKTsKLSAgICBsYWJlbF84OgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMzk6Ci0gICAgICBjYXNlIDQwOgotICAgICAgY2FzZSA0MToKLSAgICAgICAgOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrIGxhYmVsXzg7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgMzk6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMzkpOwotICAgICAgICByaWdodCA9IHVuYXJ5RXhwcigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBBcml0aG1ldGljRXhwcmVzc2lvbi5jcmVhdGVNdWx0aXBseShsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0MDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbig0MCk7Ci0gICAgICAgIHJpZ2h0ID0gdW5hcnlFeHByKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZURpdmlkZShsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0MToKLSAgICAgICAgampfY29uc3VtZV90b2tlbig0MSk7Ci0gICAgICAgIHJpZ2h0ID0gdW5hcnlFeHByKCk7Ci0gICAgICAgICAgICAgICAgbGVmdCA9IEFyaXRobWV0aWNFeHByZXNzaW9uLmNyZWF0ZU1vZChsZWZ0LCByaWdodCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBFeHByZXNzaW9uIHVuYXJ5RXhwcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHM9bnVsbDsKLSAgICBFeHByZXNzaW9uIGxlZnQ9bnVsbDsKLSAgICBpZiAoampfMl82KDIxNDc0ODM2NDcpKSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKDM3KTsKLSAgICAgIGxlZnQgPSB1bmFyeUV4cHIoKTsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIDM4OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKDM4KTsKLSAgICAgICAgbGVmdCA9IHVuYXJ5RXhwcigpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlTmVnYXRlKGxlZnQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTk9UOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE5PVCk7Ci0gICAgICAgIGxlZnQgPSB1bmFyeUV4cHIoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVOT1QoIGFzQm9vbGVhbkV4cHJlc3Npb24obGVmdCkgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhQQVRIOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFhQQVRIKTsKLSAgICAgICAgcyA9IHN0cmluZ0xpdHRlcmFsKCk7Ci0gICAgICAgICAgICAgICAgICAgIGxlZnQgPSBVbmFyeUV4cHJlc3Npb24uY3JlYXRlWFBhdGgoIHMgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhRVUVSWToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihYUVVFUlkpOwotICAgICAgICBzID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICAgICAgbGVmdCA9IFVuYXJ5RXhwcmVzc2lvbi5jcmVhdGVYUXVlcnkoIHMgKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgSUQ6Ci0gICAgICBjYXNlIDM0OgotICAgICAgICBsZWZ0ID0gcHJpbWFyeUV4cHIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIEV4cHJlc3Npb24gcHJpbWFyeUV4cHIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEV4cHJlc3Npb24gbGVmdD1udWxsOwotICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgIGNhc2UgVFJVRToKLSAgICBjYXNlIEZBTFNFOgotICAgIGNhc2UgTlVMTDoKLSAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGxlZnQgPSBsaXRlcmFsKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIElEOgotICAgICAgbGVmdCA9IHZhcmlhYmxlKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM0OgotICAgICAgampfY29uc3VtZV90b2tlbigzNCk7Ci0gICAgICBsZWZ0ID0gb3JFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKDM2KTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAgICAge2lmICh0cnVlKSByZXR1cm4gbGVmdDt9Ci0gICAgdGhyb3cgbmV3IEVycm9yKCJNaXNzaW5nIHJldHVybiBzdGF0ZW1lbnQgaW4gZnVuY3Rpb24iKTsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyBDb25zdGFudEV4cHJlc3Npb24gbGl0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgVG9rZW4gdDsKLSAgICBTdHJpbmcgczsKLSAgICBDb25zdGFudEV4cHJlc3Npb24gbGVmdD1udWxsOwotICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBzID0gc3RyaW5nTGl0dGVyYWwoKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gbmV3IENvbnN0YW50RXhwcmVzc2lvbihzKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oREVDSU1BTF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21EZWNpbWFsKHQuaW1hZ2UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEhFWF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21IZXgodC5pbWFnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICB0ID0gampfY29uc3VtZV90b2tlbihPQ1RBTF9MSVRFUkFMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLmNyZWF0ZUZyb21PY3RhbCh0LmltYWdlKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uY3JlYXRlRmxvYXQodC5pbWFnZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFRSVUU6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFRSVUUpOwotICAgICAgICAgICAgICAgIGxlZnQgPSBDb25zdGFudEV4cHJlc3Npb24uVFJVRTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRkFMU0U6Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLkZBTFNFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBOVUxMOgotICAgICAgampfY29uc3VtZV90b2tlbihOVUxMKTsKLSAgICAgICAgICAgICAgICBsZWZ0ID0gQ29uc3RhbnRFeHByZXNzaW9uLk5VTEw7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIGxlZnQ7fQotICAgIHRocm93IG5ldyBFcnJvcigiTWlzc2luZyByZXR1cm4gc3RhdGVtZW50IGluIGZ1bmN0aW9uIik7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgU3RyaW5nIHN0cmluZ0xpdHRlcmFsKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBUb2tlbiB0OwotICAgIFN0cmluZ0J1ZmZlciByYyA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICBib29sZWFuIGZpcnN0PXRydWU7Ci0gICAgdCA9IGpqX2NvbnN1bWVfdG9rZW4oU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICAvLyBEZWNvZGUgdGhlIHN0aW5nIHZhbHVlLgotICAgICAgICBTdHJpbmcgaW1hZ2UgPSB0LmltYWdlOwotICAgICAgICBmb3IoIGludCBpPTE7IGkgPCBpbWFnZS5sZW5ndGgoKS0xOyBpKysgKSB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaW1hZ2UuY2hhckF0KGkpOwotICAgICAgICAgICAgICAgIGlmKCBjID09ICdcJycgKQotICAgICAgICAgICAgICAgICAgICAgICAgaSsrOwotICAgICAgICAgICAgICAgICAgICAgICAgcmMuYXBwZW5kKGMpOwotICAgICAgICB9Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHJldHVybiByYy50b1N0cmluZygpO30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFByb3BlcnR5RXhwcmVzc2lvbiB2YXJpYWJsZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgVG9rZW4gdDsKLSAgICBQcm9wZXJ0eUV4cHJlc3Npb24gbGVmdD1udWxsOwotICAgIHQgPSBqal9jb25zdW1lX3Rva2VuKElEKTsKLSAgICAgICAgICAgIGxlZnQgPSBuZXcgUHJvcGVydHlFeHByZXNzaW9uKHQuaW1hZ2UpOwotICAgICAgICB7aWYgKHRydWUpIHJldHVybiBsZWZ0O30KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8zKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzQoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM181KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl82KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDMyKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJRCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzU2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81NygpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE9SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzMSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzYpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQoKSB7Ci0gICAgaWYgKGpqXzNSXzI3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzMCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzQ5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81MCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNTEoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18yKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81NCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18zKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM180KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMygpIHsKLSAgICBpZiAoampfM1JfMjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQzKCkgewotICAgIGlmIChqal8zUl85KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl80OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOCgpIHsKLSAgICBpZiAoampfM1JfMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzM4KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI1KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3KCkgewotICAgIGlmIChqal8zUl8yMigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU1RSSU5HX0xJVEVSQUwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFhRVUVSWSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDEoKSB7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl80NCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFU0NBUEUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOT1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM0KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl82MSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIGlmIChqal9zY2FuX3Rva2VuKDM2KSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oWFBBVEgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5PVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTlVMTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzNCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNjAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICBpZiAoampfc2Nhbl90b2tlbigzNikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKE5PVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKE5VTEwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZBTFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKE5VTEwpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVFJVRSkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18zKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKE5PVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKEJFVFdFRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQU5EKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80NSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyOCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDIoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl80NigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18xKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl80NygpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRkxPQVRJTkdfUE9JTlRfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihCRVRXRUVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKEFORCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVNDQVBFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihPQ1RBTF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDQxKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOSgpIHsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzQyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihOT1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMSUtFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl81OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMSUtFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl81OCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihIRVhfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbig0MCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEFORCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oREVDSU1BTF9MSVRFUkFMKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkoKSB7Ci0gICAgaWYgKGpqXzNSXzEwKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xMSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOSgpIHsKLSAgICBpZiAoampfM1JfMjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKDM4KSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzM3KCkgewotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfNDAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM181KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGpqXzNSXzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMxKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzM0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zNSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzYoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzMykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzcpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBwdWJsaWMgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIgdG9rZW5fc291cmNlOwotICBTaW1wbGVDaGFyU3RyZWFtIGpqX2lucHV0X3N0cmVhbTsKLSAgcHVibGljIFRva2VuIHRva2VuLCBqal9udDsKLSAgcHJpdmF0ZSBpbnQgampfbnRrOwotICBwcml2YXRlIFRva2VuIGpqX3NjYW5wb3MsIGpqX2xhc3Rwb3M7Ci0gIHByaXZhdGUgaW50IGpqX2xhOwotICBwdWJsaWMgYm9vbGVhbiBsb29raW5nQWhlYWQgPSBmYWxzZTsKLSAgcHJpdmF0ZSBib29sZWFuIGpqX3NlbUxBOwotCi0gIHB1YmxpYyBTZWxlY3RvclBhcnNlcihqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbSA9IG5ldyBTaW1wbGVDaGFyU3RyZWFtKHN0cmVhbSwgMSwgMSk7Ci0gICAgdG9rZW5fc291cmNlID0gbmV3IFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyBTZWxlY3RvclBhcnNlcihqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlcihqal9pbnB1dF9zdHJlYW0pOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgc3RyZWFtKSB7Ci0gICAgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICB9Ci0KLSAgcHVibGljIFNlbGVjdG9yUGFyc2VyKFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyIHRtKSB7Ci0gICAgdG9rZW5fc291cmNlID0gdG07Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChTZWxlY3RvclBhcnNlclRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIFRva2VuIGpqX2NvbnN1bWVfdG9rZW4oaW50IGtpbmQpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgVG9rZW4gb2xkVG9rZW47Ci0gICAgaWYgKChvbGRUb2tlbiA9IHRva2VuKS5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBpZiAodG9rZW4ua2luZCA9PSBraW5kKSB7Ci0gICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotICAgIHRva2VuID0gb2xkVG9rZW47Ci0gICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgZmluYWwgY2xhc3MgTG9va2FoZWFkU3VjY2VzcyBleHRlbmRzIGphdmEubGFuZy5FcnJvciB7IH0KLSAgZmluYWwgcHJpdmF0ZSBMb29rYWhlYWRTdWNjZXNzIGpqX2xzID0gbmV3IExvb2thaGVhZFN1Y2Nlc3MoKTsKLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqX3NjYW5fdG9rZW4oaW50IGtpbmQpIHsKLSAgICBpZiAoampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB7Ci0gICAgICBqal9sYS0tOwotICAgICAgaWYgKGpqX3NjYW5wb3MubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0ID0gdG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGpqX3NjYW5wb3MgPSBqal9zY2FucG9zLm5leHQ7Ci0gICAgfQotICAgIGlmIChqal9zY2FucG9zLmtpbmQgIT0ga2luZCkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX2xhID09IDAgJiYgampfc2NhbnBvcyA9PSBqal9sYXN0cG9zKSB0aHJvdyBqal9sczsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgewotICAgIGlmICh0b2tlbi5uZXh0ICE9IG51bGwpIHRva2VuID0gdG9rZW4ubmV4dDsKLSAgICBlbHNlIHRva2VuID0gdG9rZW4ubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICByZXR1cm4gdG9rZW47Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgVG9rZW4gZ2V0VG9rZW4oaW50IGluZGV4KSB7Ci0gICAgVG9rZW4gdCA9IGxvb2tpbmdBaGVhZCA/IGpqX3NjYW5wb3MgOiB0b2tlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGV4OyBpKyspIHsKLSAgICAgIGlmICh0Lm5leHQgIT0gbnVsbCkgdCA9IHQubmV4dDsKLSAgICAgIGVsc2UgdCA9IHQubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICB9Ci0gICAgcmV0dXJuIHQ7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGludCBqal9udGsoKSB7Ci0gICAgaWYgKChqal9udD10b2tlbi5uZXh0KSA9PSBudWxsKQotICAgICAgcmV0dXJuIChqal9udGsgPSAodG9rZW4ubmV4dD10b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCkpLmtpbmQpOwotICAgIGVsc2UKLSAgICAgIHJldHVybiAoampfbnRrID0gampfbnQua2luZCk7Ci0gIH0KLQotICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpIHsKLSAgICBUb2tlbiBlcnJvcnRvayA9IHRva2VuLm5leHQ7Ci0gICAgaW50IGxpbmUgPSBlcnJvcnRvay5iZWdpbkxpbmUsIGNvbHVtbiA9IGVycm9ydG9rLmJlZ2luQ29sdW1uOwotICAgIFN0cmluZyBtZXNzID0gKGVycm9ydG9rLmtpbmQgPT0gMCkgPyB0b2tlbkltYWdlWzBdIDogZXJyb3J0b2suaW1hZ2U7Ci0gICAgcmV0dXJuIG5ldyBQYXJzZUV4Y2VwdGlvbigiUGFyc2UgZXJyb3IgYXQgbGluZSAiICsgbGluZSArICIsIGNvbHVtbiAiICsgY29sdW1uICsgIi4gIEVuY291bnRlcmVkOiAiICsgbWVzcyk7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBlbmFibGVfdHJhY2luZygpIHsKLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIGRpc2FibGVfdHJhY2luZygpIHsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlckNvbnN0YW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBjNDU3Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlckNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBTZWxlY3RvclBhcnNlckNvbnN0YW50cy5qYXZhICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotcHVibGljIGludGVyZmFjZSBTZWxlY3RvclBhcnNlckNvbnN0YW50cyB7Ci0KLSAgaW50IEVPRiA9IDA7Ci0gIGludCBMSU5FX0NPTU1FTlQgPSA2OwotICBpbnQgQkxPQ0tfQ09NTUVOVCA9IDc7Ci0gIGludCBOT1QgPSA4OwotICBpbnQgQU5EID0gOTsKLSAgaW50IE9SID0gMTA7Ci0gIGludCBCRVRXRUVOID0gMTE7Ci0gIGludCBMSUtFID0gMTI7Ci0gIGludCBFU0NBUEUgPSAxMzsKLSAgaW50IElOID0gMTQ7Ci0gIGludCBJUyA9IDE1OwotICBpbnQgVFJVRSA9IDE2OwotICBpbnQgRkFMU0UgPSAxNzsKLSAgaW50IE5VTEwgPSAxODsKLSAgaW50IFhQQVRIID0gMTk7Ci0gIGludCBYUVVFUlkgPSAyMDsKLSAgaW50IERFQ0lNQUxfTElURVJBTCA9IDIxOwotICBpbnQgSEVYX0xJVEVSQUwgPSAyMjsKLSAgaW50IE9DVEFMX0xJVEVSQUwgPSAyMzsKLSAgaW50IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUwgPSAyNDsKLSAgaW50IEVYUE9ORU5UID0gMjU7Ci0gIGludCBTVFJJTkdfTElURVJBTCA9IDI2OwotICBpbnQgSUQgPSAyNzsKLQotICBpbnQgREVGQVVMVCA9IDA7Ci0KLSAgU3RyaW5nW10gdG9rZW5JbWFnZSA9IHsKLSAgICAiPEVPRj4iLAotICAgICJcIiBcIiIsCi0gICAgIlwiXFx0XCIiLAotICAgICJcIlxcblwiIiwKLSAgICAiXCJcXHJcIiIsCi0gICAgIlwiXFxmXCIiLAotICAgICI8TElORV9DT01NRU5UPiIsCi0gICAgIjxCTE9DS19DT01NRU5UPiIsCi0gICAgIlwiTk9UXCIiLAotICAgICJcIkFORFwiIiwKLSAgICAiXCJPUlwiIiwKLSAgICAiXCJCRVRXRUVOXCIiLAotICAgICJcIkxJS0VcIiIsCi0gICAgIlwiRVNDQVBFXCIiLAotICAgICJcIklOXCIiLAotICAgICJcIklTXCIiLAotICAgICJcIlRSVUVcIiIsCi0gICAgIlwiRkFMU0VcIiIsCi0gICAgIlwiTlVMTFwiIiwKLSAgICAiXCJYUEFUSFwiIiwKLSAgICAiXCJYUVVFUllcIiIsCi0gICAgIjxERUNJTUFMX0xJVEVSQUw+IiwKLSAgICAiPEhFWF9MSVRFUkFMPiIsCi0gICAgIjxPQ1RBTF9MSVRFUkFMPiIsCi0gICAgIjxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiIsCi0gICAgIjxFWFBPTkVOVD4iLAotICAgICI8U1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiPElEPiIsCi0gICAgIlwiPVwiIiwKLSAgICAiXCI8PlwiIiwKLSAgICAiXCI+XCIiLAotICAgICJcIj49XCIiLAotICAgICJcIjxcIiIsCi0gICAgIlwiPD1cIiIsCi0gICAgIlwiKFwiIiwKLSAgICAiXCIsXCIiLAotICAgICJcIilcIiIsCi0gICAgIlwiK1wiIiwKLSAgICAiXCItXCIiLAotICAgICJcIipcIiIsCi0gICAgIlwiL1wiIiwKLSAgICAiXCIlXCIiLAotICB9OwotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlclRva2VuTWFuYWdlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjc5ZDFmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9TZWxlY3RvclBhcnNlclRva2VuTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA2MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFjdGl2ZW1xLnNlbGVjdG9yOwotaW1wb3J0IGphdmEuaW8uKjsKLWltcG9ydCBqYXZhLnV0aWwuKjsKLWltcG9ydCBqYXZheC5qbXMuSW52YWxpZFNlbGVjdG9yRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hY3RpdmVtcS5maWx0ZXIuKjsKLQotcHVibGljIGNsYXNzIFNlbGVjdG9yUGFyc2VyVG9rZW5NYW5hZ2VyIGltcGxlbWVudHMgU2VsZWN0b3JQYXJzZXJDb25zdGFudHMKLXsKLSAgcHVibGljICBqYXZhLmlvLlByaW50U3RyZWFtIGRlYnVnU3RyZWFtID0gU3lzdGVtLm91dDsKLSAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wQXRQb3MoaW50IHBvcywgaW50IGtpbmQpCi17Ci0gICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKLSAgIHJldHVybiBwb3MgKyAxOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpCi17Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgOToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyOwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSAxMDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzOwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSAxMjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA1OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSAxMzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSAzMjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxOwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSAzNzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA0MTsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDA6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzQ7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQxOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM2OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzOTsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDM6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMzc7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDQ0OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDM1OwotICAgICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDApOwotICAgICAgY2FzZSA0NToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAzODsKLSAgICAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAwKTsKLSAgICAgIGNhc2UgNDc6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gNDA7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDYwOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDMyOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMjg7Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICAgICBjYXNlIDYyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDMwOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDAwMDAwMEwpOwotICAgICAgY2FzZSA2NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwTCk7Ci0gICAgICBjYXNlIDY2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg4MDBMKTsKLSAgICAgIGNhc2UgNjk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDBMKTsKLSAgICAgIGNhc2UgNzA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDAwTCk7Ci0gICAgICBjYXNlIDczOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHhjMDAwTCk7Ci0gICAgICBjYXNlIDc2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwTCk7Ci0gICAgICBjYXNlIDc4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDEwMEwpOwotICAgICAgY2FzZSA3OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwTCk7Ci0gICAgICBjYXNlIDg0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMEwpOwotICAgICAgY2FzZSA4ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTgwMDAwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDBMKTsKLSAgICAgIGNhc2UgOTg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDIwMDBMKTsKLSAgICAgIGNhc2UgMTAyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgyMDAwMEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweGMwMDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAxMDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg0MDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgxMDAwMEwpOwotICAgICAgY2FzZSAxMjA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDE4MDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCkKLXsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMCk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMzE7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDMzOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAyOTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDAwTCk7Ci0gICAgICBjYXNlIDY5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgNzM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDBMKTsKLSAgICAgIGNhc2UgNzg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMEwpOwotICAgICAgY2FzZSA3OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwTCk7Ci0gICAgICBjYXNlIDgwOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSA4MToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDgyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwTCk7Ci0gICAgICBjYXNlIDgzOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTU7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDg1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg0MDAwMEwpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE0OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwTCk7Ci0gICAgICBjYXNlIDExMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgMTEzOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDEwMDAwTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE1OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDEpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDEpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAxKTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDBMKTsKLSAgICAgIGNhc2UgNjc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgNjg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDc1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgxMDAwTCk7Ci0gICAgICBjYXNlIDc2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg2MDAwMEwpOwotICAgICAgY2FzZSA4NDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSA4NToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTEwMDAwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MjAwMEwpOwotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDk7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTAwMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDYwMDAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDI7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDExMDAwMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAyKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAyKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgMik7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNjU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgNjk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MTAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgY2FzZSA3NjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgODM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwMDAwTCk7Ci0gICAgICBjYXNlIDg0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg4MDAwMEwpOwotICAgICAgY2FzZSA4NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwTCk7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEyOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgxMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE2OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMzsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4MTAwMDAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDM7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAwMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDgwMDAwTCk7Ci0gICAgICBjYXNlIDExOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwTCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDMpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDMpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCAzKTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSA2OToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxNzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSA3MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxOTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgODA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgODI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgMTA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDE5OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNDsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNCk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgcmV0dXJuIGpqTW92ZU5mYV8wKDUsIDQpOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDY5OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTM7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA1OwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDBMKTsKLSAgICAgIGNhc2UgODk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIwOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMzsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDU7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMEwpOwotICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDIwOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA1KTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA1KTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoNSwgNSk7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgNzg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDExOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNjsKLSAgICAgICAgIH0KLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqak1vdmVOZmFfMCg1LCA2KTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCi17Ci0gICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCi0gICB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKLSAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQotewotICAgampDaGVja05BZGQoc3RhdGUxKTsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQotewotICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Ci19Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmZmZUwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMiA9IHsKLSAgIDB4MEwsIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKLXsKLSAgIGludCBzdHJLaW5kID0gamptYXRjaGVkS2luZDsKLSAgIGludCBzdHJQb3MgPSBqam1hdGNoZWRQb3M7Ci0gICBpbnQgc2VlblVwdG87Ci0gICBpbnB1dF9zdHJlYW0uYmFja3VwKHNlZW5VcHRvID0gY3VyUG9zICsgMSk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgRXJyb3IoIkludGVybmFsIEVycm9yIik7IH0KLSAgIGN1clBvcyA9IDA7Ci0gICBpbnRbXSBuZXh0U3RhdGVzOwotICAgaW50IHN0YXJ0c0F0ID0gMDsKLSAgIGpqbmV3U3RhdGVDbnQgPSA0MzsKLSAgIGludCBpID0gMTsKLSAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOwotICAgaW50IGosIGtpbmQgPSAweDdmZmZmZmZmOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKLSAgICAgICAgIFJlSW5pdFJvdW5kcygpOwotICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSA1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDAsIDMpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjcpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gMjc7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDM5KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNCwgNik7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSA0NykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY7Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ1KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMDsKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmUwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIxKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIxOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTQsIDE1KTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDgpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIzKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIzOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoNDAsIDQyKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDUpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3LCA5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg3LCA5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI0MDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAgJiYga2luZCA+IDYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTMpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAzOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZiZmZmZmZmZmZmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwLCAxMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmN2JmZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTAsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmYmZmZmZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygxMCwgOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA0NyAmJiBraW5kID4gNykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gNDcpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZTAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE0LCAxNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIxKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIxOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTQsIDE1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDE3LCAxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMjApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNDsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMToKLSAgICAgICAgICAgICAgIGNhc2UgMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQsIDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzkpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAyMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmY3ZmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNCwgNik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gMjYpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzNikKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDI3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDEwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMCwgMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMjksIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzEsIDMyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzMSwgMzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjQpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjQ7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMzUsIDM2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyODAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDI0KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDI0OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDgpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMjMpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjM7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg0MCwgNDIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMjsKLSAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDQxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIzKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDIzOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNDIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDU6Ci0gICAgICAgICAgICAgICBjYXNlIDI3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyNykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyNzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDI3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxOgotICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNywgOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzoKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDcsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDk6Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRUd29TdGF0ZXMoMTAsIDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDEwMDAwMDAwMTAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gMjEpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjAwMDAwMDAyMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDEzLCAxNCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjQ6Ci0gICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg0LCA2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTUsIDE2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTcsIDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAyMikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyMjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgZGVmYXVsdCA6IGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgfSB3aGlsZShpICE9IHN0YXJ0c0F0KTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGludCBoaUJ5dGUgPSAoaW50KShjdXJDaGFyID4+IDgpOwotICAgICAgICAgaW50IGkxID0gaGlCeXRlID4+IDY7Ci0gICAgICAgICBsb25nIGwxID0gMUwgPDwgKGhpQnl0ZSAmIDA3Nyk7Ci0gICAgICAgICBpbnQgaTIgPSAoY3VyQ2hhciAmIDB4ZmYpID4+IDY7Ci0gICAgICAgICBsb25nIGwyID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgMToKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDcsIDkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoampDYW5Nb3ZlXzAoaGlCeXRlLCBpMSwgaTIsIGwxLCBsMikpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg3LCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5OgotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDEwLCA4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmIChqakNhbk1vdmVfMChoaUJ5dGUsIGkxLCBpMiwgbDEsIGwyKSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDQsIDYpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDQzIC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgYnJlYWs7Ci0gICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyBicmVhazsgfQotICAgfQotICAgaWYgKGpqbWF0Y2hlZFBvcyA+IHN0clBvcykKLSAgICAgIHJldHVybiBjdXJQb3M7Ci0KLSAgIGludCB0b1JldCA9IE1hdGgubWF4KGN1clBvcywgc2VlblVwdG8pOwotCi0gICBpZiAoY3VyUG9zIDwgdG9SZXQpCi0gICAgICBmb3IgKGkgPSB0b1JldCAtIE1hdGgubWluKGN1clBvcywgc2VlblVwdG8pOyBpLS0gPiAwOyApCi0gICAgICAgICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgICAgICAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgRXJyb3IoIkludGVybmFsIEVycm9yIDogUGxlYXNlIHNlbmQgYSBidWcgcmVwb3J0LiIpOyB9Ci0KLSAgIGlmIChqam1hdGNoZWRQb3MgPCBzdHJQb3MpCi0gICB7Ci0gICAgICBqam1hdGNoZWRLaW5kID0gc3RyS2luZDsKLSAgICAgIGpqbWF0Y2hlZFBvcyA9IHN0clBvczsKLSAgIH0KLSAgIGVsc2UgaWYgKGpqbWF0Y2hlZFBvcyA9PSBzdHJQb3MgJiYgamptYXRjaGVkS2luZCA+IHN0cktpbmQpCi0gICAgICBqam1hdGNoZWRLaW5kID0gc3RyS2luZDsKLQotICAgcmV0dXJuIHRvUmV0OwotfQotc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKLSAgIDI5LCAzMCwgMzUsIDM2LCAyMywgMjQsIDI1LCAxLCAyLCA0LCA4LCA5LCAxMSwgMTksIDIwLCAzMywgCi0gICAzNCwgMzcsIDM4LCAKLX07Ci1wcml2YXRlIHN0YXRpYyBmaW5hbCBib29sZWFuIGpqQ2FuTW92ZV8wKGludCBoaUJ5dGUsIGludCBpMSwgaW50IGkyLCBsb25nIGwxLCBsb25nIGwyKQotewotICAgc3dpdGNoKGhpQnl0ZSkKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIHJldHVybiAoKGpqYml0VmVjMltpMl0gJiBsMikgIT0gMEwpOwotICAgICAgZGVmYXVsdCA6IAotICAgICAgICAgaWYgKChqamJpdFZlYzBbaTFdICYgbDEpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICB9Ci19Ci1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGpqc3RyTGl0ZXJhbEltYWdlcyA9IHsKLSIiLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAKLW51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIAotbnVsbCwgIlw3NSIsICJcNzRcNzYiLCAiXDc2IiwgIlw3Nlw3NSIsICJcNzQiLCAiXDc0XDc1IiwgIlw1MCIsICJcNTQiLCAiXDUxIiwgIlw1MyIsIAotIlw1NSIsICJcNTIiLCAiXDU3IiwgIlw0NSIsIH07Ci1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7Ci0gICAiREVGQVVMVCIsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1Rva2VuID0gewotICAgMHgzZmZmZGZmZmYwMUwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NraXAgPSB7Ci0gICAweGZlTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvU3BlY2lhbCA9IHsKLSAgIDB4M2VMLCAKLX07Ci1wcm90ZWN0ZWQgU2ltcGxlQ2hhclN0cmVhbSBpbnB1dF9zdHJlYW07Ci1wcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFs0M107Ci1wcml2YXRlIGZpbmFsIGludFtdIGpqc3RhdGVTZXQgPSBuZXcgaW50Wzg2XTsKLXByb3RlY3RlZCBjaGFyIGN1ckNoYXI7Ci1wdWJsaWMgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0pCi17Ci0gICBpZiAoU2ltcGxlQ2hhclN0cmVhbS5zdGF0aWNGbGFnKQotICAgICAgdGhyb3cgbmV3IEVycm9yKCJFUlJPUjogQ2Fubm90IHVzZSBhIHN0YXRpYyBDaGFyU3RyZWFtIGNsYXNzIHdpdGggYSBub24tc3RhdGljIGxleGljYWwgYW5hbHl6ZXIuIik7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci19Ci1wdWJsaWMgU2VsZWN0b3JQYXJzZXJUb2tlbk1hbmFnZXIoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIHRoaXMoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOwotICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci0gICBSZUluaXRSb3VuZHMoKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQotewotICAgaW50IGk7Ci0gICBqanJvdW5kID0gMHg4MDAwMDAwMTsKLSAgIGZvciAoaSA9IDQzOyBpLS0gPiAwOykKLSAgICAgIGpqcm91bmRzW2ldID0gMHg4MDAwMDAwMDsKLX0KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKQotewotICAgUmVJbml0KHN0cmVhbSk7Ci0gICBTd2l0Y2hUbyhsZXhTdGF0ZSk7Ci19Ci1wdWJsaWMgdm9pZCBTd2l0Y2hUbyhpbnQgbGV4U3RhdGUpCi17Ci0gICBpZiAobGV4U3RhdGUgPj0gMSB8fCBsZXhTdGF0ZSA8IDApCi0gICAgICB0aHJvdyBuZXcgVG9rZW5NZ3JFcnJvcigiRXJyb3I6IElnbm9yaW5nIGludmFsaWQgbGV4aWNhbCBzdGF0ZSA6ICIgKyBsZXhTdGF0ZSArICIuIFN0YXRlIHVuY2hhbmdlZC4iLCBUb2tlbk1nckVycm9yLklOVkFMSURfTEVYSUNBTF9TVEFURSk7Ci0gICBlbHNlCi0gICAgICBjdXJMZXhTdGF0ZSA9IGxleFN0YXRlOwotfQotCi1wcm90ZWN0ZWQgVG9rZW4gampGaWxsVG9rZW4oKQotewotICAgVG9rZW4gdCA9IFRva2VuLm5ld1Rva2VuKGpqbWF0Y2hlZEtpbmQpOwotICAgdC5raW5kID0gamptYXRjaGVkS2luZDsKLSAgIFN0cmluZyBpbSA9IGpqc3RyTGl0ZXJhbEltYWdlc1tqam1hdGNoZWRLaW5kXTsKLSAgIHQuaW1hZ2UgPSAoaW0gPT0gbnVsbCkgPyBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKSA6IGltOwotICAgdC5iZWdpbkxpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5MaW5lKCk7Ci0gICB0LmJlZ2luQ29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEJlZ2luQ29sdW1uKCk7Ci0gICB0LmVuZExpbmUgPSBpbnB1dF9zdHJlYW0uZ2V0RW5kTGluZSgpOwotICAgdC5lbmRDb2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0RW5kQ29sdW1uKCk7Ci0gICByZXR1cm4gdDsKLX0KLQotaW50IGN1ckxleFN0YXRlID0gMDsKLWludCBkZWZhdWx0TGV4U3RhdGUgPSAwOwotaW50IGpqbmV3U3RhdGVDbnQ7Ci1pbnQgampyb3VuZDsKLWludCBqam1hdGNoZWRQb3M7Ci1pbnQgamptYXRjaGVkS2luZDsKLQotcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIAotewotICBpbnQga2luZDsKLSAgVG9rZW4gc3BlY2lhbFRva2VuID0gbnVsbDsKLSAgVG9rZW4gbWF0Y2hlZFRva2VuOwotICBpbnQgY3VyUG9zID0gMDsKLQotICBFT0ZMb29wIDoKLSAgZm9yICg7OykKLSAgeyAgIAotICAgdHJ5ICAgCi0gICB7ICAgICAKLSAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0uQmVnaW5Ub2tlbigpOwotICAgfSAgICAgCi0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpCi0gICB7ICAgICAgICAKLSAgICAgIGpqbWF0Y2hlZEtpbmQgPSAwOwotICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICByZXR1cm4gbWF0Y2hlZFRva2VuOwotICAgfQotCi0gICBqam1hdGNoZWRLaW5kID0gMHg3ZmZmZmZmZjsKLSAgIGpqbWF0Y2hlZFBvcyA9IDA7Ci0gICBjdXJQb3MgPSBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8wKCk7Ci0gICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQotICAgewotICAgICAgaWYgKGpqbWF0Y2hlZFBvcyArIDEgPCBjdXJQb3MpCi0gICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOwotICAgICAgaWYgKChqanRvVG9rZW5bamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgIHsKLSAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgIGlmICgoamp0b1NwZWNpYWxbamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICAgICBpZiAoc3BlY2lhbFRva2VuID09IG51bGwpCi0gICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBtYXRjaGVkVG9rZW47Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgICAgICAgc3BlY2lhbFRva2VuID0gKHNwZWNpYWxUb2tlbi5uZXh0ID0gbWF0Y2hlZFRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0KLSAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7Ci0gICAgICB9Ci0gICB9Ci0gICBpbnQgZXJyb3JfbGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICBpbnQgZXJyb3JfY29sdW1uID0gaW5wdXRfc3RyZWFtLmdldEVuZENvbHVtbigpOwotICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKLSAgIGJvb2xlYW4gRU9GU2VlbiA9IGZhbHNlOwotICAgdHJ5IHsgaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7IH0KLSAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICBFT0ZTZWVuID0gdHJ1ZTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKLSAgICAgICAgIGVycm9yX2xpbmUrKzsKLSAgICAgICAgIGVycm9yX2NvbHVtbiA9IDA7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICAgICBlcnJvcl9jb2x1bW4rKzsKLSAgIH0KLSAgIGlmICghRU9GU2VlbikgewotICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKLSAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgfQotICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoRU9GU2VlbiwgY3VyTGV4U3RhdGUsIGVycm9yX2xpbmUsIGVycm9yX2NvbHVtbiwgZXJyb3JfYWZ0ZXIsIGN1ckNoYXIsIFRva2VuTWdyRXJyb3IuTEVYSUNBTF9FUlJPUik7Ci0gIH0KLX0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2ltcGxlQ2hhclN0cmVhbS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MGQ2YThlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1NpbXBsZUNoYXJTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFNpbXBsZUNoYXJTdHJlYW0uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bwotICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOwotICBpbnQgYnVmc2l6ZTsKLSAgaW50IGF2YWlsYWJsZTsKLSAgaW50IHRva2VuQmVnaW47Ci0gIHB1YmxpYyBpbnQgYnVmcG9zID0gLTE7Ci0gIHByb3RlY3RlZCBpbnQgYnVmbGluZVtdOwotICBwcm90ZWN0ZWQgaW50IGJ1ZmNvbHVtbltdOwotCi0gIHByb3RlY3RlZCBpbnQgY29sdW1uID0gMDsKLSAgcHJvdGVjdGVkIGludCBsaW5lID0gMTsKLQotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgcHJvdGVjdGVkIGJvb2xlYW4gcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIGphdmEuaW8uUmVhZGVyIGlucHV0U3RyZWFtOwotCi0gIHByb3RlY3RlZCBjaGFyW10gYnVmZmVyOwotICBwcm90ZWN0ZWQgaW50IG1heE5leHRDaGFySW5kID0gMDsKLSAgcHJvdGVjdGVkIGludCBpbkJ1ZiA9IDA7Ci0KLSAgcHJvdGVjdGVkIHZvaWQgRXhwYW5kQnVmZihib29sZWFuIHdyYXBBcm91bmQpCi0gIHsKLSAgICAgY2hhcltdIG5ld2J1ZmZlciA9IG5ldyBjaGFyW2J1ZnNpemUgKyAyMDQ4XTsKLSAgICAgaW50IG5ld2J1ZmxpbmVbXSA9IG5ldyBpbnRbYnVmc2l6ZSArIDIwNDhdOwotICAgICBpbnQgbmV3YnVmY29sdW1uW10gPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLQotICAgICB0cnkKLSAgICAgewotICAgICAgICBpZiAod3JhcEFyb3VuZCkKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCBuZXdidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbiwgYnVmcG9zKTsKLSAgICAgICAgICAgYnVmZmVyID0gbmV3YnVmZmVyOwotCi0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmbGluZSwgdG9rZW5CZWdpbiwgbmV3YnVmbGluZSwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmY29sdW1uLCAwLCBuZXdidWZjb2x1bW4sIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zICs9IChidWZzaXplIC0gdG9rZW5CZWdpbikpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLCBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgICAgYnVmbGluZSA9IG5ld2J1ZmxpbmU7Ci0KLSAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIHRva2VuQmVnaW4sIG5ld2J1ZmNvbHVtbiwgMCwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICAgICBidWZjb2x1bW4gPSBuZXdidWZjb2x1bW47Ci0KLSAgICAgICAgICAgbWF4TmV4dENoYXJJbmQgPSAoYnVmcG9zIC09IHRva2VuQmVnaW4pOwotICAgICAgICB9Ci0gICAgIH0KLSAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgIH0KLQotCi0gICAgIGJ1ZnNpemUgKz0gMjA0ODsKLSAgICAgYXZhaWxhYmxlID0gYnVmc2l6ZTsKLSAgICAgdG9rZW5CZWdpbiA9IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBGaWxsQnVmZigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKG1heE5leHRDaGFySW5kID09IGF2YWlsYWJsZSkKLSAgICAgewotICAgICAgICBpZiAoYXZhaWxhYmxlID09IGJ1ZnNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKHRva2VuQmVnaW4gPiAyMDQ4KQotICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGJ1ZnBvcyA9IG1heE5leHRDaGFySW5kID0gMDsKLSAgICAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgICAgICAgfQotICAgICAgICAgICBlbHNlIGlmICh0b2tlbkJlZ2luIDwgMCkKLSAgICAgICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgIEV4cGFuZEJ1ZmYoZmFsc2UpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCi0gICAgICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgICAgIGVsc2UgaWYgKCh0b2tlbkJlZ2luIC0gYXZhaWxhYmxlKSA8IDIwNDgpCi0gICAgICAgICAgIEV4cGFuZEJ1ZmYodHJ1ZSk7Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgYXZhaWxhYmxlID0gdG9rZW5CZWdpbjsKLSAgICAgfQotCi0gICAgIGludCBpOwotICAgICB0cnkgewotICAgICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdmFpbGFibGUgLSBtYXhOZXh0Q2hhckluZCkpID09IC0xKQotICAgICAgICB7Ci0gICAgICAgICAgIGlucHV0U3RyZWFtLmNsb3NlKCk7Ci0gICAgICAgICAgIHRocm93IG5ldyBqYXZhLmlvLklPRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICAgICBtYXhOZXh0Q2hhckluZCArPSBpOwotICAgICAgICByZXR1cm47Ci0gICAgIH0KLSAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC0tYnVmcG9zOwotICAgICAgICBiYWNrdXAoMCk7Ci0gICAgICAgIGlmICh0b2tlbkJlZ2luID09IC0xKQotICAgICAgICAgICB0b2tlbkJlZ2luID0gYnVmcG9zOwotICAgICAgICB0aHJvdyBlOwotICAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhciBCZWdpblRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgICB0b2tlbkJlZ2luID0gLTE7Ci0gICAgIGNoYXIgYyA9IHJlYWRDaGFyKCk7Ci0gICAgIHRva2VuQmVnaW4gPSBidWZwb3M7Ci0KLSAgICAgcmV0dXJuIGM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBVcGRhdGVMaW5lQ29sdW1uKGNoYXIgYykKLSAgewotICAgICBjb2x1bW4rKzsKLQotICAgICBpZiAocHJldkNoYXJJc0xGKQotICAgICB7Ci0gICAgICAgIHByZXZDaGFySXNMRiA9IGZhbHNlOwotICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgfQotICAgICBlbHNlIGlmIChwcmV2Q2hhcklzQ1IpCi0gICAgIHsKLSAgICAgICAgcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgICAgIGlmIChjID09ICdcbicpCi0gICAgICAgIHsKLSAgICAgICAgICAgcHJldkNoYXJJc0xGID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgIGxpbmUgKz0gKGNvbHVtbiA9IDEpOwotICAgICB9Ci0KLSAgICAgc3dpdGNoIChjKQotICAgICB7Ci0gICAgICAgIGNhc2UgJ1xyJyA6Ci0gICAgICAgICAgIHByZXZDaGFySXNDUiA9IHRydWU7Ci0gICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcbicgOgotICAgICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXHQnIDoKLSAgICAgICAgICAgY29sdW1uLS07Ci0gICAgICAgICAgIGNvbHVtbiArPSAoOCAtIChjb2x1bW4gJiAwNykpOwotICAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgIGJyZWFrOwotICAgICB9Ci0KLSAgICAgYnVmbGluZVtidWZwb3NdID0gbGluZTsKLSAgICAgYnVmY29sdW1uW2J1ZnBvc10gPSBjb2x1bW47Ci0gIH0KLQotICBwdWJsaWMgY2hhciByZWFkQ2hhcigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLSAgICAgaWYgKGluQnVmID4gMCkKLSAgICAgewotICAgICAgICAtLWluQnVmOwotCi0gICAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQotICAgICAgICAgICBidWZwb3MgPSAwOwotCi0gICAgICAgIHJldHVybiBidWZmZXJbYnVmcG9zXTsKLSAgICAgfQotCi0gICAgIGlmICgrK2J1ZnBvcyA+PSBtYXhOZXh0Q2hhckluZCkKLSAgICAgICAgRmlsbEJ1ZmYoKTsKLQotICAgICBjaGFyIGMgPSBidWZmZXJbYnVmcG9zXTsKLQotICAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOwotICAgICByZXR1cm4gKGMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIAotICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KLSAgICovCi0KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKSB7Ci0gICAgIHJldHVybiBidWZjb2x1bW5bYnVmcG9zXTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZCAKLSAgICogQHNlZSAjZ2V0RW5kTGluZQotICAgKi8KLQotICBwdWJsaWMgaW50IGdldExpbmUoKSB7Ci0gICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRFbmRMaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVtidWZwb3NdOwotICB9Ci0KLSAgcHVibGljIGludCBnZXRCZWdpbkNvbHVtbigpIHsKLSAgICAgcmV0dXJuIGJ1ZmNvbHVtblt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkgewotICAgICByZXR1cm4gYnVmbGluZVt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGJhY2t1cChpbnQgYW1vdW50KSB7Ci0KLSAgICBpbkJ1ZiArPSBhbW91bnQ7Ci0gICAgaWYgKChidWZwb3MgLT0gYW1vdW50KSA8IDApCi0gICAgICAgYnVmcG9zICs9IGJ1ZnNpemU7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5SZWFkZXIgZHN0cmVhbSkKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgaWYgKGJ1ZmZlciA9PSBudWxsIHx8IGJ1ZmZlcnNpemUgIT0gYnVmZmVyLmxlbmd0aCkKLSAgICB7Ci0gICAgICBhdmFpbGFibGUgPSBidWZzaXplID0gYnVmZmVyc2l6ZTsKLSAgICAgIGJ1ZmZlciA9IG5ldyBjaGFyW2J1ZmZlcnNpemVdOwotICAgICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZjb2x1bW4gPSBuZXcgaW50W2J1ZmZlcnNpemVdOwotICAgIH0KLSAgICBwcmV2Q2hhcklzTEYgPSBwcmV2Q2hhcklzQ1IgPSBmYWxzZTsKLSAgICB0b2tlbkJlZ2luID0gaW5CdWYgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgYnVmcG9zID0gLTE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5SZWFkZXIgZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gIGludCBzdGFydGNvbHVtbiwgaW50IGJ1ZmZlcnNpemUpCi0gIHsKLSAgICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgICB0aGlzKGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIHRoaXMoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgIFJlSW5pdChuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgIFJlSW5pdChkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4pCi0gIHsKLSAgICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0gIHB1YmxpYyBTdHJpbmcgR2V0SW1hZ2UoKQotICB7Ci0gICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZwb3MgLSB0b2tlbkJlZ2luICsgMSk7Ci0gICAgIGVsc2UKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnVmZmVyLCB0b2tlbkJlZ2luLCBidWZzaXplIC0gdG9rZW5CZWdpbikgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOwotICB9Ci0KLSAgcHVibGljIGNoYXJbXSBHZXRTdWZmaXgoaW50IGxlbikKLSAgewotICAgICBjaGFyW10gcmV0ID0gbmV3IGNoYXJbbGVuXTsKLQotICAgICBpZiAoKGJ1ZnBvcyArIDEpID49IGxlbikKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZnBvcyAtIGxlbiArIDEsIHJldCwgMCwgbGVuKTsKLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZzaXplIC0gKGxlbiAtIGJ1ZnBvcyAtIDEpLCByZXQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuIC0gYnVmcG9zIC0gMSk7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCByZXQsIGxlbiAtIGJ1ZnBvcyAtIDEsIGJ1ZnBvcyArIDEpOwotICAgICB9Ci0KLSAgICAgcmV0dXJuIHJldDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIERvbmUoKQotICB7Ci0gICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgIGJ1ZmxpbmUgPSBudWxsOwotICAgICBidWZjb2x1bW4gPSBudWxsOwotICB9Ci0KLSAgLyoqCi0gICAqIE1ldGhvZCB0byBhZGp1c3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgZm9yIHRoZSBzdGFydCBvZiBhIHRva2VuLgotICAgKi8KLSAgcHVibGljIHZvaWQgYWRqdXN0QmVnaW5MaW5lQ29sdW1uKGludCBuZXdMaW5lLCBpbnQgbmV3Q29sKQotICB7Ci0gICAgIGludCBzdGFydCA9IHRva2VuQmVnaW47Ci0gICAgIGludCBsZW47Ci0KLSAgICAgaWYgKGJ1ZnBvcyA+PSB0b2tlbkJlZ2luKQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyBpbkJ1ZiArIDE7Ci0gICAgIH0KLSAgICAgZWxzZQotICAgICB7Ci0gICAgICAgIGxlbiA9IGJ1ZnNpemUgLSB0b2tlbkJlZ2luICsgYnVmcG9zICsgMSArIGluQnVmOwotICAgICB9Ci0KLSAgICAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7Ci0gICAgIGludCBuZXh0Q29sRGlmZiA9IDAsIGNvbHVtbkRpZmYgPSAwOwotCi0gICAgIHdoaWxlIChpIDwgbGVuICYmCi0gICAgICAgICAgICBidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdID09IGJ1ZmxpbmVbayA9ICsrc3RhcnQgJSBidWZzaXplXSkKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgbmV4dENvbERpZmYgPSBjb2x1bW5EaWZmICsgYnVmY29sdW1uW2tdIC0gYnVmY29sdW1uW2pdOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotICAgICAgICBjb2x1bW5EaWZmID0gbmV4dENvbERpZmY7Ci0gICAgICAgIGkrKzsKLSAgICAgfSAKLQotICAgICBpZiAoaSA8IGxlbikKLSAgICAgewotICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZSsrOwotICAgICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotCi0gICAgICAgIHdoaWxlIChpKysgPCBsZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgaWYgKGJ1ZmxpbmVbaiA9IHN0YXJ0ICUgYnVmc2l6ZV0gIT0gYnVmbGluZVsrK3N0YXJ0ICUgYnVmc2l6ZV0pCi0gICAgICAgICAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICAgIH0KLSAgICAgfQotCi0gICAgIGxpbmUgPSBidWZsaW5lW2pdOwotICAgICBjb2x1bW4gPSBidWZjb2x1bW5bal07Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvdmFsaWRhdG9yL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhZDRlZmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW4uamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYWN0aXZlbXEuc2VsZWN0b3I7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCi0gKi8KLQotcHVibGljIGNsYXNzIFRva2VuIHsKLQotICAvKioKLSAgICogQW4gaW50ZWdlciB0aGF0IGRlc2NyaWJlcyB0aGUga2luZCBvZiB0aGlzIHRva2VuLiAgVGhpcyBudW1iZXJpbmcKLSAgICogc3lzdGVtIGlzIGRldGVybWluZWQgYnkgSmF2YUNDUGFyc2VyLCBhbmQgYSB0YWJsZSBvZiB0aGVzZSBudW1iZXJzIGlzCi0gICAqIHN0b3JlZCBpbiB0aGUgZmlsZSAuLi5Db25zdGFudHMuamF2YS4KLSAgICovCi0gIHB1YmxpYyBpbnQga2luZDsKLQotICAvKioKLSAgICogYmVnaW5MaW5lIGFuZCBiZWdpbkNvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAgKiBvZiB0aGlzIHRva2VuOyBlbmRMaW5lIGFuZCBlbmRDb2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZQotICAgKiBsYXN0IGNoYXJhY3RlciBvZiB0aGlzIHRva2VuLgotICAgKi8KLSAgcHVibGljIGludCBiZWdpbkxpbmUsIGJlZ2luQ29sdW1uLCBlbmRMaW5lLCBlbmRDb2x1bW47Ci0KLSAgLyoqCi0gICAqIFRoZSBzdHJpbmcgaW1hZ2Ugb2YgdGhlIHRva2VuLgotICAgKi8KLSAgcHVibGljIFN0cmluZyBpbWFnZTsKLQotICAvKioKLSAgICogQSByZWZlcmVuY2UgdG8gdGhlIG5leHQgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuIGZyb20gdGhlIGlucHV0Ci0gICAqIHN0cmVhbS4gIElmIHRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCBvciBpZiB0aGUKLSAgICogdG9rZW4gbWFuYWdlciBoYXMgbm90IHJlYWQgdG9rZW5zIGJleW9uZCB0aGlzIG9uZSwgdGhpcyBmaWVsZCBpcwotICAgKiBzZXQgdG8gbnVsbC4gIFRoaXMgaXMgdHJ1ZSBvbmx5IGlmIHRoaXMgdG9rZW4gaXMgYWxzbyBhIHJlZ3VsYXIKLSAgICogdG9rZW4uICBPdGhlcndpc2UsIHNlZSBiZWxvdyBmb3IgYSBkZXNjcmlwdGlvbiBvZiB0aGUgY29udGVudHMgb2YKLSAgICogdGhpcyBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBuZXh0OwotCi0gIC8qKgotICAgKiBUaGlzIGZpZWxkIGlzIHVzZWQgdG8gYWNjZXNzIHNwZWNpYWwgdG9rZW5zIHRoYXQgb2NjdXIgcHJpb3IgdG8gdGhpcwotICAgKiB0b2tlbiwgYnV0IGFmdGVyIHRoZSBpbW1lZGlhdGVseSBwcmVjZWRpbmcgcmVndWxhciAobm9uLXNwZWNpYWwpIHRva2VuLgotICAgKiBJZiB0aGVyZSBhcmUgbm8gc3VjaCBzcGVjaWFsIHRva2VucywgdGhpcyBmaWVsZCBpcyBzZXQgdG8gbnVsbC4KLSAgICogV2hlbiB0aGVyZSBhcmUgbW9yZSB0aGFuIG9uZSBzdWNoIHNwZWNpYWwgdG9rZW4sIHRoaXMgZmllbGQgcmVmZXJzCi0gICAqIHRvIHRoZSBsYXN0IG9mIHRoZXNlIHNwZWNpYWwgdG9rZW5zLCB3aGljaCBpbiB0dXJuIHJlZmVycyB0byB0aGUgbmV4dAotICAgKiBwcmV2aW91cyBzcGVjaWFsIHRva2VuIHRocm91Z2ggaXRzIHNwZWNpYWxUb2tlbiBmaWVsZCwgYW5kIHNvIG9uCi0gICAqIHVudGlsIHRoZSBmaXJzdCBzcGVjaWFsIHRva2VuICh3aG9zZSBzcGVjaWFsVG9rZW4gZmllbGQgaXMgbnVsbCkuCi0gICAqIFRoZSBuZXh0IGZpZWxkcyBvZiBzcGVjaWFsIHRva2VucyByZWZlciB0byBvdGhlciBzcGVjaWFsIHRva2VucyB0aGF0Ci0gICAqIGltbWVkaWF0ZWx5IGZvbGxvdyBpdCAod2l0aG91dCBhbiBpbnRlcnZlbmluZyByZWd1bGFyIHRva2VuKS4gIElmIHRoZXJlCi0gICAqIGlzIG5vIHN1Y2ggdG9rZW4sIHRoaXMgZmllbGQgaXMgbnVsbC4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBzcGVjaWFsVG9rZW47Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGltYWdlLgotICAgKi8KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91Ci0gICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCi0gICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgotICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0Ci0gICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7Ci0gICAqCi0gICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCi0gICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCi0gIHsKLSAgICAgc3dpdGNoKG9mS2luZCkKLSAgICAgewotICAgICAgIGRlZmF1bHQgOiByZXR1cm4gbmV3IFRva2VuKCk7Ci0gICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbk1nckVycm9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFjYy1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL3ZhbGlkYXRvci9Ub2tlbk1nckVycm9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4Yjc0NTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhY2MtcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy92YWxpZGF0b3IvVG9rZW5NZ3JFcnJvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gVG9rZW5NZ3JFcnJvci5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hY3RpdmVtcS5zZWxlY3RvcjsKLQotcHVibGljIGNsYXNzIFRva2VuTWdyRXJyb3IgZXh0ZW5kcyBFcnJvcgotewotICAgLyoKLSAgICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgotICAgICovCi0KLSAgIC8qKgotICAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IExFWElDQUxfRVJST1IgPSAwOwotCi0gICAvKioKLSAgICAqIEFuIGF0dGVtcHQgd2FzcyBtYWRlIHRvIGNyZWF0ZSBhIHNlY29uZCBpbnN0YW5jZSBvZiBhIHN0YXRpYyB0b2tlbiBtYW5hZ2VyLgotICAgICovCi0gICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7Ci0KLSAgIC8qKgotICAgICogVHJpZWQgdG8gY2hhbmdlIHRvIGFuIGludmFsaWQgbGV4aWNhbCBzdGF0ZS4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBJTlZBTElEX0xFWElDQUxfU1RBVEUgPSAyOwotCi0gICAvKioKLSAgICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KLSAgICAqLwotICAgc3RhdGljIGZpbmFsIGludCBMT09QX0RFVEVDVEVEID0gMzsKLQotICAgLyoqCi0gICAgKiBJbmRpY2F0ZXMgdGhlIHJlYXNvbiB3aHkgdGhlIGV4Y2VwdGlvbiBpcyB0aHJvd24uIEl0IHdpbGwgaGF2ZQotICAgICogb25lIG9mIHRoZSBhYm92ZSA0IHZhbHVlcy4KLSAgICAqLwotICAgaW50IGVycm9yQ29kZTsKLQotICAgLyoqCi0gICAgKiBSZXBsYWNlcyB1bnByaW50YWJsZSBjaGFyYWN0ZXJzIGJ5IHRoZWlyIGVzcGFjZWQgKG9yIHVuaWNvZGUgZXNjYXBlZCkKLSAgICAqIGVxdWl2YWxlbnRzIGluIHRoZSBnaXZlbiBzdHJpbmcKLSAgICAqLwotICAgcHJvdGVjdGVkIHN0YXRpYyBmaW5hbCBTdHJpbmcgYWRkRXNjYXBlcyhTdHJpbmcgc3RyKSB7Ci0gICAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgY2hhciBjaDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgc3dpdGNoIChzdHIuY2hhckF0KGkpKQotICAgICAgICB7Ci0gICAgICAgICAgIGNhc2UgMCA6Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcYic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHQnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcZic6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXHInOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgY2FzZSAnXCcnOgotICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICBjYXNlICdcXCc6Ci0gICAgICAgICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGlmICgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjAgfHwgY2ggPiAweDdlKSB7Ci0gICAgICAgICAgICAgICAgIFN0cmluZyBzID0gIjAwMDAiICsgSW50ZWdlci50b1N0cmluZyhjaCwgMTYpOwotICAgICAgICAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgIH0KLQotICAgLyoqCi0gICAgKiBSZXR1cm5zIGEgZGV0YWlsZWQgbWVzc2FnZSBmb3IgdGhlIEVycm9yIHdoZW4gaXQgaXMgdGhyb3duIGJ5IHRoZQotICAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCi0gICAgKiBQYXJhbWV0ZXJzIDogCi0gICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2wgZXJyb3IKLSAgICAqICAgIGN1ckxleFN0YXRlIDogbGV4aWNhbCBzdGF0ZSBpbiB3aGljaCB0aGlzIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yTGluZSAgIDogbGluZSBudW1iZXIgd2hlbiB0aGUgZXJyb3Igb2NjdXJlZAotICAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICAqICAgIGVycm9yQWZ0ZXIgIDogcHJlZml4IHRoYXQgd2FzIHNlZW4gYmVmb3JlIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgICogICAgY3VyY2hhciAgICAgOiB0aGUgb2ZmZW5kaW5nIGNoYXJhY3RlcgotICAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCi0gICAgKi8KLSAgIHByb3RlY3RlZCBzdGF0aWMgU3RyaW5nIExleGljYWxFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKSB7Ci0gICAgICByZXR1cm4oIkxleGljYWwgZXJyb3IgYXQgbGluZSAiICsKLSAgICAgICAgICAgZXJyb3JMaW5lICsgIiwgY29sdW1uICIgKwotICAgICAgICAgICBlcnJvckNvbHVtbiArICIuICBFbmNvdW50ZXJlZDogIiArCi0gICAgICAgICAgIChFT0ZTZWVuID8gIjxFT0Y+ICIgOiAoIlwiIiArIGFkZEVzY2FwZXMoU3RyaW5nLnZhbHVlT2YoY3VyQ2hhcikpICsgIlwiIikgKyAiICgiICsgKGludCljdXJDaGFyICsgIiksICIpICsKLSAgICAgICAgICAgImFmdGVyIDogXCIiICsgYWRkRXNjYXBlcyhlcnJvckFmdGVyKSArICJcIiIpOwotICAgfQotCi0gICAvKioKLSAgICAqIFlvdSBjYW4gYWxzbyBtb2RpZnkgdGhlIGJvZHkgb2YgdGhpcyBtZXRob2QgdG8gY3VzdG9taXplIHlvdXIgZXJyb3IgbWVzc2FnZXMuCi0gICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAotICAgICogb2YgZW5kLXVzZXJzIGNvbmNlcm4sIHNvIHlvdSBjYW4gcmV0dXJuIHNvbWV0aGluZyBsaWtlIDogCi0gICAgKgotICAgICogICAgICJJbnRlcm5hbCBFcnJvciA6IFBsZWFzZSBmaWxlIGEgYnVnIHJlcG9ydCAuLi4uICIKLSAgICAqCi0gICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCi0gICAgKi8KLSAgIHB1YmxpYyBTdHJpbmcgZ2V0TWVzc2FnZSgpIHsKLSAgICAgIHJldHVybiBzdXBlci5nZXRNZXNzYWdlKCk7Ci0gICB9Ci0KLSAgIC8qCi0gICAgKiBDb25zdHJ1Y3RvcnMgb2YgdmFyaW91cyBmbGF2b3JzIGZvbGxvdy4KLSAgICAqLwotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpIHsKLSAgIH0KLQotICAgcHVibGljIFRva2VuTWdyRXJyb3IoU3RyaW5nIG1lc3NhZ2UsIGludCByZWFzb24pIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgZXJyb3JDb2RlID0gcmVhc29uOwotICAgfQotCi0gICBwdWJsaWMgVG9rZW5NZ3JFcnJvcihib29sZWFuIEVPRlNlZW4sIGludCBsZXhTdGF0ZSwgaW50IGVycm9yTGluZSwgaW50IGVycm9yQ29sdW1uLCBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyLCBpbnQgcmVhc29uKSB7Ci0gICAgICB0aGlzKExleGljYWxFcnJvcihFT0ZTZWVuLCBsZXhTdGF0ZSwgZXJyb3JMaW5lLCBlcnJvckNvbHVtbiwgZXJyb3JBZnRlciwgY3VyQ2hhciksIHJlYXNvbik7Ci0gICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXBhY2hlIExpY2Vuc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFZlcnNpb24gMi4wLCBKYW51YXJ5IDIwMDQKLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8KLQotICAgVEVSTVMgQU5EIENPTkRJVElPTlMgRk9SIFVTRSwgUkVQUk9EVUNUSU9OLCBBTkQgRElTVFJJQlVUSU9OCi0KLSAgIDEuIERlZmluaXRpb25zLgotCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLAotICAgICAgYW5kIGRpc3RyaWJ1dGlvbiBhcyBkZWZpbmVkIGJ5IFNlY3Rpb25zIDEgdGhyb3VnaCA5IG9mIHRoaXMgZG9jdW1lbnQuCi0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5Ci0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyIHRoYXQgaXMgZ3JhbnRpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwKLSAgICAgIG90aGVyIGVudGl0aWVzIHRoYXQgY29udHJvbCwgYXJlIGNvbnRyb2xsZWQgYnksIG9yIGFyZSB1bmRlciBjb21tb24KLSAgICAgIGNvbnRyb2wgd2l0aCB0aGF0IGVudGl0eS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUKLSAgICAgIGRpcmVjdGlvbiBvciBtYW5hZ2VtZW50IG9mIHN1Y2ggZW50aXR5LCB3aGV0aGVyIGJ5IGNvbnRyYWN0IG9yCi0gICAgICBvdGhlcndpc2UsIG9yIChpaSkgb3duZXJzaGlwIG9mIGZpZnR5IHBlcmNlbnQgKDUwJSkgb3IgbW9yZSBvZiB0aGUKLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuCi0KLSAgICAgICJZb3UiIChvciAiWW91ciIpIHNoYWxsIG1lYW4gYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuCi0KLSAgICAgICJTb3VyY2UiIGZvcm0gc2hhbGwgbWVhbiB0aGUgcHJlZmVycmVkIGZvcm0gZm9yIG1ha2luZyBtb2RpZmljYXRpb25zLAotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbgotICAgICAgc291cmNlLCBhbmQgY29uZmlndXJhdGlvbiBmaWxlcy4KLQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwKLSAgICAgIHRyYW5zZm9ybWF0aW9uIG9yIHRyYW5zbGF0aW9uIG9mIGEgU291cmNlIGZvcm0sIGluY2x1ZGluZyBidXQKLSAgICAgIG5vdCBsaW1pdGVkIHRvIGNvbXBpbGVkIG9iamVjdCBjb2RlLCBnZW5lcmF0ZWQgZG9jdW1lbnRhdGlvbiwKLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4KLQotICAgICAgIldvcmsiIHNoYWxsIG1lYW4gdGhlIHdvcmsgb2YgYXV0aG9yc2hpcCwgd2hldGhlciBpbiBTb3VyY2Ugb3IKLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGEKLSAgICAgIGNvcHlyaWdodCBub3RpY2UgdGhhdCBpcyBpbmNsdWRlZCBpbiBvciBhdHRhY2hlZCB0byB0aGUgd29yawotICAgICAgKGFuIGV4YW1wbGUgaXMgcHJvdmlkZWQgaW4gdGhlIEFwcGVuZGl4IGJlbG93KS4KLQotICAgICAgIkRlcml2YXRpdmUgV29ya3MiIHNoYWxsIG1lYW4gYW55IHdvcmssIHdoZXRoZXIgaW4gU291cmNlIG9yIE9iamVjdAotICAgICAgZm9ybSwgdGhhdCBpcyBiYXNlZCBvbiAob3IgZGVyaXZlZCBmcm9tKSB0aGUgV29yayBhbmQgZm9yIHdoaWNoIHRoZQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucwotICAgICAgcmVwcmVzZW50LCBhcyBhIHdob2xlLCBhbiBvcmlnaW5hbCB3b3JrIG9mIGF1dGhvcnNoaXAuIEZvciB0aGUgcHVycG9zZXMKLSAgICAgIG9mIHRoaXMgTGljZW5zZSwgRGVyaXZhdGl2ZSBXb3JrcyBzaGFsbCBub3QgaW5jbHVkZSB3b3JrcyB0aGF0IHJlbWFpbgotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLAotICAgICAgdGhlIFdvcmsgYW5kIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZi4KLQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcKLSAgICAgIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoZSBXb3JrIGFuZCBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMKLSAgICAgIHRvIHRoYXQgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIHRoYXQgaXMgaW50ZW50aW9uYWxseQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcgotICAgICAgb3IgYnkgYW4gaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkgYXV0aG9yaXplZCB0byBzdWJtaXQgb24gYmVoYWxmIG9mCi0gICAgICB0aGUgY29weXJpZ2h0IG93bmVyLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIKLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQKLSAgICAgIHRvIHRoZSBMaWNlbnNvciBvciBpdHMgcmVwcmVzZW50YXRpdmVzLCBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvCi0gICAgICBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMgbWFpbGluZyBsaXN0cywgc291cmNlIGNvZGUgY29udHJvbCBzeXN0ZW1zLAotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUKLSAgICAgIExpY2Vuc29yIGZvciB0aGUgcHVycG9zZSBvZiBkaXNjdXNzaW5nIGFuZCBpbXByb3ZpbmcgdGhlIFdvcmssIGJ1dAotICAgICAgZXhjbHVkaW5nIGNvbW11bmljYXRpb24gdGhhdCBpcyBjb25zcGljdW91c2x5IG1hcmtlZCBvciBvdGhlcndpc2UKLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIgotCi0gICAgICAiQ29udHJpYnV0b3IiIHNoYWxsIG1lYW4gTGljZW5zb3IgYW5kIGFueSBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kCi0gICAgICBzdWJzZXF1ZW50bHkgaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yay4KLQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsCi0gICAgICBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKLSAgICAgIFdvcmsgYW5kIHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0uCi0KLSAgIDMuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UgdG8gbWFrZSwgaGF2ZSBtYWRlLAotICAgICAgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIgdGhlIFdvcmssCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQotICAgICAgYnkgc3VjaCBDb250cmlidXRvciB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgdGhlaXIKLSAgICAgIENvbnRyaWJ1dGlvbihzKSBhbG9uZSBvciBieSBjb21iaW5hdGlvbiBvZiB0aGVpciBDb250cmlidXRpb24ocykKLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91Ci0gICAgICBpbnN0aXR1dGUgcGF0ZW50IGxpdGlnYXRpb24gYWdhaW5zdCBhbnkgZW50aXR5IChpbmNsdWRpbmcgYQotICAgICAgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcgdGhhdCB0aGUgV29yawotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QKLSAgICAgIG9yIGNvbnRyaWJ1dG9yeSBwYXRlbnQgaW5mcmluZ2VtZW50LCB0aGVuIGFueSBwYXRlbnQgbGljZW5zZXMKLSAgICAgIGdyYW50ZWQgdG8gWW91IHVuZGVyIHRoaXMgTGljZW5zZSBmb3IgdGhhdCBXb3JrIHNoYWxsIHRlcm1pbmF0ZQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLgotCi0gICA0LiBSZWRpc3RyaWJ1dGlvbi4gWW91IG1heSByZXByb2R1Y2UgYW5kIGRpc3RyaWJ1dGUgY29waWVzIG9mIHRoZQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0Ci0gICAgICBtb2RpZmljYXRpb25zLCBhbmQgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLCBwcm92aWRlZCB0aGF0IFlvdQotICAgICAgbWVldCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6Ci0KLSAgICAgIChhKSBZb3UgbXVzdCBnaXZlIGFueSBvdGhlciByZWNpcGllbnRzIG9mIHRoZSBXb3JrIG9yCi0gICAgICAgICAgRGVyaXZhdGl2ZSBXb3JrcyBhIGNvcHkgb2YgdGhpcyBMaWNlbnNlOyBhbmQKLQotICAgICAgKGIpIFlvdSBtdXN0IGNhdXNlIGFueSBtb2RpZmllZCBmaWxlcyB0byBjYXJyeSBwcm9taW5lbnQgbm90aWNlcwotICAgICAgICAgIHN0YXRpbmcgdGhhdCBZb3UgY2hhbmdlZCB0aGUgZmlsZXM7IGFuZAotCi0gICAgICAoYykgWW91IG11c3QgcmV0YWluLCBpbiB0aGUgU291cmNlIGZvcm0gb2YgYW55IERlcml2YXRpdmUgV29ya3MKLSAgICAgICAgICB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbGwgY29weXJpZ2h0LCBwYXRlbnQsIHRyYWRlbWFyaywgYW5kCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywKLSAgICAgICAgICBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdCBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mCi0gICAgICAgICAgdGhlIERlcml2YXRpdmUgV29ya3M7IGFuZAotCi0gICAgICAoZCkgSWYgdGhlIFdvcmsgaW5jbHVkZXMgYSAiTk9USUNFIiB0ZXh0IGZpbGUgYXMgcGFydCBvZiBpdHMKLSAgICAgICAgICBkaXN0cmlidXRpb24sIHRoZW4gYW55IERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSBtdXN0Ci0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkCi0gICAgICAgICAgd2l0aGluIHN1Y2ggTk9USUNFIGZpbGUsIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90Ci0gICAgICAgICAgcGVydGFpbiB0byBhbnkgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaW4gYXQgbGVhc3Qgb25lCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQKLSAgICAgICAgICBhcyBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyB3aXRoaW4gdGhlIFNvdXJjZSBmb3JtIG9yCi0gICAgICAgICAgZG9jdW1lbnRhdGlvbiwgaWYgcHJvdmlkZWQgYWxvbmcgd2l0aCB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgb3IsCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZAotICAgICAgICAgIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgbm90aWNlcyBub3JtYWxseSBhcHBlYXIuIFRoZSBjb250ZW50cwotICAgICAgICAgIG9mIHRoZSBOT1RJQ0UgZmlsZSBhcmUgZm9yIGluZm9ybWF0aW9uYWwgcHVycG9zZXMgb25seSBhbmQKLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbgotICAgICAgICAgIG5vdGljZXMgd2l0aGluIERlcml2YXRpdmUgV29ya3MgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxvbmdzaWRlCi0gICAgICAgICAgb3IgYXMgYW4gYWRkZW5kdW0gdG8gdGhlIE5PVElDRSB0ZXh0IGZyb20gdGhlIFdvcmssIHByb3ZpZGVkCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkCi0gICAgICAgICAgYXMgbW9kaWZ5aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQKLSAgICAgIG1heSBwcm92aWRlIGFkZGl0aW9uYWwgb3IgZGlmZmVyZW50IGxpY2Vuc2UgdGVybXMgYW5kIGNvbmRpdGlvbnMKLSAgICAgIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwgb3IgZGlzdHJpYnV0aW9uIG9mIFlvdXIgbW9kaWZpY2F0aW9ucywgb3IKLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLAotICAgICAgcmVwcm9kdWN0aW9uLCBhbmQgZGlzdHJpYnV0aW9uIG9mIHRoZSBXb3JrIG90aGVyd2lzZSBjb21wbGllcyB3aXRoCi0gICAgICB0aGUgY29uZGl0aW9ucyBzdGF0ZWQgaW4gdGhpcyBMaWNlbnNlLgotCi0gICA1LiBTdWJtaXNzaW9uIG9mIENvbnRyaWJ1dGlvbnMuIFVubGVzcyBZb3UgZXhwbGljaXRseSBzdGF0ZSBvdGhlcndpc2UsCi0gICAgICBhbnkgQ29udHJpYnV0aW9uIGludGVudGlvbmFsbHkgc3VibWl0dGVkIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsKLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIHdpdGhvdXQgYW55IGFkZGl0aW9uYWwgdGVybXMgb3IgY29uZGl0aW9ucy4KLSAgICAgIE5vdHdpdGhzdGFuZGluZyB0aGUgYWJvdmUsIG5vdGhpbmcgaGVyZWluIHNoYWxsIHN1cGVyc2VkZSBvciBtb2RpZnkKLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkCi0gICAgICB3aXRoIExpY2Vuc29yIHJlZ2FyZGluZyBzdWNoIENvbnRyaWJ1dGlvbnMuCi0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUKLSAgICAgIG5hbWVzLCB0cmFkZW1hcmtzLCBzZXJ2aWNlIG1hcmtzLCBvciBwcm9kdWN0IG5hbWVzIG9mIHRoZSBMaWNlbnNvciwKLSAgICAgIGV4Y2VwdCBhcyByZXF1aXJlZCBmb3IgcmVhc29uYWJsZSBhbmQgY3VzdG9tYXJ5IHVzZSBpbiBkZXNjcmliaW5nIHRoZQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuCi0KLSAgIDcuIERpc2NsYWltZXIgb2YgV2FycmFudHkuIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvcgotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaAotICAgICAgQ29udHJpYnV0b3IgcHJvdmlkZXMgaXRzIENvbnRyaWJ1dGlvbnMpIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICAgICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IKLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zCi0gICAgICBvZiBUSVRMRSwgTk9OLUlORlJJTkdFTUVOVCwgTUVSQ0hBTlRBQklMSVRZLCBvciBGSVRORVNTIEZPUiBBCi0gICAgICBQQVJUSUNVTEFSIFBVUlBPU0UuIFlvdSBhcmUgc29sZWx5IHJlc3BvbnNpYmxlIGZvciBkZXRlcm1pbmluZyB0aGUKLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQotICAgICAgcmlza3MgYXNzb2NpYXRlZCB3aXRoIFlvdXIgZXhlcmNpc2Ugb2YgcGVybWlzc2lvbnMgdW5kZXIgdGhpcyBMaWNlbnNlLgotCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwKLSAgICAgIHdoZXRoZXIgaW4gdG9ydCAoaW5jbHVkaW5nIG5lZ2xpZ2VuY2UpLCBjb250cmFjdCwgb3Igb3RoZXJ3aXNlLAotICAgICAgdW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IChzdWNoIGFzIGRlbGliZXJhdGUgYW5kIGdyb3NzbHkKLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlCi0gICAgICBsaWFibGUgdG8gWW91IGZvciBkYW1hZ2VzLCBpbmNsdWRpbmcgYW55IGRpcmVjdCwgaW5kaXJlY3QsIHNwZWNpYWwsCi0gICAgICBpbmNpZGVudGFsLCBvciBjb25zZXF1ZW50aWFsIGRhbWFnZXMgb2YgYW55IGNoYXJhY3RlciBhcmlzaW5nIGFzIGEKLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUKLSAgICAgIFdvcmsgKGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gZGFtYWdlcyBmb3IgbG9zcyBvZiBnb29kd2lsbCwKLSAgICAgIHdvcmsgc3RvcHBhZ2UsIGNvbXB1dGVyIGZhaWx1cmUgb3IgbWFsZnVuY3Rpb24sIG9yIGFueSBhbmQgYWxsCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yCi0gICAgICBoYXMgYmVlbiBhZHZpc2VkIG9mIHRoZSBwb3NzaWJpbGl0eSBvZiBzdWNoIGRhbWFnZXMuCi0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcKLSAgICAgIHRoZSBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgWW91IG1heSBjaG9vc2UgdG8gb2ZmZXIsCi0gICAgICBhbmQgY2hhcmdlIGEgZmVlIGZvciwgYWNjZXB0YW5jZSBvZiBzdXBwb3J0LCB3YXJyYW50eSwgaW5kZW1uaXR5LAotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMKLSAgICAgIExpY2Vuc2UuIEhvd2V2ZXIsIGluIGFjY2VwdGluZyBzdWNoIG9ibGlnYXRpb25zLCBZb3UgbWF5IGFjdCBvbmx5Ci0gICAgICBvbiBZb3VyIG93biBiZWhhbGYgYW5kIG9uIFlvdXIgc29sZSByZXNwb25zaWJpbGl0eSwgbm90IG9uIGJlaGFsZgotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LAotICAgICAgZGVmZW5kLCBhbmQgaG9sZCBlYWNoIENvbnRyaWJ1dG9yIGhhcm1sZXNzIGZvciBhbnkgbGlhYmlsaXR5Ci0gICAgICBpbmN1cnJlZCBieSwgb3IgY2xhaW1zIGFzc2VydGVkIGFnYWluc3QsIHN1Y2ggQ29udHJpYnV0b3IgYnkgcmVhc29uCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4KLQotICAgRU5EIE9GIFRFUk1TIEFORCBDT05ESVRJT05TCi0KLSAgIEFQUEVORElYOiBIb3cgdG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yay4KLQotICAgICAgVG8gYXBwbHkgdGhlIEFwYWNoZSBMaWNlbnNlIHRvIHlvdXIgd29yaywgYXR0YWNoIHRoZSBmb2xsb3dpbmcKLSAgICAgIGJvaWxlcnBsYXRlIG5vdGljZSwgd2l0aCB0aGUgZmllbGRzIGVuY2xvc2VkIGJ5IGJyYWNrZXRzICJbXSIKLSAgICAgIHJlcGxhY2VkIHdpdGggeW91ciBvd24gaWRlbnRpZnlpbmcgaW5mb3JtYXRpb24uIChEb24ndCBpbmNsdWRlCi0gICAgICB0aGUgYnJhY2tldHMhKSAgVGhlIHRleHQgc2hvdWxkIGJlIGVuY2xvc2VkIGluIHRoZSBhcHByb3ByaWF0ZQotICAgICAgY29tbWVudCBzeW50YXggZm9yIHRoZSBmaWxlIGZvcm1hdC4gV2UgYWxzbyByZWNvbW1lbmQgdGhhdCBhCi0gICAgICBmaWxlIG9yIGNsYXNzIG5hbWUgYW5kIGRlc2NyaXB0aW9uIG9mIHB1cnBvc2UgYmUgaW5jbHVkZWQgb24gdGhlCi0gICAgICBzYW1lICJwcmludGVkIHBhZ2UiIGFzIHRoZSBjb3B5cmlnaHQgbm90aWNlIGZvciBlYXNpZXIKLSAgICAgIGlkZW50aWZpY2F0aW9uIHdpdGhpbiB0aGlyZC1wYXJ0eSBhcmNoaXZlcy4KLQotICAgQ29weXJpZ2h0IFt5eXl5XSBbbmFtZSBvZiBjb3B5cmlnaHQgb3duZXJdCi0KLSAgIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhM2RiZDYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTYgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KLQotUG9ydGlvbnMgb2YgdGhpcyBzb2Z0d2FyZSB3ZXJlIG9yaWdpbmFsbHkgYmFzZWQgb24gdGhlIGZvbGxvd2luZzoKLQotIC0gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAwLTIwMDYsIE9yYWNsZSBDb3JwLCA8aHR0cDovL3d3dy5vcmFjbGUuY29tLz4uCi1hbmQgYXJlIGxpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiB1bmRlciB0aGUgCi0iU29mdHdhcmUgR3JhbnQgYW5kIENvcnBvcmF0ZSBDb250cmlidXRpb24gTGljZW5zZSBBZ3JlZW1lbnQiCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3BvbS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1NDFlOTQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLQkgICAKLS0tPgotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEphdmFzY3JpcHQgUGx1Z2luPC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjU8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWphdmFjYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZURpcmVjdG9yeT5zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgICAgICAgPHNvdXJjZVBhdGg+b3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyPC9zb3VyY2VQYXRoPgotICAgICAgICAgIDxvdXRwdXRQYXRoPm9yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlcjwvb3V0cHV0UGF0aD4KLSAgICAgICAgICA8aXNTdGF0aWM+ZmFsc2U8L2lzU3RhdGljPgotICAgICAgICAgIDxkb05vdEdlbmVyYXRlVG9rZW5GaWxlPnRydWU8L2RvTm90R2VuZXJhdGVUb2tlbkZpbGU+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+Z2VuZXJhdGU8L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAtIE92ZXJyaWRlIGNoZWNrc3R5bGUgY29uZmlnIGZpbGUgZGVmaW5pdGlvbnMgZnJvbSBwYXJlbnQgcG9tLiBUaGUgc291cmNlIG9mCi0gICAgICAgICAgLSB0aGlzIHByb2plY3QgaXMgbm90IGNvbXBsaWFudCB3aXRoIHRoZSBub3JtYWwgTXlGYWNlcyBjb2RlIHN0eWxlIHJ1bGVzLCBhbmQKLSAgICAgICAgICAtIHByb2JhYmx5IG5ldmVyIHdpbGwgYmUuCi0gICAgICAgICAgLS0+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGNvbmZpZ0xvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtaW88L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5jb21tb25zLWlvPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0gIAotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvT2JmdXNjYXRlSmF2YXNjcmlwdE1vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvT2JmdXNjYXRlSmF2YXNjcmlwdE1vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZiMGNkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L09iZnVzY2F0ZUphdmFzY3JpcHRNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQ7Ci0KLS8vfi0tLSBub24tSkRLIGltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLk9iZnVzY2F0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbi5Db25maWdFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuY29uZmlndXJhdGlvbi5PYmZ1c2NhdG9yQ29uZmlnOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLy9+LS0tIEpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotCi0vL34tLS0gY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8qKgotICogQHZlcnNpb24gJElkJAotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gY29tcGlsZQotICogQGdvYWwgb2JmdXNjYXRlLWphdmFzY3JpcHQKLSAqIEBwaGFzZSBnZW5lcmF0ZS1yZXNvdXJjZXMKLSAqIEBkZXNjcmlwdGlvbiBHb2FsIHdoaWNoIG9iZnVzY2F0ZXMgdGhlIEphdmFzY3JpcHQgc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgT2JmdXNjYXRlSmF2YXNjcmlwdE1vam8KLSAgZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLQotICAvL34tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwdWJsaWMgdm9pZCBleGVjdXRlKCkKLSAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0vLyBMaXN0IGNvbXBpbGVTb3VyY2VSb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLS8vIGNvbXBpbGVTb3VyY2VSb290cy5hZGQoc291cmNlRGlyZWN0b3J5KTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIF9vYmZ1c2NhdG9yID0gCi0gICAgICAgICAgbmV3IE9iZnVzY2F0b3Iob2JmdXNjYXRlLCBzdHJpcENvbW1lbnRzLCBzdHJpcFdoaXRlc3BhY2VzLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpcE5ld2xpbmVzLCBzdHJpcFNwZWNpYWxLZXl3b3JkcywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmVwbGFjZUNoYXJMaXRlcmFscywgb2JmdXNjYXRvckNvbmZpZyk7Ci0KLS8vICAgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHRhcmdldFBhdGgpOwotCi0gICAgICB0YXJnZXREaXJlY3RvcnkubWtkaXJzKCk7Ci0KLSAgICAgIGZvciAoRmlsZSBzb3VyY2VSb290OiBzb3VyY2VEaXJlY3RvcnkpCi0gICAgICB7Ci0vLyAgICAgICAgRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShzb3VyY2VSb290LCBzb3VyY2VQYXRoKTsKLSAgICAgICAgaWYgKHNvdXJjZVJvb3QuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBfb2JmdXNjYXRvci5wcm9jZXNzKHNvdXJjZVJvb3QsIHRhcmdldERpcmVjdG9yeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKENvbmZpZ0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIGNvbmZpZ3VyYXRpb24gcGFyYW1ldGVycyIsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZSk7Ci0gICAgfQotICB9Ci0gIHByaXZhdGUgT2JmdXNjYXRvciBfb2JmdXNjYXRvcjsKLQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG9iZnVzY2F0ZSA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VDaGFyTGl0ZXJhbHMgPSBmYWxzZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBzdHJpcENvbW1lbnRzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc3RyaXBOZXdsaW5lcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIHN0cmlwU3BlY2lhbEtleXdvcmRzID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gc3RyaXBXaGl0ZXNwYWNlcyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIAotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZVtdIHNvdXJjZURpcmVjdG9yeTsKLQotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2NsYXNzZXMiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgT2JmdXNjYXRvckNvbmZpZyBvYmZ1c2NhdG9yQ29uZmlnOwotfQotCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L1JlZHVjZUphdmFzY3JpcHRNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L1JlZHVjZUphdmFzY3JpcHRNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMjYxZDkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9SZWR1Y2VKYXZhc2NyaXB0TW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHMuUmVkdWNlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5pby5GaWxlVXRpbHM7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBnb2FsIHJlZHVjZS1qYXZhc2NyaXB0Ci0gKiBAcGhhc2UgZ2VuZXJhdGUtc291cmNlcwotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggY29tcGlsZXMgdGhlIEphdmFzY3JpcHQgc291cmNlcwotICovCi1wdWJsaWMgY2xhc3MgUmVkdWNlSmF2YXNjcmlwdE1vam8gZXh0ZW5kcyBBYnN0cmFjdE1vam8KLXsKLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBMaXN0IGNvbXBpbGVTb3VyY2VSb290cyA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKHNvdXJjZURpcmVjdG9yeSk7Ci0gICAgLy8gVE9ETzogcmVnaXN0ZXIgdGhlc2UgcGF0aHMgZnJvbSBpbnNpZGUgcmVsZXZhbnQgcGx1Z2lucwotICAgIGNvbXBpbGVTb3VyY2VSb290cy5hZGQobmV3IEZpbGUocHJvamVjdC5nZXRCdWlsZCgpLmdldERpcmVjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1hdmVuLWkxOG4tcGx1Z2luL21haW4vamF2YXNjcmlwdCIpKTsKLSAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKG5ldyBGaWxlKHByb2plY3QuZ2V0QnVpbGQoKS5nZXREaXJlY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtYXZlbi1mYWNlcy1wbHVnaW4vbWFpbi9qYXZhc2NyaXB0IikpOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKLSAgICAgIHJlc291cmNlLnNldERpcmVjdG9yeSh0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgICAgIHByb2plY3QuYWRkUmVzb3VyY2UocmVzb3VyY2UpOwotCi0gICAgICAvLyBUT0RPOiBzd2l0Y2ggT3B0aW1pemVkLCBub3QgRGVidWcsIHRvIGJlIHRoZSBzcGVjaWFsLWNhc2UKLSAgICAgIC8vICAgICAgIHNvIHRoYXQgRGVidWcgY2FuIGJlIHByb2Nlc3NlZCBhcyBvcmRpbmFyeSByZXNvdXJjZSBjb3B5Ci0gICAgICAvLyAgICAgICB3aXRob3V0IGhhdmluZyB0byBleHBsaWNpdGx5IGNvZGUgaXQgaGVyZQotICAgICAgRmlsZSBvdXRwdXREaXJlY3RvcnkgPSBuZXcgRmlsZSh0YXJnZXREaXJlY3RvcnksIHRhcmdldFBhdGgpOwotICAgICAgb3V0cHV0RGlyZWN0b3J5Lm1rZGlycygpOwotICAgICAgZm9yIChJdGVyYXRvciBpID0gY29tcGlsZVNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICB7Ci0gICAgICAgIEZpbGUgc291cmNlUm9vdCA9IChGaWxlKWkubmV4dCgpOwotICAgICAgICBGaWxlIHNvdXJjZURpcmVjdG9yeSA9IG5ldyBGaWxlKHNvdXJjZVJvb3QsIHNvdXJjZVBhdGgpOwotICAgICAgICBpZiAoc291cmNlRGlyZWN0b3J5LmV4aXN0cygpKQotICAgICAgICB7Ci0gICAgICAgICAgX2NvcHlKYXZhc2NyaXB0KHNvdXJjZURpcmVjdG9yeSwgb3V0cHV0RGlyZWN0b3J5KTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY29weWluZyBKYXZhc2NyaXB0IGZpbGVzIiwgZSk7Ci0gICAgfQotCi0KLSAgICB0cnkKLSAgICB7Ci0gICAgICBpZiAob3B0aW1pemVUYXJnZXRQYXRoICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgb3V0cHV0RGlyZWN0b3J5ID0gbmV3IEZpbGUodGFyZ2V0RGlyZWN0b3J5LCBvcHRpbWl6ZVRhcmdldFBhdGgpOwotICAgICAgICBvdXRwdXREaXJlY3RvcnkubWtkaXJzKCk7Ci0gICAgICAgIGZvciAoSXRlcmF0b3IgaSA9IGNvbXBpbGVTb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgICAgICB7Ci0gICAgICAgICAgRmlsZSBzb3VyY2VSb290ID0gKEZpbGUpaS5uZXh0KCk7Ci0gICAgICAgICAgRmlsZSBzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShzb3VyY2VSb290LCBzb3VyY2VQYXRoKTsKLSAgICAgICAgICBpZiAoc291cmNlRGlyZWN0b3J5LmV4aXN0cygpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZ1tdIGFyZ3MgPSB7IHNvdXJjZURpcmVjdG9yeS5nZXRDYW5vbmljYWxQYXRoKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpIH07Ci0gICAgICAgICAgICAvLyBUT0RPOiBpbmNyZW1lbnRhbCBjaGVjawotICAgICAgICAgICAgUmVkdWNlci5tYWluKGFyZ3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiRXJyb3IgY29tcGlsaW5nIEphdmFzY3JpcHQgZmlsZXMiLCBlKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgcHJpdmF0ZSB2b2lkIF9jb3B5SmF2YXNjcmlwdChGaWxlIHNvdXJjZURpciwgRmlsZSB0YXJnZXREaXIpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlW10gc291cmNlRmlsZXMgPSBzb3VyY2VEaXIubGlzdEZpbGVzKCk7Ci0gICAgaWYgKHNvdXJjZUZpbGVzICE9IG51bGwpCi0gICAgewotICAgICAgZm9yIChGaWxlIHNvdXJjZUZpbGUgOiBzb3VyY2VGaWxlcykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNvdXJjZUZpbGUuaXNEaXJlY3RvcnkoKSkKLSAgICAgICAgewotICAgICAgICAgIEZpbGUgdGFyZ2V0U3ViZGlyID0gbmV3IEZpbGUodGFyZ2V0RGlyLCBzb3VyY2VGaWxlLmdldE5hbWUoKSk7Ci0gICAgICAgICAgaWYgKCF0YXJnZXRTdWJkaXIuZXhpc3RzKCkpCi0gICAgICAgICAgICB0YXJnZXRTdWJkaXIubWtkaXIoKTsKLSAgICAgICAgICBfY29weUphdmFzY3JpcHQoc291cmNlRmlsZSwgdGFyZ2V0U3ViZGlyKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChzb3VyY2VGaWxlLmdldE5hbWUoKS5lbmRzV2l0aCgiLmpzIikpCi0gICAgICAgIHsKLSAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGVUb0RpcmVjdG9yeShzb3VyY2VGaWxlLCB0YXJnZXREaXIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi9qYXZhc2NyaXB0IgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBzb3VyY2VQYXRoOwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L21hdmVuLWphdmFzY3JpcHQtcGx1Z2luL21haW4vcmVzb3VyY2VzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHRhcmdldFBhdGg7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIG9wdGltaXplVGFyZ2V0UGF0aDsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQWRkT3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjJiY2YuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQWRkT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQWRkT3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBZGRPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFkZE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBZGRPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQWRkaXRpdmVFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmM2U3ZjcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQWRkaXRpdmVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFkZGl0aXZlRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFkZGl0aXZlRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFkZGl0aXZlRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQWRkaXRpdmVFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFubm90YXRhYmxlRGlyZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlOTA2ZGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEFyZ3VtZW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJndW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI1MTUyYzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEFyZ3VtZW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFyZ3VtZW50cyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFyZ3VtZW50cyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXJndW1lbnRzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXJyYXlMaXRlcmFsLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBcnJheUxpdGVyYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU1ZGQ0OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBcnJheUxpdGVyYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXJyYXlMaXRlcmFsLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXJyYXlMaXRlcmFsIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXJyYXlMaXRlcmFsKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBcnJheUxpdGVyYWwoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25lbWVudE9wZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25lbWVudE9wZXJhdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NjdlMmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWduZW1lbnRPcGVyYXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBc3NpZ25lbWVudE9wZXJhdG9yLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXNzaWduZW1lbnRPcGVyYXRvciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEFzc2lnbmVtZW50T3BlcmF0b3IoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFzc2lnbmVtZW50T3BlcmF0b3IoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTc5ZmU3ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXNzaWdubWVudEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQxZjhhNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNzc0Njc4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RBdHRyaWJ1dGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBdHRyaWJ1dGUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RBdHRyaWJ1dGUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEF0dHJpYnV0ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZUV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxN2E5My4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBdHRyaWJ1dGVFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXR0cmlidXRlRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXR0cmlidXRlRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEF0dHJpYnV0ZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiZjRkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RBdHRyaWJ1dGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEF0dHJpYnV0ZXMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RBdHRyaWJ1dGVzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQXR0cmlidXRlcyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQXR0cmlidXRlcyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDUxMmM4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZUFOREV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZUFOREV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY2YWE2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VBTkRPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFORE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzNWEzMTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZUFORE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VBTkRPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VBTkRPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VBTkRPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZUFORE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9SRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9SRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZGVkNWE4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZU9SRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlOTI2ZmQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUk9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlT1JPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzBhMDY0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VPUk9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJpdHdpc2VPUk9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZU9ST3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlT1JPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQml0d2lzZU9ST3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9SRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjM4MTQzMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9SRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZVhPUkV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTcxZDM4YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCaXR3aXNlWE9ST3AuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTU5NzMxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJpdHdpc2VYT1JPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCaXR3aXNlWE9ST3AuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RCaXR3aXNlWE9ST3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCaXR3aXNlWE9ST3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJpdHdpc2VYT1JPcChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJsb2NrLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCbG9jay5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTE3YzY1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEJsb2NrLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEJsb2NrLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQmxvY2sgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RCbG9jayhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQmxvY2soSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCcmVha1N0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQnJlYWtTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDFiOWUwNS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RCcmVha1N0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RCcmVha1N0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEJyZWFrU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQnJlYWtTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEJyZWFrU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUVsZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlOGQyMDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUVsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ2FzZUVsZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDYXNlRWxlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENhc2VFbGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDYXNlRWxlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENhc2VFbGVtZW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUVsZW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNiODg1OTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUVsZW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENhc2VFbGVtZW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVENhc2VFbGVtZW50cyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENhc2VFbGVtZW50cyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ2FzZUVsZW1lbnRzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ2FzZUxhYmVsLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlTGFiZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1YTc1NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDYXNlTGFiZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ2FzZUxhYmVsLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUQ2FzZUxhYmVsIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUQ2FzZUxhYmVsKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDYXNlTGFiZWwoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RDbGFzc0RlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENsYXNzRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMGU2YTNhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENsYXNzRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RDbGFzc0RlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDbGFzc0RlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDbGFzc0RlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVENsYXNzRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjhlMmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzZlNGUyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29udGludWVTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVENvbnRpbnVlU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjE5YzQuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUQ29udGludWVTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUQ29udGludWVTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RDb250aW51ZVN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVENvbnRpbnVlU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RDb250aW51ZVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURGlyZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxMzMxMzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVERpcmVjdGl2ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVERpcmVjdGl2ZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVERpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURGlyZWN0aXZlKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURGlyZWN0aXZlcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURGlyZWN0aXZlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjN2Q4YTE3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERpcmVjdGl2ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURGlyZWN0aXZlcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVERpcmVjdGl2ZXMgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1REaXJlY3RpdmVzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1REaXJlY3RpdmVzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURG9TdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVERvU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5MjY3NGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURG9TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURG9TdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1REb1N0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVERvU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1REb1N0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVsZW1lbnRMaXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbGVtZW50TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDY1N2QzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVsZW1lbnRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEVsZW1lbnRMaXN0LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURWxlbWVudExpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFbGVtZW50TGlzdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURWxlbWVudExpc3QoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbXB0eVN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW1wdHlTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWM2YmZiYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFbXB0eVN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFbXB0eVN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVtcHR5U3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURW1wdHlTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEVtcHR5U3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW9sQ29tbWVudFNraXBXcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURW9sQ29tbWVudFNraXBXcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNWUyMGM1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVvbENvbW1lbnRTa2lwV3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURW9sQ29tbWVudFNraXBXcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVvbENvbW1lbnRTa2lwV3MgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFb2xDb21tZW50U2tpcFdzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFb2xDb21tZW50U2tpcFdzKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDA4YjUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEVxdWFsT3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXF1YWxPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEVxdWFsT3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFcXVhbE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFcXVhbE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjMTg0YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbGl0eUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXF1YWxpdHlFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXF1YWxpdHlFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFcXVhbGl0eUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2YTQ3MDguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnRCaW5kaW5nLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnRCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNjM2YwYWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFeHBvcnRCaW5kaW5nLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURXhwb3J0QmluZGluZyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cG9ydEJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEV4cG9ydEJpbmRpbmcoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnRCaW5kaW5nTGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0QmluZGluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzk4ZGJjYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHBvcnRCaW5kaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RFeHBvcnRCaW5kaW5nTGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEV4cG9ydEJpbmRpbmdMaXN0IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXhwb3J0QmluZGluZ0xpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEV4cG9ydEJpbmRpbmdMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0RGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwb3J0RGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDNhNjM4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cG9ydERlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwb3J0RGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEV4cG9ydERlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RFeHBvcnREZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHBvcnREZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2ZDNjNWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEV4cHJlc3Npb25TdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U3N2U0Ni4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RFeHByZXNzaW9uU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RFeHByZXNzaW9uU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURXhwcmVzc2lvblN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURXhwcmVzc2lvblN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZpZWxkTGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGRMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiMTgyNzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGRMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZpZWxkTGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZpZWxkTGlzdCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZpZWxkTGlzdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURmllbGRMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURmllbGROYW1lLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGaWVsZE5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiZDU0MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGaWVsZE5hbWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURmllbGROYW1lLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURmllbGROYW1lIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURmllbGROYW1lKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGaWVsZE5hbWUoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbkJpbmRpbmcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvckluQmluZGluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZjMzMTI5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvckluQmluZGluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGb3JJbkJpbmRpbmcuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGb3JJbkJpbmRpbmcgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGb3JJbkJpbmRpbmcoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZvckluQmluZGluZyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvckluaXRpYWxpemVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JJbml0aWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OWRkODZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvckluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZvckluaXRpYWxpemVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURm9ySW5pdGlhbGl6ZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGb3JJbml0aWFsaXplcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURm9ySW5pdGlhbGl6ZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGb3JTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvclN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTk5MWQ5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZvclN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGb3JTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGb3JTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGb3JTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZvclN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxOZXdFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDU1OWIwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bGxOZXdFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bGxOZXdFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURnVsbE5ld0V4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGdWxsTmV3RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVsbE5ld0V4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3U3ViZXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbE5ld1N1YmV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI4MGI0ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsTmV3U3ViZXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVsbE5ld1N1YmV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGNiYTkwNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVsbFBvc3RmaXhFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkNvbW1vbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db21tb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Y5MDY0OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkNvbW1vbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkNvbW1vbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uQ29tbW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25Db21tb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uQ29tbW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db25zdHJ1Y3Rvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25Db25zdHJ1Y3Rvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTE4MTI4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uQ29uc3RydWN0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25Db25zdHJ1Y3Rvci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkRlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZjYjhlYS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkRlZmluaXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNURnVuY3Rpb25EZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNURnVuY3Rpb25EZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNURnVuY3Rpb25EZWZpbml0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RGdW5jdGlvbkRlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjgzNzM5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RGdW5jdGlvbkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RGdW5jdGlvbkV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RGdW5jdGlvbkV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVEZ1bmN0aW9uRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEZ1bmN0aW9uTmFtZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25OYW1lLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjMjM1MzMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNURnVuY3Rpb25OYW1lLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEZ1bmN0aW9uTmFtZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEZ1bmN0aW9uTmFtZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEZ1bmN0aW9uTmFtZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNURnVuY3Rpb25OYW1lKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSWRlbnRpZmllci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSWRlbnRpZmllci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MWViNmMwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUSWRlbnRpZmllci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVElkZW50aWZpZXIgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJZGVudGlmaWVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RJZGVudGlmaWVyKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSWZTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVElmU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3ZDA1MTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSWZTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUSWZTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJZlN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVElmU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RJZlN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEltcG9ydERpcmVjdGl2ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW1wb3J0RGlyZWN0aXZlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjNTU5ZDAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW1wb3J0RGlyZWN0aXZlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEltcG9ydERpcmVjdGl2ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEltcG9ydERpcmVjdGl2ZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEltcG9ydERpcmVjdGl2ZShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW1wb3J0RGlyZWN0aXZlKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW5jbHVkZURpcmVjdGl2ZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW5jbHVkZURpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTZhMGYwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluY2x1ZGVEaXJlY3RpdmUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUSW5jbHVkZURpcmVjdGl2ZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVEluY2x1ZGVEaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RJbmNsdWRlRGlyZWN0aXZlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RJbmNsdWRlRGlyZWN0aXZlKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW5oZXJpdGFuY2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEluaGVyaXRhbmNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEyNjNiZmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUSW5oZXJpdGFuY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUSW5oZXJpdGFuY2UuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbmhlcml0YW5jZSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVEluaGVyaXRhbmNlKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RJbmhlcml0YW5jZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEludGVyZmFjZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVEludGVyZmFjZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTFiZjM3MS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RJbnRlcmZhY2VEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVEludGVyZmFjZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RJbnRlcmZhY2VEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExhYmVsZWRTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExhYmVsZWRTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjgwOWQ3ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMYWJlbGVkU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExhYmVsZWRTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RMYWJlbGVkU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTGFiZWxlZFN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGFiZWxlZFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpc3RFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NGRmMDY2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpc3RFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpc3RFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGlzdEV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMaXN0RXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGlzdEV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpc3RFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWRjNDk4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpc3RFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXN0RXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMaXN0RXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpc3RFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpdGVyYWxFbGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkODA3ZGNiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpdGVyYWxFbGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExpdGVyYWxFbGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTGl0ZXJhbEVsZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMaXRlcmFsRWxlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTGl0ZXJhbEVsZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMaXRlcmFsRmllbGQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpdGVyYWxGaWVsZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIwY2YxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExpdGVyYWxGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMaXRlcmFsRmllbGQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RMaXRlcmFsRmllbGQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMaXRlcmFsRmllbGQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExpdGVyYWxGaWVsZChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxBTkRFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTgzN2Q1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxBTkRFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbEFOREV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTG9naWNhbEFOREV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTNkOWUxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxPUkV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxPUkV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNTc3Yy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTG9naWNhbE9SRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTG9naWNhbE9SRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTFjN2Y2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RNdWxPcC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsT3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY0MzRkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RNdWxPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RNdWxPcC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE11bE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTXVsT3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVE11bE9wKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjkxY2JjMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROYW1lc3BhY2VEZWZpbml0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROYW1lc3BhY2VEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhlZTUyMGEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTmFtZXNwYWNlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1ROYW1lc3BhY2VEZWZpbml0aW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE5hbWVzcGFjZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVE5hbWVzcGFjZURlZmluaXRpb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q1NWMyNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBkMWE5Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RPYmplY3RMaXRlcmFsLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RPYmplY3RMaXRlcmFsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxY2QxMzcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUT2JqZWN0TGl0ZXJhbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RPYmplY3RMaXRlcmFsLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUT2JqZWN0TGl0ZXJhbCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVE9iamVjdExpdGVyYWwoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVE9iamVjdExpdGVyYWwoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZURlZmluaXRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjljYzZkNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYWNrYWdlRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhY2thZ2VEZWZpbml0aW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUGFja2FnZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFBhY2thZ2VEZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlSWRlbnRpZmllcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ5ZjU3NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlSWRlbnRpZmllcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFja2FnZUlkZW50aWZpZXJzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUGFja2FnZUlkZW50aWZpZXJzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUGFja2FnZUlkZW50aWZpZXJzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYWNrYWdlSWRlbnRpZmllcnMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlTmFtZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFja2FnZU5hbWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmRiY2RlMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYWNrYWdlTmFtZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYWNrYWdlTmFtZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBhY2thZ2VOYW1lIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUGFja2FnZU5hbWUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFBhY2thZ2VOYW1lKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYzODA2NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUGFyYW1ldGVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUGFyYW1ldGVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUGFyYW1ldGVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQYXJhbWV0ZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXJJbml0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXJJbml0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM1ZTNhNDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVySW5pdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJhbWV0ZXJJbml0LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUGFyYW1ldGVySW5pdCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhcmFtZXRlckluaXQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFBhcmFtZXRlckluaXQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXJzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlhYjJjYjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUGFyYW1ldGVycy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQYXJhbWV0ZXJzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUGFyYW1ldGVycyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFBhcmFtZXRlcnMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFBhcmFtZXRlcnMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQb3N0Zml4RXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjhmZDQ5Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQb3N0Zml4RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQb3N0Zml4RXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFBvc3RmaXhFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUG9zdGZpeEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFBvc3RmaXhFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUG9zdGZpeE9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQb3N0Zml4T3AuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjEyMmU4NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQb3N0Zml4T3AuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUG9zdGZpeE9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUG9zdGZpeE9wIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUG9zdGZpeE9wKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQb3N0Zml4T3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWEuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODA3ZWYzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWEuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcmFnbWEgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWEoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUFyZ3VtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFBcmd1bWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTA3NGU3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByYWdtYUFyZ3VtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByYWdtYUFyZ3VtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJhZ21hQXJndW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RQcmFnbWFBcmd1bWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJhZ21hQXJndW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFFeHByLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFFeHByLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJlYWUxODEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hRXhwci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWFFeHByLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJhZ21hRXhwciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByYWdtYUV4cHIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYUV4cHIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFJdGVtLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFJdGVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExNTYxNWIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWFJdGVtLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUHJhZ21hSXRlbSBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByYWdtYUl0ZW0oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYUl0ZW0oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFJdGVtcy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJhZ21hSXRlbXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjFhMTY3ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcmFnbWFJdGVtcy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RQcmFnbWFJdGVtcy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFByYWdtYUl0ZW1zIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJhZ21hSXRlbXMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFByYWdtYUl0ZW1zKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJpbWFyeUV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByaW1hcnlFeHByZXNzaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY5MGU3MTkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUHJpbWFyeUV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUHJpbWFyeUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcmltYXJ5RXhwcmVzc2lvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFByaW1hcnlFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RQcmltYXJ5RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb2dyYW0uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb2dyYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjRhYzc1ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9ncmFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByb2dyYW0uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcm9ncmFtIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJvZ3JhbShpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJvZ3JhbShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb3BlcnR5T3BlcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb3BlcnR5T3BlcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDVkZGU0ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9wZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByb3BlcnR5T3BlcmF0b3IuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcm9wZXJ0eU9wZXJhdG9yIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJvcGVydHlPcGVyYXRvcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJvcGVydHlPcGVyYXRvcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb3BlcnR5T3JBcmd1bWVudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFByb3BlcnR5T3JBcmd1bWVudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg4ZTdmNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RQcm9wZXJ0eU9yQXJndW1lbnRzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFByb3BlcnR5T3JBcmd1bWVudHMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUHJvcGVydHlPckFyZ3VtZW50cyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUHJvcGVydHlPckFyZ3VtZW50cyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFF1YWxpZmllZElkZW50aWZpZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFF1YWxpZmllZElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDMxNzlhNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFF1YWxpZmllZElkZW50aWZpZXIuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RRdWFsaWZpZWRJZGVudGlmaWVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUXVhbGlmaWVkSWRlbnRpZmllcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUXVhbGlmaWVkSWRlbnRpZmllcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbE9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxPcC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzE0NzUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlbE9wLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlbE9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsT3AgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RSZWxPcChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVsT3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRmM2I3OS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VhMWFkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXNlcnZlZE5hbWVzcGFjZS5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzZXJ2ZWROYW1lc3BhY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAzNmJkMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXNlcnZlZE5hbWVzcGFjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RSZXNlcnZlZE5hbWVzcGFjZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlc2VydmVkTmFtZXNwYWNlIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmVzZXJ2ZWROYW1lc3BhY2UoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFJlc2VydmVkTmFtZXNwYWNlKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzdFBhcmFtZXRlcnMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3RQYXJhbWV0ZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlYjNkZGIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzdFBhcmFtZXRlcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmVzdFBhcmFtZXRlcnMuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RSZXN0UGFyYW1ldGVycyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlc3RQYXJhbWV0ZXJzKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZXN0UGFyYW1ldGVycyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFJlc3VsdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzdWx0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUxZmExYmYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmVzdWx0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFJlc3VsdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFJlc3VsdCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFJlc3VsdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUUmVzdWx0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUUmV0dXJuU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXR1cm5TdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE2ODMwMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RSZXR1cm5TdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUUmV0dXJuU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUUmV0dXJuU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUUmV0dXJuU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RSZXR1cm5TdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTYy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdmNGNmYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTYy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTYy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXIuSlNQYXJzZXIyMENvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLlRva2VuOwotCi1wdWJsaWMgY2xhc3MgQVNUU2MgZXh0ZW5kcyBTaW1wbGVOb2RlIGltcGxlbWVudHMgSlNQYXJzZXIyMENvbnN0YW50cwotewotICBwdWJsaWMgQVNUU2MoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFNjKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaGlmdEV4cHJlc3Npb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1ZTAxYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaGlmdEV4cHJlc3Npb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU2hpZnRFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU2hpZnRFeHByZXNzaW9uIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU2hpZnRFeHByZXNzaW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTaGlmdEV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaGlmdE9wLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaGlmdE9wLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNTNiZWYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2hpZnRPcC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTaGlmdE9wLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU2hpZnRPcCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFNoaWZ0T3AoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFNoaWZ0T3AoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlN2I2MjAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmZjMGZhLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3RhdGVtZW50LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5OGZmOGYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFN0YXRlbWVudCBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdWJzdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmJiMTYwMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdWJzdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUU3Vic3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3Vic3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUU3Vic3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RTdWJzdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdWJzdGF0ZW1lbnRzLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdWJzdGF0ZW1lbnRzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTU0MjUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUU3Vic3RhdGVtZW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdWJzdGF0ZW1lbnRzLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3Vic3RhdGVtZW50cyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFN1YnN0YXRlbWVudHMoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN1YnN0YXRlbWVudHMoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlckV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1cGVyRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTQxYTFjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1cGVyRXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTdXBlckV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTdXBlckV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdXBlckV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN1cGVyRXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1cGVyU3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTdXBlclN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMTRjODZlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN1cGVyU3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFN1cGVyU3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUU3VwZXJTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTdXBlclN0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUU3VwZXJTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN3aXRjaFN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYzJiMTA3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFN3aXRjaFN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RTd2l0Y2hTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RTd2l0Y2hTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RTd2l0Y2hTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFN3aXRjaFN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFRocm93U3RhdGVtZW50LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUaHJvd1N0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYTQ5OGU2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFRocm93U3RhdGVtZW50LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFRocm93U3RhdGVtZW50LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVGhyb3dTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUaHJvd1N0YXRlbWVudChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVGhyb3dTdGF0ZW1lbnQoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUcnlTdGF0ZW1lbnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFRyeVN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2YzZDljLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFRyeVN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUcnlTdGF0ZW1lbnQuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RUcnlTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUcnlTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFRyeVN0YXRlbWVudChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMmI2NTg4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFR5cGVFeHByZXNzaW9uLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHlwZUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb24oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTc4MjgyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlRXhwcmVzc2lvbkxpc3QuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RUeXBlRXhwcmVzc2lvbkxpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RUeXBlRXhwcmVzc2lvbkxpc3QoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uTGlzdChKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNGVjMmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZUV4cHJlc3Npb25Ob0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFR5cGVFeHByZXNzaW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFR5cGVFeHByZXNzaW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFR5cGVFeHByZXNzaW9uTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVHlwZUV4cHJlc3Npb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlZElkZW50aWZpZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg4OGE4NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlZElkZW50aWZpZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVHlwZWRJZGVudGlmaWVyLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHlwZWRJZGVudGlmaWVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVHlwZWRJZGVudGlmaWVyKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RUeXBlZElkZW50aWZpZXIoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlZElkZW50aWZpZXJOb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RUeXBlZElkZW50aWZpZXJOb0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhYWVmYTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVHlwZWRJZGVudGlmaWVyTm9JTi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RUeXBlZElkZW50aWZpZXJOb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVHlwZWRJZGVudGlmaWVyTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFR5cGVkSWRlbnRpZmllck5vSU4oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFR5cGVkSWRlbnRpZmllck5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbmFyeUV4cHJlc3Npb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVuYXJ5RXhwcmVzc2lvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWNiYzRkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVuYXJ5RXhwcmVzc2lvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVbmFyeUV4cHJlc3Npb24uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RVbmFyeUV4cHJlc3Npb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RVbmFyeUV4cHJlc3Npb24oaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVuYXJ5RXhwcmVzc2lvbihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNjN2FiZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyhKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkY2JmNWRkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0LmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdChpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RVc2VEaXJlY3RpdmUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVzZURpcmVjdGl2ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MWE5ZjE2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFVzZURpcmVjdGl2ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RVc2VEaXJlY3RpdmUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RVc2VEaXJlY3RpdmUgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RVc2VEaXJlY3RpdmUoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFVzZURpcmVjdGl2ZShKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3NTE1ZDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlQmluZGluZyBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZyhpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZTk5MjZlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVCaW5kaW5nTGlzdC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlQmluZGluZ0xpc3QgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NWQ0MjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ05vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlQmluZGluZ05vSU4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmY1MDg4NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUJpbmRpbmdOb0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlQmluZGluZ05vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVCaW5kaW5nTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwODFmZTguLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlRGVmaW5pdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlRGVmaW5pdGlvbiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlRGVmaW5pdGlvbihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVEZWZpbml0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmE2ODZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTk2NTRmLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDRhMzZiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbi5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uKEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlM2NiYzkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4uamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBleHRlbmRzIFNpbXBsZU5vZGUKLXsKLSAgcHVibGljIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYxZjNiOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLXB1YmxpYyBjbGFzcyBBU1RWYXJpYWJsZUluaXRpYWxpemVyIGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXplcihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXplcihKU1BhcnNlcjIwIHAsIGludCBpZCkKLSAgewotICAgIHN1cGVyKHAsIGlkKTsKLSAgfQotCi0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YzNiNDk5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTihpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihpZCk7Ci0gIH0KLQotICBwdWJsaWMgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4oSlNQYXJzZXIyMCBwLCBpbnQgaWQpCi0gIHsKLSAgICBzdXBlcihwLCBpZCk7Ci0gIH0KLQotCi0gIC8qKiBBY2NlcHQgdGhlIHZpc2l0b3IuICoqLwotICBwdWJsaWMgT2JqZWN0IGpqdEFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotICAgIHJldHVybiB2aXNpdG9yLnZpc2l0KHRoaXMsIGRhdGEpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RXaGlsZVN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2hpbGVTdGF0ZW1lbnQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGI2NjRjNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9BU1RXaGlsZVN0YXRlbWVudC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBBU1RXaGlsZVN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFdoaWxlU3RhdGVtZW50IGV4dGVuZHMgU2ltcGxlTm9kZQotewotICBwdWJsaWMgQVNUV2hpbGVTdGF0ZW1lbnQoaW50IGlkKQotICB7Ci0gICAgc3VwZXIoaWQpOwotICB9Ci0KLSAgcHVibGljIEFTVFdoaWxlU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2l0aFN0YXRlbWVudC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvQVNUV2l0aFN0YXRlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTk4MTBiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0FTVFdpdGhTdGF0ZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gQVNUV2l0aFN0YXRlbWVudC5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIEFTVFdpdGhTdGF0ZW1lbnQgZXh0ZW5kcyBTaW1wbGVOb2RlCi17Ci0gIHB1YmxpYyBBU1RXaXRoU3RhdGVtZW50KGludCBpZCkKLSAgewotICAgIHN1cGVyKGlkKTsKLSAgfQotCi0gIHB1YmxpYyBBU1RXaXRoU3RhdGVtZW50KEpTUGFyc2VyMjAgcCwgaW50IGlkKQotICB7Ci0gICAgc3VwZXIocCwgaWQpOwotICB9Ci0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBqanRBY2NlcHQoSlNQYXJzZXIyMFZpc2l0b3IgdmlzaXRvciwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICByZXR1cm4gdmlzaXRvci52aXNpdCh0aGlzLCBkYXRhKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KSlRKU1BhcnNlcjIwU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQyY2I0My4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KSlRKU1BhcnNlcjIwU3RhdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIC5cSkpUSlNQYXJzZXIyMFN0YXRlLmphdmEgKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1jbGFzcyBKSlRKU1BhcnNlcjIwU3RhdGUKLXsKLSAgcHJpdmF0ZSBqYXZhLnV0aWwuU3RhY2sgbm9kZXM7Ci0gIHByaXZhdGUgamF2YS51dGlsLlN0YWNrIG1hcmtzOwotCi0gIHByaXZhdGUgaW50ICAgICBzcDsvLyBudW1iZXIgb2Ygbm9kZXMgb24gc3RhY2sKLSAgcHJpdmF0ZSBpbnQgICAgIG1rOy8vIGN1cnJlbnQgbWFyawotICBwcml2YXRlIGJvb2xlYW4gbm9kZV9jcmVhdGVkOwotCi0gIEpKVEpTUGFyc2VyMjBTdGF0ZSgpCi0gIHsKLSAgICBub2RlcyA9IG5ldyBqYXZhLnV0aWwuU3RhY2soKTsKLSAgICBtYXJrcyA9IG5ldyBqYXZhLnV0aWwuU3RhY2soKTsKLSAgICBzcCA9IDA7Ci0gICAgbWsgPSAwOwotICB9Ci0KLSAgLyogRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBjdXJyZW50IG5vZGUgd2FzIGFjdHVhbGx5IGNsb3NlZCBhbmQKLSAgICAgcHVzaGVkLiAgVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgaW4gdGhlIGZpbmFsIHVzZXIgYWN0aW9uIG9mIGEKLSAgICAgbm9kZSBzY29wZS4gICovCi0gIGJvb2xlYW4gbm9kZUNyZWF0ZWQoKQotICB7Ci0gICAgcmV0dXJuIG5vZGVfY3JlYXRlZDsKLSAgfQotCi0gIC8qIENhbGwgdGhpcyB0byByZWluaXRpYWxpemUgdGhlIG5vZGUgc3RhY2suICBJdCBpcyBjYWxsZWQKLSAgICAgYXV0b21hdGljYWxseSBieSB0aGUgcGFyc2VyJ3MgUmVJbml0KCkgbWV0aG9kLiAqLwotICB2b2lkIHJlc2V0KCkKLSAgewotICAgIG5vZGVzLnJlbW92ZUFsbEVsZW1lbnRzKCk7Ci0gICAgbWFya3MucmVtb3ZlQWxsRWxlbWVudHMoKTsKLSAgICBzcCA9IDA7Ci0gICAgbWsgPSAwOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgcm9vdCBub2RlIG9mIHRoZSBBU1QuICBJdCBvbmx5IG1ha2VzIHNlbnNlIHRvIGNhbGwKLSAgICAgdGhpcyBhZnRlciBhIHN1Y2Nlc3NmdWwgcGFyc2UuICovCi0gIE5vZGUgcm9vdE5vZGUoKQotICB7Ci0gICAgcmV0dXJuIChOb2RlKSBub2Rlcy5lbGVtZW50QXQoMCk7Ci0gIH0KLQotICAvKiBQdXNoZXMgYSBub2RlIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBwdXNoTm9kZShOb2RlIG4pCi0gIHsKLSAgICBub2Rlcy5wdXNoKG4pOwotICAgICsrc3A7Ci0gIH0KLQotICAvKiBSZXR1cm5zIHRoZSBub2RlIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLCBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlCi0gICAgIHN0YWNrLiAgKi8KLSAgTm9kZSBwb3BOb2RlKCkKLSAgewotCi0gICAgaWYgKC0tc3AgPCBtaykKLSAgICB7Ci0gICAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIChOb2RlKSBub2Rlcy5wb3AoKTsKLSAgfQotCi0gIC8qIFJldHVybnMgdGhlIG5vZGUgY3VycmVudGx5IG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLiAqLwotICBOb2RlIHBlZWtOb2RlKCkKLSAgewotICAgIHJldHVybiAoTm9kZSkgbm9kZXMucGVlaygpOwotICB9Ci0KLSAgLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGNoaWxkcmVuIG9uIHRoZSBzdGFjayBpbiB0aGUgY3VycmVudCBub2RlCi0gICAgIHNjb3BlLiAqLwotICBpbnQgbm9kZUFyaXR5KCkKLSAgewotICAgIHJldHVybiBzcCAtIG1rOwotICB9Ci0KLQotICB2b2lkIGNsZWFyTm9kZVNjb3BlKE5vZGUgbikKLSAgewotCi0gICAgd2hpbGUgKHNwID4gbWspCi0gICAgewotICAgICAgcG9wTm9kZSgpOwotICAgIH0KLQotICAgIG1rID0gKChJbnRlZ2VyKSBtYXJrcy5wb3AoKSkuaW50VmFsdWUoKTsKLSAgfQotCi0KLSAgdm9pZCBvcGVuTm9kZVNjb3BlKE5vZGUgbikKLSAgewotICAgIG1hcmtzLnB1c2gobmV3IEludGVnZXIobWspKTsKLSAgICBtayA9IHNwOwotICAgIG4uamp0T3BlbigpOwotICB9Ci0KLQotICAvKiBBIGRlZmluaXRlIG5vZGUgaXMgY29uc3RydWN0ZWQgZnJvbSBhIHNwZWNpZmllZCBudW1iZXIgb2YKLSAgICAgY2hpbGRyZW4uICBUaGF0IG51bWJlciBvZiBub2RlcyBhcmUgcG9wcGVkIGZyb20gdGhlIHN0YWNrIGFuZAotICAgICBtYWRlIHRoZSBjaGlsZHJlbiBvZiB0aGUgZGVmaW5pdGUgbm9kZS4gIFRoZW4gdGhlIGRlZmluaXRlIG5vZGUKLSAgICAgaXMgcHVzaGVkIG9uIHRvIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGludCBudW0pCi0gIHsKLSAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0KLSAgICB3aGlsZSAobnVtLS0gPiAwKQotICAgIHsKLSAgICAgIE5vZGUgYyA9IHBvcE5vZGUoKTsKLSAgICAgIGMuamp0U2V0UGFyZW50KG4pOwotICAgICAgbi5qanRBZGRDaGlsZChjLCBudW0pOwotICAgIH0KLQotICAgIG4uamp0Q2xvc2UoKTsKLSAgICBwdXNoTm9kZShuKTsKLSAgICBub2RlX2NyZWF0ZWQgPSB0cnVlOwotICB9Ci0KLQotICAvKiBBIGNvbmRpdGlvbmFsIG5vZGUgaXMgY29uc3RydWN0ZWQgaWYgaXRzIGNvbmRpdGlvbiBpcyB0cnVlLiAgQWxsCi0gICAgIHRoZSBub2RlcyB0aGF0IGhhdmUgYmVlbiBwdXNoZWQgc2luY2UgdGhlIG5vZGUgd2FzIG9wZW5lZCBhcmUKLSAgICAgbWFkZSBjaGlsZHJlbiBvZiB0aGUgdGhlIGNvbmRpdGlvbmFsIG5vZGUsIHdoaWNoIGlzIHRoZW4gcHVzaGVkCi0gICAgIG9uIHRvIHRoZSBzdGFjay4gIElmIHRoZSBjb25kaXRpb24gaXMgZmFsc2UgdGhlIG5vZGUgaXMgbm90Ci0gICAgIGNvbnN0cnVjdGVkIGFuZCB0aGV5IGFyZSBsZWZ0IG9uIHRoZSBzdGFjay4gKi8KLSAgdm9pZCBjbG9zZU5vZGVTY29wZShOb2RlIG4sIGJvb2xlYW4gY29uZGl0aW9uKQotICB7Ci0KLSAgICBpZiAoY29uZGl0aW9uKQotICAgIHsKLSAgICAgIGludCBhID0gbm9kZUFyaXR5KCk7Ci0gICAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0KLSAgICAgIHdoaWxlIChhLS0gPiAwKQotICAgICAgewotICAgICAgICBOb2RlIGMgPSBwb3BOb2RlKCk7Ci0gICAgICAgIGMuamp0U2V0UGFyZW50KG4pOwotICAgICAgICBuLmpqdEFkZENoaWxkKGMsIGEpOwotICAgICAgfQotCi0gICAgICBuLmpqdENsb3NlKCk7Ci0gICAgICBwdXNoTm9kZShuKTsKLSAgICAgIG5vZGVfY3JlYXRlZCA9IHRydWU7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBtayA9ICgoSW50ZWdlcikgbWFya3MucG9wKCkpLmludFZhbHVlKCk7Ci0gICAgICBub2RlX2NyZWF0ZWQgPSBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjAuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgxNTM0ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5NDEwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWUmSmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIEpTUGFyc2VyMjAuamF2YSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLXB1YmxpYyBjbGFzcyBKU1BhcnNlcjIwLypAYmdlbihqanRyZWUpKi9pbXBsZW1lbnRzIEpTUGFyc2VyMjBUcmVlQ29uc3RhbnRzLCBKU1BhcnNlcjIwQ29uc3RhbnRzIHsvKkBiZ2VuKGpqdHJlZSkqLwotICBwcm90ZWN0ZWQgSkpUSlNQYXJzZXIyMFN0YXRlIGpqdHJlZSA9IG5ldyBKSlRKU1BhcnNlcjIwU3RhdGUoKTsvLwotICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgbm9kZSBmb3IgdGhlIHBhcnNlIHRyZWUgKHJvb3QgRE9NIG5vZGUsIHRyZWUgb2YgU2ltcGxlTm9kZShzKSkKLSAgICAvLwotICAgIHByb3RlY3RlZCBBU1RQcm9ncmFtIF9qanRSb290OwotCi0gICAgcHVibGljIEFTVFByb2dyYW0gZ2V0Um9vdE5vZGUoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIF9qanRSb290OwotICAgIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gR1JBTU1BUiBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyBUb2tlbiBQcm9ncmFtKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJvZ3JhbSAqLwotICAgICAgICBBU1RQcm9ncmFtIGpqdG4wMDAgPSBuZXcgQVNUUHJvZ3JhbSh0aGlzLCBKSlRQUk9HUkFNKTsKLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgICAgICAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7VG9rZW4gcmV0dmFsID0gZ2V0VG9rZW4oMSk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBQQUNLQUdFOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMF0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTsKLSAgICAgICAgfQotICAgICAgICBQYWNrYWdlRGVmaW5pdGlvbigpOwotICAgICAgfQotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEJSRUFLOgotICAgICAgY2FzZSBDTEFTUzoKLSAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICBjYXNlIERPOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgRk9SOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJRjoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgTkFNRVNQQUNFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFNVUEVSOgotICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICBjYXNlIFRIUk9XOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBUUlk6Ci0gICAgICBjYXNlIFRZUEVPRjoKLSAgICAgIGNhc2UgVVNFOgotICAgICAgY2FzZSBWQVI6Ci0gICAgICBjYXNlIFZPSUQ6Ci0gICAgICBjYXNlIFdISUxFOgotICAgICAgY2FzZSBXSVRIOgotICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICBjYXNlIElOVEVSRkFDRToKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJTVBPUlQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgY2FzZSBCQU5HOgotICAgICAgY2FzZSBUSUxERToKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgIGNhc2UgREVDUjoKLSAgICAgIGNhc2UgUExVUzoKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIERpcmVjdGl2ZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oMCk7Ci0gICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgIF9qanRSb290ID0gamp0bjAwMDsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgcmV0dXJuIHJldHZhbDt9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgICB0aHJvdyBuZXcgRXJyb3IoIk1pc3NpbmcgcmV0dXJuIHN0YXRlbWVudCBpbiBmdW5jdGlvbiIpOwotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFeHByZXNzaW9ucyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJZGVudGlmaWVyIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIElkZW50aWZpZXIgKi8KLSAgQVNUSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVElkZW50aWZpZXIodGhpcywgSkpUSURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJREVOVElGSUVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihHRVQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0VUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOQ0xVREUpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBRdWFsaWZpZWQgSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyICovCi0gIEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVFNJTVBMRVFVQUxJRklFRElERU5USUZJRVIpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFFVQUxJRklFUjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFFVQUxJRklFUik7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszXSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBSZXNlcnZlZE5hbWVzcGFjZSgpOwotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBRVUFMSUZJRVI6Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihRVUFMSUZJRVIpOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNF0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzVdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciAqLwotICBBU1RFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVEVYUFJFU1NJT05RVUFMSUZJRURJREVOVElGSUVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFFVQUxJRklFUik7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUXVhbGlmaWVkSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFF1YWxpZmllZElkZW50aWZpZXIgKi8KLSAgQVNUUXVhbGlmaWVkSWRlbnRpZmllciBqanRuMDAwID0gbmV3IEFTVFF1YWxpZmllZElkZW50aWZpZXIodGhpcywgSkpUUVVBTElGSUVESURFTlRJRklFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzZdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgIH0KLSAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQcmltYXJ5IEV4cHJlc3Npb25zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmltYXJ5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByaW1hcnlFeHByZXNzaW9uICovCi0gIEFTVFByaW1hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUUHJpbWFyeUV4cHJlc3Npb24odGhpcywgSkpUUFJJTUFSWUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUUlVFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRSVUUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkFMU0UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ0lNQUxfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE9DVEFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSEVYX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVEhJUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVHVUxBUl9FWFBSRVNTSU9OKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgQXJyYXlMaXRlcmFsKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIE9iamVjdExpdGVyYWwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBGdW5jdGlvbkV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbN10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgdG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgfQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgIH0KLSAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVzZXJ2ZWROYW1lc3BhY2UoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBSZXNlcnZlZE5hbWVzcGFjZSAqLwotICBBU1RSZXNlcnZlZE5hbWVzcGFjZSBqanRuMDAwID0gbmV3IEFTVFJlc2VydmVkTmFtZXNwYWNlKHRoaXMsIEpKVFJFU0VSVkVETkFNRVNQQUNFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUFVCTElDKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihQUk9URUNURUQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihQUklWQVRFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbOF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRnVuY3Rpb24gRXhwcmVzc2lvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25FeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25FeHByZXNzaW9uICovCi0gIEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uRXhwcmVzc2lvbih0aGlzLCBKSlRGVU5DVElPTkVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMSgyKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OKTsKLSAgICAgICAgRnVuY3Rpb25Db21tb24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRlVOQ1RJT04pOwotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBGdW5jdGlvbkNvbW1vbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE9iamVjdCBMaXRlcmFscwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgT2JqZWN0TGl0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE9iamVjdExpdGVyYWwgKi8KLSAgQVNUT2JqZWN0TGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVE9iamVjdExpdGVyYWwodGhpcywgSkpUT0JKRUNUTElURVJBTCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIEZpZWxkTGlzdCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRmllbGRMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRmllbGRMaXN0ICovCi0gIEFTVEZpZWxkTGlzdCBqanRuMDAwID0gbmV3IEFTVEZpZWxkTGlzdCh0aGlzLCBKSlRGSUVMRExJU1QpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTGl0ZXJhbEZpZWxkKCk7Ci0gICAgICBsYWJlbF8yOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgTGl0ZXJhbEZpZWxkKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpdGVyYWxGaWVsZCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExpdGVyYWxGaWVsZCAqLwotICBBU1RMaXRlcmFsRmllbGQgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsRmllbGQodGhpcywgSkpUTElURVJBTEZJRUxEKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEZpZWxkTmFtZSgpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGaWVsZE5hbWUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGaWVsZE5hbWUgKi8KLSAgQVNURmllbGROYW1lIGpqdG4wMDAgPSBuZXcgQVNURmllbGROYW1lKHRoaXMsIEpKVEZJRUxETkFNRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1RSSU5HX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ0lNQUxfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFFVQUxJRklFUjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFFVQUxJRklFUik7Ci0gICAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMl0gPSBqal9nZW47Ci0gICAgICAgICAgOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEzXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEFycmF5IExpdGVyYWwKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFycmF5TGl0ZXJhbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFycmF5TGl0ZXJhbCAqLwotICBBU1RBcnJheUxpdGVyYWwgamp0bjAwMCA9IG5ldyBBU1RBcnJheUxpdGVyYWwodGhpcywgSkpUQVJSQVlMSVRFUkFMKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEJSQUNLRVQpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIERFTEVURToKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5FVzoKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFNVUEVSOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFZPSUQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgY2FzZSBCQU5HOgotICAgICAgY2FzZSBUSUxERToKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgIGNhc2UgREVDUjoKLSAgICAgIGNhc2UgUExVUzoKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIEVsZW1lbnRMaXN0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzE0XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgampfY29uc3VtZV90b2tlbihSQlJBQ0tFVCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEVsZW1lbnRMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRWxlbWVudExpc3QgKi8KLSAgQVNURWxlbWVudExpc3Qgamp0bjAwMCA9IG5ldyBBU1RFbGVtZW50TGlzdCh0aGlzLCBKSlRFTEVNRU5UTElTVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBMaXRlcmFsRWxlbWVudCgpOwotICAgICAgbGFiZWxfMzoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzM7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICAgIExpdGVyYWxFbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpdGVyYWxFbGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEVsZW1lbnQgKi8KLSAgQVNUTGl0ZXJhbEVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsRWxlbWVudCh0aGlzLCBKSlRMSVRFUkFMRUxFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN1cGVyIEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFN1cGVyRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1cGVyRXhwcmVzc2lvbiAqLwotICBBU1RTdXBlckV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RTdXBlckV4cHJlc3Npb24odGhpcywgSkpUU1VQRVJFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU1VQRVIpOwotICAgICAgaWYgKGpqXzJfMigyKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBQb3N0Zml4IEV4cHJlc3Npb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBvc3RmaXhFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeEV4cHJlc3Npb24gKi8KLSAgQVNUUG9zdGZpeEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RQb3N0Zml4RXhwcmVzc2lvbih0aGlzLCBKSlRQT1NURklYRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uKCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgICBQb3N0Zml4T3AoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTZdID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICBjYXNlIFRSVUU6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdJbnZhbGlkKCk7Ci0gICAgICAgIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbigpOwotICAgICAgICBsYWJlbF80OgotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzE3XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGJyZWFrIGxhYmVsXzQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIFByb3BlcnR5T3JBcmd1bWVudHMoKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgUG9zdGZpeE9wKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzE4XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNVUEVSOgotICAgICAgICBTdXBlckV4cHJlc3Npb24oKTsKLSAgICAgICAgUHJvcGVydHlPcGVyYXRvcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxOV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXR0cmlidXRlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZUV4cHJlc3Npb24gKi8KLSAgQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24odGhpcywgSkpUQVRUUklCVVRFRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk7Ci0gICAgICBsYWJlbF81OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICBjYXNlIERPVDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzIwXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF81OwotICAgICAgICB9Ci0gICAgICAgIFByb3BlcnR5T3JBcmd1bWVudHMoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVsbFBvc3RmaXhFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRnVsbFBvc3RmaXhFeHByZXNzaW9uICovCi0gIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMUE9TVEZJWEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMygyMTQ3NDgzNjQ3KSkgewotICAgICAgICBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgY2FzZSBUSElTOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICBQcmltYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgICBGdWxsTmV3RXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyMV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGdWxsTmV3RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bGxOZXdFeHByZXNzaW9uICovCi0gIEFTVEZ1bGxOZXdFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURnVsbE5ld0V4cHJlc3Npb24odGhpcywgSkpURlVMTE5FV0VYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihORVcpOwotICAgICAgRnVsbE5ld1N1YmV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzY6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBpZiAoampfMl80KDIpKSB7Ci0gICAgICAgICAgOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGJyZWFrIGxhYmVsXzY7Ci0gICAgICAgIH0KLSAgICAgICAgUHJvcGVydHlPcGVyYXRvcigpOwotICAgICAgfQotICAgICAgaWYgKGpqXzJfNSgyKSkgewotICAgICAgICBBcmd1bWVudHMoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVuY3Rpb25Db25zdHJ1Y3RvcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uQ29uc3RydWN0b3IgKi8KLSAgQVNURnVuY3Rpb25Db25zdHJ1Y3RvciBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29uc3RydWN0b3IodGhpcywgSkpURlVOQ1RJT05DT05TVFJVQ1RPUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEZVTkNUSU9OXyk7Ci0gICAgICBBcmd1bWVudHMoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRnVsbE5ld1N1YmV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdWxsTmV3U3ViZXhwcmVzc2lvbiAqLwotICBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uKHRoaXMsIEpKVEZVTExORVdTVUJFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzYoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgUHJpbWFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIFN1cGVyRXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgICBGdWxsTmV3RXhwcmVzc2lvbigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZVTkNUSU9OXzoKLSAgICAgICAgICBGdW5jdGlvbkNvbnN0cnVjdG9yKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzIyXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQb3N0Zml4T3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQb3N0Zml4T3AgKi8KLSAgQVNUUG9zdGZpeE9wIGpqdG4wMDAgPSBuZXcgQVNUUG9zdGZpeE9wKHRoaXMsIEpKVFBPU1RGSVhPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTkNSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oREVDUik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzIzXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJvcGVydHlPckFyZ3VtZW50cygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByb3BlcnR5T3JBcmd1bWVudHMgKi8KLSAgQVNUUHJvcGVydHlPckFyZ3VtZW50cyBqanRuMDAwID0gbmV3IEFTVFByb3BlcnR5T3JBcmd1bWVudHModGhpcywgSkpUUFJPUEVSVFlPUkFSR1VNRU5UUyk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBBcmd1bWVudHMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgY2FzZSBET1Q6Ci0gICAgICAgIFByb3BlcnR5T3BlcmF0b3IoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMjRdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJvcGVydHkgT3BlcmF0b3JzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQcm9wZXJ0eU9wZXJhdG9yKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJvcGVydHlPcGVyYXRvciAqLwotICBBU1RQcm9wZXJ0eU9wZXJhdG9yIGpqdG4wMDAgPSBuZXcgQVNUUHJvcGVydHlPcGVyYXRvcih0aGlzLCBKSlRQUk9QRVJUWU9QRVJBVE9SKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBET1Q6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKLSAgICAgICAgUXVhbGlmaWVkSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsyNl0gPSBqal9nZW47Ci0gICAgICAgIGlmIChqal8yXzcoMikpIHsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKLSAgICAgICAgfSBlbHNlIGlmIChqal8yXzgoMikpIHsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDS0VUKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVMSVBTRSk7Ci0gICAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDS0VUKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0tFVCk7Ci0gICAgICAgICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgICBjYXNlIEVMSVBTRToKLSAgICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgIGpqX2xhMVsyNV0gPSBqal9nZW47Ci0gICAgICAgICAgICAgIDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNLRVQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsyN10gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBcmd1bWVudHMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBcmd1bWVudHMgKi8KLSBBU1RBcmd1bWVudHMgamp0bjAwMCA9IG5ldyBBU1RBcmd1bWVudHModGhpcywgSkpUQVJHVU1FTlRTKTsKLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApO3t0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTt9Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzkoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICB9IGVsc2UgaWYgKGpqXzJfMTAoMikpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEVMSVBTRSk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIEVMSVBTRToKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRUxJUFNFKTsKLSAgICAgICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzI4XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsyOV0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVbmFyeSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBVbmFyeUV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8KLSAgQVNUVW5hcnlFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVW5hcnlFeHByZXNzaW9uKHRoaXMsIEpKVFVOQVJZRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5FVzoKLSAgICAgIGNhc2UgTlVMTDoKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFNVUEVSOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERFTEVURToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUxFVEUpOwotICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihWT0lEKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVFlQRU9GKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTkNSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOQ1IpOwotICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihERUNSKTsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVUyk7Ci0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTUlOVVMpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRJTERFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRJTERFKTsKLSAgICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCQU5HOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEJBTkcpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMzBdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTXVsdGlwbGljYXRpdmUgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgTXVsT3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBNdWxPcCAqLwotICBBU1RNdWxPcCBqanRuMDAwID0gbmV3IEFTVE11bE9wKHRoaXMsIEpKVE1VTE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBTVEFSOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUQVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0xBU0g6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0xBU0gpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUkVNOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJFTSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzMxXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uICovCi0gIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbih0aGlzLCBKSlRNVUxUSVBMSUNBVElWRUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVW5hcnlFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF83OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU1RBUjoKLSAgICAgICAgY2FzZSBTTEFTSDoKLSAgICAgICAgY2FzZSBSRU06Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszMl0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfNzsKLSAgICAgICAgfQotICAgICAgICBNdWxPcCgpOwotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBZGRpdGl2ZSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBBZGRPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFkZE9wICovCi0gIEFTVEFkZE9wIGpqdG4wMDAgPSBuZXcgQVNUQWRkT3AodGhpcywgSkpUQURET1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUExVUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihNSU5VUyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzMzXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQWRkaXRpdmVFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQWRkaXRpdmVFeHByZXNzaW9uICovCi0gIEFTVEFkZGl0aXZlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEFkZGl0aXZlRXhwcmVzc2lvbih0aGlzLCBKSlRBRERJVElWRUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF84OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzM0XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF84OwotICAgICAgICB9Ci0gICAgICAgIEFkZE9wKCk7Ci0gICAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpdHdpc2UgU2hpZnQgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU2hpZnRPcCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFNoaWZ0T3AgKi8KLSAgQVNUU2hpZnRPcCBqanRuMDAwID0gbmV3IEFTVFNoaWZ0T3AodGhpcywgSkpUU0hJRlRPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFNISUZUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExTSElGVCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSU0lHTkVEU0hJRlQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlNJR05FRFNISUZUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJVTlNJR05FRFNISUZUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJVTlNJR05FRFNISUZUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMzVdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBTaGlmdEV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTaGlmdEV4cHJlc3Npb24gKi8KLSAgQVNUU2hpZnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU2hpZnRFeHByZXNzaW9uKHRoaXMsIEpKVFNISUZURVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBBZGRpdGl2ZUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzk6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBMU0hJRlQ6Ci0gICAgICAgIGNhc2UgUlNJR05FRFNISUZUOgotICAgICAgICBjYXNlIFJVTlNJR05FRFNISUZUOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMzZdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzk7Ci0gICAgICAgIH0KLSAgICAgICAgU2hpZnRPcCgpOwotICAgICAgICBBZGRpdGl2ZUV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSZWxhdGlvbmFsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlbE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUmVsT3AgKi8KLSAgQVNUUmVsT3Agamp0bjAwMCA9IG5ldyBBU1RSZWxPcCh0aGlzLCBKSlRSRUxPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgTFQ6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR1Q6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR1QpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTEU6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTEUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgR0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oR0UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQVM6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVMpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVszN10gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb24gKi8KLSAgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbih0aGlzLCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBTaGlmdEV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzEwOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgaWYgKGpqXzJfMTEoMykpIHsKLSAgICAgICAgICA7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTA7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQVM6Ci0gICAgICAgIGNhc2UgSVM6Ci0gICAgICAgIGNhc2UgR1Q6Ci0gICAgICAgIGNhc2UgTFQ6Ci0gICAgICAgIGNhc2UgTEU6Ci0gICAgICAgIGNhc2UgR0U6Ci0gICAgICAgICAgUmVsT3AoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5TVEFOQ0VPRik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzM4XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOICovCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgU2hpZnRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xMToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEFTOgotICAgICAgICBjYXNlIElOU1RBTkNFT0Y6Ci0gICAgICAgIGNhc2UgSVM6Ci0gICAgICAgIGNhc2UgR1Q6Ci0gICAgICAgIGNhc2UgTFQ6Ci0gICAgICAgIGNhc2UgTEU6Ci0gICAgICAgIGNhc2UgR0U6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVszOV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTE7Ci0gICAgICAgIH0KLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQVM6Ci0gICAgICAgIGNhc2UgSVM6Ci0gICAgICAgIGNhc2UgR1Q6Ci0gICAgICAgIGNhc2UgTFQ6Ci0gICAgICAgIGNhc2UgTEU6Ci0gICAgICAgIGNhc2UgR0U6Ci0gICAgICAgICAgUmVsT3AoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJTlNUQU5DRU9GOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5TVEFOQ0VPRik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQwXSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFcXVhbGl0eSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXF1YWxPcCAqLwotICBBU1RFcXVhbE9wIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxPcCh0aGlzLCBKSlRFUVVBTE9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBFUToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihFUSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBORToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihORSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJREVOVElUWU9QRVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSURFTlRJVFlPUEVSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5PVElERU5USVRZT1BFUjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihOT1RJREVOVElUWU9QRVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs0MV0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEVxdWFsaXR5RXhwcmVzc2lvbiAqLwotICBBU1RFcXVhbGl0eUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFcXVhbGl0eUV4cHJlc3Npb24odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8xMjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEVROgotICAgICAgICBjYXNlIE5FOgotICAgICAgICBjYXNlIElERU5USVRZT1BFUjoKLSAgICAgICAgY2FzZSBOT1RJREVOVElUWU9QRVI6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs0Ml0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMTI7Ci0gICAgICAgIH0KLSAgICAgICAgRXF1YWxPcCgpOwotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTiAqLwotICBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRFUVVBTElUWUVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOwotICAgICAgbGFiZWxfMTM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFUToKLSAgICAgICAgY2FzZSBORToKLSAgICAgICAgY2FzZSBJREVOVElUWU9QRVI6Ci0gICAgICAgIGNhc2UgTk9USURFTlRJVFlPUEVSOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDNdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzEzOwotICAgICAgICB9Ci0gICAgICAgIEVxdWFsT3AoKTsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmluYXJ5IEJpdHdpc2UgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZUFORE9wKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFORE9wICovCi0gIEFTVEJpdHdpc2VBTkRPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VBTkRPcCh0aGlzLCBKSlRCSVRXSVNFQU5ET1ApOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihCSVRfQU5EKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFOREV4cHJlc3Npb24gKi8KLSAgQVNUQml0d2lzZUFOREV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbih0aGlzLCBKSlRCSVRXSVNFQU5ERVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzE0OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQklUX0FORDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ0XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNDsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlQU5ET3AoKTsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiAqLwotICBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQklUV0lTRUFOREVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzE1OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQklUX0FORDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzQ1XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8xNTsKLSAgICAgICAgfQotICAgICAgICBCaXR3aXNlQU5ET3AoKTsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlWE9ST3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9ST3AgKi8KLSAgQVNUQml0d2lzZVhPUk9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUk9wKHRoaXMsIEpKVEJJVFdJU0VYT1JPUCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFhPUik7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uICovCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUkV4cHJlc3Npb24odGhpcywgSkpUQklUV0lTRVhPUkVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzE2OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgWE9SOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDZdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE2OwotICAgICAgICB9Ci0gICAgICAgIEJpdHdpc2VYT1JPcCgpOwotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzE3OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgWE9SOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDddID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE3OwotICAgICAgICB9Ci0gICAgICAgIEJpdHdpc2VYT1JPcCgpOwotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQml0d2lzZU9ST3AoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JPcCAqLwotICBBU1RCaXR3aXNlT1JPcCBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VPUk9wKHRoaXMsIEpKVEJJVFdJU0VPUk9QKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQklUX09SKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VPUkV4cHJlc3Npb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uICovCi0gIEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VPUkVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb24oKTsKLSAgICAgIGxhYmVsXzE4OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQklUX09SOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDhdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE4OwotICAgICAgICB9Ci0gICAgICAgIEJpdHdpc2VPUk9wKCk7Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRCSVRXSVNFT1JFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzE5OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQklUX09SOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNDldID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzE5OwotICAgICAgICB9Ci0gICAgICAgIEJpdHdpc2VPUk9wKCk7Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpbmFyeSBMb2dpY2FsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb24gKi8KLSAgQVNUTG9naWNhbEFOREV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbih0aGlzLCBKSlRMT0dJQ0FMQU5ERVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBCaXR3aXNlT1JFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8yMDoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIFNDX0FORDoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzUwXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yMDsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX0FORCk7Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOICovCi0gIEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMT0dJQ0FMQU5ERVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGxhYmVsXzIxOgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU0NfQU5EOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNTFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzIxOwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0NfQU5EKTsKLSAgICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIExvZ2ljYWxPUkV4cHJlc3Npb24gKi8KLSAgQVNUTG9naWNhbE9SRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVExvZ2ljYWxPUkV4cHJlc3Npb24odGhpcywgSkpUTE9HSUNBTE9SRVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBTQ19PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzUyXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yMjsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX09SKTsKLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiAqLwotICBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVExPR0lDQUxPUkVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpOwotICAgICAgbGFiZWxfMjM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBTQ19PUjoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzUzXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yMzsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX09SKTsKLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29uZGl0aW9uYWwgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ29uZGl0aW9uYWxFeHByZXNzaW9uICovCi0gIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbih0aGlzLCBKSlRDT05ESVRJT05BTEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEhPT0s6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1NF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4gKi8KLSAgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQ09ORElUSU9OQUxFWFBSRVNTSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEhPT0s6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzU1XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uICovCi0gIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEhPT0s6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7Ci0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1Nl0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOICovCi0gIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTih0aGlzLCBKSlROT05BU1NJR05NRU5URVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBIT09LOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEhPT0spOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs1N10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBc3NpZ25tZW50IE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFzc2lnbmVtZW50T3BlcmF0b3IoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBc3NpZ25lbWVudE9wZXJhdG9yICovCi0gIEFTVEFzc2lnbmVtZW50T3BlcmF0b3Igamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKHRoaXMsIEpKVEFTU0lHTkVNRU5UT1BFUkFUT1IpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU1RBUkFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVEFSQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNMQVNIQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNMQVNIQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFJFTUFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSRU1BU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUExVU0FTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihQTFVTQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1JTlVTQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE1JTlVTQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIExTSElGVEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihMU0hJRlRBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUlNJR05FRFNISUZUQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJTSUdORURTSElGVEFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBSVU5TSUdORURTSElGVEFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSVU5TSUdORURTSElGVEFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBBTkRBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQU5EQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFhPUkFTU0lHTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihYT1JBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgT1JBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oT1JBU1NJR04pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0NfQU5EQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX0FOREFTU0lHTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTQ19YT1JBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0NfWE9SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNDX09SQVNTSUdOOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNDX09SQVNTSUdOKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNThdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFzc2lnbm1lbnRFeHByZXNzaW9uICovCi0gIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQXNzaWdubWVudEV4cHJlc3Npb24odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk7Ci0gICAgICBpZiAoampfMl8xMigyKSkgewotICAgICAgICBBc3NpZ25lbWVudE9wZXJhdG9yKCk7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAqLwotICBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT05OT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIGlmIChqal8yXzEzKDIpKSB7Ci0gICAgICAgIEFzc2lnbmVtZW50T3BlcmF0b3IoKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29tbWEgRXhwcmVzc2lvbnMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExpc3RFeHByZXNzaW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTGlzdEV4cHJlc3Npb24gKi8KLSAgQVNUTGlzdEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMaXN0RXhwcmVzc2lvbih0aGlzLCBKSlRMSVNURVhQUkVTU0lPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgbGFiZWxfMjQ6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzU5XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8yNDsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgTGlzdEV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgTGlzdEV4cHJlc3Npb25Ob0lOICovCi0gIEFTVExpc3RFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExpc3RFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRMSVNURVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgICBsYWJlbF8yNToKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjBdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI1OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUeXBlIEV4cHJlc3Npb25zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBUeXBlRXhwcmVzc2lvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uICovCi0gIEFTVFR5cGVFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUVHlwZUV4cHJlc3Npb24odGhpcywgSkpUVFlQRUVYUFJFU1NJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVHlwZUV4cHJlc3Npb25Ob0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVHlwZUV4cHJlc3Npb25Ob0lOICovCi0gIEFTVFR5cGVFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRUWVBFRVhQUkVTU0lPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVFeHByZXNzaW9uTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTGlzdCAqLwotICBBU1RUeXBlRXhwcmVzc2lvbkxpc3Qgamp0bjAwMCA9IG5ldyBBU1RUeXBlRXhwcmVzc2lvbkxpc3QodGhpcywgSkpUVFlQRUVYUFJFU1NJT05MSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICBsYWJlbF8yNjoKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI2OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN0YWVtZW50cyAoYWJicmV2LCBub1Nob3J0SWYsIGZ1bGwpIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU3RhdGVtZW50ICovCi0gIEFTVFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN0YXRlbWVudCh0aGlzLCBKSlRTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMTQoMykpIHsKLSAgICAgICAgRXhwcmVzc2lvblN0YXRlbWVudCgpOwotICAgICAgICBTYygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgICAgU3VwZXJTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgICBCbG9jaygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIExhYmVsZWRTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBJRjoKLSAgICAgICAgICBJZlN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFNXSVRDSDoKLSAgICAgICAgICBTd2l0Y2hTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBETzoKLSAgICAgICAgICBEb1N0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICAgICAgV2hpbGVTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgICAgRm9yU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV0lUSDoKLSAgICAgICAgICBXaXRoU3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgQ09OVElOVUU6Ci0gICAgICAgICAgQ29udGludWVTdGF0ZW1lbnQoKTsKLSAgICAgICAgICBTYygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEJSRUFLOgotICAgICAgICAgIEJyZWFrU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSRVRVUk46Ci0gICAgICAgICAgUmV0dXJuU3RhdGVtZW50KCk7Ci0gICAgICAgICAgU2MoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBUSFJPVzoKLSAgICAgICAgICBUaHJvd1N0YXRlbWVudCgpOwotICAgICAgICAgIFNjKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVFJZOgotICAgICAgICAgIFRyeVN0YXRlbWVudCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs2Ml0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgU3Vic3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU3Vic3RhdGVtZW50ICovCi0gIEFTVFN1YnN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN1YnN0YXRlbWVudCh0aGlzLCBKSlRTVUJTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNjNdID0gampfZ2VuOwotICAgICAgICBpZiAoampfMl8xNSgyKSkgewotICAgICAgICAgIFN0YXRlbWVudCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgVkFSOgotICAgICAgICAgICAgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKCk7Ci0gICAgICAgICAgICBTYygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICAgIGNhc2UgU0VUOgotICAgICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7Ci0gICAgICAgICAgICBTdWJzdGF0ZW1lbnRzKCk7Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzY0XSA9IGpqX2dlbjsKLSAgICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBTdWJzdGF0ZW1lbnRzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU3Vic3RhdGVtZW50cyAqLwotICBBU1RTdWJzdGF0ZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUU3Vic3RhdGVtZW50cyh0aGlzLCBKSlRTVUJTVEFURU1FTlRTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGxhYmVsXzI3OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEJSRUFLOgotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgY2FzZSBETzoKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElGOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgTkVXOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgY2FzZSBUSFJPVzoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFRSWToKLSAgICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgIGNhc2UgVkFSOgotICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgIGNhc2UgV0hJTEU6Ci0gICAgICAgIGNhc2UgV0lUSDoKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgIDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbNjVdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzI3OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIHZvaWQgU2MoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgICAgICAgIC8qQGJnZW4oamp0cmVlKSBTYyAqLwotIEFTVFNjIGpqdG4wMDAgPSBuZXcgQVNUU2ModGhpcywgSkpUU0MpOwotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gdHJ5IHtUb2tlbiB0b2sgPSBnZXRUb2tlbigxKTsKLSAgICBpZiAodG9rLmtpbmQgPT0gU0VNSUNPTE9OKSB7Ci0gICAgICAgdG9rID0gZ2V0TmV4dFRva2VuKCk7Ci0gICAgfSBlbHNlIGlmICh0b2suc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgICBpZiAoIUVvbENvbW1lbnRTa2lwV3ModG9rLnNwZWNpYWxUb2tlbikgJiYgKHRvay5raW5kICE9IEVPRikpIHsKLSAgICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgfQotICAgIH0gZWxzZSBpZiAoKHRvay5raW5kICE9IEVPRikgJiYgKHRvay5raW5kIT1SQlJBQ0UpKSB7Ci0gICAgICAgICB0aHJvdyBnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgfS8qQGJnZW4oamp0cmVlKSovCi0gfSBmaW5hbGx5IHsKLSAgIGlmIChqanRjMDAwKSB7Ci0gICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgIH0KLSB9Ci0gIH0KLQotICBib29sZWFuIEVvbENvbW1lbnRTa2lwV3MoVG9rZW4gdCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKkBiZ2VuKGpqdHJlZSkgRW9sQ29tbWVudFNraXBXcyAqLwotIEFTVEVvbENvbW1lbnRTa2lwV3Mgamp0bjAwMCA9IG5ldyBBU1RFb2xDb21tZW50U2tpcFdzKHRoaXMsIEpKVEVPTENPTU1FTlRTS0lQV1MpOwotIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gdHJ5IHtib29sZWFuIHJldFZhbCA9IGZhbHNlOwotICAgIFRva2VuIHNwZWNpYWxUb2tlbiA9IHQ7Ci0gICAgd2hpbGUoc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IFdTKSB7Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBFT0wgIHx8Ci0gICAgICAgICAgICAgIHNwZWNpYWxUb2tlbi5raW5kID09IFNJTkdMRV9MSU5FX0NPTU1FTlQpIHsKLSAgICAgICAgcmV0VmFsID0gdHJ1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBlbHNlIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXRWYWw7LypAYmdlbihqanRyZWUpKi8KLSB9IGZpbmFsbHkgewotICAgaWYgKGpqdGMwMDApIHsKLSAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgfQotIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRW1wdHkgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRW1wdHlTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFbXB0eVN0YXRlbWVudCAqLwotICBBU1RFbXB0eVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEVtcHR5U3RhdGVtZW50KHRoaXMsIEpKVEVNUFRZU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwcmVzaW9uIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBFeHByZXNzaW9uU3RhdGVtZW50ICovCi0gIEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RFeHByZXNzaW9uU3RhdGVtZW50KHRoaXMsIEpKVEVYUFJFU1NJT05TVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTdXBlclN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFN1cGVyU3RhdGVtZW50ICovCi0gIEFTVFN1cGVyU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJTdGF0ZW1lbnQodGhpcywgSkpUU1VQRVJTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihTVVBFUik7Ci0gICAgICBBcmd1bWVudHMoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCbG9jayBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBCbG9jaygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEJsb2NrICovCi0gIEFTVEJsb2NrIGpqdG4wMDAgPSBuZXcgQVNUQmxvY2sodGhpcywgSkpUQkxPQ0spOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEJSRUFLOgotICAgICAgY2FzZSBDTEFTUzoKLSAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICBjYXNlIERPOgotICAgICAgY2FzZSBGQUxTRToKLSAgICAgIGNhc2UgRk9SOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJRjoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgTkFNRVNQQUNFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFNVUEVSOgotICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICBjYXNlIFRISVM6Ci0gICAgICBjYXNlIFRIUk9XOgotICAgICAgY2FzZSBUUlVFOgotICAgICAgY2FzZSBUUlk6Ci0gICAgICBjYXNlIFRZUEVPRjoKLSAgICAgIGNhc2UgVVNFOgotICAgICAgY2FzZSBWQVI6Ci0gICAgICBjYXNlIFZPSUQ6Ci0gICAgICBjYXNlIFdISUxFOgotICAgICAgY2FzZSBXSVRIOgotICAgICAgY2FzZSBFWFBPUlQ6Ci0gICAgICBjYXNlIElOVEVSRkFDRToKLSAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgY2FzZSBJTVBPUlQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgY2FzZSBCQU5HOgotICAgICAgY2FzZSBUSUxERToKLSAgICAgIGNhc2UgSU5DUjoKLSAgICAgIGNhc2UgREVDUjoKLSAgICAgIGNhc2UgUExVUzoKLSAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgIERpcmVjdGl2ZXMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNjZdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTGFiZWxlZCBTdGF0ZW1lbnQgKG1hcHMgdG8gbGl0ZXJhbCBmaWVsZCkKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIExhYmVsZWRTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBMYWJlbGVkU3RhdGVtZW50ICovCi0gIEFTVExhYmVsZWRTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RMYWJlbGVkU3RhdGVtZW50KHRoaXMsIEpKVExBQkVMRURTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgSWRlbnRpZmllcigpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJZiBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBJZlN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIElmU3RhdGVtZW50ICovCi0gIEFTVElmU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUSWZTdGF0ZW1lbnQodGhpcywgSkpUSUZTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihJRik7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRUxTRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihFTFNFKTsKLSAgICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzY3XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN3aXRjaCBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBTd2l0Y2hTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBTd2l0Y2hTdGF0ZW1lbnQgKi8KLSAgQVNUU3dpdGNoU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUU3dpdGNoU3RhdGVtZW50KHRoaXMsIEpKVFNXSVRDSFNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNXSVRDSCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgampfY29uc3VtZV90b2tlbihMQlJBQ0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENBU0U6Ci0gICAgICBjYXNlIF9ERUZBVUxUOgotICAgICAgICBDYXNlRWxlbWVudHMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNjhdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJCUkFDRSk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENhc2VFbGVtZW50cygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50cyAqLwotICBBU1RDYXNlRWxlbWVudHMgamp0bjAwMCA9IG5ldyBBU1RDYXNlRWxlbWVudHModGhpcywgSkpUQ0FTRUVMRU1FTlRTKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIENhc2VMYWJlbCgpOwotICAgICAgbGFiZWxfMjg6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBCUkVBSzoKLSAgICAgICAgY2FzZSBDQVNFOgotICAgICAgICBjYXNlIENMQVNTOgotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIENPTlRJTlVFOgotICAgICAgICBjYXNlIF9ERUZBVUxUOgotICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgY2FzZSBETzoKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBGT1I6Ci0gICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElGOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgTkFNRVNQQUNFOgotICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFJFVFVSTjoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgIGNhc2UgU1dJVENIOgotICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgIGNhc2UgVEhST1c6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBUUlk6Ci0gICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICBjYXNlIFVTRToKLSAgICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgY2FzZSBXSElMRToKLSAgICAgICAgY2FzZSBXSVRIOgotICAgICAgICBjYXNlIEVYUE9SVDoKLSAgICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElNUE9SVDoKLSAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgY2FzZSBERUNSOgotICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs2OV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjg7Ci0gICAgICAgIH0KLSAgICAgICAgQ2FzZUVsZW1lbnQoKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQ2FzZUVsZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudCAqLwotICBBU1RDYXNlRWxlbWVudCBqanRuMDAwID0gbmV3IEFTVENhc2VFbGVtZW50KHRoaXMsIEpKVENBU0VFTEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBCUkVBSzoKLSAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBDT05USU5VRToKLSAgICAgIGNhc2UgREVMRVRFOgotICAgICAgY2FzZSBETzoKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICBjYXNlIEZPUjoKLSAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSUY6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgIGNhc2UgTkVXOgotICAgICAgY2FzZSBOVUxMOgotICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICBjYXNlIFJFVFVSTjoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgU1dJVENIOgotICAgICAgY2FzZSBUSElTOgotICAgICAgY2FzZSBUSFJPVzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFJZOgotICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICBjYXNlIFVTRToKLSAgICAgIGNhc2UgVkFSOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBXSElMRToKLSAgICAgIGNhc2UgV0lUSDoKLSAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICBjYXNlIExCUkFDRToKLSAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICBjYXNlIFNFTUlDT0xPTjoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBEaXJlY3RpdmUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENBU0U6Ci0gICAgICBjYXNlIF9ERUZBVUxUOgotICAgICAgICBDYXNlTGFiZWwoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbNzBdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENhc2VMYWJlbCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIENhc2VMYWJlbCAqLwotICBBU1RDYXNlTGFiZWwgamp0bjAwMCA9IG5ldyBBU1RDYXNlTGFiZWwodGhpcywgSkpUQ0FTRUxBQkVMKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDQVNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENBU0UpOwotICAgICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTE9OKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIF9ERUZBVUxUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKF9ERUZBVUxUKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzcxXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERvLVdoaWxlIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIERvU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRG9TdGF0ZW1lbnQgKi8KLSAgQVNURG9TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1REb1N0YXRlbWVudCh0aGlzLCBKSlRET1NUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKERPKTsKLSAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgICAgampfY29uc3VtZV90b2tlbihXSElMRSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdoaWxlIFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgV2hpbGVTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBXaGlsZVN0YXRlbWVudCAqLwotICBBU1RXaGlsZVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFdoaWxlU3RhdGVtZW50KHRoaXMsIEpKVFdISUxFU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oV0hJTEUpOwotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZvciBTdGF0ZW1lbnRzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRm9yU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRm9yU3RhdGVtZW50ICovCi0gIEFTVEZvclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEZvclN0YXRlbWVudCh0aGlzLCBKSlRGT1JTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMTYoMjE0NzQ4MzY0NykpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGT1IpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKExQQVJFTik7Ci0gICAgICAgIEZvckluQmluZGluZygpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKElOKTsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBTdWJzdGF0ZW1lbnQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEZPUjoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZPUik7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgICBjYXNlIEZVTkNUSU9OOgotICAgICAgICAgIGNhc2UgR0VUOgotICAgICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgICBjYXNlIE5FVzoKLSAgICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICAgIGNhc2UgU0VUOgotICAgICAgICAgIGNhc2UgU1VQRVI6Ci0gICAgICAgICAgY2FzZSBUSElTOgotICAgICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgICBjYXNlIFRZUEVPRjoKLSAgICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICBjYXNlIFZPSUQ6Ci0gICAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgICAgY2FzZSBERUNJTUFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBGTE9BVElOR19QT0lOVF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgICAgIGNhc2UgTEJSQUNLRVQ6Ci0gICAgICAgICAgY2FzZSBCQU5HOgotICAgICAgICAgIGNhc2UgVElMREU6Ci0gICAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICAgIGNhc2UgREVDUjoKLSAgICAgICAgICBjYXNlIFBMVVM6Ci0gICAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICAgIEZvckluaXRpYWxpemVyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgampfbGExWzcyXSA9IGpqX2dlbjsKLSAgICAgICAgICAgIDsKLSAgICAgICAgICB9Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihTRU1JQ09MT04pOwotICAgICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICAgIGNhc2UgREVMRVRFOgotICAgICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgICAgY2FzZSBORVc6Ci0gICAgICAgICAgY2FzZSBOVUxMOgotICAgICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgICBjYXNlIFNVUEVSOgotICAgICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBjYXNlIExQQVJFTjoKLSAgICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgICBjYXNlIExCUkFDS0VUOgotICAgICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgICBjYXNlIFRJTERFOgotICAgICAgICAgIGNhc2UgSU5DUjoKLSAgICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgICAgY2FzZSBQTFVTOgotICAgICAgICAgIGNhc2UgTUlOVVM6Ci0gICAgICAgICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs3M10gPSBqal9nZW47Ci0gICAgICAgICAgICA7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oU0VNSUNPTE9OKTsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIERFTEVURToKLSAgICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICAgIGNhc2UgRlVOQ1RJT046Ci0gICAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgIGNhc2UgTkVXOgotICAgICAgICAgIGNhc2UgTlVMTDoKLSAgICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgICBjYXNlIFRISVM6Ci0gICAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgICAgIGNhc2UgVk9JRDoKLSAgICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEhFWF9MSVRFUkFMOgotICAgICAgICAgIGNhc2UgT0NUQUxfTElURVJBTDoKLSAgICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgICBjYXNlIFJFR1VMQVJfRVhQUkVTU0lPTjoKLSAgICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgICAgY2FzZSBMQlJBQ0U6Ci0gICAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgICBjYXNlIEJBTkc6Ci0gICAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgICBjYXNlIElOQ1I6Ci0gICAgICAgICAgY2FzZSBERUNSOgotICAgICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgICBjYXNlIE1JTlVTOgotICAgICAgICAgICAgTGlzdEV4cHJlc3Npb24oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBqal9sYTFbNzRdID0gampfZ2VuOwotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgICAgU3Vic3RhdGVtZW50KCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzc1XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgICB9Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRm9ySW5pdGlhbGl6ZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGb3JJbml0aWFsaXplciAqLwotICBBU1RGb3JJbml0aWFsaXplciBqanRuMDAwID0gbmV3IEFTVEZvckluaXRpYWxpemVyKHRoaXMsIEpKVEZPUklOSVRJQUxJWkVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzE3KDMpKSB7Ci0gICAgICAgIExpc3RFeHByZXNzaW9uTm9JTigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICAgIGNhc2UgVkFSOgotICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uTm9JTigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs3Nl0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgRm9ySW5CaW5kaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRm9ySW5CaW5kaW5nICovCi0gIEFTVEZvckluQmluZGluZyBqanRuMDAwID0gbmV3IEFTVEZvckluQmluZGluZyh0aGlzLCBKSlRGT1JJTkJJTkRJTkcpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMTgoMykpIHsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIENPTlNUOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCk7Ci0gICAgICAgICAgVmFyaWFibGVCaW5kaW5nTm9JTigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICAgIGNhc2UgUFVCTElDOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCk7Ci0gICAgICAgICAgVmFyaWFibGVCaW5kaW5nTm9JTigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs3N10gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXaXRoIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFdpdGhTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBXaXRoU3RhdGVtZW50ICovCi0gIEFTVFdpdGhTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RXaXRoU3RhdGVtZW50KHRoaXMsIEpKVFdJVEhTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihXSVRIKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIEV4cHJlc3Npb25TdGF0ZW1lbnQoKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIFN1YnN0YXRlbWVudCgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbnRpbnVlIGFuZCBCcmVhayBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIENvbnRpbnVlU3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQ29udGludWVTdGF0ZW1lbnQgKi8KLSAgQVNUQ29udGludWVTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RDb250aW51ZVN0YXRlbWVudCh0aGlzLCBKSlRDT05USU5VRVNUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENPTlRJTlVFKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs3OF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQnJlYWtTdGF0ZW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBCcmVha1N0YXRlbWVudCAqLwotICBBU1RCcmVha1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEJyZWFrU3RhdGVtZW50KHRoaXMsIEpKVEJSRUFLU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQlJFQUspOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzc5XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJldHVybiBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJldHVyblN0YXRlbWVudCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJldHVyblN0YXRlbWVudCAqLwotICBBU1RSZXR1cm5TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RSZXR1cm5TdGF0ZW1lbnQodGhpcywgSkpUUkVUVVJOU1RBVEVNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkVUVVJOKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBERUxFVEU6Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgIGNhc2UgR0VUOgotICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgY2FzZSBORVc6Ci0gICAgICBjYXNlIE5VTEw6Ci0gICAgICBjYXNlIFBSSVZBVEU6Ci0gICAgICBjYXNlIFBVQkxJQzoKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVVBFUjoKLSAgICAgIGNhc2UgVEhJUzoKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgIGNhc2UgVFlQRU9GOgotICAgICAgY2FzZSBWT0lEOgotICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICBjYXNlIE9DVEFMX0xJVEVSQUw6Ci0gICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgY2FzZSBSRUdVTEFSX0VYUFJFU1NJT046Ci0gICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICBjYXNlIExQQVJFTjoKLSAgICAgIGNhc2UgTEJSQUNFOgotICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgIGNhc2UgQkFORzoKLSAgICAgIGNhc2UgVElMREU6Ci0gICAgICBjYXNlIElOQ1I6Ci0gICAgICBjYXNlIERFQ1I6Ci0gICAgICBjYXNlIFBMVVM6Ci0gICAgICBjYXNlIE1JTlVTOgotICAgICAgICBMaXN0RXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs4MF0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBUaHJvdyBTdGF0ZW1lbnQKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFRocm93U3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVGhyb3dTdGF0ZW1lbnQgKi8KLSAgQVNUVGhyb3dTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RUaHJvd1N0YXRlbWVudCh0aGlzLCBKSlRUSFJPV1NUQVRFTUVOVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFRIUk9XKTsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVHJ5IFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgVHJ5U3RhdGVtZW50KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVHJ5U3RhdGVtZW50ICovCi0gIEFTVFRyeVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFRyeVN0YXRlbWVudCh0aGlzLCBKSlRUUllTVEFURU1FTlQpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihUUlkpOwotICAgICAgQmxvY2soKTsKLSAgICAgIGxhYmVsXzI5OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ0FUQ0g6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4MV0gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMjk7Ci0gICAgICAgIH0KLSAgICAgICAgampfY29uc3VtZV90b2tlbihDQVRDSCk7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgICAgIEJsb2NrKCk7Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRklOQUxMWToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGSU5BTExZKTsKLSAgICAgICAgQmxvY2soKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODJdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRGlyZWN0aXZlcyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIERpcmVjdGl2ZXMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmVzICovCi0gIEFTVERpcmVjdGl2ZXMgamp0bjAwMCA9IG5ldyBBU1REaXJlY3RpdmVzKHRoaXMsIEpKVERJUkVDVElWRVMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgbGFiZWxfMzA6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBEaXJlY3RpdmUoKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQlJFQUs6Ci0gICAgICAgIGNhc2UgQ0xBU1M6Ci0gICAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICAgIGNhc2UgQ09OVElOVUU6Ci0gICAgICAgIGNhc2UgREVMRVRFOgotICAgICAgICBjYXNlIERPOgotICAgICAgICBjYXNlIEZBTFNFOgotICAgICAgICBjYXNlIEZPUjoKLSAgICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSUY6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBOQU1FU1BBQ0U6Ci0gICAgICAgIGNhc2UgTkVXOgotICAgICAgICBjYXNlIE5VTEw6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgUkVUVVJOOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBTVVBFUjoKLSAgICAgICAgY2FzZSBTV0lUQ0g6Ci0gICAgICAgIGNhc2UgVEhJUzoKLSAgICAgICAgY2FzZSBUSFJPVzoKLSAgICAgICAgY2FzZSBUUlVFOgotICAgICAgICBjYXNlIFRSWToKLSAgICAgICAgY2FzZSBUWVBFT0Y6Ci0gICAgICAgIGNhc2UgVVNFOgotICAgICAgICBjYXNlIFZBUjoKLSAgICAgICAgY2FzZSBWT0lEOgotICAgICAgICBjYXNlIFdISUxFOgotICAgICAgICBjYXNlIFdJVEg6Ci0gICAgICAgIGNhc2UgRVhQT1JUOgotICAgICAgICBjYXNlIElOVEVSRkFDRToKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgICBjYXNlIERFQ0lNQUxfTElURVJBTDoKLSAgICAgICAgY2FzZSBIRVhfTElURVJBTDoKLSAgICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBjYXNlIEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgIGNhc2UgUkVHVUxBUl9FWFBSRVNTSU9OOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgIGNhc2UgTFBBUkVOOgotICAgICAgICBjYXNlIExCUkFDRToKLSAgICAgICAgY2FzZSBMQlJBQ0tFVDoKLSAgICAgICAgY2FzZSBTRU1JQ09MT046Ci0gICAgICAgIGNhc2UgQkFORzoKLSAgICAgICAgY2FzZSBUSUxERToKLSAgICAgICAgY2FzZSBJTkNSOgotICAgICAgICBjYXNlIERFQ1I6Ci0gICAgICAgIGNhc2UgUExVUzoKLSAgICAgICAgY2FzZSBNSU5VUzoKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzgzXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zMDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBEaXJlY3RpdmUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmUgKi8KLSAgQVNURGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNURGlyZWN0aXZlKHRoaXMsIEpKVERJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgU0VNSUNPTE9OOgotICAgICAgICBFbXB0eVN0YXRlbWVudCgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs4NF0gPSBqal9nZW47Ci0gICAgICAgIGlmIChqal8yXzE5KDMpKSB7Ci0gICAgICAgICAgU3RhdGVtZW50KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl8yMCgyKSkgewotICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoampfMl8yMSgyKSkgewotICAgICAgICAgIEF0dHJpYnV0ZXMoKTsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKExCUkFDRSk7Ci0gICAgICAgICAgRGlyZWN0aXZlcygpOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUkJSQUNFKTsKLSAgICAgICAgfSBlbHNlIGlmIChqal8yXzIyKDIpKSB7Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIEFubm90YXRhYmxlRGlyZWN0aXZlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICAgICAgSW5jbHVkZURpcmVjdGl2ZSgpOwotICAgICAgICAgICAgU2MoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgVVNFOgotICAgICAgICAgICAgUHJhZ21hKCk7Ci0gICAgICAgICAgICBTYygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVs4NV0gPSBqal9nZW47Ci0gICAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEFubm90YXRhYmxlRGlyZWN0aXZlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQW5ub3RhdGFibGVEaXJlY3RpdmUgKi8KLSAgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZSh0aGlzLCBKSlRBTk5PVEFUQUJMRURJUkVDVElWRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICBjYXNlIFZBUjoKLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uKCk7Ci0gICAgICAgIFNjKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGVU5DVElPTjoKLSAgICAgICAgRnVuY3Rpb25EZWZpbml0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBDTEFTUzoKLSAgICAgICAgQ2xhc3NEZWZpbml0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJTlRFUkZBQ0U6Ci0gICAgICAgIEludGVyZmFjZURlZmluaXRpb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE5BTUVTUEFDRToKLSAgICAgICAgTmFtZXNwYWNlRGVmaW5pdGlvbigpOwotICAgICAgICBTYygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgICBJbXBvcnREaXJlY3RpdmUoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEVYUE9SVDoKLSAgICAgICAgRXhwb3J0RGVmaW5pdGlvbigpOwotICAgICAgICBTYygpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVNFOgotICAgICAgICBVc2VEaXJlY3RpdmUoKTsKLSAgICAgICAgU2MoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODZdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgfQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgIH0KLSAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEF0dHJpYnV0ZXMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEF0dHJpYnV0ZXMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBBdHRyaWJ1dGVzICovCi0gIEFTVEF0dHJpYnV0ZXMgamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVzKHRoaXMsIEpKVEFUVFJJQlVURVMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgbGFiZWxfMzE6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBBdHRyaWJ1dGUoKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs4N10gPSBqal9nZW47Ci0gICAgICAgICAgYnJlYWsgbGFiZWxfMzE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgQXR0cmlidXRlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlICovCi0gIEFTVEF0dHJpYnV0ZSBqanRuMDAwID0gbmV3IEFTVEF0dHJpYnV0ZSh0aGlzLCBKSlRBVFRSSUJVVEUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgIGNhc2UgUFVCTElDOgotICAgICAgY2FzZSBTRVQ6Ci0gICAgICBjYXNlIFBST1RFQ1RFRDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgQXR0cmlidXRlRXhwcmVzc2lvbigpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgampfY29uc3VtZV90b2tlbihUUlVFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTFNFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEZBTFNFKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbODhdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFVzZSBEaXJlY3RpdmUKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVzZURpcmVjdGl2ZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFVzZURpcmVjdGl2ZSAqLwotICBBU1RVc2VEaXJlY3RpdmUgamp0bjAwMCA9IG5ldyBBU1RVc2VEaXJlY3RpdmUodGhpcywgSkpUVVNFRElSRUNUSVZFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVVNFKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTkFNRVNQQUNFKTsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgIExpc3RFeHByZXNzaW9uKCk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFJQQVJFTik7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSW1wb3J0IERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgSW1wb3J0RGlyZWN0aXZlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgSW1wb3J0RGlyZWN0aXZlICovCi0gIEFTVEltcG9ydERpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVEltcG9ydERpcmVjdGl2ZSh0aGlzLCBKSlRJTVBPUlRESVJFQ1RJVkUpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgaWYgKGpqXzJfMjMoMykpIHsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTVBPUlQpOwotICAgICAgICBQYWNrYWdlTmFtZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU1QT1JUOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU1QT1JUKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihBU1NJR04pOwotICAgICAgICAgIFBhY2thZ2VOYW1lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzg5XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEluY2x1ZGUgRGlyZWN0aXZlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBJbmNsdWRlRGlyZWN0aXZlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgSW5jbHVkZURpcmVjdGl2ZSAqLwotICBBU1RJbmNsdWRlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUSW5jbHVkZURpcmVjdGl2ZSh0aGlzLCBKSlRJTkNMVURFRElSRUNUSVZFKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5DTFVERSk7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJhZ21hCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmFnbWEoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmFnbWEgKi8KLSAgQVNUUHJhZ21hIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hKHRoaXMsIEpKVFBSQUdNQSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFVTRSk7Ci0gICAgICBQcmFnbWFJdGVtcygpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmFnbWFJdGVtcygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW1zICovCi0gIEFTVFByYWdtYUl0ZW1zIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hSXRlbXModGhpcywgSkpUUFJBR01BSVRFTVMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgUHJhZ21hSXRlbSgpOwotICAgICAgampfY29uc3VtZV90b2tlbihDT01NQSk7Ci0gICAgICBQcmFnbWFJdGVtKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFByYWdtYUl0ZW0oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtICovCi0gIEFTVFByYWdtYUl0ZW0gamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFJdGVtKHRoaXMsIEpKVFBSQUdNQUlURU0pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgUHJhZ21hRXhwcigpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEhPT0s6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSE9PSyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzkwXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQcmFnbWFFeHByKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hRXhwciAqLwotICBBU1RQcmFnbWFFeHByIGpqdG4wMDAgPSBuZXcgQVNUUHJhZ21hRXhwcih0aGlzLCBKSlRQUkFHTUFFWFBSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBMUEFSRU46Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oTFBBUkVOKTsKLSAgICAgICAgUHJhZ21hQXJndW1lbnQoKTsKLSAgICAgICAgampfY29uc3VtZV90b2tlbihSUEFSRU4pOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVs5MV0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUHJhZ21hQXJndW1lbnQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQcmFnbWFBcmd1bWVudCAqLwotICBBU1RQcmFnbWFBcmd1bWVudCBqanRuMDAwID0gbmV3IEFTVFByYWdtYUFyZ3VtZW50KHRoaXMsIEpKVFBSQUdNQUFSR1VNRU5UKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBUUlVFOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFRSVUUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRkFMU0UpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgREVDSU1BTF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKERFQ0lNQUxfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBPQ1RBTF9MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKE9DVEFMX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSEVYX0xJVEVSQUw6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSEVYX0xJVEVSQUwpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkxPQVRJTkdfUE9JTlRfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihGTE9BVElOR19QT0lOVF9MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNUUklOR19MSVRFUkFMOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNUUklOR19MSVRFUkFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbOTJdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIERlZmluaXRpb25zIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEV4cG9ydCBEZWZpbml0aW9uIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgRXhwb3J0RGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEV4cG9ydERlZmluaXRpb24gKi8KLSAgQVNURXhwb3J0RGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVEV4cG9ydERlZmluaXRpb24odGhpcywgSkpURVhQT1JUREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKEVYUE9SVCk7Ci0gICAgICBFeHBvcnRCaW5kaW5nTGlzdCgpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFeHBvcnRCaW5kaW5nTGlzdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmdMaXN0ICovCi0gIEFTVEV4cG9ydEJpbmRpbmdMaXN0IGpqdG4wMDAgPSBuZXcgQVNURXhwb3J0QmluZGluZ0xpc3QodGhpcywgSkpURVhQT1JUQklORElOR0xJU1QpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgRXhwb3J0QmluZGluZygpOwotICAgICAgbGFiZWxfMzI6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzkzXSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zMjsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgRXhwb3J0QmluZGluZygpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBFeHBvcnRCaW5kaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgRXhwb3J0QmluZGluZyAqLwotICBBU1RFeHBvcnRCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNURXhwb3J0QmluZGluZyh0aGlzLCBKSlRFWFBPUlRCSU5ESU5HKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzI0KDIpKSB7Ci0gICAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgRnVuY3Rpb25OYW1lKCk7Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbihBU1NJR04pOwotICAgICAgICAgIEZ1bmN0aW9uTmFtZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVs5NF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWYXJpYWJsZSBEZWZpbml0aW9uIChpbiwgTm9JTikKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFZhcmlhYmxlRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbiAqLwotICBBU1RWYXJpYWJsZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZURlZmluaXRpb24odGhpcywgSkpUVkFSSUFCTEVERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKTsKLSAgICAgIFZhcmlhYmxlQmluZGluZ0xpc3QoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVEZWZpbml0aW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gKi8KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4odGhpcywgSkpUVkFSSUFCTEVERUZJTklUSU9OTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCk7Ci0gICAgICBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVEZWZpbml0aW9uS2luZCAqLwotICBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uS2luZCh0aGlzLCBKSlRWQVJJQUJMRURFRklOSVRJT05LSU5EKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBWQVI6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oVkFSKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTlNUKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbOTVdID0gampfZ2VuOwotICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0KCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdCAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCh0aGlzLCBKSlRWQVJJQUJMRUJJTkRJTkdMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFZhcmlhYmxlQmluZGluZygpOwotICAgICAgbGFiZWxfMzM6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzk2XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zMzsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgVmFyaWFibGVCaW5kaW5nKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICB9IGVsc2UgewotICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgIH0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgfQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgIH0KLSAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICovCi0gIEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4odGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVE5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVmFyaWFibGVCaW5kaW5nTm9JTigpOwotICAgICAgbGFiZWxfMzQ6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBDT01NQToKLSAgICAgICAgICA7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzk3XSA9IGpqX2dlbjsKLSAgICAgICAgICBicmVhayBsYWJlbF8zNDsKLSAgICAgICAgfQotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTU1BKTsKLSAgICAgICAgVmFyaWFibGVCaW5kaW5nTm9JTigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICB9Ci0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgIH0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICB9Ci0gICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVCaW5kaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nICovCi0gIEFTVFZhcmlhYmxlQmluZGluZyBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZyh0aGlzLCBKSlRWQVJJQUJMRUJJTkRJTkcpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgVHlwZWRJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQVNTSUdOOgotICAgICAgICBWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzk4XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUJpbmRpbmdOb0lOKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTm9JTiAqLwotICBBU1RWYXJpYWJsZUJpbmRpbmdOb0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVCaW5kaW5nTm9JTih0aGlzLCBKSlRWQVJJQUJMRUJJTkRJTkdOT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFR5cGVkSWRlbnRpZmllck5vSU4oKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBBU1NJR046Ci0gICAgICAgIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzk5XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbiAqLwotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbih0aGlzLCBKSlRWQVJJQUJMRUlOSVRJQUxJU0FUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgIFZhcmlhYmxlSW5pdGlhbGl6ZXIoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICovCi0gIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTk5PSU4pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihBU1NJR04pOwotICAgICAgVmFyaWFibGVJbml0aWFsaXplck5vSU4oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICB9IGVsc2UgewotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgfQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgfQotICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplciAqLwotICBBU1RWYXJpYWJsZUluaXRpYWxpemVyIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXplcih0aGlzLCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzI1KDMpKSB7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBGQUxTRToKLSAgICAgICAgY2FzZSBHRVQ6Ci0gICAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgICAgY2FzZSBQUklWQVRFOgotICAgICAgICBjYXNlIFBVQkxJQzoKLSAgICAgICAgY2FzZSBTRVQ6Ci0gICAgICAgIGNhc2UgVFJVRToKLSAgICAgICAgY2FzZSBQUk9URUNURUQ6Ci0gICAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgICBBdHRyaWJ1dGVzKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgampfbGExWzEwMF0gPSBqal9nZW47Ci0gICAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVmFyaWFibGVJbml0aWFsaXplck5vSU4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAqLwotICBBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOKHRoaXMsIEpKVFZBUklBQkxFSU5JVElBTElaRVJOT0lOKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzI2KDMpKSB7Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgRkFMU0U6Ci0gICAgICAgIGNhc2UgR0VUOgotICAgICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICAgIGNhc2UgUFJJVkFURToKLSAgICAgICAgY2FzZSBQVUJMSUM6Ci0gICAgICAgIGNhc2UgU0VUOgotICAgICAgICBjYXNlIFRSVUU6Ci0gICAgICAgIGNhc2UgUFJPVEVDVEVEOgotICAgICAgICBjYXNlIElERU5USUZJRVI6Ci0gICAgICAgICAgQXR0cmlidXRlcygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMDFdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFR5cGVkSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllciAqLwotICBBU1RUeXBlZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RUeXBlZElkZW50aWZpZXIodGhpcywgSkpUVFlQRURJREVOVElGSUVSKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT0xPTjoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihDT0xPTik7Ci0gICAgICAgIFR5cGVFeHByZXNzaW9uKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEwMl0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVHlwZWRJZGVudGlmaWVyTm9JTigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllck5vSU4gKi8KLSAgQVNUVHlwZWRJZGVudGlmaWVyTm9JTiBqanRuMDAwID0gbmV3IEFTVFR5cGVkSWRlbnRpZmllck5vSU4odGhpcywgSkpUVFlQRURJREVOVElGSUVSTk9JTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09MT046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgICBUeXBlRXhwcmVzc2lvbk5vSU4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTAzXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFNpbXBsZSBWYXJpYWJsZSBEZWZpbml0aW9uIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgZmluYWwgcHVibGljIHZvaWQgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uICovCi0gIEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbih0aGlzLCBKSlRTSU1QTEVWQVJJQUJMRURFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihWQVIpOwotICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCAqLwotICBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0KHRoaXMsIEpKVFVOVFlQRURWQVJJQUJMRUJJTkRJTkdMSVNUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKTsKLSAgICAgIGxhYmVsXzM1OgotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgQ09NTUE6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMDRdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzM1OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCk7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBVbnR5cGVkVmFyaWFibGVCaW5kaW5nICovCi0gIEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nKHRoaXMsIEpKVFVOVFlQRURWQVJJQUJMRUJJTkRJTkcpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgSWRlbnRpZmllcigpOwotICAgICAgVmFyaWFibGVJbml0aWFsaXNhdGlvbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIERlZmluaXRpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEZ1bmN0aW9uRGVmaW5pdGlvbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRGVmaW5pdGlvbiAqLwotICBBU1RGdW5jdGlvbkRlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbkRlZmluaXRpb24odGhpcywgSkpURlVOQ1RJT05ERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRlVOQ1RJT04pOwotICAgICAgRnVuY3Rpb25OYW1lKCk7Ci0gICAgICBGdW5jdGlvbkNvbW1vbigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbk5hbWUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbk5hbWUgKi8KLSAgQVNURnVuY3Rpb25OYW1lIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25OYW1lKHRoaXMsIEpKVEZVTkNUSU9OTkFNRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBpZiAoampfMl8yNygyKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKEdFVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIH0gZWxzZSBpZiAoampfMl8yOCgyKSkgewotICAgICAgICBqal9jb25zdW1lX3Rva2VuKFNFVCk7Ci0gICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgICBjYXNlIEdFVDoKLSAgICAgICAgY2FzZSBJTkNMVURFOgotICAgICAgICBjYXNlIFNFVDoKLSAgICAgICAgY2FzZSBJREVOVElGSUVSOgotICAgICAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTA1XSA9IGpqX2dlbjsKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKC0xKTsKLSAgICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBGdW5jdGlvbkNvbW1vbigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIEZ1bmN0aW9uQ29tbW9uICovCi0gIEFTVEZ1bmN0aW9uQ29tbW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25Db21tb24odGhpcywgSkpURlVOQ1RJT05DT01NT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihMUEFSRU4pOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgIGNhc2UgRUxJUFNFOgotICAgICAgICBQYXJhbWV0ZXJzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEwNl0gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oUlBBUkVOKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBDT0xPTjoKLSAgICAgICAgUmVzdWx0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEwN10gPSBqal9nZW47Ci0gICAgICAgIDsKLSAgICAgIH0KLSAgICAgIEJsb2NrKCk7Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhcmFtZXRlcnMoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXJzICovCi0gIEFTVFBhcmFtZXRlcnMgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXJzKHRoaXMsIEpKVFBBUkFNRVRFUlMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEVMSVBTRToKLSAgICAgICAgUmVzdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgUGFyYW1ldGVySW5pdCgpOwotICAgICAgICBsYWJlbF8zNjoKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgICBjYXNlIENPTU1BOgotICAgICAgICAgICAgOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxMDhdID0gampfZ2VuOwotICAgICAgICAgICAgYnJlYWsgbGFiZWxfMzY7Ci0gICAgICAgICAgfQotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09NTUEpOwotICAgICAgICAgIFBhcmFtZXRlckluaXQoKTsKLSAgICAgICAgfQotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBFTElQU0U6Ci0gICAgICAgICAgUmVzdFBhcmFtZXRlcnMoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBqal9sYTFbMTA5XSA9IGpqX2dlbjsKLSAgICAgICAgICA7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTEwXSA9IGpqX2dlbjsKLSAgICAgICAgampfY29uc3VtZV90b2tlbigtMSk7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBQYXJhbWV0ZXIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXIgKi8KLSAgQVNUUGFyYW1ldGVyIGpqdG4wMDAgPSBuZXcgQVNUUGFyYW1ldGVyKHRoaXMsIEpKVFBBUkFNRVRFUik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgQ09OU1Q6Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09OU1QpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMTFdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBUeXBlZElkZW50aWZpZXIoKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUGFyYW1ldGVySW5pdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFBhcmFtZXRlckluaXQgKi8KLSAgQVNUUGFyYW1ldGVySW5pdCBqanRuMDAwID0gbmV3IEFTVFBhcmFtZXRlckluaXQodGhpcywgSkpUUEFSQU1FVEVSSU5JVCk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBQYXJhbWV0ZXIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBBU1NJR046Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQVNTSUdOKTsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTEyXSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBSZXN0UGFyYW1ldGVycygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlc3RQYXJhbWV0ZXJzICovCi0gIEFTVFJlc3RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUmVzdFBhcmFtZXRlcnModGhpcywgSkpUUkVTVFBBUkFNRVRFUlMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihFTElQU0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIENPTlNUOgotICAgICAgICBqal9jb25zdW1lX3Rva2VuKENPTlNUKTsKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMTNdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFJlc3VsdCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gLypAYmdlbihqanRyZWUpIFJlc3VsdCAqLwotICBBU1RSZXN1bHQgamp0bjAwMCA9IG5ldyBBU1RSZXN1bHQodGhpcywgSkpUUkVTVUxUKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGpqX2NvbnN1bWVfdG9rZW4oQ09MT04pOwotICAgICAgVHlwZUV4cHJlc3Npb24oKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDbGFzcyBEZWZpbml0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBmaW5hbCBwdWJsaWMgdm9pZCBDbGFzc0RlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBDbGFzc0RlZmluaXRpb24gKi8KLSAgQVNUQ2xhc3NEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUQ2xhc3NEZWZpbml0aW9uKHRoaXMsIEpKVENMQVNTREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKENMQVNTKTsKLSAgICAgIElkZW50aWZpZXIoKTsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBFWFRFTkRTOgotICAgICAgY2FzZSBJTVBMRU1FTlRTOgotICAgICAgICBJbmhlcml0YW5jZSgpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGpqX2xhMVsxMTRdID0gampfZ2VuOwotICAgICAgICA7Ci0gICAgICB9Ci0gICAgICBCbG9jaygpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBJbnRlcmZhY2VEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgSW50ZXJmYWNlRGVmaW5pdGlvbiAqLwotICBBU1RJbnRlcmZhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUSW50ZXJmYWNlRGVmaW5pdGlvbih0aGlzLCBKSlRJTlRFUkZBQ0VERUZJTklUSU9OKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChqal8yXzI5KDMpKSB7Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URVJGQUNFKTsKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgICBTYygpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU5URVJGQUNFOgotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oSU5URVJGQUNFKTsKLSAgICAgICAgICBJZGVudGlmaWVyKCk7Ci0gICAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgICAgY2FzZSBFWFRFTkRTOgotICAgICAgICAgICAgampfY29uc3VtZV90b2tlbihFWFRFTkRTKTsKLSAgICAgICAgICAgIFR5cGVFeHByZXNzaW9uTGlzdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGpqX2xhMVsxMTVdID0gampfZ2VuOwotICAgICAgICAgICAgOwotICAgICAgICAgIH0KLSAgICAgICAgICBCbG9jaygpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMTZdID0gampfZ2VuOwotICAgICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOwotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsKLSAgICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChFcnJvcilqanRlMDAwO30KLSAgICB9IGZpbmFsbHkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7Ci0gICAgICAgICAgfQotICAgIH0KLSAgfQotCi0gIGZpbmFsIHB1YmxpYyB2b2lkIEluaGVyaXRhbmNlKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgSW5oZXJpdGFuY2UgKi8KLSAgQVNUSW5oZXJpdGFuY2Ugamp0bjAwMCA9IG5ldyBBU1RJbmhlcml0YW5jZSh0aGlzLCBKSlRJTkhFUklUQU5DRSk7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgIGNhc2UgRVhURU5EUzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihFWFRFTkRTKTsKLSAgICAgICAgVHlwZUV4cHJlc3Npb24oKTsKLSAgICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICAgIGNhc2UgSU1QTEVNRU5UUzoKLSAgICAgICAgICBqal9jb25zdW1lX3Rva2VuKElNUExFTUVOVFMpOwotICAgICAgICAgIFR5cGVFeHByZXNzaW9uTGlzdCgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMTddID0gampfZ2VuOwotICAgICAgICAgIDsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSU1QTEVNRU5UUzoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihJTVBMRU1FTlRTKTsKLSAgICAgICAgVHlwZUV4cHJlc3Npb25MaXN0KCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzExOF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBOYW1lc3BhY2UgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIE5hbWVzcGFjZURlZmluaXRpb24oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBOYW1lc3BhY2VEZWZpbml0aW9uICovCi0gIEFTVE5hbWVzcGFjZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1ROYW1lc3BhY2VEZWZpbml0aW9uKHRoaXMsIEpKVE5BTUVTUEFDRURFRklOSVRJT04pOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgampfY29uc3VtZV90b2tlbihOQU1FU1BBQ0UpOwotICAgICAgSWRlbnRpZmllcigpOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBhY2thZ2UgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIGZpbmFsIHB1YmxpYyB2b2lkIFBhY2thZ2VEZWZpbml0aW9uKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZURlZmluaXRpb24gKi8KLSAgQVNUUGFja2FnZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RQYWNrYWdlRGVmaW5pdGlvbih0aGlzLCBKSlRQQUNLQUdFREVGSU5JVElPTik7Ci0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7Ci0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOwotICAgIHRyeSB7Ci0gICAgICBqal9jb25zdW1lX3Rva2VuKFBBQ0tBR0UpOwotICAgICAgc3dpdGNoICgoampfbnRrPT0tMSk/ampfbnRrKCk6ampfbnRrKSB7Ci0gICAgICBjYXNlIEdFVDoKLSAgICAgIGNhc2UgSU5DTFVERToKLSAgICAgIGNhc2UgU0VUOgotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgUGFja2FnZU5hbWUoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBqal9sYTFbMTE5XSA9IGpqX2dlbjsKLSAgICAgICAgOwotICAgICAgfQotICAgICAgQmxvY2soKTsKLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUGFja2FnZU5hbWUoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotIC8qQGJnZW4oamp0cmVlKSBQYWNrYWdlTmFtZSAqLwotICBBU1RQYWNrYWdlTmFtZSBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VOYW1lKHRoaXMsIEpKVFBBQ0tBR0VOQU1FKTsKLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsKLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgdHJ5IHsKLSAgICAgIHN3aXRjaCAoKGpqX250az09LTEpP2pqX250aygpOmpqX250aykgewotICAgICAgY2FzZSBTVFJJTkdfTElURVJBTDoKLSAgICAgICAgampfY29uc3VtZV90b2tlbihTVFJJTkdfTElURVJBTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBHRVQ6Ci0gICAgICBjYXNlIElOQ0xVREU6Ci0gICAgICBjYXNlIFNFVDoKLSAgICAgIGNhc2UgSURFTlRJRklFUjoKLSAgICAgICAgUGFja2FnZUlkZW50aWZpZXJzKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgampfbGExWzEyMF0gPSBqal9nZW47Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oLTEpOwotICAgICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgewotICAgICAgICAgIGlmIChqanRjMDAwKSB7Ci0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7Ci0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgewotICAgICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDt9Ci0gICAgICAgICAgfQotICAgICAgICAgIHtpZiAodHJ1ZSkgdGhyb3cgKEVycm9yKWpqdGUwMDA7fQotICAgIH0gZmluYWxseSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsKLSAgICAgICAgICB9Ci0gICAgfQotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgUGFja2FnZUlkZW50aWZpZXJzKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZUlkZW50aWZpZXJzICovCi0gIEFTVFBhY2thZ2VJZGVudGlmaWVycyBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VJZGVudGlmaWVycyh0aGlzLCBKSlRQQUNLQUdFSURFTlRJRklFUlMpOwotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOwotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsKLSAgICB0cnkgewotICAgICAgSWRlbnRpZmllcigpOwotICAgICAgbGFiZWxfMzc6Ci0gICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICBzd2l0Y2ggKChqal9udGs9PS0xKT9qal9udGsoKTpqal9udGspIHsKLSAgICAgICAgY2FzZSBET1Q6Ci0gICAgICAgICAgOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGpqX2xhMVsxMjFdID0gampfZ2VuOwotICAgICAgICAgIGJyZWFrIGxhYmVsXzM3OwotICAgICAgICB9Ci0gICAgICAgIGpqX2NvbnN1bWVfdG9rZW4oRE9UKTsKLSAgICAgICAgSWRlbnRpZmllcigpOwotICAgICAgfQotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7Ci0gICAgICAgICAgaWYgKGpqdGMwMDApIHsKLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsKLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7fQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7Ci0gICAgICAgICAgICB7aWYgKHRydWUpIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwO30KLSAgICAgICAgICB9Ci0gICAgICAgICAge2lmICh0cnVlKSB0aHJvdyAoRXJyb3Ipamp0ZTAwMDt9Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgICAgICBpZiAoamp0YzAwMCkgewotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOwotICAgICAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDAsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzMoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl80KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDMsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzUoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM181KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoNCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfNihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzYoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSg1LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl83KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfNygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDYsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzgoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM184KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoNywgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfOShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzkoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSg4LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEwKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoOSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTEoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xMSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEwLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xMihpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzEyKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTEsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzEzKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTMoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxMiwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTQoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xNCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDEzLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xNShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE1KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTQsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE2KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTYoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxNSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMTcoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18xNygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE2LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8xOChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzE4KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMTcsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzE5KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMTkoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgxOCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjAoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yMCgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDE5LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yMShpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzIxKCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjAsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzIyKGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjIoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyMSwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjMoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yMygpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDIyLCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNChpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI0KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjMsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI1KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjUoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyNCwgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjYoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yNigpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDI1LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfMl8yNyhpbnQgeGxhKSB7Ci0gICAgampfbGEgPSB4bGE7IGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gdG9rZW47Ci0gICAgdHJ5IHsgcmV0dXJuICFqal8zXzI3KCk7IH0KLSAgICBjYXRjaChMb29rYWhlYWRTdWNjZXNzIGxzKSB7IHJldHVybiB0cnVlOyB9Ci0gICAgZmluYWxseSB7IGpqX3NhdmUoMjYsIHhsYSk7IH0KLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8yXzI4KGludCB4bGEpIHsKLSAgICBqal9sYSA9IHhsYTsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSB0b2tlbjsKLSAgICB0cnkgeyByZXR1cm4gIWpqXzNfMjgoKTsgfQotICAgIGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgcmV0dXJuIHRydWU7IH0KLSAgICBmaW5hbGx5IHsgampfc2F2ZSgyNywgeGxhKTsgfQotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzJfMjkoaW50IHhsYSkgewotICAgIGpqX2xhID0geGxhOyBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IHRva2VuOwotICAgIHRyeSB7IHJldHVybiAhampfM18yOSgpOyB9Ci0gICAgY2F0Y2goTG9va2FoZWFkU3VjY2VzcyBscykgeyByZXR1cm4gdHJ1ZTsgfQotICAgIGZpbmFsbHkgeyBqal9zYXZlKDI4LCB4bGEpOyB9Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ0KCkgewotICAgIGlmIChqal8zUl8xODIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzE5OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzI0MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjIyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzcoKSB7Ci0gICAgaWYgKGpqXzNSXzE2OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTY5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihET1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4MigpIHsKLSAgICBpZiAoampfM1JfMjAxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMTgoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIwKCkgewotICAgIGlmIChqal8zUl8yNDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTY4KCkgewotICAgIGlmIChqal8zUl8xOTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzIwMCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzUoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8xNjYoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU0KCkgewotICAgIGlmIChqal8zUl8yNTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI0MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIxKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJJVF9PUikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU1QTEVNRU5UUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk0KCkgewotICAgIGlmIChqal8zUl8xMzUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUzKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzk0KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAxKCkgewotICAgIGlmIChqal8zUl8yMjIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzIzOSgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDEoKSB7Ci0gICAgaWYgKGpqXzNSXzI1NygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjQwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDYoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRVhURU5EUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5OSgpIHsKLSAgICBpZiAoampfM1JfMjE5KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yMjAoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYzKCkgewotICAgIGlmIChqal8zUl8yNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI1OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFhPUikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTkFNRVNQQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDAoKSB7Ci0gICAgaWYgKGpqXzNSXzMwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjIyKCkgewotICAgIGlmIChqal8zUl8yNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI1NCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5URVJGQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMDYoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTA1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTYoKSB7Ci0gICAgaWYgKGpqXzNSXzI2NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU1QTEVNRU5UUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zMTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFWFRFTkRTKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI4NigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzIyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwNSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzEzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8zMTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTkoKSB7Ci0gICAgaWYgKGpqXzNSXzI0MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjQxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5MCgpIHsKLSAgICBpZiAoampfM1JfMjg0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQklUX0FORCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjkoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE2MigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjkoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU5URVJGQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDTEFTUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzAwKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQzKCkgewotICAgIGlmIChqal8zUl8yNTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI2MygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09OU1QpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NygpIHsKLSAgICBpZiAoampfM1JfMjgzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDAoKSB7Ci0gICAgaWYgKGpqXzNSXzI1NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjU2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4MygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQyKCkgewotICAgIGlmIChqal8zUl82MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEVMSVBTRSkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI4NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDk5KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTAyKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTMzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTM0KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NSgpIHsKLSAgICBpZiAoampfM1JfNjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjc1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDI5KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChqal8zUl80MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg1KCkgewotICAgIGlmIChqal8zUl8yODcoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5MygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNTgoKSB7Ci0gICAgaWYgKGpqXzNSXzQzKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8yNzEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjg3KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEzKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjE2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzExKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl80MigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyNykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDI5KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI2OSgpIHsKLSAgICBpZiAoampfM1JfMjczKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MigpIHsKLSAgICBpZiAoampfM1JfMTAxKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTUoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODEoKSB7Ci0gICAgaWYgKGpqXzNSXzI4NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjg5KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjkwKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1NSgpIHsKLSAgICBpZiAoampfM1JfNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNfMTEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjgwKCkgewotICAgIGlmIChqal8zUl8yODQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3MygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjgwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yODEoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjY5KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjc3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAwKCkgewotICAgIGlmIChqal8zUl8xNDMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzk5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbig5NCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDkzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTAwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTAxKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzApKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig4KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzI0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI1MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oR0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18yNygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18yOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfOTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDMoKSB7Ci0gICAgaWYgKGpqXzNSXzYxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl82MigpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRlVOQ1RJT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTE2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTE3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTE4KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjUyKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzIxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDIoKSB7Ci0gICAgaWYgKGpqXzNSXzE4MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82MSgpIHsKLSAgICBpZiAoampfM1JfOTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEwMCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjA1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzYoKSB7Ci0gICAgaWYgKGpqXzNSXzI1MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzI0KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yODYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0MygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigxMDkpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihWQVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjM2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjUoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRUxJUFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTIoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xODcoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI2KCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTkoKSB7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTQyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTElQU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNigpIHsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5NSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjkoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTEwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTExKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTE1KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18yNigpIHsKLSAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIwNigpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18yNigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjI2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUzKCkgewotICAgIGlmIChqal8zUl8xODgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTcxKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3MygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3NigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTc3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNzgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE3OSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTgwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzEoKSB7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQkFORykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihUSUxERSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihNSU5VUykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNygpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18yNSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzI5KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFBMVVMpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI1KCkgewotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTc2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKERFQ1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNSgpIHsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjY1KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE3NSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihJTkNSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVFlQRU9GKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTczKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFZPSUQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oREVMRVRFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTIoKSB7Ci0gICAgaWYgKGpqXzNSXzMyMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEFTU0lHTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yMDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzU4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yMjQoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMzAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTE5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQVNTSUdOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMyNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTElQU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMTAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzU5KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE5KCkgewotICAgIGlmIChqal8zUl8xNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE1MygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDQoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTk2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTElQU0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM183KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDS0VUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNLRVQpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk2KCkgewotICAgIGlmIChqal8zUl8yMTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMxMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80MCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfNTcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfNygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM184KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl81OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oRE9UKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzk4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTQoKSB7Ci0gICAgaWYgKGpqXzNSXzQwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjgoKSB7Ci0gICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMzMwKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTkzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xOTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTMoKSB7Ci0gICAgaWYgKGpqXzNSXzQxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzQoKSB7Ci0gICAgaWYgKGpqXzNSXzQwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjQoKSB7Ci0gICAgaWYgKGpqXzNSXzE1NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTIxKCkgewotICAgIGlmIChqal8zUl8xNTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2MSgpIHsKLSAgICBpZiAoampfM1JfMTk2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zMDQoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU2KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwNikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDEwNykpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE4KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQ3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTMpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUVVBTElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzNSgpIHsKLSAgICBpZiAoampfM1JfMjUxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzQoKSB7Ci0gICAgaWYgKGpqXzNSXzE5MigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjUzKCkgewotICAgIGlmIChqal8zUl8xMTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMyOCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMzKCkgewotICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1NSgpIHsKLSAgICBpZiAoampfM1JfMTYwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMzIoKSB7Ci0gICAgaWYgKGpqXzNSXzE1NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjE3KCkgewotICAgIGlmIChqal8zUl81NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzMSgpIHsKLSAgICBpZiAoampfM1JfMTkxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTk3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzIzMCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjMxKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIzMygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMzUoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjMwKCkgewotICAgIGlmIChqal8zUl8xNzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyNigpIHsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGVU5DVElPTl8pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEyMygpIHsKLSAgICBpZiAoampfM1JfMTYwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzI0KCkgewotICAgIGlmIChqal8zUl81NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk3KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzI0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMTcoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xOTIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTkVXKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIxNCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM180KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM181KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2NCgpIHsKLSAgICBpZiAoampfM1JfMTk3KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zMDcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU5KCkgewotICAgIGlmIChqal8zUl8xOTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE1OCgpIHsKLSAgICBpZiAoampfM1JfMTkxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjIoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE1NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTU4KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTU3KCkgewotICAgIGlmIChqal8zUl8xNzAoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzMigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFWFBPUlQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMjAoKSB7Ci0gICAgaWYgKGpqXzNSXzE1NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTU1KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI4OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihRVUFMSUZJRVIpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzg0KCkgewotICAgIGlmIChqal8zUl8xMjUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMDgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMxNigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODMoKSB7Ci0gICAgaWYgKGpqXzNSXzEyMigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTIzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTI0KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgyKCkgewotICAgIGlmIChqal8zUl8xMjAoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzEyMSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81MCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfODIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzgzKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTYoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDMpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyMCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY1KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjcpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NikpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNzApKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI2NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTI1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNVUEVSKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODIoKSB7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMDgoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY2KCkgewotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ4KCkgewotICAgIGlmIChqal8zUl8yNjEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NCgpIHsKLSAgICBpZiAoampfM1JfMjgyKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDk3KSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjYxKCkgewotICAgIGlmIChqal8zUl8yNjYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI2NygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzAoKSB7Ci0gICAgaWYgKGpqXzNSXzI3NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNzQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIyNygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDgoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0tFVCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oVVNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI3MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTYzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElNUE9SVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihBU1NJR04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT01NQSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8yNjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI3OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI4OCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzgoKSB7Ci0gICAgaWYgKGpqXzNSXzE1NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjU5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElOQ0xVREUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTVFJJTkdfTElURVJBTCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNzIoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNzApKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNzgoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzI3OSgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjY4KCkgewotICAgIGlmIChqal8zUl8yNzIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0OSgpIHsKLSAgICBpZiAoampfM1JfMjYyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzEoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMjMoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE2MygpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU1QT1JUKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzUzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNjIoKSB7Ci0gICAgaWYgKGpqXzNSXzI2OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjc2KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI1MCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGVU5DVElPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMzgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEzNCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTY1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjApKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjUoKSB7Ci0gICAgaWYgKGpqXzNSXzEyMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTMzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFVTRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKE5BTUVTUEFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yNDkoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZVTkNUSU9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjkoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjUwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTMoKSB7Ci0gICAgaWYgKGpqXzNSXzEzNCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTIoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIGlmIChqal8zUl85MygpKSByZXR1cm4gdHJ1ZTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl85MygpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDgoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMzYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig1OSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM1KSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTIoKSB7Ci0gICAgaWYgKGpqXzNSXzEzMygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yNDYoKSB7Ci0gICAgaWYgKGpqXzNSXzI2MCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85MSgpIHsKLSAgICBpZiAoampfM1JfMTMyKCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NSgpIHsKLSAgICBpZiAoampfM1JfMjU5KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzkwKCkgewotICAgIGlmIChqal8zUl8xMzEoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODkoKSB7Ci0gICAgaWYgKGpqXzNSXzEzMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84OCgpIHsKLSAgICBpZiAoampfM1JfMTI5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84NygpIHsKLSAgICBpZiAoampfM1JfMTI4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84NigpIHsKLSAgICBpZiAoampfM1JfMTI3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMjMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI0NCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18xOSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18yMCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18yMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM18yMigpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjQ1KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI0NCgpIHsKLSAgICBpZiAoampfM1JfMjAzKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl84NSgpIHsKLSAgICBpZiAoampfM1JfMTI2KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzUxKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl84NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzg3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl84OCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfODkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzkwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl85MSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfOTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTMoKSB7Ci0gICAgaWYgKGpqXzNSXzIyOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjEyKCkgewotICAgIGlmIChqal8zUl8yMjgoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxMSgpIHsKLSAgICBpZiAoampfM1JfMjI3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzIyKCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjEoKSB7Ci0gICAgaWYgKGpqXzNSXzUyKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExCUkFDRSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xODMoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMjAoKSB7Ci0gICAgaWYgKGpqXzNSXzUxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE5KCkgewotICAgIGlmIChqal8zUl80NygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjA5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjAyKCkgewotICAgIGlmIChqal8zUl8yMjMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5MSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfc2Nhbl90b2tlbigzMykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDQzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjApKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2NSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDY3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNjYpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig2OCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDcwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNDEpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbig3NykpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMTAoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzIxMSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjEyKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODMoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIGlmIChqal8zUl8yMDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMjAyKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0MCgpIHsKLSAgICBpZiAoampfM1JfMTcwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUVVBTElGSUVSKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzU1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl85OCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTM5KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8xNDAoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMzkoKSB7Ci0gICAgaWYgKGpqXzNSXzE1NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk5KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEZJTkFMTFkpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTA1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTgoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ0FUQ0gpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEwNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFRSWSkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzI5OCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5OSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNzAoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFFVQUxJRklFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTkwKCkgewotICAgIGlmIChqal8zUl8yMDgoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzIwOSgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTEoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNTQoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE4OSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTkwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg5KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjA3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzExNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihUSFJPVykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE1KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFJFVFVSTikpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNTEoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTUwKCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNTUoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oNzgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfc2Nhbl90b2tlbigyNSkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDM4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMjgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ5KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTE0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEJSRUFLKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzE1MCgpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMTMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09OVElOVUUpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTQ5KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzgwKCkgewotICAgIGlmIChqal8zUl81MigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTE4KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xMTkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc5KCkgewotICAgIGlmIChqal8zUl8xMTgoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzExOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEyKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFdJVEgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTk1KCkgewotICAgIGlmIChqal8zUl8yMTUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIzOCgpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI1MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjM3KCkgewotICAgIGlmIChqal8zUl8yNTMoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwMygpIHsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwMigpIHsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTgoKSB7Ci0gICAgaWYgKGpqXzNSXzUwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80OCgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18xOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzgwKCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTk1KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzAyKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMzAzKCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNygpIHsKLSAgICBpZiAoampfM1JfNDkoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzIxNSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18xNygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMjM3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl8yMzgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xNigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDgoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU4pKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTExKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xNDcoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE0OCgpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE0NygpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihGT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDgoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTEwKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFdISUxFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihETykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oV0hJTEUpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNjQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUlBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxOSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihfREVGQVVMVCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxOCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDQVNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxMSgpIHsKLSAgICBpZiAoampfM1JfMzIwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMTAoKSB7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzMxOCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMzE5KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk3KCkgewotICAgIGlmIChqal8zUl8zMDEoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMyNigpIHsKLSAgICBpZiAoampfM1JfMzEwKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zMjUoKSB7Ci0gICAgaWYgKGpqXzNSXzIyMygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIwKCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8zMjUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzMyNigpKSByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwMSgpIHsKLSAgICBpZiAoampfM1JfMzEwKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zMTEoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNXSVRDSCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKExQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl82NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSUEFSRU4pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMjk3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzI5NigpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihFTFNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzE0NigpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKElGKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTFBBUkVOKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKFJQQVJFTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI5NigpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNDUoKSB7Ci0gICAgaWYgKGpqXzNSXzE4MygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTA2KCkgewotICAgIGlmIChqal8zUl81NSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihMQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTQ1KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oUkJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzEwNCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTVVBFUikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl80MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNDYoKSB7Ci0gICAgaWYgKGpqXzNSXzY0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDMoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0VNSUNPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE4NigpIHsKLSAgICBpZiAoampfM1JfNTIoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oTEJSQUNFKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzMwOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihSQlJBQ0UpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTg1KCkgewotICAgIGlmIChqal8zUl8yMDQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTQ2KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8xODQoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNfMTUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzE4NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfMTg2KCkpIHJldHVybiB0cnVlOwotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xODQoKSB7Ci0gICAgaWYgKGpqXzNSXzIwMygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzE3KCkgewotICAgIGlmIChqal8zUl8xNDYoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMwOSgpIHsKLSAgICBUb2tlbiB4c3A7Ci0gICAgaWYgKGpqXzNSXzMxNygpKSByZXR1cm4gdHJ1ZTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zMTcoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzgoKSB7Ci0gICAgaWYgKGpqXzNSXzExNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzcoKSB7Ci0gICAgaWYgKGpqXzNSXzExNigpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83NigpIHsKLSAgICBpZiAoampfM1JfMTE1KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzc1KCkgewotICAgIGlmIChqal8zUl8xMTQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKHRydWUpIHsgampfbGEgPSAwOyBqal9zY2FucG9zID0gampfbGFzdHBvczsgcmV0dXJuIGZhbHNlO30KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzQoKSB7Ci0gICAgaWYgKGpqXzNSXzExMygpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl83MygpIHsKLSAgICBpZiAoampfM1JfMTEyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zXzE1KCkgewotICAgIGlmIChqal8zUl80NygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzIoKSB7Ci0gICAgaWYgKGpqXzNSXzExMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzEoKSB7Ci0gICAgaWYgKGpqXzNSXzExMCgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMzIzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNzAoKSB7Ci0gICAgaWYgKGpqXzNSXzEwOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAodHJ1ZSkgeyBqal9sYSA9IDA7IGpqX3NjYW5wb3MgPSBqal9sYXN0cG9zOyByZXR1cm4gZmFsc2U7fQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82OSgpIHsKLSAgICBpZiAoampfM1JfMTA4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82OCgpIHsKLSAgICBpZiAoampfM1JfMTA3KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NygpIHsKLSAgICBpZiAoampfM1JfMTA2KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NigpIHsKLSAgICBpZiAoampfM1JfMTA1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl82NSgpIHsKLSAgICBpZiAoampfM1JfMTA0KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNfMTQoKSB7Ci0gICAgaWYgKGpqXzNSXzQ2KCkpIHJldHVybiB0cnVlOwotICAgIGlmICh0cnVlKSB7IGpqX2xhID0gMDsgampfc2NhbnBvcyA9IGpqX2xhc3Rwb3M7IHJldHVybiBmYWxzZTt9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ3KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zXzE0KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl82NSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjYoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzY3KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl82OCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNjkoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzcwKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83MSgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzIoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzczKCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83NCgpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzUoKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqXzNSXzc2KCkpIHsKLSAgICBqal9zY2FucG9zID0geHNwOwotICAgIGlmIChqal8zUl83NygpKSB7Ci0gICAgampfc2NhbnBvcyA9IHhzcDsKLSAgICBpZiAoampfM1JfNzgoKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfODEoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09NTUEpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzMxNSgpIHsKLSAgICBpZiAoampfM1JfMjkxKCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgeHNwID0gampfc2NhbnBvczsKLSAgICAgIGlmIChqal8zUl8zMjMoKSkgeyBqal9zY2FucG9zID0geHNwOyBicmVhazsgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTAzKCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTU1BKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDUoKSB7Ci0gICAgaWYgKGpqXzNSXzIyNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMygpIHsKLSAgICBpZiAoampfM1JfNDQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzQ1KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yODYoKSB7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM18xMigpIHsKLSAgICBpZiAoampfM1JfNDQoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzM5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl80OSgpIHsKLSAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzgxKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzY0KCkgewotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTAzKCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ1KCkgewotICAgIGlmIChqal8zUl82MygpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM18xMygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8zOSgpIHsKLSAgICBpZiAoampfM1JfNTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNfMTIoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjQ3KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhPT0spKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjI1KCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzIyNSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjk0KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhPT0spKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjkxKCkpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9zY2FuX3Rva2VuKENPTE9OKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzI5MSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM2KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKEhPT0spKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oQ09MT04pKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfNDUoKSkgcmV0dXJuIHRydWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzQ0KCkgewotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal9zY2FuX3Rva2VuKDkyKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTIxKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTIyKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI2KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTE5KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTIwKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI3KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI4KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI5KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTIzKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI1KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTI0KSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTMxKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTMyKSkgewotICAgIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oMTMwKSkgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICB9Ci0gICAgfQotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfOTcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oSE9PSykpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfc2Nhbl90b2tlbihDT0xPTikpIHJldHVybiB0cnVlOwotICAgIGlmIChqal8zUl8zOSgpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMjI1KCkgewotICAgIGlmIChqal8zUl8xMDIoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzI0NygpKSBqal9zY2FucG9zID0geHNwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xNjcoKSB7Ci0gICAgaWYgKGpqX3NjYW5fdG9rZW4oU0NfT1IpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTQ0KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yOTEoKSB7Ci0gICAgaWYgKGpqXzNSXzk2KCkpIHJldHVybiB0cnVlOwotICAgIFRva2VuIHhzcDsKLSAgICB4c3AgPSBqal9zY2FucG9zOwotICAgIGlmIChqal8zUl8yOTQoKSkgampfc2NhbnBvcyA9IHhzcDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfMTM4KCkgewotICAgIGlmIChqal9zY2FuX3Rva2VuKFNDX09SKSkgcmV0dXJuIHRydWU7Ci0gICAgaWYgKGpqXzNSXzEzNygpKSByZXR1cm4gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIGJvb2xlYW4gampfM1JfNjMoKSB7Ci0gICAgaWYgKGpqXzNSXzEwMigpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgeHNwID0gampfc2NhbnBvczsKLSAgICBpZiAoampfM1JfMTM2KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE5OCgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTQ19BTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTgyKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl81NigpIHsKLSAgICBpZiAoampfM1JfOTYoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgaWYgKGpqXzNSXzk3KCkpIGpqX3NjYW5wb3MgPSB4c3A7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzE2OSgpIHsKLSAgICBpZiAoampfc2Nhbl90b2tlbihTQ19BTkQpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTY4KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMTgoKSB7Ci0gICAgaWYgKGpqXzNSXzIyMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMjAxKCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8xMDIoKSB7Ci0gICAgaWYgKGpqXzNSXzE0NCgpKSByZXR1cm4gdHJ1ZTsKLSAgICBUb2tlbiB4c3A7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHhzcCA9IGpqX3NjYW5wb3M7Ci0gICAgICBpZiAoampfM1JfMTY3KCkpIHsgampfc2NhbnBvcyA9IHhzcDsgYnJlYWs7IH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBib29sZWFuIGpqXzNSXzk2KCkgewotICAgIGlmIChqal8zUl8xMzcoKSkgcmV0dXJuIHRydWU7Ci0gICAgVG9rZW4geHNwOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB4c3AgPSBqal9zY2FucG9zOwotICAgICAgaWYgKGpqXzNSXzEzOCgpKSB7IGpqX3NjYW5wb3MgPSB4c3A7IGJyZWFrOyB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal8zUl8yMDAoKSB7Ci0gICAgaWYgKGpqXzNSXzIyMSgpKSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoampfM1JfMTk5KCkpIHJldHVybiB0cnVlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHB1YmxpYyBKU1BhcnNlcjIwVG9rZW5NYW5hZ2VyIHRva2VuX3NvdXJjZTsKLSAgU2ltcGxlQ2hhclN0cmVhbSBqal9pbnB1dF9zdHJlYW07Ci0gIHB1YmxpYyBUb2tlbiB0b2tlbiwgampfbnQ7Ci0gIHByaXZhdGUgaW50IGpqX250azsKLSAgcHJpdmF0ZSBUb2tlbiBqal9zY2FucG9zLCBqal9sYXN0cG9zOwotICBwcml2YXRlIGludCBqal9sYTsKLSAgcHVibGljIGJvb2xlYW4gbG9va2luZ0FoZWFkID0gZmFsc2U7Ci0gIHByaXZhdGUgYm9vbGVhbiBqal9zZW1MQTsKLSAgcHJpdmF0ZSBpbnQgampfZ2VuOwotICBmaW5hbCBwcml2YXRlIGludFtdIGpqX2xhMSA9IG5ldyBpbnRbMTIyXTsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzA7Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV8xOwotICBzdGF0aWMgcHJpdmF0ZSBpbnRbXSBqal9sYTFfMjsKLSAgc3RhdGljIHByaXZhdGUgaW50W10gampfbGExXzM7Ci0gIHN0YXRpYyBwcml2YXRlIGludFtdIGpqX2xhMV80OwotICBzdGF0aWMgewotICAgICAgampfbGExXzAoKTsKLSAgICAgIGpqX2xhMV8xKCk7Ci0gICAgICBqal9sYTFfMigpOwotICAgICAgampfbGExXzMoKTsKLSAgICAgIGpqX2xhMV80KCk7Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV8wKCkgewotICAgICAgampfbGExXzAgPSBuZXcgaW50W10gezB4MCwweDk2ZDM3MjAwLDB4MTIwMDAwMDAsMHgwLDB4MCwweDEyMDAwMDAwLDB4MTIwMDAwMDAsMHg5MDAwMDAsMHgwLDB4ODAwMDAwLDB4MTIwMDAwMDAsMHgwLDB4MCwweDEyMDAwMDAwLDB4MTI5MTAwMDAsMHgwLDB4MCwweDAsMHgwLDB4MTI5MDAwMDAsMHgwLDB4OTAwMDAwLDB4MTM5MDAwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MTI5MTAwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDAwMDEwMCwweDY4MDAwMTAwLDB4NjAwMDAxMDAsMHg2MDAwMDEwMCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDE2NDI0MjAwLDB4MCwweDEyMTAwMDAwLDB4MTZkMzQyMDAsMHg5NmQzNzIwMCwweDQwMDAwLDB4ODQwMCwweDk2ZDNmNjAwLDB4OTZkM2Y2MDAsMHg4NDAwLDB4MTI5MTIwMDAsMHgxMjkxMDAwMCwweDEyOTEwMDAwLDB4NDAwMDAwLDB4MTIxMDIwMDAsMHgxMjEwMjAwMCwweDEyMDAwMDAwLDB4MTIwMDAwMDAsMHgxMjkxMDAwMCwweDgwMCwweDIwMDAwMCwweDk2ZDM3MjAwLDB4MCwweDEwMDAwMDAwLDB4ODA4MDMwMDAsMHgxMjEwMDAwMCwweDEyMTAwMDAwLDB4MCwweDAsMHgwLDB4MTAwMDAwLDB4MCwweDEyMDAwMDAwLDB4MjAwMCwweDAsMHgwLDB4MCwweDAsMHgxMjEwMDAwMCwweDEyMTAwMDAwLDB4MCwweDAsMHgwLDB4MTIwMDAwMDAsMHgxMjAwMjAwMCwweDAsMHgwLDB4MCwweDEyMDAyMDAwLDB4MjAwMCwweDAsMHgyMDAwLDB4ODAwMDAsMHg4MDAwMCwweDAsMHgwLDB4ODAwMDAsMHgxMjAwMDAwMCwweDEyMDAwMDAwLDB4MCx9OwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMSgpIHsKLSAgICAgIGpqX2xhMV8xID0gbmV3IGludFtdIHsweDQsMHhhNDdmZmZiLDB4NDAsMHgwLDB4MCwweDgwMDAwNTgsMHg4MDAwMDU4LDB4YTAyLDB4ODAwMDAxOCwweDAsMHg4MDAwMDU4LDB4MCwweDAsMHg4MDAwMDU4LDB4ODAxMmFkYiwweDAsMHgwLDB4MCwweDAsMHg4MDAwYWRiLDB4MCwweGEwMywweDgwMDBhZGIsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4ODAxMmFkYiwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg2MTVlMCwweDAsMHg4MDA4ODU4LDB4ODA3YmZmYiwweGE0N2ZmZmIsMHgwLDB4MCwweGE0N2ZmZmIsMHhhNDdmZmZiLDB4MCwweDgwMWFhZGIsMHg4MDEyYWRiLDB4ODAxMmFkYiwweDAsMHg4MDA4ODU4LDB4ODAwODg1OCwweDQwLDB4NDAsMHg4MDEyYWRiLDB4MCwweDAsMHhhNDdmZmZiLDB4MCwweDQwMDAsMHgyNDBjMDAwLDB4ODAwMDg1OCwweDgwMDA4NTgsMHgwLDB4MCwweDAsMHg4MDAsMHgwLDB4NDAsMHg4MDAwLDB4MCwweDAsMHgwLDB4MCwweDgwMDA4NTgsMHg4MDAwODU4LDB4MCwweDAsMHgwLDB4NDAsMHg0MCwweDAsMHgwLDB4MCwweDQwLDB4MCwweDAsMHgwLDB4MTAwMDAwMCwweDAsMHgyMDAwMDAwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHg0MCwweDQwLDB4MCx9OwotICAgfQotICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBqal9sYTFfMigpIHsKLSAgICAgIGpqX2xhMV8yID0gbmV3IGludFtdIHsweDAsMHg4MGFhNjA1ZiwweDQwMDAsMHg0MDAwMDAwLDB4NDAwMDAwMCwweDQwMDAsMHgyNDAwMCwweDJhMjA1ZSwweDAsMHgwLDB4MjQwNDIsMHgxMDAwMDAwLDB4NDAwMDAwMCwweDI0MDQyLDB4ODAyYTYwNWUsMHgxMDAwMDAwLDB4MCwweDIyMjAwMDAsMHgwLDB4MmE2MDVlLDB4MjIyMDAwMCwweDJhMjA1ZSwweDJhNjA1ZSwweDAsMHgyMjIwMDAwLDB4ODAwMDAwMCwweDIwMDAwMDAsMHgyMDAwMDAsMHg4MDAwMDAwLDB4MjAwMDAsMHg4MDJhNjA1ZSwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDYwMDAwMDAwLDB4NjAwMDAwMDAsMHg2MDAwMDAwMCwweDYwMDAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgxMDAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwLDB4MTAwMDAwMCwweDg0MDAwLDB4ODAwMDAwLDB4NDAwMCwweDgwYWE2MDVlLDB4ODBhYTYwNWYsMHgwLDB4MCwweDgwYWE2MDVmLDB4ODBhYTYwNWYsMHgwLDB4ODAyYTYwNWUsMHg4MDJhNjA1ZSwweDgwMmE2MDVlLDB4MCwweDQwMDAsMHg0MDAwLDB4NDAwMCwweDQwMDAsMHg4MDJhNjA1ZSwweDAsMHgwLDB4ODBhYTYwNWYsMHg4MDAwMDAsMHgwLDB4MSwweDQwMDAsMHg0MDAwLDB4MSwweDAsMHgyMDAwMCwweDVlLDB4MTAwMDAwMCwweDQwMDAsMHgwLDB4MTAwMDAwMCwweDEwMDAwMDAsMHgxMDAwMDAwMCwweDEwMDAwMDAwLDB4NDAwMCwweDQwMDAsMHgwLDB4MCwweDEwMDAwMDAsMHg0MDAwLDB4ODAwNDAwMCwweDAsMHgxMDAwMDAwLDB4ODAwMDAwMCwweDgwMDQwMDAsMHgwLDB4MTAwMDAwMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg0MDQwLDB4NDA0MCwweDIwMDAwMDAsfTsKLSAgIH0KLSAgIHByaXZhdGUgc3RhdGljIHZvaWQgampfbGExXzMoKSB7Ci0gICAgICBqal9sYTFfMyA9IG5ldyBpbnRbXSB7MHgwLDB4M2MwMSwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDNjMDEsMHgwLDB4YzAwLDB4MCwweGMwMCwweDAsMHgwLDB4MCwweDAsMHhjMDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgzYzAxLDB4OGMwMDAsMHg4YzAwMCwweDMwMDAsMHgzMDAwLDB4NzAwMDAwLDB4NzAwMDAwLDB4MzAsMHgzMCwweDMwLDB4MzAsMHg0OCwweDQ4LDB4NDgsMHgxMDAwMCwweDEwMDAwLDB4NDAwMDAsMHg0MDAwMCwweDIwMDAwLDB4MjAwMDAsMHgxMDAsMHgxMDAsMHg4MCwweDgwLDB4MiwweDIsMHgyLDB4MiwweGZmODAwMDAwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4M2MwMSwweDNjMDEsMHgwLDB4MCwweDNjMDEsMHgzYzAxLDB4MCwweDNjMDEsMHgzYzAxLDB4M2MwMSwweDAsMHgwLDB4MCwweDAsMHgwLDB4M2MwMSwweDAsMHgwLDB4M2MwMSwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDIsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDQsMHg0LDB4MCwweDAsMHgwLDB4NCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLH07Ci0gICB9Ci0gICBwcml2YXRlIHN0YXRpYyB2b2lkIGpqX2xhMV80KCkgewotICAgICAgampfbGExXzQgPSBuZXcgaW50W10gezB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHg2MCwweDYwLDB4NjAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDFmLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLDB4MCwweDAsMHgwLH07Ci0gICB9Ci0gIGZpbmFsIHByaXZhdGUgSkpDYWxsc1tdIGpqXzJfcnRucyA9IG5ldyBKSkNhbGxzWzI5XTsKLSAgcHJpdmF0ZSBib29sZWFuIGpqX3Jlc2NhbiA9IGZhbHNlOwotICBwcml2YXRlIGludCBqal9nYyA9IDA7Ci0KLSAgcHVibGljIEpTUGFyc2VyMjAoamF2YS5pby5JbnB1dFN0cmVhbSBzdHJlYW0pIHsKLSAgICAgdGhpcyhzdHJlYW0sIG51bGwpOwotICB9Ci0gIHB1YmxpYyBKU1BhcnNlcjIwKGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcpIHsKLSAgICB0cnkgeyBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BhcnNlcjIwVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gc3RyZWFtKSB7Ci0gICAgIFJlSW5pdChzdHJlYW0sIG51bGwpOwotICB9Ci0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKSB7Ci0gICAgdHJ5IHsgampfaW5wdXRfc3RyZWFtLlJlSW5pdChzdHJlYW0sIGVuY29kaW5nLCAxLCAxKTsgfSBjYXRjaChqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgeyB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihlKTsgfQotICAgIHRva2VuX3NvdXJjZS5SZUluaXQoampfaW5wdXRfc3RyZWFtKTsKLSAgICB0b2tlbiA9IG5ldyBUb2tlbigpOwotICAgIGpqX250ayA9IC0xOwotICAgIGpqdHJlZS5yZXNldCgpOwotICAgIGpqX2dlbiA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMjI7IGkrKykgampfbGExW2ldID0gLTE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal8yX3J0bnMubGVuZ3RoOyBpKyspIGpqXzJfcnRuc1tpXSA9IG5ldyBKSkNhbGxzKCk7Ci0gIH0KLQotICBwdWJsaWMgSlNQYXJzZXIyMChqYXZhLmlvLlJlYWRlciBzdHJlYW0pIHsKLSAgICBqal9pbnB1dF9zdHJlYW0gPSBuZXcgU2ltcGxlQ2hhclN0cmVhbShzdHJlYW0sIDEsIDEpOwotICAgIHRva2VuX3NvdXJjZSA9IG5ldyBKU1BhcnNlcjIwVG9rZW5NYW5hZ2VyKGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIHN0cmVhbSkgewotICAgIGpqX2lucHV0X3N0cmVhbS5SZUluaXQoc3RyZWFtLCAxLCAxKTsKLSAgICB0b2tlbl9zb3VyY2UuUmVJbml0KGpqX2lucHV0X3N0cmVhbSk7Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgcHVibGljIEpTUGFyc2VyMjAoSlNQYXJzZXIyMFRva2VuTWFuYWdlciB0bSkgewotICAgIHRva2VuX3NvdXJjZSA9IHRtOwotICAgIHRva2VuID0gbmV3IFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSBqal9sYTFbaV0gPSAtMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqXzJfcnRucy5sZW5ndGg7IGkrKykgampfMl9ydG5zW2ldID0gbmV3IEpKQ2FsbHMoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChKU1BhcnNlcjIwVG9rZW5NYW5hZ2VyIHRtKSB7Ci0gICAgdG9rZW5fc291cmNlID0gdG07Ci0gICAgdG9rZW4gPSBuZXcgVG9rZW4oKTsKLSAgICBqal9udGsgPSAtMTsKLSAgICBqanRyZWUucmVzZXQoKTsKLSAgICBqal9nZW4gPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTIyOyBpKyspIGpqX2xhMVtpXSA9IC0xOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSBqal8yX3J0bnNbaV0gPSBuZXcgSkpDYWxscygpOwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBUb2tlbiBqal9jb25zdW1lX3Rva2VuKGludCBraW5kKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIFRva2VuIG9sZFRva2VuOwotICAgIGlmICgob2xkVG9rZW4gPSB0b2tlbikubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgaWYgKHRva2VuLmtpbmQgPT0ga2luZCkgewotICAgICAgampfZ2VuKys7Ci0gICAgICBpZiAoKytqal9nYyA+IDEwMCkgewotICAgICAgICBqal9nYyA9IDA7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfMl9ydG5zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgSkpDYWxscyBjID0gampfMl9ydG5zW2ldOwotICAgICAgICAgIHdoaWxlIChjICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChjLmdlbiA8IGpqX2dlbikgYy5maXJzdCA9IG51bGw7Ci0gICAgICAgICAgICBjID0gYy5uZXh0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLSAgICB0b2tlbiA9IG9sZFRva2VuOwotICAgIGpqX2tpbmQgPSBraW5kOwotICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIGNsYXNzIExvb2thaGVhZFN1Y2Nlc3MgZXh0ZW5kcyBqYXZhLmxhbmcuRXJyb3IgeyB9Ci0gIGZpbmFsIHByaXZhdGUgTG9va2FoZWFkU3VjY2VzcyBqal9scyA9IG5ldyBMb29rYWhlYWRTdWNjZXNzKCk7Ci0gIGZpbmFsIHByaXZhdGUgYm9vbGVhbiBqal9zY2FuX3Rva2VuKGludCBraW5kKSB7Ci0gICAgaWYgKGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgewotICAgICAgampfbGEtLTsKLSAgICAgIGlmIChqal9zY2FucG9zLm5leHQgPT0gbnVsbCkgewotICAgICAgICBqal9sYXN0cG9zID0gampfc2NhbnBvcyA9IGpqX3NjYW5wb3MubmV4dCA9IHRva2VuX3NvdXJjZS5nZXROZXh0VG9rZW4oKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGpqX2xhc3Rwb3MgPSBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBqal9zY2FucG9zID0gampfc2NhbnBvcy5uZXh0OwotICAgIH0KLSAgICBpZiAoampfcmVzY2FuKSB7Ci0gICAgICBpbnQgaSA9IDA7IFRva2VuIHRvayA9IHRva2VuOwotICAgICAgd2hpbGUgKHRvayAhPSBudWxsICYmIHRvayAhPSBqal9zY2FucG9zKSB7IGkrKzsgdG9rID0gdG9rLm5leHQ7IH0KLSAgICAgIGlmICh0b2sgIT0gbnVsbCkgampfYWRkX2Vycm9yX3Rva2VuKGtpbmQsIGkpOwotICAgIH0KLSAgICBpZiAoampfc2NhbnBvcy5raW5kICE9IGtpbmQpIHJldHVybiB0cnVlOwotICAgIGlmIChqal9sYSA9PSAwICYmIGpqX3NjYW5wb3MgPT0gampfbGFzdHBvcykgdGhyb3cgampfbHM7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldE5leHRUb2tlbigpIHsKLSAgICBpZiAodG9rZW4ubmV4dCAhPSBudWxsKSB0b2tlbiA9IHRva2VuLm5leHQ7Ci0gICAgZWxzZSB0b2tlbiA9IHRva2VuLm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgampfbnRrID0gLTE7Ci0gICAgampfZ2VuKys7Ci0gICAgcmV0dXJuIHRva2VuOwotICB9Ci0KLSAgZmluYWwgcHVibGljIFRva2VuIGdldFRva2VuKGludCBpbmRleCkgewotICAgIFRva2VuIHQgPSBsb29raW5nQWhlYWQgPyBqal9zY2FucG9zIDogdG9rZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbmRleDsgaSsrKSB7Ci0gICAgICBpZiAodC5uZXh0ICE9IG51bGwpIHQgPSB0Lm5leHQ7Ci0gICAgICBlbHNlIHQgPSB0Lm5leHQgPSB0b2tlbl9zb3VyY2UuZ2V0TmV4dFRva2VuKCk7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgZmluYWwgcHJpdmF0ZSBpbnQgampfbnRrKCkgewotICAgIGlmICgoampfbnQ9dG9rZW4ubmV4dCkgPT0gbnVsbCkKLSAgICAgIHJldHVybiAoampfbnRrID0gKHRva2VuLm5leHQ9dG9rZW5fc291cmNlLmdldE5leHRUb2tlbigpKS5raW5kKTsKLSAgICBlbHNlCi0gICAgICByZXR1cm4gKGpqX250ayA9IGpqX250LmtpbmQpOwotICB9Ci0KLSAgcHJpdmF0ZSBqYXZhLnV0aWwuVmVjdG9yIGpqX2V4cGVudHJpZXMgPSBuZXcgamF2YS51dGlsLlZlY3RvcigpOwotICBwcml2YXRlIGludFtdIGpqX2V4cGVudHJ5OwotICBwcml2YXRlIGludCBqal9raW5kID0gLTE7Ci0gIHByaXZhdGUgaW50W10gampfbGFzdHRva2VucyA9IG5ldyBpbnRbMTAwXTsKLSAgcHJpdmF0ZSBpbnQgampfZW5kcG9zOwotCi0gIHByaXZhdGUgdm9pZCBqal9hZGRfZXJyb3JfdG9rZW4oaW50IGtpbmQsIGludCBwb3MpIHsKLSAgICBpZiAocG9zID49IDEwMCkgcmV0dXJuOwotICAgIGlmIChwb3MgPT0gampfZW5kcG9zICsgMSkgewotICAgICAgampfbGFzdHRva2Vuc1tqal9lbmRwb3MrK10gPSBraW5kOwotICAgIH0gZWxzZSBpZiAoampfZW5kcG9zICE9IDApIHsKLSAgICAgIGpqX2V4cGVudHJ5ID0gbmV3IGludFtqal9lbmRwb3NdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBqal9lbmRwb3M7IGkrKykgewotICAgICAgICBqal9leHBlbnRyeVtpXSA9IGpqX2xhc3R0b2tlbnNbaV07Ci0gICAgICB9Ci0gICAgICBib29sZWFuIGV4aXN0cyA9IGZhbHNlOwotICAgICAgZm9yIChqYXZhLnV0aWwuRW51bWVyYXRpb24gZSA9IGpqX2V4cGVudHJpZXMuZWxlbWVudHMoKTsgZS5oYXNNb3JlRWxlbWVudHMoKTspIHsKLSAgICAgICAgaW50W10gb2xkZW50cnkgPSAoaW50W10pKGUubmV4dEVsZW1lbnQoKSk7Ci0gICAgICAgIGlmIChvbGRlbnRyeS5sZW5ndGggPT0gampfZXhwZW50cnkubGVuZ3RoKSB7Ci0gICAgICAgICAgZXhpc3RzID0gdHJ1ZTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGpqX2V4cGVudHJ5Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAob2xkZW50cnlbaV0gIT0gampfZXhwZW50cnlbaV0pIHsKLSAgICAgICAgICAgICAgZXhpc3RzID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZXhpc3RzKSBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFleGlzdHMpIGpqX2V4cGVudHJpZXMuYWRkRWxlbWVudChqal9leHBlbnRyeSk7Ci0gICAgICBpZiAocG9zICE9IDApIGpqX2xhc3R0b2tlbnNbKGpqX2VuZHBvcyA9IHBvcykgLSAxXSA9IGtpbmQ7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uIGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKSB7Ci0gICAgampfZXhwZW50cmllcy5yZW1vdmVBbGxFbGVtZW50cygpOwotICAgIGJvb2xlYW5bXSBsYTF0b2tlbnMgPSBuZXcgYm9vbGVhblsxMzVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTM1OyBpKyspIHsKLSAgICAgIGxhMXRva2Vuc1tpXSA9IGZhbHNlOwotICAgIH0KLSAgICBpZiAoampfa2luZCA+PSAwKSB7Ci0gICAgICBsYTF0b2tlbnNbampfa2luZF0gPSB0cnVlOwotICAgICAgampfa2luZCA9IC0xOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEyMjsgaSsrKSB7Ci0gICAgICBpZiAoampfbGExW2ldID09IGpqX2dlbikgewotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyBqKyspIHsKLSAgICAgICAgICBpZiAoKGpqX2xhMV8wW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbal0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGpqX2xhMV8xW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbMzIral0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGpqX2xhMV8yW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbNjQral0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGpqX2xhMV8zW2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbOTYral0gPSB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGpqX2xhMV80W2ldICYgKDE8PGopKSAhPSAwKSB7Ci0gICAgICAgICAgICBsYTF0b2tlbnNbMTI4K2pdID0gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMzU7IGkrKykgewotICAgICAgaWYgKGxhMXRva2Vuc1tpXSkgewotICAgICAgICBqal9leHBlbnRyeSA9IG5ldyBpbnRbMV07Ci0gICAgICAgIGpqX2V4cGVudHJ5WzBdID0gaTsKLSAgICAgICAgampfZXhwZW50cmllcy5hZGRFbGVtZW50KGpqX2V4cGVudHJ5KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgampfZW5kcG9zID0gMDsKLSAgICBqal9yZXNjYW5fdG9rZW4oKTsKLSAgICBqal9hZGRfZXJyb3JfdG9rZW4oMCwgMCk7Ci0gICAgaW50W11bXSBleHB0b2tzZXEgPSBuZXcgaW50W2pqX2V4cGVudHJpZXMuc2l6ZSgpXVtdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgampfZXhwZW50cmllcy5zaXplKCk7IGkrKykgewotICAgICAgZXhwdG9rc2VxW2ldID0gKGludFtdKWpqX2V4cGVudHJpZXMuZWxlbWVudEF0KGkpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKHRva2VuLCBleHB0b2tzZXEsIHRva2VuSW1hZ2UpOwotICB9Ci0KLSAgZmluYWwgcHVibGljIHZvaWQgZW5hYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwdWJsaWMgdm9pZCBkaXNhYmxlX3RyYWNpbmcoKSB7Ci0gIH0KLQotICBmaW5hbCBwcml2YXRlIHZvaWQgampfcmVzY2FuX3Rva2VuKCkgewotICAgIGpqX3Jlc2NhbiA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOTsgaSsrKSB7Ci0gICAgdHJ5IHsKLSAgICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpXTsKLSAgICAgIGRvIHsKLSAgICAgICAgaWYgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICAgICAgampfbGEgPSBwLmFyZzsgampfbGFzdHBvcyA9IGpqX3NjYW5wb3MgPSBwLmZpcnN0OwotICAgICAgICAgIHN3aXRjaCAoaSkgewotICAgICAgICAgICAgY2FzZSAwOiBqal8zXzEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE6IGpqXzNfMigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjogampfM18zKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAzOiBqal8zXzQoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDQ6IGpqXzNfNSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgNTogampfM182KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA2OiBqal8zXzcoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDc6IGpqXzNfOCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgODogampfM185KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSA5OiBqal8zXzEwKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMDogampfM18xMSgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTE6IGpqXzNfMTIoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDEyOiBqal8zXzEzKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxMzogampfM18xNCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTQ6IGpqXzNfMTUoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE1OiBqal8zXzE2KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxNjogampfM18xNygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMTc6IGpqXzNfMTgoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDE4OiBqal8zXzE5KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAxOTogampfM18yMCgpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjA6IGpqXzNfMjEoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDIxOiBqal8zXzIyKCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyMjogampfM18yMygpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjM6IGpqXzNfMjQoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI0OiBqal8zXzI1KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyNTogampfM18yNigpOyBicmVhazsKLSAgICAgICAgICAgIGNhc2UgMjY6IGpqXzNfMjcoKTsgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIDI3OiBqal8zXzI4KCk7IGJyZWFrOwotICAgICAgICAgICAgY2FzZSAyODogampfM18yOSgpOyBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcCA9IHAubmV4dDsKLSAgICAgIH0gd2hpbGUgKHAgIT0gbnVsbCk7Ci0gICAgICB9IGNhdGNoKExvb2thaGVhZFN1Y2Nlc3MgbHMpIHsgfQotICAgIH0KLSAgICBqal9yZXNjYW4gPSBmYWxzZTsKLSAgfQotCi0gIGZpbmFsIHByaXZhdGUgdm9pZCBqal9zYXZlKGludCBpbmRleCwgaW50IHhsYSkgewotICAgIEpKQ2FsbHMgcCA9IGpqXzJfcnRuc1tpbmRleF07Ci0gICAgd2hpbGUgKHAuZ2VuID4gampfZ2VuKSB7Ci0gICAgICBpZiAocC5uZXh0ID09IG51bGwpIHsgcCA9IHAubmV4dCA9IG5ldyBKSkNhbGxzKCk7IGJyZWFrOyB9Ci0gICAgICBwID0gcC5uZXh0OwotICAgIH0KLSAgICBwLmdlbiA9IGpqX2dlbiArIHhsYSAtIGpqX2xhOyBwLmZpcnN0ID0gdG9rZW47IHAuYXJnID0geGxhOwotICB9Ci0KLSAgc3RhdGljIGZpbmFsIGNsYXNzIEpKQ2FsbHMgewotICAgIGludCBnZW47Ci0gICAgVG9rZW4gZmlyc3Q7Ci0gICAgaW50IGFyZzsKLSAgICBKSkNhbGxzIG5leHQ7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMENvbnN0YW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMENvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZWRjNzdjLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL0pTUGFyc2VyMjBDb25zdGFudHMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BhcnNlcjIwQ29uc3RhbnRzLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBKU1BhcnNlcjIwQ29uc3RhbnRzIHsKLQotICBpbnQgRU9GID0gMDsKLSAgaW50IEVPTCA9IDE7Ci0gIGludCBXUyA9IDI7Ci0gIGludCBTSU5HTEVfTElORV9DT01NRU5UID0gNTsKLSAgaW50IE1VTFRJX0xJTkVfQ09NTUVOVCA9IDY7Ci0gIGludCBBUyA9IDg7Ci0gIGludCBCUkVBSyA9IDk7Ci0gIGludCBDQVNFID0gMTA7Ci0gIGludCBDQVRDSCA9IDExOwotICBpbnQgQ0xBU1MgPSAxMjsKLSAgaW50IENPTlNUID0gMTM7Ci0gIGludCBDT05USU5VRSA9IDE0OwotICBpbnQgX0RFRkFVTFQgPSAxNTsKLSAgaW50IERFTEVURSA9IDE2OwotICBpbnQgRE8gPSAxNzsKLSAgaW50IEVMU0UgPSAxODsKLSAgaW50IEVYVEVORFMgPSAxOTsKLSAgaW50IEZBTFNFID0gMjA7Ci0gIGludCBGSU5BTExZID0gMjE7Ci0gIGludCBGT1IgPSAyMjsKLSAgaW50IEZVTkNUSU9OID0gMjM7Ci0gIGludCBGVU5DVElPTl8gPSAyNDsKLSAgaW50IEdFVCA9IDI1OwotICBpbnQgSUYgPSAyNjsKLSAgaW50IElOID0gMjc7Ci0gIGludCBJTkNMVURFID0gMjg7Ci0gIGludCBJTlNUQU5DRU9GID0gMjk7Ci0gIGludCBJUyA9IDMwOwotICBpbnQgTkFNRVNQQUNFID0gMzE7Ci0gIGludCBORVcgPSAzMjsKLSAgaW50IE5VTEwgPSAzMzsKLSAgaW50IFBBQ0tBR0UgPSAzNDsKLSAgaW50IFBSSVZBVEUgPSAzNTsKLSAgaW50IFBVQkxJQyA9IDM2OwotICBpbnQgUkVUVVJOID0gMzc7Ci0gIGludCBTRVQgPSAzODsKLSAgaW50IFNVUEVSID0gMzk7Ci0gIGludCBTV0lUQ0ggPSA0MDsKLSAgaW50IFRISVMgPSA0MTsKLSAgaW50IFRIUk9XID0gNDI7Ci0gIGludCBUUlVFID0gNDM7Ci0gIGludCBUUlkgPSA0NDsKLSAgaW50IFRZUEVPRiA9IDQ1OwotICBpbnQgVVNFID0gNDY7Ci0gIGludCBWQVIgPSA0NzsKLSAgaW50IFZPSUQgPSA0ODsKLSAgaW50IFdISUxFID0gNDk7Ci0gIGludCBXSVRIID0gNTA7Ci0gIGludCBBQlNUUkFDVCA9IDUxOwotICBpbnQgREVCVUdHRVIgPSA1MjsKLSAgaW50IEVOVU0gPSA1MzsKLSAgaW50IEVYUE9SVCA9IDU0OwotICBpbnQgR09UTyA9IDU1OwotICBpbnQgSU1QTEVNRU5UUyA9IDU2OwotICBpbnQgSU5URVJGQUNFID0gNTc7Ci0gIGludCBOQVRJVkUgPSA1ODsKLSAgaW50IFBST1RFQ1RFRCA9IDU5OwotICBpbnQgU1lOQ0hST05JWkVEID0gNjA7Ci0gIGludCBUSFJPV1MgPSA2MTsKLSAgaW50IFRSQU5TSUVOVCA9IDYyOwotICBpbnQgVk9MQVRJTEUgPSA2MzsKLSAgaW50IElNUE9SVCA9IDY0OwotICBpbnQgREVDSU1BTF9MSVRFUkFMID0gNjU7Ci0gIGludCBIRVhfTElURVJBTCA9IDY2OwotICBpbnQgT0NUQUxfTElURVJBTCA9IDY3OwotICBpbnQgRkxPQVRJTkdfUE9JTlRfTElURVJBTCA9IDY4OwotICBpbnQgRVhQT05FTlQgPSA2OTsKLSAgaW50IFNUUklOR19MSVRFUkFMID0gNzA7Ci0gIGludCBFU0NBUEVfU0VRVUVOQ0UgPSA3MTsKLSAgaW50IFVOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTCA9IDcyOwotICBpbnQgUkVHWF9TVEFSVF9DSEFSID0gNzM7Ci0gIGludCBSRUdYX0JPRFlfQ0hBUl9FWENMVVNJT04gPSA3NDsKLSAgaW50IFJFR1hfQk9EWV9DSEFSID0gNzU7Ci0gIGludCBSRUdFWF9FTkRfQ0hBUiA9IDc2OwotICBpbnQgUkVHVUxBUl9FWFBSRVNTSU9OID0gNzc7Ci0gIGludCBJREVOVElGSUVSID0gNzg7Ci0gIGludCBMRVRURVIgPSA3OTsKLSAgaW50IERJR0lUID0gODA7Ci0gIGludCBMUEFSRU4gPSA4MTsKLSAgaW50IFJQQVJFTiA9IDgyOwotICBpbnQgTEJSQUNFID0gODM7Ci0gIGludCBSQlJBQ0UgPSA4NDsKLSAgaW50IExCUkFDS0VUID0gODU7Ci0gIGludCBSQlJBQ0tFVCA9IDg2OwotICBpbnQgU0VNSUNPTE9OID0gODc7Ci0gIGludCBDT01NQSA9IDg4OwotICBpbnQgRE9UID0gODk7Ci0gIGludCBRVUFMSUZJRVIgPSA5MDsKLSAgaW50IEVMSVBTRSA9IDkxOwotICBpbnQgQVNTSUdOID0gOTI7Ci0gIGludCBHVCA9IDkzOwotICBpbnQgTFQgPSA5NDsKLSAgaW50IEJBTkcgPSA5NTsKLSAgaW50IFRJTERFID0gOTY7Ci0gIGludCBIT09LID0gOTc7Ci0gIGludCBDT0xPTiA9IDk4OwotICBpbnQgRVEgPSA5OTsKLSAgaW50IExFID0gMTAwOwotICBpbnQgR0UgPSAxMDE7Ci0gIGludCBORSA9IDEwMjsKLSAgaW50IFNDX09SID0gMTAzOwotICBpbnQgU0NfQU5EID0gMTA0OwotICBpbnQgU0NfWE9SID0gMTA1OwotICBpbnQgSU5DUiA9IDEwNjsKLSAgaW50IERFQ1IgPSAxMDc7Ci0gIGludCBQTFVTID0gMTA4OwotICBpbnQgTUlOVVMgPSAxMDk7Ci0gIGludCBTVEFSID0gMTEwOwotICBpbnQgU0xBU0ggPSAxMTE7Ci0gIGludCBCSVRfQU5EID0gMTEyOwotICBpbnQgQklUX09SID0gMTEzOwotICBpbnQgWE9SID0gMTE0OwotICBpbnQgUkVNID0gMTE1OwotICBpbnQgTFNISUZUID0gMTE2OwotICBpbnQgUlNJR05FRFNISUZUID0gMTE3OwotICBpbnQgUlVOU0lHTkVEU0hJRlQgPSAxMTg7Ci0gIGludCBQTFVTQVNTSUdOID0gMTE5OwotICBpbnQgTUlOVVNBU1NJR04gPSAxMjA7Ci0gIGludCBTVEFSQVNTSUdOID0gMTIxOwotICBpbnQgU0xBU0hBU1NJR04gPSAxMjI7Ci0gIGludCBBTkRBU1NJR04gPSAxMjM7Ci0gIGludCBPUkFTU0lHTiA9IDEyNDsKLSAgaW50IFhPUkFTU0lHTiA9IDEyNTsKLSAgaW50IFJFTUFTU0lHTiA9IDEyNjsKLSAgaW50IExTSElGVEFTU0lHTiA9IDEyNzsKLSAgaW50IFJTSUdORURTSElGVEFTU0lHTiA9IDEyODsKLSAgaW50IFJVTlNJR05FRFNISUZUQVNTSUdOID0gMTI5OwotICBpbnQgU0NfT1JBU1NJR04gPSAxMzA7Ci0gIGludCBTQ19BTkRBU1NJR04gPSAxMzE7Ci0gIGludCBTQ19YT1JBU1NJR04gPSAxMzI7Ci0gIGludCBJREVOVElUWU9QRVIgPSAxMzM7Ci0gIGludCBOT1RJREVOVElUWU9QRVIgPSAxMzQ7Ci0KLSAgaW50IERFRkFVTFQgPSAwOwotICBpbnQgSU5fU0lOR0xFX0xJTkVfQ09NTUVOVCA9IDE7Ci0gIGludCBJTl9NVUxUSV9MSU5FX0NPTU1FTlQgPSAyOwotCi0gIFN0cmluZ1tdIHRva2VuSW1hZ2UgPSB7Ci0gICAgIjxFT0Y+IiwKLSAgICAiPEVPTD4iLAotICAgICI8V1M+IiwKLSAgICAiXCIvL1wiIiwKLSAgICAiXCIvKlwiIiwKLSAgICAiPFNJTkdMRV9MSU5FX0NPTU1FTlQ+IiwKLSAgICAiXCIqL1wiIiwKLSAgICAiPHRva2VuIG9mIGtpbmQgNz4iLAotICAgICJcImFzXCIiLAotICAgICJcImJyZWFrXCIiLAotICAgICJcImNhc2VcIiIsCi0gICAgIlwiY2F0Y2hcIiIsCi0gICAgIlwiY2xhc3NcIiIsCi0gICAgIlwiY29uc3RcIiIsCi0gICAgIlwiY29udGludWVcIiIsCi0gICAgIlwiZGVmYXVsdFwiIiwKLSAgICAiXCJkZWxldGVcIiIsCi0gICAgIlwiZG9cIiIsCi0gICAgIlwiZWxzZVwiIiwKLSAgICAiXCJleHRlbmRzXCIiLAotICAgICJcImZhbHNlXCIiLAotICAgICJcImZpbmFsbHlcIiIsCi0gICAgIlwiZm9yXCIiLAotICAgICJcImZ1bmN0aW9uXCIiLAotICAgICJcIkZ1bmN0aW9uXCIiLAotICAgICJcImdldFwiIiwKLSAgICAiXCJpZlwiIiwKLSAgICAiXCJpblwiIiwKLSAgICAiXCJpbmNsdWRlXCIiLAotICAgICJcImluc3RhbmNlb2ZcIiIsCi0gICAgIlwiaXNcIiIsCi0gICAgIlwibmFtZXNwYWNlXCIiLAotICAgICJcIm5ld1wiIiwKLSAgICAiXCJudWxsXCIiLAotICAgICJcInBhY2thZ2VcIiIsCi0gICAgIlwicHJpdmF0ZVwiIiwKLSAgICAiXCJwdWJsaWNcIiIsCi0gICAgIlwicmV0dXJuXCIiLAotICAgICJcInNldFwiIiwKLSAgICAiXCJzdXBlclwiIiwKLSAgICAiXCJzd2l0Y2hcIiIsCi0gICAgIlwidGhpc1wiIiwKLSAgICAiXCJ0aHJvd1wiIiwKLSAgICAiXCJ0cnVlXCIiLAotICAgICJcInRyeVwiIiwKLSAgICAiXCJ0eXBlb2ZcIiIsCi0gICAgIlwidXNlXCIiLAotICAgICJcInZhclwiIiwKLSAgICAiXCJ2b2lkXCIiLAotICAgICJcIndoaWxlXCIiLAotICAgICJcIndpdGhcIiIsCi0gICAgIlwiYWJzdHJhY3RcIiIsCi0gICAgIlwiZGVidWdnZXJcIiIsCi0gICAgIlwiZW51bVwiIiwKLSAgICAiXCJleHBvcnRcIiIsCi0gICAgIlwiZ290b1wiIiwKLSAgICAiXCJpbXBsZW1lbnRzXCIiLAotICAgICJcImludGVyZmFjZVwiIiwKLSAgICAiXCJuYXRpdmVcIiIsCi0gICAgIlwicHJvdGVjdGVkXCIiLAotICAgICJcInN5bmNocm9uaXplZFwiIiwKLSAgICAiXCJ0aHJvd3NcIiIsCi0gICAgIlwidHJhbnNpZW50XCIiLAotICAgICJcInZvbGF0aWxlXCIiLAotICAgICJcImltcG9ydFwiIiwKLSAgICAiPERFQ0lNQUxfTElURVJBTD4iLAotICAgICI8SEVYX0xJVEVSQUw+IiwKLSAgICAiPE9DVEFMX0xJVEVSQUw+IiwKLSAgICAiPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IiwKLSAgICAiPEVYUE9ORU5UPiIsCi0gICAgIjxTVFJJTkdfTElURVJBTD4iLAotICAgICI8RVNDQVBFX1NFUVVFTkNFPiIsCi0gICAgIjxVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUw+IiwKLSAgICAiPFJFR1hfU1RBUlRfQ0hBUj4iLAotICAgICI8UkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OPiIsCi0gICAgIjxSRUdYX0JPRFlfQ0hBUj4iLAotICAgICI8UkVHRVhfRU5EX0NIQVI+IiwKLSAgICAiPFJFR1VMQVJfRVhQUkVTU0lPTj4iLAotICAgICI8SURFTlRJRklFUj4iLAotICAgICI8TEVUVEVSPiIsCi0gICAgIjxESUdJVD4iLAotICAgICJcIihcIiIsCi0gICAgIlwiKVwiIiwKLSAgICAiXCJ7XCIiLAotICAgICJcIn1cIiIsCi0gICAgIlwiW1wiIiwKLSAgICAiXCJdXCIiLAotICAgICJcIjtcIiIsCi0gICAgIlwiLFwiIiwKLSAgICAiXCIuXCIiLAotICAgICJcIjo6XCIiLAotICAgICJcIi4uLlwiIiwKLSAgICAiXCI9XCIiLAotICAgICJcIj5cIiIsCi0gICAgIlwiPFwiIiwKLSAgICAiXCIhXCIiLAotICAgICJcIn5cIiIsCi0gICAgIlwiP1wiIiwKLSAgICAiXCI6XCIiLAotICAgICJcIj09XCIiLAotICAgICJcIjw9XCIiLAotICAgICJcIj49XCIiLAotICAgICJcIiE9XCIiLAotICAgICJcInx8XCIiLAotICAgICJcIiYmXCIiLAotICAgICJcIl5eXCIiLAotICAgICJcIisrXCIiLAotICAgICJcIi0tXCIiLAotICAgICJcIitcIiIsCi0gICAgIlwiLVwiIiwKLSAgICAiXCIqXCIiLAotICAgICJcIi9cIiIsCi0gICAgIlwiJlwiIiwKLSAgICAiXCJ8XCIiLAotICAgICJcIl5cIiIsCi0gICAgIlwiJVwiIiwKLSAgICAiXCI8PFwiIiwKLSAgICAiXCI+PlwiIiwKLSAgICAiXCI+Pj5cIiIsCi0gICAgIlwiKz1cIiIsCi0gICAgIlwiLT1cIiIsCi0gICAgIlwiKj1cIiIsCi0gICAgIlwiLz1cIiIsCi0gICAgIlwiJj1cIiIsCi0gICAgIlwifD1cIiIsCi0gICAgIlwiXj1cIiIsCi0gICAgIlwiJT1cIiIsCi0gICAgIlwiPDw9XCIiLAotICAgICJcIj4+PVwiIiwKLSAgICAiXCI+Pj49XCIiLAotICAgICJcInx8PVwiIiwKLSAgICAiXCImJj1cIiIsCi0gICAgIlwiXl49XCIiLAotICAgICJcIj09PVwiIiwKLSAgICAiXCIhPT1cIiIsCi0gIH07Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVG9rZW5NYW5hZ2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVG9rZW5NYW5hZ2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY0NTZmMzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRva2VuTWFuYWdlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjI0NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlJkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBKU1BhcnNlcjIwVG9rZW5NYW5hZ2VyLmphdmEgKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgSlNQYXJzZXIyMFRva2VuTWFuYWdlciBpbXBsZW1lbnRzIEpTUGFyc2VyMjBDb25zdGFudHMKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWdWYWxpZCA9IHRydWU7Ci0gICAgcHVibGljIHZvaWQgc2V0UmVnSW52YWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFJlZ1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIH0KLSAgcHVibGljICBqYXZhLmlvLlByaW50U3RyZWFtIGRlYnVnU3RyZWFtID0gU3lzdGVtLm91dDsKLSAgcHVibGljICB2b2lkIHNldERlYnVnU3RyZWFtKGphdmEuaW8uUHJpbnRTdHJlYW0gZHMpIHsgZGVidWdTdHJlYW0gPSBkczsgfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpCi17Ci0gICBzd2l0Y2ggKHBvcykKLSAgIHsKLSAgICAgIGNhc2UgMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MThMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4NDAwODAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMTA7Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZmZmZmZmZmZmZmZmZmMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHhhMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gNTsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDdjMDIwMTAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGZkZmZmZmZmODNmZGZlMDBMKSAhPSAwTCB8fCAoYWN0aXZlMSAmIDB4MUwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyAhPSAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZmZmZjJmYmViMWJkZmUwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoamptYXRjaGVkUG9zICE9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhkMDQxMDI0MDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgMzoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZmY1YTI1YmNiMWI5ZmEwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAzOwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhhNTBhMDIwMDA0MDQwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHhkZjU4MjEzY2IxYTljMDAwTCkgIT0gMEwgfHwgKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGlmIChqam1hdGNoZWRQb3MgIT0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDIwNDgwMDAxMDNhMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ZGIxODAwMGNiMWE4YzAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gNTsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjQ0MDIxMzAwMDAxMDAwMEwpICE9IDBMIHx8IChhY3RpdmUxICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGRiMTgwMDAwYTE4MDQwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDY7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweGMxMDI4ODAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgY2FzZSA3OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg1YjAwMDAwMGEwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA3OwotICAgICAgICAgICAgcmV0dXJuIDMwOwotICAgICAgICAgfQotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDE4MDAwMDAxODA0MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDExMDAwMDAwMjAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA3ODsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDg7Ci0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICB9Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDRhMDAwMDAwODAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNhc2UgOToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc4OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gOTsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDIwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gMzA7Ci0gICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBjYXNlIDEwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNzg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAxMDsKLSAgICAgICAgICAgIHJldHVybiAzMDsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiAtMTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgcmV0dXJuIC0xOwotICAgfQotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYV8wKGludCBwb3MsIGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpCi17Ci0gICByZXR1cm4gampNb3ZlTmZhXzAoampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKHBvcywgYWN0aXZlMCwgYWN0aXZlMSwgYWN0aXZlMiksIHBvcyArIDEpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdG9wQXRQb3MoaW50IHBvcywgaW50IGtpbmQpCi17Ci0gICBqam1hdGNoZWRLaW5kID0ga2luZDsKLSAgIGpqbWF0Y2hlZFBvcyA9IHBvczsKLSAgIHJldHVybiBwb3MgKyAxOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampTdGFydE5mYVdpdGhTdGF0ZXNfMChpbnQgcG9zLCBpbnQga2luZCwgaW50IHN0YXRlKQotewotICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICBqam1hdGNoZWRQb3MgPSBwb3M7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgeyByZXR1cm4gcG9zICsgMTsgfQotICAgcmV0dXJuIGpqTW92ZU5mYV8wKHN0YXRlLCBwb3MgKyAxKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzAoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDMzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDk1OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg0MDAwMDAwMDAwTCwgMHg0MEwpOwotICAgICAgY2FzZSAzNzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTU7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDQwMDAwMDAwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTEyOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHg4MDAwMTAwMDAwMDAwMDBMLCAweDhMKTsKLSAgICAgIGNhc2UgNDA6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODEpOwotICAgICAgY2FzZSA0MToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4Mik7Ci0gICAgICBjYXNlIDQyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MjAwMDAwMDAwMDAwMDAwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwODsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwNDAwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODgpOwotICAgICAgY2FzZSA0NToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMDk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDEwMDA4MDAwMDAwMDAwMEwsIDB4MEwpOwotICAgICAgY2FzZSA0NjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA4OTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwMDAwMEwsIDB4MEwpOwotICAgICAgY2FzZSA0NzoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTE7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDE4TCwgMHg0MDAwMDAwMDAwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNTg6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gOTg7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDBMLCAweDQwMDAwMDBMLCAweDBMKTsKLSAgICAgIGNhc2UgNTk6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODcpOwotICAgICAgY2FzZSA2MDoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5NDsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAxMDAwMTAwMDAwMDAwMEwsIDB4MEwpOwotICAgICAgY2FzZSA2MToKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5MjsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4ODAwMDAwMDAwTCwgMHgyMEwpOwotICAgICAgY2FzZSA2MjoKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5MzsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4NjAwMDIwMDAwMDAwMDBMLCAweDNMKTsKLSAgICAgIGNhc2UgNjM6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgOTcpOwotICAgICAgY2FzZSA3MDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSA5MToKLSAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygwLCA4NSk7Ci0gICAgICBjYXNlIDkzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDg2KTsKLSAgICAgIGNhc2UgOTQ6Ci0gICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE0OwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHgwTCwgMHgyMDAwMDIwMDAwMDAwMDAwTCwgMHgxMEwpOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMDAwMDAwMDEwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSA5ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDk5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg3YzAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEwMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MTAwMDAwMDAwMzgwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg2MDAwMDAwMDBjMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweGYwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDgwMDAwMDAyMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MzAwMDAwMDdjMDAwMDAwTCwgMHgxTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMzgwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMDAxYzAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MjAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDEwMDAwMWMwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzAoMHg2MDAwM2UwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4NDAwMDAwMDAwMDAwTCwgMHgwTCwgMHgwTCk7Ci0gICAgICBjYXNlIDExODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4ODAwMTgwMDAwMDAwMDAwMEwsIDB4MEwsIDB4MEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTFfMCgweDYwMDAwMDAwMDAwMDBMLCAweDBMLCAweDBMKTsKLSAgICAgIGNhc2UgMTIzOgotICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDAsIDgzKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDExMzsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKDB4MEwsIDB4MTAwMDAwODAwMDAwMDAwMEwsIDB4NEwpOwotICAgICAgY2FzZSAxMjU6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgODQpOwotICAgICAgY2FzZSAxMjY6Ci0gICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMCwgOTYpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlTmZhXzAoMiwgMCk7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMV8wKGxvbmcgYWN0aXZlMCwgbG9uZyBhY3RpdmUxLCBsb25nIGFjdGl2ZTIpCi17Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDAsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpOwotICAgICAgcmV0dXJuIDE7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMzg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTA0OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMHg4TCk7Ci0gICAgICBjYXNlIDQyOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDQpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDQzOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwNik7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNDU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTA3KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA0NjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDgwMDAwMDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDQ3OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4TCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMyk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNTg6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDQwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCA5MCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgNjA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE2OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDgwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSA5OTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MTAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEwMSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwMjsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4ODAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMTkpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDEwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMSwgMTIxKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUxICYgMHg0MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygxLCAxMjIpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDgwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyMyk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MTAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyNCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4MjAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyNSk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDEyNik7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4NjBMKTsKLSAgICAgIGNhc2UgNjI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTEgJiAweDIwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTE3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAweDQwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMiwgMHgzTCk7Ci0gICAgICBjYXNlIDk0OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHgyMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDEwNTsKLSAgICAgICAgICAgIGpqbWF0Y2hlZFBvcyA9IDE7Ci0gICAgICAgICB9Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDB4MTBMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDgwMDQ4MDEwMGMwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDk4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwNjEwMjAxODAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMjYsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDIwMDIwNjAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwMDAyMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDg6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQxMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTA5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDFMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMEwpICE9IDBMKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDI3OwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MjIwMDAwMDMwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTExOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgyMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMSwgMTcsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4ODA4MTAwMDAwMDQwNjAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4NDgwMDE4MDgwMDAwMDIwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgxLCA4LCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDEsIDMwLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4OTIwMTgwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMjA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTJfMChhY3RpdmUwLCAweDQwMDAwMDAwMDgwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTIxOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAoYWN0aXZlMCwgMHgxMDAwMjAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTI0OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gMTAzOwotICAgICAgICAgICAgamptYXRjaGVkUG9zID0gMTsKLSAgICAgICAgIH0KLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMl8wKGFjdGl2ZTAsIDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMHg0TCk7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgwLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEyXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxLCBsb25nIG9sZDIsIGxvbmcgYWN0aXZlMikKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMCwgb2xkMCwgb2xkMSwgb2xkMik7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLSAgICAgIHJldHVybiAyOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDQ2OgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgOTEpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgaWYgKChhY3RpdmUxICYgMHg4MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTI3KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHgxTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTI4KTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHg0TCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHg4TCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTMxKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUyICYgMHgxMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDIsIDEzMik7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMiAmIDB4MjBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0b3BBdFBvcygyLCAxMzMpOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTIgJiAweDQwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMiwgMTM0KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA2MjoKLSAgICAgICAgIGlmICgoYWN0aXZlMSAmIDB4NDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgIHsKLSAgICAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSAxMTg7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAyOwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAweDJMKTsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDQwMDAwMDAwMDAwMDEwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5ODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTAwMDEwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4NDEwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDQ2LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MzAzMDgwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDAwMDIwMDExMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4ODAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDEwMDAwMDAwMDFhMDYwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4MTQwMjA4MDAwMDAwMDAwTCwgYWN0aXZlMSwgMHgxTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMjIsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDQ3LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDIwMDAwNDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTNfMChhY3RpdmUwLCAweDgwMDAwMjAwNDA0MDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDIsIDI1LCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4NDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoMiwgMzgsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhM18wKGFjdGl2ZTAsIDB4Njg0MDAyMDAwMDgwODAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAoYWN0aXZlMCwgMHgyMDA4MDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExOToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCAzMiwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgyLCA0NCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEzXzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxLCBsb25nIG9sZDIsIGxvbmcgYWN0aXZlMikKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkgfCAoYWN0aXZlMSAmPSBvbGQxKSB8IChhY3RpdmUyICY9IG9sZDIpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoMSwgb2xkMCwgb2xkMSwgb2xkMik7IAotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgyLCBhY3RpdmUwLCBhY3RpdmUxLCBhY3RpdmUyKTsKLSAgICAgIHJldHVybiAzOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDYxOgotICAgICAgICAgaWYgKChhY3RpdmUyICYgMHgyTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdG9wQXRQb3MoMywgMTI5KTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSA5NzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDIwODIwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDk5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAxODAwODAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0OCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4NDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxMCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAxOCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA0MywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgyMDAyMDgwODAwOTAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDUwLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHg0MDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDQwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCAzMywgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDIwMDEwMTAwMDAwMDBMLCBhY3RpdmUxLCAwTCwgYWN0aXZlMiwgMEwpOwotICAgICAgY2FzZSAxMDk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCgzLCA1MywgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExMDoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDU1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDIwNDAwNDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDFMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDMsIDQxLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChhY3RpdmUwLCAweDEwMzAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODA4MDEwMDIwMDA0MDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGNhc2UgMTE3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE0XzAoYWN0aXZlMCwgMHgxMDAwMjAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMLCBhY3RpdmUyLCAwTCk7Ci0gICAgICBjYXNlIDExODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNF8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwTCwgYWN0aXZlMSwgMEwsIGFjdGl2ZTIsIDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDIsIGFjdGl2ZTAsIGFjdGl2ZTEsIGFjdGl2ZTIpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTRfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEsIGxvbmcgb2xkMiwgbG9uZyBhY3RpdmUyKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpIHwgKGFjdGl2ZTIgJj0gb2xkMikpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgyLCBvbGQwLCBvbGQxLCBvbGQyKTsgCi0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDMsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIHJldHVybiA0OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHhjMjAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDk5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDIwLCAzMCk7Ci0gICAgICAgICBlbHNlIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgNDksIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4OTAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgMTEsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgxMDAwMDA0MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDc6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNCwgOSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MjAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDIwMDAwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTE0OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAzOSwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyNDgwMDIwMDAwMDAwMDBMLCBhY3RpdmUxLCAweDFMKTsKLSAgICAgIGNhc2UgMTE1OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHgxMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg0LCAxMiwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHg0MDAwMDAwMDgwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDQsIDEzLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChhY3RpdmUwLCAweDgwMDAwMDAwMDE4MTAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4MTAwMDgwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDExODoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNV8wKGFjdGl2ZTAsIDB4NDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICB7Ci0gICAgICAgICAgICBqam1hdGNoZWRLaW5kID0gNDI7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSA0OwotICAgICAgICAgfQotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE1XzAoYWN0aXZlMCwgMHgyMDAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoMywgYWN0aXZlMCwgYWN0aXZlMSwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYTVfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCwgbG9uZyBvbGQxLCBsb25nIGFjdGl2ZTEpCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApIHwgKGFjdGl2ZTEgJj0gb2xkMSkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCgzLCBvbGQwLCBvbGQxLCAwTCk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDQsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIHJldHVybiA1OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk3OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgMzYsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDgwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCAxNiwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNTgsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNDUsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MjAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDM6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDAwNDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA0MCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEwNToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4YzAwMDAwMDAwMTgwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAoYWN0aXZlMCwgMHgyMDgwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDEwOToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhNl8wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDM3LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDIwMDA0MDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDAwMDAwTCwgYWN0aXZlMSwgMEwpOwotICAgICAgY2FzZSAxMTQ6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMDBMLCBhY3RpdmUxLCAwTCk7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MjAwMDAwMDAwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNSwgNjEsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg1LCA1NCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTEgJiAweDFMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDUsIDY0LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTZfMChhY3RpdmUwLCAweDgwMDAwMDAwMEwsIGFjdGl2ZTEsIDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDQsIGFjdGl2ZTAsIGFjdGl2ZTEsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE2XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTAsIGxvbmcgb2xkMSwgbG9uZyBhY3RpdmUxKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSB8IChhY3RpdmUxICY9IG9sZDEpKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNCwgb2xkMCwgb2xkMSwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg1LCBhY3RpdmUwLCAwTCwgMEwpOwotICAgICAgcmV0dXJuIDY7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgOTc6Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDIwMDAwMDA4MDAwMDAwMEwpOwotICAgICAgY2FzZSA5OToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAyMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMDE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAyOCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDQwMDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMzQsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDYsIDM1LCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTdfMChhY3RpdmUwLCAweDQxMTAwMDAwMDAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTA4OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAoYWN0aXZlMCwgMHg4MDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4MTAwMDAwMDAwMTgwMDAwMEwpOwotICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg2LCAxOSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNjoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4ODAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMTUsIDMwKTsKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4ODAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNzoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhN18wKGFjdGl2ZTAsIDB4NDAwMEwpOwotICAgICAgY2FzZSAxMjE6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNiwgMjEsIDMwKTsKLSAgICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLSAgIHJldHVybiBqalN0YXJ0TmZhXzAoNSwgYWN0aXZlMCwgMEwsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE3XzAobG9uZyBvbGQwLCBsb25nIGFjdGl2ZTApCi17Ci0gICBpZiAoKChhY3RpdmUwICY9IG9sZDApKSA9PSAwTCkKLSAgICAgIHJldHVybiBqalN0YXJ0TmZhXzAoNSwgb2xkMCwgMEwsIDBMKTsKLSAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBqalN0b3BTdHJpbmdMaXRlcmFsRGZhXzAoNiwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiA3OwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDk5OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHgyMDAwMDAwODAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAxNCwgMzApOwotICAgICAgICAgZWxzZSBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDYzLCAzMCk7Ci0gICAgICAgICByZXR1cm4gampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChhY3RpdmUwLCAweDgwMDAwMDAyMDAwMDAwMEwpOwotICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDgwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoNywgMjMsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgxMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCAyNCwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE4XzAoYWN0aXZlMCwgMHg1MTAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExNDoKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDcsIDUyLCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg3LCA1MSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBhY3RpdmUwLCAwTCwgMEwpOwotfQotcHJpdmF0ZSBmaW5hbCBpbnQgampNb3ZlU3RyaW5nTGl0ZXJhbERmYThfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg2LCBvbGQwLCAwTCwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg3LCBhY3RpdmUwLCAwTCwgMEwpOwotICAgICAgcmV0dXJuIDg7Ci0gICB9Ci0gICBzd2l0Y2goY3VyQ2hhcikKLSAgIHsKLSAgICAgIGNhc2UgMTAwOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDU5LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTAxOgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg4MDAwMDAwMEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RhcnROZmFXaXRoU3RhdGVzXzAoOCwgMzEsIDMwKTsKLSAgICAgICAgIGVsc2UgaWYgKChhY3RpdmUwICYgMHgyMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDgsIDU3LCAzMCk7Ci0gICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgMTA1OgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDAwTCk7Ci0gICAgICBjYXNlIDExMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGFjdGl2ZTAsIDB4MjAwMDAwMDBMKTsKLSAgICAgIGNhc2UgMTE2OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MDAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg4LCA2MiwgMzApOwotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmE5XzAoYWN0aXZlMCwgMHgxMDAwMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDcsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhOV8wKGxvbmcgb2xkMCwgbG9uZyBhY3RpdmUwKQotewotICAgaWYgKCgoYWN0aXZlMCAmPSBvbGQwKSkgPT0gMEwpCi0gICAgICByZXR1cm4gampTdGFydE5mYV8wKDcsIG9sZDAsIDBMLCAwTCk7Ci0gICB0cnkgeyBjdXJDaGFyID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7IH0KLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkgewotICAgICAgampTdG9wU3RyaW5nTGl0ZXJhbERmYV8wKDgsIGFjdGl2ZTAsIDBMLCAwTCk7Ci0gICAgICByZXR1cm4gOTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDI6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDIwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg5LCAyOSwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDExNToKLSAgICAgICAgIGlmICgoYWN0aXZlMCAmIDB4MTAwMDAwMDAwMDAwMDAwTCkgIT0gMEwpCi0gICAgICAgICAgICByZXR1cm4gampTdGFydE5mYVdpdGhTdGF0ZXNfMCg5LCA1NiwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIDEyMjoKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDgsIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTBfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg4LCBvbGQwLCAwTCwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCg5LCBhY3RpdmUwLCAwTCwgMEwpOwotICAgICAgcmV0dXJuIDEwOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDEwMToKLSAgICAgICAgIHJldHVybiBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChhY3RpdmUwLCAweDEwMDAwMDAwMDAwMDAwMDBMKTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICAgYnJlYWs7Ci0gICB9Ci0gICByZXR1cm4gampTdGFydE5mYV8wKDksIGFjdGl2ZTAsIDBMLCAwTCk7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMTFfMChsb25nIG9sZDAsIGxvbmcgYWN0aXZlMCkKLXsKLSAgIGlmICgoKGFjdGl2ZTAgJj0gb2xkMCkpID09IDBMKQotICAgICAgcmV0dXJuIGpqU3RhcnROZmFfMCg5LCBvbGQwLCAwTCwgMEwpOwotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIGpqU3RvcFN0cmluZ0xpdGVyYWxEZmFfMCgxMCwgYWN0aXZlMCwgMEwsIDBMKTsKLSAgICAgIHJldHVybiAxMTsKLSAgIH0KLSAgIHN3aXRjaChjdXJDaGFyKQotICAgewotICAgICAgY2FzZSAxMDA6Ci0gICAgICAgICBpZiAoKGFjdGl2ZTAgJiAweDEwMDAwMDAwMDAwMDAwMDBMKSAhPSAwTCkKLSAgICAgICAgICAgIHJldHVybiBqalN0YXJ0TmZhV2l0aFN0YXRlc18wKDExLCA2MCwgMzApOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIGJyZWFrOwotICAgfQotICAgcmV0dXJuIGpqU3RhcnROZmFfMCgxMCwgYWN0aXZlMCwgMEwsIDBMKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZChpbnQgc3RhdGUpCi17Ci0gICBpZiAoampyb3VuZHNbc3RhdGVdICE9IGpqcm91bmQpCi0gICB7Ci0gICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSBzdGF0ZTsKLSAgICAgIGpqcm91bmRzW3N0YXRlXSA9IGpqcm91bmQ7Ci0gICB9Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampBZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gampuZXh0U3RhdGVzW3N0YXJ0XTsKLSAgIH0gd2hpbGUgKHN0YXJ0KysgIT0gZW5kKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBqakNoZWNrTkFkZFR3b1N0YXRlcyhpbnQgc3RhdGUxLCBpbnQgc3RhdGUyKQotewotICAgampDaGVja05BZGQoc3RhdGUxKTsKLSAgIGpqQ2hlY2tOQWRkKHN0YXRlMik7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0LCBpbnQgZW5kKQotewotICAgZG8gewotICAgICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0gICB9IHdoaWxlIChzdGFydCsrICE9IGVuZCk7Ci19Ci1wcml2YXRlIGZpbmFsIHZvaWQgampDaGVja05BZGRTdGF0ZXMoaW50IHN0YXJ0KQotewotICAgampDaGVja05BZGQoampuZXh0U3RhdGVzW3N0YXJ0XSk7Ci0gICBqakNoZWNrTkFkZChqam5leHRTdGF0ZXNbc3RhcnQgKyAxXSk7Ci19Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqYml0VmVjMCA9IHsKLSAgIDB4MEwsIDB4MEwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwsIDB4ZmZmZmZmZmZmZmZmZmZmZkwKLX07Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVOZmFfMChpbnQgc3RhcnRTdGF0ZSwgaW50IGN1clBvcykKLXsKLSAgIGludFtdIG5leHRTdGF0ZXM7Ci0gICBpbnQgc3RhcnRzQXQgPSAwOwotICAgampuZXdTdGF0ZUNudCA9IDEyNDsKLSAgIGludCBpID0gMTsKLSAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOwotICAgaW50IGosIGtpbmQgPSAweDdmZmZmZmZmOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKLSAgICAgICAgIFJlSW5pdFJvdW5kcygpOwotICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSAyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCAzKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgweDEwMDAwMDIwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gMikKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSAyOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiAxKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDE7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgwKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gMzQpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNCwgMTIpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzOSkKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygxMywgMTgpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoY3VyQ2hhciA9PSAzNikKLSAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzgpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNzg7Ci0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgzMCk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ3KQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTksIDIwKTsKLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGN1ckNoYXIgPT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1KTsKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmUwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY1KQotICAgICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY1OwotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMyk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBlbHNlIGlmIChjdXJDaGFyID09IDQ4KQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NykKLSAgICAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NzsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDQzLCA0NSk7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZGZmZjdiZmZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyNDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDEpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMTsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTAwMDAwMjAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gMjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY1KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ2KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcyg1LCA2KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ3KQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMTksIDIwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmN2ZmZmZmZmZkYmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjEsIDIzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDQ3KQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjEsIDIzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxNDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDQ3KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc3KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc3OwotICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoMjQsIDI3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyOToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDM2KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDc4KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDc4OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMTAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygwLCAzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzMiwgMzMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDMzOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgIT0gNDYpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzNCwgMzUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDM0LCAzNSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMzY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjgwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM3OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFR3b1N0YXRlcygzOCwgMzkpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDQwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI4MDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjgpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjg7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSA0OCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NzsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkVHdvU3RhdGVzKDQzLCA0NSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDY2KQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDY2OwotICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNDQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNjcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNjc7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0NSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciAhPSAzOSkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEzLCAxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmN2ZmZmZmZGJmZkwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAzOSAmJiBraW5kID4gNzApCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzMSwgMzQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDUyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1MzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNTQ7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg1Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTY6Ci0gICAgICAgICAgICAgICBjYXNlIDYxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDU3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDYxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZjdmZmZmZmRiZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDI0MDBMICYgbCkgIT0gMEwgJiYga2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzgsIDQxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2NzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDY5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDY5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoNjcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcxOgotICAgICAgICAgICAgICAgY2FzZSA3NjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg3Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3NDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3NzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyICE9IDM0KQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNCwgMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZiZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDgxOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMzQgJiYga2luZCA+IDcwKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcwOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDgyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDUsIDQ4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4MzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDg1OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoODMpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg4OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgODg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmYmZmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5NToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyNDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5NjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5NzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEzKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTY7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ODQwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1MiwgNTUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTAxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTAyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTAwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMDUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgzZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSAxMDg7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwOTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmJmZmZmZGJmZkwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTEyOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDg0MDAwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU5LCA2Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmMDAwMDAwMDAwMDAwTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExNjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmYwMDAwMDAwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxMTQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExODoKLSAgICAgICAgICAgICAgIGNhc2UgMTIzOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDExOSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTE5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTIxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDNmZjAwMDAwMDAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEyMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4M2ZmMDAwMDAwMDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIzOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyQ2hhciA8IDEyOCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICBjYXNlIDMwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdmZmZmZmU4N2ZmZmZmZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3OCkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3ODsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDoKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIwMDAwMDAwMjBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg2MywgNjQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExOgotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjEsIDIzKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE1OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDIyODAwMDAwMDAwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg2NSwgNjgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE3OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTAzICYmIGtpbmQgPiA3NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3NzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOSAmJiBraW5kID4gNzcpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzc7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxOCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjA6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDkpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg2OSwgNzIpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDIyOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTA1ICYmIGtpbmQgPiA3NykKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3NzsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDIyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwNSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDE4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAyNToKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEwOSkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDczLCA3Nik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjY6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDUpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgxNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjc6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMDMpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCgyMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMjg6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDEyKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzNToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNzcsIDc4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAzOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgyMDAwMDAwMDIwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoNzksIDgwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0MzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxMDAwMDAwMDEwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA2NikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA2NjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0NzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0ODoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoODEsIDg1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA0OToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHgxNDQwNDQzODAwMDAwMEwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDI4LCAzMCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNTU6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMjApCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA1NjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1NjoKLSAgICAgICAgICAgICAgIGNhc2UgNjE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkKDU3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1NzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMjgsIDMwKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA1ODoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDExNykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDU5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDU5OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA2MDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA2MDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNjE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4ZmZmZmZmZmZlZmZmZmZmZkwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDg2LCA5MCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNjQ6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MzgwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcygzNSwgMzcpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDcwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTIwKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzE7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzE6Ci0gICAgICAgICAgICAgICBjYXNlIDc2OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZCg3Mik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDM1LCAzNyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMTcpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA3NDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3NDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gNzU7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNzU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDc2OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZWZmZmZmZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDc5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gOTIpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcyg5MSwgOTUpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDgwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDE0NDA0NDM4MDAwMDAwTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDIsIDQ0KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA4NjoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDg3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg3OgotICAgICAgICAgICAgICAgY2FzZSA5MjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoODgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg4OgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0MiwgNDQpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDg5OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gOTA7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDkxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDkxOgotICAgICAgICAgICAgICAgICAgaWYgKCgweDdlMDAwMDAwN2VMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqanN0YXRlU2V0W2pqbmV3U3RhdGVDbnQrK10gPSA5MjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5MzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNDksIDUxKTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA5NDoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDkyKQotICAgICAgICAgICAgICAgICAgICAgampBZGRTdGF0ZXMoOTYsIDEwMik7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTg6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MzgwMDAwMDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwMzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDEwNDsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDQ6Ci0gICAgICAgICAgICAgICBjYXNlIDEwOToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTA1KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMDU6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQ5LCA1MSk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTA2OgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA3OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwNzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA4OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEwODoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTA5OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHhmZmZmZmZmZmVmZmZmZmZmTCAmIGwpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoNTYsIDU4KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTE6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSA5MikKLSAgICAgICAgICAgICAgICAgICAgIGpqQWRkU3RhdGVzKDEwMywgMTA3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTI6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MTQ0MDQ0MzgwMDAwMDBMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNzIpCi0gICAgICAgICAgICAgICAgICAgICBraW5kID0gNzI7Ci0gICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg1NiwgNTgpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExNzoKLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEyMCkKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDExODsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTg6Ci0gICAgICAgICAgICAgICBjYXNlIDEyMzoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampDaGVja05BZGQoMTE5KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAxMTk6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4N2UwMDAwMDA3ZUwgJiBsKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgMTIwOgotICAgICAgICAgICAgICAgICAgaWYgKGN1ckNoYXIgPT0gMTE3KQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIxOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMToKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIyOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDEyMjoKLSAgICAgICAgICAgICAgICAgIGlmICgoMHg3ZTAwMDAwMDdlTCAmIGwpICE9IDBMKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMTIzOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OwotICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICAgY2FzZSAxMToKLSAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDIxLCAyMyk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgNDc6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakFkZFN0YXRlcygyOCwgMzApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDYyOgotICAgICAgICAgICAgICAgICAgaWYgKChqamJpdFZlYzBbaTJdICYgbDIpID09IDBMKQotICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDcyKQotICAgICAgICAgICAgICAgICAgICAga2luZCA9IDcyOwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMzUsIDM3KTsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSA3ODoKLSAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSAhPSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDQyLCA0NCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGNhc2UgOTM6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgIT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBqakNoZWNrTkFkZFN0YXRlcyg0OSwgNTEpOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDExMDoKLSAgICAgICAgICAgICAgICAgIGlmICgoampiaXRWZWMwW2kyXSAmIGwyKSA9PSAwTCkKLSAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgaWYgKGtpbmQgPiA3MikKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA3MjsKLSAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDU2LCA1OCk7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZCAhPSAweDdmZmZmZmZmKQotICAgICAgewotICAgICAgICAgamptYXRjaGVkS2luZCA9IGtpbmQ7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSBjdXJQb3M7Ci0gICAgICAgICBraW5kID0gMHg3ZmZmZmZmZjsKLSAgICAgIH0KLSAgICAgICsrY3VyUG9zOwotICAgICAgaWYgKChpID0gampuZXdTdGF0ZUNudCkgPT0gKHN0YXJ0c0F0ID0gMTI0IC0gKGpqbmV3U3RhdGVDbnQgPSBzdGFydHNBdCkpKQotICAgICAgICAgcmV0dXJuIGN1clBvczsKLSAgICAgIHRyeSB7IGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsgfQotICAgICAgY2F0Y2goamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7IHJldHVybiBjdXJQb3M7IH0KLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmEwXzIoKQotewotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDQyOgotICAgICAgICAgcmV0dXJuIGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzIoMHg0MEwpOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICByZXR1cm4gMTsKLSAgIH0KLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZVN0cmluZ0xpdGVyYWxEZmExXzIobG9uZyBhY3RpdmUwKQotewotICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiAxOwotICAgfQotICAgc3dpdGNoKGN1ckNoYXIpCi0gICB7Ci0gICAgICBjYXNlIDQ3OgotICAgICAgICAgaWYgKChhY3RpdmUwICYgMHg0MEwpICE9IDBMKQotICAgICAgICAgICAgcmV0dXJuIGpqU3RvcEF0UG9zKDEsIDYpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgIHJldHVybiAyOwotICAgfQotICAgcmV0dXJuIDI7Ci19Ci1wcml2YXRlIGZpbmFsIGludCBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8xKCkKLXsKLSAgIHJldHVybiBqak1vdmVOZmFfMSg0LCAwKTsKLX0KLXByaXZhdGUgZmluYWwgaW50IGpqTW92ZU5mYV8xKGludCBzdGFydFN0YXRlLCBpbnQgY3VyUG9zKQotewotICAgaW50W10gbmV4dFN0YXRlczsKLSAgIGludCBzdGFydHNBdCA9IDA7Ci0gICBqam5ld1N0YXRlQ250ID0gNDsKLSAgIGludCBpID0gMTsKLSAgIGpqc3RhdGVTZXRbMF0gPSBzdGFydFN0YXRlOwotICAgaW50IGosIGtpbmQgPSAweDdmZmZmZmZmOwotICAgZm9yICg7OykKLSAgIHsKLSAgICAgIGlmICgrK2pqcm91bmQgPT0gMHg3ZmZmZmZmZikKLSAgICAgICAgIFJlSW5pdFJvdW5kcygpOwotICAgICAgaWYgKGN1ckNoYXIgPCA2NCkKLSAgICAgIHsKLSAgICAgICAgIGxvbmcgbCA9IDFMIDw8IGN1ckNoYXI7Ci0gICAgICAgICBNYXRjaExvb3A6IGRvCi0gICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2goampzdGF0ZVNldFstLWldKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgY2FzZSA0OgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgICAgIGpqQ2hlY2tOQWRkU3RhdGVzKDEwOCwgMTEwKTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCgweDI0MDBMICYgbCkgIT0gMEwpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICBpZiAoa2luZCA+IDUpCi0gICAgICAgICAgICAgICAgICAgICAgICBraW5kID0gNTsKLSAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgIGlmIChjdXJDaGFyID09IDEzKQotICAgICAgICAgICAgICAgICAgICAgampzdGF0ZVNldFtqam5ld1N0YXRlQ250KytdID0gMjsKLSAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgY2FzZSAwOgotICAgICAgICAgICAgICAgICAgaWYgKCgweGZmZmZmZmZmZmZmZmRiZmZMICYgbCkgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTA4LCAxMTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDE6Ci0gICAgICAgICAgICAgICAgICBpZiAoKDB4MjQwMEwgJiBsKSAhPSAwTCAmJiBraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDI6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMCAmJiBraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBjYXNlIDM6Ci0gICAgICAgICAgICAgICAgICBpZiAoY3VyQ2hhciA9PSAxMykKLSAgICAgICAgICAgICAgICAgICAgIGpqc3RhdGVTZXRbampuZXdTdGF0ZUNudCsrXSA9IDI7Ci0gICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgIGRlZmF1bHQgOiBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgIH0gd2hpbGUoaSAhPSBzdGFydHNBdCk7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmIChjdXJDaGFyIDwgMTI4KQotICAgICAgewotICAgICAgICAgbG9uZyBsID0gMUwgPDwgKGN1ckNoYXIgJiAwNzcpOwotICAgICAgICAgTWF0Y2hMb29wOiBkbwotICAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoKGpqc3RhdGVTZXRbLS1pXSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgIGNhc2UgNDoKLSAgICAgICAgICAgICAgIGNhc2UgMDoKLSAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTA4LCAxMTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICAgaW50IGkyID0gKGN1ckNoYXIgJiAweGZmKSA+PiA2OwotICAgICAgICAgbG9uZyBsMiA9IDFMIDw8IChjdXJDaGFyICYgMDc3KTsKLSAgICAgICAgIE1hdGNoTG9vcDogZG8KLSAgICAgICAgIHsKLSAgICAgICAgICAgIHN3aXRjaChqanN0YXRlU2V0Wy0taV0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBjYXNlIDQ6Ci0gICAgICAgICAgICAgICBjYXNlIDA6Ci0gICAgICAgICAgICAgICAgICBpZiAoKGpqYml0VmVjMFtpMl0gJiBsMikgPT0gMEwpCi0gICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgIGlmIChraW5kID4gNSkKLSAgICAgICAgICAgICAgICAgICAgIGtpbmQgPSA1OwotICAgICAgICAgICAgICAgICAgampDaGVja05BZGRTdGF0ZXMoMTA4LCAxMTApOwotICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICBkZWZhdWx0IDogYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICB9IHdoaWxlKGkgIT0gc3RhcnRzQXQpOwotICAgICAgfQotICAgICAgaWYgKGtpbmQgIT0gMHg3ZmZmZmZmZikKLSAgICAgIHsKLSAgICAgICAgIGpqbWF0Y2hlZEtpbmQgPSBraW5kOwotICAgICAgICAgamptYXRjaGVkUG9zID0gY3VyUG9zOwotICAgICAgICAga2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICB9Ci0gICAgICArK2N1clBvczsKLSAgICAgIGlmICgoaSA9IGpqbmV3U3RhdGVDbnQpID09IChzdGFydHNBdCA9IDQgLSAoampuZXdTdGF0ZUNudCA9IHN0YXJ0c0F0KSkpCi0gICAgICAgICByZXR1cm4gY3VyUG9zOwotICAgICAgdHJ5IHsgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyB9Ci0gICAgICBjYXRjaChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsgcmV0dXJuIGN1clBvczsgfQotICAgfQotfQotc3RhdGljIGZpbmFsIGludFtdIGpqbmV4dFN0YXRlcyA9IHsKLSAgIDMyLCAzMywgMzgsIDM5LCA3OCwgNzksIDgxLCA5MywgODEsIDExMCwgMTExLCA2NSwgOTQsIDQ3LCA0OCwgNTAsIAotICAgNjIsIDYzLCA2NSwgMTAsIDI4LCAxMSwgMTMsIDE0LCAxNSwgMTYsIDIxLCAyNSwgNDcsIDQ4LCA1MCwgNDcsIAotICAgNDgsIDUyLCA1MCwgNjIsIDYzLCA2NSwgNjIsIDYzLCA2NywgNjUsIDc4LCA3OSwgODEsIDc4LCA3OSwgODMsIAotICAgODEsIDkzLCA4MSwgOTQsIDkzLCAxMDAsIDgxLCA5NCwgMTEwLCAxMTEsIDY1LCAxMTAsIDExMSwgMTE0LCA2NSwgNywgCi0gICA4LCAxNywgMTgsIDE5LCAyMCwgMjIsIDE4LCAyMywgMjQsIDIyLCAxNywgMjYsIDI3LCAzNiwgMzcsIDQwLCAKLSAgIDQxLCA0OSwgNTEsIDUzLCA1NSwgNTgsIDY0LCA2NiwgNjgsIDcwLCA3MywgODAsIDgyLCA4NCwgODYsIDg5LCAKLSAgIDk1LCA5NywgOTgsIDk5LCAxMDEsIDEwMywgMTA2LCAxMTIsIDExMywgMTE1LCAxMTcsIDEyMCwgMCwgMSwgMywgCi19OwotcHVibGljIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSBqanN0ckxpdGVyYWxJbWFnZXMgPSB7Ci0iIiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgIlwxNDFcMTYzIiwgCi0iXDE0MlwxNjJcMTQ1XDE0MVwxNTMiLCAiXDE0M1wxNDFcMTYzXDE0NSIsICJcMTQzXDE0MVwxNjRcMTQzXDE1MCIsICJcMTQzXDE1NFwxNDFcMTYzXDE2MyIsIAotIlwxNDNcMTU3XDE1NlwxNjNcMTY0IiwgIlwxNDNcMTU3XDE1NlwxNjRcMTUxXDE1NlwxNjVcMTQ1IiwgIlwxNDRcMTQ1XDE0NlwxNDFcMTY1XDE1NFwxNjQiLCAKLSJcMTQ0XDE0NVwxNTRcMTQ1XDE2NFwxNDUiLCAiXDE0NFwxNTciLCAiXDE0NVwxNTRcMTYzXDE0NSIsICJcMTQ1XDE3MFwxNjRcMTQ1XDE1NlwxNDRcMTYzIiwgCi0iXDE0NlwxNDFcMTU0XDE2M1wxNDUiLCAiXDE0NlwxNTFcMTU2XDE0MVwxNTRcMTU0XDE3MSIsICJcMTQ2XDE1N1wxNjIiLCAKLSJcMTQ2XDE2NVwxNTZcMTQzXDE2NFwxNTFcMTU3XDE1NiIsICJcMTA2XDE2NVwxNTZcMTQzXDE2NFwxNTFcMTU3XDE1NiIsICJcMTQ3XDE0NVwxNjQiLCAiXDE1MVwxNDYiLCAiXDE1MVwxNTYiLCAKLSJcMTUxXDE1NlwxNDNcMTU0XDE2NVwxNDRcMTQ1IiwgIlwxNTFcMTU2XDE2M1wxNjRcMTQxXDE1NlwxNDNcMTQ1XDE1N1wxNDYiLCAiXDE1MVwxNjMiLCAKLSJcMTU2XDE0MVwxNTVcMTQ1XDE2M1wxNjBcMTQxXDE0M1wxNDUiLCAiXDE1NlwxNDVcMTY3IiwgIlwxNTZcMTY1XDE1NFwxNTQiLCAiXDE2MFwxNDFcMTQzXDE1M1wxNDFcMTQ3XDE0NSIsIAotIlwxNjBcMTYyXDE1MVwxNjZcMTQxXDE2NFwxNDUiLCAiXDE2MFwxNjVcMTQyXDE1NFwxNTFcMTQzIiwgIlwxNjJcMTQ1XDE2NFwxNjVcMTYyXDE1NiIsICJcMTYzXDE0NVwxNjQiLCAKLSJcMTYzXDE2NVwxNjBcMTQ1XDE2MiIsICJcMTYzXDE2N1wxNTFcMTY0XDE0M1wxNTAiLCAiXDE2NFwxNTBcMTUxXDE2MyIsICJcMTY0XDE1MFwxNjJcMTU3XDE2NyIsIAotIlwxNjRcMTYyXDE2NVwxNDUiLCAiXDE2NFwxNjJcMTcxIiwgIlwxNjRcMTcxXDE2MFwxNDVcMTU3XDE0NiIsICJcMTY1XDE2M1wxNDUiLCAiXDE2NlwxNDFcMTYyIiwgCi0iXDE2NlwxNTdcMTUxXDE0NCIsICJcMTY3XDE1MFwxNTFcMTU0XDE0NSIsICJcMTY3XDE1MVwxNjRcMTUwIiwgCi0iXDE0MVwxNDJcMTYzXDE2NFwxNjJcMTQxXDE0M1wxNjQiLCAiXDE0NFwxNDVcMTQyXDE2NVwxNDdcMTQ3XDE0NVwxNjIiLCAiXDE0NVwxNTZcMTY1XDE1NSIsIAotIlwxNDVcMTcwXDE2MFwxNTdcMTYyXDE2NCIsICJcMTQ3XDE1N1wxNjRcMTU3IiwgIlwxNTFcMTU1XDE2MFwxNTRcMTQ1XDE1NVwxNDVcMTU2XDE2NFwxNjMiLCAKLSJcMTUxXDE1NlwxNjRcMTQ1XDE2MlwxNDZcMTQxXDE0M1wxNDUiLCAiXDE1NlwxNDFcMTY0XDE1MVwxNjZcMTQ1IiwgIlwxNjBcMTYyXDE1N1wxNjRcMTQ1XDE0M1wxNjRcMTQ1XDE0NCIsIAotIlwxNjNcMTcxXDE1NlwxNDNcMTUwXDE2MlwxNTdcMTU2XDE1MVwxNzJcMTQ1XDE0NCIsICJcMTY0XDE1MFwxNjJcMTU3XDE2N1wxNjMiLCAiXDE2NFwxNjJcMTQxXDE1NlwxNjNcMTUxXDE0NVwxNTZcMTY0IiwgCi0iXDE2NlwxNTdcMTU0XDE0MVwxNjRcMTUxXDE1NFwxNDUiLCAiXDE1MVwxNTVcMTYwXDE1N1wxNjJcMTY0IiwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCwgCi1udWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCAiXDUwIiwgIlw1MSIsICJcMTczIiwgIlwxNzUiLCAKLSJcMTMzIiwgIlwxMzUiLCAiXDczIiwgIlw1NCIsICJcNTYiLCAiXDcyXDcyIiwgIlw1Nlw1Nlw1NiIsICJcNzUiLCAiXDc2IiwgIlw3NCIsIAotIlw0MSIsICJcMTc2IiwgIlw3NyIsICJcNzIiLCAiXDc1XDc1IiwgIlw3NFw3NSIsICJcNzZcNzUiLCAiXDQxXDc1IiwgIlwxNzRcMTc0IiwgCi0iXDQ2XDQ2IiwgIlwxMzZcMTM2IiwgIlw1M1w1MyIsICJcNTVcNTUiLCAiXDUzIiwgIlw1NSIsICJcNTIiLCAiXDU3IiwgIlw0NiIsICJcMTc0IiwgCi0iXDEzNiIsICJcNDUiLCAiXDc0XDc0IiwgIlw3Nlw3NiIsICJcNzZcNzZcNzYiLCAiXDUzXDc1IiwgIlw1NVw3NSIsICJcNTJcNzUiLCAKLSJcNTdcNzUiLCAiXDQ2XDc1IiwgIlwxNzRcNzUiLCAiXDEzNlw3NSIsICJcNDVcNzUiLCAiXDc0XDc0XDc1IiwgIlw3Nlw3Nlw3NSIsIAotIlw3Nlw3Nlw3Nlw3NSIsICJcMTc0XDE3NFw3NSIsICJcNDZcNDZcNzUiLCAiXDEzNlwxMzZcNzUiLCAiXDc1XDc1XDc1IiwgIlw0MVw3NVw3NSIsIH07Ci1wdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZ1tdIGxleFN0YXRlTmFtZXMgPSB7Ci0gICAiREVGQVVMVCIsIAotICAgIklOX1NJTkdMRV9MSU5FX0NPTU1FTlQiLCAKLSAgICJJTl9NVUxUSV9MSU5FX0NPTU1FTlQiLCAKLX07Ci1wdWJsaWMgc3RhdGljIGZpbmFsIGludFtdIGpqbmV3TGV4U3RhdGUgPSB7Ci0gICAtMSwgLTEsIC0xLCAxLCAyLCAwLCAwLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLSAgIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAtMSwgLTEsIC0xLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ub2tlbiA9IHsKLSAgIDB4ZmZmZmZmZmZmZmZmZmYwMUwsIDB4ZmZmZmZmZmZmZmZlNjE1ZkwsIDB4N2ZMLCAKLX07Ci1zdGF0aWMgZmluYWwgbG9uZ1tdIGpqdG9Ta2lwID0gewotICAgMHg2NkwsIDB4MEwsIDB4MEwsIAotfTsKLXN0YXRpYyBmaW5hbCBsb25nW10gamp0b1NwZWNpYWwgPSB7Ci0gICAweDY2TCwgMHgwTCwgMHgwTCwgCi19Owotc3RhdGljIGZpbmFsIGxvbmdbXSBqanRvTW9yZSA9IHsKLSAgIDB4OThMLCAweDBMLCAweDBMLCAKLX07Ci1wcm90ZWN0ZWQgU2ltcGxlQ2hhclN0cmVhbSBpbnB1dF9zdHJlYW07Ci1wcml2YXRlIGZpbmFsIGludFtdIGpqcm91bmRzID0gbmV3IGludFsxMjRdOwotcHJpdmF0ZSBmaW5hbCBpbnRbXSBqanN0YXRlU2V0ID0gbmV3IGludFsyNDhdOwotU3RyaW5nQnVmZmVyIGltYWdlOwotaW50IGpqaW1hZ2VMZW47Ci1pbnQgbGVuZ3RoT2ZNYXRjaDsKLXByb3RlY3RlZCBjaGFyIGN1ckNoYXI7Ci1wdWJsaWMgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSl7Ci0gICBpZiAoU2ltcGxlQ2hhclN0cmVhbS5zdGF0aWNGbGFnKQotICAgICAgdGhyb3cgbmV3IEVycm9yKCJFUlJPUjogQ2Fubm90IHVzZSBhIHN0YXRpYyBDaGFyU3RyZWFtIGNsYXNzIHdpdGggYSBub24tc3RhdGljIGxleGljYWwgYW5hbHl6ZXIuIik7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci19Ci1wdWJsaWMgSlNQYXJzZXIyMFRva2VuTWFuYWdlcihTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSwgaW50IGxleFN0YXRlKXsKLSAgIHRoaXMoc3RyZWFtKTsKLSAgIFN3aXRjaFRvKGxleFN0YXRlKTsKLX0KLXB1YmxpYyB2b2lkIFJlSW5pdChTaW1wbGVDaGFyU3RyZWFtIHN0cmVhbSkKLXsKLSAgIGpqbWF0Y2hlZFBvcyA9IGpqbmV3U3RhdGVDbnQgPSAwOwotICAgY3VyTGV4U3RhdGUgPSBkZWZhdWx0TGV4U3RhdGU7Ci0gICBpbnB1dF9zdHJlYW0gPSBzdHJlYW07Ci0gICBSZUluaXRSb3VuZHMoKTsKLX0KLXByaXZhdGUgZmluYWwgdm9pZCBSZUluaXRSb3VuZHMoKQotewotICAgaW50IGk7Ci0gICBqanJvdW5kID0gMHg4MDAwMDAwMTsKLSAgIGZvciAoaSA9IDEyNDsgaS0tID4gMDspCi0gICAgICBqanJvdW5kc1tpXSA9IDB4ODAwMDAwMDA7Ci19Ci1wdWJsaWMgdm9pZCBSZUluaXQoU2ltcGxlQ2hhclN0cmVhbSBzdHJlYW0sIGludCBsZXhTdGF0ZSkKLXsKLSAgIFJlSW5pdChzdHJlYW0pOwotICAgU3dpdGNoVG8obGV4U3RhdGUpOwotfQotcHVibGljIHZvaWQgU3dpdGNoVG8oaW50IGxleFN0YXRlKQotewotICAgaWYgKGxleFN0YXRlID49IDMgfHwgbGV4U3RhdGUgPCAwKQotICAgICAgdGhyb3cgbmV3IFRva2VuTWdyRXJyb3IoIkVycm9yOiBJZ25vcmluZyBpbnZhbGlkIGxleGljYWwgc3RhdGUgOiAiICsgbGV4U3RhdGUgKyAiLiBTdGF0ZSB1bmNoYW5nZWQuIiwgVG9rZW5NZ3JFcnJvci5JTlZBTElEX0xFWElDQUxfU1RBVEUpOwotICAgZWxzZQotICAgICAgY3VyTGV4U3RhdGUgPSBsZXhTdGF0ZTsKLX0KLQotcHJvdGVjdGVkIFRva2VuIGpqRmlsbFRva2VuKCkKLXsKLSAgIFRva2VuIHQgPSBUb2tlbi5uZXdUb2tlbihqam1hdGNoZWRLaW5kKTsKLSAgIHQua2luZCA9IGpqbWF0Y2hlZEtpbmQ7Ci0gICBpZiAoamptYXRjaGVkUG9zIDwgMCkKLSAgIHsKLSAgICAgIGlmIChpbWFnZSA9PSBudWxsKQotICAgICAgICAgdC5pbWFnZSA9ICIiOwotICAgICAgZWxzZQotICAgICAgICAgdC5pbWFnZSA9IGltYWdlLnRvU3RyaW5nKCk7Ci0gICAgICB0LmJlZ2luTGluZSA9IHQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkxpbmUoKTsKLSAgICAgIHQuYmVnaW5Db2x1bW4gPSB0LmVuZENvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkNvbHVtbigpOwotICAgfQotICAgZWxzZQotICAgewotICAgICAgU3RyaW5nIGltID0gampzdHJMaXRlcmFsSW1hZ2VzW2pqbWF0Y2hlZEtpbmRdOwotICAgICAgdC5pbWFnZSA9IChpbSA9PSBudWxsKSA/IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpIDogaW07Ci0gICAgICB0LmJlZ2luTGluZSA9IGlucHV0X3N0cmVhbS5nZXRCZWdpbkxpbmUoKTsKLSAgICAgIHQuYmVnaW5Db2x1bW4gPSBpbnB1dF9zdHJlYW0uZ2V0QmVnaW5Db2x1bW4oKTsKLSAgICAgIHQuZW5kTGluZSA9IGlucHV0X3N0cmVhbS5nZXRFbmRMaW5lKCk7Ci0gICAgICB0LmVuZENvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgIH0KLSAgIHJldHVybiB0OwotfQotCi1pbnQgY3VyTGV4U3RhdGUgPSAwOwotaW50IGRlZmF1bHRMZXhTdGF0ZSA9IDA7Ci1pbnQgampuZXdTdGF0ZUNudDsKLWludCBqanJvdW5kOwotaW50IGpqbWF0Y2hlZFBvczsKLWludCBqam1hdGNoZWRLaW5kOwotCi1wdWJsaWMgVG9rZW4gZ2V0TmV4dFRva2VuKCkgCi17Ci0gIGludCBraW5kOwotICBUb2tlbiBzcGVjaWFsVG9rZW4gPSBudWxsOwotICBUb2tlbiBtYXRjaGVkVG9rZW47Ci0gIGludCBjdXJQb3MgPSAwOwotCi0gIEVPRkxvb3AgOgotICBmb3IgKDs7KQotICB7ICAgCi0gICB0cnkgICAKLSAgIHsgICAgIAotICAgICAgY3VyQ2hhciA9IGlucHV0X3N0cmVhbS5CZWdpblRva2VuKCk7Ci0gICB9ICAgICAKLSAgIGNhdGNoKGphdmEuaW8uSU9FeGNlcHRpb24gZSkKLSAgIHsgICAgICAgIAotICAgICAgamptYXRjaGVkS2luZCA9IDA7Ci0gICAgICBtYXRjaGVkVG9rZW4gPSBqakZpbGxUb2tlbigpOwotICAgICAgbWF0Y2hlZFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbjsKLSAgICAgIHJldHVybiBtYXRjaGVkVG9rZW47Ci0gICB9Ci0gICBpbWFnZSA9IG51bGw7Ci0gICBqamltYWdlTGVuID0gMDsKLQotICAgZm9yICg7OykKLSAgIHsKLSAgICAgc3dpdGNoKGN1ckxleFN0YXRlKQotICAgICB7Ci0gICAgICAgY2FzZSAwOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSAwOwotICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMCgpOwotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSAxOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDU7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSAtMTsKLSAgICAgICAgIGN1clBvcyA9IDA7Ci0gICAgICAgICBjdXJQb3MgPSBqak1vdmVTdHJpbmdMaXRlcmFsRGZhMF8xKCk7Ci0gICAgICAgICBpZiAoamptYXRjaGVkUG9zIDwgMCB8fCAoamptYXRjaGVkUG9zID09IDAgJiYgamptYXRjaGVkS2luZCA+IDcpKQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc7Ci0gICAgICAgICAgICBqam1hdGNoZWRQb3MgPSAwOwotICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICAgY2FzZSAyOgotICAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICAgICBqam1hdGNoZWRQb3MgPSAwOwotICAgICAgICAgY3VyUG9zID0gampNb3ZlU3RyaW5nTGl0ZXJhbERmYTBfMigpOwotICAgICAgICAgaWYgKGpqbWF0Y2hlZFBvcyA9PSAwICYmIGpqbWF0Y2hlZEtpbmQgPiA3KQotICAgICAgICAgewotICAgICAgICAgICAgamptYXRjaGVkS2luZCA9IDc7Ci0gICAgICAgICB9Ci0gICAgICAgICBicmVhazsKLSAgICAgfQotICAgICBpZiAoamptYXRjaGVkS2luZCAhPSAweDdmZmZmZmZmKQotICAgICB7Ci0gICAgICAgIGlmIChqam1hdGNoZWRQb3MgKyAxIDwgY3VyUG9zKQotICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGN1clBvcyAtIGpqbWF0Y2hlZFBvcyAtIDEpOwotICAgICAgICBpZiAoKGpqdG9Ub2tlbltqam1hdGNoZWRLaW5kID4+IDZdICYgKDFMIDw8IChqam1hdGNoZWRLaW5kICYgMDc3KSkpICE9IDBMKQotICAgICAgICB7Ci0gICAgICAgICAgIG1hdGNoZWRUb2tlbiA9IGpqRmlsbFRva2VuKCk7Ci0gICAgICAgICAgIG1hdGNoZWRUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgICAgIFRva2VuTGV4aWNhbEFjdGlvbnMobWF0Y2hlZFRva2VuKTsKLSAgICAgICBpZiAoampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXSAhPSAtMSkKLSAgICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKLSAgICAgICAgICAgcmV0dXJuIG1hdGNoZWRUb2tlbjsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmICgoamp0b1NraXBbamptYXRjaGVkS2luZCA+PiA2XSAmICgxTCA8PCAoamptYXRjaGVkS2luZCAmIDA3NykpKSAhPSAwTCkKLSAgICAgICAgewotICAgICAgICAgICBpZiAoKGpqdG9TcGVjaWFsW2pqbWF0Y2hlZEtpbmQgPj4gNl0gJiAoMUwgPDwgKGpqbWF0Y2hlZEtpbmQgJiAwNzcpKSkgIT0gMEwpCi0gICAgICAgICAgIHsKLSAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuID0gampGaWxsVG9rZW4oKTsKLSAgICAgICAgICAgICAgaWYgKHNwZWNpYWxUb2tlbiA9PSBudWxsKQotICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSBtYXRjaGVkVG9rZW47Ci0gICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4gPSAoc3BlY2lhbFRva2VuLm5leHQgPSBtYXRjaGVkVG9rZW4pOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIFNraXBMZXhpY2FsQWN0aW9ucyhtYXRjaGVkVG9rZW4pOwotICAgICAgICAgICB9Ci0gICAgICAgICAgIGVsc2UgCi0gICAgICAgICAgICAgIFNraXBMZXhpY2FsQWN0aW9ucyhudWxsKTsKLSAgICAgICAgIGlmIChqam5ld0xleFN0YXRlW2pqbWF0Y2hlZEtpbmRdICE9IC0xKQotICAgICAgICAgICBjdXJMZXhTdGF0ZSA9IGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF07Ci0gICAgICAgICAgIGNvbnRpbnVlIEVPRkxvb3A7Ci0gICAgICAgIH0KLSAgICAgICAgamppbWFnZUxlbiArPSBqam1hdGNoZWRQb3MgKyAxOwotICAgICAgaWYgKGpqbmV3TGV4U3RhdGVbamptYXRjaGVkS2luZF0gIT0gLTEpCi0gICAgICAgIGN1ckxleFN0YXRlID0gampuZXdMZXhTdGF0ZVtqam1hdGNoZWRLaW5kXTsKLSAgICAgICAgY3VyUG9zID0gMDsKLSAgICAgICAgamptYXRjaGVkS2luZCA9IDB4N2ZmZmZmZmY7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgIGN1ckNoYXIgPSBpbnB1dF9zdHJlYW0ucmVhZENoYXIoKTsKLSAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKGphdmEuaW8uSU9FeGNlcHRpb24gZTEpIHsgfQotICAgICB9Ci0gICAgIGludCBlcnJvcl9saW5lID0gaW5wdXRfc3RyZWFtLmdldEVuZExpbmUoKTsKLSAgICAgaW50IGVycm9yX2NvbHVtbiA9IGlucHV0X3N0cmVhbS5nZXRFbmRDb2x1bW4oKTsKLSAgICAgU3RyaW5nIGVycm9yX2FmdGVyID0gbnVsbDsKLSAgICAgYm9vbGVhbiBFT0ZTZWVuID0gZmFsc2U7Ci0gICAgIHRyeSB7IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOyBpbnB1dF9zdHJlYW0uYmFja3VwKDEpOyB9Ci0gICAgIGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUxKSB7Ci0gICAgICAgIEVPRlNlZW4gPSB0cnVlOwotICAgICAgICBlcnJvcl9hZnRlciA9IGN1clBvcyA8PSAxID8gIiIgOiBpbnB1dF9zdHJlYW0uR2V0SW1hZ2UoKTsKLSAgICAgICAgaWYgKGN1ckNoYXIgPT0gJ1xuJyB8fCBjdXJDaGFyID09ICdccicpIHsKLSAgICAgICAgICAgZXJyb3JfbGluZSsrOwotICAgICAgICAgICBlcnJvcl9jb2x1bW4gPSAwOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgICAgZXJyb3JfY29sdW1uKys7Ci0gICAgIH0KLSAgICAgaWYgKCFFT0ZTZWVuKSB7Ci0gICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICAgIGVycm9yX2FmdGVyID0gY3VyUG9zIDw9IDEgPyAiIiA6IGlucHV0X3N0cmVhbS5HZXRJbWFnZSgpOwotICAgICB9Ci0gICAgIHRocm93IG5ldyBUb2tlbk1nckVycm9yKEVPRlNlZW4sIGN1ckxleFN0YXRlLCBlcnJvcl9saW5lLCBlcnJvcl9jb2x1bW4sIGVycm9yX2FmdGVyLCBjdXJDaGFyLCBUb2tlbk1nckVycm9yLkxFWElDQUxfRVJST1IpOwotICAgfQotICB9Ci19Ci0KLXZvaWQgU2tpcExleGljYWxBY3Rpb25zKFRva2VuIG1hdGNoZWRUb2tlbikKLXsKLSAgIHN3aXRjaChqam1hdGNoZWRLaW5kKQotICAgewotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICBicmVhazsKLSAgIH0KLX0KLXZvaWQgVG9rZW5MZXhpY2FsQWN0aW9ucyhUb2tlbiBtYXRjaGVkVG9rZW4pCi17Ci0gICBzd2l0Y2goamptYXRjaGVkS2luZCkKLSAgIHsKLSAgICAgIGNhc2UgNzcgOgotICAgICAgICBpZiAoaW1hZ2UgPT0gbnVsbCkKLSAgICAgICAgICAgIGltYWdlID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKGlucHV0X3N0cmVhbS5HZXRTdWZmaXgoamppbWFnZUxlbiArIChsZW5ndGhPZk1hdGNoID0gamptYXRjaGVkUG9zICsgMSkpKTsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOwotICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVnVmFsaWQgPT0gZmFsc2UgfHwgbmV4dENoID09ICcvJyB8fCBuZXh0Q2ggPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIExleGVjYWwgYW5hbHlzZXIgdGhpbmtzIGl0IGlzIGEgUkUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3Igc3VjaCBhcyAvLi4uLi4vCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGxlbmd0aE9mTWF0Y2gtMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGVsZXRlKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgfQotICAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0IDogCi0gICAgICAgICBicmVhazsKLSAgIH0KLX0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVHJlZUNvbnN0YW50cy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFRyZWVDb25zdGFudHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdlNDAxMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVHJlZUNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gLlxKU1BhcnNlcjIwVHJlZUNvbnN0YW50cy5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cwotewotICBwdWJsaWMgaW50IEpKVFBST0dSQU0gPSAwOwotICBwdWJsaWMgaW50IEpKVElERU5USUZJRVIgPSAxOwotICBwdWJsaWMgaW50IEpKVFNJTVBMRVFVQUxJRklFRElERU5USUZJRVIgPSAyOwotICBwdWJsaWMgaW50IEpKVEVYUFJFU1NJT05RVUFMSUZJRURJREVOVElGSUVSID0gMzsKLSAgcHVibGljIGludCBKSlRRVUFMSUZJRURJREVOVElGSUVSID0gNDsKLSAgcHVibGljIGludCBKSlRQUklNQVJZRVhQUkVTU0lPTiA9IDU7Ci0gIHB1YmxpYyBpbnQgSkpUUkVTRVJWRUROQU1FU1BBQ0UgPSA2OwotICBwdWJsaWMgaW50IEpKVEZVTkNUSU9ORVhQUkVTU0lPTiA9IDc7Ci0gIHB1YmxpYyBpbnQgSkpUT0JKRUNUTElURVJBTCA9IDg7Ci0gIHB1YmxpYyBpbnQgSkpURklFTERMSVNUID0gOTsKLSAgcHVibGljIGludCBKSlRMSVRFUkFMRklFTEQgPSAxMDsKLSAgcHVibGljIGludCBKSlRGSUVMRE5BTUUgPSAxMTsKLSAgcHVibGljIGludCBKSlRBUlJBWUxJVEVSQUwgPSAxMjsKLSAgcHVibGljIGludCBKSlRFTEVNRU5UTElTVCA9IDEzOwotICBwdWJsaWMgaW50IEpKVExJVEVSQUxFTEVNRU5UID0gMTQ7Ci0gIHB1YmxpYyBpbnQgSkpUU1VQRVJFWFBSRVNTSU9OID0gMTU7Ci0gIHB1YmxpYyBpbnQgSkpUUE9TVEZJWEVYUFJFU1NJT04gPSAxNjsKLSAgcHVibGljIGludCBKSlRBVFRSSUJVVEVFWFBSRVNTSU9OID0gMTc7Ci0gIHB1YmxpYyBpbnQgSkpURlVMTFBPU1RGSVhFWFBSRVNTSU9OID0gMTg7Ci0gIHB1YmxpYyBpbnQgSkpURlVMTE5FV0VYUFJFU1NJT04gPSAxOTsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTkNPTlNUUlVDVE9SID0gMjA7Ci0gIHB1YmxpYyBpbnQgSkpURlVMTE5FV1NVQkVYUFJFU1NJT04gPSAyMTsKLSAgcHVibGljIGludCBKSlRQT1NURklYT1AgPSAyMjsKLSAgcHVibGljIGludCBKSlRQUk9QRVJUWU9SQVJHVU1FTlRTID0gMjM7Ci0gIHB1YmxpYyBpbnQgSkpUUFJPUEVSVFlPUEVSQVRPUiA9IDI0OwotICBwdWJsaWMgaW50IEpKVEFSR1VNRU5UUyA9IDI1OwotICBwdWJsaWMgaW50IEpKVFVOQVJZRVhQUkVTU0lPTiA9IDI2OwotICBwdWJsaWMgaW50IEpKVE1VTE9QID0gMjc7Ci0gIHB1YmxpYyBpbnQgSkpUTVVMVElQTElDQVRJVkVFWFBSRVNTSU9OID0gMjg7Ci0gIHB1YmxpYyBpbnQgSkpUQURET1AgPSAyOTsKLSAgcHVibGljIGludCBKSlRBRERJVElWRUVYUFJFU1NJT04gPSAzMDsKLSAgcHVibGljIGludCBKSlRTSElGVE9QID0gMzE7Ci0gIHB1YmxpYyBpbnQgSkpUU0hJRlRFWFBSRVNTSU9OID0gMzI7Ci0gIHB1YmxpYyBpbnQgSkpUUkVMT1AgPSAzMzsKLSAgcHVibGljIGludCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTiA9IDM0OwotICBwdWJsaWMgaW50IEpKVFJFTEFUSU9OQUxFWFBSRVNTSU9OTk9JTiA9IDM1OwotICBwdWJsaWMgaW50IEpKVEVRVUFMT1AgPSAzNjsKLSAgcHVibGljIGludCBKSlRFUVVBTElUWUVYUFJFU1NJT04gPSAzNzsKLSAgcHVibGljIGludCBKSlRFUVVBTElUWUVYUFJFU1NJT05OT0lOID0gMzg7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRUFORE9QID0gMzk7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRUFOREVYUFJFU1NJT04gPSA0MDsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFQU5ERVhQUkVTU0lPTk5PSU4gPSA0MTsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFWE9ST1AgPSA0MjsKLSAgcHVibGljIGludCBKSlRCSVRXSVNFWE9SRVhQUkVTU0lPTiA9IDQzOwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OTk9JTiA9IDQ0OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VPUk9QID0gNDU7Ci0gIHB1YmxpYyBpbnQgSkpUQklUV0lTRU9SRVhQUkVTU0lPTiA9IDQ2OwotICBwdWJsaWMgaW50IEpKVEJJVFdJU0VPUkVYUFJFU1NJT05OT0lOID0gNDc7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTEFOREVYUFJFU1NJT04gPSA0ODsKLSAgcHVibGljIGludCBKSlRMT0dJQ0FMQU5ERVhQUkVTU0lPTk5PSU4gPSA0OTsKLSAgcHVibGljIGludCBKSlRMT0dJQ0FMT1JFWFBSRVNTSU9OID0gNTA7Ci0gIHB1YmxpYyBpbnQgSkpUTE9HSUNBTE9SRVhQUkVTU0lPTk5PSU4gPSA1MTsKLSAgcHVibGljIGludCBKSlRDT05ESVRJT05BTEVYUFJFU1NJT04gPSA1MjsKLSAgcHVibGljIGludCBKSlRDT05ESVRJT05BTEVYUFJFU1NJT05OT0lOID0gNTM7Ci0gIHB1YmxpYyBpbnQgSkpUTk9OQVNTSUdOTUVOVEVYUFJFU1NJT04gPSA1NDsKLSAgcHVibGljIGludCBKSlROT05BU1NJR05NRU5URVhQUkVTU0lPTk5PSU4gPSA1NTsKLSAgcHVibGljIGludCBKSlRBU1NJR05FTUVOVE9QRVJBVE9SID0gNTY7Ci0gIHB1YmxpYyBpbnQgSkpUQVNTSUdOTUVOVEVYUFJFU1NJT04gPSA1NzsKLSAgcHVibGljIGludCBKSlRBU1NJR05NRU5URVhQUkVTU0lPTk5PSU4gPSA1ODsKLSAgcHVibGljIGludCBKSlRMSVNURVhQUkVTU0lPTiA9IDU5OwotICBwdWJsaWMgaW50IEpKVExJU1RFWFBSRVNTSU9OTk9JTiA9IDYwOwotICBwdWJsaWMgaW50IEpKVFRZUEVFWFBSRVNTSU9OID0gNjE7Ci0gIHB1YmxpYyBpbnQgSkpUVFlQRUVYUFJFU1NJT05OT0lOID0gNjI7Ci0gIHB1YmxpYyBpbnQgSkpUVFlQRUVYUFJFU1NJT05MSVNUID0gNjM7Ci0gIHB1YmxpYyBpbnQgSkpUU1RBVEVNRU5UID0gNjQ7Ci0gIHB1YmxpYyBpbnQgSkpUU1VCU1RBVEVNRU5UID0gNjU7Ci0gIHB1YmxpYyBpbnQgSkpUU1VCU1RBVEVNRU5UUyA9IDY2OwotICBwdWJsaWMgaW50IEpKVFNDID0gNjc7Ci0gIHB1YmxpYyBpbnQgSkpURU9MQ09NTUVOVFNLSVBXUyA9IDY4OwotICBwdWJsaWMgaW50IEpKVEVNUFRZU1RBVEVNRU5UID0gNjk7Ci0gIHB1YmxpYyBpbnQgSkpURVhQUkVTU0lPTlNUQVRFTUVOVCA9IDcwOwotICBwdWJsaWMgaW50IEpKVFNVUEVSU1RBVEVNRU5UID0gNzE7Ci0gIHB1YmxpYyBpbnQgSkpUQkxPQ0sgPSA3MjsKLSAgcHVibGljIGludCBKSlRMQUJFTEVEU1RBVEVNRU5UID0gNzM7Ci0gIHB1YmxpYyBpbnQgSkpUSUZTVEFURU1FTlQgPSA3NDsKLSAgcHVibGljIGludCBKSlRTV0lUQ0hTVEFURU1FTlQgPSA3NTsKLSAgcHVibGljIGludCBKSlRDQVNFRUxFTUVOVFMgPSA3NjsKLSAgcHVibGljIGludCBKSlRDQVNFRUxFTUVOVCA9IDc3OwotICBwdWJsaWMgaW50IEpKVENBU0VMQUJFTCA9IDc4OwotICBwdWJsaWMgaW50IEpKVERPU1RBVEVNRU5UID0gNzk7Ci0gIHB1YmxpYyBpbnQgSkpUV0hJTEVTVEFURU1FTlQgPSA4MDsKLSAgcHVibGljIGludCBKSlRGT1JTVEFURU1FTlQgPSA4MTsKLSAgcHVibGljIGludCBKSlRGT1JJTklUSUFMSVpFUiA9IDgyOwotICBwdWJsaWMgaW50IEpKVEZPUklOQklORElORyA9IDgzOwotICBwdWJsaWMgaW50IEpKVFdJVEhTVEFURU1FTlQgPSA4NDsKLSAgcHVibGljIGludCBKSlRDT05USU5VRVNUQVRFTUVOVCA9IDg1OwotICBwdWJsaWMgaW50IEpKVEJSRUFLU1RBVEVNRU5UID0gODY7Ci0gIHB1YmxpYyBpbnQgSkpUUkVUVVJOU1RBVEVNRU5UID0gODc7Ci0gIHB1YmxpYyBpbnQgSkpUVEhST1dTVEFURU1FTlQgPSA4ODsKLSAgcHVibGljIGludCBKSlRUUllTVEFURU1FTlQgPSA4OTsKLSAgcHVibGljIGludCBKSlRESVJFQ1RJVkVTID0gOTA7Ci0gIHB1YmxpYyBpbnQgSkpURElSRUNUSVZFID0gOTE7Ci0gIHB1YmxpYyBpbnQgSkpUQU5OT1RBVEFCTEVESVJFQ1RJVkUgPSA5MjsKLSAgcHVibGljIGludCBKSlRBVFRSSUJVVEVTID0gOTM7Ci0gIHB1YmxpYyBpbnQgSkpUQVRUUklCVVRFID0gOTQ7Ci0gIHB1YmxpYyBpbnQgSkpUVVNFRElSRUNUSVZFID0gOTU7Ci0gIHB1YmxpYyBpbnQgSkpUSU1QT1JURElSRUNUSVZFID0gOTY7Ci0gIHB1YmxpYyBpbnQgSkpUSU5DTFVERURJUkVDVElWRSA9IDk3OwotICBwdWJsaWMgaW50IEpKVFBSQUdNQSA9IDk4OwotICBwdWJsaWMgaW50IEpKVFBSQUdNQUlURU1TID0gOTk7Ci0gIHB1YmxpYyBpbnQgSkpUUFJBR01BSVRFTSA9IDEwMDsKLSAgcHVibGljIGludCBKSlRQUkFHTUFFWFBSID0gMTAxOwotICBwdWJsaWMgaW50IEpKVFBSQUdNQUFSR1VNRU5UID0gMTAyOwotICBwdWJsaWMgaW50IEpKVEVYUE9SVERFRklOSVRJT04gPSAxMDM7Ci0gIHB1YmxpYyBpbnQgSkpURVhQT1JUQklORElOR0xJU1QgPSAxMDQ7Ci0gIHB1YmxpYyBpbnQgSkpURVhQT1JUQklORElORyA9IDEwNTsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRURFRklOSVRJT04gPSAxMDY7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVERUZJTklUSU9OTk9JTiA9IDEwNzsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRURFRklOSVRJT05LSU5EID0gMTA4OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElOR0xJU1QgPSAxMDk7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVCSU5ESU5HTElTVE5PSU4gPSAxMTA7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVCSU5ESU5HID0gMTExOwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFQklORElOR05PSU4gPSAxMTI7Ci0gIHB1YmxpYyBpbnQgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTiA9IDExMzsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUlOSVRJQUxJU0FUSU9OTk9JTiA9IDExNDsKLSAgcHVibGljIGludCBKSlRWQVJJQUJMRUlOSVRJQUxJWkVSID0gMTE1OwotICBwdWJsaWMgaW50IEpKVFZBUklBQkxFSU5JVElBTElaRVJOT0lOID0gMTE2OwotICBwdWJsaWMgaW50IEpKVFRZUEVESURFTlRJRklFUiA9IDExNzsKLSAgcHVibGljIGludCBKSlRUWVBFRElERU5USUZJRVJOT0lOID0gMTE4OwotICBwdWJsaWMgaW50IEpKVFNJTVBMRVZBUklBQkxFREVGSU5JVElPTiA9IDExOTsKLSAgcHVibGljIGludCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HTElTVCA9IDEyMDsKLSAgcHVibGljIGludCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HID0gMTIxOwotICBwdWJsaWMgaW50IEpKVEZVTkNUSU9OREVGSU5JVElPTiA9IDEyMjsKLSAgcHVibGljIGludCBKSlRGVU5DVElPTk5BTUUgPSAxMjM7Ci0gIHB1YmxpYyBpbnQgSkpURlVOQ1RJT05DT01NT04gPSAxMjQ7Ci0gIHB1YmxpYyBpbnQgSkpUUEFSQU1FVEVSUyA9IDEyNTsKLSAgcHVibGljIGludCBKSlRQQVJBTUVURVIgPSAxMjY7Ci0gIHB1YmxpYyBpbnQgSkpUUEFSQU1FVEVSSU5JVCA9IDEyNzsKLSAgcHVibGljIGludCBKSlRSRVNUUEFSQU1FVEVSUyA9IDEyODsKLSAgcHVibGljIGludCBKSlRSRVNVTFQgPSAxMjk7Ci0gIHB1YmxpYyBpbnQgSkpUQ0xBU1NERUZJTklUSU9OID0gMTMwOwotICBwdWJsaWMgaW50IEpKVElOVEVSRkFDRURFRklOSVRJT04gPSAxMzE7Ci0gIHB1YmxpYyBpbnQgSkpUSU5IRVJJVEFOQ0UgPSAxMzI7Ci0gIHB1YmxpYyBpbnQgSkpUTkFNRVNQQUNFREVGSU5JVElPTiA9IDEzMzsKLSAgcHVibGljIGludCBKSlRQQUNLQUdFREVGSU5JVElPTiA9IDEzNDsKLSAgcHVibGljIGludCBKSlRQQUNLQUdFTkFNRSA9IDEzNTsKLSAgcHVibGljIGludCBKSlRQQUNLQUdFSURFTlRJRklFUlMgPSAxMzY7Ci0KLQotICBwdWJsaWMgU3RyaW5nW10gamp0Tm9kZU5hbWUgPSB7Ci0gICAgIlByb2dyYW0iLAotICAgICJJZGVudGlmaWVyIiwKLSAgICAiU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciIsCi0gICAgIkV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyIiwKLSAgICAiUXVhbGlmaWVkSWRlbnRpZmllciIsCi0gICAgIlByaW1hcnlFeHByZXNzaW9uIiwKLSAgICAiUmVzZXJ2ZWROYW1lc3BhY2UiLAotICAgICJGdW5jdGlvbkV4cHJlc3Npb24iLAotICAgICJPYmplY3RMaXRlcmFsIiwKLSAgICAiRmllbGRMaXN0IiwKLSAgICAiTGl0ZXJhbEZpZWxkIiwKLSAgICAiRmllbGROYW1lIiwKLSAgICAiQXJyYXlMaXRlcmFsIiwKLSAgICAiRWxlbWVudExpc3QiLAotICAgICJMaXRlcmFsRWxlbWVudCIsCi0gICAgIlN1cGVyRXhwcmVzc2lvbiIsCi0gICAgIlBvc3RmaXhFeHByZXNzaW9uIiwKLSAgICAiQXR0cmlidXRlRXhwcmVzc2lvbiIsCi0gICAgIkZ1bGxQb3N0Zml4RXhwcmVzc2lvbiIsCi0gICAgIkZ1bGxOZXdFeHByZXNzaW9uIiwKLSAgICAiRnVuY3Rpb25Db25zdHJ1Y3RvciIsCi0gICAgIkZ1bGxOZXdTdWJleHByZXNzaW9uIiwKLSAgICAiUG9zdGZpeE9wIiwKLSAgICAiUHJvcGVydHlPckFyZ3VtZW50cyIsCi0gICAgIlByb3BlcnR5T3BlcmF0b3IiLAotICAgICJBcmd1bWVudHMiLAotICAgICJVbmFyeUV4cHJlc3Npb24iLAotICAgICJNdWxPcCIsCi0gICAgIk11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiIsCi0gICAgIkFkZE9wIiwKLSAgICAiQWRkaXRpdmVFeHByZXNzaW9uIiwKLSAgICAiU2hpZnRPcCIsCi0gICAgIlNoaWZ0RXhwcmVzc2lvbiIsCi0gICAgIlJlbE9wIiwKLSAgICAiUmVsYXRpb25hbEV4cHJlc3Npb24iLAotICAgICJSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4iLAotICAgICJFcXVhbE9wIiwKLSAgICAiRXF1YWxpdHlFeHByZXNzaW9uIiwKLSAgICAiRXF1YWxpdHlFeHByZXNzaW9uTm9JTiIsCi0gICAgIkJpdHdpc2VBTkRPcCIsCi0gICAgIkJpdHdpc2VBTkRFeHByZXNzaW9uIiwKLSAgICAiQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOIiwKLSAgICAiQml0d2lzZVhPUk9wIiwKLSAgICAiQml0d2lzZVhPUkV4cHJlc3Npb24iLAotICAgICJCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4iLAotICAgICJCaXR3aXNlT1JPcCIsCi0gICAgIkJpdHdpc2VPUkV4cHJlc3Npb24iLAotICAgICJCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiIsCi0gICAgIkxvZ2ljYWxBTkRFeHByZXNzaW9uIiwKLSAgICAiTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIiwKLSAgICAiTG9naWNhbE9SRXhwcmVzc2lvbiIsCi0gICAgIkxvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOIiwKLSAgICAiQ29uZGl0aW9uYWxFeHByZXNzaW9uIiwKLSAgICAiQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTiIsCi0gICAgIk5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIiwKLSAgICAiTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiQXNzaWduZW1lbnRPcGVyYXRvciIsCi0gICAgIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwKLSAgICAiQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIiwKLSAgICAiTGlzdEV4cHJlc3Npb24iLAotICAgICJMaXN0RXhwcmVzc2lvbk5vSU4iLAotICAgICJUeXBlRXhwcmVzc2lvbiIsCi0gICAgIlR5cGVFeHByZXNzaW9uTm9JTiIsCi0gICAgIlR5cGVFeHByZXNzaW9uTGlzdCIsCi0gICAgIlN0YXRlbWVudCIsCi0gICAgIlN1YnN0YXRlbWVudCIsCi0gICAgIlN1YnN0YXRlbWVudHMiLAotICAgICJTYyIsCi0gICAgIkVvbENvbW1lbnRTa2lwV3MiLAotICAgICJFbXB0eVN0YXRlbWVudCIsCi0gICAgIkV4cHJlc3Npb25TdGF0ZW1lbnQiLAotICAgICJTdXBlclN0YXRlbWVudCIsCi0gICAgIkJsb2NrIiwKLSAgICAiTGFiZWxlZFN0YXRlbWVudCIsCi0gICAgIklmU3RhdGVtZW50IiwKLSAgICAiU3dpdGNoU3RhdGVtZW50IiwKLSAgICAiQ2FzZUVsZW1lbnRzIiwKLSAgICAiQ2FzZUVsZW1lbnQiLAotICAgICJDYXNlTGFiZWwiLAotICAgICJEb1N0YXRlbWVudCIsCi0gICAgIldoaWxlU3RhdGVtZW50IiwKLSAgICAiRm9yU3RhdGVtZW50IiwKLSAgICAiRm9ySW5pdGlhbGl6ZXIiLAotICAgICJGb3JJbkJpbmRpbmciLAotICAgICJXaXRoU3RhdGVtZW50IiwKLSAgICAiQ29udGludWVTdGF0ZW1lbnQiLAotICAgICJCcmVha1N0YXRlbWVudCIsCi0gICAgIlJldHVyblN0YXRlbWVudCIsCi0gICAgIlRocm93U3RhdGVtZW50IiwKLSAgICAiVHJ5U3RhdGVtZW50IiwKLSAgICAiRGlyZWN0aXZlcyIsCi0gICAgIkRpcmVjdGl2ZSIsCi0gICAgIkFubm90YXRhYmxlRGlyZWN0aXZlIiwKLSAgICAiQXR0cmlidXRlcyIsCi0gICAgIkF0dHJpYnV0ZSIsCi0gICAgIlVzZURpcmVjdGl2ZSIsCi0gICAgIkltcG9ydERpcmVjdGl2ZSIsCi0gICAgIkluY2x1ZGVEaXJlY3RpdmUiLAotICAgICJQcmFnbWEiLAotICAgICJQcmFnbWFJdGVtcyIsCi0gICAgIlByYWdtYUl0ZW0iLAotICAgICJQcmFnbWFFeHByIiwKLSAgICAiUHJhZ21hQXJndW1lbnQiLAotICAgICJFeHBvcnREZWZpbml0aW9uIiwKLSAgICAiRXhwb3J0QmluZGluZ0xpc3QiLAotICAgICJFeHBvcnRCaW5kaW5nIiwKLSAgICAiVmFyaWFibGVEZWZpbml0aW9uIiwKLSAgICAiVmFyaWFibGVEZWZpbml0aW9uTm9JTiIsCi0gICAgIlZhcmlhYmxlRGVmaW5pdGlvbktpbmQiLAotICAgICJWYXJpYWJsZUJpbmRpbmdMaXN0IiwKLSAgICAiVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4iLAotICAgICJWYXJpYWJsZUJpbmRpbmciLAotICAgICJWYXJpYWJsZUJpbmRpbmdOb0lOIiwKLSAgICAiVmFyaWFibGVJbml0aWFsaXNhdGlvbiIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOIiwKLSAgICAiVmFyaWFibGVJbml0aWFsaXplciIsCi0gICAgIlZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIiwKLSAgICAiVHlwZWRJZGVudGlmaWVyIiwKLSAgICAiVHlwZWRJZGVudGlmaWVyTm9JTiIsCi0gICAgIlNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiIsCi0gICAgIlVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IiwKLSAgICAiVW50eXBlZFZhcmlhYmxlQmluZGluZyIsCi0gICAgIkZ1bmN0aW9uRGVmaW5pdGlvbiIsCi0gICAgIkZ1bmN0aW9uTmFtZSIsCi0gICAgIkZ1bmN0aW9uQ29tbW9uIiwKLSAgICAiUGFyYW1ldGVycyIsCi0gICAgIlBhcmFtZXRlciIsCi0gICAgIlBhcmFtZXRlckluaXQiLAotICAgICJSZXN0UGFyYW1ldGVycyIsCi0gICAgIlJlc3VsdCIsCi0gICAgIkNsYXNzRGVmaW5pdGlvbiIsCi0gICAgIkludGVyZmFjZURlZmluaXRpb24iLAotICAgICJJbmhlcml0YW5jZSIsCi0gICAgIk5hbWVzcGFjZURlZmluaXRpb24iLAotICAgICJQYWNrYWdlRGVmaW5pdGlvbiIsCi0gICAgIlBhY2thZ2VOYW1lIiwKLSAgICAiUGFja2FnZUlkZW50aWZpZXJzIiwKLSAgfTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVmlzaXRvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvSlNQYXJzZXIyMFZpc2l0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2MmQwMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9KU1BhcnNlcjIwVmlzaXRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gLlxKU1BhcnNlcjIwVmlzaXRvci5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGludGVyZmFjZSBKU1BhcnNlcjIwVmlzaXRvcgotewotICBwdWJsaWMgT2JqZWN0IHZpc2l0KFNpbXBsZU5vZGUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByb2dyYW0gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RRdWFsaWZpZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmltYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUT2JqZWN0TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURmllbGRMaXN0IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXRlcmFsRmllbGQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZpZWxkTmFtZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXJyYXlMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFbGVtZW50TGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGl0ZXJhbEVsZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1cGVyRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVsbE5ld0V4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uQ29uc3RydWN0b3Igbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQb3N0Zml4T3Agbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByb3BlcnR5T3JBcmd1bWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByb3BlcnR5T3BlcmF0b3Igbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFyZ3VtZW50cyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW5hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RNdWxPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBZGRPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkaXRpdmVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTaGlmdE9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTaGlmdEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbE9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbE9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VBTkRPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZUFOREV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZVhPUk9wIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlWE9SRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlT1JPcCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZU9SRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExvZ2ljYWxPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDb25kaXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFzc2lnbmVtZW50T3BlcmF0b3Igbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpc3RFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXN0RXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVFeHByZXNzaW9uTGlzdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdWJzdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1YnN0YXRlbWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFNjIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFb2xDb21tZW50U2tpcFdzIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFbXB0eVN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvblN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3VwZXJTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJsb2NrIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMYWJlbGVkU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJZlN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3dpdGNoU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDYXNlRWxlbWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENhc2VFbGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDYXNlTGFiZWwgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERvU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RXaGlsZVN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURm9yU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGb3JJbml0aWFsaXplciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURm9ySW5CaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RXaXRoU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDb250aW51ZVN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQnJlYWtTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJldHVyblN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVGhyb3dTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFRyeVN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURGlyZWN0aXZlcyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBbm5vdGF0YWJsZURpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXR0cmlidXRlcyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXR0cmlidXRlIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVc2VEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEltcG9ydERpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW5jbHVkZURpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcmFnbWFJdGVtcyBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hSXRlbSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hRXhwciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hQXJndW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cG9ydERlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cG9ydEJpbmRpbmdMaXN0IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnRCaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlQmluZGluZ0xpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmcgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlQmluZGluZ05vSU4gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpemVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpemVyTm9JTiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZWRJZGVudGlmaWVyIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlZElkZW50aWZpZXJOb0lOIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTaW1wbGVWYXJpYWJsZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0IG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkRlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uTmFtZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25Db21tb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhcmFtZXRlcnMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhcmFtZXRlciBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFyYW1ldGVySW5pdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVzdFBhcmFtZXRlcnMgbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc3VsdCBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2xhc3NEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbnRlcmZhY2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbmhlcml0YW5jZSBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTmFtZXNwYWNlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSk7Ci0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpOwotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VOYW1lIG5vZGUsIE9iamVjdCBkYXRhKTsKLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlSWRlbnRpZmllcnMgbm9kZSwgT2JqZWN0IGRhdGEpOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL05vZGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL05vZGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzMzZWEyYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ob2RlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SkpUcmVlOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIE5vZGUuamF2YSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLS8qIEFsbCBBU1Qgbm9kZXMgbXVzdCBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UuICBJdCBwcm92aWRlcyBiYXNpYwotICAgbWFjaGluZXJ5IGZvciBjb25zdHJ1Y3RpbmcgdGhlIHBhcmVudCBhbmQgY2hpbGQgcmVsYXRpb25zaGlwcwotICAgYmV0d2VlbiBub2Rlcy4gKi8KLQotcHVibGljIGludGVyZmFjZSBOb2RlCi17Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciB0aGUgbm9kZSBoYXMgYmVlbiBtYWRlIHRoZSBjdXJyZW50Ci0gICAgbm9kZS4gIEl0IGluZGljYXRlcyB0aGF0IGNoaWxkIG5vZGVzIGNhbiBub3cgYmUgYWRkZWQgdG8gaXQuICovCi0gIHB1YmxpYyB2b2lkIGpqdE9wZW4oKTsKLQotICAvKiogVGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFsbCB0aGUgY2hpbGQgbm9kZXMgaGF2ZSBiZWVuCi0gICAgYWRkZWQuICovCi0gIHB1YmxpYyB2b2lkIGpqdENsb3NlKCk7Ci0KLSAgLyoqIFRoaXMgcGFpciBvZiBtZXRob2RzIGFyZSB1c2VkIHRvIGluZm9ybSB0aGUgbm9kZSBvZiBpdHMKLSAgICBwYXJlbnQuICovCi0gIHB1YmxpYyB2b2lkIGpqdFNldFBhcmVudChOb2RlIG4pOwotCi0gIHB1YmxpYyBOb2RlIGpqdEdldFBhcmVudCgpOwotCi0gIC8qKiBUaGlzIG1ldGhvZCB0ZWxscyB0aGUgbm9kZSB0byBhZGQgaXRzIGFyZ3VtZW50IHRvIHRoZSBub2RlJ3MKLSAgICBsaXN0IG9mIGNoaWxkcmVuLiAgKi8KLSAgcHVibGljIHZvaWQgamp0QWRkQ2hpbGQoTm9kZSBuLCBpbnQgaSk7Ci0KLSAgLyoqIFRoaXMgbWV0aG9kIHJldHVybnMgYSBjaGlsZCBub2RlLiAgVGhlIGNoaWxkcmVuIGFyZSBudW1iZXJlZAotICAgICBmcm9tIHplcm8sIGxlZnQgdG8gcmlnaHQuICovCi0gIHB1YmxpYyBOb2RlIGpqdEdldENoaWxkKGludCBpKTsKLQotICAvKiogUmV0dXJuIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhlIG5vZGUgaGFzLiAqLwotICBwdWJsaWMgaW50IGpqdEdldE51bUNoaWxkcmVuKCk7Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKTsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9QYXJzZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmU4ZDViLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1BhcnNlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBQYXJzZUV4Y2VwdGlvbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLS8qKgotICogVGhpcyBleGNlcHRpb24gaXMgdGhyb3duIHdoZW4gcGFyc2UgZXJyb3JzIGFyZSBlbmNvdW50ZXJlZC4KLSAqIFlvdSBjYW4gZXhwbGljaXRseSBjcmVhdGUgb2JqZWN0cyBvZiB0aGlzIGV4Y2VwdGlvbiB0eXBlIGJ5Ci0gKiBjYWxsaW5nIHRoZSBtZXRob2QgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbiBpbiB0aGUgZ2VuZXJhdGVkCi0gKiBwYXJzZXIuCi0gKgotICogWW91IGNhbiBtb2RpZnkgdGhpcyBjbGFzcyB0byBjdXN0b21pemUgeW91ciBlcnJvciByZXBvcnRpbmcKLSAqIG1lY2hhbmlzbXMgc28gbG9uZyBhcyB5b3UgcmV0YWluIHRoZSBwdWJsaWMgZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLQotICAvKioKLSAgICogVGhpcyB2YXJpYWJsZSBkZXRlcm1pbmVzIHdoaWNoIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZQotICAgKiB0aGlzIG9iamVjdCBhbmQgdGhlcmVieSBhZmZlY3RzIHRoZSBzZW1hbnRpY3Mgb2YgdGhlCi0gICAqICJnZXRNZXNzYWdlIiBtZXRob2QgKHNlZSBiZWxvdykuCi0gICAqLwotICBwcm90ZWN0ZWQgYm9vbGVhbiBzcGVjaWFsQ29uc3RydWN0b3I7Ci0KLSAgLyoqCi0gICAqIFRoaXMgaXMgdGhlIGxhc3QgdG9rZW4gdGhhdCBoYXMgYmVlbiBjb25zdW1lZCBzdWNjZXNzZnVsbHkuICBJZgotICAgKiB0aGlzIG9iamVjdCBoYXMgYmVlbiBjcmVhdGVkIGR1ZSB0byBhIHBhcnNlIGVycm9yLCB0aGUgdG9rZW4KLSAgICogZm9sbG93bmcgdGhpcyB0b2tlbiB3aWxsICh0aGVyZWZvcmUpIGJlIHRoZSBmaXJzdCBlcnJvciB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBUb2tlbiBjdXJyZW50VG9rZW47Ci0KLSAgLyoqCi0gICAqIEVhY2ggZW50cnkgaW4gdGhpcyBhcnJheSBpcyBhbiBhcnJheSBvZiBpbnRlZ2Vycy4gIEVhY2ggYXJyYXkKLSAgICogb2YgaW50ZWdlcnMgcmVwcmVzZW50cyBhIHNlcXVlbmNlIG9mIHRva2VucyAoYnkgdGhlaXIgb3JkaW5hbAotICAgKiB2YWx1ZXMpIHRoYXQgaXMgZXhwZWN0ZWQgYXQgdGhpcyBwb2ludCBvZiB0aGUgcGFyc2UuCi0gICAqLwotICBwdWJsaWMgaW50W11bXSBleHBlY3RlZFRva2VuU2VxdWVuY2VzOwotCi0gIC8qKgotICAgKiBUaGlzIGlzIGEgcmVmZXJlbmNlIHRvIHRoZSAidG9rZW5JbWFnZSIgYXJyYXkgb2YgdGhlIGdlbmVyYXRlZAotICAgKiBwYXJzZXIgd2l0aGluIHdoaWNoIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZC4gIFRoaXMgYXJyYXkgaXMKLSAgICogZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIC4uLkNvbnN0YW50cyBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nW10gdG9rZW5JbWFnZTsKLQotICAvKioKLSAgICogVGhlIGVuZCBvZiBsaW5lIHN0cmluZyBmb3IgdGhpcyBtYWNoaW5lLgotICAgKi8KLSAgcHJvdGVjdGVkIFN0cmluZyBlb2wgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoImxpbmUuc2VwYXJhdG9yIiwgIlxuIik7Ci0KLSAgLyoqCi0gICAqIFRoaXMgY29uc3RydWN0b3IgaXMgdXNlZCBieSB0aGUgbWV0aG9kICJnZW5lcmF0ZVBhcnNlRXhjZXB0aW9uIgotICAgKiBpbiB0aGUgZ2VuZXJhdGVkIHBhcnNlci4gIENhbGxpbmcgdGhpcyBjb25zdHJ1Y3RvciBnZW5lcmF0ZXMKLSAgICogYSBuZXcgb2JqZWN0IG9mIHRoaXMgdHlwZSB3aXRoIHRoZSBmaWVsZHMgImN1cnJlbnRUb2tlbiIsCi0gICAqICJleHBlY3RlZFRva2VuU2VxdWVuY2VzIiwgYW5kICJ0b2tlbkltYWdlIiBzZXQuICBUaGUgYm9vbGVhbgotICAgKiBmbGFnICJzcGVjaWFsQ29uc3RydWN0b3IiIGlzIGFsc28gc2V0IHRvIHRydWUgdG8gaW5kaWNhdGUgdGhhdAotICAgKiB0aGlzIGNvbnN0cnVjdG9yIHdhcyB1c2VkIHRvIGNyZWF0ZSB0aGlzIG9iamVjdC4KLSAgICogVGhpcyBjb25zdHJ1Y3RvciBjYWxscyBpdHMgc3VwZXIgY2xhc3Mgd2l0aCB0aGUgZW1wdHkgc3RyaW5nCi0gICAqIHRvIGZvcmNlIHRoZSAidG9TdHJpbmciIG1ldGhvZCBvZiBwYXJlbnQgY2xhc3MgIlRocm93YWJsZSIgdG8KLSAgICogcHJpbnQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIGZvcm06Ci0gICAqICAgICBQYXJzZUV4Y2VwdGlvbjogPHJlc3VsdCBvZiBnZXRNZXNzYWdlPgotICAgKi8KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFRva2VuICAgIGN1cnJlbnRUb2tlblZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludFtdW10gIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXNWYWwsCi0gICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdbXSB0b2tlbkltYWdlVmFsKQotICB7Ci0gICAgc3VwZXIoIiIpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IHRydWU7Ci0gICAgY3VycmVudFRva2VuID0gY3VycmVudFRva2VuVmFsOwotICAgIGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzVmFsOwotICAgIHRva2VuSW1hZ2UgPSB0b2tlbkltYWdlVmFsOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBmb2xsb3dpbmcgY29uc3RydWN0b3JzIGFyZSBmb3IgdXNlIGJ5IHlvdSBmb3Igd2hhdGV2ZXIKLSAgICogcHVycG9zZSB5b3UgY2FuIHRoaW5rIG9mLiAgQ29uc3RydWN0aW5nIHRoZSBleGNlcHRpb24gaW4gdGhpcwotICAgKiBtYW5uZXIgbWFrZXMgdGhlIGV4Y2VwdGlvbiBiZWhhdmUgaW4gdGhlIG5vcm1hbCB3YXkgLSBpLmUuLCBhcwotICAgKiBkb2N1bWVudGVkIGluIHRoZSBjbGFzcyAiVGhyb3dhYmxlIi4gIFRoZSBmaWVsZHMgImVycm9yVG9rZW4iLAotICAgKiAiZXhwZWN0ZWRUb2tlblNlcXVlbmNlcyIsIGFuZCAidG9rZW5JbWFnZSIgZG8gbm90IGNvbnRhaW4KLSAgICogcmVsZXZhbnQgaW5mb3JtYXRpb24uICBUaGUgSmF2YUNDIGdlbmVyYXRlZCBjb2RlIGRvZXMgbm90IHVzZQotICAgKiB0aGVzZSBjb25zdHJ1Y3RvcnMuCi0gICAqLwotCi0gIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbigpCi0gIHsKLSAgICBzdXBlcigpOwotICAgIHNwZWNpYWxDb25zdHJ1Y3RvciA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIFBhcnNlRXhjZXB0aW9uKFN0cmluZyBtZXNzYWdlKQotICB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgc3BlY2lhbENvbnN0cnVjdG9yID0gZmFsc2U7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBtZXRob2QgaGFzIHRoZSBzdGFuZGFyZCBiZWhhdmlvciB3aGVuIHRoaXMgb2JqZWN0IGhhcyBiZWVuCi0gICAqIGNyZWF0ZWQgdXNpbmcgdGhlIHN0YW5kYXJkIGNvbnN0cnVjdG9ycy4gIE90aGVyd2lzZSwgaXQgdXNlcwotICAgKiAiY3VycmVudFRva2VuIiBhbmQgImV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMiIHRvIGdlbmVyYXRlIGEgcGFyc2UKLSAgICogZXJyb3IgbWVzc2FnZSBhbmQgcmV0dXJucyBpdC4gIElmIHRoaXMgb2JqZWN0IGhhcyBiZWVuIGNyZWF0ZWQKLSAgICogZHVlIHRvIGEgcGFyc2UgZXJyb3IsIGFuZCB5b3UgZG8gbm90IGNhdGNoIGl0IChpdCBnZXRzIHRocm93bgotICAgKiBmcm9tIHRoZSBwYXJzZXIpLCB0aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBkdXJpbmcgdGhlIHByaW50aW5nCi0gICAqIG9mIHRoZSBmaW5hbCBzdGFjayB0cmFjZSwgYW5kIGhlbmNlIHRoZSBjb3JyZWN0IGVycm9yIG1lc3NhZ2UKLSAgICogZ2V0cyBkaXNwbGF5ZWQuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0KLSAgICBpZiAoIXNwZWNpYWxDb25zdHJ1Y3RvcikKLSAgICB7Ci0gICAgICByZXR1cm4gc3VwZXIuZ2V0TWVzc2FnZSgpOwotICAgIH0KLQotICAgIFN0cmluZyBleHBlY3RlZCA9ICIiOwotICAgIGludCAgICBtYXhTaXplID0gMDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlcy5sZW5ndGg7IGkrKykKLSAgICB7Ci0KLSAgICAgIGlmIChtYXhTaXplIDwgZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXS5sZW5ndGgpCi0gICAgICB7Ci0gICAgICAgIG1heFNpemUgPSBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aDsgaisrKQotICAgICAgewotICAgICAgICBleHBlY3RlZCArPSB0b2tlbkltYWdlW2V4cGVjdGVkVG9rZW5TZXF1ZW5jZXNbaV1bal1dICsgIiAiOwotICAgICAgfQotCi0gICAgICBpZiAoZXhwZWN0ZWRUb2tlblNlcXVlbmNlc1tpXVtleHBlY3RlZFRva2VuU2VxdWVuY2VzW2ldLmxlbmd0aCAtIDFdICE9IDApCi0gICAgICB7Ci0gICAgICAgIGV4cGVjdGVkICs9ICIuLi4iOwotICAgICAgfQotCi0gICAgICBleHBlY3RlZCArPSBlb2wgKyAiICAgICI7Ci0gICAgfQotCi0gICAgU3RyaW5nIHJldHZhbCA9ICJFbmNvdW50ZXJlZCBcIiI7Ci0gICAgVG9rZW4gIHRvayA9IGN1cnJlbnRUb2tlbi5uZXh0OwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXhTaXplOyBpKyspCi0gICAgewotCi0gICAgICBpZiAoaSAhPSAwKQotICAgICAgewotICAgICAgICByZXR2YWwgKz0gIiAiOwotICAgICAgfQotCi0gICAgICBpZiAodG9rLmtpbmQgPT0gMCkKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsICs9IHRva2VuSW1hZ2VbMF07Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHJldHZhbCArPSBhZGRfZXNjYXBlcyh0b2suaW1hZ2UpOwotICAgICAgdG9rID0gdG9rLm5leHQ7Ci0gICAgfQotCi0gICAgcmV0dmFsICs9ICJcIiBhdCBsaW5lICIgKyBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkxpbmUgKyAiLCBjb2x1bW4gIiArCi0gICAgICBjdXJyZW50VG9rZW4ubmV4dC5iZWdpbkNvbHVtbjsKLSAgICByZXR2YWwgKz0gIi4iICsgZW9sOwotCi0gICAgaWYgKGV4cGVjdGVkVG9rZW5TZXF1ZW5jZXMubGVuZ3RoID09IDEpCi0gICAgewotICAgICAgcmV0dmFsICs9ICJXYXMgZXhwZWN0aW5nOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICByZXR2YWwgKz0gIldhcyBleHBlY3Rpbmcgb25lIG9mOiIgKyBlb2wgKyAiICAgICI7Ci0gICAgfQotCi0gICAgcmV0dmFsICs9IGV4cGVjdGVkOwotCi0gICAgcmV0dXJuIHJldHZhbDsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VkIHRvIGNvbnZlcnQgcmF3IGNoYXJhY3RlcnMgdG8gdGhlaXIgZXNjYXBlZCB2ZXJzaW9uCi0gICAqIHdoZW4gdGhlc2UgcmF3IHZlcnNpb24gY2Fubm90IGJlIHVzZWQgYXMgcGFydCBvZiBhbiBBU0NJSQotICAgKiBzdHJpbmcgbGl0ZXJhbC4KLSAgICovCi0gIHByb3RlY3RlZCBTdHJpbmcgYWRkX2VzY2FwZXMoU3RyaW5nIHN0cikKLSAgewotICAgIFN0cmluZ0J1ZmZlciByZXR2YWwgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gICAgY2hhciAgICAgICAgIGNoOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0KLSAgICAgIHN3aXRjaCAoc3RyLmNoYXJBdChpKSkKLSAgICAgIHsKLQotICAgICAgY2FzZSAwOgotICAgICAgewotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXGInOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGIiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXHQnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHQiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXG4nOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXG4iKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXGYnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXGYiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXHInOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHIiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXCInOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFwiIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1wnJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcJyIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcXCc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXFwiKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDoKLSAgICAgIHsKLQotICAgICAgICBpZiAoKChjaCA9IHN0ci5jaGFyQXQoaSkpIDwgMHgyMCkgfHwgKGNoID4gMHg3ZSkpCi0gICAgICAgIHsKLSAgICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgICByZXR2YWwuYXBwZW5kKCJcXHUiICsgcy5zdWJzdHJpbmcocy5sZW5ndGgoKSAtIDQsIHMubGVuZ3RoKCkpKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICByZXR2YWwuYXBwZW5kKGNoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiByZXR2YWwudG9TdHJpbmcoKTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9TaW1wbGVDaGFyU3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYjdlMDEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlQ2hhclN0cmVhbS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTU5ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKYXZhQ0M6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlQ2hhclN0cmVhbS5qYXZhIFZlcnNpb24gNC4wICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2YgaW50ZXJmYWNlIENoYXJTdHJlYW0sIHdoZXJlIHRoZSBzdHJlYW0gaXMgYXNzdW1lZCB0bwotICogY29udGFpbiBvbmx5IEFTQ0lJIGNoYXJhY3RlcnMgKHdpdGhvdXQgdW5pY29kZSBwcm9jZXNzaW5nKS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgU2ltcGxlQ2hhclN0cmVhbQotewotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gc3RhdGljRmxhZyA9IGZhbHNlOwotICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIGF2YWlsYWJsZTsKLSAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuQmVnaW47Ci0gIHB1YmxpYyBpbnQgICAgICAgICAgICAgICAgICBidWZwb3MgPSAtMTsKLSAgcHJvdGVjdGVkIGludFtdICAgICAgICAgICAgIGJ1ZmxpbmU7Ci0gIHByb3RlY3RlZCBpbnRbXSAgICAgICAgICAgICBidWZjb2x1bW47Ci0KLSAgcHJvdGVjdGVkIGludCBjb2x1bW4gPSAwOwotICBwcm90ZWN0ZWQgaW50IGxpbmUgPSAxOwotCi0gIHByb3RlY3RlZCBib29sZWFuIHByZXZDaGFySXNDUiA9IGZhbHNlOwotICBwcm90ZWN0ZWQgYm9vbGVhbiBwcmV2Q2hhcklzTEYgPSBmYWxzZTsKLQotICBwcm90ZWN0ZWQgamF2YS5pby5SZWFkZXIgaW5wdXRTdHJlYW07Ci0KLSAgcHJvdGVjdGVkIGNoYXJbXSBidWZmZXI7Ci0gIHByb3RlY3RlZCBpbnQgICAgbWF4TmV4dENoYXJJbmQgPSAwOwotICBwcm90ZWN0ZWQgaW50ICAgIGluQnVmID0gMDsKLSAgcHJvdGVjdGVkIGludCAgICB0YWJTaXplID0gODsKLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgaW5wdXRTdHJlYW0gPSBkc3RyZWFtOwotICAgIGxpbmUgPSBzdGFydGxpbmU7Ci0gICAgY29sdW1uID0gc3RhcnRjb2x1bW4gLSAxOwotCi0gICAgYXZhaWxhYmxlID0gYnVmc2l6ZSA9IGJ1ZmZlcnNpemU7Ci0gICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgYnVmbGluZSA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgYnVmY29sdW1uID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIHRoaXMoZHN0cmVhbSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlQ2hhclN0cmVhbShqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIHRoaXMoKGVuY29kaW5nID09IG51bGwpID8gbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0sIGVuY29kaW5nKSwKLSAgICAgICAgIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIGJ1ZmZlcnNpemUpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgdGhpcyhuZXcgamF2YS5pby5JbnB1dFN0cmVhbVJlYWRlcihkc3RyZWFtKSwgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwKLSAgICAgICAgIGJ1ZmZlcnNpemUpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbikKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uCi0gIHsKLSAgICB0aGlzKGRzdHJlYW0sIGVuY29kaW5nLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgaW50IHN0YXJ0bGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyBTaW1wbGVDaGFyU3RyZWFtKGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nKQotICAgICAgICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIHRoaXMoZHN0cmVhbSwgZW5jb2RpbmcsIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFNpbXBsZUNoYXJTdHJlYW0oamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtKQotICB7Ci0gICAgdGhpcyhkc3RyZWFtLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHNldFRhYlNpemUoaW50IGkpCi0gIHsKLSAgICB0YWJTaXplID0gaTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgZ2V0VGFiU2l6ZShpbnQgaSkKLSAgewotICAgIHJldHVybiB0YWJTaXplOwotICB9Ci0KLQotICBwcm90ZWN0ZWQgdm9pZCBFeHBhbmRCdWZmKGJvb2xlYW4gd3JhcEFyb3VuZCkKLSAgewotICAgIGNoYXJbXSBuZXdidWZmZXIgPSBuZXcgY2hhcltidWZzaXplICsgMjA0OF07Ci0gICAgaW50W10gIG5ld2J1ZmxpbmUgPSBuZXcgaW50W2J1ZnNpemUgKyAyMDQ4XTsKLSAgICBpbnRbXSAgbmV3YnVmY29sdW1uID0gbmV3IGludFtidWZzaXplICsgMjA0OF07Ci0KLSAgICB0cnkKLSAgICB7Ci0KLSAgICAgIGlmICh3cmFwQXJvdW5kKQotICAgICAgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgdG9rZW5CZWdpbiwgbmV3YnVmZmVyLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIG5ld2J1ZmZlciwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sIGJ1ZnBvcyk7Ci0gICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIDAsIG5ld2J1ZmxpbmUsIGJ1ZnNpemUgLSB0b2tlbkJlZ2luLCBidWZwb3MpOwotICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZjb2x1bW4sIDAsIG5ld2J1ZmNvbHVtbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmcG9zKTsKLSAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyArPSAoYnVmc2l6ZSAtIHRva2VuQmVnaW4pKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHRva2VuQmVnaW4sIG5ld2J1ZmZlciwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBidWZzaXplIC0gdG9rZW5CZWdpbik7Ci0gICAgICAgIGJ1ZmZlciA9IG5ld2J1ZmZlcjsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmxpbmUsIHRva2VuQmVnaW4sIG5ld2J1ZmxpbmUsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgYnVmc2l6ZSAtIHRva2VuQmVnaW4pOwotICAgICAgICBidWZsaW5lID0gbmV3YnVmbGluZTsKLQotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmNvbHVtbiwgdG9rZW5CZWdpbiwgbmV3YnVmY29sdW1uLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZnNpemUgLSB0b2tlbkJlZ2luKTsKLSAgICAgICAgYnVmY29sdW1uID0gbmV3YnVmY29sdW1uOwotCi0gICAgICAgIG1heE5leHRDaGFySW5kID0gKGJ1ZnBvcyAtPSB0b2tlbkJlZ2luKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgIHsKLSAgICAgIHRocm93IG5ldyBFcnJvcih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgYnVmc2l6ZSArPSAyMDQ4OwotICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgdG9rZW5CZWdpbiA9IDA7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBGaWxsQnVmZigpIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uCi0gIHsKLQotICAgIGlmIChtYXhOZXh0Q2hhckluZCA9PSBhdmFpbGFibGUpCi0gICAgewotCi0gICAgICBpZiAoYXZhaWxhYmxlID09IGJ1ZnNpemUpCi0gICAgICB7Ci0KLSAgICAgICAgaWYgKHRva2VuQmVnaW4gPiAyMDQ4KQotICAgICAgICB7Ci0gICAgICAgICAgYnVmcG9zID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgICAgICAgIGF2YWlsYWJsZSA9IHRva2VuQmVnaW47Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZSBpZiAodG9rZW5CZWdpbiA8IDApCi0gICAgICAgIHsKLSAgICAgICAgICBidWZwb3MgPSBtYXhOZXh0Q2hhckluZCA9IDA7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgRXhwYW5kQnVmZihmYWxzZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGF2YWlsYWJsZSA+IHRva2VuQmVnaW4pCi0gICAgICB7Ci0gICAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemU7Ci0gICAgICB9Ci0gICAgICBlbHNlIGlmICgodG9rZW5CZWdpbiAtIGF2YWlsYWJsZSkgPCAyMDQ4KQotICAgICAgewotICAgICAgICBFeHBhbmRCdWZmKHRydWUpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBhdmFpbGFibGUgPSB0b2tlbkJlZ2luOwotICAgICAgfQotICAgIH0KLQotICAgIGludCBpOwotCi0gICAgdHJ5Ci0gICAgewotCi0gICAgICBpZiAoKGkgPSBpbnB1dFN0cmVhbS5yZWFkKGJ1ZmZlciwgbWF4TmV4dENoYXJJbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXZhaWxhYmxlIC0gbWF4TmV4dENoYXJJbmQpKSA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgaW5wdXRTdHJlYW0uY2xvc2UoKTsKLSAgICAgICAgdGhyb3cgbmV3IGphdmEuaW8uSU9FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgbWF4TmV4dENoYXJJbmQgKz0gaTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC0tYnVmcG9zOwotICAgICAgYmFja3VwKDApOwotCi0gICAgICBpZiAodG9rZW5CZWdpbiA9PSAtMSkKLSAgICAgIHsKLSAgICAgICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLSAgICAgIH0KLQotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgY2hhciBCZWdpblRva2VuKCkgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24KLSAgewotICAgIHRva2VuQmVnaW4gPSAtMTsKLQotICAgIGNoYXIgYyA9IHJlYWRDaGFyKCk7Ci0gICAgdG9rZW5CZWdpbiA9IGJ1ZnBvczsKLQotICAgIHJldHVybiBjOwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgVXBkYXRlTGluZUNvbHVtbihjaGFyIGMpCi0gIHsKLSAgICBjb2x1bW4rKzsKLQotICAgIGlmIChwcmV2Q2hhcklzTEYpCi0gICAgewotICAgICAgcHJldkNoYXJJc0xGID0gZmFsc2U7Ci0gICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAocHJldkNoYXJJc0NSKQotICAgIHsKLSAgICAgIHByZXZDaGFySXNDUiA9IGZhbHNlOwotCi0gICAgICBpZiAoYyA9PSAnXG4nKQotICAgICAgewotICAgICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBsaW5lICs9IChjb2x1bW4gPSAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGMpCi0gICAgewotCi0gICAgY2FzZSAnXHInOgotICAgIHsKLSAgICAgIHByZXZDaGFySXNDUiA9IHRydWU7Ci0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgJ1xuJzoKLSAgICB7Ci0gICAgICBwcmV2Q2hhcklzTEYgPSB0cnVlOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlICdcdCc6Ci0gICAgewotICAgICAgY29sdW1uLS07Ci0gICAgICBjb2x1bW4gKz0gKHRhYlNpemUgLSAoY29sdW1uICUgdGFiU2l6ZSkpOwotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICB9Ci0KLSAgICBidWZsaW5lW2J1ZnBvc10gPSBsaW5lOwotICAgIGJ1ZmNvbHVtbltidWZwb3NdID0gY29sdW1uOwotICB9Ci0KLSAgcHVibGljIGNoYXIgcmVhZENoYXIoKSB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbgotICB7Ci0KLSAgICBpZiAoaW5CdWYgPiAwKQotICAgIHsKLSAgICAgIC0taW5CdWY7Ci0KLSAgICAgIGlmICgrK2J1ZnBvcyA9PSBidWZzaXplKQotICAgICAgewotICAgICAgICBidWZwb3MgPSAwOwotICAgICAgfQotCi0gICAgICByZXR1cm4gYnVmZmVyW2J1ZnBvc107Ci0gICAgfQotCi0gICAgaWYgKCsrYnVmcG9zID49IG1heE5leHRDaGFySW5kKQotICAgIHsKLSAgICAgIEZpbGxCdWZmKCk7Ci0gICAgfQotCi0gICAgY2hhciBjID0gYnVmZmVyW2J1ZnBvc107Ci0KLSAgICBVcGRhdGVMaW5lQ29sdW1uKGMpOwotCi0gICAgcmV0dXJuIChjKTsKLSAgfQotCi0gIC8qKgotICAgKiBAZGVwcmVjYXRlZAotICAgKiBAc2VlICNnZXRFbmRDb2x1bW4KLSAgICovCi0KLSAgcHVibGljIGludCBnZXRDb2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmNvbHVtbltidWZwb3NdOwotICB9Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkCi0gICAqIEBzZWUgI2dldEVuZExpbmUKLSAgICovCi0KLSAgcHVibGljIGludCBnZXRMaW5lKCkKLSAgewotICAgIHJldHVybiBidWZsaW5lW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZENvbHVtbigpCi0gIHsKLSAgICByZXR1cm4gYnVmY29sdW1uW2J1ZnBvc107Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldEVuZExpbmUoKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmxpbmVbYnVmcG9zXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5Db2x1bW4oKQotICB7Ci0gICAgcmV0dXJuIGJ1ZmNvbHVtblt0b2tlbkJlZ2luXTsKLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0QmVnaW5MaW5lKCkKLSAgewotICAgIHJldHVybiBidWZsaW5lW3Rva2VuQmVnaW5dOwotICB9Ci0KLSAgcHVibGljIHZvaWQgYmFja3VwKGludCBhbW91bnQpCi0gIHsKLQotICAgIGluQnVmICs9IGFtb3VudDsKLQotICAgIGlmICgoYnVmcG9zIC09IGFtb3VudCkgPCAwKQotICAgIHsKLSAgICAgIGJ1ZnBvcyArPSBidWZzaXplOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4sCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYnVmZmVyc2l6ZSkKLSAgewotICAgIGlucHV0U3RyZWFtID0gZHN0cmVhbTsKLSAgICBsaW5lID0gc3RhcnRsaW5lOwotICAgIGNvbHVtbiA9IHN0YXJ0Y29sdW1uIC0gMTsKLQotICAgIGlmICgoYnVmZmVyID09IG51bGwpIHx8IChidWZmZXJzaXplICE9IGJ1ZmZlci5sZW5ndGgpKQotICAgIHsKLSAgICAgIGF2YWlsYWJsZSA9IGJ1ZnNpemUgPSBidWZmZXJzaXplOwotICAgICAgYnVmZmVyID0gbmV3IGNoYXJbYnVmZmVyc2l6ZV07Ci0gICAgICBidWZsaW5lID0gbmV3IGludFtidWZmZXJzaXplXTsKLSAgICAgIGJ1ZmNvbHVtbiA9IG5ldyBpbnRbYnVmZmVyc2l6ZV07Ci0gICAgfQotCi0gICAgcHJldkNoYXJJc0xGID0gcHJldkNoYXJJc0NSID0gZmFsc2U7Ci0gICAgdG9rZW5CZWdpbiA9IGluQnVmID0gbWF4TmV4dENoYXJJbmQgPSAwOwotICAgIGJ1ZnBvcyA9IC0xOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uUmVhZGVyIGRzdHJlYW0sIGludCBzdGFydGxpbmUsIGludCBzdGFydGNvbHVtbikKLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLlJlYWRlciBkc3RyZWFtKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIDEsIDEsIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgUmVJbml0KGphdmEuaW8uSW5wdXRTdHJlYW0gZHN0cmVhbSwgU3RyaW5nIGVuY29kaW5nLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0bGluZSwgaW50IHN0YXJ0Y29sdW1uLCBpbnQgYnVmZmVyc2l6ZSkKLSAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgUmVJbml0KChlbmNvZGluZyA9PSBudWxsKQotICAgICAgICAgICA/IG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pCi0gICAgICAgICAgIDogbmV3IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXIoZHN0cmVhbSwgZW5jb2RpbmcpLCBzdGFydGxpbmUsCi0gICAgICAgICAgIHN0YXJ0Y29sdW1uLCBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIGludCBzdGFydGxpbmUsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRjb2x1bW4sIGludCBidWZmZXJzaXplKQotICB7Ci0gICAgUmVJbml0KG5ldyBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyKGRzdHJlYW0pLCBzdGFydGxpbmUsIHN0YXJ0Y29sdW1uLAotICAgICAgICAgICBidWZmZXJzaXplKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0sIFN0cmluZyBlbmNvZGluZykKLSAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbgotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIGVuY29kaW5nLCAxLCAxLCA0MDk2KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIFJlSW5pdChqYXZhLmlvLklucHV0U3RyZWFtIGRzdHJlYW0pCi0gIHsKLSAgICBSZUluaXQoZHN0cmVhbSwgMSwgMSwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBTdHJpbmcgZW5jb2RpbmcsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRsaW5lLCBpbnQgc3RhcnRjb2x1bW4pCi0gICAgICAgICAgICAgIHRocm93cyBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24KLSAgewotICAgIFJlSW5pdChkc3RyZWFtLCBlbmNvZGluZywgc3RhcnRsaW5lLCBzdGFydGNvbHVtbiwgNDA5Nik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBSZUluaXQoamF2YS5pby5JbnB1dFN0cmVhbSBkc3RyZWFtLCBpbnQgc3RhcnRsaW5lLAotICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0Y29sdW1uKQotICB7Ci0gICAgUmVJbml0KGRzdHJlYW0sIHN0YXJ0bGluZSwgc3RhcnRjb2x1bW4sIDQwOTYpOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBHZXRJbWFnZSgpCi0gIHsKLQotICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhidWZmZXIsIHRva2VuQmVnaW4sIGJ1ZnBvcyAtIHRva2VuQmVnaW4gKyAxKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHJldHVybiBuZXcgU3RyaW5nKGJ1ZmZlciwgdG9rZW5CZWdpbiwgYnVmc2l6ZSAtIHRva2VuQmVnaW4pICsKLSAgICAgICAgbmV3IFN0cmluZyhidWZmZXIsIDAsIGJ1ZnBvcyArIDEpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBjaGFyW10gR2V0U3VmZml4KGludCBsZW4pCi0gIHsKLSAgICBjaGFyW10gcmV0ID0gbmV3IGNoYXJbbGVuXTsKLQotICAgIGlmICgoYnVmcG9zICsgMSkgPj0gbGVuKQotICAgIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBidWZwb3MgLSBsZW4gKyAxLCByZXQsIDAsIGxlbik7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmc2l6ZSAtIChsZW4gLSBidWZwb3MgLSAxKSwgcmV0LCAwLAotICAgICAgICAgICAgICAgICAgICAgICBsZW4gLSBidWZwb3MgLSAxKTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCAwLCByZXQsIGxlbiAtIGJ1ZnBvcyAtIDEsIGJ1ZnBvcyArIDEpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBEb25lKCkKLSAgewotICAgIGJ1ZmZlciA9IG51bGw7Ci0gICAgYnVmbGluZSA9IG51bGw7Ci0gICAgYnVmY29sdW1uID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBNZXRob2QgdG8gYWRqdXN0IGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIGZvciB0aGUgc3RhcnQgb2YgYSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGFkanVzdEJlZ2luTGluZUNvbHVtbihpbnQgbmV3TGluZSwgaW50IG5ld0NvbCkKLSAgewotICAgIGludCBzdGFydCA9IHRva2VuQmVnaW47Ci0gICAgaW50IGxlbjsKLQotICAgIGlmIChidWZwb3MgPj0gdG9rZW5CZWdpbikKLSAgICB7Ci0gICAgICBsZW4gPSBidWZwb3MgLSB0b2tlbkJlZ2luICsgaW5CdWYgKyAxOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgbGVuID0gYnVmc2l6ZSAtIHRva2VuQmVnaW4gKyBidWZwb3MgKyAxICsgaW5CdWY7Ci0gICAgfQotCi0gICAgaW50IGkgPSAwLCBqID0gMCwgayA9IDA7Ci0gICAgaW50IG5leHRDb2xEaWZmID0gMCwgY29sdW1uRGlmZiA9IDA7Ci0KLSAgICB3aGlsZSAoKGkgPCBsZW4pICYmCi0gICAgICAgIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdID09IGJ1ZmxpbmVbayA9ICsrc3RhcnQgJSBidWZzaXplXSkpCi0gICAgewotICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmU7Ci0gICAgICBuZXh0Q29sRGlmZiA9IGNvbHVtbkRpZmYgKyBidWZjb2x1bW5ba10gLSBidWZjb2x1bW5bal07Ci0gICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotICAgICAgY29sdW1uRGlmZiA9IG5leHRDb2xEaWZmOwotICAgICAgaSsrOwotICAgIH0KLQotICAgIGlmIChpIDwgbGVuKQotICAgIHsKLSAgICAgIGJ1ZmxpbmVbal0gPSBuZXdMaW5lKys7Ci0gICAgICBidWZjb2x1bW5bal0gPSBuZXdDb2wgKyBjb2x1bW5EaWZmOwotCi0gICAgICB3aGlsZSAoaSsrIDwgbGVuKQotICAgICAgewotCi0gICAgICAgIGlmIChidWZsaW5lW2ogPSBzdGFydCAlIGJ1ZnNpemVdICE9IGJ1ZmxpbmVbKytzdGFydCAlIGJ1ZnNpemVdKQotICAgICAgICB7Ci0gICAgICAgICAgYnVmbGluZVtqXSA9IG5ld0xpbmUrKzsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBidWZsaW5lW2pdID0gbmV3TGluZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGxpbmUgPSBidWZsaW5lW2pdOwotICAgIGNvbHVtbiA9IGJ1ZmNvbHVtbltqXTsKLSAgfQotCi19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9TaW1wbGVOb2RlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9TaW1wbGVOb2RlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5Y2VlOTMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvU2ltcGxlTm9kZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLS8qIEdlbmVyYXRlZCBCeTpKSlRyZWU6IERvIG5vdCBlZGl0IHRoaXMgbGluZS4gU2ltcGxlTm9kZS5qYXZhICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLQotcHVibGljIGNsYXNzIFNpbXBsZU5vZGUgaW1wbGVtZW50cyBOb2RlCi17Ci0gIHByb3RlY3RlZCBOb2RlICAgICAgIHBhcmVudDsKLSAgcHJvdGVjdGVkIE5vZGVbXSAgICAgY2hpbGRyZW47Ci0gIHByb3RlY3RlZCBpbnQgICAgICAgIGlkOwotICBwcm90ZWN0ZWQgSlNQYXJzZXIyMCBwYXJzZXI7Ci0KLSAgcHJvdGVjdGVkIFRva2VuICAgICAgZmlyc3Q7Ci0gIHByb3RlY3RlZCBUb2tlbiAgICAgIGxhc3Q7Ci0KLSAgcHVibGljIFNpbXBsZU5vZGUoaW50IGkpCi0gIHsKLSAgICBpZCA9IGk7Ci0gIH0KLQotICBwdWJsaWMgU2ltcGxlTm9kZShKU1BhcnNlcjIwIHAsIGludCBpKQotICB7Ci0gICAgdGhpcyhpKTsKLSAgICBwYXJzZXIgPSBwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgamp0T3BlbigpCi0gIHsKLSAgICBmaXJzdCA9IHBhcnNlci5nZXRUb2tlbigxKTsgLy8gbmV3Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBqanRDbG9zZSgpCi0gIHsKLSAgICBsYXN0ID0gcGFyc2VyLmdldFRva2VuKDApOyAvLyBuZXcKLSAgfQotCi0gIHB1YmxpYyBUb2tlbiBnZXRGaXJzdFRva2VuKCkgeyByZXR1cm4gZmlyc3Q7IH0gLy8gbmV3Ci0gIHB1YmxpYyBUb2tlbiBnZXRMYXN0VG9rZW4oKSB7IHJldHVybiBsYXN0OyB9ICAgLy8gbmV3Ci0KLSAgcHVibGljIHZvaWQgamp0U2V0UGFyZW50KE5vZGUgbikKLSAgewotICAgIHBhcmVudCA9IG47Ci0gIH0KLQotICBwdWJsaWMgTm9kZSBqanRHZXRQYXJlbnQoKQotICB7Ci0gICAgcmV0dXJuIHBhcmVudDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGpqdEFkZENoaWxkKE5vZGUgbiwgaW50IGkpCi0gIHsKLQotICAgIGlmIChjaGlsZHJlbiA9PSBudWxsKQotICAgIHsKLSAgICAgIGNoaWxkcmVuID0gbmV3IE5vZGVbaSArIDFdOwotICAgIH0KLSAgICBlbHNlIGlmIChpID49IGNoaWxkcmVuLmxlbmd0aCkKLSAgICB7Ci0gICAgICBOb2RlW10gYyA9IG5ldyBOb2RlW2kgKyAxXTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2hpbGRyZW4sIDAsIGMsIDAsIGNoaWxkcmVuLmxlbmd0aCk7Ci0gICAgICBjaGlsZHJlbiA9IGM7Ci0gICAgfQotCi0gICAgY2hpbGRyZW5baV0gPSBuOwotICB9Ci0KLSAgcHVibGljIE5vZGUgamp0R2V0Q2hpbGQoaW50IGkpCi0gIHsKLSAgICByZXR1cm4gY2hpbGRyZW5baV07Ci0gIH0KLQotICBwdWJsaWMgaW50IGpqdEdldE51bUNoaWxkcmVuKCkKLSAgewotICAgIHJldHVybiAoY2hpbGRyZW4gPT0gbnVsbCkgPyAwIDogY2hpbGRyZW4ubGVuZ3RoOwotICB9Ci0KLSAgLyoqIEFjY2VwdCB0aGUgdmlzaXRvci4gKiovCi0gIHB1YmxpYyBPYmplY3Qgamp0QWNjZXB0KEpTUGFyc2VyMjBWaXNpdG9yIHZpc2l0b3IsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgcmV0dXJuIHZpc2l0b3IudmlzaXQodGhpcywgZGF0YSk7Ci0gIH0KLQotICAvKiogQWNjZXB0IHRoZSB2aXNpdG9yLiAqKi8KLSAgcHVibGljIE9iamVjdCBjaGlsZHJlbkFjY2VwdChKU1BhcnNlcjIwVmlzaXRvciB2aXNpdG9yLCBPYmplY3QgZGF0YSkKLSAgewotCi0gICAgaWYgKGNoaWxkcmVuICE9IG51bGwpCi0gICAgewotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNoaWxkcmVuLmxlbmd0aDsgKytpKQotICAgICAgewotICAgICAgICBjaGlsZHJlbltpXS5qanRBY2NlcHQodmlzaXRvciwgZGF0YSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICAvKiBZb3UgY2FuIG92ZXJyaWRlIHRoZXNlIHR3byBtZXRob2RzIGluIHN1YmNsYXNzZXMgb2YgU2ltcGxlTm9kZSB0bwotICAgICBjdXN0b21pemUgdGhlIHdheSB0aGUgbm9kZSBhcHBlYXJzIHdoZW4gdGhlIHRyZWUgaXMgZHVtcGVkLiAgSWYKLSAgICAgeW91ciBvdXRwdXQgdXNlcyBtb3JlIHRoYW4gb25lIGxpbmUgeW91IHNob3VsZCBvdmVycmlkZQotICAgICB0b1N0cmluZyhTdHJpbmcpLCBvdGhlcndpc2Ugb3ZlcnJpZGluZyB0b1N0cmluZygpIGlzIHByb2JhYmx5IGFsbAotICAgICB5b3UgbmVlZCB0byBkby4gKi8KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgIHJldHVybiBKU1BhcnNlcjIwVHJlZUNvbnN0YW50cy5qanROb2RlTmFtZVtpZF07Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICByZXR1cm4gcHJlZml4ICsgdG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qIE92ZXJyaWRlIHRoaXMgbWV0aG9kIGlmIHlvdSB3YW50IHRvIGN1c3RvbWl6ZSBob3cgdGhlIG5vZGUgZHVtcHMKLSAgICAgb3V0IGl0cyBjaGlsZHJlbi4gKi8KLQotICBwdWJsaWMgdm9pZCBkdW1wKFN0cmluZyBwcmVmaXgpCi0gIHsKLSAgICBTeXN0ZW0ub3V0LnByaW50bG4odG9TdHJpbmcocHJlZml4KSk7Ci0KLSAgICBpZiAoY2hpbGRyZW4gIT0gbnVsbCkKLSAgICB7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2hpbGRyZW4ubGVuZ3RoOyArK2kpCi0gICAgICB7Ci0gICAgICAgIFNpbXBsZU5vZGUgbiA9IChTaW1wbGVOb2RlKSBjaGlsZHJlbltpXTsKLQotICAgICAgICBpZiAobiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbi5kdW1wKHByZWZpeCArICIgIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9Ub2tlbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIzODg3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXI7Ci0KLS8qKgotICogRGVzY3JpYmVzIHRoZSBpbnB1dCB0b2tlbiBzdHJlYW0uCi0gKi8KLQotcHVibGljIGNsYXNzIFRva2VuCi17Ci0gIHB1YmxpYyBib29sZWFuIGhhc1ByaW50ZWQgPSBmYWxzZTsKLSAgLyoqCi0gICAqIEFuIGludGVnZXIgdGhhdCBkZXNjcmliZXMgdGhlIGtpbmQgb2YgdGhpcyB0b2tlbi4gIFRoaXMgbnVtYmVyaW5nCi0gICAqIHN5c3RlbSBpcyBkZXRlcm1pbmVkIGJ5IEphdmFDQ1BhcnNlciwgYW5kIGEgdGFibGUgb2YgdGhlc2UgbnVtYmVycyBpcwotICAgKiBzdG9yZWQgaW4gdGhlIGZpbGUgLi4uQ29uc3RhbnRzLmphdmEuCi0gICAqLwotICBwdWJsaWMgaW50IGtpbmQ7Ci0KLSAgLyoqCi0gICAqIGJlZ2luTGluZSBhbmQgYmVnaW5Db2x1bW4gZGVzY3JpYmUgdGhlIHBvc2l0aW9uIG9mIHRoZSBmaXJzdCBjaGFyYWN0ZXIKLSAgICogb2YgdGhpcyB0b2tlbjsgZW5kTGluZSBhbmQgZW5kQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUKLSAgICogbGFzdCBjaGFyYWN0ZXIgb2YgdGhpcyB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBpbnQgYmVnaW5MaW5lLCBiZWdpbkNvbHVtbiwgZW5kTGluZSwgZW5kQ29sdW1uOwotCi0gIC8qKgotICAgKiBUaGUgc3RyaW5nIGltYWdlIG9mIHRoZSB0b2tlbi4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgaW1hZ2U7Ci0KLSAgLyoqCi0gICAqIEEgcmVmZXJlbmNlIHRvIHRoZSBuZXh0IHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbiBmcm9tIHRoZSBpbnB1dAotICAgKiBzdHJlYW0uICBJZiB0aGlzIGlzIHRoZSBsYXN0IHRva2VuIGZyb20gdGhlIGlucHV0IHN0cmVhbSwgb3IgaWYgdGhlCi0gICAqIHRva2VuIG1hbmFnZXIgaGFzIG5vdCByZWFkIHRva2VucyBiZXlvbmQgdGhpcyBvbmUsIHRoaXMgZmllbGQgaXMKLSAgICogc2V0IHRvIG51bGwuICBUaGlzIGlzIHRydWUgb25seSBpZiB0aGlzIHRva2VuIGlzIGFsc28gYSByZWd1bGFyCi0gICAqIHRva2VuLiAgT3RoZXJ3aXNlLCBzZWUgYmVsb3cgZm9yIGEgZGVzY3JpcHRpb24gb2YgdGhlIGNvbnRlbnRzIG9mCi0gICAqIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gbmV4dDsKLQotICAvKioKLSAgICogVGhpcyBmaWVsZCBpcyB1c2VkIHRvIGFjY2VzcyBzcGVjaWFsIHRva2VucyB0aGF0IG9jY3VyIHByaW9yIHRvIHRoaXMKLSAgICogdG9rZW4sIGJ1dCBhZnRlciB0aGUgaW1tZWRpYXRlbHkgcHJlY2VkaW5nIHJlZ3VsYXIgKG5vbi1zcGVjaWFsKSB0b2tlbi4KLSAgICogSWYgdGhlcmUgYXJlIG5vIHN1Y2ggc3BlY2lhbCB0b2tlbnMsIHRoaXMgZmllbGQgaXMgc2V0IHRvIG51bGwuCi0gICAqIFdoZW4gdGhlcmUgYXJlIG1vcmUgdGhhbiBvbmUgc3VjaCBzcGVjaWFsIHRva2VuLCB0aGlzIGZpZWxkIHJlZmVycwotICAgKiB0byB0aGUgbGFzdCBvZiB0aGVzZSBzcGVjaWFsIHRva2Vucywgd2hpY2ggaW4gdHVybiByZWZlcnMgdG8gdGhlIG5leHQKLSAgICogcHJldmlvdXMgc3BlY2lhbCB0b2tlbiB0aHJvdWdoIGl0cyBzcGVjaWFsVG9rZW4gZmllbGQsIGFuZCBzbyBvbgotICAgKiB1bnRpbCB0aGUgZmlyc3Qgc3BlY2lhbCB0b2tlbiAod2hvc2Ugc3BlY2lhbFRva2VuIGZpZWxkIGlzIG51bGwpLgotICAgKiBUaGUgbmV4dCBmaWVsZHMgb2Ygc3BlY2lhbCB0b2tlbnMgcmVmZXIgdG8gb3RoZXIgc3BlY2lhbCB0b2tlbnMgdGhhdAotICAgKiBpbW1lZGlhdGVseSBmb2xsb3cgaXQgKHdpdGhvdXQgYW4gaW50ZXJ2ZW5pbmcgcmVndWxhciB0b2tlbikuICBJZiB0aGVyZQotICAgKiBpcyBubyBzdWNoIHRva2VuLCB0aGlzIGZpZWxkIGlzIG51bGwuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gc3BlY2lhbFRva2VuOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBpbWFnZS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKQotICB7Ci0gICAgcmV0dXJuIGltYWdlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgVG9rZW4gb2JqZWN0LCBieSBkZWZhdWx0LiBIb3dldmVyLCBpZiB5b3Ugd2FudCwgeW91Ci0gICAqIGNhbiBjcmVhdGUgYW5kIHJldHVybiBzdWJjbGFzcyBvYmplY3RzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBvZktpbmQuCi0gICAqIFNpbXBseSBhZGQgdGhlIGNhc2VzIHRvIHRoZSBzd2l0Y2ggZm9yIGFsbCB0aG9zZSBzcGVjaWFsIGNhc2VzLgotICAgKiBGb3IgZXhhbXBsZSwgaWYgeW91IGhhdmUgYSBzdWJjbGFzcyBvZiBUb2tlbiBjYWxsZWQgSURUb2tlbiB0aGF0Ci0gICAqIHlvdSB3YW50IHRvIGNyZWF0ZSBpZiBvZktpbmQgaXMgSUQsIHNpbWxweSBhZGQgc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICBjYXNlIE15UGFyc2VyQ29uc3RhbnRzLklEIDogcmV0dXJuIG5ldyBJRFRva2VuKCk7Ci0gICAqCi0gICAqIHRvIHRoZSBmb2xsb3dpbmcgc3dpdGNoIHN0YXRlbWVudC4gVGhlbiB5b3UgY2FuIGNhc3QgbWF0Y2hlZFRva2VuCi0gICAqIHZhcmlhYmxlIHRvIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGFuZCB1c2UgaXQgaW4geW91ciBsZXhpY2FsIGFjdGlvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFRva2VuIG5ld1Rva2VuKGludCBvZktpbmQpCi0gIHsKLQotICAgIHN3aXRjaCAob2ZLaW5kKQotICAgIHsKLQotICAgIGRlZmF1bHQ6Ci0gICAgewotICAgICAgcmV0dXJuIG5ldyBUb2tlbigpOwotICAgIH0KLSAgICB9Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvVG9rZW5NZ3JFcnJvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NDQzMjk0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdDIwcGFyc2VyL1Rva2VuTWdyRXJyb3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIxMSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0vKiBHZW5lcmF0ZWQgQnk6SmF2YUNDOiBEbyBub3QgZWRpdCB0aGlzIGxpbmUuIFRva2VuTWdyRXJyb3IuamF2YSBWZXJzaW9uIDMuMCAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOwotCi1wdWJsaWMgY2xhc3MgVG9rZW5NZ3JFcnJvciBleHRlbmRzIEVycm9yCi17Ci0gIC8qCi0gICAqIE9yZGluYWxzIGZvciB2YXJpb3VzIHJlYXNvbnMgd2h5IGFuIEVycm9yIG9mIHRoaXMgdHlwZSBjYW4gYmUgdGhyb3duLgotICAgKi8KLQotICAvKioKLSAgICogTGV4aWNhbCBlcnJvciBvY2N1cmVkLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBMRVhJQ0FMX0VSUk9SID0gMDsKLQotICAvKioKLSAgICogQW4gYXR0ZW1wdCB3YXNzIG1hZGUgdG8gY3JlYXRlIGEgc2Vjb25kIGluc3RhbmNlIG9mIGEgc3RhdGljIHRva2VuIG1hbmFnZXIuCi0gICAqLwotICBzdGF0aWMgZmluYWwgaW50IFNUQVRJQ19MRVhFUl9FUlJPUiA9IDE7Ci0KLSAgLyoqCi0gICAqIFRyaWVkIHRvIGNoYW5nZSB0byBhbiBpbnZhbGlkIGxleGljYWwgc3RhdGUuCi0gICAqLwotICBzdGF0aWMgZmluYWwgaW50IElOVkFMSURfTEVYSUNBTF9TVEFURSA9IDI7Ci0KLSAgLyoqCi0gICAqIERldGVjdGVkIChhbmQgYmFpbGVkIG91dCBvZikgYW4gaW5maW5pdGUgbG9vcCBpbiB0aGUgdG9rZW4gbWFuYWdlci4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTE9PUF9ERVRFQ1RFRCA9IDM7Ci0KLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGUgcmVhc29uIHdoeSB0aGUgZXhjZXB0aW9uIGlzIHRocm93bi4gSXQgd2lsbCBoYXZlCi0gICAqIG9uZSBvZiB0aGUgYWJvdmUgNCB2YWx1ZXMuCi0gICAqLwotICBpbnQgZXJyb3JDb2RlOwotCi0gIC8qCi0gICAqIENvbnN0cnVjdG9ycyBvZiB2YXJpb3VzIGZsYXZvcnMgZm9sbG93LgotICAgKi8KLQotICBwdWJsaWMgVG9rZW5NZ3JFcnJvcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbk1nckVycm9yKFN0cmluZyBtZXNzYWdlLCBpbnQgcmVhc29uKQotICB7Ci0gICAgc3VwZXIobWVzc2FnZSk7Ci0gICAgZXJyb3JDb2RlID0gcmVhc29uOwotICB9Ci0KLSAgcHVibGljIFRva2VuTWdyRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsIGludCBlcnJvckxpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBlcnJvckNvbHVtbiwgU3RyaW5nIGVycm9yQWZ0ZXIsIGNoYXIgY3VyQ2hhciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHJlYXNvbikKLSAgewotICAgIHRoaXMoTGV4aWNhbEVycm9yKEVPRlNlZW4sIGxleFN0YXRlLCBlcnJvckxpbmUsIGVycm9yQ29sdW1uLCBlcnJvckFmdGVyLAotICAgICAgICAgICAgICAgICAgICAgIGN1ckNoYXIpLCByZWFzb24pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2VzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgYnkgdGhlaXIgZXNwYWNlZCAob3IgdW5pY29kZSBlc2NhcGVkKQotICAgKiBlcXVpdmFsZW50cyBpbiB0aGUgZ2l2ZW4gc3RyaW5nCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIFN0cmluZyBhZGRFc2NhcGVzKFN0cmluZyBzdHIpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgcmV0dmFsID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgIGNoYXIgICAgICAgICBjaDsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyLmxlbmd0aCgpOyBpKyspCi0gICAgewotCi0gICAgICBzd2l0Y2ggKHN0ci5jaGFyQXQoaSkpCi0gICAgICB7Ci0KLSAgICAgIGNhc2UgMDoKLSAgICAgIHsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxiIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1x0JzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx0Iik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xuJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxuIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xmJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxmIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1xyJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxyIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgJ1wiJzoKLSAgICAgIHsKLSAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFxcIiIpOwotCi0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICBjYXNlICdcJyc6Ci0gICAgICB7Ci0gICAgICAgIHJldHZhbC5hcHBlbmQoIlxcXCciKTsKLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXFwnOgotICAgICAgewotICAgICAgICByZXR2YWwuYXBwZW5kKCJcXFxcIik7Ci0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6Ci0gICAgICB7Ci0KLSAgICAgICAgaWYgKCgoY2ggPSBzdHIuY2hhckF0KGkpKSA8IDB4MjApIHx8IChjaCA+IDB4N2UpKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHMgPSAiMDAwMCIgKyBJbnRlZ2VyLnRvU3RyaW5nKGNoLCAxNik7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZCgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgcmV0dmFsLmFwcGVuZChjaCk7Ci0gICAgICAgIH0KLQotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsLnRvU3RyaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGRldGFpbGVkIG1lc3NhZ2UgZm9yIHRoZSBFcnJvciB3aGVuIGl0IGlzIHRocm93biBieSB0aGUKLSAgICogdG9rZW4gbWFuYWdlciB0byBpbmRpY2F0ZSBhIGxleGljYWwgZXJyb3IuCi0gICAqIFBhcmFtZXRlcnMgOgotICAgKiAgICBFT0ZTZWVuICAgICA6IGluZGljYXRlcyBpZiBFT0YgY2F1c2VkIHRoZSBsZXhpY2wgZXJyb3IKLSAgICogICAgY3VyTGV4U3RhdGUgOiBsZXhpY2FsIHN0YXRlIGluIHdoaWNoIHRoaXMgZXJyb3Igb2NjdXJlZAotICAgKiAgICBlcnJvckxpbmUgICA6IGxpbmUgbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICogICAgZXJyb3JDb2x1bW4gOiBjb2x1bW4gbnVtYmVyIHdoZW4gdGhlIGVycm9yIG9jY3VyZWQKLSAgICogICAgZXJyb3JBZnRlciAgOiBwcmVmaXggdGhhdCB3YXMgc2VlbiBiZWZvcmUgdGhpcyBlcnJvciBvY2N1cmVkCi0gICAqICAgIGN1cmNoYXIgICAgIDogdGhlIG9mZmVuZGluZyBjaGFyYWN0ZXIKLSAgICogTm90ZTogWW91IGNhbiBjdXN0b21pemUgdGhlIGxleGljYWwgZXJyb3IgbWVzc2FnZSBieSBtb2RpZnlpbmcgdGhpcyBtZXRob2QuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIFN0cmluZyBMZXhpY2FsRXJyb3IoYm9vbGVhbiBFT0ZTZWVuLCBpbnQgbGV4U3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3JMaW5lLCBpbnQgZXJyb3JDb2x1bW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZXJyb3JBZnRlciwgY2hhciBjdXJDaGFyKQotICB7Ci0gICAgcmV0dXJuICgiTGV4aWNhbCBlcnJvciBhdCBsaW5lICIgKyBlcnJvckxpbmUgKyAiLCBjb2x1bW4gIiArIGVycm9yQ29sdW1uICsKLSAgICAgICAgIi4gIEVuY291bnRlcmVkOiAiICsKLSAgICAgICAgKEVPRlNlZW4KLSAgICAgICAgICA/ICI8RU9GPiAiCi0gICAgICAgICAgOiAoKCJcIiIgKyBhZGRFc2NhcGVzKFN0cmluZy52YWx1ZU9mKGN1ckNoYXIpKSArICJcIiIpICsgIiAoIiArCi0gICAgICAgICAgICAoaW50KSBjdXJDaGFyICsgIiksICIpKSArICJhZnRlciA6IFwiIiArIGFkZEVzY2FwZXMoZXJyb3JBZnRlcikgKwotICAgICAgICAiXCIiKTsKLSAgfQotCi0gIC8qKgotICAgKiBZb3UgY2FuIGFsc28gbW9kaWZ5IHRoZSBib2R5IG9mIHRoaXMgbWV0aG9kIHRvIGN1c3RvbWl6ZSB5b3VyIGVycm9yIG1lc3NhZ2VzLgotICAgKiBGb3IgZXhhbXBsZSwgY2FzZXMgbGlrZSBMT09QX0RFVEVDVEVEIGFuZCBJTlZBTElEX0xFWElDQUxfU1RBVEUgYXJlIG5vdAotICAgKiBvZiBlbmQtdXNlcnMgY29uY2Vybiwgc28geW91IGNhbiByZXR1cm4gc29tZXRoaW5nIGxpa2UgOgotICAgKgotICAgKiAgICAgIkludGVybmFsIEVycm9yIDogUGxlYXNlIGZpbGUgYSBidWcgcmVwb3J0IC4uLi4gIgotICAgKgotICAgKiBmcm9tIHRoaXMgbWV0aG9kIGZvciBzdWNoIGNhc2VzIGluIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgeW91ciBwYXJzZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGdldE1lc3NhZ2UoKQotICB7Ci0gICAgcmV0dXJuIHN1cGVyLmdldE1lc3NhZ2UoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamogYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9qczIuMC5qagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkZDI0NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9qczIuMC5qagorKysgL2Rldi9udWxsCkBAIC0xLDQ4MzkgKzAsMCBAQAotLyoNCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQ0KLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUNCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24NCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQ0KLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlDQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UNCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLSAqIA0KLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjANCi0gKiANCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLA0KLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbg0KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkNCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlDQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMNCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuDQotICovDQotCi0vKkBiZ2VuKGpqdHJlZSkgR2VuZXJhdGVkIEJ5OkpKVHJlZTogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiAuXGpzMi4wLmpqICovDQotLypAZWdlbiovb3B0aW9ucyB7DQotICAgIFNUQVRJQz1mYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgDQotICAgIERFQlVHX1RPS0VOX01BTkFHRVI9ZmFsc2U7DQotICAgIERFQlVHX1BBUlNFUj1mYWxzZTsNCi19DQotDQotUEFSU0VSX0JFR0lOKEpTUGFyc2VyMjApDQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyOw0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOw0KLXB1YmxpYyBjbGFzcyBKU1BhcnNlcjIwLypAYmdlbihqanRyZWUpKi9pbXBsZW1lbnRzIEpTUGFyc2VyMjBUcmVlQ29uc3RhbnRzLypAZWdlbiovIA0KLXsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgcHJvdGVjdGVkIEpKVEpTUGFyc2VyMjBTdGF0ZSBqanRyZWUgPSBuZXcgSkpUSlNQYXJzZXIyMFN0YXRlKCk7DQotDQotLypAZWdlbiovDQotICAgIC8vDQotICAgIC8vIFRoaXMgaXMgdGhlIHJvb3Qgbm9kZSBmb3IgdGhlIHBhcnNlIHRyZWUgKHJvb3QgRE9NIG5vZGUsIHRyZWUgb2YgU2ltcGxlTm9kZShzKSkNCi0gICAgLy8NCi0gICAgcHJvdGVjdGVkIEFTVFByb2dyYW0gX2pqdFJvb3Q7DQotICAgIA0KLSAgICBwdWJsaWMgQVNUUHJvZ3JhbSBnZXRSb290Tm9kZSgpDQotICAgIHsNCi0gICAgCXJldHVybiBfamp0Um9vdDsNCi0gICAgfQ0KLSAgICANCi19DQotDQotUEFSU0VSX0VORChKU1BhcnNlcjIwKQ0KLQ0KLQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTEVYSUNBTCBSVUxFUyBTZWN0aW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTl9NR1JfREVDTFMgOg0KLXsNCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOw0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdJbnZhbGlkKCkNCi0gICAgew0KLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOw0KLSAgICB9DQotICAgIHB1YmxpYyB2b2lkIHNldFJlZ1ZhbGlkKCkNCi0gICAgew0KLSAgICAgICAgaXNSZWdWYWxpZCA9IHRydWU7DQotICAgIH0NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBXSElURSBTUEFDRSANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVNQRUNJQUxfVE9LRU4gOg0KLXsNCi0gICAgICAgIDxFT0w6ICAgKFsiXG4iLCJcciJdKSsgPg0KLSAgICB8ICAgPFdTOiAgICAoWyIgIiwiXHQiXSkrID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBDT01NRU5UUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLU1PUkUgOg0KLXsNCi0gICAgICAgICIvLyIgOiBJTl9TSU5HTEVfTElORV9DT01NRU5UDQotICAgIHwgICAiLyoiIDogSU5fTVVMVElfTElORV9DT01NRU5UDQotfQ0KLQ0KLTxJTl9TSU5HTEVfTElORV9DT01NRU5UPg0KLVNQRUNJQUxfVE9LRU4gOg0KLXsNCi0gICAgICAgIDwgU0lOR0xFX0xJTkVfQ09NTUVOVDogKH5bIlxuIiwiXHIiXSkqICgiXG4ifCJcciJ8IlxyXG4iKT8gPiAgOiBERUZBVUxUDQotfQ0KLQ0KLTxJTl9NVUxUSV9MSU5FX0NPTU1FTlQ+DQotU1BFQ0lBTF9UT0tFTiA6DQotew0KLSAgICAgICAgPE1VTFRJX0xJTkVfQ09NTUVOVDogIiovIiA+IDogREVGQVVMVA0KLX0NCi0NCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVCwgSU5fTVVMVElfTElORV9DT01NRU5UPg0KLU1PUkUgOg0KLXsNCi0gICAgICAgIDwgfltdID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBSRVNFUlZFRCBXT1JEUyBBTkQgTElURVJBTFMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IEFTOiAgICAgICAgICAgImFzIiAgICAgICAgID4NCi0gICAgfCAgIDwgQlJFQUs6ICAgICAgICAiYnJlYWsiICAgICAgPg0KLSAgICB8ICAgPCBDQVNFOiAgICAgICAgICJjYXNlIiAgICAgICA+DQotICAgIHwgICA8IENBVENIOiAgICAgICAgImNhdGNoIiAgICAgID4NCi0gICAgfCAgIDwgQ0xBU1M6ICAgICAgICAiY2xhc3MiICAgICAgPg0KLSAgICB8ICAgPCBDT05TVDogICAgICAgICJjb25zdCIgICAgICA+DQotICAgIHwgICA8IENPTlRJTlVFOiAgICAgImNvbnRpbnVlIiAgID4NCi0gICAgfCAgIDwgX0RFRkFVTFQ6ICAgICAiZGVmYXVsdCIgICAgPg0KLSAgICB8ICAgPCBERUxFVEU6ICAgICAgICJkZWxldGUiICAgICA+DQotICAgIHwgICA8IERPOiAgICAgICAgICAgImRvIiAgICAgICAgID4NCi0gICAgfCAgIDwgRUxTRTogICAgICAgICAiZWxzZSIgICAgICAgPg0KLSAgICB8ICAgPCBFWFRFTkRTOiAgICAgICJleHRlbmRzIiAgICA+DQotICAgIHwgICA8IEZBTFNFOiAgICAgICAgImZhbHNlIiAgICAgID4gICANCi0gICAgfCAgIDwgRklOQUxMWTogICAgICAiZmluYWxseSIgICAgPg0KLSAgICB8ICAgPCBGT1I6ICAgICAgICAgICJmb3IiICAgICAgICA+DQotICAgIHwgICA8IEZVTkNUSU9OOiAgICAgImZ1bmN0aW9uIiAgID4NCi0gICAgfCAgIDwgRlVOQ1RJT05fOiAgICAiRnVuY3Rpb24iICAgPg0KLSAgICB8ICAgPCBHRVQ6ICAgICAgICAgICJnZXQiICAgICAgICA+DQotICAgIHwgICA8IElGOiAgICAgICAgICAgImlmIiAgICAgICAgID4NCi0gICAgfCAgIDwgSU46ICAgICAgICAgICAiaW4iICAgICAgICAgPg0KLSAgICB8ICAgPCBJTkNMVURFOiAgICAgICJpbmNsdWRlIiAgICA+DQotICAgIHwgICA8IElOU1RBTkNFT0Y6ICAgImluc3RhbmNlb2YiID4NCi0gICAgfCAgIDwgSVM6ICAgICAgICAgICAiaXMiICAgICAgICAgPg0KLSAgICB8ICAgPCBOQU1FU1BBQ0U6ICAgICJuYW1lc3BhY2UiICA+DQotICAgIHwgICA8IE5FVzogICAgICAgICAgIm5ldyIgICAgICAgID4NCi0gICAgfCAgIDwgTlVMTDogICAgICAgICAibnVsbCIgICAgICAgPiAgICANCi0gICAgfCAgIDwgUEFDS0FHRTogICAgICAicGFja2FnZSIgICAgPiANCi0gICAgfCAgIDwgUFJJVkFURTogICAgICAicHJpdmF0ZSIgICAgPg0KLSAgICB8ICAgPCBQVUJMSUM6ICAgICAgICJwdWJsaWMiICAgICA+DQotICAgIHwgICA8IFJFVFVSTjogICAgICAgInJldHVybiIgICAgID4NCi0gICAgfCAgIDwgU0VUOiAgICAgICAgICAic2V0IiAgICAgICAgPg0KLSAgICB8ICAgPCBTVVBFUjogICAgICAgICJzdXBlciIgICAgICA+DQotICAgIHwgICA8IFNXSVRDSDogICAgICAgInN3aXRjaCIgICAgID4NCi0gICAgfCAgIDwgVEhJUzogICAgICAgICAidGhpcyIgICAgICAgPg0KLSAgICB8ICAgPCBUSFJPVzogICAgICAgICJ0aHJvdyIgICAgICA+DQotICAgIHwgICA8IFRSVUU6ICAgICAgICAgInRydWUiICAgICAgID4gDQotICAgIHwgICA8IFRSWTogICAgICAgICAgInRyeSIgICAgICAgID4NCi0gICAgfCAgIDwgVFlQRU9GOiAgICAgICAidHlwZW9mIiAgICAgPg0KLSAgICB8ICAgPCBVU0U6ICAgICAgICAgICJ1c2UiICAgICAgICA+DQotICAgIHwgICA8IFZBUjogICAgICAgICAgInZhciIgICAgICAgID4NCi0gICAgfCAgIDwgVk9JRDogICAgICAgICAidm9pZCIgICAgICAgPg0KLSAgICB8ICAgPCBXSElMRTogICAgICAgICJ3aGlsZSIgICAgICA+DQotICAgIHwgICA8IFdJVEg6ICAgICAgICAgIndpdGgiICAgICAgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBGVVRVUkUgUkVTRVJWRUQgV09SRFMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IEFCU1RSQUNUOiAgICAgImFic3RyYWN0IiAgICAgPg0KLSAgICB8ICAgPCBERUJVR0dFUjogICAgICJkZWJ1Z2dlciIgICAgID4NCi0gICAgfCAgIDwgRU5VTTogICAgICAgICAiZW51bSIgICAgICAgICA+DQotICAgIHwgICA8IEVYUE9SVDogICAgICAgImV4cG9ydCIgICAgICAgPg0KLSAgICB8ICAgPCBHT1RPOiAgICAgICAgICJnb3RvIiAgICAgICAgID4NCi0gICAgfCAgIDwgSU1QTEVNRU5UUzogICAiaW1wbGVtZW50cyIgICA+DQotICAgIHwgICA8IElOVEVSRkFDRTogICAgImludGVyZmFjZSIgICAgPg0KLSAgICB8ICAgPCBOQVRJVkU6ICAgICAgICJuYXRpdmUiICAgICAgID4NCi0gICAgfCAgIDwgUFJPVEVDVEVEOiAgICAicHJvdGVjdGVkIiAgICA+DQotICAgIHwgICA8IFNZTkNIUk9OSVpFRDogInN5bmNocm9uaXplZCIgPg0KLSAgICB8ICAgPCBUSFJPV1M6ICAgICAgICJ0aHJvd3MiICAgICAgID4NCi0gICAgfCAgIDwgVFJBTlNJRU5UOiAgICAidHJhbnNpZW50IiAgICA+DQotICAgIHwgICA8IFZPTEFUSUxFOiAgICAgInZvbGF0aWxlIiAgICAgPg0KLSAgICB8ICAgPCBJTVBPUlQ6ICAgICAgICJpbXBvcnQiICAgICAgID4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBMSVRFUkFMUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IERFQ0lNQUxfTElURVJBTDogWyIxIi0iOSJdIChbIjAiLSI5Il0pKiA+DQotICAgIHwgICA8IEhFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKSsgPg0KLSAgICB8ICAgPCBPQ1RBTF9MSVRFUkFMOiAiMCIgKFsiMCItIjciXSkqID4NCi0gICAgfCAgIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDogKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPyANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gDQotICAgICAgICA+DQotICAgIHwgICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPg0KLSAgICB8ICAgPCBTVFJJTkdfTElURVJBTDogICAiXCIiICANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIg0KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiXCIiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh+WyJcIiIsIlxcIl0pIHwgIlxcIiAoIlxuIiB8ICJcciIgfCAiXHJcbiIpIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgIA0KLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiJyINCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiJyIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICInIg0KLSAgICAgICAgPg0KLSAgICB8ICAgPCAjRVNDQVBFX1NFUVVFTkNFOiANCi0gICAgICAgICAgICAiXFwiDQotICAgICAgICAgICAgKCAgICAgICBbIm4iLCJ0IiwiYiIsInIiLCJmIiwiXFwiLCInIiwiXCIiLCJbIiwiXSJdDQotICAgICAgICAgICAgICAgIHwgICBbIjAiLSI3Il0gKCBbIjAiLSI3Il0gKT8NCi0gICAgICAgICAgICAgICAgfCAgIFsiMCItIjMiXSBbIjAiLSI3Il0gWyIwIi0iNyJdDQotICAgICAgICAgICAgICAgIHwgICBbIngiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0NCi0gICAgICAgICAgICAgICAgfCAgIFsidSJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXQ0KLSAgICAgICAgICAgICkNCi0gICAgICAgID4NCi0gICAgfCAgIDwgVU5URVJNSU5BVEVEX1NUUklOR19MSVRFUkFMOg0KLSAgICAgICAgICAgICAgICAiXCIiICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogKCBbIlxuIiwiXHIiXSApPw0KLSAgICAgICAgICAgIHwgICAiJyIgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogKCBbIlxuIiwiXHIiXSApPw0KLSAgICAgICAgPg0KLX0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFJFR1VMQVIgRVhQUkVTU0lPTlMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi1UT0tFTiA6DQoteyANCi0gICAgICAgIDwgI1JFR1hfU1RBUlRfQ0hBUiA6IH5bIlxyIiwiXG4iLCIvIiwiPSIsIioiXSB8ICJcXC8iPg0KLSAgICB8ICAgPCAjUkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OIDogflsiXHIiLCJcbiIsIi8iXSA+ICANCi0gICAgfCAgIDwgI1JFR1hfQk9EWV9DSEFSIDogKCA8UkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OPiB8ICJcXC8iICkgPg0KLSAgICB8ICAgPCAjUkVHRVhfRU5EX0NIQVIgOiAgICAgImkiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImciIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm0iIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImlnIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpbSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ2kiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdtIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtaSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWciIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImlnbSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW1nIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbWkiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdpbSIgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWlnIiANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZ2kiIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICANCi0gICAgICAgID4NCi19DQotDQotVE9LRU4gOg0KLXsNCi0gICAgICAgIDxSRUdVTEFSX0VYUFJFU1NJT04gOiAiLyIgPFJFR1hfU1RBUlRfQ0hBUj4gKDxSRUdYX0JPRFlfQ0hBUj4pKiAiLyIgICg8UkVHRVhfRU5EX0NIQVI+KT8gPg0KLSAgICAgICAgew0KLSAgICAgICAgICAgdHJ5IHsNCi0gICAgICAgICAgICAgICAgLy8gUGVlayBhdCB0aGUgbmV4dCBjaGFyYWN0ZXIuDQotICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7DQotICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7DQotICAgICAgICAgICAgICAgIGlmIChpc1JlZ1ZhbGlkID09IGZhbHNlIHx8IG5leHRDaCA9PSAnLycgfHwgbmV4dENoID09ICcqJykgew0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIExleGVjYWwgYW5hbHlzZXIgdGhpbmtzIGl0IGlzIGEgUkUNCi0gICAgICAgICAgICAgICAgICAgIC8vIG9wZXJhdG9yIHN1Y2ggYXMgLy4uLi4uLw0KLSAgICAgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBldmVyeXRoaW5nIHRvIHRoZSBmaXJzdCAiLyIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtDQotICAgICAgICAgICAgICAgICAgICAvLw0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cChsZW5ndGhPZk1hdGNoLTEpOw0KLSAgICAgICAgICAgICAgICAgICAgLy8NCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdG9rZW4NCi0gICAgICAgICAgICAgICAgICAgIC8vDQotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uaW1hZ2UgPSBtYXRjaGVkVG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDAsIDEpOw0KLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGVsZXRlKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7DQotICAgICAgICAgICAgICAgICAgICBpbWFnZS5hcHBlbmQoJy8nKTsNCi0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5raW5kPVNMQVNIOw0KLSAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgew0KLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUudG9TdHJpbmcoKSk7DQotICAgICAgICAgICAgICAgfQ0KLSAgICAgICB9ICAgICAgICANCi0gICAgICAgIA0KLX0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIElERU5USUZJRVJTIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU4gOg0KLXsNCi0gICAgICAgIDwgSURFTlRJRklFUjogPExFVFRFUj4gKDxMRVRURVI+fDxESUdJVD4pKiA+DQotICAgIHwgICA8ICNMRVRURVI6IFsiYSItInoiLCJBIi0iWiIsIiQiLCJfIl0gPg0KLSAgICB8ICAgPCAjRElHSVQ6IFsiMCItIjkiXT4NCi19DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTRVBBUkFUT1JTIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotVE9LRU4gOg0KLXsNCi0gICAgICAgIDwgTFBBUkVOOiAgICAiKCIgICA+DQotICAgIHwgICA8IFJQQVJFTjogICAgIikiICAgPg0KLSAgICB8ICAgPCBMQlJBQ0U6ICAgICJ7IiAgID4NCi0gICAgfCAgIDwgUkJSQUNFOiAgICAifSIgICA+DQotICAgIHwgICA8IExCUkFDS0VUOiAgIlsiICAgPg0KLSAgICB8ICAgPCBSQlJBQ0tFVDogICJdIiAgID4NCi0gICAgfCAgIDwgU0VNSUNPTE9OOiAiOyIgICA+DQotICAgIHwgICA8IENPTU1BOiAgICAgIiwiICAgPg0KLSAgICB8ICAgPCBET1Q6ICAgICAgICIuIiAgID4NCi0gICAgfCAgIDwgUVVBTElGSUVSOiAiOjoiICA+DQotICAgIHwgICA8IEVMSVBTRTogICAgIi4uLiIgPg0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIE9QRVJBVE9SUyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLVRPS0VOIDoNCi17DQotICAgICAgICA8IEFTU0lHTjogICAgICAgICAgICAgICAiPSIgICAgPg0KLSAgICB8ICAgPCBHVDogICAgICAgICAgICAgICAgICAgIj4iICAgID4NCi0gICAgfCAgIDwgTFQ6ICAgICAgICAgICAgICAgICAgICI8IiAgICA+DQotICAgIHwgICA8IEJBTkc6ICAgICAgICAgICAgICAgICAiISIgICAgPg0KLSAgICB8ICAgPCBUSUxERTogICAgICAgICAgICAgICAgIn4iICAgID4NCi0gICAgfCAgIDwgSE9PSzogICAgICAgICAgICAgICAgICI/IiAgICA+DQotICAgIHwgICA8IENPTE9OOiAgICAgICAgICAgICAgICAiOiIgICAgPg0KLSAgICB8ICAgPCBFUTogICAgICAgICAgICAgICAgICAgIj09IiAgID4NCi0gICAgfCAgIDwgTEU6ICAgICAgICAgICAgICAgICAgICI8PSIgICA+DQotICAgIHwgICA8IEdFOiAgICAgICAgICAgICAgICAgICAiPj0iICAgPg0KLSAgICB8ICAgPCBORTogICAgICAgICAgICAgICAgICAgIiE9IiAgID4NCi0gICAgfCAgIDwgU0NfT1I6ICAgICAgICAgICAgICAgICJ8fCIgICA+DQotICAgIHwgICA8IFNDX0FORDogICAgICAgICAgICAgICAiJiYiICAgPg0KLSAgICB8ICAgPCBTQ19YT1I6ICAgICAgICAgICAgICAgIl5eIiAgID4NCi0gICAgfCAgIDwgSU5DUjogICAgICAgICAgICAgICAgICIrKyIgICA+DQotICAgIHwgICA8IERFQ1I6ICAgICAgICAgICAgICAgICAiLS0iICAgPg0KLSAgICB8ICAgPCBQTFVTOiAgICAgICAgICAgICAgICAgIisiICAgID4NCi0gICAgfCAgIDwgTUlOVVM6ICAgICAgICAgICAgICAgICItIiAgICA+DQotICAgIHwgICA8IFNUQVI6ICAgICAgICAgICAgICAgICAiKiIgICAgPg0KLSAgICB8ICAgPCBTTEFTSDogICAgICAgICAgICAgICAgIi8iICAgID4NCi0gICAgfCAgIDwgQklUX0FORDogICAgICAgICAgICAgICImIiAgICA+DQotICAgIHwgICA8IEJJVF9PUjogICAgICAgICAgICAgICAifCIgICAgPg0KLSAgICB8ICAgPCBYT1I6ICAgICAgICAgICAgICAgICAgIl4iICAgID4NCi0gICAgfCAgIDwgUkVNOiAgICAgICAgICAgICAgICAgICIlIiAgICA+DQotICAgIHwgICA8IExTSElGVDogICAgICAgICAgICAgICAiPDwiICAgPg0KLSAgICB8ICAgPCBSU0lHTkVEU0hJRlQ6ICAgICAgICAgIj4+IiAgID4NCi0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlQ6ICAgICAgICI+Pj4iICA+DQotICAgIHwgICA8IFBMVVNBU1NJR046ICAgICAgICAgICAiKz0iICAgPg0KLSAgICB8ICAgPCBNSU5VU0FTU0lHTjogICAgICAgICAgIi09IiAgID4NCi0gICAgfCAgIDwgU1RBUkFTU0lHTjogICAgICAgICAgICIqPSIgICA+DQotICAgIHwgICA8IFNMQVNIQVNTSUdOOiAgICAgICAgICAiLz0iICAgPg0KLSAgICB8ICAgPCBBTkRBU1NJR046ICAgICAgICAgICAgIiY9IiAgID4NCi0gICAgfCAgIDwgT1JBU1NJR046ICAgICAgICAgICAgICJ8PSIgICA+DQotICAgIHwgICA8IFhPUkFTU0lHTjogICAgICAgICAgICAiXj0iICAgPg0KLSAgICB8ICAgPCBSRU1BU1NJR046ICAgICAgICAgICAgIiU9IiAgID4NCi0gICAgfCAgIDwgTFNISUZUQVNTSUdOOiAgICAgICAgICI8PD0iICA+DQotICAgIHwgICA8IFJTSUdORURTSElGVEFTU0lHTjogICAiPj49IiAgPg0KLSAgICB8ICAgPCBSVU5TSUdORURTSElGVEFTU0lHTjogIj4+Pj0iID4NCi0gICAgfCAgIDwgU0NfT1JBU1NJR046ICAgICAgICAgICJ8fD0iICA+DQotICAgIHwgICA8IFNDX0FOREFTU0lHTjogICAgICAgICAiJiY9IiAgPg0KLSAgICB8ICAgPCBTQ19YT1JBU1NJR046ICAgICAgICAgIl5ePSIgID4NCi0gICAgfCAgIDwgSURFTlRJVFlPUEVSOiAgICAgICAgICI9PT0iICA+DQotICAgIHwgICA8IE5PVElERU5USVRZT1BFUjogICAgICAiIT09IiAgPg0KLX0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gR1JBTU1BUiBTZWN0aW9uDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLQ0KLVRva2VuIFByb2dyYW0oKToNCi17LypAYmdlbihqanRyZWUpIFByb2dyYW0gKi8NCi0gICAgICAgIEFTVFByb2dyYW0gamp0bjAwMCA9IG5ldyBBU1RQcm9ncmFtKHRoaXMsIEpKVFBST0dSQU0pOw0KLSAgICAgICAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gICAgICAgIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qLw0KLSAgICAgICAgVG9rZW4gcmV0dmFsID0gZ2V0VG9rZW4oMSk7DQotfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJvZ3JhbSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIChQYWNrYWdlRGVmaW5pdGlvbigpKSogW0RpcmVjdGl2ZXMoKV0gPEVPRj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgew0KLSAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi0gICAgICAgIHsNCi0gICAgICAgICAgICBfamp0Um9vdCA9IGpqdG4wMDA7DQotICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsNCi0gICAgICAgIH0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEV4cHJlc3Npb25zIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBJZGVudGlmaWVyIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBJZGVudGlmaWVyKCk6DQotey8qQGJnZW4oamp0cmVlKSBJZGVudGlmaWVyICovDQotICBBU1RJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUSWRlbnRpZmllcih0aGlzLCBKSlRJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBJZGVudGlmaWVyICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElERU5USUZJRVI+DQotICAgIHwgICA8R0VUPg0KLSAgICB8ICAgPFNFVD4NCi0gICAgfCAgIDxJTkNMVURFPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLS8vICAgIHwgICA8TkFNRVNQQUNFPg0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFF1YWxpZmllZCBJZGVudGlmaWVyIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCk6DQotey8qQGJnZW4oamp0cmVlKSBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICBBU1RTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcih0aGlzLCBKSlRTSU1QTEVRVUFMSUZJRURJREVOVElGSUVSKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIElkZW50aWZpZXIoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXQ0KLSAgICB8ICBSZXNlcnZlZE5hbWVzcGFjZSgpIFs8UVVBTElGSUVSPiBJZGVudGlmaWVyKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLyANCi19DQotDQotdm9pZCBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgKi8NCi0gIEFTVEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIodGhpcywgSkpURVhQUkVTU0lPTlFVQUxJRklFRElERU5USUZJRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4gSWRlbnRpZmllcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFF1YWxpZmllZElkZW50aWZpZXIoKToNCi17LypAYmdlbihqanRyZWUpIFF1YWxpZmllZElkZW50aWZpZXIgKi8NCi0gIEFTVFF1YWxpZmllZElkZW50aWZpZXIgamp0bjAwMCA9IG5ldyBBU1RRdWFsaWZpZWRJZGVudGlmaWVyKHRoaXMsIEpKVFFVQUxJRklFRElERU5USUZJRVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFF1YWxpZmllZElkZW50aWZpZXIgKi8NCi0gICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpDQotICAgIHwgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgfQ0KLSAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gUHJpbWFyeSBFeHByZXNzaW9ucw0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBQcmltYXJ5RXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFByaW1hcnlFeHByZXNzaW9uICovDQotICBBU1RQcmltYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFByaW1hcnlFeHByZXNzaW9uKHRoaXMsIEpKVFBSSU1BUllFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmltYXJ5RXhwcmVzc2lvbiAqLw0KLSAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAoDQotICAgICAgICA8TlVMTD4NCi0gICAgfCAgIDxUUlVFPg0KLSAgICB8ICAgPEZBTFNFPg0KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4gDQotICAgIHwgICA8T0NUQUxfTElURVJBTD4NCi0gICAgfCAgIDxIRVhfTElURVJBTD4NCi0gICAgfCAgIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiANCi0gICAgfCAgIDxTVFJJTkdfTElURVJBTD4gDQotICAgIHwgICA8VEhJUz4NCi0gICAgfCAgIDxSRUdVTEFSX0VYUFJFU1NJT04+DQotICAgIHwgICA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+DQotICAgIHwgICBBcnJheUxpdGVyYWwoKQ0KLSAgICB8ICAgT2JqZWN0TGl0ZXJhbCgpDQotICAgIHwgICBGdW5jdGlvbkV4cHJlc3Npb24oKQ0KLSAgICApLypAYmdlbihqanRyZWUpKi8NCi0gICAgew0KLSAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgIH0NCi0vKkBlZ2VuKi8NCi0gICAgew0KLSAgICAgICAgdG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7DQotICAgIH0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgfSBlbHNlIHsNCi0gICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgfQ0KLSAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICB9DQotICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgfQ0KLSAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICB9IGZpbmFsbHkgew0KLSAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgfQ0KLSAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUmVzZXJ2ZWROYW1lc3BhY2UgKCk6DQotey8qQGJnZW4oamp0cmVlKSBSZXNlcnZlZE5hbWVzcGFjZSAqLw0KLSAgQVNUUmVzZXJ2ZWROYW1lc3BhY2Ugamp0bjAwMCA9IG5ldyBBU1RSZXNlcnZlZE5hbWVzcGFjZSh0aGlzLCBKSlRSRVNFUlZFRE5BTUVTUEFDRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzZXJ2ZWROYW1lc3BhY2UgKi8NCi0gICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgPFBVQkxJQz4NCi0gICAgfCAgPFBST1RFQ1RFRD4NCi0gICAgfCAgPFBSSVZBVEU+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEZ1bmN0aW9uIEV4cHJlc3Npb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgIEZ1bmN0aW9uRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRXhwcmVzc2lvbiAqLw0KLSAgQVNURnVuY3Rpb25FeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25FeHByZXNzaW9uKHRoaXMsIEpKVEZVTkNUSU9ORVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25FeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDIpIDxGVU5DVElPTj4gRnVuY3Rpb25Db21tb24oKQ0KLSAgICB8ICAgICAgICAgICAgICAgIDxGVU5DVElPTj4gSWRlbnRpZmllcigpIEZ1bmN0aW9uQ29tbW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIE9iamVjdCBMaXRlcmFscw0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBPYmplY3RMaXRlcmFsICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgT2JqZWN0TGl0ZXJhbCAqLw0KLSAgQVNUT2JqZWN0TGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVE9iamVjdExpdGVyYWwodGhpcywgSkpUT0JKRUNUTElURVJBTCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgT2JqZWN0TGl0ZXJhbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxMQlJBQ0U+IFtGaWVsZExpc3QoKV0gPFJCUkFDRT4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLyAgDQotfSAgICAgICAgDQotDQotdm9pZCBGaWVsZExpc3QoKToNCi17LypAYmdlbihqanRyZWUpIEZpZWxkTGlzdCAqLw0KLSAgQVNURmllbGRMaXN0IGpqdG4wMDAgPSBuZXcgQVNURmllbGRMaXN0KHRoaXMsIEpKVEZJRUxETElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRmllbGRMaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTGl0ZXJhbEZpZWxkKCkgKDxDT01NQT4gTGl0ZXJhbEZpZWxkKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTGl0ZXJhbEZpZWxkICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTGl0ZXJhbEZpZWxkICovDQotICBBU1RMaXRlcmFsRmllbGQgamp0bjAwMCA9IG5ldyBBU1RMaXRlcmFsRmllbGQodGhpcywgSkpUTElURVJBTEZJRUxEKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRmllbGQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBGaWVsZE5hbWUoKSA8Q09MT04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEZpZWxkTmFtZSAoKToNCi17LypAYmdlbihqanRyZWUpIEZpZWxkTmFtZSAqLw0KLSAgQVNURmllbGROYW1lIGpqdG4wMDAgPSBuZXcgQVNURmllbGROYW1lKHRoaXMsIEpKVEZJRUxETkFNRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRmllbGROYW1lICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFNUUklOR19MSVRFUkFMPg0KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4NCi0gICAgfCAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQ0KLSAgICB8ICAgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQkNCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEFycmF5IExpdGVyYWwNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQXJyYXlMaXRlcmFsKCk6DQotey8qQGJnZW4oamp0cmVlKSBBcnJheUxpdGVyYWwgKi8NCi0gIEFTVEFycmF5TGl0ZXJhbCBqanRuMDAwID0gbmV3IEFTVEFycmF5TGl0ZXJhbCh0aGlzLCBKSlRBUlJBWUxJVEVSQUwpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFycmF5TGl0ZXJhbCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxMQlJBQ0tFVD4gW0VsZW1lbnRMaXN0KCldIDxSQlJBQ0tFVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEVsZW1lbnRMaXN0KCk6DQotey8qQGJnZW4oamp0cmVlKSBFbGVtZW50TGlzdCAqLw0KLSAgQVNURWxlbWVudExpc3Qgamp0bjAwMCA9IG5ldyBBU1RFbGVtZW50TGlzdCh0aGlzLCBKSlRFTEVNRU5UTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRWxlbWVudExpc3QgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMaXRlcmFsRWxlbWVudCgpICg8Q09NTUE+IExpdGVyYWxFbGVtZW50KCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTGl0ZXJhbEVsZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIExpdGVyYWxFbGVtZW50ICovDQotICBBU1RMaXRlcmFsRWxlbWVudCBqanRuMDAwID0gbmV3IEFTVExpdGVyYWxFbGVtZW50KHRoaXMsIEpKVExJVEVSQUxFTEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMaXRlcmFsRWxlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFN1cGVyIEV4cHJlc3Npb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgU3VwZXJFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3VwZXJFeHByZXNzaW9uICovDQotICBBU1RTdXBlckV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RTdXBlckV4cHJlc3Npb24odGhpcywgSkpUU1VQRVJFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBTdXBlckV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8U1VQRVI+IFtMT09LQUhFQUQoMikgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPl0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFBvc3RmaXggRXhwcmVzc2lvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBQb3N0Zml4RXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFBvc3RmaXhFeHByZXNzaW9uICovDQotICBBU1RQb3N0Zml4RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFBvc3RmaXhFeHByZXNzaW9uKHRoaXMsIEpKVFBPU1RGSVhFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQb3N0Zml4RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24gKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgW1Bvc3RmaXhPcCgpXQ0KLSAgICB8ICAge3Rva2VuX3NvdXJjZS5zZXRSZWdJbnZhbGlkKCk7fSANCi0gICAgICAgIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAoKSAoUHJvcGVydHlPckFyZ3VtZW50cygpKSogW1Bvc3RmaXhPcCgpXQ0KLSAgICB8ICAgU3VwZXJFeHByZXNzaW9uKCkgICAgICAgICBQcm9wZXJ0eU9wZXJhdG9yKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0gICAgDQotDQotdm9pZCBBdHRyaWJ1dGVFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlRXhwcmVzc2lvbiAqLw0KLSAgQVNUQXR0cmlidXRlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEF0dHJpYnV0ZUV4cHJlc3Npb24odGhpcywgSkpUQVRUUklCVVRFRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKSAgKFByb3BlcnR5T3JBcmd1bWVudHMoKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdWxsUG9zdGZpeEV4cHJlc3Npb24gKi8NCi0gIEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxQb3N0Zml4RXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMUE9TVEZJWEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAqLw0KLSAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICBMT09LQUhFQUQoPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPikgDQotICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgUHJpbWFyeUV4cHJlc3Npb24oKSANCi0gICAgfCAgRnVsbE5ld0V4cHJlc3Npb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8gICAgICAgICAgICAgDQotfQ0KLQ0KLXZvaWQgRnVsbE5ld0V4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdWxsTmV3RXhwcmVzc2lvbiAqLw0KLSAgQVNURnVsbE5ld0V4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RGdWxsTmV3RXhwcmVzc2lvbih0aGlzLCBKSlRGVUxMTkVXRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVsbE5ld0V4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TkVXPiBGdWxsTmV3U3ViZXhwcmVzc2lvbigpICAoTE9PS0FIRUFEKDIpIFByb3BlcnR5T3BlcmF0b3IoKSkqIFtMT09LQUhFQUQoMikgQXJndW1lbnRzKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGdW5jdGlvbkNvbnN0cnVjdG9yKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbnN0cnVjdG9yICovDQotICBBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIGpqdG4wMDAgPSBuZXcgQVNURnVuY3Rpb25Db25zdHJ1Y3Rvcih0aGlzLCBKSlRGVU5DVElPTkNPTlNUUlVDVE9SKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbnN0cnVjdG9yICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLyAgICANCi0gICAgICAgIDxGVU5DVElPTl8+IEFyZ3VtZW50cygpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGdWxsTmV3U3ViZXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEZ1bGxOZXdTdWJleHByZXNzaW9uICovDQotICBBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVEZ1bGxOZXdTdWJleHByZXNzaW9uKHRoaXMsIEpKVEZVTExORVdTVUJFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdWxsTmV3U3ViZXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCg8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+KSANCi0gICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkgICAgICAgIA0KLSAgICB8ICAgUHJpbWFyeUV4cHJlc3Npb24oKSANCi0gICAgfCAgIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKQ0KLSAgICB8ICAgU3VwZXJFeHByZXNzaW9uKCkgDQotICAgIHwgICBGdWxsTmV3RXhwcmVzc2lvbigpDQotICAgIHwgICBGdW5jdGlvbkNvbnN0cnVjdG9yKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFBvc3RmaXhPcCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUG9zdGZpeE9wICovDQotICBBU1RQb3N0Zml4T3Agamp0bjAwMCA9IG5ldyBBU1RQb3N0Zml4T3AodGhpcywgSkpUUE9TVEZJWE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQb3N0Zml4T3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8SU5DUj4NCi0gICAgfCAgIDxERUNSPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFByb3BlcnR5T3JBcmd1bWVudHMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9yQXJndW1lbnRzICovDQotICBBU1RQcm9wZXJ0eU9yQXJndW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUUHJvcGVydHlPckFyZ3VtZW50cyh0aGlzLCBKSlRQUk9QRVJUWU9SQVJHVU1FTlRTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcm9wZXJ0eU9yQXJndW1lbnRzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQXJndW1lbnRzKCkgICAgICAgIA0KLSAgICB8ICAgUHJvcGVydHlPcGVyYXRvcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBQcm9wZXJ0eSBPcGVyYXRvcnMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUHJvcGVydHlPcGVyYXRvciAoKToNCi17LypAYmdlbihqanRyZWUpIFByb3BlcnR5T3BlcmF0b3IgKi8NCi0gIEFTVFByb3BlcnR5T3BlcmF0b3Igamp0bjAwMCA9IG5ldyBBU1RQcm9wZXJ0eU9wZXJhdG9yKHRoaXMsIEpKVFBST1BFUlRZT1BFUkFUT1IpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFByb3BlcnR5T3BlcmF0b3IgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovICAgICAgICAgIA0KLSAgICAgICAgPERPVD4gICAgICBRdWFsaWZpZWRJZGVudGlmaWVyKCkNCi0gICAgfCAgIExPT0tBSEVBRCgyKSA8TEJSQUNLRVQ+IDxSQlJBQ0tFVD4NCi0gICAgfCAgIExPT0tBSEVBRCgyKSA8TEJSQUNLRVQ+IDxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJCUkFDS0VUPg0KLSAgICB8ICAgICAgICAgICAgICAgIDxMQlJBQ0tFVD4gTGlzdEV4cHJlc3Npb24oKSBbPEVMSVBTRT4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0gPFJCUkFDS0VUPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQXJndW1lbnRzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQXJndW1lbnRzICovDQotIEFTVEFyZ3VtZW50cyBqanRuMDAwID0gbmV3IEFTVEFyZ3VtZW50cyh0aGlzLCBKSlRBUkdVTUVOVFMpOw0KLSBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi97dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fX0NCi17LypAYmdlbihqanRyZWUpIEFyZ3VtZW50cyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgyKSA8TFBBUkVOPiA8UlBBUkVOPg0KLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMUEFSRU4+IDxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgfCAgICAgICAgICAgICAgICA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIFs8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXSA8UlBBUkVOPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVW5hcnkgT3BlcmF0b3JzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBVbmFyeUV4cHJlc3Npb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBVbmFyeUV4cHJlc3Npb24gKi8NCi0gIEFTVFVuYXJ5RXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFVuYXJ5RXhwcmVzc2lvbih0aGlzLCBKSlRVTkFSWUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVuYXJ5RXhwcmVzc2lvbiAqLw0KLSAgICAgICAgICAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICAgICAgICAgIFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxERUxFVEU+IFBvc3RmaXhFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxWT0lEPiAgIFVuYXJ5RXhwcmVzc2lvbigpDQotICAgIHwgICA8VFlQRU9GPiBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPElOQ1I+ICAgUG9zdGZpeEV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPERFQ1I+ICAgUG9zdGZpeEV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPFBMVVM+ICAgVW5hcnlFeHByZXNzaW9uKCkNCi0gICAgfCAgIDxNSU5VUz4gIFVuYXJ5RXhwcmVzc2lvbigpDQotICAgIHwgICA8VElMREU+ICBVbmFyeUV4cHJlc3Npb24oKQ0KLSAgICB8ICAgPEJBTkc+ICAgVW5hcnlFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIE11bHRpcGxpY2F0aXZlIE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgTXVsT3AoKToNCi17LypAYmdlbihqanRyZWUpIE11bE9wICovDQotICBBU1RNdWxPcCBqanRuMDAwID0gbmV3IEFTVE11bE9wKHRoaXMsIEpKVE1VTE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBNdWxPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVEFSPg0KLSAgICB8ICAgPFNMQVNIPg0KLSAgICB8ICAgPFJFTT4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLXZvaWQgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24gKi8NCi0gIEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbih0aGlzLCBKSlRNVUxUSVBMSUNBVElWRUVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFVuYXJ5RXhwcmVzc2lvbigpIChNdWxPcCgpIFVuYXJ5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLQ0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEFkZGl0aXZlIE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQWRkT3AoKToNCi17LypAYmdlbihqanRyZWUpIEFkZE9wICovDQotICBBU1RBZGRPcCBqanRuMDAwID0gbmV3IEFTVEFkZE9wKHRoaXMsIEpKVEFERE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBZGRPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxQTFVTPg0KLSAgICB8ICAgPE1JTlVTPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFkZGl0aXZlRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQWRkaXRpdmVFeHByZXNzaW9uICovDQotICBBU1RBZGRpdGl2ZUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBZGRpdGl2ZUV4cHJlc3Npb24odGhpcywgSkpUQURESVRJVkVFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBBZGRpdGl2ZUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSAoQWRkT3AoKSBNdWx0aXBsaWNhdGl2ZUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19IA0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQml0d2lzZSBTaGlmdCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFNoaWZ0T3AoKToNCi17LypAYmdlbihqanRyZWUpIFNoaWZ0T3AgKi8NCi0gIEFTVFNoaWZ0T3Agamp0bjAwMCA9IG5ldyBBU1RTaGlmdE9wKHRoaXMsIEpKVFNISUZUT1ApOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFNoaWZ0T3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8TFNISUZUPg0KLSAgICB8ICAgPFJTSUdORURTSElGVD4NCi0gICAgfCAgIDxSVU5TSUdORURTSElGVD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBTaGlmdEV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIFNoaWZ0RXhwcmVzc2lvbiAqLw0KLSAgQVNUU2hpZnRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUU2hpZnRFeHByZXNzaW9uKHRoaXMsIEpKVFNISUZURVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU2hpZnRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCkgKFNoaWZ0T3AoKSBBZGRpdGl2ZUV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBSZWxhdGlvbmFsIE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUmVsT3AoKToNCi17LypAYmdlbihqanRyZWUpIFJlbE9wICovDQotICBBU1RSZWxPcCBqanRuMDAwID0gbmV3IEFTVFJlbE9wKHRoaXMsIEpKVFJFTE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZWxPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxMVD4NCi0gICAgfCAgIDxHVD4gDQotICAgIHwgICA8TEU+IA0KLSAgICB8ICAgPEdFPg0KLSAgICB8ICAgPElTPg0KLSAgICB8ICAgPEFTPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBSZWxhdGlvbmFsRXhwcmVzc2lvbiAqLw0KLSAgQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RSZWxhdGlvbmFsRXhwcmVzc2lvbih0aGlzLCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVsYXRpb25hbEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAoTE9PS0FIRUFEKDMpKFJlbE9wKCkgfCA8SU4+IHwgPElOU1RBTkNFT0Y+ICkgU2hpZnRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRSRUxBVElPTkFMRVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpIA0KLSAgICAgICAgICAgICgoUmVsT3AoKSB8IDxJTlNUQU5DRU9GPikgIFNoaWZ0RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEVxdWFsaXR5IE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRXF1YWxPcCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxPcCAqLw0KLSAgQVNURXF1YWxPcCBqanRuMDAwID0gbmV3IEFTVEVxdWFsT3AodGhpcywgSkpURVFVQUxPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxPcCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxFUT4gDQotICAgIHwgICA8TkU+IA0KLSAgICB8ICAgPElERU5USVRZT1BFUj4gDQotICAgIHwgICA8Tk9USURFTlRJVFlPUEVSPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXF1YWxpdHlFeHByZXNzaW9uICovDQotICBBU1RFcXVhbGl0eUV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RFcXVhbGl0eUV4cHJlc3Npb24odGhpcywgSkpURVFVQUxJVFlFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFcXVhbGl0eUV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOICovDQotICBBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNURXF1YWxpdHlFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRFUVVBTElUWUVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgKEVxdWFsT3AoKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBCaW5hcnkgQml0d2lzZSBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEJpdHdpc2VBTkRPcCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFORE9wICovDQotICBBU1RCaXR3aXNlQU5ET3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ET3AodGhpcywgSkpUQklUV0lTRUFORE9QKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ET3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8QklUX0FORD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFOREV4cHJlc3Npb24gKi8NCi0gIEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZUFOREV4cHJlc3Npb24odGhpcywgSkpUQklUV0lTRUFOREVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VBTkRFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOICovDQotICBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4odGhpcywgSkpUQklUV0lTRUFOREVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotDQotdm9pZCBCaXR3aXNlWE9ST3AoKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JPcCAqLw0KLSAgQVNUQml0d2lzZVhPUk9wIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUk9wKHRoaXMsIEpKVEJJVFdJU0VYT1JPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUk9wICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFhPUj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUkV4cHJlc3Npb24gKi8NCi0gIEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUkV4cHJlc3Npb24odGhpcywgSkpUQklUV0lTRVhPUkVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb24oKSkqLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VYT1JFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VYT1JPcCgpIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJpdHdpc2VPUk9wKCk6DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JPcCAqLw0KLSAgQVNUQml0d2lzZU9ST3Agamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JPcCh0aGlzLCBKSlRCSVRXSVNFT1JPUCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQml0d2lzZU9ST3AgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8QklUX09SPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VPUkV4cHJlc3Npb24gKi8NCi0gIEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RCaXR3aXNlT1JFeHByZXNzaW9uKHRoaXMsIEpKVEJJVFdJU0VPUkVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VPUkV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlWE9SRXhwcmVzc2lvbigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOICovDQotICBBU1RCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVEJJVFdJU0VPUkVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEJpbmFyeSBMb2dpY2FsIE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxBTkRFeHByZXNzaW9uICovDQotICBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVExvZ2ljYWxBTkRFeHByZXNzaW9uKHRoaXMsIEpKVExPR0lDQUxBTkRFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsQU5ERXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb24oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOICovDQotICBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4odGhpcywgSkpUTE9HSUNBTEFOREVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpICg8U0NfQU5EPiBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb24oKToNCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxPUkV4cHJlc3Npb24gKi8NCi0gIEFTVExvZ2ljYWxPUkV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RMb2dpY2FsT1JFeHByZXNzaW9uKHRoaXMsIEpKVExPR0lDQUxPUkVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxPUkV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsQU5ERXhwcmVzc2lvbigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKToNCi17LypAYmdlbihqanRyZWUpIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOICovDQotICBBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVExPR0lDQUxPUkVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIENvbmRpdGlvbmFsIE9wZXJhdG9ycyANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb24gKi8NCi0gIEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVENvbmRpdGlvbmFsRXhwcmVzc2lvbih0aGlzLCBKSlRDT05ESVRJT05BTEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENvbmRpdGlvbmFsRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb24oKSBbPEhPT0s+ICBBc3NpZ25tZW50RXhwcmVzc2lvbigpIA0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q09MT04+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOICovDQotICBBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRDT05ESVRJT05BTEVYUFJFU1NJT05OT0lOKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKSAgWzxIT09LPiAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbiAqLw0KLSAgQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbih0aGlzLCBKSlROT05BU1NJR05NRU5URVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTm9uQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMb2dpY2FsT1JFeHByZXNzaW9uKCkgWzxIT09LPiAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSANCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTih0aGlzLCBKSlROT05BU1NJR05NRU5URVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgWzxIT09LPiAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8Q09MT04+IE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQXNzaWdubWVudCBPcGVyYXRvcnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEFzc2lnbmVtZW50T3BlcmF0b3IoKToNCi17LypAYmdlbihqanRyZWUpIEFzc2lnbmVtZW50T3BlcmF0b3IgKi8NCi0gIEFTVEFzc2lnbmVtZW50T3BlcmF0b3Igamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25lbWVudE9wZXJhdG9yKHRoaXMsIEpKVEFTU0lHTkVNRU5UT1BFUkFUT1IpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFzc2lnbmVtZW50T3BlcmF0b3IgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8QVNTSUdOPg0KLSAgICB8ICAgPFNUQVJBU1NJR04+DQotICAgIHwgICA8U0xBU0hBU1NJR04+IA0KLSAgICB8ICAgPFJFTUFTU0lHTj4gDQotICAgIHwgICA8UExVU0FTU0lHTj4NCi0gICAgfCAgIDxNSU5VU0FTU0lHTj4gDQotICAgIHwgICA8TFNISUZUQVNTSUdOPiANCi0gICAgfCAgIDxSU0lHTkVEU0hJRlRBU1NJR04+DQotICAgIHwgICA8UlVOU0lHTkVEU0hJRlRBU1NJR04+DQotICAgIHwgICA8QU5EQVNTSUdOPiANCi0gICAgfCAgIDxYT1JBU1NJR04+IA0KLSAgICB8ICAgPE9SQVNTSUdOPg0KLSAgICB8ICAgPFNDX0FOREFTU0lHTj4NCi0gICAgfCAgIDxTQ19YT1JBU1NJR04+DQotICAgIHwgICA8U0NfT1JBU1NJR04+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotIA0KLX0NCi0NCi12b2lkIEFzc2lnbm1lbnRFeHByZXNzaW9uKCk6DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbiAqLw0KLSAgQVNUQXNzaWdubWVudEV4cHJlc3Npb24gamp0bjAwMCA9IG5ldyBBU1RBc3NpZ25tZW50RXhwcmVzc2lvbih0aGlzLCBKSlRBU1NJR05NRU5URVhQUkVTU0lPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQXNzaWdubWVudEV4cHJlc3Npb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24oKSBbTE9PS0FIRUFEKDIpIEFzc2lnbmVtZW50T3BlcmF0b3IoKSBBc3NpZ25tZW50RXhwcmVzc2lvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCk6DQotey8qQGJnZW4oamp0cmVlKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKi8NCi0gIEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiBqanRuMDAwID0gbmV3IEFTVEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTih0aGlzLCBKSlRBU1NJR05NRU5URVhQUkVTU0lPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSBbTE9PS0FIRUFEKDIpIEFzc2lnbmVtZW50T3BlcmF0b3IoKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIENvbW1hIEV4cHJlc3Npb25zDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIExpc3RFeHByZXNzaW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTGlzdEV4cHJlc3Npb24gKi8NCi0gIEFTVExpc3RFeHByZXNzaW9uIGpqdG4wMDAgPSBuZXcgQVNUTGlzdEV4cHJlc3Npb24odGhpcywgSkpUTElTVEVYUFJFU1NJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKSAoPENPTU1BPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0gICANCi0NCi12b2lkIExpc3RFeHByZXNzaW9uTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIExpc3RFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUTGlzdEV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUTGlzdEV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVExJU1RFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGlzdEV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfSAgIA0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVHlwZSBFeHByZXNzaW9ucw0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBUeXBlRXhwcmVzc2lvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uICovDQotICBBU1RUeXBlRXhwcmVzc2lvbiBqanRuMDAwID0gbmV3IEFTVFR5cGVFeHByZXNzaW9uKHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUeXBlRXhwcmVzc2lvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFR5cGVFeHByZXNzaW9uTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTm9JTiAqLw0KLSAgQVNUVHlwZUV4cHJlc3Npb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUVHlwZUV4cHJlc3Npb25Ob0lOKHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHlwZUV4cHJlc3Npb25Ob0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFR5cGVFeHByZXNzaW9uTGlzdCAoKToNCi17LypAYmdlbihqanRyZWUpIFR5cGVFeHByZXNzaW9uTGlzdCAqLw0KLSAgQVNUVHlwZUV4cHJlc3Npb25MaXN0IGpqdG4wMDAgPSBuZXcgQVNUVHlwZUV4cHJlc3Npb25MaXN0KHRoaXMsIEpKVFRZUEVFWFBSRVNTSU9OTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHlwZUV4cHJlc3Npb25MaXN0ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb24oKSAoPENPTU1BPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFN0YWVtZW50cyAoYWJicmV2LCBub1Nob3J0SWYsIGZ1bGwpIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTdGF0ZW1lbnQgKi8NCi0gIEFTVFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN0YXRlbWVudCh0aGlzLCBKSlRTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSBFeHByZXNzaW9uU3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIFN1cGVyU3RhdGVtZW50KCkgU2MoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEJsb2NrKCkNCi0gICAgfCAgICAgICAgICAgICAgICBMYWJlbGVkU3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgICBJZlN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgU3dpdGNoU3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgICBEb1N0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBXaGlsZVN0YXRlbWVudCgpDQotICAgIHwgICAgICAgICAgICAgICAgRm9yU3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgICBXaXRoU3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgICBDb250aW51ZVN0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBCcmVha1N0YXRlbWVudCgpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICBSZXR1cm5TdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgVGhyb3dTdGF0ZW1lbnQoKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgVHJ5U3RhdGVtZW50KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFN1YnN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudCAqLw0KLSAgQVNUU3Vic3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUU3Vic3RhdGVtZW50KHRoaXMsIEpKVFNVQlNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU3Vic3RhdGVtZW50ICovDQotICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICAgICAgICAgICAgICBFbXB0eVN0YXRlbWVudCgpDQotICAgIHwgICBMT09LQUhFQUQoMikgU3RhdGVtZW50KCkNCi0gICAgfCAgICAgICAgICAgICAgICBTaW1wbGVWYXJpYWJsZURlZmluaXRpb24oKSBTYygpDQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgICAgPExCUkFDRT4gU3Vic3RhdGVtZW50cygpIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgU3Vic3RhdGVtZW50cyAoKToNCi17LypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudHMgKi8NCi0gIEFTVFN1YnN0YXRlbWVudHMgamp0bjAwMCA9IG5ldyBBU1RTdWJzdGF0ZW1lbnRzKHRoaXMsIEpKVFNVQlNUQVRFTUVOVFMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN1YnN0YXRlbWVudHMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoU3Vic3RhdGVtZW50KCkpKy8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLUpBVkFDT0RFDQotICB2b2lkIFNjKCkgey8qQGJnZW4oamp0cmVlKSBTYyAqLw0KLSBBU1RTYyBqanRuMDAwID0gbmV3IEFTVFNjKHRoaXMsIEpKVFNDKTsNCi0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotIHRyeSB7DQotLypAZWdlbiovDQotICAgIFRva2VuIHRvayA9IGdldFRva2VuKDEpOw0KLSAgICBpZiAodG9rLmtpbmQgPT0gU0VNSUNPTE9OKSB7DQotICAgICAgIHRvayA9IGdldE5leHRUb2tlbigpOw0KLSAgICB9IGVsc2UgaWYgKHRvay5zcGVjaWFsVG9rZW4gIT0gbnVsbCkgew0KLSAgICAgICBpZiAoIUVvbENvbW1lbnRTa2lwV3ModG9rLnNwZWNpYWxUb2tlbikgJiYgKHRvay5raW5kICE9IEVPRikpIHsNCi0gICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOw0KLSAgICAgICB9DQotICAgIH0gZWxzZSBpZiAoKHRvay5raW5kICE9IEVPRikgJiYgKHRvay5raW5kIT1SQlJBQ0UpKSB7DQotICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOw0KLSAgICB9LypAYmdlbihqanRyZWUpKi8NCi0gfSBmaW5hbGx5IHsNCi0gICBpZiAoamp0YzAwMCkgew0KLSAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgIH0NCi0gfQ0KLS8qQGVnZW4qLw0KLSAgfQ0KLSANCi1KQVZBQ09ERQ0KLSAgYm9vbGVhbiBFb2xDb21tZW50U2tpcFdzKFRva2VuIHQpIHsvKkBiZ2VuKGpqdHJlZSkgRW9sQ29tbWVudFNraXBXcyAqLw0KLSBBU1RFb2xDb21tZW50U2tpcFdzIGpqdG4wMDAgPSBuZXcgQVNURW9sQ29tbWVudFNraXBXcyh0aGlzLCBKSlRFT0xDT01NRU5UU0tJUFdTKTsNCi0gYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotIHRyeSB7DQotLypAZWdlbiovDQotICAgIGJvb2xlYW4gcmV0VmFsID0gZmFsc2U7DQotICAgIFRva2VuIHNwZWNpYWxUb2tlbiA9IHQ7DQotICAgIHdoaWxlKHNwZWNpYWxUb2tlbiAhPSBudWxsKSB7DQotICAgICAgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gV1MpIHsNCi0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47DQotICAgICAgICBjb250aW51ZTsNCi0gICAgICB9DQotICAgICAgZWxzZSBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBFT0wgIHx8DQotICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7DQotICAgICAgICByZXRWYWwgPSB0cnVlOw0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICAgIGVsc2Ugew0KLSAgICAgICAgYnJlYWs7DQotICAgICAgfQ0KLSAgICB9DQotICAgIHJldHVybiByZXRWYWw7LypAYmdlbihqanRyZWUpKi8NCi0gfSBmaW5hbGx5IHsNCi0gICBpZiAoamp0YzAwMCkgew0KLSAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgIH0NCi0gfQ0KLS8qQGVnZW4qLw0KLSAgfQ0KLSANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEVtcHR5IFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRW1wdHlTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIEVtcHR5U3RhdGVtZW50ICovDQotICBBU1RFbXB0eVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEVtcHR5U3RhdGVtZW50KHRoaXMsIEpKVEVNUFRZU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFbXB0eVN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTRU1JQ09MT04+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRXhwcmVzaW9uIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgRXhwcmVzc2lvblN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblN0YXRlbWVudCAqLw0KLSAgQVNURXhwcmVzc2lvblN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQodGhpcywgSkpURVhQUkVTU0lPTlNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwcmVzc2lvblN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExpc3RFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLyANCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTdXBlciBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFN1cGVyU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgU3VwZXJTdGF0ZW1lbnQgKi8NCi0gIEFTVFN1cGVyU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUU3VwZXJTdGF0ZW1lbnQodGhpcywgSkpUU1VQRVJTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN1cGVyU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFNVUEVSPiBBcmd1bWVudHMoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQmxvY2sgU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBCbG9jayAoKToNCi17LypAYmdlbihqanRyZWUpIEJsb2NrICovDQotICBBU1RCbG9jayBqanRuMDAwID0gbmV3IEFTVEJsb2NrKHRoaXMsIEpKVEJMT0NLKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCbG9jayAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8gICANCi0gICAgICAgIDxMQlJBQ0U+IFtEaXJlY3RpdmVzKCldIDxSQlJBQ0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBMYWJlbGVkIFN0YXRlbWVudCAobWFwcyB0byBsaXRlcmFsIGZpZWxkKQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBMYWJlbGVkU3RhdGVtZW50ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgTGFiZWxlZFN0YXRlbWVudCAqLw0KLSAgQVNUTGFiZWxlZFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVExhYmVsZWRTdGF0ZW1lbnQodGhpcywgSkpUTEFCRUxFRFNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgTGFiZWxlZFN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIoKSA8Q09MT04+IFN1YnN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBJZiBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIElmU3RhdGVtZW50KCk6DQotey8qQGJnZW4oamp0cmVlKSBJZlN0YXRlbWVudCAqLw0KLSAgQVNUSWZTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RJZlN0YXRlbWVudCh0aGlzLCBKSlRJRlNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSWZTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8SUY+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4gDQotICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkgDQotICAgICAgICAgICAgW0xPT0tBSEVBRCgxKSA8RUxTRT4gU3Vic3RhdGVtZW50KCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBTd2l0Y2ggU3RhdGVtZW50IA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBTd2l0Y2hTdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBTd2l0Y2hTdGF0ZW1lbnQgKi8NCi0gIEFTVFN3aXRjaFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFN3aXRjaFN0YXRlbWVudCh0aGlzLCBKSlRTV0lUQ0hTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFN3aXRjaFN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTV0lUQ0g+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4NCi0gICAgICAgICAgICAgICAgIDxMQlJBQ0U+IFtDYXNlRWxlbWVudHMoKV0gPFJCUkFDRT4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENhc2VFbGVtZW50cyAoKToNCi17LypAYmdlbihqanRyZWUpIENhc2VFbGVtZW50cyAqLw0KLSAgQVNUQ2FzZUVsZW1lbnRzIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUVsZW1lbnRzKHRoaXMsIEpKVENBU0VFTEVNRU5UUyk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnRzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgQ2FzZUxhYmVsKCkgKENhc2VFbGVtZW50KCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQ2FzZUVsZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBDYXNlRWxlbWVudCAqLw0KLSAgQVNUQ2FzZUVsZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RDYXNlRWxlbWVudCh0aGlzLCBKSlRDQVNFRUxFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2FzZUVsZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBEaXJlY3RpdmUoKQ0KLSAgICB8ICAgQ2FzZUxhYmVsKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIENhc2VMYWJlbCAoKToNCi17LypAYmdlbihqanRyZWUpIENhc2VMYWJlbCAqLw0KLSAgQVNUQ2FzZUxhYmVsIGpqdG4wMDAgPSBuZXcgQVNUQ2FzZUxhYmVsKHRoaXMsIEpKVENBU0VMQUJFTCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2FzZUxhYmVsICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENBU0U+IExpc3RFeHByZXNzaW9uKCkgPENPTE9OPg0KLSAgICB8ICAgPF9ERUZBVUxUPiA8Q09MT04+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBEby1XaGlsZSBTdGF0ZW1lbnQgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIERvU3RhdGVtZW50KCk6IA0KLXsvKkBiZ2VuKGpqdHJlZSkgRG9TdGF0ZW1lbnQgKi8NCi0gIEFTVERvU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNURG9TdGF0ZW1lbnQodGhpcywgSkpURE9TVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIERvU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPERPPiBTdWJzdGF0ZW1lbnQoKSA8V0hJTEU+IDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgPFJQQVJFTj4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFdoaWxlIFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBXaGlsZVN0YXRlbWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIFdoaWxlU3RhdGVtZW50ICovDQotICBBU1RXaGlsZVN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFdoaWxlU3RhdGVtZW50KHRoaXMsIEpKVFdISUxFU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBXaGlsZVN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxXSElMRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPg0KLSAgICAgICAgICAgU3Vic3RhdGVtZW50KCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEZvciBTdGF0ZW1lbnRzIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBGb3JTdGF0ZW1lbnQgKCk6DQotey8qQGJnZW4oamp0cmVlKSBGb3JTdGF0ZW1lbnQgKi8NCi0gIEFTVEZvclN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEZvclN0YXRlbWVudCh0aGlzLCBKSlRGT1JTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZvclN0YXRlbWVudCAqLw0KLSAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgTE9PS0FIRUFEKDxGT1I+IDxMUEFSRU4+IEZvckluQmluZGluZygpIDxJTj4pDQotICAgICAgICAgICAgICAgICAgIDxGT1I+IDxMUEFSRU4+IEZvckluQmluZGluZygpIDxJTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPg0KLSAgICAgICAgICAgICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKQ0KLSAgICB8ICAgICAgICAgICAgICA8Rk9SPiA8TFBBUkVOPiBbRm9ySW5pdGlhbGl6ZXIoKV0gPFNFTUlDT0xPTj4gDQotICAgICAgICAgICAgICAgICAgICAgICBbTGlzdEV4cHJlc3Npb24oKV0gPFNFTUlDT0xPTj4gDQotICAgICAgICAgICAgICAgICAgICAgICBbTGlzdEV4cHJlc3Npb24oKV0gPFJQQVJFTj4gDQotICAgICAgICAgICAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICB9DQotICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRm9ySW5pdGlhbGl6ZXIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBGb3JJbml0aWFsaXplciAqLw0KLSAgQVNURm9ySW5pdGlhbGl6ZXIgamp0bjAwMCA9IG5ldyBBU1RGb3JJbml0aWFsaXplcih0aGlzLCBKSlRGT1JJTklUSUFMSVpFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRm9ySW5pdGlhbGl6ZXIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgTGlzdEV4cHJlc3Npb25Ob0lOKCkNCi0gICAgfCAgICAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25Ob0lOKCkNCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uTm9JTigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGb3JJbkJpbmRpbmcgKCk6DQotey8qQGJnZW4oamp0cmVlKSBGb3JJbkJpbmRpbmcgKi8NCi0gIEFTVEZvckluQmluZGluZyBqanRuMDAwID0gbmV3IEFTVEZvckluQmluZGluZyh0aGlzLCBKSlRGT1JJTkJJTkRJTkcpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZvckluQmluZGluZyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSBQb3N0Zml4RXhwcmVzc2lvbigpDQotICAgIHwgICAgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgVmFyaWFibGVCaW5kaW5nTm9JTigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBXaXRoIFN0YXRlbWVudCANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgV2l0aFN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgV2l0aFN0YXRlbWVudCAqLw0KLSAgQVNUV2l0aFN0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVFdpdGhTdGF0ZW1lbnQodGhpcywgSkpUV0lUSFNUQVRFTUVOVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgV2l0aFN0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxXSVRIPiA8TFBBUkVOPiBFeHByZXNzaW9uU3RhdGVtZW50KCkgPFJQQVJFTj4NCi0gICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gQ29udGludWUgYW5kIEJyZWFrIFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBDb250aW51ZVN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ29udGludWVTdGF0ZW1lbnQgKi8NCi0gIEFTVENvbnRpbnVlU3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUQ29udGludWVTdGF0ZW1lbnQodGhpcywgSkpUQ09OVElOVUVTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIENvbnRpbnVlU3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPENPTlRJTlVFPiBbSWRlbnRpZmllcigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgQnJlYWtTdGF0ZW1lbnQoKToNCi17LypAYmdlbihqanRyZWUpIEJyZWFrU3RhdGVtZW50ICovDQotICBBU1RCcmVha1N0YXRlbWVudCBqanRuMDAwID0gbmV3IEFTVEJyZWFrU3RhdGVtZW50KHRoaXMsIEpKVEJSRUFLU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBCcmVha1N0YXRlbWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxCUkVBSz4gW0lkZW50aWZpZXIoKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0gDQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBSZXR1cm4gU3RhdGVtZW50DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFJldHVyblN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmV0dXJuU3RhdGVtZW50ICovDQotICBBU1RSZXR1cm5TdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RSZXR1cm5TdGF0ZW1lbnQodGhpcywgSkpUUkVUVVJOU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZXR1cm5TdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8UkVUVVJOPiBbTGlzdEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIFRocm93IFN0YXRlbWVudA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBUaHJvd1N0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVGhyb3dTdGF0ZW1lbnQgKi8NCi0gIEFTVFRocm93U3RhdGVtZW50IGpqdG4wMDAgPSBuZXcgQVNUVGhyb3dTdGF0ZW1lbnQodGhpcywgSkpUVEhST1dTVEFURU1FTlQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFRocm93U3RhdGVtZW50ICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFRIUk9XPiBMaXN0RXhwcmVzc2lvbigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBUcnkgU3RhdGVtZW50DQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFRyeVN0YXRlbWVudCgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVHJ5U3RhdGVtZW50ICovDQotICBBU1RUcnlTdGF0ZW1lbnQgamp0bjAwMCA9IG5ldyBBU1RUcnlTdGF0ZW1lbnQodGhpcywgSkpUVFJZU1RBVEVNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBUcnlTdGF0ZW1lbnQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VFJZPiBCbG9jaygpDQotICAgICAgICAoPENBVENIPiA8TFBBUkVOPiBJZGVudGlmaWVyKCkgPFJQQVJFTj4gQmxvY2soKSkqDQotICAgICAgICBbPEZJTkFMTFk+IEJsb2NrKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19IA0KLSANCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIERpcmVjdGl2ZXMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIERpcmVjdGl2ZXMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmVzICovDQotICBBU1REaXJlY3RpdmVzIGpqdG4wMDAgPSBuZXcgQVNURGlyZWN0aXZlcyh0aGlzLCBKSlRESVJFQ1RJVkVTKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBEaXJlY3RpdmVzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgKERpcmVjdGl2ZSgpKSsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIERpcmVjdGl2ZSAoKToNCi17LypAYmdlbihqanRyZWUpIERpcmVjdGl2ZSAqLw0KLSAgQVNURGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNURGlyZWN0aXZlKHRoaXMsIEpKVERJUkVDVElWRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRGlyZWN0aXZlICovDQotICAgICAgICAgICAgICAgICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAgICAgICAgICAgICAgIEVtcHR5U3RhdGVtZW50KCkNCi0gICAgIHwgICBMT09LQUhFQUQoMykgU3RhdGVtZW50KCkNCi0gICAgIHwgICBMT09LQUhFQUQoMikgQW5ub3RhdGFibGVEaXJlY3RpdmUoKQ0KLSAgICAgfCAgIExPT0tBSEVBRCgyKSBBdHRyaWJ1dGVzKCkgICAgICAgICAgICA8TEJSQUNFPiBEaXJlY3RpdmVzKCkgPFJCUkFDRT4NCi0gICAgIHwgICBMT09LQUhFQUQoMikgQXR0cmlidXRlcygpICAgICAgICAgICAgQW5ub3RhdGFibGVEaXJlY3RpdmUoKSANCi0gICAgIHwgICAgICAgICAgICAgICAgSW5jbHVkZURpcmVjdGl2ZSgpICAgICAgU2MoKQ0KLSAgICAgfCAgICAgICAgICAgICAgICBQcmFnbWEoKSAgICAgICAgICAgICAgICBTYygpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEFubm90YXRhYmxlRGlyZWN0aXZlICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQW5ub3RhdGFibGVEaXJlY3RpdmUgKi8NCi0gIEFTVEFubm90YXRhYmxlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUodGhpcywgSkpUQU5OT1RBVEFCTEVESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEFubm90YXRhYmxlRGlyZWN0aXZlICovDQotICAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICBWYXJpYWJsZURlZmluaXRpb24oKSBTYygpDQotICAgICB8ICAgRnVuY3Rpb25EZWZpbml0aW9uKCkNCi0gICAgIHwgICBDbGFzc0RlZmluaXRpb24oKQ0KLSAgICAgfCAgIEludGVyZmFjZURlZmluaXRpb24oKQ0KLSAgICAgfCAgIE5hbWVzcGFjZURlZmluaXRpb24oKSBTYygpDQotICAgICB8ICAgSW1wb3J0RGlyZWN0aXZlKCkgU2MoKQ0KLSAgICAgfCAgIEV4cG9ydERlZmluaXRpb24oKSBTYygpDQotICAgICB8ICAgVXNlRGlyZWN0aXZlKCkgU2MoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgfQ0KLSAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgIH0NCi0gICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgICB9DQotICAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEF0dHJpYnV0ZXMNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQXR0cmlidXRlcyAoKToNCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZXMgKi8NCi0gIEFTVEF0dHJpYnV0ZXMgamp0bjAwMCA9IG5ldyBBU1RBdHRyaWJ1dGVzKHRoaXMsIEpKVEFUVFJJQlVURVMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZXMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAoQXR0cmlidXRlICgpKSsvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIEF0dHJpYnV0ZSAoKToNCi17LypAYmdlbihqanRyZWUpIEF0dHJpYnV0ZSAqLw0KLSAgQVNUQXR0cmlidXRlIGpqdG4wMDAgPSBuZXcgQVNUQXR0cmlidXRlKHRoaXMsIEpKVEFUVFJJQlVURSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgQXR0cmlidXRlICovDQotICAgICAgICAgICAgICAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgICAgICAgICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uKCkNCi0gICAgfCAgICAgICAgICAgICAgICA8VFJVRT4NCi0gICAgfCAgICAgICAgICAgICAgICA8RkFMU0U+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICAgICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgICAgICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgICB9DQotICAgICAgICAgICAgICAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICAgICAgICAgICAgICAgfQ0KLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICAgICAgICAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgICAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgICAgICAgICAgICAgIH0NCi0gICAgICAgICAgICAgICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVXNlIERpcmVjdGl2ZQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBVc2VEaXJlY3RpdmUgKCk6DQotey8qQGJnZW4oamp0cmVlKSBVc2VEaXJlY3RpdmUgKi8NCi0gIEFTVFVzZURpcmVjdGl2ZSBqanRuMDAwID0gbmV3IEFTVFVzZURpcmVjdGl2ZSh0aGlzLCBKSlRVU0VESVJFQ1RJVkUpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFVzZURpcmVjdGl2ZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8gDQotICAgICAgICA8VVNFPiA8TkFNRVNQQUNFPiA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+LypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBJbXBvcnQgRGlyZWN0aXZlDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIEltcG9ydERpcmVjdGl2ZSAoKToNCi17LypAYmdlbihqanRyZWUpIEltcG9ydERpcmVjdGl2ZSAqLw0KLSAgQVNUSW1wb3J0RGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUSW1wb3J0RGlyZWN0aXZlKHRoaXMsIEpKVElNUE9SVERJUkVDVElWRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSW1wb3J0RGlyZWN0aXZlICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIDxJTVBPUlQ+IFBhY2thZ2VOYW1lKCkNCi0gICAgfCAgICAgICAgICAgICAgICA8SU1QT1JUPiBJZGVudGlmaWVyKCkgPEFTU0lHTj4gUGFja2FnZU5hbWUoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gSW5jbHVkZSBEaXJlY3RpdmUNCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgSW5jbHVkZURpcmVjdGl2ZSAoKTogDQotey8qQGJnZW4oamp0cmVlKSBJbmNsdWRlRGlyZWN0aXZlICovDQotICBBU1RJbmNsdWRlRGlyZWN0aXZlIGpqdG4wMDAgPSBuZXcgQVNUSW5jbHVkZURpcmVjdGl2ZSh0aGlzLCBKSlRJTkNMVURFRElSRUNUSVZFKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBJbmNsdWRlRGlyZWN0aXZlICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPElOQ0xVREU+IDxTVFJJTkdfTElURVJBTD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBQcmFnbWENCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgUHJhZ21hICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hICovDQotICBBU1RQcmFnbWEgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWEodGhpcywgSkpUUFJBR01BKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWEgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VVNFPiBQcmFnbWFJdGVtcygpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQcmFnbWFJdGVtcyAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYUl0ZW1zICovDQotICBBU1RQcmFnbWFJdGVtcyBqanRuMDAwID0gbmV3IEFTVFByYWdtYUl0ZW1zKHRoaXMsIEpKVFBSQUdNQUlURU1TKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFJdGVtcyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFByYWdtYUl0ZW0oKSAoPENPTU1BPiBQcmFnbWFJdGVtKCkpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQcmFnbWFJdGVtICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbSAqLw0KLSAgQVNUUHJhZ21hSXRlbSBqanRuMDAwID0gbmV3IEFTVFByYWdtYUl0ZW0odGhpcywgSkpUUFJBR01BSVRFTSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgUHJhZ21hSXRlbSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFByYWdtYUV4cHIoKSBbPEhPT0s+XS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLQ0KLXZvaWQgUHJhZ21hRXhwciAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYUV4cHIgKi8NCi0gIEFTVFByYWdtYUV4cHIgamp0bjAwMCA9IG5ldyBBU1RQcmFnbWFFeHByKHRoaXMsIEpKVFBSQUdNQUVYUFIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFByYWdtYUV4cHIgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyKCkgWzxMUEFSRU4+IFByYWdtYUFyZ3VtZW50KCkgPFJQQVJFTj5dLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQcmFnbWFBcmd1bWVudCAoKToNCi17LypAYmdlbihqanRyZWUpIFByYWdtYUFyZ3VtZW50ICovDQotICBBU1RQcmFnbWFBcmd1bWVudCBqanRuMDAwID0gbmV3IEFTVFByYWdtYUFyZ3VtZW50KHRoaXMsIEpKVFBSQUdNQUFSR1VNRU5UKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQcmFnbWFBcmd1bWVudCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxUUlVFPg0KLSAgICB8ICAgPEZBTFNFPg0KLSAgICB8ICAgPERFQ0lNQUxfTElURVJBTD4gDQotICAgIHwgICA8T0NUQUxfTElURVJBTD4NCi0gICAgfCAgIDxIRVhfTElURVJBTD4NCi0gICAgfCAgIDxGTE9BVElOR19QT0lOVF9MSVRFUkFMPiANCi0gICAgfCAgIDxTVFJJTkdfTElURVJBTD4vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8gDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRGVmaW5pdGlvbnMgDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIEV4cG9ydCBEZWZpbml0aW9uIA0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBFeHBvcnREZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwb3J0RGVmaW5pdGlvbiAqLw0KLSAgQVNURXhwb3J0RGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVEV4cG9ydERlZmluaXRpb24odGhpcywgSkpURVhQT1JUREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgRXhwb3J0RGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxFWFBPUlQ+IEV4cG9ydEJpbmRpbmdMaXN0ICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBFeHBvcnRCaW5kaW5nTGlzdCAoKToNCi17LypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmdMaXN0ICovDQotICBBU1RFeHBvcnRCaW5kaW5nTGlzdCBqanRuMDAwID0gbmV3IEFTVEV4cG9ydEJpbmRpbmdMaXN0KHRoaXMsIEpKVEVYUE9SVEJJTkRJTkdMSVNUKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBFeHBvcnRCaW5kaW5nTGlzdCAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIEV4cG9ydEJpbmRpbmcoKSAoPENPTU1BPiBFeHBvcnRCaW5kaW5nKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRXhwb3J0QmluZGluZyAoKToNCi17LypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmcgKi8NCi0gIEFTVEV4cG9ydEJpbmRpbmcgamp0bjAwMCA9IG5ldyBBU1RFeHBvcnRCaW5kaW5nKHRoaXMsIEpKVEVYUE9SVEJJTkRJTkcpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEV4cG9ydEJpbmRpbmcgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMikgRnVuY3Rpb25OYW1lICgpDQotICAgIHwgICAgICAgICAgICAgICAgRnVuY3Rpb25OYW1lICgpIDxBU1NJR04+IEZ1bmN0aW9uTmFtZSAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gVmFyaWFibGUgRGVmaW5pdGlvbiAoaW4sIE5vSU4pDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgQVNUVmFyaWFibGVEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVEZWZpbml0aW9uKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ0xpc3QoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVmFyaWFibGVEZWZpbml0aW9uTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gKi8NCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLQ0KLXZvaWQgVmFyaWFibGVEZWZpbml0aW9uS2luZCAoKToNCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKi8NCi0gIEFTVFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgamp0bjAwMCA9IG5ldyBBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kKHRoaXMsIEpKVFZBUklBQkxFREVGSU5JVElPTktJTkQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8VkFSPg0KLSAgICB8ICAgPENPTlNUPi8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlQmluZGluZ0xpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0ICovDQotICBBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVCaW5kaW5nTGlzdCh0aGlzLCBKSlRWQVJJQUJMRUJJTkRJTkdMSVNUKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmdMaXN0ICovDQotICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICBWYXJpYWJsZUJpbmRpbmcoKSAoPENPTU1BPiBWYXJpYWJsZUJpbmRpbmcgKCkpKi8qQGJnZW4oamp0cmVlKSovDQotICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgfSBlbHNlIHsNCi0gICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgIH0NCi0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgfQ0KLSAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgIH0NCi0gICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgIH0gZmluYWxseSB7DQotICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICB9DQotICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4gKi8NCi0gIEFTVFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVCaW5kaW5nTGlzdE5vSU4odGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTElTVE5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICovDQotICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICBWYXJpYWJsZUJpbmRpbmdOb0lOKCkgKDxDT01NQT4gVmFyaWFibGVCaW5kaW5nTm9JTigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgIH0gZWxzZSB7DQotICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICB9DQotICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgIH0NCi0gICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICB9DQotICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICB9IGZpbmFsbHkgew0KLSAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgfQ0KLSAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmcgKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUJpbmRpbmcgKi8NCi0gIEFTVFZhcmlhYmxlQmluZGluZyBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZyh0aGlzLCBKSlRWQVJJQUJMRUJJTkRJTkcpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlQmluZGluZyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFR5cGVkSWRlbnRpZmllcigpIFtWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUJpbmRpbmdOb0lOICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTm9JTiAqLw0KLSAgQVNUVmFyaWFibGVCaW5kaW5nTm9JTiBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlQmluZGluZ05vSU4odGhpcywgSkpUVkFSSUFCTEVCSU5ESU5HTk9JTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVCaW5kaW5nTm9JTiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFR5cGVkSWRlbnRpZmllck5vSU4oKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICovDQotICBBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbih0aGlzLCBKSlRWQVJJQUJMRUlOSVRJQUxJU0FUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIDxBU1NJR04+ICBWYXJpYWJsZUluaXRpYWxpemVyICgpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgfQ0KLSAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgIH0NCi0gICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gKi8NCi0gIEFTVFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVNBVElPTk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb25Ob0lOICovDQotICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgIDxBU1NJR04+ICBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICB9DQotICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgIH0NCi0gICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICB9DQotICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICB9DQotICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplciAqLw0KLSAgQVNUVmFyaWFibGVJbml0aWFsaXplciBqanRuMDAwID0gbmV3IEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXIodGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVpFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIExPT0tBSEVBRCgzKSBBc3NpZ25tZW50RXhwcmVzc2lvbiAoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgVmFyaWFibGVJbml0aWFsaXplck5vSU4gKi8NCi0gIEFTVFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOIGpqdG4wMDAgPSBuZXcgQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4odGhpcywgSkpUVkFSSUFCTEVJTklUSUFMSVpFUk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFZhcmlhYmxlSW5pdGlhbGl6ZXJOb0lOICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgTE9PS0FIRUFEKDMpIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTiAoKQ0KLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0NCi12b2lkIFR5cGVkSWRlbnRpZmllciAoKToNCi17LypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllciAqLw0KLSAgQVNUVHlwZWRJZGVudGlmaWVyIGpqdG4wMDAgPSBuZXcgQVNUVHlwZWRJZGVudGlmaWVyKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVHlwZWRJZGVudGlmaWVyICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllciAoKSBbPENPTE9OPiBUeXBlRXhwcmVzc2lvbigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVHlwZWRJZGVudGlmaWVyTm9JTiAoKToNCi17LypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllck5vSU4gKi8NCi0gIEFTVFR5cGVkSWRlbnRpZmllck5vSU4gamp0bjAwMCA9IG5ldyBBU1RUeXBlZElkZW50aWZpZXJOb0lOKHRoaXMsIEpKVFRZUEVESURFTlRJRklFUk5PSU4pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFR5cGVkSWRlbnRpZmllck5vSU4gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBJZGVudGlmaWVyICgpIFs8Q09MT04+IFR5cGVFeHByZXNzaW9uTm9JTigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gU2ltcGxlIFZhcmlhYmxlIERlZmluaXRpb24gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbiAqLw0KLSAgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uKHRoaXMsIEpKVFNJTVBMRVZBUklBQkxFREVGSU5JVElPTik7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFZBUj4gVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKCk6DQotey8qQGJnZW4oamp0cmVlKSBVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCAqLw0KLSAgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3Qgamp0bjAwMCA9IG5ldyBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HTElTVCk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBVbnR5cGVkVmFyaWFibGVCaW5kaW5nKCkgKDxDT01NQT4gVW50eXBlZFZhcmlhYmxlQmluZGluZygpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmcgKCk6DQotey8qQGJnZW4oamp0cmVlKSBVbnR5cGVkVmFyaWFibGVCaW5kaW5nICovDQotICBBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nIGpqdG4wMDAgPSBuZXcgQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyh0aGlzLCBKSlRVTlRZUEVEVkFSSUFCTEVCSU5ESU5HKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBVbnR5cGVkVmFyaWFibGVCaW5kaW5nICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgSWRlbnRpZmllcigpIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gRnVuY3Rpb24gRGVmaW5pdGlvbg0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotdm9pZCBGdW5jdGlvbkRlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkRlZmluaXRpb24gKi8NCi0gIEFTVEZ1bmN0aW9uRGVmaW5pdGlvbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uRGVmaW5pdGlvbih0aGlzLCBKSlRGVU5DVElPTkRFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uRGVmaW5pdGlvbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxGVU5DVElPTj4gRnVuY3Rpb25OYW1lKCkgRnVuY3Rpb25Db21tb24oKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgRnVuY3Rpb25OYW1lICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgRnVuY3Rpb25OYW1lICovDQotICBBU1RGdW5jdGlvbk5hbWUgamp0bjAwMCA9IG5ldyBBU1RGdW5jdGlvbk5hbWUodGhpcywgSkpURlVOQ1RJT05OQU1FKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbk5hbWUgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICAvLyBubyBsaW5lIGJyZWFrIGFmdGVyIGdldA0KLSAgICAgICAgTE9PS0FIRUFEKDIpIDxHRVQ+IElkZW50aWZpZXIoKQ0KLSAgICAgICAgLy8gbm8gbGluZSBicmVhayBhZnRlciBnZXQNCi0gICAgfCAgIExPT0tBSEVBRCgyKSA8U0VUPiBJZGVudGlmaWVyKCkNCi0gICAgfCAgICAgICAgICAgICAgICAgSWRlbnRpZmllcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBGdW5jdGlvbkNvbW1vbiAoKToNCi17LypAYmdlbihqanRyZWUpIEZ1bmN0aW9uQ29tbW9uICovDQotICBBU1RGdW5jdGlvbkNvbW1vbiBqanRuMDAwID0gbmV3IEFTVEZ1bmN0aW9uQ29tbW9uKHRoaXMsIEpKVEZVTkNUSU9OQ09NTU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBGdW5jdGlvbkNvbW1vbiAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxMUEFSRU4+IFtQYXJhbWV0ZXJzKCldIDxSUEFSRU4+IFtSZXN1bHQoKV0gQmxvY2soKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFyYW1ldGVycyAoKToNCi17LypAYmdlbihqanRyZWUpIFBhcmFtZXRlcnMgKi8NCi0gIEFTVFBhcmFtZXRlcnMgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXJzKHRoaXMsIEpKVFBBUkFNRVRFUlMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFBhcmFtZXRlcnMgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBSZXN0UGFyYW1ldGVycygpDQotICAgIHwgICBQYXJhbWV0ZXJJbml0KCkgKDxDT01NQT4gUGFyYW1ldGVySW5pdCgpKSogW1Jlc3RQYXJhbWV0ZXJzKCldLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQYXJhbWV0ZXIgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYXJhbWV0ZXIgKi8NCi0gIEFTVFBhcmFtZXRlciBqanRuMDAwID0gbmV3IEFTVFBhcmFtZXRlcih0aGlzLCBKSlRQQVJBTUVURVIpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFBhcmFtZXRlciAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIFs8Q09OU1Q+XSBUeXBlZElkZW50aWZpZXIoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUGFyYW1ldGVySW5pdCAoKToNCi17LypAYmdlbihqanRyZWUpIFBhcmFtZXRlckluaXQgKi8NCi0gIEFTVFBhcmFtZXRlckluaXQgamp0bjAwMCA9IG5ldyBBU1RQYXJhbWV0ZXJJbml0KHRoaXMsIEpKVFBBUkFNRVRFUklOSVQpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFBhcmFtZXRlckluaXQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBQYXJhbWV0ZXIoKSBbPEFTU0lHTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0vKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi12b2lkIFJlc3RQYXJhbWV0ZXJzICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzdFBhcmFtZXRlcnMgKi8NCi0gIEFTVFJlc3RQYXJhbWV0ZXJzIGpqdG4wMDAgPSBuZXcgQVNUUmVzdFBhcmFtZXRlcnModGhpcywgSkpUUkVTVFBBUkFNRVRFUlMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFJlc3RQYXJhbWV0ZXJzICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPEVMSVBTRT4gWzxDT05TVD4gSWRlbnRpZmllcigpXS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgUmVzdWx0ICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUmVzdWx0ICovDQotICBBU1RSZXN1bHQgamp0bjAwMCA9IG5ldyBBU1RSZXN1bHQodGhpcywgSkpUUkVTVUxUKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBSZXN1bHQgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8Q09MT04+IFR5cGVFeHByZXNzaW9uKCkvKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCi0NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLS8vIENsYXNzIERlZmluaXRpb24NCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLw0KLXZvaWQgQ2xhc3NEZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgQ2xhc3NEZWZpbml0aW9uICovDQotICBBU1RDbGFzc0RlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RDbGFzc0RlZmluaXRpb24odGhpcywgSkpUQ0xBU1NERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBDbGFzc0RlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICA8Q0xBU1M+IElkZW50aWZpZXIoKSBbSW5oZXJpdGFuY2UoKV0gQmxvY2soKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLXZvaWQgSW50ZXJmYWNlRGVmaW5pdGlvbiAoKToNCi17LypAYmdlbihqanRyZWUpIEludGVyZmFjZURlZmluaXRpb24gKi8NCi0gIEFTVEludGVyZmFjZURlZmluaXRpb24gamp0bjAwMCA9IG5ldyBBU1RJbnRlcmZhY2VEZWZpbml0aW9uKHRoaXMsIEpKVElOVEVSRkFDRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIEludGVyZmFjZURlZmluaXRpb24gKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovDQotICAgICAgICBMT09LQUhFQUQoMykgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIFNjKCkNCi0gICAgfCAgICAgICAgICAgICAgICA8SU5URVJGQUNFPiBJZGVudGlmaWVyKCkgDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKV0gQmxvY2soKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLQ0KLXZvaWQgSW5oZXJpdGFuY2UgKCk6DQotey8qQGJnZW4oamp0cmVlKSBJbmhlcml0YW5jZSAqLw0KLSAgQVNUSW5oZXJpdGFuY2Ugamp0bjAwMCA9IG5ldyBBU1RJbmhlcml0YW5jZSh0aGlzLCBKSlRJTkhFUklUQU5DRSk7DQotICBib29sZWFuIGpqdGMwMDAgPSB0cnVlOw0KLSAgamp0cmVlLm9wZW5Ob2RlU2NvcGUoamp0bjAwMCk7DQotLypAZWdlbiovfQ0KLXsvKkBiZ2VuKGpqdHJlZSkgSW5oZXJpdGFuY2UgKi8NCi0gICAgICAgIHRyeSB7DQotLypAZWdlbiovIA0KLSAgICAgICAgPEVYVEVORFM+IFR5cGVFeHByZXNzaW9uKCkgWzxJTVBMRU1FTlRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKV0NCi0gICAgfCAgIDxJTVBMRU1FTlRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKS8qQGJnZW4oamp0cmVlKSovDQotICAgICAgICB9IGNhdGNoIChUaHJvd2FibGUgamp0ZTAwMCkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbGVhck5vZGVTY29wZShqanRuMDAwKTsNCi0gICAgICAgICAgICBqanRjMDAwID0gZmFsc2U7DQotICAgICAgICAgIH0gZWxzZSB7DQotICAgICAgICAgICAgamp0cmVlLnBvcE5vZGUoKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFJ1bnRpbWVFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUnVudGltZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUGFyc2VFeGNlcHRpb24pIHsNCi0gICAgICAgICAgICB0aHJvdyAoUGFyc2VFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICB0aHJvdyAoRXJyb3Ipamp0ZTAwMDsNCi0gICAgICAgIH0gZmluYWxseSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsb3NlTm9kZVNjb3BlKGpqdG4wMDAsIHRydWUpOw0KLSAgICAgICAgICB9DQotICAgICAgICB9DQotLypAZWdlbiovDQotfQ0KLQ0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vDQotLy8gTmFtZXNwYWNlIERlZmluaXRpb24gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIE5hbWVzcGFjZURlZmluaXRpb24gKCk6DQotey8qQGJnZW4oamp0cmVlKSBOYW1lc3BhY2VEZWZpbml0aW9uICovDQotICBBU1ROYW1lc3BhY2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUTmFtZXNwYWNlRGVmaW5pdGlvbih0aGlzLCBKSlROQU1FU1BBQ0VERUZJTklUSU9OKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBOYW1lc3BhY2VEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPE5BTUVTUEFDRT4gSWRlbnRpZmllcigpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi0vLyBQYWNrYWdlIERlZmluaXRpb24gDQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8NCi12b2lkIFBhY2thZ2VEZWZpbml0aW9uICgpOg0KLXsvKkBiZ2VuKGpqdHJlZSkgUGFja2FnZURlZmluaXRpb24gKi8NCi0gIEFTVFBhY2thZ2VEZWZpbml0aW9uIGpqdG4wMDAgPSBuZXcgQVNUUGFja2FnZURlZmluaXRpb24odGhpcywgSkpUUEFDS0FHRURFRklOSVRJT04pOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFBhY2thZ2VEZWZpbml0aW9uICovDQotICAgICAgICB0cnkgew0KLS8qQGVnZW4qLw0KLSAgICAgICAgPFBBQ0tBR0U+IFtQYWNrYWdlTmFtZSgpXSBCbG9jaygpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQYWNrYWdlTmFtZSAoKToNCi17LypAYmdlbihqanRyZWUpIFBhY2thZ2VOYW1lICovDQotICBBU1RQYWNrYWdlTmFtZSBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VOYW1lKHRoaXMsIEpKVFBBQ0tBR0VOQU1FKTsNCi0gIGJvb2xlYW4gamp0YzAwMCA9IHRydWU7DQotICBqanRyZWUub3Blbk5vZGVTY29wZShqanRuMDAwKTsNCi0vKkBlZ2VuKi99DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlTmFtZSAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIDxTVFJJTkdfTElURVJBTD4NCi0gICAgfCAgIFBhY2thZ2VJZGVudGlmaWVycygpLypAYmdlbihqanRyZWUpKi8NCi0gICAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBqanRlMDAwKSB7DQotICAgICAgICAgIGlmIChqanRjMDAwKSB7DQotICAgICAgICAgICAgamp0cmVlLmNsZWFyTm9kZVNjb3BlKGpqdG4wMDApOw0KLSAgICAgICAgICAgIGpqdGMwMDAgPSBmYWxzZTsNCi0gICAgICAgICAgfSBlbHNlIHsNCi0gICAgICAgICAgICBqanRyZWUucG9wTm9kZSgpOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIGlmIChqanRlMDAwIGluc3RhbmNlb2YgUnVudGltZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBQYXJzZUV4Y2VwdGlvbikgew0KLSAgICAgICAgICAgIHRocm93IChQYXJzZUV4Y2VwdGlvbilqanRlMDAwOw0KLSAgICAgICAgICB9DQotICAgICAgICAgIHRocm93IChFcnJvcilqanRlMDAwOw0KLSAgICAgICAgfSBmaW5hbGx5IHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xvc2VOb2RlU2NvcGUoamp0bjAwMCwgdHJ1ZSk7DQotICAgICAgICAgIH0NCi0gICAgICAgIH0NCi0vKkBlZ2VuKi8NCi19DQotDQotdm9pZCBQYWNrYWdlSWRlbnRpZmllcnMgKCk6DQotey8qQGJnZW4oamp0cmVlKSBQYWNrYWdlSWRlbnRpZmllcnMgKi8NCi0gIEFTVFBhY2thZ2VJZGVudGlmaWVycyBqanRuMDAwID0gbmV3IEFTVFBhY2thZ2VJZGVudGlmaWVycyh0aGlzLCBKSlRQQUNLQUdFSURFTlRJRklFUlMpOw0KLSAgYm9vbGVhbiBqanRjMDAwID0gdHJ1ZTsNCi0gIGpqdHJlZS5vcGVuTm9kZVNjb3BlKGpqdG4wMDApOw0KLS8qQGVnZW4qL30NCi17LypAYmdlbihqanRyZWUpIFBhY2thZ2VJZGVudGlmaWVycyAqLw0KLSAgICAgICAgdHJ5IHsNCi0vKkBlZ2VuKi8NCi0gICAgICAgIElkZW50aWZpZXIoKSAoPERPVD4gSWRlbnRpZmllcigpKSovKkBiZ2VuKGpqdHJlZSkqLw0KLSAgICAgICAgfSBjYXRjaCAoVGhyb3dhYmxlIGpqdGUwMDApIHsNCi0gICAgICAgICAgaWYgKGpqdGMwMDApIHsNCi0gICAgICAgICAgICBqanRyZWUuY2xlYXJOb2RlU2NvcGUoamp0bjAwMCk7DQotICAgICAgICAgICAgamp0YzAwMCA9IGZhbHNlOw0KLSAgICAgICAgICB9IGVsc2Ugew0KLSAgICAgICAgICAgIGpqdHJlZS5wb3BOb2RlKCk7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgaWYgKGpqdGUwMDAgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFJ1bnRpbWVFeGNlcHRpb24pamp0ZTAwMDsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgICBpZiAoamp0ZTAwMCBpbnN0YW5jZW9mIFBhcnNlRXhjZXB0aW9uKSB7DQotICAgICAgICAgICAgdGhyb3cgKFBhcnNlRXhjZXB0aW9uKWpqdGUwMDA7DQotICAgICAgICAgIH0NCi0gICAgICAgICAgdGhyb3cgKEVycm9yKWpqdGUwMDA7DQotICAgICAgICB9IGZpbmFsbHkgew0KLSAgICAgICAgICBpZiAoamp0YzAwMCkgew0KLSAgICAgICAgICAgIGpqdHJlZS5jbG9zZU5vZGVTY29wZShqanRuMDAwLCB0cnVlKTsNCi0gICAgICAgICAgfQ0KLSAgICAgICAgfQ0KLS8qQGVnZW4qLw0KLX0NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9qczIuMC5qanQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHQyMHBhcnNlci9qczIuMC5qanQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4MDM1YmMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0MjBwYXJzZXIvanMyLjAuamp0CisrKyAvZGV2L251bGwKQEAgLTEsMTUwMSArMCwwIEBACi1vcHRpb25zIHsKLSAgICBTVEFUSUM9ZmFsc2U7Ci0gICAgTVVMVEk9dHJ1ZTsKLSAgICBWSVNJVE9SPXRydWU7Ci0gICAgTk9ERV9VU0VTX1BBUlNFUj10cnVlOwotICAgIERFQlVHX1RPS0VOX01BTkFHRVI9ZmFsc2U7Ci0gICAgREVCVUdfUEFSU0VSPWZhbHNlOwotfQotCi1QQVJTRVJfQkVHSU4oSlNQYXJzZXIyMCkKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHQyMHBhcnNlcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotcHVibGljIGNsYXNzIEpTUGFyc2VyMjAgCi17Ci0gICAgLy8KLSAgICAvLyBUaGlzIGlzIHRoZSByb290IG5vZGUgZm9yIHRoZSBwYXJzZSB0cmVlIChyb290IERPTSBub2RlLCB0cmVlIG9mIFNpbXBsZU5vZGUocykpCi0gICAgLy8KLSAgICBwcm90ZWN0ZWQgQVNUUHJvZ3JhbSBfamp0Um9vdDsKLSAgICAKLSAgICBwdWJsaWMgQVNUUHJvZ3JhbSBnZXRSb290Tm9kZSgpCi0gICAgewotICAgIAlyZXR1cm4gX2pqdFJvb3Q7Ci0gICAgfQotICAgIAotfQotCi1QQVJTRVJfRU5EKEpTUGFyc2VyMjApCi0KLQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTEVYSUNBTCBSVUxFUyBTZWN0aW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU5fTUdSX0RFQ0xTIDoKLXsKLSAgICBwcml2YXRlIGJvb2xlYW4gaXNSZWdWYWxpZCA9IHRydWU7Ci0gICAgcHVibGljIHZvaWQgc2V0UmVnSW52YWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gZmFsc2U7Ci0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldFJlZ1ZhbGlkKCkKLSAgICB7Ci0gICAgICAgIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIH0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFdISVRFIFNQQUNFIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8RU9MOiAgIChbIlxuIiwiXHIiXSkrID4KLSAgICB8ICAgPFdTOiAgICAoWyIgIiwiXHQiXSkrID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBDT01NRU5UUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1NT1JFIDoKLXsKLSAgICAgICAgIi8vIiA6IElOX1NJTkdMRV9MSU5FX0NPTU1FTlQKLSAgICB8ICAgIi8qIiA6IElOX01VTFRJX0xJTkVfQ09NTUVOVAotfQotCi08SU5fU0lOR0xFX0xJTkVfQ09NTUVOVD4KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8IFNJTkdMRV9MSU5FX0NPTU1FTlQ6ICh+WyJcbiIsIlxyIl0pKiAoIlxuInwiXHIifCJcclxuIik/ID4gIDogREVGQVVMVAotfQotCi08SU5fTVVMVElfTElORV9DT01NRU5UPgotU1BFQ0lBTF9UT0tFTiA6Ci17Ci0gICAgICAgIDxNVUxUSV9MSU5FX0NPTU1FTlQ6ICIqLyIgPiA6IERFRkFVTFQKLX0KLQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQsIElOX01VTFRJX0xJTkVfQ09NTUVOVD4KLU1PUkUgOgotewotICAgICAgICA8IH5bXSA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkVTRVJWRUQgV09SRFMgQU5EIExJVEVSQUxTCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFTOiAgICAgICAgICAgImFzIiAgICAgICAgID4KLSAgICB8ICAgPCBCUkVBSzogICAgICAgICJicmVhayIgICAgICA+Ci0gICAgfCAgIDwgQ0FTRTogICAgICAgICAiY2FzZSIgICAgICAgPgotICAgIHwgICA8IENBVENIOiAgICAgICAgImNhdGNoIiAgICAgID4KLSAgICB8ICAgPCBDTEFTUzogICAgICAgICJjbGFzcyIgICAgICA+Ci0gICAgfCAgIDwgQ09OU1Q6ICAgICAgICAiY29uc3QiICAgICAgPgotICAgIHwgICA8IENPTlRJTlVFOiAgICAgImNvbnRpbnVlIiAgID4KLSAgICB8ICAgPCBfREVGQVVMVDogICAgICJkZWZhdWx0IiAgICA+Ci0gICAgfCAgIDwgREVMRVRFOiAgICAgICAiZGVsZXRlIiAgICAgPgotICAgIHwgICA8IERPOiAgICAgICAgICAgImRvIiAgICAgICAgID4KLSAgICB8ICAgPCBFTFNFOiAgICAgICAgICJlbHNlIiAgICAgICA+Ci0gICAgfCAgIDwgRVhURU5EUzogICAgICAiZXh0ZW5kcyIgICAgPgotICAgIHwgICA8IEZBTFNFOiAgICAgICAgImZhbHNlIiAgICAgID4gICAKLSAgICB8ICAgPCBGSU5BTExZOiAgICAgICJmaW5hbGx5IiAgICA+Ci0gICAgfCAgIDwgRk9SOiAgICAgICAgICAiZm9yIiAgICAgICAgPgotICAgIHwgICA8IEZVTkNUSU9OOiAgICAgImZ1bmN0aW9uIiAgID4KLSAgICB8ICAgPCBGVU5DVElPTl86ICAgICJGdW5jdGlvbiIgICA+Ci0gICAgfCAgIDwgR0VUOiAgICAgICAgICAiZ2V0IiAgICAgICAgPgotICAgIHwgICA8IElGOiAgICAgICAgICAgImlmIiAgICAgICAgID4KLSAgICB8ICAgPCBJTjogICAgICAgICAgICJpbiIgICAgICAgICA+Ci0gICAgfCAgIDwgSU5DTFVERTogICAgICAiaW5jbHVkZSIgICAgPgotICAgIHwgICA8IElOU1RBTkNFT0Y6ICAgImluc3RhbmNlb2YiID4KLSAgICB8ICAgPCBJUzogICAgICAgICAgICJpcyIgICAgICAgICA+Ci0gICAgfCAgIDwgTkFNRVNQQUNFOiAgICAibmFtZXNwYWNlIiAgPgotICAgIHwgICA8IE5FVzogICAgICAgICAgIm5ldyIgICAgICAgID4KLSAgICB8ICAgPCBOVUxMOiAgICAgICAgICJudWxsIiAgICAgICA+ICAgIAotICAgIHwgICA8IFBBQ0tBR0U6ICAgICAgInBhY2thZ2UiICAgID4gCi0gICAgfCAgIDwgUFJJVkFURTogICAgICAicHJpdmF0ZSIgICAgPgotICAgIHwgICA8IFBVQkxJQzogICAgICAgInB1YmxpYyIgICAgID4KLSAgICB8ICAgPCBSRVRVUk46ICAgICAgICJyZXR1cm4iICAgICA+Ci0gICAgfCAgIDwgU0VUOiAgICAgICAgICAic2V0IiAgICAgICAgPgotICAgIHwgICA8IFNVUEVSOiAgICAgICAgInN1cGVyIiAgICAgID4KLSAgICB8ICAgPCBTV0lUQ0g6ICAgICAgICJzd2l0Y2giICAgICA+Ci0gICAgfCAgIDwgVEhJUzogICAgICAgICAidGhpcyIgICAgICAgPgotICAgIHwgICA8IFRIUk9XOiAgICAgICAgInRocm93IiAgICAgID4KLSAgICB8ICAgPCBUUlVFOiAgICAgICAgICJ0cnVlIiAgICAgICA+IAotICAgIHwgICA8IFRSWTogICAgICAgICAgInRyeSIgICAgICAgID4KLSAgICB8ICAgPCBUWVBFT0Y6ICAgICAgICJ0eXBlb2YiICAgICA+Ci0gICAgfCAgIDwgVVNFOiAgICAgICAgICAidXNlIiAgICAgICAgPgotICAgIHwgICA8IFZBUjogICAgICAgICAgInZhciIgICAgICAgID4KLSAgICB8ICAgPCBWT0lEOiAgICAgICAgICJ2b2lkIiAgICAgICA+Ci0gICAgfCAgIDwgV0hJTEU6ICAgICAgICAid2hpbGUiICAgICAgPgotICAgIHwgICA8IFdJVEg6ICAgICAgICAgIndpdGgiICAgICAgID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBGVVRVUkUgUkVTRVJWRUQgV09SRFMKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgQUJTVFJBQ1Q6ICAgICAiYWJzdHJhY3QiICAgICA+Ci0gICAgfCAgIDwgREVCVUdHRVI6ICAgICAiZGVidWdnZXIiICAgICA+Ci0gICAgfCAgIDwgRU5VTTogICAgICAgICAiZW51bSIgICAgICAgICA+Ci0gICAgfCAgIDwgRVhQT1JUOiAgICAgICAiZXhwb3J0IiAgICAgICA+Ci0gICAgfCAgIDwgR09UTzogICAgICAgICAiZ290byIgICAgICAgICA+Ci0gICAgfCAgIDwgSU1QTEVNRU5UUzogICAiaW1wbGVtZW50cyIgICA+Ci0gICAgfCAgIDwgSU5URVJGQUNFOiAgICAiaW50ZXJmYWNlIiAgICA+Ci0gICAgfCAgIDwgTkFUSVZFOiAgICAgICAibmF0aXZlIiAgICAgICA+Ci0gICAgfCAgIDwgUFJPVEVDVEVEOiAgICAicHJvdGVjdGVkIiAgICA+Ci0gICAgfCAgIDwgU1lOQ0hST05JWkVEOiAic3luY2hyb25pemVkIiA+Ci0gICAgfCAgIDwgVEhST1dTOiAgICAgICAidGhyb3dzIiAgICAgICA+Ci0gICAgfCAgIDwgVFJBTlNJRU5UOiAgICAidHJhbnNpZW50IiAgICA+Ci0gICAgfCAgIDwgVk9MQVRJTEU6ICAgICAidm9sYXRpbGUiICAgICA+Ci0gICAgfCAgIDwgSU1QT1JUOiAgICAgICAiaW1wb3J0IiAgICAgICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTElURVJBTFMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IERFQ0lNQUxfTElURVJBTDogWyIxIi0iOSJdIChbIjAiLSI5Il0pKiA+Ci0gICAgfCAgIDwgSEVYX0xJVEVSQUw6ICIwIiBbIngiLCJYIl0gKFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0pKyA+Ci0gICAgfCAgIDwgT0NUQUxfTElURVJBTDogIjAiIChbIjAiLSI3Il0pKiA+Ci0gICAgfCAgIDwgRkxPQVRJTkdfUE9JTlRfTElURVJBTDogKFsiMCItIjkiXSkrICIuIiAoWyIwIi0iOSJdKSogKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICIuIiAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgIChbIjAiLSI5Il0pKyAoPEVYUE9ORU5UPik/IAotICAgICAgICA+Ci0gICAgfCAgIDwgI0VYUE9ORU5UOiBbImUiLCJFIl0gKFsiKyIsIi0iXSk/IChbIjAiLSI5Il0pKyA+Ci0gICAgfCAgIDwgU1RSSU5HX0xJVEVSQUw6ICAgIlwiIiAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIlwiIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh+WyJcIiIsIlxcIl0pIHwgIlxcIiAoIlxuIiB8ICJcciIgfCAiXHJcbiIpIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiAgCi0gICAgICAgICAgICAgICAgICAgICAgICB8ICAgIiciCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiJyIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiciCi0gICAgICAgID4KLSAgICB8ICAgPCAjRVNDQVBFX1NFUVVFTkNFOiAKLSAgICAgICAgICAgICJcXCIKLSAgICAgICAgICAgICggICAgICAgWyJuIiwidCIsImIiLCJyIiwiZiIsIlxcIiwiJyIsIlwiIiwiWyIsIl0iXQotICAgICAgICAgICAgICAgIHwgICBbIjAiLSI3Il0gKCBbIjAiLSI3Il0gKT8KLSAgICAgICAgICAgICAgICB8ICAgWyIwIi0iMyJdIFsiMCItIjciXSBbIjAiLSI3Il0KLSAgICAgICAgICAgICAgICB8ICAgWyJ4Il0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdCi0gICAgICAgICAgICAgICAgfCAgIFsidSJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdCi0gICAgICAgICAgICApCi0gICAgICAgID4KLSAgICB8ICAgPCBVTlRFUk1JTkFURURfU1RSSU5HX0xJVEVSQUw6Ci0gICAgICAgICAgICAgICAgIlwiIiAoICh+WyJcIiIsIlxcIiwiXG4iLCJcciJdKSB8IDxFU0NBUEVfU0VRVUVOQ0U+ICkqICggWyJcbiIsIlxyIl0gKT8KLSAgICAgICAgICAgIHwgICAiJyIgICggKH5bIiciLCJcXCIsIlxuIiwiXHIiXSkgIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogKCBbIlxuIiwiXHIiXSApPwotICAgICAgICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUkVHVUxBUiBFWFBSRVNTSU9OUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17IAotICAgICAgICA8ICNSRUdYX1NUQVJUX0NIQVIgOiB+WyJcciIsIlxuIiwiLyIsIj0iLCIqIl0gfCAiXFwvIj4KLSAgICB8ICAgPCAjUkVHWF9CT0RZX0NIQVJfRVhDTFVTSU9OIDogflsiXHIiLCJcbiIsIi8iXSA+ICAKLSAgICB8ICAgPCAjUkVHWF9CT0RZX0NIQVIgOiAoIDxSRUdYX0JPRFlfQ0hBUl9FWENMVVNJT04+IHwgIlxcLyIgKSA+Ci0gICAgfCAgIDwgI1JFR0VYX0VORF9DSEFSIDogICAgICJpIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpZ20iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiaW1nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdtaSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJnaW0iIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWlnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1naSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgID4KLX0KLQotVE9LRU4gOgotewotICAgICAgICA8UkVHVUxBUl9FWFBSRVNTSU9OIDogIi8iIDxSRUdYX1NUQVJUX0NIQVI+ICg8UkVHWF9CT0RZX0NIQVI+KSogIi8iICAoPFJFR0VYX0VORF9DSEFSPik/ID4KLSAgICAgICAgewotICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICAgIC8vIFBlZWsgYXQgdGhlIG5leHQgY2hhcmFjdGVyLgotICAgICAgICAgICAgICAgIGNoYXIgbmV4dENoID0gaW5wdXRfc3RyZWFtLnJlYWRDaGFyKCk7Ci0gICAgICAgICAgICAgICAgaW5wdXRfc3RyZWFtLmJhY2t1cCgxKTsKLSAgICAgICAgICAgICAgICBpZiAoaXNSZWdWYWxpZCA9PSBmYWxzZSB8fCBuZXh0Q2ggPT0gJy8nIHx8IG5leHRDaCA9PSAnKicpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gTGV4ZWNhbCBhbmFseXNlciB0aGlua3MgaXQgaXMgYSBSRQotICAgICAgICAgICAgICAgICAgICAvLyBvcGVyYXRvciBzdWNoIGFzIC8uLi4uLi8KLSAgICAgICAgICAgICAgICAgICAgLy8gUHV0IHRoZSBldmVyeXRoaW5nIHRvIHRoZSBmaXJzdCAiLyIgYmFjayBvbiB0aGUgaW5wdXQgc3RyZWFtCi0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAobGVuZ3RoT2ZNYXRjaC0xKTsKLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgLy8gQW5kIHJlbW92ZSBpdCBmcm9tIHRoZSB0b2tlbgotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4uaW1hZ2UgPSBtYXRjaGVkVG9rZW4uaW1hZ2Uuc3Vic3RyaW5nKDAsIDEpOwotICAgICAgICAgICAgICAgICAgICBpbWFnZS5kZWxldGUoMCwgaW1hZ2UubGVuZ3RoKCkgLSAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuYXBwZW5kKCcvJyk7Ci0gICAgICAgICAgICAgICAgICAgIG1hdGNoZWRUb2tlbi5raW5kPVNMQVNIOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKGUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICB9Ci0gICAgICAgfSAgICAgICAgCi0gICAgICAgIAotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElERU5USUZJRVJTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBJREVOVElGSUVSOiA8TEVUVEVSPiAoPExFVFRFUj58PERJR0lUPikqID4KLSAgICB8ICAgPCAjTEVUVEVSOiBbImEiLSJ6IiwiQSItIloiLCIkIiwiXyJdID4KLSAgICB8ICAgPCAjRElHSVQ6IFsiMCItIjkiXT4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTRVBBUkFUT1JTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBMUEFSRU46ICAgICIoIiAgID4KLSAgICB8ICAgPCBSUEFSRU46ICAgICIpIiAgID4KLSAgICB8ICAgPCBMQlJBQ0U6ICAgICJ7IiAgID4KLSAgICB8ICAgPCBSQlJBQ0U6ICAgICJ9IiAgID4KLSAgICB8ICAgPCBMQlJBQ0tFVDogICJbIiAgID4KLSAgICB8ICAgPCBSQlJBQ0tFVDogICJdIiAgID4KLSAgICB8ICAgPCBTRU1JQ09MT046ICI7IiAgID4KLSAgICB8ICAgPCBDT01NQTogICAgICIsIiAgID4KLSAgICB8ICAgPCBET1Q6ICAgICAgICIuIiAgID4KLSAgICB8ICAgPCBRVUFMSUZJRVI6ICI6OiIgID4KLSAgICB8ICAgPCBFTElQU0U6ICAgICIuLi4iID4KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE9QRVJBVE9SUyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1UT0tFTiA6Ci17Ci0gICAgICAgIDwgQVNTSUdOOiAgICAgICAgICAgICAgICI9IiAgICA+Ci0gICAgfCAgIDwgR1Q6ICAgICAgICAgICAgICAgICAgICI+IiAgICA+Ci0gICAgfCAgIDwgTFQ6ICAgICAgICAgICAgICAgICAgICI8IiAgICA+Ci0gICAgfCAgIDwgQkFORzogICAgICAgICAgICAgICAgICIhIiAgICA+Ci0gICAgfCAgIDwgVElMREU6ICAgICAgICAgICAgICAgICJ+IiAgICA+Ci0gICAgfCAgIDwgSE9PSzogICAgICAgICAgICAgICAgICI/IiAgICA+Ci0gICAgfCAgIDwgQ09MT046ICAgICAgICAgICAgICAgICI6IiAgICA+Ci0gICAgfCAgIDwgRVE6ICAgICAgICAgICAgICAgICAgICI9PSIgICA+Ci0gICAgfCAgIDwgTEU6ICAgICAgICAgICAgICAgICAgICI8PSIgICA+Ci0gICAgfCAgIDwgR0U6ICAgICAgICAgICAgICAgICAgICI+PSIgICA+Ci0gICAgfCAgIDwgTkU6ICAgICAgICAgICAgICAgICAgICIhPSIgICA+Ci0gICAgfCAgIDwgU0NfT1I6ICAgICAgICAgICAgICAgICJ8fCIgICA+Ci0gICAgfCAgIDwgU0NfQU5EOiAgICAgICAgICAgICAgICImJiIgICA+Ci0gICAgfCAgIDwgU0NfWE9SOiAgICAgICAgICAgICAgICJeXiIgICA+Ci0gICAgfCAgIDwgSU5DUjogICAgICAgICAgICAgICAgICIrKyIgICA+Ci0gICAgfCAgIDwgREVDUjogICAgICAgICAgICAgICAgICItLSIgICA+Ci0gICAgfCAgIDwgUExVUzogICAgICAgICAgICAgICAgICIrIiAgICA+Ci0gICAgfCAgIDwgTUlOVVM6ICAgICAgICAgICAgICAgICItIiAgICA+Ci0gICAgfCAgIDwgU1RBUjogICAgICAgICAgICAgICAgICIqIiAgICA+Ci0gICAgfCAgIDwgU0xBU0g6ICAgICAgICAgICAgICAgICIvIiAgICA+Ci0gICAgfCAgIDwgQklUX0FORDogICAgICAgICAgICAgICImIiAgICA+Ci0gICAgfCAgIDwgQklUX09SOiAgICAgICAgICAgICAgICJ8IiAgICA+Ci0gICAgfCAgIDwgWE9SOiAgICAgICAgICAgICAgICAgICJeIiAgICA+Ci0gICAgfCAgIDwgUkVNOiAgICAgICAgICAgICAgICAgICIlIiAgICA+Ci0gICAgfCAgIDwgTFNISUZUOiAgICAgICAgICAgICAgICI8PCIgICA+Ci0gICAgfCAgIDwgUlNJR05FRFNISUZUOiAgICAgICAgICI+PiIgICA+Ci0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlQ6ICAgICAgICI+Pj4iICA+Ci0gICAgfCAgIDwgUExVU0FTU0lHTjogICAgICAgICAgICIrPSIgICA+Ci0gICAgfCAgIDwgTUlOVVNBU1NJR046ICAgICAgICAgICItPSIgICA+Ci0gICAgfCAgIDwgU1RBUkFTU0lHTjogICAgICAgICAgICIqPSIgICA+Ci0gICAgfCAgIDwgU0xBU0hBU1NJR046ICAgICAgICAgICIvPSIgICA+Ci0gICAgfCAgIDwgQU5EQVNTSUdOOiAgICAgICAgICAgICImPSIgICA+Ci0gICAgfCAgIDwgT1JBU1NJR046ICAgICAgICAgICAgICJ8PSIgICA+Ci0gICAgfCAgIDwgWE9SQVNTSUdOOiAgICAgICAgICAgICJePSIgICA+Ci0gICAgfCAgIDwgUkVNQVNTSUdOOiAgICAgICAgICAgICIlPSIgICA+Ci0gICAgfCAgIDwgTFNISUZUQVNTSUdOOiAgICAgICAgICI8PD0iICA+Ci0gICAgfCAgIDwgUlNJR05FRFNISUZUQVNTSUdOOiAgICI+Pj0iICA+Ci0gICAgfCAgIDwgUlVOU0lHTkVEU0hJRlRBU1NJR046ICI+Pj49IiA+Ci0gICAgfCAgIDwgU0NfT1JBU1NJR046ICAgICAgICAgICJ8fD0iICA+Ci0gICAgfCAgIDwgU0NfQU5EQVNTSUdOOiAgICAgICAgICImJj0iICA+Ci0gICAgfCAgIDwgU0NfWE9SQVNTSUdOOiAgICAgICAgICJeXj0iICA+Ci0gICAgfCAgIDwgSURFTlRJVFlPUEVSOiAgICAgICAgICI9PT0iICA+Ci0gICAgfCAgIDwgTk9USURFTlRJVFlPUEVSOiAgICAgICIhPT0iICA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBHUkFNTUFSIFNlY3Rpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotVG9rZW4gUHJvZ3JhbSgpOgotewotICAgICAgICBUb2tlbiByZXR2YWwgPSBnZXRUb2tlbigxKTsKLX0KLXsKLSAgICAgICAgKFBhY2thZ2VEZWZpbml0aW9uKCkpKiBbRGlyZWN0aXZlcygpXSA8RU9GPgotICAgICAgICB7Ci0gICAgICAgICAgICBfamp0Um9vdCA9IGpqdFRoaXM7Ci0gICAgICAgICAgICByZXR1cm4gcmV0dmFsOwotICAgICAgICB9Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFeHByZXNzaW9ucyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJZGVudGlmaWVyIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgSWRlbnRpZmllcigpOgote30KLXsKLSAgICAgICAgPElERU5USUZJRVI+Ci0gICAgfCAgIDxHRVQ+Ci0gICAgfCAgIDxTRVQ+Ci0gICAgfCAgIDxJTkNMVURFPgotLy8gICAgfCAgIDxOQU1FU1BBQ0U+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBRdWFsaWZpZWQgSWRlbnRpZmllciAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFNpbXBsZVF1YWxpZmllZElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgSWRlbnRpZmllcigpIFs8UVVBTElGSUVSPiBJZGVudGlmaWVyKCldCi0gICAgfCAgUmVzZXJ2ZWROYW1lc3BhY2UoKSBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXSAKLX0KLQotdm9pZCBFeHByZXNzaW9uUXVhbGlmaWVkSWRlbnRpZmllcigpOgote30KLXsKLSAgICAgICA8TFBBUkVOPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpIDxSUEFSRU4+IDxRVUFMSUZJRVI+IElkZW50aWZpZXIoKQotfQotCi12b2lkIFF1YWxpZmllZElkZW50aWZpZXIoKToKLXt9Ci17Ci0gICAgICAgU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllcigpCi0gICAgfCAgRXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJpbWFyeSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUHJpbWFyeUV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICgKLSAgICAgICAgPE5VTEw+Ci0gICAgfCAgIDxUUlVFPgotICAgIHwgICA8RkFMU0U+Ci0gICAgfCAgIDxERUNJTUFMX0xJVEVSQUw+IAotICAgIHwgICA8T0NUQUxfTElURVJBTD4KLSAgICB8ICAgPEhFWF9MSVRFUkFMPgotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gCi0gICAgfCAgIDxTVFJJTkdfTElURVJBTD4gCi0gICAgfCAgIDxUSElTPgotICAgIHwgICA8UkVHVUxBUl9FWFBSRVNTSU9OPgotICAgIHwgICA8TFBBUkVOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+Ci0gICAgfCAgIEFycmF5TGl0ZXJhbCgpCi0gICAgfCAgIE9iamVjdExpdGVyYWwoKQotICAgIHwgICBGdW5jdGlvbkV4cHJlc3Npb24oKQotICAgICkKLSAgICB7Ci0gICAgICAgIHRva2VuX3NvdXJjZS5zZXRSZWdWYWxpZCgpOwotICAgIH0KLX0KLQotdm9pZCBSZXNlcnZlZE5hbWVzcGFjZSAoKToKLXt9Ci17Ci0gICAgICAgPFBVQkxJQz4KLSAgICB8ICA8UFJPVEVDVEVEPgotICAgIHwgIDxQUklWQVRFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRnVuY3Rpb24gRXhwcmVzc2lvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgIEZ1bmN0aW9uRXhwcmVzc2lvbiAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSA8RlVOQ1RJT04+IEZ1bmN0aW9uQ29tbW9uKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxGVU5DVElPTj4gSWRlbnRpZmllcigpIEZ1bmN0aW9uQ29tbW9uKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIE9iamVjdCBMaXRlcmFscwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgT2JqZWN0TGl0ZXJhbCAoKToKLXt9Ci17Ci0gICAgICAgIDxMQlJBQ0U+IFtGaWVsZExpc3QoKV0gPFJCUkFDRT4gIAotfSAgICAgICAgCi0KLXZvaWQgRmllbGRMaXN0KCk6Ci17fQotewotICAgICAgICBMaXRlcmFsRmllbGQoKSAoPENPTU1BPiBMaXRlcmFsRmllbGQoKSkqCi19Ci0KLXZvaWQgTGl0ZXJhbEZpZWxkICgpOgote30KLXsKLSAgICAgICAgRmllbGROYW1lKCkgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi19Ci0KLXZvaWQgRmllbGROYW1lICgpOgote30KLXsKLSAgICAgICAgPFNUUklOR19MSVRFUkFMPgotICAgIHwgICA8REVDSU1BTF9MSVRFUkFMPgotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkKLSAgICB8ICAgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiBbPFFVQUxJRklFUj4gSWRlbnRpZmllcigpXQotfQkKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEFycmF5IExpdGVyYWwKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEFycmF5TGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgPExCUkFDS0VUPiBbRWxlbWVudExpc3QoKV0gPFJCUkFDS0VUPgotfQotCi12b2lkIEVsZW1lbnRMaXN0KCk6Ci17fQotewotICAgICAgICBMaXRlcmFsRWxlbWVudCgpICg8Q09NTUE+IExpdGVyYWxFbGVtZW50KCkpKgotfQotCi12b2lkIExpdGVyYWxFbGVtZW50KCk6Ci17fQotewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTdXBlciBFeHByZXNzaW9uCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBTdXBlckV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICA8U1VQRVI+IFtMT09LQUhFQUQoMikgPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPl0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBvc3RmaXggRXhwcmVzc2lvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUG9zdGZpeEV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBBdHRyaWJ1dGVFeHByZXNzaW9uICgpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtQb3N0Zml4T3AoKV0KLSAgICB8ICAge3Rva2VuX3NvdXJjZS5zZXRSZWdJbnZhbGlkKCk7fSAKLSAgICAgICAgRnVsbFBvc3RmaXhFeHByZXNzaW9uICgpIChQcm9wZXJ0eU9yQXJndW1lbnRzKCkpKiBbUG9zdGZpeE9wKCldCi0gICAgfCAgIFN1cGVyRXhwcmVzc2lvbigpICAgICAgICAgUHJvcGVydHlPcGVyYXRvcigpCi19ICAgIAotCi12b2lkIEF0dHJpYnV0ZUV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkgIChQcm9wZXJ0eU9yQXJndW1lbnRzKCkpKgotfQotCi12b2lkIEZ1bGxQb3N0Zml4RXhwcmVzc2lvbiAoKToKLXt9Ci17Ci0gICAgICAgTE9PS0FIRUFEKDxMUEFSRU4+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4gPFFVQUxJRklFUj4pIAotICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkKLSAgICB8ICBQcmltYXJ5RXhwcmVzc2lvbigpIAotICAgIHwgIEZ1bGxOZXdFeHByZXNzaW9uKCkgICAgICAgICAgICAgCi19Ci0KLXZvaWQgRnVsbE5ld0V4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICA8TkVXPiBGdWxsTmV3U3ViZXhwcmVzc2lvbigpICAoTE9PS0FIRUFEKDIpIFByb3BlcnR5T3BlcmF0b3IoKSkqIFtMT09LQUhFQUQoMikgQXJndW1lbnRzKCldCi19Ci0KLXZvaWQgRnVuY3Rpb25Db25zdHJ1Y3RvcigpOgote30KLXsgICAgCi0gICAgICAgIDxGVU5DVElPTl8+IEFyZ3VtZW50cygpCi19Ci0KLXZvaWQgRnVsbE5ld1N1YmV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoPExQQVJFTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKSA8UlBBUkVOPiA8UVVBTElGSUVSPikgCi0gICAgICAgIEV4cHJlc3Npb25RdWFsaWZpZWRJZGVudGlmaWVyKCkgICAgICAgIAotICAgIHwgICBQcmltYXJ5RXhwcmVzc2lvbigpIAotICAgIHwgICBTaW1wbGVRdWFsaWZpZWRJZGVudGlmaWVyKCkKLSAgICB8ICAgU3VwZXJFeHByZXNzaW9uKCkgCi0gICAgfCAgIEZ1bGxOZXdFeHByZXNzaW9uKCkKLSAgICB8ICAgRnVuY3Rpb25Db25zdHJ1Y3RvcigpCi19Ci0KLQotdm9pZCBQb3N0Zml4T3AoKToKLXt9Ci17Ci0gICAgICAgIDxJTkNSPgotICAgIHwgICA8REVDUj4KLX0KLQotdm9pZCBQcm9wZXJ0eU9yQXJndW1lbnRzICgpOgote30KLXsKLSAgICAgICAgQXJndW1lbnRzKCkgICAgICAgIAotICAgIHwgICBQcm9wZXJ0eU9wZXJhdG9yKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFByb3BlcnR5IE9wZXJhdG9ycwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUHJvcGVydHlPcGVyYXRvciAoKToKLXt9Ci17ICAgICAgICAgIAotICAgICAgICA8RE9UPiAgICAgIFF1YWxpZmllZElkZW50aWZpZXIoKQotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8UkJSQUNLRVQ+Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8TEJSQUNLRVQ+IDxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJCUkFDS0VUPgotICAgIHwgICAgICAgICAgICAgICAgPExCUkFDS0VUPiBMaXN0RXhwcmVzc2lvbigpIFs8RUxJUFNFPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXSA8UkJSQUNLRVQ+Ci19Ci0KLXZvaWQgQXJndW1lbnRzICgpOgote3t0b2tlbl9zb3VyY2Uuc2V0UmVnVmFsaWQoKTt9fQotewotICAgICAgICBMT09LQUhFQUQoMikgPExQQVJFTj4gPFJQQVJFTj4KLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxMUEFSRU4+IDxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgPFJQQVJFTj4KLSAgICB8ICAgICAgICAgICAgICAgIDxMUEFSRU4+IExpc3RFeHByZXNzaW9uKCkgWzxFTElQU0U+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCldIDxSUEFSRU4+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVbmFyeSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBVbmFyeUV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICAgICAgICAgICBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgIDxERUxFVEU+IFBvc3RmaXhFeHByZXNzaW9uKCkKLSAgICB8ICAgPFZPSUQ+ICAgVW5hcnlFeHByZXNzaW9uKCkKLSAgICB8ICAgPFRZUEVPRj4gVW5hcnlFeHByZXNzaW9uKCkKLSAgICB8ICAgPElOQ1I+ICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICA8REVDUj4gICBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgIDxQTFVTPiAgIFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxNSU5VUz4gIFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxUSUxERT4gIFVuYXJ5RXhwcmVzc2lvbigpCi0gICAgfCAgIDxCQU5HPiAgIFVuYXJ5RXhwcmVzc2lvbigpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBNdWx0aXBsaWNhdGl2ZSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBNdWxPcCgpOgote30KLXsKLSAgICAgICAgPFNUQVI+Ci0gICAgfCAgIDxTTEFTSD4KLSAgICB8ICAgPFJFTT4gCi19Ci0KLXZvaWQgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoTXVsT3AoKSBVbmFyeUV4cHJlc3Npb24oKSkqCi0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEFkZGl0aXZlIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEFkZE9wKCk6Ci17fQotewotICAgICAgICA8UExVUz4KLSAgICB8ICAgPE1JTlVTPgotfQotCi12b2lkIEFkZGl0aXZlRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkgKEFkZE9wKCkgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCkpKgotfSAKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEJpdHdpc2UgU2hpZnQgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU2hpZnRPcCgpOgote30KLXsKLSAgICAgICAgPExTSElGVD4KLSAgICB8ICAgPFJTSUdORURTSElGVD4KLSAgICB8ICAgPFJVTlNJR05FRFNISUZUPgotfQotCi12b2lkIFNoaWZ0RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCkgKFNoaWZ0T3AoKSBBZGRpdGl2ZUV4cHJlc3Npb24oKSkqCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSZWxhdGlvbmFsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFJlbE9wKCk6Ci17fQotewotICAgICAgICA8TFQ+Ci0gICAgfCAgIDxHVD4gCi0gICAgfCAgIDxMRT4gCi0gICAgfCAgIDxHRT4KLSAgICB8ICAgPElTPgotICAgIHwgICA8QVM+Ci19Ci0KLXZvaWQgUmVsYXRpb25hbEV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgKExPT0tBSEVBRCgzKShSZWxPcCgpIHwgPElOPiB8IDxJTlNUQU5DRU9GPiApIFNoaWZ0RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgKChSZWxPcCgpIHwgPElOU1RBTkNFT0Y+KSAgU2hpZnRFeHByZXNzaW9uKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXF1YWxpdHkgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRXF1YWxPcCgpOgote30KLXsKLSAgICAgICAgPEVRPiAKLSAgICB8ICAgPE5FPiAKLSAgICB8ICAgPElERU5USVRZT1BFUj4gCi0gICAgfCAgIDxOT1RJREVOVElUWU9QRVI+Ci19Ci0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBSZWxhdGlvbmFsRXhwcmVzc2lvbigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkgKEVxdWFsT3AoKSBSZWxhdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBCaW5hcnkgQml0d2lzZSBPcGVyYXRvcnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBCaXR3aXNlQU5ET3AoKToKLXt9Ci17Ci0gICAgICAgIDxCSVRfQU5EPgotfQotCi12b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBFcXVhbGl0eUV4cHJlc3Npb24oKSAoQml0d2lzZUFORE9wKCkgRXF1YWxpdHlFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlQU5ET3AoKSBFcXVhbGl0eUV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0KLXZvaWQgQml0d2lzZVhPUk9wKCk6Ci17fQotewotICAgICAgICA8WE9SPgotfQotCi12b2lkIEJpdHdpc2VYT1JFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VBTkRFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlWE9ST3AoKSBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLXZvaWQgQml0d2lzZU9ST3AoKToKLXt9Ci17Ci0gICAgICAgIDxCSVRfT1I+Ci19Ci0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb24oKSAoQml0d2lzZU9ST3AoKSBCaXR3aXNlWE9SRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlT1JFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkgKEJpdHdpc2VPUk9wKCkgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmluYXJ5IExvZ2ljYWwgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgTG9naWNhbEFOREV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb24oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCkgKDxTQ19BTkQ+IEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIExvZ2ljYWxPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uKCkgKDxTQ19PUj4gTG9naWNhbEFOREV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpICg8U0NfT1I+IExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbmRpdGlvbmFsIE9wZXJhdG9ycyAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpIFs8SE9PSz4gIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpXQotfQotCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIExvZ2ljYWxPUkV4cHJlc3Npb25Ob0lOKCkgIFs8SE9PSz4gIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0KLX0KLQotdm9pZCBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpIFs8SE9PSz4gIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpXQotfQotCi12b2lkIE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKSBbPEhPT0s+ICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPENPTE9OPiBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEFzc2lnbm1lbnQgT3BlcmF0b3JzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQXNzaWduZW1lbnRPcGVyYXRvcigpOgote30KLXsKLSAgICAgICAgPEFTU0lHTj4KLSAgICB8ICAgPFNUQVJBU1NJR04+Ci0gICAgfCAgIDxTTEFTSEFTU0lHTj4gCi0gICAgfCAgIDxSRU1BU1NJR04+IAotICAgIHwgICA8UExVU0FTU0lHTj4KLSAgICB8ICAgPE1JTlVTQVNTSUdOPiAKLSAgICB8ICAgPExTSElGVEFTU0lHTj4gCi0gICAgfCAgIDxSU0lHTkVEU0hJRlRBU1NJR04+Ci0gICAgfCAgIDxSVU5TSUdORURTSElGVEFTU0lHTj4KLSAgICB8ICAgPEFOREFTU0lHTj4gCi0gICAgfCAgIDxYT1JBU1NJR04+IAotICAgIHwgICA8T1JBU1NJR04+Ci0gICAgfCAgIDxTQ19BTkRBU1NJR04+Ci0gICAgfCAgIDxTQ19YT1JBU1NJR04+Ci0gICAgfCAgIDxTQ19PUkFTU0lHTj4KLSAKLX0KLQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uKCkgW0xPT0tBSEVBRCgyKSBBc3NpZ25lbWVudE9wZXJhdG9yKCkgQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIENvbmRpdGlvbmFsRXhwcmVzc2lvbk5vSU4oKSBbTE9PS0FIRUFEKDIpIEFzc2lnbmVtZW50T3BlcmF0b3IoKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKV0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENvbW1hIEV4cHJlc3Npb25zCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBMaXN0RXhwcmVzc2lvbiAoKToKLXt9Ci17Ci0gICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb24oKSkqCi19ICAgCi0KLXZvaWQgTGlzdEV4cHJlc3Npb25Ob0lOICgpOgote30KLXsKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgKDxDT01NQT4gQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkpKgotfSAgIAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVHlwZSBFeHByZXNzaW9ucwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVHlwZUV4cHJlc3Npb24gKCk6Ci17fQotewotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpCi19Ci0KLXZvaWQgVHlwZUV4cHJlc3Npb25Ob0lOICgpOgote30KLXsKLSAgICAgICAgTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkKLX0KLQotdm9pZCBUeXBlRXhwcmVzc2lvbkxpc3QgKCk6Ci17fQotewotICAgICAgICBOb25Bc3NpZ25tZW50RXhwcmVzc2lvbigpICg8Q09NTUE+IE5vbkFzc2lnbm1lbnRFeHByZXNzaW9uKCkpKgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN0YWVtZW50cyAoYWJicmV2LCBub1Nob3J0SWYsIGZ1bGwpIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIEV4cHJlc3Npb25TdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBTdXBlclN0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIEJsb2NrKCkKLSAgICB8ICAgICAgICAgICAgICAgIExhYmVsZWRTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgSWZTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgU3dpdGNoU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIERvU3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgV2hpbGVTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgRm9yU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIFdpdGhTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgQ29udGludWVTdGF0ZW1lbnQoKSBTYygpCi0gICAgfCAgICAgICAgICAgICAgICBCcmVha1N0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFJldHVyblN0YXRlbWVudCgpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIFRocm93U3RhdGVtZW50KCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgVHJ5U3RhdGVtZW50KCkKLX0KLQotdm9pZCBTdWJzdGF0ZW1lbnQgKCk6Ci17fQotewotICAgICAgICAgICAgICAgICAgICAgRW1wdHlTdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoMikgU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgIFNpbXBsZVZhcmlhYmxlRGVmaW5pdGlvbigpIFNjKCkKLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMoKSAgICAgICAgICAgICAgIDxMQlJBQ0U+IFN1YnN0YXRlbWVudHMoKSA8UkJSQUNFPgotfQotCi12b2lkIFN1YnN0YXRlbWVudHMgKCk6Ci17fQotewotICAgICAgICAoU3Vic3RhdGVtZW50KCkpKwotfQotCi1KQVZBQ09ERQotICB2b2lkIFNjKCkgewotICAgIFRva2VuIHRvayA9IGdldFRva2VuKDEpOwotICAgIGlmICh0b2sua2luZCA9PSBTRU1JQ09MT04pIHsKLSAgICAgICB0b2sgPSBnZXROZXh0VG9rZW4oKTsKLSAgICB9IGVsc2UgaWYgKHRvay5zcGVjaWFsVG9rZW4gIT0gbnVsbCkgewotICAgICAgIGlmICghRW9sQ29tbWVudFNraXBXcyh0b2suc3BlY2lhbFRva2VuKSAmJiAodG9rLmtpbmQgIT0gRU9GKSkgewotICAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgodG9rLmtpbmQgIT0gRU9GKSAmJiAodG9rLmtpbmQhPVJCUkFDRSkpIHsKLSAgICAgICAgIHRocm93IGdlbmVyYXRlUGFyc2VFeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLSAKLUpBVkFDT0RFCi0gIGJvb2xlYW4gRW9sQ29tbWVudFNraXBXcyhUb2tlbiB0KSB7Ci0gICAgYm9vbGVhbiByZXRWYWwgPSBmYWxzZTsKLSAgICBUb2tlbiBzcGVjaWFsVG9rZW4gPSB0OwotICAgIHdoaWxlKHNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBXUykgewotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYoc3BlY2lhbFRva2VuLmtpbmQgPT0gRU9MICB8fAotICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7Ci0gICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0VmFsOwotICB9Ci0gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRW1wdHkgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRW1wdHlTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxTRU1JQ09MT04+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBFeHByZXNpb24gU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRXhwcmVzc2lvblN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgTGlzdEV4cHJlc3Npb24oKSAKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFN1cGVyIFN0YXRlbWVudCAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFN1cGVyU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgPFNVUEVSPiBBcmd1bWVudHMoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQmxvY2sgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQmxvY2sgKCk6Ci17fQoteyAgIAotICAgICAgICA8TEJSQUNFPiBbRGlyZWN0aXZlcygpXSA8UkJSQUNFPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gTGFiZWxlZCBTdGF0ZW1lbnQgKG1hcHMgdG8gbGl0ZXJhbCBmaWVsZCkKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIExhYmVsZWRTdGF0ZW1lbnQgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyKCkgPENPTE9OPiBTdWJzdGF0ZW1lbnQoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSWYgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgSWZTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxJRj4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpIAotICAgICAgICAgICAgW0xPT0tBSEVBRCgxKSA8RUxTRT4gU3Vic3RhdGVtZW50KCldCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTd2l0Y2ggU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU3dpdGNoU3RhdGVtZW50ICgpOgote30KLXsKLSAgICAgICAgPFNXSVRDSD4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgICAgICAgICAgICAgICA8TEJSQUNFPiBbQ2FzZUVsZW1lbnRzKCldIDxSQlJBQ0U+Ci19Ci0KLXZvaWQgQ2FzZUVsZW1lbnRzICgpOgote30KLXsKLSAgICAgICAgQ2FzZUxhYmVsKCkgKENhc2VFbGVtZW50KCkpKgotfQotCi12b2lkIENhc2VFbGVtZW50ICgpOgote30KLXsKLSAgICAgICAgRGlyZWN0aXZlKCkKLSAgICB8ICAgQ2FzZUxhYmVsKCkKLX0KLQotdm9pZCBDYXNlTGFiZWwgKCk6Ci17fQotewotICAgICAgICA8Q0FTRT4gTGlzdEV4cHJlc3Npb24oKSA8Q09MT04+Ci0gICAgfCAgIDxfREVGQVVMVD4gPENPTE9OPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRG8tV2hpbGUgU3RhdGVtZW50IAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRG9TdGF0ZW1lbnQoKTogCi17fQotewotICAgICAgICA8RE8+IFN1YnN0YXRlbWVudCgpIDxXSElMRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gV2hpbGUgU3RhdGVtZW50Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBXaGlsZVN0YXRlbWVudCAoKToKLXt9Ci17Ci0gICAgICAgIDxXSElMRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRm9yIFN0YXRlbWVudHMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBGb3JTdGF0ZW1lbnQgKCk6Ci17fQotewotICAgICAgICAgTE9PS0FIRUFEKDxGT1I+IDxMUEFSRU4+IEZvckluQmluZGluZygpIDxJTj4pCi0gICAgICAgICAgICAgICAgICAgPEZPUj4gPExQQVJFTj4gRm9ySW5CaW5kaW5nKCkgPElOPiBMaXN0RXhwcmVzc2lvbigpIDxSUEFSRU4+Ci0gICAgICAgICAgICAgICAgICAgICAgU3Vic3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICA8Rk9SPiA8TFBBUkVOPiBbRm9ySW5pdGlhbGl6ZXIoKV0gPFNFTUlDT0xPTj4gCi0gICAgICAgICAgICAgICAgICAgICAgIFtMaXN0RXhwcmVzc2lvbigpXSA8U0VNSUNPTE9OPiAKLSAgICAgICAgICAgICAgICAgICAgICAgW0xpc3RFeHByZXNzaW9uKCldIDxSUEFSRU4+IAotICAgICAgICAgICAgICAgICAgICAgIFN1YnN0YXRlbWVudCgpCi19Ci0KLXZvaWQgRm9ySW5pdGlhbGl6ZXIgKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgTGlzdEV4cHJlc3Npb25Ob0lOKCkKLSAgICB8ICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKQotICAgIHwgICAgICAgICAgICAgICAgQXR0cmlidXRlcygpICAgICAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbk5vSU4oKQotfQotCi12b2lkIEZvckluQmluZGluZyAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSBQb3N0Zml4RXhwcmVzc2lvbigpCi0gICAgfCAgICAgICAgICAgICAgICBWYXJpYWJsZURlZmluaXRpb25LaW5kKCkgVmFyaWFibGVCaW5kaW5nTm9JTigpCi0gICAgfCAgICAgICAgICAgICAgICBBdHRyaWJ1dGVzKCkgICAgICAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ05vSU4oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gV2l0aCBTdGF0ZW1lbnQgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBXaXRoU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8V0lUSD4gPExQQVJFTj4gRXhwcmVzc2lvblN0YXRlbWVudCgpIDxSUEFSRU4+Ci0gICAgICAgICAgICBTdWJzdGF0ZW1lbnQoKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ29udGludWUgYW5kIEJyZWFrIFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgQ29udGludWVTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxDT05USU5VRT4gW0lkZW50aWZpZXIoKV0KLX0KLQotdm9pZCBCcmVha1N0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPEJSRUFLPiBbSWRlbnRpZmllcigpXQotfQotIAotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUmV0dXJuIFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgUmV0dXJuU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8UkVUVVJOPiBbTGlzdEV4cHJlc3Npb24oKV0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFRocm93IFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVGhyb3dTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxUSFJPVz4gTGlzdEV4cHJlc3Npb24oKQotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gVHJ5IFN0YXRlbWVudAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgVHJ5U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8VFJZPiBCbG9jaygpCi0gICAgICAgICg8Q0FUQ0g+IDxMUEFSRU4+IElkZW50aWZpZXIoKSA8UlBBUkVOPiBCbG9jaygpKSoKLSAgICAgICAgWzxGSU5BTExZPiBCbG9jaygpXQotfSAKLSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBEaXJlY3RpdmVzIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgRGlyZWN0aXZlcyAoKToKLXt9Ci17Ci0gICAgICAgIChEaXJlY3RpdmUoKSkrCi19Ci0KLXZvaWQgRGlyZWN0aXZlICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgICAgICBFbXB0eVN0YXRlbWVudCgpCi0gICAgIHwgICBMT09LQUhFQUQoMykgU3RhdGVtZW50KCkKLSAgICAgfCAgIExPT0tBSEVBRCgyKSBBbm5vdGF0YWJsZURpcmVjdGl2ZSgpCi0gICAgIHwgICBMT09LQUhFQUQoMikgQXR0cmlidXRlcygpICAgICAgICAgICAgPExCUkFDRT4gRGlyZWN0aXZlcygpIDxSQlJBQ0U+Ci0gICAgIHwgICBMT09LQUhFQUQoMikgQXR0cmlidXRlcygpICAgICAgICAgICAgQW5ub3RhdGFibGVEaXJlY3RpdmUoKSAKLSAgICAgfCAgICAgICAgICAgICAgICBJbmNsdWRlRGlyZWN0aXZlKCkgICAgICBTYygpCi0gICAgIHwgICAgICAgICAgICAgICAgUHJhZ21hKCkgICAgICAgICAgICAgICAgU2MoKQotfQotCi12b2lkIEFubm90YXRhYmxlRGlyZWN0aXZlICgpOgote30KLXsKLSAgICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbigpIFNjKCkKLSAgICAgfCAgIEZ1bmN0aW9uRGVmaW5pdGlvbigpCi0gICAgIHwgICBDbGFzc0RlZmluaXRpb24oKQotICAgICB8ICAgSW50ZXJmYWNlRGVmaW5pdGlvbigpCi0gICAgIHwgICBOYW1lc3BhY2VEZWZpbml0aW9uKCkgU2MoKQotICAgICB8ICAgSW1wb3J0RGlyZWN0aXZlKCkgU2MoKQotICAgICB8ICAgRXhwb3J0RGVmaW5pdGlvbigpIFNjKCkKLSAgICAgfCAgIFVzZURpcmVjdGl2ZSgpIFNjKCkKLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBBdHRyaWJ1dGVzCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBBdHRyaWJ1dGVzICgpOgote30KLXsKLSAgICAgICAgKEF0dHJpYnV0ZSAoKSkrCi19Ci0KLXZvaWQgQXR0cmlidXRlICgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgICAgIEF0dHJpYnV0ZUV4cHJlc3Npb24oKQotICAgIHwgICAgICAgICAgICAgICAgPFRSVUU+Ci0gICAgfCAgICAgICAgICAgICAgICA8RkFMU0U+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBVc2UgRGlyZWN0aXZlCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBVc2VEaXJlY3RpdmUgKCk6Ci17fQoteyAKLSAgICAgICAgPFVTRT4gPE5BTUVTUEFDRT4gPExQQVJFTj4gTGlzdEV4cHJlc3Npb24oKSA8UlBBUkVOPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gSW1wb3J0IERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgSW1wb3J0RGlyZWN0aXZlICgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIDxJTVBPUlQ+IFBhY2thZ2VOYW1lKCkKLSAgICB8ICAgICAgICAgICAgICAgIDxJTVBPUlQ+IElkZW50aWZpZXIoKSA8QVNTSUdOPiBQYWNrYWdlTmFtZSgpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBJbmNsdWRlIERpcmVjdGl2ZQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgSW5jbHVkZURpcmVjdGl2ZSAoKTogCi17fQotewotICAgICAgICA8SU5DTFVERT4gPFNUUklOR19MSVRFUkFMPgotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gUHJhZ21hCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBQcmFnbWEgKCk6Ci17fQotewotICAgICAgICA8VVNFPiBQcmFnbWFJdGVtcygpCi19Ci0KLXZvaWQgUHJhZ21hSXRlbXMgKCk6Ci17fQotewotICAgICAgICBQcmFnbWFJdGVtKCkgKDxDT01NQT4gUHJhZ21hSXRlbSgpKQotfQotCi12b2lkIFByYWdtYUl0ZW0gKCk6Ci17fQotewotICAgICAgICBQcmFnbWFFeHByKCkgWzxIT09LPl0KLX0KLQotCi12b2lkIFByYWdtYUV4cHIgKCk6Ci17fQotewotICAgICAgICBJZGVudGlmaWVyKCkgWzxMUEFSRU4+IFByYWdtYUFyZ3VtZW50KCkgPFJQQVJFTj5dCi19Ci0KLXZvaWQgUHJhZ21hQXJndW1lbnQgKCk6Ci17fQotewotICAgICAgICA8VFJVRT4KLSAgICB8ICAgPEZBTFNFPgotICAgIHwgICA8REVDSU1BTF9MSVRFUkFMPiAKLSAgICB8ICAgPE9DVEFMX0xJVEVSQUw+Ci0gICAgfCAgIDxIRVhfTElURVJBTD4KLSAgICB8ICAgPEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw+IAotICAgIHwgICA8U1RSSU5HX0xJVEVSQUw+IAotfQotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRGVmaW5pdGlvbnMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gRXhwb3J0IERlZmluaXRpb24gCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotdm9pZCBFeHBvcnREZWZpbml0aW9uICgpOgote30KLXsKLSAgICAgICAgPEVYUE9SVD4gRXhwb3J0QmluZGluZ0xpc3QgKCkKLX0KLQotdm9pZCBFeHBvcnRCaW5kaW5nTGlzdCAoKToKLXt9Ci17Ci0gICAgICAgIEV4cG9ydEJpbmRpbmcoKSAoPENPTU1BPiBFeHBvcnRCaW5kaW5nKCkpKgotfQotCi12b2lkIEV4cG9ydEJpbmRpbmcgKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgRnVuY3Rpb25OYW1lICgpCi0gICAgfCAgICAgICAgICAgICAgICBGdW5jdGlvbk5hbWUgKCkgPEFTU0lHTj4gRnVuY3Rpb25OYW1lICgpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBWYXJpYWJsZSBEZWZpbml0aW9uIChpbiwgTm9JTikKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQoKSBWYXJpYWJsZUJpbmRpbmdMaXN0KCkKLX0KLQotdm9pZCBWYXJpYWJsZURlZmluaXRpb25Ob0lOICgpOgote30KLXsKLSAgICAgICAgVmFyaWFibGVEZWZpbml0aW9uS2luZCgpIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOKCkKLX0KLQotCi12b2lkIFZhcmlhYmxlRGVmaW5pdGlvbktpbmQgKCk6Ci17fQotewotICAgICAgICA8VkFSPgotICAgIHwgICA8Q09OU1Q+Ci19Ci0KLXZvaWQgVmFyaWFibGVCaW5kaW5nTGlzdCAoKToKLXt9Ci17Ci0gICBWYXJpYWJsZUJpbmRpbmcoKSAoPENPTU1BPiBWYXJpYWJsZUJpbmRpbmcgKCkpKgotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZ0xpc3ROb0lOICgpOgote30KLXsKLSAgIFZhcmlhYmxlQmluZGluZ05vSU4oKSAoPENPTU1BPiBWYXJpYWJsZUJpbmRpbmdOb0lOKCkpKgotfQotCi12b2lkIFZhcmlhYmxlQmluZGluZyAoKToKLXt9Ci17Ci0gICAgICAgIFR5cGVkSWRlbnRpZmllcigpIFtWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCldCi19Ci0KLXZvaWQgVmFyaWFibGVCaW5kaW5nTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIFR5cGVkSWRlbnRpZmllck5vSU4oKSBbVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4oKV0KLX0KLQotCi12b2lkIFZhcmlhYmxlSW5pdGlhbGlzYXRpb24gKCk6Ci17fQotewotICAgICAgIDxBU1NJR04+ICBWYXJpYWJsZUluaXRpYWxpemVyICgpCi19Ci0KLXZvaWQgVmFyaWFibGVJbml0aWFsaXNhdGlvbk5vSU4gKCk6Ci17fQotewotICAgICAgIDxBU1NJR04+ICBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAoKQotfQotCi12b2lkIFZhcmlhYmxlSW5pdGlhbGl6ZXIgKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgQXNzaWdubWVudEV4cHJlc3Npb24gKCkKLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgKCkKLX0KLQotdm9pZCBWYXJpYWJsZUluaXRpYWxpemVyTm9JTiAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4gKCkKLSAgICB8ICAgICAgICAgICAgICAgIEF0dHJpYnV0ZXMgKCkKLX0KLQotCi12b2lkIFR5cGVkSWRlbnRpZmllciAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIgKCkgWzxDT0xPTj4gVHlwZUV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBUeXBlZElkZW50aWZpZXJOb0lOICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllciAoKSBbPENPTE9OPiBUeXBlRXhwcmVzc2lvbk5vSU4oKV0KLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFNpbXBsZSBWYXJpYWJsZSBEZWZpbml0aW9uIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLXZvaWQgU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uICgpOgote30KLXsKLSAgICAgICAgPFZBUj4gVW50eXBlZFZhcmlhYmxlQmluZGluZ0xpc3QoKQotfQotCi12b2lkIFVudHlwZWRWYXJpYWJsZUJpbmRpbmdMaXN0ICgpOgote30KLXsKLSAgICAgICAgVW50eXBlZFZhcmlhYmxlQmluZGluZygpICg8Q09NTUE+IFVudHlwZWRWYXJpYWJsZUJpbmRpbmcoKSkqCi19Ci0KLXZvaWQgVW50eXBlZFZhcmlhYmxlQmluZGluZyAoKToKLXt9Ci17Ci0gICAgICAgIElkZW50aWZpZXIoKSBWYXJpYWJsZUluaXRpYWxpc2F0aW9uKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEZ1bmN0aW9uIERlZmluaXRpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIEZ1bmN0aW9uRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxGVU5DVElPTj4gRnVuY3Rpb25OYW1lKCkgRnVuY3Rpb25Db21tb24oKQotfQotCi12b2lkIEZ1bmN0aW9uTmFtZSAoKToKLXt9Ci17Ci0gICAgICAgIC8vIG5vIGxpbmUgYnJlYWsgYWZ0ZXIgZ2V0Ci0gICAgICAgIExPT0tBSEVBRCgyKSA8R0VUPiBJZGVudGlmaWVyKCkKLSAgICAgICAgLy8gbm8gbGluZSBicmVhayBhZnRlciBnZXQKLSAgICB8ICAgTE9PS0FIRUFEKDIpIDxTRVQ+IElkZW50aWZpZXIoKQotICAgIHwgICAgICAgICAgICAgICAgIElkZW50aWZpZXIoKQotfQotCi12b2lkIEZ1bmN0aW9uQ29tbW9uICgpOgote30KLXsKLSAgICAgICAgPExQQVJFTj4gW1BhcmFtZXRlcnMoKV0gPFJQQVJFTj4gW1Jlc3VsdCgpXSBCbG9jaygpCi19Ci0KLXZvaWQgUGFyYW1ldGVycyAoKToKLXt9Ci17Ci0gICAgICAgIFJlc3RQYXJhbWV0ZXJzKCkKLSAgICB8ICAgUGFyYW1ldGVySW5pdCgpICg8Q09NTUE+IFBhcmFtZXRlckluaXQoKSkqIFtSZXN0UGFyYW1ldGVycygpXQotfQotCi12b2lkIFBhcmFtZXRlciAoKToKLXt9Ci17Ci0gICAgICAgIFs8Q09OU1Q+XSBUeXBlZElkZW50aWZpZXIoKQotfQotCi12b2lkIFBhcmFtZXRlckluaXQgKCk6Ci17fQotewotICAgICAgICBQYXJhbWV0ZXIoKSBbPEFTU0lHTj4gQXNzaWdubWVudEV4cHJlc3Npb24oKV0KLX0KLQotdm9pZCBSZXN0UGFyYW1ldGVycyAoKToKLXt9Ci17Ci0gICAgICAgIDxFTElQU0U+IFs8Q09OU1Q+IElkZW50aWZpZXIoKV0KLX0KLQotdm9pZCBSZXN1bHQgKCk6Ci17fQotewotICAgICAgICA8Q09MT04+IFR5cGVFeHByZXNzaW9uKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIENsYXNzIERlZmluaXRpb24KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIENsYXNzRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIDxDTEFTUz4gSWRlbnRpZmllcigpIFtJbmhlcml0YW5jZSgpXSBCbG9jaygpCi19Ci0KLXZvaWQgSW50ZXJmYWNlRGVmaW5pdGlvbiAoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgzKSA8SU5URVJGQUNFPiBJZGVudGlmaWVyKCkgU2MoKQotICAgIHwgICAgICAgICAgICAgICAgPElOVEVSRkFDRT4gSWRlbnRpZmllcigpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWzxFWFRFTkRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKV0gQmxvY2soKQotfQotCi0KLXZvaWQgSW5oZXJpdGFuY2UgKCk6Ci17fQoteyAKLSAgICAgICAgPEVYVEVORFM+IFR5cGVFeHByZXNzaW9uKCkgWzxJTVBMRU1FTlRTPiBUeXBlRXhwcmVzc2lvbkxpc3QoKV0KLSAgICB8ICAgPElNUExFTUVOVFM+IFR5cGVFeHByZXNzaW9uTGlzdCgpCi19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBOYW1lc3BhY2UgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIE5hbWVzcGFjZURlZmluaXRpb24gKCk6Ci17fQotewotICAgICAgICA8TkFNRVNQQUNFPiBJZGVudGlmaWVyKCkKLX0KLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFBhY2thZ2UgRGVmaW5pdGlvbiAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi12b2lkIFBhY2thZ2VEZWZpbml0aW9uICgpOgote30KLXsKLSAgICAgICAgPFBBQ0tBR0U+IFtQYWNrYWdlTmFtZSgpXSBCbG9jaygpCi19Ci0KLXZvaWQgUGFja2FnZU5hbWUgKCk6Ci17fQotewotICAgICAgICA8U1RSSU5HX0xJVEVSQUw+Ci0gICAgfCAgIFBhY2thZ2VJZGVudGlmaWVycygpCi19Ci0KLXZvaWQgUGFja2FnZUlkZW50aWZpZXJzICgpOgote30KLXsKLSAgICAgICAgSWRlbnRpZmllcigpICg8RE9UPiBJZGVudGlmaWVyKCkpKgotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvRGVwdGhGaXJzdFRyYXZlcnNhbC5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvRGVwdGhGaXJzdFRyYXZlcnNhbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzRhNDMzLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0RlcHRoRmlyc3RUcmF2ZXJzYWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdGNvbXBpbGVyOwotCi1pbXBvcnQgamF2YS5pby5QcmludFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi1pbXBvcnQgamF2YS51dGlsLlN0cmluZ1Rva2VuaXplcjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXIuKjsKLQotcHVibGljIGNsYXNzIERlcHRoRmlyc3RUcmF2ZXJzYWwgaW1wbGVtZW50cyBKU1BhcnNlcjIwVmlzaXRvcgotewotICBwcm90ZWN0ZWQgUHJpbnRTdHJlYW0gb3V0OwotICBwcml2YXRlIGJvb2xlYW4gX2RlYnVnOwotICBwcml2YXRlIGludCBkZXB0aDsKLSAgcHJpdmF0ZSBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiBuYW1lVGFibGU7Ci0KLSAgcHVibGljIERlcHRoRmlyc3RUcmF2ZXJzYWwoKQotICB7Ci0gICAgb3V0ID0gU3lzdGVtLm91dDsKLSAgICBfZGVidWcgPSB0cnVlOwotICAgIGRlcHRoID0gMDsKLSAgfQotCi0KLSAgcHVibGljIERlcHRoRmlyc3RUcmF2ZXJzYWwoUHJpbnRTdHJlYW0gbykKLSAgewotICAgIG91dCA9IG87Ci0gICAgX2RlYnVnID0gdHJ1ZTsKLSAgICBkZXB0aCA9IDA7Ci0gIH0KLQotICBwdWJsaWMgRGVwdGhGaXJzdFRyYXZlcnNhbChQcmludFN0cmVhbSBvLCBIYXNoTWFwPFN0cmluZywgU3RyaW5nPiB0TWFwKQotICB7Ci0gICAgb3V0ID0gbzsKLSAgICBfZGVidWcgPSB0cnVlOwotICAgIGRlcHRoID0gMDsKLSAgICBuYW1lVGFibGUgPSB0TWFwOwotICB9Ci0KLQotICBwdWJsaWMgT2JqZWN0IGRlcHRoRmlyc3RUcmF2ZXJzYWwoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoKys7Ci0KLSAgICBUb2tlbiB0MSA9IG5vZGUuZ2V0Rmlyc3RUb2tlbigpOwotICAgIFRva2VuIHQgPSBuZXcgVG9rZW4oKTsKLSAgICB0Lm5leHQgPSB0MTsKLQotICAgIFNpbXBsZU5vZGUgbjsKLQotICAgIGZvciAoaW50IG9yZCA9IDA7IG9yZCA8IG5vZGUuamp0R2V0TnVtQ2hpbGRyZW4oKTsgb3JkKyspCi0gICAgewotICAgICAgLy8KLSAgICAgIC8vICBHZXQgdGhlIG5leHQgY2hpZCBub2RlIGluIHNlcXVlbmNlLgotICAgICAgLy8KLSAgICAgIG4gPSAoU2ltcGxlTm9kZSkgbm9kZS5qanRHZXRDaGlsZChvcmQpOwotCi0gICAgICAvLwotICAgICAgLy8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgVG9rZW5zIHRoYXQgYXJlIGF0dGFjaGVkIHRvIHRoaXMgbm9kZS4KLSAgICAgIC8vCi0gICAgICBpZiAoX2RlYnVnID09IHRydWUpCi0gICAgICB7Ci0gICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICB7Ci0gICAgICAgICAgdCA9IHQubmV4dDsKLQotICAgICAgICAgIGlmICh0ID09IG4uZ2V0Rmlyc3RUb2tlbigpKSBicmVhazsKLQotICAgICAgICAgIHByaW50KHQpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vCi0gICAgICAvLyBEZXB0aCBGaXN0IHNlYXJjaCBzbyB2aXNpdCB0aGlzIG5vZGVzIGNoaWxkcmVuIGJlZm9yZSBzaWJsaW5ncwotICAgICAgLy8KLSAgICAgIG4uamp0QWNjZXB0KHRoaXMsIGRhdGEpOwotCi0gICAgICB0ID0gbi5nZXRMYXN0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBpZiAoX2RlYnVnID09IHRydWUpCi0gICAgewotICAgICAgd2hpbGUgKHQgIT0gbm9kZS5nZXRMYXN0VG9rZW4oKSkKLSAgICAgIHsKLSAgICAgICAgaWYgKHQubmV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICB0ID0gdC5uZXh0OwotICAgICAgICBwcmludCh0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBkZXB0aC0tOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcmludE5vZGUoU2ltcGxlTm9kZSBub2RlKQotICB7Ci0gICAgVG9rZW4gdCA9IG5vZGUuZ2V0Rmlyc3RUb2tlbigpOwotCi0gICAgd2hpbGUgKHQgIT0gbm9kZS5nZXRMYXN0VG9rZW4oKSkKLSAgICB7Ci0gICAgICBwcmludCh0KTsKLSAgICAgIHQgPSB0Lm5leHQ7Ci0gICAgfQotCi0gICAgcHJpbnQobm9kZS5nZXRMYXN0VG9rZW4oKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcmludChUb2tlbiB0KQotICB7Ci0gICAgLy8KLSAgICAvLyAgSGFjayBBbGVydDogRHVlIHRvIGFuIGVycm9yIHdpdGggdGhlIGxlYWYgbm9kZSBBU1RFb2xXaXRoQ29tbWVudHMKLSAgICAvLyAgV2ljaCBvbmx5IG1hdGNoZXMgc3BlY2lhbCBhbmQgbm8gcmVndWxhciB0b2tlbnMgdGh1cyB3ZSBnZXQgdGhlIG5leHQKLSAgICAvLyAgdmFsaWQgbGVhZnMgdG9rZW4gc3R1Y2sgaW4gaGVyZS4gVGh1cyB3ZSBnZXQgZHVwbGljYXRlIGluZm8gaW4gZWFjaCBmaWxlLgotICAgIC8vICBGaXhlZCB0aGlzIHdpdGggc2ltcGxlIGZsYWcgdG8gcmVjb2duaXplcyBpZiB0aGUgdG9rZW4gaGFzIGFscmVhZHkgYmVlbiAKLSAgICAvLyAgd3JpdHRlbiBvdXQuTmVlZCB0byByZWZhY3RvciB0aGF0IHRlcm1pbmFsLgotICAgIC8vCi0gICAgaWYgKHQuaGFzUHJpbnRlZCA9PSB0cnVlKSByZXR1cm47Ci0gICAgCi0gICAgVG9rZW4gdHQgPSB0LnNwZWNpYWxUb2tlbjsKLQotICAgIGlmICh0dCAhPSBudWxsKQotICAgIHsKLSAgICAgIHdoaWxlICh0dC5zcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICAgICAgdHQgPSB0dC5zcGVjaWFsVG9rZW47Ci0KLSAgICAgIHdoaWxlICh0dCAhPSBudWxsKQotICAgICAgewotICAgICAgICBvdXQucHJpbnQoYWRkVW5pY29kZUVzY2FwZXModHQuaW1hZ2UpKTsKLSAgICAgICAgdHQgPSB0dC5uZXh0OwotICAgICAgfQotICAgIH0KLSAgICAvLwotICAgIC8vICBDaGVjayB0byBzZWUgaWYgdGhlIFRva2VuIGlzIGFuIGlkZW50aWZpZXIga2luZC4KLSAgICAvLwotICAgIGlmICh0LmtpbmQgPT0gNzgpIAotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyAgUG90ZW50aWFsIGl0ZW0gdG8gc3dhcCBvdXQuCi0gICAgICAvLwotICAgICAgU3RyaW5nIHRlbXAgPSBuYW1lVGFibGUuZ2V0KHQuaW1hZ2UpOwotICAgICAgaWYgKHRlbXAgIT0gbnVsbCkgCi0gICAgICB7Ci0gICAgICAgIHQuaW1hZ2UgPSB0ZW1wOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodC5raW5kID09IDcwIHx8IHQua2luZCA9PSA3MiB8fCB0LmtpbmQgPT0gNzcpIAotICAgIHsKLSAgICAgIC8vCi0gICAgICAvLyAgIEdvdCBzdHJpbmcgdGhhdCBjb3VsZCBoYXZlIGEgcG90ZW50aWFsIGNsYXNzIGluIGl0IChsaWtlIEV2YWwgb3IgCi0gICAgICAvLyAgIFJlZ0V4cCBzbyBuZWVkIHRvIHNjYW4gdGhlIHN0cmluZy4KLSAgICAgIC8vCi0gICAgICBTdHJpbmdUb2tlbml6ZXIgc3Q7Ci0gICAgICBpZiAodC5pbWFnZS5jaGFyQXQoMCkgPT0gJyInICYmIHQuaW1hZ2UubGVuZ3RoKCkgPiAyKSAKLSAgICAgIHsKLSAgICAgICAgc3QgPSBuZXcgU3RyaW5nVG9rZW5pemVyKHQuaW1hZ2Uuc3Vic3RyaW5nKDEsICh0LmltYWdlLmxlbmd0aCgpLTEpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAotICAgICAgfSBlbHNlIAotICAgICAgewotICAgICAgICBzdCA9IG5ldyBTdHJpbmdUb2tlbml6ZXIodC5pbWFnZSk7Ci0gICAgICB9Ci0gICAgICBTdHJpbmdCdWlsZGVyIHJlcGxhY2VtZW50U3RyaW5nID0gbmV3IFN0cmluZ0J1aWxkZXIodC5pbWFnZSk7Ci0gICAgICBib29sZWFuIHVwZGF0ZSA9IGZhbHNlOwotICAgICAgd2hpbGUgKHN0Lmhhc01vcmVUb2tlbnMoKSkgewotICAgICAgICAgIFN0cmluZyB0ZW1wMSA9IHN0Lm5leHRUb2tlbigpOwotICAgICAgICAgIFN0cmluZyB0ZW1wID0gbmFtZVRhYmxlLmdldCh0ZW1wMSk7Ci0gICAgICAgICAgaWYgKHRlbXAgIT0gbnVsbCkgCi0gICAgICAgICAgewotICAgICAgICAgICAgaW50IHN0YXJ0ID0gcmVwbGFjZW1lbnRTdHJpbmcuaW5kZXhPZih0ZW1wMSk7Ci0gICAgICAgICAgICBpbnQgZW5kID0gc3RhcnQgKyB0ZW1wMS5sZW5ndGgoKTsKLSAgICAgICAgICAgIHVwZGF0ZSA9IHRydWU7Ci0gICAgICAgICAgICByZXBsYWNlbWVudFN0cmluZy5kZWxldGUoc3RhcnQsIGVuZCk7Ci0gICAgICAgICAgICByZXBsYWNlbWVudFN0cmluZy5pbnNlcnQoc3RhcnQsIHRlbXApOwotICAgICAgICAgIH0gCi0gICAgICB9Ci0gICAgICBpZiAodXBkYXRlID09IHRydWUpIAotICAgICAgewotICAgICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiT2xkIFN0cmluZyBpczoiICsgdC5pbWFnZSk7Ci0gICAgICAgICAgdC5pbWFnZSA9IHJlcGxhY2VtZW50U3RyaW5nLnRvU3RyaW5nKCk7Ci0gICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJOZXcgU3RyaW5nIGlzOiIgKyB0LmltYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb3V0LnByaW50KGFkZFVuaWNvZGVFc2NhcGVzKHQuaW1hZ2UpKTsKLSAgICB0Lmhhc1ByaW50ZWQgPSB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgYWRkVW5pY29kZUVzY2FwZXMoU3RyaW5nIHN0cikKLSAgewotICAgIFN0cmluZyByZXR2YWwgPSAiIjsKLSAgICBjaGFyIGNoOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdHIubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaCA9IHN0ci5jaGFyQXQoaSk7Ci0KLSAgICAgIGlmICgoKGNoIDwgMHgyMCkgfHwgKGNoID4gMHg3ZSkpICYmIChjaCAhPSAnXHQnKSAmJiAoY2ggIT0gJ1xuJykgJiYKLSAgICAgICAgICAoY2ggIT0gJ1xyJykgJiYgKGNoICE9ICdcZicpKQotICAgICAgewotICAgICAgICBTdHJpbmcgcyA9ICIwMDAwIiArIEludGVnZXIudG9TdHJpbmcoY2gsIDE2KTsKLSAgICAgICAgcmV0dmFsICs9ICgiXFx1IiArIHMuc3Vic3RyaW5nKHMubGVuZ3RoKCkgLSA0LCBzLmxlbmd0aCgpKSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHZhbCArPSBjaDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmV0dmFsOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgYnVpbGRQYWRkZWRTdHJpbmcoU3RyaW5nIHMpCi0gIHsKLSAgICBTdHJpbmdCdWZmZXIgc2IgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0KLSAgICBmb3IgKGludCBjb3VudCA9IDA7IGNvdW50IDw9IGRlcHRoOyBjb3VudCsrKQotICAgIHsKLSAgICAgIHNiID0gc2IuYXBwZW5kKCIgIik7Ci0gICAgfQotCi0gICAgc2IgPSBzYi5hcHBlbmQocyk7Ci0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoU2ltcGxlTm9kZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJvZ3JhbSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2ltcGxlUXVhbGlmaWVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwcmVzc2lvblF1YWxpZmllZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFF1YWxpZmllZElkZW50aWZpZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByaW1hcnlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXNlcnZlZE5hbWVzcGFjZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25FeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RPYmplY3RMaXRlcmFsIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGaWVsZExpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWxGaWVsZCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGaWVsZE5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFycmF5TGl0ZXJhbCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURWxlbWVudExpc3Qgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVExpdGVyYWxFbGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdXBlckV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBvc3RmaXhFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBdHRyaWJ1dGVFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsUG9zdGZpeEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bGxOZXdFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbkNvbnN0cnVjdG9yIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdWxsTmV3U3ViZXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUG9zdGZpeE9wIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9yQXJndW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQcm9wZXJ0eU9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBcmd1bWVudHMgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFVuYXJ5RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTXVsT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQWRkT3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEFkZGl0aXZlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2hpZnRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZWxPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUmVsYXRpb25hbEV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXF1YWxpdHlFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFcXVhbGl0eUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ET3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VBTkRFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JPcCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZVhPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQml0d2lzZU9ST3Agbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJpdHdpc2VPUkV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsQU5ERXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMb2dpY2FsT1JFeHByZXNzaW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29uZGl0aW9uYWxFeHByZXNzaW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1ROb25Bc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTm9uQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25lbWVudE9wZXJhdG9yIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RBc3NpZ25tZW50RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RMaXN0RXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGlzdEV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUeXBlRXhwcmVzc2lvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZUV4cHJlc3Npb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotCi0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVFeHByZXNzaW9uTGlzdCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLQotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0KLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU3Vic3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTdWJzdGF0ZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RTYyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW9sQ29tbWVudFNraXBXcyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURW1wdHlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEV4cHJlc3Npb25TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN1cGVyU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RCbG9jayBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUTGFiZWxlZFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSWZTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFN3aXRjaFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUVsZW1lbnRzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RDYXNlRWxlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ2FzZUxhYmVsIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1REb1N0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2hpbGVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvclN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURm9ySW5pdGlhbGl6ZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZvckluQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUV2l0aFN0YXRlbWVudCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQ29udGludWVTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEJyZWFrU3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXR1cm5TdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFRocm93U3RhdGVtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RUcnlTdGF0ZW1lbnQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZXMgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVERpcmVjdGl2ZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUQW5ub3RhdGFibGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZXMgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEF0dHJpYnV0ZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVXNlRGlyZWN0aXZlIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RJbXBvcnREaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEluY2x1ZGVEaXJlY3RpdmUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUHJhZ21hSXRlbXMgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUl0ZW0gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUV4cHIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFByYWdtYUFyZ3VtZW50IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnREZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RFeHBvcnRCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURXhwb3J0QmluZGluZyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25Ob0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZURlZmluaXRpb25LaW5kIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0IG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdMaXN0Tm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVCaW5kaW5nIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUJpbmRpbmdOb0lOIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RWYXJpYWJsZUluaXRpYWxpc2F0aW9uTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVmFyaWFibGVJbml0aWFsaXplck5vSU4gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFR5cGVkSWRlbnRpZmllciBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVHlwZWRJZGVudGlmaWVyTm9JTiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUU2ltcGxlVmFyaWFibGVEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RVbnR5cGVkVmFyaWFibGVCaW5kaW5nTGlzdCBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUVW50eXBlZFZhcmlhYmxlQmluZGluZyBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNURnVuY3Rpb25EZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RGdW5jdGlvbk5hbWUgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVEZ1bmN0aW9uQ29tbW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYXJhbWV0ZXIgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhcmFtZXRlckluaXQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFJlc3RQYXJhbWV0ZXJzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RSZXN1bHQgbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVENsYXNzRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW50ZXJmYWNlRGVmaW5pdGlvbiBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUSW5oZXJpdGFuY2Ugbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVE5hbWVzcGFjZURlZmluaXRpb24gbm9kZSwgT2JqZWN0IGRhdGEpCi0gIHsKLSAgICBkZXB0aEZpcnN0VHJhdmVyc2FsKG5vZGUsIGRhdGEpOwotCi0gICAgcmV0dXJuIGRhdGE7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IHZpc2l0KEFTVFBhY2thZ2VEZWZpbml0aW9uIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci0KLSAgcHVibGljIE9iamVjdCB2aXNpdChBU1RQYWNrYWdlTmFtZSBub2RlLCBPYmplY3QgZGF0YSkKLSAgewotICAgIGRlcHRoRmlyc3RUcmF2ZXJzYWwobm9kZSwgZGF0YSk7Ci0KLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgdmlzaXQoQVNUUGFja2FnZUlkZW50aWZpZXJzIG5vZGUsIE9iamVjdCBkYXRhKQotICB7Ci0gICAgZGVwdGhGaXJzdFRyYXZlcnNhbChub2RlLCBkYXRhKTsKLQotICAgIHJldHVybiBkYXRhOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvSmF2YXNjcmlwdENvbXBpbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhMTQ2YjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9qYXZhc2NyaXB0Y29tcGlsZXIvSmF2YXNjcmlwdENvbXBpbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdGNvbXBpbGVyOwotCi1pbXBvcnQgamF2YS5pby5CdWZmZXJlZE91dHB1dFN0cmVhbTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXIuSlNQYXJzZXIyMDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdDIwcGFyc2VyLlBhcnNlRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5qYXZhc2NyaXB0MjBwYXJzZXIuVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzLkZpbGVQcm9jZXNzb3I7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW1SZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLlByaW50U3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci0KLXB1YmxpYyBjbGFzcyBKYXZhc2NyaXB0Q29tcGlsZXIgZXh0ZW5kcyBGaWxlUHJvY2Vzc29yCi17Ci0gIHByaXZhdGUgSlNQYXJzZXIyMCAgICAgICAgX2pzUGFyc2VyOwotICBwdWJsaWMgIEhhc2hNYXA8U3RyaW5nLCBTdHJpbmc+ICAgICAgICAgZmlsZVRhYmxlOwotCi0gIHB1YmxpYyBKYXZhc2NyaXB0Q29tcGlsZXIoKQotICB7Ci0gICAgc3VwZXIoImpzIiwgZmFsc2UpOwotICAgIGZpbGVUYWJsZSA9IG5ldyBIYXNoTWFwPFN0cmluZyxTdHJpbmc+KCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgaW5pdChJbnB1dFN0cmVhbSBpbikKLSAgewotICAgIC8vIGFwcGx5IG92ZXJyaWRlcwotICB9Ci0KLSAgcHJvdGVjdGVkIHZvaWQgcHJvY2Vzc0ZpbGUoRmlsZSBpbiwgRmlsZSBvdXQpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbgotICB7Ci0gICAgU3RyaW5nIGNsYXNzTmFtZSwgbmV3Q2xhc3NOYW1lOwotICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW4pOwotICAgIC8vCi0gICAgLy8gIEdldCB0aGUgbmFtZSBvZiB0aGUgZmlsZQotICAgIC8vCi0gICAgY2xhc3NOYW1lID0gaW4uZ2V0TmFtZSgpOwotICAgIGNsYXNzTmFtZSA9IGNsYXNzTmFtZS5zdWJzdHJpbmcoMCwgY2xhc3NOYW1lLmluZGV4T2YoJy4nKSk7Ci0gICAgLy8KLSAgICAvLyAgQ2hlY2sgdG8gc2VlIGlmIHRoZSBuYW1lIGV4aXN0cyBhcyB3ZSBkbyBub3Qgd2FudCB0byBvdmVyIHdyaXRlIHRoZSBmb3VyCi0gICAgLy8gIHNwZWNpYWwgbmFtZXMgd2UgYXJlIHVzaW5nLgotICAgIC8vCi0gICAgbmV3Q2xhc3NOYW1lID0gZmlsZVRhYmxlLmdldChjbGFzc05hbWUpOwotICAgIGlmICggbmV3Q2xhc3NOYW1lID09IG51bGwpIAotICAgIHsKLS8vICAgICAgIG5ld0NsYXNzTmFtZSA9ICJBZGYiICsgY2xhc3NOYW1lOwotLy8gICAgICBmaWxlVGFibGUucHV0KGNsYXNzTmFtZSwgbmV3Q2xhc3NOYW1lKTsKLSAgICAgIG5ld0NsYXNzTmFtZSA9IGNsYXNzTmFtZTsKLSAgICB9Ci0gICAgb3V0ID0gbmV3IEZpbGUob3V0LmdldFBhcmVudEZpbGUoKSwgbmV3Q2xhc3NOYW1lICsgIi5qcyIpOwotICAgIFByaW50U3RyZWFtIG91dFN0cmVhbSA9IG5ldyBQcmludFN0cmVhbShuZXcgQnVmZmVyZWRPdXRwdXRTdHJlYW0obmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0KSkpOwotICAgIHByb2Nlc3MoaW5TdHJlYW0sIG91dFN0cmVhbSk7Ci0gICAgaW5TdHJlYW0uY2xvc2UoKTsKLSAgICBvdXRTdHJlYW0uZmx1c2goKTsKLSAgICBvdXRTdHJlYW0uY2xvc2UoKTsKLSAgfQotICBwcml2YXRlIHZvaWQgaW5pdFBhcnNlcihJbnB1dFN0cmVhbSBpbikKLSAgewotCi0gICAgaWYgKF9qc1BhcnNlciA9PSBudWxsKQotICAgIHsKLSAgICAgIF9qc1BhcnNlciA9IG5ldyBKU1BhcnNlcjIwKGluKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIF9qc1BhcnNlci5SZUluaXQobmV3IElucHV0U3RyZWFtUmVhZGVyKGluKSk7Ci0gICAgfQotICB9Ci0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoSW5wdXRTdHJlYW0gaW4sIFByaW50U3RyZWFtIG8pIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgVG9rZW4gdG9rZW4gPSBudWxsOwotICAgIERlcHRoRmlyc3RUcmF2ZXJzYWwgdnN0cjsKLSAgICBpbml0KGluKTsKLSAgICB0b2tlbiA9IHRva2VuaXplKGluKTsKLSAgICAvLwotICAgIC8vICAgQ3JlYXRlIGFuIGluc3RhbmNlIG9mIERlcHRoRmlyc3RUcmF2ZXJzYWwKLSAgICAvLwotICAgIHZzdHIgPSBuZXcgRGVwdGhGaXJzdFRyYXZlcnNhbChvLCBmaWxlVGFibGUpOyAKLSAgICBfanNQYXJzZXIuZ2V0Um9vdE5vZGUoKS5qanRBY2NlcHQodnN0ciwgbnVsbCk7Ci0gIH0KLSAgcHJpdmF0ZSBUb2tlbiB0b2tlbml6ZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uCi0gIHsKLSAgICBpbml0UGFyc2VyKGluKTsKLSAgICByZXR1cm4gKFRva2VuKSBfanNQYXJzZXIuUHJvZ3JhbSgpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlck1haW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvamF2YXNjcmlwdGNvbXBpbGVyL0phdmFzY3JpcHRDb21waWxlck1haW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ1YzBjZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L2phdmFzY3JpcHRjb21waWxlci9KYXZhc2NyaXB0Q29tcGlsZXJNYWluLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQuamF2YXNjcmlwdGNvbXBpbGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LmphdmFzY3JpcHRjb21waWxlci5KYXZhc2NyaXB0Q29tcGlsZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotCi0KLXB1YmxpYyBjbGFzcyBKYXZhc2NyaXB0Q29tcGlsZXJNYWluCi17Ci0gIHByaXZhdGUgSmF2YXNjcmlwdENvbXBpbGVyIF9qYXZhc2NyaXB0Q29tcGlsZXI7Ci0KLSAgcHVibGljIEphdmFzY3JpcHRDb21waWxlck1haW4oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKQotICB7Ci0gICAgSmF2YXNjcmlwdENvbXBpbGVyTWFpbiBfbWFpbiA9IG5ldyBKYXZhc2NyaXB0Q29tcGlsZXJNYWluKCk7Ci0gICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlciA9IG5ldyBKYXZhc2NyaXB0Q29tcGlsZXIoKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlSW5wdXRTdHJlYW0gZmlzID0gbmV3IEZpbGVJbnB1dFN0cmVhbSgiRDpcXEZvb1xcZGF0YTEudHh0Iik7Ci0gICAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oZmlzKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlID0gIChIYXNoTWFwPFN0cmluZywgU3RyaW5nPilvaXMucmVhZE9iamVjdCgpOyAvLyBSZWFkIHRoZSBvYmplY3QgYmFjayBpbiBoZXJlCi0gICAgICAvLwotICAgICAgLy8gCi0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hPYmplY3QiLCAiQWRmT2JqZWN0Iik7Ci0gICAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLmZpbGVUYWJsZS5wdXQoIlJpY2hQYWdlIiwgIkFkZlBhZ2UiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiUmljaENvbnZlcnRlciIsICJBZGZDb252ZXJ0ZXIiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiUmljaFZhbGlkYXRvciIsICJBZGZWYWxpZGF0b3IiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiQm9vdHN0cmFwIiwgIkFkZkJvb3RzdHJhcCIpOwotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJCb290c3RyYXBGYWNlcyIsICJBZGZCb290c3RyYXBGYWNlcyIpOwotICAgICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5maWxlVGFibGUucHV0KCJYTUxSZXF1ZXN0IiwgIkFkZlhNTFJlcXVlc3QiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiTWFyc2hhbGluZ1NlcnZpY2UiLCAiQWRmTWFyc2hhbGluZ1NlcnZpY2UiKTsKLSAgICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlLnB1dCgiTWVzc2FnaW5nU2VydmljZSIsICJBZGZNZXNzYWdpbmdTZXJ2aWNlIik7Ci0gICAgICBvaXMuY2xvc2UoKTsKLSAgICAgIGZpcy5jbG9zZSgpOwotICAgIH0KLSAgICBjYXRjaCAoRmlsZU5vdEZvdW5kRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgLy8gVE9ETwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICAgIGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIAotICAgIHsKLSAgICAgIC8vIFRPRE8KLSAgICB9Ci0gICAgRmlsZSBpbiA9IAotICAgICAgbmV3IEZpbGUoIkQ6XFxqZGV2cnRcXGFkZi1mYWNlc1xcdHJ1bmtcXGFkZi1yaWNoY2xpZW50LWRlbW9cXHNyY1xcbWFpblxcd2ViYXBwXFxqc0xpYnMiKTsKLSAgICBGaWxlIG91dCA9IG5ldyBGaWxlKCJEOlxcRm9vXFxEZW1vXFxqc0xpYnMiKTsKLSAgICBfbWFpbi5famF2YXNjcmlwdENvbXBpbGVyLnByb2Nlc3MoaW4sIG91dCk7Ci0gICAgaW4gPSAKLSAgICAgIG5ldyBGaWxlKCJEOlxcamRldnJ0XFxhZGYtZmFjZXNcXHRydW5rXFxhZGYtcmljaGNsaWVudC1kZW1vLWNybVxcc3JjXFxtYWluXFx3ZWJhcHBcXGpzTGlicyIpOwotICAgIG91dCA9IG5ldyBGaWxlKCJEOlxcRm9vXFxjcm1cXGpzTGlicyIpOwotICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIucHJvY2Vzcyhpbiwgb3V0KTsKLQotICAgIC8vCi0gICAgLy8gIFRyYW5zZm9ybSB0aGUgQXBpIEphdmFTY3JpcHQgZmlsZXMKLSAgICAvLwotLy8gICAgRmlsZSBpbiA9IAotLy8gICAgICBuZXcgRmlsZSgiRDpcXGpkZXZydFxcYWRmLWZhY2VzXFx0cnVua1xcYWRmLXJpY2hjbGllbnQtYXBpXFxzcmNcXG1haW5cXGphdmFzY3JpcHRcXG9yYWNsZVxcYWRmXFx2aWV3Iik7Ci0vLyAgICBGaWxlIG91dCA9IG5ldyBGaWxlKCJEOlxcRm9vXFxhcGkiKTsKLS8vICAgIF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIucHJvY2Vzcyhpbiwgb3V0KTsKLSAgICAvLwotICAgIC8vICBUcmFuc2Zvcm0gdGhlIEltcGwgSmF2YVNjcmlwdCBmaWxlcwotICAgIC8vCi0vLyAgICBpbiA9IAotLy8gICAgICAgbmV3IEZpbGUoIkQ6XFxqZGV2cnRcXGFkZi1mYWNlc1xcdHJ1bmtcXGFkZi1yaWNoY2xpZW50LWltcGxcXHNyY1xcbWFpblxcamF2YXNjcmlwdFxcb3JhY2xlXFxhZGZpbnRlcm5hbFxcdmlld1xcIik7Ci0vLyAgICBvdXQgPSBuZXcgRmlsZSgiRDpcXEZvb1xcaW1wbCIpOwotLy8gICAgX21haW4uX2phdmFzY3JpcHRDb21waWxlci5wcm9jZXNzKGluLCBvdXQpOwotICAgIC8vCi0gICAgLy8gIFVvZGF0ZSB0aGUgc2VyaWFsaXplZCB2ZXJzaW9uIG9mIHRoZSBIYXNoTWFwCi0gICAgLy8KLSAgICBGaWxlT3V0cHV0U3RyZWFtIGZvczsKLSAgICBPYmplY3RPdXRwdXRTdHJlYW0gb29zOwotICAgIHRyeQotICAgIHsKLQotICAgICAgZm9zID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oIkQ6XFxGb29cXGRhdGExLnR4dCIpOwotICAgICAgb29zID0gbmV3IE9iamVjdE91dHB1dFN0cmVhbShmb3MpOwotICAgICAgb29zLndyaXRlT2JqZWN0KF9tYWluLl9qYXZhc2NyaXB0Q29tcGlsZXIuZmlsZVRhYmxlKTsKLSAgICAgIG9vcy5mbHVzaCgpOwotICAgICAgb29zLmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyBUT0RPCi0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIFRPRE8KLSAgICB9Ci0gIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvSW5wdXRTb3VyY2UuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9JbnB1dFNvdXJjZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODM0ZGM1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9JbnB1dFNvdXJjZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIElucHV0U291cmNlCi17Ci0gIHByaXZhdGUgYm9vbGVhbiBfc2tpcE9iZnVzY2F0aW9uOwotICBwcml2YXRlIGJvb2xlYW4gX3NraXBTdHJpcENvbW1lbnRzOwotICBwcml2YXRlIGJvb2xlYW4gX3NraXBTdHJpcFdoaXRlc3BhY2VzOwotICBwcml2YXRlIGJvb2xlYW4gX3NraXBTdHJpcE5ld2xpbmVzOwotICBwcml2YXRlIGJvb2xlYW4gX3NraXBTdHJpcFNwZWNpYWxLZXl3b3JkczsKLSAgcHJpdmF0ZSBJbnB1dFN0cmVhbSBfaW47Ci0KLSAgcHVibGljIElucHV0U291cmNlKElucHV0U3RyZWFtIGluLCBib29sZWFuIHNraXBPYmZ1c2NhdGlvbiwKLSAgICBib29sZWFuIHNraXBTdHJpcENvbW1lbnRzLCBib29sZWFuIHNraXBTdHJpcFdoaXRlc3BhY2VzLAotICAgIGJvb2xlYW4gc2tpcFN0cmlwTmV3bGluZXMsIGJvb2xlYW4gc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzKQotICB7Ci0gICAgX2luID0gaW47Ci0gICAgX3NraXBPYmZ1c2NhdGlvbiA9IHNraXBPYmZ1c2NhdGlvbjsKLSAgICBfc2tpcFN0cmlwQ29tbWVudHMgPSBza2lwU3RyaXBDb21tZW50czsKLSAgICBfc2tpcFN0cmlwV2hpdGVzcGFjZXMgPSBza2lwU3RyaXBXaGl0ZXNwYWNlczsKLSAgICBfc2tpcFN0cmlwTmV3bGluZXMgPSBza2lwU3RyaXBOZXdsaW5lczsKLSAgICBfc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzID0gc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzOwotICB9Ci0KLSAgcHVibGljIElucHV0U3RyZWFtIGdldElucHV0U3RyZWFtKCkKLSAgewotICAgIHJldHVybiBfaW47Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwT2JmdXNjYXRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9za2lwT2JmdXNjYXRpb247Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBDb21tZW50cygpCi0gIHsKLSAgICByZXR1cm4gX3NraXBTdHJpcENvbW1lbnRzOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwV2hpdGVzcGFjZXMoKQotICB7Ci0gICAgcmV0dXJuIF9za2lwU3RyaXBXaGl0ZXNwYWNlczsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcE5ld2xpbmVzKCkKLSAgewotICAgIHJldHVybiBfc2tpcFN0cmlwTmV3bGluZXM7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBTcGVjaWFsS2V5d29yZHMoKQotICB7Ci0gICAgcmV0dXJuIF9za2lwU3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9PYmZ1c2NhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvT2JmdXNjYXRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjMzZjU5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9PYmZ1c2NhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yOwotCi0vL34tLS0gbm9uLUpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5jb25maWd1cmF0aW9uLkNvbmZpZ0V4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5jb25maWd1cmF0aW9uLk9iZnVzY2F0b3JDb25maWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5PYmZ1c2NhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb24uQ29tcHJlc3Npb25GaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5rZXl3b3Jkcy5TcGVjaWFsS2V5d29yZHNGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5PYmZ1c2NhdGlvbkZpbHRlcjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm91dHB1dC5PdXRwdXRHZW5lcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5KU1BhcnNlcjE1OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5QYXJzZUV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHMuRmlsZVByb2Nlc3NvcjsKLQotLy9+LS0tIEpESyBpbXBvcnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuaW8uRmlsZVV0aWxzOwotCi0vL34tLS0gY2xhc3NlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXB1YmxpYyBjbGFzcyBPYmZ1c2NhdG9yCi0gIGV4dGVuZHMgRmlsZVByb2Nlc3NvcgotewotICBwcml2YXRlIFZlY3RvciBfZmlsdGVycyA9IG5ldyBWZWN0b3IoKTsKLQotICBwcml2YXRlIE9iZnVzY2F0b3JGaWx0ZXIgX2tleXdvcmRzRmlsdGVyID0gbmV3IFNwZWNpYWxLZXl3b3Jkc0ZpbHRlcigpOwotCi0gIHByaXZhdGUgT2JmdXNjYXRpb25GaWx0ZXIgX29iZnVzY2F0aW9uRmlsdGVyID0gbmV3IE9iZnVzY2F0aW9uRmlsdGVyKCk7Ci0KLSAgcHJpdmF0ZSBPdXRwdXRHZW5lcmF0b3IgX291dHB1dEdlbmVyYXRvciA9IG5ldyBPdXRwdXRHZW5lcmF0b3IoKTsKLQotICBwcml2YXRlIE9iZnVzY2F0b3JDb25maWcgX2NvbmZpZzsKLQotICBwcml2YXRlIEpTUGFyc2VyMTUgX2pzUGFyc2VyOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfb2JmdXNjYXRlOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfcmVwbGFjZUNoYXJMaXRlcmFsczsKLQotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwQ29tbWVudHM7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcE5ld2xpbmVzOwotCi0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBTcGVjaWFsS2V5d29yZHM7Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcFdoaXRlc3BhY2VzOwotCi0gIC8vfi0tLSBjb25zdHJ1Y3RvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBPYmZ1c2NhdG9yKGJvb2xlYW4gb2JmdXNjYXRlLCBib29sZWFuIHN0cmlwQ29tbWVudHMsCi0gICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gc3RyaXBXaGl0ZXNwYWNlcywgYm9vbGVhbiBzdHJpcE5ld2xpbmVzLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHN0cmlwU3BlY2lhbEtleXdvcmRzLAotICAgICAgICAgICAgICAgICAgICBib29sZWFuIHJlcGxhY2VDaGFyTGl0ZXJhbHMsIE9iZnVzY2F0b3JDb25maWcgY29uZmlnKQotICAgIHRocm93cyBDb25maWdFeGNlcHRpb24KLSAgewotICAgIHN1cGVyKCJqcyIsIGZhbHNlKTsKLSAgICBfb2JmdXNjYXRlID0gb2JmdXNjYXRlOwotICAgIF9zdHJpcENvbW1lbnRzID0gc3RyaXBDb21tZW50czsKLSAgICBfc3RyaXBXaGl0ZXNwYWNlcyA9IHN0cmlwV2hpdGVzcGFjZXM7Ci0gICAgX3N0cmlwTmV3bGluZXMgPSBzdHJpcE5ld2xpbmVzOwotICAgIF9zdHJpcFNwZWNpYWxLZXl3b3JkcyA9IHN0cmlwU3BlY2lhbEtleXdvcmRzOwotICAgIF9yZXBsYWNlQ2hhckxpdGVyYWxzID0gcmVwbGFjZUNoYXJMaXRlcmFsczsKLSAgICBfY29uZmlnID0gY29uZmlnOwotICB9Ci0KLSAgLy9+LS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoSW5wdXRTb3VyY2UgaW4pCi0gIHsKLQotICAgIC8vIGFwcGx5IG92ZXJyaWRlcwotICAgIGJvb2xlYW4gb2JmdXNjYXRlID0gaW4uc2tpcE9iZnVzY2F0aW9uKCk/IGZhbHNlOiBfb2JmdXNjYXRlOwotICAgIGJvb2xlYW4gc3RyaXBDb21tZW50cyA9IGluLnNraXBTdHJpcENvbW1lbnRzKCk/IGZhbHNlOiBfc3RyaXBDb21tZW50czsKLSAgICBib29sZWFuIHN0cmlwV2hpdGVzcGFjZXMgPQotICAgICAgaW4uc2tpcFN0cmlwV2hpdGVzcGFjZXMoKT8gZmFsc2U6IF9zdHJpcFdoaXRlc3BhY2VzOwotICAgIGJvb2xlYW4gc3RyaXBOZXdMaW5lcyA9IGluLnNraXBTdHJpcE5ld2xpbmVzKCk/IGZhbHNlOiBfc3RyaXBOZXdsaW5lczsKLSAgICBib29sZWFuIHN0cmlwU3BlY2lhbEtleXdvcmRzID0KLSAgICAgIGluLnNraXBTdHJpcFNwZWNpYWxLZXl3b3JkcygpPyBmYWxzZTogX3N0cmlwU3BlY2lhbEtleXdvcmRzOwotCi0gICAgLy8gc2V0dXAgZmlsdGVycwotICAgIF9maWx0ZXJzLmNsZWFyKCk7Ci0KLSAgICBpZiAoc3RyaXBTcGVjaWFsS2V5d29yZHMpCi0gICAgewotICAgICAgX2ZpbHRlcnMuYWRkKF9rZXl3b3Jkc0ZpbHRlcik7Ci0gICAgfQotCi0gICAgaWYgKHN0cmlwV2hpdGVzcGFjZXMgfHwgc3RyaXBOZXdMaW5lcyB8fCBzdHJpcENvbW1lbnRzKQotICAgIHsKLSAgICAgIF9maWx0ZXJzCi0gICAgICAuYWRkKG5ldyBDb21wcmVzc2lvbkZpbHRlcihzdHJpcENvbW1lbnRzLCBzdHJpcFdoaXRlc3BhY2VzLCBzdHJpcE5ld0xpbmVzKSk7Ci0gICAgfQotCi0gICAgaWYgKG9iZnVzY2F0ZSkKLSAgICB7Ci0gICAgICBfZmlsdGVycy5hZGQoX29iZnVzY2F0aW9uRmlsdGVyKTsKLSAgICB9Ci0KLSAgICAvLyBtYWtlIG91dHB1dCBnZW5lcmF0b3IgdGhlIGxhc3QgZmlsdGVyCi0gICAgX2ZpbHRlcnMuYWRkKF9vdXRwdXRHZW5lcmF0b3IpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXRQYXJzZXIoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLSAgICBpZiAoX2pzUGFyc2VyID09IG51bGwpCi0gICAgewotICAgICAgX2pzUGFyc2VyID0gbmV3IEpTUGFyc2VyMTUoaW4pOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgX2pzUGFyc2VyLlJlSW5pdChpbik7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJvY2VzcyhJbnB1dFNvdXJjZSBpbiwgT3V0cHV0U3RyZWFtIG91dCkKLSAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24KLSAgewotICAgIGluaXQoaW4pOwotICAgIF9vdXRwdXRHZW5lcmF0b3Iuc2V0T3V0cHV0U3RyZWFtKG91dCk7Ci0KLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHRva2VuaXplKGluLmdldElucHV0U3RyZWFtKCkpOwotCi0gICAgZm9yIChJdGVyYXRvciBpdHIgPSBfZmlsdGVycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgT2JmdXNjYXRvckZpbHRlciBmaWx0ZXIgPSAoT2JmdXNjYXRvckZpbHRlcikgaXRyLm5leHQoKTsKLQotICAgICAgdG9rZW4gPSBmaWx0ZXIuZmlsdGVyKHRva2VuKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGluLCBGaWxlIG91dCkKLSAgICB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX29iZnVzY2F0ZSA9PSB0cnVlKQotICAgIHsKLSAgICAgIEZpbGVJbnB1dFN0cmVhbSBpblN0cmVhbSA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oaW4pOwotICAgICAgRmlsZU91dHB1dFN0cmVhbSBvdXRTdHJlYW0gPSBuZXcgRmlsZU91dHB1dFN0cmVhbShvdXQpOwotICAgICAgU3RyaW5nIGZpbGVOYW1lID0gaW4uZ2V0TmFtZSgpOwotICAgICAgSW5wdXRTb3VyY2UgaW5wU291cmNlID0KLSAgICAgICAgbmV3IElucHV0U291cmNlKGluU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnLnNraXBPYmZ1c2NhdGlvbihmaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWcuc2tpcFN0cmlwQ29tbWVudHMoZmlsZU5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBfY29uZmlnLnNraXBTdHJpcFdoaXRlc3BhY2VzKGZpbGVOYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbmZpZy5za2lwU3RyaXBOZXdsaW5lcyhmaWxlTmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9jb25maWcuc2tpcFN0cmlwU3BlY2lhbEtleXdvcmRzKGZpbGVOYW1lKSk7Ci0KLSAgICAgIHByb2Nlc3MoaW5wU291cmNlLCBvdXRTdHJlYW0pOwotICAgICAgaW5TdHJlYW0uY2xvc2UoKTsKLSAgICAgIG91dFN0cmVhbS5jbG9zZSgpOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgLy8gSnVzdCBjb3B5IHRoZSBmaWxlcyBvdmVyLgotICAgICAgRmlsZVV0aWxzLnRvdWNoKG91dCk7Ci0gICAgICBGaWxlVXRpbHMuY29weUZpbGUoaW4sb3V0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEFubm90YXRlZFRva2VuIHRva2VuaXplKElucHV0U3RyZWFtIGluKQotICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbgotICB7Ci0gICAgaW5pdFBhcnNlcihpbik7Ci0KLSAgICByZXR1cm4gKEFubm90YXRlZFRva2VuKSBfanNQYXJzZXIuUHJvZ3JhbSgpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL0NvbmZpZ0V4Y2VwdGlvbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vQ29uZmlnRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxZjk3MzEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vQ29uZmlnRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb247Ci0KLXB1YmxpYyBjbGFzcyBDb25maWdFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24KLXsKLSAgcHVibGljIENvbmZpZ0V4Y2VwdGlvbigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBDb25maWdFeGNlcHRpb24oVGhyb3dhYmxlIHQpCi0gIHsKLSAgICBzdXBlcih0KTsKLSAgfQotCi0gIHB1YmxpYyBDb25maWdFeGNlcHRpb24oU3RyaW5nIG1zZykKLSAgewotICAgIHN1cGVyKG1zZyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL09iZnVzY2F0b3JDb25maWcuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL09iZnVzY2F0b3JDb25maWcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU3MjgyZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvY29uZmlndXJhdGlvbi9PYmZ1c2NhdG9yQ29uZmlnLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmNvbmZpZ3VyYXRpb247Ci0KLWltcG9ydCBqYXZhLnV0aWwuVmVjdG9yOwotCi1wdWJsaWMgY2xhc3MgT2JmdXNjYXRvckNvbmZpZwotewotICBwcml2YXRlIFZlY3RvciBfb2JmRXhjbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgX2NvbW1lbnRzRXhjbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgX3dzRXhjbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgX25sRXhjbHVzaW9ucyA9IG5ldyBWZWN0b3IoKTsKLSAgcHJpdmF0ZSBWZWN0b3IgX2tleXdvcmRFeGNsdXNpb25zID0gbmV3IFZlY3RvcigpOwotCi0gIHB1YmxpYyBPYmZ1c2NhdG9yQ29uZmlnKCkgdGhyb3dzIENvbmZpZ0V4Y2VwdGlvbgotICB7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwT2JmdXNjYXRpb24oU3RyaW5nIGZpbGUpCi0gIHsKLSAgICByZXR1cm4gX29iZkV4Y2x1c2lvbnMuY29udGFpbnMoZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBDb21tZW50cyhTdHJpbmcgZmlsZSkKLSAgewotICAgIHJldHVybiBfY29tbWVudHNFeGNsdXNpb25zLmNvbnRhaW5zKGZpbGUpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gc2tpcFN0cmlwV2hpdGVzcGFjZXMoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICByZXR1cm4gX3dzRXhjbHVzaW9ucy5jb250YWlucyhmaWxlKTsKLSAgfQotCi0gIHB1YmxpYyBib29sZWFuIHNraXBTdHJpcE5ld2xpbmVzKFN0cmluZyBmaWxlKQotICB7Ci0gICAgcmV0dXJuIF9ubEV4Y2x1c2lvbnMuY29udGFpbnMoZmlsZSk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBza2lwU3RyaXBTcGVjaWFsS2V5d29yZHMoU3RyaW5nIGZpbGUpCi0gIHsKLSAgICByZXR1cm4gX2tleXdvcmRFeGNsdXNpb25zLmNvbnRhaW5zKGZpbGUpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGluaXQoKSB0aHJvd3MgQ29uZmlnRXhjZXB0aW9uCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vY29uZmlnLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9jb25maWd1cmF0aW9uL2NvbmZpZy54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjMWY2NmIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2NvbmZpZ3VyYXRpb24vY29uZmlnLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IndpbmRvd3MtMTI1MiIgPz4NCi08IS0tDQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUNCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlDQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uDQotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUNCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQ0KLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlDQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCi0NCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQotDQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywNCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4NCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZDQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQ0KLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zDQotICAgIHVuZGVyIHRoZSBMaWNlbnNlLg0KLQkgICANCi0tLT4NCi08b2JmdXNjYXRvcj4NCi0gIDxpbnB1dD4NCi0gICAgPGV4Y2x1c2lvbnM+DQotICAgICAgPG9iZnVzY2F0aW9uPg0KLSAgICAgIDwvb2JmdXNjYXRpb24+DQotICAgICAgPGNvbW1lbnRzPg0KLSAgICAgIDwvY29tbWVudHM+DQotICAgICAgPHdoaXRlc3BhY2VzPg0KLSAgICAgIDwvd2hpdGVzcGFjZXM+DQotICAgICAgPG5ld2xpbmVzPg0KLSAgICAgIDwvbmV3bGluZXM+DQotICAgICAgPHNwZWNpYWxrZXl3b3Jkcz4NCi0gICAgICAgIDxmaWxlPkFzc2VydC5qczwvZmlsZT4NCi0gICAgICAgIDxmaWxlPkxvZ2dlci5qczwvZmlsZT4gICAgICANCi0gICAgICA8L3NwZWNpYWxrZXl3b3Jkcz4NCi0gICAgPC9leGNsdXNpb25zPg0KLSAgPC9pbnB1dD4NCi08L29iZnVzY2F0b3I+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvT2JmdXNjYXRvckZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvT2JmdXNjYXRvckZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDI3NDAyLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL09iZnVzY2F0b3JGaWx0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVyczsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgaW50ZXJmYWNlIE9iZnVzY2F0b3JGaWx0ZXIKLXsKLSAgQW5ub3RhdGVkVG9rZW4gZmlsdGVyKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pOwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tbWVudHNIYW5kbGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21tZW50c0hhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWYyMTMxOC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21tZW50c0hhbmRsZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5jb21wcmVzc2lvbjsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgQ29tbWVudHNIYW5kbGVyIGltcGxlbWVudHMgQ29tcHJlc3Npb25IYW5kbGVyCi17Ci0gIHB1YmxpYyBDb21tZW50c0hhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGUoQW5ub3RhdGVkVG9rZW4gdG9rZW4sIEFubm90YXRlZFRva2VuIHByZXZUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHNwZWNpYWxUb2tlbiA9IHRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgIEFubm90YXRlZFRva2VuIHByZXZTcGVjaWFsVG9rZW4gPSB0b2tlbjsKLQotICAgIHdoaWxlIChzcGVjaWFsVG9rZW4gIT0gbnVsbCkKLSAgICB7Ci0gICAgICAvLyByZW1vdmUgc2luZ2xlIGxpbmUgYW5kIG11bHRpbGluZSBjb21tZW50cwotICAgICAgaWYgKHNwZWNpYWxUb2tlbi5pc0NvbW1lbnQoKSkKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uRmlsdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9Db21wcmVzc2lvbkZpbHRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMzc1YTRiLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLk9iZnVzY2F0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5WZWN0b3I7Ci0KLQotcHVibGljIGNsYXNzIENvbXByZXNzaW9uRmlsdGVyIGltcGxlbWVudHMgT2JmdXNjYXRvckZpbHRlcgotewotICBwcml2YXRlIGJvb2xlYW4gX3N0cmlwQ29tbWVudHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBfc3RyaXBXaGl0ZXNwYWNlczsKLSAgcHJpdmF0ZSBib29sZWFuIF9zdHJpcE5ld2xpbmVzOwotICBwcml2YXRlIFZlY3RvciBfaGFuZGxlcnMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgcHVibGljIENvbXByZXNzaW9uRmlsdGVyKGJvb2xlYW4gc3RyaXBDb21tZW50cywgYm9vbGVhbiBzdHJpcFdoaXRlc3BhY2VzLAotICAgIGJvb2xlYW4gc3RyaXBOZXdsaW5lcykKLSAgewotICAgIF9zdHJpcENvbW1lbnRzID0gc3RyaXBDb21tZW50czsKLSAgICBfc3RyaXBXaGl0ZXNwYWNlcyA9IHN0cmlwV2hpdGVzcGFjZXM7Ci0gICAgX3N0cmlwTmV3bGluZXMgPSBzdHJpcE5ld2xpbmVzOwotCi0gICAgLy8gY3JlYXRlIGEgc2V0IG9mIGhhbmRsZXJzIGJhc2VkIG9uIHN1cHBsaWVkIG9wdGlvbnMKLSAgICBpbml0KCk7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZmlsdGVyKEFubm90YXRlZFRva2VuIHN0YXJ0VG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW47Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuID0gbnVsbDsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIGhhbmQgb2ZmIHRvIGhhbmRsZXJzCi0gICAgICAvLyB0b2RvOiBpbmxpbmUgdGhlc2UgaWYgdGhpcyBpcyB0b28gZXhwZW5zaXZlCi0gICAgICBmb3IgKEl0ZXJhdG9yIGl0ciA9IF9oYW5kbGVycy5pdGVyYXRvcigpOyBpdHIuaGFzTmV4dCgpOykKLSAgICAgIHsKLSAgICAgICAgQ29tcHJlc3Npb25IYW5kbGVyIGhhbmRsZXIgPSAoQ29tcHJlc3Npb25IYW5kbGVyKSBpdHIubmV4dCgpOwotICAgICAgICBoYW5kbGVyLmhhbmRsZSh0b2tlbiwgcHJldlRva2VuKTsKLSAgICAgIH0KLQotICAgICAgcHJldlRva2VuID0gdG9rZW47Ci0gICAgICB0b2tlbiA9IHRva2VuLmdldE5leHQoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhcnRUb2tlbjsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBpbml0KCkKLSAgewotICAgIGlmIChfc3RyaXBDb21tZW50cykKLSAgICB7Ci0gICAgICBfaGFuZGxlcnMuYWRkKG5ldyBDb21tZW50c0hhbmRsZXIoKSk7Ci0gICAgfQotCi0gICAgaWYgKF9zdHJpcFdoaXRlc3BhY2VzKQotICAgIHsKLSAgICAgIF9oYW5kbGVycy5hZGQobmV3IFdoaXRlc3BhY2VIYW5kbGVyKCkpOwotICAgIH0KLQotICAgIGlmIChfc3RyaXBOZXdsaW5lcykKLSAgICB7Ci0gICAgICBfaGFuZGxlcnMuYWRkKG5ldyBOZXdsaW5lSGFuZGxlcigpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL0NvbXByZXNzaW9uSGFuZGxlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25IYW5kbGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMyMGJhMzYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vQ29tcHJlc3Npb25IYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGludGVyZmFjZSBDb21wcmVzc2lvbkhhbmRsZXIKLXsKLSAgdm9pZCBoYW5kbGUoQW5ub3RhdGVkVG9rZW4gdG9rZW4sIEFubm90YXRlZFRva2VuIHByZXZUb2tlbik7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9OZXdsaW5lSGFuZGxlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvY29tcHJlc3Npb24vTmV3bGluZUhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTAyMmJmNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9OZXdsaW5lSGFuZGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmNvbXByZXNzaW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotCi0KLXB1YmxpYyBjbGFzcyBOZXdsaW5lSGFuZGxlciBpbXBsZW1lbnRzIENvbXByZXNzaW9uSGFuZGxlcgotewotICBwdWJsaWMgTmV3bGluZUhhbmRsZXIoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBoYW5kbGUoQW5ub3RhdGVkVG9rZW4gdG9rZW4sIEFubm90YXRlZFRva2VuIHByZXZUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHNwZWNpYWxUb2tlbiA9IHRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgIEFubm90YXRlZFRva2VuIHByZXZTcGVjaWFsVG9rZW4gPSB0b2tlbjsKLSAgICBib29sZWFuIHNraXBPbmUgPSAocHJldlRva2VuID09IG51bGwpID8gZmFsc2UgOiB0cnVlOwotCi0gICAgd2hpbGUgKHNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIGlmIChzcGVjaWFsVG9rZW4uaXNOZXdMaW5lKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChza2lwT25lKQotICAgICAgICB7Ci0gICAgICAgICAgc2tpcE9uZSA9IGZhbHNlOwotICAgICAgICAgIHNwZWNpYWxUb2tlbi5pbWFnZSA9ICJcclxuIjsKLSAgICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwcmV2U3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL1doaXRlc3BhY2VIYW5kbGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9jb21wcmVzc2lvbi9XaGl0ZXNwYWNlSGFuZGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzZiODM4Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2NvbXByZXNzaW9uL1doaXRlc3BhY2VIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMuY29tcHJlc3Npb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci0KLQotcHVibGljIGNsYXNzIFdoaXRlc3BhY2VIYW5kbGVyIGltcGxlbWVudHMgQ29tcHJlc3Npb25IYW5kbGVyCi17Ci0gIHB1YmxpYyBXaGl0ZXNwYWNlSGFuZGxlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGhhbmRsZShBbm5vdGF0ZWRUb2tlbiB0b2tlbiwgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gc3BlY2lhbFRva2VuID0gdG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgQW5ub3RhdGVkVG9rZW4gcHJldlNwZWNpYWxUb2tlbiA9IHRva2VuOwotICAgIGJvb2xlYW4gc2tpcE9uZSA9IChwcmV2VG9rZW4gPT0gbnVsbCkgPyBmYWxzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAocHJldlRva2VuLmlzV1NTZW5zaXRpdmUoKSB8fAotICAgICAgdG9rZW4uaXNJbmZpeFdTU2Vuc2l0aXZlKCkpOwotCi0gICAgd2hpbGUgKHNwZWNpYWxUb2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIC8vIHJlbW92ZSB3aGl0ZXNwYWNlLiBLZWVwIG9uZSBpZiB0aGUgdG9rZW4gaXMgd2hpdGVzcGFjZSBzZW5zaXRpdmUKLSAgICAgIGlmIChzcGVjaWFsVG9rZW4uaXNXaGl0ZVNwYWNlKCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChza2lwT25lKQotICAgICAgICB7Ci0gICAgICAgICAgc2tpcE9uZSA9IGZhbHNlOwotICAgICAgICAgIHNwZWNpYWxUb2tlbi5pbWFnZSA9ICIgIjsKLSAgICAgICAgICBwcmV2U3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuOwotICAgICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgIHsKLSAgICAgICAgICBwcmV2U3BlY2lhbFRva2VuLnNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgICAgc3BlY2lhbFRva2VuID0gc3BlY2lhbFRva2VuLmdldFNwZWNpYWxUb2tlbigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL2tleXdvcmRzL1NwZWNpYWxLZXl3b3Jkc0ZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMva2V5d29yZHMvU3BlY2lhbEtleXdvcmRzRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQxOWMwNTAuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMva2V5d29yZHMvU3BlY2lhbEtleXdvcmRzRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLmtleXdvcmRzOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5PYmZ1c2NhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLQotCi1wdWJsaWMgY2xhc3MgU3BlY2lhbEtleXdvcmRzRmlsdGVyIGltcGxlbWVudHMgT2JmdXNjYXRvckZpbHRlcgotewotICBwdWJsaWMgU3BlY2lhbEtleXdvcmRzRmlsdGVyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIEFubm90YXRlZFRva2VuIGZpbHRlcihBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSBzdGFydFRva2VuOwotICAgIHRva2VuID0gcmVtb3ZlU3BlY2lhbFR5cGVzKHRva2VuKTsKLQotICAgIHJldHVybiB0b2tlbjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHJlbW92ZVNwZWNpYWxUb2tlbnMoQW5ub3RhdGVkVG9rZW4gdG9rZW4pCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiBzcGVjaWFsVG9rZW4gPSB0b2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2U3BlY2lhbFRva2VuID0gdG9rZW47Ci0KLSAgICB3aGlsZSAoc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHNwZWNpYWxUb2tlbi5pc1JlbW92YWJsZUtleXdvcmQoKSkKLSAgICAgIHsKLSAgICAgICAgcHJldlNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uc3BlY2lhbFRva2VuOwotICAgICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHByZXZTcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW47Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5nZXRTcGVjaWFsVG9rZW4oKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGhlIG1haW4gbG9vcCByZW1vdmVzIHNwZWNpYWwgdHlwZXMgKGxpa2UgUHJvZmlsZXIsIGFuZCBDaGVja1BvaW50KSBhbmQKLSAgICogYWxsIG1ldGhvZCBpbnZvY2F0aW9ucyB1c2luZyB2YXJpYWJsZXMgb2YgdGhlc2UgdHlwZXMuIFRoZSBtYWluCi0gICAqIGxvb3AgY2FsbHMgcmVtb3ZlU3BlY2lhbFRva2VucyB3aGljaCByZW1vdmVzIHNwZWNpYWwga2V5d29yZHMgbGlrZSBBc3NlcnQKLSAgICogYW5kIExvZ2dlciwgd2hpY2ggd2VyZSB0YWdnZWQgYnkgdGhlIHBhcnNlciBhcyBTcGVjaWFsVG9rZW5zCi0gICAqIEBwYXJhbSBzdGFydFRva2VuCi0gICAqIEByZXR1cm4KLSAgICovCi0gIHByb3RlY3RlZCBBbm5vdGF0ZWRUb2tlbiByZW1vdmVTcGVjaWFsVHlwZXMoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLSAgICBBbm5vdGF0ZWRUb2tlbiBwcmV2VG9rZW4gPSBudWxsOwotICAgIEFubm90YXRlZFRva2VuIG5ld1N0YXJ0VG9rZW4gPSBudWxsOwotCi0gICAgd2hpbGUgKHRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgaWYgKHRva2VuLmNhblJlbW92ZSgpKQotICAgICAgewotICAgICAgICBpZiAocHJldlRva2VuICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBwcmV2VG9rZW4ubmV4dCA9IHRva2VuLmdldE5leHQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICByZW1vdmVTcGVjaWFsVG9rZW5zKHRva2VuKTsKLQotICAgICAgICBpZiAobmV3U3RhcnRUb2tlbiA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgbmV3U3RhcnRUb2tlbiA9IHRva2VuOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldlRva2VuID0gdG9rZW47Ci0gICAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBuZXdTdGFydFRva2VuOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9PYmZ1c2NhdGlvbkZpbHRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vT2JmdXNjYXRpb25GaWx0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjU5MDczMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9PYmZ1c2NhdGlvbkZpbHRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5PYmZ1c2NhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGUuUm9vdFN0YXRlOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHRTdGFjazsKLQotCi1wdWJsaWMgY2xhc3MgT2JmdXNjYXRpb25GaWx0ZXIgaW1wbGVtZW50cyBPYmZ1c2NhdG9yRmlsdGVyCi17Ci0gIHB1YmxpYyBPYmZ1c2NhdGlvbkZpbHRlcigpCi0gIHsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBmaWx0ZXIoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIGlmIChzdGFydFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgLy8gdHJhbnNpdGlvbiB0byByb290IHN0YXRlCi0gICAgICBQcm9ncmFtQ29udGV4dFN0YWNrIHByb2dyYW1Db250ZXh0U3RhY2sgPSBuZXcgUHJvZ3JhbUNvbnRleHRTdGFjaygpOwotICAgICAgUm9vdFN0YXRlLmdldEluc3RhbmNlKCkuZW50ZXJTdGF0ZShwcm9ncmFtQ29udGV4dFN0YWNrLCBzdGFydFRva2VuLCBudWxsKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RhcnRUb2tlbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25Db250ZXh0LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvbkNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE5YTFjNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvbkNvbnRleHQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5OYW1lR2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dDsKLQotCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25Db250ZXh0IGV4dGVuZHMgUHJvZ3JhbUNvbnRleHQgewotICAgIHByaXZhdGUgYm9vbGVhbiBfb2JmdXNjYXRlTG9jYWxWYXJzOwotCi0gICAgcHVibGljIEZ1bmN0aW9uQ29udGV4dChTdHJpbmcgbmFtZSwgYm9vbGVhbiBvYmZ1c2NhdGVMb2NhbFZhcnMpIHsKLSAgICAgICAgc3VwZXIobmFtZSk7Ci0gICAgICAgIF9vYmZ1c2NhdGVMb2NhbFZhcnMgPSBvYmZ1c2NhdGVMb2NhbFZhcnM7Ci0gICAgfQotCi0gICAgcHVibGljIEZ1bmN0aW9uQ29udGV4dChTdHJpbmcgbmFtZSwgTmFtZUdlbiBuYW1lR2VuLCBib29sZWFuIHVzZXNFdmFsKSB7Ci0gICAgICAgIHN1cGVyKG5hbWUsIG5hbWVHZW4pOwotICAgICAgICBfb2JmdXNjYXRlTG9jYWxWYXJzID0gdXNlc0V2YWw7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0T2JmdXNjYXRlTG9jYWxWYXJzKGJvb2xlYW4gb2JmdXNjYXRlTG9jYWxWYXJzKSB7Ci0gICAgICAgIF9vYmZ1c2NhdGVMb2NhbFZhcnMgPSBvYmZ1c2NhdGVMb2NhbFZhcnM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gY2FuT2JmdXNjYXRlTG9jYWxWYXJzKCkgewotICAgICAgICByZXR1cm4gX29iZnVzY2F0ZUxvY2FsVmFyczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvblN0YXRlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9GdW5jdGlvblN0YXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODk1ODIuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2ZpbHRlcnMvb2JmdXNjYXRpb24vc3RhdGUvRnVuY3Rpb25TdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTIzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5vYmZ1c2NhdGlvbi5zdGF0ZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGlvbkNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuSlNQYXJzZXIxNUNvbnN0YW50czsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuTmFtZUdlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHQ7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0U3RhY2s7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgRnVuY3Rpb25TdGF0ZSBleHRlbmRzIE9iZnVzY2F0aW9uU3RhdGUKLXsKLSAgc3RhdGljIHByaXZhdGUgRnVuY3Rpb25TdGF0ZSBfaW5zdGFuY2U7Ci0KLSAgLy8gcHJpdmF0ZSBjb25zdHJ1bmN0b3IgZm9yIHNpbmdsZXRvbgotICBwcml2YXRlIEZ1bmN0aW9uU3RhdGUoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIEZ1bmN0aW9uU3RhdGUgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN5bmNocm9uaXplZCAoRnVuY3Rpb25TdGF0ZS5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgX2luc3RhbmNlID0gbmV3IEZ1bmN0aW9uU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZW50ZXJTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuLCBOYW1lR2VuIG5hbWVHZW4pCi0gIHsKLSAgICBGdW5jdGlvbkNvbnRleHQgZnVuY3Rpb25Db250ZXh0OwotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLSAgICBTdHJpbmcgY29udGV4dE5hbWUgPSAiQW5vbnltb3VzRnVuY3Rpb24iOwotICAgIFZlY3RvciBwYXJhbXMgPSAoVmVjdG9yKSB0b2tlbi5nZXRBbm5vdGF0aW9uT2JqZWN0KCk7Ci0gICAgYm9vbGVhbiBvYmZ1c2NhdGVMb2NhbFZhcnMgPSAhdG9rZW4uZnVuY3Rpb25Vc2VzRXZhbCgpOwotCi0gICAgaWYgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk5BTUVEX0ZVTkNUSU9OKQotICAgIHsKLSAgICAgIC8vIGdyYWIgdGhlIGZ1bmN0aW9uIG5hbWUKLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgY29udGV4dE5hbWUgPSB0b2tlbi5pbWFnZTsKLSAgICAgIGZ1bmN0aW9uQ29udGV4dCA9IG5ldyBGdW5jdGlvbkNvbnRleHQoY29udGV4dE5hbWUsIG9iZnVzY2F0ZUxvY2FsVmFycyk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyByZXVzZSB0aGUgc3ltYm9sIG5hbWUgZ2VuZXJhdG9yIGZvciBhbm9ueW1vdXMgZnVuY3Rpb25zCi0gICAgICBmdW5jdGlvbkNvbnRleHQgPSBuZXcgRnVuY3Rpb25Db250ZXh0KGNvbnRleHROYW1lLCBuYW1lR2VuLAotICAgICAgICAgIG9iZnVzY2F0ZUxvY2FsVmFycyk7Ci0gICAgfQotCi0gICAgaWYgKG9iZnVzY2F0ZUxvY2FsVmFycykKLSAgICB7Ci0gICAgICBvYmZ1c2NhdGVGdW5jdGlvblBhcmFtcyhwYXJhbXMsIGZ1bmN0aW9uQ29udGV4dCk7Ci0gICAgfQotCi0gICAgd2hpbGUgKHRva2VuLmtpbmQgIT0gSlNQYXJzZXIxNUNvbnN0YW50cy5MQlJBQ0UpCi0gICAgewotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KGZ1bmN0aW9uQ29udGV4dCk7Ci0KLSAgICByZXR1cm4gcHJvY2Vzc0NvZGVCbG9jayhjb250ZXh0U3RhY2ssIHRva2VuKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBvYmZ1c2NhdGVGdW5jdGlvblBhcmFtcyhWZWN0b3IgcGFyYW1zLAotICAgIFByb2dyYW1Db250ZXh0IGZ1bmN0aW9uQ29udGV4dCkKLSAgewotICAgIGZvciAoSXRlcmF0b3IgaXRyID0gcGFyYW1zLml0ZXJhdG9yKCk7IGl0ci5oYXNOZXh0KCk7KQotICAgIHsKLSAgICAgIEFubm90YXRlZFRva2VuIHBhcmFtVG9rZW4gPSAoQW5ub3RhdGVkVG9rZW4pIGl0ci5uZXh0KCk7Ci0gICAgICBmdW5jdGlvbkNvbnRleHQuYWRkVG9rZW4ocGFyYW1Ub2tlbi5pbWFnZSwgcGFyYW1Ub2tlbik7Ci0gICAgICBwYXJhbVRva2VuLmltYWdlID0gZnVuY3Rpb25Db250ZXh0LmdlbmVyYXRlU3ltYm9sTmFtZSgpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4aXRTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaykKLSAgewotICAgIGNvbnRleHRTdGFjay5wb3BDb250ZXh0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzVmFySWRlbnRpZmllcihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIEZ1bmN0aW9uQ29udGV4dCBmdW5jdGlvbkNvbnRleHQgPSAoRnVuY3Rpb25Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotCi0gICAgLy8gbm9ybWFsIHByb2Nlc3NpbmcgZm9yIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCB1c2UgZXZhbCgpIGNhbGxzCi0gICAgaWYgKGZ1bmN0aW9uQ29udGV4dC5jYW5PYmZ1c2NhdGVMb2NhbFZhcnMoKSkKLSAgICB7Ci0gICAgICBzdXBlci5wcm9jZXNzVmFySWRlbnRpZmllcihjb250ZXh0U3RhY2ssIHRva2VuKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL09iZnVzY2F0aW9uU3RhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL09iZnVzY2F0aW9uU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBlMTZjOS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9PYmZ1c2NhdGlvblN0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0aW9uQ29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5KU1BhcnNlcjE1Q29uc3RhbnRzOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5OYW1lR2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHRTdGFjazsKLQotCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgT2JmdXNjYXRpb25TdGF0ZQotewotICBwdWJsaWMgYWJzdHJhY3QgQW5ub3RhdGVkVG9rZW4gZW50ZXJTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuLCBOYW1lR2VuIG5hbWVHZW4pOwotCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIGV4aXRTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjayk7Ci0KLSAgLyoqCi0gICogT2JmdXNjYXRlcyB2YXJpYWJsZSBkZWNsYXJhdGlvbnMKLSAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICogQHBhcmFtIHRva2VuCi0gICovCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYXJJZGVudGlmaWVyKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgUHJvZ3JhbUNvbnRleHQgYmxvY2tDb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotCi0gICAgLy8gc2tpcCBnbG9iYWwgdmFycwotICAgIGlmIChjb250ZXh0U3RhY2suc2l6ZSgpID4gMSkKLSAgICB7Ci0gICAgICAvLyBhZGQgb25seSBpZiB3ZSBoYXZlIG5vdCBzZWVuIHRoaXMgdmFyaWFibGUgYmVmb3JlIGluIHRoaXMgY29udGV4dC4KLSAgICAgIEFubm90YXRlZFRva2VuIHNhdmVkVG9rZW4gPSBibG9ja0NvbnRleHQuZ2V0VG9rZW4odG9rZW4uaW1hZ2UpOwotICAgICAgU3RyaW5nIHRva2VuSW1hZ2U7Ci0KLSAgICAgIGlmIChzYXZlZFRva2VuID09IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHRva2VuSW1hZ2UgPSBibG9ja0NvbnRleHQuZ2VuZXJhdGVTeW1ib2xOYW1lKCk7Ci0gICAgICAgIGJsb2NrQ29udGV4dC5hZGRUb2tlbih0b2tlbi5pbWFnZSwgdG9rZW4pOwotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICB0b2tlbkltYWdlID0gc2F2ZWRUb2tlbi5pbWFnZTsKLSAgICAgIH0KLQotICAgICAgdG9rZW4uaW1hZ2UgPSB0b2tlbkltYWdlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAqCi0gICogQHBhcmFtIGNvbnRleHRTdGFjawotICAqIEBwYXJhbSBzdGFydFRva2VuCi0gICogQHJldHVybgotICAqLwotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gcHJvY2Vzc0NvZGVCbG9jayhQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuKQotICB7Ci0gICAgLy8gZ3JhYiB0aGUgY29udGV4dCBvbiB0b3Agb2YgdGhlIHN0YWNrCi0gICAgUHJvZ3JhbUNvbnRleHQgYmxvY2tDb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHN3aXRjaCAodG9rZW4uZ2V0S2luZCgpKQotICAgICAgewotICAgICAgY2FzZSBBbm5vdGF0aW9uQ29uc3RhbnRzLk5BTUVEX0ZVTkNUSU9OOgotICAgICAgY2FzZSBBbm5vdGF0aW9uQ29uc3RhbnRzLkFOT05ZTU9VU19GVU5DVElPTjoKLSAgICAgICAgdG9rZW4gPSBGdW5jdGlvblN0YXRlLmdldEluc3RhbmNlKCkuZW50ZXJTdGF0ZShjb250ZXh0U3RhY2ssIHRva2VuLAotICAgICAgICAgICAgYmxvY2tDb250ZXh0LmdldE5hbWVHZW4oKSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgQW5ub3RhdGlvbkNvbnN0YW50cy5WQVJfSURFTlRJRklFUjoKLSAgICAgIHsKLSAgICAgICAgcHJvY2Vzc1ZhcklkZW50aWZpZXIoY29udGV4dFN0YWNrLCB0b2tlbik7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgSlNQYXJzZXIxNUNvbnN0YW50cy5JREVOVElGSUVSOgotICAgICAgY2FzZSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9JREVOVElGSUVSOgotCi0gICAgICAgIEFubm90YXRlZFRva2VuIG9iZnVzY2F0ZWRUb2tlbiA9IGNvbnRleHRTdGFjay5nZXRUb2tlbih0b2tlbi5pbWFnZSk7Ci0KLSAgICAgICAgaWYgKG9iZnVzY2F0ZWRUb2tlbiAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdG9rZW4uaW1hZ2UgPSBvYmZ1c2NhdGVkVG9rZW4uaW1hZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBKU1BhcnNlcjE1Q29uc3RhbnRzLkxCUkFDRToKLSAgICAgICAgdG9rZW4gPSBTdGF0ZW1lbnRCbG9ja1N0YXRlLmdldEluc3RhbmNlKCkuZW50ZXJTdGF0ZShjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICB0b2tlbiwgYmxvY2tDb250ZXh0LmdldE5hbWVHZW4oKSk7Ci0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgSlNQYXJzZXIxNUNvbnN0YW50cy5SQlJBQ0U6Ci0gICAgICAgIGV4aXRTdGF0ZShjb250ZXh0U3RhY2spOwotCi0gICAgICAgIHJldHVybiB0b2tlbjsKLSAgICAgIH0KLQotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHRva2VuOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9Sb290U3RhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1Jvb3RTdGF0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjA4MmM2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1Jvb3RTdGF0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5maWx0ZXJzLm9iZnVzY2F0aW9uLnN0YXRlOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLkFubm90YXRlZFRva2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5OYW1lR2VuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dDsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuUHJvZ3JhbUNvbnRleHRTdGFjazsKLQotCi1wdWJsaWMgY2xhc3MgUm9vdFN0YXRlIGV4dGVuZHMgT2JmdXNjYXRpb25TdGF0ZQotewotICBzdGF0aWMgcHJpdmF0ZSBSb290U3RhdGUgX2luc3RhbmNlOwotCi0gIC8vIHByaXZhdGUgY29uc3RydW5jdG9yIGZvciBzaW5nbGV0b24KLSAgcHJpdmF0ZSBSb290U3RhdGUoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFJvb3RTdGF0ZSBnZXRJbnN0YW5jZSgpCi0gIHsKLSAgICBpZiAoX2luc3RhbmNlID09IG51bGwpCi0gICAgewotICAgICAgc3luY2hyb25pemVkIChSb290U3RhdGUuY2xhc3MpCi0gICAgICB7Ci0gICAgICAgIGlmIChfaW5zdGFuY2UgPT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIF9pbnN0YW5jZSA9IG5ldyBSb290U3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZW50ZXJTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuLCBOYW1lR2VuIG5hbWVHZW4pCi0gIHsKLSAgICBjb250ZXh0U3RhY2sucHVzaENvbnRleHQobmV3IFByb2dyYW1Db250ZXh0KCJyb290IikpOwotCi0gICAgcmV0dXJuIHByb2Nlc3NDb2RlQmxvY2soY29udGV4dFN0YWNrLCBzdGFydFRva2VuKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGV4aXRTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaykKLSAgewotICAgIGNvbnRleHRTdGFjay5wb3BDb250ZXh0KCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1N0YXRlbWVudEJsb2NrU3RhdGUuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL29iZnVzY2F0aW9uL3N0YXRlL1N0YXRlbWVudEJsb2NrU3RhdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU2N2JmZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vYmZ1c2NhdGlvbi9zdGF0ZS9TdGF0ZW1lbnRCbG9ja1N0YXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub2JmdXNjYXRpb24uc3RhdGU7Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuQW5ub3RhdGVkVG9rZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLk5hbWVHZW47Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyLlByb2dyYW1Db250ZXh0OwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Qcm9ncmFtQ29udGV4dFN0YWNrOwotCi0KLXB1YmxpYyBjbGFzcyBTdGF0ZW1lbnRCbG9ja1N0YXRlIGV4dGVuZHMgT2JmdXNjYXRpb25TdGF0ZQotewotICBzdGF0aWMgcHJpdmF0ZSBTdGF0ZW1lbnRCbG9ja1N0YXRlIF9pbnN0YW5jZTsKLQotICBwcml2YXRlIFN0YXRlbWVudEJsb2NrU3RhdGUoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0YXRlbWVudEJsb2NrU3RhdGUgZ2V0SW5zdGFuY2UoKQotICB7Ci0gICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgIHsKLSAgICAgIHN5bmNocm9uaXplZCAoU3RhdGVtZW50QmxvY2tTdGF0ZS5jbGFzcykKLSAgICAgIHsKLSAgICAgICAgaWYgKF9pbnN0YW5jZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgX2luc3RhbmNlID0gbmV3IFN0YXRlbWVudEJsb2NrU3RhdGUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBfaW5zdGFuY2U7Ci0gIH0KLQotICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZW50ZXJTdGF0ZShQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydFRva2VuLCBOYW1lR2VuIG5hbWVHZW4pCi0gIHsKLSAgICAvLyBkbyBub3QgY3JlYXRlIGEgbmV3IGNvbnRleHQgaW4gYSBzdGF0ZW1lbnQgYmxvY2suIEphdmFTY3JpcHQgZG9lcyBub3QgdXNlIGEgbmV3IHNjb3BlIGluIGEKLSAgICAvLyBzdGF0ZW1lbnQgYmxvY2sKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0VG9rZW4uZ2V0TmV4dCgpOwotCi0gICAgcmV0dXJuIHByb2Nlc3NDb2RlQmxvY2soY29udGV4dFN0YWNrLCB0b2tlbik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBleGl0U3RhdGUoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2spCi0gIHsKLSAgICAvLyBkbyBub3QgcG9wIGNvbnRleHQKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NWYXJJZGVudGlmaWVyKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLAotICAgIEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgUHJvZ3JhbUNvbnRleHQgYmxvY2tDb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBjb250ZXh0U3RhY2sucGVlaygpOwotCi0gICAgLy8gbm9ybWFsIHByb2Nlc3NpbmcgZm9yIGZ1bmN0aW9ucyB0aGF0IGRvIG5vdCB1c2UgZXZhbCgpIGNhbGxzCi0gICAgaWYgKCEoYmxvY2tDb250ZXh0IGluc3RhbmNlb2YgRnVuY3Rpb25Db250ZXh0KSB8fAotICAgICAgICAoYmxvY2tDb250ZXh0IGluc3RhbmNlb2YgRnVuY3Rpb25Db250ZXh0ICYmCi0gICAgICAgICgoRnVuY3Rpb25Db250ZXh0KSBibG9ja0NvbnRleHQpLmNhbk9iZnVzY2F0ZUxvY2FsVmFycygpKSkKLSAgICB7Ci0gICAgICBzdXBlci5wcm9jZXNzVmFySWRlbnRpZmllcihjb250ZXh0U3RhY2ssIHRva2VuKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL291dHB1dC9PdXRwdXRHZW5lcmF0b3IuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9maWx0ZXJzL291dHB1dC9PdXRwdXRHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWY5MjY4YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvZmlsdGVycy9vdXRwdXQvT3V0cHV0R2VuZXJhdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmZpbHRlcnMub3V0cHV0OwotCi1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuZmlsdGVycy5PYmZ1c2NhdG9yRmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlci5Bbm5vdGF0ZWRUb2tlbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXIuVG9rZW47Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uUHJpbnRTdHJlYW07Ci0KLQotcHVibGljIGNsYXNzIE91dHB1dEdlbmVyYXRvciBpbXBsZW1lbnRzIE9iZnVzY2F0b3JGaWx0ZXIKLXsKLSAgcHJpdmF0ZSBQcmludFN0cmVhbSBfb3V0U3RyZWFtOwotCi0gIHB1YmxpYyBPdXRwdXRHZW5lcmF0b3IoKQotICB7Ci0gIH0KLQotICBwdWJsaWMgT3V0cHV0R2VuZXJhdG9yKE91dHB1dFN0cmVhbSBvdXRTdHJlYW0pCi0gIHsKLSAgICBfb3V0U3RyZWFtID0gbmV3IFByaW50U3RyZWFtKG5ldyBCdWZmZXJlZE91dHB1dFN0cmVhbShvdXRTdHJlYW0pKTsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBmaWx0ZXIoQW5ub3RhdGVkVG9rZW4gc3RhcnRUb2tlbikKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnRUb2tlbjsKLQotICAgIHdoaWxlICh0b2tlbiAhPSBudWxsKQotICAgIHsKLSAgICAgIHByaW50VG9rZW4odG9rZW4pOwotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgX291dFN0cmVhbS5mbHVzaCgpOwotCi0gICAgcmV0dXJuIHN0YXJ0VG9rZW47Ci0gIH0KLQotICBwdWJsaWMgdm9pZCBzZXRPdXRwdXRTdHJlYW0oT3V0cHV0U3RyZWFtIG91dFN0cmVhbSkKLSAgewotICAgIF9vdXRTdHJlYW0gPSBuZXcgUHJpbnRTdHJlYW0obmV3IEJ1ZmZlcmVkT3V0cHV0U3RyZWFtKG91dFN0cmVhbSkpOwotICB9Ci0KLSAgcHVibGljIFByaW50U3RyZWFtIGdldE91dHB1dFN0cmVhbSgpCi0gIHsKLSAgICByZXR1cm4gX291dFN0cmVhbTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBwcmludFRva2VuKFRva2VuIHRva2VuKQotICB7Ci0gICAgLy8gcHJpbnQgc3BlY2lhbCB0b2tlbnMgZmlyc3QKLSAgICBpZiAodG9rZW4uc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgcHJpbnRUb2tlbih0b2tlbi5zcGVjaWFsVG9rZW4pOwotICAgIH0KLQotICAgIF9vdXRTdHJlYW0ucHJpbnQodG9rZW4uaW1hZ2UpOwotICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRlZFRva2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRlZFRva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyMzQzMjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Bbm5vdGF0ZWRUb2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotcHVibGljIGNsYXNzIEFubm90YXRlZFRva2VuIGV4dGVuZHMgVG9rZW4gewotICAgIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgVmVjdG9yIFNQRUNJQUxfVFlQRVMgPSBuZXcgVmVjdG9yKCk7Ci0KLSAgICBzdGF0aWMgewotICAgICAgICBTUEVDSUFMX1RZUEVTLmFkZCgiUHJvZmlsZXIiKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFUy5hZGQoIkNoZWNrcG9pbnQiKTsKLSAgICAgICAgU1BFQ0lBTF9UWVBFUy5hZGQoIkFzc2VydCIpOwotICAgICAgICBTUEVDSUFMX1RZUEVTLmFkZCgiTG9nZ2VyIik7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFBSRUZJWF9XUyA9IDE7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgSU5GSVhfV1MgPSAyOwotCi0gICAgcHJvdGVjdGVkIGludCBfYW5ub3RhdGlvbktpbmQgPSBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRDsKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IF9hbm5vdGF0aW9uT2JqZWN0OwotICAgIHByb3RlY3RlZCBpbnQgX3dzU2Vuc2l0aXZlID0gMDsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBfcmVtb3ZlOwotICAgIHByb3RlY3RlZCBib29sZWFuIF9mdW5jVXNlc0V2YWw7Ci0gICAgcHJvdGVjdGVkIFN0cmluZyBfdHlwZSA9ICJ1bmRlZmluZWQiOwotICAgIHByb3RlY3RlZCBWZWN0b3IgX3Byb2R1Y3Rpb25zID0gbmV3IFZlY3RvcigpOwotCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbihpbnQgYW5ub3RhdGlvbktpbmQsIE9iamVjdCBhbm5vdGF0aW9uT2JqZWN0KSB7Ci0gICAgICAgIHN1cGVyKCk7Ci0gICAgICAgIF9hbm5vdGF0aW9uS2luZCA9IGFubm90YXRpb25LaW5kOwotICAgICAgICBfYW5ub3RhdGlvbk9iamVjdCA9IGFubm90YXRpb25PYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbktpbmQoaW50IGFubm90YXRpb25LaW5kKSB7Ci0gICAgICAgIF9hbm5vdGF0aW9uS2luZCA9IGFubm90YXRpb25LaW5kOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0QW5ub3RhdGlvbktpbmQoKSB7Ci0gICAgICAgIHJldHVybiBfYW5ub3RhdGlvbktpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRLaW5kKCkgewotICAgICAgICBpZiAoX2Fubm90YXRpb25LaW5kICE9IEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVEKSB7Ci0gICAgICAgICAgICByZXR1cm4gX2Fubm90YXRpb25LaW5kOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGtpbmQ7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0QW5ub3RhdGlvbk9iamVjdChPYmplY3QgYW5ub3RhdGlvbk9iamVjdCkgewotICAgICAgICBfYW5ub3RhdGlvbk9iamVjdCA9IGFubm90YXRpb25PYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRBbm5vdGF0aW9uT2JqZWN0KCkgewotICAgICAgICByZXR1cm4gX2Fubm90YXRpb25PYmplY3Q7Ci0gICAgfQotCi0gICAgcHVibGljIEFubm90YXRlZFRva2VuIGdldE5leHQoKSB7Ci0gICAgICAgIHJldHVybiAoQW5ub3RhdGVkVG9rZW4pbmV4dDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZ2V0U3BlY2lhbFRva2VuKCkgewotICAgICAgICByZXR1cm4gKEFubm90YXRlZFRva2VuKXNwZWNpYWxUb2tlbjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1doaXRlU3BhY2UoKSB7Ci0gICAgICAgIHJldHVybiAoa2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLldTKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc05ld0xpbmUoKSB7Ci0gICAgICAgIHJldHVybiAoa2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLkVPTCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDb21tZW50KCkgewotICAgICAgICByZXR1cm4gKChraW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuU0lOR0xFX0xJTkVfQ09NTUVOVCkgfHwKLSAgICAgICAgICAgICAgICAoa2luZCA9PSBKU1BhcnNlcjE1Q29uc3RhbnRzLk1VTFRJX0xJTkVfQ09NTUVOVCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzV1NTZW5zaXRpdmUoKSB7Ci0gICAgICAgIHJldHVybiBfd3NTZW5zaXRpdmUgIT0gMDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRXU1NlbnNpdGl2ZShpbnQgaSkgewotICAgICAgICBfd3NTZW5zaXRpdmUgPSBpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUHJlZml4V1NTZW5zaXRpdmUoKSB7Ci0gICAgICAgIHJldHVybiBfd3NTZW5zaXRpdmUgPT0gUFJFRklYX1dTOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5maXhXU1NlbnNpdGl2ZSgpIHsKLSAgICAgICAgcmV0dXJuIF93c1NlbnNpdGl2ZSA9PSBJTkZJWF9XUzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlbW92YWJsZUtleXdvcmQoKSB7Ci0gICAgICAgIGJvb2xlYW4gaXNSZW1vdmFibGUgPSBmYWxzZTsKLQotICAgICAgICBzd2l0Y2ggKGtpbmQpIHsKLSAgICAgICAgZGVmYXVsdCA6Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgLy8gICAgICBjYXNlIEpTUGFyc2VyMTRDb25zdGFudHMuQVNTRVJUX1NUQVRFTUVOVDoKLSAgICAgICAgICAgIC8vICAgICAgY2FzZSBKU1BhcnNlcjE0Q29uc3RhbnRzLkxPR0dFUl9TVEFURU1FTlQ6Ci0gICAgICAgICAgICAvLyAgICAgICAgaXNSZW1vdmFibGUgPSB0cnVlOwotICAgICAgICAgICAgLy8gICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIGlzUmVtb3ZhYmxlOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3BlY2lhbENsYXNzVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIFNQRUNJQUxfVFlQRVMuY29udGFpbnMoaW1hZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzU3BlY2lhbE9iamVjdFR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBTUEVDSUFMX1RZUEVTLmNvbnRhaW5zKF90eXBlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICogQHJldHVybiBSZXR1cm5zIHRoZSBfcmVtb3ZlLgotICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBjYW5SZW1vdmUoKSB7Ci0gICAgICAgIHJldHVybiBfcmVtb3ZlOwotICAgIH0KLQotICAgIC8qKgotICAgKiBAcGFyYW0gX3JlbW92ZSBUaGUgX3JlbW92ZSB0byBzZXQuCi0gICAqLwotICAgIHB1YmxpYyB2b2lkIHNldFJlbW92YWJsZShib29sZWFuIHJlbW92ZSkgewotICAgICAgICB0aGlzLl9yZW1vdmUgPSByZW1vdmU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAqIEByZXR1cm4gUmV0dXJucyB0aGUgX3R5cGUuCi0gICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIF90eXBlOwotICAgIH0KLQotICAgIC8qKgotICAgKiBAcGFyYW0gX3R5cGUgVGhlIF90eXBlIHRvIHNldC4KLSAgICovCi0gICAgcHVibGljIHZvaWQgc2V0VHlwZShTdHJpbmcgdHlwZSkgewotICAgICAgICB0aGlzLl90eXBlID0gdHlwZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRGdW5jdGlvblVzZXNFdmFsKGJvb2xlYW4gdXNlc0V2YWwpIHsKLSAgICAgICAgX2Z1bmNVc2VzRXZhbCA9IHVzZXNFdmFsOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGZ1bmN0aW9uVXNlc0V2YWwoKSB7Ci0gICAgICAgIHJldHVybiBfZnVuY1VzZXNFdmFsOwotICAgIH0KLQotICAgIC8vICAgIHB1YmxpYyB2b2lkIGFkZFByb2R1Y3Rpb24oU2ltcGxlTm9kZSBub2RlKSB7Ci0gICAgLy8gICAgICAgIF9wcm9kdWN0aW9ucy5hZGQobm9kZSk7Ci0gICAgLy8gICAgfQotCi0gICAgcHVibGljIFZlY3RvciBnZXRQcm9kdWN0aW9ucygpIHsKLSAgICAgICAgcmV0dXJuIF9wcm9kdWN0aW9uczsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0Fubm90YXRpb25Db25zdGFudHMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGlvbkNvbnN0YW50cy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODZiNTJkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvQW5ub3RhdGlvbkNvbnN0YW50cy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLXB1YmxpYyBpbnRlcmZhY2UgQW5ub3RhdGlvbkNvbnN0YW50cyB7Ci0gICAgaW50IFVOREVGSU5FRCA9IC05OTk7Ci0gICAgaW50IFZBUl9JREVOVElGSUVSID0gLTE7Ci0gICAgaW50IEZVTkNUSU9OX05BTUVfSURFTlRJRklFUiA9IC0yOwotICAgIGludCBGVU5DVElPTl9QQVJBTV9JREVOVElGSUVSID0gLTM7Ci0gICAgaW50IExJVEVSQUxfT0JKRUNUX0tFWV9JREVOVElGSUVSID0gLTQ7Ci0gICAgaW50IE9CSkVDVF9JREVOVElGSUVSID0gLTU7Ci0gICAgaW50IE9CSkVDVF9GSUVMRF9JREVOVElGSUVSID0gLTY7Ci0gICAgaW50IE9CSkVDVF9NRVRIT0RfSURFTlRJRklFUiA9IC03OwotICAgIGludCBOQU1FRF9GVU5DVElPTiA9IC04OwotICAgIGludCBBTk9OWU1PVVNfRlVOQ1RJT04gPSAtOTsKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVGVzdDE1LmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL0pTUGFyc2VyVGVzdDE1LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVjN2MxZDMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclRlc3QxNS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTA0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZU5vdEZvdW5kRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotCi1wdWJsaWMgY2xhc3MgSlNQYXJzZXJUZXN0MTUKLXsKLSAgcHJvdGVjdGVkIElucHV0U3RyZWFtIF9pbjsKLQotICBwdWJsaWMgSlNQYXJzZXJUZXN0MTUoSW5wdXRTdHJlYW0gaW4pCi0gIHsKLSAgICBfaW4gPSBpbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHN0YXJ0KCkKLSAgewotICAgIC8vIGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgcGFyc2VyCi0gICAgSlNQYXJzZXIxNSBqc1BhcnNlciA9IG5ldyBKU1BhcnNlcjE1KF9pbik7Ci0KLSAgICBUb2tlbiB0OwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgZm9yICh0ID0ganNQYXJzZXIuUHJvZ3JhbSgpOyB0ICE9IG51bGw7IHQgPSB0Lm5leHQpCi0gICAgICB7Ci0gICAgICAgIFN5c3RlbS5vdXQKLSAgICAgICAgLnByaW50bG4odC5raW5kICsgIlx0IiArIEpTUGFyc2VyMTUudG9rZW5JbWFnZVt0LmtpbmRdICsgIlx0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0LmltYWdlICsgIlx0IiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAoKEFubm90YXRlZFRva2VuKSB0KS5nZXRBbm5vdGF0aW9uS2luZCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJcdCIgKyAoKEFubm90YXRlZFRva2VuKSB0KS5jYW5SZW1vdmUoKSk7Ci0gICAgICAgIHByaW50U3BlY2lhbFRva2VucygoQW5ub3RhdGVkVG9rZW4pIHQpOwotICAgICAgfQotCi0gICAgICAvLyBqc1BhcnNlci5nZXRSb290Tm9kZSgpLmR1bXAoInAiKTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgcHJpbnRTcGVjaWFsVG9rZW5zKEFubm90YXRlZFRva2VuIHRva2VuKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gc3BlY2lhbFRva2VuID0gdG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0KLSAgICB3aGlsZSAoc3BlY2lhbFRva2VuICE9IG51bGwpCi0gICAgewotICAgICAgU3lzdGVtLm91dC5wcmludGxuKHNwZWNpYWxUb2tlbi5pbWFnZSk7Ci0gICAgICBzcGVjaWFsVG9rZW4gPSBzcGVjaWFsVG9rZW4uZ2V0U3BlY2lhbFRva2VuKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1haW4oU3RyaW5nW10gYXJncykKLSAgewotICAgIGlmIChhcmdzLmxlbmd0aCA9PSAwKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IEpTUGFyc2VyVGVzdDE1IDxKUyBGaWxlPiIpOwotCi0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgRmlsZSBqc0ZpbGUgPSBuZXcgRmlsZShhcmdzWzBdKTsKLSAgICBGaWxlSW5wdXRTdHJlYW0gaW5GaWxlU3RyZWFtOwotCi0gICAgdHJ5Ci0gICAgewotICAgICAgaW5GaWxlU3RyZWFtID0gbmV3IEZpbGVJbnB1dFN0cmVhbShqc0ZpbGUpOwotCi0gICAgICBKU1BhcnNlclRlc3QxNSBqc1BhcnNlclRlc3QgPSBuZXcgSlNQYXJzZXJUZXN0MTUoaW5GaWxlU3RyZWFtKTsKLSAgICAgIGpzUGFyc2VyVGVzdC5zdGFydCgpOwotICAgICAgaW5GaWxlU3RyZWFtLmNsb3NlKCk7Ci0gICAgfQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVOb3RGb3VuZCIpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkZpbGVJTyIpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvSlNQYXJzZXJVdGlscy5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclV0aWxzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmUzNzUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9KU1BhcnNlclV0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLQotCi1wdWJsaWMgY2xhc3MgSlNQYXJzZXJVdGlscwotewotICBwdWJsaWMgSlNQYXJzZXJVdGlscygpCi0gIHsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gZnVuY1Rva2VuCi0gICAqIEBwYXJhbSBib2R5U3RhcnQKLSAgICogQHBhcmFtIGJvZHlFbmQKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCB0YWdFdmFsQ2FsbHMoVG9rZW4gZnVuY1Rva2VuLCBUb2tlbiBib2R5U3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVG9rZW4gYm9keUVuZCkKLSAgewotICAgIGJvb2xlYW4gaGFzRXZhbCA9IGZhbHNlOwotICAgIFRva2VuIHRva2VuID0gYm9keVN0YXJ0OwotCi0gICAgd2hpbGUgKHRva2VuICE9IGJvZHlFbmQpCi0gICAgewotICAgICAgaWYgKCh0b2tlbi5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuSURFTlRJRklFUikgJiYKLSAgICAgICAgICB0b2tlbi5pbWFnZS5lcXVhbHMoImV2YWwiKSAmJiAodG9rZW4ubmV4dCAhPSBudWxsKSAmJgotICAgICAgICAgICh0b2tlbi5uZXh0LmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5MUEFSRU4pKQotICAgICAgewotICAgICAgICBoYXNFdmFsID0gdHJ1ZTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgdG9rZW4gPSB0b2tlbi5uZXh0OwotICAgIH0KLQotICAgICgoQW5ub3RhdGVkVG9rZW4pIGZ1bmNUb2tlbikuc2V0RnVuY3Rpb25Vc2VzRXZhbChoYXNFdmFsKTsKLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSB0b2tlbgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHB1c2hUb2tlbihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0gICAgY29udGV4dC5hZGRUb2tlbih0b2tlbi5pbWFnZSwgdG9rZW4pOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIHYKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwdXNoVG9rZW5zKFByb2dyYW1Db250ZXh0U3RhY2sgY29udGV4dFN0YWNrLCBWZWN0b3IgdikKLSAgewotICAgIGZvciAoRW51bWVyYXRpb24gaXRlbSA9IHYuZWxlbWVudHMoKTsgaXRlbS5oYXNNb3JlRWxlbWVudHMoKTsgKQotICAgIHsKLSAgICAgIEFubm90YXRlZFRva2VuIHQgPSAoQW5ub3RhdGVkVG9rZW4pIGl0ZW0ubmV4dEVsZW1lbnQoKTsKLSAgICAgIHB1c2hUb2tlbihjb250ZXh0U3RhY2ssIHQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gb2JqVG9rZW4KLSAgICogQHBhcmFtIGVuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHRhZ09iamVjdElkZW50aWZpZXIoVG9rZW4gb2JqVG9rZW4sIFRva2VuIGVuZCkKLSAgewotICAgIFRva2VuIHQgPSBvYmpUb2tlbi5uZXh0OwotICAgIFRva2VuIHN1ZmZpeFRva2VuID0gbnVsbDsKLQotICAgIHdoaWxlICh0ICE9IGVuZCkKLSAgICB7Ci0gICAgICBpZiAodC5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuRE9UKQotICAgICAgewotICAgICAgICBhbm5vdGF0ZVRva2VuKG9ialRva2VuLCBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9JREVOVElGSUVSLAotICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC0xKTsKLSAgICAgICAgc3VmZml4VG9rZW4gPSB0Lm5leHQ7Ci0KLSAgICAgICAgaWYgKChzdWZmaXhUb2tlbiAhPSBudWxsKSAmJgotICAgICAgICAgICAgKHN1ZmZpeFRva2VuLmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5JREVOVElGSUVSKSkKLSAgICAgICAgewotICAgICAgICAgIGFubm90YXRlVG9rZW4oc3VmZml4VG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9GSUVMRF9JREVOVElGSUVSLCBudWxsLAotICAgICAgICAgICAgICAgICAgICAgICAgLTEpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICgodC5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuTFBBUkVOKSAmJiAoc3VmZml4VG9rZW4gIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIGFubm90YXRlVG9rZW4oc3VmZml4VG9rZW4sCi0gICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfTUVUSE9EX0lERU5USUZJRVIsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgLTEpOwotICAgICAgfQotCi0gICAgICB0ID0gdC5uZXh0OwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gY29udGV4dFN0YWNrCi0gICAqIEBwYXJhbSBzdGFydAotICAgKiBAcGFyYW0gZW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdGFnTWV0aG9kSW52b2NhdGlvbihQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIGVuZCkKLSAgewotICAgIGlmICh0YWdBc3NlcnRQcm9maWxlckNhbGxzKGNvbnRleHRTdGFjaywgc3RhcnQsIGVuZCkpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIHRhZ0xvZ2dlckNhbGxzKGNvbnRleHRTdGFjaywgc3RhcnQsIGVuZCk7Ci0gIH0KLQotICAvKioKLSAgICoKLSAgICogQHBhcmFtIGNvbnRleHRTdGFjawotICAgKiBAcGFyYW0gc3RhcnQKLSAgICogQHBhcmFtIGVuZAotICAgKiBAcmV0dXJuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIHRhZ0Fzc2VydFByb2ZpbGVyQ2FsbHMoUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIGVuZCkKLSAgewotICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gc3RhcnQ7Ci0gICAgYm9vbGVhbiBpc1NwZWNpYWxUeXBlID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc1JlbW92YWJsZSA9IGZhbHNlOwotCi0gICAgd2hpbGUgKHRva2VuICE9IGVuZCkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGNoZWNrcyBmb3I6Ci0gICAgICAvLyAiUHJvZmlsZXIueHh4PS4uLjsiCi0gICAgICAvLyBvciAiZm9vLjxwcm9maWxlciBtZXRob2Q+OyIgd2hlcmUgZm9vIGlzIGEgdmFyIG9mIHR5cGUgUHJvZmlsZXIKLSAgICAgIEFubm90YXRlZFRva2VuIG9ialRva2VuID0gY29udGV4dFN0YWNrLmdldFRva2VuKHRva2VuLmltYWdlKTsKLQotICAgICAgaWYgKCh0b2tlbi5pc1NwZWNpYWxDbGFzc1R5cGUoKSB8fAotICAgICAgICAgICAoKG9ialRva2VuICE9IG51bGwpICYmIG9ialRva2VuLmlzU3BlY2lhbE9iamVjdFR5cGUoKSkpICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNTcGVjaWFsVHlwZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc1NwZWNpYWxUeXBlICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9NRVRIT0RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzUmVtb3ZhYmxlID0gdHJ1ZTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzUmVtb3ZhYmxlKQotICAgIHsKLSAgICAgIHRva2VuID0gc3RhcnQ7Ci0KLSAgICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgICB7Ci0gICAgICAgIHRva2VuLnNldFJlbW92YWJsZSh0cnVlKTsKLSAgICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0b2tlbi5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuU0VNSUNPTE9OKQotICAgICAgewotICAgICAgICB0b2tlbi5zZXRSZW1vdmFibGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzUmVtb3ZhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIHN0YXJ0Ci0gICAqIEBwYXJhbSBlbmQKLSAgICogQHJldHVybgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiB0YWdMb2dnZXJDYWxscyhQcm9ncmFtQ29udGV4dFN0YWNrIGNvbnRleHRTdGFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiBlbmQpCi0gIHsKLSAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IHN0YXJ0OwotICAgIGJvb2xlYW4gaXNTcGVjaWFsVHlwZSA9IGZhbHNlOwotICAgIGJvb2xlYW4gaXNMT0dHRVIgPSBmYWxzZTsKLSAgICBib29sZWFuIGlzUmVtb3ZhYmxlID0gZmFsc2U7Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgIHsKLSAgICAgIC8vIFRoaXMgY2hlY2tzIGZvcjoKLSAgICAgIC8vICJMb2dnZXIuTE9HR0VSLjxzdGF0aWMgbWV0aG9kPiIKLSAgICAgIGlmICgodG9rZW4uaXNTcGVjaWFsQ2xhc3NUeXBlKCkpICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9JREVOVElGSUVSKSkKLSAgICAgIHsKLSAgICAgICAgaXNTcGVjaWFsVHlwZSA9IHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc1NwZWNpYWxUeXBlICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9GSUVMRF9JREVOVElGSUVSKSAmJgotICAgICAgICAgIHRva2VuLmltYWdlLmVxdWFscygiTE9HR0VSIikpCi0gICAgICB7Ci0gICAgICAgIGlzTE9HR0VSID0gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzTE9HR0VSICYmCi0gICAgICAgICAgKHRva2VuLmdldEtpbmQoKSA9PSBBbm5vdGF0aW9uQ29uc3RhbnRzLk9CSkVDVF9NRVRIT0RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzUmVtb3ZhYmxlID0gdHJ1ZTsKLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgfQotCi0gICAgaWYgKGlzUmVtb3ZhYmxlKQotICAgIHsKLSAgICAgIHRva2VuID0gc3RhcnQ7Ci0KLSAgICAgIHdoaWxlICh0b2tlbiAhPSBlbmQpCi0gICAgICB7Ci0gICAgICAgIHRva2VuLnNldFJlbW92YWJsZSh0cnVlKTsKLSAgICAgICAgdG9rZW4gPSB0b2tlbi5nZXROZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0b2tlbi5raW5kID09IEpTUGFyc2VyMTVDb25zdGFudHMuU0VNSUNPTE9OKQotICAgICAgewotICAgICAgICB0b2tlbi5zZXRSZW1vdmFibGUodHJ1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGlzUmVtb3ZhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqCi0gICAqIEBwYXJhbSBjb250ZXh0U3RhY2sKLSAgICogQHBhcmFtIGxocwotICAgKiBAcGFyYW0gb3AKLSAgICogQHBhcmFtIHJocwotICAgKiBAcGFyYW0gZW5kCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgdGFnQXNzaWdubWVudEV4cHJlc3Npb24oUHJvZ3JhbUNvbnRleHRTdGFjayBjb250ZXh0U3RhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0ZWRUb2tlbiB2YXJUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRlZFRva2VuIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gcmhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGVkVG9rZW4gZW5kKQotICB7Ci0gICAgQW5ub3RhdGVkVG9rZW4gdG9rZW4gPSAodmFyVG9rZW4gIT0gbnVsbCk/IHZhclRva2VuOiBsaHM7Ci0gICAgYm9vbGVhbiBpc1NwZWNpYWxUeXBlID0gZmFsc2U7Ci0gICAgYm9vbGVhbiBpc1JlbW92YWJsZSA9IGZhbHNlOwotICAgIFByb2dyYW1Db250ZXh0IGNvbnRleHQgPSAoUHJvZ3JhbUNvbnRleHQpIGNvbnRleHRTdGFjay5wZWVrKCk7Ci0KLSAgICBpZiAocmhzLmtpbmQgIT0gSlNQYXJzZXIxNUNvbnN0YW50cy5JREVOVElGSUVSKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgIHsKLSAgICAgIC8vIFRoaXMgY2hlY2tzIGZvcjoKLSAgICAgIC8vICJ2YXIgZm9vID0gUHJvZmlsZXIueHh4PS4uLjsiCi0gICAgICAvLyBvciAidmFyIGJhciA9IGZvby48cHJvZmlsZXIgbWV0aG9kPjsiCi0gICAgICBBbm5vdGF0ZWRUb2tlbiBvYmpUb2tlbiA9IGNvbnRleHRTdGFjay5nZXRUb2tlbih0b2tlbi5pbWFnZSk7Ci0KLSAgICAgIGlmICgodG9rZW4uaXNTcGVjaWFsQ2xhc3NUeXBlKCkgfHwKLSAgICAgICAgICAgKChvYmpUb2tlbiAhPSBudWxsKSAmJiBvYmpUb2tlbi5pc1NwZWNpYWxPYmplY3RUeXBlKCkpKSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfSURFTlRJRklFUikpCi0gICAgICB7Ci0gICAgICAgIGlzU3BlY2lhbFR5cGUgPSB0cnVlOwotICAgICAgfQotCi0gICAgICBpZiAoaXNTcGVjaWFsVHlwZSAmJgotICAgICAgICAgICh0b2tlbi5nZXRLaW5kKCkgPT0gQW5ub3RhdGlvbkNvbnN0YW50cy5PQkpFQ1RfTUVUSE9EX0lERU5USUZJRVIpKQotICAgICAgewotICAgICAgICBpc1JlbW92YWJsZSA9IHRydWU7Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgIH0KLQotICAgIGlmIChpc1JlbW92YWJsZSkKLSAgICB7Ci0gICAgICB0b2tlbiA9ICh2YXJUb2tlbiAhPSBudWxsKT8gdmFyVG9rZW46IGxoczsKLQotICAgICAgQW5ub3RhdGVkVG9rZW4gcHJldlRva2VuID0gbGhzOwotCi0gICAgICB3aGlsZSAodG9rZW4gIT0gZW5kKQotICAgICAgewotICAgICAgICB0b2tlbi5zZXRSZW1vdmFibGUodHJ1ZSk7Ci0KLSAgICAgICAgaWYgKHRva2VuLmdldE5leHQoKS5pc1NwZWNpYWxDbGFzc1R5cGUoKSAmJgotICAgICAgICAgICAgKHRva2VuLmtpbmQgPT0gSlNQYXJzZXIxNUNvbnN0YW50cy5BU1NJR04pKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gVGhpcyBzYXZlcyB0aGUgTEhTIHZhciBuYW1lICJmb28iIHRvIGJlIHJlbW92ZWQgbGF0ZXIuIEl0IGFsc28gYXNzaWducyB0aGUgTEhTIHR5cGUKLSAgICAgICAgICAvLyAidmFyIGZvbyA9IFByb2ZpbGVyLnh4eD0uLi47IgotICAgICAgICAgIHByZXZUb2tlbi5zZXRUeXBlKHRva2VuLm5leHQuaW1hZ2UpOwotICAgICAgICAgIGNvbnRleHQuYWRkVG9rZW4ocHJldlRva2VuLmltYWdlLCBwcmV2VG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJldlRva2VuID0gdG9rZW47Ci0gICAgICAgIHRva2VuID0gdG9rZW4uZ2V0TmV4dCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gdAotICAgKiBAcGFyYW0gYW5ub3RhdGlvbklkCi0gICAqIEBwYXJhbSBhbm5vdGF0aW9uT2JqZWN0Ci0gICAqIEBwYXJhbSB3c1NlbnNpdGl2ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFubm90YXRlVG9rZW4oVG9rZW4gdCwgaW50IGFubm90YXRpb25JZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFubm90YXRpb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3c1NlbnNpdGl2ZSkKLSAgewotICAgIEFubm90YXRlZFRva2VuIGFublRva2VuID0gKEFubm90YXRlZFRva2VuKSB0OwotICAgIGFublRva2VuLnNldEFubm90YXRpb25LaW5kKGFubm90YXRpb25JZCk7Ci0KLSAgICBpZiAoYW5ub3RhdGlvbk9iamVjdCAhPSBudWxsKQotICAgIHsKLSAgICAgIGFublRva2VuLnNldEFubm90YXRpb25PYmplY3QoYW5ub3RhdGlvbk9iamVjdCk7Ci0gICAgfQotCi0gICAgaWYgKHdzU2Vuc2l0aXZlID49IDApCi0gICAgewotICAgICAgYW5uVG9rZW4uc2V0V1NTZW5zaXRpdmUod3NTZW5zaXRpdmUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKgotICAgKiBAcGFyYW0gdgotICAgKiBAcGFyYW0gYW5ub3RhdGlvbklkCi0gICAqIEBwYXJhbSBhbm5vdGF0aW9uT2JqZWN0Ci0gICAqIEBwYXJhbSB3c1NlbnNpdGl2ZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFubm90YXRlVG9rZW5zKFZlY3RvciB2LCBpbnQgYW5ub3RhdGlvbklkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT2JqZWN0IGFubm90YXRpb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd3NTZW5zaXRpdmUpCi0gIHsKLSAgICBmb3IgKEVudW1lcmF0aW9uIGl0ZW0gPSB2LmVsZW1lbnRzKCk7IGl0ZW0uaGFzTW9yZUVsZW1lbnRzKCk7ICkKLSAgICB7Ci0gICAgICBUb2tlbiB0ID0gKFRva2VuKSBpdGVtLm5leHRFbGVtZW50KCk7Ci0gICAgICBhbm5vdGF0ZVRva2VuKHQsIGFubm90YXRpb25JZCwgYW5ub3RhdGlvbk9iamVjdCwgd3NTZW5zaXRpdmUpOwotICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvTmFtZUdlbi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9OYW1lR2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNzliMGMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9OYW1lR2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotcHVibGljIGNsYXNzIE5hbWVHZW4KLXsKLSAgcHJpdmF0ZSBpbnQgX25leHRJZCA9IDA7Ci0KLSAgcHVibGljIE5hbWVHZW4oKQotICB7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuICJ4IiArIF9uZXh0SWQrKzsKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvb2JmdXNjYXRvci9qYXZhc2NyaXB0MTVwYXJzZXIvUHJvZ3JhbUNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwMGM4ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0Lm9iZnVzY2F0b3IuamF2YXNjcmlwdDE1cGFyc2VyOwotCi0vL34tLS0gSkRLIGltcG9ydHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLy9+LS0tIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgUHJvZ3JhbUNvbnRleHQKLXsKLQotICAvLyBUYWJsZSBvZiBzeW1ib2wgbmFtZSwgQW5ub3RhdGVkVG9rZW4KLSAgcHJvdGVjdGVkIEhhc2hNYXAgX3N5bWJvbFRhYmxlID0gbmV3IEhhc2hNYXAoKTsKLSAgcHJvdGVjdGVkIFN0cmluZyBfbmFtZTsKLSAgcHJvdGVjdGVkIE5hbWVHZW4gX25hbWVHZW47Ci0KLSAgLy9+LS0tIGNvbnN0cnVjdG9ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIFByb2dyYW1Db250ZXh0KFN0cmluZyBuYW1lKQotICB7Ci0gICAgdGhpcyhuYW1lLCBuZXcgTmFtZUdlbigpKTsKLSAgfQotCi0gIHB1YmxpYyBQcm9ncmFtQ29udGV4dChTdHJpbmcgbmFtZSwgTmFtZUdlbiBuYW1lR2VuKQotICB7Ci0gICAgX25hbWUgPSBuYW1lOwotICAgIF9uYW1lR2VuID0gbmFtZUdlbjsKLSAgfQotCi0gIC8vfi0tLSBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyB2b2lkIGFkZFRva2VuKFN0cmluZyBuYW1lLCBBbm5vdGF0ZWRUb2tlbiB0b2tlbikKLSAgewotICAgIF9zeW1ib2xUYWJsZS5wdXQobmFtZSwgdG9rZW4pOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZW5lcmF0ZVN5bWJvbE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lR2VuLmdldE5hbWUoKTsKLSAgfQotCi0gIC8vfi0tLSBnZXQgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpCi0gIHsKLSAgICByZXR1cm4gX25hbWU7Ci0gIH0KLQotICBwdWJsaWMgTmFtZUdlbiBnZXROYW1lR2VuKCkKLSAgewotICAgIHJldHVybiBfbmFtZUdlbjsKLSAgfQotCi0gIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBnZXRUb2tlbihTdHJpbmcga2V5KQotICB7Ci0gICAgcmV0dXJuIChBbm5vdGF0ZWRUb2tlbikgX3N5bWJvbFRhYmxlLmdldChrZXkpOwotICB9Ci0KLSAgLy9+LS0tIHNldCBtZXRob2RzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIF9uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldE5hbWVHZW4oTmFtZUdlbiBuYW1lR2VuKQotICB7Ci0gICAgX25hbWVHZW4gPSBuYW1lR2VuOwotICB9Ci19Ci0KLQotLy9+IEZvcm1hdHRlZCBieSBKaW5kZW50IC0tLSBodHRwOi8vd3d3LmppbmRlbnQuY29tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Qcm9ncmFtQ29udGV4dFN0YWNrLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0U3RhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZmZTgyMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Byb2dyYW1Db250ZXh0U3RhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci0KLS8vfi0tLSBKREsgaW1wb3J0cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLy9+LS0tIGNsYXNzZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1wdWJsaWMgY2xhc3MgUHJvZ3JhbUNvbnRleHRTdGFjayBleHRlbmRzIFN0YWNrIHsKLSAgICBwdWJsaWMgUHJvZ3JhbUNvbnRleHRTdGFjaygpIHt9Ci0KLSAgICAvL34tLS0gbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBQcm9ncmFtQ29udGV4dCBwb3BDb250ZXh0KCkgewotICAgICAgICByZXR1cm4gKChQcm9ncmFtQ29udGV4dCkgcG9wKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHB1c2hDb250ZXh0KFByb2dyYW1Db250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcHVzaChjb250ZXh0KTsKLSAgICB9Ci0KLSAgICAvL34tLS0gZ2V0IG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyBBbm5vdGF0ZWRUb2tlbiBnZXRUb2tlbihTdHJpbmcgbmFtZSkgewotICAgICAgICBBbm5vdGF0ZWRUb2tlbiB0b2tlbiA9IG51bGw7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IHNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICAgICAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gKFByb2dyYW1Db250ZXh0KSBnZXQoaSk7Ci0KLSAgICAgICAgICAgIGlmIChudWxsICE9ICh0b2tlbiA9IGNvbnRleHQuZ2V0VG9rZW4obmFtZSkpKSB7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gdG9rZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEBwYXJhbSBkZXB0aAotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgQW5ub3RhdGVkVG9rZW4gZ2V0VG9rZW4oU3RyaW5nIG5hbWUsIGludCBkZXB0aCkgewotICAgICAgICBpbnQgZW5kOwotCi0gICAgICAgIGVuZCA9IHNpemUoKSAtIGRlcHRoOwotICAgICAgICBlbmQgPSBNYXRoLm1heChlbmQsIDApOwotCi0gICAgICAgIEFubm90YXRlZFRva2VuIHRva2VuID0gbnVsbDsKLQotICAgICAgICBmb3IgKGludCBpID0gc2l6ZSgpIC0gMTsgaSA+PSBlbmQ7IGktLSkgewotICAgICAgICAgICAgUHJvZ3JhbUNvbnRleHQgY29udGV4dCA9IChQcm9ncmFtQ29udGV4dCkgZ2V0KGkpOwotCi0gICAgICAgICAgICBpZiAobnVsbCAhPSAodG9rZW4gPSBjb250ZXh0LmdldFRva2VuKG5hbWUpKSkgewotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIHRva2VuOwotICAgIH0KLX0KLQotCi0vL34gRm9ybWF0dGVkIGJ5IEppbmRlbnQgLS0tIGh0dHA6Ly93d3cuamluZGVudC5jb20KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Rva2VuLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL1Rva2VuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxZDI5NDUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9Ub2tlbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotLyogR2VuZXJhdGVkIEJ5OkphdmFDQzogRG8gbm90IGVkaXQgdGhpcyBsaW5lLiBUb2tlbi5qYXZhIFZlcnNpb24gMy4wICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC5vYmZ1c2NhdG9yLmphdmFzY3JpcHQxNXBhcnNlcjsKLQotLyoqCi0gKiBEZXNjcmliZXMgdGhlIGlucHV0IHRva2VuIHN0cmVhbS4KLSAqLwotCi1wdWJsaWMgY2xhc3MgVG9rZW4gewotCi0gIC8qKgotICAgKiBBbiBpbnRlZ2VyIHRoYXQgZGVzY3JpYmVzIHRoZSBraW5kIG9mIHRoaXMgdG9rZW4uICBUaGlzIG51bWJlcmluZwotICAgKiBzeXN0ZW0gaXMgZGV0ZXJtaW5lZCBieSBKYXZhQ0NQYXJzZXIsIGFuZCBhIHRhYmxlIG9mIHRoZXNlIG51bWJlcnMgaXMKLSAgICogc3RvcmVkIGluIHRoZSBmaWxlIC4uLkNvbnN0YW50cy5qYXZhLgotICAgKi8KLSAgcHVibGljIGludCBraW5kOwotCi0gIC8qKgotICAgKiBiZWdpbkxpbmUgYW5kIGJlZ2luQ29sdW1uIGRlc2NyaWJlIHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyCi0gICAqIG9mIHRoaXMgdG9rZW47IGVuZExpbmUgYW5kIGVuZENvbHVtbiBkZXNjcmliZSB0aGUgcG9zaXRpb24gb2YgdGhlCi0gICAqIGxhc3QgY2hhcmFjdGVyIG9mIHRoaXMgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgaW50IGJlZ2luTGluZSwgYmVnaW5Db2x1bW4sIGVuZExpbmUsIGVuZENvbHVtbjsKLQotICAvKioKLSAgICogVGhlIHN0cmluZyBpbWFnZSBvZiB0aGUgdG9rZW4uCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIGltYWdlOwotCi0gIC8qKgotICAgKiBBIHJlZmVyZW5jZSB0byB0aGUgbmV4dCByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4gZnJvbSB0aGUgaW5wdXQKLSAgICogc3RyZWFtLiAgSWYgdGhpcyBpcyB0aGUgbGFzdCB0b2tlbiBmcm9tIHRoZSBpbnB1dCBzdHJlYW0sIG9yIGlmIHRoZQotICAgKiB0b2tlbiBtYW5hZ2VyIGhhcyBub3QgcmVhZCB0b2tlbnMgYmV5b25kIHRoaXMgb25lLCB0aGlzIGZpZWxkIGlzCi0gICAqIHNldCB0byBudWxsLiAgVGhpcyBpcyB0cnVlIG9ubHkgaWYgdGhpcyB0b2tlbiBpcyBhbHNvIGEgcmVndWxhcgotICAgKiB0b2tlbi4gIE90aGVyd2lzZSwgc2VlIGJlbG93IGZvciBhIGRlc2NyaXB0aW9uIG9mIHRoZSBjb250ZW50cyBvZgotICAgKiB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIFRva2VuIG5leHQ7Ci0KLSAgLyoqCi0gICAqIFRoaXMgZmllbGQgaXMgdXNlZCB0byBhY2Nlc3Mgc3BlY2lhbCB0b2tlbnMgdGhhdCBvY2N1ciBwcmlvciB0byB0aGlzCi0gICAqIHRva2VuLCBidXQgYWZ0ZXIgdGhlIGltbWVkaWF0ZWx5IHByZWNlZGluZyByZWd1bGFyIChub24tc3BlY2lhbCkgdG9rZW4uCi0gICAqIElmIHRoZXJlIGFyZSBubyBzdWNoIHNwZWNpYWwgdG9rZW5zLCB0aGlzIGZpZWxkIGlzIHNldCB0byBudWxsLgotICAgKiBXaGVuIHRoZXJlIGFyZSBtb3JlIHRoYW4gb25lIHN1Y2ggc3BlY2lhbCB0b2tlbiwgdGhpcyBmaWVsZCByZWZlcnMKLSAgICogdG8gdGhlIGxhc3Qgb2YgdGhlc2Ugc3BlY2lhbCB0b2tlbnMsIHdoaWNoIGluIHR1cm4gcmVmZXJzIHRvIHRoZSBuZXh0Ci0gICAqIHByZXZpb3VzIHNwZWNpYWwgdG9rZW4gdGhyb3VnaCBpdHMgc3BlY2lhbFRva2VuIGZpZWxkLCBhbmQgc28gb24KLSAgICogdW50aWwgdGhlIGZpcnN0IHNwZWNpYWwgdG9rZW4gKHdob3NlIHNwZWNpYWxUb2tlbiBmaWVsZCBpcyBudWxsKS4KLSAgICogVGhlIG5leHQgZmllbGRzIG9mIHNwZWNpYWwgdG9rZW5zIHJlZmVyIHRvIG90aGVyIHNwZWNpYWwgdG9rZW5zIHRoYXQKLSAgICogaW1tZWRpYXRlbHkgZm9sbG93IGl0ICh3aXRob3V0IGFuIGludGVydmVuaW5nIHJlZ3VsYXIgdG9rZW4pLiAgSWYgdGhlcmUKLSAgICogaXMgbm8gc3VjaCB0b2tlbiwgdGhpcyBmaWVsZCBpcyBudWxsLgotICAgKi8KLSAgcHVibGljIFRva2VuIHNwZWNpYWxUb2tlbjsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgaW1hZ2UuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkKLSAgewotICAgICByZXR1cm4gaW1hZ2U7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIG5ldyBUb2tlbiBvYmplY3QsIGJ5IGRlZmF1bHQuIEhvd2V2ZXIsIGlmIHlvdSB3YW50LCB5b3UKLSAgICogY2FuIGNyZWF0ZSBhbmQgcmV0dXJuIHN1YmNsYXNzIG9iamVjdHMgYmFzZWQgb24gdGhlIHZhbHVlIG9mIG9mS2luZC4KLSAgICogU2ltcGx5IGFkZCB0aGUgY2FzZXMgdG8gdGhlIHN3aXRjaCBmb3IgYWxsIHRob3NlIHNwZWNpYWwgY2FzZXMuCi0gICAqIEZvciBleGFtcGxlLCBpZiB5b3UgaGF2ZSBhIHN1YmNsYXNzIG9mIFRva2VuIGNhbGxlZCBJRFRva2VuIHRoYXQKLSAgICogeW91IHdhbnQgdG8gY3JlYXRlIGlmIG9mS2luZCBpcyBJRCwgc2ltbHB5IGFkZCBzb21ldGhpbmcgbGlrZSA6Ci0gICAqCi0gICAqICAgIGNhc2UgTXlQYXJzZXJDb25zdGFudHMuSUQgOiByZXR1cm4gbmV3IElEVG9rZW4oKTsKLSAgICoKLSAgICogdG8gdGhlIGZvbGxvd2luZyBzd2l0Y2ggc3RhdGVtZW50LiBUaGVuIHlvdSBjYW4gY2FzdCBtYXRjaGVkVG9rZW4KLSAgICogdmFyaWFibGUgdG8gdGhlIGFwcHJvcHJpYXRlIHR5cGUgYW5kIHVzZSBpdCBpbiB5b3VyIGxleGljYWwgYWN0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgVG9rZW4gbmV3VG9rZW4oaW50IG9mS2luZCkKLSAgewotICAgICBzd2l0Y2gob2ZLaW5kKQotICAgICB7Ci0gICAgICAgZGVmYXVsdCA6IHJldHVybiBuZXcgQW5ub3RhdGVkVG9rZW4oKTsKLSAgICAgfQotICB9Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL2pzMS41LmpqIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC9vYmZ1c2NhdG9yL2phdmFzY3JpcHQxNXBhcnNlci9qczEuNS5qagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY3ZmM5MC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L29iZnVzY2F0b3IvamF2YXNjcmlwdDE1cGFyc2VyL2pzMS41LmpqCisrKyAvZGV2L251bGwKQEAgLTEsMTE4MyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1vcHRpb25zIHsKLSAgU1RBVElDPWZhbHNlOwotICBERUJVR19UT0tFTl9NQU5BR0VSPWZhbHNlOwotICBERUJVR19QQVJTRVI9ZmFsc2U7Ci19Ci0KLVBBUlNFUl9CRUdJTihKU1BhcnNlcjE1KQotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQub2JmdXNjYXRvci5qYXZhc2NyaXB0MTVwYXJzZXI7Ci1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotcHVibGljIGNsYXNzIEpTUGFyc2VyMTUgCi17Ci0gICAgLy8gVGhpcyBpcyBhIHN0YWNrIG9mIHN5bWJvbCB0YWJsZXMgZm9yIHRoZSBKUyBmaWxlCi0gICAgcHJvdGVjdGVkIFByb2dyYW1Db250ZXh0U3RhY2sgX2NvbnRleHRTdGFjayA9IG5ldyBQcm9ncmFtQ29udGV4dFN0YWNrKCk7Ci0gICAgCi19Ci0KLVBBUlNFUl9FTkQoSlNQYXJzZXIxNSkKLQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExFWElDQUwgUlVMRVMgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOX01HUl9ERUNMUyA6Ci17Ci0gICAgcHJpdmF0ZSBib29sZWFuIGlzUmVnVmFsaWQgPSB0cnVlOwotICAgIHB1YmxpYyB2b2lkIHNldFJlZ0ludmFsaWQoKQotICAgIHsKLSAgICAgICAgaXNSZWdWYWxpZCA9IGZhbHNlOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZWdWYWxpZCgpCi0gICAgewotICAgICAgICBpc1JlZ1ZhbGlkID0gdHJ1ZTsKLSAgICB9Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBXSElURSBTUEFDRSAKLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPEVPTDogICAoWyJcbiIsIlxyIl0pKyA+Ci0gICAgfCAgIDxXUzogICAgKFsiICIsIlx0Il0pKyA+Ci19Ci0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotLy8gQ09NTUVOVFMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotTU9SRSA6Ci17Ci0gICAgICAgICIvLyIgOiBJTl9TSU5HTEVfTElORV9DT01NRU5UCi0gICAgfCAgICIvKiIgOiBJTl9NVUxUSV9MSU5FX0NPTU1FTlQKLX0KLQotPElOX1NJTkdMRV9MSU5FX0NPTU1FTlQ+Ci1TUEVDSUFMX1RPS0VOIDoKLXsKLSAgICAgICAgPCBTSU5HTEVfTElORV9DT01NRU5UOiAoflsiXG4iLCJcciJdKSogKCJcbiJ8IlxyInwiXHJcbiIpPyA+ICA6IERFRkFVTFQKLX0KLQotPElOX01VTFRJX0xJTkVfQ09NTUVOVD4KLVNQRUNJQUxfVE9LRU4gOgotewotICAgICAgICA8TVVMVElfTElORV9DT01NRU5UOiAiKi8iID4gOiBERUZBVUxUCi19Ci0KLTxJTl9TSU5HTEVfTElORV9DT01NRU5ULCBJTl9NVUxUSV9MSU5FX0NPTU1FTlQ+Ci1NT1JFIDoKLXsKLSAgICAgICAgPCB+W10gPgotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIFJFU0VSVkVEIFdPUkRTIEFORCBMSVRFUkFMUwotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBCUkVBSzogICAgICAgICJicmVhayIgPgotICAgIHwgICA8IENPTlRJTlVFOiAgICAgImNvbnRpbnVlIiA+Ci0gICAgfCAgIDwgREVMRVRFOiAgICAgICAiZGVsZXRlIiA+Ci0gICAgfCAgIDwgRUxTRTogICAgICAgICAiZWxzZSIgPgotICAgIHwgICA8IEZPUjogICAgICAgICAgImZvciIgPgotICAgIHwgICA8IEZVTkNUSU9OOiAgICAgImZ1bmN0aW9uIiA+Ci0gICAgfCAgIDwgRlVOQ1RJT05fOiAgICAiRnVuY3Rpb24iID4KLSAgICB8ICAgPCBJRjogICAgICAgICAgICJpZiIgPgotICAgIHwgICA8IElOOiAgICAgICAgICAgImluIiA+Ci0gICAgfCAgIDwgTkVXOiAgICAgICAgICAibmV3IiA+Ci0gICAgfCAgIDwgUkVUVVJOOiAgICAgICAicmV0dXJuIiA+Ci0gICAgfCAgIDwgVEhJUzogICAgICAgICAidGhpcyIgPgotICAgIHwgICA8IFRZUEVPRjogICAgICAgInR5cGVvZiIgPgotICAgIHwgICA8IElOU1RBTkNFT0Y6ICAgImluc3RhbmNlb2YiID4KLSAgICB8ICAgPCBWQVI6ICAgICAgICAgICJ2YXIiID4KLSAgICB8ICAgPCBWT0lEOiAgICAgICAgICJ2b2lkIiA+Ci0gICAgfCAgIDwgV0hJTEU6ICAgICAgICAid2hpbGUiID4KLSAgICB8ICAgPCBXSVRIOiAgICAgICAgICJ3aXRoIiA+Ci0gICAgfCAgIDwgQ0FTRTogICAgICAgICAiY2FzZSIgPgotICAgIHwgICA8IENBVENIOiAgICAgICAgImNhdGNoIiA+Ci0gICAgfCAgIDwgQ0xBU1M6ICAgICAgICAiY2xhc3MiID4KLSAgICB8ICAgPCBDT05TVDogICAgICAgICJjb25zdCIgPgotICAgIHwgICA8IERFQlVHR0VSOiAgICAgImRlYnVnZ2VyIiA+Ci0gICAgfCAgIDwgX0RFRkFVTFQ6ICAgICAiZGVmYXVsdCIgPgotICAgIHwgICA8IERPOiAgICAgICAgICAgImRvIiA+Ci0gICAgfCAgIDwgRU5VTTogICAgICAgICAiZW51bSIgPgotICAgIHwgICA8IEVYUE9SVDogICAgICAgImV4cG9ydCIgPgotICAgIHwgICA8IEVYVEVORFM6ICAgICAgImV4dGVuZHMiID4KLSAgICB8ICAgPCBGSU5BTExZOiAgICAgICJmaW5hbGx5IiA+Ci0gICAgfCAgIDwgSU1QT1JUOiAgICAgICAiaW1wb3J0IiA+Ci0gICAgfCAgIDwgU1VQRVI6ICAgICAgICAic3VwZXIiID4KLSAgICB8ICAgPCBTV0lUQ0g6ICAgICAgICJzd2l0Y2giID4KLSAgICB8ICAgPCBUSFJPVzogICAgICAgICJ0aHJvdyIgPgotICAgIHwgICA8IFRSWTogICAgICAgICAgInRyeSIgPgotICAgIHwgICA8IFRSVUU6ICAgICAgICAgInRydWUiID4gICAgLy8gVGhleSBhcmUgbm90IHN1cHBvc2VkIHRvIGJlIGtleXdvcmRzCi0gICAgfCAgIDwgRkFMU0U6ICAgICAgICAiZmFsc2UiID4gICAvLyBUaGV5IGFyZSBub3Qgc3VwcG9zZWQgdG8gYmUga2V5d29yZHMKLSAgICB8ICAgPCBOVUxMOiAgICAgICAgICJudWxsIiA+ICAgIC8vIFRoZXkgYXJlIG5vdCBzdXBwb3NlZCB0byBiZSBrZXl3b3JkcwotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIExJVEVSQUxTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBERUNJTUFMX0xJVEVSQUw6IFsiMSItIjkiXSAoWyIwIi0iOSJdKSogPgotICAgIHwgICA8IEhFWF9MSVRFUkFMOiAiMCIgWyJ4IiwiWCJdIChbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdKSsgPgotICAgIHwgICA8IE9DVEFMX0xJVEVSQUw6ICIwIiAoWyIwIi0iNyJdKSogPgotICAgIHwgICA8IEZMT0FUSU5HX1BPSU5UX0xJVEVSQUw6IChbIjAiLSI5Il0pKyAiLiIgKFsiMCItIjkiXSkqICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiLiIgKFsiMCItIjkiXSkrICg8RVhQT05FTlQ+KT8gCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAoWyIwIi0iOSJdKSsgKDxFWFBPTkVOVD4pPyAKLSAgICAgICAgPgotICAgIHwgICA8ICNFWFBPTkVOVDogWyJlIiwiRSJdIChbIisiLCItIl0pPyAoWyIwIi0iOSJdKSsgPgotICAgIHwgICA8IFNUUklOR19MSVRFUkFMOiAgICJcIiIgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKH5bIlwiIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSogCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIgotICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJcIiIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoflsiXCIiLCAiXFwiXSkgfCAiXFwiICgiXG4iIHwgIlxyIiB8ICJcclxuIikgfCA8RVNDQVBFX1NFUVVFTkNFPiApKiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICAKLSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiJyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pIHwgPEVTQ0FQRV9TRVFVRU5DRT4gKSoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJyIKLSAgICAgICAgPgotICAgIHwgICA8ICNFU0NBUEVfU0VRVUVOQ0U6IAotICAgICAgICAgICAgIlxcIgotICAgICAgICAgICAgKCAgICAgICBbIm4iLCJ0IiwiYiIsInIiLCJmIiwiXFwiLCInIiwiXCIiLCJbIiwiXSJdCi0gICAgICAgICAgICAgICAgfCAgIFsiMCItIjciXSAoIFsiMCItIjciXSApPwotICAgICAgICAgICAgICAgIHwgICBbIjAiLSIzIl0gWyIwIi0iNyJdIFsiMCItIjciXQotICAgICAgICAgICAgICAgIHwgICBbIngiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0KLSAgICAgICAgICAgICAgICB8ICAgWyJ1Il0gWyIwIi0iOSIsImEiLSJmIiwiQSItIkYiXSBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIAotICAgICAgICAgICAgICAgICAgICAgICAgICBbIjAiLSI5IiwiYSItImYiLCJBIi0iRiJdIFsiMCItIjkiLCJhIi0iZiIsIkEiLSJGIl0KLSAgICAgICAgICAgICkKLSAgICAgICAgPgotICAgIHwgICA8IFVOVEVSTUlOQVRFRF9TVFJJTkdfTElURVJBTDoKLSAgICAgICAgICAgICAgICAiXCIiICggPEVTQ0FQRV9TRVFVRU5DRT4gfCAoflsiXCIiLCJcXCIsIlxuIiwiXHIiXSkgKSogKCBbIlxuIiwiXHIiXSApPwotICAgICAgICAgICAgfCAgICInIiAgKCA8RVNDQVBFX1NFUVVFTkNFPiB8ICh+WyInIiwiXFwiLCJcbiIsIlxyIl0pICApKiAoIFsiXG4iLCJcciJdICk/Ci0gICAgICAgID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBSRUdVTEFSIEVYUFJFU1NJT05TIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsgCi0gICAgICAgIDwgI1JFR1hfU1RBUlRfQ0hBUiA6IH5bIlxyIiwiXG4iLCIvIiwiPSIsIioiXSB8ICJcXC8iPgotICAgIHwgICA8ICNSRUdYX0JPRFlfQ0hBUl9FWENMVVNJT04gOiB+WyJcciIsIlxuIiwiLyJdID4gIAotICAgIHwgICA8ICNSRUdYX0JPRFlfQ0hBUiA6ICggPFJFR1hfQk9EWV9DSEFSX0VYQ0xVU0lPTj4gfCAiXFwvIiApID4KLSAgICB8ICAgPCAjUkVHRVhfRU5EX0NIQVIgOiAgICAgImkiIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZyIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImlnIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImltIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdpIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdtIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1pIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgIm1nIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImlnbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJpbWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAiZ21pIiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgImdpbSIgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICJtaWciIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAibWdpIiAKLSAgICAgICAgPgotfQotCi1UT0tFTiA6Ci17Ci0gICAgICAgIDxSRUdVTEFSX0VYUFJFU1NJT04gOiAiLyIgPFJFR1hfU1RBUlRfQ0hBUj4gKDxSRUdYX0JPRFlfQ0hBUj4pKiAiLyIgKDxSRUdFWF9FTkRfQ0hBUj4pPyA+Ci0gICAgICAgIHsKLSAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAvLyBQZWVrIGF0IHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgICAgICAgICAgICAgICBjaGFyIG5leHRDaCA9IGlucHV0X3N0cmVhbS5yZWFkQ2hhcigpOwotICAgICAgICAgICAgICAgIGlucHV0X3N0cmVhbS5iYWNrdXAoMSk7Ci0gICAgICAgICAgICAgICAgaWYgKGlzUmVnVmFsaWQgPT0gZmFsc2UgfHwgbmV4dENoID09ICcvJyB8fCBuZXh0Q2ggPT0gJyonKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIExleGVjYWwgYW5hbHlzZXIgdGhpbmtzIGl0IGlzIGEgUkUKLSAgICAgICAgICAgICAgICAgICAgLy8gb3BlcmF0b3Igc3VjaCBhcyAvLi4uLi4vCi0gICAgICAgICAgICAgICAgICAgIC8vIFB1dCB0aGUgZXZlcnl0aGluZyB0byB0aGUgZmlyc3QgIi8iIGJhY2sgb24gdGhlIGlucHV0IHN0cmVhbQotICAgICAgICAgICAgICAgICAgICAvLwotICAgICAgICAgICAgICAgICAgICBpbnB1dF9zdHJlYW0uYmFja3VwKGxlbmd0aE9mTWF0Y2gtMSk7Ci0gICAgICAgICAgICAgICAgICAgIC8vCi0gICAgICAgICAgICAgICAgICAgIC8vIEFuZCByZW1vdmUgaXQgZnJvbSB0aGUgdG9rZW4KLSAgICAgICAgICAgICAgICAgICAgLy8KLSAgICAgICAgICAgICAgICAgICAgbWF0Y2hlZFRva2VuLmltYWdlID0gbWF0Y2hlZFRva2VuLmltYWdlLnN1YnN0cmluZygwLCAxKTsKLSAgICAgICAgICAgICAgICAgICAgaW1hZ2UuZGVsZXRlKDAsIGltYWdlLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgICAgICAgICAgICAgIGltYWdlLmFwcGVuZCgnLycpOwotICAgICAgICAgICAgICAgICAgICBtYXRjaGVkVG9rZW4ua2luZD1TTEFTSDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihlLnRvU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgfQotICAgICAgICB9ICAgICAgICAKLQotfQotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIElERU5USUZJRVJTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBJREVOVElGSUVSOiA8TEVUVEVSPiAoPExFVFRFUj58PERJR0lUPikqID4KLSAgICB8ICAgPCAjTEVUVEVSOiBbImEiLSJ6IiwiQSItIloiLCIkIiwiXyJdID4KLSAgICB8ICAgPCAjRElHSVQ6IFsiMCItIjkiXT4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBTRVBBUkFUT1JTIAotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLVRPS0VOIDoKLXsKLSAgICAgICAgPCBMUEFSRU46ICAgIigiID4KLSAgICB8ICAgPCBSUEFSRU46ICAgIikiID4KLSAgICB8ICAgPCBMQlJBQ0U6ICAgInsiID4KLSAgICB8ICAgPCBSQlJBQ0U6ICAgIn0iID4KLSAgICB8ICAgPCBMQlJBQ0tFVDogIlsiID4KLSAgICB8ICAgPCBSQlJBQ0tFVDogIl0iID4KLSAgICB8ICAgPCBTRU1JQ09MT046ICI7IiA+Ci0gICAgfCAgIDwgQ09NTUE6ICAgICIsIiA+Ci0gICAgfCAgIDwgRE9UOiAgICAgICIuIiA+Ci19Ci0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0vLyBPUEVSQVRPUlMgCi0vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotVE9LRU4gOgotewotICAgICAgICA8IEFTU0lHTjogICAgICAgICAgICAgICAiPSIgPgotICAgIHwgICA8IEdUOiAgICAgICAgICAgICAgICAgICAiPiIgPgotICAgIHwgICA8IExUOiAgICAgICAgICAgICAgICAgICAiPCIgPgotICAgIHwgICA8IEJBTkc6ICAgICAgICAgICAgICAgICAiISIgPgotICAgIHwgICA8IFRJTERFOiAgICAgICAgICAgICAgICAifiIgPgotICAgIHwgICA8IEhPT0s6ICAgICAgICAgICAgICAgICAiPyIgPgotICAgIHwgICA8IENPTE9OOiAgICAgICAgICAgICAgICAiOiIgPgotICAgIHwgICA8IEVROiAgICAgICAgICAgICAgICAgICAiPT0iID4KLSAgICB8ICAgPCBMRTogICAgICAgICAgICAgICAgICAgIjw9IiA+Ci0gICAgfCAgIDwgR0U6ICAgICAgICAgICAgICAgICAgICI+PSIgPgotICAgIHwgICA8IE5FOiAgICAgICAgICAgICAgICAgICAiIT0iID4KLSAgICB8ICAgPCBTQ19PUjogICAgICAgICAgICAgICAgInx8IiA+Ci0gICAgfCAgIDwgU0NfQU5EOiAgICAgICAgICAgICAgICImJiIgPgotICAgIHwgICA8IElOQ1I6ICAgICAgICAgICAgICAgICAiKysiID4KLSAgICB8ICAgPCBERUNSOiAgICAgICAgICAgICAgICAgIi0tIiA+Ci0gICAgfCAgIDwgUExVUzogICAgICAgICAgICAgICAgICIrIiA+Ci0gICAgfCAgIDwgTUlOVVM6ICAgICAgICAgICAgICAgICItIiA+Ci0gICAgfCAgIDwgU1RBUjogICAgICAgICAgICAgICAgICIqIiA+Ci0gICAgfCAgIDwgU0xBU0g6ICAgICAgICAgICAgICAgICIvIiA+Ci0gICAgfCAgIDwgQklUX0FORDogICAgICAgICAgICAgICImIiA+Ci0gICAgfCAgIDwgQklUX09SOiAgICAgICAgICAgICAgICJ8IiA+Ci0gICAgfCAgIDwgWE9SOiAgICAgICAgICAgICAgICAgICJeIiA+Ci0gICAgfCAgIDwgUkVNOiAgICAgICAgICAgICAgICAgICIlIiA+Ci0gICAgfCAgIDwgTFNISUZUOiAgICAgICAgICAgICAgICI8PCIgPgotICAgIHwgICA8IFJTSUdORURTSElGVDogICAgICAgICAiPj4iID4KLSAgICB8ICAgPCBSVU5TSUdORURTSElGVDogICAgICAgIj4+PiIgPgotICAgIHwgICA8IFBMVVNBU1NJR046ICAgICAgICAgICAiKz0iID4KLSAgICB8ICAgPCBNSU5VU0FTU0lHTjogICAgICAgICAgIi09IiA+Ci0gICAgfCAgIDwgU1RBUkFTU0lHTjogICAgICAgICAgICIqPSIgPgotICAgIHwgICA8IFNMQVNIQVNTSUdOOiAgICAgICAgICAiLz0iID4KLSAgICB8ICAgPCBBTkRBU1NJR046ICAgICAgICAgICAgIiY9IiA+Ci0gICAgfCAgIDwgT1JBU1NJR046ICAgICAgICAgICAgICJ8PSIgPgotICAgIHwgICA8IFhPUkFTU0lHTjogICAgICAgICAgICAiXj0iID4KLSAgICB8ICAgPCBSRU1BU1NJR046ICAgICAgICAgICAgIiU9IiA+Ci0gICAgfCAgIDwgTFNISUZUQVNTSUdOOiAgICAgICAgICI8PD0iID4KLSAgICB8ICAgPCBSU0lHTkVEU0hJRlRBU1NJR046ICAgIj4+PSIgPgotICAgIHwgICA8IFJVTlNJR05FRFNISUZUQVNTSUdOOiAiPj4+PSIgPgotICAgIHwgICA8IElERU5USVRZT1BFUjogICAgICAgICAiPT09IiA+Ci0gICAgfCAgIDwgTk9USURFTlRJVFlPUEVSOiAgICAgICIhPT0iID4KLX0KLS8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLS8vIEdSQU1NQVIgU2VjdGlvbgotLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotCi12b2lkIExpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIDxERUNJTUFMX0xJVEVSQUw+IAotICAgIHwgICA8T0NUQUxfTElURVJBTD4KLSAgICB8ICAgPEhFWF9MSVRFUkFMPgotICAgIHwgICA8RkxPQVRJTkdfUE9JTlRfTElURVJBTD4gCi0gICAgfCAgIDxTVFJJTkdfTElURVJBTD4gCi0gICAgfCAgIDxUUlVFPiAKLSAgICB8ICAgPEZBTFNFPgotICAgIHwgICA8UkVHVUxBUl9FWFBSRVNTSU9OPiAKLSAgICB8ICAgPE5VTEw+Ci19Ci0KLVRva2VuIElkZW50aWZpZXIoKToKLXsKLQkJVG9rZW4gdDsKLX0KLXsKLSAgICAJdCA9IDxJREVOVElGSUVSPiB7cmV0dXJuIHQ7fQotfQotCi12b2lkIFByaW1hcnlFeHByZXNzaW9uKCk6Ci17Ci0JCVRva2VuIHByZWZpeFRva2VuID0gbnVsbDsJCi19Ci17Ci0gICAgKAotICAgICAgICBwcmVmaXhUb2tlbiA9IDxUSElTPiAgICAgICAgICAgIChQcmltYXJ5U3VmZml4KCkpKgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdPYmplY3RJZGVudGlmaWVyKHByZWZpeFRva2VuLCBnZXRUb2tlbigxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgfCAgIHByZWZpeFRva2VuPUlkZW50aWZpZXIoKSAgICAgICAgKFByaW1hcnlTdWZmaXgoKSkqCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ09iamVjdElkZW50aWZpZXIocHJlZml4VG9rZW4sIGdldFRva2VuKDEpKTsKLSAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMudGFnTWV0aG9kSW52b2NhdGlvbihfY29udGV4dFN0YWNrLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pcHJlZml4VG9rZW4sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbilnZXRUb2tlbigxKSk7Ci0gICAgICAgICAgICB9Ci0gICAgfCAgIExPT0tBSEVBRCgyKSAgPFNUUklOR19MSVRFUkFMPiAgICAgIChQcmltYXJ5U3VmZml4KCkpKiAgCi0gICAgfCAgIExPT0tBSEVBRCgyKSAgPFJFR1VMQVJfRVhQUkVTU0lPTj4gIChQcmltYXJ5U3VmZml4KCkpKiAgICAKLSAgICB8ICAgTE9PS0FIRUFEKDIpICBMaXRlcmFsKCkgCi0gICAgfCAgIEZ1bmN0aW9uTGl0ZXJhbCgpCi0gICAgfCAgIE5lc3RlZEFycmF5TGl0ZXJhbCgpICAgICAgICAgICAgICAgIChQcmltYXJ5U3VmZml4KCkpKgotICAgIHwgICBPYmplY3RMaXRlcmFsKCkgCi0gICAgfCAgIDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPiAgICAgIChQcmltYXJ5U3VmZml4KCkpKiAKLSAgICB8ICAgQWxsb2NhdGlvbkV4cHJlc3Npb24oKSAoUHJpbWFyeVN1ZmZpeCgpKSogICAgICAgICAgICAgCi0gICAgKQotICAgIHsKLSAgICAgICAgdG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7Ci0gICAgfQotfQotCi12b2lkIFByaW1hcnlTdWZmaXgoKToKLXt9Ci17Ci0gICAgICAgIEFyZ3VtZW50cygpIAotICAgIHwgICB7dG9rZW5fc291cmNlLnNldFJlZ0ludmFsaWQoKTt9IDxMQlJBQ0tFVD4gRXhwcmVzc2lvbigpIDxSQlJBQ0tFVD4gCi0gICAgfCAgIHt0b2tlbl9zb3VyY2Uuc2V0UmVnSW52YWxpZCgpO30gPERPVD4gSWRlbnRpZmllcigpCi19Ci0KLXZvaWQgQXJndW1lbnRzKCk6Ci17fQotewotICAgICAgICA8TFBBUkVOPiB7dG9rZW5fc291cmNlLnNldFJlZ1ZhbGlkKCk7fSBbQXJndW1lbnRMaXN0KCldIDxSUEFSRU4+Ci19Ci0KLXZvaWQgQXJndW1lbnRMaXN0KCk6Ci17fQotewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpICg8Q09NTUE+IEFzc2lnbm1lbnRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIExpdGVyYWxBcmd1bWVudExpc3QoKToKLXt9Ci17Ci0gICAgICAgIDxTVFJJTkdfTElURVJBTD4gKDxDT01NQT4gPFNUUklOR19MSVRFUkFMPikqCi19Ci0KLXZvaWQgTmV3U3VmZml4KCk6Ci17fQotewotICAgICAgICA8RE9UPiBJZGVudGlmaWVyKCkKLX0KLQotdm9pZCBBbGxvY2F0aW9uRXhwcmVzc2lvbigpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICBMT09LQUhFQUQoNCkgIHQ9PE5FVz4gPFRISVM+ICAgICAgIChMT09LQUhFQUQoMikgTmV3U3VmZml4KCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXSAKLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgIHwgICBMT09LQUhFQUQoNCkgIHQ9PE5FVz4gSWRlbnRpZmllcigpIChMT09LQUhFQUQoMikgTmV3U3VmZml4KCkpKiBbTE9PS0FIRUFEKDIpIEFyZ3VtZW50cygpXSAKLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgIHwgICBMT09LQUhFQUQoNCkgIHQ9PE5FVz4gRnVuY3Rpb25Db25zdHJ1Y3RvcigpIChMT09LQUhFQUQoMikgTmV3U3VmZml4KCkpKiBbTE9PS0FIRUFEICgyKSBBcmd1bWVudHMoKV0gCi0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLX0KLQotCi12b2lkIFBvc3RmaXhPcCgpOgote30KLXsKLSAgICAgICAgPElOQ1I+Ci0gICAgfCAgIDxERUNSPgotfQotCi12b2lkIFBvc3RmaXhFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBQcmltYXJ5RXhwcmVzc2lvbigpIFtQb3N0Zml4T3AoKV0KLX0KLQotCi12b2lkIFVuYXJ5T3AoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgdD08REVMRVRFPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICB8ICAgdD08Vk9JRD4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgfCAgIHQ9PFRZUEVPRj4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgfCAgIHQ9PElOQ1I+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fQotICAgIHwgICB0PTxERUNSPgotICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30gICAgCi0gICAgfCAgIHQ9PFBMVVM+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSAgICAKLSAgICB8ICAgdD08TUlOVVM+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSAgICAKLSAgICB8ICAgdD08VElMREU+Ci0gICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSAgICAKLSAgICB8ICAgdD08QkFORz4KLSAgICAgICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9ICAgIAotfQotCi12b2lkIFVuYXJ5RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgUG9zdGZpeEV4cHJlc3Npb24oKQotICAgIHwgICBVbmFyeU9wKCkgVW5hcnlFeHByZXNzaW9uKCkKLX0KLQotdm9pZCBNdWxPcCgpOgote30KLXsKLSAgICAgICAgPFNUQVI+Ci0gICAgfCAgIDxTTEFTSD4KLSAgICB8ICAgPFJFTT4gCi19Ci0KLXZvaWQgTXVsdGlwbGljYXRpdmVFeHByZXNzaW9uKCk6Ci17fQotewotICAgICAgICBVbmFyeUV4cHJlc3Npb24oKSAoTXVsT3AoKSBVbmFyeUV4cHJlc3Npb24oKSkqCi19IAotCi12b2lkIEFkZE9wKCk6Ci17fQotewotICAgICAgICA8UExVUz4gCi0gICAgfCAgIDxNSU5VUz4KLX0KLQotdm9pZCBBZGRpdGl2ZUV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpIChBZGRPcCgpIE11bHRpcGxpY2F0aXZlRXhwcmVzc2lvbigpKSoKLX0gCi0KLXZvaWQgU2hpZnRPcCgpOgote30KLXsKLSAgICAgICAgPExTSElGVD4KLSAgICB8ICAgPFJTSUdORURTSElGVD4KLSAgICB8ICAgPFJVTlNJR05FRFNISUZUPgotfQotCi12b2lkIFNoaWZ0RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQWRkaXRpdmVFeHByZXNzaW9uKCkgKFNoaWZ0T3AoKSBBZGRpdGl2ZUV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgUmVsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxMVD4KLSAgICB8ICAgPEdUPiAKLSAgICB8ICAgPExFPiAKLSAgICB8ICAgPEdFPgotfQotCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIFNoaWZ0RXhwcmVzc2lvbigpIAotICAgICAgICAgICAgKExPT0tBSEVBRCgzKSAoICBSZWxPcCgpIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgfCB0PTxJTlNUQU5DRU9GPiAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgdD08SU4+IAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30pCi0gICAgICAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICBTaGlmdEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgICggKCAgUmVsT3AoKSAKLSAgICAgICAgICAgICAgIHwgdD08SU5TVEFOQ0VPRj4gIAotICAgICAgICAgICAgICAgICB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5JTkZJWF9XUyk7fSkKLSAgICAgICAgICAgICAgU2hpZnRFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEVxdWFsT3AoKToKLXt9Ci17Ci0gICAgICAgIDxFUT4gCi0gICAgfCAgIDxORT4gCi0gICAgfCAgIDxJREVOVElUWU9QRVI+IAotICAgIHwgICA8Tk9USURFTlRJVFlPUEVSPgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgUmVsYXRpb25hbEV4cHJlc3Npb24oKSAoRXF1YWxPcCgpIFJlbGF0aW9uYWxFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIFJlbGF0aW9uYWxFeHByZXNzaW9uTm9JTigpIChFcXVhbE9wKCkgUmVsYXRpb25hbEV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi0KLXZvaWQgQml0d2lzZUFORE9wKCk6Ci17fQotewotICAgICAgICA8QklUX0FORD4KLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgRXF1YWxpdHlFeHByZXNzaW9uKCkgKEJpdHdpc2VBTkRPcCgpIEVxdWFsaXR5RXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEVxdWFsaXR5RXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZUFORE9wKCkgRXF1YWxpdHlFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotCi12b2lkIEJpdHdpc2VYT1JPcCgpOgote30KLXsKLSAgICAgICAgPFhPUj4KLX0KLQotdm9pZCBCaXR3aXNlWE9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZUFOREV4cHJlc3Npb24oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZVhPUkV4cHJlc3Npb25Ob0lOKCk6Ci17fQotewotICAgICAgICBCaXR3aXNlQU5ERXhwcmVzc2lvbk5vSU4oKSAoQml0d2lzZVhPUk9wKCkgQml0d2lzZUFOREV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIEJpdHdpc2VPUk9wKCk6Ci17fQotewotICAgICAgICA8QklUX09SPgotfQotCi12b2lkIEJpdHdpc2VPUkV4cHJlc3Npb24oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uKCkgKEJpdHdpc2VPUk9wKCkgQml0d2lzZVhPUkV4cHJlc3Npb24oKSkqCi19Ci0KLXZvaWQgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKToKLXt9Ci17Ci0gICAgICAgIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpIChCaXR3aXNlT1JPcCgpIEJpdHdpc2VYT1JFeHByZXNzaW9uTm9JTigpKSoKLX0KLQotdm9pZCBMb2dpY2FsQU5ERXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbigpICg8U0NfQU5EPiBCaXR3aXNlT1JFeHByZXNzaW9uKCkpKgotfQotCi12b2lkIExvZ2ljYWxBTkRFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSAoPFNDX0FORD4gQml0d2lzZU9SRXhwcmVzc2lvbk5vSU4oKSkqCi19Ci0KLXZvaWQgTG9naWNhbE9SRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb24oKSAoPFNDX09SPiBMb2dpY2FsQU5ERXhwcmVzc2lvbigpKSoKLX0KLQotdm9pZCBMb2dpY2FsT1JFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCkgKDxTQ19PUj4gTG9naWNhbEFOREV4cHJlc3Npb25Ob0lOKCkpKgotfQotCi12b2lkIENvbmRpdGlvbmFsRXhwcmVzc2lvbigpOgote30KLXsKLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbigpIFs8SE9PSz4gRXhwcmVzc2lvbigpIDxDT0xPTj4gQ29uZGl0aW9uYWxFeHByZXNzaW9uKCldCi19Ci0KLXZvaWQgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpOgote30KLXsKLSAgICAgICAgTG9naWNhbE9SRXhwcmVzc2lvbk5vSU4oKSBbPEhPT0s+IEV4cHJlc3Npb25Ob0lOKCkgPENPTE9OPiBDb25kaXRpb25hbEV4cHJlc3Npb25Ob0lOKCldCi19Ci0KLVRva2VuIEFzc2lnbmVtZW50T3BlcmF0b3IoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgKCB0PTxBU1NJR04+Ci0gICAgfCAgICAgdD08U1RBUkFTU0lHTj4KLSAgICB8ICAgICB0PTxTTEFTSEFTU0lHTj4gCi0gICAgfCAgICAgdD08UkVNQVNTSUdOPiAKLSAgICB8ICAgICB0PTxQTFVTQVNTSUdOPgotICAgIHwgICAgIHQ9PE1JTlVTQVNTSUdOPiAKLSAgICB8ICAgICB0PTxMU0hJRlRBU1NJR04+IAotICAgIHwgICAgIHQ9PFJTSUdORURTSElGVEFTU0lHTj4KLSAgICB8ICAgICB0PTxSVU5TSUdORURTSElGVEFTU0lHTj4KLSAgICB8ICAgICB0PTxBTkRBU1NJR04+IAotICAgIHwgICAgIHQ9PFhPUkFTU0lHTj4gCi0gICAgfCAgICAgdD08T1JBU1NJR04+ICkKLSAgICAgICAgeyByZXR1cm4gdDsgfSAKLX0KLQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbigpOgotewotICAgICAgICBUb2tlbiB0TEhTICAgICAgPSBnZXRUb2tlbigxKTsgCi0JCVRva2VuIHRPcGVyYXRvciA9IG51bGw7IAotCQlUb2tlbiB0UkhTICAgICAgPSBudWxsOwotCQlUb2tlbiB0RW5kICAgICAgPSBudWxsOwotfQotewotICAgICAgICBDb25kaXRpb25hbEV4cHJlc3Npb24oKSAKLSAgICAgICAgICAgIFsgKEFzc2lnbmVtZW50T3BlcmF0b3IoKSAKLSAgICAgICAgICAgICAgIHt0UkhTPWdldFRva2VuKDEpO30KLSAgICAgICAgICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkpCi0gICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICB0RW5kID0gZ2V0VG9rZW4oMSk7Ci0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ0Fzc2lnbm1lbnRFeHByZXNzaW9uKF9jb250ZXh0U3RhY2ssIG51bGwsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdExIUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0T3BlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0UkhTLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRFbmQpOyAKLSAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIF0KLX0KLQotdm9pZCBBc3NpZ25tZW50RXhwcmVzc2lvbk5vSU4oKToKLXsKLSAgICAgICAgVG9rZW4gdExIUyAgICAgID0gZ2V0VG9rZW4oMSk7IAotCQlUb2tlbiB0T3BlcmF0b3IgPSBudWxsOyAKLQkJVG9rZW4gdFJIUyAgICAgID0gbnVsbDsKLQkJVG9rZW4gdEVuZCAgICAgID0gbnVsbDsKLX0KLXsKLSAgICAgICAgQ29uZGl0aW9uYWxFeHByZXNzaW9uTm9JTigpIAotICAgICAgICAgICAgWyAoQXNzaWduZW1lbnRPcGVyYXRvcigpIHt0UkhTPWdldFRva2VuKDEpO30KLSAgICAgICAgICAgICAgIEFzc2lnbm1lbnRFeHByZXNzaW9uTm9JTigpKQotICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgdEVuZCA9IGdldFRva2VuKDEpOwotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdBc3NpZ25tZW50RXhwcmVzc2lvbihfY29udGV4dFN0YWNrLCBudWxsLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEFubm90YXRlZFRva2VuKXRMSFMsIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdE9wZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdFJIUywgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbil0RW5kKTsgCi0gICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBdCi19Ci0KLQotdm9pZCBFeHByZXNzaW9uKCkgICAgICAgICAgICAgICAgICAgICA6Ci17fQotewotICBBc3NpZ25tZW50RXhwcmVzc2lvbigpICggIiwiIEFzc2lnbm1lbnRFeHByZXNzaW9uKCkgKSoKLX0gICAKLQotdm9pZCBFeHByZXNzaW9uTm9JTigpICAgICAgICAgICAgICAgICAgICAgOgote30KLXsKLSAgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgKCAiLCIgQXNzaWdubWVudEV4cHJlc3Npb25Ob0lOKCkgKSoKLX0gICAKLQotCi12b2lkIFN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpICAgIEJsb2NrKG51bGwpCi0gICAgfCAgICAgICAgICAgICAgICAgICBWYXJpYWJsZVN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBFbXB0eVN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIElmU3RhdGVtZW50KCkKLSAgICB8ICAgICAgICAgICAgICAgICAgIEl0ZXJhdGlvblN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBDb250aW51ZVN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBCcmVha1N0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBSZXR1cm5TdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgV2l0aFN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICBUcnlTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgVGhyb3dTdGF0ZW1lbnQoKQotICAgIHwgICAgICAgICAgICAgICAgICAgU3dpdGNoU3RhdGVtZW50KCkKLX0KLSAKLXZvaWQgQmxvY2soUHJvZ3JhbUNvbnRleHQgY29udGV4dCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMykgICAgPExCUkFDRT4gPFJCUkFDRT4gICAKLSAgICB8ICAgICAgICAgICAgICAgICAgIDxMQlJBQ0U+IHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoY29udGV4dCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHRTdGFjay5wdXNoQ29udGV4dChuZXcgUHJvZ3JhbUNvbnRleHQoImJsb2NrIikpOwotIAkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbU3RhdGVtZW50TGlzdCgpXSAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxSQlJBQ0U+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRleHRTdGFjay5wb3BDb250ZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci19Ci0gCi12b2lkIFZhcmlhYmxlU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIHQ9PFZBUj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHQpIFNjKCkKLX0KLSAKLXZvaWQgVmFyaWFibGVEZWNsYXJhdGlvbkxpc3QoVG9rZW4gdmFyVG9rZW4pOgote30KLXsKLSAgICAgICAgVmFyaWFibGVEZWNsYXJhdGlvbih2YXJUb2tlbikgKCA8Q09NTUE+IFZhcmlhYmxlRGVjbGFyYXRpb24odmFyVG9rZW4pICkqCi19Ci0KLXZvaWQgVmFyaWFibGVEZWNsYXJhdGlvbihUb2tlbiB2YXJUb2tlbik6Ci17Ci0gICAgICAgIFRva2VuIGxocyAgICAgID0gbnVsbDsKLSAgICAgICAgVG9rZW5bXSB0QXJyYXkgPSBudWxsOwotfQotewotICAgICAgICBsaHM9SWRlbnRpZmllcigpIFtJbml0aWFsaXplcigpXQotICAgICAgICB7Ci0gICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4obGhzLCBBbm5vdGF0aW9uQ29uc3RhbnRzLlZBUl9JREVOVElGSUVSLCBudWxsLCAtMSk7Ci0gICAgICAgICAgICBKU1BhcnNlclV0aWxzLnB1c2hUb2tlbihfY29udGV4dFN0YWNrLCAoQW5ub3RhdGVkVG9rZW4pbGhzKTsgICAgICAKLSAgICAgIAotICAgICAgICAgICAgaWYodEFycmF5ICE9IG51bGwpIHsKLSAgICAgIAkgICAgICAgVG9rZW4gZW5kID0gZ2V0VG9rZW4oMSk7Ci0gICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ0Fzc2lnbm1lbnRFeHByZXNzaW9uKF9jb250ZXh0U3RhY2ssIChBbm5vdGF0ZWRUb2tlbil2YXJUb2tlbiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChBbm5vdGF0ZWRUb2tlbilsaHMsIChBbm5vdGF0ZWRUb2tlbil0QXJyYXlbMF0sIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoQW5ub3RhdGVkVG9rZW4pdEFycmF5WzFdLCAoQW5ub3RhdGVkVG9rZW4pZW5kKTsgCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLX0KLQotVG9rZW5bXSBJbml0aWFsaXplcigpOgotewotICAgICAgICBUb2tlbltdIHRBcnJheSA9IG5ldyBUb2tlblsyXTsKLX0KLXsKLSAgICAgICAgdEFycmF5WzBdPTxBU1NJR04+IHt0QXJyYXlbMV09Z2V0VG9rZW4oMSk7fSAKLSAgICAgICAgQXNzaWdubWVudEV4cHJlc3Npb24oKQotICAgICAgICB7cmV0dXJuIHRBcnJheTt9Ci19Ci0gCi12b2lkIEVtcHR5U3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8U0VNSUNPTE9OPgotfQotCi12b2lkIEV4cHJlc3Npb25TdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIEV4cHJlc3Npb24oKSBTYygpIAotfQotCi1KQVZBQ09ERQotICB2b2lkIFNjKCkgewotCi0gICAgVG9rZW4gdG9rID0gZ2V0VG9rZW4oMSk7Ci0gICAgaWYgKHRvay5raW5kID09IFNFTUlDT0xPTikgewotICAgICAgIHRvayA9IGdldE5leHRUb2tlbigpOwotICAgIH0gZWxzZSBpZiAodG9rLnNwZWNpYWxUb2tlbiAhPSBudWxsKSB7Ci0gICAgICAgaWYgKCFFb2xDb21tZW50U2tpcFdzKHRvay5zcGVjaWFsVG9rZW4pICYmICh0b2sua2luZCAhPSBFT0YpKSB7Ci0gICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKCh0b2sua2luZCAhPSBFT0YpICYmICh0b2sua2luZCE9UkJSQUNFKSkgewotICAgICAgICAgdGhyb3cgZ2VuZXJhdGVQYXJzZUV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotIAotSkFWQUNPREUKLSAgYm9vbGVhbiBFb2xDb21tZW50U2tpcFdzKFRva2VuIHQpIHsKLSAgICBib29sZWFuIHJldFZhbCA9IGZhbHNlOwotICAgIFRva2VuIHNwZWNpYWxUb2tlbiA9IHQ7Ci0gICAgd2hpbGUoc3BlY2lhbFRva2VuICE9IG51bGwpIHsKLSAgICAgIGlmKHNwZWNpYWxUb2tlbi5raW5kID09IFdTKSB7Ci0gICAgICAgIHNwZWNpYWxUb2tlbiA9IHNwZWNpYWxUb2tlbi5zcGVjaWFsVG9rZW47Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgZWxzZSBpZihzcGVjaWFsVG9rZW4ua2luZCA9PSBFT0wgIHx8IAotICAgICAgICAgICAgICBzcGVjaWFsVG9rZW4ua2luZCA9PSBTSU5HTEVfTElORV9DT01NRU5UKSB7Ci0gICAgICAgIHJldFZhbCA9IHRydWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgZWxzZSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmV0VmFsOwotICB9Ci0gCi12b2lkIElmU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIDxJRj4gPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkgCi0gICAgICAgICAgICBbIExPT0tBSEVBRCgxKSB0PTxFTFNFPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgICAgICAgU3RhdGVtZW50KCkKLSAgICAgICAgICAgIF0KLX0KLQotCi12b2lkIEl0ZXJhdGlvblN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGlsZVN0YXRlbWVudCgpCi0gICAgfCAgICAgICAgICAgICAgICAgICAgICAgRG9TdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoPEZPUj4gPExQQVJFTj4gRXhwcmVzc2lvbigpIDxTRU1JQ09MT04+KSAgICAgICAgICAgICAgICAgICAgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvclN0YXRlbWVudCgpCi0gICAgfCAgIExPT0tBSEVBRCg8Rk9SPiA8TFBBUkVOPiA8U0VNSUNPTE9OPikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yU3RhdGVtZW50KCkKLSAgICB8ICAgTE9PS0FIRUFEKDxGT1I+IDxMUEFSRU4+IHZhclRvZWtuPTxWQVI+IFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHZhclRva2VuKSA8U0VNSUNPTE9OPikgIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvclZhclN0YXRlbWVudCgpCi0gICAgfCAgIExPT0tBSEVBRCgzKSAgICAgICAgRm9ySW5TdGF0ZW1lbnQoKQotICAgIHwgICBMT09LQUhFQUQoMykgICAgICAgIEZvclZhckluU3RhdGVtZW50KCkKLX0KLSAKLXZvaWQgRG9TdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxETz4gU3RhdGVtZW50KCkgPFdISUxFPiA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4KLX0KLQotdm9pZCBXaGlsZVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFdISUxFPiA8TFBBUkVOPiBFeHByZXNzaW9uKCkgPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotIAotdm9pZCBGb3JTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxGT1I+IDxMUEFSRU4+ICBbRXhwcmVzc2lvbigpXSA8U0VNSUNPTE9OPiAKLSAgICAgICAgICAgICAgICAgICAgICAgIFtFeHByZXNzaW9uKCldIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICAgW0V4cHJlc3Npb24oKV0gPFJQQVJFTj4gCi0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotCi12b2lkIEZvclZhclN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICA8Rk9SPiA8TFBBUkVOPiAgdD08VkFSPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpO30KLSAgICAgICAgICAgICAgICAgICAgICAgIFZhcmlhYmxlRGVjbGFyYXRpb25MaXN0KHQpIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICAgW0V4cHJlc3Npb24oKV0gIDxTRU1JQ09MT04+IAotICAgICAgICAgICAgICAgICAgICAgICAgW0V4cHJlc3Npb24oKV0gIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLQotdm9pZCBGb3JJblN0YXRlbWVudCgpOgotewotICAgICAgICBUb2tlbiB0OwotfQotewotICAgICAgICA8Rk9SPiA8TFBBUkVOPiAgRXhwcmVzc2lvbk5vSU4oKSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHQ9PElOPiB7SlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVU5ERUZJTkVELCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIEFubm90YXRlZFRva2VuLklORklYX1dTKTt9Ci0gICAgICAgICAgICAgICAgICAgICAgICBFeHByZXNzaW9uTm9JTigpIDxSUEFSRU4+IAotICAgICAgICAgICAgU3RhdGVtZW50KCkKLX0KLSAKLXZvaWQgRm9yVmFySW5TdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgPEZPUj4gPExQQVJFTj4gIAotICAgICAgICAgICAgICAgIHQ9PFZBUj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgICAgICAgICAgdD1JZGVudGlmaWVyKCkgCi0gICAgICAgICAgICAgICAgICB7Ci0gICAJICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHQsIEFubm90YXRpb25Db25zdGFudHMuVkFSX0lERU5USUZJRVIsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7Ci0gICAJICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5wdXNoVG9rZW4oX2NvbnRleHRTdGFjaywgKEFubm90YXRlZFRva2VuKXQpOwotICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFtJbml0aWFsaXplcigpXSAKLSAgICAgICAgICAgICAgICB0PTxJTj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uSU5GSVhfV1MpO30KLSAgICAgICAgICAgICAgICBFeHByZXNzaW9uTm9JTigpIAotICAgICAgICAgICAgICA8UlBBUkVOPiAKLSAgICAgICAgICAgIFN0YXRlbWVudCgpCi19Ci0KLXZvaWQgQ29udGludWVTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxDT05USU5VRT4gU2MoKQotfQotCi12b2lkIEJyZWFrU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8QlJFQUs+IFNjKCkKLX0KLSAKLXZvaWQgUmV0dXJuU3RhdGVtZW50KCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIHQ9PFJFVFVSTj4ge0pTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0LCBBbm5vdGF0aW9uQ29uc3RhbnRzLlVOREVGSU5FRCwgbnVsbCwgQW5ub3RhdGVkVG9rZW4uUFJFRklYX1dTKTt9Ci0gICAgICAgIFtFeHByZXNzaW9uKCldIFNjKCkKLX0KLQotdm9pZCBXaXRoU3RhdGVtZW50KCk6Ci17fQotewotICAgICAgICA8V0lUSD4gPExQQVJFTj4gRXhwcmVzc2lvbigpIDxSUEFSRU4+Ci0gICAgICAgICAgICBTdGF0ZW1lbnQoKQotfQotCi12b2lkIFRyeVN0YXRlbWVudCgpOgote30KLXsKLSAgICAgICAgPFRSWT4gQmxvY2sobnVsbCkKLSAgICAgICAgKDxDQVRDSD4gPExQQVJFTj4gSWRlbnRpZmllcigpIDxSUEFSRU4+IEJsb2NrKG51bGwpKSoKLSAgICAgICAgWzxGSU5BTExZPiBCbG9jayhudWxsKV0KLX0gCi0KLXZvaWQgVGhyb3dTdGF0ZW1lbnQoKToKLXsKLSAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgdD08VEhST1c+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICBbRXhwcmVzc2lvbigpXSBTYygpCi19Ci0KLXZvaWQgQ2FzZUd1YXJkKCk6Ci17Ci0gICAgICAgIFRva2VuIHQ7Ci19Ci17Ci0gICAgICAgIHQ9PENBU0U+IHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5VTkRFRklORUQsIG51bGwsIEFubm90YXRlZFRva2VuLlBSRUZJWF9XUyk7fQotICAgICAgICBFeHByZXNzaW9uKCkgPENPTE9OPgotICAgIHwgICA8X0RFRkFVTFQ+IDxDT0xPTj4KLX0KLQotdm9pZCBDYXNlR3JvdXAoKToKLXt9Ci17Ci0gICAgICAgIENhc2VHdWFyZCgpIChTdGF0ZW1lbnQoKSkqICAKLX0KLQotdm9pZCBTd2l0Y2hTdGF0ZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIDxTV0lUQ0g+ICAgIDxMUEFSRU4+IEV4cHJlc3Npb24oKSA8UlBBUkVOPiAKLSAgICAgICAgICAgICAgICAgICAgPExCUkFDRT4gKENhc2VHcm91cCgpKSogPFJCUkFDRT4KLX0KLQotdm9pZCBOYW1lZEZ1bmN0aW9uKCk6Ci17Ci0gICAgICAgIFRva2VuICB0SWRlbnRpZmllciA9IG51bGw7Ci0gICAgICAgIFRva2VuICB0RnVuY3Rpb24gICA9IG51bGw7Ci0gICAgICAgIFRva2VuICBibG9ja1N0YXJ0ICA9IG51bGw7Ci0gICAgICAgIFRva2VuICBibG9ja0VuZCAgICA9IG51bGw7Ci0gICAgICAgIFZlY3RvciBwYXJhbXMgICAgICA9IG5ldyBWZWN0b3IoKTsKLX0KLXsKLSAgICAgICAgdEZ1bmN0aW9uPTxGVU5DVElPTj4gCi0gICAgICAgIHRJZGVudGlmaWVyPUlkZW50aWZpZXIoKSAKLSAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VuKHRJZGVudGlmaWVyLCBBbm5vdGF0aW9uQ29uc3RhbnRzLkZVTkNUSU9OX05BTUVfSURFTlRJRklFUiwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsLCAtMSk7IAotICAgICAgICAgICAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyYW1Db250ZXh0KHRJZGVudGlmaWVyLmltYWdlKTsKLSAgICAgICAgICAgICAgX2NvbnRleHRTdGFjay5wdXNoQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgICAgfQotICAgICAgICA8TFBBUkVOPiAKLSAgICAgICAgICAgW3BhcmFtcz1Gb3JtYWxQYXJhbWV0ZXJMaXN0KCldIAotICAgICAgICAgICAgICB7IAotICAgICAgICAgICAgICAgICAgSlNQYXJzZXJVdGlscy5hbm5vdGF0ZVRva2VucyhwYXJhbXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuRlVOQ1RJT05fUEFSQU1fSURFTlRJRklFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCwgLTEpOyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbih0RnVuY3Rpb24sIEFubm90YXRpb25Db25zdGFudHMuTkFNRURfRlVOQ1RJT04sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1zLCBBbm5vdGF0ZWRUb2tlbi5QUkVGSVhfV1MpOyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMucHVzaFRva2VucyhfY29udGV4dFN0YWNrLCBwYXJhbXMpOwotICAgICAgICAgICAgICB9IAotCi0gICAgICAgIDxSUEFSRU4+Ci0gICAgICAgIHtibG9ja1N0YXJ0ID0gZ2V0VG9rZW4oMSk7fSAKLSAgICAgICAgQmxvY2soY29udGV4dCkKLSAgICAgICAgewotICAgICAgICAgICBibG9ja0VuZCA9IGdldFRva2VuKDEpOwotICAgICAgICAgICBKU1BhcnNlclV0aWxzLnRhZ0V2YWxDYWxscyh0RnVuY3Rpb24sIGJsb2NrU3RhcnQsIGJsb2NrRW5kKTsKLSAgICAgICAgfQotfQotCi12b2lkIEFub255bW91c0Z1bmN0aW9uKCk6Ci17Ci0gICAgICAgIFRva2VuICB0RnVuY3Rpb24gID0gbnVsbDsKLSAgICAgICAgVG9rZW4gIGJsb2NrU3RhcnQgPSBudWxsOwotICAgICAgICBUb2tlbiAgYmxvY2tFbmQgICA9IG51bGw7Ci0gICAgICAgIFZlY3RvciBwYXJhbXMgICAgID0gbmV3IFZlY3RvcigpOwotfQotewotICAgICAgICB0RnVuY3Rpb249PEZVTkNUSU9OPgotICAgICAgICAgICB7IAotICAgICAgICAgICAgICBQcm9ncmFtQ29udGV4dCBjb250ZXh0ID0gbmV3IFByb2dyYW1Db250ZXh0KCJhbm9ueW1vdXMiKTsKLSAgICAgICAgICAgICAgX2NvbnRleHRTdGFjay5wdXNoQ29udGV4dChjb250ZXh0KTsKLSAgICAgICAgICAgfSAKLSAgICAgICAgPExQQVJFTj4gCi0gICAgICAgICAgIFtwYXJhbXM9Rm9ybWFsUGFyYW1ldGVyTGlzdCgpXSAKLSAgICAgICAgICAgICAgeyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMuYW5ub3RhdGVUb2tlbnMocGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBbm5vdGF0aW9uQ29uc3RhbnRzLkZVTkNUSU9OX1BBUkFNX0lERU5USUZJRVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bGwsIC0xKTsgCi0gICAgICAgICAgICAgICAgICBKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odEZ1bmN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFubm90YXRpb25Db25zdGFudHMuQU5PTllNT1VTX0ZVTkNUSU9OLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmFtcywgLTEpOyAKLSAgICAgICAgICAgICAgICAgIEpTUGFyc2VyVXRpbHMucHVzaFRva2VucyhfY29udGV4dFN0YWNrLCBwYXJhbXMpOwotICAgICAgICAgICAgICB9IAotICAgICAgICA8UlBBUkVOPiAKLSAgICAgICAge2Jsb2NrU3RhcnQgPSBnZXRUb2tlbigxKTt9Ci0gICAgICAgIEJsb2NrKGNvbnRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgYmxvY2tFbmQgPSBnZXRUb2tlbigxKTsKLSAgICAgICAgICAgSlNQYXJzZXJVdGlscy50YWdFdmFsQ2FsbHModEZ1bmN0aW9uLCBibG9ja1N0YXJ0LCBibG9ja0VuZCk7Ci0gICAgICAgIH0KLX0KLQotdm9pZCBGdW5jdGlvbkNvbnN0cnVjdG9yKCk6Ci17fQoteyAgICAKLSAgICAgICAgPEZVTkNUSU9OXz4gPExQQVJFTj4gQXJndW1lbnRMaXN0KCkgPFJQQVJFTj4gCi19Ci0KLXZvaWQgRnVuY3Rpb25EZWNsYXJhdGlvbigpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIE5hbWVkRnVuY3Rpb24oKSAKLSAgICB8ICAgTE9PS0FIRUFEKDIpIEFub255bW91c0Z1bmN0aW9uKCkKLX0gICAgICAgICAgIAotCi12b2lkIEZ1bmN0aW9uTGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDIpIE5hbWVkRnVuY3Rpb24oKQotICAgIHwgICBMT09LQUhFQUQoMikgQW5vbnltb3VzRnVuY3Rpb24oKQotfQotICAgICAgICAgICAgICAgICAgICAgICAgICAKLVZlY3RvciBGb3JtYWxQYXJhbWV0ZXJMaXN0KCk6Ci17Ci0gICAgICAgIFRva2VuICB0ID0gbnVsbDsKLSAgICAgICAgVmVjdG9yIHYgPSBuZXcgVmVjdG9yKCk7Ci19Ci17Ci0gICAgICAgIHQ9SWRlbnRpZmllcigpIHt2LmFkZCh0KTt9IAotICAgICAgICAoPENPTU1BPiB0PUlkZW50aWZpZXIoKSB7di5hZGQodCk7fSkqCi0gICAgICAgIHtyZXR1cm4gdjt9Ci19Ci0KLXZvaWQgTGl0ZXJhbEVsZW1lbnQoKSA6Ci17fQotewotICAgICAgICBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi19Ci0KLXZvaWQgRWxlbWVudExpc3QoKToKLXt9Ci17Ci0gICAgICAgIExpdGVyYWxFbGVtZW50KCkgKDxDT01NQT4gTGl0ZXJhbEVsZW1lbnQoKSkqCi19Ci0KLXZvaWQgQXJyYXlMaXRlcmFsKCk6Ci17fQotewotICAgICAgICBMT09LQUhFQUQoMikgPExCUkFDS0VUPiA8UkJSQUNLRVQ+Ci0gICAgfCAgIExPT0tBSEVBRCgyKSA8TEJSQUNLRVQ+IEVsZW1lbnRMaXN0KCkgPFJCUkFDS0VUPgotfQotCi12b2lkIE5lc3RlZEFycmF5TGl0ZXJhbCgpOgote30KLXsKLSAgICAgICAgTE9PS0FIRUFEKDMpIEFycmF5TGl0ZXJhbCgpIAotICAgIHwgICBMT09LQUhFQUQoMykgPExCUkFDS0VUPiBOZXN0ZWRBcnJheUxpdGVyYWwoKSA8UkJSQUNLRVQ+Ci19Ci0KLXZvaWQgTGl0ZXJhbEZpZWxkKCk6Ci17Ci0gICAgICAgIFRva2VuIHQgPSBudWxsOwotfQotewotICAgICAgICB0PUlkZW50aWZpZXIoKSAgICAgPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi0gICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5MSVRFUkFMX09CSkVDVF9LRVlfSURFTlRJRklFUixudWxsLC0xKTsgfQotICAgfCAgICB0PTxTVFJJTkdfTElURVJBTD4gPENPTE9OPiBBc3NpZ25tZW50RXhwcmVzc2lvbigpCi0gICAgICAgIHtKU1BhcnNlclV0aWxzLmFubm90YXRlVG9rZW4odCwgQW5ub3RhdGlvbkNvbnN0YW50cy5MSVRFUkFMX09CSkVDVF9LRVlfSURFTlRJRklFUixudWxsLC0xKTsgfQotfQotCi12b2lkIEZpZWxkTGlzdCgpOgote30KLXsKLSAgICAgICAgTGl0ZXJhbEZpZWxkKCkgKDxDT01NQT4gTGl0ZXJhbEZpZWxkKCkpKgotfQotCi12b2lkIE9iamVjdExpdGVyYWwoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSA8TEJSQUNFPiA8UkJSQUNFPgotICAgIHwgICBMT09LQUhFQUQoMikgPExCUkFDRT4gRmllbGRMaXN0KCkgPFJCUkFDRT4gIAotfQotCi0KLVRva2VuIFByb2dyYW0oKToKLXsKLSAgICAgICAgVG9rZW4gcmV0dmFsID0gZ2V0VG9rZW4oMSk7Ci19Ci17Ci0gICAgICAgIHtfY29udGV4dFN0YWNrLnB1c2hDb250ZXh0KG5ldyBQcm9ncmFtQ29udGV4dCgicm9vdCIpKTt9Ci0gICAgICAgIChTb3VyY2VFbGVtZW50KCkpKiAgPEVPRj4KLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHJldHZhbDsKLSAgICAgICAgfQotfQotCi12b2lkIFNvdXJjZUVsZW1lbnQoKToKLXt9Ci17Ci0gICAgICAgIExPT0tBSEVBRCgyKSAgICBTdGF0ZW1lbnQoKSAKLSAgICB8ICAgICAgICAgICAgICAgICAgIEZ1bmN0aW9uRGVjbGFyYXRpb24oKQotfQotCi12b2lkIFN0YXRlbWVudExpc3QoKTogCi17Ci0vLyAgICAgICAgVG9rZW4gdDsKLX0KLXsKLSAgICAgICAgKFN0YXRlbWVudCgpKSsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRGV0b2tlbml6ZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRGV0b2tlbml6ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRiMTJkMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0RldG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLS8qKgotICogQ29udmVydHMgVG9rZW4gT2JqZWN0cyBpbnRvIGEgSmF2YVNjcmlwdCBmaWxlCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgRGV0b2tlbml6ZXIKLXsKLSAgcHJpdmF0ZSBmaW5hbCBQcmludFdyaXRlciBfb3V0OwotCi0gIC8qKgotICAgKiBAcGFyYW0gb3V0IHRoZSBmaWxlIHRvIHdyaXRlIHRoZSBvdXRwdXQgdG8uCi0gICAqLwotICBwdWJsaWMgRGV0b2tlbml6ZXIoUHJpbnRXcml0ZXIgb3V0KQotICB7Ci0gICAgdGhpcy5fb3V0ID0gb3V0OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgUHJpbnRXcml0ZXIgYW5kIGNhbGxzIHRoZSBvdGhlciBjb25zdHJ1Y3Rvci4KLSAgICovCi0gIHB1YmxpYyBEZXRva2VuaXplcihXcml0ZXIgb3V0KQotICB7Ci0gICAgdGhpcyhuZXcgUHJpbnRXcml0ZXIob3V0KSk7Ci0gIH0KLQotICAvKioKLSAgICogZGVjb2RlcyBhIHRva2VuIGFuZCB3cml0ZXMgdGhlIHJlc3VsdAotICAgKiBAcGFyYW0gdG9rIHRoZSB0b2tlbiB0byBkZWNvZGUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZShUb2tlbiB0b2spIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaW50IGNvbSA9IHRvay5jb2RlOwotICAgIHN3aXRjaChjb20pCi0gICAgICB7Ci0gICAgICBjYXNlIFRva2VuLk5FV0xJTkUgOgotICAgICAgICBfb3V0LnByaW50bG4oKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLldISVRFU1BBQ0UgOgotICAgICAgICBfb3V0LnByaW50KCcgJyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5QRVJJT0QgOgotICAgICAgICBfb3V0LnByaW50KCcuJyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5TRU1JQ09MT04gOgotICAgICAgICBfb3V0LnByaW50KCc7Jyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5RVU9URUQgOgotICAgICAgICB7Ci0gICAgICAgICAgY2hhciBjaCA9IHRvay5jaDsKLSAgICAgICAgICBfb3V0LnByaW50KGNoK3Rvay5zdHJpbmcrY2gpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5DT05UUk9MIDoKLSAgICAgIGNhc2UgVG9rZW4uTEVGVF9CUkFDRSA6Ci0gICAgICBjYXNlIFRva2VuLlJJR0hUX0JSQUNFIDoKLSAgICAgICAgX291dC5wcmludCh0b2suY2gpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uTlVNQkVSIDoKLSAgICAgIGNhc2UgVG9rZW4uUkVTRVJWRUQgOgotICAgICAgY2FzZSBUb2tlbi5OQU1FIDoKLSAgICAgICAgX291dC5wcmludCh0b2suc3RyaW5nKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLkNPTU1FTlQgOgotICAgICAgICBfb3V0LnByaW50KCIvKiIrdG9rLnN0cmluZysiKi8iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRva2VuLlJFR1VMQVJfRVhQIDoKLSAgICAgICAgX291dC5wcmludCgiLyIrdG9rLnN0cmluZysiLyIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVG9rZW4uUkVHVUxBUl9FWFBfTU9ESUZJRVIgOgotICAgICAgICBfb3V0LnByaW50KHRvay5jaCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUb2tlbi5FT0YgOgotICAgICAgICBfb3V0LmNsb3NlKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdCA6Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmtub3duIFRva2VuOiIrdG9rKTsKLSAgICAgIH0KLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsZVByb2Nlc3Nvci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWxlUHJvY2Vzc29yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MGE2MjYuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWxlUHJvY2Vzc29yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlbmFtZUZpbHRlcjsKLQotLyoqCi0gKiBUaGlzIHV0aWxpdHkgY2xhc3MgY2FuIGJlIHVzZWQgdG8gcGVyZm9ybSBzb21lIHByb2Nlc3Npbmcgb24gaW5wdXQgZmlsZXMsCi0gKiBhbmQgd3JpdGUgdGhlIHJlc3VsdHMgdG8gY29ycmVzcG9uZGluZyBvdXRwdXQgZmlsZXMuIEl0IHN1cHBvcnRzIHJlY3Vyc2luZwotICogaW50byBzdWJkaXJlY3Rvcmllcy4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBGaWxlUHJvY2Vzc29yCi17Ci0gIC8qKgotICAgKiBAcGFyYW0gZmlsZW5hbWVFeHQgdGhlIGZpbGVuYW1lIGV4dGVuc2lvbiB0byBhY2NlcHQuIElmIG51bGwsIGFsbCBmaWxlcwotICAgKiAgYXJlIGFjY2VwdGVkLgotICAgKiBAcmV0dXJuIGEgZmlsdGVyIHRoYXQgb25seSBhY2NlcHRzIGZpbGVzIHdpdGggbmFtZXMgdGhhdCBlbmQgd2l0aCB0aGUKLSAgICogIHNwZWNpZmllZCBleHRlbnNpb24uIEhvd2V2ZXIsIHRoZSBmaWx0ZXIgYWNjZXB0cyBhbGwgc3ViZGlyZWN0b3JpZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEZpbGVuYW1lRmlsdGVyIGdldEV4dGVuc2lvbkZpbHRlcihmaW5hbCBTdHJpbmcgZmlsZW5hbWVFeHQpCi0gIHsKLSAgICByZXR1cm4gbmV3IEZpbGVuYW1lRmlsdGVyKCkgewotICAgICAgICBwdWJsaWMgYm9vbGVhbiBhY2NlcHQoRmlsZSBkaXIsIFN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKChmaWxlbmFtZUV4dD09bnVsbCkgfHwgKG5hbWUuZW5kc1dpdGgoZmlsZW5hbWVFeHQpKSkgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgRmlsZSBmID0gbmV3IEZpbGUoZGlyLCBuYW1lKTsKLSAgICAgICAgICByZXR1cm4gZi5pc0RpcmVjdG9yeSgpOwotICAgICAgICB9Ci0gICAgICB9OwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBmaWx0ZXIgdXNlZCB0byBzZWxlY3QgZmlsZXMgYW5kL29yIHN1YmRpcmVjdG9yaWVzLgotICAgKiBAcGFyYW0gZmFpbEZhc3QgaWYgdHJ1ZSwgdGVybWluYXRlcyBhdCB0aGUgZmlyc3QgZXJyb3IgKG90aGVyd2lzZSwKLSAgICogIGNvbnRpbnVlcyB3aXRoIHRoZSBuZXh0IGZpbGUpLgotICAgKiBAcGFyYW0gb3ZlcndyaXRlIGlmIGZhbHNlLCB3aWxsIG5vdCBvdmVyd3JpdGUgZXhpc3Rpbmcgb3V0cHV0IGZpbGVzIChUaGF0Ci0gICAqICBwYXJ0aWN1bGFyIGlucHV0IGFuZCBvdXRwdXQgZmlsZSB3aWxsIGJlIHNraXBwZWQpLgotICAgKiBAcGFyYW0gdmVyYm9zZSBpZiB0cnVlLCBnZW5lcmF0ZXMgdmVyYm9zZSBvdXRwdXQuICAqLwotICBwdWJsaWMgRmlsZVByb2Nlc3NvcihGaWxlbmFtZUZpbHRlciBmaWx0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gZmFpbEZhc3QsIGJvb2xlYW4gb3ZlcndyaXRlLCBib29sZWFuIHZlcmJvc2UpCi0gIHsKLSAgICBfZmlsdGVyID0gZmlsdGVyOwotICAgIF9mYWlsRmFzdCA9IGZhaWxGYXN0OwotICAgIF9kb250T3ZlcndyaXRlID0gIW92ZXJ3cml0ZTsKLSAgICBpc1ZlcmJvc2UgPSB2ZXJib3NlOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBGaWxlcHJvY2Vzc29yIHRoYXQgb3ZlcndyaXRlcyBhbGwgb3V0cHV0IGZpbGVzLCBhbmQgZG9lcyBub3QKLSAgICogZmFpbCBmYXN0LgotICAgKiBAcGFyYW0gZmlsdGVyIHVzZWQgdG8gc2VsZWN0IGZpbGVzIGFuZC9vciBzdWJkaXJlY3Rvcmllcy4gICovCi0gIHB1YmxpYyBGaWxlUHJvY2Vzc29yKEZpbGVuYW1lRmlsdGVyIGZpbHRlciwgYm9vbGVhbiB2ZXJib3NpdHkpCi0gIHsKLSAgICB0aGlzKGZpbHRlciwgZmFsc2UsIHRydWUsIHZlcmJvc2l0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIEZpbGVwcm9jZXNzb3IgdGhhdCBvdmVyd3JpdGVzIGFsbCBvdXRwdXQgZmlsZXMsIGFuZCBkb2VzIG5vdAotICAgKiBmYWlsIGZhc3QuCi0gICAqIEBwYXJhbSBleHRlbnNpb24gdGhlIGZpbGUgZXh0ZW5zaW9uIHRvIGZpbHRlciBmb3IuIGlmIHRoaXMgaXMgbnVsbCwgYWxsCi0gICAqIGZpbGVzIGFuZCBzdWJkaXJlY3RvcmllcyBpbiBhIGRpcmVjdG9yeSB3aWxsIGJlIHByb2Nlc3NlZCByZWN1cnNpdmVseS4KLSAgICogQHNlZSAjZ2V0RXh0ZW5zaW9uRmlsdGVyKFN0cmluZyBleHRlbnNpb24pCi0gICAqLwotICBwdWJsaWMgRmlsZVByb2Nlc3NvcihTdHJpbmcgZXh0ZW5zaW9uLCBib29sZWFuIHZlcmJvc2l0eSkKLSAgewotICAgIHRoaXMoZ2V0RXh0ZW5zaW9uRmlsdGVyKGV4dGVuc2lvbiksIHZlcmJvc2l0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGluIHRoZSBpbnB1dCBmaWxlIG9yIGRpcmVjdG9yeQotICAgKiBAcGFyYW0gb3V0IGlmIHRoZSBpbnB1dCBpcyBhIGRpcmVjdG9yeSwgdGhlbiB0aGlzIG11c3QgYmUgdGhlIG91dHB1dAotICAgKiAgZGlyZWN0b3J5LiBPdGhlcndpc2UsIHRoaXMgaXMgdGhlIG91dHB1dCBmaWxlLgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlcmUgd2VyZSBubyBlcnJvcnMuIGZhbHNlIG90aGVyd2lzZS4gICovCi0gIHB1YmxpYyBib29sZWFuIHByb2Nlc3MoRmlsZSBpbiwgRmlsZSBvdXQpCi0gIHsKLSAgICBpZiAoaXNWZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlByb2Nlc3NpbmcgZmlsZToiK2luKyIgdG8gZmlsZToiK291dCk7Ci0KLSAgICBpZiAoaW4uaXNEaXJlY3RvcnkoKSkKLSAgICB7Ci0gICAgICBib29sZWFuIHN1Y2Nlc3MgPSB0cnVlOwotICAgICAgU3RyaW5nW10gbmFtZXMgPSBpbi5saXN0KF9maWx0ZXIpOwotICAgICAgZm9yKGludCBpPTAsIHN6PW5hbWVzLmxlbmd0aDsgaTxzejsgaSsrKQotICAgICAgewotICAgICAgICBGaWxlIHN1YkluID0gbmV3IEZpbGUoaW4sIG5hbWVzW2ldKTsKLSAgICAgICAgRmlsZSBzdWJPdXQgPSBuZXcgRmlsZShvdXQsIG5hbWVzW2ldKTsKLSAgICAgICAgc3VjY2VzcyAmPSBwcm9jZXNzKHN1YkluLCBzdWJPdXQpOwotICAgICAgICBpZiAoX2ZhaWxGYXN0ICYmICghc3VjY2VzcykpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzdWNjZXNzOwotICAgIH0KLSAgICBlbHNlCi0gICAgewotICAgICAgdHJ5Ci0gICAgICB7Ci0gICAgICAgIGlmIChfZG9udE92ZXJ3cml0ZSAmJiBvdXQuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBpZiAoaXNWZXJib3NlKSBTeXN0ZW0ub3V0LnByaW50bG4oIlNraXBwaW5nIGZpbGU6IitpbisKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYXMgZGVzdGluYXRpb24gZmlsZToiK291dCsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgYWxyZWFkeSBleGlzdHMuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LmdldFBhcmVudEZpbGUoKS5ta2RpcnMoKTsKLSAgICAgICAgICBwcm9jZXNzRmlsZShpbiwgb3V0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFcnJvciBwcm9jZXNzaW5nIGZpbGU6IitpbisiIHRvIGZpbGU6IitvdXQpOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB0byBwcm9jZXNzIGEgc2luZ2xlIGZpbGUuCi0gICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgZmlsZS4gVGhpcyBpcyBuZXZlciBhIGRpcmVjdG9yeS4KLSAgICogQHBhcmFtIG91dCB0aGUgb3V0cHV0IGZpbGUuIElmIHRoaXMgZmlsZSBleGlzdHMgYW5kIG92ZXJ3cml0aW5nIGlzIG5vdAotICAgKiBwZXJtaXR0ZWQsIHRoZW4gdGhpcyBtZXRob2QgaXMgbmV2ZXIgY2FsbGVkLgotICAgKiBAZXhjZXB0aW9uIEV4Y2VwdGlvbiBpZiB0aGlzIGNsYXNzIGlzIHNldCB0byA8aT5mYWlsIGZhc3Q8L2k+IHRoZW4gYW55Ci0gICAqIGV4Y2VwdGlvbiB0aHJvd24gd2lsbCBjYXVzZSBhbGwgZXhlY3V0aW9uIHRvIGhhbHQuIElmIHRoaXMgY2xhc3MgZG9lcyBub3QKLSAgICogZmFpbCBmYXN0LCB0aGVuIHRoZSBleGNlcHRpb24gd2lsbCBiZSByZXBvcnRlZCBhbmQgZXhlY3V0aW9uIHdpbGwKLSAgICogY29udGludWUgd2l0aCB0aGUgbmV4dCBmaWxlLiAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IHZvaWQgcHJvY2Vzc0ZpbGUoRmlsZSBpbiwgRmlsZSBvdXQpIHRocm93cyBFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIElmIHRoaXMgaXMgdHJ1ZSwgdmVyYm9zZSBvdXRwdXQgd2lsbCBiZSBnZW5lcmF0ZWQuCi0gICAqLwotICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc1ZlcmJvc2U7Ci0KLSAgcHJpdmF0ZSAgIGZpbmFsIGJvb2xlYW4gX2ZhaWxGYXN0LCBfZG9udE92ZXJ3cml0ZTsKLSAgcHJpdmF0ZSAgIGZpbmFsIEZpbGVuYW1lRmlsdGVyIF9maWx0ZXI7Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIxLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjEuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjEyNDk4Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL0ZpbHRlcjEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBSZW1vdmVzIGFsbCBjb21tZW50cyBhbmQgcmVkdW5kYW50IHdoaXRlc3BhY2UKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXIxIGltcGxlbWVudHMgVG9rZW5SZWFkZXIKLXsKLQotICAvKioKLSAgICogYmxvY2tzIHVudGlsIGlzIGhhcyByZWFkIGF0bGVhc3Qgb25lIHRva2VuIGZyb20gdGhlIGlucHV0IHJlYWRlcgotICAgKi8KLSAgcHVibGljIEZpbHRlcjEoVG9rZW5SZWFkZXIgaW4pIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIF9pbiA9IGluOwotICAgIF9uZXh0ID0gX2luLnJlYWQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAc2VlIFRva2VuUmVhZGVyCi0gICAqLwotICBwdWJsaWMgVG9rZW4gcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIFRva2VuIGN1ciA9IF9uZXh0OwotICAgIFRva2VuIHJlcyA9IGN1cjsKLSAgICBmb3IoO2N1ciE9bnVsbDspCi0gICAgICB7Ci0gICAgICAgIF9uZXh0ID0gX2luLnJlYWQoKTsKLSAgICAgICAgcmVzID0gX2ZpbHRlcihfcHJldiwgY3VyLCBfbmV4dCkgOwotICAgICAgICBpZiAocmVzIT1udWxsKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF9wcmV2ID0gcmVzOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlIGN1ciA9IF9uZXh0OwotICAgICAgfQotICAgIHJldHVybiByZXM7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyBleHRyYSBzcGFjZXMvbmV3bGluZXMgYW5kIGFsbCBjb21tZW50cwotICAgKi8KLSAgcHJpdmF0ZSBUb2tlbiBfZmlsdGVyKFRva2VuIHByZXYsIFRva2VuIGN1ciwgVG9rZW4gbmV4dCkKLSAgewotICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImZpbHRlcmluZyB0b2tlbjoiK2N1cik7Ci0gICAgaW50IGNjb2RlID0gY3VyLmNvZGU7Ci0gICAgaWYgKChjY29kZT09VG9rZW4uQ09NTUVOVCkgfHwgICAvL3NraXAgY29tbWVudHMKLSAgICAgICAgKChjY29kZT09VG9rZW4uV0hJVEVTUEFDRSkgJiYKLSAgICAgICAgICEoX2lzU3BhY2VTZW5zaXRpdmUocHJldikgJiYgX2lzU3BhY2VTZW5zaXRpdmUobmV4dCkpKSB8fAotICAgICAgICAoKGNjb2RlPT1Ub2tlbi5ORVdMSU5FKSAmJgotICAgICAgICAgKChwcmV2PT1udWxsKSB8fCAocHJldi5jb2RlPT1Ub2tlbi5ORVdMSU5FKSkpKQotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgZWxzZSByZXR1cm4gY3VyOwotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gdG9rZW4gaXMgYWZmZWN0ZWQgYnkgd2hpdGVzcGFjZSBwcmVjZWRpbmcgb3IKLSAgICogIGZvbGxvd2luZyBpdC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNTcGFjZVNlbnNpdGl2ZShUb2tlbiB0b2spCi0gIHsKLSAgICBpZiAodG9rPT1udWxsKSByZXR1cm4gZmFsc2U7Ci0gICAgaW50IGkgPSB0b2suY29kZTsKLSAgICBpZiAoKGkgPT0gVG9rZW4uTkFNRSkgfHwgKGkgPT0gVG9rZW4uTlVNQkVSKSB8fCAoaSA9PSBUb2tlbi5SRVNFUlZFRCkgfHwKLSAgICAgICAgKGkgPT0gVG9rZW4uUEVSSU9EKSkKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGVsc2UgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBUb2tlblJlYWRlciBfaW47Ci0gIHByaXZhdGUgVG9rZW4gX3ByZXYgPSBudWxsOwotICBwcml2YXRlIFRva2VuIF9uZXh0OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvRmlsdGVyMi5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMzNlZTEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9GaWx0ZXIyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMjIgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgamF2YS51dGlsLlZlY3RvcjsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLQotLyoqCi0gKiBSZW5hbWVzIGxvY2FsIHZhcmlhYmxlIG5hbWVzIHRvIHNob3J0IG9uZXMKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWx0ZXIyIGltcGxlbWVudHMgVG9rZW5SZWFkZXIKLXsKLQotICBwdWJsaWMgRmlsdGVyMihUb2tlblJlYWRlciBpbikKLSAgewotICAgIF9pbiA9IGluOwotICAgIFJ1bm5hYmxlIHJ1bm5lciA9IG5ldyBSdW5uYWJsZSgpCi0gICAgICB7Ci0gICAgICAgIHB1YmxpYyB2b2lkIHJ1bigpCi0gICAgICAgIHsKLSAgICAgICAgICB0cnkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJDb21wcmVzc29yOiBzdGFydDoiK1RocmVhZC5jdXJyZW50VGhyZWFkKCkpOwotICAgICAgICAgICAgX3J1bigpOwotICAgICAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiQ29tcmVzc29yOiBlbmQ6IitUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2F0Y2ggKEludGVycnVwdGVkRXhjZXB0aW9uIGUpCi0gICAgICAgICAgewotICAgICAgICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgbmV3IFRocmVhZChydW5uZXIpLnN0YXJ0KCk7Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBUb2tlblJlYWRlciNyZWFkKCkKLSAgICovCi0gIHB1YmxpYyBUb2tlbiByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgcmV0dXJuIF9idWZmZXIucmVhZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9ydW4oKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIFRva2VuIGN1ciA9IF9pbi5yZWFkKCk7Ci0gICAgICBmb3IoO2N1ciE9bnVsbDspCi0gICAgICB7Ci0gICAgICAgIF9wcm9jZXNzKGN1cik7Ci0gICAgICAgIGN1ciA9IF9pbi5yZWFkKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIF9idWZmZXIud3JpdGUoZSk7Ci0gICAgfQotICAgIGNhdGNoIChUb2tlbkV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBfYnVmZmVyLndyaXRlKG5ldyBJT0V4Y2VwdGlvbigiRXJyb3IgcGFyc2luZyBsaW5lOiIrCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmdldFRva2VuKCkubGluZU51bWJlcikpOwotICAgIH0KLSAgICBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICBfYnVmZmVyLndyaXRlKG5ldyBJT0V4Y2VwdGlvbigpKTsKLSAgICB9Ci0gICAgX2J1ZmZlci5jbG9zZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlbmFtZXMgbG9jYWwgdmFyaWFibGUgbmFtZXMgdG8gc2hvcnQgbmFtZXMuCi0gICAqIEZpcnN0IHBhc3MuIHNldHMgYSBmbGFnIGlmIHRoaXMgZnVuY3Rpb24gdXNlcyB0aGUgSlMgZXZhbCBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3Byb2Nlc3MoVG9rZW4gY3VyKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGlmICgoY3VyLmNvZGUgPT0gVG9rZW4uTEVGVF9CUkFDRSkgJiYgKGN1ci5jaCA9PSAneycpKQotICAgICAgX29wZW5DdXJseSsrOwotICAgIGVsc2UgaWYgKChjdXIuY29kZSA9PSBUb2tlbi5SSUdIVF9CUkFDRSkgJiYgKGN1ci5jaCA9PSAnfScpKQotICAgICAgX29wZW5DdXJseS0tOwotCi0KLSAgICBzd2l0Y2goX3N0YXRlKQotICAgIHsKLSAgICBjYXNlIFJPT1RfTU9ERSA6Ci0gICAgICBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5SRVNFUlZFRCkgJiYgKGN1ci5zdHJpbmcuZXF1YWxzKCJmdW5jdGlvbiIpKSkKLSAgICAgIHsKLSAgICAgICAgX3N0YXRlID0gRlVOQ1RJT05fUEFSQU1fTU9ERTsKLSAgICAgICAgX2Z1bmN0aW9uLmNsZWFyKCk7Ci0gICAgICAgIF9pc0Z1bmN0aW9uVXNpbmdFdmFsID0gZmFsc2U7Ci0gICAgICAgIF9mdW5jdGlvbi5hZGQoY3VyKTsKLSAgICAgIH0KLSAgICAgIGVsc2UgX2J1ZmZlci53cml0ZShjdXIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVU5DVElPTl9QQVJBTV9NT0RFIDoKLSAgICAgIF9mdW5jdGlvbi5hZGQoY3VyKTsKLSAgICAgIGlmICgoY3VyLmNvZGU9PVRva2VuLkxFRlRfQlJBQ0UpICYmIChjdXIuY2g9PSd7JykpCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX0JPRFlfTU9ERTsKLSAgICAgICAgX2JlZ2luRnVuY3Rpb24gPSBfb3BlbkN1cmx5OwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVU5DVElPTl9CT0RZX01PREUgOgotICAgICAgX2Z1bmN0aW9uLmFkZChjdXIpOwotICAgICAgaWYgKF9vcGVuQ3VybHk8X2JlZ2luRnVuY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IFJPT1RfTU9ERTsKLSAgICAgICAgaWYgKF9pc0Z1bmN0aW9uVXNpbmdFdmFsKSBfd3JpdGVUb2tlbnMoX2Z1bmN0aW9uKTsKLSAgICAgICAgZWxzZQotICAgICAgICB7Ci0gICAgICAgICAgZm9yKGludCBpPTAsc3o9X2Z1bmN0aW9uLnNpemUoKTsgaTxzejsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIF9wcm9jZXNzMigoVG9rZW4pIF9mdW5jdGlvbi5nZXQoaSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZSBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5OQU1FKSAmJiBjdXIuc3RyaW5nLmVxdWFscygiZXZhbCIpKQotICAgICAgewotICAgICAgICBfaXNGdW5jdGlvblVzaW5nRXZhbCA9IHRydWU7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogMm5kIHBhc3MKLSAgICogRG9lcyB0aGUgYWN0dWFsIHJlbmFtaW5nCi0gICAqLwotICBwcml2YXRlIHZvaWQgX3Byb2Nlc3MyKFRva2VuIGN1cikgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoKGN1ci5jb2RlID09IFRva2VuLkxFRlRfQlJBQ0UpICYmIChjdXIuY2ggPT0gJ3snKSkKLSAgICAgIF9vcGVuQ3VybHkrKzsKLSAgICBlbHNlIGlmICgoY3VyLmNvZGUgPT0gVG9rZW4uUklHSFRfQlJBQ0UpICYmIChjdXIuY2ggPT0gJ30nKSkKLSAgICAgIF9vcGVuQ3VybHktLTsKLQotICAgIHN3aXRjaChfc3RhdGUpCi0gICAgewotICAgIGNhc2UgUk9PVF9NT0RFIDoKLSAgICAgIGlmICgoY3VyLmNvZGU9PVRva2VuLlJFU0VSVkVEKSAmJiAoY3VyLnN0cmluZy5lcXVhbHMoImZ1bmN0aW9uIikpKQotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9NT0RFOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVU5DVElPTl9NT0RFIDoKLSAgICAgIGlmICgoY3VyLmNvZGU9PVRva2VuLkxFRlRfQlJBQ0UpICYmIChjdXIuY2g9PScoJykpCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IEZVTkNUSU9OX1BBUkFNX01PREU7Ci0gICAgICAgIF9sb2NhbFZhck1hcC5jbGVhcigpOwotICAgICAgfQotICAgICAgZWxzZSBpZiAoY3VyLmNvZGU9PVRva2VuLk5BTUUpCi0gICAgICB7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImZ1bmN0aW9uIG5hbWU7IitjdXIuc3RyaW5nKTsKLSAgICAgICAgX25hbWVHZW4ucmVzZXQoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRlVOQ1RJT05fUEFSQU1fTU9ERSA6Ci0gICAgICBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5MRUZUX0JSQUNFKSAmJiAoY3VyLmNoPT0neycpKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9CT0RZX01PREU7Ci0gICAgICAgIF9iZWdpbkZ1bmN0aW9uID0gX29wZW5DdXJseTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ci5jb2RlID09IFRva2VuLk5BTUUpCi0gICAgICB7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIiBwYXJhbToiK2N1ci5zdHJpbmcpOwotICAgICAgICBUb2tlbiB0b2sgPSBfZ2V0TmV3VG9rZW4oY3VyKTsKLSAgICAgICAgY3VyID0gdG9rOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGVU5DVElPTl9CT0RZX01PREUgOgotICAgICAgaWYgKF9vcGVuQ3VybHk8X2JlZ2luRnVuY3Rpb24pCi0gICAgICB7Ci0gICAgICAgIF9zdGF0ZSA9IFJPT1RfTU9ERTsKLSAgICAgIH0KLSAgICAgIGVsc2UgaWYgKGN1ci5jb2RlPT1Ub2tlbi5QRVJJT0QpCi0gICAgICAgIF9zdGF0ZSA9IFBFUklPRF9NT0RFOwotICAgICAgZWxzZSBpZiAoKGN1ci5jb2RlPT1Ub2tlbi5SRVNFUlZFRCkgJiYgKGN1ci5zdHJpbmcuZXF1YWxzKCJ2YXIiKSkpCi0gICAgICAgIF9zdGF0ZSA9IFZBUl9ERUZfTU9ERTsKLSAgICAgIGVsc2UgaWYgKGN1ci5jb2RlPT1Ub2tlbi5OQU1FKQotICAgICAgewotICAgICAgICBjdXIgPSBfc3Vic3RGb3JUb2tlbihjdXIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBWQVJfREVGX01PREUgOgotICAgICAgaWYgKGN1ci5jb2RlPT1Ub2tlbi5OQU1FKQotICAgICAgewotICAgICAgICBfc3RhdGUgPSBGVU5DVElPTl9CT0RZX01PREU7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIiBsb2NhbCB2YXI6IitjdXIuc3RyaW5nKTsKLSAgICAgICAgVG9rZW4gdG9rID0gX2dldE5ld1Rva2VuKGN1cik7Ci0gICAgICAgIGN1ciA9IHRvazsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUEVSSU9EX01PREUgOgotICAgICAgLy8gdGhpcyBpcyBqdXN0IHRvIHNraXAgdGhlIG5leHQgdG9rZW4gYWZ0ZXIgYSBwZXJpb2QuCi0gICAgICBfc3RhdGUgPSBGVU5DVElPTl9CT0RZX01PREU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgX2J1ZmZlci53cml0ZShjdXIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVRva2VucyhWZWN0b3IgdG9rZW5zKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIGZvcihpbnQgaT0wLHN6PXRva2Vucy5zaXplKCk7IGk8c3o7IGkrKykKLSAgICB7Ci0gICAgICBfYnVmZmVyLndyaXRlKChUb2tlbikgdG9rZW5zLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEByZXR1cm4gYSBuZXcgdG9rZW4gdG8gcmVwbGFjZSB0aGUgb2xkIG9uZSB3aXRoLiB0aGUgbmV3IG9uZSB3aWxsIGhhdmUKLSAgICogIGEgc2hvcnQgbmFtZQotICAgKi8KLSAgcHJpdmF0ZSBUb2tlbiBfZ2V0TmV3VG9rZW4oVG9rZW4gb2xkVG9rZW4pCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG9sZFRva2VuLnN0cmluZzsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIF9sb2NhbFZhck1hcC5nZXQob2xkTmFtZSk7Ci0gICAgaWYgKG5ld05hbWU9PW51bGwpCi0gICAgewotICAgICAgbmV3TmFtZSA9IF9uYW1lR2VuLmdldE5leHQoKTsKLSAgICAgIF9sb2NhbFZhck1hcC5wdXQob2xkTmFtZSwgbmV3TmFtZSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVG9rZW4ob2xkVG9rZW4uY29kZSwgb2xkVG9rZW4ubGluZU51bWJlciwgbmV3TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0aGUgc3Vic3RpdHV0ZSB0b2tlbi4gaWYgbm8gdG9rZW4gaGFzIGJlZW4gc3Vic3RpdHV0ZWQgZm9yIHRoZQotICAgKiAgPGNvZGU+b2xkVG9rZW48L2NvZGU+IHRoZW4gdGhlIDxjb2RlPm9sZFRva2VuPC9jb2RlPiBpcyByZXR1cm5lZC4KLSAgICogQHBhcmFtIG9sZFRva2VuIHRoZSB0b2tlbiB0byBzdWJzdGl0dXRlIGZvci4KLSAgICovCi0gIHByaXZhdGUgVG9rZW4gX3N1YnN0Rm9yVG9rZW4oVG9rZW4gb2xkVG9rZW4pCi0gIHsKLSAgICBTdHJpbmcgb2xkTmFtZSA9IG9sZFRva2VuLnN0cmluZzsKLSAgICBTdHJpbmcgbmV3TmFtZSA9IChTdHJpbmcpIF9sb2NhbFZhck1hcC5nZXQob2xkTmFtZSk7Ci0gICAgaWYgKG5ld05hbWU9PW51bGwpCi0gICAgewotICAgICAgaWYgKF9uYW1lR2VuLmlzSW5Vc2Uob2xkTmFtZSkpCi0gICAgICAgIHRocm93IG5ldyBUb2tlbkV4Y2VwdGlvbihvbGRUb2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDb25mbGljdCB3aXRoIGdsb2JhbCB2YXI6IitvbGROYW1lKTsKLSAgICAgIHJldHVybiBvbGRUb2tlbjsKLSAgICB9Ci0gICAgVG9rZW4gdG9rID0gbmV3IFRva2VuKG9sZFRva2VuLmNvZGUsIG9sZFRva2VuLmxpbmVOdW1iZXIsIG5ld05hbWUpOwotICAgIHJldHVybiB0b2s7Ci0gIH0KLQotICBwcml2YXRlIGNsYXNzIE5hbWVHZW4KLSAgewotICAgIHByaXZhdGUgaW50IF9pID0gMDsKLSAgICBwcml2YXRlIGNoYXIgX2NoID0gJ2EnOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIF9zYiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIC8qKgotICAgICAqIEByZXR1cm4gYSBuZXcgdW5pcXVlIHNob3J0IG5hbWUKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5leHQoKQotICAgIHsKLSAgICAgIF9zYi5zZXRMZW5ndGgoMCk7Ci0gICAgICByZXR1cm4gX3NiLmFwcGVuZChfY2gpLmFwcGVuZChfaSsrKS50b1N0cmluZygpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkKLSAgICB7Ci0gICAgICBfaSA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHJldHVybiB0cnVlIGlmIDxjb2RlPnZhck5hbWU8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gcmV0dXJuZWQgYnkKLSAgICAgKiAgIHRoZSBtZXRob2QgPGNvZGU+Z2V0TmV4dCgpPC9jb2RlPgotICAgICAqIEBzZWUgI2dldE5leHQoKQotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzSW5Vc2UoU3RyaW5nIHZhck5hbWUpCi0gICAgewotICAgICAgaW50IHN6PXZhck5hbWUubGVuZ3RoKCk7Ci0gICAgICBpZiAoKHZhck5hbWUuY2hhckF0KDApIT1fY2gpIHx8IChzejw9MSkpIHJldHVybiBmYWxzZTsKLQotICAgICAgZm9yKGludCBpPTE7IGk8c3o7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKCFDaGFyYWN0ZXIuaXNEaWdpdCh2YXJOYW1lLmNoYXJBdChpKSkpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIFN0cmluZyBpcGFydCA9IHZhck5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgaW50IGogPSBJbnRlZ2VyLnBhcnNlSW50KGlwYXJ0KTsKLSAgICAgIGlmIChqID49IF9pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBlbHNlIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9zdGF0ZSA9IFJPT1RfTU9ERTsKLSAgcHJpdmF0ZSBpbnQgX29wZW5DdXJseSA9IDA7Ci0gIHByaXZhdGUgaW50IF9iZWdpbkZ1bmN0aW9uID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIF9pc0Z1bmN0aW9uVXNpbmdFdmFsID0gZmFsc2U7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBUb2tlblJlYWRlciBfaW47Ci0gIHByaXZhdGUgZmluYWwgTmFtZUdlbiBfbmFtZUdlbiA9IG5ldyBOYW1lR2VuKCk7Ci0gIHByaXZhdGUgZmluYWwgSGFzaE1hcCBfbG9jYWxWYXJNYXAgPSBuZXcgSGFzaE1hcCgpOwotICBwcml2YXRlIGZpbmFsIFRva2VuQnVmZmVyIF9idWZmZXIgPSBuZXcgVG9rZW5CdWZmZXIoKTsKLSAgcHJpdmF0ZSBmaW5hbCBWZWN0b3IgX2Z1bmN0aW9uID0gbmV3IFZlY3RvcigpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBST09UX01PREUgPSAgICAgICAgICAgMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZVTkNUSU9OX01PREUgPSAgICAgICAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRlVOQ1RJT05fUEFSQU1fTU9ERSA9IDI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGVU5DVElPTl9CT0RZX01PREUgPSAgMzsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFZBUl9ERUZfTU9ERSA9ICAgICAgICA0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUEVSSU9EX01PREUgPSAgICAgICAgIDU7Ci0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1F1ZXVlLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1F1ZXVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTk2ZWEuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9RdWV1ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjEwICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW1wbGVtZW50cyBhIGZpcnN0LWluLWZpcnN0LW91dCAoRklGTykgcXVldWUuIFR5cGljYWxseSwgb25lIHRocmVhZCB3aWxsIGFkZAotICogZWxlbWVudHMgdG8gdGhpcyBxdWV1ZSwgYW5kIGFub3RoZXIgd2lsbCByZW1vdmUgZWxlbWVudHMgZnJvbSB0aGlzIHF1ZXVlLgotICogVGhpcyBjbGFzcyBpcyB0aHJlYWQgc2FmZS4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBRdWV1ZQotewotICAvKioKLSAgICogQHBhcmFtIHNpemUgdGhlIG1heGltdW0gc2l6ZSBvZiB0aGlzIHF1ZXVlCi0gICAqLwotICBwdWJsaWMgUXVldWUoaW50IHNpemUpCi0gIHsKLSAgICBpZiAoc2l6ZTw9MCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oInNpemUgaXMgbm9ucG9zaXRpdmU6IitzaXplKTsKLSAgICBfYnVmID0gbmV3IE9iamVjdFtzaXplXTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBxdWV1ZS4gVGhpcyB3aWxsIG5ldmVyIGJlIGxhcmdlcgotICAgKiB0aGFuIHRoZSB7QGxpbmsgI1F1ZXVlKGludCkgbWF4aW11bSBzaXplfSBvZiB0aGlzIHF1ZXVlLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHN5bmNocm9uaXplZCBpbnQgc2l6ZSgpCi0gIHsKLSAgICByZXR1cm4gX3NpemU7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBoYXMgYmVlbiBjbG9zZWQuCi0gICAqIEBzZWUgI2Nsb3NlKCkKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBzeW5jaHJvbml6ZWQgYm9vbGVhbiBpc0Nsb3NlZCgpCi0gIHsKLSAgICByZXR1cm4gX2Nsb3NlZDsKLSAgfQotCi0gIC8qKgotICAgKiBjbG9zZXMgdGhpcyBxdWV1ZS4gQW55IGNvbnNlcXVlbnQge0BsaW5rICNhZGQoT2JqZWN0KX0gbWV0aG9kIGNhbGxzIHdpbGwKLSAgICogZmFpbC4gIEFsbCB7QGxpbmsgI2dldCgpfSBvcGVyYXRpb25zIHdpbGwgc3VjY2VlZCB1bnRpbCB0aGUgcXVldWUgaXMKLSAgICogZW1wdHkuIFRoaXMgbWV0aG9kIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gICAqIEBzZWUgI2lzQ2xvc2VkKCkKLSAgICovCi0gIHB1YmxpYyBzeW5jaHJvbml6ZWQgdm9pZCBjbG9zZSgpCi0gIHsKLSAgICBfY2xvc2VkID0gdHJ1ZTsKLSAgICBub3RpZnlBbGwoKTsKLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhlIHF1ZXVlIGlzIGZ1bGwgYW5kIGEgY2FsbCB0byB7QGxpbmsgI2FkZChPYmplY3QpfQotICAgKiB3b3VsZCBibG9jay4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRnVsbCgpCi0gIHsKLSAgICByZXR1cm4gKHNpemUoKSA9PSBfYnVmLmxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSBxdWV1ZSBpcyBlbXB0eSBhbmQgYSBjYWxsIHRvIHtAbGluayAjZ2V0KCl9Ci0gICAqIHdvdWxkIGJsb2NrLgotICAgKi8KLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNFbXB0eSgpCi0gIHsKLSAgICByZXR1cm4gKHNpemUoKSA9PSAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIG1ldGhvZCBibG9ja3MgdW50aWwgc3BhY2UgaXMgYXZhaWxhYmxlIGluIHRoaXMgcXVldWUuCi0gICAqIEBwYXJhbSBvYmogdGhlIE9iamVjdCB0byBhZGQgdG8gdGhlIGVuZCBvZiB0aGlzIHF1ZXVlLiBudWxsIGlzIHBlcm1pdHRlZC4KLSAgICogQGV4Y2VwdGlvbiBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiBpZiB0aGUgY3VycmVudCB0aHJlYWQgaXMgaW50ZXJydXB0ZWQuCi0gICAqIEBleGNlcHRpb24gSWxsZWdhbFN0YXRlRXhjZXB0aW9uIGlmIHF1ZXVlIGlzIGNsb3NlZC4KLSAgICogQHNlZSAjY2xvc2UoKQotICAgKiBAc2VlICNyZW1vdmUoKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIGFkZChPYmplY3Qgb2JqKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbiwgSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gIHsKLSAgICBmb3IoO2lzRnVsbCgpICYmICghaXNDbG9zZWQoKSk7KQotICAgIHsKLSAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIndhaXRpbmcgdG8gYWRkLiBzaXplIik7Ci0gICAgICB3YWl0KCk7Ci0gICAgfQotICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImFkZGluZy4gc2l6ZToiK3NpemUoKSk7Ci0KLSAgICBfY2hlY2tJc0Nsb3NlZCgpOwotCi0gICAgX2J1ZltfaGVhZF0gPSBvYmo7Ci0gICAgX2hlYWQgPSBfaW5jSW5kZXgoX2hlYWQpOwotICAgIF9zaXplKys7Ci0gICAgLy8geWVzLCB3ZSBhcmUgd2FraW5nIHVwIGFsbCB0aHJlYWRzLCBpbmNsdWRpbmcgdGhvc2UgdGhhdCBhcmUKLSAgICAvLyB3YWl0aW5nIHRvIGRvIGFuIGFkZC4gVGhpcyBtYXkgYmUgaW5lZmZpY2llbnQuCi0gICAgLy8gbm90ZSB0aGF0IHdlIG11c3QgZG8gbm90aWZ5QWxsKCkgYW5kIG5vdCBub3RpZnkoKQotICAgIG5vdGlmeUFsbCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGJsb2NrcyB1bnRpbCBzb21lIGVsZW1lbnQgaXMgYWRkZWQgdG8gdGhpcyBxdWV1ZSwgb3IgdGhlIHF1ZXVlCi0gICAqIGlzIGNsb3NlZC4KLSAgICogQHJldHVybiByZW1vdmVzIGFuZCByZXR1cm5zIHRoZSBPYmplY3QgYXQgdGhlIGZyb250IG9mIHRoaXMgcXVldWUuCi0gICAqIG51bGwgbWF5IGJlIHJldHVybmVkIGlmIG51bGwgd2FzIGFkZGVkIHVzaW5nIHtAbGluayAjYWRkKE9iamVjdCl9Ci0gICAqIEBleGNlcHRpb24gSW50ZXJydXB0ZWRFeGNlcHRpb24gaWYgdGhlIGN1cnJlbnQgdGhyZWFkIGlzIGludGVycnVwdGVkLgotICAgKiBAZXhjZXB0aW9uIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBpZiBxdWV1ZSBpcyBjbG9zZWQuCi0gICAqIEBzZWUgI2Nsb3NlKCkKLSAgICogQHNlZSAjYWRkKE9iamVjdCkKLSAgICogQHNlZSAjcmVtb3ZlKExJc3QsaW50KQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBPYmplY3QgcmVtb3ZlKCkKLSAgICB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24sIElsbGVnYWxTdGF0ZUV4Y2VwdGlvbgotICB7Ci0gICAgZm9yKDtpc0VtcHR5KCk7KQotICAgIHsKLSAgICAgIF9jaGVja0lzQ2xvc2VkKCk7Ci0gICAgICB3YWl0KCk7Ci0gICAgfQotCi0gICAgT2JqZWN0IHJlcyA9IF9idWZbX3RhaWxdOwotICAgIF9idWZbX3RhaWxdID0gbnVsbDsgLy8gYWxsb3cgZ2FyYmFnZSBjb2xsZWN0Ci0gICAgX3RhaWwgPSBfaW5jSW5kZXgoX3RhaWwpOwotICAgIF9zaXplLS07Ci0KLSAgICAvLyB5ZXMsIHdlIGFyZSB3YWtpbmcgdXAgYWxsIHRocmVhZHMsIGluY2x1ZGluZyB0aG9zZSB0aGF0IGFyZQotICAgIC8vIHdhaXRpbmcgdG8gZG8gYSByZW1vdmUuIFRoaXMgbWF5IGJlIGluZWZmaWNpZW50LgotICAgIC8vIG5vdGUgdGhhdCB3ZSBtdXN0IGRvIG5vdGlmeUFsbCgpIGFuZCBub3Qgbm90aWZ5KCkKLSAgICBub3RpZnlBbGwoKTsKLSAgICByZXR1cm4gcmVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgbXVsdGlwbGUgZWxlbWVudHMuIFRoaXMgbWV0aG9kIHdpbGwgYmxvY2sgdW50aWwgdGhlcmUgaXMgc29tZXRoaW5nCi0gICAqIHRvIHJlbW92ZS4KLSAgICogQHBhcmFtIGNvbGxlY3RvciBhbGwgdGhlIGVsZW1lbnRzIHJlbW92ZWQgZnJvbSB0aGlzIHF1ZXVlIGFyZSBhZGRlZCB0bwotICAgKiB0aGUgZW5kIG9mIHRoaXMgTGlzdC4KLSAgICogQHBhcmFtIGNvdW50IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0byByZW1vdmUuIElmIHRoaXMgaXMgemVybywKLSAgICogdGhlbiBpdCBkZWZhdWx0cyB0byB0aGUgbWF4aW11bSBzaXplIG9mIHRoaXMgcXVldWUuCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBlbGVtZW50cyBhY3R1YWxseSByZW1vdmVkLgotICAgKiBAc2VlICNyZW1vdmUoKQotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBpbnQgcmVtb3ZlKExpc3QgY29sbGVjdG9yLCBpbnQgY291bnQpCi0gICAgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uLCBJbGxlZ2FsU3RhdGVFeGNlcHRpb24KLSAgewotICAgIGNvbGxlY3Rvci5hZGQocmVtb3ZlKCkpOwotCi0gICAgaW50IHN6ID0gc2l6ZSgpKzE7Ci0gICAgaWYgKChjb3VudCA9PSAwKSB8fCAoY291bnQgPiBzeikpCi0gICAgICBjb3VudCA9IHN6OwotICAgIGVsc2UgaWYgKGNvdW50IDwgMCkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oImNvdW50IGlzIG5lZ2F0aXZlIik7Ci0KLSAgICBpbnQgcmVhZCA9IDE7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZm9yKDtyZWFkIDwgY291bnQ7IHJlYWQrKykKLSAgICAgIHsKLSAgICAgICAgY29sbGVjdG9yLmFkZChyZW1vdmUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoKElsbGVnYWxTdGF0ZUV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIHRoaXMgc2hvdWxkIG5vdCBoYXBwZW4gdW5sZXNzIHRoZSB1c2VyIGhhcyBzdWJjbGFzc2VkIHJlbW92ZSgpIGFuZAotICAgICAgLy8gZG9uZSBzb21ldGhpbmcgd2VpcmQKLSAgICB9Ci0gICAgY2F0Y2goSW50ZXJydXB0ZWRFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICAvLyB0aGlzIHNob3VsZCBub3QgaGFwcGVuIHVubGVzcyB0aGUgdXNlciBoYXMgc3ViY2xhc3NlZCByZW1vdmUoKSBhbmQKLSAgICAgIC8vIGRvbmUgc29tZXRoaW5nIHdlaXJkCi0KLSAgICAgIC8vIG1hcmsgdGhpcyB0aHJlYWQgYXMgaW50ZXJydXB0ZWQsIHNvIHRoYXQgaXQgZG9lc24ndCBibG9jayBhZ2Fpbi4KLSAgICAgIFRocmVhZC5jdXJyZW50VGhyZWFkKCkuaW50ZXJydXB0KCk7Ci0gICAgfQotICAgIHJldHVybiByZWFkOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX2luY0luZGV4KGludCBpbmRleCkKLSAgewotICAgIGluZGV4Kys7Ci0gICAgcmV0dXJuIChpbmRleCA8IF9idWYubGVuZ3RoKSA/IGluZGV4IDogMDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfY2hlY2tJc0Nsb3NlZCgpCi0gIHsKLSAgICBpZiAoaXNDbG9zZWQoKSkKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlF1ZXVlIGhhcyBiZWVuIGNsb3NlZCIpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBPYmplY3RbXSBfYnVmOwotICBwcml2YXRlIGJvb2xlYW4gX2Nsb3NlZCA9IGZhbHNlOwotICBwcml2YXRlIGludCBfc2l6ZSA9IDAsIF9oZWFkID0gMCwgX3RhaWwgPSAwOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvUmVkdWNlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9SZWR1Y2VyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMDI5ZTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9SZWR1Y2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlV3JpdGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLQotLyoqCi0gKiBSZWR1Y2VzIEphdmFTY3JpcHQgZmlsZXMgYnkgc3RyaXBwaW5nIGNvbW1lbnRzIGFuZCByZWR1bmRhbnQgd2hpdGVzcGFjZQotICogYW5kIHJlbmFtaW5nIGxvY2FsIHZhcmlhYmxlIG5hbWVzIHRvIHNob3J0ZXIgb25lcy4KLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBSZWR1Y2VyIGV4dGVuZHMgRmlsZVByb2Nlc3NvcgotewotICAvKioKLSAgICogY3JlYXRlcyBhIG5ldyBSZWR1Y2VyLgotICAgKiBAcGFyYW0gd2hpdGVzcGFjZUNvbW1lbnRzIGlmIHRydWUgcmVtb3ZlcyBjb21tZW50cyBhbmQgZXh0cmEgd2hpdGVzcGFjZQotICAgKiBAcGFyYW0gbG9jYWxWYXJzIGlmIHRydWUgcmVuYW1lcyBsb2NhbCB2YXJpYWJsZSBuYW1lcyB0byBzaG9ydGVyIG9uZXMuCi0gICAqLwotICBwdWJsaWMgUmVkdWNlcihib29sZWFuIHdoaXRlc3BhY2VDb21tZW50cywgYm9vbGVhbiBsb2NhbFZhcnMpCi0gIHsKLSAgICBzdXBlcigiLmpzIiwgZmFsc2UpOwotICAgIF9TVFJJUF9XSElURVNQQUNFX0NPTU1FTlRTID0gd2hpdGVzcGFjZUNvbW1lbnRzOwotICAgIF9SRU5BTUVfTE9DQUxfVkFSSUFCTEVTID0gbG9jYWxWYXJzOwotICB9Ci0KLSAgcHVibGljIFJlZHVjZXIoKQotICB7Ci0gICAgdGhpcyh0cnVlLCB0cnVlKTsKLSAgfQotCi0gIC8qKgotICAgKiByZWR1Y2VzIGEgSmF2YVNjcmlwdCBmaWxlLgotICAgKiBAcGFyYW0gaW4gdGhlIHNvdXJjZSB0byByZWFkIGZyb20KLSAgICogQHBhcmFtIG91dCB0aGUgc291cmNlIHRvIHdyaXRlIHRoZSByZWR1Y2VkIGZvcm0gdG8KLSAgICovCi0gIHB1YmxpYyB2b2lkIHByb2Nlc3MoQnVmZmVyZWRSZWFkZXIgaW4sIFByaW50V3JpdGVyIG91dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBUb2tlblJlYWRlciB0ciA9IG5ldyBUb2tlbml6ZXIoaW4pOwotICAgIGlmIChfU1RSSVBfV0hJVEVTUEFDRV9DT01NRU5UUykgdHIgPSBuZXcgRmlsdGVyMSh0cik7Ci0gICAgaWYgKF9SRU5BTUVfTE9DQUxfVkFSSUFCTEVTKSB0ciA9IG5ldyBGaWx0ZXIyKHRyKTsKLSAgICBEZXRva2VuaXplciBkZXRvayA9IG5ldyBEZXRva2VuaXplcihvdXQpOwotICAgIGZvcig7OykKLSAgICB7Ci0gICAgICBUb2tlbiB0b2sgPSB0ci5yZWFkKCk7Ci0gICAgICBpZiAodG9rPT1udWxsKSBicmVhazsKLSAgICAgIGVsc2UgZGV0b2sud3JpdGUodG9rKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHNlZSBGaWxlUHJvY2Vzc29yI3Byb2Nlc3NGaWxlKEZpbGUsIEZpbGUpCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzRmlsZShGaWxlIGluLCBGaWxlIG91dCkKLSAgICB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBCdWZmZXJlZFJlYWRlciByZWFkZXIgPSBuZXcgQnVmZmVyZWRSZWFkZXIobmV3IEZpbGVSZWFkZXIoaW4pKTsKLSAgICBQcmludFdyaXRlciB3cml0ZXIgPSAgbmV3IFByaW50V3JpdGVyKG5ldyBGaWxlV3JpdGVyKG91dCkpOwotICAgIHByb2Nlc3MocmVhZGVyLCB3cml0ZXIpOwotICAgIHdyaXRlci5jbG9zZSgpOwotICAgIHJlYWRlci5jbG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBfaGVscCgpCi0gIHsKLSAgICBTdHJpbmcgczsKLSAgICBzID0gIlJlZHVjZXMgSmF2YVNjcmlwdCBzb3VyY2UgY29kZVxuIiArCi0gICAgICAiVXNhZ2U6XG4iICsKLSAgICAgICJqYXZhIG9yYWNsZS51aXgudG9vbHMudWl4MjIuamF2YXNjcmlwdC5SZWR1Y2VyIiArCi0gICAgICAiIFstbm9yZW5hbWVdIFstd2hpdGVzcGFjZV0gWy1oZWxwXSBpbnB1dCBvdXRwdXQgXG4iICsKLSAgICAgICIgaW5wdXQvb3V0cHV0IGNhbiBiZSBlaXRoZXIgZmlsZXMgb3IgZGlyZWN0b3JpZXMuXG4iICsKLSAgICAgICIgRGlyZWN0b3JpZXMgd2lsbCBiZSBwcm9jZXNzZWQgcmVjdXJzaXZlbHkuXG4iICsKLSAgICAgICIgT25seSBmaWxlcyB3aXRoIG5hbWVzIHRoYXQgZW5kIHdpdGggLmpzIHdpbGwgYmUgcHJvY2Vzc2VkLlxuIiArCi0gICAgICAiIC1ub3JlbmFtZSBwcmV2ZW50cyByZW5hbWluZyBsb2NhbCB2YXJpYWJsZXMgdG8gc2hvcnQgb25lc1xuIiArCi0gICAgICAiIC13aGl0ZXNwYWNlIHByZXZlbnRzIHJlbW92aW5nIGNvbW1lbnRzIGFuZCBleHRyYSB3aGl0ZXNwYWNlXG4iICsKLSAgICAgICIgLWhlbHAgcHJpbnRzIHRoaXMgbWVzc2FnZS4iOwotICAgIFN5c3RlbS5vdXQucHJpbnRsbihzKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKFN0cmluZ1tdIGFyZ3MpCi0gIHsKLSAgICBib29sZWFuIHJlbmFtZSA9IHRydWU7Ci0gICAgYm9vbGVhbiBzcGFjZSA9IHRydWU7Ci0KLSAgICBmaW5hbCBpbnQgc3ogPSBhcmdzLmxlbmd0aC0yOwotCi0gICAgaWYgKHN6PDApCi0gICAgewotICAgICAgX2hlbHAoKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBmb3IoaW50IGk9MDsgaTxzejsgaSsrKQotICAgIHsKLSAgICAgIFN0cmluZyBzID0gYXJnc1tpXTsKLSAgICAgIGlmIChzLmVxdWFscygiLWhlbHAiKSkgX2hlbHAoKTsKLSAgICAgIGVsc2UgaWYgKHMuZXF1YWxzKCItbm9yZW5hbWUiKSkgcmVuYW1lID0gZmFsc2U7Ci0gICAgICBlbHNlIGlmIChzLmVxdWFscygiLXdoaXRlc3BhY2UiKSkgc3BhY2UgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVbmtub3duIG9wdGlvbjoiK3MpOwotICAgICAgICBfaGVscCgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgRmlsZSBpbiA9IG5ldyBGaWxlKGFyZ3Nbc3pdKTsKLSAgICBGaWxlIG91dCA9IG5ldyBGaWxlKGFyZ3Nbc3orMV0pOwotICAgIFJlZHVjZXIgcmVkdWNlciA9IG5ldyBSZWR1Y2VyKHNwYWNlLCByZW5hbWUpOwotICAgIHJlZHVjZXIucHJvY2Vzcyhpbiwgb3V0KTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgYm9vbGVhbiBfU1RSSVBfV0hJVEVTUEFDRV9DT01NRU5UUzsKLSAgcHJpdmF0ZSBmaW5hbCBib29sZWFuIF9SRU5BTUVfTE9DQUxfVkFSSUFCTEVTOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW4uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW4uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjNiMzQxMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotLyoqCi0gKiBUb2tlbnMgZm9yIEphdmFTY3JpcHQgc291cmNlIGNvZGUKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uJCkgJERhdGUkCi0gKi8KLXB1YmxpYyBjbGFzcyBUb2tlbgotewotCi0gIHB1YmxpYyBUb2tlbihpbnQgY29kZSwgaW50IGxpbmVOdW1iZXIpCi0gIHsKLSAgICB0aGlzKGNvZGUsIGxpbmVOdW1iZXIsIChjaGFyKSAwLCAoU3RyaW5nKSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbihpbnQgY29kZSwgaW50IGxpbmVOdW1iZXIsIGNoYXIgY2gpCi0gIHsKLSAgICB0aGlzKGNvZGUsIGxpbmVOdW1iZXIsIGNoLCAoU3RyaW5nKSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbihpbnQgY29kZSwgaW50IGxpbmVOdW1iZXIsIFN0cmluZyBzKQotICB7Ci0gICAgdGhpcyhjb2RlLCBsaW5lTnVtYmVyLCAoY2hhcikgMCwgcyk7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW4oaW50IGNvZGUsIGludCBsaW5lTnVtYmVyLCBjaGFyIGNoLCBTdHJpbmcgcykKLSAgewotICAgIHRoaXMuY29kZT1jb2RlOwotICAgIHRoaXMubGluZU51bWJlciA9IGxpbmVOdW1iZXI7Ci0gICAgdGhpcy5jaD1jaDsKLSAgICBzdHJpbmcgPSBzOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gIHsKLSAgICByZXR1cm4gIlRva2VuIGNvZGU6Iitjb2RlKyIgbGluZToiK2xpbmVOdW1iZXIrCi0gICAgICAiIGNoYXI6IitjaCsiIHN0cmluZzoiK3N0cmluZzsKLSAgfQotCi0gIHB1YmxpYyBmaW5hbCBpbnQgY29kZSwgbGluZU51bWJlcjsKLSAgcHVibGljIGZpbmFsIGNoYXIgY2g7Ci0gIHB1YmxpYyBmaW5hbCBTdHJpbmcgc3RyaW5nOwotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IEVPRiA9ICAgICAgICAgICAgICAgICAwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBORVdMSU5FID0gICAgICAgICAgICAgMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdISVRFU1BBQ0UgPSAgICAgICAgICAxMTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUEVSSU9EID0gICAgICAgICAgICAgIDEyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBTRU1JQ09MT04gPSAgICAgICAgICAgMTM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFFVT1RFRCA9ICAgICAgICAgICAgICAyMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTkFNRSA9ICAgICAgICAgICAgICAgIDMwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBOVU1CRVIgPSAgICAgICAgICAgICAgNDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTU1FTlQgPSAgICAgICAgICAgICA1MDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgUkVHVUxBUl9FWFAgPSAgICAgICAgIDYwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBSRUdVTEFSX0VYUF9NT0RJRklFUiA9NjU7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTlRST0wgPSAgICAgICAgICAgICAxMDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExFRlRfQlJBQ0UgPSAgICAgICAgICAxMTA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJJR0hUX0JSQUNFID0gICAgICAgICAxMjA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFJFU0VSVkVEID0gICAgICAgICAgICAyMDA7IC8vcmVzZXJ2ZWQgd29yZHMKLQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5CdWZmZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5CdWZmZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjYzAzMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuQnVmZmVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQSBidWZmZXIgdG8gaG9sZCBUb2tlbiBvYmplY3RzLiBUb2tlbnMgY2FuIGJlIHJlYWQgZnJvbSBhbmQgd3JpdHRlbiB0byB0aGlzCi0gKiBidWZmZXIgYXMgaWYgaXQgd2VyZSBhIHF1ZXVlLiBpdCBpcyB0aHJlYWQgc2FmZS4gQmVzdCBpZiBhIHNpbmdsZSB0aHJlYWQgaXMKLSAqIHJlYWRpbmcgYW5kIGEgc2luZ2xlIHRocmVhZCBpcyB3cml0aW5nLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFRva2VuQnVmZmVyIGV4dGVuZHMgUXVldWUgaW1wbGVtZW50cyBUb2tlblJlYWRlcgotewotCi0gIC8qKgotICAgKiBAcGFyYW0gYnVmZmVyU2l6ZSB0aGUgbWF4aW11bSBzaXplIG9mIHRoaXMgYnVmZmVyLgotICAgKi8KLSAgcHVibGljIFRva2VuQnVmZmVyKGludCBidWZmZXJTaXplKQotICB7Ci0gICAgc3VwZXIoYnVmZmVyU2l6ZSk7Ci0gIH0KLQotICBwdWJsaWMgVG9rZW5CdWZmZXIoKQotICB7Ci0gICAgdGhpcygxMDApOwotICB9Ci0KLSAgLyoqCi0gICAqIHJlYWRzIGEgVG9rZW4gZnJvbSB0aGlzIGJ1ZmZlci4gVGhpcyBtZXRob2QgYmxvY2tzIHVudGlsIGRhdGEgaXMgYXZhaWxhYmxlCi0gICAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYW5kIHRoaXMgYnVmZmVyIGhhcyBiZWVuIGNsb3NlZC4KLSAgICogQHNlZSBUb2tlblJlYWRlcgotICAgKi8KLSAgcHVibGljIHN5bmNocm9uaXplZCBUb2tlbiByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgVG9rZW4gdG9rOwotICAgIHRyeQotICAgIHsKLSAgICAgIHRvayA9IChUb2tlbikgc3VwZXIucmVtb3ZlKCk7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0b2sgPSBudWxsOwotICAgIH0KLQotICAgIGlmICh0b2s9PV9FWENFUFRJT05fVE9LRU4pCi0gICAgewotICAgICAgdGhyb3cgX2dldEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gdG9rOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoaXMgbWV0aG9kIGJsb2NrcyBpZiB0aGUgYnVmZmVyIGlzIGZ1bGwuCi0gICAqIEBwYXJhbSB0b2sgdGhlIHRva2VuIHRvIHdyaXRlIHRvIHRoaXMgYnVmZmVyCi0gICAqLwotICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoVG9rZW4gdG9rKSB0aHJvd3MgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHN1cGVyLmFkZCh0b2spOwotICB9Ci0KLSAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHdyaXRlKElPRXhjZXB0aW9uIGUpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgX3NldEV4Y2VwdGlvbihlKTsKLSAgICB3cml0ZShfRVhDRVBUSU9OX1RPS0VOKTsKLSAgICBjbG9zZSgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzeW5jaHJvbml6ZWQgdm9pZCBfc2V0RXhjZXB0aW9uKElPRXhjZXB0aW9uIGUpCi0gIHsKLSAgICBfZXhjZXB0aW9uID0gZTsKLSAgfQotCi0gIHByaXZhdGUgc3luY2hyb25pemVkIElPRXhjZXB0aW9uIF9nZXRFeGNlcHRpb24oKQotICB7Ci0gICAgcmV0dXJuIF9leGNlcHRpb247Ci0gIH0KLQotICBwcml2YXRlIElPRXhjZXB0aW9uIF9leGNlcHRpb24gPSBudWxsOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFRva2VuIF9FWENFUFRJT05fVE9LRU4gPSBuZXcgVG9rZW4oLTEsIDApOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5FeGNlcHRpb24uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxMGIwNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uamF2YXNjcmlwdC51aXh0b29sczsKLQotLyoqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgY2xhc3MgVG9rZW5FeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uCi17Ci0gIHByaXZhdGUgZmluYWwgVG9rZW4gX3Rva2VuOwotCi0gIHB1YmxpYyBUb2tlbkV4Y2VwdGlvbihUb2tlbiB0b2tlbiwgU3RyaW5nIG1lc3NhZ2UpCi0gIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgICBfdG9rZW4gPSB0b2tlbjsKLSAgfQotCi0gIHB1YmxpYyBUb2tlbiBnZXRUb2tlbigpCi0gIHsKLSAgICByZXR1cm4gX3Rva2VuOwotICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlblJlYWRlci5qYXZhIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qYXZhc2NyaXB0LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamF2YXNjcmlwdC91aXh0b29scy9Ub2tlblJlYWRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYTg2YTc1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5SZWFkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qYXZhc2NyaXB0LnVpeHRvb2xzOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbiQpICREYXRlJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFRva2VuUmVhZGVyCi17Ci0KLSAgLyoKLSAgICogUmVhZHMgYSBUb2tlbiBmcm9tIHRoaXMgc291cmNlLiBUaGlzIG1ldGhvZCB3aWxsIGJsb2NrIHVudGlsIGRhdGEKLSAgICogYmVjb21lcyBhdmFpbGFibGUuCi0gICAqIEByZXR1cm4gbnVsbCBpZiB0aGVyZSBpcyBubyBtb3JlIGRhdGEgYW5kIEVPRiBpcyByZWFjaGVkLgotICAgKi8KLSAgcHVibGljIFRva2VuIHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24sIEludGVycnVwdGVkRXhjZXB0aW9uOwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5pemVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qYXZhc2NyaXB0L3VpeHRvb2xzL1Rva2VuaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjdlYmU1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamF2YXNjcmlwdC1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2phdmFzY3JpcHQvdWl4dG9vbHMvVG9rZW5pemVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmphdmFzY3JpcHQudWl4dG9vbHM7Ci0KLWltcG9ydCBqYXZhLmlvLkJ1ZmZlcmVkUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQSBUb2tlbml6ZXIgZm9yIEphdmFTY3JpcHQgc291cmNlIGZpbGVzLgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb24kKSAkRGF0ZSQKLSAqLwotcHVibGljIGNsYXNzIFRva2VuaXplciBpbXBsZW1lbnRzIFRva2VuUmVhZGVyCi17Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBpbiB1c2VkIHRvIHJlYWQgZGF0YSBmcm9tIHRoZSBKUyBmaWxlCi0gICAqLwotICBwdWJsaWMgVG9rZW5pemVyKEJ1ZmZlcmVkUmVhZGVyIGluKQotICB7Ci0gICAgX2luID0gaW47Ci0gICAgUnVubmFibGUgcnVubmVyID0gbmV3IFJ1bm5hYmxlKCkKLSAgICAgIHsKLSAgICAgICAgcHVibGljIHZvaWQgcnVuKCkKLSAgICAgICAgewotICAgICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oIlRva2VuaXplcjogc3RhcnQ6IitUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgICBfcnVuKCk7Ci0gICAgICAgICAgLy95c3RlbS5vdXQucHJpbnRsbigiVG9rZW5pemVyOiBlbmQ6IitUaHJlYWQuY3VycmVudFRocmVhZCgpKTsKLSAgICAgICAgfQotICAgICAgfTsKLSAgICBuZXcgVGhyZWFkKHJ1bm5lcikuc3RhcnQoKTsKLSAgfQotCi0gIC8qKgotICAgKiByZWFkcyBhIFRva2VuLiBibG9ja3MgdW50aWwgYSBUb2tlbiBpcyBhdmFpbGFibGUuCi0gICAqIEByZXR1cm4gbnVsbCBpZiB0aGUgRU9GIGlzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgVG9rZW4gcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiwgSW50ZXJydXB0ZWRFeGNlcHRpb24KLSAgewotICAgIHJldHVybiBfb3V0LnJlYWQoKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcnVuKCkKLSAgewotICAgIHRyeQotICAgICAgewotICAgICAgICBfcnVuMigpOwotICAgICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICAgIHsKLSAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJFeGNlcHRpb24gcGFyc2luZyBsaW5lOiIrX2xpbmVOdW1iZXIpOwotICAgICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9ydW4yKCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBmb3IoO19maWxsQnVmZmVyKCk7KQotICAgICAgewotICAgICAgICAvL3lzdGVtLm91dC5wcmludGxuKCJiZWdpbiBwcm9jZXNzIik7Ci0gICAgICAgIF9wcm9jZXNzQnVmZmVyKCk7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImVuZCBwcm9jZXNzIik7Ci0gICAgICB9Ci0gICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5FT0YsIF9saW5lTnVtYmVyKSk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiRXhjZXB0aW9uIHBhcnNpbmcgbGluZToiK19saW5lTnVtYmVyKTsKLSAgICAgIF9vdXQud3JpdGUoZSk7Ci0gICAgfQotICAgIGNhdGNoIChFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgX291dC53cml0ZShuZXcgSU9FeGNlcHRpb24oIkV4Y2VwdGlvbiBwYXJzaW5nIGxpbmU6IitfbGluZU51bWJlcikpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgX291dC5jbG9zZSgpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcHJvY2Vzc0J1ZmZlcigpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgX29mZnNldCA9IDA7Ci0KLSAgICBmb3IoO19vZmZzZXQ8X2xlbjspCi0gICAgICB7Ci0gICAgICAgIC8veXN0ZW0ub3V0LnByaW50bG4oImxpbmU6IitfbGluZU51bWJlcisiIG9mZnNldDoiK19vZmZzZXQpOwotICAgICAgICBjaGFyIGNoID0gX2J1ZmZlci5jaGFyQXQoX29mZnNldCsrKTsKLSAgICAgICAgc3dpdGNoKF9zdGF0dXMpCi0gICAgICAgICAgewotICAgICAgICAgIGNhc2UgUk9PVF9NT0RFIDoKLSAgICAgICAgICBjYXNlIERJVklTSU9OX01PREUgOgotICAgICAgICAgICAgX25leHQgPSBfcm9vdE1vZGUoY2gsIF9zdGF0dXMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBSRUFEX1dPUkRfTU9ERSA6Ci0gICAgICAgICAgICBfbmV4dCA9IF9yZWFkV29yZE1vZGUoY2gsIF9zdGF0dXMsIF9zdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBRVU9URTFfTU9ERSA6Ci0gICAgICAgICAgY2FzZSBRVU9URTJfTU9ERSA6Ci0gICAgICAgICAgICBfbmV4dCA9IF9xdW90ZU1vZGUoY2gsIF9zdGF0dXMsIF9wcmV2LCBfc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRVNDQVBFRF9DSEFSX01PREUgOgotICAgICAgICAgICAgX3N0ci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICBfc3RyLmFwcGVuZChjaCk7Ci0gICAgICAgICAgICBfbmV4dCA9IF9wcmV2OwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBQT1NTSUJMRV9DT01NRU5UX01PREUgOgotICAgICAgICAgICAgaWYgKGNoPT0nLycpIF9uZXh0ID0gQ09NTUVOVDFfTU9ERTsKLSAgICAgICAgICAgIGVsc2UgaWYgKGNoPT0nKicpIF9uZXh0ID0gQ09NTUVOVDJfTU9ERTsKLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9vZmZzZXQtLTsgLy9Sb2xsIEJhY2sgb25lCi0gICAgICAgICAgICAgICAgaWYgKF9wcmV2ID09IERJVklTSU9OX01PREUpCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIF93cml0ZUNvbnRyb2woJy8nKTsKLSAgICAgICAgICAgICAgICAgICAgX25leHQgPSBST09UX01PREU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBfbmV4dCA9IFJFR1VMQVJfRVhQX01PREU7Ci0gICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgQ09NTUVOVDFfTU9ERSA6Ci0gICAgICAgICAgY2FzZSBDT01NRU5UMl9NT0RFIDoKLSAgICAgICAgICBjYXNlIEVORF9DT01NRU5UX01PREUgOgotICAgICAgICAgICAgX25leHQgPSBfY29tbWVudE1vZGUoY2gsIF9zdGF0dXMsIF9zdHIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBSRUdVTEFSX0VYUF9NT0RFIDoKLSAgICAgICAgICAgIF9uZXh0ID0gX3JlZ3VsYXJFeHBNb2RlKGNoLCBfc3RyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgRU5EX1JFR1VMQVJfRVhQX01PREUgOgotICAgICAgICAgICAgaWYgKChjaD09J2cnKSB8fCAoY2g9PSdpJykpCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5SRUdVTEFSX0VYUF9NT0RJRklFUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbGluZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaCkpOwotICAgICAgICAgICAgICAgIF9uZXh0ID0gRU5EX1JFR1VMQVJfRVhQX01PREU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIF9vZmZzZXQtLTsgLy9Sb2xsYmFjawotICAgICAgICAgICAgICAgIF9uZXh0ID0gUk9PVF9NT0RFOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIF9wcmV2ID0gX3N0YXR1czsKLSAgICAgICAgX3N0YXR1cyA9IF9uZXh0OwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3Jvb3RNb2RlKGNoYXIgY2gsIGludCBzdGF0dXMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgc3dpdGNoKGNoKQotICAgICAgewotICAgICAgY2FzZSAnXCcnIDoKLSAgICAgICAgcmV0dXJuIFFVT1RFMV9NT0RFOwotICAgICAgY2FzZSAnXCInIDoKLSAgICAgICAgcmV0dXJuIFFVT1RFMl9NT0RFOwotICAgICAgY2FzZSAnICcgIDoKLSAgICAgIGNhc2UgJ1x0JyA6Ci0gICAgICAgIF9vdXQud3JpdGUoV0hJVEVTUEFDRSk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICBjYXNlICdcbicgOgotICAgICAgICBfb3V0LndyaXRlKE5FV0xJTkUpOwotICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgY2FzZSAnLicgOgotICAgICAgICBfb3V0LndyaXRlKFBFUklPRCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICBjYXNlICc7JyA6Ci0gICAgICAgIF9vdXQud3JpdGUoU0VNSUNPTE9OKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIGNhc2UgJygnIDoKLSAgICAgIGNhc2UgJ3snIDoKLSAgICAgIGNhc2UgJ1snIDoKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uTEVGVF9CUkFDRSwgX2xpbmVOdW1iZXIsIGNoKSk7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICBjYXNlICcpJyA6Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlJJR0hUX0JSQUNFLCBfbGluZU51bWJlciwgY2gpKTsKLSAgICAgICAgcmV0dXJuIERJVklTSU9OX01PREU7Ci0gICAgICBjYXNlICd9JyA6Ci0gICAgICBjYXNlICddJyA6Ci0gICAgICAgIF9vdXQud3JpdGUobmV3IFRva2VuKFRva2VuLlJJR0hUX0JSQUNFLCBfbGluZU51bWJlciwgY2gpKTsKLSAgICAgICAgcmV0dXJuIFJPT1RfTU9ERTsKLSAgICAgIGNhc2UgJy8nICA6IHJldHVybiBQT1NTSUJMRV9DT01NRU5UX01PREU7Ci0gICAgICBkZWZhdWx0IDoKLSAgICAgICAgaWYgKF9pc0FscGhhTnVtZXJpYyhjaCkpCi0gICAgICAgICAgewotICAgICAgICAgICAgX29mZnNldC0tOyAvL1JvbGxiYWNrCi0gICAgICAgICAgICByZXR1cm4gUkVBRF9XT1JEX01PREU7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgX3dyaXRlQ29udHJvbChjaCk7Ci0gICAgICAgICAgICByZXR1cm4gUk9PVF9NT0RFOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50IF9yZWd1bGFyRXhwTW9kZShjaGFyIGNoLCBTdHJpbmdCdWZmZXIgcmVnRXhwKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgc3dpdGNoKGNoKQotICAgICAgewotICAgICAgY2FzZSAnXFwnIDoKLSAgICAgICAgcmV0dXJuIEVTQ0FQRURfQ0hBUl9NT0RFOwotICAgICAgY2FzZSAnLycgOgotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5SRUdVTEFSX0VYUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2xpbmVOdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZ0V4cC50b1N0cmluZygpKSk7Ci0gICAgICAgIHJlZ0V4cC5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIHJldHVybiBFTkRfUkVHVUxBUl9FWFBfTU9ERTsKLSAgICAgIGRlZmF1bHQgOgotICAgICAgICByZWdFeHAuYXBwZW5kKGNoKTsKLSAgICAgICAgcmV0dXJuIFJFR1VMQVJfRVhQX01PREU7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfcXVvdGVNb2RlKGNoYXIgY2gsIGludCBzdGF0dXMsIGludCBwcmV2LAotICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBxdW90ZVN0cmluZykgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoKChjaD09J1wnJykgJiYgKHN0YXR1cz09UVVPVEUxX01PREUpKSB8fAotICAgICAgICAoKGNoPT0nXCInKSAmJiAoc3RhdHVzPT1RVU9URTJfTU9ERSkpKQotICAgICAgewotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5RVU9URUQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9saW5lTnVtYmVyLCBjaCwgcXVvdGVTdHJpbmcudG9TdHJpbmcoKSkpOwotICAgICAgICBxdW90ZVN0cmluZy5zZXRMZW5ndGgoMCk7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICB9Ci0gICAgZWxzZSBpZiAoY2g9PSdcXCcpIHJldHVybiBFU0NBUEVEX0NIQVJfTU9ERTsKLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHF1b3RlU3RyaW5nLmFwcGVuZChjaCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfY29tbWVudE1vZGUoY2hhciBjaCwgaW50IHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ0J1ZmZlciBjb21tZW50U3RyaW5nKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKHN0YXR1cz09RU5EX0NPTU1FTlRfTU9ERSkKLSAgICAgIHsKLSAgICAgICAgaWYgKGNoPT0nLycpCi0gICAgICAgICAgewotICAgICAgICAgICAgX3dyaXRlQ29tbWVudChjb21tZW50U3RyaW5nKTsKLSAgICAgICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICAgICAgfQotICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgY29tbWVudFN0cmluZy5hcHBlbmQoJyonKTsKLSAgICAgICAgICAgIF9vZmZzZXQtLTsgLy9Sb2xsIGJhY2sKLSAgICAgICAgICAgIHJldHVybiBDT01NRU5UMl9NT0RFOwotICAgICAgICAgIH0KLSAgICAgIH0KLSAgICBlbHNlIGlmICgoc3RhdHVzPT1DT01NRU5UMl9NT0RFKSAmJiAoY2g9PScqJykpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiBFTkRfQ09NTUVOVF9NT0RFOwotICAgICAgfQotICAgIGVsc2UgaWYgKChzdGF0dXM9PUNPTU1FTlQxX01PREUpICYmIChjaD09J1xuJykpCi0gICAgICB7Ci0gICAgICAgIF93cml0ZUNvbW1lbnQoY29tbWVudFN0cmluZyk7Ci0gICAgICAgIF9vdXQud3JpdGUoTkVXTElORSk7Ci0gICAgICAgIHJldHVybiBST09UX01PREU7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotICAgICAgICBjb21tZW50U3RyaW5nLmFwcGVuZChjaCk7Ci0gICAgICAgIHJldHVybiBzdGF0dXM7Ci0gICAgICB9Ci0gIH0KLQotICBwcml2YXRlIGludCBfcmVhZFdvcmRNb2RlKGNoYXIgY2gsIGludCBzdGF0dXMsIFN0cmluZ0J1ZmZlciB3b3JkQnVmZmVyKQotICAgIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKF9pc0FscGhhTnVtZXJpYyhjaCkpCi0gICAgICB7Ci0gICAgICAgIHdvcmRCdWZmZXIuYXBwZW5kKGNoKTsKLSAgICAgICAgcmV0dXJuIHN0YXR1czsKLSAgICAgIH0KLSAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIF93cml0ZUFscGhhTnVtZXJpYyh3b3JkQnVmZmVyLnRvU3RyaW5nKCkpOwotICAgICAgICB3b3JkQnVmZmVyLnNldExlbmd0aCgwKTsKLSAgICAgICAgX29mZnNldC0tOyAvL1JvbGxiYWNrCi0gICAgICAgIHJldHVybiBESVZJU0lPTl9NT0RFOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbW1lbnQoU3RyaW5nQnVmZmVyIHMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uQ09NTUVOVCwgX2xpbmVOdW1iZXIsIHMudG9TdHJpbmcoKSkpOwotICAgIHMuc2V0TGVuZ3RoKDApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbnRyb2woY2hhciBjaCkgdGhyb3dzIEludGVycnVwdGVkRXhjZXB0aW9uCi0gIHsKLSAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5DT05UUk9MLCBfbGluZU51bWJlciwgY2gpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVBbHBoYU51bWVyaWMoU3RyaW5nIHMpIHRocm93cyBJbnRlcnJ1cHRlZEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KHMuY2hhckF0KDApKSkKLSAgICAgIHsKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uTlVNQkVSLCBfbGluZU51bWJlciwgcykpOwotICAgICAgfQotICAgIGVsc2UgaWYgKF9pc1Jlc2VydmVkS2V5d29yZChzKSkKLSAgICAgIHsKLSAgICAgICAgX291dC53cml0ZShuZXcgVG9rZW4oVG9rZW4uUkVTRVJWRUQsIF9saW5lTnVtYmVyLCBzKSk7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotICAgICAgICBfb3V0LndyaXRlKG5ldyBUb2tlbihUb2tlbi5OQU1FLCBfbGluZU51bWJlciwgcykpOwotICAgICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9pc1Jlc2VydmVkS2V5d29yZChTdHJpbmcgcykKLSAgewotICAgIGZvcihpbnQgaT0wOyBpPHJlc2VydmVkV29yZHMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChzLmVxdWFscyhyZXNlcnZlZFdvcmRzW2ldKSkgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBib29sZWFuIF9pc0FscGhhTnVtZXJpYyhjaGFyIGNoKQotICB7Ci0gICAgcmV0dXJuIENoYXJhY3Rlci5pc0xldHRlck9yRGlnaXQoY2gpIHx8IChjaD09J18nKSA7Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBmYWxzZSBpZiBFT0YKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBfZmlsbEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgX2J1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgU3RyaW5nIHMgPSBfaW4ucmVhZExpbmUoKTsKLSAgICBpZiAocz09bnVsbCkKLSAgICAgIHsKLSAgICAgICAgX2xlbj0wOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgZWxzZQotICAgICAgewotICAgICAgICBfYnVmZmVyLmFwcGVuZChzKS5hcHBlbmQoJ1xuJyk7Ci0gICAgICAgIF9sZW4gPSBfYnVmZmVyLmxlbmd0aCgpOwotICAgICAgICBfbGluZU51bWJlcisrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcmVzZXQoKQotICB7Ci0gICAgX3N0YXR1cyA9IF9wcmV2ID0gX25leHQgPSBST09UX01PREU7Ci0gICAgX2J1ZmZlci5zZXRMZW5ndGgoMCk7Ci0gICAgX2xlbiA9IF9saW5lTnVtYmVyID0gX29mZnNldCA9IDA7Ci0gICAgX3dvcmRCdWZmZXIuc2V0TGVuZ3RoKDApOwotICAgIF9zdHIuc2V0TGVuZ3RoKDApOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgX3N0YXR1cyA9IFJPT1RfTU9ERTsKLSAgcHJpdmF0ZSBpbnQgX3ByZXYgPSBST09UX01PREU7Ci0gIHByaXZhdGUgaW50IF9uZXh0ID0gUk9PVF9NT0RFOwotCi0gIHByaXZhdGUgaW50IF9sZW4gPSAwOwotICBwcml2YXRlIGludCBfbGluZU51bWJlciA9IDA7Ci0gIHByaXZhdGUgaW50IF9vZmZzZXQgPSAwOwotCi0gIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIF9idWZmZXIgPSBuZXcgU3RyaW5nQnVmZmVyKCk7Ci0gIHByaXZhdGUgZmluYWwgU3RyaW5nQnVmZmVyIF93b3JkQnVmZmVyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1ZmZlciBfc3RyID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotCi0gIHByaXZhdGUgZmluYWwgQnVmZmVyZWRSZWFkZXIgX2luOwotICBwcml2YXRlIGZpbmFsIFRva2VuQnVmZmVyIF9vdXQgPSBuZXcgVG9rZW5CdWZmZXIoKTsKLQotICAvKioKLSAgICogVGhlc2UgYXJlIG5vdCBhbGwgdGhlIHJlc2VydmVkIHdvcmRzIGluIEpTIGJ1dCBhcmUgdGhlIG9ubHkgb25lcwotICAgKiBpbXBvcnRhbnQgdG8gdGhlIGZpbHRlcnMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmdbXSByZXNlcnZlZFdvcmRzID0KLSAgewotICAgICJmdW5jdGlvbiIsICJ2YXIiCi0gIH07Ci0KLSAgcHJpdmF0ZSBmaW5hbCBUb2tlbiBORVdMSU5FID0gbmV3IFRva2VuKFRva2VuLk5FV0xJTkUsIDApOwotICBwcml2YXRlIGZpbmFsIFRva2VuIFdISVRFU1BBQ0UgPSBuZXcgVG9rZW4oVG9rZW4uV0hJVEVTUEFDRSwgMCk7Ci0gIHByaXZhdGUgZmluYWwgVG9rZW4gUEVSSU9EID0gbmV3IFRva2VuKFRva2VuLlBFUklPRCwgMCk7Ci0gIHByaXZhdGUgZmluYWwgVG9rZW4gU0VNSUNPTE9OID0gbmV3IFRva2VuKFRva2VuLlNFTUlDT0xPTiwgMCk7Ci0KLSAgLyoqCi0gICAqIFRoZXNlIGFyZSB0aGUgRlNNIHN0YXRlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFJPT1RfTU9ERSA9IDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUFEX1dPUkRfTU9ERSA9IDEwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgRElWSVNJT05fTU9ERSA9IDE1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUVVPVEUxX01PREUgPSAyMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFFVT1RFMl9NT0RFID0gMzA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFU0NBUEVEX0NIQVJfTU9ERSA9IDQwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgUE9TU0lCTEVfQ09NTUVOVF9NT0RFID0gNTA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NRU5UMV9NT0RFID0gNjA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBDT01NRU5UMl9NT0RFID0gNzA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfQ09NTUVOVF9NT0RFID0gODA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBSRUdVTEFSX0VYUF9NT0RFID0gOTA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFTkRfUkVHVUxBUl9FWFBfTU9ERSA9IDk1OwotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTElDRU5TRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwyMDIgKzAsMCBAQAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcGFjaGUgTGljZW5zZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNAotICAgICAgICAgICAgICAgICAgICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzLwotCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04KLQotICAgMS4gRGVmaW5pdGlvbnMuCi0KLSAgICAgICJMaWNlbnNlIiBzaGFsbCBtZWFuIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBmb3IgdXNlLCByZXByb2R1Y3Rpb24sCi0gICAgICBhbmQgZGlzdHJpYnV0aW9uIGFzIGRlZmluZWQgYnkgU2VjdGlvbnMgMSB0aHJvdWdoIDkgb2YgdGhpcyBkb2N1bWVudC4KLQotICAgICAgIkxpY2Vuc29yIiBzaGFsbCBtZWFuIHRoZSBjb3B5cmlnaHQgb3duZXIgb3IgZW50aXR5IGF1dGhvcml6ZWQgYnkKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIgdGhhdCBpcyBncmFudGluZyB0aGUgTGljZW5zZS4KLQotICAgICAgIkxlZ2FsIEVudGl0eSIgc2hhbGwgbWVhbiB0aGUgdW5pb24gb2YgdGhlIGFjdGluZyBlbnRpdHkgYW5kIGFsbAotICAgICAgb3RoZXIgZW50aXRpZXMgdGhhdCBjb250cm9sLCBhcmUgY29udHJvbGxlZCBieSwgb3IgYXJlIHVuZGVyIGNvbW1vbgotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwKLSAgICAgICJjb250cm9sIiBtZWFucyAoaSkgdGhlIHBvd2VyLCBkaXJlY3Qgb3IgaW5kaXJlY3QsIHRvIGNhdXNlIHRoZQotICAgICAgZGlyZWN0aW9uIG9yIG1hbmFnZW1lbnQgb2Ygc3VjaCBlbnRpdHksIHdoZXRoZXIgYnkgY29udHJhY3Qgb3IKLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQotICAgICAgb3V0c3RhbmRpbmcgc2hhcmVzLCBvciAoaWlpKSBiZW5lZmljaWFsIG93bmVyc2hpcCBvZiBzdWNoIGVudGl0eS4KLQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQotICAgICAgZXhlcmNpc2luZyBwZXJtaXNzaW9ucyBncmFudGVkIGJ5IHRoaXMgTGljZW5zZS4KLQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsCi0gICAgICBpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIHNvZnR3YXJlIHNvdXJjZSBjb2RlLCBkb2N1bWVudGF0aW9uCi0gICAgICBzb3VyY2UsIGFuZCBjb25maWd1cmF0aW9uIGZpbGVzLgotCi0gICAgICAiT2JqZWN0IiBmb3JtIHNoYWxsIG1lYW4gYW55IGZvcm0gcmVzdWx0aW5nIGZyb20gbWVjaGFuaWNhbAotICAgICAgdHJhbnNmb3JtYXRpb24gb3IgdHJhbnNsYXRpb24gb2YgYSBTb3VyY2UgZm9ybSwgaW5jbHVkaW5nIGJ1dAotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLAotICAgICAgYW5kIGNvbnZlcnNpb25zIHRvIG90aGVyIG1lZGlhIHR5cGVzLgotCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcgotICAgICAgT2JqZWN0IGZvcm0sIG1hZGUgYXZhaWxhYmxlIHVuZGVyIHRoZSBMaWNlbnNlLCBhcyBpbmRpY2F0ZWQgYnkgYQotICAgICAgY29weXJpZ2h0IG5vdGljZSB0aGF0IGlzIGluY2x1ZGVkIGluIG9yIGF0dGFjaGVkIHRvIHRoZSB3b3JrCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLgotCi0gICAgICAiRGVyaXZhdGl2ZSBXb3JrcyIgc2hhbGwgbWVhbiBhbnkgd29yaywgd2hldGhlciBpbiBTb3VyY2Ugb3IgT2JqZWN0Ci0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlCi0gICAgICBlZGl0b3JpYWwgcmV2aXNpb25zLCBhbm5vdGF0aW9ucywgZWxhYm9yYXRpb25zLCBvciBvdGhlciBtb2RpZmljYXRpb25zCi0gICAgICByZXByZXNlbnQsIGFzIGEgd2hvbGUsIGFuIG9yaWdpbmFsIHdvcmsgb2YgYXV0aG9yc2hpcC4gRm9yIHRoZSBwdXJwb3NlcwotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluCi0gICAgICBzZXBhcmFibGUgZnJvbSwgb3IgbWVyZWx5IGxpbmsgKG9yIGJpbmQgYnkgbmFtZSkgdG8gdGhlIGludGVyZmFjZXMgb2YsCi0gICAgICB0aGUgV29yayBhbmQgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLgotCi0gICAgICAiQ29udHJpYnV0aW9uIiBzaGFsbCBtZWFuIGFueSB3b3JrIG9mIGF1dGhvcnNoaXAsIGluY2x1ZGluZwotICAgICAgdGhlIG9yaWdpbmFsIHZlcnNpb24gb2YgdGhlIFdvcmsgYW5kIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucwotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5Ci0gICAgICBzdWJtaXR0ZWQgdG8gTGljZW5zb3IgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yayBieSB0aGUgY29weXJpZ2h0IG93bmVyCi0gICAgICBvciBieSBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eSBhdXRob3JpemVkIHRvIHN1Ym1pdCBvbiBiZWhhbGYgb2YKLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIgotICAgICAgbWVhbnMgYW55IGZvcm0gb2YgZWxlY3Ryb25pYywgdmVyYmFsLCBvciB3cml0dGVuIGNvbW11bmljYXRpb24gc2VudAotICAgICAgdG8gdGhlIExpY2Vuc29yIG9yIGl0cyByZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsCi0gICAgICBhbmQgaXNzdWUgdHJhY2tpbmcgc3lzdGVtcyB0aGF0IGFyZSBtYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIHRoZQotICAgICAgTGljZW5zb3IgZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZyB0aGUgV29yaywgYnV0Ci0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQotICAgICAgZGVzaWduYXRlZCBpbiB3cml0aW5nIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIgYXMgIk5vdCBhIENvbnRyaWJ1dGlvbi4iCi0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBvbiBiZWhhbGYgb2Ygd2hvbSBhIENvbnRyaWJ1dGlvbiBoYXMgYmVlbiByZWNlaXZlZCBieSBMaWNlbnNvciBhbmQKLSAgICAgIHN1YnNlcXVlbnRseSBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrLgotCi0gICAyLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICBjb3B5cmlnaHQgbGljZW5zZSB0byByZXByb2R1Y2UsIHByZXBhcmUgRGVyaXZhdGl2ZSBXb3JrcyBvZiwKLSAgICAgIHB1YmxpY2x5IGRpc3BsYXksIHB1YmxpY2x5IHBlcmZvcm0sIHN1YmxpY2Vuc2UsIGFuZCBkaXN0cmlidXRlIHRoZQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4KLQotICAgMy4gR3JhbnQgb2YgUGF0ZW50IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsCi0gICAgICB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZQotICAgICAgKGV4Y2VwdCBhcyBzdGF0ZWQgaW4gdGhpcyBzZWN0aW9uKSBwYXRlbnQgbGljZW5zZSB0byBtYWtlLCBoYXZlIG1hZGUsCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywKLSAgICAgIHdoZXJlIHN1Y2ggbGljZW5zZSBhcHBsaWVzIG9ubHkgdG8gdGhvc2UgcGF0ZW50IGNsYWltcyBsaWNlbnNhYmxlCi0gICAgICBieSBzdWNoIENvbnRyaWJ1dG9yIHRoYXQgYXJlIG5lY2Vzc2FyaWx5IGluZnJpbmdlZCBieSB0aGVpcgotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQotICAgICAgd2l0aCB0aGUgV29yayB0byB3aGljaCBzdWNoIENvbnRyaWJ1dGlvbihzKSB3YXMgc3VibWl0dGVkLiBJZiBZb3UKLSAgICAgIGluc3RpdHV0ZSBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IGFueSBlbnRpdHkgKGluY2x1ZGluZyBhCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrCi0gICAgICBvciBhIENvbnRyaWJ1dGlvbiBpbmNvcnBvcmF0ZWQgd2l0aGluIHRoZSBXb3JrIGNvbnN0aXR1dGVzIGRpcmVjdAotICAgICAgb3IgY29udHJpYnV0b3J5IHBhdGVudCBpbmZyaW5nZW1lbnQsIHRoZW4gYW55IHBhdGVudCBsaWNlbnNlcwotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlCi0gICAgICBhcyBvZiB0aGUgZGF0ZSBzdWNoIGxpdGlnYXRpb24gaXMgZmlsZWQuCi0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlCi0gICAgICBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiBpbiBhbnkgbWVkaXVtLCB3aXRoIG9yIHdpdGhvdXQKLSAgICAgIG1vZGlmaWNhdGlvbnMsIGFuZCBpbiBTb3VyY2Ugb3IgT2JqZWN0IGZvcm0sIHByb3ZpZGVkIHRoYXQgWW91Ci0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoKLQotICAgICAgKGEpIFlvdSBtdXN0IGdpdmUgYW55IG90aGVyIHJlY2lwaWVudHMgb2YgdGhlIFdvcmsgb3IKLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZAotCi0gICAgICAoYikgWW91IG11c3QgY2F1c2UgYW55IG1vZGlmaWVkIGZpbGVzIHRvIGNhcnJ5IHByb21pbmVudCBub3RpY2VzCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kCi0KLSAgICAgIChjKSBZb3UgbXVzdCByZXRhaW4sIGluIHRoZSBTb3VyY2UgZm9ybSBvZiBhbnkgRGVyaXZhdGl2ZSBXb3JrcwotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQKLSAgICAgICAgICBhdHRyaWJ1dGlvbiBub3RpY2VzIGZyb20gdGhlIFNvdXJjZSBmb3JtIG9mIHRoZSBXb3JrLAotICAgICAgICAgIGV4Y2x1ZGluZyB0aG9zZSBub3RpY2VzIHRoYXQgZG8gbm90IHBlcnRhaW4gdG8gYW55IHBhcnQgb2YKLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kCi0KLSAgICAgIChkKSBJZiB0aGUgV29yayBpbmNsdWRlcyBhICJOT1RJQ0UiIHRleHQgZmlsZSBhcyBwYXJ0IG9mIGl0cwotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QKLSAgICAgICAgICBpbmNsdWRlIGEgcmVhZGFibGUgY29weSBvZiB0aGUgYXR0cmlidXRpb24gbm90aWNlcyBjb250YWluZWQKLSAgICAgICAgICB3aXRoaW4gc3VjaCBOT1RJQ0UgZmlsZSwgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QKLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUKLSAgICAgICAgICBvZiB0aGUgZm9sbG93aW5nIHBsYWNlczogd2l0aGluIGEgTk9USUNFIHRleHQgZmlsZSBkaXN0cmlidXRlZAotICAgICAgICAgIGFzIHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3M7IHdpdGhpbiB0aGUgU291cmNlIGZvcm0gb3IKLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwKLSAgICAgICAgICB3aXRoaW4gYSBkaXNwbGF5IGdlbmVyYXRlZCBieSB0aGUgRGVyaXZhdGl2ZSBXb3JrcywgaWYgYW5kCi0gICAgICAgICAgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBub3RpY2VzIG5vcm1hbGx5IGFwcGVhci4gVGhlIGNvbnRlbnRzCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZAotICAgICAgICAgIGRvIG5vdCBtb2RpZnkgdGhlIExpY2Vuc2UuIFlvdSBtYXkgYWRkIFlvdXIgb3duIGF0dHJpYnV0aW9uCi0gICAgICAgICAgbm90aWNlcyB3aXRoaW4gRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlLCBhbG9uZ3NpZGUKLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQKLSAgICAgICAgICB0aGF0IHN1Y2ggYWRkaXRpb25hbCBhdHRyaWJ1dGlvbiBub3RpY2VzIGNhbm5vdCBiZSBjb25zdHJ1ZWQKLSAgICAgICAgICBhcyBtb2RpZnlpbmcgdGhlIExpY2Vuc2UuCi0KLSAgICAgIFlvdSBtYXkgYWRkIFlvdXIgb3duIGNvcHlyaWdodCBzdGF0ZW1lbnQgdG8gWW91ciBtb2RpZmljYXRpb25zIGFuZAotICAgICAgbWF5IHByb3ZpZGUgYWRkaXRpb25hbCBvciBkaWZmZXJlbnQgbGljZW5zZSB0ZXJtcyBhbmQgY29uZGl0aW9ucwotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcgotICAgICAgZm9yIGFueSBzdWNoIERlcml2YXRpdmUgV29ya3MgYXMgYSB3aG9sZSwgcHJvdmlkZWQgWW91ciB1c2UsCi0gICAgICByZXByb2R1Y3Rpb24sIGFuZCBkaXN0cmlidXRpb24gb2YgdGhlIFdvcmsgb3RoZXJ3aXNlIGNvbXBsaWVzIHdpdGgKLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuCi0KLSAgIDUuIFN1Ym1pc3Npb24gb2YgQ29udHJpYnV0aW9ucy4gVW5sZXNzIFlvdSBleHBsaWNpdGx5IHN0YXRlIG90aGVyd2lzZSwKLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yawotICAgICAgYnkgWW91IHRvIHRoZSBMaWNlbnNvciBzaGFsbCBiZSB1bmRlciB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgd2l0aG91dCBhbnkgYWRkaXRpb25hbCB0ZXJtcyBvciBjb25kaXRpb25zLgotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQotICAgICAgdGhlIHRlcm1zIG9mIGFueSBzZXBhcmF0ZSBsaWNlbnNlIGFncmVlbWVudCB5b3UgbWF5IGhhdmUgZXhlY3V0ZWQKLSAgICAgIHdpdGggTGljZW5zb3IgcmVnYXJkaW5nIHN1Y2ggQ29udHJpYnV0aW9ucy4KLQotICAgNi4gVHJhZGVtYXJrcy4gVGhpcyBMaWNlbnNlIGRvZXMgbm90IGdyYW50IHBlcm1pc3Npb24gdG8gdXNlIHRoZSB0cmFkZQotICAgICAgbmFtZXMsIHRyYWRlbWFya3MsIHNlcnZpY2UgbWFya3MsIG9yIHByb2R1Y3QgbmFtZXMgb2YgdGhlIExpY2Vuc29yLAotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlCi0gICAgICBvcmlnaW4gb2YgdGhlIFdvcmsgYW5kIHJlcHJvZHVjaW5nIHRoZSBjb250ZW50IG9mIHRoZSBOT1RJQ0UgZmlsZS4KLQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yCi0gICAgICBhZ3JlZWQgdG8gaW4gd3JpdGluZywgTGljZW5zb3IgcHJvdmlkZXMgdGhlIFdvcmsgKGFuZCBlYWNoCi0gICAgICBDb250cmlidXRvciBwcm92aWRlcyBpdHMgQ29udHJpYnV0aW9ucykgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcgotICAgICAgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yIGNvbmRpdGlvbnMKLSAgICAgIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQotICAgICAgYXBwcm9wcmlhdGVuZXNzIG9mIHVzaW5nIG9yIHJlZGlzdHJpYnV0aW5nIHRoZSBXb3JrIGFuZCBhc3N1bWUgYW55Ci0gICAgICByaXNrcyBhc3NvY2lhdGVkIHdpdGggWW91ciBleGVyY2lzZSBvZiBwZXJtaXNzaW9ucyB1bmRlciB0aGlzIExpY2Vuc2UuCi0KLSAgIDguIExpbWl0YXRpb24gb2YgTGlhYmlsaXR5LiBJbiBubyBldmVudCBhbmQgdW5kZXIgbm8gbGVnYWwgdGhlb3J5LAotICAgICAgd2hldGhlciBpbiB0b3J0IChpbmNsdWRpbmcgbmVnbGlnZW5jZSksIGNvbnRyYWN0LCBvciBvdGhlcndpc2UsCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQotICAgICAgbmVnbGlnZW50IGFjdHMpIG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzaGFsbCBhbnkgQ29udHJpYnV0b3IgYmUKLSAgICAgIGxpYWJsZSB0byBZb3UgZm9yIGRhbWFnZXMsIGluY2x1ZGluZyBhbnkgZGlyZWN0LCBpbmRpcmVjdCwgc3BlY2lhbCwKLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQotICAgICAgcmVzdWx0IG9mIHRoaXMgTGljZW5zZSBvciBvdXQgb2YgdGhlIHVzZSBvciBpbmFiaWxpdHkgdG8gdXNlIHRoZQotICAgICAgV29yayAoaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBkYW1hZ2VzIGZvciBsb3NzIG9mIGdvb2R3aWxsLAotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwKLSAgICAgIG90aGVyIGNvbW1lcmNpYWwgZGFtYWdlcyBvciBsb3NzZXMpLCBldmVuIGlmIHN1Y2ggQ29udHJpYnV0b3IKLSAgICAgIGhhcyBiZWVuIGFkdmlzZWQgb2YgdGhlIHBvc3NpYmlsaXR5IG9mIHN1Y2ggZGFtYWdlcy4KLQotICAgOS4gQWNjZXB0aW5nIFdhcnJhbnR5IG9yIEFkZGl0aW9uYWwgTGlhYmlsaXR5LiBXaGlsZSByZWRpc3RyaWJ1dGluZwotICAgICAgdGhlIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCBZb3UgbWF5IGNob29zZSB0byBvZmZlciwKLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksCi0gICAgICBvciBvdGhlciBsaWFiaWxpdHkgb2JsaWdhdGlvbnMgYW5kL29yIHJpZ2h0cyBjb25zaXN0ZW50IHdpdGggdGhpcwotICAgICAgTGljZW5zZS4gSG93ZXZlciwgaW4gYWNjZXB0aW5nIHN1Y2ggb2JsaWdhdGlvbnMsIFlvdSBtYXkgYWN0IG9ubHkKLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmCi0gICAgICBvZiBhbnkgb3RoZXIgQ29udHJpYnV0b3IsIGFuZCBvbmx5IGlmIFlvdSBhZ3JlZSB0byBpbmRlbW5pZnksCi0gICAgICBkZWZlbmQsIGFuZCBob2xkIGVhY2ggQ29udHJpYnV0b3IgaGFybWxlc3MgZm9yIGFueSBsaWFiaWxpdHkKLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24KLSAgICAgIG9mIHlvdXIgYWNjZXB0aW5nIGFueSBzdWNoIHdhcnJhbnR5IG9yIGFkZGl0aW9uYWwgbGlhYmlsaXR5LgotCi0gICBFTkQgT0YgVEVSTVMgQU5EIENPTkRJVElPTlMKLQotICAgQVBQRU5ESVg6IEhvdyB0byBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLgotCi0gICAgICBUbyBhcHBseSB0aGUgQXBhY2hlIExpY2Vuc2UgdG8geW91ciB3b3JrLCBhdHRhY2ggdGhlIGZvbGxvd2luZwotICAgICAgYm9pbGVycGxhdGUgbm90aWNlLCB3aXRoIHRoZSBmaWVsZHMgZW5jbG9zZWQgYnkgYnJhY2tldHMgIltdIgotICAgICAgcmVwbGFjZWQgd2l0aCB5b3VyIG93biBpZGVudGlmeWluZyBpbmZvcm1hdGlvbi4gKERvbid0IGluY2x1ZGUKLSAgICAgIHRoZSBicmFja2V0cyEpICBUaGUgdGV4dCBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGFwcHJvcHJpYXRlCi0gICAgICBjb21tZW50IHN5bnRheCBmb3IgdGhlIGZpbGUgZm9ybWF0LiBXZSBhbHNvIHJlY29tbWVuZCB0aGF0IGEKLSAgICAgIGZpbGUgb3IgY2xhc3MgbmFtZSBhbmQgZGVzY3JpcHRpb24gb2YgcHVycG9zZSBiZSBpbmNsdWRlZCBvbiB0aGUKLSAgICAgIHNhbWUgInByaW50ZWQgcGFnZSIgYXMgdGhlIGNvcHlyaWdodCBub3RpY2UgZm9yIGVhc2llcgotICAgICAgaWRlbnRpZmljYXRpb24gd2l0aGluIHRoaXJkLXBhcnR5IGFyY2hpdmVzLgotCi0gICBDb3B5cmlnaHQgW3l5eXldIFtuYW1lIG9mIGNvcHlyaWdodCBvd25lcl0KLQotICAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL05PVElDRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci09PSAgTk9USUNFIGZpbGUgY29ycmVzcG9uZGluZyB0byBzZWN0aW9uIDQoZCkgb2YgdGhlIEFwYWNoZSBMaWNlbnNlLCAgID09Ci09PSAgVmVyc2lvbiAyLjAsIGluIHRoaXMgY2FzZSBmb3IgdGhlIEFwYWNoZSBNeUZhY2VzIE1hdmVuIFBsdWdpbnMgICAgID09Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLgotCi1Qb3J0aW9ucyBvZiB0aGlzIHNvZnR3YXJlIHdlcmUgb3JpZ2luYWxseSBiYXNlZCBvbiB0aGUgZm9sbG93aW5nOgotCi0gLSBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDAtMjAwNiwgT3JhY2xlIENvcnAsIDxodHRwOi8vd3d3Lm9yYWNsZS5jb20vPi4KLWFuZCBhcmUgbGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIHVuZGVyIHRoZSAKLSJTb2Z0d2FyZSBHcmFudCBhbmQgQ29ycG9yYXRlIENvbnRyaWJ1dGlvbiBMaWNlbnNlIEFncmVlbWVudCIKLQotU2VlIHRoZSBMSUNFTlNFLnR4dCBmaWxlIGZvciBpbmZvcm1hdGlvbiBvbiBhbGwgbGljZW5zZXMgCi1hc3NvY2lhdGVkIHdpdGggdGhpcyBzb2Z0d2FyZS4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vcG9tLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODdjOTkyZi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1qZGV2LXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEpEZXYgUGx1Z2luPC9uYW1lPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLWFwaTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL0pEZXZlbG9wZXJNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL0pEZXZlbG9wZXJNb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4Nzg1N2EuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci9KRGV2ZWxvcGVyTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyNyArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5qZGV2ZWxvcGVyOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLkZpbGVXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtUmVhZGVyOwotaW1wb3J0IGphdmEuaW8uUmVhZGVyOwotCi1pbXBvcnQgamF2YS5uZXQuVVJMOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbXBhcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkVudW1lcmF0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTGlua2VkTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLmphci5KYXJFbnRyeTsKLWltcG9ydCBqYXZhLnV0aWwuamFyLkphckZpbGU7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5QYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5BcnRpZmFjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLm1vZGVsLkRlcGVuZGVuY3k7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5tb2RlbC5SZXNvdXJjZTsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5BYnN0cmFjdE1vam87Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkZpbGVVdGlsczsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwuSU9VdGlsOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbTsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLlhwcDNEb21CdWlsZGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5wbGV4dXMudXRpbC54bWwuWHBwM0RvbVdyaXRlcjsKLWltcG9ydCBvcmcuY29kZWhhdXMucGxleHVzLnV0aWwueG1sLnB1bGwuWG1sUHVsbFBhcnNlckV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LlNBWEV4Y2VwdGlvbjsKLQotICAvKgotICAgKiBJbXBvcnRhbnQgaW5mb3JtYXRpb25hbCBub3RlOgotICAgKgotICAgKiBUaGUgZm9sbG93aW5nIFhNTCBjb2RlIGlzIHNpbWlsYXIgdG8gd2hhdCB3b3VsZCBiZSBzZWVuIGluIGEgcG9tIGZpbGUKLSAgICogdW5kZXIgdGhlIG1hdmVuLWpkZXYtcGx1Z2luIHRhZyBpZiBMaWJyYXJpZXMgKGUuZy4gSlNQIFJ1bnRpbWUKLSAgICogYW5kIEpTRiAxLjIpIGFuZCBEaXN0cmlidXRlZCBUYWcgTGlicmFyaWVzIHdhbnRlZCB0byBiZSBhZGRlZCB0byB0aGUgLmpwcgotICAgKiBwcm9qZWN0LgotICAgKgotICAgKiBXaGF0IHlvdSBzZWUgYmVsb3cgYXJlIHRoZSBkZWZhdWx0cyB0aGF0IGFyZSBwdXQgaW4gYSBwcm9qZWN0J3MgLmpwcgotICAgKiBhdXRvbWF0aWNhbGx5IHdpdGhvdXQgc3BlY2lmeWluZyBhbnl0aGluZy4gIFNlZSByZXBsYWNlTGlicmFyaWVzKCksCi0gICAqIHJlcGxhY2VUYWdMaWJyYXJpZXMoKSBhbmQgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMoKS4KLSAgICoKLSAgICogQWxzbyBub3RlIHRoYXQgYnkgc2V0dGluZyB0aGUgcHJvcGVydHkgImpkZXYucGx1Z2luLmFkZC5saWJyYXJpZXMiIHRvCi0gICAqIGZhbHNlIGluIGEgcHJvamVjdCdzIHBvbS54bWwgZmlsZSwgbm8gbGlicmFyaWVzIHdpbGwgYmUgYWRkZWQsIGRlZmF1bHQKLSAgICogb3Igb3RoZXJ3aXNlLiAgSW4ga2luZCwgc2V0dGluZyB0aGUgcHJvcGVydHkgImpkZXYucGx1Z2luLmFkZC50YWdsaWJzIgotICAgKiB0byBmYWxzZSB3aWxsIHJlc3VsdCBpbiBubyB0YWcgbGlicmFyaWVzIG9mIGFueSBraW5kIGJlaW5nIGFkZGVkLgotICAgKgotICAgKiBBcyB5b3Ugd291bGQgZXhwZWN0LCB0aGUgZGVmYXVsdCBmb3IgYm90aCBvZiB0aGVzZSBwcm9wZXJ0aWVzIGlzICJ0cnVlIi4KLSAgICoKLSAgICogICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMudHJpbmlkYWRidWlsZDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamRldi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjEuMi40LVNOQVBTSE9UPC92ZXJzaW9uPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGxpYnJhcmllcz4KLSAgICAgICAgICAgIDxsaWJyYXJ5PkpTUCBSdW50aW1lPC9saWJyYXJ5PgotICAgICAgICAgICAgPGxpYnJhcnk+SlNGIDEuMjwvbGlicmFyeT4KLSAgICAgICAgICA8L2xpYnJhcmllcz4KLSAgICAgICAgICA8ZGlzdHJpYnV0ZWRUYWdMaWJyYXJpZXM+Ci0gICAgICAgICAgICA8ZGlzdHJpYnV0ZWRUYWdMaWJyYXJ5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+bmFtZTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+SlNGIEhUTUw8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+dmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+MS4yPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPmpzcFZlcnNpb248L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPjIuMTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT50bGQ8L25hbWU+Ci0gICAgICAgICAgICAgICAgPHZhbHVlPmh0bWxfYmFzaWMudGxkPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPlVSSTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbDwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyeT4KLSAgICAgICAgICAgIDxkaXN0cmlidXRlZFRhZ0xpYnJhcnk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT5uYW1lPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT5KU0YgQ29yZTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICAgIDxwcm9wZXJ0eT4KLSAgICAgICAgICAgICAgICA8bmFtZT52ZXJzaW9uPC9uYW1lPgotICAgICAgICAgICAgICAgIDx2YWx1ZT4xLjI8L3ZhbHVlPgotICAgICAgICAgICAgICA8L3Byb3BlcnR5PgotICAgICAgICAgICAgICA8cHJvcGVydHk+Ci0gICAgICAgICAgICAgICAgPG5hbWU+anNwVmVyc2lvbjwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+Mi4xPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPnRsZDwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+anNmX2NvcmUudGxkPC92YWx1ZT4KLSAgICAgICAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgICAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgICAgICAgIDxuYW1lPlVSSTwvbmFtZT4KLSAgICAgICAgICAgICAgICA8dmFsdWU+aHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZTwvdmFsdWU+Ci0gICAgICAgICAgICAgIDwvcHJvcGVydHk+Ci0gICAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyeT4KLSAgICAgICAgICA8L2Rpc3RyaWJ1dGVkVGFnTGlicmFyaWVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAqLwotCi0vKioKLSAqIEdlbmVyYXRlcyB0aGUgSkRldmVsb3BlciBXb3Jrc3BhY2UgYW5kIFByb2plY3RzCi0gKiBmcm9tIGEgbWF2ZW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBqZGV2Ci0gKiBAZXhlY3V0ZSBwaGFzZT1wcm9jZXNzLXJlc291cmNlcwotICogQHJlcXVpcmVzRGVwZW5kZW5jeVJlc29sdXRpb24gdGVzdAotICogQGRlc2NyaXB0aW9uIEdvYWwgd2hpY2ggZ2VuZXJhdGVzIHRoZSBKRGV2ZWxvcGVyIFdvcmtzcGFjZSBhbmQgUHJvamVjdHMKLSAqICAgICAgICAgICAgICBmcm9tIGEgbWF2ZW4gZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQuCi0gKi8KLXB1YmxpYyBjbGFzcyBKRGV2ZWxvcGVyTW9qbwotICBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAvKioKLSAgICogTGlicmFyaWVzIHRvIGluY2x1ZGUgaW4gQ2xhc3NwYXRoLgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFN0cmluZ1tdIGxpYnJhcmllczsKLQotICAvKioKLSAgICogTGlzdCBvZiBzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcwotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSBzb3VyY2VSb290czsKLQotICAvKioKLSAgICogTGlzdCBvZiBzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcyBmb3IgdGhlIHRlc3QgcHJvamVjdAotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSB0ZXN0U291cmNlUm9vdHM7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgcmVzb3VyY2Ugcm9vdCBkaXJlY3RvcmllcwotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIEZpbGVbXSByZXNvdXJjZVJvb3RzOwotCi0gIC8qKgotICAgKiBMaXN0IG9mIHJlc291cmNlIHJvb3QgZGlyZWN0b3JpZXMgZm9yIHRoZSB0ZXN0IHByb2plY3QKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBGaWxlW10gdGVzdFJlc291cmNlUm9vdHM7Ci0KLSAgLyoqCi0gICAqIEZvcmNlIHRoZSBNb2pvIHRvIHVzZSB0aGUgZGVmYXVsdCBwcm9qZWN0LnhtbCBvcgotICAgKiB3b3Jrc3BhY2UueG1sIGZpbGUgdG8gYmUgdXNlZCBpbiBjcmVhdGlvbiBvZiB0aGUKLSAgICogd29ya3NwYWNlIGZpbGUgKC5qd3MpIG9yIHByb2plY3QgZmlsZSAoLmpwcikuIE90aGVyd2lzZSwKLSAgICogaWYgYSAuandzIG9yIC5qcHIgZXhpc3RzLCBpdCB3aWxsIGJlIHVzZWQgaW5zdGVhZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2ZvcmNlfSIgZGVmYXVsdC12YWx1ZT1mYWxzZQotICAgKgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGZvcmNlOwotCi0gIC8qKgotICAgKiBDb21waWxlciB0byBiZSB1c2VkIGJ5IEpEZXZlbG9wZXIuICJPamMiIGlzIHRoZSBkZWZhdWx0LiAgCi0gICAqIElmIHRoaXMgcGFyYW1ldGVyIGlzIGFic2VudCBvciBhbnl0aGluZyBvdGhlciB0aGFuICJKYXZhYyIsICJPamMiIHdpbGwKLSAgICogYmUgdXNlZC4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2pkZXYuY29tcGlsZXJ9IiBkZWZhdWx0LXZhbHVlPSJPamMiCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBjb21waWxlcjsKLQotICAvKioKLSAgICogTWFrZSB0aGUgZW50aXJlIHByb2plY3QgYmVmb3JlIGVhY2ggcnVuLiAgUnVubmluZyBhbnl0aGluZyBpbiB0aGUKLSAgICogcHJvamVjdCB3aWxsIGF1dG9tYXRpY2FsbHkgdHJpZ2dlciBhIG1ha2Ugb2YgdGhlIGVudGlyZSBwcm9qZWN0Ci0gICAqIGZvbGxvd2VkIGJ5IHRoZSBydW4uCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2Lm1ha2UucHJvamVjdH0iIGRlZmF1bHQtdmFsdWU9ImZhbHNlIgotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIG1ha2VQcm9qZWN0OwotCi0gIC8qKgotICAgKiBEZWZhdWx0IGZpbGUgdG8gYmUgcnVuIHdoZW4gSkRldmVsb3BlciBwcm9qZWN0IGlzIHJ1bi4KLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke2pkZXYucnVuLnRhcmdldH0iCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBydW5UYXJnZXQ7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBKRGV2ZWxvcGVyIFdvcmtzcGFjZSBhbmQgUHJvamVjdCBGaWxlcyB0aGF0IGNvcnJlc3BvbmQgdG8KLSAgICogdGhlIGZvcm1hdCB1c2VkCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LnJlbGVhc2V9IiBkZWZhdWx0LXZhbHVlPSIxMC4xLjMuMC40IgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgcmVsZWFzZTsKLQotICAvKioKLSAgICogTmFtZSBvZiB0aGUgTWF2ZW4gUHJvamVjdAotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249IiR7cHJvamVjdH0iCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgTWF2ZW5Qcm9qZWN0IHByb2plY3Q7Ci0KLSAgLyoqCi0gICAqIExpc3Qgb2YgcmVhY3RvclByb2plY3RzCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtyZWFjdG9yUHJvamVjdHN9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIExpc3QgcmVhY3RvclByb2plY3RzOwotCi0gIC8qKgotICAgKiBUYWcgbGlicmFyeSBkaXJlY3RvcnkgdXNlZCBieSBlYWNoIGRpc3RyaWJ1dGVkIHRhZyBsaWJyYXJ5Ci0gICAqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtqZGV2LnRhZy5saWIuZGlyfSIKLSAgICogICAgICAgICAgICBkZWZhdWx0LXZhbHVlPSJAb3JhY2xlLmhvbWVAbGliL2phdmEvc2hhcmVkL29yYWNsZS5qc2YvMS4yL2pzZi1yaS5qYXIhL01FVEEtSU5GIgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFnTGliRGlyZWN0b3J5OwotCi0gIC8qKgotICAgKiBUYWcgbGlicmFyaWVzIGFuZCB0aGVpciBwcm9wZXJ0aWVzLgotICAgKiBAcGFyYW1ldGVyCi0gICAqLwotICBwcml2YXRlIFByb3BlcnRpZXNbXSBkaXN0cmlidXRlZFRhZ0xpYnJhcmllczsKLQotICAvKioKLSAgICogRXhlY3V0ZSB0aGUgTW9qby4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBfcGFyc2VSZWxlYXNlKCk7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgZ2VuZXJhdGVXb3Jrc3BhY2UoKTsKLSAgICAgIGdlbmVyYXRlUHJvamVjdCgpOwotICAgICAgZ2VuZXJhdGVUZXN0UHJvamVjdCgpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlV29ya3NwYWNlKCkKLSAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiwgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICghcHJvamVjdC5nZXRDb2xsZWN0ZWRQcm9qZWN0cygpLmlzRW1wdHkoKSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJHZW5lcmF0aW5nIEpEZXZlbG9wZXIgIiArIHJlbGVhc2UgKyAiIHdvcmtzcGFjZTogIiArCi0gICAgICAgICAgICAgICAgICAgIHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpKTsKLQotICAgICAgRmlsZSB3b3Jrc3BhY2VGaWxlID0gZ2V0SldvcmtzcGFjZUZpbGUocHJvamVjdCk7Ci0KLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBYcHAzRG9tIHdvcmtzcGFjZURPTSA9IHJlYWRXb3Jrc3BhY2VET00od29ya3NwYWNlRmlsZSk7Ci0gICAgICAgIHJlcGxhY2VQcm9qZWN0cyh3b3Jrc3BhY2VGaWxlLmdldFBhcmVudEZpbGUoKSwgd29ya3NwYWNlRE9NKTsKLSAgICAgICAgd3JpdGVET00od29ya3NwYWNlRmlsZSwgd29ya3NwYWNlRE9NKTsKLSAgICAgIH0KLSAgICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgICB7Ci0gICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCJFcnJvciBnZW5lcmF0aW5nIHdvcmtzcGFjZSIsIGUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZVByb2plY3QoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCEicG9tIi5lcXVhbHMocHJvamVjdC5nZXRQYWNrYWdpbmcoKSkpCi0gICAgewotICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShwcm9qZWN0KTsKLQotICAgICAgLy8gR2V0IFByb2plY3QgUHJvcGVydGllcyB0byB0ZWxsIE1vam8gd2hldGhlciBvciBub3QgdG8gYWRkCi0gICAgICAvLyBsaWJyYXJ5IHJlZnMgYW5kIHRhZ2xpYnMgdG8gdGhlIHByb2plY3QuCi0gICAgICBQcm9wZXJ0aWVzIHByb3BzID0gcHJvamVjdC5nZXRQcm9wZXJ0aWVzKCk7Ci0gICAgICBTdHJpbmcgYWRkTGlicyA9IChTdHJpbmcpcHJvcHMuZ2V0KF9QUk9QRVJUWV9BRERfTElCUkFSWSk7Ci0gICAgICBTdHJpbmcgYWRkVGFnTGlicyA9IChTdHJpbmcpcHJvcHMuZ2V0KF9QUk9QRVJUWV9BRERfVEFHTElCUyk7Ci0gICAgICBfYWRkTGlicmFyaWVzID0gKGFkZExpYnMgPT0gbnVsbCkKLSAgICAgICAgPyB0cnVlIDogKG5ldyBCb29sZWFuKGFkZExpYnMpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIF9hZGRUYWdMaWJzICAgPSAoYWRkVGFnTGlicyA9PSBudWxsKQotICAgICAgICA/IHRydWUgOiAobmV3IEJvb2xlYW4oYWRkVGFnTGlicykpLmJvb2xlYW5WYWx1ZSgpOwotCi0gICAgICAvLyBUT0RPOiByZWFkIGNvbmZpZ3VyYXRpb24gZm9yIHdhcjp3YXIgZ29hbAotICAgICAgRmlsZSB3ZWJhcHBEaXIgPSBuZXcgRmlsZShwcm9qZWN0LmdldEJhc2VkaXIoKSwgInNyYy9tYWluL3dlYmFwcCIpOwotICAgICAgLy8gVE9ETzogcmVhZCBjb25maWd1cmF0aW9uIGZvciBjb21waWxlcjpjb21wbGllIGdvYWwKLSAgICAgIEZpbGUgb3V0cHV0RGlyID0KLSAgICAgICAgbmV3IEZpbGUocHJvamVjdC5nZXRCdWlsZCgpLmdldERpcmVjdG9yeSgpLCAiY2xhc3NlcyIpOwotCi0gICAgICBNYXZlblByb2plY3QgZXhlY3V0aW9uUHJvamVjdCA9IHByb2plY3QuZ2V0RXhlY3V0aW9uUHJvamVjdCgpOwotICAgICAgTGlzdCBjb21waWxlU291cmNlUm9vdHMgPSBleGVjdXRpb25Qcm9qZWN0LmdldENvbXBpbGVTb3VyY2VSb290cygpOwotICAgICAgaWYgKHNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlUm9vdHMubGVuZ3RoOyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICBjb21waWxlU291cmNlUm9vdHMuYWRkKHNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBMaXN0IGNvbXBpbGVSZXNvdXJjZVJvb3RzID0gZXhlY3V0aW9uUHJvamVjdC5nZXRSZXNvdXJjZXMoKTsKLSAgICAgIGlmIChyZXNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzb3VyY2VSb290cy5sZW5ndGg7IGkrKykKLSAgICAgICAgewotICAgICAgICAgIFJlc291cmNlIHJlc291cmNlID0gbmV3IFJlc291cmNlKCk7Ci0gICAgICAgICAgcmVzb3VyY2Uuc2V0RGlyZWN0b3J5KHJlc291cmNlUm9vdHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICAgIGNvbXBpbGVSZXNvdXJjZVJvb3RzLmFkZChyZXNvdXJjZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZ2V0TG9nKCkuaW5mbygiR2VuZXJhdGluZyBKRGV2ZWxvcGVyICIgKyByZWxlYXNlICsgIiBQcm9qZWN0ICIgKwotICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0KLSAgICAgIFNldCBwbHVnaW5BcnRpZmFjdHMgPSBuZXcgTGlua2VkSGFzaFNldCgpOwotICAgICAgcGx1Z2luQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldFBsdWdpbkFydGlmYWN0cygpKTsKLQotICAgICAgLy8gTm90ZTogaW5jbHVkZSAiY29tcGlsZSIsICJwcm92aWRlZCIsICJzeXN0ZW0iIGFuZCAicnVudGltZSIgc2NvcGVzCi0gICAgICBTZXQgY29tcGlsZUFydGlmYWN0cyA9IG5ldyBMaW5rZWRIYXNoU2V0KCk7Ci0gICAgICBjb21waWxlQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldENvbXBpbGVBcnRpZmFjdHMoKSk7Ci0gICAgICBjb21waWxlQXJ0aWZhY3RzLmFkZEFsbChwcm9qZWN0LmdldFJ1bnRpbWVBcnRpZmFjdHMoKSk7Ci0KLSAgICAgIC8vIE5vdGU6IHNlcGFyYXRlICJydW50aW1lIiB2cy4gImNvbXBpbGUiIGRlcGVuZGVuY2llcyBpbiBKRGV2ZWxvcGVyPwotICAgICAgZ2VuZXJhdGVQcm9qZWN0KHByb2plY3RGaWxlLCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFBhY2thZ2luZygpLCBwcm9qZWN0LmdldERlcGVuZGVuY2llcygpLAotICAgICAgICAgICAgICAgICAgICAgIG5ldyBBcnJheUxpc3QoY29tcGlsZUFydGlmYWN0cyksIGNvbXBpbGVTb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICBDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KHdlYmFwcERpci5nZXRQYXRoKCkpLAotICAgICAgICAgICAgICAgICAgICAgIG91dHB1dERpcik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGdlbmVyYXRlVGVzdFByb2plY3QoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKCEicG9tIi5lcXVhbHMocHJvamVjdC5nZXRQYWNrYWdpbmcoKSkpCi0gICAgewotICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0VGVzdEZpbGUocHJvamVjdCk7Ci0KLSAgICAgIC8vIEdldCBQcm9qZWN0IFByb3BlcnRpZXMgdG8gdGVsbCBNb2pvIHdoZXRoZXIgb3Igbm90IHRvIGFkZAotICAgICAgLy8gbGlicmFyeSByZWZzIGFuZCB0YWdsaWJzIHRvIHRoZSBwcm9qZWN0LgotICAgICAgUHJvcGVydGllcyBwcm9wcyA9IHByb2plY3QuZ2V0UHJvcGVydGllcygpOwotICAgICAgU3RyaW5nIGFkZExpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX0xJQlJBUlkpOwotICAgICAgU3RyaW5nIGFkZFRhZ0xpYnMgPSAoU3RyaW5nKXByb3BzLmdldChfUFJPUEVSVFlfQUREX1RBR0xJQlMpOwotICAgICAgX2FkZExpYnJhcmllcyA9IChhZGRMaWJzID09IG51bGwpCi0gICAgICAgID8gdHJ1ZSA6IChuZXcgQm9vbGVhbihhZGRMaWJzKSkuYm9vbGVhblZhbHVlKCk7Ci0gICAgICBfYWRkVGFnTGlicyAgID0gKGFkZFRhZ0xpYnMgPT0gbnVsbCkKLSAgICAgICAgPyB0cnVlIDogKG5ldyBCb29sZWFuKGFkZFRhZ0xpYnMpKS5ib29sZWFuVmFsdWUoKTsKLSAgICAgIEZpbGUgd2ViYXBwRGlyID0gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJzcmMvdGVzdC93ZWJhcHAiKTsKLSAgICAgIC8vIFRPRE86IHJlYWQgY29uZmlndXJhdGlvbiBmb3IgY29tcGlsZXI6dGVzdENvbXBpbGUgZ29hbAotICAgICAgRmlsZSBvdXRwdXREaXIgPQotICAgICAgICBuZXcgRmlsZShwcm9qZWN0LmdldEJ1aWxkKCkuZ2V0RGlyZWN0b3J5KCksICJ0ZXN0LWNsYXNzZXMiKTsKLQotICAgICAgLy8gc2VsZiBkZXBlbmRlbmN5IG5lZWRlZCBmb3IgdGVzdCBwcm9qZWN0Ci0gICAgICBMaXN0IHRlc3REZXBlbmRlbmNpZXMgPSBuZXcgQXJyYXlMaXN0KHByb2plY3QuZ2V0VGVzdERlcGVuZGVuY2llcygpKTsKLSAgICAgIERlcGVuZGVuY3kgc2VsZkRlcGVuZGVuY3kgPSBuZXcgRGVwZW5kZW5jeSgpOwotICAgICAgc2VsZkRlcGVuZGVuY3kuc2V0QXJ0aWZhY3RJZChwcm9qZWN0LmdldEFydGlmYWN0SWQoKSk7Ci0gICAgICBzZWxmRGVwZW5kZW5jeS5zZXRHcm91cElkKHByb2plY3QuZ2V0R3JvdXBJZCgpKTsKLSAgICAgIHNlbGZEZXBlbmRlbmN5LnNldFR5cGUocHJvamVjdC5nZXRQYWNrYWdpbmcoKSk7Ci0gICAgICB0ZXN0RGVwZW5kZW5jaWVzLmFkZChzZWxmRGVwZW5kZW5jeSk7Ci0KLSAgICAgIE1hdmVuUHJvamVjdCBleGVjdXRpb25Qcm9qZWN0ID0gcHJvamVjdC5nZXRFeGVjdXRpb25Qcm9qZWN0KCk7Ci0gICAgICBMaXN0IGNvbXBpbGVTb3VyY2VSb290cyA9Ci0gICAgICAgIGV4ZWN1dGlvblByb2plY3QuZ2V0VGVzdENvbXBpbGVTb3VyY2VSb290cygpOwotCi0gICAgICBpZiAodGVzdFNvdXJjZVJvb3RzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGVzdFNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgY29tcGlsZVNvdXJjZVJvb3RzLmFkZCh0ZXN0U291cmNlUm9vdHNbaV0uZ2V0QWJzb2x1dGVQYXRoKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIExpc3QgY29tcGlsZVJlc291cmNlUm9vdHMgPSBleGVjdXRpb25Qcm9qZWN0LmdldFRlc3RSZXNvdXJjZXMoKTsKLSAgICAgIGlmICh0ZXN0UmVzb3VyY2VSb290cyAhPSBudWxsKQotICAgICAgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRlc3RSZXNvdXJjZVJvb3RzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSBuZXcgUmVzb3VyY2UoKTsKLSAgICAgICAgICByZXNvdXJjZS5zZXREaXJlY3RvcnkodGVzdFNvdXJjZVJvb3RzW2ldLmdldEFic29sdXRlUGF0aCgpKTsKLSAgICAgICAgICBjb21waWxlUmVzb3VyY2VSb290cy5hZGQocmVzb3VyY2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgSkRldmVsb3BlciAiICsgcmVsZWFzZSArICIgUHJvamVjdCAiICsKLSAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLXRlc3QiKTsKLQotICAgICAgLy8gTm90ZTogYWxsIGFydGlmYWN0cyBpbXBsaWNpdGx5IGluY2x1ZGVkIGluICJ0ZXN0IiBzY29wZQotICAgICAgZ2VuZXJhdGVQcm9qZWN0KHByb2plY3RGaWxlLCBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICItdGVzdCIsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvamVjdC5nZXRQYWNrYWdpbmcoKSwgdGVzdERlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICBwcm9qZWN0LmdldFRlc3RBcnRpZmFjdHMoKSwgY29tcGlsZVNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGVSZXNvdXJjZVJvb3RzLAotICAgICAgICAgICAgICAgICAgICAgIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Qod2ViYXBwRGlyLmdldFBhdGgoKSksCi0gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0RGlyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgZ2VuZXJhdGVQcm9qZWN0KEZpbGUgcHJvamVjdEZpbGUsIFN0cmluZyBwcm9qZWN0TmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgcGFja2FnaW5nLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IGFydGlmYWN0cywgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMsIExpc3Qgd2ViU291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBvdXRwdXREaXIpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBGaWxlIHByb2plY3REaXIgPSBwcm9qZWN0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBYcHAzRG9tIHByb2plY3RET00gPSByZWFkUHJvamVjdERPTShwcm9qZWN0RmlsZSk7Ci0gICAgICByZXBsYWNlV2ViYXBwSW5mbyhwcm9qZWN0TmFtZSwgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlU291cmNlUGF0aHMocHJvamVjdERpciwgc291cmNlUm9vdHMsIHJlc291cmNlUm9vdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdERPTSk7Ci0gICAgICAvL3JlcGxhY2VSZXNvdXJjZVBhdGhzKHByb2plY3REaXIsIHJlc291cmNlUm9vdHMsIHByb2plY3RET00pOwotICAgICAgcmVwbGFjZVdlYlNvdXJjZVBhdGhzKHByb2plY3REaXIsIHdlYlNvdXJjZVJvb3RzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VEZXBlbmRlbmNpZXMocHJvamVjdERpciwgZGVwZW5kZW5jaWVzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VMaWJyYXJpZXMocHJvamVjdERpciwgYXJ0aWZhY3RzLCBwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VUYWdMaWJyYXJpZXMocHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlT3V0cHV0RGlyZWN0b3J5KHByb2plY3REaXIsIG91dHB1dERpciwgcHJvamVjdERPTSk7Ci0gICAgICByZXBsYWNlUGFyYW1ldGVycyhwcm9qZWN0TmFtZSwgcHJvamVjdERPTSk7Ci0gICAgICB3cml0ZURPTShwcm9qZWN0RmlsZSwgcHJvamVjdERPTSk7Ci0KLSAgICAgIGlmICgid2FyIi5lcXVhbHMocGFja2FnaW5nKSkKLSAgICAgIHsKLSAgICAgICAgY29weVRhZ0xpYnJhcmllcyhwcm9qZWN0RGlyLCBkZXBlbmRlbmNpZXMsIGFydGlmYWN0cyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChYbWxQdWxsUGFyc2VyRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oIkVycm9yIGdlbmVyYXRpbmcgcHJvamVjdCIsIGUpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlUHJvamVjdHMoRmlsZSB3b3Jrc3BhY2VEaXIsIFhwcDNEb20gd29ya3NwYWNlRE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvandzOndvcmtzcGFjZQotICAgIC8vICAgL2xpc3RbQG49Imxpc3RPZkNoaWxkcmVuIl0KLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IHdvcmtzcGFjZURPTS5nZXRDaGlsZCgibGlzdCIpOwotCi0gICAgLy8gPGhhc2g+Ci0gICAgLy8gICA8dmFsdWUgbj0ibm9kZUNsYXNzIiB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KUHJvamVjdCIvPgotICAgIC8vICAgPHVybCBuPSJVUkwiIHBhdGg9Ilt3b3Jrc3BhY2UtcmVsYXRpdmUtcGF0aC10by1wcm9qZWN0Lmpwcl0iLz4KLSAgICAvLyA8L2hhc2g+Ci0gICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gcHJvamVjdC5nZXRDb2xsZWN0ZWRQcm9qZWN0cygpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWF2ZW5Qcm9qZWN0IGNvbGxlY3RlZFByb2plY3QgPSAoTWF2ZW5Qcm9qZWN0KSBpLm5leHQoKTsKLQotICAgICAgLy8gaWYgYSBjaGlsZCBwcm9qZWN0IGlzIGFsc28gYSB3b3Jrc3BhY2UsIHRoZW4gZG9uJ3QgCi0gICAgICAvLyBwdXQgaXQgaW4gdGhlIC5qd3MgZmlsZS4gIEl0IHdpbGwgaGF2ZSBpdHMgb3duIC5qd3MKLSAgICAgIC8vIGZpbGUuCi0gICAgICBpZiAoISJwb20iLmVxdWFscyhjb2xsZWN0ZWRQcm9qZWN0LmdldFBhY2thZ2luZygpKSkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBwcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShjb2xsZWN0ZWRQcm9qZWN0KTsKLSAgICAgICAgCi0gICAgICAgIHRhcmdldERPTS5hZGRDaGlsZChjcmVhdGVQcm9qZWN0UmVmZXJlbmNlRE9NKHdvcmtzcGFjZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvamVjdEZpbGUpKTsKLSAgCi0gICAgICAgIEZpbGUgdGVzdFByb2plY3RGaWxlID0gZ2V0SlByb2plY3RUZXN0RmlsZShjb2xsZWN0ZWRQcm9qZWN0KTsKLSAgICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGNyZWF0ZVByb2plY3RSZWZlcmVuY2VET00od29ya3NwYWNlRGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0UHJvamVjdEZpbGUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVdlYlNvdXJjZVBhdGhzKEZpbGUgcHJvamVjdERpciwgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJ3ZWJDb250ZW50U2V0Il0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idXJsLXBhdGgiXQotICAgIFhwcDNEb20gcGF0aHNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIik7Ci0gICAgWHBwM0RvbSBjb250ZW50U2V0RE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHBhdGhzRE9NLCAiaGFzaCIsICJ3ZWJDb250ZW50U2V0Iik7Ci0gICAgWHBwM0RvbSBzb3VyY2VET00gPSBmaW5kTmFtZWRDaGlsZChjb250ZW50U2V0RE9NLCAibGlzdCIsICJ1cmwtcGF0aCIpOwotCi0gICAgLy8KLSAgICAvLyA8dXJsIHBhdGg9IltyZWxhdGl2ZS1wYXRoLXRvLXNvdXJjZS1yb290XSIgLz4KLSAgICAvLwotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSBzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEZpbGUgc291cmNlUm9vdCA9IG5ldyBGaWxlKChTdHJpbmcpIGkubmV4dCgpKTsKLSAgICAgIFN0cmluZyByZWxhdGl2ZVJvb3QgPSBnZXRSZWxhdGl2ZURpcihwcm9qZWN0RGlyLCBzb3VyY2VSb290KTsKLSAgICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHJlbGF0aXZlUm9vdCk7Ci0gICAgICB0YXJnZXRET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICB9Ci0KLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRE9NKTsKLQotICAgIC8vIG1ha2Ugc3VyZSB0byBwYXNzIEJvb2xlYW4uRkFMU0UgdG8gYWxsb3cKLSAgICAvLyBtdWx0aXBsZSBjaGlsZCBlbGVtZW50cyB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICBYcHAzRG9tLm1lcmdlWHBwM0RvbShzb3VyY2VET00sIHRhcmdldERPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVdlYmFwcEluZm8oU3RyaW5nIHByb2plY3ROYW1lLCBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyJdCi0gICAgLy8gICAgIC92YWx1ZVtAbj0iajJlZVdlYkFwcE5hbWUiIHY9Im1hdmVuLWdlbmVyYXRlZC13ZWJhcHAiXQotICAgIC8vICAgICAvdmFsdWVbQG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCJdCi0gICAgWHBwM0RvbSBzZXR0aW5nc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiKTsKLSAgICBYcHAzRG9tIHdlYmFwcE5hbWVET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoc2V0dGluZ3NET00sICJ2YWx1ZSIsICJqMmVlV2ViQXBwTmFtZSIpOwotICAgIFhwcDNEb20gd2ViYXBwQ29udGV4dERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChzZXR0aW5nc0RPTSwgInZhbHVlIiwgImoyZWVXZWJDb250ZXh0Um9vdCIpOwotCi0gICAgLy8gdXBkYXRlIHRoZSB3ZWJhcHAgbmFtZQotICAgIHdlYmFwcE5hbWVET00uc2V0QXR0cmlidXRlKCJ2IiwgcHJvamVjdE5hbWUgKyAiLXdlYmFwcCIpOwotCi0gICAgLy8gdXBkYXRlIHRoZSB3ZWJhcHAgY29udGV4dCByb290Ci0gICAgd2ViYXBwQ29udGV4dERPTS5zZXRBdHRyaWJ1dGUoInYiLCBwcm9qZWN0TmFtZSArICItY29udGV4dC1yb290Iik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVNvdXJjZVBhdGhzKEZpbGUgcHJvamVjdERpciwgTGlzdCBzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMsIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIl0KLSAgICAvLyAgICAgL2hhc2hbQG49ImphdmFDb250ZW50U2V0Il0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idXJsLXBhdGgiXQotICAgIFhwcDNEb20gcGF0aHNET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLCAib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIik7Ci0gICAgWHBwM0RvbSBjb250ZW50U2V0RE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHBhdGhzRE9NLCAiaGFzaCIsICJqYXZhQ29udGVudFNldCIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0gZmluZE5hbWVkQ2hpbGQoY29udGVudFNldERPTSwgImxpc3QiLCAiY29uc3RpdHVlbnQtc2V0cyIpOwotCi0gICAgLy8KLSAgICAvLyA8dXJsIHBhdGg9IltyZWxhdGl2ZS1wYXRoLXRvLXNvdXJjZS1yb290XSIgLz4KLSAgICAvLwotICAgIFhwcDNEb20gdGFyZ2V0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLQotICAgIENvbGxlY3Rpb25zLnNvcnQoc291cmNlUm9vdHMpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRmlsZSBzb3VyY2VSb290ID0gbmV3IEZpbGUoKFN0cmluZykgaS5uZXh0KCkpOwotICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgWHBwM0RvbSBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInBhdHRlcm4tZmlsdGVycyIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSBzdHJpbmdET00gPSBuZXcgWHBwM0RvbSgic3RyaW5nIik7Ci0gICAgICBzdHJpbmdET00uc2V0QXR0cmlidXRlKCJ2IiwgIisqKiIpOwotICAgICAgbGlzdERPTS5hZGRDaGlsZChzdHJpbmdET00pOwotCi0gICAgICBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInVybC1wYXRoIik7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKGxpc3RET00pOwotCi0gICAgICBTdHJpbmcgcmVsYXRpdmVSb290ID0gZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgc291cmNlUm9vdCk7Ci0gICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVJvb3QpOwotICAgICAgbGlzdERPTS5hZGRDaGlsZCh1cmxET00pOwotCi0gICAgICB0YXJnZXRET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogZ2V0IGJ1ZyBmaXhlZCBpbiAxMC4xLjMgZm9yIGNvcHlpbmcgcmVzb3VyY2VzCi0gICAgQ29sbGVjdGlvbnMuc29ydChyZXNvdXJjZVJvb3RzLCBuZXcgQ29tcGFyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICBwdWJsaWMgaW50IGNvbXBhcmUoT2JqZWN0IGEsIE9iamVjdCBiKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFJlc291cmNlIHJhID0gKFJlc291cmNlKSBhOwotICAgICAgICAgICAgUmVzb3VyY2UgcmIgPSAoUmVzb3VyY2UpIGI7Ci0gICAgICAgICAgICByZXR1cm4gcmEuZ2V0RGlyZWN0b3J5KCkuY29tcGFyZVRvKHJiLmdldERpcmVjdG9yeSgpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgfSk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSByZXNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgUmVzb3VyY2UgcmVzb3VyY2UgPSAoUmVzb3VyY2UpIGkubmV4dCgpOwotICAgICAgRmlsZSByZXNvdXJjZVJvb3QgPSBuZXcgRmlsZShyZXNvdXJjZS5nZXREaXJlY3RvcnkoKSk7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVSb290ID0gZ2V0UmVsYXRpdmVEaXIocHJvamVjdERpciwgcmVzb3VyY2VSb290KTsKLQotICAgICAgWHBwM0RvbSBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgWHBwM0RvbSBsaXN0RE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgInBhdHRlcm4tZmlsdGVycyIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSBzdHJpbmdET00gPSBudWxsOwotICAgICAgLy8gVE9ETzogVGhpcyBpcyBhIEhhY2sgZm9yIGV4Y2x1ZGluZyB0aGUgZ29sZGVuIGZpbGVzLAotICAgICAgLy8gd2hpY2ggYXJlIG5vdCByZWFsbHkgeG1sIGZpbGVzLiAgV2UgbmVlZCBhIHdheSwgaW4KLSAgICAgIC8vIHRoZSBwb20gZmlsZSB0byBzcGVjaWZ5IGV4Y2x1ZGVzLgotICAgICAgaWYgKHJlbGF0aXZlUm9vdC5zdGFydHNXaXRoKCJzcmMvdGVzdC9yZXNvdXJjZXMiKSkKLSAgICAgIHsKLSAgICAgICAgc3RyaW5nRE9NID0gbmV3IFhwcDNEb20oInN0cmluZyIpOwotICAgICAgICBzdHJpbmdET00uc2V0QXR0cmlidXRlKCJ2IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLW9yYWNsZS9hZGZpbnRlcm5hbC92aWV3L2ZhY2VzL3JlbmRlcmtpdC9nb2xkZW4vIik7Ci0gICAgICAgIGxpc3RET00uYWRkQ2hpbGQoc3RyaW5nRE9NKTsKLSAgICAgIH0KLQotICAgICAgc3RyaW5nRE9NID0gbmV3IFhwcDNEb20oInN0cmluZyIpOwotICAgICAgc3RyaW5nRE9NLnNldEF0dHJpYnV0ZSgidiIsICIrKioiKTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQoc3RyaW5nRE9NKTsKLQotICAgICAgbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICBsaXN0RE9NLnNldEF0dHJpYnV0ZSgibiIsICJ1cmwtcGF0aCIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZChsaXN0RE9NKTsKLQotICAgICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcmVsYXRpdmVSb290KTsKLSAgICAgIGxpc3RET00uYWRkQ2hpbGQodXJsRE9NKTsKLQotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgIH0KLQotICAgIC8vIFRPRE86IHVzZSBhIGJldHRlciBtZXJnZSBhbGdvcml0aG0KLSAgICByZW1vdmVDaGlsZHJlbihzb3VyY2VET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURPTSwgdGFyZ2V0RE9NLCBCb29sZWFuLkZBTFNFKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlUmVzb3VyY2VQYXRocyhGaWxlIHByb2plY3REaXIsIExpc3QgcmVzb3VyY2VSb290cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzIl0KLSAgICAvLyAgICAgL2hhc2hbQG49InJlc291cmNlc0NvbnRlbnRTZXQiXQotICAgIC8vICAgICAgIC9saXN0W0BuPSJ1cmwtcGF0aCJdCi0KLSAgICBYcHAzRG9tIHBhdGhzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyIpOwotICAgIFhwcDNEb20gY29udGVudFNldERPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwYXRoc0RPTSwgImhhc2giLCAicmVzb3VyY2VzQ29udGVudFNldCIpOwotICAgIFhwcDNEb20gc291cmNlRE9NID0gZmluZE5hbWVkQ2hpbGQoY29udGVudFNldERPTSwgImxpc3QiLCAidXJsLXBhdGgiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1zb3VyY2Utcm9vdF0iIC8+Ci0gICAgLy8KLSAgICBYcHAzRG9tIHRhcmdldERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVzb3VyY2VSb290cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIFJlc291cmNlIHJlc291cmNlID0gKFJlc291cmNlKSBpLm5leHQoKTsKLSAgICAgIEZpbGUgcmVzb3VyY2VSb290ID0gbmV3IEZpbGUocmVzb3VyY2UuZ2V0RGlyZWN0b3J5KCkpOwotICAgICAgU3RyaW5nIHJlbGF0aXZlUm9vdCA9IGdldFJlbGF0aXZlRGlyKHByb2plY3REaXIsIHJlc291cmNlUm9vdCk7Ci0gICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCByZWxhdGl2ZVJvb3QpOwotICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKHVybERPTSk7Ci0gICAgfQotCi0gICAgLy8gVE9ETzogdXNlIGEgYmV0dGVyIG1lcmdlIGFsZ29yaXRobQotICAgIHJlbW92ZUNoaWxkcmVuKHNvdXJjZURPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRE9NLCB0YXJnZXRET00sIEJvb2xlYW4uRkFMU0UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VEZXBlbmRlbmNpZXMoRmlsZSBwcm9qZWN0RGlyLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyAvanByOnByb2plY3QKLSAgICAvLyAgIC9oYXNoW0BuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIl0KLSAgICAvLyAgICAgL2xpc3RbQG49ImRlcGVuZGVuY3lMaXN0Il0KLSAgICBYcHAzRG9tIGNvbmZpZ0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIik7Ci0gICAgWHBwM0RvbSBzb3VyY2VET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQoY29uZmlnRE9NLCAibGlzdCIsICJkZXBlbmRlbmN5TGlzdCIpOwotCi0gICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGRlcGVuZGVuY2llcy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIERlcGVuZGVuY3kgZGVwZW5kZW5jeSA9IChEZXBlbmRlbmN5KSBpLm5leHQoKTsKLSAgICAgIE1hdmVuUHJvamVjdCBkZXBlbmRlbnRQcm9qZWN0ID0KLSAgICAgICAgZmluZERlcGVuZGVudFByb2plY3QoZGVwZW5kZW5jeS5nZXRNYW5hZ2VtZW50S2V5KCkpOwotICAgICAgaWYgKGRlcGVuZGVudFByb2plY3QgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgRmlsZSBkZXBlbmRlbnRQcm9qZWN0RmlsZSA9IGdldEpQcm9qZWN0RmlsZShkZXBlbmRlbnRQcm9qZWN0KTsKLSAgICAgICAgU3RyaW5nIHJlbGF0aXZlUGF0aCA9Ci0gICAgICAgICAgZ2V0UmVsYXRpdmVGaWxlKHByb2plY3REaXIsIGRlcGVuZGVudFByb2plY3RGaWxlKTsKLQotICAgICAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJjbGFzcyIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9yYWNsZS5qZGV2ZWxvcGVyLmxpYnJhcnkuUHJvamVjdExpYnJhcnkiKTsKLSAgICAgICAgWHBwM0RvbSBzcmNPd25WYWxET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgc3JjT3duVmFsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJzb3VyY2VPd25lclVSTCIpOwotICAgICAgICBYcHAzRG9tIHVybERPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLSAgICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJzb3VyY2VVUkwiKTsKLSAgICAgICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgicGF0aCIsIHJlbGF0aXZlUGF0aCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHNyY093blZhbERPTSk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICAgICAgdGFyZ2V0RE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRPRE86IHVzZSBhIGJldHRlciBtZXJnZSBhbGdvcml0aG0KLSAgICByZW1vdmVDaGlsZHJlbihzb3VyY2VET00pOwotCi0gICAgLy8gbWFrZSBzdXJlIHRvIHBhc3MgQm9vbGVhbi5GQUxTRSB0byBhbGxvdwotICAgIC8vIG11bHRpcGxlIGNoaWxkIGVsZW1lbnRzIHdpdGggdGhlIHNhbWUgbmFtZQotICAgIFhwcDNEb20ubWVyZ2VYcHAzRG9tKHNvdXJjZURPTSwgdGFyZ2V0RE9NLCBCb29sZWFuLkZBTFNFKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZXBsYWNlTGlicmFyaWVzKEZpbGUgcHJvamVjdERpciwgTGlzdCBhcnRpZmFjdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyJdCi0gICAgLy8gICAgIC9oYXNoW0BuPSJpbnRlcm5hbERlZmluaXRpb25zIl0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0ibGlicmFyeURlZmluaXRpb25zIl0KLSAgICBYcHAzRG9tIHByb2plY3RMaWJzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiKTsKLSAgICBYcHAzRG9tIGludGVybmFsRGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0TGlic0RPTSwgImhhc2giLCAiaW50ZXJuYWxEZWZpbml0aW9ucyIpOwotICAgIFhwcDNEb20gc291cmNlRGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChpbnRlcm5hbERlZnNET00sICJsaXN0IiwgImxpYnJhcnlEZWZpbml0aW9ucyIpOwotCi0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyJdCi0gICAgLy8gICAgIC9saXN0W0BuPSJsaWJyYXJ5UmVmZXJlbmNlcyJdCi0gICAgWHBwM0RvbSBzb3VyY2VSZWZzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RMaWJzRE9NLCAibGlzdCIsICJsaWJyYXJ5UmVmZXJlbmNlcyIpOwotCi0gICAgWHBwM0RvbSB0YXJnZXREZWZzRE9NID0gbmV3IFhwcDNEb20oImxpc3QiKTsKLSAgICBYcHAzRG9tIHRhcmdldFJlZnNET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgLy8KLSAgICAvLyBsaWJyYXJ5RGVmaW5pdGlvbnMKLSAgICAvLwotICAgIC8vIDxoYXNoPgotICAgIC8vICAgPGxpc3Qgbj0iY2xhc3NQYXRoIj4KLSAgICAvLyAgICAgPHVybCBwYXRoPSJbcGF0aC10by1hcnRpZmFjdF0iIGphci1lbnRyeT0iIiAvPgotICAgIC8vICAgPC9saXN0PgotICAgIC8vICAgPHZhbHVlIG49ImRlcGxveWVkQnlEZWZhdWx0IiB2PSJ0cnVlIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iZGVzY3JpcHRpb24iIHY9IlthcnRpZmFjdC5pZF0iLz4KLSAgICAvLyAgIDx2YWx1ZSBuPSJpZCIgdj0iW2FydGlmYWN0LmlkXSIvPgotICAgIC8vIDwvaGFzaD4KLSAgICAvLwotCi0gICAgLy8gc29ydCB0aGUgYXJ0aWZhY3RzCi0gICAgQ29sbGVjdGlvbnMuc29ydChhcnRpZmFjdHMsIG5ldyBDb21wYXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgIHB1YmxpYyBpbnQgY29tcGFyZShPYmplY3QgYSwgT2JqZWN0IGIpCi0gICAgICAgICAgewotICAgICAgICAgICAgQXJ0aWZhY3QgYXJ0YSA9IChBcnRpZmFjdCkgYTsKLSAgICAgICAgICAgIEFydGlmYWN0IGFydGIgPSAoQXJ0aWZhY3QpIGI7Ci0gICAgICAgICAgICByZXR1cm4gYXJ0YS5nZXRJZCgpLmNvbXBhcmVUbyhhcnRiLmdldElkKCkpOwotICAgICAgICAgIH0KLQotICAgICAgICB9KTsKLQotICAgIExpc3QgbGlicmFyeVJlZnMgPSBuZXcgTGlua2VkTGlzdCgpOwotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLQotICAgICAgaWYgKCFpc0RlcGVuZGVudFByb2plY3QoYXJ0aWZhY3QuZ2V0RGVwZW5kZW5jeUNvbmZsaWN0SWQoKSkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBpZCA9IGFydGlmYWN0LmdldElkKCk7Ci0gICAgICAgIFN0cmluZyBwYXRoID0gZ2V0UmVsYXRpdmVGaWxlKHByb2plY3REaXIsIGFydGlmYWN0LmdldEZpbGUoKSk7Ci0KLSAgICAgICAgLy8gbGlicmFyeURlZmluaXRpb25zIGVudHJ5Ci0gICAgICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgICAgIFhwcDNEb20gbGlzdERPTSA9IG5ldyBYcHAzRG9tKCJsaXN0Iik7Ci0gICAgICAgIGxpc3RET00uc2V0QXR0cmlidXRlKCJuIiwgImNsYXNzUGF0aCIpOwotCi0gICAgICAgIFhwcDNEb20gdXJsRE9NID0gbmV3IFhwcDNEb20oInVybCIpOwotICAgICAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgcGF0aCk7Ci0gICAgICAgIHVybERPTS5zZXRBdHRyaWJ1dGUoImphci1lbnRyeSIsICIiKTsKLSAgICAgICAgbGlzdERPTS5hZGRDaGlsZCh1cmxET00pOwotICAgICAgICBoYXNoRE9NLmFkZENoaWxkKGxpc3RET00pOwotCi0gICAgICAgIFhwcDNEb20gdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImRlcGxveWVkQnlEZWZhdWx0Iik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJ0cnVlIik7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJkZXNjcmlwdGlvbiIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJpZCIpOwotICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotICAgICAgICB0YXJnZXREZWZzRE9NLmFkZENoaWxkKGhhc2hET00pOwotCi0gICAgICAgIGxpYnJhcnlSZWZzLmFkZChpZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVGhpcyBib29sZWFuIGlzIHNldCBieSBzcGVjaWZ5aW5nIHRoZSBqZGV2LnBsdWdpbi5hZGQubGlicmFyaWVzCi0gICAgLy8gcHJvcGVydHkgYXQgdGhlIHRvcCBvZiBhIHByb2plY3QncyBwb20gZmlsZS4gIFRoZXJlIGFyZSBwcm9qZWN0cwotICAgIC8vIHRoYXQgZG9uJ3QgbmVlZCB0aGVzZSBsaWJyYXJpZXMgaW4gdGhlaXIgLmpwciBmaWxlcyB0byBjb21waWxlIGFuZCB0aGlzCi0gICAgLy8gcHJvcGVydHkgYWxsb3dzIHRoZW0gdG8gYmUgZXhjbHVkZWQuCi0gICAgLy8KLSAgICAvLyBJTVBPUlRBTlQgTk9URTogaWYgdGhpcyBwcm9wZXJ0eSBpcyBzZXQgaW4gYSBwcm9qZWN0LAotICAgIC8vIHRoZW4gbGlicmFyaWVzIHdpbGwgTk9UIGJlIGFkZGVkLCBldmVuIHRob3VnaCB0aGV5Ci0gICAgLy8gbWF5IGJlIHNwZWNpZmllZCB1bmRlciB0aGUgbWF2ZW4tamRldi1wbHVnaW4uCi0gICAgaWYgKF9hZGRMaWJyYXJpZXMpCi0gICAgewotICAgICAgLy8gQWRkIGxpYnJhcmllcy4gIFRoZSBkZWZhdWx0IGxpYnJhcmllcyBjYW4gYmUKLSAgICAgIC8vIG92ZXJyaWRkZW4gaW4gdGhlIHRydW5rL3RvcGxldmVsIHBvbSBmaWxlLgotICAgICAgaWYgKF9yZWxlYXNlTWFqb3IgPj0gMTEpCi0gICAgICB7Ci0gICAgICAgIC8vIEFkZCB0aGUgZGVmYXVsdCBsaWJyYXJpZXMKLSAgICAgICAgbGlicmFyeVJlZnMuYWRkKDAsIkpTRiAxLjIiKTsKLSAgICAgICAgbGlicmFyeVJlZnMuYWRkKDAsIkpTUCBSdW50aW1lIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEFkZCB0aGUgbGlicmFyaWVzCi0gICAgICBpZiAobGlicmFyaWVzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlicmFyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgLy8gRGVmYXVsdCBsaWJyYXJpZXMgZm9yIHJlbGVhc2UgMTEgd2VyZSBhbHJlYWR5Ci0gICAgICAgICAgLy8gYWRkZWQgYWJvdmUuCi0gICAgICAgICAgaWYgKCAgIChfcmVsZWFzZU1ham9yID49IDExKQotICAgICAgICAgICAgICAmJiAoICAgKCJKU0YgMS4yIi5lcXVhbHNJZ25vcmVDYXNlKGxpYnJhcmllc1tpXSkpCi0gICAgICAgICAgICAgICAgICB8fCAoIkpTUCBSdW50aW1lIi5lcXVhbHNJZ25vcmVDYXNlKGxpYnJhcmllc1tpXSkpCi0gICAgICAgICAgICAgICAgICkKLSAgICAgICAgICAgICApCi0gICAgICAgICAgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIEFkZCB0aGUgbGlicmFyeQotICAgICAgICAgIGxpYnJhcnlSZWZzLmFkZCgwLCBsaWJyYXJpZXNbaV0pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8KLSAgICAvLyBsaWJyYXJ5UmVmZXJlbmNlcwotICAgIC8vCi0gICAgLy8gPGhhc2g+Ci0gICAgLy8gICA8dmFsdWUgbj0iaWQiIHY9IlthcnRpZmFjdC5pZF0iLz4KLSAgICAvLyAgIDx2YWx1ZSBuPSJpc0pESyIgdj0iZmFsc2UiLz4KLSAgICAvLyA8L2hhc2g+Ci0gICAgLy8KLSAgICBDb2xsZWN0aW9ucy5zb3J0KGxpYnJhcnlSZWZzKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGxpYnJhcnlSZWZzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgU3RyaW5nIGlkID0gKFN0cmluZykgaS5uZXh0KCk7Ci0KLSAgICAgIC8vIGxpYnJhcnlSZWZlcmVuY2VzIGVudHJ5Ci0gICAgICBYcHAzRG9tIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgWHBwM0RvbSB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImlkIik7Ci0gICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCBpZCk7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJpc0pESyIpOwotICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgImZhbHNlIik7Ci0gICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgIHRhcmdldFJlZnNET00uYWRkQ2hpbGQoaGFzaERPTSk7Ci0gICAgfQotCi0gICAgLy8gRmlyc3QsIGFkZCBKU1AgUnVudGltZSBkZXBlbmRlbmN5IGlmIHNyYy9tYWluL3dlYmFwcCBleGlzdHMKLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlRGVmc0RPTSk7Ci0gICAgcmVtb3ZlQ2hpbGRyZW4oc291cmNlUmVmc0RPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlRGVmc0RPTSwgdGFyZ2V0RGVmc0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20oc291cmNlUmVmc0RPTSwgdGFyZ2V0UmVmc0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZUxvY2FsVGFnTGlicmFyaWVzKFhwcDNEb20gdGFyZ2V0TGlic0RPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgVGxkQ29udGVudEhhbmRsZXIgdGxkSGFuZGxlciA9IG5ldyBUbGRDb250ZW50SGFuZGxlcigpOwotICAgIFN0cmluZyBwYXRoID0gbnVsbDsKLQotICAgIC8vIExvb3AgdGhyb3VnaCBhbGwgdGhlIC50bGQgZmlsZXMgaW4gdGhlIFdFQi1JTkYgZGlyCi0gICAgLy8gUGFyc2UgZWFjaCBhbmQgZ2V0IHRoZSB2YWx1ZXMgbmVlZGVkIGZvciB0aGUgVGFnTGlicmFyaWVzCi0gICAgLy8gaGFzaCBpbiB0aGUgLmpwciBmaWxlLgotICAgIHRyeQotICAgIHsKLSAgICAgIEZpbGUgd2ViSW5mRGlyID0KLSAgICAgICAgbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksICJzcmMvbWFpbi93ZWJhcHAvV0VCLUlORiIpOwotICAgICAgaWYgKHdlYkluZkRpciA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIEZpbGVbXSBmaWxlcyA9IHdlYkluZkRpci5saXN0RmlsZXMoKTsKLSAgICAgIGlmIChmaWxlcyA9PSBudWxsKQotICAgICAgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0KLSAgICAgIFhwcDNEb20gaGFzaERPTSA9IG51bGw7Ci0gICAgICBYcHAzRG9tIHZhbHVlRE9NID0gbnVsbDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIHBhdGggPSBmaWxlc1tpXS5nZXRQYXRoKCk7Ci0gICAgICAgIGlmIChwYXRoLmVuZHNXaXRoKCIudGxkIikpCi0gICAgICAgIHsKLSAgICAgICAgICBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLSAgICAgICAgICAvLyB3ZSBoYXZlIGEgdGFnIGxpYnJhcnkuICBQYXJzZSBpdCBhbmQKLSAgICAgICAgICAvLyBnZXQgdGhlIHZhbHVlcyBuZWVkZWQgZm9yIHRoZSAuanByIGZpbGUKLQotICAgICAgICAgIC8vIFBhcnNlCi0gICAgICAgICAgdGxkSGFuZGxlci5wYXJzZVRsZChmaWxlc1tpXSk7Ci0gICAgICAgICAgLy8gY2FsbCBnZXR0b3JzIHRvIGdldCB0aGUgdmFsdWVzCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAianNwVmVyc2lvbiIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRsZEhhbmRsZXIuZ2V0SnNwVmVyc2lvbigpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0bGRIYW5kbGVyLmdldE5hbWUoKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJwcmVmaXgiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0bGRIYW5kbGVyLmdldFByZWZpeCgpKTsKLSAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInRsZFVSTCIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsCi0gICAgICAgICAgICAiV0VCLUlORi8iICsgcGF0aC5zdWJzdHJpbmcocGF0aC5pbmRleE9mKCJXRUItSU5GIikgKyAgOCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiVVJJIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXRVUkkoKSk7Ci0gICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdGxkSGFuZGxlci5nZXRWZXJzaW9uKCkpOwotICAgICAgICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgICAgICAgLy8gQWRkIGVhY2ggZmlsZSdzIGhhc2ggdG8gdGhlIHRhZy1saWJyYXJpZXMgImxpc3QiCi0gICAgICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICAgICAgfSAvLyBlbmRpZgotICAgICAgfSAvLyBlbmRmb3IKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgY2F0Y2ggKFNBWEV4Y2VwdGlvbiBzYXhleCkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJTQVggUGFyc2UgRXhjZXB0aW9uIHBhcnNpbmcgIiArIHBhdGggKyAiOiAiICsKLSAgICAgICAgICAgICAgICAgICAgc2F4ZXguZ2V0TWVzc2FnZSgpLCBzYXhleCk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBpb2UpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiVW5hYmxlIHRvIG9wZW4gYW4gSW5wdXRTdHJlYW0gdG8gIiArIHBhdGgsIGlvZSk7Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHBjZSkKLSAgICB7Ci0gICAgICBnZXRMb2coKS5pbmZvKCJVbmFibGUgdG8gY3JlYXRlIFNBWCBwYXJzZXIgZm9yICIgKyBwYXRoLCBwY2UpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VUYWdMaWJyYXJpZXMoWHBwM0RvbSBwcm9qZWN0RE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBUaGlzIGJvb2xlYW4gaXMgc2V0IGJ5IHNwZWNpZnlpbmcgdGhlIGpkZXYucGx1Z2luLmFkZC50YWdsaWJzCi0gICAgLy8gcHJvcGVydHkgYXQgdGhlIHRvcCBvZiBhIHByb2plY3QncyBwb20gZmlsZS4gIFRoZXJlIGFyZSBwcm9qZWN0cwotICAgIC8vIHRoYXQgZG9uJ3QgbmVlZCB0YWdsaWJzIGluIHRoZWlyIC5qcHIgZmlsZXMgdG8gY29tcGlsZSBhbmQgdGhpcwotICAgIC8vIGFsbG93cyB0aGVtIHRvIGJlIGV4Y2x1ZGVkLgotICAgIGlmICghX2FkZFRhZ0xpYnMpCi0gICAgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIl0KLSAgICAvLyAgICAgICAvbGlzdFtAbj0idGFnLWxpYmFyaWVzIl0KLSAgICBYcHAzRG9tIHByb2plY3RUYWdzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RET00sICJoYXNoIiwgIm9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIik7Ci0gICAgWHBwM0RvbSB0YWdMaWJzRE9NID0KLSAgICAgIGZpbmROYW1lZENoaWxkKHByb2plY3RUYWdzRE9NLCAibGlzdCIsICJ0YWctbGlicmFyaWVzIik7Ci0KLSAgICBYcHAzRG9tIHRhcmdldExpYnNET00gPSBuZXcgWHBwM0RvbSgibGlzdCIpOwotCi0gICAgLy8KLSAgICAvLyB0YWdMaWJyYXJ5RGVmaW5pdGlvbnMKLSAgICAvLwotICAgIC8vPGhhc2g+Ci0gICAgLy8gIDxoYXNoIG49ImJhc2VMaWJyYXJ5Ij4KLSAgICAvLyAgICA8dmFsdWUgbj0ibmFtZSIgdj0iSlNGIEhUTUwiPjwvdmFsdWU+Ci0gICAgLy8gICAgPHZhbHVlIG49InZlcnNpb24iIHY9IjEuMiI+PC92YWx1ZT4KLSAgICAvLyAgPC9oYXNoPgotICAgIC8vICA8dmFsdWUgbj0ianNwVmVyc2lvbiIgdj0iMi4xIj48L3ZhbHVlPgotICAgIC8vICA8dmFsdWUgbj0ibmFtZSIgdj0iSlNGIEhUTUwiPjwvdmFsdWU+Ci0gICAgLy8KLSAgICAvLyAgPHZhbHVlIG49InRsZFVSTCIgdj0iQG9yYWNsZS5ob21lQGxpYi9qYXZhL3NoYXJlZC9vcmFjbGUuanNmLzEuMi9qc2YtcmkuamFyIS9NRVRBLUlORi9odG1sX2Jhc2ljLnRsZCI+PC92YWx1ZT4KLSAgICAvLyAgPHZhbHVlIG49IlVSSSIgdj0iaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCI+PC92YWx1ZT4KLSAgICAvLyAgPHZhbHVlIG49InZlcnNpb24iIHY9IjEuMiI+PC92YWx1ZT4KLSAgICAvLzwvaGFzaD4KLSAgICAvLwotCi0gICAgLy8gUGFyZW50ICJoYXNoIgotICAgIFhwcDNEb20gaGFzaERPTSA9IG51bGw7Ci0KLSAgICAvLyA8dmFsdWUuLi4KLSAgICBYcHAzRG9tIHZhbHVlRE9NID0gbnVsbDsKLQotICAgIGlmIChkaXN0cmlidXRlZFRhZ0xpYnJhcmllcyAhPSBudWxsICYmCi0gICAgICAgIGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzLmxlbmd0aCA+IDApCi0gICAgewotICAgICAgLy8gUHJvY2VzcyBlYWNoIGRpc3RyaWJ1dGVkIFRhZyBMaWJyYXJ5Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzLmxlbmd0aDsgaSsrKQotICAgICAgewotICAgICAgICBQcm9wZXJ0aWVzIGRpc1RhZ0xpYiA9IGRpc3RyaWJ1dGVkVGFnTGlicmFyaWVzW2ldOwotICAgICAgICBTdHJpbmcgbmFtZU5hbWUgPSBudWxsOwotICAgICAgICBTdHJpbmcgbmFtZVZhbHVlID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25OYW1lID0gbnVsbDsKLSAgICAgICAgU3RyaW5nIHZlcnNpb25WYWx1ZSA9IG51bGw7Ci0KLSAgICAgICAgLy8gQ3JlYXRlIHBhcmVudCBoYXNoIGZvciBlYWNoIHRhZ2xpYgotICAgICAgICBoYXNoRE9NID0gbmV3IFhwcDNEb20oImhhc2giKTsKLQotICAgICAgICAvLyBiYXNlTGlicmFyeSAiaGFzaCIgZm9yIGVhY2ggdGFnbGliCi0gICAgICAgIFhwcDNEb20gaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgICAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLSAgICAgICAgLy8gQWRkIGJhc2VMaWJyYXJ5IGhhc2ggdG8gcGFyZW50IGhhc2gKLSAgICAgICAgaGFzaERPTS5hZGRDaGlsZChoYXNoQmFzZURPTSk7Ci0KLSAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHByb3BlcnR5IG9mIHRoZSB0YWdsaWIKLSAgICAgICAgZm9yIChFbnVtZXJhdGlvbiBrZXlzID0gZGlzVGFnTGliLnByb3BlcnR5TmFtZXMoKTsKLSAgICAgICAgICAgICBrZXlzLmhhc01vcmVFbGVtZW50cygpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAvLyBHZXQgdGhlIG5hbWUgdmFsdWUgcGFpcgotICAgICAgICAgIFN0cmluZyBuYW1lID0gKFN0cmluZykga2V5cy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyB2YWx1ZSA9IChTdHJpbmcpIGRpc1RhZ0xpYi5nZXQobmFtZSk7Ci0KLSAgICAgICAgICAvLyBQdXQgdGhlIG5hbWUgYW5kIHZlcnNpb24gdmFsdWVzCi0gICAgICAgICAgLy8gaW5zaWRlIHRoZSBiYXNlTGlicmFyeSBoYXNoLgotICAgICAgICAgIC8vIFRoaXMgb25seSBoYXBwZW5zIG9uY2UgcGVyIHRhZ2xpYgotICAgICAgICAgIGlmICgibmFtZSIuZXF1YWxzKG5hbWUpKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIG5hbWVOYW1lID0gbmFtZTsKLSAgICAgICAgICAgIG5hbWVWYWx1ZSA9IHZhbHVlOwotCi0gICAgICAgICAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCBuYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHZhbHVlKTsKLSAgICAgICAgICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgICAgICAgICAgLy8gRHVwbGljYXRlIHRoZSAibmFtZSIgIDx2YWx1ZS4uLgotICAgICAgICAgICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBwYXJlbnQgaGFzaAotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIG5hbWVOYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIG5hbWVWYWx1ZSk7Ci0gICAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZSBpZiAoInZlcnNpb24iLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICB2ZXJzaW9uTmFtZSA9IG5hbWU7Ci0gICAgICAgICAgICB2ZXJzaW9uVmFsdWUgPSB2YWx1ZTsKLQotICAgICAgICAgICAgLy8gbj0idmVyc2lvbiIgdj08dGFnbGliIHZlcnNpb24+IGluIGJhc2VMaWJyYXJ5Ci0gICAgICAgICAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgbmFtZSk7Ci0gICAgICAgICAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB2YWx1ZSk7Ci0gICAgICAgICAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAgICAgICAgIC8vIER1cGxpY2F0ZSB0aGUgInZlcnNpb24iIDx2YWx1ZS4uLgotICAgICAgICAgICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAgICAgICAgIC8vIG49InZlcnNpb24iIHY9PHRhZ2xpYiB2ZXJzaW9uPiBpbiBwYXJlbnQgaGFzaAotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIHZlcnNpb25OYW1lKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHZlcnNpb25WYWx1ZSk7Ci0gICAgICAgICAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZWxzZQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGlmICgidGxkIi5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIC8vIERpZCBub3Qgd2FudCB0byBoYXZlIGEgVVJMIGluIHRoZSBwb20gZmlsZS4KLSAgICAgICAgICAgICAgLy8gSSBqdXN0IHdhbnRlZCB0aGUgdXNlciB0byBzcGVjaWZ5IHRoZSBuYW1lCi0gICAgICAgICAgICAgIC8vIG9mIHRoZSB0bGQgZmlsZS4gIFNvIHdlIGZpeCBpdCBmb3IgSkRldgotICAgICAgICAgICAgICAvLyBoZXJlLgotICAgICAgICAgICAgICBuYW1lICs9ICJVUkwiOwotICAgICAgICAgICAgICB2YWx1ZSA9IHRhZ0xpYkRpcmVjdG9yeSArICIvIiArIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgICAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsIG5hbWUpOwotICAgICAgICAgICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgdmFsdWUpOwotICAgICAgICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IC8vZW5kZm9yIHByb2Nlc3NpbmcgZWFjaCBwcm9wZXJ0eQotCi0gICAgICAgIC8vIFdlIGFyZSBkb25lIHdpdGggdGhpcyBkaXNUYWdMaWIKLSAgICAgICAgLy8gQWRkIGl0IHRvIHRoZSB0YXJnZXRMaWJzRE9NCi0gICAgICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRMaWJzRE9NLmFkZENoaWxkKGhhc2hET00pOwotICAgICAgICB9Ci0gICAgICB9IC8vIGVuZGZvciBwcm9jZXNzaW5nIGVhY2ggZGlzdHJpYnV0ZWQgdGFnIGxpYgotICAgIH0gLy9lbmRpZgotICAgIGVsc2UKLSAgICB7Ci0gICAgICAvLyBVc2UgRGVmYXVsdCB0YWcgbGlicmFyeSBjb25maWd1cmF0aW9uLiAgU2VlIGNvbW1lbnQgYmVmb3JlCi0gICAgICAvLyByZXBsYWNlVGFnTGlicmFyaWVzLgotICAgICAgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMocHJvamVjdERPTSwgdGFyZ2V0TGlic0RPTSk7Ci0gICAgfQotCi0gICAgcmVwbGFjZUxvY2FsVGFnTGlicmFyaWVzKHRhcmdldExpYnNET00pOwotCi0gICAgLy8gRmlyc3QsIGFkZCBKU1AgUnVudGltZSBkZXBlbmRlbmN5IGlmIHNyYy9tYWluL3dlYmFwcCBleGlzdHMKLSAgICAvLyBUT0RPOiB1c2UgYSBiZXR0ZXIgbWVyZ2UgYWxnb3JpdGhtCi0gICAgcmVtb3ZlQ2hpbGRyZW4odGFnTGlic0RPTSk7Ci0KLSAgICAvLyBtYWtlIHN1cmUgdG8gcGFzcyBCb29sZWFuLkZBTFNFIHRvIGFsbG93Ci0gICAgLy8gbXVsdGlwbGUgY2hpbGQgZWxlbWVudHMgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgWHBwM0RvbS5tZXJnZVhwcDNEb20odGFnTGlic0RPTSwgdGFyZ2V0TGlic0RPTSwgQm9vbGVhbi5GQUxTRSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZURlZmF1bHRUYWdMaWJyYXJpZXMoWHBwM0RvbSBwcm9qZWN0RE9NLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWHBwM0RvbSB0YXJnZXRMaWJzRE9NKQotICAgIHRocm93cyBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBCZWdpbiBKU0YgSFRNTCBUYWcgbGliCi0gICAgWHBwM0RvbSBoYXNoRE9NICAgICA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSBoYXNoQmFzZURPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSB2YWx1ZURPTSAgICA9IG51bGw7Ci0KLSAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLQotICAgIC8vIEFkZCBiYXNlTGlicmFyeSBoYXNoIHRvIHBhcmVudCBoYXNoCi0gICAgaGFzaERPTS5hZGRDaGlsZChoYXNoQmFzZURPTSk7Ci0KLSAgICAvLyBDcmVhdGUgcGFyZW50IGhhc2ggZm9yIGVhY2ggdGFnbGliCi0gICAgLy8gICAgICAgIGhhc2hET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotCi0gICAgLy8gYmFzZUxpYnJhcnkgImhhc2giIGZvciBlYWNoIHRhZ2xpYgotICAgIC8vIFhwcDNEb20gaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotICAgIC8vICAgICAgICBoYXNoQmFzZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAiYmFzZUxpYnJhcnkiKTsKLQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBiYXNlTGlicmFyeQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiSlNGIEhUTUwiKTsKLSAgICBoYXNoQmFzZURPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBEdXBsaWNhdGUgdGhlICJuYW1lIiAgPHZhbHVlLi4uCi0gICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJuYW1lIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIkpTRiBIVE1MIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICAvLyBuPSJ2ZXJzaW9uIiB2PTx0YWdsaWIgdmVyc2lvbj4gaW4gYmFzZUxpYnJhcnkKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjEuMiIpOwotICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIER1cGxpY2F0ZSB0aGUgInZlcnNpb24iIDx2YWx1ZS4uLgotICAgIC8vIG91dHNpZGUgb2YgdGhlIGJhc2VMaWJyYXJ5Ci0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIHBhcmVudCBoYXNoCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIxLjIiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgImpzcFZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMi4xIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ0bGRVUkwiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCB0YWdMaWJEaXJlY3RvcnkgKyAiL2h0bWxfYmFzaWMudGxkIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkkiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvaHRtbCIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGlzIGRpc1RhZ0xpYgotICAgIC8vIEFkZCBpdCB0byB0aGUgdGFyZ2V0TGlic0RPTQotICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICB9Ci0KLSAgICAvLyBCZWdpbiBKU0YgQ29yZSBUYWdsaWIKLSAgICBoYXNoRE9NICAgICA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgaGFzaEJhc2VET00gPSBuZXcgWHBwM0RvbSgiaGFzaCIpOwotCi0gICAgaGFzaEJhc2VET00uc2V0QXR0cmlidXRlKCJuIiwgImJhc2VMaWJyYXJ5Iik7Ci0KLSAgICAvLyBBZGQgYmFzZUxpYnJhcnkgaGFzaCB0byBwYXJlbnQgaGFzaAotICAgIGhhc2hET00uYWRkQ2hpbGQoaGFzaEJhc2VET00pOwotCi0gICAgLy8gbj0ibmFtZSwgdj08bmFtZSBvZiB0YWdsaWI+IGluIGJhc2VMaWJyYXJ5Ci0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAibmFtZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJKU0YgQ29yZSIpOwotICAgIGhhc2hCYXNlRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIER1cGxpY2F0ZSB0aGUgIm5hbWUiICA8dmFsdWUuLi4KLSAgICAvLyBvdXRzaWRlIG9mIHRoZSBiYXNlTGlicmFyeQotICAgIC8vIG49Im5hbWUsIHY9PG5hbWUgb2YgdGFnbGliPiBpbiBwYXJlbnQgaGFzaAotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgIm5hbWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiSlNGIENvcmUiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIC8vIG49InZlcnNpb24iIHY9PHRhZ2xpYiB2ZXJzaW9uPiBpbiBiYXNlTGlicmFyeQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInZlcnNpb24iKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiMS4yIik7Ci0gICAgaGFzaEJhc2VET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gRHVwbGljYXRlIHRoZSAidmVyc2lvbiIgPHZhbHVlLi4uCi0gICAgLy8gb3V0c2lkZSBvZiB0aGUgYmFzZUxpYnJhcnkKLSAgICAvLyBuPSJuYW1lLCB2PTxuYW1lIG9mIHRhZ2xpYj4gaW4gcGFyZW50IGhhc2gKLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJ2ZXJzaW9uIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJ2IiwgIjEuMiIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoIm4iLCAianNwVmVyc2lvbiIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICIyLjEiKTsKLSAgICBoYXNoRE9NLmFkZENoaWxkKHZhbHVlRE9NKTsKLQotICAgIHZhbHVlRE9NID0gbmV3IFhwcDNEb20oInZhbHVlIik7Ci0gICAgdmFsdWVET00uc2V0QXR0cmlidXRlKCJuIiwgInRsZFVSTCIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsIHRhZ0xpYkRpcmVjdG9yeSArICIvanNmX2NvcmUudGxkIik7Ci0gICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0KLSAgICB2YWx1ZURPTSA9IG5ldyBYcHAzRG9tKCJ2YWx1ZSIpOwotICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkkiKTsKLSAgICB2YWx1ZURPTS5zZXRBdHRyaWJ1dGUoInYiLCAiaHR0cDovL2phdmEuc3VuLmNvbS9qc2YvY29yZSIpOwotICAgIGhhc2hET00uYWRkQ2hpbGQodmFsdWVET00pOwotCi0gICAgLy8gV2UgYXJlIGRvbmUgd2l0aCB0aGlzIGRpc1RhZ0xpYgotICAgIC8vIEFkZCBpdCB0byB0aGUgdGFyZ2V0TGlic0RPTQotICAgIGlmIChoYXNoRE9NICE9IG51bGwpCi0gICAgewotICAgICAgdGFyZ2V0TGlic0RPTS5hZGRDaGlsZChoYXNoRE9NKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZVBhcmFtZXRlcnMoU3RyaW5nIHByb2plY3ROYW1lLCBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIGlmICgoX3JlbGVhc2VNYWpvciA+PSAxMSkgJiYgKHByb2plY3ROYW1lICE9IG51bGwpKQotICAgIHsKLSAgICAgIHJlcGxhY2VDb21waWxlcihwcm9qZWN0RE9NKTsKLSAgICAgIHJlcGxhY2VNYWtlUHJvamVjdEFuZFJ1blRhcmdldChwcm9qZWN0RE9NKTsKLSAgICB9Ci0gIH0KLSAgcHJpdmF0ZSB2b2lkIHJlcGxhY2VDb21waWxlcihYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iPgotICAgIC8vICAgPHZhbHVlIG49ImFzc2VydGlvbnNFbmFibGVkIiB2PSJ0cnVlIi8+Ci0gICAgLy8gICA8dmFsdWUgbj0iY29tcGlsZXIubmFtZSIgdj0iT2pjIi8+Ci0gICAgLy8gICA8bGlzdCBuPSJjb3B5UmVzIj4KLSAgICAvLyAgICAgIDxzdHJpbmcgdj0iLmphdmEiLz4KLSAgICBYcHAzRG9tIGNvbmZpZ0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsCi0gICAgICAgICAgICAgICAgICAgICAib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiIpOwotICAgIFhwcDNEb20gY29tcGlsZXJET00gPSBmaW5kTmFtZWRDaGlsZChjb25maWdET00sICJ2YWx1ZSIsICJjb21waWxlci5uYW1lIik7Ci0gICAgU3RyaW5nIGNvbXBpbGVyVmFsdWUgPSAiT2pjIjsKLQotICAgIGlmICggICAoY29tcGlsZXIgIT0gbnVsbCkKLSAgICAgICAgJiYgIkphdmFjIi5lcXVhbHNJZ25vcmVDYXNlKGNvbXBpbGVyKQotICAgICAgICkKLSAgICB7Ci0gICAgICBjb21waWxlclZhbHVlID0gIkphdmFjIjsKLSAgICB9Ci0gICAgY29tcGlsZXJET00uc2V0QXR0cmlidXRlKCJ2IiwgY29tcGlsZXJWYWx1ZSk7Ci0KLSAgICByZXR1cm47Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZU1ha2VQcm9qZWN0QW5kUnVuVGFyZ2V0KFhwcDNEb20gcHJvamVjdERPTSkKLSAgICB0aHJvd3MgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgLy8gL2pwcjpwcm9qZWN0Ci0gICAgLy8gICAvaGFzaFtAbj0ib3JhY2xlLmpkZXZlbG9wZXIucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zIl0KLSAgICAvLyAgICAgL2hhc2hbQG49InJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyJdCi0gICAgLy8gICAgICAgL2hhc2hbQG49IkRlZmF1bHQiXQotICAgIC8vICAgICAgICAgL3ZhbHVlW0BuPSJtYWtlUHJvamVjdCIgdj0iZmFsc2UiXQotICAgIC8vICAgICAgICAgL3VybFtAbj0idGFyZ2V0VVJMIiBwYXRoPSJzcmMvbWFpbi93ZWJhcHAvaW5kZXguanNweCJdCi0gICAgWHBwM0RvbSBjb25maWdET00gPQotICAgICAgZmluZE5hbWVkQ2hpbGQocHJvamVjdERPTSwgImhhc2giLAotICAgICAgICAgICAgICAgICAgICAgIm9yYWNsZS5qZGV2ZWxvcGVyLnJ1bm5lci5SdW5Db25maWd1cmF0aW9ucyIpOwotICAgIFhwcDNEb20gZGVmc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChjb25maWdET00sICJoYXNoIiwgInJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyIpOwotICAgIFhwcDNEb20gZGVmYXVsdERPTSA9IGZpbmROYW1lZENoaWxkKGRlZnNET00sICJoYXNoIiwgIkRlZmF1bHQiKTsKLSAgICBYcHAzRG9tIG1ha2VQcm9qZWN0RG9tID0KLSAgICAgIGZpbmROYW1lZENoaWxkKGRlZmF1bHRET00sICJ2YWx1ZSIsICJjb21waWxlQmVmb3JlUnVuIik7Ci0KLSAgICBpZiAobWFrZVByb2plY3QpCi0gICAgewotICAgICAgbWFrZVByb2plY3REb20uc2V0QXR0cmlidXRlKCJ2IiwgInRydWUiKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIG1ha2VQcm9qZWN0RG9tLnNldEF0dHJpYnV0ZSgidiIsICJmYWxzZSIpOwotICAgIH0KLQotICAgIGlmICgocnVuVGFyZ2V0ICE9IG51bGwpICYmICEiIi5lcXVhbHMocnVuVGFyZ2V0KSkKLSAgICB7Ci0gICAgICAvLyBDb252ZXJ0IGZpbGUgc2VwYXJhdG9yIGNoYXJzIHRvIGdlbmVyaWMKLSAgICAgIFN0cmluZyB0YXJnZXRVUkwgPSAiIjsKLSAgICAgIGlmIChGaWxlLnNlcGFyYXRvckNoYXIgPT0gJy8nKQotICAgICAgewotICAgICAgICB0YXJnZXRVUkwgPSBydW5UYXJnZXQucmVwbGFjZSgnXFwnLCAnLycpOyAvLyBVbml4Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHRhcmdldFVSTCA9IHJ1blRhcmdldC5yZXBsYWNlKCcvJywgJ1xcJyk7IC8vIFdpbmRvd3MKLSAgICAgIH0KLQotICAgICAgWHBwM0RvbSB0YXJnZXRET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgICB0YXJnZXRET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgdGFyZ2V0VVJMKTsKLSAgICAgIHRhcmdldERPTS5zZXRBdHRyaWJ1dGUoIm4iLCAidGFyZ2V0VVJMIik7Ci0gICAgICBkZWZhdWx0RE9NLmFkZENoaWxkKHRhcmdldERPTSk7Ci0gICAgfQotCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlUYWdMaWJyYXJpZXMoRmlsZSBwcm9qZWN0RGlyLCBMaXN0IGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTGlzdCBhcnRpZmFjdHMpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKHByb2plY3REaXIsICJzcmMvbWFpbi93ZWJhcHAvV0VCLUlORiIpOwotCi0gICAgZm9yIChJdGVyYXRvciBpID0gZGVwZW5kZW5jaWVzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgRGVwZW5kZW5jeSBkZXBlbmRlbmN5ID0gKERlcGVuZGVuY3kpIGkubmV4dCgpOwotICAgICAgTWF2ZW5Qcm9qZWN0IGRlcGVuZGVudFByb2plY3QgPQotICAgICAgICBmaW5kRGVwZW5kZW50UHJvamVjdChkZXBlbmRlbmN5LmdldE1hbmFnZW1lbnRLZXkoKSk7Ci0gICAgICBpZiAoZGVwZW5kZW50UHJvamVjdCAhPSBudWxsKQotICAgICAgewotICAgICAgICBMaXN0IHJlc291cmNlUm9vdHMgPSBkZXBlbmRlbnRQcm9qZWN0LmdldFJlc291cmNlcygpOwotICAgICAgICBmb3IgKEl0ZXJhdG9yIGogPSByZXNvdXJjZVJvb3RzLml0ZXJhdG9yKCk7IGouaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICBSZXNvdXJjZSByZXNvdXJjZSA9IChSZXNvdXJjZSkgai5uZXh0KCk7Ci0gICAgICAgICAgU3RyaW5nIHJlc291cmNlUm9vdCA9IHJlc291cmNlLmdldERpcmVjdG9yeSgpOwotICAgICAgICAgIEZpbGUgcmVzb3VyY2VEaXJlY3RvcnkgPSBuZXcgRmlsZShyZXNvdXJjZVJvb3QpOwotICAgICAgICAgIGlmIChyZXNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKHJlc291cmNlUm9vdCk7Ci0gICAgICAgICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgICAgICAgc2Nhbm5lci5zZXRJbmNsdWRlcyhuZXcgU3RyaW5nW10KLSAgICAgICAgICAgICAgICB7ICJNRVRBLUlORi8qLnRsZCIgfSk7Ci0gICAgICAgICAgICBzY2FubmVyLnNjYW4oKTsKLQotICAgICAgICAgICAgU3RyaW5nW10gdGxkRmlsZXMgPSBzY2FubmVyLmdldEluY2x1ZGVkRmlsZXMoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGsgPSAwOyBrIDwgdGxkRmlsZXMubGVuZ3RoOyBrKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IG5ldyBGaWxlKHJlc291cmNlRGlyZWN0b3J5LCB0bGRGaWxlc1trXSk7Ci0gICAgICAgICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgc291cmNlRmlsZS5nZXROYW1lKCkpOwotCi0gICAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlLmV4aXN0cygpKQotICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFyZ2V0RmlsZS5kZWxldGUoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBGaWxlVXRpbHMuY29weUZpbGUoc291cmNlRmlsZSwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBNYXAgc291cmNlTWFwID0gbmV3IFRyZWVNYXAoKTsKLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IGFydGlmYWN0cy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTsgKQotICAgIHsKLSAgICAgIEFydGlmYWN0IGFydGlmYWN0ID0gKEFydGlmYWN0KSBpLm5leHQoKTsKLSAgICAgIGlmICghaXNEZXBlbmRlbnRQcm9qZWN0KGFydGlmYWN0LmdldERlcGVuZGVuY3lDb25mbGljdElkKCkpICYmCi0gICAgICAgICAgImphciIuZXF1YWxzKGFydGlmYWN0LmdldFR5cGUoKSkpCi0gICAgICB7Ci0gICAgICAgIEZpbGUgZmlsZSA9IGFydGlmYWN0LmdldEZpbGUoKTsKLSAgICAgICAgSmFyRmlsZSBqYXJGaWxlID0gbmV3IEphckZpbGUoZmlsZSk7Ci0gICAgICAgIEVudW1lcmF0aW9uIGphckVudHJpZXMgPSBqYXJGaWxlLmVudHJpZXMoKTsKLSAgICAgICAgd2hpbGUgKGphckVudHJpZXMuaGFzTW9yZUVsZW1lbnRzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICBKYXJFbnRyeSBqYXJFbnRyeSA9IChKYXJFbnRyeSkgamFyRW50cmllcy5uZXh0RWxlbWVudCgpOwotICAgICAgICAgIFN0cmluZyBuYW1lID0gamFyRW50cnkuZ2V0TmFtZSgpOwotICAgICAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIk1FVEEtSU5GLyIpICYmIG5hbWUuZW5kc1dpdGgoIi50bGQiKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBMaXN0IHRhZ2xpYnMgPSAoTGlzdCkgc291cmNlTWFwLmdldChuYW1lKTsKLSAgICAgICAgICAgIGlmICh0YWdsaWJzID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIHRhZ2xpYnMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgICAgIHNvdXJjZU1hcC5wdXQobmFtZSwgdGFnbGlicyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRhZ2xpYnMuYWRkKGZpbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoSXRlcmF0b3IgaSA9IHNvdXJjZU1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWFwLkVudHJ5IGUgPSAoTWFwLkVudHJ5KSBpLm5leHQoKTsKLSAgICAgIExpc3QgdGFnbGlicyA9IChMaXN0KSBlLmdldFZhbHVlKCk7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGUuZ2V0S2V5KCk7Ci0KLSAgICAgIGZvciAoSXRlcmF0b3IgdGkgPSB0YWdsaWJzLml0ZXJhdG9yKCk7IHRpLmhhc05leHQoKTsgKQotICAgICAgewotICAgICAgICBGaWxlIGZpbGUgPSAoRmlsZSkgdGkubmV4dCgpOwotICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBuZXcgRmlsZShuYW1lKTsKLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZmYgPSBuZXcgU3RyaW5nQnVmZmVyKHNvdXJjZUZpbGUuZ2V0TmFtZSgpKTsKLSAgICAgICAgaWYgKHRhZ2xpYnMuc2l6ZSgpID4gMSkKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBqYXJOYW1lID0KLSAgICAgICAgICAgIGZpbGUuZ2V0TmFtZSgpLnN1YnN0cmluZygwLCBmaWxlLmdldE5hbWUoKS5sZW5ndGgoKSAtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi5qYXIiLmxlbmd0aCgpKTsKLSAgICAgICAgICBidWZmLmluc2VydChidWZmLmxlbmd0aCgpIC0gIi50bGQiLmxlbmd0aCgpLCAiLSIgKyBqYXJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFVSTCBqYXJVUkwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICAgIFVSTCBzb3VyY2VVUkwgPQotICAgICAgICAgIG5ldyBVUkwoImphcjoiICsgamFyVVJMLnRvRXh0ZXJuYWxGb3JtKCkgKyAiIS8iICsgbmFtZSk7Ci0gICAgICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgYnVmZi50b1N0cmluZygpKTsKLSAgICAgICAgaWYgKHRhcmdldEZpbGUuZXhpc3RzKCkpCi0gICAgICAgIHsKLSAgICAgICAgICB0YXJnZXRGaWxlLmRlbGV0ZSgpOwotICAgICAgICB9Ci0gICAgICAgIEZpbGVVdGlscy5jb3B5VVJMVG9GaWxlKHNvdXJjZVVSTCwgdGFyZ2V0RmlsZSk7Ci0gICAgICAgIHRhcmdldEZpbGUuc2V0UmVhZE9ubHkoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVwbGFjZU91dHB1dERpcmVjdG9yeShGaWxlIHByb2plY3REaXIsIEZpbGUgb3V0cHV0RGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBYcHAzRG9tIHByb2plY3RET00pCi0gICAgdGhyb3dzIFhtbFB1bGxQYXJzZXJFeGNlcHRpb24KLSAgewotICAgIC8vIC9qcHI6cHJvamVjdAotICAgIC8vICAgL2hhc2hbQG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RQYXRocyJdCi0KLSAgICBYcHAzRG9tIHByb2plY3RQYXRoc0RPTSA9Ci0gICAgICBmaW5kTmFtZWRDaGlsZChwcm9qZWN0RE9NLCAiaGFzaCIsICJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiKTsKLSAgICBYcHAzRG9tIHNvdXJjZURPTSA9IG5ldyBYcHAzRG9tKCJ1cmwiKTsKLQotICAgIC8vCi0gICAgLy8gPHVybCBAbj0ib3V0cHV0RGlyZWN0b3J5IiBwYXRoPSJbcmVsYXRpdmUtcGF0aC10by1vdXRwdXQtZGlyXSIgLz4KLSAgICAvLwotICAgIHNvdXJjZURPTS5zZXRBdHRyaWJ1dGUoInBhdGgiLCBnZXRSZWxhdGl2ZURpcihwcm9qZWN0RGlyLCBvdXRwdXREaXIpKTsKLSAgICBzb3VyY2VET00uc2V0QXR0cmlidXRlKCJuIiwgIm91dHB1dERpcmVjdG9yeSIpOwotICAgIHByb2plY3RQYXRoc0RPTS5hZGRDaGlsZChzb3VyY2VET00pOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpEZXZlbG9wZXIgcHJvamVjdCBmaWxlIGZvciBhIE1hdmVuIFBPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3QgIHRoZSBNYXZlbiBQT00KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpEZXZlbG9wZXIgcHJvamVjdCBmaWxlCi0gICAqLwotICBwcml2YXRlIEZpbGUgZ2V0SlByb2plY3RGaWxlKE1hdmVuUHJvamVjdCBwcm9qZWN0KQotICB7Ci0gICAgU3RyaW5nIGpwck5hbWUgPSBwcm9qZWN0LmdldEFydGlmYWN0SWQoKSArICIuanByIjsKLSAgICByZXR1cm4gbmV3IEZpbGUocHJvamVjdC5nZXRCYXNlZGlyKCksIGpwck5hbWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIEpEZXZlbG9wZXIgdGVzdCBwcm9qZWN0IGZpbGUgZm9yIGEgTWF2ZW4gUE9NLgotICAgKgotICAgKiBAcGFyYW0gcHJvamVjdCAgdGhlIE1hdmVuIFBPTQotICAgKgotICAgKiBAcmV0dXJuICB0aGUgSkRldmVsb3BlciB0ZXN0IHByb2plY3QgZmlsZQotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIGdldEpQcm9qZWN0VGVzdEZpbGUoTWF2ZW5Qcm9qZWN0IHByb2plY3QpCi0gIHsKLSAgICBTdHJpbmcganByTmFtZSA9IHByb2plY3QuZ2V0QXJ0aWZhY3RJZCgpICsgIi10ZXN0LmpwciI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBqcHJOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBKRGV2ZWxvcGVyIHdvcmtzcGFjZSBmaWxlIGZvciBhIE1hdmVuIFBPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3QgIHRoZSBNYXZlbiBQT00KLSAgICoKLSAgICogQHJldHVybiAgdGhlIEpEZXZlbG9wZXIgd29ya3NwYWNlIGZpbGUKLSAgICovCi0gIHByaXZhdGUgRmlsZSBnZXRKV29ya3NwYWNlRmlsZShNYXZlblByb2plY3QgcHJvamVjdCkKLSAgewotICAgIFN0cmluZyBqd3NOYW1lID0gcHJvamVjdC5nZXRBcnRpZmFjdElkKCkgKyAiLmp3cyI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKHByb2plY3QuZ2V0QmFzZWRpcigpLCBqd3NOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIEpEZXZlbG9wZXIgd29ya3NwYWNlIGZpbGUgaW50byBET00uCi0gICAqCi0gICAqIEBwYXJhbSB3b3Jrc3BhY2VGaWxlICB0aGUgSkRldmVsb3BlciB3b3Jrc3BhY2UgZmlsZQotICAgKgotICAgKiBAcmV0dXJuIHRoZSBwYXJzZWQgRE9NCi0gICAqLwotICBwcml2YXRlIFhwcDNEb20gcmVhZFdvcmtzcGFjZURPTShGaWxlIHdvcmtzcGFjZUZpbGUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZERPTSh3b3Jrc3BhY2VGaWxlLCByZWxlYXNlICsgIi93b3Jrc3BhY2UueG1sIik7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSBKRGV2ZWxvcGVyIHByb2plY3QgZmlsZSBpbnRvIERPTS4KLSAgICoKLSAgICogQHBhcmFtIHByb2plY3RGaWxlICB0aGUgSkRldmVsb3BlciBwcm9qZWN0IGZpbGUKLSAgICoKLSAgICogQHJldHVybiB0aGUgcGFyc2VkIERPTQotICAgKi8KLSAgcHJpdmF0ZSBYcHAzRG9tIHJlYWRQcm9qZWN0RE9NKEZpbGUgcHJvamVjdEZpbGUpCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICByZXR1cm4gcmVhZERPTShwcm9qZWN0RmlsZSwgcmVsZWFzZSArICIvcHJvamVjdC54bWwiKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIHNvdXJjZSBmaWxlIGludG8gRE9NLCBkZWZhdWx0aW5nIHRvIGEgcGFja2FnZWQgcmVzb3VyY2UgaWYKLSAgICogdGhlIHNvdXJjZSBmaWxlIGRvZXMgbm90IGFscmVhZHkgZXhpc3QuCi0gICAqCi0gICAqIEBwYXJhbSBzb3VyY2VGaWxlICAgIHRoZSBzb3VyY2UgZmlsZSB0byBiZSBwYXJzZWQKLSAgICogQHBhcmFtIHJlc291cmNlUGF0aCAgdGhlIGRlZmF1bHQgcGFja2FnZWQgcmVzb3VyY2UKLSAgICoKLSAgICogQHJldHVybiB0aGUgcGFyc2VkIERPTQotICAgKi8KLSAgcHJpdmF0ZSBYcHAzRG9tIHJlYWRET00oRmlsZSBzb3VyY2VGaWxlLCBTdHJpbmcgcmVzb3VyY2VQYXRoKQotICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgWG1sUHVsbFBhcnNlckV4Y2VwdGlvbgotICB7Ci0gICAgUmVhZGVyIHJlYWRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgaWYgKCFmb3JjZSAmJiBzb3VyY2VGaWxlLmV4aXN0cygpKQotICAgICAgewotICAgICAgICAvLyBwYXJzZSB0aGUgZXhpc3Rpbmcgc291cmNlIGZpbGUKLSAgICAgICAgcmVhZGVyID0gbmV3IEZpbGVSZWFkZXIoc291cmNlRmlsZSk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIC8vIHBhcnNlIHRoZSBkZWZhdWx0IHJlc291cmNlIGZpbGUKLSAgICAgICAgVVJMIHJlc291cmNlID0gZ2V0Q2xhc3MoKS5nZXRSZXNvdXJjZShyZXNvdXJjZVBhdGgpOwotCi0gICAgICAgIC8vIGVuc3VyZSB0aGF0IHRoZSByZXNvdXJjZVBhdGggY2FuIGJlIGZvdW5kCi0gICAgICAgIGlmIChyZXNvdXJjZSA9PSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJVbmFibGUgdG8gcmVhZCByZXNvdXJjZTogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc291cmNlUGF0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZWFkZXIgPSBuZXcgSW5wdXRTdHJlYW1SZWFkZXIocmVzb3VyY2Uub3BlblN0cmVhbSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBYcHAzRG9tQnVpbGRlci5idWlsZChyZWFkZXIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgSU9VdGlsLmNsb3NlKHJlYWRlcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBhIFhNTCBET00gdG8gdGhlIHRhcmdldCBmaWxlLgotICAgKgotICAgKiBAcGFyYW0gdGFyZ2V0RmlsZSAgdGhlIHRhcmdldCBmaWxlCi0gICAqIEBwYXJhbSBzb3VyY2VET00gICB0aGUgc291cmNlIERPTQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRE9NKEZpbGUgdGFyZ2V0RmlsZSwgWHBwM0RvbSBzb3VyY2VET00pCi0gICAgdGhyb3dzIElPRXhjZXB0aW9uLCBYbWxQdWxsUGFyc2VyRXhjZXB0aW9uCi0gIHsKLSAgICBGaWxlV3JpdGVyIHdyaXRlciA9IG51bGw7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgd3JpdGVyID0gbmV3IEZpbGVXcml0ZXIodGFyZ2V0RmlsZSk7Ci0gICAgICBYcHAzRG9tV3JpdGVyLndyaXRlKHdyaXRlciwgc291cmNlRE9NKTsKLSAgICB9Ci0gICAgZmluYWxseQotICAgIHsKLSAgICAgIElPVXRpbC5jbG9zZSh3cml0ZXIpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGdldFJlbGF0aXZlRGlyKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkKLSAgewotICAgIHJldHVybiBnZXRSZWxhdGl2ZVBhdGgoc291cmNlLCB0YXJnZXQsIHRydWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0UmVsYXRpdmVGaWxlKEZpbGUgc291cmNlLCBGaWxlIHRhcmdldCkKLSAgewotICAgIHJldHVybiBnZXRSZWxhdGl2ZVBhdGgoc291cmNlLCB0YXJnZXQsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdHdvIGZpbGVzLgotICAgKgotICAgKiBAcGFyYW0gc291cmNlICB0aGUgc291cmNlIGZpbGUKLSAgICogQHBhcmFtIHRhcmdldCAgdGhlIHRhcmdldCBmaWxlCi0gICAqCi0gICAqIEByZXR1cm4gIHRoZSByZWxhdGl2ZSBwYXRoIGJldHdlZW4gdHdvIGZpbGVzCi0gICAqLwotICBwcml2YXRlIFN0cmluZyBnZXRSZWxhdGl2ZVBhdGgoRmlsZSBzb3VyY2UsIEZpbGUgdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc0RpcmVjdG9yeSkKLSAgewotICAgIFN0cmluZyBzb3VyY2VQYXRoID0gc291cmNlLmdldEFic29sdXRlUGF0aCgpOwotICAgIFN0cmluZyB0YXJnZXRQYXRoID0gdGFyZ2V0LmdldEFic29sdXRlUGF0aCgpOwotCi0gICAgaWYgKHRhcmdldFBhdGguc3RhcnRzV2l0aChzb3VyY2VQYXRoICsgRmlsZS5zZXBhcmF0b3JDaGFyKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcmVsYXRpdmVQYXRoID0gdGFyZ2V0UGF0aC5zdWJzdHJpbmcoc291cmNlUGF0aC5sZW5ndGgoKSArIDEpOwotICAgICAgcmVsYXRpdmVQYXRoID0gcmVsYXRpdmVQYXRoLnJlcGxhY2UoRmlsZS5zZXBhcmF0b3JDaGFyLCAnLycpOwotICAgICAgaWYgKGlzRGlyZWN0b3J5KQotICAgICAgewotICAgICAgICByZWxhdGl2ZVBhdGggKz0gIi8iOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlbGF0aXZlUGF0aDsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIFN0cmluZ1tdIHNvdXJjZVBhdGhzID0gc291cmNlUGF0aC5zcGxpdCgiXFwiICsgRmlsZS5zZXBhcmF0b3IpOwotICAgICAgU3RyaW5nW10gdGFyZ2V0UGF0aHMgPSB0YXJnZXRQYXRoLnNwbGl0KCJcXCIgKyBGaWxlLnNlcGFyYXRvcik7Ci0KLSAgICAgIC8vIE9uIFdpbmRvd3MsIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBhYnNvbHV0ZSBwYXRoIGlzIGEgZHJpdmUgbGV0dGVyCi0gICAgICBpZiAoU3lzdGVtLmdldFByb3BlcnR5KCJvcy5uYW1lIikuc3RhcnRzV2l0aCgiV2luZG93cyIpKQotICAgICAgewotICAgICAgICAvLyB1cHBlcmNhc2UgdGhlIGRyaXZlIGxldHRlciBiZWNhdXNlIEN5Z3dpbiBzb21ldGltZXMgZGVsaXZlcnMKLSAgICAgICAgLy8gYSBsb3dlcmNhc2UgZHJpdmUgbGV0dGVyCi0gICAgICAgIHNvdXJjZVBhdGhzWzBdID0gc291cmNlUGF0aHNbMF0udG9VcHBlckNhc2UoKTsKLSAgICAgICAgdGFyZ2V0UGF0aHNbMF0gPSB0YXJnZXRQYXRoc1swXS50b1VwcGVyQ2FzZSgpOwotICAgICAgfQotCi0gICAgICBpbnQgc291cmNlUGF0aENvdW50ID0gc291cmNlUGF0aHMubGVuZ3RoOwotICAgICAgaW50IHRhcmdldFBhdGhDb3VudCA9IHRhcmdldFBhdGhzLmxlbmd0aDsKLSAgICAgIGludCBjb21tb25QYXRoQ291bnQgPSAwOwotCi0gICAgICBpbnQgbWluUGF0aENvdW50ID0gTWF0aC5taW4oc291cmNlUGF0aENvdW50LCB0YXJnZXRQYXRoQ291bnQpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaW5QYXRoQ291bnQ7IGkrKykKLSAgICAgIHsKLSAgICAgICAgaWYgKHNvdXJjZVBhdGhzW2ldLmVxdWFscyh0YXJnZXRQYXRoc1tpXSkpCi0gICAgICAgIHsKLSAgICAgICAgICBjb21tb25QYXRoQ291bnQrKzsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoY29tbW9uUGF0aENvdW50ID4gMCkKLSAgICAgIHsKLSAgICAgICAgaW50IHNvdXJjZVJlbGF0aXZlUGF0aENvdW50ID0gc291cmNlUGF0aENvdW50IC0gY29tbW9uUGF0aENvdW50OwotICAgICAgICBpbnQgdGFyZ2V0UmVsYXRpdmVQYXRoQ291bnQgPSB0YXJnZXRQYXRoQ291bnQgLSBjb21tb25QYXRoQ291bnQ7Ci0KLSAgICAgICAgaW50IHJlbGF0aXZlUGF0aENvdW50ID0KLSAgICAgICAgICBzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudCArIHRhcmdldFJlbGF0aXZlUGF0aENvdW50OwotICAgICAgICBTdHJpbmdbXSByZWxhdGl2ZVBhdGhzID0gbmV3IFN0cmluZ1tyZWxhdGl2ZVBhdGhDb3VudF07Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VSZWxhdGl2ZVBhdGhDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgcmVsYXRpdmVQYXRoc1tpXSA9ICIuLiI7Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRhcmdldFJlbGF0aXZlUGF0aENvdW50OyBpKyspCi0gICAgICAgIHsKLSAgICAgICAgICByZWxhdGl2ZVBhdGhzW3NvdXJjZVJlbGF0aXZlUGF0aENvdW50ICsgaV0gPQotICAgICAgICAgICAgICB0YXJnZXRQYXRoc1tjb21tb25QYXRoQ291bnQgKyBpXTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIGpvaW4KLSAgICAgICAgU3RyaW5nQnVmZmVyIHJlbGF0aXZlUGF0aCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZWxhdGl2ZVBhdGhDb3VudDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgaWYgKGkgPiAwKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHJlbGF0aXZlUGF0aC5hcHBlbmQoIi8iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVsYXRpdmVQYXRoLmFwcGVuZChyZWxhdGl2ZVBhdGhzW2ldKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVsYXRpdmVQYXRoLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIHJldHVybiB0YXJnZXRQYXRoOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgWHBwM0RvbSBmaW5kTmFtZWRDaGlsZChYcHAzRG9tIHBhcmVudCwgU3RyaW5nIGNoaWxkTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZyBhdHRyVmFsdWUpCi0gIHsKLSAgICBYcHAzRG9tW10gaGFzaCA9IHBhcmVudC5nZXRDaGlsZHJlbihjaGlsZE5hbWUpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzaC5sZW5ndGg7IGkrKykKLSAgICB7Ci0gICAgICBpZiAoYXR0clZhbHVlLmVxdWFscyhoYXNoW2ldLmdldEF0dHJpYnV0ZSgibiIpKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGhhc2hbaV07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgWHBwM0RvbSBjaGlsZCA9IG5ldyBYcHAzRG9tKGNoaWxkTmFtZSk7Ci0gICAgY2hpbGQuc2V0QXR0cmlidXRlKCJuIiwgYXR0clZhbHVlKTsKLSAgICBwYXJlbnQuYWRkQ2hpbGQoY2hpbGQpOwotCi0gICAgcmV0dXJuIGNoaWxkOwotICB9Ci0KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgZmluZERlcGVuZGVudFByb2plY3QoU3RyaW5nIGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KQotICB7Ci0gICAgZm9yIChJdGVyYXRvciBpID0gcmVhY3RvclByb2plY3RzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgewotICAgICAgTWF2ZW5Qcm9qZWN0IHJlYWN0b3JQcm9qZWN0ID0gKE1hdmVuUHJvamVjdCkgaS5uZXh0KCk7Ci0gICAgICBTdHJpbmcgaWRlbnQgPQotICAgICAgICByZWFjdG9yUHJvamVjdC5nZXRBcnRpZmFjdCgpLmdldERlcGVuZGVuY3lDb25mbGljdElkKCk7Ci0gICAgICBpZiAoaWRlbnQuZXF1YWxzKGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIHJlYWN0b3JQcm9qZWN0LmdldEV4ZWN1dGlvblByb2plY3QoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIHByaXZhdGUgYm9vbGVhbiBpc0RlcGVuZGVudFByb2plY3QoU3RyaW5nIGRlcGVuZGVuY3lNYW5hZ2VtZW50S2V5KQotICB7Ci0gICAgcmV0dXJuIChmaW5kRGVwZW5kZW50UHJvamVjdChkZXBlbmRlbmN5TWFuYWdlbWVudEtleSkgIT0gbnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVtb3ZlQ2hpbGRyZW4oWHBwM0RvbSBwYXJlbnQpCi0gIHsKLSAgICB3aGlsZSAocGFyZW50LmdldENoaWxkQ291bnQoKSAhPSAwKQotICAgIHsKLSAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCgwKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFhwcDNEb20gY3JlYXRlUHJvamVjdFJlZmVyZW5jZURPTShGaWxlIHdvcmtzcGFjZURpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZSBwcm9qZWN0RmlsZSkKLSAgewotICAgIFhwcDNEb20gaGFzaERPTSA9IG5ldyBYcHAzRG9tKCJoYXNoIik7Ci0gICAgWHBwM0RvbSB1cmxET00gPSBuZXcgWHBwM0RvbSgidXJsIik7Ci0gICAgdXJsRE9NLnNldEF0dHJpYnV0ZSgibiIsICJVUkwiKTsKLSAgICB1cmxET00uc2V0QXR0cmlidXRlKCJwYXRoIiwgZ2V0UmVsYXRpdmVGaWxlKHdvcmtzcGFjZURpciwgcHJvamVjdEZpbGUpKTsKLSAgICAKLSAgICBpZiAoX3JlbGVhc2VNYWpvciA8IDExKQotICAgIHsKLSAgICAgIFhwcDNEb20gdmFsdWVET00gPSBuZXcgWHBwM0RvbSgidmFsdWUiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgibiIsICJub2RlQ2xhc3MiKTsKLSAgICAgIHZhbHVlRE9NLnNldEF0dHJpYnV0ZSgidiIsICJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KUHJvamVjdCIpOwotICAgICAgaGFzaERPTS5hZGRDaGlsZCh2YWx1ZURPTSk7Ci0gICAgfQotICAgIGhhc2hET00uYWRkQ2hpbGQodXJsRE9NKTsKLSAgICByZXR1cm4gaGFzaERPTTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfcGFyc2VSZWxlYXNlKCkKLSAgewotICAgIFN0cmluZyBudW1zW10gPSByZWxlYXNlLnNwbGl0KCJcXC4iKTsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBfcmVsZWFzZU1ham9yID0gSW50ZWdlci5wYXJzZUludChudW1zWzBdKTsKLSAgICB9Ci0gICAgY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIC8vIERlZmF1bHQgcmVsZWFzZSBpcyBjdXJyZW50bHkgMTAueAotICAgICAgX3JlbGVhc2VNYWpvciA9IDEwOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgaW50ICAgICBfcmVsZWFzZU1ham9yID0gMDsKLSAgcHJpdmF0ZSBib29sZWFuIF9hZGRMaWJyYXJpZXMgPSB0cnVlOwotICBwcml2YXRlIGJvb2xlYW4gX2FkZFRhZ0xpYnMgICA9IHRydWU7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9QUk9QRVJUWV9BRERfTElCUkFSWSA9ICJqZGV2LnBsdWdpbi5hZGQubGlicmFyaWVzIjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIF9QUk9QRVJUWV9BRERfVEFHTElCUyA9ICJqZGV2LnBsdWdpbi5hZGQudGFnbGlicyI7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvVGxkQ29udGVudEhhbmRsZXIuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvVGxkQ29udGVudEhhbmRsZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTc0NDk4Ny4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyL1RsZENvbnRlbnRIYW5kbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODcgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmpkZXZlbG9wZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLkRvY3VtZW50QnVpbGRlckZhY3Rvcnk7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuUGFyc2VyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotaW1wb3J0IG9yZy53M2MuZG9tLkRvY3VtZW50OwotCi1pbXBvcnQgb3JnLnczYy5kb20uTm9kZTsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGVMaXN0OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi1wdWJsaWMgY2xhc3MgVGxkQ29udGVudEhhbmRsZXIKLXsKLSAgLyoqCi0gICAgKiBDb250ZW50IEhhbmRsZXIuCi0gICAgKi8KLSAgcHVibGljIFRsZENvbnRlbnRIYW5kbGVyKCkKLSAgewotICB9Ci0gIAotICAvKioKLSAgICAqIFBhcnNlIHRoZSAudGxkIGZpbGUgdG8gZ2V0IHRoZSBpbmZvcm1hdGlvbiAKLSAgICAqIG5lZWRlZCBmb3IgdGhlIC5qcHIKLSAgICAqLwotICBwdWJsaWMgdm9pZCBwYXJzZVRsZChGaWxlIGZpbGUpCi0gIHRocm93cyBTQVhFeGNlcHRpb24sCi0gICAgICAgICBJT0V4Y2VwdGlvbiwKLSAgICAgICAgIFBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIC8vIENyZWF0ZSBhIGJ1aWxkZXIgZmFjdG9yeQotICAgIERvY3VtZW50QnVpbGRlckZhY3RvcnkgZmFjdG9yeSA9IERvY3VtZW50QnVpbGRlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotICAgIAotICAgIC8vIENyZWF0ZSB0aGUgQnVpbGRlciBhbmQgcGFyc2UgdGhlIGZpbGUKLSAgICBEb2N1bWVudCBkb2N1bWVudCA9IGZhY3RvcnkubmV3RG9jdW1lbnRCdWlsZGVyKCkucGFyc2UoZmlsZSk7Ci0gICAgCi0gICAgX3Byb2Nlc3NUbGROb2Rlcyhkb2N1bWVudCk7Ci0gIH0KLQotICAvKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICogR2V0dG9ycyBhbmQgc2V0dG9ycwotICAgKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki8KLQotICBwdWJsaWMgdm9pZCBzZXRWZXJzaW9uKFN0cmluZyB2ZXJzaW9uKQotICB7Ci0gICAgX3ZlcnNpb24gPSB2ZXJzaW9uOwotICB9Ci0KLSAgcHVibGljIHZvaWQgc2V0TmFtZShTdHJpbmcgbmFtZSkKLSAgewotICAgIF9uYW1lID0gbmFtZTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFByZWZpeChTdHJpbmcgcHJlZml4KQotICB7Ci0gICAgX3ByZWZpeCA9IHByZWZpeDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldFVSSShTdHJpbmcgdXJpKQotICB7Ci0gICAgX3VyaSA9IHVyaTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHNldEpzcFZlcnNpb24oU3RyaW5nIGpzcFZlcnNpb24pCi0gIHsKLSAgICBfanNwVmVyc2lvbiA9IGpzcFZlcnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIF92ZXJzaW9uID09IG51bGw/ICIiIDogX3ZlcnNpb247Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKQotICB7Ci0gICAgcmV0dXJuIF9uYW1lID09IG51bGw/ICIiIDogX25hbWU7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFByZWZpeCgpCi0gIHsKLSAgICByZXR1cm4gX3ByZWZpeCA9PSBudWxsPyAiIiA6IF9wcmVmaXg7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldFVSSSgpCi0gIHsKLSAgICByZXR1cm4gX3VyaSA9PSBudWxsPyAiIiA6IF91cmk7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldEpzcFZlcnNpb24oKQotICB7Ci0gICAgcmV0dXJuIF9qc3BWZXJzaW9uID09IG51bGw/ICIiIDogX2pzcFZlcnNpb247Ci0gIH0KLQotCi0gIC8qKgotICAgICogRmluZCBhbGwgdGhlIFRMRCBub2RlcyB3ZSB3YW50LCBnZXQgZWFjaCBub2RlJ3MgdmFsdWUKLSAgICAqIGFuZCBzZXQgdGhlIHZhbHVlIG9uIHRoZSBwcm9wZXIgY2xhc3MgcHJvcGVydHkuCi0gICAgKiAKLSAgICAqIEBwYXJhbSBkb2N1bWVudCAgLSBET00gRG9jdW1lbnQgZnJvbSB0aGUgVExEIGZpbGUKLSAgICAqLyAgCi0gIHByaXZhdGUgdm9pZCBfcHJvY2Vzc1RsZE5vZGVzKERvY3VtZW50IGRvY3VtZW50KQotICB7Ci0gICAgTm9kZSBub2RlID0gbnVsbDsKLSAgICAKLSAgICAvLyBHZXQgdGhlIE5vZGVzIGZpcnN0IG5vZGUuICBXZSBjYW4gYmUgc3BlY2lmaWMgaGVyZQotICAgIC8vIGJlY2F1c2Ugd2Uga25vdyB3ZSB3YW50IHRoZSBmaXJzdCBub2RlLgotICAgIE5vZGVMaXN0IG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1RMSUJfVkVSU0lPTik7Ci0gICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICB7Ci0gICAgICBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgIHNldFZlcnNpb24obm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX0pTUF9WRVJTSU9OKTsKLSAgICBpZiAobm9kZUxpc3QgIT0gbnVsbCAmJiBub2RlTGlzdC5nZXRMZW5ndGgoKSAhPSAwKQotICAgIHsKLSAgICAgIG5vZGUgPSBub2RlTGlzdC5pdGVtKDApOwotICAgICAgc2V0SnNwVmVyc2lvbihub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gTXVzdCBnbyBiZWZvcmUgX0RJU1BMQVlfTkFNRQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1NIT1JUX05BTUUpOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXRQcmVmaXgobm9kZS5nZXRGaXJzdENoaWxkKCkuZ2V0Tm9kZVZhbHVlKCkpOwotICAgIH0KLQotICAgIC8vIE11c3QgZ28gYWZ0ZXIgX1NIT1JUX05BTUUKLSAgICBub2RlTGlzdCA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKF9ESVNQTEFZX05BTUUpOwotICAgIGlmIChub2RlTGlzdCAhPSBudWxsICYmIG5vZGVMaXN0LmdldExlbmd0aCgpICE9IDApCi0gICAgewotICAgICAgbm9kZSA9IG5vZGVMaXN0Lml0ZW0oMCk7Ci0gICAgICBzZXROYW1lKG5vZGUuZ2V0Rmlyc3RDaGlsZCgpLmdldE5vZGVWYWx1ZSgpKTsKLSAgICB9Ci0gICAgZWxzZQotICAgIHsKLSAgICAgIHNldE5hbWUoZ2V0UHJlZml4KCkpOwotICAgIH0KLQotICAgIG5vZGVMaXN0ID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoX1VSSSk7Ci0gICAgaWYgKG5vZGVMaXN0ICE9IG51bGwgJiYgbm9kZUxpc3QuZ2V0TGVuZ3RoKCkgIT0gMCkKLSAgICB7Ci0gICAgICBub2RlID0gbm9kZUxpc3QuaXRlbSgwKTsKLSAgICAgIHNldFVSSShub2RlLmdldEZpcnN0Q2hpbGQoKS5nZXROb2RlVmFsdWUoKSk7Ci0gICAgfQotICB9Ci0gIAotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBQcml2YXRlIHZhcmlhYmxlcwotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgX3ZlcnNpb24gICAgPSBudWxsOyAvLyB0bGliLXZlcnNpb24KLSAgcHJpdmF0ZSBTdHJpbmcgX25hbWUgICAgICAgPSBudWxsOyAvLyBkaXNwbGF5LW5hbWUKLSAgcHJpdmF0ZSBTdHJpbmcgX3ByZWZpeCAgICAgPSBudWxsOyAvLyBzaG9ydC1uYW1lCi0gIHByaXZhdGUgU3RyaW5nIF9qc3BWZXJzaW9uID0gbnVsbDsgLy8ganNwLXZlcnNpb24KLSAgcHJpdmF0ZSBTdHJpbmcgX3VyaSAgICAgICAgPSBudWxsOyAvLyB1cmkKLSAKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9UTElCX1ZFUlNJT04gPSAidGxpYi12ZXJzaW9uIjsgLy92ZXJzaW9uIE5PVFJBTlMKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9ESVNQTEFZX05BTUUgPSAiZGlzcGxheS1uYW1lIjsgLy9uYW1lIE5PVFJBTlMKLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIF9TSE9SVF9OQU1FICAgPSAic2hvcnQtbmFtZSI7ICAgLy9wcmVmaXggTk9UUkFOUwotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcgX0pTUF9WRVJTSU9OICA9ICJqc3AtdmVyc2lvbiI7ICAgLy9OT1RSQU5TCi0gIHByaXZhdGUgZmluYWwgc3RhdGljIFN0cmluZyBfVVJJICAgICAgICAgID0gInVyaSI7Ci19IC8vIGVuZGNsYXNzIFRsZENvbnRlbnRIYW5kbGVyCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi9wcm9qZWN0LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4yL3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTI4NmZlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC4yL3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsODAgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08anByOnByb2plY3QgeG1sbnM6anByPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCIgPgotICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiID4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC4yIiAvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmVsb3Blci5vZmZsaW5lZGIubWlncmF0aW9uLk9mZmxpbmVEQlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmpzcC5Kc3BNaWdyYXRvciIgdj0iMTAuMS4zLjAuMiIgLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjIiIC8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0iY29udGVudFNldHMiID4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLlBhdGhzQ29uZmlndXJhdGlvbi9qYXZhQ29udGVudFNldCIgLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLnJlc291cmNlcy5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiIC8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3Mvd2ViQ29udGVudFNldCIgLz4KLSAgPC9saXN0PgotICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIiA+Ci0gICAgPGxpc3Qgbj0iZGVwZW5kZW5jeUxpc3QiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiIgPgotICAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIgLz4KLSAgICA8bGlzdCBuPSJjb3B5UmVzIiA+Ci0gICAgICA8c3RyaW5nIHY9Ii5qYXZhIiAvPgotICAgIDwvbGlzdD4KLSAgICA8dmFsdWUgbj0icmV2ZXJzZUNvcHlSZXMiIHY9InRydWUiIC8+Ci0gICAgPHZhbHVlIG49ImludGVybmFsRW5jb2RpbmciIHY9IkRlZmF1bHQiIC8+Ci0gICAgPHZhbHVlIG49InNob3dPYmplY3REb3RTdGF0aWNXYXJuaW5ncyIgdj0idHJ1ZSIgLz4KLSAgICA8dmFsdWUgbj0ic2hvd1BhcnRpYWxJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIgLz4KLSAgICA8dmFsdWUgbj0ic2hvd1VudXNlZEltcG9ydFdhcm5pbmdzIiB2PSJ0cnVlIiAvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyIgPgotICAgIDx2YWx1ZSBuPSJqMmVlV2ViQXBwTmFtZSIgdj0ibWF2ZW4tZ2VuZXJhdGVkLXdlYmFwcCIgLz4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290IiAvPgotICAgIDxoYXNoIG49IndlYkNvbnRlbnRTZXQiID4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24iID4KLSAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCIgPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIiA+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIiAvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLnJlc291cmNlcy5SZXNvdXJjZVBhdGhzIiA+Ci0gICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCIgPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIiA+Ci0gICAgICAgIDxzdHJpbmcgdj0iKyoqIiAvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RMaWJyYXJpZXMiID4KLSAgICA8bGlzdCBuPSJleHBvcnRlZFJlZmVyZW5jZXMiIC8+Ci0gICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyIgPgotICAgICAgPGxpc3Qgbj0ibGlicmFyeURlZmluaXRpb25zIiAvPgotICAgIDwvaGFzaD4KLSAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiID4KLSAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyIgPgotICAgIDxoYXNoIG49ImxpYnJhcmllcyIgLz4KLSAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjIvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWJiMWFlMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMi93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0nMS4wJyBlbmNvZGluZz0nVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08andzOndvcmtzcGFjZSB4bWxuczpqd3M9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC4yIi8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0ibGlzdE9mQ2hpbGRyZW4iIC8+Ci08L2p3czp3b3Jrc3BhY2U+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWE2MDA2Yi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDkxICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqcHI6cHJvamVjdCB4bWxuczpqcHI9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5kdC5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmLmFkZGluLkpTRlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5kYi5BREZTdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLlByb2plY3RVcGdyYWRlciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmRibW9kZWxlci5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4zIi8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5qc3AuSnNwTWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnNNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjMiLz4KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay5hZGRpbi5taWdyYXRpb24uVG9wTGlua1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMyIvPgotICAgPC9oYXNoPgotICAgPGxpc3Qgbj0iY29udGVudFNldHMiPgotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24vamF2YUNvbnRlbnRTZXQiLz4KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzL3dlYkNvbnRlbnRTZXQiLz4KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiLz4KLSAgIDwvbGlzdD4KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuRGVwZW5kZW5jeUNvbmZpZ3VyYXRpb24iPgotICAgICAgPGxpc3Qgbj0iZGVwZW5kZW5jeUxpc3QiLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+Ci0gICAgICA8aGFzaCBuPSJyZXNvdXJjZXNDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgICAgPC9saXN0PgotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5jb21waWxlci5PamNDb25maWd1cmF0aW9uIj4KLSAgICAgIDx2YWx1ZSBuPSJhc3NlcnRpb25zRW5hYmxlZCIgdj0idHJ1ZSIvPgotICAgICAgPGxpc3Qgbj0iY29weVJlcyI+Ci0gICAgICAgICA8c3RyaW5nIHY9Ii5qYXZhIi8+Ci0gICAgICA8L2xpc3Q+Ci0gICAgICA8dmFsdWUgbj0iaW50ZXJuYWxFbmNvZGluZyIgdj0iRGVmYXVsdCIvPgotICAgICAgPHZhbHVlIG49InJldmVyc2VDb3B5UmVzIiB2PSJ0cnVlIi8+Ci0gICAgICA8dmFsdWUgbj0ic2hvd09iamVjdERvdFN0YXRpY1dhcm5pbmdzIiB2PSJ0cnVlIi8+Ci0gICAgICA8dmFsdWUgbj0ic2hvd1BhcnRpYWxJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InNob3dVbnVzZWRJbXBvcnRXYXJuaW5ncyIgdj0idHJ1ZSIvPgotICAgICAgPHZhbHVlIG49InVzZUphdmFjIiB2PSJ0cnVlIi8+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3MiPgotICAgICAgPHZhbHVlIG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIi8+Ci0gICAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290Ii8+Ci0gICAgICA8aGFzaCBuPSJ3ZWJDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPgotICAgICAgPC9oYXNoPgotICAgPC9oYXNoPgotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4KLSAgICAgIDxoYXNoIG49ImphdmFDb250ZW50U2V0Ij4KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+Ci0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgICAgPC9saXN0PgotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICA8L2hhc2g+Ci0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIj4KLSAgICAgIDxsaXN0IG49ImV4cG9ydGVkUmVmZXJlbmNlcyIvPgotICAgICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyI+Ci0gICAgICAgICA8bGlzdCBuPSJsaWJyYXJ5RGVmaW5pdGlvbnMiIC8+Ci0gICAgICA8L2hhc2g+Ci0gICAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIgLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC5jb25maWcuSlByb2plY3RQYXRocyI+Ci0gICAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgIDwvaGFzaD4KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJhcHAuanNwLmxpYnJhcmllcy5tb2RlbC5Qcm9qZWN0VGFnTGlicmFyaWVzIj4KLSAgICAgIDxoYXNoIG49ImxpYnJhcmllcyIvPgotICAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy93b3Jrc3BhY2UueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzEwLjEuMy4wLjMvd29ya3NwYWNlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU0OGQ5YS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuMy93b3Jrc3BhY2UueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotPD94bWwgdmVyc2lvbiA9ICcxLjAnIGVuY29kaW5nID0gJ1VURi04Jz8+Ci08IS0tCi0gIENvcHlyaWdodCAyMDA2IFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+Ci0gICA8aGFzaCBuPSJjb21wb25lbnQtdmVyc2lvbnMiPgotICAgICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zIi8+Ci0gICA8L2hhc2g+Ci0gICA8bGlzdCBuPSJsaXN0T2ZDaGlsZHJlbiIgLz4KLTwvandzOndvcmtzcGFjZT4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC9wcm9qZWN0LnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3Byb2plY3QueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MjgxNGQxLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3Byb2plY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTI3ICswLDAgQEAKLTw/eG1sIHZlcnNpb24gPSAnMS4wJyBlbmNvZGluZyA9ICdVVEYtOCc/PgotPCEtLQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0KLSAgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLTxqcHI6cHJvamVjdCB4bWxuczpqcHI9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5kdC5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmLmFkZGluLkpTRlByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5hZGZkdC5jb250cm9sbGVyLnN0cnV0cy5hZGRpbi5kYi5BREZTdHJ1dHNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLlByb2plY3RVcGdyYWRlciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmRibW9kZWxlci5taWdyYXRpb24uUHJvamVjdE1pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQiLz4KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5qc3AuSnNwTWlncmF0b3IiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnNNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC53ZWJzZXJ2aWNlcy5XZWJTZXJ2aWNlc01pZ3JhdG9ySGVscGVyIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNCIvPgotICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay5hZGRpbi5taWdyYXRpb24uVG9wTGlua1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40Ii8+Ci0gIDwvaGFzaD4KLSAgPGxpc3Qgbj0iY29udGVudFNldHMiPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uL2phdmFDb250ZW50U2V0Ii8+Ci0gICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5KMmVlU2V0dGluZ3Mvd2ViQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzL3Jlc291cmNlc0NvbnRlbnRTZXQiLz4KLSAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3Mvb2ZmbGluZURCQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4uVG9wTGlua1Byb2plY3RTZXR0aW5ncy90b3BsaW5rQ29udGVudFNldCIvPgotICAgIDxzdHJpbmcgdj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncy9tb2RlbGVyc0NvbnRlbnRTZXQiLz4KLSAgPC9saXN0PgotICA8aGFzaCBuPSJvcmFjbGUuYm0uY29tbW9uSWRlLmRhdGEucHJvamVjdC5Nb2RlbGVyUHJvamVjdFNldHRpbmdzIj4KLSAgICA8aGFzaCBuPSJtb2RlbGVyc0NvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJtb2RlbC8iLz4KLSAgICAgIDwvbGlzdD4KLSAgICA8L2hhc2g+Ci0gICAgPHZhbHVlIG49Im1vZGVsZXJzVmVyc2lvbiIgdj0iMTAuMTMiLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuaWRlLm1vZGVsLkRlcGVuZGVuY3lDb25maWd1cmF0aW9uIj4KLSAgICA8bGlzdCBuPSJkZXBlbmRlbmN5TGlzdCIvPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+Ci0gICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmNvbXBpbGVyLk9qY0NvbmZpZ3VyYXRpb24iPgotICAgIDx2YWx1ZSBuPSJpbnRlcm5hbEVuY29kaW5nIiB2PSJEZWZhdWx0Ii8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuSjJlZVNldHRpbmdzIj4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkFwcE5hbWUiIHY9Im1hdmVuLWdlbmVyYXRlZC13ZWJhcHAiLz4KLSAgICA8dmFsdWUgbj0iajJlZVdlYkNvbnRleHRSb290IiB2PSJtYXZlbi1nZW5lcmF0ZWQtY29udGV4dC1yb290Ii8+Ci0gICAgPGhhc2ggbj0id2ViQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIgLz4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4KLSAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCI+Ci0gICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPgotICAgICAgICA8c3RyaW5nIHY9IisqKiIvPgotICAgICAgPC9saXN0PgotICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiIC8+Ci0gICAgPC9oYXNoPgotICA8L2hhc2g+Ci0gIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm9mZmxpbmVkYi5tb2RlbC5PZmZsaW5lREJQcm9qZWN0U2V0dGluZ3MiPgotICAgIDxoYXNoIG49Im9mZmxpbmVEQkNvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJkYXRhYmFzZS8iLz4KLSAgICAgIDwvbGlzdD4KLSAgICA8L2hhc2g+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zIj4KLSAgICA8aGFzaCBuPSJydW5Db25maWd1cmF0aW9uRGVmaW5pdGlvbnMiPgotICAgICAgPGhhc2ggbj0iRGVmYXVsdCI+Ci0gICAgICAgIDx2YWx1ZSBuPSJjdXN0b20iIHY9ImZhbHNlIi8+Ci0gICAgICAgIDx2YWx1ZSBuPSJuYW1lIiB2PSJEZWZhdWx0Ii8+Ci0gICAgICA8L2hhc2g+Ci0gICAgPC9oYXNoPgotICAgIDxsaXN0IG49InJ1bkNvbmZpZ3VyYXRpb25MaXN0Ij4KLSAgICAgIDxzdHJpbmcgdj0iRGVmYXVsdCIvPgotICAgIDwvbGlzdD4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0TGlicmFyaWVzIj4KLSAgICA8bGlzdCBuPSJleHBvcnRlZFJlZmVyZW5jZXMiLz4KLSAgICA8aGFzaCBuPSJpbnRlcm5hbERlZmluaXRpb25zIj4KLSAgICAgIDxsaXN0IG49ImxpYnJhcnlEZWZpbml0aW9ucyIgLz4KLSAgICA8L2hhc2g+Ci0gICAgPGxpc3Qgbj0ibGlicmFyeVJlZmVyZW5jZXMiIC8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdFBhdGhzIj4KLSAgICA8dXJsIG49Im91dHB1dERpcmVjdG9yeSIgLz4KLSAgPC9oYXNoPgotICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyI+Ci0gICAgPGhhc2ggbj0ibGlicmFyaWVzIi8+Ci0gIDwvaGFzaD4KLSAgPGhhc2ggbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4uVG9wTGlua1Byb2plY3RTZXR0aW5ncyI+Ci0gICAgPGhhc2ggbj0idG9wbGlua0NvbnRlbnRTZXQiPgotICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4KLSAgICAgICAgPHN0cmluZyB2PSIrKioiLz4KLSAgICAgIDwvbGlzdD4KLSAgICAgIDxsaXN0IG49InVybC1wYXRoIj4KLSAgICAgICAgPHVybCBwYXRoPSJ0b3BsaW5rLyIvPgotICAgICAgPC9saXN0PgotICAgIDwvaGFzaD4KLSAgPC9oYXNoPgotPC9qcHI6cHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3dvcmtzcGFjZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTAuMS4zLjAuNC93b3Jrc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjk1MzY0Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMC4xLjMuMC40L3dvcmtzcGFjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4KLTwhLS0KLSAgQ29weXJpZ2h0IDIwMDYgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotCi0gIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci08andzOndvcmtzcGFjZSB4bWxuczpqd3M9Imh0dHA6Ly94bWxucy5vcmFjbGUuY29tL2lkZS9wcm9qZWN0Ij4KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC40Ii8+Ci0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmRzLkRhdGFTb3VyY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjQiLz4KLSAgIDwvaGFzaD4KLSAgIDxsaXN0IG49Imxpc3RPZkNoaWxkcmVuIiAvPgotPC9qd3M6d29ya3NwYWNlPgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1qZGV2LXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9qZGV2ZWxvcGVyLzExLjEuMS4wLjAvcHJvamVjdC54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC9wcm9qZWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjBiNzdmMy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC9wcm9qZWN0LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwMyArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGpwcjpwcm9qZWN0IHhtbG5zOmpwcj0iaHR0cDovL3htbG5zLm9yYWNsZS5jb20vaWRlL3Byb2plY3QiPg0KLSAgIDxoYXNoIG49ImNvbXBvbmVudC12ZXJzaW9ucyI+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5hZGZjLnNvdXJjZS5taWdyYXRpb24uTW92ZU1ldGFkYXRhUmVzb3VyY2VzQWdhaW5NaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuanNmMi5kaWFncmFtLm1pZ3JhdGUuSnNmTm9kZU1pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHQuY29udHJvbGxlci5zdHJ1dHMuYWRkaW4uZGIuQURGU3RydXRzUHJvamVjdE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0LmNvbnRyb2xsZXIuc3RydXRzLmFkZGluLlN0cnV0c1Byb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwuZHZ0LmRhdGFwcmVzZHQubWlncmF0aW9uLkpzcFByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwubW9kZWwuaWRlLm1pZ3JhdGlvbi5Qcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAuMTsxMS4xLjEuMC4wLjExIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUueG1sZWQubWlncmF0aW9uLkFERk5vZGVNaWdyYXRvciIgdj0iMTEuMS4xLjAuMC41Ii8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC52aWV3LmNvbW1vbi5taWdyYXRpb24ud2l6YXJkcy5NaWdyYXRpb25IZWxwZXIiIHY9IjExLjEuMS4wLjAuMyIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZmR0aW50ZXJuYWwudmlldy5yaWNoLmJpbmRpbmcubWlncmF0aW9uLkphclJlc291cmNlTWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5ibS5jb21tb25JZGUuUHJvamVjdFVwZ3JhZGVyIiB2PSIxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmJtLm1pZ3JhdGlvbi5wcm9qZWN0Lk1pZ3JhdG9yUmVnaXN0cnlQcm9qZWN0VXBncmFkZUFkYXB0ZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5pZGUubW9kZWwuUHJvamVjdCIgdj0iMTAuMS4zLjAuMjsxMC4xLjMuMC4zOzEwLjEuMy4wLjQ7MTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5SZXNvdXJjZVBhdGhzTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpjbGllbnQubWlncmF0b3IuSkNQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamJvLmR0LmpkZXZ4LnVpLmFwcG5hdi5BUFByb2plY3RNaWdyYXRvciIgdj0iMTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAuNSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIuZWpiLkVqYk1pZ3JhdG9yIiB2PSIxMC4xLjMuNC4wOzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2ZWxvcGVyLmxpYnJhcnkuUHJvamVjdExpYnJhcnlNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuT3V0cHV0RGlyZWN0b3J5TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5kZXBsb3kuRGVwbG95bWVudFByb2ZpbGVzTWlncmF0b3IiIHY9IjExLjEuMS4wLjAuMSIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLmRlcGxveS5qcHMuSnBzRGF0YU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanNwLkpzcE1pZ3JhdG9yIiB2PSIxMC4xLjMuMC4yOzEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwuanVuaXQuSlVuaXRNaWdyYXRvciIgdj0iMTEuMS4xLjAuMC4xIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwub2ZmbGluZWRiLm1pZ3JhdGlvbi5PZmZsaW5lREJQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5qZGV2aW1wbC5vZmZsaW5lZGIubWlncmF0aW9uLk9mZmxpbmVUcmFuc2Zlck1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucmVzb3VyY2VidW5kbGUuWGxpZmZBZGRpbiRYbGlmZk1pZ3JhdG9ySGVscGVyIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwucnVubmVyLlJ1bkNvbmZpZ3VyYXRpb25zTWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMuSnNwTGlicmFyeU1pZ3JhdG9yIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLldlYkFwcE5vZGVNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjEwLjEuMy4wLjI7MTAuMS4zLjAuMzsxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS5tb2RlbGVyLmJtbWlncmF0ZS5kaWYuTWlncmF0ZVRvRElGIiB2PSIxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5taWdyYXRvci5QTVByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICA8dmFsdWUgbj0ib3JhY2xlLnRvcGxpbmsuYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjEwLjEuMy4wLjM7MTAuMS4zLjAuNDsxMS4xLjEuMC4wIi8+DQotICAgIDx2YWx1ZSBuPSJvcmFjbGUudG9wbGluay53b3JrYmVuY2guYWRkaW4ubWlncmF0aW9uLlRvcExpbmtQcm9qZWN0TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgPHZhbHVlIG49Im9yYWNsZS53ZWJjZW50ZXIuaW50ZXJuYWwuZHQubWlncmF0aW9uLldlYkNlbnRlclByb2plY3RNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8bGlzdCBuPSJjb250ZW50U2V0cyI+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuamRldmVsb3Blci5tb2RlbC5QYXRoc0NvbmZpZ3VyYXRpb24vamF2YUNvbnRlbnRTZXQiLz4NCi0gICAgICA8c3RyaW5nIHY9Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncy93ZWJDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuaWRlLm1vZGVsLlJlc291cmNlUGF0aHMvcmVzb3VyY2VzQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1vZGVsLk9mZmxpbmVEQlByb2plY3RTZXR0aW5ncy9vZmZsaW5lREJDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5QTVByb2plY3RTZXR0aW5ncy9JbnRlZ3JhdGlvbl9Db250ZW50Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuYm0uY29tbW9uSWRlLmRhdGEucHJvamVjdC5Nb2RlbGVyUHJvamVjdFNldHRpbmdzL21vZGVsZXJzQ29udGVudFNldCIvPg0KLSAgICAgIDxzdHJpbmcgdj0ib3JhY2xlLnRvcGxpbmsud29ya2JlbmNoLmFkZGluL3RvcGxpbmtDb250ZW50U2V0Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUudGlwLnRvb2xzLmlkZS5mYWJyaWMuYWRkaW4uU0NBQ29udGVudFNldFByb3ZpZGVyL3NjYS1jb250ZW50Ii8+DQotICAgICAgPHN0cmluZyB2PSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUuc2V0dGluZ3MuQURGTVNldHRpbmdzL2FkZm1Db250ZW50U2V0Ii8+DQotICAgPC9saXN0Pg0KLSAgICAgIDxoYXNoIG49Im9yYWNsZS5hZGZkdGludGVybmFsLm1vZGVsLmlkZS5zZXR0aW5ncy5BREZNU2V0dGluZ3MiPg0KLSAgICAgIDxoYXNoIG49ImFkZm1Db250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJwYXR0ZXJuLWZpbHRlcnMiPg0KLSAgICAgICAgICAgIDxzdHJpbmcgdj0iKyoqIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIj4NCi0gICAgICAgICAgICA8dXJsIHBhdGg9ImFkZm1zcmMvIi8+DQotICAgICAgICAgPC9saXN0Pg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmJtLmNvbW1vbklkZS5kYXRhLnByb2plY3QuTW9kZWxlclByb2plY3RTZXR0aW5ncyI+DQotICAgICAgPGhhc2ggbj0ibW9kZWxlcnNDb250ZW50U2V0Ij4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+DQotICAgICAgICAgICAgPHVybCBwYXRoPSJtb2RlbC8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgICAgIDx2YWx1ZSBuPSJtb2RlbGVyc1ZlcnNpb24iIHY9IjEwLjEzIi8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuRGVwZW5kZW5jeUNvbmZpZ3VyYXRpb24iPg0KLSAgICAgIDxsaXN0IG49ImRlcGVuZGVuY3lMaXN0Ii8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5pZGUubW9kZWwuUmVzb3VyY2VQYXRocyI+DQotICAgICAgPGhhc2ggbj0icmVzb3VyY2VzQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCIvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIuY29tcGlsZXIuT2pjQ29uZmlndXJhdGlvbiI+DQotICAgICAgPHZhbHVlIG49ImFzc2VydGlvbnNFbmFibGVkIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49ImNvbXBpbGVyLm5hbWUiIHY9Ik9qYyIvPg0KLSAgICAgIDxsaXN0IG49ImNvcHlSZXMiPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLmphdmEiLz4NCi0gICAgICA8L2xpc3Q+DQotICAgICAgPHZhbHVlIG49ImludGVybmFsRW5jb2RpbmciIHY9IkRlZmF1bHQiLz4NCi0gICAgICA8bGlzdCBuPSJKYXZhYy5jb21tYW5kbGluZS5vcHRpb25saXN0Ij4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1nIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6YWxsIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LWNhc3QiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZW1wdHkiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZmFsbHRocm91Z2giLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotcGF0aCIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLVhsaW50Oi1zZXJpYWwiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotdW5jaGVja2VkIi8+DQotICAgICAgPC9saXN0Pg0KLSAgICAgIDxsaXN0IG49Ik9qYy5jb21tYW5kbGluZS5vcHRpb25saXN0Ij4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1nIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItd2FybiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2FybjozMjAiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46MzcyIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQxMiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0MTMiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDE1Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjQ4NiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo0ODciLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NDg5Ii8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjU1NiIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo1NTgiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1ub3dhcm46NTYwIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItbm93YXJuOjU2MSIvPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iLW5vd2Fybjo3MDUiLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotZmFsbHRocm91Z2giLz4NCi0gICAgICAgICA8c3RyaW5nIHY9Ii1YbGludDotc2VyaWFsIi8+DQotICAgICAgICAgPHN0cmluZyB2PSItWGxpbnQ6LXVuY2hlY2tlZCIvPg0KLSAgICAgIDwvbGlzdD4NCi0gICAgICA8dmFsdWUgbj0icmV2ZXJzZUNvcHlSZXMiIHY9InRydWUiLz4NCi0gICAgICA8dmFsdWUgbj0ic2hvd09iamVjdERvdFN0YXRpY1dhcm5pbmdzIiB2PSJ0cnVlIi8+DQotICAgICAgPHZhbHVlIG49InNob3dQYXJ0aWFsSW1wb3J0V2FybmluZ3MiIHY9InRydWUiLz4NCi0gICAgICA8dmFsdWUgbj0ic2hvd1VudXNlZEltcG9ydFdhcm5pbmdzIiB2PSJ0cnVlIi8+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS5qZGV2ZWxvcGVyLm1vZGVsLkoyZWVTZXR0aW5ncyI+DQotICAgICAgPHZhbHVlIG49ImoyZWVXZWJBcHBOYW1lIiB2PSJtYXZlbi1nZW5lcmF0ZWQtd2ViYXBwIi8+DQotICAgICAgPHZhbHVlIG49ImoyZWVXZWJDb250ZXh0Um9vdCIgdj0ibWF2ZW4tZ2VuZXJhdGVkLWNvbnRleHQtcm9vdCIvPg0KLSAgICAgIDxoYXNoIG49IndlYkNvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InVybC1wYXRoIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIubW9kZWwuUGF0aHNDb25maWd1cmF0aW9uIj4NCi0gICAgICA8aGFzaCBuPSJqYXZhQ29udGVudFNldCI+DQotICAgICAgICA8bGlzdCBuPSJjb25zdGl0dWVudC1zZXRzIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZlbG9wZXIub2ZmbGluZWRiLm1vZGVsLk9mZmxpbmVEQlByb2plY3RTZXR0aW5ncyI+DQotICAgICAgPGhhc2ggbj0ib2ZmbGluZURCQ29udGVudFNldCI+DQotICAgICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICAgIDwvbGlzdD4NCi0gICAgICAgICA8bGlzdCBuPSJ1cmwtcGF0aCI+DQotICAgICAgICAgICAgPHVybCBwYXRoPSJkYXRhYmFzZS8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmVsb3Blci5ydW5uZXIuUnVuQ29uZmlndXJhdGlvbnMiPg0KLSAgICAgIDxoYXNoIG49InJ1bkNvbmZpZ3VyYXRpb25EZWZpbml0aW9ucyI+DQotICAgICAgICAgPGhhc2ggbj0iRGVmYXVsdCI+DQotICAgICAgICAgICAgPHZhbHVlIG49ImNvbXBpbGVCZWZvcmVSdW4iIHY9ImZhbHNlIi8+DQotICAgICAgICAgICAgPHZhbHVlIG49ImN1c3RvbSIgdj0iZmFsc2UiLz4NCi0gICAgICAgICAgICA8dmFsdWUgbj0ibmFtZSIgdj0iRGVmYXVsdCIvPg0KLSAgICAgICAgIDwvaGFzaD4NCi0gICAgICA8L2hhc2g+DQotICAgICAgPGxpc3Qgbj0icnVuQ29uZmlndXJhdGlvbkxpc3QiPg0KLSAgICAgICAgIDxzdHJpbmcgdj0iRGVmYXVsdCIvPg0KLSAgICAgIDwvbGlzdD4NCi0gICA8L2hhc2g+DQotICAgPGhhc2ggbj0ib3JhY2xlLmpkZXZpbXBsLmNvbmZpZy5KUHJvamVjdExpYnJhcmllcyI+DQotICAgICAgPGxpc3Qgbj0iZXhwb3J0ZWRSZWZlcmVuY2VzIi8+DQotICAgICAgPGhhc2ggbj0iaW50ZXJuYWxEZWZpbml0aW9ucyI+DQotICAgICAgICAgPGxpc3Qgbj0ibGlicmFyeURlZmluaXRpb25zIiAvPg0KLSAgICAgIDwvaGFzaD4NCi0gICAgICA8bGlzdCBuPSJsaWJyYXJ5UmVmZXJlbmNlcyIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwuY29uZmlnLkpQcm9qZWN0UGF0aHMiLz4NCi0gICA8aGFzaCBuPSJvcmFjbGUuamRldmltcGwud2ViYXBwLmpzcC5saWJyYXJpZXMubW9kZWwuUHJvamVjdFRhZ0xpYnJhcmllcyI+DQotICAgICAgPGxpc3Qgbj0idGFnLWxpYnJhcmllcyIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5mYWJyaWMuYWRkaW4uU0NBQ29udGVudFNldFByb3ZpZGVyIj4NCi0gICAgICA8aGFzaCBuPSJzY2EtY29udGVudCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8aGFzaCBuPSJvcmFjbGUudGlwLnRvb2xzLmlkZS5wbS5hZGRpbi5QTVByb2plY3RTZXR0aW5ncyI+DQotICAgICA8aGFzaCBuPSJJbnRlZ3JhdGlvbl9Db250ZW50Ij4NCi0gICAgICAgPGxpc3Qgbj0icGF0dGVybi1maWx0ZXJzIj4NCi0gICAgICAgICA8c3RyaW5nIHY9IisqKiIvPg0KLSAgICAgICA8L2xpc3Q+DQotICAgICA8L2hhc2g+DQotICAgPC9oYXNoPg0KLSAgIDxoYXNoIG49Im9yYWNsZS50b3BsaW5rLndvcmtiZW5jaC5hZGRpbiI+DQotICAgICAgPGhhc2ggbj0idG9wbGlua0NvbnRlbnRTZXQiPg0KLSAgICAgICAgIDxsaXN0IG49InBhdHRlcm4tZmlsdGVycyI+DQotICAgICAgICAgICAgPHN0cmluZyB2PSIrKioiLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgICAgPGxpc3Qgbj0idXJsLXBhdGgiPg0KLSAgICAgICAgICAgIDx1cmwgcGF0aD0idG9wbGluay8iLz4NCi0gICAgICAgICA8L2xpc3Q+DQotICAgICAgPC9oYXNoPg0KLSAgIDwvaGFzaD4NCi08L2pwcjpwcm9qZWN0Pg0KLQ0KLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMS4xLjEuMC4wL3dvcmtzcGFjZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWpkZXYtcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2pkZXZlbG9wZXIvMTEuMS4xLjAuMC93b3Jrc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MmNiZWFlLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vamRldmVsb3Blci8xMS4xLjEuMC4wL3dvcmtzcGFjZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi08P3htbCB2ZXJzaW9uID0gJzEuMCcgZW5jb2RpbmcgPSAnVVRGLTgnPz4NCi08IS0tDQotICBDb3B5cmlnaHQgMjAwNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uDQotDQotICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCi0gIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCi0gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KLQ0KLSAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KLQ0KLSAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KLSAgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCi0gIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KLSAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KLSAgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQotLS0+DQotPGp3czp3b3Jrc3BhY2UgeG1sbnM6andzPSJodHRwOi8veG1sbnMub3JhY2xlLmNvbS9pZGUvcHJvamVjdCI+DQotICAgPGhhc2ggbj0iY29tcG9uZW50LXZlcnNpb25zIj4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmFkZi5zaGFyZS5kdC5taWdyYXRpb24uanBzLkphem5DcmVkU3RvcmVNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUuYWRmZHRpbnRlcm5hbC5tb2RlbC5pZGUuc2VjdXJpdHkud2l6YXJkLkFkZlNlY3VyaXR5TWlncmF0b3IiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmlkZS5tb2RlbC5Qcm9qZWN0IiB2PSIxMC4xLjMuMC40OzExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnJ1bm5lci5vYzRqLkVtYmVkZGVkU2VydmVyTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLndlYnNlcnZpY2VzLldlYlNlcnZpY2VzTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmRzLkRhdGFTb3VyY2VzTWlncmF0b3JIZWxwZXIiIHY9IjExLjEuMS4wLjAiLz4NCi0gICAgICA8dmFsdWUgbj0ib3JhY2xlLmpkZXZpbXBsLnhtbC5vYzRqLmpwcy5KcHNDb25maWdNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUubWRzLmludGVybmFsLmR0LmlkZS5taWdyYXRvci5NRFNDb25maWdNaWdyYXRvckhlbHBlciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgICAgIDx2YWx1ZSBuPSJvcmFjbGUud2ViY2VudGVyLmludGVybmFsLmR0Lm1pZ3JhdGlvbi5XZWJDZW50ZXJXb3Jrc3BhY2VNaWdyYXRvciIgdj0iMTEuMS4xLjAuMCIvPg0KLSAgIDwvaGFzaD4NCi0gICA8bGlzdCBuPSJsaXN0T2ZDaGlsZHJlbiIgLz4NCi08L2p3czp3b3Jrc3BhY2U+DQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjkxMDUyNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCEtLQotICAgIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAgICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAgICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICAgIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAgICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gICAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICAgIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLQotICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotCi0gICAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICAgIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gICAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gICAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gICAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICAgIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhLS0KLSAgLSBQYXJlbnQgcG9tIG9mIGFsbCB0aGUgbXlmYWNlcyBjdXN0b20gbWF2ZW4tcGx1Z2luIHN1YnByb2plY3RzIHRoYXQgaGVscAotICAgIHRvIGJ1aWxkIG90aGVyIG15ZmFjZXMgcHJvamVjdHMuCi0gIC0KLSAgLSBUaGlzIHByb2plY3QgYWxzbyBidWlsZHMgYSBjb21tb24gYnVpbGQtdG9vbHMgc2l0ZS4KLSAgLS0+Ci0KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjMtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+cG9tPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFBsdWdpbiBQYXJlbnQ8L25hbWU+Ci0gIDx1cmw+aHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zPC91cmw+Ci0KLSAgPGlzc3VlTWFuYWdlbWVudD4KLSAgICA8c3lzdGVtPmppcmE8L3N5c3RlbT4KLSAgICA8dXJsPmh0dHA6Ly9pc3N1ZXMuYXBhY2hlLm9yZy9qaXJhL2Jyb3dzZS9NWUZBQ0VTPC91cmw+Ci0gIDwvaXNzdWVNYW5hZ2VtZW50PgotCi0gIDxjaU1hbmFnZW1lbnQ+Ci0gICAgPHN5c3RlbT5jb250aW51dW08L3N5c3RlbT4KLSAgICA8dXJsPmh0dHA6Ly9teWZhY2VzLnpvbmVzLmFwYWNoZS5vcmc6ODA4MC9jb250aW51dW08L3VybD4KLSAgICA8bm90aWZpZXJzPgotICAgICAgPG5vdGlmaWVyPgotICAgICAgICA8dHlwZT5tYWlsPC90eXBlPgotICAgICAgICA8c2VuZE9uU3VjY2Vzcz50cnVlPC9zZW5kT25TdWNjZXNzPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8YWRkcmVzcz5jb21taXRzQG15ZmFjZXMuYXBhY2hlLm9yZzwvYWRkcmVzcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9ub3RpZmllcj4KLSAgICA8L25vdGlmaWVycz4KLSAgPC9jaU1hbmFnZW1lbnQ+Ci0KLSAgPGluY2VwdGlvblllYXI+MjAwMTwvaW5jZXB0aW9uWWVhcj4KLQotICA8YnVpbGQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0KLSAgICA8cGx1Z2luTWFuYWdlbWVudD4KLSAgICAgIDxwbHVnaW5zPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGFyY2hpdmU+Ci0gICAgICAgICAgICAgIDxtYW5pZmVzdD4KLSAgICAgICAgICAgICAgICA8YWRkRGVmYXVsdEltcGxlbWVudGF0aW9uRW50cmllcz50cnVlPC9hZGREZWZhdWx0SW1wbGVtZW50YXRpb25FbnRyaWVzPgotICAgICAgICAgICAgICA8L21hbmlmZXN0PgotICAgICAgICAgICAgPC9hcmNoaXZlPgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8IS0tCi0gICAgICAgICAgLSBDb3B5IExJQ0VOU0UudHh0IGFuZCBOT1RJQ0UudHh0IHNvIHRoYXQgdGhleSBhcmUgaW5jbHVkZWQKLSAgICAgICAgICAtIGluIHRoZSAtamF2YWRvYyBqYXIgZmlsZSBmb3IgdGhlIGNvbXBvbmVudC4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmphdmFkb2MucmVzb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgPGNvcHkgdG9kaXI9IiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2FwaWRvY3MvTUVUQS1JTkYiPgotICAgICAgICAgICAgICAgICAgPGZpbGVzZXQgZGlyPSIke2Jhc2VkaXJ9Ij4KLSAgICAgICAgICAgICAgICAgICAgPGluY2x1ZGUgbmFtZT0iTElDRU5TRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICAgIDxpbmNsdWRlIG5hbWU9Ik5PVElDRS50eHQiIC8+Ci0gICAgICAgICAgICAgICAgICA8L2ZpbGVzZXQ+Ci0gICAgICAgICAgICAgICAgPC9jb3B5PgotICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDwhLS0KLSAgICAgICAgICAtIE1ha2UgYSBjaGVja3N0eWxlIHZpb2xhdGlvbiBhIGNvbXBpbGUgZXJyb3IuIE5vdGUgdGhhdCBpZiBhIGNvbXBpbGUgZXJyb3Igb2NjdXJzLAotICAgICAgICAgIC0gZnVydGhlciBpbmZvcm1hdGlvbiBjYW4gYmUgZm91bmQgaW4gdGFyZ2V0L3NpdGUvY2hlY2tzdHlsZS5odG1sIChwcmVzZW50IGV2ZW4gd2hlbgotICAgICAgICAgIC0ganVzdCB0aGUgY29tcGlsZSBnb2FsIGFuZCBub3QgdGhlIHNpdGUgZ29hbCBoYXMgYmVlbiBydW4pLiBOb3RlIGFsc28gdGhhdCBjaGlsZAotICAgICAgICAgIC0gcHJvamVjdHMgbWF5IHJlZGVjbGFyZSB0aGlzIHBsdWdpbiBhbmQgcHJvdmlkZSBkaWZmZXJlbnQgY29uZmlndXJhdGlvbiBzZXR0aW5ncwotICAgICAgICAgIC0gdG8gdXNlIGRpZmZlcmVudCBjaGVja3MgKG1vcmUgb3IgbGVzcyBzdHJpY3QgdGhhbiB0aGUgZGVmYXVsdCkuCi0gICAgICAgICAgLS0+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY2hlY2tzdHlsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD52ZXJpZnktc3R5bGU8L2lkPgotICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICA8Z29hbHM+PGdvYWw+Y2hlY2s8L2dvYWw+PC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Y29uZmlnTG9jYXRpb24+ZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWw8L2NvbmZpZ0xvY2F0aW9uPgotICAgICAgICAgIDxoZWFkZXJMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQ8L2hlYWRlckxvY2F0aW9uPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3QtaW5mby1yZXBvcnRzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4wLjE8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBtZC1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHJ1bGVzZXRzPgotICAgICAgICAgICAgPHJ1bGVzZXQ+L3J1bGVzZXRzL2Jhc2ljLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICAgIDxydWxlc2V0Pi9ydWxlc2V0cy91bnVzZWRjb2RlLnhtbDwvcnVsZXNldD4KLSAgICAgICAgICA8L3J1bGVzZXRzPgotICAgICAgICAgIDxsaW5rWHJlZj50cnVlPC9saW5rWHJlZj4KLSAgICAgICAgICA8bWluaW11bVRva2Vucz4xMDA8L21pbmltdW1Ub2tlbnM+Ci0gICAgICAgICAgPHRhcmdldEpkaz4xLjU8L3RhcmdldEpkaz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNoZWNrc3R5bGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxjb25maWdMb2NhdGlvbj5kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0YW5kYXJkLnhtbDwvY29uZmlnTG9jYXRpb24+Ci0gICAgICAgICAgPGhlYWRlckxvY2F0aW9uPmRlZmF1bHQvbXlmYWNlcy1oZWFkZXItc3BhY2VzLnR4dDwvaGVhZGVyTG9jYXRpb24+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9yZXBvcnRpbmc+Ci0KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL3RydW5rL21hdmVuMi1wbHVnaW5zLzwvY29ubmVjdGlvbj4KLSAgICA8ZGV2ZWxvcGVyQ29ubmVjdGlvbj5zY206c3ZuOmh0dHBzOi8vc3ZuLmFwYWNoZS5vcmcvcmVwb3MvYXNmL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy88L2RldmVsb3BlckNvbm5lY3Rpb24+Ci0gICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90cnVuay9tYXZlbjItcGx1Z2lucy88L3VybD4KLSAgPC9zY20+Ci0KLSAgPGRpc3RyaWJ1dGlvbk1hbmFnZW1lbnQ+Ci0gICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgPGlkPmFwYWNoZS5zbmFwc2hvdHM8L2lkPgotICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgICA8c2l0ZT4KLSAgICAgIDxpZD5hcGFjaGUtc2l0ZTwvaWQ+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2luczwvdXJsPgotICAgIDwvc2l0ZT4KLSAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5yZWxlYXNlPC9pZD4KLSAgICAgIDwhLS0KLSAgICAgIE5PVEU6IEV4ZWN1dGUgdGhpcyBwcm9maWxlIGxpa2UKLSAgICAgICAgICAgIG12biBjbGVhbiBzb3VyY2U6amFyIGluc3RhbGwgZGVwbG95IC1EYWx0RGVwbG95bWVudFJlcG9zaXRvcnk9bWF0emV3OjpkZWZhdWx0OjpmaWxlOi8vRk9MREVSIC1QcmVsZWFzZQotICAgICAgIC0tPgotICAgICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS00PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPGlkPnNpZ24tYXJ0aWZhY3RzPC9pZD4KLSAgICAgICAgICAgICAgICA8cGhhc2U+dmVyaWZ5PC9waGFzZT4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5zaWduPC9nb2FsPgotICAgICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXZhZG9jLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPmphcjwvZ29hbD4KLSAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc2NtLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuMDwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxwaGFzZT52YWxpZGF0ZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgPGlkPmdldHRpbmctc2NtLnJldmlzaW9uPC9pZD4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD51cGRhdGU8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgIDwvYnVpbGQ+Ci0gICAgPC9wcm9maWxlPgotICA8L3Byb2ZpbGVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1wbHVnaW4tcGFyZW50L3NyYy9zaXRlL2FwdC9pbmRleC5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGJlZjExNC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvYXB0L2luZGV4LmFwdAorKysgL2Rldi9udWxsCkBAIC0xLDc3ICswLDAgQEAKLSAtLS0tLS0KLSBNeWZhY2VzIEJ1aWxkIFRvb2xzCi0gLS0tLS0tCi0KLU92ZXJ2aWV3Ci0KLSAgTXlGYWNlcyBwcm9qZWN0cyBhbGwgdXNlIE1hdmVuIDIueCB0byBjb21waWxlIHRoZSBjb2RlLCBydW4gdGVzdGluZywgZXRjLiBIb3dldmVyIHNvbWV0aW1lcwotICB0aGUgc3RhbmRhcmQgbWF2ZW4gcGx1Z2lucyBhcmUgbm90IGVub3VnaCBmb3IgdGhlIHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9mIE15RmFjZXMgcHJvamVjdHMuCi0gIFRoZXJlZm9yZSBhIG51bWJlciBvZiBjdXN0b20gTWF2ZW4gcGx1Z2lucyBoYXZlIGJlZW4gY3JlYXRlZC4KLQotUGx1Z2lucwotCi0qIE15RmFjZXMtQnVpbGRlci1QbHVnaW4KLQotICBVc2VkIHRvIGJ1aWxkIE15RmFjZXMgQ29yZSAxLjEuNiBhbmQgbGF0ZXIsIGFuZCBNeUZhY2VzIFRvbWFoYXdrIDEuMS43IGFuZCBsYXRlci4KLSAgTWF5IGJlIHVzZWQgdG8gYnVpbGQgb3RoZXIgcHJvamVjdHMgaW4gdGhlIGZ1dHVyZS4KLQotICBUaGlzIHBsdWdpbiB1c2VzIGFubm90YXRpb25zIG9uIGphdmEgc291cmNlIGZpbGVzIHRvIGRpc2NvdmVyIHdoaWNoIGFyZSBKU0YKLSAgY29tcG9uZW50cywgcmVuZGVyZXJzLCBldGMuIFRoaXMgaW5mb3JtYXRpb24gaXMgdXNlZCB0byBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIGEKLSAgc3VpdGFibGUgZmFjZXMtY29uZmlnLnhtbCBhbmQgSlNQICIudGxkIiBmaWxlcy4gVGhlIGFubm90YXRpb25zIGNhbiBiZSAicmVhbCIKLSAgamF2YTEuNSBhbm5vdGF0aW9ucywgb3IgZG9jbGV0LXN0eWxlIGFubm90YXRpb25zLgotCi0gIEluIGFkZGl0aW9uLCB0aGUgcGx1Z2luIGNhbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlIEpTUCB0YWcgY2xhc3NlcyBmb3IgSlNGIGNvbXBvbmVudHMsCi0gIGF1dG9tYXRpY2FsbHkgY29weWluZyB0YWcgYXR0cmlidXRlcyBvbnRvIGEgSlNGIGNvbXBvbmVudCBpbnN0YW5jZS4KLQotICBBbmQgd2hlbiBzZWxlY3RlZCwgdGhlIGJ1aWxkZXIgcGx1Z2luIGNhbiBhbHNvIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGUgSlNGIGNvbXBvbmVudAotICBjbGFzc2VzLCBkZWZpbmluZyAiYm9pbGVycGxhdGUiIHNldHRlci9nZXR0ZXIgYW5kIHNhdmUvcmVzdG9yZSBtZXRob2RzIGJhc2VkIHVwb24gdGhlCi0gIGFic3RyYWN0IHByb3BlcnRpZXMgZGVmaW5lZCBvbiBhbiBhbmNlc3RvciBjbGFzcy4KLQotICBUaGlzIHBsdWdpbiBtYXkgYWxzbyBiZSB1c2VmdWwgZm9yIHByb2plY3RzIGV4dGVybmFsIHRvIHRoZSBNeUZhY2VzIHByb2plY3QuCi0KLSogTXlGYWNlcy1CdWlsZGVyLUFubm90YXRpb25zCi0KLSAgQSBzZXQgb2YgamF2YTEuNSBBbm5vdGF0aW9uIGNsYXNzZXMgZm9yIHVzZSB3aXRoIHRoZSBNeUZhY2VzLUJ1aWxkZXItUGx1Z2luLgotCi0qIE15RmFjZXMtRmFjZXMtUGx1Z2luCi0KLSAgQSByZWZhY3RvcmVkL3JlbmFtZWQgdmVyc2lvbiBvZiB0aGUgTXlGYWNlcy1UcmluaWRhZC1QbHVnaW4gd2hvc2Ugc291cmNlIGlzIHdpdGhpbgotICB0aGUgdHJpbmlkYWQgcHJvamVjdC4KLQotICBUaGlzIHBsdWdpbiBpcyBub3QgY3VycmVudGx5IGluIHVzZS4KLQotICBUaGlzIHJlbmFtZWQgdmVyc2lvbiB3YXMgaW50ZW5kZWQgdG8gYmUgdXNlZCBpbiBUcmluaWRhZCBhbmQgQ29yZSAxLjIueCByZWxlYXNlcywKLSAgYnV0IHRoZSBNeUZhY2VzLUJ1aWxkZXItUGx1Z2luIGlzIGN1cnJlbnRseSBpbnRlbmRlZCB0byBiZSB1c2VkIGluc3RlYWQuCi0KLSAgVGhlIG9yaWdpbmFsIE15RmFjZXMtVHJpbmlkYWQtUGx1Z2luIHdhcyB1c2VkIGZvciBNeUZhY2VzIENvcmUgMS4yLnggcmVsZWFzZXMsIGFuZAotICBmb3IgYWxsIFRyaW5pZGFkIHJlbGVhc2VzLiBJdCByZWFkcyBhIHRyZWUgb2YgeG1sIGZpbGVzIHdoaWNoIGRlZmluZSB0aGUgcHJvcGVydGllcwotICBvZiBKU0YgY29tcG9uZW50cyBpbiBhIHByb2plY3QsIGFuZCB0aGVuIGdlbmVyYXRlcyBmYWNlcy1jb25maWcueG1sIGFuZCAudGxkIGZpbGVzLAotICBhbmQgYWxzbyBjYW4gZ2VuZXJhdGUgQ29tcG9uZW50IGFuZCBUYWcgY2xhc3Nlcy4KLQotKiBNeUZhY2VzLWkxOG4tcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKLQotKiBNeUZhY2VzLWphdmFjYy1wbHVnaW4KLQotICBUT0RPOiBkb2N1bWVudCBtZQotCi0qIE15RmFjZXMtamF2YXNjcmlwdC1wbHVnaW4KLQotICBUT0RPOiBkb2N1bWVudCBtZQotCi0qIE15RmFjZXMtamRldi1wbHVnaW4KLQotICBUT0RPOiBkb2N1bWVudCBtZSAKLQotKiBNeUZhY2VzLXRhZ2RvYy1wbHVnaW4KLQotICBUT0RPOiBkb2N1bWVudCBtZQotCi0qIE15RmFjZXMtV2Fnb24tUGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKLQotKiBNeUZhY2VzLXhydHMtcGx1Z2luCi0KLSAgVE9ETzogZG9jdW1lbnQgbWUKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtcGx1Z2luLXBhcmVudC9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3ZmRjYi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXBsdWdpbi1wYXJlbnQvc3JjL3NpdGUvc2l0ZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJJU08tODg1OS0xIj8+Ci08IS0tCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lIG9yIG1vcmUKLSAqIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUgZGlzdHJpYnV0ZWQgd2l0aAotICogdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotICogVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUgdG8gWW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAKLSAqICh0aGUgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoCi0gKiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QgbmFtZT0iQXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPkFwYWNoZSBNeUZhY2VzPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvTXlGYWNlc19sb2dvLmpwZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvaW5kZXguaHRtbDwvaHJlZj4KLSAgPC9iYW5uZXJMZWZ0PgotCi0gIDxiYW5uZXJSaWdodD4KLSAgICA8bmFtZT5BcGFjaGUgQmFubmVyPC9uYW1lPgotICAgIDxzcmM+aW1nL2Jhbm5lcnMvYXBhY2hlX2Jhbm5lci5wbmc8L3NyYz4KLSAgICA8aHJlZj5odHRwOi8vd3d3LmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lclJpZ2h0PiAgCi0KLSAgPHB1Ymxpc2hEYXRlIGZvcm1hdD0iZGQgTU1NIHl5eXkiLz4KLQotICA8c2tpbj4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1zaXRlLXNraW48L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPC9za2luPgotCi0gIDxib2R5PgotICAgIDxsaW5rcz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSIgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2luZGV4Lmh0bWwiLz4KLSAgICA8L2xpbmtzPgotCi0gICAgPG1lbnUgbmFtZT0iQXBhY2hlIE15RmFjZXMiIGluaGVyaXQ9InRvcCI+Ci0gICAgICA8aXRlbSBuYW1lPSJPdmVydmlldyIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJEb3dubG9hZCIgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9kb3dubG9hZC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgbmFtZT0iRG9jdW1lbnRhdGlvbiI+Ci0gICAgICA8aXRlbSBuYW1lPSJBYm91dCIgICAgICAgICBocmVmPSJpbmRleC5odG1sIi8+Ci0gICAgPC9tZW51PgotCi0gICAgPG1lbnUgcmVmPSJyZXBvcnRzIi8+Ci0JCi0gICAgPG1lbnUgbmFtZT0iQXZhaWxhYmxlIE1vZHVsZXMiIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIEFubm90YXRpb25zIiAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItYW5ub3RhdGlvbnMvaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgQnVpbGRlciBQbHVnaW4iICAgICAgICAgICBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBGYWNlcyBQbHVnaW4iICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWZhY2VzLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBpMThuIFBsdWdpbiIgICAgICAgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWkxOG4tcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEphdmFjYyBQbHVnaW4iICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtamF2YWNjLXBsdWdpbi9pbmRleC5odG1sIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJBcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBKYXZhc2NyaXB0IFBsdWdpbiIgICAgICAgIGhyZWY9Imh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2lucy9teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIEpEZXYgUGx1Z2luIiAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtamRldi1wbHVnaW4vaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iQXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgVGFnIERvY3VtZW50YXRpb24gUmVwb3J0IiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnL2J1aWxkLXRvb2xzL3BsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFdhZ29uIFBsdWdpbiIgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL2luZGV4Lmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFhSVFMgUGx1Z2luIiAgICAgICAgICAgICAgaHJlZj0iaHR0cDovL215ZmFjZXMuYXBhY2hlLm9yZy9idWlsZC10b29scy9wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vaW5kZXguaHRtbCIvPgotICAgIDwvbWVudT4KLQotICAgIDxtZW51IG5hbWU9IkZvdW5kYXRpb24iIGluaGVyaXQ9ImJvdHRvbSI+Ci0gICAgICA8aXRlbSBuYW1lPSJBU0YiICAgICAgICAgICAgaHJlZj0iaHR0cDovL3d3dy5hcGFjaGUub3JnLyIgLz4KLSAgICAgIDxpdGVtIG5hbWU9IlNwb25zb3JzaGlwIiAgICBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9zcG9uc29yc2hpcC5odG1sIiAvPgotICAgICAgPGl0ZW0gbmFtZT0iVGhhbmtzIiAgICAgICAgIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9mb3VuZGF0aW9uL3RoYW5rcy5odG1sIiAvPgotICAgIDwvbWVudT4KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL0xJQ0VOU0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjQ1Njk1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL05PVElDRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmEzZGJkNi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy10YWdkb2MtcGx1Z2luL3BvbS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGYzNWEwMS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE0OSArMCwwIEBACi08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy10YWdkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgVGFnIERvY3VtZW50YXRpb24gUmVwb3J0PC9uYW1lPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPHNvdXJjZT4xLjQ8L3NvdXJjZT4KLSAgICAgICAgICA8dGFyZ2V0PjEuNDwvdGFyZ2V0PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcmVwb3J0aW5nLWltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjc8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgotICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPnhlcmNlczwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPnhlcmNlc0ltcGw8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjYuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT5ydW50aW1lPC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheC1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5zdGF4PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMi4wX3JjMi1kZXY8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLWZhY2VzLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcHJvamVjdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMC4xPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtY29udGFpbmVyLWRlZmF1bHQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtODwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuY29kZWhhdXMucGxleHVzPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cGxleHVzLXV0aWxzPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+MS4wLjU8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLmRveGlhPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZG94aWEtc2l0ZS1yZW5kZXJlcjwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC1hbHBoYS03PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmNvbW1vbnMtbG9nZ2luZzwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtbG9nZ2luZzwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjEuMC40PC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xLjIuMTI8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cmVwb3J0aW5nPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXRhZ2RvYy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NSZXBvcnQuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGE4OTA5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtdGFnZG9jLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1JlcG9ydC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ0MSArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4udGFnZG9jOwotCi0vL2ltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLmRveGlhLnNpbmsuU2luazsKLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW1Xcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5Xcml0ZXI7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5VUkxDbGFzc0xvYWRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29tcGFyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuRW51bWVyYXRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Mb2NhbGU7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5TdHJpbmdUb2tlbml6ZXI7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLWltcG9ydCBqYXZheC54bWwubmFtZXNwYWNlLlFOYW1lOwotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlBhcnNlckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5kaWdlc3Rlci5BYnN0cmFjdE9iamVjdENyZWF0aW9uRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuZGlnZXN0ZXIuRGlnZXN0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5hcnRpZmFjdC5EZXBlbmRlbmN5UmVzb2x1dGlvblJlcXVpcmVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnJlcG9ydGluZy5BYnN0cmFjdE1hdmVuTXVsdGlQYWdlUmVwb3J0OwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLk1hdmVuUmVwb3J0RXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucmVwb3J0aW5nLnNpbmsuU2lua0ZhY3Rvcnk7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy5wYXJzZS5Db21wb25lbnRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuQ29udmVydGVyQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50QmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkV2ZW50UmVmQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnBhcnNlLkZhY2VzQ29uZmlnUGFyc2VyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuRmFjZXRCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuUHJvcGVydHlCZWFuOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMucGFyc2UuVmFsaWRhdG9yQmVhbjsKLWltcG9ydCBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLmZhY2VzLnV0aWwuQ29tcG9uZW50RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5Db252ZXJ0ZXJGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLkZpbHRlcmVkSXRlcmF0b3I7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlByb3BlcnR5RmlsdGVyOwotaW1wb3J0IG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4uZmFjZXMudXRpbC5WYWxpZGF0b3JGaWx0ZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi5mYWNlcy51dGlsLlhJbmNsdWRlRmlsdGVyOwotaW1wb3J0IG9yZy5jb2RlaGF1cy5kb3hpYS5zaW5rLlNpbms7Ci1pbXBvcnQgb3JnLmNvZGVoYXVzLmRveGlhLnNpdGUucmVuZGVyZXIuU2l0ZVJlbmRlcmVyOwotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotCi0vKioKLSAqIFJlcG9ydCBmb3IgZ2VuZXJhdGluZyBKU0YgdGFnZG9jIGJhc2VkIG9uIGZhY2VzLWNvbmZpZy54bWwgcGFyc2luZy4KLSAqIE5vdGUgdGhhdCB0aGlzIGlzIG5vdCByZWFsbHkgYW4gQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydCAtIHRoZQotICogc2Vjb25kYXJ5IHBhZ2VzIGFyZSBtYW51YWxseSBnZW5lcmF0ZWQgWERvYy4gIEkgdHJpZWQgdXNpbmcgdGhlIHRydWUKLSAqIG11bHRpcGFnZSByZXBvcnQgYXBwcm9hY2gsIGFuZCByYW4gaW50byBNYXZlbiBidWdzIChhcyBvZiBNYXZlbiAyLjAuMiwKLSAqIHNpdGUgMi4wYjQpLgotICoKLSAqIEBnb2FsIHRhZ2RvYwotICovCi1wdWJsaWMgY2xhc3MgVGFnZG9jUmVwb3J0IGV4dGVuZHMgQWJzdHJhY3RNYXZlbk11bHRpUGFnZVJlcG9ydAotewotICBwcm90ZWN0ZWQgdm9pZCBleGVjdXRlUmVwb3J0KCBMb2NhbGUgbG9jYWxlICkKLSAgICAgIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgLy8gV2h5IHRoZSBoZWNrIGRvZXNuJ3QgTWF2ZW4gZG8gdGhpcyBmb3IgbWU/Ci0gICAgU2lua0ZhY3RvcnkgZmFjdG9yeSA9IG5ldyBTaW5rRmFjdG9yeSgpOwotICAgIGZhY3Rvcnkuc2V0U2l0ZVJlbmRlcmVyKGdldFNpdGVSZW5kZXJlcigpKTsKLSAgICBmYWN0b3J5LnNldFNpdGVEaXJlY3RvcnkoZ2V0T3V0cHV0RGlyZWN0b3J5KCkpOwotICAgIHNldFNpbmtGYWN0b3J5KGZhY3RvcnkpOwotICAgIAotICAgIHByb2Nlc3NJbmRleChwcm9qZWN0LCByZXNvdXJjZVBhdGgpOwotICAgIHRyeQotICAgIHsKLSAgICAgIF9nZW5lcmF0ZVRhZ0RvY3MoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiQ291bGRuJ3QgZ2VuZXJhdGUgdGFnZG9jIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF9nZW5lcmF0ZVRhZ0RvY3MoKSB0aHJvd3MgRXhjZXB0aW9uCi0gIHsKLSAgICBGYWNlc0NvbmZpZ0JlYW4gZmFjZXNDb25maWcgPSBnZXRGYWNlc0NvbmZpZygpOwotICAgIGlmICghZmFjZXNDb25maWcuaGFzQ29tcG9uZW50cygpKQotICAgIHsKLSAgICAgIGdldExvZygpLmluZm8oIk5vdGhpbmcgdG8gZ2VuZXJhdGUgLSBubyBjb21wb25lbnRzIGZvdW5kIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0KLSAgICBJdGVyYXRvciBjb21wb25lbnRzID0gZmFjZXNDb25maWcuY29tcG9uZW50cygpOwotICAgIGNvbXBvbmVudHMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcihjb21wb25lbnRzLCBuZXcgU2tpcEZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudFRhZ0ZpbHRlcigpKTsKLSAgICBjb21wb25lbnRzID0gbmV3IEZpbHRlcmVkSXRlcmF0b3IoY29tcG9uZW50cywgbmV3IENvbXBvbmVudE5hbWVzcGFjZUZpbHRlcigpKTsKLSAgICAKLSAgICBJdGVyYXRvciB2YWxpZGF0b3JzID0gZmFjZXNDb25maWcudmFsaWRhdG9ycygpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yVGFnRmlsdGVyKCkpOwotICAgIHZhbGlkYXRvcnMgPSBuZXcgRmlsdGVyZWRJdGVyYXRvcih2YWxpZGF0b3JzLCBuZXcgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkpOwotICAgIAotICAgIEl0ZXJhdG9yIGNvbnZlcnRlcnMgPSBmYWNlc0NvbmZpZy5jb252ZXJ0ZXJzKCk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJUYWdGaWx0ZXIoKSk7Ci0gICAgY29udmVydGVycyA9IG5ldyBGaWx0ZXJlZEl0ZXJhdG9yKGNvbnZlcnRlcnMsIG5ldyBDb252ZXJ0ZXJOYW1lc3BhY2VGaWx0ZXIoKSk7Ci0gICAgCi0gICAgLy8gPS09QUVXIE5vdGUgdGhhdCBvbmx5IHVwZGF0aW5nIG91dC1vZi1kYXRlIGNvbXBvbmVudHMsIGV0Yy4gaXMKLSAgICAvLyBwZXJtYW5lbnRseSB0cmlja3ksIGV2ZW4gaWYgd2UgaGFkIHByb3BlciBkZXRlY3Rpb24gaW4gcGxhY2UsCi0gICAgLy8gYmVjYXVzZSB0aGUgaW5kZXggYWx3YXlzIGhhcyB0byBoYXZlIGFsbCBkb2NzCi0gICAgLyoKLSAgICBpZiAoIWNvbXBvbmVudHMuaGFzTmV4dCgpICYmICFjb252ZXJ0ZXJzLmhhc05leHQoKSAmJiAhdmFsaWRhdG9ycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgZ2V0TG9nKCkuaW5mbygiTm90aGluZyB0byBnZW5lcmF0ZSAtIGFsbCBkb2NzIGFyZSB1cCB0byBkYXRlIik7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgICovCi0KLSAgICBTZXQgY29tcG9uZW50UGFnZXMgPSBuZXcgVHJlZVNldCgpOwotICAgIFNldCBjb252ZXJ0ZXJQYWdlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU2V0IHZhbGlkYXRvclBhZ2VzID0gbmV3IFRyZWVTZXQoKTsKLSAgICAKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHdoaWxlIChjb21wb25lbnRzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb21wb25lbnREb2MoKENvbXBvbmVudEJlYW4pY29tcG9uZW50cy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbXBvbmVudFBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlIChjb252ZXJ0ZXJzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoKENvbnZlcnRlckJlYW4pY29udmVydGVycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGNvbnZlcnRlclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlICh2YWxpZGF0b3JzLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgcGFnZU5hbWUgPSBfZ2VuZXJhdGVWYWxpZGF0b3JEb2MoKFZhbGlkYXRvckJlYW4pdmFsaWRhdG9ycy5uZXh0KCkpOwotICAgICAgaWYgKHBhZ2VOYW1lICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIHZhbGlkYXRvclBhZ2VzLmFkZChwYWdlTmFtZSk7Ci0gICAgICAgIGNvdW50Kys7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICBTZXQgb3RoZXJQYWdlcyA9IF9nYXRoZXJPdGhlclRhZ3MoKTsKLQotICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRlZCAiICsgY291bnQgKyAiIHBhZ2UocykiKTsKLQotICAgIFNpbmsgc2luayA9IGdldFNpbmsoKTsKLSAgICBzaW5rLmhlYWQoKTsKLSAgICBzaW5rLnRpdGxlKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBkb2N1bWVudGF0aW9uIik7Ci0gICAgc2luay50aXRsZV8oKTsgICAgCi0gICAgc2luay5oZWFkXygpOwotICAgIHNpbmsuYm9keSgpOwotCi0gICAgc2luay5zZWN0aW9uVGl0bGUxKCk7Ci0gICAgc2luay50ZXh0KCJUYWcgbGlicmFyeSBpbmZvcm1hdGlvbiIpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgc2luay5wYXJhZ3JhcGgoKTsKLQotICAgICAgc2luay5ib2xkKCk7Ci0gICAgICBzaW5rLnRleHQoIlNob3J0IG5hbWU6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgIHNpbmsubGluZUJyZWFrKCk7Ci0KLSAgICAgIHNpbmsuYm9sZCgpOwotICAgICAgc2luay50ZXh0KCJOYW1lc3BhY2U6Iik7Ci0gICAgICBzaW5rLmJvbGRfKCk7Ci0gICAgICBzaW5rLm5vbkJyZWFraW5nU3BhY2UoKTsKLSAgICAgIHNpbmsudGV4dChlbnRyeS5nZXRWYWx1ZSgpLnRvU3RyaW5nKCkpOwotICAgICAgc2luay5saW5lQnJlYWsoKTsKLQotICAgICAgc2luay5wYXJhZ3JhcGhfKCk7Ci0gICAgfQotCi0gICAgc2luay5zZWN0aW9uMV8oKTsKLQotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBjb21wb25lbnRQYWdlcywgIkNvbXBvbmVudHMiKTsKLSAgICBfd3JpdGVJbmRleFNlY3Rpb24oc2luaywgY29udmVydGVyUGFnZXMsICJDb252ZXJ0ZXJzIik7Ci0gICAgX3dyaXRlSW5kZXhTZWN0aW9uKHNpbmssIHZhbGlkYXRvclBhZ2VzLCAiVmFsaWRhdG9ycyIpOwotICAgIF93cml0ZUluZGV4U2VjdGlvbihzaW5rLCBvdGhlclBhZ2VzLCAiTWlzY2VsbGFuZW91cyIpOwotCi0gICAgc2luay5ib2R5XygpOwotICB9Ci0KLSAgcHJpdmF0ZSBTZXQgX2dhdGhlck90aGVyVGFncygpCi0gIHsKLSAgICBUcmVlU2V0IHNldCA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgU3RyaW5nIHN1YkRpciA9IAotICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgieGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgRmlsZSBzaXRlU3ViRGlyID0gbmV3IEZpbGUoc2l0ZURpcmVjdG9yeSwgc3ViRGlyKTsKLSAgICBpZiAoc2l0ZVN1YkRpci5leGlzdHMoKSkKLSAgICB7Ci0gICAgICBTdHJpbmdbXSBmaWxlcyA9IHNpdGVTdWJEaXIubGlzdCgpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlcy5sZW5ndGg7IGkrKykKLSAgICAgIHsKLSAgICAgICAgU3RyaW5nIGZpbGUgPSBmaWxlc1tpXTsKLSAgICAgICAgaWYgKGZpbGUuZW5kc1dpdGgoIi54bWwiKSkKLSAgICAgICAgewotICAgICAgICAgIHNldC5hZGQoZmlsZS5zdWJzdHJpbmcoMCwgZmlsZS5sZW5ndGgoKSAtIDQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiBzZXQ7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlcikKLSAgewotICAgIFN0cmluZ1tdIG51bGxMaXN0ID0ge307Ci0gICAgcmV0dXJuIF9mb3JtYXRQcm9wTGlzdChwTGlzdCwgaGVhZGVyLCBudWxsTGlzdCk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBfZm9ybWF0UHJvcExpc3QoCi0gICAgU3RyaW5nW10gcExpc3QsIAotICAgIFN0cmluZyAgIGhlYWRlciwKLSAgICBTdHJpbmdbXSBpZ25vcmVzKQotICB7Ci0gICAgU3RyaW5nIGZvcm1hdHRlZCA9IG51bGw7Ci0gICAgaWYgKChwTGlzdCAhPSBudWxsKSAmJiAocExpc3QubGVuZ3RoID4gMCkpCi0gICAgewotICAgICAgLy8gRG9uJ3Qga25vdyBob3cgbG9uZyB0aGlzIHdpbGwgYmUsIGJ1dCAxMDAgc2hvdWxkIGJlIHBsZW50eS4KLSAgICAgIFN0cmluZ0J1ZmZlciBzYiA9IG5ldyBTdHJpbmdCdWZmZXIoMTAwKTsKLSAgICAgIHNiLmFwcGVuZCgiXG4iKTsKLSAgICAgIHNiLmFwcGVuZCgiPGI+Iik7Ci0gICAgICBzYi5hcHBlbmQoaGVhZGVyKTsKLSAgICAgIHNiLmFwcGVuZCgiOjwvYj4gIik7Ci0KLSAgICAgIGJvb2xlYW4gZ290T25lID0gZmFsc2U7Ci0KLSAgICAgIGZvciAoaW50IGFyckluZCA9IDA7IGFyckluZCA8IHBMaXN0Lmxlbmd0aDsgYXJySW5kKyspCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyBjdXJTdHIgPSBwTGlzdFthcnJJbmRdOwotICAgICAgICBvdXRlcjoKLSAgICAgICAgaWYgKGN1clN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZ25vcmVzLmxlbmd0aDsgaSsrKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIFN0cmluZyBzID0gaWdub3Jlc1tpXTsKLSAgICAgICAgICAgIGlmICgocyAhPSBudWxsKSAmJiAocy5lcXVhbHNJZ25vcmVDYXNlKGN1clN0cikpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBicmVhayBvdXRlcjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBpZiAoZ290T25lKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZ290T25lID0gdHJ1ZTsKLSAgICAgICAgICBzYi5hcHBlbmQoY3VyU3RyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGdvdE9uZSkKLSAgICAgIHsKLSAgICAgICAgc2IuYXBwZW5kKCI8YnIvPlxuIik7Ci0gICAgICAgIGZvcm1hdHRlZCA9IHNiLnRvU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmb3JtYXR0ZWQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlSW5kZXhTZWN0aW9uKFNpbmsgc2luaywgU2V0IHBhZ2VzLCBTdHJpbmcgdGl0bGUpCi0gIHsKLSAgICBpZiAocGFnZXMuaXNFbXB0eSgpKQotICAgIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBzaW5rLnNlY3Rpb25UaXRsZTEoKTsKLSAgICBzaW5rLnRleHQodGl0bGUpOwotICAgIHNpbmsuc2VjdGlvblRpdGxlMV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xKCk7Ci0gICAgc2luay50YWJsZSgpOwotICAgIHNpbmsudGFibGVSb3coKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbCgpOwotICAgIHNpbmsudGV4dCgiVGFnIE5hbWUiKTsKLSAgICBzaW5rLnRhYmxlSGVhZGVyQ2VsbF8oKTsKLSAgICBzaW5rLnRhYmxlUm93XygpOwotICAgIAotICAgIEl0ZXJhdG9yIGl0ZXIgPSBwYWdlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBzaW5rLnRhYmxlUm93KCk7Ci0gICAgICBzaW5rLnRhYmxlQ2VsbCgpOwotICAgICAgCi0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgU3RyaW5nIHRhZ05hbWUgPSAiPCIgKyBuYW1lLnJlcGxhY2UoJ18nLCAnOicpICsgIj4iOwotICAgICAgCi0gICAgICBzaW5rLmxpbmsoX0RPQ19TVUJESVJFQ1RPUlkgKyAiLyIgKyBuYW1lICsgIi5odG1sIik7Ci0gICAgICBzaW5rLnRleHQodGFnTmFtZSk7Ci0gICAgICBzaW5rLmxpbmtfKCk7Ci0gICAgICAKLSAgICAgIHNpbmsudGFibGVDZWxsXygpOwotICAgICAgc2luay50YWJsZVJvd18oKTsKLSAgICB9Ci0gICAgCi0gICAgc2luay50YWJsZV8oKTsKLSAgICBzaW5rLnNlY3Rpb24xXygpOwotICB9Ci0KLSAgcHVibGljIGJvb2xlYW4gdXNlUGFnZUxpbmtCYXIoKQotICB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX3RvUGFnZU5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiXyIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBTdHJpbmcgX2dldFF1YWxpZmllZE5hbWUoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICByZXR1cm4gX2dldFByZWZpeChxTmFtZSkgKyAiOiIgKyBxTmFtZS5nZXRMb2NhbFBhcnQoKTsKLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIF9nZXRQcmVmaXgoUU5hbWUgcU5hbWUpCi0gIHsKLSAgICBpZiAoKHFOYW1lLmdldFByZWZpeCgpICE9IG51bGwpICYmICEiIi5lcXVhbHMocU5hbWUuZ2V0UHJlZml4KCkpKQotICAgIHsKLSAgICAgIHJldHVybiBxTmFtZS5nZXRQcmVmaXgoKTsKLSAgICB9Ci0gICAgCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IHFOYW1lLmdldE5hbWVzcGFjZVVSSSgpOwotICAgIGlmIChuYW1lc3BhY2UgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBmb3IgKEl0ZXJhdG9yIGkgPSB0YWdsaWJzLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7ICkKLSAgICB7Ci0gICAgICBNYXAuRW50cnkgZW50cnkgPSAoTWFwLkVudHJ5KWkubmV4dCgpOwotICAgICAgaWYgKG5hbWVzcGFjZS5lcXVhbHMoZW50cnkuZ2V0VmFsdWUoKSkpCi0gICAgICB7Ci0gICAgICAgIHJldHVybiAoU3RyaW5nKSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gInVua25vd24iOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlQ29tcG9uZW50RG9jKENvbXBvbmVudEJlYW4gY29tcG9uZW50KQotICAgIHRocm93cyBFeGNlcHRpb24KLSAgewotICAgIGlmIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotICAgIFN0cmluZyBwYWdlTmFtZSA9IF90b1BhZ2VOYW1lKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkpOwotCi0gICAgRmlsZSB0YXJnZXREaXIgPSBuZXcgRmlsZShvdXRwdXREaXJlY3RvcnkuZ2V0UGFyZW50RmlsZSgpLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9wbGF0Zm9ybUFnbm9zdGljUGF0aCgiZ2VuZXJhdGVkLXNpdGUveGRvYy8iICsgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb21wb25lbnQuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29tcG9uZW50U3VtbWFyeShvdXQsIGNvbXBvbmVudCk7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgCi0gICAgICBpZiAoY29tcG9uZW50Lmhhc0V2ZW50cyh0cnVlKSkKLSAgICAgIHsKLSAgICAgICAgb3V0LndyaXRlKCIgPHNlY3Rpb24gbmFtZT1cIkV2ZW50c1wiPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICAgIF93cml0ZUNvbXBvbmVudEV2ZW50cyhvdXQsIGNvbXBvbmVudCk7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIiA8L3NlY3Rpb24+XG4iKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaWYgKGNvbXBvbmVudC5oYXNGYWNldHModHJ1ZSkpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdXBwb3J0ZWQgRmFjZXRzXCI+XG4iKTsKLSAgICAgICAgb3V0LndyaXRlKCIgPHA+XG4iKTsKLSAgICAgICAgX3dyaXRlQ29tcG9uZW50RmFjZXRzKG91dCwgY29tcG9uZW50KTsKLSAgICAgICAgb3V0LndyaXRlKCIgPC9wPlxuIik7Ci0gICAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgfQotICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb21wb25lbnRBdHRyaWJ1dGVzKG91dCwgY29tcG9uZW50KTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0gIAotICBwcml2YXRlIFN0cmluZyBfZ2VuZXJhdGVDb252ZXJ0ZXJEb2MoQ29udmVydGVyQmVhbiBjb252ZXJ0ZXIpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgaWYgKGNvbnZlcnRlci5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBTdHJpbmcgcGFnZU5hbWUgPSBfdG9QYWdlTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKTsKLQotICAgIEZpbGUgdGFyZ2V0RGlyID0gbmV3IEZpbGUob3V0cHV0RGlyZWN0b3J5LmdldFBhcmVudEZpbGUoKSwgCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoImdlbmVyYXRlZC1zaXRlL3hkb2MvIiArIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfRE9DX1NVQkRJUkVDVE9SWSkpOwotICAgIHRhcmdldERpci5ta2RpcnMoKTsKLSAgICBGaWxlIHRhcmdldEZpbGUgPSBuZXcgRmlsZSh0YXJnZXREaXIsIHBhZ2VOYW1lICsgIi54bWwiKTsKLQotICAgIFdyaXRlciBvdXQgPSBuZXcgT3V0cHV0U3RyZWFtV3JpdGVyKG5ldyBGaWxlT3V0cHV0U3RyZWFtKHRhcmdldEZpbGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVVEYtOCIpOwotICAgIHRyeQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIjxkb2N1bWVudD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPHByb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiICA8dGl0bGU+Jmx0OyIgKyBfZ2V0UXVhbGlmaWVkTmFtZShjb252ZXJ0ZXIuZ2V0VGFnTmFtZSgpKSArICImZ3Q7PC90aXRsZT5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9wcm9wZXJ0aWVzPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8Ym9keT5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiU3VtbWFyeVwiPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cD5cbiIpOwotICAgICAgX3dyaXRlQ29udmVydGVyU3VtbWFyeShvdXQsIGNvbnZlcnRlcik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3A+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotICAgICAgICAgICAgCi0gICAgICBvdXQud3JpdGUoIiA8c2VjdGlvbiBuYW1lPVwiQXR0cmlidXRlc1wiPlxuIik7Ci0gICAgICBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKG91dCwgY29udmVydGVyKTsKLSAgICAgIG91dC53cml0ZSgiIDwvc2VjdGlvbj5cbiIpOwotCi0gICAgICBvdXQud3JpdGUoIiA8L2JvZHk+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC9kb2N1bWVudD5cbiIpOwotICAgIH0KLSAgICBmaW5hbGx5Ci0gICAgewotICAgICAgb3V0LmNsb3NlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHBhZ2VOYW1lOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2dlbmVyYXRlVmFsaWRhdG9yRG9jKFZhbGlkYXRvckJlYW4gdmFsaWRhdG9yKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIGlmICh2YWxpZGF0b3IuZ2V0VGFnTmFtZSgpID09IG51bGwpCi0gICAgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgU3RyaW5nIHBhZ2VOYW1lID0gX3RvUGFnZU5hbWUodmFsaWRhdG9yLmdldFRhZ05hbWUoKSk7Ci0KLSAgICBGaWxlIHRhcmdldERpciA9IG5ldyBGaWxlKG91dHB1dERpcmVjdG9yeS5nZXRQYXJlbnRGaWxlKCksIAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3BsYXRmb3JtQWdub3N0aWNQYXRoKCJnZW5lcmF0ZWQtc2l0ZS94ZG9jLyIgKyAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9ET0NfU1VCRElSRUNUT1JZKSk7Ci0gICAgdGFyZ2V0RGlyLm1rZGlycygpOwotICAgIEZpbGUgdGFyZ2V0RmlsZSA9IG5ldyBGaWxlKHRhcmdldERpciwgcGFnZU5hbWUgKyAiLnhtbCIpOwotCi0gICAgV3JpdGVyIG91dCA9IG5ldyBPdXRwdXRTdHJlYW1Xcml0ZXIobmV3IEZpbGVPdXRwdXRTdHJlYW0odGFyZ2V0RmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlVURi04Iik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgb3V0LndyaXRlKCI8P3htbCB2ZXJzaW9uPVwiMS4wXCIgZW5jb2Rpbmc9XCJVVEYtOFwiID8+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPGRvY3VtZW50PlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8cHJvcGVydGllcz5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgIDx0aXRsZT4mbHQ7IiArIF9nZXRRdWFsaWZpZWROYW1lKHZhbGlkYXRvci5nZXRUYWdOYW1lKCkpICsgIiZndDs8L3RpdGxlPlxuIik7Ci0gICAgICBvdXQud3JpdGUoIiA8L3Byb3BlcnRpZXM+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxib2R5PlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJTdW1tYXJ5XCI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiIDxwPlxuIik7Ci0gICAgICBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KG91dCwgdmFsaWRhdG9yKTsKLSAgICAgIG91dC53cml0ZSgiIDwvcD5cbiIpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0gICAgICAgICAgICAKLSAgICAgIG91dC53cml0ZSgiIDxzZWN0aW9uIG5hbWU9XCJBdHRyaWJ1dGVzXCI+XG4iKTsKLSAgICAgIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMob3V0LCB2YWxpZGF0b3IpOwotICAgICAgb3V0LndyaXRlKCIgPC9zZWN0aW9uPlxuIik7Ci0KLSAgICAgIG91dC53cml0ZSgiIDwvYm9keT5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8L2RvY3VtZW50PlxuIik7Ci0gICAgfQotICAgIGZpbmFsbHkKLSAgICB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gcGFnZU5hbWU7Ci0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb21wb25lbnRTdW1tYXJ5KFdyaXRlciBvdXQsIENvbXBvbmVudEJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0KLSAgICBvdXQud3JpdGUoIiAgIDxiPlVJQ29tcG9uZW50IGNsYXNzOjwvYj4gIik7Ci0gICAgU3RyaW5nIGphdmFkb2NVUkwgPSBfcGxhdGZvcm1BZ25vc3RpY1BhdGgoIi4uL2FwaWRvY3MvIiArCi0gICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCkucmVwbGFjZSgnLicsICcvJykgKyAiLmh0bWwiKTsKLSAgICBvdXQud3JpdGUoIjxhIGhyZWY9XCIiICsgamF2YWRvY1VSTCArICJcIj4iKTsKLQotICAgIG91dC53cml0ZShiZWFuLmdldENvbXBvbmVudENsYXNzKCkpOwotICAgIG91dC53cml0ZSgiPC9hPiIpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxici8+XG4iKTsKLSAgICBvdXQud3JpdGUoIiAgIDxiPkNvbXBvbmVudCB0eXBlOjwvYj4gIiArIGJlYW4uZ2V0Q29tcG9uZW50VHlwZSgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgaWYgKF9pc05hbWluZ0NvbnRhaW5lcihiZWFuKSkKLSAgICB7Ci0gICAgICBvdXQud3JpdGUoIiAgIDxwPjxiPk5hbWluZyBjb250YWluZXI6PC9iPiAgWWVzLiAgV2hlbiByZWZlcnJpbmcgdG8gY2hpbGRyZW4gb2YgdGhpcyAiICsKLSAgICAgICAgICAgICAgICAiY29tcG9uZW50IChcInBhcnRpYWxUcmlnZ2Vyc1wiLCA8Y29kZT5maW5kQ29tcG9uZW50KCk8L2NvZGU+LCBldGMuKSwgIiArCi0gICAgICAgICAgICAgICAgInlvdSBtdXN0IHByZWZpeCB0aGUgY2hpbGQncyBJRCB3aXRoIHRoaXMgY29tcG9uZW50J3MgSUQgYW5kIGEgY29sb24gKCc6JykuPC9wPiIpOwotICAgIH0KLSAgICAgIAotICAgIFN0cmluZyBmbXRkID0gX2Zvcm1hdFByb3BMaXN0KGJlYW4uZ2V0VW5zdXBwb3J0ZWRBZ2VudHMoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiVW5zdXBwb3J0ZWQgYWdlbnRzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfTk9OX0RPQ1VNRU5URURfQUdFTlRTKTsKLSAgICBpZiAoZm10ZCAhPSBudWxsKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiICAgIiArIGZtdGQpOwotICAgIH0KLQotICAgIFN0cmluZyBkb2MgPSBiZWFuLmdldExvbmdEZXNjcmlwdGlvbigpOwotICAgIGlmIChkb2MgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBkb2MgPSBiZWFuLmdldERlc2NyaXB0aW9uKCk7Ci0gICAgfQotCi0gICAgb3V0LndyaXRlKF9wcmVUb1NvdXJjZShkb2MpKTsKLSAgICBvdXQud3JpdGUoIlxuIik7Ci0gIH0KLQotCi0gIHByaXZhdGUgYm9vbGVhbiBfaXNOYW1pbmdDb250YWluZXIoQ29tcG9uZW50QmVhbiBiZWFuKQotICB7Ci0gICAgaWYgKGJlYW4uaXNOYW1pbmdDb250YWluZXIoKSkKLSAgICB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBDb21wb25lbnRCZWFuIHBhcmVudCA9IGJlYW4ucmVzb2x2ZVN1cGVydHlwZSgpOwotICAgIGlmIChwYXJlbnQgPT0gbnVsbCkKLSAgICB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBfaXNOYW1pbmdDb250YWluZXIocGFyZW50KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVWYWxpZGF0b3JTdW1tYXJ5KFdyaXRlciBvdXQsIFZhbGlkYXRvckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICBvdXQud3JpdGUoIiAgIDxiPlRhZyBuYW1lOjwvYj4gJmx0OyIgKwotICAgICAgICAgICAgICBfZ2V0UXVhbGlmaWVkTmFtZShiZWFuLmdldFRhZ05hbWUoKSkgKyAiJmd0O1xuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgCi0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj4gdHlwZTo8L2I+ICIgKyBiZWFuLmdldFZhbGlkYXRvcklkKCkgKyAgIlxuIik7Ci0gICAgb3V0LndyaXRlKCIgICA8YnIvPlxuIik7Ci0KLSAgICBTdHJpbmcgZG9jID0gYmVhbi5nZXRMb25nRGVzY3JpcHRpb24oKTsKLSAgICBpZiAoZG9jID09IG51bGwpCi0gICAgewotICAgICAgZG9jID0gYmVhbi5nZXREZXNjcmlwdGlvbigpOwotICAgIH0KLQotICAgIG91dC53cml0ZShfcHJlVG9Tb3VyY2UoZG9jKSk7Ci0gICAgb3V0LndyaXRlKCJcbiIpOwotICB9Ci0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29udmVydGVyU3VtbWFyeShXcml0ZXIgb3V0LCBDb252ZXJ0ZXJCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCIgICA8Yj5UYWcgbmFtZTo8L2I+ICZsdDsiICsKLSAgICAgICAgICAgICAgX2dldFF1YWxpZmllZE5hbWUoYmVhbi5nZXRUYWdOYW1lKCkpICsgIiZndDtcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIAotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotICAgIG91dC53cml0ZSgiICAgPGI+IHR5cGU6PC9iPiAiICsgYmVhbi5nZXRDb252ZXJ0ZXJJZCgpICsgICJcbiIpOwotICAgIG91dC53cml0ZSgiICAgPGJyLz5cbiIpOwotCi0gICAgU3RyaW5nIGRvYyA9IGJlYW4uZ2V0TG9uZ0Rlc2NyaXB0aW9uKCk7Ci0gICAgaWYgKGRvYyA9PSBudWxsKQotICAgIHsKLSAgICAgIGRvYyA9IGJlYW4uZ2V0RGVzY3JpcHRpb24oKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoX3ByZVRvU291cmNlKGRvYykpOwotICAgIG91dC53cml0ZSgiXG4iKTsKLSAgfQotCi0gIHN0YXRpYyBwcml2YXRlIGZpbmFsIFN0cmluZyBfcHJlVG9Tb3VyY2UoU3RyaW5nIGluKQotICB7Ci0gICAgaW4gPSBpbi5yZXBsYWNlQWxsKCI8cHJlPiIsICI8c291cmNlPjwhW0NEQVRBWyIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPC9wcmU+IiwgIl1dPjwvc291cmNlPiIpOwotICAgIGluID0gaW4ucmVwbGFjZUFsbCgiPGh0bWw6IiwgIjwiKTsKLSAgICBpbiA9IGluLnJlcGxhY2VBbGwoIjwvaHRtbDoiLCAiPC8iKTsKLQotICAgIHJldHVybiBpbjsKLSAgfQotICAKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nIF9wbGF0Zm9ybUFnbm9zdGljUGF0aChTdHJpbmcgcGF0aCkKLSAgewotICAgICAgcmV0dXJuIHBhdGgucmVwbGFjZSgnLycsIEZpbGUuc2VwYXJhdG9yQ2hhcik7Ci0gIH0KLQotCi0gIHByaXZhdGUgY2xhc3MgR3JvdXBDb21wYXJhdG9yIGltcGxlbWVudHMgQ29tcGFyYXRvcgotICB7Ci0gICAgcHVibGljIGludCBjb21wYXJlKE9iamVjdCBvMSwgT2JqZWN0IG8yKQotICAgIHsKLSAgICAgIHJldHVybiBfZ2V0R3JvdXBJbmRleChvMSkgLSBfZ2V0R3JvdXBJbmRleChvMik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKQotICAgIHsKLSAgICAgIHJldHVybiAobyBpbnN0YW5jZW9mIEdyb3VwQ29tcGFyYXRvcik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpCi0gICAgewotICAgICAgLy8gWWVzLCB0aGlzIGlzIGEgdmVyeSBzdHJhbmdlIGhhc2hDb2RlIGltcGxlbWVudGF0aW9uLiBCdXQgdGhlCi0gICAgICAvLyBlcXVhbHMgbWV0aG9kIGlzIGFsc28gdmVyeSBzdHJhbmdlOyBhbnkgdHdvIEdyb3VwQ29tcGFyYXRvcgotICAgICAgLy8gb2JqZWN0cyBhcmUgYWx3YXlzIGVxdWFsLiBUaGVyZWZvcmUgYnkgdGhlIGphdmEgcnVsZXMsIGFueQotICAgICAgLy8gdHdvIEdyb3VwQ29tcGFyYXRvciBvYmplY3RzIG11c3QgYWx3YXlzIGhhdmUgdGhlIHNhbWUgaGFzaENvZGUuCi0gICAgICByZXR1cm4gMTc7ICAvLyBhbiBhcmJpdHJhcnkgY29uc3RhbnQuCi0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgX2dldEdyb3VwSW5kZXgoT2JqZWN0IG8pCi0gICAgewotICAgICAgU3RyaW5nIHMgPSAobyA9PSBudWxsKSA/IG51bGwgOiBvLnRvU3RyaW5nKCk7Ci0KLQotCi0KLSAgICAgIGlmICgibWVzc2FnZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIGlmICgiY29yZSIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoImV2ZW50cyIuZXF1YWxzSWdub3JlQ2FzZShzKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIDI7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdldExvZygpLndhcm4oIlVOS05PV04gQVRUUklCVVRFIEdST1VQOiAiICsgcyk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgQ29tcG9uZW50QmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcyh0cnVlKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lLCB0cnVlKSk7Ci0gICAgfQotICAgIAotCi0gICAgVHJlZVNldCBncm91cHMgPSBuZXcgVHJlZVNldChuZXcgR3JvdXBDb21wYXJhdG9yKCkpOwotICAgIC8qIE5vIGN1cnJlbnQgc3VwcG9ydCBmb3IgZ3JvdXBpbmcKLSAgICAvLyBNYWtlIHN1cmUgIm51bGwiIGlzIHRoZSByZXByZXNlbnRhdGl2ZSBmb3IgdW5rbm93biBncm91cHMKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgZ3JvdXAgPSAoKEF0dHJpYnV0ZURvYykgaXRlci5uZXh0KCkpLmdyb3VwOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIGdyb3Vwcy5hZGQoZ3JvdXApOwotICAgICAgfQotICAgIH0KLSAgICAqLwotCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldENvbXBvbmVudENsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncm91cHMuaXNFbXB0eSgpID8gbnVsbCA6ICJVbmdyb3VwZWQiKTsKLQotICAgIEl0ZXJhdG9yIGdyb3VwSXRlciA9IGdyb3Vwcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChncm91cEl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlYW4uZ2V0Q29tcG9uZW50Q2xhc3MoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFN0cmluZykgZ3JvdXBJdGVyLm5leHQoKSk7Ci0gICAgfQotCi0gIH0KLQotCi0gIHByaXZhdGUgdm9pZCBfd3JpdGVDb252ZXJ0ZXJBdHRyaWJ1dGVzKFdyaXRlciBvdXQsIENvbnZlcnRlckJlYW4gYmVhbikgdGhyb3dzIElPRXhjZXB0aW9uCi0gIHsKLSAgICAvLyBTb3J0IHRoZSBuYW1lcwotICAgIFRyZWVTZXQgYXR0cmlidXRlcyA9IG5ldyBUcmVlU2V0KCk7Ci0gICAgSXRlcmF0b3IgYXR0cnMgPSBiZWFuLnByb3BlcnRpZXMoKTsKLSAgICB3aGlsZSAoYXR0cnMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBwcm9wZXJ0eSA9IChQcm9wZXJ0eUJlYW4pIGF0dHJzLm5leHQoKTsKLSAgICAgIGlmICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKQotICAgICAgewotICAgICAgICBhdHRyaWJ1dGVzLmFkZChwcm9wZXJ0eS5nZXRQcm9wZXJ0eU5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBhIGxpc3Qgb2YgUHJvcGVydHlCZWFucwotICAgIExpc3QgbGlzdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYXR0cmlidXRlcy5pdGVyYXRvcigpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgYXR0ck5hbWUgPSAoU3RyaW5nKSBpdGVyLm5leHQoKTsKLSAgICAgIGxpc3QuYWRkKGJlYW4uZmluZFByb3BlcnR5KGF0dHJOYW1lKSk7Ci0gICAgfQotICAgIAotICAgIF93cml0ZUNvbXBvbmVudEF0dHJpYnV0ZXMob3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGlzdC5pdGVyYXRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmVhbi5nZXRDb252ZXJ0ZXJDbGFzcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVsbCk7Ci0gIH0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZVZhbGlkYXRvckF0dHJpYnV0ZXMoV3JpdGVyIG91dCwgVmFsaWRhdG9yQmVhbiBiZWFuKSB0aHJvd3MgSU9FeGNlcHRpb24KLSAgewotICAgIC8vIFNvcnQgdGhlIG5hbWVzCi0gICAgVHJlZVNldCBhdHRyaWJ1dGVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBhdHRycyA9IGJlYW4ucHJvcGVydGllcygpOwotICAgIHdoaWxlIChhdHRycy5oYXNOZXh0KCkpCi0gICAgewotICAgICAgUHJvcGVydHlCZWFuIHByb3BlcnR5ID0gKFByb3BlcnR5QmVhbikgYXR0cnMubmV4dCgpOwotICAgICAgaWYgKCFwcm9wZXJ0eS5pc1RhZ0F0dHJpYnV0ZUV4Y2x1ZGVkKCkpCi0gICAgICB7Ci0gICAgICAgIGF0dHJpYnV0ZXMuYWRkKHByb3BlcnR5LmdldFByb3BlcnR5TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3cgZ2V0IGEgbGlzdCBvZiBQcm9wZXJ0eUJlYW5zCi0gICAgTGlzdCBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgIEl0ZXJhdG9yIGl0ZXIgPSBhdHRyaWJ1dGVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFN0cmluZyBhdHRyTmFtZSA9IChTdHJpbmcpIGl0ZXIubmV4dCgpOwotICAgICAgbGlzdC5hZGQoYmVhbi5maW5kUHJvcGVydHkoYXR0ck5hbWUpKTsKLSAgICB9Ci0gICAgCi0gICAgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0Lml0ZXJhdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZWFuLmdldFZhbGlkYXRvckNsYXNzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudWxsKTsKLSAgfQotCi0KLQotICBwcml2YXRlIHZvaWQgX3dyaXRlQ29tcG9uZW50QXR0cmlidXRlcyhXcml0ZXIgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdGVyYXRvciBhdHRyaWJ1dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmcgZ3JvdXApIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgYm9vbGVhbiB3cml0dGVuQW55QXR0cmlidXRlcyA9IGZhbHNlOwotCi0gICAgd2hpbGUgKGF0dHJpYnV0ZXMuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIFByb3BlcnR5QmVhbiBhdHRyID0gKFByb3BlcnR5QmVhbikgYXR0cmlidXRlcy5uZXh0KCk7Ci0KLSAgICAgIC8qCi0gICAgICBpZiAoKGdyb3VwID09IG51bGwpIHx8ICJVbmdyb3VwZWQiLmVxdWFscyhncm91cCkpCi0gICAgICB7Ci0gICAgICAgIGlmIChkb2MuZ3JvdXAgIT0gbnVsbCkKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgaWYgKCFncm91cC5lcXVhbHNJZ25vcmVDYXNlKGRvYy5ncm91cCkpCi0gICAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICAqLwotCi0gICAgICBpZiAoIXdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgICAgewotICAgICAgICB3cml0dGVuQW55QXR0cmlidXRlcyA9IHRydWU7Ci0gICAgICAgIGlmIChncm91cCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHNlY3Rpb25OYW1lOwotICAgICAgICAgIGlmICgiZXZlbnRzIi5lcXVhbHNJZ25vcmVDYXNlKGdyb3VwKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBzZWN0aW9uTmFtZSA9ICJKYXZhc2NyaXB0IGF0dHJpYnV0ZXMiOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbHNlCi0gICAgICAgICAgewotICAgICAgICAgICAgc2VjdGlvbk5hbWUgPSBncm91cCArICIgYXR0cmlidXRlcyI7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgb3V0LndyaXRlKCI8c3Vic2VjdGlvbiBuYW1lPVwiIiArIHNlY3Rpb25OYW1lICsgIlwiPlxuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBvdXQud3JpdGUoIjx0YWJsZT5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5UeXBlPC90aD5cbiIpOwotICAgICAgICBvdXQud3JpdGUoIjx0aD5TdXBwb3J0cyBFTD88L3RoPlxuIik7Ci0gICAgICAgIGlmICghX2F0dHJEb2NTcGFuc0NvbHVtbnMpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjx0aD5EZXNjcmlwdGlvbjwvdGg+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICAgIH0KLQotICAgICAgU3RyaW5nIHByb3BlcnR5TmFtZSA9IGF0dHIuZ2V0UHJvcGVydHlOYW1lKCk7Ci0gICAgICAvLyBRdWljayBmaXggb2YgcHJvYmxlbXMgd2l0aCBhY3Rpb25FeHByZXNzaW9uIHZzLiBhY3Rpb24KLSAgICAgIC8vIGFjdGlvbkV4cHJlc3Npb24gaXMgdGhlIE1ldGhvZEV4cHJlc3Npb24gb24gdGhlIGNvbXBvbmVudCwKLSAgICAgIC8vIGJ1dCBvbiB0aGUgdGFnIGl0J3MgJ2FjdGlvbicKLSAgICAgIGlmICgiYWN0aW9uRXhwcmVzc2lvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIHByb3BlcnR5TmFtZSA9ICJhY3Rpb24iOwotICAgICAgfQotCi0gICAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIHByb3BlcnR5TmFtZSArICI8L3RkPiIpOwotICAgICAgU3RyaW5nIHR5cGUgPSBfZ2V0RGlzcGxheVR5cGUoY2xhc3NOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcGVydHlOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0ci5nZXRQcm9wZXJ0eUNsYXNzKCkpOwotCi0gICAgICBvdXQud3JpdGUoIjx0ZD4iICsgdHlwZSArICI8L3RkPiIpOwotCi0gICAgICBTdHJpbmcgZWxTdXBwb3J0ZWQ7Ci0gICAgICAvLyBNZXRob2RCaW5kaW5ncywgImJpbmRpbmciLCBhbmQgc29tZSBvdGhlciBhdHRyaWJ1dGVzCi0gICAgICAvLyByZXF1aXJlIEVMIHN1cHBvcnQKLSAgICAgIGlmIChhdHRyLmlzTWV0aG9kQmluZGluZygpIHx8IAotICAgICAgICAgIGF0dHIuaXNNZXRob2RFeHByZXNzaW9uKCkgfHwKLSAgICAgICAgICAiYmluZGluZyIuZXF1YWxzKHByb3BlcnR5TmFtZSkpCi0gICAgICB7Ci0gICAgICAgIC8vICJhY3Rpb24iIGRvZXNuJ3QgcmVxdWlyZSBFTDsgYWxsIGVsc2UgZG8uCi0gICAgICAgIGVsU3VwcG9ydGVkID0gImFjdGlvbiIuZXF1YWxzKHByb3BlcnR5TmFtZSkgPyAiWWVzIiA6ICJPbmx5IEVMIjsKLSAgICAgIH0KLSAgICAgIGVsc2UKLSAgICAgIHsKLSAgICAgICAgZWxTdXBwb3J0ZWQgPSBhdHRyLmlzTGl0ZXJhbE9ubHkoKSA/ICJObyIgOiAiWWVzIjsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8dGQ+IiArIGVsU3VwcG9ydGVkICsgIjwvdGQ+Iik7Ci0KLSAgICAgIGlmIChhdHRyLmdldERlc2NyaXB0aW9uKCkgICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB2YWxTdHIgPSBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRQcm9wZXJ0eVZhbHVlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJWYWxpZCBWYWx1ZXMiKTsKLSAgICAgICAgU3RyaW5nIHVuc3VwQWdlbnRzU3RyID0KLSAgICAgICAgICBfZm9ybWF0UHJvcExpc3QoYXR0ci5nZXRVbnN1cHBvcnRlZEFnZW50cygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiTm90IHN1cHBvcnRlZCBvbiB0aGUgZm9sbG93aW5nIGFnZW50cyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIF9OT05fRE9DVU1FTlRFRF9BR0VOVFMpOwotICAgICAgICBTdHJpbmcgdW5zdXBSa1N0ciA9Ci0gICAgICAgICAgX2Zvcm1hdFByb3BMaXN0KGF0dHIuZ2V0VW5zdXBwb3J0ZWRSZW5kZXJLaXRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJOb3Qgc3VwcG9ydGVkIG9uIHRoZSBmb2xsb3dpbmcgcmVuZGVya2l0cyIpOwotCi0gICAgICAgIGlmIChfYXR0ckRvY1NwYW5zQ29sdW1ucykKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgICAgICAgIG91dC53cml0ZSgiPHRyPlxuIik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8dGQgY29sc3Bhbj1cIjNcIj5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPHRkPlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vICAgICAgICBvdXQud3JpdGUoRXNjYXBlVXRpbHMuZXNjYXBlRWxlbWVudFZhbHVlKGRvYy5kb2MpKTsKLSAgICAgICAgaWYgKHZhbFN0ciAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgb3V0LndyaXRlKHZhbFN0cik7Ci0gICAgICAgICAgb3V0LndyaXRlKCI8YnIvPiIpOwotICAgICAgICB9Ci0gICAgICAgIG91dC53cml0ZShhdHRyLmdldERlc2NyaXB0aW9uKCkpOwotICAgICAgICBpZiAodW5zdXBBZ2VudHNTdHIgIT0gbnVsbCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiPGJyLz4iKTsKLSAgICAgICAgICBvdXQud3JpdGUodW5zdXBBZ2VudHNTdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICh1bnN1cFJrU3RyICE9IG51bGwpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQud3JpdGUoIjxici8+Iik7Ci0gICAgICAgICAgb3V0LndyaXRlKHVuc3VwUmtTdHIpOwotICAgICAgICB9Ci0gICAgICAgIC8vb3V0LndyaXRlKEVzY2FwZVV0aWxzLmVzY2FwZUFtcGVyc2FuZHMoZG9jLmRvYykpOwotICAgICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKCI8L3RyPlxuIik7Ci0gICAgfQotCi0gICAgaWYgKHdyaXR0ZW5BbnlBdHRyaWJ1dGVzKQotICAgIHsKLSAgICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICAgICAgaWYgKGdyb3VwICE9IG51bGwpCi0gICAgICB7Ci0gICAgICAgIG91dC53cml0ZSgiPC9zdWJzZWN0aW9uPlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByaXZhdGUgU3RyaW5nIF9nZXREaXNwbGF5VHlwZShTdHJpbmcgY2xhc3NOYW1lLCBTdHJpbmcgbmFtZSwgU3RyaW5nIHR5cGUpCi0gIHsKLSAgICBpZiAodHlwZS5zdGFydHNXaXRoKCJqYXZhLmxhbmcuIikpCi0gICAgewotICAgICAgcmV0dXJuIHR5cGUuc3Vic3RyaW5nKCJqYXZhLmxhbmcuIi5sZW5ndGgoKSk7Ci0gICAgfQotICAgIGVsc2UgaWYgKCJiaW5kaW5nIi5lcXVhbHMobmFtZSkpCi0gICAgewotICAgICAgU3RyaW5nVG9rZW5pemVyIHRva2VucyA9IG5ldyBTdHJpbmdUb2tlbml6ZXIoY2xhc3NOYW1lLCAiLiIsIHRydWUpOwotICAgICAgU3RyaW5nIG91dCA9ICIiOwotICAgICAgd2hpbGUgKHRva2Vucy5oYXNNb3JlVG9rZW5zKCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZyB0b2tlbiA9IHRva2Vucy5uZXh0VG9rZW4oKTsKLSAgICAgICAgb3V0ID0gb3V0ICsgdG9rZW47Ci0gICAgICAgIC8vIEdpdmUgb3Vyc2VsdmVzIGFuIG9wcG9ydHVuaXR5IGZvciBhIGxpbmUgYnJlYWsgYWZ0ZXIgImNvbXBvbmVudC4iOwotICAgICAgICBpZiAob3V0LmVuZHNXaXRoKCJjb21wb25lbnQuIikpCi0gICAgICAgIHsKLSAgICAgICAgICBvdXQgPSBvdXQgKyAiPHdici8+IjsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gb3V0OwotICAgIH0KLQotICAgIHJldHVybiB0eXBlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEV2ZW50cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgb3V0LndyaXRlKCI8dGFibGU+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0cj5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPlR5cGU8L3RoPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dGg+UGhhc2VzPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgaXRlciA9IGJlYW4uZXZlbnRzKHRydWUpOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBFdmVudFJlZkJlYW4gZXZlbnRSZWYgPSAoRXZlbnRSZWZCZWFuKSBpdGVyLm5leHQoKTsKLSAgICAgIEV2ZW50QmVhbiAgICBldmVudCA9IGV2ZW50UmVmLnJlc29sdmVFdmVudFR5cGUoKTsKLQotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXRFdmVudENsYXNzKCkgKyAiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkIG5vd3JhcD1cIm5vd3JhcFwiPiIpOwotICAgICAgU3RyaW5nW10gcGhhc2VzID0gZXZlbnRSZWYuZ2V0RXZlbnREZWxpdmVyeVBoYXNlcygpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwaGFzZXMubGVuZ3RoOyBpKyspCi0gICAgICB7Ci0gICAgICAgIGlmIChpID4gMCkKLSAgICAgICAgewotICAgICAgICAgIG91dC53cml0ZSgiLDxici8+Iik7Ci0gICAgICAgIH0KLSAgICAgICAgb3V0LndyaXRlKChTdHJpbmcpIHBoYXNlc1tpXSk7Ci0gICAgICB9Ci0KLSAgICAgIG91dC53cml0ZSgiPC90ZD4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBldmVudC5nZXREZXNjcmlwdGlvbigpICsgIjwvdGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoIjwvdHI+XG4iKTsKLSAgICB9Ci0KLSAgICBvdXQud3JpdGUoIjwvdGFibGU+XG4iKTsKLSAgfQotCi0KLQotCi0KLSAgcHJpdmF0ZSB2b2lkIF93cml0ZUNvbXBvbmVudEZhY2V0cyhXcml0ZXIgb3V0LCBDb21wb25lbnRCZWFuIGJlYW4pIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgLy8gU29ydCB0aGUgZmFjZXRzCi0gICAgVHJlZVNldCBmYWNldE5hbWVzID0gbmV3IFRyZWVTZXQoKTsKLSAgICBJdGVyYXRvciBpdGVyID0gYmVhbi5mYWNldHModHJ1ZSk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKQotICAgIHsKLSAgICAgIGZhY2V0TmFtZXMuYWRkKCgoRmFjZXRCZWFuKSBpdGVyLm5leHQoKSkuZ2V0RmFjZXROYW1lKCkpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPHRhYmxlPlxuIik7Ci0gICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICBvdXQud3JpdGUoIjx0aD5OYW1lPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPHRoPkRlc2NyaXB0aW9uPC90aD5cbiIpOwotICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotCi0gICAgSXRlcmF0b3IgbmFtZUl0ZXIgPSBmYWNldE5hbWVzLml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKG5hbWVJdGVyLmhhc05leHQoKSkKLSAgICB7Ci0gICAgICBTdHJpbmcgbmFtZSA9IChTdHJpbmcpIG5hbWVJdGVyLm5leHQoKTsKLSAgICAgIEZhY2V0QmVhbiBmYWNldCA9IGJlYW4uZmluZEZhY2V0KG5hbWUsIHRydWUpOwotICAgICAgb3V0LndyaXRlKCI8dHI+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPHRkPiIgKyBmYWNldC5nZXRGYWNldE5hbWUoKSArICI8L3RkPiIpOwotICAgICAgb3V0LndyaXRlKCI8dGQ+Iik7Ci0gICAgICBvdXQud3JpdGUoZmFjZXQuZ2V0RGVzY3JpcHRpb24oKSk7Ci0gICAgICBvdXQud3JpdGUoIjwvdGQ+XG4iKTsKLSAgICAgIG91dC53cml0ZSgiPC90cj5cbiIpOwotICAgIH0KLQotICAgIG91dC53cml0ZSgiPC90YWJsZT5cbiIpOwotICB9Ci0KLQotCi0KLSAgcHJvdGVjdGVkIE1hdmVuUHJvamVjdCBnZXRQcm9qZWN0KCkKLSAgewotICAgIHJldHVybiBwcm9qZWN0OwotICB9Ci0gIAotICBwcm90ZWN0ZWQgU3RyaW5nIGdldE91dHB1dERpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gb3V0cHV0RGlyZWN0b3J5LmdldEFic29sdXRlUGF0aCgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFNpdGVSZW5kZXJlciBnZXRTaXRlUmVuZGVyZXIoKQotICB7Ci0gICAgcmV0dXJuIHNpdGVSZW5kZXJlcjsKLSAgfQotCi0gIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSggTG9jYWxlIGxvY2FsZSApCi0gIHsKLSAgICByZXR1cm4gIkpTRiBUYWcgRG9jdW1lbnRhdGlvbiI7Ci0gIH0KLQotICBwdWJsaWMgU3RyaW5nIGdldERlc2NyaXB0aW9uKCBMb2NhbGUgbG9jYWxlICkKLSAgewotICAgIHJldHVybiAiRG9jdW1lbnRhdGlvbiBmb3IgSlNGIFRhZ3MiOwotICB9Ci0KLSAgcHVibGljIFN0cmluZyBnZXRPdXRwdXROYW1lKCkKLSAgewotICAgIHJldHVybiAidGFnZG9jIjsKLSAgfQotCi0gIHByb3RlY3RlZCB2b2lkIHByb2Nlc3NJbmRleCgKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCwKLSAgICBTdHJpbmcgICAgICAgcmVzb3VyY2VQYXRoKSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIF9mYWNlc0NvbmZpZyA9IG5ldyBGYWNlc0NvbmZpZ0JlYW4oKTsKLQotICAgIFVSTFtdIGluZGV4ID0gcmVhZEluZGV4KHByb2plY3QpOwotICAgIGZvciAoaW50IGk9MDsgaSA8IGluZGV4Lmxlbmd0aDsgaSsrKQotICAgIHsKLSAgICAgIHByb2Nlc3NJbmRleEVudHJ5KGluZGV4W2ldKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBwcm9jZXNzSW5kZXhFbnRyeSgKLSAgICBVUkwgZW50cnkpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgbmV3IEZhY2VzQ29uZmlnUGFyc2VyKCkubWVyZ2UoX2ZhY2VzQ29uZmlnLCBlbnRyeSk7Ci0gICAgfQotICAgIGNhdGNoIChNb2pvRXhlY3V0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBmYWNlcyBjb25maWciLGUpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBGYWNlc0NvbmZpZ0JlYW4gZ2V0RmFjZXNDb25maWcoKQotICB7Ci0gICAgcmV0dXJuIF9mYWNlc0NvbmZpZzsKLSAgfQotCi0KLSAgcHJvdGVjdGVkIExpc3QgZ2V0TWFzdGVyQ29uZmlncygKLSAgICBNYXZlblByb2plY3QgcHJvamVjdCkgdGhyb3dzIE1hdmVuUmVwb3J0RXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgcmVzb3VyY2VQYXRoID0gIk1FVEEtSU5GL21hdmVuLWZhY2VzLXBsdWdpbi9mYWNlcy1jb25maWcueG1sIjsKLSAgICByZXR1cm4gZ2V0Q29tcGlsZURlcGVuZGVuY3lSZXNvdXJjZXMocHJvamVjdCwgcmVzb3VyY2VQYXRoKTsKLSAgfQotCi0gIHByb3RlY3RlZCBMaXN0IGdldENvbXBpbGVEZXBlbmRlbmN5UmVzb3VyY2VzKAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0LAotICAgIFN0cmluZyAgICAgICByZXNvdXJjZVBhdGgpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgQ2xhc3NMb2FkZXIgY2wgPSBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIocHJvamVjdCk7Ci0gICAgICBFbnVtZXJhdGlvbiBlID0gY2wuZ2V0UmVzb3VyY2VzKHJlc291cmNlUGF0aCk7Ci0gICAgICBMaXN0IHVybHMgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICB3aGlsZSAoZS5oYXNNb3JlRWxlbWVudHMoKSkKLSAgICAgIHsKLSAgICAgICAgVVJMIHVybCA9IChVUkwpZS5uZXh0RWxlbWVudCgpOwotICAgICAgICB1cmxzLmFkZCh1cmwpOwotICAgICAgfQotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodXJscyk7Ci0gICAgfQotICAgIGNhdGNoIChJT0V4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiVW5hYmxlIHRvIGdldCByZXNvdXJjZXMgZm9yIHBhdGggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIiICsgcmVzb3VyY2VQYXRoICsgIlwiIiwgZSk7Ci0gICAgfQotCi0gIH0KLQotICBwcm90ZWN0ZWQgVVJMW10gcmVhZEluZGV4KAotICAgIE1hdmVuUHJvamVjdCBwcm9qZWN0KSB0aHJvd3MgTWF2ZW5SZXBvcnRFeGNlcHRpb24KLSAgewotICAgIHRyeQotICAgIHsKLSAgICAgIC8vIDEuIHJlYWQgbWFzdGVyIGZhY2VzLWNvbmZpZy54bWwgcmVzb3VyY2VzCi0gICAgICBMaXN0IG1hc3RlcnMgPSBnZXRNYXN0ZXJDb25maWdzKHByb2plY3QpOwotICAgICAgaWYgKG1hc3RlcnMuaXNFbXB0eSgpKQotICAgICAgewotICAgICAgICBnZXRMb2coKS53YXJuKCJNYXN0ZXIgZmFjZXMtY29uZmlnLnhtbCBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIG5ldyBVUkxbMF07Ci0gICAgICB9Ci0gICAgICBlbHNlCi0gICAgICB7Ci0gICAgICAgIExpc3QgZW50cmllcyA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0KLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBzcGYgPSBTQVhQYXJzZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIHNwZi5zZXROYW1lc3BhY2VBd2FyZSh0cnVlKTsKLSAgICAgICAgLy8gcmVxdWlyZXMgSkFYUCAxLjMsIGluIEphdmFTRSA1LjAKLSAgICAgICAgLy8gc3BmLnNldFhJbmNsdWRlQXdhcmUoZmFsc2UpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1tYXN0ZXJzLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgewotICAgICAgICAgIFVSTCB1cmwgPSAoVVJMKWkubmV4dCgpOwotICAgICAgICAgIERpZ2VzdGVyIGRpZ2VzdGVyID0gbmV3IERpZ2VzdGVyKHNwZi5uZXdTQVhQYXJzZXIoKSk7Ci0gICAgICAgICAgZGlnZXN0ZXIuc2V0TmFtZXNwYWNlQXdhcmUodHJ1ZSk7Ci0KLSAgICAgICAgICAvLyBYSW5jbHVkZQotICAgICAgICAgIGRpZ2VzdGVyLnNldFJ1bGVOYW1lc3BhY2VVUkkoWEluY2x1ZGVGaWx0ZXIuWElOQ0xVREVfTkFNRVNQQUNFKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRDYWxsTWV0aG9kKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsICJhZGQiLCAxKTsKLSAgICAgICAgICBkaWdlc3Rlci5hZGRGYWN0b3J5Q3JlYXRlKCJmYWNlcy1jb25maWcvaW5jbHVkZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUkxDcmVhdGlvbkZhY3RvcnkuY2xhc3MpOwotICAgICAgICAgIGRpZ2VzdGVyLmFkZENhbGxQYXJhbSgiZmFjZXMtY29uZmlnL2luY2x1ZGUiLCAwLCAwKTsKLQotICAgICAgICAgIGRpZ2VzdGVyLnB1c2godXJsKTsKLSAgICAgICAgICBkaWdlc3Rlci5wdXNoKGVudHJpZXMpOwotICAgICAgICAgIGRpZ2VzdGVyLnBhcnNlKHVybC5vcGVuU3RyZWFtKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIChVUkxbXSllbnRyaWVzLnRvQXJyYXkobmV3IFVSTFswXSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhdGNoIChQYXJzZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoU0FYRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1hdmVuUmVwb3J0RXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgbWFzdGVyIGNvbmZpZyIsIGUpOwotICAgIH0KLSAgICBjYXRjaCAoSU9FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBtYXN0ZXIgY29uZmlnIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBDbGFzc0xvYWRlciBjcmVhdGVDb21waWxlQ2xhc3NMb2FkZXIoCi0gICAgTWF2ZW5Qcm9qZWN0IHByb2plY3QpIHRocm93cyBNYXZlblJlcG9ydEV4Y2VwdGlvbgotICB7Ci0gICAgVGhyZWFkIGN1cnJlbnQgPSBUaHJlYWQuY3VycmVudFRocmVhZCgpOwotICAgIENsYXNzTG9hZGVyIGNsID0gY3VycmVudC5nZXRDb250ZXh0Q2xhc3NMb2FkZXIoKTsKLQotICAgIHRyeQotICAgIHsKLSAgICAgIExpc3QgY2xhc3NwYXRoRWxlbWVudHMgPSBwcm9qZWN0LmdldENvbXBpbGVDbGFzc3BhdGhFbGVtZW50cygpOwotICAgICAgaWYgKCFjbGFzc3BhdGhFbGVtZW50cy5pc0VtcHR5KCkpCi0gICAgICB7Ci0gICAgICAgIFN0cmluZ1tdIGVudHJpZXMgPSAoU3RyaW5nW10pY2xhc3NwYXRoRWxlbWVudHMudG9BcnJheShuZXcgU3RyaW5nWzBdKTsKLSAgICAgICAgVVJMW10gdXJscyA9IG5ldyBVUkxbZW50cmllcy5sZW5ndGhdOwotICAgICAgICBmb3IgKGludCBpPTA7IGkgPCB1cmxzLmxlbmd0aDsgaSsrKQotICAgICAgICB7Ci0gICAgICAgICAgdXJsc1tpXSA9IG5ldyBGaWxlKGVudHJpZXNbaV0pLnRvVVJMKCk7Ci0gICAgICAgIH0KLSAgICAgICAgY2wgPSBuZXcgVVJMQ2xhc3NMb2FkZXIodXJscywgY2wpOwotICAgICAgfQotICAgIH0KLSAgICBjYXRjaCAoRGVwZW5kZW5jeVJlc29sdXRpb25SZXF1aXJlZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIHRocm93IG5ldyBNYXZlblJlcG9ydEV4Y2VwdGlvbigiRXJyb3IgY2FsY3VsYXRpbmcgc2NvcGUgY2xhc3NwYXRoIiwgZSk7Ci0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgTWF2ZW5SZXBvcnRFeGNlcHRpb24oIkVycm9yIGNhbGN1bGF0aW5nIHNjb3BlIGNsYXNzcGF0aCIsIGUpOwotICAgIH0KLQotICAgIHJldHVybiBjbDsKLSAgfQotCi0gIHN0YXRpYyBwdWJsaWMgY2xhc3MgVVJMQ3JlYXRpb25GYWN0b3J5IGV4dGVuZHMgQWJzdHJhY3RPYmplY3RDcmVhdGlvbkZhY3RvcnkKLSAgewotICAgIHB1YmxpYyBPYmplY3QgY3JlYXRlT2JqZWN0KAotICAgICAgQXR0cmlidXRlcyBhdHRyaWJ1dGVzKSB0aHJvd3MgTWFsZm9ybWVkVVJMRXhjZXB0aW9uCi0gICAgewotICAgICAgU3RyaW5nIGhyZWYgPSBhdHRyaWJ1dGVzLmdldFZhbHVlKCJocmVmIik7Ci0gICAgICBpZiAoaHJlZiA9PSBudWxsKQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNaXNzaW5nIGhyZWYgYXR0cmlidXRlIik7Ci0gICAgICB9Ci0KLSAgICAgIFVSTCBtYXN0ZXIgPSAoVVJMKWRpZ2VzdGVyLmdldFJvb3QoKTsKLSAgICAgIHJldHVybiBuZXcgVVJMKG1hc3RlciwgaHJlZik7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIHByb3RlY3RlZCBjbGFzcyBTa2lwRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb21wb25lbnRCZWFuIGNvbXBvbmVudCkKLSAgICB7Ci0gICAgICBTdHJpbmcgY29tcG9uZW50VHlwZSA9IGNvbXBvbmVudC5nZXRDb21wb25lbnRUeXBlKCk7Ci0KLSAgICAgIC8vIGFsd2F5cyBza2lwIEFQSSBhbmQgYmFzZSBjbGFzcyBnZW5lcmF0aW9uCi0gICAgICByZXR1cm4gKCFjb21wb25lbnRUeXBlLnN0YXJ0c1dpdGgoImphdmF4IikgJiYKLSAgICAgICAgICAgICAgIWNvbXBvbmVudFR5cGUuZW5kc1dpdGgoIkJhc2UiKSk7Ci0gICAgfQotICB9Ci0KLQotCi0gIHByaXZhdGUgY2xhc3MgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29tcG9uZW50RmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29tcG9uZW50TmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgVmFsaWRhdG9yTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgVmFsaWRhdG9yQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgY2xhc3MgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwdWJsaWMgQ29udmVydGVyTmFtZXNwYWNlRmlsdGVyKCkKLSAgICB7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29udmVydGVyQmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgaWYgKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkgPT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICByZXR1cm4gdGFnbGlicy5jb250YWluc1ZhbHVlKGNvbXBvbmVudC5nZXRUYWdOYW1lKCkuZ2V0TmFtZXNwYWNlVVJJKCkpOwotICAgIH0KLSAgfQotCi0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIFRhZ0F0dHJpYnV0ZUZpbHRlciBleHRlbmRzIFByb3BlcnR5RmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBQcm9wZXJ0eUJlYW4gcHJvcGVydHkpCi0gICAgewotICAgICAgcmV0dXJuICghcHJvcGVydHkuaXNUYWdBdHRyaWJ1dGVFeGNsdWRlZCgpKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgcHJvdGVjdGVkIGNsYXNzIENvbXBvbmVudFRhZ0ZpbHRlciBleHRlbmRzIENvbXBvbmVudEZpbHRlcgotICB7Ci0gICAgcHJvdGVjdGVkIGJvb2xlYW4gYWNjZXB0KAotICAgICAgQ29tcG9uZW50QmVhbiBjb21wb25lbnQpCi0gICAgewotICAgICAgcmV0dXJuIChjb21wb25lbnQuZ2V0VGFnTmFtZSgpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgQ29udmVydGVyVGFnRmlsdGVyIGV4dGVuZHMgQ29udmVydGVyRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBDb252ZXJ0ZXJCZWFuIGNvbnZlcnRlcikKLSAgICB7Ci0gICAgICByZXR1cm4gKGNvbnZlcnRlci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBwcm90ZWN0ZWQgY2xhc3MgVmFsaWRhdG9yVGFnRmlsdGVyIGV4dGVuZHMgVmFsaWRhdG9yRmlsdGVyCi0gIHsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBhY2NlcHQoCi0gICAgICBWYWxpZGF0b3JCZWFuIHZhbGlkYXRvcikKLSAgICB7Ci0gICAgICByZXR1cm4gKHZhbGlkYXRvci5nZXRUYWdDbGFzcygpICE9IG51bGwpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBGYWNlc0NvbmZpZ0JlYW4gX2ZhY2VzQ29uZmlnOwotCi0KLQotICAvLyB0b2RvOiBtYWtlIHRoaXMgY29uZmlndXJhYmxlPwotICBwcml2YXRlIGJvb2xlYW4gX2F0dHJEb2NTcGFuc0NvbHVtbnMgPSBmYWxzZTsKLQotICAvKioKLSAgICogU3BlY2lmaWVzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIHJlcG9ydCB3aWxsIGJlIGdlbmVyYXRlZAotICAgKgotICAgKiBAcGFyYW1ldGVyIGRlZmF1bHQtdmFsdWU9IiR7cHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RGlyZWN0b3J5fSIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgb3V0cHV0RGlyZWN0b3J5OwotICAKLQotICAvKioKLSAgICogRGlyZWN0b3J5IHdoZXJlIHRoZSBvcmlnaW5hbCBzaXRlIGlzIHByZXNlbnQuCi0gICAqIChUUklFRCB1c2luZyAke2Jhc2VEaXJ9L3NyYy9zaXRlOyAgdGhhdCBpbnNlcnRlZCBhICdudWxsJyBpbnRvCi0gICAqIHRoZSBzdHJpbmcgZm9yIHNvbWUgcmVhc29uLiAgVFJJRUQgdXNpbmcgJHtzaXRlRGlyZWN0b3J5fSwKLSAgICogd2hpY2ggd2FzIHVuZGVmaW5lZC4gIFRSSUVEICR7cHJvamVjdC5kaXJlY3Rvcnl9c3JjL3NpdGU7IHdoaWNoIGFsc28KLSAgICogaW5zZXJ0ZWQgYSBudWxsLiAgJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vLi4vc3JjL3NpdGUgc2VlbXMgdG8gd29yaywKLSAgICogdGhvdWdoIGl0IGFzc3VtZXMgdGhhdCAke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fSBpcyAKLSAgICogJHtwcm9qZWN0LmRpcmVjdG9yeX0vdGFyZ2V0LgotICAgKiAKLSAgICogQHBhcmFtZXRlciBkZWZhdWx0LXZhbHVlPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS8uLi9zcmMvc2l0ZS8iCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHNpdGVEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICogQHJlcXVpcmVkCi0gICAqIEByZWFkb25seQotICAgKi8KLSAgcHJpdmF0ZSBNYXZlblByb2plY3QgcHJvamVjdDsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgTWFwIHRhZ2xpYnM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iTUVUQS1JTkYvbWF2ZW4tZmFjZXMtcGx1Z2luL2ZhY2VzLWNvbmZpZy54bWwiCi0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU3RyaW5nIHJlc291cmNlUGF0aDsKLQotCi0gIC8qKgotICAgKiBAY29tcG9uZW50Ci0gICAqIEByZXF1aXJlZAotICAgKiBAcmVhZG9ubHkKLSAgICovCi0gIHByaXZhdGUgU2l0ZVJlbmRlcmVyIHNpdGVSZW5kZXJlcjsKLQotICBzdGF0aWMgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgX0RPQ19TVUJESVJFQ1RPUlkgPSAidGFnZG9jIjsKLSAgc3RhdGljIHByaXZhdGUgZmluYWwgU3RyaW5nW10gX05PTl9ET0NVTUVOVEVEX0FHRU5UUyA9IHsicGhvbmUiLCAidm9pY2UifTsKLQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY0NTY5NS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL05PVElDRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBmZjJmZjkuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVNlZSB0aGUgTElDRU5TRS50eHQgZmlsZSBmb3IgaW5mb3JtYXRpb24gb24gYWxsIGxpY2Vuc2VzIAotYXNzb2NpYXRlZCB3aXRoIHRoaXMgc29mdHdhcmUuCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI3ZWYwYy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTUzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08IS0tCi0gICAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICAgIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICAgIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gICAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICAgIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAgICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gICAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gICAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAgICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAgICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAgICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gICAgdW5kZXIgdGhlIExpY2Vuc2UuCi0tLT4KLQotPHByb2plY3QKLSAgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjEuMC4yPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLXdhZ29uLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgPHZlcnNpb24+MS4wLjEtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+bWF2ZW4tcGx1Z2luPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPkFwYWNoZSBNeUZhY2VzIEJ1aWxkdG9vbHMgTWF2ZW4yIFdhZ29uIFBsdWdpbjwvbmFtZT4KLSAgPHNjbT4KLSAgICA8Y29ubmVjdGlvbj5zY206c3ZuOmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9tYXZlbi90cnVuay93YWdvbi1tYXZlbi1wbHVnaW48L2Nvbm5lY3Rpb24+Ci0gICAgPGRldmVsb3BlckNvbm5lY3Rpb24+c2NtOnN2bjpodHRwczovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL21hdmVuL3RydW5rL3dhZ29uLW1hdmVuLXBsdWdpbjwvZGV2ZWxvcGVyQ29ubmVjdGlvbj4KLSAgICA8dXJsPmh0dHA6Ly9zdm4uYXBhY2hlLm9yZy92aWV3Y3ZzLmNnaS9teWZhY2VzL21hdmVuL3RydW5rL3dhZ29uLW1hdmVuLXBsdWdpbjwvdXJsPgotICA8L3NjbT4KLSAgPGJ1aWxkPgotICAgIDxleHRlbnNpb25zPgotICAgICAgPGV4dGVuc2lvbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi53YWdvbjwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+d2Fnb24tc3NoLWV4dGVybmFsPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNTwvdmVyc2lvbj4KLSAgICAgIDwvZXh0ZW5zaW9uPgotICAgIDwvZXh0ZW5zaW9ucz4KLSAgPC9idWlsZD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wLjI8L3ZlcnNpb24+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1hcGk8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXJ0aWZhY3Q8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxkaXN0cmlidXRpb25NYW5hZ2VtZW50PgotICAgIDxyZXBvc2l0b3J5PgotICAgICAgPGlkPm15ZmFjZXMtc3RhZ2luZzwvaWQ+Ci0gICAgICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBTdGFnaW5nIFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9tMi1zdGFnaW5nLXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgIDx1bmlxdWVWZXJzaW9uPmZhbHNlPC91bmlxdWVWZXJzaW9uPgotICAgICAgPGlkPmFwYWNoZS1tYXZlbi1zbmFwc2hvdHM8L2lkPgotICAgICAgPG5hbWU+QXBhY2hlIE1hdmVuIFNuYXBzaG90IFJlcG9zaXRvcnk8L25hbWU+Ci0gICAgICA8dXJsPnNjcGV4ZTovL3Blb3BsZS5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9yZXBvL20yLXNuYXBzaG90LXJlcG9zaXRvcnk8L3VybD4KLSAgICA8L3NuYXBzaG90UmVwb3NpdG9yeT4KLSAgPC9kaXN0cmlidXRpb25NYW5hZ2VtZW50PgotCi0gIDxyZXBvcnRpbmc+Ci0gICAgPHBsdWdpbnM+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWp4ci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxsaW5rcz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYXZhLnN1bi5jb20vajJlZS8xLjQvZG9jcy9hcGk8L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamF2YS5zdW4uY29tL2oyc2UvMS41LjAvZG9jcy9hcGk8L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvY29sbGVjdGlvbnMvYXBpZG9jcy1DT0xMRUNUSU9OU18zXzAvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2RiY3AvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvZmlsZXVwbG9hZC9hcGlkb2NzLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvY29tbW9ucy9odHRwY2xpZW50L2FwaWRvY3MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2pha2FydGEuYXBhY2hlLm9yZy9jb21tb25zL2xvZ2dpbmcvYXBpZG9jcy88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL2NvbW1vbnMvcG9vbC9hcGlkb2NzLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly93d3cuanVuaXQub3JnL2p1bml0L2phdmFkb2MvPC9saW5rPgotICAgICAgICAgICAgPGxpbms+aHR0cDovL2xvZ2dpbmcuYXBhY2hlLm9yZy9sb2c0ai9kb2NzL2FwaS88L2xpbms+Ci0gICAgICAgICAgICA8bGluaz5odHRwOi8vamFrYXJ0YS5hcGFjaGUub3JnL3JlZ2V4cC9hcGlkb2NzLzwvbGluaz4KLSAgICAgICAgICAgIDxsaW5rPmh0dHA6Ly9qYWthcnRhLmFwYWNoZS5vcmcvdmVsb2NpdHkvYXBpLzwvbGluaz4KLSAgICAgICAgICA8L2xpbmtzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPnRhZ2xpc3QtbWF2ZW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvcmVwb3J0aW5nPgotCi0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5zaWduLWFydGlmYWN0czwvaWQ+Ci0gICAgICA8YWN0aXZhdGlvbj4KLSAgICAgICAgPHByb3BlcnR5PgotICAgICAgICAgIDxuYW1lPnBlcmZvcm1SZWxlYXNlPC9uYW1lPgotICAgICAgICAgIDx2YWx1ZT50cnVlPC92YWx1ZT4KLSAgICAgICAgPC9wcm9wZXJ0eT4KLSAgICAgIDwvYWN0aXZhdGlvbj4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDwvcGx1Z2lucz4KLSAgICAgIDwvYnVpbGQ+Ci0gICAgPC9wcm9maWxlPgotICA8L3Byb2ZpbGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vd2Fnb24vV2Fnb25Nb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vd2Fnb24vV2Fnb25Nb2pvLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBiZTdmZTcuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3dhZ29uL1dhZ29uTW9qby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi53YWdvbjsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4uYXJ0aWZhY3QubWFuYWdlci5XYWdvbk1hbmFnZXI7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wbHVnaW4uQWJzdHJhY3RNb2pvOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLk1vam9FeGVjdXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLkNvbm5lY3Rpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5SZXNvdXJjZURvZXNOb3RFeGlzdEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLlRyYW5zZmVyRmFpbGVkRXhjZXB0aW9uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uVW5zdXBwb3J0ZWRQcm90b2NvbEV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLndhZ29uLldhZ29uOwotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ud2Fnb24uYXV0aGVudGljYXRpb24uQXV0aGVudGljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5hdXRob3JpemF0aW9uLkF1dGhvcml6YXRpb25FeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5vYnNlcnZlcnMuRGVidWc7Ci1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi53YWdvbi5yZXBvc2l0b3J5LlJlcG9zaXRvcnk7Ci0KLQotLyoqCi0gKiBEZXBsb3lzIHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHVzaW5nIHNjcC9maWxlIHByb3RvY29sLgotICogRm9yIHNjcCBwcm90b2NvbCwgZmlsZXMgYXJlIHBhY2thZ2VkIGludG8gemlwIGFyY2hpdmUsCi0gKiB0aGVuIGFyY2hpdmUgaXMgdHJhbnNmcmVkIHRvIHJlbW90ZSBob3N0LCBuZXh0bHkgaXQgaXMgdW4tYXJjaGl2ZWQuCi0gKiBUaGlzIG1ldGhvZCBvZiBkZXBsb3ltZW50IHNob3VsZCBub3JtYWxseSBiZSBtdWNoIGZhc3RlcgotICogdGhlbiBtYWtpbmcgZmlsZSBieSBmaWxlIGNvcHkuICBGb3IgZmlsZSBwcm90b2NvbCwgdGhlIGZpbGVzIGFyZSBjb3BpZWQKLSAqIGRpcmVjdGx5IHRvIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuCi0gKgotICogQHZlcnNpb24gCi0gKiBAZ29hbCBkZXBsb3kKLSAqLwotcHVibGljIGNsYXNzIFdhZ29uTW9qbyBleHRlbmRzIEFic3RyYWN0TW9qbwotewotICAgIC8qKgotICAgICAqIERpcmVjdG9yeSBjb250YWluaW5nIHRoZSBmaWxlcyBmb3Igd2Fnb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWxlIGlucHV0RGlyZWN0b3J5OwotCi0gICAgLyoqCi0gICAgICAqIFNwZWNpZmllcyB0aGUgc2VydmVyIGlkLgotICAgICAgKgotICAgICAgKiBAcGFyYW1ldGVyCi0gICAgICAqICogQHJlcXVpcmVkCi0gICAgICAqLwotICAgIHByaXZhdGUgU3RyaW5nIGlkOwotCi0gICAgLyoqCi0gICAgICogVGhlIGZ1bGwgVVJMIG9mIHRoZSBzZXJ2ZXIuCi0gICAgICoKLSAgICAgKiBAcGFyYW1ldGVyCi0gICAgICogQHJlcXVpcmVkCi0gICAgICovCi0gICAgcHJpdmF0ZSBTdHJpbmcgdXJsOwotICAgIC8qKgotICAgICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0fSIKLSAgICAgKiBAcmVxdWlyZWQKLSAgICAgKiBAcmVhZG9ubHkKLSAgICAgKi8KLSAgICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gICAgLyoqCi0gICAgICogQGNvbXBvbmVudAotICAgICAqLwotICAgIHByaXZhdGUgV2Fnb25NYW5hZ2VyIHdhZ29uTWFuYWdlcjsKLQotICAgIHB1YmxpYyB2b2lkIGV4ZWN1dGUoKQotICAgICAgICB0aHJvd3MgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKCAhaW5wdXREaXJlY3RvcnkuZXhpc3RzKCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlRoZSBpbnB1dERpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCIgKTsKLSAgICAgICAgfQotCi0gICAgICAgIFJlcG9zaXRvcnkgcmVwb3NpdG9yeSA9IG5ldyBSZXBvc2l0b3J5KCBpZCwgdXJsICk7Ci0KLQotICAgICAgICBXYWdvbiB3YWdvbiA9IG51bGw7Ci0gICAgICAgIHRyeQotICAgICAgICB7Ci0gICAgICAgICAgICB3YWdvbiA9IHdhZ29uTWFuYWdlci5nZXRXYWdvbiggcmVwb3NpdG9yeS5nZXRQcm90b2NvbCgpICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBVbnN1cHBvcnRlZFByb3RvY29sRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIlVuc3VwcG9ydGVkIHByb3RvY29sOiAnIiArIHJlcG9zaXRvcnkuZ2V0UHJvdG9jb2woKSArICInIiwgZSApOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCAhd2Fnb24uc3VwcG9ydHNEaXJlY3RvcnlDb3B5KCkgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiV2Fnb24gcHJvdG9jb2wgJyIgKyByZXBvc2l0b3J5LmdldFByb3RvY29sKCkgKyAiJyBkb2Vzbid0IHN1cHBvcnQgZGlyZWN0b3J5IGNvcHlpbmciICk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgICAgRGVidWcgZGVidWcgPSBuZXcgRGVidWcoKTsKLQotICAgICAgICAgICAgd2Fnb24uYWRkU2Vzc2lvbkxpc3RlbmVyKCBkZWJ1ZyApOwotCi0gICAgICAgICAgICB3YWdvbi5hZGRUcmFuc2Zlckxpc3RlbmVyKCBkZWJ1ZyApOwotCi0gICAgICAgICAgICB3YWdvbi5jb25uZWN0KCByZXBvc2l0b3J5LCB3YWdvbk1hbmFnZXIuZ2V0QXV0aGVudGljYXRpb25JbmZvKCBpZCApICk7Ci0KLSAgICAgICAgICAgIHdhZ29uLnB1dERpcmVjdG9yeSggaW5wdXREaXJlY3RvcnksICIuIiApOwotCi0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBSZXNvdXJjZURvZXNOb3RFeGlzdEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciB1cGxvYWRpbmciLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBUcmFuc2ZlckZhaWxlZEV4Y2VwdGlvbiBlICkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oICJFcnJvciB1cGxvYWRpbmciLCBlICk7Ci0gICAgICAgIH0KLSAgICAgICAgY2F0Y2ggKCBBdXRob3JpemF0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbiggIkVycm9yIHVwbG9hZGluZyIsIGUgKTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoIENvbm5lY3Rpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGNhdGNoICggQXV0aGVudGljYXRpb25FeGNlcHRpb24gZSApCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKCAiRXJyb3IgdXBsb2FkaW5nIiwgZSApOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsbHkKLSAgICAgICAgewotICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd2Fnb24uZGlzY29ubmVjdCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKCBDb25uZWN0aW9uRXhjZXB0aW9uIGUgKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldExvZygpLmVycm9yKCAiRXJyb3IgZGlzY29ubmVjdGluZyB3YWdvbiAtIGlnbm9yZWQiLCBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2MDU1ZWMuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL0xJQ0VOU0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlDQotICAgICAgICAgICAgICAgICAgICAgICAgICAgVmVyc2lvbiAyLjAsIEphbnVhcnkgMjAwNA0KLSAgICAgICAgICAgICAgICAgICAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy8NCi0NCi0gICBURVJNUyBBTkQgQ09ORElUSU9OUyBGT1IgVVNFLCBSRVBST0RVQ1RJT04sIEFORCBESVNUUklCVVRJT04NCi0NCi0gICAxLiBEZWZpbml0aW9ucy4NCi0NCi0gICAgICAiTGljZW5zZSIgc2hhbGwgbWVhbiB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLA0KLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50Lg0KLQ0KLSAgICAgICJMaWNlbnNvciIgc2hhbGwgbWVhbiB0aGUgY29weXJpZ2h0IG93bmVyIG9yIGVudGl0eSBhdXRob3JpemVkIGJ5DQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLg0KLQ0KLSAgICAgICJMZWdhbCBFbnRpdHkiIHNoYWxsIG1lYW4gdGhlIHVuaW9uIG9mIHRoZSBhY3RpbmcgZW50aXR5IGFuZCBhbGwNCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uDQotICAgICAgY29udHJvbCB3aXRoIHRoYXQgZW50aXR5LiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwNCi0gICAgICAiY29udHJvbCIgbWVhbnMgKGkpIHRoZSBwb3dlciwgZGlyZWN0IG9yIGluZGlyZWN0LCB0byBjYXVzZSB0aGUNCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcg0KLSAgICAgIG90aGVyd2lzZSwgb3IgKGlpKSBvd25lcnNoaXAgb2YgZmlmdHkgcGVyY2VudCAoNTAlKSBvciBtb3JlIG9mIHRoZQ0KLSAgICAgIG91dHN0YW5kaW5nIHNoYXJlcywgb3IgKGlpaSkgYmVuZWZpY2lhbCBvd25lcnNoaXAgb2Ygc3VjaCBlbnRpdHkuDQotDQotICAgICAgIllvdSIgKG9yICJZb3VyIikgc2hhbGwgbWVhbiBhbiBpbmRpdmlkdWFsIG9yIExlZ2FsIEVudGl0eQ0KLSAgICAgIGV4ZXJjaXNpbmcgcGVybWlzc2lvbnMgZ3JhbnRlZCBieSB0aGlzIExpY2Vuc2UuDQotDQotICAgICAgIlNvdXJjZSIgZm9ybSBzaGFsbCBtZWFuIHRoZSBwcmVmZXJyZWQgZm9ybSBmb3IgbWFraW5nIG1vZGlmaWNhdGlvbnMsDQotICAgICAgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBzb2Z0d2FyZSBzb3VyY2UgY29kZSwgZG9jdW1lbnRhdGlvbg0KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuDQotDQotICAgICAgIk9iamVjdCIgZm9ybSBzaGFsbCBtZWFuIGFueSBmb3JtIHJlc3VsdGluZyBmcm9tIG1lY2hhbmljYWwNCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0DQotICAgICAgbm90IGxpbWl0ZWQgdG8gY29tcGlsZWQgb2JqZWN0IGNvZGUsIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uLA0KLSAgICAgIGFuZCBjb252ZXJzaW9ucyB0byBvdGhlciBtZWRpYSB0eXBlcy4NCi0NCi0gICAgICAiV29yayIgc2hhbGwgbWVhbiB0aGUgd29yayBvZiBhdXRob3JzaGlwLCB3aGV0aGVyIGluIFNvdXJjZSBvcg0KLSAgICAgIE9iamVjdCBmb3JtLCBtYWRlIGF2YWlsYWJsZSB1bmRlciB0aGUgTGljZW5zZSwgYXMgaW5kaWNhdGVkIGJ5IGENCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsNCi0gICAgICAoYW4gZXhhbXBsZSBpcyBwcm92aWRlZCBpbiB0aGUgQXBwZW5kaXggYmVsb3cpLg0KLQ0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QNCi0gICAgICBmb3JtLCB0aGF0IGlzIGJhc2VkIG9uIChvciBkZXJpdmVkIGZyb20pIHRoZSBXb3JrIGFuZCBmb3Igd2hpY2ggdGhlDQotICAgICAgZWRpdG9yaWFsIHJldmlzaW9ucywgYW5ub3RhdGlvbnMsIGVsYWJvcmF0aW9ucywgb3Igb3RoZXIgbW9kaWZpY2F0aW9ucw0KLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzDQotICAgICAgb2YgdGhpcyBMaWNlbnNlLCBEZXJpdmF0aXZlIFdvcmtzIHNoYWxsIG5vdCBpbmNsdWRlIHdvcmtzIHRoYXQgcmVtYWluDQotICAgICAgc2VwYXJhYmxlIGZyb20sIG9yIG1lcmVseSBsaW5rIChvciBiaW5kIGJ5IG5hbWUpIHRvIHRoZSBpbnRlcmZhY2VzIG9mLA0KLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuDQotDQotICAgICAgIkNvbnRyaWJ1dGlvbiIgc2hhbGwgbWVhbiBhbnkgd29yayBvZiBhdXRob3JzaGlwLCBpbmNsdWRpbmcNCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zDQotICAgICAgdG8gdGhhdCBXb3JrIG9yIERlcml2YXRpdmUgV29ya3MgdGhlcmVvZiwgdGhhdCBpcyBpbnRlbnRpb25hbGx5DQotICAgICAgc3VibWl0dGVkIHRvIExpY2Vuc29yIGZvciBpbmNsdXNpb24gaW4gdGhlIFdvcmsgYnkgdGhlIGNvcHlyaWdodCBvd25lcg0KLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZg0KLSAgICAgIHRoZSBjb3B5cmlnaHQgb3duZXIuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLCAic3VibWl0dGVkIg0KLSAgICAgIG1lYW5zIGFueSBmb3JtIG9mIGVsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQNCi0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bw0KLSAgICAgIGNvbW11bmljYXRpb24gb24gZWxlY3Ryb25pYyBtYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsDQotICAgICAgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUgbWFuYWdlZCBieSwgb3Igb24gYmVoYWxmIG9mLCB0aGUNCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQNCi0gICAgICBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG9yIG90aGVyd2lzZQ0KLSAgICAgIGRlc2lnbmF0ZWQgaW4gd3JpdGluZyBieSB0aGUgY29weXJpZ2h0IG93bmVyIGFzICJOb3QgYSBDb250cmlidXRpb24uIg0KLQ0KLSAgICAgICJDb250cmlidXRvciIgc2hhbGwgbWVhbiBMaWNlbnNvciBhbmQgYW55IGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5DQotICAgICAgb24gYmVoYWxmIG9mIHdob20gYSBDb250cmlidXRpb24gaGFzIGJlZW4gcmVjZWl2ZWQgYnkgTGljZW5zb3IgYW5kDQotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuDQotDQotICAgMi4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLA0KLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlDQotICAgICAgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIERlcml2YXRpdmUgV29ya3Mgb2YsDQotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlDQotICAgICAgV29yayBhbmQgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybS4NCi0NCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YNCi0gICAgICB0aGlzIExpY2Vuc2UsIGVhY2ggQ29udHJpYnV0b3IgaGVyZWJ5IGdyYW50cyB0byBZb3UgYSBwZXJwZXR1YWwsDQotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUNCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwNCi0gICAgICB1c2UsIG9mZmVyIHRvIHNlbGwsIHNlbGwsIGltcG9ydCwgYW5kIG90aGVyd2lzZSB0cmFuc2ZlciB0aGUgV29yaywNCi0gICAgICB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQ0KLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyDQotICAgICAgQ29udHJpYnV0aW9uKHMpIGFsb25lIG9yIGJ5IGNvbWJpbmF0aW9uIG9mIHRoZWlyIENvbnRyaWJ1dGlvbihzKQ0KLSAgICAgIHdpdGggdGhlIFdvcmsgdG8gd2hpY2ggc3VjaCBDb250cmlidXRpb24ocykgd2FzIHN1Ym1pdHRlZC4gSWYgWW91DQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGENCi0gICAgICBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZyB0aGF0IHRoZSBXb3JrDQotICAgICAgb3IgYSBDb250cmlidXRpb24gaW5jb3Jwb3JhdGVkIHdpdGhpbiB0aGUgV29yayBjb25zdGl0dXRlcyBkaXJlY3QNCi0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzDQotICAgICAgZ3JhbnRlZCB0byBZb3UgdW5kZXIgdGhpcyBMaWNlbnNlIGZvciB0aGF0IFdvcmsgc2hhbGwgdGVybWluYXRlDQotICAgICAgYXMgb2YgdGhlIGRhdGUgc3VjaCBsaXRpZ2F0aW9uIGlzIGZpbGVkLg0KLQ0KLSAgIDQuIFJlZGlzdHJpYnV0aW9uLiBZb3UgbWF5IHJlcHJvZHVjZSBhbmQgZGlzdHJpYnV0ZSBjb3BpZXMgb2YgdGhlDQotICAgICAgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YgaW4gYW55IG1lZGl1bSwgd2l0aCBvciB3aXRob3V0DQotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UNCi0gICAgICBtZWV0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uczoNCi0NCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcg0KLSAgICAgICAgICBEZXJpdmF0aXZlIFdvcmtzIGEgY29weSBvZiB0aGlzIExpY2Vuc2U7IGFuZA0KLQ0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMNCi0gICAgICAgICAgc3RhdGluZyB0aGF0IFlvdSBjaGFuZ2VkIHRoZSBmaWxlczsgYW5kDQotDQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzDQotICAgICAgICAgIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsbCBjb3B5cmlnaHQsIHBhdGVudCwgdHJhZGVtYXJrLCBhbmQNCi0gICAgICAgICAgYXR0cmlidXRpb24gbm90aWNlcyBmcm9tIHRoZSBTb3VyY2UgZm9ybSBvZiB0aGUgV29yaywNCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZg0KLSAgICAgICAgICB0aGUgRGVyaXZhdGl2ZSBXb3JrczsgYW5kDQotDQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzDQotICAgICAgICAgIGRpc3RyaWJ1dGlvbiwgdGhlbiBhbnkgRGVyaXZhdGl2ZSBXb3JrcyB0aGF0IFlvdSBkaXN0cmlidXRlIG11c3QNCi0gICAgICAgICAgaW5jbHVkZSBhIHJlYWRhYmxlIGNvcHkgb2YgdGhlIGF0dHJpYnV0aW9uIG5vdGljZXMgY29udGFpbmVkDQotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdA0KLSAgICAgICAgICBwZXJ0YWluIHRvIGFueSBwYXJ0IG9mIHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpbiBhdCBsZWFzdCBvbmUNCi0gICAgICAgICAgb2YgdGhlIGZvbGxvd2luZyBwbGFjZXM6IHdpdGhpbiBhIE5PVElDRSB0ZXh0IGZpbGUgZGlzdHJpYnV0ZWQNCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcg0KLSAgICAgICAgICBkb2N1bWVudGF0aW9uLCBpZiBwcm92aWRlZCBhbG9uZyB3aXRoIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBvciwNCi0gICAgICAgICAgd2l0aGluIGEgZGlzcGxheSBnZW5lcmF0ZWQgYnkgdGhlIERlcml2YXRpdmUgV29ya3MsIGlmIGFuZA0KLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMNCi0gICAgICAgICAgb2YgdGhlIE5PVElDRSBmaWxlIGFyZSBmb3IgaW5mb3JtYXRpb25hbCBwdXJwb3NlcyBvbmx5IGFuZA0KLSAgICAgICAgICBkbyBub3QgbW9kaWZ5IHRoZSBMaWNlbnNlLiBZb3UgbWF5IGFkZCBZb3VyIG93biBhdHRyaWJ1dGlvbg0KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQ0KLSAgICAgICAgICBvciBhcyBhbiBhZGRlbmR1bSB0byB0aGUgTk9USUNFIHRleHQgZnJvbSB0aGUgV29yaywgcHJvdmlkZWQNCi0gICAgICAgICAgdGhhdCBzdWNoIGFkZGl0aW9uYWwgYXR0cmlidXRpb24gbm90aWNlcyBjYW5ub3QgYmUgY29uc3RydWVkDQotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4NCi0NCi0gICAgICBZb3UgbWF5IGFkZCBZb3VyIG93biBjb3B5cmlnaHQgc3RhdGVtZW50IHRvIFlvdXIgbW9kaWZpY2F0aW9ucyBhbmQNCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zDQotICAgICAgZm9yIHVzZSwgcmVwcm9kdWN0aW9uLCBvciBkaXN0cmlidXRpb24gb2YgWW91ciBtb2RpZmljYXRpb25zLCBvcg0KLSAgICAgIGZvciBhbnkgc3VjaCBEZXJpdmF0aXZlIFdvcmtzIGFzIGEgd2hvbGUsIHByb3ZpZGVkIFlvdXIgdXNlLA0KLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aA0KLSAgICAgIHRoZSBjb25kaXRpb25zIHN0YXRlZCBpbiB0aGlzIExpY2Vuc2UuDQotDQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLA0KLSAgICAgIGFueSBDb250cmlidXRpb24gaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgZm9yIGluY2x1c2lvbiBpbiB0aGUgV29yaw0KLSAgICAgIGJ5IFlvdSB0byB0aGUgTGljZW5zb3Igc2hhbGwgYmUgdW5kZXIgdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mDQotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuDQotICAgICAgTm90d2l0aHN0YW5kaW5nIHRoZSBhYm92ZSwgbm90aGluZyBoZXJlaW4gc2hhbGwgc3VwZXJzZWRlIG9yIG1vZGlmeQ0KLSAgICAgIHRoZSB0ZXJtcyBvZiBhbnkgc2VwYXJhdGUgbGljZW5zZSBhZ3JlZW1lbnQgeW91IG1heSBoYXZlIGV4ZWN1dGVkDQotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLg0KLQ0KLSAgIDYuIFRyYWRlbWFya3MuIFRoaXMgTGljZW5zZSBkb2VzIG5vdCBncmFudCBwZXJtaXNzaW9uIHRvIHVzZSB0aGUgdHJhZGUNCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsDQotICAgICAgZXhjZXB0IGFzIHJlcXVpcmVkIGZvciByZWFzb25hYmxlIGFuZCBjdXN0b21hcnkgdXNlIGluIGRlc2NyaWJpbmcgdGhlDQotICAgICAgb3JpZ2luIG9mIHRoZSBXb3JrIGFuZCByZXByb2R1Y2luZyB0aGUgY29udGVudCBvZiB0aGUgTk9USUNFIGZpbGUuDQotDQotICAgNy4gRGlzY2xhaW1lciBvZiBXYXJyYW50eS4gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yDQotICAgICAgYWdyZWVkIHRvIGluIHdyaXRpbmcsIExpY2Vuc29yIHByb3ZpZGVzIHRoZSBXb3JrIChhbmQgZWFjaA0KLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLA0KLSAgICAgIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvcg0KLSAgICAgIGltcGxpZWQsIGluY2x1ZGluZywgd2l0aG91dCBsaW1pdGF0aW9uLCBhbnkgd2FycmFudGllcyBvciBjb25kaXRpb25zDQotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQ0KLSAgICAgIFBBUlRJQ1VMQVIgUFVSUE9TRS4gWW91IGFyZSBzb2xlbHkgcmVzcG9uc2libGUgZm9yIGRldGVybWluaW5nIHRoZQ0KLSAgICAgIGFwcHJvcHJpYXRlbmVzcyBvZiB1c2luZyBvciByZWRpc3RyaWJ1dGluZyB0aGUgV29yayBhbmQgYXNzdW1lIGFueQ0KLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4NCi0NCi0gICA4LiBMaW1pdGF0aW9uIG9mIExpYWJpbGl0eS4gSW4gbm8gZXZlbnQgYW5kIHVuZGVyIG5vIGxlZ2FsIHRoZW9yeSwNCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwNCi0gICAgICB1bmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgKHN1Y2ggYXMgZGVsaWJlcmF0ZSBhbmQgZ3Jvc3NseQ0KLSAgICAgIG5lZ2xpZ2VudCBhY3RzKSBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc2hhbGwgYW55IENvbnRyaWJ1dG9yIGJlDQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLA0KLSAgICAgIGluY2lkZW50YWwsIG9yIGNvbnNlcXVlbnRpYWwgZGFtYWdlcyBvZiBhbnkgY2hhcmFjdGVyIGFyaXNpbmcgYXMgYQ0KLSAgICAgIHJlc3VsdCBvZiB0aGlzIExpY2Vuc2Ugb3Igb3V0IG9mIHRoZSB1c2Ugb3IgaW5hYmlsaXR5IHRvIHVzZSB0aGUNCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsDQotICAgICAgd29yayBzdG9wcGFnZSwgY29tcHV0ZXIgZmFpbHVyZSBvciBtYWxmdW5jdGlvbiwgb3IgYW55IGFuZCBhbGwNCi0gICAgICBvdGhlciBjb21tZXJjaWFsIGRhbWFnZXMgb3IgbG9zc2VzKSwgZXZlbiBpZiBzdWNoIENvbnRyaWJ1dG9yDQotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLg0KLQ0KLSAgIDkuIEFjY2VwdGluZyBXYXJyYW50eSBvciBBZGRpdGlvbmFsIExpYWJpbGl0eS4gV2hpbGUgcmVkaXN0cmlidXRpbmcNCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLA0KLSAgICAgIGFuZCBjaGFyZ2UgYSBmZWUgZm9yLCBhY2NlcHRhbmNlIG9mIHN1cHBvcnQsIHdhcnJhbnR5LCBpbmRlbW5pdHksDQotICAgICAgb3Igb3RoZXIgbGlhYmlsaXR5IG9ibGlnYXRpb25zIGFuZC9vciByaWdodHMgY29uc2lzdGVudCB3aXRoIHRoaXMNCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQ0KLSAgICAgIG9uIFlvdXIgb3duIGJlaGFsZiBhbmQgb24gWW91ciBzb2xlIHJlc3BvbnNpYmlsaXR5LCBub3Qgb24gYmVoYWxmDQotICAgICAgb2YgYW55IG90aGVyIENvbnRyaWJ1dG9yLCBhbmQgb25seSBpZiBZb3UgYWdyZWUgdG8gaW5kZW1uaWZ5LA0KLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQ0KLSAgICAgIGluY3VycmVkIGJ5LCBvciBjbGFpbXMgYXNzZXJ0ZWQgYWdhaW5zdCwgc3VjaCBDb250cmlidXRvciBieSByZWFzb24NCi0gICAgICBvZiB5b3VyIGFjY2VwdGluZyBhbnkgc3VjaCB3YXJyYW50eSBvciBhZGRpdGlvbmFsIGxpYWJpbGl0eS4NCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvTk9USUNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWY5NDUwLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9OT1RJQ0UudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOSArMCwwIEBACi1BcGFjaGUgTXlGYWNlcw0KLUNvcHlyaWdodCAyMDA0LTIwMDcgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uDQotDQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieToNCi1UaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLg0KLQ0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KLVNlZSB0aGUgZmlsZSBMSUNFTlNFLnR4dA0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9zaXRlL2FwdC91c2FnZS5hcHQgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdXNhZ2UuYXB0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDdhMzE3Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtd2Fnb24tcGx1Z2luL3NyYy9zaXRlL2FwdC91c2FnZS5hcHQKKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0gfn4gTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gfn4gY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoCi0gfn4gdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLgotIH5+IFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gfn4gKHRoZSAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGgKLSB+fiB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotIH5+Ci0gfn4gICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSB+fgotIH5+IFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSB+fiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIH5+IFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIH5+IFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSB+fiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotICAgICAgICAgICAtLS0tLQotICAgICAgICAgICBVc2FnZQotICAgICAgICAgICAtLS0tLQotCi1Vc2FnZQotCi0gIFRoZSBwbHVnaW4gb2ZmZXJzIGEgZ29hbCBmb3IgdHJhbnNwb3J0IHRoZSBjb250ZW50IG9mIGEgZGlyZWN0b3J5IHdpdGggd2Fnb24uCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIC4uLgotICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPndhZ29uLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLQotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8aWQ+bXlmYWNlcy1uaWdodGx5LWJ1aWxkczwvaWQ+Ci0gICAgICAgICAgPHVybD5zY3BleGU6Ly9taW5vdGF1ci5hcGFjaGUub3JnL3d3dy9wZW9wbGUuYXBhY2hlLm9yZy9idWlsZHMvbXlmYWNlcy9uaWdodGx5PC91cmw+Ci0gICAgICAgICAgPGlucHV0RGlyZWN0b3J5PnRhcmdldC9hc3NlbWJseS9vdXQ8L2lucHV0RGlyZWN0b3J5PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICAgIC4uLgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy13YWdvbi1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjE4MWJkNy4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXdhZ29uLXBsdWdpbi9zcmMvc2l0ZS9zaXRlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IklTTy04ODU5LTEiPz4KLQotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTxwcm9qZWN0IG5hbWU9IldhZ29uIE1hdmVuIFBsdWdpbiI+Ci0gIDxiYW5uZXJMZWZ0PgotICAgIDxuYW1lPk15RmFjZXM8L25hbWU+Ci0gICAgPHNyYz5pbWFnZXMvbXlmYWNlcy1sb2dvLnBuZzwvc3JjPgotICAgIDxocmVmPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvPC9ocmVmPgotICA8L2Jhbm5lckxlZnQ+Ci0gIDxwdWJsaXNoRGF0ZSBmb3JtYXQ9ImRkIE1NTSB5eXl5IiAvPgotICA8Ym9keT4KLSAgICA8bGlua3M+Ci0gICAgICA8aXRlbSBuYW1lPSJNYXZlbiAyIiBocmVmPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbjIvIi8+Ci0gICAgICA8aXRlbSBuYW1lPSJNeUZhY2VzIiBocmVmPSJodHRwOi8vbXlmYWNlcy5hcGFjaGUub3JnIi8+Ci0gICAgPC9saW5rcz4KLQotICAgIDxtZW51IG5hbWU9Ik92ZXJ2aWV3Ij4KLSAgICAgIDxpdGVtIG5hbWU9IkludHJvZHVjdGlvbiIgaHJlZj0iaW5kZXguaHRtbCIvPgotICAgICAgPGl0ZW0gbmFtZT0iR29hbHMiIGhyZWY9InBsdWdpbi1pbmZvLmh0bWwiLz4KLSAgICAgIDxpdGVtIG5hbWU9IlVzYWdlIiBocmVmPSJ1c2FnZS5odG1sIi8+Ci0gICAgPC9tZW51PgotICAgICR7cmVwb3J0c30KLSAgPC9ib2R5PgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9MSUNFTlNFLnR4dCBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9OT1RJQ0UudHh0IGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTNkYmQ2Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLT09ICBOT1RJQ0UgZmlsZSBjb3JyZXNwb25kaW5nIHRvIHNlY3Rpb24gNChkKSBvZiB0aGUgQXBhY2hlIExpY2Vuc2UsICAgPT0KLT09ICBWZXJzaW9uIDIuMCwgaW4gdGhpcyBjYXNlIGZvciB0aGUgQXBhY2hlIE15RmFjZXMgTWF2ZW4gUGx1Z2lucyAgICAgPT0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSAKLVRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuCi0KLVBvcnRpb25zIG9mIHRoaXMgc29mdHdhcmUgd2VyZSBvcmlnaW5hbGx5IGJhc2VkIG9uIHRoZSBmb2xsb3dpbmc6Ci0KLSAtIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMC0yMDA2LCBPcmFjbGUgQ29ycCwgPGh0dHA6Ly93d3cub3JhY2xlLmNvbS8+LgotYW5kIGFyZSBsaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gdW5kZXIgdGhlIAotIlNvZnR3YXJlIEdyYW50IGFuZCBDb3Jwb3JhdGUgQ29udHJpYnV0aW9uIExpY2Vuc2UgQWdyZWVtZW50IgotCi1TZWUgdGhlIExJQ0VOU0UudHh0IGZpbGUgZm9yIGluZm9ybWF0aW9uIG9uIGFsbCBsaWNlbnNlcyAKLWFzc29jaWF0ZWQgd2l0aCB0aGlzIHNvZnR3YXJlLgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODUxNzNkLi4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08cHJvamVjdAotICB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5teWZhY2VzLXBsdWdpbi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MS4wLjI8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5teWZhY2VzLXhydHMtcGx1Z2luPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLjAuMS1TTkFQU0hPVDwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5tYXZlbi1wbHVnaW48L3BhY2thZ2luZz4KLSAgPG5hbWU+QXBhY2hlIE15RmFjZXMgQnVpbGR0b29scyBNYXZlbjIgWFJUUyBQbHVnaW48L25hbWU+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8aW5oZXJpdGVkPnRydWU8L2luaGVyaXRlZD4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxzb3VyY2U+MS41PC9zb3VyY2U+Ci0gICAgICAgICAgICA8dGFyZ2V0PjEuNTwvdGFyZ2V0PgotICAgICAgICAgICAgPHNob3dXYXJuaW5ncz50cnVlPC9zaG93V2FybmluZ3M+Ci0gICAgICAgICAgICA8Y29tcGlsZXJBcmd1bWVudD4tWGxpbnQ6YWxsLC1zZXJpYWwsLWZhbGx0aHJvdWdoPC9jb21waWxlckFyZ3VtZW50PgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICA8L3BsdWdpbnM+Ci0gICAgPC9wbHVnaW5NYW5hZ2VtZW50PgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wcm9qZWN0PC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPHJlcG9ydGluZz4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tcGx1Z2luLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPHZlcnNpb24+Mi4yPC92ZXJzaW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L3JlcG9ydGluZz4KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvQWJzdHJhY3RHZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0Fic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmMxMmY1Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvQWJzdHJhY3RHZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjAgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5GaWxlSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luLkFic3RyYWN0TW9qbzsKLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnBsdWdpbi5Nb2pvRXhlY3V0aW9uRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmNvZGVoYXVzLnBsZXh1cy51dGlsLkRpcmVjdG9yeVNjYW5uZXI7Ci0KLWltcG9ydCBvcmcueG1sLnNheC5JbnB1dFNvdXJjZTsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAcGhhc2UgZ2VuZXJhdGUtcmVzb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBnZW5lcmF0ZXMgdGhlIFhSVFMgQnVuZGxlcwotICovCi1hYnN0cmFjdCBwdWJsaWMgY2xhc3MgQWJzdHJhY3RHZW5lcmF0ZVNvdXJjZXNNb2pvIGV4dGVuZHMgQWJzdHJhY3RNb2pvCi17Ci0gIC8qKgotICAgKiBFeGVjdXRlIHRoZSBNb2pvLgotICAgKi8KLSAgcHVibGljIHZvaWQgZXhlY3V0ZSgpIHRocm93cyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICB0cnkKLSAgICB7Ci0gICAgICBnZW5lcmF0ZUJ1bmRsZXMoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKElPRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VHlwZSgpOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXREZWZhdWx0TG9jYWxlcygpOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeGNsdWRlcygpOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZURpcmVjdG9yeSgpOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCBGaWxlIGdldFRhcmdldERpcmVjdG9yeSgpOwotCi0gIGFic3RyYWN0IHByb3RlY3RlZCB2b2lkIGFkZENvbXBpbGVTb3VyY2VSb290KCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIHByaXZhdGUgdm9pZCBnZW5lcmF0ZUJ1bmRsZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24sIE1vam9FeGVjdXRpb25FeGNlcHRpb24KLSAgewotICAgIEZpbGUgc291cmNlRGlyZWN0b3J5ID0gZ2V0U291cmNlRGlyZWN0b3J5KCk7Ci0gICAgaWYgKHNvdXJjZURpcmVjdG9yeS5leGlzdHMoKSkKLSAgICB7Ci0gICAgICAvLyBJbmNsdWRlIGdlbmVyYXRlZCBzb3VyY2VzIGluIGNvbXBpbGF0aW9uCi0gICAgICBhZGRDb21waWxlU291cmNlUm9vdCgpOwotCi0gICAgICAvLyBTY2FuIGZvciAueHJ0cyBzb3VyY2VzCi0gICAgICBEaXJlY3RvcnlTY2FubmVyIHNjYW5uZXIgPSBuZXcgRGlyZWN0b3J5U2Nhbm5lcigpOwotICAgICAgc2Nhbm5lci5zZXRCYXNlZGlyKHNvdXJjZURpcmVjdG9yeSk7Ci0gICAgICBzY2FubmVyLmFkZERlZmF1bHRFeGNsdWRlcygpOwotICAgICAgU3RyaW5nW10gZXhjbHVkZXMgPSBnZXRFeGNsdWRlcygpOwotICAgICAgc2Nhbm5lci5zZXRFeGNsdWRlcyhleGNsdWRlcyk7Ci0gICAgICBzY2FubmVyLnNldEluY2x1ZGVzKG5ldyBTdHJpbmdbXSB7ICIqKi8qLnhydHMiIH0pOwotICAgICAgc2Nhbm5lci5zY2FuKCk7Ci0KLSAgICAgIFN0cmluZ1tdIHhydHNGaWxlcyA9IHNjYW5uZXIuZ2V0SW5jbHVkZWRGaWxlcygpOwotICAgICAgaWYgKHhydHNGaWxlcy5sZW5ndGggPiAwKQotICAgICAgewotICAgICAgICBSVFNXcml0ZXIgd3JpdGVyID0gZ2V0UlRTV3JpdGVyKCk7Ci0gICAgICAgIE1hcCBwYXJhbXMgPSBuZXcgSGFzaE1hcCgpOwotCi0gICAgICAgIExpc3QgZGlydHlYUlRTID0gbmV3IExpbmtlZExpc3QoQXJyYXlzLmFzTGlzdCh4cnRzRmlsZXMpKTsKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBmYWN0b3J5LnNldFZhbGlkYXRpbmcoZmFsc2UpOwotCi0gICAgICAgIGZvciAoSXRlcmF0b3IgaT1kaXJ0eVhSVFMuaXRlcmF0b3IoKTsgaS5oYXNOZXh0KCk7KQotICAgICAgICB7Ci0gICAgICAgICAgU3RyaW5nIHhydHNGaWxlID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICBGaWxlIHRhcmdldEZpbGUgPSBnZXRUYXJnZXRGaWxlKHhydHNGaWxlKTsKLSAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlIHNvdXJjZUZpbGUgPSBnZXRTb3VyY2VGaWxlKHhydHNGaWxlKTsKLSAgICAgICAgICAgIGlmICh0YXJnZXRGaWxlLmxhc3RNb2RpZmllZCgpID49IHNvdXJjZUZpbGUubGFzdE1vZGlmaWVkKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgIGkucmVtb3ZlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGRpcnR5WFJUUy5pc0VtcHR5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICBnZXRMb2coKS5pbmZvKCJOb3RoaW5nIHRvIGdlbmVyYXRlIC0gYWxsIFhSVFMgYnVuZGxlcyBhcmUgdXAgdG8gZGF0ZSIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgIGdldExvZygpLmluZm8oIkdlbmVyYXRpbmcgIiArIGRpcnR5WFJUUy5zaXplKCkgKyAiIFhSVFMgYnVuZGxlcyB0byAiICsgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkpOwotCi0gICAgICAgICAgZm9yIChJdGVyYXRvciBpPWRpcnR5WFJUUy5pdGVyYXRvcigpOyBpLmhhc05leHQoKTspCi0gICAgICAgICAgewotICAgICAgICAgICAgU3RyaW5nIHhydHNGaWxlID0gKFN0cmluZylpLm5leHQoKTsKLSAgICAgICAgICAgIEZpbGUgc291cmNlRmlsZSA9IGdldFNvdXJjZUZpbGUoeHJ0c0ZpbGUpOwotICAgICAgICAgICAgRmlsZSB0YXJnZXRGaWxlID0gZ2V0VGFyZ2V0RmlsZSh4cnRzRmlsZSk7Ci0gICAgICAgICAgICBTdHJpbmcgYmFzZU5hbWUgPSBnZXRCYXNlbmFtZSh4cnRzRmlsZSk7Ci0KLSAgICAgICAgICAgIHBhcmFtcy5wdXQoIm91dEZpbGUiLCB0YXJnZXRGaWxlKTsKLSAgICAgICAgICAgIHBhcmFtcy5wdXQoIm91dE5hbWUiLCBiYXNlTmFtZSk7Ci0gICAgICAgICAgICBwYXJhbXMucHV0KCJzcmNOYW1lIiwgYmFzZU5hbWUpOwotICAgICAgICAgICAgcGFyYW1zLnB1dCgicXVpZXRNb2RlIiwgQm9vbGVhbi5UUlVFKTsKLSAgICAgICAgICAgIHBhcmFtcy5wdXQoImRlZmF1bHRMb2NhbGVzIiwgZ2V0RGVmYXVsdExvY2FsZXMoKSk7Ci0gICAgICAgICAgICBJbnB1dFNvdXJjZSBzb3VyY2UgPSBuZXcgSW5wdXRTb3VyY2UobmV3IEZpbGVJbnB1dFN0cmVhbShzb3VyY2VGaWxlKSk7Ci0gICAgICAgICAgICAvLyBzZXR1cCByZWxhdGl2ZSBzeXN0ZW1JZCByZXNvbHV0aW9uIGZvciBsb2NhbCBydHMuZHRkIGZpbGVzLgotICAgICAgICAgICAgc291cmNlLnNldFN5c3RlbUlkKHNvdXJjZUZpbGUuZ2V0UGFyZW50RmlsZSgpLnRvVVJMKCkudG9TdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICBpZiAodGFyZ2V0RmlsZS5leGlzdHMoKSkKLSAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRhcmdldEZpbGUuZGVsZXRlKCk7Ci0gICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLSAgICAgICAgICAgICAgdGFyZ2V0RmlsZS5nZXRQYXJlbnRGaWxlKCkubWtkaXJzKCk7Ci0gICAgICAgICAgICAgIFhSVFNHZW5lcmF0b3IuZ2VuZXJhdGUocGFyc2VyLCBzb3VyY2UsIHdyaXRlciwgcGFyYW1zKTsKLSAgICAgICAgICAgICAgdGFyZ2V0RmlsZS5zZXRSZWFkT25seSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbih0LmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBSVFNXcml0ZXIgZ2V0UlRTV3JpdGVyKCkgdGhyb3dzIElPRXhjZXB0aW9uLCBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBTdHJpbmcgaW1wbENsYXNzTmFtZTsKLQotICAgIFN0cmluZyB0YXJnZXRUeXBlID0gZ2V0VGFyZ2V0VHlwZSgpOwotICAgIGlmICh0YXJnZXRUeXBlLnN0YXJ0c1dpdGgoImNsYXNzOiIpKQotICAgIHsKLSAgICAgIGltcGxDbGFzc05hbWUgPSB0YXJnZXRUeXBlLnN1YnN0cmluZygiY2xhc3M6Ii5sZW5ndGgoKSk7Ci0gICAgfQotICAgIGVsc2UKLSAgICB7Ci0gICAgICBpZiAoImxpc3QiLmVxdWFscyh0YXJnZXRUeXBlKSkKLSAgICAgIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMaXN0UlRTV3JpdGVyKCk7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbigiVW5rbm93biBidW5kbGUgdHlwZTogIiArIHRhcmdldFR5cGUpOwotICAgIH0KLQotICAgIHRyeQotICAgIHsKLSAgICAgIENsYXNzIGltcGxDbGFzcyA9IENsYXNzLmZvck5hbWUoaW1wbENsYXNzTmFtZSk7Ci0gICAgICByZXR1cm4gKFJUU1dyaXRlcilpbXBsQ2xhc3MubmV3SW5zdGFuY2UoKTsKLSAgICB9Ci0gICAgY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkKLSAgICB7Ci0gICAgICBlLnByaW50U3RhY2tUcmFjZSgpOwotICAgICAgdGhyb3cgbmV3IE1vam9FeGVjdXRpb25FeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgICBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKQotICAgIHsKLSAgICAgIGUucHJpbnRTdGFja1RyYWNlKCk7Ci0gICAgICB0aHJvdyBuZXcgTW9qb0V4ZWN1dGlvbkV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpCi0gICAgewotICAgICAgZS5wcmludFN0YWNrVHJhY2UoKTsKLSAgICAgIHRocm93IG5ldyBNb2pvRXhlY3V0aW9uRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIEZpbGUgZ2V0U291cmNlRmlsZShTdHJpbmcgeHJ0c0ZpbGVuYW1lKQotICB7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKGdldFNvdXJjZURpcmVjdG9yeSgpLCB4cnRzRmlsZW5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZ2V0QmFzZW5hbWUoU3RyaW5nIHNvdXJjZVBhdGgpCi0gIHsKLSAgICBpbnQgc3RhcnQgPSBzb3VyY2VQYXRoLmxhc3RJbmRleE9mKEZpbGUuc2VwYXJhdG9yQ2hhcikgKyAxOwotICAgIHJldHVybiBzb3VyY2VQYXRoLnN1YnN0cmluZyhzdGFydCwgc291cmNlUGF0aC5sZW5ndGgoKSAtICIueHJ0cyIubGVuZ3RoKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBGaWxlIGdldFRhcmdldEZpbGUoU3RyaW5nIHNvdXJjZVBhdGgpCi0gIHsKLSAgICBTdHJpbmcgYmFzZW5hbWUgPSBzb3VyY2VQYXRoLnN1YnN0cmluZygwLCBzb3VyY2VQYXRoLmxlbmd0aCgpIC0gIi54cnRzIi5sZW5ndGgoKSk7Ci0gICAgU3RyaW5nIHRhcmdldFBhdGggPSBiYXNlbmFtZSArICIuamF2YSI7Ci0gICAgcmV0dXJuIG5ldyBGaWxlKGdldFRhcmdldERpcmVjdG9yeSgpLCB0YXJnZXRQYXRoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9HZW5lcmF0ZVNvdXJjZXNNb2pvLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlU291cmNlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDU1ZmQ2Mi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlU291cmNlc01vam8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLWltcG9ydCBvcmcuYXBhY2hlLm1hdmVuLnByb2plY3QuTWF2ZW5Qcm9qZWN0OwotCi0vKioKLSAqIEB2ZXJzaW9uICRJZCQKLSAqIEBnb2FsIGdlbmVyYXRlLXNvdXJjZXMKLSAqIEBwaGFzZSBnZW5lcmF0ZS1zb3VyY2VzCi0gKiBAZGVzY3JpcHRpb24gR29hbCB3aGljaCBnZW5lcmF0ZXMgdGhlIFhSVFMgQnVuZGxlcwotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVTb3VyY2VzTW9qbyBleHRlbmRzIEFic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qbwotewotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Imxpc3QiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0VHlwZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBkZWZhdWx0TG9jYWxlczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBleGNsdWRlczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSJzcmMvbWFpbi94cnRzIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSBzb3VyY2VEaXJlY3Rvcnk7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0iJHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vbWF2ZW4teHJ0cy1wbHVnaW4vbWFpbi9qYXZhIgotICAgKiBAcmVxdWlyZWQKLSAgICovCi0gIHByaXZhdGUgRmlsZSB0YXJnZXREaXJlY3Rvcnk7Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldERlZmF1bHRMb2NhbGVzKCkKLSAgewotICAgIHJldHVybiBkZWZhdWx0TG9jYWxlczsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmdbXSBnZXRFeGNsdWRlcygpCi0gIHsKLSAgICByZXR1cm4gZXhjbHVkZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxlU291cmNlUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcHJvamVjdC5hZGRDb21waWxlU291cmNlUm9vdCh0YXJnZXREaXJlY3RvcnkuZ2V0Q2Fub25pY2FsUGF0aCgpKTsKLSAgfQotCi0gIHByb3RlY3RlZCBTdHJpbmcgZ2V0VGFyZ2V0VHlwZSgpCi0gIHsKLSAgICByZXR1cm4gdGFyZ2V0VHlwZTsKLSAgfQotCi0gIHByb3RlY3RlZCBGaWxlIGdldFNvdXJjZURpcmVjdG9yeSgpCi0gIHsKLSAgICByZXR1cm4gc291cmNlRGlyZWN0b3J5OwotICB9Ci0KLSAgcHJvdGVjdGVkIEZpbGUgZ2V0VGFyZ2V0RGlyZWN0b3J5KCkKLSAgewotICAgIHJldHVybiB0YXJnZXREaXJlY3Rvcnk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvR2VuZXJhdGVUZXN0U291cmNlc01vam8uamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvR2VuZXJhdGVUZXN0U291cmNlc01vam8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTZhM2NlMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0dlbmVyYXRlVGVzdFNvdXJjZXNNb2pvLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5OCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi1pbXBvcnQgb3JnLmFwYWNoZS5tYXZlbi5wcm9qZWN0Lk1hdmVuUHJvamVjdDsKLQotLyoqCi0gKiBAdmVyc2lvbiAkSWQkCi0gKiBAZ29hbCBnZW5lcmF0ZS10ZXN0LXNvdXJjZXMKLSAqIEBwaGFzZSBnZW5lcmF0ZS10ZXN0LXNvdXJjZXMKLSAqIEBkZXNjcmlwdGlvbiBHb2FsIHdoaWNoIGdlbmVyYXRlcyB0aGUgWFJUUyBCdW5kbGVzCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZVRlc3RTb3VyY2VzTW9qbyBleHRlbmRzIEFic3RyYWN0R2VuZXJhdGVTb3VyY2VzTW9qbwotewotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3R9IgotICAgKiBAcmVxdWlyZWQKLSAgICogQHJlYWRvbmx5Ci0gICAqLwotICBwcml2YXRlIE1hdmVuUHJvamVjdCBwcm9qZWN0OwotCi0gIC8qKgotICAgKiBAcGFyYW1ldGVyIGV4cHJlc3Npb249Imxpc3QiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmcgdGFyZ2V0VHlwZTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSBkZWZhdWx0TG9jYWxlczsKLQotICAvKioKLSAgICogQHBhcmFtZXRlcgotICAgKi8KLSAgcHJpdmF0ZSBTdHJpbmdbXSB0ZXN0RXhjbHVkZXM7Ci0KLSAgLyoqCi0gICAqIEBwYXJhbWV0ZXIgZXhwcmVzc2lvbj0ic3JjL3Rlc3QveHJ0cyIKLSAgICogQHJlcXVpcmVkCi0gICAqLwotICBwcml2YXRlIEZpbGUgdGVzdFNvdXJjZURpcmVjdG9yeTsKLQotICAvKioKLSAgICogQHBhcmFtZXRlciBleHByZXNzaW9uPSIke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9tYXZlbi14cnRzLXBsdWdpbi90ZXN0L2phdmEiCi0gICAqIEByZXF1aXJlZAotICAgKi8KLSAgcHJpdmF0ZSBGaWxlIHRhcmdldERpcmVjdG9yeTsKLQotICBwcm90ZWN0ZWQgU3RyaW5nW10gZ2V0RGVmYXVsdExvY2FsZXMoKQotICB7Ci0gICAgcmV0dXJuIGRlZmF1bHRMb2NhbGVzOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZ1tdIGdldEV4Y2x1ZGVzKCkKLSAgewotICAgIHJldHVybiB0ZXN0RXhjbHVkZXM7Ci0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCBhZGRDb21waWxlU291cmNlUm9vdCgpIHRocm93cyBJT0V4Y2VwdGlvbgotICB7Ci0gICAgcHJvamVjdC5hZGRUZXN0Q29tcGlsZVNvdXJjZVJvb3QodGFyZ2V0RGlyZWN0b3J5LmdldENhbm9uaWNhbFBhdGgoKSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldFRhcmdldFR5cGUoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldFR5cGU7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmlsZSBnZXRTb3VyY2VEaXJlY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHRlc3RTb3VyY2VEaXJlY3Rvcnk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgRmlsZSBnZXRUYXJnZXREaXJlY3RvcnkoKQotICB7Ci0gICAgcmV0dXJuIHRhcmdldERpcmVjdG9yeTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9MaXN0UlRTV3JpdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0xpc3RSVFNXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzM2NzI1ZS4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL0xpc3RSVFNXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEuaW8uQnVmZmVyZWRXcml0ZXI7Ci1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uRmlsZVdyaXRlcjsKLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0vL2ltcG9ydCBqYXZhLnV0aWwuU3RyaW5nVG9rZW5pemVyOwotCi0KLS8qKgotICogVGhlIDxjb2RlPkxpc3RSVFNXcml0ZXI8L2NvZGU+IGNsYXNzIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICogPGNvZGU+UlRTV3JpdGVyPC9jb2RlPiBpbnRlcmZhY2UgdXNlZCB0byBjcmVhdGUgYSBTdW4KLSAqIDxjb2RlPkxpc3RSZXNvdXJjZUJ1bmRsZTwvY29kZT4gZmlsZS4KLSAqCi0gKiBAdmVyc2lvbiAkTmFtZTogICQgKCRSZXZpc2lvbjogMS4xMSAkKSAkRGF0ZTogMjAwMi8wMi8yNyAxNzoxODo0NyAkCi0gKiBAc2luY2UgUlRTIDIuMAotICovCi1wdWJsaWMgY2xhc3MgTGlzdFJUU1dyaXRlciBpbXBsZW1lbnRzIFJUU1dyaXRlcgotewotCi0gIC8qKgotICAgKiBFbXB0eSBjb25zdHJ1Y3RvciBmb3IgdGhlIDxjb2RlPkxpc3RSZXNvdXJjZUJ1bmRsZTwvY29kZT4gaW1wbGVtZW50YXRpb24KLSAgICoKLSAgICovCi0gIHB1YmxpYyBMaXN0UlRTV3JpdGVyKCkKLSAgewotICB9Ci0KLSAgLyoqCi0gICAqIDxjb2RlPlJUU1dyaXRlcjwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uIHRvIHdyaXRlIHRoZSBoZWFkZXIgb2YgdGhlCi0gICAqIDxjb2RlPkxpc3RSZXNvdXJjZUJ1bmRsZTwvY29kZT4gZmlsZS4KLSAgICoKLSAgICogQHBhcmFtIHBhcm1zIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBjb21tYW5kIGxpbmUgcGFyYW1ldGVycy4KLSAgICogQHBhcmFtIG1ldGEgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIHBhcnNlZCBub24tcmVzb3VyY2UgZGF0YQotICAgKiAoZS5nLiwgYXV0aG9ycykuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzdGFydEJ1bmRsZShNYXAgcGFybXMsIE1hcCBtZXRhKQotICAgIHRocm93cyBUaHJvd2FibGUKLSAgewotICAgIEZpbGUgb3V0RmlsZSA9IChGaWxlKXBhcm1zLmdldCgib3V0RmlsZSIpOwotICAgIFN0cmluZyBvdXROYW1lID0gKFN0cmluZylwYXJtcy5nZXQoIm91dE5hbWUiKTsKLSAgICBTdHJpbmcgc3JjTmFtZSA9IChTdHJpbmcpcGFybXMuZ2V0KCJzcmNOYW1lIik7Ci0KLSAgICBCb29sZWFuIGIgPSAoQm9vbGVhbilwYXJtcy5nZXQoInF1aWV0TW9kZSIpOwotICAgIGJvb2xlYW4gcXVpZXRNb2RlID0gYi5ib29sZWFuVmFsdWUoKTsKLSAgICBpZiAoIXF1aWV0TW9kZSkKLSAgICB7Ci0gICAgICBTeXN0ZW0ub3V0LnByaW50bG4oIiAgIiArIG91dEZpbGUpOwotICAgIH0KLQotICAgIF9wdyA9IG5ldyBQcmludFdyaXRlcihuZXcgQnVmZmVyZWRXcml0ZXIobmV3IEZpbGVXcml0ZXIob3V0RmlsZSkpKTsKLQotICAgIF9wdy5wcmludGxuKCIvLyBEbyBub3QgZWRpdCB0aGlzIGZpbGUhIik7Ci0gICAgX3B3LnByaW50bG4oIi8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvbWF0aWNhbGx5IGdlbmVyYXRlZC4iKTsKLQotICAgIFN0cmluZyBydHNGaWxlVHlwZSA9ICJ4cnRzIjsKLSAgICBpZiAobWV0YSAhPSBudWxsKQotICAgIHsKLSAgICAgIHJ0c0ZpbGVUeXBlID0gKFN0cmluZyltZXRhLmdldCgiZmlsZVR5cGUiKTsKLSAgICB9Ci0gICAgX3B3LnByaW50bG4oIi8vIEVkaXQgIiArIHNyY05hbWUgKyAiLiIgKyBydHNGaWxlVHlwZSArICIgYW5kIHJ1biB0aGUgIiArCi0gICAgICBydHNGaWxlVHlwZS50b1VwcGVyQ2FzZSgpICsgIk1ha2VCdW5kbGUgdG9vbCBpbnN0ZWFkLiIpOwotICAgIF9wdy5wcmludGxuKCIvLyAiKTsKLQotICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9IChTdHJpbmcpcGFybXMuZ2V0KCJwa2dOYW1lIik7Ci0gICAgYm9vbGVhbiB2YWxpZFBhY2thZ2UgPSBmYWxzZTsKLSAgICBpZiAocGFja2FnZU5hbWUgPT0gbnVsbCkKLSAgICB7Ci0gICAgICBpZiAobWV0YSAhPSBudWxsKQotICAgICAgewotICAgICAgICBpZiAobWV0YS5nZXQoInBhY2thZ2UiKSAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgcGFja2FnZU5hbWUgPSAoU3RyaW5nKW1ldGEuZ2V0KCJwYWNrYWdlIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAocGFja2FnZU5hbWUgIT0gbnVsbCAmJgotICAgICAgKCFwYWNrYWdlTmFtZS5lcXVhbHMoIiIpIHx8ICFwYWNrYWdlTmFtZS50cmltKCkuZXF1YWxzKCIiKSkpCi0gICAgewotICAgICAgX3B3LnByaW50bG4oInBhY2thZ2UgIiArIHBhY2thZ2VOYW1lICsgIjsiKTsKLSAgICAgIF9wdy5wcmludGxuKCIiKTsKLSAgICAgIHZhbGlkUGFja2FnZSA9IHRydWU7Ci0gICAgfQotCi0gICAgX3B3LnByaW50bG4oImltcG9ydCBqYXZhLnV0aWwuTGlzdFJlc291cmNlQnVuZGxlOyIpOwotCi0gICAgd3JpdGVJbXBvcnRzKHBhcm1zLCBtZXRhKTsKLQotICAgIF9wdy5wcmludGxuKCIiKTsKLSAgICBfcHcucHJpbnRsbigicHVibGljIGNsYXNzICIgKyBvdXROYW1lICsgIiBleHRlbmRzIExpc3RSZXNvdXJjZUJ1bmRsZSB7Iik7Ci0gICAgX3B3LnByaW50bG4oIiAgQE92ZXJyaWRlIik7Ci0gICAgX3B3LnByaW50bG4oIiAgcHVibGljIE9iamVjdFtdW10gZ2V0Q29udGVudHMoKSB7Iik7Ci0gICAgX3B3LnByaW50bG4oIiAgICByZXR1cm4gbmV3IE9iamVjdFtdW10geyIpOwotCi0gICAgaWYgKG91dE5hbWUuaW5kZXhPZignXycpIDwgMCkKLSAgICB7Ci0gICAgICAvLyBUaGlzIGlzIHRoZSBiYXNlIGJ1bmRsZS4gSWYgYW55IGRlZmF1bHQgbG9jYWxlcyBhcmUgcmVxdWVzdGVkLAotICAgICAgLy8gdGhleSdsbCBleHRlbmQgdGhpcyBidW5kbGUuIENyZWF0ZSB0aGVtIGhlcmUgYmVjYXVzZSB3ZSBoYXZlIGFsbAotICAgICAgLy8gdGhlIG5lZWRlZCBpbmZvLgotICAgICAgU3RyaW5nW10gbG9jYWxlcyA9IChTdHJpbmdbXSkgcGFybXMuZ2V0KCJkZWZhdWx0TG9jYWxlcyIpOwotICAgICAgRmlsZSB0YXJnRGlyID0gb3V0RmlsZS5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgICBpZiAoKGxvY2FsZXMgIT0gbnVsbCkgJiYgKHRhcmdEaXIgIT0gbnVsbCkpCi0gICAgICB7Ci0gICAgICAgIGZvciAoaW50IGwgPSAwOyBsIDwgbG9jYWxlcy5sZW5ndGg7IGwrKykKLSAgICAgICAgewotICAgICAgICAgIFN0cmluZyBjTmFtZSA9IG91dE5hbWUgKyAnXycgKyBsb2NhbGVzW2xdOwotICAgICAgICAgIEZpbGUgbG9jRiA9IG5ldyBGaWxlKHRhcmdEaXIsIGNOYW1lICsgIi5qYXZhIik7Ci0gICAgICAgICAgCi0gICAgICAgICAgUHJpbnRXcml0ZXIgbG9jV3JpOyAKLSAgICAgICAgICBsb2NXcmkgPSBuZXcgUHJpbnRXcml0ZXIobmV3IEJ1ZmZlcmVkV3JpdGVyKG5ldyBGaWxlV3JpdGVyKGxvY0YpKSk7Ci0KLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigiLy8gRG8gbm90IGVkaXQgdGhpcyBmaWxlISIpOwotICAgICAgICAgIGxvY1dyaS5wcmludGxuKCIvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQuIik7Ci0KLSAgICAgICAgICBpZiAodmFsaWRQYWNrYWdlKQotICAgICAgICAgIHsKLSAgICAgICAgICAgIGxvY1dyaS5wcmludGxuKCJwYWNrYWdlICIgKyBwYWNrYWdlTmFtZSArICI7Iik7Ci0gICAgICAgICAgICBsb2NXcmkucHJpbnRsbigiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxvY1dyaS5wcmludGxuKCJwdWJsaWMgY2xhc3MgIiArIGNOYW1lICsgIiBleHRlbmRzICIgKyBvdXROYW1lKTsKLSAgICAgICAgICBsb2NXcmkucHJpbnRsbigieyIpOwotICAgICAgICAgIGxvY1dyaS5wcmludGxuKCJ9Iik7Ci0gICAgICAgICAgbG9jV3JpLmNsb3NlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gIH0KLQotICBwcm90ZWN0ZWQgdm9pZCB3cml0ZUltcG9ydHMoTWFwIHBhcm1zLCBNYXAgbWV0YSkKLSAgICAgdGhyb3dzIFRocm93YWJsZQotICB7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhNYXAgcGFybXMsIE1hcCBtZXRhLCBTdHJpbmcga2V5LAotICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZQotICB7Ci0gICAgX3B3LnByaW50bG4oIiAgICB7XCIiICsgVW5pY29kZUVzY2FwZXMuY29udmVydChrZXkpICsgIlwiLCBcIiIgKwotICAgICAgICAgICAgICAgIFVuaWNvZGVFc2NhcGVzLmNvbnZlcnQodmFsdWUpICsgIlwifSwiKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIDxjb2RlPlJUU1dyaXRlcjwvY29kZT4gbWV0aG9kIGltcGxlbWVudGF0aW9uIHRvIGNsb3NlIHRoZSBmaWxlIHN0cmVhbQotICAgKiByZXF1aXJlZCBmb3IgdGhlIDxjb2RlPkxpc3RSZXNvdXJjZUJ1bmRsZTwvY29kZT4uICBCZWZvcmUgY2xvc2luZywgdGhpcwotICAgKiBtZXRob2QgYWxzbyB3cml0ZXMgdGhlIGZvb3RlciBwb3J0aW9ucyBvZiB0aGUgZmlsZS4gIFRoZSBmb290ZXIgcG9ydGlvbnMKLSAgICogY29uc2lzdCBvZiBsaXR0bGUgbW9yZSB0aGFuIGNsb3NpbmcgYnJhY2VzLgotICAgKgotICAgKiBAcGFyYW0gbWV0YSBhIDxjb2RlPk1hcDwvY29kZT4gb2YgcGFyc2VkIG5vbi1yZXNvdXJjZSBkYXRhCi0gICAqIChlLmcuLCBhdXRob3JzKS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZEJ1bmRsZShNYXAgcGFybXMsIE1hcCBtZXRhKSB0aHJvd3MgVGhyb3dhYmxlCi0gIHsKLSAgICBfcHcucHJpbnRsbigiICAgIH07Iik7Ci0gICAgX3B3LnByaW50bG4oIiAgfSIpOwotICAgIF9wdy5wcmludGxuKCJ9Iik7Ci0gICAgX3B3LmNsb3NlKCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgUHJpbnRXcml0ZXIgZ2V0T3V0KCkKLSAgewotICAgIHJldHVybiBfcHc7Ci0gIH0KLQotICBwcml2YXRlIFByaW50V3JpdGVyIF9wdzsKLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvUlRTV3JpdGVyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1JUU1dyaXRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRjMjE5Li4wMDAwMDAwCi0tLSBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvUlRTV3JpdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhlIDxjb2RlPlJUU1dyaXRlcjwvY29kZT4gaW50ZXJmYWNlIGRlZmluZXMgbWV0aG9kcyBmb3Igd3JpdGluZyB0aGUKLSAqIGhlYWRlciwgYm9keSwgYW5kIGZvb3RlciBvZiB2YXJpb3VzIG91dHB1dCBpbXBsZW1lbnRhdGlvbnMuIDxwPgotICoKLSAqIFRoZSBtZXRob2RzIDxjb2RlPnN0YXJ0QnVuZGxlPC9jb2RlPiBhbmQgPGNvZGU+ZW5kQnVuZGxlPC9jb2RlPiB3cml0ZSB0aGUKLSAqIGhlYWRlciBhbmQgZm9vdGVyIHBvcnRpb25zIHRvIHRoZSBvdXRwdXQuICBUaGUgbWV0aG9kcyBmb3Igd3JpdGluZyB0aGUKLSAqIGJvZHkgYXJlIDxjb2RlPndyaXRlU3RyaW5nPC9jb2RlPiwgPGNvZGU+d3JpdGVTdHJpbmdBcnJheTwvY29kZT4sIGFuZAotICogPGNvZGU+d3JpdGVNYXA8L2NvZGU+LiBUaGVzZSBtZXRob2RzIGFyZSBzdXBwbGllZCB3aXRoIGRhdGEgcGFyc2VkCi0gKiBieSB0aGUgWE1MLWJhc2VkIFJUUyBmaWxlIDxjb2RlPlhSVFNQYXJzZXI8L2NvZGU+IG9yIHRoZQotICogPGNvZGU+UlRTUHJvcGVydGllczwvY29kZT4gcGFyc2VyLjxwPgotICoKLSAqIEBzZWUgTGlzdFJUU1dyaXRlcgotICoKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjcgJCkgJERhdGU6IDIwMDEvMDQvMDkgMjM6MjI6MjIgJAotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJUU1dyaXRlcgotewotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIDxmaWxlIG9yIG90aGVyIG91dHB1dCBoZWFkZXIocykuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJtcyBhIDxjb2RlPk1hcDwvY29kZT4gb2YgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAqIEBwYXJhbSBtZXRhIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBwYXJzZWQgbm9uLXJlc291cmNlIGRhdGEKLSAgICogKGUuZy4sIHBhY2thZ2UpLgotICAgKi8KLSAgcHVibGljIHZvaWQgc3RhcnRCdW5kbGUoTWFwIHBhcm1zLCBNYXAgbWV0YSkKLSAgICB0aHJvd3MgVGhyb3dhYmxlOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSA8Y29kZT5TdHJpbmc8L2NvZGU+IHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBvdXRwdXQuIDxwPgotICAgKgotICAgKiBUaGlzIGlzIHRoZSB0eXBpY2FsIGNhc2UgdXNlLiAgQSBzaW5nbGUgPGNvZGU+U3RyaW5nPC9jb2RlPiBrZXkgYXNzb2NpYXRlZAotICAgKiB3aXRoIGEgc2luZ2xlIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUgZm9ybWluZyBhIGtleS92YWx1ZSBwYWlyIChrdnApLgotICAgKiBOb3RlIHRoYXQgdGhlIG90aGVyIHR3byBib2R5IG1ldGhvZHMsIDxjb2RlPndyaXRlU3RyaW5nQXJyYXk8L2NvZGU+IGFuZAotICAgKiA8Y29kZT53cml0ZU1hcDwvY29kZT4gYm90aCBzdXBwb3J0IGEgc2luZ2xlIDxjb2RlPlN0cmluZzwvY29kZT4KLSAgICoga2V5IGFzc29jaWF0ZWQgd2l0aCBtdWx0aXBsZSB2YWx1ZXMuIDxwPgotICAgKgotICAgKiBBIGtleS92YWx1ZSBwYWlyIG1heSBoYXZlIGFzc29jaWF0ZWQgYXR0cmlidXRlcyBpbiB0aGUgUlRTIGZpbGUuCi0gICAqIEluIHRoaXMgbWV0aG9kLCB0aGVzZSBhcmUgcmVjZWl2ZWQgZnJvbSB0aGUgWE1MIHBhcnNlciBhcyBhCi0gICAqIDxjb2RlPk1hcDwvY29kZT4uIDxwPgotICAgKgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzCi0gICAqIEBwYXJhbSBtZXRhIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBwYXJzZWQgbm9uLXJlc291cmNlIGRhdGEKLSAgICogKGUuZy4sIHBhY2thZ2UpLgotICAgKiBAcGFyYW0ga2V5IGEgPGNvZGU+U3RyaW5nPC9jb2RlPiBrZXkuCi0gICAqIEBwYXJhbSB2YWx1ZSBhIDxjb2RlPlN0cmluZzwvY29kZT4gdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhNYXAgcGFybXMsIE1hcCBtZXRhLCBTdHJpbmcga2V5LAotICAgIFN0cmluZyB2YWx1ZSkgdGhyb3dzIFRocm93YWJsZTsKLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBmaWxlIG9yIG90aGVyIG91dHB1dCBmb290ZXIocykuCi0gICAqCi0gICAqIEBwYXJhbSBwYXJtcyBhIDxjb2RlPk1hcDwvY29kZT4gb2YgY29tbWFuZCBsaW5lIHBhcmFtZXRlcnMuCi0gICAqIEBwYXJhbSBtZXRhIGEgPGNvZGU+TWFwPC9jb2RlPiBvZiBwYXJzZWQgbm9uLXJlc291cmNlIGRhdGEKLSAgICogKGUuZy4sIHBhY2thZ2UpLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kQnVuZGxlKE1hcCBwYXJtcywgTWFwIG1ldGEpIHRocm93cyBUaHJvd2FibGU7Ci0KLX0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvVW5pY29kZUVzY2FwZXMuamF2YSBiL21hdmVuMi1wbHVnaW5zL215ZmFjZXMteHJ0cy1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3hydHMvVW5pY29kZUVzY2FwZXMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjllNzZjMi4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1VuaWNvZGVFc2NhcGVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDYgKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29scy5tYXZlbjIucGx1Z2luLnhydHM7Ci0KLS8qKgotICogVGhlIDxjb2RlPlVuaWNvZGVFc2NhcGVzPC9jb2RlPiBjbGFzcyBjb252ZXJ0cyBieXRlcyBhbmQgY2hhcmFjdGVycyBvdXRzaWRlCi0gKiB0aGUgQVNDSUkgY2hhcmFjdGVyIHNldCB0byBKYXZhIHVzYWJsZSAnXFx1JyBVbmljb2RlIGVzY2FwZXMgY2hhcmFjdGVycy4gIFRoaXMKLSAqIGlzIGEgcnVudGltZSB2ZXJzaW9uIG9mIG5hdGl2ZTJhc2NpaSBtb3JlIG9yIGxlc3MuCi0gKgotICogQHZlcnNpb24gJE5hbWU6ICAkICgkUmV2aXNpb246IDEuNSAkKSAkRGF0ZTogMjAwMi8wMi8yNyAxNzoxODoxNiAkCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmljb2RlRXNjYXBlcwotewotCi0gIHByaXZhdGUgVW5pY29kZUVzY2FwZXMoKQotICB7Ci0gIH0KLQotICBzdGF0aWMgcHVibGljIFN0cmluZyBjb252ZXJ0KFN0cmluZyBzKQotICB7Ci0gICAgU3RyaW5nQnVmZmVyIGJ1ZmZlciA9IG5ldyBTdHJpbmdCdWZmZXIocy5sZW5ndGgoKSk7Ci0gICAgZm9yKGludCBpID0gMDsgaSA8IHMubGVuZ3RoKCk7IGkrKykKLSAgICB7Ci0gICAgICBjaGFyIGMgPSBzLmNoYXJBdChpKTsKLSAgICAgIGlmIChjIDwgMTI4KQotICAgICAgewotICAgICAgICBzd2l0Y2ggKGMpCi0gICAgICAgIHsKLSAgICAgICAgY2FzZSAnXGInOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcYiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFx0Iik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXG4iKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSAnXGYnOgotICAgICAgICAgIGJ1ZmZlci5hcHBlbmQoIlxcZiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZCgiXFxyIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1wiJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXFwiIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1wnJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXFwnIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xcJzoKLSAgICAgICAgICBidWZmZXIuYXBwZW5kKCJcXFxcIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnVmZmVyLmFwcGVuZChjKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZWxzZQotICAgICAgewotICAgICAgICBidWZmZXIuYXBwZW5kKCJcXHUiKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfSEVYWyhjPj4xMikmIDB4MGZdKTsKLSAgICAgICAgYnVmZmVyLmFwcGVuZChfSEVYWyhjPj44KSYgMHgwZl0pOwotICAgICAgICBidWZmZXIuYXBwZW5kKF9IRVhbKGM+PjQpJiAweDBmXSk7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoX0hFWFtjICYgMHgwZl0pOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gYnVmZmVyLnRvU3RyaW5nKCk7Ci0gIH0KLQotLy8gIFN0cmluZyBieXRlVG9IZXgoYnl0ZSBiKSB7Ci0vLyAgICAvLyBSZXR1cm5zIGhleCBTdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgYnl0ZSBiCi0vLyAgICBjaGFyIGhleERpZ2l0W10gPSB7Ci0vLyAgICAgICAnMCcsICcxJywgJzInLCAnMycsICc0JywgJzUnLCAnNicsICc3JywKLS8vICAgICAgICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnCi0vLyAgICB9OwotLy8gICAgY2hhcltdIGFycmF5ID0geyBoZXhEaWdpdFsoYiA+PiA0KSAmIDB4MGZdLCBoZXhEaWdpdFtiICYgMHgwZl0gfTsKLS8vICAgIHJldHVybiBuZXcgU3RyaW5nKGFycmF5KTsKLS8vICB9Ci0KLS8vICBTdHJpbmcgY2hhclRvSGV4KGNoYXIgYykgewotLy8gICAgLy8gUmV0dXJucyBoZXggU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIGNoYXIgYwotLy8gICAgYnl0ZSBoaSA9IChieXRlKSAoYyA+Pj4gOCk7Ci0vLyAgICBieXRlIGxvID0gKGJ5dGUpIChjICYgMHhmZik7Ci0vLyAgICByZXR1cm4gYnl0ZVRvSGV4KGhpKSArIGJ5dGVUb0hleChsbyk7Ci0vLyAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZ1tdIF9IRVggPQotICAgIHsiMCIsICIxIiwgIjIiLCAiMyIsICI0IiwgIjUiLCAiNiIsICI3IiwKLSAgICAgIjgiLCAiOSIsICJhIiwgImIiLCAiYyIsICJkIiwgImUiLCAiZiJ9OwotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTR2VuZXJhdG9yLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1hSVFNHZW5lcmF0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU5NDU3ZC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1hSVFNHZW5lcmF0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8qCi0gKiAgTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiAgcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiAgd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICogCi0gKiAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKiAKLSAqICBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiAgc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqICBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiAgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubWF2ZW4yLnBsdWdpbi54cnRzOwotCi1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotaW1wb3J0IGphdmF4LnhtbC5wYXJzZXJzLlNBWFBhcnNlcjsKLQotaW1wb3J0IG9yZy54bWwuc2F4LklucHV0U291cmNlOwotCi0vKioKLSAqIFRoZSA8Y29kZT5YUlRTR2VuZXJhdG9yPC9jb2RlPiBjbGFzcyBpcyBhIG9ubGluZSBmYWNpbGl0eSAoYXMgb3Bwb3NlZCB0byB0aGUKLSAqIGNvbW1hbmQgbGluZSB1dGlsaXR5IDxjb2RlPlhSVFNNYWtlQnVuZGxlPC9jb2RlPikgZm9yIHBhcnNpbmcgYW5kIGJ1aWxkaW5nCi0gKiBYTUwtYmFzZWQgUlRTIGZpbGVzIHRvIHRoZSBnaXZlbiBpbXBsZW1lbnRhdGlvbiBvdXRwdXQuIDxwPgotICoKLSAqIEB2ZXJzaW9uICROYW1lOiAgJCAoJFJldmlzaW9uOiAxLjEgJCkgJERhdGU6IDIwMDEvMDcvMDkgMTg6MTU6NTMgJAotICogQHNpbmNlIFJUUyAyLjAKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFhSVFNHZW5lcmF0b3IKLXsKLQotICAvKioKLSAgICogUGFyc2UgdGhlIFhNTC1iYXNlZCBSVFMgc291cmNlIGFuZCBjcmVhdGUgb3V0cHV0IGFjY29yZGluZyB0byBhbgotICAgKiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uLgotICAgKgotICAgKiBAcGFyYW0gcGFyc2VyIHNlZSBjbGFzcyBkZXNjcmlwdGlvbi4KLSAgICogQHBhcmFtIGlzIHRoZSBYTUwtYmFzZWQgUlRTIHNvdXJjZSBmaWxlLgotICAgKiBAcGFyYW0gcnRzdyBhbiA8Y29kZT5SVFNXcml0ZXI8L2NvZGU+IGltcGxlbWVudGF0aW9uLgotICAgKiBAcGFyYW0gcGFybXMgYSA8Y29kZT5NYXA8L2NvZGU+IG9mIGNvbW1hbmQgbGluZSBwYXJhbWV0ZXJzLgotICAgKgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGdlbmVyYXRlKFNBWFBhcnNlciBwYXJzZXIsIElucHV0U291cmNlIGlzLCBSVFNXcml0ZXIgcnRzdywKLSAgICBNYXAgcGFybXMpIHRocm93cyBUaHJvd2FibGUKLSAgewotICAgIFhSVFNQYXJzZXIgcnRzcCA9IG5ldyBYUlRTUGFyc2VyKHJ0c3csIHBhcm1zKTsKLSAgICBwYXJzZXIucGFyc2UoaXMsIHJ0c3ApOwotICB9Ci0KLSAgLy8KLSAgLy8gTm8gbmVlZCB0byBpbnN0YW50aWF0ZSB0aGlzIGNsYXNzCi0gIC8vCi0gIHByaXZhdGUgWFJUU0dlbmVyYXRvcigpCi0gIHsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy14cnRzLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4veHJ0cy9YUlRTUGFyc2VyLmphdmEgYi9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1hSVFNQYXJzZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM5MGJmMC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLXhydHMtcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi94cnRzL1hSVFNQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vKgotICogIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqICBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqICBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqICB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAgIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqIAotICogIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICogCi0gKiAgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAgIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiAgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiAgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm1hdmVuMi5wbHVnaW4ueHJ0czsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZUxpc3Q7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSGFuZGxlckJhc2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLS8qKgotICogKi8KLWZpbmFsIGNsYXNzIFhSVFNQYXJzZXIgZXh0ZW5kcyBIYW5kbGVyQmFzZQotewotCi0gIC8qKgotICAgKiBFbXB0eSBjb25zdHJ1Y3RvciBmb3IgdGhlIFhSVFNQYXJzZXIKLSAgICoKLSAgICovCi0gIHB1YmxpYyBYUlRTUGFyc2VyKCkKLSAgewotICB9Ci0KLSAgcHVibGljIFhSVFNQYXJzZXIoUlRTV3JpdGVyIGJ3LCBNYXAgcGFybXMpCi0gIHsKLSAgICBfYnVuZGxlV3JpdGVyID0gYnc7Ci0gICAgX3Bhcm1zID0gcGFybXM7Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBhIExvY2F0b3Igb2JqZWN0IGZvciBkb2N1bWVudCBldmVudHMuCi0gICAqIFNldHRpbmcgTG9jYXRvciBlbnN1cmVzIHRoZSBTQVggcGFyc2VyIGNhbiBmaW5kIGEgZ2l2ZW4gWE1MLWJhc2VkIFJUUwotICAgKiBkb2N1bWVudC4gIFRoaXMgbWV0aG9kIGlzIGNsb3NlbHkgcmVsYXRlZCB0byB0aGUgX2ZpbGVUb1VSTCBpbgotICAgKiA8Y29kZT5YUlRTTWFrZUJ1bmRsZTwvY29kZT4uCi0gICAqCi0gICAqIEBwYXJhbSBsb2NhdG9yIEEgbG9jYXRvciBmb3IgYWxsIFNBWCBkb2N1bWVudCBldmVudHMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IgKExvY2F0b3IgbG9jYXRvcikKLSAgewotICAgIF9sb2NhdG9yID0gbG9jYXRvcjsKLSAgfQotCi0gIC8qKgotICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgYmVnaW5uaW5nIG9mIHRoZSBkb2N1bWVudC4KLSAgICogU0FYIFBhcnNlciBldmVudCBmb3IgZmluZGluZyB0aGUgYmVnaW5uaW5nIG9mIGFuIFhNTC1iYXNlZCBSVFMgZG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBfbWV0YUh0LnB1dCgiZmlsZVR5cGUiLCAieHJ0cyIpOwotICAgIF9zdGFydERvYyA9IHRydWU7Ci0KLSAgfQotCi0gIC8qKgotICAgKiBSZWNlaXZlIG5vdGlmaWNhdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBkb2N1bWVudC4KLSAgICogU0FYIFBhcnNlciBldmVudCBmb3IgZmluZGluZyB0aGUgZW5kIG9mIGFuIFhNTC1iYXNlZCBSVFMgZG9jdW1lbnQKLSAgICovCi0gIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0vLyAgICBTeXN0ZW0ub3V0LnByaW50bG4oIkVuZERvY3VtZW50Iik7Ci0gICAgdHJ5Ci0gICAgewotICAgICAgX2J1bmRsZVdyaXRlci5lbmRCdW5kbGUoX3Bhcm1zLCBfbWV0YUh0KTsKLSAgICB9Ci0gICAgY2F0Y2ggKFRocm93YWJsZSB0aCkKLSAgICB7Ci0gICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKCJlbmRCdW5kbGUgRXhjZXB0aW9uOiAiICsgdGguZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgdGhlIHN0YXJ0IG9mIGFuIGVsZW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBuYW1lIHRoZSBlbGVtZW50IHR5cGUgbmFtZS4KLSAgICogQHBhcmFtIGF0dHJpYnV0ZXMgdGhlIHNwZWNpZmllZCBvciBkZWZhdWx0ZWQgYXR0cmlidXRlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgbmFtZSwgQXR0cmlidXRlTGlzdCBhdHRzKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBfbmVzdGluZ0xldmVsKys7Ci0KLSAgICAvLyBzdGFydEJ1bmRsZSBkb2Vzbid0IGdvIGluIHRoZSBzdGFydERvY3VtZW50IG1ldGhvZCBiZWNhdXNlIGl0Ci0gICAgLy8gcmVxdWlyZXMgbWV0YWRhdGEgdG8gYmUgcGFzc2VkIGFuZCBpbiBwYXJ0aWN1bGFyLCByZXF1aXJlcwotICAgIC8vIGF0IGxlYXN0IHRoZSBwYWNrYWdlIGZvciBhbnkgaW1wbGVtZW50YXRpb24gb2Ygc3RhcnRCdW5kbGUgdG8gd29yawotICAgIGlmICgoX25lc3RpbmdMZXZlbCA9PSAyKSAmJiBuYW1lLmVxdWFscygicmVzb3VyY2UiKSkKLSAgICB7Ci0gICAgICBpZiAoX3N0YXJ0RG9jKQotICAgICAgewotICAgICAgICB0cnkKLSAgICAgICAgewotICAgICAgICAgIF9idW5kbGVXcml0ZXIuc3RhcnRCdW5kbGUoX3Bhcm1zLCBfbWV0YUh0KTsKLSAgICAgICAgICBfc3RhcnREb2MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBjYXRjaCAoVGhyb3dhYmxlIHRoKQotICAgICAgICB7Ci0gICAgICAgICAgdGhyb3cgbmV3IFNBWEV4Y2VwdGlvbigic3RhcnRCdW5kbGUgRXhjZXB0aW9uOiAiICsgdGguZ2V0TWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBfY3VycmVudFJlc291cmNlS2V5ID0gYXR0cy5nZXRWYWx1ZSgia2V5Iik7Ci0gICAgICBpZiAoX3VuaXFLZXlzLmNvbnRhaW5zKF9jdXJyZW50UmVzb3VyY2VLZXkpKQotICAgICAgewotICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkR1cGxpY2F0ZSBpZCBcIiIgKyBfY3VycmVudFJlc291cmNlS2V5ICsgIlwiIik7Ci0gICAgICB9Ci0KLSAgICAgIF91bmlxS2V5cy5hZGQoX2N1cnJlbnRSZXNvdXJjZUtleSk7Ci0gICAgICAKLQotICAgICAgX2N1cnJlbnRSZXNvdXJjZVZhbHVlID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICB9Ci0gICAgZWxzZSBpZiAoKF9uZXN0aW5nTGV2ZWwgPT0gMSkgJiYgbmFtZS5lcXVhbHMoInJlc291cmNlcyIpKQotICAgIHsKLSAgICAgIF9tZXRhSHQucHV0KCJwYWNrYWdlIiwgYXR0cy5nZXRWYWx1ZSgicGFja2FnZSIpKTsKLSAgICAgIGlmIChhdHRzLmdldFZhbHVlKCJ2ZXJzaW9uIikgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgX21ldGFIdC5wdXQoInZlcnNpb24iLCBhdHRzLmdldFZhbHVlKCJ2ZXJzaW9uIikpOwotICAgICAgfQotICAgICAgaWYgKGF0dHMuZ2V0VmFsdWUoImJhc2V2ZXJzaW9uIikgIT0gbnVsbCkKLSAgICAgIHsKLSAgICAgICAgX21ldGFIdC5wdXQoImJhc2VWZXJzaW9uIiwgYXR0cy5nZXRWYWx1ZSgiYmFzZXZlcnNpb24iKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlY2VpdmUgbm90aWZpY2F0aW9uIG9mIHRoZSBlbmQgb2YgYW4gZWxlbWVudC4KLSAgICogQHBhcmFtIG5hbWUgdGhlIGVsZW1lbnQgdHlwZSBuYW1lLgotICAgKi8KLSAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgbmFtZSkgdGhyb3dzIFNBWEV4Y2VwdGlvbgotICB7Ci0gICAgaWYgKChfbmVzdGluZ0xldmVsID09IDIpICYmIG5hbWUuZXF1YWxzKCJyZXNvdXJjZSIpKQotICAgIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IF9jdXJyZW50UmVzb3VyY2VWYWx1ZS50b1N0cmluZygpLnRyaW0oKTsKLSAgICAgIHRyeQotICAgICAgewotICAgICAgICBfYnVuZGxlV3JpdGVyLndyaXRlU3RyaW5nKF9wYXJtcywgX21ldGFIdCwgX2N1cnJlbnRSZXNvdXJjZUtleSwgdmFsdWUpOwotICAgICAgfQotICAgICAgY2F0Y2ggKFRocm93YWJsZSB0KQotICAgICAgewotICAgICAgICB0aHJvdyBuZXcgU0FYRXhjZXB0aW9uKHQuZ2V0TWVzc2FnZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBfbmVzdGluZ0xldmVsLS07Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgaWdub3JhYmxlIHdoaXRlc3BhY2UgaW4gZWxlbWVudCBjb250ZW50LgotICAgKgotICAgKiBAcGFyYW0gY2ggdGhlIHdoaXRlc3BhY2UgY2hhcmFjdGVycy4KLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgotICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgY2hhcmFjdGVyIGFycmF5LgotICAgKi8KLSAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2J1ZiwgaW50IHN0YXJ0LCBpbnQgbGVuKQotICAgIHRocm93cyBTQVhFeGNlcHRpb24KLSAgewotLy8gICAgU3lzdGVtLm91dC5wcmludGxuKCJJZ25vcmFibGVXaGl0ZVNwYWNlIiArIGxlbik7Ci0gIH0KLQotICAvKioKLSAgICogUmVjZWl2ZSBub3RpZmljYXRpb24gb2YgY2hhcmFjdGVyIGRhdGEgaW5zaWRlIGFuIGVsZW1lbnQuCi0gICAqCi0gICAqIEBwYXJhbSBjaCB0aGUgY2hhcmFjdGVycy4KLSAgICogQHBhcmFtIHN0YXJ0IHRoZSBzdGFydCBwb3NpdGlvbiBpbiB0aGUgY2hhcmFjdGVyIGFycmF5LgotICAgKiBAcGFyYW0gbGVuZ3RoIHRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyB0byB1c2UgZnJvbSB0aGUgY2hhcmFjdGVyIGFycmF5LgotICAgKi8KLSAgcHVibGljIHZvaWQgY2hhcmFjdGVycyhjaGFyW10gY2J1ZiwgaW50IHN0YXJ0LCBpbnQgbGVuKSB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX25lc3RpbmdMZXZlbCA9PSAyKQotICAgIHsKLSAgICAgIF9jdXJyZW50UmVzb3VyY2VWYWx1ZS5hcHBlbmQoY2J1Ziwgc3RhcnQsIGxlbik7Ci0gICAgfQotICB9Ci0KLQotICAvLyBTdG9yZSB0aGUgbG9jYXRvcgotICBwcml2YXRlIExvY2F0b3IgX2xvY2F0b3I7Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgX2N1cnJlbnRSZXNvdXJjZUtleTsKLSAgcHJpdmF0ZSBTdHJpbmdCdWlsZGVyIF9jdXJyZW50UmVzb3VyY2VWYWx1ZTsKLSAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBPYmplY3Q+IF9tZXRhSHQgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIE9iamVjdD4oKTsKLSAgcHJpdmF0ZSBTZXQ8U3RyaW5nPiBfdW5pcUtleXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0KLSAgcHJpdmF0ZSBSVFNXcml0ZXIgX2J1bmRsZVdyaXRlcjsKLSAgcHJpdmF0ZSBNYXAgX3Bhcm1zOwotCi0gIHByaXZhdGUgaW50IF9uZXN0aW5nTGV2ZWwgPSAwOwotICBwcml2YXRlIGJvb2xlYW4gX3N0YXJ0RG9jID0gZmFsc2U7Ci19CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9wb20ueG1sIGIvbWF2ZW4yLXBsdWdpbnMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNkYzQ0NC4uMDAwMDAwMAotLS0gYS9tYXZlbjItcGx1Z2lucy9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTwhLS0KLSAgICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gICAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gICAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAgICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gICAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICAgICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAgICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0KLSAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLQotICAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAgICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICAgICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICAgIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAgICB1bmRlciB0aGUgTGljZW5zZS4KLS0tPgotCi08IS0tCi0gIC0gQSAibW9kdWxlIiBwb20gd2hvc2UgcHVycG9zZSBpcyBzaW1wbHkgdG8gYnVpbGQgYWxsIG1hdmVuIG1vZHVsZXMKLSAgLSBpbiB0aGUgc3ViZGlyZWN0b3JpZXMuIFRoaXMgaXMgTk9UIHRoZSBwYXJlbnQgcG9tIG9mIGFueSBwcm9qZWN0LAotICAtIGFuZCBpcyBub3QgZXhwZWN0ZWQgdG8gZXZlciBiZSByZWxlYXNlZC4KLSAgLS0+Ci0KLTxwcm9qZWN0Ci0gIHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIAotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLQotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXM8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+bXlmYWNlczwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj42PC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tbW9kdWxlPC9hcnRpZmFjdElkPgotICA8dmVyc2lvbj4xLVNOQVBTSE9UPC92ZXJzaW9uPgotICA8cGFja2FnaW5nPnBvbTwvcGFja2FnaW5nPgotICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBQbHVnaW4gTW9kdWxlPC9uYW1lPgotICA8dXJsPmh0dHA6Ly9teWZhY2VzLmFwYWNoZS5vcmcvYnVpbGQtdG9vbHMvcGx1Z2luczwvdXJsPgotCi0gIDwhLS0gV0FSTklORzogRE8gTk9UIERFUExPWSBTSVRFIEZST00gSEVSRQotICAgQSBwYXJlbnQgbW9kdWxlIGlzIGF0IG15ZmFjZXMtcGx1Z2luLXBhcmVudCwgc28gd2hlbiAKLSAgIGEgc2l0ZSBuZWVkcyB0byBiZSBkZXBsb3llZCwgcnVuIG12biBzaXRlOnNpdGUgbXZuIHNpdGU6ZGVwbG95Ci0gICBmcm9tIG15ZmFjZXMtcGx1Z2luLXBhcmVudCBhbmQgdGhlbiBmb3IgZWFjaCBvbmUgb2YgdGhlIHJlbWFpbmluZwotICAgbW9kdWxlcy4gSWYgdGhlIGdvYWwgaXMgZXhlY3V0ZWQgZnJvbSBoZXJlIHRoZSBzaXRlIGRvZXMgbm90IHdvcmsKLSAgIHdlbGwuIC0tPgotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPm15ZmFjZXMtcGx1Z2luLXBhcmVudDwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1idWlsZGVyLWFubm90YXRpb25zPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWZhY2VzLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1pMThuLXBsdWdpbjwvbW9kdWxlPgotICAgIDxtb2R1bGU+bXlmYWNlcy1qYXZhY2MtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWphdmFzY3JpcHQtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLWpkZXYtcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLXRhZ2RvYy1wbHVnaW48L21vZHVsZT4KLSAgICA8bW9kdWxlPm15ZmFjZXMtd2Fnb24tcGx1Z2luPC9tb2R1bGU+Ci0gICAgPG1vZHVsZT5teWZhY2VzLXhydHMtcGx1Z2luPC9tb2R1bGU+Ci0gIDwvbW9kdWxlcz4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9MSUNFTlNFLnR4dCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTElDRU5TRS50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTElDRU5TRS50eHQKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vTElDRU5TRS50eHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTk9USUNFLnR4dCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vTk9USUNFLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9OT1RJQ0UudHh0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL05PVElDRS50eHQKZGlmZiAtLWdpdCBhL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vcG9tLnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vcG9tLnhtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWE1ZDRiCi0tLSAvZGV2L251bGwKKysrIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9wb20ueG1sCkBAIC0wLDAgKzEsMTg3IEBACis8cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIiB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4gCisKKyAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgorCisgIDxwYXJlbnQ+CisgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+CisgICAgPGFydGlmYWN0SWQ+bXlmYWNlcy1wbHVnaW4tcGFyZW50PC9hcnRpZmFjdElkPgorICAgIDx2ZXJzaW9uPjEuMC4zPC92ZXJzaW9uPgorICA8L3BhcmVudD4KKworICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm15ZmFjZXMuYnVpbGR0b29sczwvZ3JvdXBJZD4KKyAgPGFydGlmYWN0SWQ+bXlmYWNlcy1idWlsZGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4gCisgIDx2ZXJzaW9uPjEuMC41PC92ZXJzaW9uPgorICA8cGFja2FnaW5nPm1hdmVuLXBsdWdpbjwvcGFja2FnaW5nPgorICA8bmFtZT5BcGFjaGUgTXlGYWNlcyBCdWlsZHRvb2xzIE1hdmVuMiBCdWlsZGVyIFBsdWdpbjwvbmFtZT4KKyAgPGRlc2NyaXB0aW9uPgorICAgIEEgbWF2ZW4gcGx1Z2luIHRoYXQgdXNlcyBhbm5vdGF0aW9ucyAoamF2YTE1IG9yIGRvY2xldCBzdHlsZSkgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBKU0YgY29uZmlndXJhdGlvbgorICAgIGZpbGVzICgudGxkLCBmYWNlcy1jb25maWcueG1sLCBldGMpIGFuZCBvcHRpb25hbGx5IFRhZywgVmFsaWRhdG9yIGFuZCBDb21wb25lbnQgY2xhc3Nlcy4KKyAgPC9kZXNjcmlwdGlvbj4KKworICA8YnVpbGQ+CisgICAgPHBsdWdpbnM+CisgICAgICA8IS0tIHJlcXVpcmVkIGZvciBwbGV4dXMsIGJ1dCB3ZSBhcmUgbm90IHVzaW5nIHRoaXMgcmlnaHQgbm93CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8Y29uZmlndXJhdGlvbj4KKyAgICAgICAgICA8Z29hbFByZWZpeD5teWZhY2VzLWJ1aWxkZXI8L2dvYWxQcmVmaXg+CisgICAgICAgIDwvY29uZmlndXJhdGlvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgIC0tPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgICA8dmVyc2lvbj4yLjAuMjwvdmVyc2lvbj4KKyAgICAgICAgPGluaGVyaXRlZD50cnVlPC9pbmhlcml0ZWQ+CisgICAgICAgIDxjb25maWd1cmF0aW9uPgorICAgICAgICAgIDxzb3VyY2U+MS40PC9zb3VyY2U+CisgICAgICAgICAgPHRhcmdldD4xLjQ8L3RhcmdldD4KKyAgICAgICAgPC9jb25maWd1cmF0aW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuNC4yPC92ZXJzaW9uPgorICAgICAgPC9wbHVnaW4+CisgICAgPC9wbHVnaW5zPgorICA8L2J1aWxkPgorCisgIDxyZXBvcnRpbmc+CisgICAgPHBsdWdpbnM+CisgICAgICA8cGx1Z2luPgorICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+CisgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXBsdWdpbi1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KKyAgICAgIDwvcGx1Z2luPgorICAgICAgPHBsdWdpbj4KKyAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tamF2YWRvYy1wbHVnaW48L2FydGlmYWN0SWQ+CisgICAgICA8L3BsdWdpbj4KKyAgICA8L3BsdWdpbnM+CisgIDwvcmVwb3J0aW5nPgorICAKKyAgPGRlcGVuZGVuY2llcz4KKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW48L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1wbHVnaW4tYXBpPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXByb2plY3Q8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4yLjA8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIAorICAgIDxkZXBlbmRlbmN5PiAgICAKKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWRlcGVuZGVuY3ktcGx1Z2luPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4wPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4gICAKKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tLnRob3VnaHR3b3Jrcy5xZG94PC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+cWRveDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjEuOS4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1kaWdlc3RlcjwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtZGlnZXN0ZXI8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjg8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPCEtLQorICAgIDxkZXBlbmRlbmN5PgorICAgIAk8Z3JvdXBJZD54bWwtYXBpczwvZ3JvdXBJZD4KKyAgICAJPGFydGlmYWN0SWQ+eG1sLWFwaXM8L2FydGlmYWN0SWQ+CisgICAgCTx2ZXJzaW9uPjEuMC5iMjwvdmVyc2lvbj4KKyAgICAJPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICAtLT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+c2F4b248L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5zYXhvbjwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjYuNS4zPC92ZXJzaW9uPgorICAgICAgPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICAKKyAgICA8IS0tCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD54ZXJjZXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD54ZXJjZXNJbXBsPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi42LjI8L3ZlcnNpb24+CisgICAgICA8c2NvcGU+cnVudGltZTwvc2NvcGU+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIC0tPgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgCTxncm91cElkPnN0YXg8L2dyb3VwSWQ+CisgICAgCTxhcnRpZmFjdElkPnN0YXgtYXBpPC9hcnRpZmFjdElkPgorICAgIAk8dmVyc2lvbj4xLjAuMTwvdmVyc2lvbj4KKyAgICAJPCEtLSA8c2NvcGU+Y29tcGlsZTwvc2NvcGU+ICAtLT4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAJPGdyb3VwSWQ+c3RheDwvZ3JvdXBJZD4KKyAgICAJPGFydGlmYWN0SWQ+c3RheDwvYXJ0aWZhY3RJZD4KKyAgICAJPHZlcnNpb24+MS4yLjA8L3ZlcnNpb24+CisgICAgCTwhLS0gPHNjb3BlPnJ1bnRpbWU8L3Njb3BlPiAgLS0+CisgICAgPC9kZXBlbmRlbmN5PgorCisgICAgPGRlcGVuZGVuY3k+CisgICAgICA8Z3JvdXBJZD52ZWxvY2l0eTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPnZlbG9jaXR5PC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS41PC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKworICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1jb2xsZWN0aW9uczwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmNvbW1vbnMtY29sbGVjdGlvbnM8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4zLjE8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+Y29tbW9ucy1sYW5nPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+Y29tbW9ucy1sYW5nPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+Mi4xPC92ZXJzaW9uPgorICAgIDwvZGVwZW5kZW5jeT4KKyAgICA8IS0tICAgICAKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5jb2RlaGF1cy5wbGV4dXM8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5wbGV4dXMtdmVsb2NpdHk8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjEuNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgIC0tPgorICAgIAorICAgIDwhLS0gUmVwb3J0aW5nIHJlcXVpcmVkIEFQSS0tPiAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5yZXBvcnRpbmc8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1yZXBvcnRpbmctaW1wbDwvYXJ0aWZhY3RJZD4KKyAgICAgIDx2ZXJzaW9uPjIuMDwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisgICAgICAgIAorICAgIDxkZXBlbmRlbmN5PgorICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5tYXZlbi5kb3hpYTwvZ3JvdXBJZD4KKyAgICAgIDxhcnRpZmFjdElkPmRveGlhLWNvcmU8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjAtYWxwaGEtNzwvdmVyc2lvbj4KKyAgICA8L2RlcGVuZGVuY3k+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4uZG94aWE8L2dyb3VwSWQ+CisgICAgICA8YXJ0aWZhY3RJZD5kb3hpYS1zaXRlLXJlbmRlcmVyPC9hcnRpZmFjdElkPgorICAgICAgPHZlcnNpb24+MS4wLWFscGhhLTc8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICAgIDwhLS0gRW5kIFJlcG9ydGluZyByZXF1aXJlZCBBUEkgLS0+CisKKyAgICA8ZGVwZW5kZW5jeT4KKyAgICAgIDxncm91cElkPmxvZzRqPC9ncm91cElkPgorICAgICAgPGFydGlmYWN0SWQ+bG9nNGo8L2FydGlmYWN0SWQ+CisgICAgICA8dmVyc2lvbj4xLjIuMTM8L3ZlcnNpb24+CisgICAgPC9kZXBlbmRlbmN5PgorICA8L2RlcGVuZGVuY2llcz4KKworICA8c2NtPgorICAgIDxjb25uZWN0aW9uPnNjbTpzdm46aHR0cDovL3N2bi5hcGFjaGUub3JnL3JlcG9zL2FzZi9teWZhY2VzL215ZmFjZXMtYnVpbGQtdG9vbHMvdGFncy9sdTQyNDJfbTJfcGx1Z2luc18xMDVfcmVsZWFzZS9teWZhY2VzLWJ1aWxkZXItcGx1Z2luPC9jb25uZWN0aW9uPgorICAgIDxkZXZlbG9wZXJDb25uZWN0aW9uPnNjbTpzdm46aHR0cHM6Ly9zdm4uYXBhY2hlLm9yZy9yZXBvcy9hc2YvbXlmYWNlcy9teWZhY2VzLWJ1aWxkLXRvb2xzL2JyYW5jaGVzL2x1NDI0Ml9tMl9wbHVnaW5zXzEwNV9yZWxlYXNlL215ZmFjZXMtYnVpbGRlci1wbHVnaW48L2RldmVsb3BlckNvbm5lY3Rpb24+CisgICAgPHVybD5odHRwOi8vc3ZuLmFwYWNoZS5vcmcvdmlld3ZjL215ZmFjZXMvbXlmYWNlcy1idWlsZC10b29scy90YWdzL2x1NDI0Ml9tMl9wbHVnaW5zXzEwNV9yZWxlYXNlL215ZmFjZXMtYnVpbGRlci1wbHVnaW48L3VybD4KKyAgPC9zY20+Cis8L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvQnVpbGRNZXRhRGF0YU1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvSU9VdGlscy5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvSU9VdGlscy5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHMuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam8uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbmZpZ01vam8uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbmZpZ01vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29uZmlnTW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb25maWdNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbnZlcnRlclRhZ3NNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb252ZXJ0ZXJUYWdzTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb252ZXJ0ZXJUYWdzTW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb252ZXJ0ZXJUYWdzTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VUYWdzTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVGFnc01vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVGFnc01vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVGFnc01vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlVmFsaWRhdG9yVGFnc01vam8uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvclRhZ3NNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvclRhZ3NNb2pvLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvclRhZ3NNb2pvLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZVZhbGlkYXRvcnNNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VWYWxpZGF0b3JzTW9qby5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VWYWxpZGF0b3JzTW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VWYWxpZGF0b3JzTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01vZGVsQnVpbGRlci5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9Nb2RlbEJ1aWxkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9Nb2RlbEJ1aWxkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9Nb2RlbEJ1aWxkZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9pby9QcmV0dHlXcml0ZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vUHJldHR5V3JpdGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vUHJldHR5V3JpdGVyLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vUHJldHR5V3JpdGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvaW8vWG1sV3JpdGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1htbFdyaXRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1htbFdyaXRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL2lvL1htbFdyaXRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZUhvbGRlci5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVIb2xkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVIb2xkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVIb2xkZXIuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0F0dHJpYnV0ZU1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9BdHRyaWJ1dGVNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQXR0cmlidXRlTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NsYXNzTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGFzc01ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGFzc01ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9DbGFzc01ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db21wb25lbnRNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbXBvbmVudE1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db21wb25lbnRNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ29tcG9uZW50TWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbnZlcnRlck1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvQ29udmVydGVyTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0NvbnZlcnRlck1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Db252ZXJ0ZXJNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZWxldFRhZ01ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZWxldFRhZ01ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNlbGV0VGFnTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2VsZXRUYWdNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRIb2xkZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRIb2xkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9GYWNldEhvbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0SG9sZGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvRmFjZXRNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0TWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0TWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0ZhY2V0TWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVySG9sZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVySG9sZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTGlzdGVuZXJIb2xkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9MaXN0ZW5lckhvbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL0xpc3RlbmVyTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9MaXN0ZW5lck1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9MaXN0ZW5lck1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9MaXN0ZW5lck1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9NZXRob2RTaWduYXR1cmVNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01ldGhvZFNpZ25hdHVyZU1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9NZXRob2RTaWduYXR1cmVNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTWV0aG9kU2lnbmF0dXJlTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWwuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsVXRpbHMuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvTW9kZWxVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL01vZGVsVXRpbHMuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Nb2RlbFV0aWxzLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlIb2xkZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlIb2xkZXIuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9Qcm9wZXJ0eUhvbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5SG9sZGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUHJvcGVydHlNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1Byb3BlcnR5TWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcktpdE1ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUmVuZGVyS2l0TWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcktpdE1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9SZW5kZXJLaXRNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvUmVuZGVyZXJNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcmVyTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcmVyTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1JlbmRlcmVyTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1RhZ01ldGEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVGFnTWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1RhZ01ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9UYWdNZXRhLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmFsaWRhdG9yTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WYWxpZGF0b3JNZXRhLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmFsaWRhdG9yTWV0YS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZhbGlkYXRvck1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WaWV3RW50aXR5TWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9WaWV3RW50aXR5TWV0YS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1ZpZXdFbnRpdHlNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvVmlld0VudGl0eU1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdNZXRhLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1dlYkNvbmZpZ01ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdNZXRhLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnTWV0YS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1dlYkNvbmZpZ1BhcmFtSG9sZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1dlYkNvbmZpZ1BhcmFtSG9sZGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvbW9kZWwvV2ViQ29uZmlnUGFyYW1Ib2xkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbUhvbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL21vZGVsL1dlYkNvbmZpZ1BhcmFtTWV0YS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbU1ldGEuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbU1ldGEuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9tb2RlbC9XZWJDb25maWdQYXJhbU1ldGEuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hIZWxwZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94SGVscGVyLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94SGVscGVyLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94SGVscGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlci5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdERlcGVuZGVuY3lNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdERlcGVuZGVuY3lNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0Fic3RyYWN0RGVwZW5kZW5jeU1vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3REZXBlbmRlbmN5TW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BYnN0cmFjdEZyb21Db25maWd1cmF0aW9uTW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQWJzdHJhY3RGcm9tQ29uZmlndXJhdGlvbk1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9BcnRpZmFjdEl0ZW0uamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svQXJ0aWZhY3RJdGVtLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL0FydGlmYWN0SXRlbS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9VbnBhY2tNb2pvLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3VucGFjay9VbnBhY2tNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdW5wYWNrL1VucGFja01vam8uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91bnBhY2svVW5wYWNrTW9qby5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0J1aWxkRXhjZXB0aW9uLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0J1aWxkRXhjZXB0aW9uLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQnVpbGRFeGNlcHRpb24uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9CdWlsZEV4Y2VwdGlvbi5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0NvbnNvbGVMb2dTeXN0ZW0uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvQ29uc29sZUxvZ1N5c3RlbS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL0NvbnNvbGVMb2dTeXN0ZW0uamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9Db25zb2xlTG9nU3lzdGVtLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvTXlmYWNlc1V0aWxzLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL015ZmFjZXNVdGlscy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvdXRpbHMvUmVsYXRpdmVDbGFzc3BhdGhSZXNvdXJjZUxvYWRlci5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3V0aWxzL1JlbGF0aXZlQ2xhc3NwYXRoUmVzb3VyY2VMb2FkZXIuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci91dGlscy9SZWxhdGl2ZUNsYXNzcGF0aFJlc291cmNlTG9hZGVyLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NDb250ZW50TW9qby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0NvbnRlbnRNb2pvLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NDb250ZW50TW9qby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jQ29udGVudE1vam8uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jSW5kZXhSZXBvcnQuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY0luZGV4UmVwb3J0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NJbmRleFJlcG9ydC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL3RhZ2RvYy9UYWdkb2NVdGlscy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi90YWdkb2MvVGFnZG9jVXRpbHMuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vdGFnZG9jL1RhZ2RvY1V0aWxzLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9jb21wb25lbnRDbGFzczEyLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MxMi52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3MxMi52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvY29tcG9uZW50Q2xhc3NNYWNyb3MxMS52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzTWFjcm9zMTEudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzTWFjcm9zMTEudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2NvbXBvbmVudENsYXNzTWFjcm9zMTEudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VsZXRzLXRhZ2xpYi52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VsZXRzLXRhZ2xpYi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZWxldHMtdGFnbGliLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlbGV0cy10YWdsaWIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTEudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTIudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9mYWNlcy1jb25maWcxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvZmFjZXMtY29uZmlnMTIudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL2ZhY2VzLWNvbmZpZzEyLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWZhY2VzX2h0bWwudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi9teWZhY2VzX2h0bWwudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL215ZmFjZXNfaHRtbC52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvbXlmYWNlc19odG1sLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzczExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdGFnQ2xhc3MxMi52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzMTIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RhZ0NsYXNzTWFjcm9zMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzc01hY3JvczExLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzc01hY3JvczExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90YWdDbGFzc01hY3JvczExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90b21haGF3azEyLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdG9tYWhhd2sxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdG9tYWhhd2sxMi52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdG9tYWhhd2sxMi52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWQtZmFjZXMtY29uZmlnMTIudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZC1mYWNlcy1jb25maWcxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWQtZmFjZXMtY29uZmlnMTIudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkLWZhY2VzLWNvbmZpZzEyLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZC10bGQxMi52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkLXRsZDEyLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZC10bGQxMi52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWQtdGxkMTIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkQ29tcG9uZW50Q2xhc3MxMi52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkQ29tcG9uZW50Q2xhc3MxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRDb21wb25lbnRDbGFzczEyLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZENvbXBvbmVudENsYXNzMTIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkVGFnQ2xhc3MxMi52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3RyaW5pZGFkVGFnQ2xhc3MxMi52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdHJpbmlkYWRUYWdDbGFzczEyLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi90cmluaWRhZFRhZ0NsYXNzMTIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3ZhbGlkYXRvckNsYXNzMTEudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzczExLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi92YWxpZGF0b3JDbGFzc01hY3JvczExLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYvdmFsaWRhdG9yQ2xhc3NNYWNyb3MxMS52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb21wb25lbnQudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbXBvbmVudC52bQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb21wb25lbnQudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtY29tcG9uZW50LnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtY29udmVydGVyLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWNvbnZlcnRlci52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy1jb252ZXJ0ZXIudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtZmFjZWxldC10YWcudm0gYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWZhY2VsZXQtdGFnLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWZhY2VsZXQtdGFnLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLWZhY2VsZXQtdGFnLnZtCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXRhZy52bSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdGFnLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXRhZy52bQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy10YWcudm0KZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdmFsaWRhdG9yLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy12YWxpZGF0b3Iudm0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2MtdmFsaWRhdG9yLnZtCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXZhbGlkYXRvci52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy13ZWItY29uZmlnLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveGRvYy13ZWItY29uZmlnLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94ZG9jLXdlYi1jb25maWcudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3hkb2Mtd2ViLWNvbmZpZy52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveG1sTWFjcm9zLnZtIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvbWFpbi9yZXNvdXJjZXMvTUVUQS1JTkYveG1sTWFjcm9zLnZtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9tYWluL3Jlc291cmNlcy9NRVRBLUlORi94bWxNYWNyb3Mudm0KcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL21haW4vcmVzb3VyY2VzL01FVEEtSU5GL3htbE1hY3Jvcy52bQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvYXR0cmlidXRlcy5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9hdHRyaWJ1dGVzLmFwdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvYXR0cmlidXRlcy5hcHQKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2F0dHJpYnV0ZXMuYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb21wb25lbnRzLmFwdCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbXBvbmVudHMuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb21wb25lbnRzLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29tcG9uZW50cy5hcHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbmZpZy1maWxlcy5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWctZmlsZXMuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWctZmlsZXMuYXB0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb25maWctZmlsZXMuYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb252ZXJ0ZXJzLmFwdCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2NvbnZlcnRlcnMuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9jb252ZXJ0ZXJzLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvY29udmVydGVycy5hcHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2RvY2xldHMtYW5ub3RhdGlvbnMuYXB0IGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvZG9jbGV0cy1hbm5vdGF0aW9ucy5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2RvY2xldHMtYW5ub3RhdGlvbnMuYXB0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9kb2NsZXRzLWFubm90YXRpb25zLmFwdApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0IGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaG93dG8uYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9ob3d0by5hcHQKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2hvd3RvLmFwdApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0IGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvaW5kZXguYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9pbmRleC5hcHQKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L2luZGV4LmFwdApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvcHJvcGVydGllcy5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9wcm9wZXJ0aWVzLmFwdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvcHJvcGVydGllcy5hcHQKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3Byb3BlcnRpZXMuYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9zZXR1cC5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC9zZXR1cC5hcHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3NldHVwLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvc2V0dXAuYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90YWdzLmFwdCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3RhZ3MuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90YWdzLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdGFncy5hcHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3RlbXBsYXRlcy5hcHQgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90ZW1wbGF0ZXMuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90ZW1wbGF0ZXMuYXB0CnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC90ZW1wbGF0ZXMuYXB0CmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC92YWxpZGF0b3JzLmFwdCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvYXB0L3ZhbGlkYXRvcnMuYXB0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL2FwdC92YWxpZGF0b3JzLmFwdApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvc2l0ZS9hcHQvdmFsaWRhdG9ycy5hcHQKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3NpdGUvc2l0ZS54bWwgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy9zaXRlL3NpdGUueG1sCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0J1aWxkTWV0YURhdGFNb2pvVGVzdC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qb1Rlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qb1Rlc3QuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9CdWlsZE1ldGFEYXRhTW9qb1Rlc3QuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXJUZXN0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0ZsYXR0ZW5lclRlc3QuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9GbGF0dGVuZXJUZXN0LmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvRmxhdHRlbmVyVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHNUZXN0LmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL0lPVXRpbHNUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvSU9VdGlsc1Rlc3QuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9JT1V0aWxzVGVzdC5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qb1Rlc3QuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvTWFrZUNvbXBvbmVudHNNb2pvVGVzdC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL01ha2VDb21wb25lbnRzTW9qb1Rlc3QuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9NYWtlQ29tcG9uZW50c01vam9UZXN0LmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyVGVzdC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL21hdmVuMi9wbHVnaW4vYnVpbGRlci9xZG94L1Fkb3hNb2RlbEJ1aWxkZXJUZXN0LmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9tYXZlbjIvcGx1Z2luL2J1aWxkZXIvcWRveC9RZG94TW9kZWxCdWlsZGVyVGVzdC5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbWF2ZW4yL3BsdWdpbi9idWlsZGVyL3Fkb3gvUWRveE1vZGVsQnVpbGRlclRlc3QuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEJhc2UuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRCYXNlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRCYXNlLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRCYXNlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRDaGlsZC5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudENoaWxkLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRDaGlsZC5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50Q2hpbGQuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEludGVyZmFjZS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbXBvbmVudEludGVyZmFjZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db21wb25lbnRJbnRlcmZhY2UuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L0NvbnZlcnRlcjEuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9Db252ZXJ0ZXIxLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9WYWxpZGF0b3IxLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvVmFsaWRhdG9yMS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvVmFsaWRhdG9yMS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvVmFsaWRhdG9yMS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUtZmxhdC54bWwgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUtZmxhdC54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvY29tcGxleC9nb29kZmlsZS1mbGF0LnhtbApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLWZsYXQueG1sCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2NvbXBsZXgvZ29vZGZpbGUueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLnhtbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLnhtbApyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9jb21wbGV4L2dvb2RmaWxlLnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL2dvb2RmaWxlLWZsYXQueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL2dvb2RmaWxlLWZsYXQueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vZ29vZGZpbGUtZmxhdC54bWwKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS1mbGF0LnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL2dvb2RmaWxlLnhtbCBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi9nb29kZmlsZS54bWwKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEJhc2UuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEJhc2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50QmFzZS5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRCYXNlLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEdlblN1YmNsYXNzLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5TdWJjbGFzcy5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRHZW5UZW1wbGF0ZS5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuVGVtcGxhdGUuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuVGVtcGxhdGUuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50R2VuVGVtcGxhdGUuamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEgYi9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRJbnRlcmZhY2UuamF2YQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50SW50ZXJmYWNlLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudEludGVyZmFjZS5qYXZhCmRpZmYgLS1naXQgYS9tYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRNYW51YWwuamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvZ2VuZXJhdGlvbi90ZXN0cGtnL0NvbXBvbmVudE1hbnVhbC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL2dlbmVyYXRpb24vdGVzdHBrZy9Db21wb25lbnRNYW51YWwuamF2YQpyZW5hbWUgdG8gbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9nZW5lcmF0aW9uL3Rlc3Rwa2cvQ29tcG9uZW50TWFudWFsLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL0Zvby5qYXZhIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvRm9vLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL0Zvby5qYXZhCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9Gb28uamF2YQpkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvZ29vZGZpbGUueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUvZ29vZGZpbGUueG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBtYXZlbjItcGx1Z2lucy9teWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZS9nb29kZmlsZS54bWwKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlL2dvb2RmaWxlLnhtbApkaWZmIC0tZ2l0IGEvbWF2ZW4yLXBsdWdpbnMvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUxNS9Gb28uamF2YSBiL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvRm9vLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvRm9vLmphdmEKcmVuYW1lIHRvIG15ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvRm9vLmphdmEKZGlmZiAtLWdpdCBhL21hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvZ29vZGZpbGUueG1sIGIvbXlmYWNlcy1idWlsZGVyLXBsdWdpbi9zcmMvdGVzdC9yZXNvdXJjZXMvYnVpbGRlci9zaW1wbGUxNS9nb29kZmlsZS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIG1hdmVuMi1wbHVnaW5zL215ZmFjZXMtYnVpbGRlci1wbHVnaW4vc3JjL3Rlc3QvcmVzb3VyY2VzL2J1aWxkZXIvc2ltcGxlMTUvZ29vZGZpbGUueG1sCnJlbmFtZSB0byBteWZhY2VzLWJ1aWxkZXItcGx1Z2luL3NyYy90ZXN0L3Jlc291cmNlcy9idWlsZGVyL3NpbXBsZTE1L2dvb2RmaWxlLnhtbApkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvTElDRU5TRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NDU2OTUuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9MSUNFTlNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDIwMiArMCwwIEBACi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFwYWNoZSBMaWNlbnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBWZXJzaW9uIDIuMCwgSmFudWFyeSAyMDA0Ci0gICAgICAgICAgICAgICAgICAgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvCi0KLSAgIFRFUk1TIEFORCBDT05ESVRJT05TIEZPUiBVU0UsIFJFUFJPRFVDVElPTiwgQU5EIERJU1RSSUJVVElPTgotCi0gICAxLiBEZWZpbml0aW9ucy4KLQotICAgICAgIkxpY2Vuc2UiIHNoYWxsIG1lYW4gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIGZvciB1c2UsIHJlcHJvZHVjdGlvbiwKLSAgICAgIGFuZCBkaXN0cmlidXRpb24gYXMgZGVmaW5lZCBieSBTZWN0aW9ucyAxIHRocm91Z2ggOSBvZiB0aGlzIGRvY3VtZW50LgotCi0gICAgICAiTGljZW5zb3IiIHNoYWxsIG1lYW4gdGhlIGNvcHlyaWdodCBvd25lciBvciBlbnRpdHkgYXV0aG9yaXplZCBieQotICAgICAgdGhlIGNvcHlyaWdodCBvd25lciB0aGF0IGlzIGdyYW50aW5nIHRoZSBMaWNlbnNlLgotCi0gICAgICAiTGVnYWwgRW50aXR5IiBzaGFsbCBtZWFuIHRoZSB1bmlvbiBvZiB0aGUgYWN0aW5nIGVudGl0eSBhbmQgYWxsCi0gICAgICBvdGhlciBlbnRpdGllcyB0aGF0IGNvbnRyb2wsIGFyZSBjb250cm9sbGVkIGJ5LCBvciBhcmUgdW5kZXIgY29tbW9uCi0gICAgICBjb250cm9sIHdpdGggdGhhdCBlbnRpdHkuIEZvciB0aGUgcHVycG9zZXMgb2YgdGhpcyBkZWZpbml0aW9uLAotICAgICAgImNvbnRyb2wiIG1lYW5zIChpKSB0aGUgcG93ZXIsIGRpcmVjdCBvciBpbmRpcmVjdCwgdG8gY2F1c2UgdGhlCi0gICAgICBkaXJlY3Rpb24gb3IgbWFuYWdlbWVudCBvZiBzdWNoIGVudGl0eSwgd2hldGhlciBieSBjb250cmFjdCBvcgotICAgICAgb3RoZXJ3aXNlLCBvciAoaWkpIG93bmVyc2hpcCBvZiBmaWZ0eSBwZXJjZW50ICg1MCUpIG9yIG1vcmUgb2YgdGhlCi0gICAgICBvdXRzdGFuZGluZyBzaGFyZXMsIG9yIChpaWkpIGJlbmVmaWNpYWwgb3duZXJzaGlwIG9mIHN1Y2ggZW50aXR5LgotCi0gICAgICAiWW91IiAob3IgIllvdXIiKSBzaGFsbCBtZWFuIGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5Ci0gICAgICBleGVyY2lzaW5nIHBlcm1pc3Npb25zIGdyYW50ZWQgYnkgdGhpcyBMaWNlbnNlLgotCi0gICAgICAiU291cmNlIiBmb3JtIHNoYWxsIG1lYW4gdGhlIHByZWZlcnJlZCBmb3JtIGZvciBtYWtpbmcgbW9kaWZpY2F0aW9ucywKLSAgICAgIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gc29mdHdhcmUgc291cmNlIGNvZGUsIGRvY3VtZW50YXRpb24KLSAgICAgIHNvdXJjZSwgYW5kIGNvbmZpZ3VyYXRpb24gZmlsZXMuCi0KLSAgICAgICJPYmplY3QiIGZvcm0gc2hhbGwgbWVhbiBhbnkgZm9ybSByZXN1bHRpbmcgZnJvbSBtZWNoYW5pY2FsCi0gICAgICB0cmFuc2Zvcm1hdGlvbiBvciB0cmFuc2xhdGlvbiBvZiBhIFNvdXJjZSBmb3JtLCBpbmNsdWRpbmcgYnV0Ci0gICAgICBub3QgbGltaXRlZCB0byBjb21waWxlZCBvYmplY3QgY29kZSwgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24sCi0gICAgICBhbmQgY29udmVyc2lvbnMgdG8gb3RoZXIgbWVkaWEgdHlwZXMuCi0KLSAgICAgICJXb3JrIiBzaGFsbCBtZWFuIHRoZSB3b3JrIG9mIGF1dGhvcnNoaXAsIHdoZXRoZXIgaW4gU291cmNlIG9yCi0gICAgICBPYmplY3QgZm9ybSwgbWFkZSBhdmFpbGFibGUgdW5kZXIgdGhlIExpY2Vuc2UsIGFzIGluZGljYXRlZCBieSBhCi0gICAgICBjb3B5cmlnaHQgbm90aWNlIHRoYXQgaXMgaW5jbHVkZWQgaW4gb3IgYXR0YWNoZWQgdG8gdGhlIHdvcmsKLSAgICAgIChhbiBleGFtcGxlIGlzIHByb3ZpZGVkIGluIHRoZSBBcHBlbmRpeCBiZWxvdykuCi0KLSAgICAgICJEZXJpdmF0aXZlIFdvcmtzIiBzaGFsbCBtZWFuIGFueSB3b3JrLCB3aGV0aGVyIGluIFNvdXJjZSBvciBPYmplY3QKLSAgICAgIGZvcm0sIHRoYXQgaXMgYmFzZWQgb24gKG9yIGRlcml2ZWQgZnJvbSkgdGhlIFdvcmsgYW5kIGZvciB3aGljaCB0aGUKLSAgICAgIGVkaXRvcmlhbCByZXZpc2lvbnMsIGFubm90YXRpb25zLCBlbGFib3JhdGlvbnMsIG9yIG90aGVyIG1vZGlmaWNhdGlvbnMKLSAgICAgIHJlcHJlc2VudCwgYXMgYSB3aG9sZSwgYW4gb3JpZ2luYWwgd29yayBvZiBhdXRob3JzaGlwLiBGb3IgdGhlIHB1cnBvc2VzCi0gICAgICBvZiB0aGlzIExpY2Vuc2UsIERlcml2YXRpdmUgV29ya3Mgc2hhbGwgbm90IGluY2x1ZGUgd29ya3MgdGhhdCByZW1haW4KLSAgICAgIHNlcGFyYWJsZSBmcm9tLCBvciBtZXJlbHkgbGluayAob3IgYmluZCBieSBuYW1lKSB0byB0aGUgaW50ZXJmYWNlcyBvZiwKLSAgICAgIHRoZSBXb3JrIGFuZCBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YuCi0KLSAgICAgICJDb250cmlidXRpb24iIHNoYWxsIG1lYW4gYW55IHdvcmsgb2YgYXV0aG9yc2hpcCwgaW5jbHVkaW5nCi0gICAgICB0aGUgb3JpZ2luYWwgdmVyc2lvbiBvZiB0aGUgV29yayBhbmQgYW55IG1vZGlmaWNhdGlvbnMgb3IgYWRkaXRpb25zCi0gICAgICB0byB0aGF0IFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mLCB0aGF0IGlzIGludGVudGlvbmFsbHkKLSAgICAgIHN1Ym1pdHRlZCB0byBMaWNlbnNvciBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrIGJ5IHRoZSBjb3B5cmlnaHQgb3duZXIKLSAgICAgIG9yIGJ5IGFuIGluZGl2aWR1YWwgb3IgTGVnYWwgRW50aXR5IGF1dGhvcml6ZWQgdG8gc3VibWl0IG9uIGJlaGFsZiBvZgotICAgICAgdGhlIGNvcHlyaWdodCBvd25lci4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiCi0gICAgICBtZWFucyBhbnkgZm9ybSBvZiBlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50Ci0gICAgICB0byB0aGUgTGljZW5zb3Igb3IgaXRzIHJlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bwotICAgICAgY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljIG1haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywKLSAgICAgIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlIG1hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgdGhlCi0gICAgICBMaWNlbnNvciBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nIHRoZSBXb3JrLCBidXQKLSAgICAgIGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3Igb3RoZXJ3aXNlCi0gICAgICBkZXNpZ25hdGVkIGluIHdyaXRpbmcgYnkgdGhlIGNvcHlyaWdodCBvd25lciBhcyAiTm90IGEgQ29udHJpYnV0aW9uLiIKLQotICAgICAgIkNvbnRyaWJ1dG9yIiBzaGFsbCBtZWFuIExpY2Vuc29yIGFuZCBhbnkgaW5kaXZpZHVhbCBvciBMZWdhbCBFbnRpdHkKLSAgICAgIG9uIGJlaGFsZiBvZiB3aG9tIGEgQ29udHJpYnV0aW9uIGhhcyBiZWVuIHJlY2VpdmVkIGJ5IExpY2Vuc29yIGFuZAotICAgICAgc3Vic2VxdWVudGx5IGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsuCi0KLSAgIDIuIEdyYW50IG9mIENvcHlyaWdodCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCBlYWNoIENvbnRyaWJ1dG9yIGhlcmVieSBncmFudHMgdG8gWW91IGEgcGVycGV0dWFsLAotICAgICAgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUKLSAgICAgIGNvcHlyaWdodCBsaWNlbnNlIHRvIHJlcHJvZHVjZSwgcHJlcGFyZSBEZXJpdmF0aXZlIFdvcmtzIG9mLAotICAgICAgcHVibGljbHkgZGlzcGxheSwgcHVibGljbHkgcGVyZm9ybSwgc3VibGljZW5zZSwgYW5kIGRpc3RyaWJ1dGUgdGhlCi0gICAgICBXb3JrIGFuZCBzdWNoIERlcml2YXRpdmUgV29ya3MgaW4gU291cmNlIG9yIE9iamVjdCBmb3JtLgotCi0gICAzLiBHcmFudCBvZiBQYXRlbnQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YKLSAgICAgIHRoaXMgTGljZW5zZSwgZWFjaCBDb250cmlidXRvciBoZXJlYnkgZ3JhbnRzIHRvIFlvdSBhIHBlcnBldHVhbCwKLSAgICAgIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLCByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlCi0gICAgICAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlIHRvIG1ha2UsIGhhdmUgbWFkZSwKLSAgICAgIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyIHRoZSBXb3JrLAotICAgICAgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKLSAgICAgIGJ5IHN1Y2ggQ29udHJpYnV0b3IgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IHRoZWlyCi0gICAgICBDb250cmlidXRpb24ocykgYWxvbmUgb3IgYnkgY29tYmluYXRpb24gb2YgdGhlaXIgQ29udHJpYnV0aW9uKHMpCi0gICAgICB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggQ29udHJpYnV0aW9uKHMpIHdhcyBzdWJtaXR0ZWQuIElmIFlvdQotICAgICAgaW5zdGl0dXRlIHBhdGVudCBsaXRpZ2F0aW9uIGFnYWluc3QgYW55IGVudGl0eSAoaW5jbHVkaW5nIGEKLSAgICAgIGNyb3NzLWNsYWltIG9yIGNvdW50ZXJjbGFpbSBpbiBhIGxhd3N1aXQpIGFsbGVnaW5nIHRoYXQgdGhlIFdvcmsKLSAgICAgIG9yIGEgQ29udHJpYnV0aW9uIGluY29ycG9yYXRlZCB3aXRoaW4gdGhlIFdvcmsgY29uc3RpdHV0ZXMgZGlyZWN0Ci0gICAgICBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzCi0gICAgICBncmFudGVkIHRvIFlvdSB1bmRlciB0aGlzIExpY2Vuc2UgZm9yIHRoYXQgV29yayBzaGFsbCB0ZXJtaW5hdGUKLSAgICAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KLQotICAgNC4gUmVkaXN0cmlidXRpb24uIFlvdSBtYXkgcmVwcm9kdWNlIGFuZCBkaXN0cmlidXRlIGNvcGllcyBvZiB0aGUKLSAgICAgIFdvcmsgb3IgRGVyaXZhdGl2ZSBXb3JrcyB0aGVyZW9mIGluIGFueSBtZWRpdW0sIHdpdGggb3Igd2l0aG91dAotICAgICAgbW9kaWZpY2F0aW9ucywgYW5kIGluIFNvdXJjZSBvciBPYmplY3QgZm9ybSwgcHJvdmlkZWQgdGhhdCBZb3UKLSAgICAgIG1lZXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgotCi0gICAgICAoYSkgWW91IG11c3QgZ2l2ZSBhbnkgb3RoZXIgcmVjaXBpZW50cyBvZiB0aGUgV29yayBvcgotICAgICAgICAgIERlcml2YXRpdmUgV29ya3MgYSBjb3B5IG9mIHRoaXMgTGljZW5zZTsgYW5kCi0KLSAgICAgIChiKSBZb3UgbXVzdCBjYXVzZSBhbnkgbW9kaWZpZWQgZmlsZXMgdG8gY2FycnkgcHJvbWluZW50IG5vdGljZXMKLSAgICAgICAgICBzdGF0aW5nIHRoYXQgWW91IGNoYW5nZWQgdGhlIGZpbGVzOyBhbmQKLQotICAgICAgKGMpIFlvdSBtdXN0IHJldGFpbiwgaW4gdGhlIFNvdXJjZSBmb3JtIG9mIGFueSBEZXJpdmF0aXZlIFdvcmtzCi0gICAgICAgICAgdGhhdCBZb3UgZGlzdHJpYnV0ZSwgYWxsIGNvcHlyaWdodCwgcGF0ZW50LCB0cmFkZW1hcmssIGFuZAotICAgICAgICAgIGF0dHJpYnV0aW9uIG5vdGljZXMgZnJvbSB0aGUgU291cmNlIGZvcm0gb2YgdGhlIFdvcmssCi0gICAgICAgICAgZXhjbHVkaW5nIHRob3NlIG5vdGljZXMgdGhhdCBkbyBub3QgcGVydGFpbiB0byBhbnkgcGFydCBvZgotICAgICAgICAgIHRoZSBEZXJpdmF0aXZlIFdvcmtzOyBhbmQKLQotICAgICAgKGQpIElmIHRoZSBXb3JrIGluY2x1ZGVzIGEgIk5PVElDRSIgdGV4dCBmaWxlIGFzIHBhcnQgb2YgaXRzCi0gICAgICAgICAgZGlzdHJpYnV0aW9uLCB0aGVuIGFueSBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUgbXVzdAotICAgICAgICAgIGluY2x1ZGUgYSByZWFkYWJsZSBjb3B5IG9mIHRoZSBhdHRyaWJ1dGlvbiBub3RpY2VzIGNvbnRhaW5lZAotICAgICAgICAgIHdpdGhpbiBzdWNoIE5PVElDRSBmaWxlLCBleGNsdWRpbmcgdGhvc2Ugbm90aWNlcyB0aGF0IGRvIG5vdAotICAgICAgICAgIHBlcnRhaW4gdG8gYW55IHBhcnQgb2YgdGhlIERlcml2YXRpdmUgV29ya3MsIGluIGF0IGxlYXN0IG9uZQotICAgICAgICAgIG9mIHRoZSBmb2xsb3dpbmcgcGxhY2VzOiB3aXRoaW4gYSBOT1RJQ0UgdGV4dCBmaWxlIGRpc3RyaWJ1dGVkCi0gICAgICAgICAgYXMgcGFydCBvZiB0aGUgRGVyaXZhdGl2ZSBXb3Jrczsgd2l0aGluIHRoZSBTb3VyY2UgZm9ybSBvcgotICAgICAgICAgIGRvY3VtZW50YXRpb24sIGlmIHByb3ZpZGVkIGFsb25nIHdpdGggdGhlIERlcml2YXRpdmUgV29ya3M7IG9yLAotICAgICAgICAgIHdpdGhpbiBhIGRpc3BsYXkgZ2VuZXJhdGVkIGJ5IHRoZSBEZXJpdmF0aXZlIFdvcmtzLCBpZiBhbmQKLSAgICAgICAgICB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IG5vdGljZXMgbm9ybWFsbHkgYXBwZWFyLiBUaGUgY29udGVudHMKLSAgICAgICAgICBvZiB0aGUgTk9USUNFIGZpbGUgYXJlIGZvciBpbmZvcm1hdGlvbmFsIHB1cnBvc2VzIG9ubHkgYW5kCi0gICAgICAgICAgZG8gbm90IG1vZGlmeSB0aGUgTGljZW5zZS4gWW91IG1heSBhZGQgWW91ciBvd24gYXR0cmlidXRpb24KLSAgICAgICAgICBub3RpY2VzIHdpdGhpbiBEZXJpdmF0aXZlIFdvcmtzIHRoYXQgWW91IGRpc3RyaWJ1dGUsIGFsb25nc2lkZQotICAgICAgICAgIG9yIGFzIGFuIGFkZGVuZHVtIHRvIHRoZSBOT1RJQ0UgdGV4dCBmcm9tIHRoZSBXb3JrLCBwcm92aWRlZAotICAgICAgICAgIHRoYXQgc3VjaCBhZGRpdGlvbmFsIGF0dHJpYnV0aW9uIG5vdGljZXMgY2Fubm90IGJlIGNvbnN0cnVlZAotICAgICAgICAgIGFzIG1vZGlmeWluZyB0aGUgTGljZW5zZS4KLQotICAgICAgWW91IG1heSBhZGQgWW91ciBvd24gY29weXJpZ2h0IHN0YXRlbWVudCB0byBZb3VyIG1vZGlmaWNhdGlvbnMgYW5kCi0gICAgICBtYXkgcHJvdmlkZSBhZGRpdGlvbmFsIG9yIGRpZmZlcmVudCBsaWNlbnNlIHRlcm1zIGFuZCBjb25kaXRpb25zCi0gICAgICBmb3IgdXNlLCByZXByb2R1Y3Rpb24sIG9yIGRpc3RyaWJ1dGlvbiBvZiBZb3VyIG1vZGlmaWNhdGlvbnMsIG9yCi0gICAgICBmb3IgYW55IHN1Y2ggRGVyaXZhdGl2ZSBXb3JrcyBhcyBhIHdob2xlLCBwcm92aWRlZCBZb3VyIHVzZSwKLSAgICAgIHJlcHJvZHVjdGlvbiwgYW5kIGRpc3RyaWJ1dGlvbiBvZiB0aGUgV29yayBvdGhlcndpc2UgY29tcGxpZXMgd2l0aAotICAgICAgdGhlIGNvbmRpdGlvbnMgc3RhdGVkIGluIHRoaXMgTGljZW5zZS4KLQotICAgNS4gU3VibWlzc2lvbiBvZiBDb250cmlidXRpb25zLiBVbmxlc3MgWW91IGV4cGxpY2l0bHkgc3RhdGUgb3RoZXJ3aXNlLAotICAgICAgYW55IENvbnRyaWJ1dGlvbiBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBmb3IgaW5jbHVzaW9uIGluIHRoZSBXb3JrCi0gICAgICBieSBZb3UgdG8gdGhlIExpY2Vuc29yIHNoYWxsIGJlIHVuZGVyIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZgotICAgICAgdGhpcyBMaWNlbnNlLCB3aXRob3V0IGFueSBhZGRpdGlvbmFsIHRlcm1zIG9yIGNvbmRpdGlvbnMuCi0gICAgICBOb3R3aXRoc3RhbmRpbmcgdGhlIGFib3ZlLCBub3RoaW5nIGhlcmVpbiBzaGFsbCBzdXBlcnNlZGUgb3IgbW9kaWZ5Ci0gICAgICB0aGUgdGVybXMgb2YgYW55IHNlcGFyYXRlIGxpY2Vuc2UgYWdyZWVtZW50IHlvdSBtYXkgaGF2ZSBleGVjdXRlZAotICAgICAgd2l0aCBMaWNlbnNvciByZWdhcmRpbmcgc3VjaCBDb250cmlidXRpb25zLgotCi0gICA2LiBUcmFkZW1hcmtzLiBUaGlzIExpY2Vuc2UgZG9lcyBub3QgZ3JhbnQgcGVybWlzc2lvbiB0byB1c2UgdGhlIHRyYWRlCi0gICAgICBuYW1lcywgdHJhZGVtYXJrcywgc2VydmljZSBtYXJrcywgb3IgcHJvZHVjdCBuYW1lcyBvZiB0aGUgTGljZW5zb3IsCi0gICAgICBleGNlcHQgYXMgcmVxdWlyZWQgZm9yIHJlYXNvbmFibGUgYW5kIGN1c3RvbWFyeSB1c2UgaW4gZGVzY3JpYmluZyB0aGUKLSAgICAgIG9yaWdpbiBvZiB0aGUgV29yayBhbmQgcmVwcm9kdWNpbmcgdGhlIGNvbnRlbnQgb2YgdGhlIE5PVElDRSBmaWxlLgotCi0gICA3LiBEaXNjbGFpbWVyIG9mIFdhcnJhbnR5LiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IKLSAgICAgIGFncmVlZCB0byBpbiB3cml0aW5nLCBMaWNlbnNvciBwcm92aWRlcyB0aGUgV29yayAoYW5kIGVhY2gKLSAgICAgIENvbnRyaWJ1dG9yIHByb3ZpZGVzIGl0cyBDb250cmlidXRpb25zKSBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICAgICAgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yCi0gICAgICBpbXBsaWVkLCBpbmNsdWRpbmcsIHdpdGhvdXQgbGltaXRhdGlvbiwgYW55IHdhcnJhbnRpZXMgb3IgY29uZGl0aW9ucwotICAgICAgb2YgVElUTEUsIE5PTi1JTkZSSU5HRU1FTlQsIE1FUkNIQU5UQUJJTElUWSwgb3IgRklUTkVTUyBGT1IgQQotICAgICAgUEFSVElDVUxBUiBQVVJQT1NFLiBZb3UgYXJlIHNvbGVseSByZXNwb25zaWJsZSBmb3IgZGV0ZXJtaW5pbmcgdGhlCi0gICAgICBhcHByb3ByaWF0ZW5lc3Mgb2YgdXNpbmcgb3IgcmVkaXN0cmlidXRpbmcgdGhlIFdvcmsgYW5kIGFzc3VtZSBhbnkKLSAgICAgIHJpc2tzIGFzc29jaWF0ZWQgd2l0aCBZb3VyIGV4ZXJjaXNlIG9mIHBlcm1pc3Npb25zIHVuZGVyIHRoaXMgTGljZW5zZS4KLQotICAgOC4gTGltaXRhdGlvbiBvZiBMaWFiaWxpdHkuIEluIG5vIGV2ZW50IGFuZCB1bmRlciBubyBsZWdhbCB0aGVvcnksCi0gICAgICB3aGV0aGVyIGluIHRvcnQgKGluY2x1ZGluZyBuZWdsaWdlbmNlKSwgY29udHJhY3QsIG9yIG90aGVyd2lzZSwKLSAgICAgIHVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyAoc3VjaCBhcyBkZWxpYmVyYXRlIGFuZCBncm9zc2x5Ci0gICAgICBuZWdsaWdlbnQgYWN0cykgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNoYWxsIGFueSBDb250cmlidXRvciBiZQotICAgICAgbGlhYmxlIHRvIFlvdSBmb3IgZGFtYWdlcywgaW5jbHVkaW5nIGFueSBkaXJlY3QsIGluZGlyZWN0LCBzcGVjaWFsLAotICAgICAgaW5jaWRlbnRhbCwgb3IgY29uc2VxdWVudGlhbCBkYW1hZ2VzIG9mIGFueSBjaGFyYWN0ZXIgYXJpc2luZyBhcyBhCi0gICAgICByZXN1bHQgb2YgdGhpcyBMaWNlbnNlIG9yIG91dCBvZiB0aGUgdXNlIG9yIGluYWJpbGl0eSB0byB1c2UgdGhlCi0gICAgICBXb3JrIChpbmNsdWRpbmcgYnV0IG5vdCBsaW1pdGVkIHRvIGRhbWFnZXMgZm9yIGxvc3Mgb2YgZ29vZHdpbGwsCi0gICAgICB3b3JrIHN0b3BwYWdlLCBjb21wdXRlciBmYWlsdXJlIG9yIG1hbGZ1bmN0aW9uLCBvciBhbnkgYW5kIGFsbAotICAgICAgb3RoZXIgY29tbWVyY2lhbCBkYW1hZ2VzIG9yIGxvc3NlcyksIGV2ZW4gaWYgc3VjaCBDb250cmlidXRvcgotICAgICAgaGFzIGJlZW4gYWR2aXNlZCBvZiB0aGUgcG9zc2liaWxpdHkgb2Ygc3VjaCBkYW1hZ2VzLgotCi0gICA5LiBBY2NlcHRpbmcgV2FycmFudHkgb3IgQWRkaXRpb25hbCBMaWFiaWxpdHkuIFdoaWxlIHJlZGlzdHJpYnV0aW5nCi0gICAgICB0aGUgV29yayBvciBEZXJpdmF0aXZlIFdvcmtzIHRoZXJlb2YsIFlvdSBtYXkgY2hvb3NlIHRvIG9mZmVyLAotICAgICAgYW5kIGNoYXJnZSBhIGZlZSBmb3IsIGFjY2VwdGFuY2Ugb2Ygc3VwcG9ydCwgd2FycmFudHksIGluZGVtbml0eSwKLSAgICAgIG9yIG90aGVyIGxpYWJpbGl0eSBvYmxpZ2F0aW9ucyBhbmQvb3IgcmlnaHRzIGNvbnNpc3RlbnQgd2l0aCB0aGlzCi0gICAgICBMaWNlbnNlLiBIb3dldmVyLCBpbiBhY2NlcHRpbmcgc3VjaCBvYmxpZ2F0aW9ucywgWW91IG1heSBhY3Qgb25seQotICAgICAgb24gWW91ciBvd24gYmVoYWxmIGFuZCBvbiBZb3VyIHNvbGUgcmVzcG9uc2liaWxpdHksIG5vdCBvbiBiZWhhbGYKLSAgICAgIG9mIGFueSBvdGhlciBDb250cmlidXRvciwgYW5kIG9ubHkgaWYgWW91IGFncmVlIHRvIGluZGVtbmlmeSwKLSAgICAgIGRlZmVuZCwgYW5kIGhvbGQgZWFjaCBDb250cmlidXRvciBoYXJtbGVzcyBmb3IgYW55IGxpYWJpbGl0eQotICAgICAgaW5jdXJyZWQgYnksIG9yIGNsYWltcyBhc3NlcnRlZCBhZ2FpbnN0LCBzdWNoIENvbnRyaWJ1dG9yIGJ5IHJlYXNvbgotICAgICAgb2YgeW91ciBhY2NlcHRpbmcgYW55IHN1Y2ggd2FycmFudHkgb3IgYWRkaXRpb25hbCBsaWFiaWxpdHkuCi0KLSAgIEVORCBPRiBURVJNUyBBTkQgQ09ORElUSU9OUwotCi0gICBBUFBFTkRJWDogSG93IHRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmsuCi0KLSAgICAgIFRvIGFwcGx5IHRoZSBBcGFjaGUgTGljZW5zZSB0byB5b3VyIHdvcmssIGF0dGFjaCB0aGUgZm9sbG93aW5nCi0gICAgICBib2lsZXJwbGF0ZSBub3RpY2UsIHdpdGggdGhlIGZpZWxkcyBlbmNsb3NlZCBieSBicmFja2V0cyAiW10iCi0gICAgICByZXBsYWNlZCB3aXRoIHlvdXIgb3duIGlkZW50aWZ5aW5nIGluZm9ybWF0aW9uLiAoRG9uJ3QgaW5jbHVkZQotICAgICAgdGhlIGJyYWNrZXRzISkgIFRoZSB0ZXh0IHNob3VsZCBiZSBlbmNsb3NlZCBpbiB0aGUgYXBwcm9wcmlhdGUKLSAgICAgIGNvbW1lbnQgc3ludGF4IGZvciB0aGUgZmlsZSBmb3JtYXQuIFdlIGFsc28gcmVjb21tZW5kIHRoYXQgYQotICAgICAgZmlsZSBvciBjbGFzcyBuYW1lIGFuZCBkZXNjcmlwdGlvbiBvZiBwdXJwb3NlIGJlIGluY2x1ZGVkIG9uIHRoZQotICAgICAgc2FtZSAicHJpbnRlZCBwYWdlIiBhcyB0aGUgY29weXJpZ2h0IG5vdGljZSBmb3IgZWFzaWVyCi0gICAgICBpZGVudGlmaWNhdGlvbiB3aXRoaW4gdGhpcmQtcGFydHkgYXJjaGl2ZXMuCi0KLSAgIENvcHlyaWdodCBbeXl5eV0gW25hbWUgb2YgY29weXJpZ2h0IG93bmVyXQotCi0gICBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAgIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAgIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotCi0gICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0KLSAgIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAgIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gICBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAgIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAgIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9OT1RJQ0UudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9OT1RJQ0UudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMmI0YTFmLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvTk9USUNFLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDcgKzAsMCBAQAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotPT0gIE5PVElDRSBmaWxlIGNvcnJlc3BvbmRpbmcgdG8gc2VjdGlvbiA0KGQpIG9mIHRoZSBBcGFjaGUgTGljZW5zZSwgICA9PQotPT0gIFZlcnNpb24gMi4wLCBpbiB0aGlzIGNhc2UgZm9yIHRoZSBBcGFjaGUgTXlGYWNlcyBNYXZlbiBQbHVnaW5zICAgICA9PQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IAotVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmUxMzhmMy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIiB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotCi0gIDxwYXJlbnQ+Ci0gICAgPCEtLQotICAgICAgLSBOb3RlIHRoYXQgdGhpcyBwYXJlbnQgZGVjbGFyYXRpb24gaXMgYSBsaXR0bGUgd2VpcmQ7IHRoZSBjaGVja3N0eWxlIHBsdWdpbiBjb25maWd1cmF0aW9uIGluCi0gICAgICAtIHRoZSBwYXJlbnQgcG9tIHJlZmVyZW5jZXMgdGhpcyBhcnRpZmFjdC4gUG9zc2libHkgdGhlIHBhcmVudCBwb20gc2hvdWxkIGJlIHJlZmFjdG9yZWQgaW50bwotICAgICAgLSB0d28gcGFydHM7IHRoZSBiaXRzIHdlIHdhbnQgdG8gaW5oZXJpdCBoZXJlIChkaXN0cmlidXRpb25NYW5hZ2VtZW50LCBtYWlsaW5nTGlzdHMgZXRjKSBhbmQKLSAgICAgIC0gYSBzZXBhcmF0ZSBwb20gdGhhdCByZWZlcmVuY2VzIHRoaXMgYXJ0aWZhY3QuIEhvd2V2ZXIgdGhpcyB3b3JrcyBmb3Igbm93LgotICAgICAgLS0+Ci0gICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPm15ZmFjZXM8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+NjwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHM8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPmNoZWNrc3R5bGUtcnVsZXM8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+amFyPC9wYWNrYWdpbmc+Ci0gIDx2ZXJzaW9uPjItU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPmNoZWNrc3R5bGUtcnVsZXM8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLQotICA8YnVpbGQ+Ci0gICAgPHJlc291cmNlcz4KLSAgICAgIDxyZXNvdXJjZT4KLSAgICAgICAgPGRpcmVjdG9yeT4ke2Jhc2VkaXJ9PC9kaXJlY3Rvcnk+Ci0gICAgICAgIDx0YXJnZXRQYXRoPk1FVEEtSU5GPC90YXJnZXRQYXRoPgotICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgPGluY2x1ZGU+Tk9USUNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5MSUNFTlNFLnR4dDwvaW5jbHVkZT4KLSAgICAgICAgPC9pbmNsdWRlcz4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgICA8cmVzb3VyY2U+Ci0gICAgICAgIDxkaXJlY3Rvcnk+JHtiYXNlZGlyfS9zcmMvbWFpbi9yZXNvdXJjZXM8L2RpcmVjdG9yeT4KLSAgICAgIDwvcmVzb3VyY2U+Ci0gICAgPC9yZXNvdXJjZXM+Ci0gIDwvYnVpbGQ+Ci0KLTwvcHJvamVjdD4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLW1pbmltYWwueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNzQxMDVkLi4wMDAwMDAwCi0tLSBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3MtbWluaW1hbC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiPz4KLTwhLS0gCi0vKgotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZQotICogb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiBkaXN0cmlidXRlZCB3aXRoIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbgotICogcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuICBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZQotICogdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogIkxpY2Vuc2UiKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZQotICogd2l0aCB0aGUgTGljZW5zZS4gIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLAotICogc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4KLSAqICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4gIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlCi0gKiBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCi0gKiB1bmRlciB0aGUgTGljZW5zZS4KLSAqLyAtLT4KLQotPCFET0NUWVBFIG1vZHVsZSBQVUJMSUMKLSAgICAiLS8vUHVwcHkgQ3Jhd2wvL0RURCBDaGVjayBDb25maWd1cmF0aW9uIDEuMS8vRU4iCi0gICAgImh0dHA6Ly93d3cucHVwcHljcmF3bC5jb20vZHRkcy9jb25maWd1cmF0aW9uXzFfMS5kdGQiPgotCi08IS0tCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgbWF2ZW4gY29kaW5nIGNvbnZlbnRpb25zLgotICBUaGlzIGNoZWNrcyB0aGUgYWJzb2x1dGUgbWluaW11bSwgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgZm9yCi0gIHByb2plY3RzIHRoYXQgaGF2ZSByZWFsbHkgdWdseSBleGlzdGluZyBjb2RlIGFuZCBhcmUgbm90IHdvcnRoCi0gIGZpeGluZyB1cC4KLSAgLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8bW9kdWxlIG5hbWU9IlRyZWVXYWxrZXIiPgotCi0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl8/W0EtWl1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iSGVhZGVyIj4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iVXBwZXJFbGwiLz4KLQotICAgIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jaGVja3Mtc3RhbmRhcmQueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OGJkNmIuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdGFuZGFyZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotLyoKLSAqIExpY2Vuc2VkIHRvIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoQVNGKSB1bmRlciBvbmUKLSAqIG9yIG1vcmUgY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZQotICogZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqIHJlZ2FyZGluZyBjb3B5cmlnaHQgb3duZXJzaGlwLiAgVGhlIEFTRiBsaWNlbnNlcyB0aGlzIGZpbGUKLSAqIHRvIHlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUKLSAqICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqIHdpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqIHNvZnR3YXJlIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuCi0gKiAiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkKLSAqIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCBsaW1pdGF0aW9ucwotICogdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8gLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjEvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzEuZHRkIj4KLQotPCEtLQotICBDaGVja3N0eWxlIGNvbmZpZ3VyYXRpb24gdGhhdCBjaGVja3MgdGhlIG1hdmVuIGNvZGluZyBjb252ZW50aW9ucy4KLS0tPgotCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iUGFja2FnZUh0bWwiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIi8gLS0+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IHByb3BlcnR5IGZpbGVzIGNvbnRhaW4gdGhlIHNhbWUga2V5cy4gICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvIC0tPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLTwhLS0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0tLT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSI+Ci0gICAgICAgICAgPCEtLSBOb3JtYWwgcnVsZXMsIGV4Y2VwdCB0aGF0OgotICAgICAgICAgICAgIC0gICogYW55IG5hbWUgY2FuIHN0YXJ0IHdpdGggYW4gdW5kZXJzY29yZS4KLSAgICAgICAgICAgICAtICAqICJsb2ciIGlzIGFsbG93ZWQ7IHRoaXMgaXMgYSB0cmFkaXRpb25hbCBuYW1lIGZvciBsb2cgb2JqZWN0cwotICAgICAgICAgICAgIC0gICogbmFtZXMgZW5kaW5nIHdpdGggIlRocmVhZExvY2FsIiBhcmUgYWxsb3dlZCBzbyB0aGF0IHRocmVhZGxvY2FsIHZhcnMgZG9uJ3QgaGF2ZSB0byBiZQotICAgICAgICAgICAgIC0gICAgYWxsLWNhcHMuIFRoZXkgYXJlIHN0YXRpYyBmaW5hbCwgYnV0IGFyZSBub3QgcmVhbGx5IGNvbnN0YW50cy4gWWVzLCB0eXBlIHByZWZpeGVzCi0gICAgICAgICAgICAgLSAgICBvbiB2YXJpYWJsZSBuYW1lcyBzdWNrcyAoImh1bmdhcmlhbiBub3RhdGlvbiIpIGJ1dCBjaGVja3N0eWxlIGRvZXNuJ3QgYWxsb3cgCi0gICAgICAgICAgICAgLSAgICBuYW1lIHJ1bGVzIHRvIHZhcnkgYnkgdGhlIHR5cGUgb2YgdGhlIGNvbnN0YW50LCBhbmQgbm8gb3RoZXIgYWx0ZXJuYXRpdmUgc2VlbXMKLSAgICAgICAgICAgICAtICAgIGFueSBiZXR0ZXIuCi0gICAgICAgICAgICAgLS0+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgCi0gICAgICAgICAgICAgdmFsdWU9Il5fPygobG9nKXwoW2Etel1bYS16QS1aXSpUaHJlYWRMb2NhbCl8KFtBLVpdW0EtWjAtOV0qKF9bQS1aMC05XSspKikpJCIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTmFtZSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9Il5fP1thLXpdW2EtekEtWjAtOV0qJCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsRmluYWxWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3RhdGljVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVHlwZU5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bQS1aXVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2hlYWRlci5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkhlYWRlciI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaGVhZGVyRmlsZSIgdmFsdWU9IiR7Y2hlY2tzdHlsZS5oZWFkZXIuZmlsZX0iLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfc2l6ZXMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjEyMCIgLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlUGF0dGVybiIgdmFsdWU9IkB2ZXJzaW9ufEBzZWUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMjAwIiAvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOdW1iZXIiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVGFiQ2hhcmFjdGVyIi8+Ci0KLSAgICAgICAgPCEtLSBNb2RpZmllciBDaGVja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRNb2RpZmllciIvIC0tPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfYmxvY2tzLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siLyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOZWVkQnJhY2VzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ij4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ib3B0aW9uIiB2YWx1ZT0ibmwiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmlnaHRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9ImFsb25lIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVxdWFsc0hhc2hDb2RlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRGVmYXVsdENvbWVzTGFzdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1pc3NpbmdTd2l0Y2hEZWZhdWx0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmFsbFRocm91Z2giLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNdWx0aXBsZVZhcmlhYmxlRGVjbGFyYXRpb25zIi8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGNsYXNzIGRlc2lnbiAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRGVzaWduRm9yRXh0ZW5zaW9uIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsQ2xhc3MiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJWaXNpYmlsaXR5TW9kaWZpZXIiLyAtLT4KLQotCi0gICAgICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8gLS0+Ci0gICAgICAgIDwhLS0gTGluZSB3aXRoIFRyYWlsaW5nIFNwYWNlcyAoZGlzYWJsZWQgYXMgaXQncyB0byBub2lzeSkKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gICAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXHMrJCIvPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAgIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0cmljdC54bWwgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY2hlY2tzLXN0cmljdC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZTZhNWUuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNoZWNrcy1zdHJpY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLSAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovIC0tPgotCi08IURPQ1RZUEUgbW9kdWxlIFBVQkxJQwotICAgICItLy9QdXBweSBDcmF3bC8vRFREIENoZWNrIENvbmZpZ3VyYXRpb24gMS4xLy9FTiIKLSAgICAiaHR0cDovL3d3dy5wdXBweWNyYXdsLmNvbS9kdGRzL2NvbmZpZ3VyYXRpb25fMV8xLmR0ZCI+Ci0KLTwhLS0KLSAgQ2hlY2tzdHlsZSBjb25maWd1cmF0aW9uIHRoYXQgY2hlY2tzIHRoZSBtYXZlbiBjb2RpbmcgY29udmVudGlvbnMuCi0gIFRoaXMgZW5mb3JjZXMgc3RyaWN0ZXIgcXVhbGl0eSBjaGVja3MgdGhhbiB0aGUgIm15ZmFjZXMtY2hlY2tzLnhtbCIKLSAgZmlsZSBkb2VzLiBJZGVhbGx5IHRoaXMgd291bGQgYmUgdXNlZCBldmVyeXdoZXJlLCBidXQuLi4KLS0tPgotCi08bW9kdWxlIG5hbWU9IkNoZWNrZXIiPgotCi0gICAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwjUGFja2FnZUh0bWwgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iUGFja2FnZUh0bWwiLyAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iTmV3bGluZUF0RW5kT2ZGaWxlIi8gLS0+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IHByb3BlcnR5IGZpbGVzIGNvbnRhaW4gdGhlIHNhbWUga2V5cy4gICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvIC0tPgotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NUeXBlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvIC0tPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIE5hbWluZyBDb252ZW50aW9ucy4gICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNZW1iZXJOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb25zdGFudE5hbWUiPgotICAgICAgICAgIDwhLS0gTm9ybWFsIHJ1bGVzLCBleGNlcHQgdGhhdDoKLSAgICAgICAgICAgICAtICAqIGFueSBuYW1lIGNhbiBzdGFydCB3aXRoIGFuIHVuZGVyc2NvcmUuCi0gICAgICAgICAgICAgLSAgKiAibG9nIiBpcyBhbGxvd2VkOyB0aGlzIGlzIGEgdHJhZGl0aW9uYWwgbmFtZSBmb3IgbG9nIG9iamVjdHMKLSAgICAgICAgICAgICAtICAqIG5hbWVzIGVuZGluZyB3aXRoICJUaHJlYWRMb2NhbCIgYXJlIGFsbG93ZWQgc28gdGhhdCB0aHJlYWRsb2NhbCB2YXJzIGRvbid0IGhhdmUgdG8gYmUKLSAgICAgICAgICAgICAtICAgIGFsbC1jYXBzLiBUaGV5IGFyZSBzdGF0aWMgZmluYWwsIGJ1dCBhcmUgbm90IHJlYWxseSBjb25zdGFudHMuIFllcywgdHlwZSBwcmVmaXhlcwotICAgICAgICAgICAgIC0gICAgb24gdmFyaWFibGUgbmFtZXMgc3Vja3MgKCJodW5nYXJpYW4gbm90YXRpb24iKSBidXQgY2hlY2tzdHlsZSBkb2Vzbid0IGFsbG93IAotICAgICAgICAgICAgIC0gICAgbmFtZSBydWxlcyB0byB2YXJ5IGJ5IHRoZSB0eXBlIG9mIHRoZSBjb25zdGFudCwgYW5kIG5vIG90aGVyIGFsdGVybmF0aXZlIHNlZW1zCi0gICAgICAgICAgICAgLSAgICBhbnkgYmV0dGVyLgotICAgICAgICAgICAgIC0tPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIAotICAgICAgICAgICAgIHZhbHVlPSJeXz8oKGxvZyl8KFthLXpdW2EtekEtWl0qVGhyZWFkTG9jYWwpfChbQS1aXVtBLVowLTldKihfW0EtWjAtOV0rKSopKSQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJeXz9bYS16XVthLXpBLVowLTldKiQiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJMb2NhbEZpbmFsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN0YXRpY1ZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXl8/W0EtWl1bYS16QS1aMC05XSokIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIEhlYWRlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJIZWFkZXIiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuaGVhZGVyLmZpbGV9Ii8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIGltcG9ydHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19pbXBvcnQuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50SW1wb3J0Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIFNpemUgVmlvbGF0aW9ucy4gICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3NpemVzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxpbmVMZW5ndGgiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtYXgiIHZhbHVlPSIxMjAiIC8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Imlnbm9yZVBhdHRlcm4iIHZhbHVlPSJAdmVyc2lvbnxAc2VlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZExlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjIwMCIgLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTAiIC8+Ci0gICAgICAgIDwvbW9kdWxlPgotCi0KLSAgICAgICAgPCEtLSBDaGVja3MgZm9yIHdoaXRlc3BhY2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfd2hpdGVzcGFjZS5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlRhYkNoYXJhY3RlciIvPgotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9Ik1vZGlmaWVyT3JkZXIiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iUmVkdW5kYW50TW9kaWZpZXIiLyAtLT4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJFbXB0eUJsb2NrIi8gLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxlZnRDdXJseSI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im9wdGlvbiIgdmFsdWU9Im5sIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJhbG9uZSIvPgotICAgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgY29tbW9uIGNvZGluZyBwcm9ibGVtcyAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2NvZGluZy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRvdWJsZUNoZWNrZWRMb2NraW5nIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlTdGF0ZW1lbnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklubmVyQXNzaWdubWVudCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkRlZmF1bHRDb21lc0xhc3QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkZhbGxUaHJvdWdoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfZGVzaWduLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJJbnRlcmZhY2VJc1R5cGUiLyAtLT4KLSAgICAgICAgPCEtLSBtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8gLS0+Ci0KLQotICAgICAgICA8IS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgY2hlY2tzLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkFycmF5VHlwZVN0eWxlIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkZpbmFsUGFyYW1ldGVycyIvIC0tPgotICAgICAgICA8IS0tIExpbmUgd2l0aCBUcmFpbGluZyBTcGFjZXMgKGRpc2FibGVkIGFzIGl0J3MgdG8gbm9pc3kpCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlxzKyQiLz4KLSAgICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgICAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gICAgPC9tb2R1bGU+Ci0KLTwvbW9kdWxlPgpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1lY2xpcHNlLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1jb2Rlc3R5bGUtZWNsaXBzZS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjMWEyNDguLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1lY2xpcHNlLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDI2NCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCIgc3RhbmRhbG9uZT0ibm8iPz4KLTxwcm9maWxlcyB2ZXJzaW9uPSIxMSI+Ci08cHJvZmlsZSBraW5kPSJDb2RlRm9ybWF0dGVyUHJvZmlsZSIgbmFtZT0ibXlmYWNlcyIgdmVyc2lvbj0iMTEiPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50Lmluc2VydF9uZXdfbGluZV9iZWZvcmVfcm9vdF90YWdzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY2FzZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fubm90YXRpb25fZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV9jbG9zaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maWVsZCIgdmFsdWU9IjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fd2hpbGUiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2Vsc2VfaW5faWZfc3RhdGVtZW50IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfZWxzZV9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2VsbGlwc2lzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5zZXJ0X25ld19saW5lX2Zvcl9wYXJhbWV0ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfYnJlYWtzX2NvbXBhcmVfdG9fY2FzZXMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9hdF9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX211bHRpcGxlX2ZpZWxkcyIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfZXhwcmVzc2lvbnNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2NvbmRpdGlvbmFsX2V4cHJlc3Npb24iIHZhbHVlPSI4MCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl93aWxkY2FyZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2ZpbmFsbHlfaW5fdHJ5X3N0YXRlbWVudCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfYmVmb3JlX2NhdGNoX2luX3RyeV9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX3doaWxlIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2FmdGVyX3BhY2thZ2UiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uIiB2YWx1ZT0iMiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9uZXdfY2h1bmsiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfYmluYXJ5X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9wYWNrYWdlIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLnNvdXJjZSIgdmFsdWU9IjEuNSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fZW51bV9jb25zdGFudF9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9hcmd1bWVudHMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfbGluZV9jb21tZW50cyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2VudW1fZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9ibG9jayIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9leHBsaWNpdF9jb25zdHJ1Y3Rvcl9jYWxsIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfaW52b2NhdGlvbl9hcmd1bWVudHMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9tZW1iZXJfdHlwZSIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25fdHlwZV9tZW1iZXJzX29uX2NvbHVtbnMiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zZWxlY3Rvcl9pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N3aXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fY2FzZSIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21tZW50LmluZGVudF9wYXJhbWV0ZXJfZGVzY3JpcHRpb24iIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9hbm5vdGF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3R5cGVfcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5jbGVhcl9ibGFua19saW5lc19pbl9ibG9ja19jb21tZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubGluZVNwbGl0IiB2YWx1ZT0iMTIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9pZiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9icmFja2V0c19pbl9hcnJheV90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fcGFyZW50aGVzaXplZF9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJsYW5rX2xpbmVzX2JlZm9yZV9maXJzdF9jbGFzc19ib2R5X2RlY2xhcmF0aW9uIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRhdGlvbi5zaXplIiB2YWx1ZT0iNCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fZW51bV9jb25zdGFudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmNsYXNzX2luX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2Fzc2lnbm1lbnQiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuY29tcGlsZXIucHJvYmxlbS5hc3NlcnRJZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIudGFidWxhdGlvbi5jaGFyIiB2YWx1ZT0ic3BhY2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wcmVmaXhfb3BlcmF0b3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9zdGF0ZW1lbnRzX2NvbXBhcmVfdG9fYm9keSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX21ldGhvZCIgdmFsdWU9IjEiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuZm9ybWF0X2d1YXJkaWFuX2NsYXVzZV9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fZm9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3BhcmFtZXRlcnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29sb25faW5fbGFiZWxlZF9zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfbWV0aG9kX2JvZHkiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX21ldGhvZF9pbnZvY2F0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNlX2luX2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbm5vdGF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYXRfaW5fYW5ub3RhdGlvbl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX21ldGhvZF9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX3N3aXRjaCIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3Rocm93cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3BhcmVudGhlc2l6ZWRfZXhwcmVzc2lvbl9pbl9yZXR1cm4iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2Fubm90YXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfcXVlc3Rpb25faW5fd2lsZGNhcmQiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb25faW5fdGhyb3ciIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5wcm9ibGVtLmVudW1JZGVudGlmaWVyIiB2YWx1ZT0iZXJyb3IiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X3N3aXRjaHN0YXRlbWVudHNfY29tcGFyZV90b19zd2l0Y2giIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9ibG9jayIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2VsbGlwc2lzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9Im5leHRfbGluZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5jb21wYWN0X2Vsc2VfaWYiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2tldF9pbl9hcnJheV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuaW5kZW50X3Jvb3RfdGFncyIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9lbnVtX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2V4cGxpY2l0Y29uc3RydWN0b3JjYWxsX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fc3dpdGNoIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb21tYV9pbl9zdXBlcmludGVyZmFjZXMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tZXRob2RfZGVjbGFyYXRpb25fcGFyYW1ldGVycyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnRhYnVsYXRpb24uc2l6ZSIgdmFsdWU9IjQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hZnRlcl9vcGVuaW5nX2JyYWNlX2luX2FycmF5X2luaXRpYWxpemVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2JyYWNlX2luX2Jsb2NrIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2VudW1fY29uc3RhbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9pZiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9jb25zdHJ1Y3Rvcl9kZWNsYXJhdGlvbl90aHJvd3MiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuY2xlYXJfYmxhbmtfbGluZXNfaW5famF2YWRvY19jb21tZW50IiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl90aHJvd3NfY2xhdXNlX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Fzc2lnbm1lbnRfb3BlcmF0b3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9hc3NpZ25tZW50X29wZXJhdG9yIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9lbXB0eV9saW5lcyIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX3N5bmNocm9uaXplZCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2Nsb3NpbmdfcGFyZW5faW5fY2FzdCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbWV0aG9kX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2Jsb2NrX2luX2Nhc2UiIHZhbHVlPSJuZXh0X2xpbmUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubnVtYmVyX29mX2VtcHR5X2xpbmVzX3RvX3ByZXNlcnZlIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jbG9zaW5nX3BhcmVuX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX2JyYWNrZXRfaW5fYXJyYXlfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfYW5kX2luX3R5cGVfcGFyYW1ldGVyIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfYXJndW1lbnRzX2luX3F1YWxpZmllZF9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmNvbXBpbGVyLmNvbXBsaWFuY2UiIHZhbHVlPSIxLjUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29udGludWF0aW9uX2luZGVudGF0aW9uX2Zvcl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9IjIiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JldHdlZW5fZW1wdHlfYnJhY2tldHNfaW5fYXJyYXlfYWxsb2NhdGlvbl9leHByZXNzaW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2F0X2luX2Fubm90YXRpb25fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2FyZ3VtZW50c19pbl9hbGxvY2F0aW9uX2V4cHJlc3Npb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19wYXJlbl9pbl9jYXN0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3VuYXJ5X29wZXJhdG9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl9wYXJhbWV0ZXJpemVkX3R5cGVfcmVmZXJlbmNlIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYnJhY2VfaW5fYW5vbnltb3VzX3R5cGVfZGVjbGFyYXRpb24iIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIua2VlcF9lbXB0eV9hcnJheV9pbml0aWFsaXplcl9vbl9vbmVfbGluZSIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9pbl9lbXB0eV9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfaW1wbGVfaWZfb25fb25lX2xpbmUiIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jbG9zaW5nX2FuZ2xlX2JyYWNrZXRfaW5fdHlwZV9wYXJhbWV0ZXJzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9uZXdfbGluZV9hdF9lbmRfb2ZfZmlsZV9pZl9taXNzaW5nIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9mb3IiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9sYWJlbGVkX3N0YXRlbWVudCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9zdXBlcmludGVyZmFjZXNfaW5fdHlwZV9kZWNsYXJhdGlvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29tbWFfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9iaW5hcnlfZXhwcmVzc2lvbiIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl93aGlsZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIucHV0X2VtcHR5X3N0YXRlbWVudF9vbl9uZXdfbGluZSIgdmFsdWU9InRydWUiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZXR3ZWVuX2VtcHR5X3BhcmVuc19pbl9tZXRob2RfaW52b2NhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2JlZm9yZV93aGlsZV9pbl9kb19zdGF0ZW1lbnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9hcmd1bWVudHNfaW5fZW51bV9jb25zdGFudCIgdmFsdWU9IjE2Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2phdmFkb2NfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQubGluZV9sZW5ndGgiIHZhbHVlPSIxMjAiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmV0d2Vlbl9pbXBvcnRfZ3JvdXBzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX2VudW1fY29uc3RhbnRfYXJndW1lbnRzIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX3NlbWljb2xvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYnJhY2VfcG9zaXRpb25fZm9yX2NvbnN0cnVjdG9yX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLm51bWJlcl9vZl9ibGFua19saW5lc19hdF9iZWdpbm5pbmdfb2ZfbWV0aG9kX2JvZHkiIHZhbHVlPSIwIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fY29uZGl0aW9uYWwiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fdHlwZV9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9hbm5vdGF0aW9uX3R5cGVfbWVtYmVyX2RlY2xhcmF0aW9uIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci53cmFwX2JlZm9yZV9iaW5hcnlfb3BlcmF0b3IiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fZGVjbGFyYXRpb25faGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19iZXR3ZWVuX3R5cGVfZGVjbGFyYXRpb25zIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fc3luY2hyb25pemVkIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3RhdGVtZW50c19jb21wYXJlX3RvX2Jsb2NrIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX3N1cGVyaW50ZXJmYWNlc19pbl9lbnVtX2RlY2xhcmF0aW9uIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9xdWVzdGlvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYWxpZ25tZW50X2Zvcl9jb21wYWN0X2lmIiB2YWx1ZT0iMTYiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2Zvcl9pbml0cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbmRlbnRfc3dpdGNoc3RhdGVtZW50c19jb21wYXJlX3RvX2Nhc2VzIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb2xvbl9pbl9kZWZhdWx0IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2FuZF9pbl90eXBlX3BhcmFtZXRlciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9wYXJlbnNfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9hc3NlcnQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuYmxhbmtfbGluZXNfYmVmb3JlX2ltcG9ydHMiIHZhbHVlPSIxIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmNvbW1lbnQuZm9ybWF0X2h0bWwiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfdGhyb3dzX2NsYXVzZV9pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX3BhcmFtZXRlcnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFja2V0X2luX2FycmF5X2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X25ld19saW5lX2luX2VtcHR5X2Fub255bW91c190eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9jb2xvbl9pbl9jb25kaXRpb25hbCIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfb3BlbmluZ19hbmdsZV9icmFja2V0X2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9mb3IiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfcG9zdGZpeF9vcGVyYXRvciIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfc291cmNlX2NvZGUiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zeW5jaHJvbml6ZWQiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX2FsbG9jYXRpb25fZXhwcmVzc2lvbiIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fY29uc3RydWN0b3JfZGVjbGFyYXRpb25fdGhyb3dzIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmFsaWdubWVudF9mb3JfcGFyYW1ldGVyc19pbl9tZXRob2RfZGVjbGFyYXRpb24iIHZhbHVlPSIxNiIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfYnJhY2VfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5jb21waWxlci5jb2RlZ2VuLnRhcmdldFBsYXRmb3JtIiB2YWx1ZT0iMS41Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLnVzZV90YWJzX29ubHlfZm9yX2xlYWRpbmdfaW5kZW50YXRpb25zIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfaGVhZGVyIiB2YWx1ZT0iZmFsc2UiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuY29tbWVudC5mb3JtYXRfYmxvY2tfY29tbWVudHMiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9lbnVtX2NvbnN0YW50IiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5hbGlnbm1lbnRfZm9yX2VudW1fY29uc3RhbnRzIiB2YWx1ZT0iMCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfbmV3X2xpbmVfaW5fZW1wdHlfYmxvY2siIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5kZW50X2JvZHlfZGVjbGFyYXRpb25zX2NvbXBhcmVfdG9fYW5ub3RhdGlvbl9kZWNsYXJhdGlvbl9oZWFkZXIiIHZhbHVlPSJ0cnVlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9wYXJlbnRoZXNpemVkX2V4cHJlc3Npb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY2xvc2luZ19wYXJlbl9pbl9jYXRjaCIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9tdWx0aXBsZV9sb2NhbF9kZWNsYXJhdGlvbnMiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19wYXJlbl9pbl9zd2l0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9jb21tYV9pbl9mb3JfaW5jcmVtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX29wZW5pbmdfcGFyZW5faW5fbWV0aG9kX2ludm9jYXRpb24iIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfY29sb25faW5fYXNzZXJ0IiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmJyYWNlX3Bvc2l0aW9uX2Zvcl90eXBlX2RlY2xhcmF0aW9uIiB2YWx1ZT0ibmV4dF9saW5lIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9iZWZvcmVfb3BlbmluZ19icmFjZV9pbl9hcnJheV9pbml0aWFsaXplciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmV0d2Vlbl9lbXB0eV9icmFjZXNfaW5fYXJyYXlfaW5pdGlhbGl6ZXIiIHZhbHVlPSJkbyBub3QgaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluc2VydF9zcGFjZV9hZnRlcl9vcGVuaW5nX3BhcmVuX2luX21ldGhvZF9kZWNsYXJhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9zZW1pY29sb25faW5fZm9yIiB2YWx1ZT0iZG8gbm90IGluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfcGFyZW5faW5fY2F0Y2giIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2JlZm9yZV9vcGVuaW5nX2FuZ2xlX2JyYWNrZXRfaW5fcGFyYW1ldGVyaXplZF90eXBlX3JlZmVyZW5jZSIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX211bHRpcGxlX2ZpZWxkX2RlY2xhcmF0aW9ucyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX2Nsb3NpbmdfcGFyZW5faW5fYW5ub3RhdGlvbiIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX3BhcmFtZXRlcml6ZWRfdHlwZV9yZWZlcmVuY2UiIHZhbHVlPSJpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIuaW5zZXJ0X3NwYWNlX2FmdGVyX2NvbW1hX2luX21ldGhvZF9pbnZvY2F0aW9uX2FyZ3VtZW50cyIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5ibGFua19saW5lc19hZnRlcl9pbXBvcnRzIiB2YWx1ZT0iMSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfY29tbWFfaW5fbXVsdGlwbGVfbG9jYWxfZGVjbGFyYXRpb25zIiB2YWx1ZT0iaW5zZXJ0Ii8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmluZGVudF9ib2R5X2RlY2xhcmF0aW9uc19jb21wYXJlX3RvX2VudW1fY29uc3RhbnRfaGVhZGVyIiB2YWx1ZT0idHJ1ZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYWZ0ZXJfc2VtaWNvbG9uX2luX2ZvciIgdmFsdWU9Imluc2VydCIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5uZXZlcl9pbmRlbnRfbGluZV9jb21tZW50c19vbl9maXJzdF9jb2x1bW4iIHZhbHVlPSJmYWxzZSIvPgotPHNldHRpbmcgaWQ9Im9yZy5lY2xpcHNlLmpkdC5jb3JlLmZvcm1hdHRlci5pbnNlcnRfc3BhY2VfYmVmb3JlX29wZW5pbmdfYW5nbGVfYnJhY2tldF9pbl90eXBlX2FyZ3VtZW50cyIgdmFsdWU9ImRvIG5vdCBpbnNlcnQiLz4KLTxzZXR0aW5nIGlkPSJvcmcuZWNsaXBzZS5qZHQuY29yZS5mb3JtYXR0ZXIubmV2ZXJfaW5kZW50X2Jsb2NrX2NvbW1lbnRzX29uX2ZpcnN0X2NvbHVtbiIgdmFsdWU9ImZhbHNlIi8+Ci08c2V0dGluZyBpZD0ib3JnLmVjbGlwc2UuamR0LmNvcmUuZm9ybWF0dGVyLmtlZXBfdGhlbl9zdGF0ZW1lbnRfb25fc2FtZV9saW5lIiB2YWx1ZT0iZmFsc2UiLz4KLTwvcHJvZmlsZT4KLTwvcHJvZmlsZXM+CmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWlkZWEueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWNvZGVzdHlsZS1pZGVhLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI5YWViMi4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtY29kZXN0eWxlLWlkZWEueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxjb2RlX3NjaGVtZSBuYW1lPSJteWZhY2VzLWlkZWEtY29kZXN0eWxlLnR4dCI+Ci0gIDxvcHRpb24gbmFtZT0iQlJBQ0VfU1RZTEUiIHZhbHVlPSIyIiAvPgotICA8b3B0aW9uIG5hbWU9IkNMQVNTX0JSQUNFX1NUWUxFIiB2YWx1ZT0iMiIgLz4KLSAgPG9wdGlvbiBuYW1lPSJNRVRIT0RfQlJBQ0VfU1RZTEUiIHZhbHVlPSIyIiAvPgotICA8b3B0aW9uIG5hbWU9IkVMU0VfT05fTkVXX0xJTkUiIHZhbHVlPSJ0cnVlIiAvPgotICA8b3B0aW9uIG5hbWU9IldISUxFX09OX05FV19MSU5FIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJDQVRDSF9PTl9ORVdfTElORSIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRklOQUxMWV9PTl9ORVdfTElORSIgdmFsdWU9InRydWUiIC8+Ci0gIDxvcHRpb24gbmFtZT0iQUxJR05fTVVMVElMSU5FX1BBUkFNRVRFUlNfSU5fQ0FMTFMiIHZhbHVlPSJ0cnVlIiAvPgotICA8b3B0aW9uIG5hbWU9IkFMSUdOX01VTFRJTElORV9GT1IiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPG9wdGlvbiBuYW1lPSJJRl9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRE9XSElMRV9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iV0hJTEVfQlJBQ0VfRk9SQ0UiIHZhbHVlPSIzIiAvPgotICA8b3B0aW9uIG5hbWU9IkZPUl9CUkFDRV9GT1JDRSIgdmFsdWU9IjMiIC8+Ci0gIDxvcHRpb24gbmFtZT0iRU5BQkxFX0pBVkFET0NfRk9STUFUVElORyIgdmFsdWU9ImZhbHNlIiAvPgotICA8b3B0aW9uIG5hbWU9IkpEX1BfQVRfRU1QVFlfTElORVMiIHZhbHVlPSJmYWxzZSIgLz4KLSAgPEFERElUSU9OQUxfSU5ERU5UX09QVElPTlMgZmlsZVR5cGU9ImpzIj4KLSAgICA8b3B0aW9uIG5hbWU9IklOREVOVF9TSVpFIiB2YWx1ZT0iNCIgLz4KLSAgICA8b3B0aW9uIG5hbWU9IkNPTlRJTlVBVElPTl9JTkRFTlRfU0laRSIgdmFsdWU9IjgiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJUQUJfU0laRSIgdmFsdWU9IjQiIC8+Ci0gICAgPG9wdGlvbiBuYW1lPSJVU0VfVEFCX0NIQVJBQ1RFUiIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iU01BUlRfVEFCUyIgdmFsdWU9ImZhbHNlIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTEFCRUxfSU5ERU5UX1NJWkUiIHZhbHVlPSIwIiAvPgotICAgIDxvcHRpb24gbmFtZT0iTEFCRUxfSU5ERU5UX0FCU09MVVRFIiB2YWx1ZT0iZmFsc2UiIC8+Ci0gIDwvQURESVRJT05BTF9JTkRFTlRfT1BUSU9OUz4KLTwvY29kZV9zY2hlbWU+Ci0KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItcmVnZXhwLnR4dCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL2RlZmF1bHQvbXlmYWNlcy1oZWFkZXItcmVnZXhwLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODk4ZTUxYy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXJlZ2V4cC50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1eL1wqJAotXiBcKiArTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIFwoQVNGXCkgdW5kZXIgb25lJAotXiBcKiArb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlJAotXiBcKiArZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24kCi1eIFwqICtyZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlJAotXiBcKiArdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgXCh0aGUkCi1eIFwqICsiTGljZW5zZSJcKTsgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSQKLV4gXCogK3dpdGggdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkCi1eIFwqICokCi1eIFwqICtodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkCi1eIFwqICokCi1eIFwqICtVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsJAotXiBcKiArc29mdHdhcmUgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4kCi1eIFwqICsiQVMgSVMiIEJBU0lTLCBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkkCi1eIFwqICtLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUkCi1eIFwqICtzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zJAotXiBcKiArdW5kZXIgdGhlIExpY2Vuc2UuJAotXiBcKi8kCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLXNwYWNlcy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNGYxZDYuLjAwMDAwMDAKLS0tIGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci1zcGFjZXMudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqICBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiAgb3IgbW9yZSBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlCi0gKiAgZGlzdHJpYnV0ZWQgd2l0aCB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24KLSAqICByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiAgdG8geW91IHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZQotICogICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2UKLSAqICB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKiAKLSAqICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqIAotICogIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywKLSAqICBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWQotICogIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQotICogIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqICB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwpkaWZmIC0tZ2l0IGEvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvZGVmYXVsdC9teWZhY2VzLWhlYWRlci50eHQgYi9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDQyZjNjZS4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy9kZWZhdWx0L215ZmFjZXMtaGVhZGVyLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLS8qCi0gKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKEFTRikgdW5kZXIgb25lCi0gKiBvciBtb3JlIGNvbnRyaWJ1dG9yIGxpY2Vuc2UgYWdyZWVtZW50cy4gIFNlZSB0aGUgTk9USUNFIGZpbGUKLSAqIGRpc3RyaWJ1dGVkIHdpdGggdGhpcyB3b3JrIGZvciBhZGRpdGlvbmFsIGluZm9ybWF0aW9uCi0gKiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4gIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlCi0gKiB0byB5b3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlCi0gKiAiTGljZW5zZSIpOyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlCi0gKiB3aXRoIHRoZSBMaWNlbnNlLiAgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsCi0gKiBzb2Z0d2FyZSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbgotICogIkFTIElTIiBCQVNJUywgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZCi0gKiBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiAgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUKLSAqIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQgbGltaXRhdGlvbnMKLSAqIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1oZWFkZXIudHh0IGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUtaGVhZGVyLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBhMjEwMy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1oZWFkZXIudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotXnBhY2thZ2UKLV4kCi1eL1wqJAotXiBcKiBMaWNlbnNlZCB0byB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gXChBU0ZcKSB1bmRlciBvbmUgb3IgbW9yZSQKLV4gXCogY29udHJpYnV0b3IgbGljZW5zZSBhZ3JlZW1lbnRzLiAgU2VlIHRoZSBOT1RJQ0UgZmlsZSBkaXN0cmlidXRlZCB3aXRoJAotXiBcKiB0aGlzIHdvcmsgZm9yIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gcmVnYXJkaW5nIGNvcHlyaWdodCBvd25lcnNoaXAuJAotXiBcKiBUaGUgQVNGIGxpY2Vuc2VzIHRoaXMgZmlsZSB0byBZb3UgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCQKLV4gXCogXCh0aGUgIkxpY2Vuc2UiXCk7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCQKLV4gXCogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQkCi1eIFwqJAotXiBcKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCQKLV4gXCokCi1eIFwqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUkCi1eIFwqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsJAotXiBcKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4kCi1eIFwqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQkCi1eIFwqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLiQKLV4gXCovJAotXiQKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1zdHJpY3QueG1sIGIvb3RoZXIvY2hlY2tzdHlsZS1ydWxlcy9zcmMvbWFpbi9yZXNvdXJjZXMvdG9iYWdvL2NoZWNrc3R5bGUtc3RyaWN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFhNjcxYy4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS1zdHJpY3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjQ1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPCEtLQotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjIvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzIuZHRkIj4KLQotPCEtLQotCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgc3VuIGNvZGluZyBjb252ZW50aW9ucyBmcm9tOgotCi0gICAgLSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgU3VuIENvZGUgQ29udmVudGlvbnMgYXQgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252LwotCi0gICAgLSB0aGUgSmF2YWRvYyBndWlkZWxpbmVzIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgSkRLIEFwaSBkb2N1bWVudGF0aW9uIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9kb2NzL2FwaS9pbmRleC5odG1sCi0KLSAgICAtIHNvbWUgYmVzdCBwcmFjdGljZXMKLQotICBDaGVja3N0eWxlIGlzIHZlcnkgY29uZmlndXJhYmxlLiBCZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gYXQKLSAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KLQotICBNb3N0IENoZWNrcyBhcmUgY29uZmlndXJhYmxlLCBiZSBzdXJlIHRvIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgVG8gY29tcGxldGVseSBkaXNhYmxlIGEgY2hlY2ssIGp1c3QgY29tbWVudCBpdCBvdXQgb3IgZGVsZXRlIGl0IGZyb20gdGhlIGZpbGUuCi0KLSAgRmluYWxseSwgaXQgaXMgd29ydGggcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLQotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgPCEtLSBDaGVja3MgdGhhdCBhIHBhY2thZ2UuaHRtbCBmaWxlIGV4aXN0cyBmb3IgZWFjaCBwYWNrYWdlLiAgICAgLS0+Ci0gIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfamF2YWRvYy5odG1sI1BhY2thZ2VIdG1sIC0tPgotCi0gIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwjTmV3bGluZUF0RW5kT2ZGaWxlIC0tPgotICA8bW9kdWxlIG5hbWU9Ik5ld2xpbmVBdEVuZE9mRmlsZSIvPgotCi0gIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNUcmFuc2xhdGlvbiAtLT4KLSAgPG1vZHVsZSBuYW1lPSJUcmFuc2xhdGlvbiIvPgotCi0KLSAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgIDxwcm9wZXJ0eSBuYW1lPSJjYWNoZUZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuY2FjaGUuZmlsZX0iLz4KLSAgICA8cHJvcGVydHkgbmFtZT0iY2hhcnNldCIgdmFsdWU9IlVURi04Ii8+Ci0gICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iMiIvPgotCi0gICAgPCEtLSBDaGVja3MgZm9yIEphdmFkb2MgY29tbWVudHMuICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19qYXZhZG9jLmh0bWwKLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jTWV0aG9kIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSmF2YWRvY1R5cGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVmFyaWFibGUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jU3R5bGUiLz4gICAtLT4KLQotCi0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19uYW1pbmcuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkNvbnN0YW50TmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxWYXJpYWJsZU5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1lbWJlck5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhY2thZ2VOYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJQYXJhbWV0ZXJOYW1lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlR5cGVOYW1lIi8+Ci0KLQotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgSGVhZGVycyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAgIC0tPgotICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJIZWFkZXIiPiAtLT4KLSAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KLSAgICA8IS0tIHRvIGhhdmUgYWNjZXNzIHRvIEFOVCBwcm9wZXJ0aWVzLiBJbiB0aGlzIGNhc2UgaXQgdXNlcyAtLT4KLSAgICA8IS0tIHRoZSAke2Jhc2VkaXJ9IHByb3BlcnR5IHRvIGFsbG93IENoZWNrc3R5bGUgdG8gYmUgcnVuICAtLT4KLSAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KLSAgICA8IS0tIGV4cGFuc2lvbiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWcuaHRtbCNwcm9wZXJ0aWVzICAgICAgICAtLT4KLSAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tICAgICBuYW1lPSJoZWFkZXJGaWxlIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tICAgICB2YWx1ZT0iJHtiYXNlZGlyfS9qYXZhLmhlYWRlciIvPiAtLT4KLSAgICA8IS0tIEZvbGxvd2luZyBpbnRlcnByZXRzIHRoZSBoZWFkZXIgZmlsZSBhcyByZWd1bGFyIGV4cHJlc3Npb25zLiAtLT4KLSAgICA8IS0tIDwvbW9kdWxlPiAtLT4KLQotICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwSGVhZGVyIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJoZWFkZXJGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmhlYWRlci5maWxlfSIvPgotICAgICAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIiIHZhbHVlPSJecGFja2FnZSBcbl4kXG4vXCokXG5eIFwqIENvcHlyaWdodCBcZFxkXGRcZC1cZFxkXGRcZCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uJFxuXiBcKiRcbl4gXCogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBcKHRoZSAmcXVvdDtMaWNlbnNlJnF1b3Q7XClcOyRcbl4gXCogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiRcbl4gXCogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JFxuXiBcKiRcbl4gXCogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkXG5eIFwqJFxuXiBcKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJFxuXiBcKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywkXG5eIFwqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiRcbl4gXCogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCRcbl4gXCogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJFxuXiBcKi8kXG5eJCIvPi0tPgotICAgIDwvbW9kdWxlPgotCi0KLQotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfaW1wb3J0Lmh0bWwgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJBdm9pZFN0YXJJbXBvcnQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4gPCEtLSBkZWZhdWx0cyB0byBzdW4uKiBwYWNrYWdlcyAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudEltcG9ydCIvPgotICAgIDxtb2R1bGUgbmFtZT0iVW51c2VkSW1wb3J0cyIvPgotCi0KLSAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19zaXplcy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iRmlsZUxlbmd0aCIvPgotICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTIwIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJNZXRob2RMZW5ndGgiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck51bWJlciIvPgotCi0KLSAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX3doaXRlc3BhY2UuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkVtcHR5Rm9ySXRlcmF0b3JQYWQiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VBZnRlciIvPgotICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQmVmb3JlIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmVuUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJUeXBlY2FzdFBhcmVuUGFkIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJUYWJDaGFyYWN0ZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBZnRlciIvPgotICAgIDwhLS08bW9kdWxlIG5hbWU9IldoaXRlc3BhY2VBcm91bmQiLz4tLT4KLQotICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19tb2RpZmllcnMuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9Ik1vZGlmaWVyT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBibG9ja3MuIFlvdSBrbm93LCB0aG9zZSB7fSdzICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19ibG9ja3MuaHRtbCAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJFbXB0eUJsb2NrIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJMZWZ0Q3VybHkiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik5lZWRCcmFjZXMiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KLQotCi0gICAgPCEtLSBDaGVja3MgZm9yIGNvbW1vbiBjb2RpbmcgcHJvYmxlbXMgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2NvZGluZy5odG1sIC0tPgotICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KLSAgICA8bW9kdWxlIG5hbWU9IkNvdmFyaWFudEVxdWFscyIvPgotICAgIDxtb2R1bGUgbmFtZT0iRG91YmxlQ2hlY2tlZExvY2tpbmciLz4gICAgPCEtLSBNWSBGQVZPVVJJVEUgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJFbXB0eVN0YXRlbWVudCIvPgotICAgIDxtb2R1bGUgbmFtZT0iRXF1YWxzSGFzaENvZGUiLz4KLSAgICA8bW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJpZ25vcmVTZXR0ZXIiIHZhbHVlPSJ0cnVlIiAvPgotICAgICAgPHByb3BlcnR5IG5hbWU9IiBpZ25vcmVDb25zdHJ1Y3RvclBhcmFtZXRlciIgdmFsdWU9InRydWUiIC8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0iY2xhc3NlcyIgdmFsdWU9ImphdmEubGFuZy5Cb29sZWFuLCBqYXZhLmxhbmcuU3RyaW5nIi8+Ci0gICAgPC9tb2R1bGU+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbm5lckFzc2lnbm1lbnQiLz4KLSAgICA8IS0tIDxtb2R1bGUgbmFtZT0iTWFnaWNOdW1iZXIiLz4gLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgIDxtb2R1bGUgbmFtZT0iUmVkdW5kYW50VGhyb3dzIj4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJhbGxvd1VuY2hlY2tlZCIgdmFsdWU9InRydWUiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8bW9kdWxlIG5hbWU9IlN0cmluZ0xpdGVyYWxFcXVhbGl0eSIvPgotICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuRXhwcmVzc2lvbiIvPgotICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdXBlckNsb25lIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJTdXBlckZpbmFsaXplIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVGhyb3dzIi8+Ci0gICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlRGVjbGFyYXRpb24iLz4KLSAgICA8bW9kdWxlIG5hbWU9IkRlY2xhcmF0aW9uT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlckFzc2lnbm1lbnQiLz4KLSAgICA8bW9kdWxlIG5hbWU9IkRlY2xhcmF0aW9uT3JkZXIiLz4KLSAgICA8bW9kdWxlIG5hbWU9Ik11bHRpcGxlVmFyaWFibGVEZWNsYXJhdGlvbnMiLz4KLSAgICA8bW9kdWxlIG5hbWU9IlVubmVjZXNzYXJ5UGFyZW50aGVzZXMiLz4KLQotICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19kZXNpZ24uaHRtbCAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJEZXNpZ25Gb3JFeHRlbnNpb24iLyAtLT4KLSAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgPCEtLSBtb2R1bGUgbmFtZT0iSGlkZVV0aWxpdHlDbGFzc0NvbnN0cnVjdG9yIi8gLS0+Ci0KLSAgICA8bW9kdWxlIG5hbWU9IkludGVyZmFjZUlzVHlwZSIvPgotICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8+Ci0KLQotICAgIDwhLS0gTWlzY2VsbGFuZW91cyBvdGhlciBjaGVja3MuICAgICAgICAgICAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICA8IS0tPG1vZHVsZSBuYW1lPSJGaW5hbFBhcmFtZXRlcnMiLz4gLS0+Ci0gICAgPCEtLSBMaW5lIHdpdGggVHJhaWxpbmcgU3BhY2VzIChkaXNhYmxlZCBhcyBpdCdzIHRvIG5vaXN5KQotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iXHMrJCIvPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iTGluZSBoYXMgdHJhaWxpbmcgc3BhY2VzLiIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgLS0+Ci0KLSAgICA8IS0tIExldCB0b2RvIHBsdWdpbiBoYW5kbGUgdGhpcy4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUb2RvQ29tbWVudCIvPgotICAgICAgICAtLT4KLQotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IigocHVibGljKXwocHJvdGVjdGVkKSlccyt2b2lkXHMrZmluYWxpemVcKFxzKlwpIi8+Ci0gICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgdmFsdWU9IkF2b2lkIGZpbmFsaXplcnMiLz4KLSAgICA8L21vZHVsZT4KLSAgICA8IS0tIE5vIGRpcmVjdCBwcmludGluZyB0byBTeXN0ZW0ub3V0IG9yIFN5c3RlbS5lcnIgLS0+Ci0KLQotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IlN5c3RlbVwuKG91dHxlcnIpXC4iLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iRG9uJ3Qgd3JpdGUgZGlyZWN0bHkgdG8gU3lzdGVtLm91dCBvdXIgU3lzdGVtLmVyciIvPgotICAgIDwvbW9kdWxlPgotICAgIDwhLS0gTm8gQGF1dGhvciB0YWdzIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IkBhdXRob3IiLz4KLSAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiAJdmFsdWU9Ik5vIEBhdXRob3IgdGFnIGFsbG93ZWQiLz4KLSAgICA8L21vZHVsZT4KLQotCi0gICAgPG1vZHVsZSBuYW1lPSJVcHBlckVsbCIvPgotCi0gIDwvbW9kdWxlPgotCi08L21vZHVsZT4KZGlmZiAtLWdpdCBhL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLnhtbCBiL290aGVyL2NoZWNrc3R5bGUtcnVsZXMvc3JjL21haW4vcmVzb3VyY2VzL3RvYmFnby9jaGVja3N0eWxlLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzMxNTcyZC4uMDAwMDAwMAotLS0gYS9vdGhlci9jaGVja3N0eWxlLXJ1bGVzL3NyYy9tYWluL3Jlc291cmNlcy90b2JhZ28vY2hlY2tzdHlsZS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNTIgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIj8+Ci08IS0tIAotICogTGljZW5zZWQgdG8gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChBU0YpIHVuZGVyIG9uZSBvciBtb3JlCi0gKiBjb250cmlidXRvciBsaWNlbnNlIGFncmVlbWVudHMuICBTZWUgdGhlIE5PVElDRSBmaWxlIGRpc3RyaWJ1dGVkIHdpdGgKLSAqIHRoaXMgd29yayBmb3IgYWRkaXRpb25hbCBpbmZvcm1hdGlvbiByZWdhcmRpbmcgY29weXJpZ2h0IG93bmVyc2hpcC4KLSAqIFRoZSBBU0YgbGljZW5zZXMgdGhpcyBmaWxlIHRvIFlvdSB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wCi0gKiAodGhlICJMaWNlbnNlIik7IHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aAotICogdGhlIExpY2Vuc2UuICBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotLS0+Ci0KLTwhRE9DVFlQRSBtb2R1bGUgUFVCTElDCi0gICAgIi0vL1B1cHB5IENyYXdsLy9EVEQgQ2hlY2sgQ29uZmlndXJhdGlvbiAxLjIvL0VOIgotICAgICJodHRwOi8vd3d3LnB1cHB5Y3Jhd2wuY29tL2R0ZHMvY29uZmlndXJhdGlvbl8xXzIuZHRkIj4KLQotPCEtLQotCi0gIENoZWNrc3R5bGUgY29uZmlndXJhdGlvbiB0aGF0IGNoZWNrcyB0aGUgc3VuIGNvZGluZyBjb252ZW50aW9ucyBmcm9tOgotCi0gICAgLSB0aGUgSmF2YSBMYW5ndWFnZSBTcGVjaWZpY2F0aW9uIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2RvY3MvYm9va3MvamxzL3NlY29uZF9lZGl0aW9uL2h0bWwvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgU3VuIENvZGUgQ29udmVudGlvbnMgYXQgaHR0cDovL2phdmEuc3VuLmNvbS9kb2NzL2NvZGVjb252LwotCi0gICAgLSB0aGUgSmF2YWRvYyBndWlkZWxpbmVzIGF0Ci0gICAgICBodHRwOi8vamF2YS5zdW4uY29tL2oyc2UvamF2YWRvYy93cml0aW5nZG9jY29tbWVudHMvaW5kZXguaHRtbAotCi0gICAgLSB0aGUgSkRLIEFwaSBkb2N1bWVudGF0aW9uIGh0dHA6Ly9qYXZhLnN1bi5jb20vajJzZS9kb2NzL2FwaS9pbmRleC5odG1sCi0KLSAgICAtIHNvbWUgYmVzdCBwcmFjdGljZXMKLQotICBDaGVja3N0eWxlIGlzIHZlcnkgY29uZmlndXJhYmxlLiBCZSBzdXJlIHRvIHJlYWQgdGhlIGRvY3VtZW50YXRpb24gYXQKLSAgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0IChvciBpbiB5b3VyIGRvd25sb2FkZWQgZGlzdHJpYnV0aW9uKS4KLQotICBNb3N0IENoZWNrcyBhcmUgY29uZmlndXJhYmxlLCBiZSBzdXJlIHRvIGNvbnN1bHQgdGhlIGRvY3VtZW50YXRpb24uCi0KLSAgVG8gY29tcGxldGVseSBkaXNhYmxlIGEgY2hlY2ssIGp1c3QgY29tbWVudCBpdCBvdXQgb3IgZGVsZXRlIGl0IGZyb20gdGhlIGZpbGUuCi0KLSAgRmluYWxseSwgaXQgaXMgd29ydGggcmVhZGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KLQotLS0+Ci0KLTxtb2R1bGUgbmFtZT0iQ2hlY2tlciI+Ci0KLSAgICA8IS0tIENoZWNrcyB0aGF0IGEgcGFja2FnZS5odG1sIGZpbGUgZXhpc3RzIGZvciBlYWNoIHBhY2thZ2UuICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbCNQYWNrYWdlSHRtbCAtLT4KLQotICAgIDwhLS0gQ2hlY2tzIHdoZXRoZXIgZmlsZXMgZW5kIHdpdGggYSBuZXcgbGluZS4gICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX21pc2MuaHRtbCNOZXdsaW5lQXRFbmRPZkZpbGUgLS0+Ci0gICAgPG1vZHVsZSBuYW1lPSJOZXdsaW5lQXRFbmRPZkZpbGUiLz4KLQotICAgIDwhLS0gQ2hlY2tzIHRoYXQgcHJvcGVydHkgZmlsZXMgY29udGFpbiB0aGUgc2FtZSBrZXlzLiAgICAgICAgIC0tPgotICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbWlzYy5odG1sI1RyYW5zbGF0aW9uIC0tPgotICAgIDxtb2R1bGUgbmFtZT0iVHJhbnNsYXRpb24iLz4KLQotCi0gICAgPG1vZHVsZSBuYW1lPSJUcmVlV2Fsa2VyIj4KLQotICAgICAgICA8cHJvcGVydHkgbmFtZT0iY2FjaGVGaWxlIiB2YWx1ZT0iJHtjaGVja3N0eWxlLmNhY2hlLmZpbGV9Ii8+Ci0gICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjaGFyc2V0IiB2YWx1ZT0iVVRGLTgiLz4KLSAgICAgICAgPHByb3BlcnR5IG5hbWU9InRhYldpZHRoIiB2YWx1ZT0iMiIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBKYXZhZG9jIGNvbW1lbnRzLiAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2phdmFkb2MuaHRtbAotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NNZXRob2QiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJKYXZhZG9jVHlwZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NWYXJpYWJsZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkphdmFkb2NTdHlsZSIvPiAgIC0tPgotCi0KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBOYW1pbmcgQ29udmVudGlvbnMuICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbmFtaW5nLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQ29uc3RhbnROYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTG9jYWxGaW5hbFZhcmlhYmxlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkxvY2FsVmFyaWFibGVOYW1lIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTWVtYmVyTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZE5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYWNrYWdlTmFtZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlBhcmFtZXRlck5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdGF0aWNWYXJpYWJsZU5hbWUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUeXBlTmFtZSIvPgotCi0KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBIZWFkZXJzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19oZWFkZXIuaHRtbCAgIC0tPgotICAgICAgICA8IS0tIDxtb2R1bGUgbmFtZT0iSGVhZGVyIj4gLS0+Ci0gICAgICAgICAgICA8IS0tIFRoZSBmb2xsb3cgcHJvcGVydHkgdmFsdWUgZGVtb25zdHJhdGVzIHRoZSBhYmlsaXR5ICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gdG8gaGF2ZSBhY2Nlc3MgdG8gQU5UIHByb3BlcnRpZXMuIEluIHRoaXMgY2FzZSBpdCB1c2VzIC0tPgotICAgICAgICAgICAgPCEtLSB0aGUgJHtiYXNlZGlyfSBwcm9wZXJ0eSB0byBhbGxvdyBDaGVja3N0eWxlIHRvIGJlIHJ1biAgLS0+Ci0gICAgICAgICAgICA8IS0tIGZyb20gYW55IGRpcmVjdG9yeSB3aXRoaW4gYSBwcm9qZWN0LiBTZWUgcHJvcGVydHkgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gZXhwYW5zaW9uLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnLmh0bWwjcHJvcGVydGllcyAgICAgICAgLS0+Ci0gICAgICAgICAgICA8IS0tIDxwcm9wZXJ0eSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgICAgIDwhLS0gICAgIG5hbWU9ImhlYWRlckZpbGUiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICAgICAgPCEtLSAgICAgdmFsdWU9IiR7YmFzZWRpcn0vamF2YS5oZWFkZXIiLz4gLS0+Ci0gICAgICAgICAgICA8IS0tIEZvbGxvd2luZyBpbnRlcnByZXRzIHRoZSBoZWFkZXIgZmlsZSBhcyByZWd1bGFyIGV4cHJlc3Npb25zLiAtLT4KLSAgICAgICAgPCEtLSA8L21vZHVsZT4gLS0+Ci0KLSAgICAgICAgIDxtb2R1bGUgbmFtZT0iUmVnZXhwSGVhZGVyIj4KLSAgICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImhlYWRlckZpbGUiIHZhbHVlPSIke2NoZWNrc3R5bGUuaGVhZGVyLmZpbGV9Ii8+Ci0gICAgICAgICAgICAgPCEtLTxwcm9wZXJ0eSBuYW1lPSJoZWFkZXIiIHZhbHVlPSJecGFja2FnZSBcbl4kXG4vXCokXG5eIFwqIENvcHlyaWdodCAoXGRcZFxkXGQtKT9cZFxkXGRcZCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uJFxuXiBcKiRcbl4gXCogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCBcKHRoZSAmcXVvdDtMaWNlbnNlJnF1b3Q7XClcOyRcbl4gXCogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLiRcbl4gXCogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0JFxuXiBcKiRcbl4gXCogICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAkXG5eIFwqJFxuXiBcKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlJFxuXiBcKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAmcXVvdDtBUyBJUyZxdW90OyBCQVNJUywkXG5eIFwqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLiRcbl4gXCogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZCRcbl4gXCogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuJFxuXiBcKi8kXG5eJCIvPi0tPgotICAgICAgICAgPC9tb2R1bGU+Ci0KLQotCi0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgaW1wb3J0cyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2ltcG9ydC5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkU3RhckltcG9ydCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IklsbGVnYWxJbXBvcnQiLz4gPCEtLSBkZWZhdWx0cyB0byBzdW4uKiBwYWNrYWdlcyAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJSZWR1bmRhbnRJbXBvcnQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJVbnVzZWRJbXBvcnRzIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgU2l6ZSBWaW9sYXRpb25zLiAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfc2l6ZXMuaHRtbCAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJGaWxlTGVuZ3RoIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGluZUxlbmd0aCI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1heCIgdmFsdWU9IjEyMCIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iTWV0aG9kTGVuZ3RoIi8+LS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFyYW1ldGVyTnVtYmVyIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWF4IiB2YWx1ZT0iMTUiLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3Igd2hpdGVzcGFjZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ193aGl0ZXNwYWNlLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iRW1wdHlGb3JJdGVyYXRvclBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9Ik1ldGhvZFBhcmFtUGFkIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTm9XaGl0ZXNwYWNlQWZ0ZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJOb1doaXRlc3BhY2VCZWZvcmUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJPcGVyYXRvcldyYXAiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJQYXJlblBhZCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlR5cGVjYXN0UGFyZW5QYWQiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUYWJDaGFyYWN0ZXIiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJXaGl0ZXNwYWNlQWZ0ZXIiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iV2hpdGVzcGFjZUFyb3VuZCIvPi0tPgotCi0gICAgICAgIDwhLS0gTW9kaWZpZXIgQ2hlY2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfbW9kaWZpZXJzLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTW9kaWZpZXJPcmRlciIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudE1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIENoZWNrcyBmb3IgYmxvY2tzLiBZb3Uga25vdywgdGhvc2Uge30ncyAgICAgICAgIC0tPgotICAgICAgICA8IS0tIFNlZSBodHRwOi8vY2hlY2tzdHlsZS5zZi5uZXQvY29uZmlnX2Jsb2Nrcy5odG1sIC0tPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkF2b2lkTmVzdGVkQmxvY2tzIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iYWxsb3dJblN3aXRjaENhc2UiIHZhbHVlPSJ0cnVlIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICA8bW9kdWxlIG5hbWU9IkVtcHR5QmxvY2siPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJvcHRpb24iIHZhbHVlPSJ0ZXh0Ii8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9InRva2VucyIgdmFsdWU9IkxJVEVSQUxfQ0FUQ0giLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTGVmdEN1cmx5Ii8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTmVlZEJyYWNlcyIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJpZ2h0Q3VybHkiLz4KLQotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjb21tb24gY29kaW5nIHByb2JsZW1zICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfY29kaW5nLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJBdm9pZElubGluZUNvbmRpdGlvbmFscyIvPiAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJDb3ZhcmlhbnRFcXVhbHMiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJEb3VibGVDaGVja2VkTG9ja2luZyIvPiAgICA8IS0tIE1ZIEZBVk9VUklURSAtLT4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRW1wdHlTdGF0ZW1lbnQiLz4tLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJFcXVhbHNIYXNoQ29kZSIvPgotICAgICAgICA8IS0tbW9kdWxlIG5hbWU9IkhpZGRlbkZpZWxkIj4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iaWdub3JlU2V0dGVyIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgICA8cHJvcGVydHkgbmFtZT0iIGlnbm9yZUNvbnN0cnVjdG9yUGFyYW1ldGVyIiB2YWx1ZT0idHJ1ZSIgLz4KLSAgICAgICAgPC9tb2R1bGUtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsSW5zdGFudGlhdGlvbiI+Ci0gICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJjbGFzc2VzIiB2YWx1ZT0iamF2YS5sYW5nLkJvb2xlYW4sIGphdmEubGFuZy5TdHJpbmciLz4KLSAgICAgICAgPC9tb2R1bGU+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW5uZXJBc3NpZ25tZW50Ii8+Ci0gICAgICAgIDwhLS0gPG1vZHVsZSBuYW1lPSJNYWdpY051bWJlciIvPiAtLT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJNaXNzaW5nU3dpdGNoRGVmYXVsdCIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlJlZHVuZGFudFRocm93cyI+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9ImFsbG93VW5jaGVja2VkIiB2YWx1ZT0idHJ1ZSIvPgotICAgICAgICA8L21vZHVsZT4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTdHJpbmdMaXRlcmFsRXF1YWxpdHkiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJTaW1wbGlmeUJvb2xlYW5FeHByZXNzaW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU2ltcGxpZnlCb29sZWFuUmV0dXJuIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iU3VwZXJDbG9uZSIvPgotICAgICAgICA8bW9kdWxlIG5hbWU9IlN1cGVyRmluYWxpemUiLz4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJJbGxlZ2FsVGhyb3dzIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iUGFja2FnZURlY2xhcmF0aW9uIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iTXVsdGlwbGVWYXJpYWJsZURlY2xhcmF0aW9ucyIvPgotCi0gICAgICAgIDwhLS0gQ2hlY2tzIGZvciBjbGFzcyBkZXNpZ24gICAgICAgICAgICAgICAgICAgICAgICAgLS0+Ci0gICAgICAgIDwhLS0gU2VlIGh0dHA6Ly9jaGVja3N0eWxlLnNmLm5ldC9jb25maWdfZGVzaWduLmh0bWwgLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkRlc2lnbkZvckV4dGVuc2lvbiIvIC0tPgotICAgICAgICA8IS0tIG1vZHVsZSBuYW1lPSJGaW5hbENsYXNzIi8gLS0+Ci0gICAgICAgIDwhLS0gbW9kdWxlIG5hbWU9IkhpZGVVdGlsaXR5Q2xhc3NDb25zdHJ1Y3RvciIvIC0tPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iSW50ZXJmYWNlSXNUeXBlIi8+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iVmlzaWJpbGl0eU1vZGlmaWVyIi8+Ci0KLQotICAgICAgICA8IS0tIE1pc2NlbGxhbmVvdXMgb3RoZXIgY2hlY2tzLiAgICAgICAgICAgICAgICAgICAtLT4KLSAgICAgICAgPCEtLSBTZWUgaHR0cDovL2NoZWNrc3R5bGUuc2YubmV0L2NvbmZpZ19taXNjLmh0bWwgLS0+Ci0gICAgICAgIDxtb2R1bGUgbmFtZT0iQXJyYXlUeXBlU3R5bGUiLz4KLSAgICAgICAgPCEtLTxtb2R1bGUgbmFtZT0iRmluYWxQYXJhbWV0ZXJzIi8+IC0tPgotICAgICAgICA8IS0tIExpbmUgd2l0aCBUcmFpbGluZyBTcGFjZXMgKGRpc2FibGVkIGFzIGl0J3MgdG8gbm9pc3kpCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotICAgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJccyskIi8+Ci0gICAgICAgICAgPHByb3BlcnR5IG5hbWU9Im1lc3NhZ2UiIHZhbHVlPSJMaW5lIGhhcyB0cmFpbGluZyBzcGFjZXMuIi8+Ci0gICAgICAgIDwvbW9kdWxlPgotICAgICAgICAtLT4KLQotICAgICAgICA8IS0tIExldCB0b2RvIHBsdWdpbiBoYW5kbGUgdGhpcy4KLSAgICAgICAgPG1vZHVsZSBuYW1lPSJUb2RvQ29tbWVudCIvPgotICAgICAgICAtLT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iKChwdWJsaWMpfChwcm90ZWN0ZWQpKVxzK3ZvaWRccytmaW5hbGl6ZVwoXHMqXCkiLz4KLQkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iQXZvaWQgZmluYWxpemVycyIvPgotICAgICAgICA8L21vZHVsZT4KLQkgICAgICA8IS0tIE5vIGRpcmVjdCBwcmludGluZyB0byBTeXN0ZW0ub3V0IG9yIFN5c3RlbS5lcnIgLS0+Ci0KLQotIAkgICAgICA8bW9kdWxlIG5hbWU9IkdlbmVyaWNJbGxlZ2FsUmVnZXhwIj4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0iZm9ybWF0IiB2YWx1ZT0iU3lzdGVtXC4ob3V0fGVycilcLiIvPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJtZXNzYWdlIiB2YWx1ZT0iRG9uJ3Qgd3JpdGUgZGlyZWN0bHkgdG8gU3lzdGVtLm91dCBvdXIgU3lzdGVtLmVyciIvPgotIAkgICAgICA8L21vZHVsZT4KLQkgCSAgICA8IS0tIE5vIEBhdXRob3IgdGFncyAtLT4KLSAJICAgICAgPG1vZHVsZSBuYW1lPSJHZW5lcmljSWxsZWdhbFJlZ2V4cCI+Ci0gCSAgICAgICAgPHByb3BlcnR5IG5hbWU9ImZvcm1hdCIgdmFsdWU9IkBhdXRob3IiLz4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgCXZhbHVlPSJObyBAYXV0aG9yIHRhZyBhbGxvd2VkIi8+Ci0gCSAgICAgIDwvbW9kdWxlPgotCi0gICAgICAgIDxtb2R1bGUgbmFtZT0iR2VuZXJpY0lsbGVnYWxSZWdleHAiPgotIAkgICAgICAgIDxwcm9wZXJ0eSBuYW1lPSJmb3JtYXQiIHZhbHVlPSJzdHLDpGhsZWtyZXV6ZW4iLz4KLSAJICAgICAgICA8cHJvcGVydHkgbmFtZT0ibWVzc2FnZSIgCXZhbHVlPSJObyBzdHLDpGhsZWtyZXV6ZW4gYWxsb3dlZCIvPgotIAkgICAgICA8L21vZHVsZT4KLQotICAgICAgICA8bW9kdWxlIG5hbWU9IlVwcGVyRWxsIi8+Ci0KLSAgICA8L21vZHVsZT4KLQotPC9tb2R1bGU+CmRpZmYgLS1naXQgYS9vdGhlci9ub3JtYWxpemVyL1JFQURNRS50eHQgYi9vdGhlci9ub3JtYWxpemVyL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZTFiNjQuLjAwMDAwMDAKLS0tIGEvb3RoZXIvbm9ybWFsaXplci9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotVGhpcyBwcm9qZWN0IGlzIGEgc2ltcGxlIGNvbW1hbmQtbGluZSB0b29sIHRoYXQgIm5vcm1hbGlzZXMiIGEgSlNQIFRMRCBmaWxlIG9yIGEgSlNGIGZhY2VzLWNvbmZpZyBmaWxlLgotQWZ0ZXIgdHdvIGZpbGVzIGhhdmUgYmVlbiAibm9ybWFsaXplZCIsIHRoZXkgY2FuIHRoZW4gYmUgY29tcGFyZWQgd2l0aCBhIHNpbXBsZSAiZGlmZiIgdG9vbCB0byBzZWUgd2hhdAotcmVhbCBkaWZmZXJlbmNlcyAoaWYgYW55KSB0aGVyZSBhcmUgYmV0d2VlbiB0aGUgdHdvIG9yaWdpbmFsIGZpbGVzLgotCi1BbGwgIm5vbi1jcml0aWNhbCIgZGF0YSwgbGlrZSBjb21tZW50cyBhbmQgImRlc2NyaXB0aW9uIiBmaWVsZHMgYXJlIGRpc2NhcmRlZC4gCi1BbGwgeG1sIGVsZW1lbnRzIGFuZCBhdHRyaWJ1dGVzIGFyZSB0aGVuIHNvcnRlZCBpbnRvIGEgY29uc2lzdGVudCBvcmRlcjoKLSAqIGVsZW1lbnRzIHdpdGgganVzdCB0ZXh0IGNvbnRlbnQgYXJlIHNvcnRlZCBiZWZvcmUgb3RoZXJzLgotICogZWxlbWVudHMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBieSBlbGVtZW50IG5hbWUKLSAqIGVsZW1lbnRzIHdpdGggc2FtZSBuYW1lIGFyZSBzb3J0ZWQgYWNjb3JkaW5nIHRvIHRoZSB0ZXh0IGNvbnRlbnQgb2YgdGhlaXIgY2hpbGQgbm9kZXMKLSAgIChtZWFucyB0aGF0IDx0YWc+PG5hbWU+Zm9vPC9uYW1lPjwvdGFnPiBpcyBzb3J0ZWQgb24gdGhlIGNvbnRlbnQgb2YgdGhlIG5hbWUgY2hpbGQpLgotIAotVGhpcyB0b29sIGlzIHBhcnRseSBhIGdlbmVyaWMgWE1MICJub3JtYWxpc2VyIiwgYnV0IHRha2VzIGEgZmV3IHNob3J0Y3V0cyB0aGF0IHdvcmsgc3BlY2lmaWNhbGx5Ci1vbiBUTEQgYW5kIGZhY2VzLWNvbmZpZyBmaWxlcy4gSXQgY291bGQgcG9zc2libHkgYmUgZXhwYW5kZWQgdG8gc3VwcG9ydCBjb21wYXJpc29uIG9mIG90aGVyIHhtbAotZmlsZXMsIGJ1dCB3YXNuJ3Qgc3BlY2lmaWNhbGx5IGRlc2lnbmVkIGZvciB0aGF0IHB1cnBvc2UuIEFuZCBpdCBpcyBkZWZpbml0ZWx5IGEgImhhY2siOyBhIHRvb2wKLXRoYXQgaXMganVzdCBjb21wbGV4IGVub3VnaCBmb3IgaXRzIHB1cnBvc2UgYnV0IG5vdCBlbGVnYW50LiBGb3IgZXhhbXBsZToKLSogIm1peGVkIGNvbnRlbnQiIGVsZW1lbnRzIGFyZSBqdXN0IG5vdCBzdXBwb3J0ZWQKLSogeG1sIG5hbWVzcGFjZXMgYXJlIG5vdCBoYW5kbGVkIHByb3Blcmx5Ci0qIGV4dGVybmFsIGR0ZHMgYW5kIGVudGl0eSByZWZlcmVuY2VzIGFyZSBpZ25vcmVkClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9ub3JtIGIvb3RoZXIvbm9ybWFsaXplci9ub3JtCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2Y2ZlNTQyLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvbm9ybQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLWphdmEgLWNwIHRhcmdldC9jbGFzc2VzIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXIuTm9ybWFsaXplciAkQApkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9wb20ueG1sIGIvb3RoZXIvbm9ybWFsaXplci9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Y2JjYzgwLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4ICswLDAgQEAKLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxncm91cElkPm9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5ub3JtYWxpemVyPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmphcjwvcGFja2FnaW5nPgotICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gIDxuYW1lPm5vcm1hbGl6ZXI8L25hbWU+Ci0gIDx1cmw+aHR0cDovL21hdmVuLmFwYWNoZS5vcmc8L3VybD4KLSAgPGRlcGVuZGVuY2llcz4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4zLjguMTwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvQXR0cmlidXRlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmYyYTc3ZC4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9BdHRyaWJ1dGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotaW1wb3J0IGphdmEuaW8uUHJpbnRXcml0ZXI7Ci0KLXB1YmxpYyBjbGFzcyBBdHRyaWJ1dGUgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgU3RyaW5nIG5hbWU7Ci0gICAgU3RyaW5nIHZhbHVlOwotCi0gICAgcHVibGljIEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICAgIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50V3JpdGVyIHdyaXRlcikKLSAgICB7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIj0iKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiXCIiKTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCh2YWx1ZSk7Ci0gICAgICAgIHdyaXRlci5hcHBlbmQoIlwiIik7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgQXR0cmlidXRlIG90aGVyQXR0ciA9IChBdHRyaWJ1dGUpIG90aGVyOwotICAgICAgICByZXR1cm4gbmFtZS5jb21wYXJlVG8ob3RoZXJBdHRyLm5hbWUpOwotICAgIH0gICAgCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvRWxlbWVudC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5Yjk2NTYxLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL0VsZW1lbnQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDIwNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpbmtlZExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVwcmVzZW50IGFuIFhNTCBlbGVtZW50IHdoaWNoIGhhcyBlaXRoZXIgYm9keSB0ZXh0IG9yIGEgbGlzdCBvZiBjaGlsZCBlbGVtZW50cy4KLSAqIDxwPgotICogTWl4ZWQtY29udGVudCBlbGVtZW50cyBhcmUgbm90IHN1cHBvcnRlZC4gTmFtZXNwYWNlcyBhcmUgaWdub3JlZC4KLSAqLwotcHVibGljIGNsYXNzIEVsZW1lbnQgaW1wbGVtZW50cyBDb21wYXJhYmxlCi17Ci0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfSElHSCA9IG5ldyBTdHJpbmdbXQotICAgIHsKLSAgICAgICAgIm5hbWUiLAotICAgIH07Ci0gICAgCi0gICAgc3RhdGljIFN0cmluZ1tdIFNPUlRfUFJJT1JJVFlfTE9XID0gbmV3IFN0cmluZ1tdCi0gICAgewotICAgICAgICAiY2xhc3MiCi0gICAgfTsKLQotICAgIFN0cmluZyBuYW1lOwotICAgIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXM7Ci0gICAgU3RyaW5nIGNvbnRlbnQ7Ci0gICAgTGlzdCBjaGlsZHJlbiA9IG5ldyBMaW5rZWRMaXN0KCk7Ci0gICAgCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB3aXRoIGRpZmZlcmVudCBuYW1lcy4KLSAgICAvLyBFbGVtZW50cyB3aG9zZSBuYW1lIG1hdGNoZXMgYSAiaGlnaCBwcmlvcml0eSIgcGF0dGVybiBhcmUgb3V0cHV0IGJlZm9yZQotICAgIC8vIGVsZW1lbnRzIHdpdGggIm5vcm1hbCIgbmFtZXMsIHdoaWNoIGFyZSBvdXRwdXQgYmVmb3JlIGVsZW1lbnRzIHdob3NlCi0gICAgLy8gbmFtZXMgbWF0Y2ggYSAibG93IHByaW9yaXR5IiBwYXR0ZXJuLgotICAgIGludCBzb3J0UHJpb3JpdHkgPSAwOwotCi0gICAgLy8gVmFsdWUgdXNlZCB0byBjaG9vc2Ugb3JkZXJpbmcgZm9yIHR3byBlbGVtZW50cyB0aGF0IGhhdmUgdGhlIHNhbWUKLSAgICAvLyBuYW1lIGFuZCBubyB0ZXh0IGNvbnRlbnQuIFRoaXMgaXMgYnVpbHQgZnJvbSB0aGUgdGV4dCBjb250ZW50IG9mCi0gICAgLy8gdGhlIChvcmRlcmVkKSBzZXQgb2YgY2hpbGQgZWxlbWVudHMsIHNvIHRoYXQgdHdvIG5vZGVzIHdpdGggc2ltaWxhcgotICAgIC8vIGNoaWxkIGVsZW1lbnRzIGdldCBzb3J0ZWQgaW4gdGhlIHNhbWUgb3JkZXIuCi0gICAgU3RyaW5nIHNvcnRLZXkgPSBudWxsOwotCi0gICAgLy8gVGhlIGF0dHJpYnV0ZXMgYXJyYXkgaXMgZXhwZWN0ZWQgdG8gYmUgc29ydGVkIGJlZm9yZSBwYXNzaW5nIGluIGhlcmUuCi0gICAgcHVibGljIEVsZW1lbnQoU3RyaW5nIG5hbWUsIEF0dHJpYnV0ZVtdIGF0dHJpYnV0ZXMpCi0gICAgewotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgICB0aGlzLmF0dHJpYnV0ZXMgPSBhdHRyaWJ1dGVzOwotICAgICAgICBzb3J0UHJpb3JpdHkgPSBnZXRTb3J0UHJpb3JpdHkobmFtZSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0Q29udGVudChTdHJpbmcgY29udGVudCkKLSAgICB7Ci0gICAgICAgIHRoaXMuY29udGVudCA9IGNvbnRlbnQ7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyB2b2lkIGFkZENoaWxkKEVsZW1lbnQgY2hpbGQpCi0gICAgewotICAgICAgICBjaGlsZHJlbi5hZGQoY2hpbGQpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNvcnRDaGlsZHJlbigpCi0gICAgewotICAgICAgICBpZiAoY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIHNvcnQgaGVyZS4KLSAgICAgICAgICAgIGlmIChjb250ZW50ID09IG51bGwpCi0gICAgICAgICAgICAgICAgc29ydEtleSA9ICIiOyAvLyBzaG91bGQgbmV2ZXIgaGFwcGVuCi0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgc29ydEtleSA9IGNvbnRlbnQ7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBmaXJzdCBlbnN1cmUgZWFjaCBjaGlsZCBpcyBpbnRlcm5hbGx5IHNvcnRlZAotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgICgoRWxlbWVudCkgaS5uZXh0KCkpLnNvcnRDaGlsZHJlbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gbm93IHNvcnQgdGhlIGxpc3Qgb2YgY2hpbGRyZW4gcmVsYXRpdmUgdG8gZWFjaCBvdGhlcgotICAgICAgICBDb2xsZWN0aW9ucy5zb3J0KGNoaWxkcmVuKTsKLQotICAgICAgICAvLyBDb21wdXRlIHRoZSBzb3J0S2V5IGZvciB0aGlzIGVsZW1lbnQsIHVzZWQgd2hlbgotICAgICAgICAvLyB0d28gZWxlbWVudHMgaGF2ZSBpZGVudGljYWwgbmFtZXMgYW5kIHRoZXJlZm9yZSBuZWVkCi0gICAgICAgIC8vIHRvIGJlIG9yZGVyZWQgYWNjb3JkaW5nIHRvIHRoZSBjb250ZW50IG9mIHRoZWlyCi0gICAgICAgIC8vIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICBTdHJpbmdCdWZmZXIgYnVmID0gbmV3IFN0cmluZ0J1ZmZlcigpOwotICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOyApCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVsZW1lbnQgY2hpbGQgPSAoRWxlbWVudCkgaS5uZXh0KCk7Ci0gICAgICAgICAgICBpZiAoYnVmLmxlbmd0aCgpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZCgiJiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZChjaGlsZC5zb3J0S2V5KTsKLSAgICAgICAgfQotICAgICAgICBzb3J0S2V5ID0gYnVmLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRXcml0ZXIgd3JpdGVyLCBpbnQgaW5kZW50QW1vdW50KQotICAgIHsKLSAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgd3JpdGVyLmFwcGVuZCgiPCIpOwotICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICBpZiAoYXR0cmlidXRlcyAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IoaW50IGk9MDsgaTxhdHRyaWJ1dGVzLmxlbmd0aDsgKytpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIiAiKTsKLSAgICAgICAgICAgICAgICBhdHRyaWJ1dGVzW2ldLnByaW50KHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoY29udGVudCAhPSBudWxsKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+Iik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKGNvbnRlbnQpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPC8iKTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKCI+XG4iKTsKLSAgICAgICAgfQotICAgICAgICBlbHNlIGlmIChjaGlsZHJlbi5zaXplKCkgPT0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiLz5cbiIpOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UKLSAgICAgICAgewotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgICAgICBmb3IoSXRlcmF0b3IgaSA9IGNoaWxkcmVuLml0ZXJhdG9yKCk7IGkuaGFzTmV4dCgpOykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBFbGVtZW50IGUgPSAoRWxlbWVudClpLm5leHQoKTsKLSAgICAgICAgICAgICAgICBlLnByaW50KHdyaXRlciwgaW5kZW50QW1vdW50KzEpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVXRpbHMuaW5kZW50KHdyaXRlciwgaW5kZW50QW1vdW50KTsKLSAgICAgICAgICAgIHdyaXRlci5hcHBlbmQoIjwvIik7Ci0gICAgICAgICAgICB3cml0ZXIuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgd3JpdGVyLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gYSB2YWx1ZSB0aGF0IGluZGljYXRlcyBob3cgdGhpcyBlbGVtZW50IHNob3VsZCBiZSBzb3J0ZWQgcmVsYXRpdmUgdG8KLSAgICAgKiBvdGhlciBlbGVtZW50cy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBpcyBub3Qgc2FmZSB0byBjYWxsIHVudGlsIGFmdGVyIHNvcnRDaGlsZHJlbigpIGhhcyBiZWVuIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oT2JqZWN0IG90aGVyKQotICAgIHsKLSAgICAgICAgRWxlbWVudCBvdGhlckVsZW1lbnQgPSAoRWxlbWVudCkgb3RoZXI7Ci0KLSAgICAgICAgLy8gU29ydCB0YWdzIHdpdGgganVzdCB0ZXh0IGNvbnRlbnQgYmVmb3JlIG9uZXMgd2l0aCBjaGlsZCBlbGVtZW50cwotICAgICAgICBpZiAodGhpcy5jaGlsZHJlbi5pc0VtcHR5KCkgJiYgIW90aGVyRWxlbWVudC5jaGlsZHJlbi5pc0VtcHR5KCkpCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIGVsc2UgaWYgKCF0aGlzLmNoaWxkcmVuLmlzRW1wdHkoKSAmJiBvdGhlckVsZW1lbnQuY2hpbGRyZW4uaXNFbXB0eSgpKQotICAgICAgICAgICAgcmV0dXJuICsxOwotCi0gICAgICAgIGlmIChuYW1lLmVxdWFscyhvdGhlckVsZW1lbnQubmFtZSkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE9rLCB3ZSBoYXZlIHR3byB0YWdzIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYm90aCBoYXZlIGNoaWxkIGVsZW1lbnRzLgotICAgICAgICAgICAgLy8gU29ydCBieSB0aGUgc29ydGtleSB3ZSBjb21wdXRlZCBkdXJpbmcgdGhlIHNvcnRDaGlsZHJlbiBtZXRob2QKLSAgICAgICAgICAgIHJldHVybiBzb3J0S2V5LmNvbXBhcmVUbyhvdGhlckVsZW1lbnQuc29ydEtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBOYW1lcyBhcmUgZGlmZmVyZW50OiBjaGVjayB3aGV0aGVyIGVpdGhlciBuYW1lIGhhcyBzcGVjaWFsIHByaW9yaXR5LgotICAgICAgICBpZiAoc29ydFByaW9yaXR5ICE9IG90aGVyRWxlbWVudC5zb3J0UHJpb3JpdHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBvdGhlckVsZW1lbnQuc29ydFByaW9yaXR5IC0gc29ydFByaW9yaXR5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT2ssIGRpZmZlcmVudCBuYW1lcyBhbmQgdGhlIHByaW9yaXR5IG9mIHRoZSBuYW1lIGlzIGVxdWFsLgotICAgICAgICAvLyBTbyBqdXN0IHNvcnQgYWxwaGFiZXRpY2FsbHkuCi0gICAgICAgIHJldHVybiBuYW1lLmNvbXBhcmVUbyhvdGhlckVsZW1lbnQubmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJuIHRoZSAicHJpb3JpdHkiIG9mIHRoaXMgbmFtZS4KLSAgICAgKiA8cD4KLSAgICAgKiBOYW1lcyB3aXRoIGhpZ2hlciBwcmlvcml0eSBhcmUgc29ydGVkIGVhcmxpZXIgaW4gdGhlIGxpc3Qgb2YgZWxlbWVudHMuCi0gICAgICogQW5kIGFzIGVsZW1lbnRzIHdpdGggZXF1YWwgbmFtZXMgYXJlIHNvcnRlZCBhY2NvcmRpbmcgdG8gdGhlIGNvbnRlbnRzCi0gICAgICogb2YgdGhlaXIgY2hpbGRyZW4sIHRoaXMgYWxzbyBhZmZlY3RzIHRoZSBzb3J0aW5nIG9yZGVyIG9mIHRoZSBwYXJlbnQKLSAgICAgKiBlbGVtZW50IG9mIGFuIGVsZW1lbnQgdGhhdCBoYXMgYSAicHJpb3JpdHkiIHZhbHVlLgotICAgICAqIDxwPgotICAgICAqIE5vcm1hbCBlbGVtZW50IG5hbWVzIGhhdmUgemVybyBwcmlvcml0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludCBnZXRTb3J0UHJpb3JpdHkoU3RyaW5nIGVuYW1lKQotICAgIHsKLSAgICAgICAgZm9yKGludCBpPTA7IGk8U09SVF9QUklPUklUWV9ISUdILmxlbmd0aDsgKytpKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZW5hbWUuY29udGFpbnMoU09SVF9QUklPUklUWV9ISUdIW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgcG9zaXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gU09SVF9QUklPUklUWV9ISUdILmxlbmd0aCAtIGk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBmb3IoaW50IGk9MDsgaTxTT1JUX1BSSU9SSVRZX0xPVy5sZW5ndGg7ICsraSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGVuYW1lLmNvbnRhaW5zKFNPUlRfUFJJT1JJVFlfTE9XW2ldKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBhbHdheXMgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICByZXR1cm4gaSAtIFNPUlRfUFJJT1JJVFlfTE9XLmxlbmd0aDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhIGIvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTm9ybWFsaXplci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGJlOWI5Li4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5QcmludFdyaXRlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuU3RhY2s7Ci0KLWltcG9ydCBqYXZheC54bWwucGFyc2Vycy5TQVhQYXJzZXI7Ci1pbXBvcnQgamF2YXgueG1sLnBhcnNlcnMuU0FYUGFyc2VyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy54bWwuc2F4LkF0dHJpYnV0ZXM7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuRGVmYXVsdEhhbmRsZXI7Ci0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBOb3JtYWxpemVyIGV4dGVuZHMgRGVmYXVsdEhhbmRsZXIKLXsKLSAgICBTdGFjayBlbGVtZW50cyA9IG5ldyBTdGFjaygpOwotICAgIEVsZW1lbnQgcm9vdEVsZW1lbnQgPSBudWxsOwotICAgIFN0cmluZ0J1ZmZlciBjdXJyQ29udGVudCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBtYWluKCBTdHJpbmdbXSBhcmdzICkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoIDwgMSkKLSAgICAgICAgewotICAgICAgICAgICAgU3lzdGVtLm91dC5wcmludGxuKCJVc2FnZTogQXBwIGlucHV0RmlsZSIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoLTEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBuZXcgTm9ybWFsaXplcigpLnByb2Nlc3MoYXJnc1swXSk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBwcm9jZXNzKFN0cmluZyBmaWxlbmFtZSkgdGhyb3dzIEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgICAgICBTQVhQYXJzZXIgcGFyc2VyID0gZmFjdG9yeS5uZXdTQVhQYXJzZXIoKTsKLQotICAgICAgICBGaWxlIGYgPSBuZXcgRmlsZShmaWxlbmFtZSk7Ci0KLSAgICAgICAgcGFyc2VyLnBhcnNlKGYsIHRoaXMpOwotICAgICAgICByb290RWxlbWVudC5zb3J0Q2hpbGRyZW4oKTsKLSAgICAgICAgUHJpbnRXcml0ZXIgcHcgPSBuZXcgUHJpbnRXcml0ZXIoU3lzdGVtLm91dCk7Ci0gICAgICAgIHJvb3RFbGVtZW50LnByaW50KHB3LCAwKTsKLSAgICAgICAgcHcuZmx1c2goKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBBdHRyaWJ1dGVbXSBFTVBUWV9BVFRSUyA9IG5ldyBBdHRyaWJ1dGVbMF07Ci0KLSAgICAvLyBJZ25vcmUgYW55IGV4dGVybmFsIGVudGl0aWVzLiBJbiBwYXJ0aWN1bGFyLCB0aGlzIHNraXBzIHRoZSByZWFkaW5nIG9mIGR0ZHMuCi0gICAgcHVibGljIElucHV0U291cmNlIHJlc29sdmVFbnRpdHkoU3RyaW5nIHB1YmxpY0lkLCBTdHJpbmcgc3lzdGVtSWQpCi0gICAgIHRocm93cyBJT0V4Y2VwdGlvbiwgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBJbnB1dFN0cmVhbSBpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSk7Ci0gICAgICAgIHJldHVybiBuZXcgSW5wdXRTb3VyY2UoaXMpOwotICAgIH0KLSAgICAgICAgICAgIAotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUsIEF0dHJpYnV0ZXMgYXR0cmlidXRlcykKLSAgICB7Ci0gICAgICAgIGludCBuQXR0cnMgPSBhdHRyaWJ1dGVzLmdldExlbmd0aCgpOwotICAgICAgICBMaXN0IGF0dHJMaXN0ID0gbmV3IEFycmF5TGlzdChuQXR0cnMpOwotICAgICAgICBmb3IoaW50IGk9MDsgaTxuQXR0cnM7ICsraSkgewotICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyaWJ1dGVzLmdldFFOYW1lKGkpOwotICAgICAgICAgICAgU3RyaW5nIHZhbHVlID0gYXR0cmlidXRlcy5nZXRWYWx1ZShpKTsKLSAgICAgICAgICAgIEF0dHJpYnV0ZSBhID0gbmV3IEF0dHJpYnV0ZShuYW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICBhdHRyTGlzdC5hZGQoYSk7Ci0gICAgICAgIH0KLSAgICAgICAgQ29sbGVjdGlvbnMuc29ydChhdHRyTGlzdCk7Ci0KLSAgICAgICAgQXR0cmlidXRlW10gYXR0cnMgPSAoQXR0cmlidXRlW10pIGF0dHJMaXN0LnRvQXJyYXkoRU1QVFlfQVRUUlMpOyAKLSAgICAgICAgRWxlbWVudCBlID0gbmV3IEVsZW1lbnQocW5hbWUsIGF0dHJzKTsKLQotICAgICAgICBFbGVtZW50IHBhcmVudDsKLSAgICAgICAgaWYgKGVsZW1lbnRzLmlzRW1wdHkoKSkKLSAgICAgICAgewotICAgICAgICAgICAgcm9vdEVsZW1lbnQgPSBlOwotICAgICAgICB9Ci0gICAgICAgIGVsc2UgaWYgKCFxbmFtZS5lcXVhbHMoImRlc2NyaXB0aW9uIikpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHBhcmVudCA9IChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgICAgICAgICBwYXJlbnQuYWRkQ2hpbGQoZSk7Ci0gICAgICAgIH0KLSAgICAgICAgZWxlbWVudHMucHVzaChlKTsKLQotICAgICAgICAvLyBjaGVjayB3aGV0aGVyIGN1cnJDb250ZW50IGlzIGFscmVhZHkgbm9uLXdoaXRlc3BhY2UuCi0gICAgICAgIC8vIGlmIGl0IGlzLCB0aGVuIHRocm93IGFuIGV4Y2VwdGlvbiBhYm91dCAibWl4ZWQgY29udGVudCBub3Qgc3VwcG9ydGVkIgotICAgICAgICBjdXJyQ29udGVudC5zZXRMZW5ndGgoMCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgdXJpLCBTdHJpbmcgbG9jYWxOYW1lLCBTdHJpbmcgcW5hbWUpCi0gICAgewotICAgICAgICBTdHJpbmcgcyA9IGN1cnJDb250ZW50LnRvU3RyaW5nKCkudHJpbSgpOwotICAgICAgICBpZiAoIXMuaXNFbXB0eSgpKQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXRDdXJyRWxlbWVudCgpLnNldENvbnRlbnQocyk7Ci0gICAgICAgIH0KLSAgICAgICAgY3VyckNvbnRlbnQuc2V0TGVuZ3RoKDApOwotCi0gICAgICAgIGVsZW1lbnRzLnBvcCgpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoLCBpbnQgc3RhcnQsIGludCBsZW5ndGgpCi0gICAgewotICAgICAgICBjdXJyQ29udGVudC5hcHBlbmQoY2gsIHN0YXJ0LCBsZW5ndGgpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVsZW1lbnQgZ2V0Q3VyckVsZW1lbnQoKQotICAgIHsKLSAgICAgICAgcmV0dXJuIChFbGVtZW50KSBlbGVtZW50cy5wZWVrKCk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvb3RoZXIvbm9ybWFsaXplci9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvbXlmYWNlcy9idWlsZHRvb2xzL25vcm1hbGl6ZXIvTnVsbElucHV0U291cmNlLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUyMTczOS4uMDAwMDAwMAotLS0gYS9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9OdWxsSW5wdXRTb3VyY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwICswLDAgQEAKLXBhY2thZ2Ugb3JnLmFwYWNoZS5teWZhY2VzLmJ1aWxkdG9vbHMubm9ybWFsaXplcjsKLQotCi1wdWJsaWMgY2xhc3MgTnVsbElucHV0U291cmNlIGV4dGVuZHMgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2UKLXsKLSAgICBwdWJsaWMgTnVsbElucHV0U291cmNlKFN0cmluZyBwdWJJZCwgU3RyaW5nIHN5c0lkKQotICAgIHsKLSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9VdGlscy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZjBjNzZlLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL1V0aWxzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNiArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqYXZhLmlvLlByaW50V3JpdGVyOwotCi0KLS8qKgotICogUmVhZCBpbnB1dCBmaWxlIGFuZCB3cml0ZSBpdCBvdXQgd2l0aCBldmVyeXRoaW5nIG5vcm1hbGl6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBVdGlscyAKLXsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW5kZW50KFByaW50V3JpdGVyIHdyaXRlciwgaW50IGFtb3VudCkKLSAgICB7Ci0gICAgICAgIGZvcihpbnQgaT0wOyBpPGFtb3VudDsgKytpKQotICAgICAgICAgICAgd3JpdGVyLndyaXRlKCIgICIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEgYi9vdGhlci9ub3JtYWxpemVyL3NyYy90ZXN0L2phdmEvb3JnL2FwYWNoZS9teWZhY2VzL2J1aWxkdG9vbHMvbm9ybWFsaXplci9Ob3JtYWxpemVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2JlZDUyLi4wMDAwMDAwCi0tLSBhL290aGVyL25vcm1hbGl6ZXIvc3JjL3Rlc3QvamF2YS9vcmcvYXBhY2hlL215ZmFjZXMvYnVpbGR0b29scy9ub3JtYWxpemVyL05vcm1hbGl6ZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi1wYWNrYWdlIG9yZy5hcGFjaGUubXlmYWNlcy5idWlsZHRvb2xzLm5vcm1hbGl6ZXI7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBOb3JtYWxpemVyLgotICovCi1wdWJsaWMgY2xhc3MgTm9ybWFsaXplclRlc3QgZXh0ZW5kcyBUZXN0Q2FzZQotewotICAgIC8qKgotICAgICAqIFJpZ29yb3VzIFRlc3QgOi0pCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgdGVzdE5vcm1hbGl6ZXIoKQotICAgIHsKLSAgICAgICAgLy8gVE9ETzogd3JpdGUgc29tZSByZWFsIHRlc3RzIGhlcmUKLSAgICAgICAgYXNzZXJ0VHJ1ZSggdHJ1ZSApOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dCBiL290aGVyL3NjcmlwdHMvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBmMmQwMy4uMDAwMDAwMAotLS0gYS9vdGhlci9zY3JpcHRzL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi1UaGlzIGRpcmVjdG9yeSBob2xkcyB1c2VmdWwgZGV2ZWxvcG1lbnQgc2NyaXB0cy4KZGlmZiAtLWdpdCBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2ggYi9vdGhlci9zY3JpcHRzL2RldGFiLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhNzc4YTdjLi4wMDAwMDAwCi0tLSBhL290aGVyL3NjcmlwdHMvZGV0YWIuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi0jIFVuaXgvTGludXggc2hlbGwgc2NyaXB0IHRvIGNsZWFuIHVwIHdoaXRlc3BhY2UgaW4gYWxsIC5qYXZhIGZpbGVzIGluIGEgZGlyZWN0b3J5LgotIwotIyBBbGwgdGFicyBmb3VuZCBhcmUgcmVwbGFjZWQgd2l0aCA0IHNwYWNlcy4KLSMKLSMgQWRkIHRoZSBmb2xsb3dpbmcgdG8gYWxzbyByZW1vdmUgdHJhaWxpbmcgd2hpdGVzcGFjZSBmcm9tIGFsbCBsaW5lczoKLSMgICAgLWUgInMvXHNccyokLy8iICBcCi1maW5kIC4gLW5hbWUgIi5zdm4iIC1wcnVuZSAtbyAtbmFtZSAiKi5qYXZhIiAtZXhlYyBcCi0gIHNlZCAtLWluLXBsYWNlIFwKLSAgICAtZSAicy9cdC8gICAgL2ciICBcCi0gIHt9IFw7Cg==