ZGlmZiAtLWdpdCBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3RyYXgvVHJBWEZpbHRlci5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdGMvdHJheC9UckFYRmlsdGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3MjEyMDguLjAwMDAwMDAKLS0tIGEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdGMvdHJheC9UckFYRmlsdGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vKgotICogQCgjKSRJZCQKLSAqCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBAYXV0aG9yIEcuIFRvZGQgTWlsbGVyIAotICoKLSAqLwotCi0KLXBhY2thZ2Ugb3JnLmFwYWNoZS54YWxhbi54c2x0Yy50cmF4OwotCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MRmlsdGVyOwotaW1wb3J0IG9yZy54bWwuc2F4LmhlbHBlcnMuWE1MRmlsdGVySW1wbDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsKLQotCi0vKioKLSAqIHNrZWxldG9uIGV4dGVuc2lvbiBvZiBYTUxGaWx0ZXJJbXBsIGZvciBub3cuICAKLSAqLwotcHVibGljIGNsYXNzIFRyQVhGaWx0ZXIgZXh0ZW5kcyBYTUxGaWx0ZXJJbXBsIHsKLSAgICBwdWJsaWMgVHJBWEZpbHRlcihUZW1wbGF0ZXMgdGVtcGxhdGVzKSAgdGhyb3dzIAotCVRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQkvKiBub3RoaW5nIHlldCAqLyAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvb3JnL2FwYWNoZS94YWxhbi94c2x0Yy90cmF4L1RyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YSBiL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NmI5NTY0Li4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3RyYXgvVHJhbnNmb3JtZXJGYWN0b3J5SW1wbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8qCi0gKiBAKCMpJElkJAotICoKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEsIFN1bgotICogTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotICoKLSAqIEBhdXRob3IgRy4gVG9kZCBNaWxsZXIgCi0gKgotICovCi0KLQotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXg7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lcjsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckV4Y2VwdGlvbjsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5FcnJvckxpc3RlbmVyOyAKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOyAKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1SZXN1bHQ7IAotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7IAotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOyAKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnNheC5TQVhUcmFuc2Zvcm1lckZhY3Rvcnk7IAotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MRmlsdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5UcmFuc2xldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLlhTTFRDOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdGMuY29tcGlsZXIuQ29tcGlsZXJFeGNlcHRpb247Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlci51dGlsLlV0aWw7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5ydW50aW1lLkFic3RyYWN0VHJhbnNsZXQ7Ci0KLWltcG9ydCBqYXZhLmlvLkZpbGU7Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5ldC5VUkw7Ci1pbXBvcnQgamF2YS5uZXQuTWFsZm9ybWVkVVJMRXhjZXB0aW9uOwotCi0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYSBKQVhQMS4xIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBmb3IgVHJhbnNsZXRzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBleHRlbmRzIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB7Ci0gICAgcHVibGljIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwoKSB7IC8qIG5vdGhpbmcgeWV0ICovIH0KLQotICAgIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyAKLSAgICAvLyBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgKHN1YmNsYXNzIG9mIFRyYW5zZm9ybWVyRmFjdG9yeSkKLSAgICAvLwotICAgIHB1YmxpYyBUZW1wbGF0ZXNIYW5kbGVyIG5ld1RlbXBsYXRlc0hhbmRsZXIoKSAKLQl0aHJvd3MgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIAotICAgIHsgCi0JLypUQkQqLwotCXRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0JICAgICJUcmFuc2Zvcm1lckZhY3RvcnlJbXBsOm5ld1RlbXBsYXRlc0hhbmRsZXIoKSAiICsKLQkgICAgIm5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7IAotCS8vcmV0dXJuIG51bGw7IAotICAgIH0KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXJIYW5kbGVyIG5ld1RyYW5zZm9ybWVySGFuZGxlcigpIAotCXRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gCi0gICAgewotCS8qVEJEKi8gCi0gICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAiVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDpuZXdUcmFuc2Zvcm1lckhhbmRsZXIoKSAiICsKLSAgICAgICAgICAgICJub3QgaW1wbGVtZW50ZWQgeWV0LiIpOyAKLQkvLyByZXR1cm4gbnVsbDsgCi0gICAgfQotICAgIHB1YmxpYyBUcmFuc2Zvcm1lckhhbmRsZXIgbmV3VHJhbnNmb3JtZXJIYW5kbGVyKFNvdXJjZSBzcmMpIAotCXRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gCi0gICAgeyAKLSAgICAgICAgLypUQkQqLyAKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUcmFuc2Zvcm1lckZhY3RvcnlJbXBsOm5ld1RyYW5zZm9ybWVySGFuZGxlcihTb3VyY2UpICIgKwotICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7IAotCS8vIHJldHVybiBudWxsOyAKLSAgICB9Ci0gICAgcHVibGljIFRyYW5zZm9ybWVySGFuZGxlciBuZXdUcmFuc2Zvcm1lckhhbmRsZXIoVGVtcGxhdGVzIHRlbXBsYXRlcykgCi0JdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAKLSAgICB7IAotICAgICAgICAvKlRCRCovIAotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgIlRyYW5zZm9ybWVyRmFjdG9yeUltcGw6bmV3VHJhbnNmb3JtZXJIYW5kbGVyKFRlbXBsYXRlcykgIiArCi0gICAgICAgICAgICAibm90IGltcGxlbWVudGVkIHlldC4iKTsgCi0JLy9yZXR1cm4gbnVsbDsgCi0gICAgfQotCi0KLSAgLyoqCi0gICAqIENyZWF0ZSBhbiBYTUxGaWx0ZXIgdGhhdCB1c2VzIHRoZSBnaXZlbiBzb3VyY2UgYXMgdGhlCi0gICAqIHRyYW5zZm9ybWF0aW9uIGluc3RydWN0aW9ucy4KLSAgICoKLSAgICogQHBhcmFtIHNyYyBUaGUgc291cmNlIG9mIHRoZSB0cmFuc2Zvcm1hdGlvbiBpbnN0cnVjdGlvbnMuCi0gICAqCi0gICAqIEByZXR1cm4gQW4gWE1MRmlsdGVyIG9iamVjdCwgb3IgbnVsbCBpZiB0aGlzIGZlYXR1cmUgaXMgbm90IHN1cHBvcnRlZC4KLSAgICoKLSAgICogQHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICovCi0gICAgcHVibGljIFhNTEZpbHRlciBuZXdYTUxGaWx0ZXIoU291cmNlIHNyYykgCi0JdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAKLSAgICB7Ci0JVGVtcGxhdGVzIHRlbXBsYXRlcyA9IG5ld1RlbXBsYXRlcyhzcmMpOwotCWlmICh0ZW1wbGF0ZXMgPT0gbnVsbCApIHsKLQkgICAgcmV0dXJuIG51bGw7IAotCX0KLQlyZXR1cm4gbmV3WE1MRmlsdGVyKHRlbXBsYXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFhNTEZpbHRlciBuZXdYTUxGaWx0ZXIoVGVtcGxhdGVzIHRlbXBsYXRlcykgCi0JdGhyb3dzIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiAKLSAgICB7Ci0JdHJ5IHsKLSAgICAgIAkgICAgcmV0dXJuIG5ldyBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXguVHJBWEZpbHRlcih0ZW1wbGF0ZXMpOwotICAgIAl9IGNhdGNoKCBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gZXggKSB7Ci0gICAgICAJICAgIGlmKCBfZXJyb3JMaXN0ZW5lciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAJICAgIF9lcnJvckxpc3RlbmVyLmZhdGFsRXJyb3IoIGV4ICk7Ci0gICAgICAgICAgCSAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgCX0gY2F0Y2goIFRyYW5zZm9ybWVyRXhjZXB0aW9uIGV4MSApIHsKLSAgICAgICAgICAJICAgIG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oZXgxKTsKLSAgICAgICAgCX0KLSAgICAgIAkgICAgfQotICAgICAgCSAgICB0aHJvdyBleDsKLSAgICAJfQotICAgIH0KLSAgICAvLwotICAgIC8vIEVuZCBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgbWV0aG9kcyAKLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gCi0KLSAgICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8gCi0gICAgLy8gVHJhbnNmb3JtZXJGYWN0b3J5Ci0gICAgLy8KLSAgICBwdWJsaWMgRXJyb3JMaXN0ZW5lciBnZXRFcnJvckxpc3RlbmVyKCkgeyAKLQlyZXR1cm4gX2Vycm9yTGlzdGVuZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RXJyb3JMaXN0ZW5lcihFcnJvckxpc3RlbmVyIGxpc3RlbmVyKSAKLQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgewotCWlmIChsaXN0ZW5lciA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIkVycm9yOiBzZXRFcnJvckxpc3RlbmVyKCkgY2FsbCB3aGVyZSBFcnJvckxpc3RlbmVyIGlzIG51bGwiKTsKLQl9Ci0JX2Vycm9yTGlzdGVuZXIgPSBsaXN0ZW5lcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgCi0JdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbgotICAgIHsgCi0JLypUQkQqLyAKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUcmFuc2Zvcm1lckZhY3RvcnlJbXBsOmdldEF0dHJpYnV0ZShTdHJpbmcpICIgKwotICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7Ci0JLy9yZXR1cm4gbnVsbDsgCi0gICAgfQotICAgIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSAKLQl0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgeyAKLQkvKlRCRCovICAKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUcmFuc2Zvcm1lckZhY3RvcnlJbXBsOmdldEF0dHJpYnV0ZShTdHJpbmcpICIgKwotICAgICAgICAgICAgIm5vdCBpbXBsZW1lbnRlZCB5ZXQuIik7Ci0gICAgfQotICAgIHB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpIHsgCi0JaWYgKChTdHJlYW1Tb3VyY2UuRkVBVFVSRSA9PSBuYW1lKSB8fAotCSAgICAoU3RyZWFtUmVzdWx0LkZFQVRVUkUgPT0gbmFtZSkgfHwKLQkgICAgKFNBWFRyYW5zZm9ybWVyRmFjdG9yeS5GRUFUVVJFID09IG5hbWUpKSB7Ci0JICAgIHJldHVybiB0cnVlOwotCX0gZWxzZSBpZiAoKFN0cmVhbVNvdXJjZS5GRUFUVVJFLmVxdWFscyhuYW1lKSkKLQkJfHwgKFN0cmVhbVJlc3VsdC5GRUFUVVJFLmVxdWFscyhuYW1lKSkKLQkJfHwgKFNBWFRyYW5zZm9ybWVyRmFjdG9yeS5GRUFUVVJFLmVxdWFscyhuYW1lKSkpIHsKLQkgICAgcmV0dXJuIHRydWU7Ci0JfSBlbHNlIHsKLSAJICAgIHJldHVybiBmYWxzZTsgCi0JfQotICAgIH0gCi0gICAgcHVibGljIFVSSVJlc29sdmVyIGdldFVSSVJlc29sdmVyKCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9IAotICAgIHB1YmxpYyB2b2lkIHNldFVSSVJlc29sdmVyKFVSSVJlc29sdmVyIHJlc29sdmVyKSB7LypUQkQqLyAgIH0gCi0gICAgcHVibGljIFNvdXJjZSBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldChTb3VyY2Ugc3JjLCBTdHJpbmcgbWVkaWEsCi0JU3RyaW5nIHRpdGxlLCBTdHJpbmcgY2hhcnNldCkgIHRocm93cyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgICB7IAotCS8qVEJEKi8gCi0gICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAiVHJhbnNmb3JtZXJGYWN0b3J5SW1wbDpnZXRBc3NvY2lhdGVkU3R5bGVzaGVldChTb3VyY2UsU3RyaW5nLCIgKwotICAgICAgICAgICAgIlN0cmluZywgU3RyaW5nKSBub3QgaW1wbGVtZW50ZWQgeWV0LiIpOwotCS8vcmV0dXJuIG51bGw7IAotICAgIH0KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXIgbmV3VHJhbnNmb3JtZXIoKSB0aHJvd3MKLQlUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24gCi0gICAgeyAKLQkvKlRCRCovIAotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgIlRyYW5zZm9ybWVyRmFjdG9yeUltcGw6bmV3VHJhbnNmb3JtZXIoKSAiICsKLSAgICAgICAgICAgICIgbm90IGltcGxlbWVudGVkIHlldC4iKTsKLQkvL3JldHVybiBudWxsOyAKLSAgICB9Ci0gICAgLy8KLSAgICAvLyBFbmQgVHJhbnNmb3JtZXJGYWN0b3J5IG1ldGhvZHMgCi0gICAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIAotCi0KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXIgbmV3VHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIHRocm93cwotCVRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICAgIHsKLQlYU0xUQyB4c2x0YyA9IG5ldyBYU0xUQygpOwotCXhzbHRjLmluaXQoKTsKLQotCS8vIGNoZWNrIGlmIGRlc3RpbmF0aW9uIGhhcyBiZWVuIHNldCB3aXRoIHN5c3RlbSBwcm9wZXJ0eQotCVN0cmluZyB0cmFuc2xldERlc3REaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRyYW5zbGV0UG9vbCIpOwotCWlmICh0cmFuc2xldERlc3REaXIgIT0gbnVsbCkgewotCSAgICB0cnkgewotCSAgICAgICAgeHNsdGMuc2V0RGVzdERpcmVjdG9yeSh0cmFuc2xldERlc3REaXIpOwotCSAgICB9IGNhdGNoKENvbXBpbGVyRXhjZXB0aW9uIGUpICB7Ci0JCXRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0JCSAgICAiU3lzdGVtIHByb3BlcnR5ICd0cmFuc2xldFBvb2wnIHdhcyBzZXQgdG8gICIgKyAKLQkJICAgIHRyYW5zbGV0RGVzdERpciArICIsICIgKyBlICk7Ci0JICAgIH0KLSAJfQotCi0gICAgICAgIC8vIGNvbXBpbGUgc3R5bGVzaGVldAotICAgICAgICBib29sZWFuIGlzU3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgICAgIFN0cmVhbVNvdXJjZSBzdHJtc3JjID0gKFN0cmVhbVNvdXJjZSlzdHlsZXNoZWV0OwotICAgICAgICBJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHN0cm1zcmMuZ2V0SW5wdXRTdHJlYW0oKTsKLSAgICAgICAgU3RyaW5nIHN0eWxlc2hlZXROYW1lID0gc3R5bGVzaGVldC5nZXRTeXN0ZW1JZCgpOwotICAgICAgICBTdHJpbmcgdHJhbnNsZXROYW1lID0gIm5vX25hbWUiOwotICAgICAgICBpZiAoaW5wdXRTdHJlYW0gIT0gbnVsbCkgewotICAgICAgICAgICAgaXNTdWNjZXNzZnVsID0geHNsdGMuY29tcGlsZShpbnB1dFN0cmVhbSwgdHJhbnNsZXROYW1lKTsKLSAgICAgICAgfSBlbHNlIGlmIChzdHlsZXNoZWV0TmFtZSAhPSBudWxsICl7Ci0gICAgICAgICAgICB0cmFuc2xldE5hbWUgPSBVdGlsLnRvSmF2YU5hbWUoVXRpbC5ub0V4dE5hbWUoCi0JCVV0aWwuYmFzZU5hbWUoc3R5bGVzaGVldE5hbWUpKSk7Ci0gICAgICAgICAgICB0cnkgewotCQlpZiAoc3R5bGVzaGVldE5hbWUuc3RhcnRzV2l0aCgiZmlsZTovIikpIHsKLSAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzZnVsID0geHNsdGMuY29tcGlsZShuZXcgVVJMKHN0eWxlc2hlZXROYW1lKSk7Ci0JCX0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHN0eWxlc2hlZXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzZnVsID0geHNsdGMuY29tcGlsZSh1cmwpOwotCQl9Ci0gICAgICAgICAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJVUkwgZm9yIHN0eWxlc2hlZXQgJyIgKyBzdHlsZXNoZWV0TmFtZSArCi0gICAgICAgICAgICAgICAgICAgICInIGNhbiBub3QgYmUgZm9ybWVkLiIpOwotICAgICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJTdHlsZXNoZWV0IG11c3QgaGF2ZSBhIHN5c3RlbSBpZCBvciBiZSBhbiBJbnB1dFN0cmVhbS4iKTsKLSAgICAgICAgfQotCi0JaWYgKCFpc1N1Y2Nlc3NmdWwpIHsKLQkgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLQkJIkNvbXBpbGF0aW9uIG9mIHN0eWxlc2hlZXQgJyIgKyBzdHlsZXNoZWV0TmFtZSArICInIGZhaWxlZC4iKTsKLQl9Ci0KLQlUcmFuc2xldCB0cmFuc2xldCA9IG51bGw7Ci0JdHJ5IHsKLQkgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRyYW5zbGV0TmFtZSk7Ci0JICAgIHRyYW5zbGV0ID0gKFRyYW5zbGV0KWNsYXp6Lm5ld0luc3RhbmNlKCk7Ci0JICAgICgoQWJzdHJhY3RUcmFuc2xldCl0cmFuc2xldCkuc2V0VHJhbnNsZXROYW1lKHRyYW5zbGV0TmFtZSk7Ci0JICAgIC8vIEdUTQotCSAgICBpZiAoX2Vycm9yTGlzdGVuZXIgIT0gbnVsbCkgewotCSAgICAgICAgKChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0KS5zZXRFcnJvckxpc3RlbmVyKF9lcnJvckxpc3RlbmVyKTsKLQkgICAgfQotCX0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotCSAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotCQkiVHJhbnNsZXQgY2xhc3MgJyIgKyB0cmFuc2xldE5hbWUgKyAiJyBub3QgZm91bmQuIik7Ci0JfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0JICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0JCSJUcmFuc2xldCBjbGFzcyAnIiArIHRyYW5zbGV0TmFtZSArIAotCQkiJyBjb3VsZCBub3QgYmUgaW5zdGFudGlhdGVkIik7Ci0JfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiAgZSkgewotCSAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotCQkiVHJhbnNsZXQgY2xhc3MgJyIgKyB0cmFuc2xldE5hbWUgKyAiJyBjb3VsZCBub3QgYmUgYWNjZXNzZWQuIik7Ci0JfQotCXJldHVybiAoQWJzdHJhY3RUcmFuc2xldCl0cmFuc2xldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVtcGxhdGVzIG5ld1RlbXBsYXRlcyhTb3VyY2Ugc3R5bGVzaGVldCkgdGhyb3dzCi0gICAgICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIAotICAgIHsKLQlyZXR1cm4gbmV3IFRyYW5zbGV0VGVtcGxhdGVzKHN0eWxlc2hlZXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgRXJyb3JMaXN0ZW5lciBfZXJyb3JMaXN0ZW5lciA9IG51bGw7IAotfQpkaWZmIC0tZ2l0IGEvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdGMvdHJheC9UcmFuc2xldFRlbXBsYXRlcy5qYXZhIGIvc3JjL29yZy9hcGFjaGUveGFsYW4veHNsdGMvdHJheC9UcmFuc2xldFRlbXBsYXRlcy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNTQwNzJjLi4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvYXBhY2hlL3hhbGFuL3hzbHRjL3RyYXgvVHJhbnNsZXRUZW1wbGF0ZXMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4MCArMCwwIEBACi0vKgotICogQCgjKSRJZCQKLSAqCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAqCi0gKiBAYXV0aG9yIEcuIFRvZGQgTWlsbGVyIAotICoKLSAqLwotcGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnRyYXg7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOyAKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOyAKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbjsgCi1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OyAKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZS5BYnN0cmFjdFRyYW5zbGV0OwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdGMuY29tcGlsZXIuWFNMVEM7Ci1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlci5Db21waWxlckV4Y2VwdGlvbjsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLnV0aWwuVXRpbDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLlRyYW5zbGV0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uZXQuVVJMOwotaW1wb3J0IGphdmEubmV0Lk1hbGZvcm1lZFVSTEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbXBsZW1lbnRhdGlvbiBvZiBhIEpBWFAxLjEgVGVtcGxhdGVzIG9iamVjdCBmb3IgVHJhbnNsZXRzLgotICovIAotcHVibGljIGNsYXNzIFRyYW5zbGV0VGVtcGxhdGVzIGltcGxlbWVudHMgVGVtcGxhdGVzIHsKLSAgICBwcml2YXRlIFNvdXJjZSBfc3R5bGVzaGVldDsKLQotICAgIHB1YmxpYyBUcmFuc2xldFRlbXBsYXRlcyhTb3VyY2Ugc3R5bGVzaGVldCkgewotCV9zdHlsZXNoZWV0ID0gc3R5bGVzaGVldDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVHJhbnNmb3JtZXIgbmV3VHJhbnNmb3JtZXIoKSB0aHJvd3MgCi0JVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gICAgewotICAgICAgICBYU0xUQyB4c2x0YyA9IG5ldyBYU0xUQygpOwotICAgICAgICB4c2x0Yy5pbml0KCk7Ci0KLSAgICAgICAgLy8gY2hlY2sgaWYgZGVzdGluYXRpb24gaGFzIGJlZW4gc2V0IHdpdGggc3lzdGVtIHByb3BlcnR5Ci0gICAgICAgIFN0cmluZyB0cmFuc2xldERlc3REaXIgPSBTeXN0ZW0uZ2V0UHJvcGVydHkoInRyYW5zbGV0UG9vbCIpOwotICAgICAgICBpZiAodHJhbnNsZXREZXN0RGlyICE9IG51bGwpIHsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgeHNsdGMuc2V0RGVzdERpcmVjdG9yeSh0cmFuc2xldERlc3REaXIpOwotICAgICAgICAgICAgfSBjYXRjaChDb21waWxlckV4Y2VwdGlvbiBlKSAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJTeXN0ZW0gcHJvcGVydHkgJ3RyYW5zbGV0UG9vbCcgd2FzIHNldCB0byAgIiArCi0gICAgICAgICAgICAgICAgICAgIHRyYW5zbGV0RGVzdERpciArICIsICIgKyBlICk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotCi0JLy8gY29tcGlsZSBzdHlsZXNoZWV0Ci0JYm9vbGVhbiBpc1N1Y2Nlc3NmdWwgPSB0cnVlOwotCVN0cmVhbVNvdXJjZSBzdHJtc3JjID0gKFN0cmVhbVNvdXJjZSlfc3R5bGVzaGVldDsKLQlJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHN0cm1zcmMuZ2V0SW5wdXRTdHJlYW0oKTsKLQlTdHJpbmcgc3R5bGVzaGVldE5hbWUgPSBfc3R5bGVzaGVldC5nZXRTeXN0ZW1JZCgpOwotCVN0cmluZyB0cmFuc2xldE5hbWUgPSAibm9fbmFtZSI7Ci0JaWYgKGlucHV0U3RyZWFtICE9IG51bGwpIHsKLQkgICAgaXNTdWNjZXNzZnVsID0geHNsdGMuY29tcGlsZShpbnB1dFN0cmVhbSwgdHJhbnNsZXROYW1lKTsKLQl9IGVsc2UgaWYgKHN0eWxlc2hlZXROYW1lICE9IG51bGwgKXsKLS8qKioqKioqKioqKioqKioqKioKLQkgICAgaW50IGluZGV4ID0gc3R5bGVzaGVldE5hbWUuaW5kZXhPZignLicpOwotCSAgICBpZiAoaW5kZXggPiAwKSB7IAotICAgICAgICAgICAgICAgIHRyYW5zbGV0TmFtZSA9IHN0eWxlc2hlZXROYW1lLnN1YnN0cmluZygwLGluZGV4KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgewotICAgICAgICAgICAgICAgIC8vIGluZGV4T2YgcmV0dXJucyAtMSBpZiAnLicgaXMgbm90IHByZXNlbnQKLSAgICAgICAgICAgICAgICB0cmFuc2xldE5hbWUgPSBzdHlsZXNoZWV0TmFtZTsKLSAgICAgICAgICAgIH0gICAKLSoqKioqKioqKioqKioqKioqKioqLwotCSAgICB0cmFuc2xldE5hbWUgPSBVdGlsLnRvSmF2YU5hbWUoVXRpbC5ub0V4dE5hbWUoCi0gICAgICAgICAgICAgICAgVXRpbC5iYXNlTmFtZShzdHlsZXNoZWV0TmFtZSkpKTsKLSAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgaWYgKHN0eWxlc2hlZXROYW1lLnN0YXJ0c1dpdGgoImZpbGU6LyIpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlzU3VjY2Vzc2Z1bCA9IHhzbHRjLmNvbXBpbGUobmV3IFVSTChzdHlsZXNoZWV0TmFtZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHN0eWxlc2hlZXROYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgICAgICAgICAgICAgICAgaXNTdWNjZXNzZnVsID0geHNsdGMuY29tcGlsZSh1cmwpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gY2F0Y2ggKE1hbGZvcm1lZFVSTEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIlVSTCBmb3Igc3R5bGVzaGVldCAnIiArIHN0eWxlc2hlZXROYW1lICsKLSAgICAgICAgICAgICAgICAgICAgIicgY2FuIG5vdCBiZSBmb3JtZWQuIik7Ci0JICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLQkgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotCQkiU3R5bGVzaGVldCBtdXN0IGhhdmUgYSBzeXN0ZW0gaWQgb3IgYmUgYW4gSW5wdXRTdHJlYW0uIik7IAotCX0KLQotICAgICAgICBpZiAoIWlzU3VjY2Vzc2Z1bCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ29tcGlsYXRpb24gb2Ygc3R5bGVzaGVldCAnIiArIHN0eWxlc2hlZXROYW1lICsgIicgZmFpbGVkLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgVHJhbnNsZXQgdHJhbnNsZXQgPSBudWxsOwotICAgICAgICB0cnkgewotICAgICAgICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRyYW5zbGV0TmFtZSk7Ci0gICAgICAgICAgICB0cmFuc2xldCA9IChUcmFuc2xldCljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgICAgICAgKChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0KS5zZXRUcmFuc2xldE5hbWUodHJhbnNsZXROYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUcmFuc2xldCBjbGFzcyAnIiArIHRyYW5zbGV0TmFtZSArICInIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgfSBjYXRjaCAoSW5zdGFudGlhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUcmFuc2xldCBjbGFzcyAnIiArIHRyYW5zbGV0TmFtZSArCi0gICAgICAgICAgICAgICAgIicgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCIpOwotICAgICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uICBlKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJUcmFuc2xldCBjbGFzcyAnIiArIHRyYW5zbGV0TmFtZSArICInIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4iKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEFic3RyYWN0VHJhbnNsZXQpdHJhbnNsZXQ7Ci0gICAgfQotCi0gICAgcHVibGljIFByb3BlcnRpZXMgZ2V0T3V0cHV0UHJvcGVydGllcygpIHsgCi0JLypUQkQqLyAKLQlyZXR1cm4gbmV3IFByb3BlcnRpZXMoKTsgCi0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvb3JnL3czYy9kb20vcmFuZ2VzL0RvY3VtZW50UmFuZ2UuamF2YSBiL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvRG9jdW1lbnRSYW5nZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YjUyMjY3Li4wMDAwMDAwCi0tLSBhL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvRG9jdW1lbnRSYW5nZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLnJhbmdlczsKLQotLyoqCi0gKiA8cD5TZWUgYWxzbyB0aGUgPGEgaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzJz5Eb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBUcmF2ZXJzYWwgYW5kIFJhbmdlIFNwZWNpZmljYXRpb248L2E+LgotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgRG9jdW1lbnRSYW5nZSB7Ci0gICAgLyoqCi0gICAgICogVGhpcyBpbnRlcmZhY2UgY2FuIGJlIG9idGFpbmVkIGZyb20gdGhlIG9iamVjdCBpbXBsZW1lbnRpbmcgdGhlIAotICAgICAqIDxjb2RlPkRvY3VtZW50PC9jb2RlPiBpbnRlcmZhY2UgdXNpbmcgYmluZGluZy1zcGVjaWZpYyBjYXN0aW5nIAotICAgICAqIG1ldGhvZHMuCi0gICAgICogQHJldHVybiBUaGUgaW5pdGlhbCBzdGF0ZSBvZiB0aGUgUmFuZ2UgcmV0dXJuZWQgZnJvbSB0aGlzIG1ldGhvZCBpcyAKLSAgICAgKiAgIHN1Y2ggdGhhdCBib3RoIG9mIGl0cyBib3VuZGFyeS1wb2ludHMgYXJlIHBvc2l0aW9uZWQgYXQgdGhlIAotICAgICAqICAgYmVnaW5uaW5nIG9mIHRoZSBjb3JyZXNwb25kaW5nIERvY3VtZW50LCBiZWZvcmUgYW55IGNvbnRlbnQuIFRoZSAKLSAgICAgKiAgIFJhbmdlIHJldHVybmVkIGNhbiBvbmx5IGJlIHVzZWQgdG8gc2VsZWN0IGNvbnRlbnQgYXNzb2NpYXRlZCB3aXRoIAotICAgICAqICAgdGhpcyBEb2N1bWVudCwgb3Igd2l0aCBEb2N1bWVudEZyYWdtZW50cyBhbmQgQXR0cnMgZm9yIHdoaWNoIHRoaXMgCi0gICAgICogICBEb2N1bWVudCBpcyB0aGUgPGNvZGU+b3duZXJEb2N1bWVudDwvY29kZT4uCi0gICAgICovCi0gICAgcHVibGljIFJhbmdlIGNyZWF0ZVJhbmdlKCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UuamF2YSBiL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0M2FiZS4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL3czYy9kb20vcmFuZ2VzL1JhbmdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAoYykgMjAwMCBXb3JsZCBXaWRlIFdlYiBDb25zb3J0aXVtLAotICogKE1hc3NhY2h1c2V0dHMgSW5zdGl0dXRlIG9mIFRlY2hub2xvZ3ksIEluc3RpdHV0IE5hdGlvbmFsIGRlCi0gKiBSZWNoZXJjaGUgZW4gSW5mb3JtYXRpcXVlIGV0IGVuIEF1dG9tYXRpcXVlLCBLZWlvIFVuaXZlcnNpdHkpLiBBbGwKLSAqIFJpZ2h0cyBSZXNlcnZlZC4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBXM0MncyBTb2Z0d2FyZQotICogSW50ZWxsZWN0dWFsIFByb3BlcnR5IExpY2Vuc2UuIFRoaXMgcHJvZ3JhbSBpcyBkaXN0cmlidXRlZCBpbiB0aGUKLSAqIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVzZWZ1bCwgYnV0IFdJVEhPVVQgQU5ZIFdBUlJBTlRZOyB3aXRob3V0IGV2ZW4KLSAqIHRoZSBpbXBsaWVkIHdhcnJhbnR5IG9mIE1FUkNIQU5UQUJJTElUWSBvciBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIKLSAqIFBVUlBPU0UuCi0gKiBTZWUgVzNDIExpY2Vuc2UgaHR0cDovL3d3dy53My5vcmcvQ29uc29ydGl1bS9MZWdhbC8gZm9yIG1vcmUgZGV0YWlscy4KLSAqLwotCi1wYWNrYWdlIG9yZy53M2MuZG9tLnJhbmdlczsKLQotaW1wb3J0IG9yZy53M2MuZG9tLk5vZGU7Ci1pbXBvcnQgb3JnLnczYy5kb20uRG9jdW1lbnRGcmFnbWVudDsKLWltcG9ydCBvcmcudzNjLmRvbS5ET01FeGNlcHRpb247Ci0KLS8qKgotICogPHA+U2VlIGFsc28gdGhlIDxhIGhyZWY9J2h0dHA6Ly93d3cudzMub3JnL1RSLzIwMDAvUkVDLURPTS1MZXZlbC0yLVRyYXZlcnNhbC1SYW5nZS0yMDAwMTExMyc+RG9jdW1lbnQgT2JqZWN0IE1vZGVsIChET00pIExldmVsIDIgVHJhdmVyc2FsIGFuZCBSYW5nZSBTcGVjaWZpY2F0aW9uPC9hPi4KLSAqIEBzaW5jZSBET00gTGV2ZWwgMgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJhbmdlIHsKLSAgICAvKioKLSAgICAgKiBOb2RlIHdpdGhpbiB3aGljaCB0aGUgUmFuZ2UgYmVnaW5zIAotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIAotICAgICAqICAgaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTm9kZSBnZXRTdGFydENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgd2l0aGluIHRoZSBzdGFydGluZyBub2RlIG9mIHRoZSBSYW5nZS4gCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0U3RhcnRPZmZzZXQoKQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogTm9kZSB3aXRoaW4gd2hpY2ggdGhlIFJhbmdlIGVuZHMgCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldEVuZENvbnRhaW5lcigpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBPZmZzZXQgd2l0aGluIHRoZSBlbmRpbmcgbm9kZSBvZiB0aGUgUmFuZ2UuIAotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIAotICAgICAqICAgaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEVuZE9mZnNldCgpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUUlVFIGlmIHRoZSBSYW5nZSBpcyBjb2xsYXBzZWQgCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldENvbGxhcHNlZCgpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVlcGVzdCBjb21tb24gYW5jZXN0b3IgY29udGFpbmVyIG9mIHRoZSBSYW5nZSdzIHR3byAKLSAgICAgKiBib3VuZGFyeS1wb2ludHMuCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBOb2RlIGdldENvbW1vbkFuY2VzdG9yQ29udGFpbmVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGF0dHJpYnV0ZXMgZGVzY3JpYmluZyB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlLiAKLSAgICAgKiBAcGFyYW0gcmVmTm9kZVRoZSA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSAKLSAgICAgKiAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBvZmZzZXRUaGUgPGNvZGU+c3RhcnRPZmZzZXQ8L2NvZGU+IHZhbHVlLiAKLSAgICAgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBvciBhbiBhbmNlc3RvciAKLSAgICAgKiAgIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwgTm90YXRpb24sIG9yIERvY3VtZW50VHlwZSAKLSAgICAgKiAgIG5vZGUuCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOREVYX1NJWkVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+b2Zmc2V0PC9jb2RlPiBpcyBuZWdhdGl2ZSBvciBncmVhdGVyIAotICAgICAqICAgdGhhbiB0aGUgbnVtYmVyIG9mIGNoaWxkIHVuaXRzIGluIDxjb2RlPnJlZk5vZGU8L2NvZGU+LiBDaGlsZCB1bml0cyAKLSAgICAgKiAgIGFyZSAxNi1iaXQgdW5pdHMgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSB0eXBlIG9mIENoYXJhY3RlckRhdGEgCi0gICAgICogICBub2RlIChlLmcuLCBhIFRleHQgb3IgQ29tbWVudCBub2RlKSBvciBhIFByb2Nlc3NpbmdJbnN0cnVjdGlvbiAKLSAgICAgKiAgIG5vZGUuIENoaWxkIHVuaXRzIGFyZSBOb2RlcyBpbiBhbGwgb3RoZXIgY2FzZXMuCi0gICAgICogICA8YnI+SU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzIGFscmVhZHkgCi0gICAgICogICBiZWVuIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnQoTm9kZSByZWZOb2RlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgYXR0cmlidXRlcyBkZXNjcmliaW5nIHRoZSBlbmQgb2YgYSBSYW5nZS4KLSAgICAgKiBAcGFyYW0gcmVmTm9kZVRoZSA8Y29kZT5yZWZOb2RlPC9jb2RlPiB2YWx1ZS4gVGhpcyBwYXJhbWV0ZXIgbXVzdCBiZSAKLSAgICAgKiAgIGRpZmZlcmVudCBmcm9tIDxjb2RlPm51bGw8L2NvZGU+LgotICAgICAqIEBwYXJhbSBvZmZzZXRUaGUgPGNvZGU+ZW5kT2Zmc2V0PC9jb2RlPiB2YWx1ZS4gCi0gICAgICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gb3IgYW4gYW5jZXN0b3IgCi0gICAgICogICBvZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhbiBFbnRpdHksIE5vdGF0aW9uLCBvciBEb2N1bWVudFR5cGUgCi0gICAgICogICBub2RlLgotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTkRFWF9TSVpFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm9mZnNldDwvY29kZT4gaXMgbmVnYXRpdmUgb3IgZ3JlYXRlciAKLSAgICAgKiAgIHRoYW4gdGhlIG51bWJlciBvZiBjaGlsZCB1bml0cyBpbiA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gQ2hpbGQgdW5pdHMgCi0gICAgICogICBhcmUgMTYtYml0IHVuaXRzIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgdHlwZSBvZiBDaGFyYWN0ZXJEYXRhIAotICAgICAqICAgbm9kZSAoZS5nLiwgYSBUZXh0IG9yIENvbW1lbnQgbm9kZSkgb3IgYSBQcm9jZXNzaW5nSW5zdHJ1Y3Rpb24gCi0gICAgICogICBub2RlLiBDaGlsZCB1bml0cyBhcmUgTm9kZXMgaW4gYWxsIG90aGVyIGNhc2VzLgotICAgICAqICAgPGJyPklOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IAotICAgICAqICAgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZChOb2RlIHJlZk5vZGUsIAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2Zmc2V0KQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHN0YXJ0IHBvc2l0aW9uIHRvIGJlIGJlZm9yZSBhIG5vZGUKLSAgICAgKiBAcGFyYW0gcmVmTm9kZVJhbmdlIHN0YXJ0cyBiZWZvcmUgPGNvZGU+cmVmTm9kZTwvY29kZT4gCi0gICAgICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mIAotICAgICAqICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvciBEb2N1bWVudEZyYWdtZW50IAotICAgICAqICAgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCAKLSAgICAgKiAgIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24gbm9kZS4KLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiAKLSAgICAgKiAgIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnRCZWZvcmUoTm9kZSByZWZOb2RlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgc3RhcnQgcG9zaXRpb24gdG8gYmUgYWZ0ZXIgYSBub2RlCi0gICAgICogQHBhcmFtIHJlZk5vZGVSYW5nZSBzdGFydHMgYWZ0ZXIgPGNvZGU+cmVmTm9kZTwvY29kZT4gCi0gICAgICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mIAotICAgICAqICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50LCBvciBEb2N1bWVudEZyYWdtZW50IAotICAgICAqICAgbm9kZSBvciBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBpcyBhIERvY3VtZW50LCBEb2N1bWVudEZyYWdtZW50LCAKLSAgICAgKiAgIEF0dHIsIEVudGl0eSwgb3IgTm90YXRpb24gbm9kZS4KLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiAKLSAgICAgKiAgIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgc2V0U3RhcnRBZnRlcihOb2RlIHJlZk5vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUmFuZ2VFeGNlcHRpb24sIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIGVuZCBwb3NpdGlvbiB0byBiZSBiZWZvcmUgYSBub2RlLiAKLSAgICAgKiBAcGFyYW0gcmVmTm9kZVJhbmdlIGVuZHMgYmVmb3JlIDxjb2RlPnJlZk5vZGU8L2NvZGU+IAotICAgICAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIHRoZSByb290IGNvbnRhaW5lciBvZiAKLSAgICAgKiAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIG5vdCBhbiBBdHRyLCBEb2N1bWVudCwgb3IgRG9jdW1lbnRGcmFnbWVudCAKLSAgICAgKiAgIG5vZGUgb3IgaWYgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgYSBEb2N1bWVudCwgRG9jdW1lbnRGcmFnbWVudCwgCi0gICAgICogICBBdHRyLCBFbnRpdHksIG9yIE5vdGF0aW9uIG5vZGUuCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNldEVuZEJlZm9yZShOb2RlIHJlZk5vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2V0cyB0aGUgZW5kIG9mIGEgUmFuZ2UgdG8gYmUgYWZ0ZXIgYSBub2RlIAotICAgICAqIEBwYXJhbSByZWZOb2RlUmFuZ2UgZW5kcyBhZnRlciA8Y29kZT5yZWZOb2RlPC9jb2RlPi4gCi0gICAgICogQGV4Y2VwdGlvbiBSYW5nZUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgdGhlIHJvb3QgY29udGFpbmVyIG9mIAotICAgICAqICAgPGNvZGU+cmVmTm9kZTwvY29kZT4gaXMgbm90IGFuIEF0dHIsIERvY3VtZW50IG9yIERvY3VtZW50RnJhZ21lbnQgCi0gICAgICogICBub2RlIG9yIGlmIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIAotICAgICAqICAgQXR0ciwgRW50aXR5LCBvciBOb3RhdGlvbiBub2RlLgotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIAotICAgICAqICAgaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZXRFbmRBZnRlcihOb2RlIHJlZk5vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFJhbmdlRXhjZXB0aW9uLCBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBDb2xsYXBzZSBhIFJhbmdlIG9udG8gb25lIG9mIGl0cyBib3VuZGFyeS1wb2ludHMgCi0gICAgICogQHBhcmFtIHRvU3RhcnRJZiBUUlVFLCBjb2xsYXBzZXMgdGhlIFJhbmdlIG9udG8gaXRzIHN0YXJ0OyBpZiBGQUxTRSwgCi0gICAgICogICBjb2xsYXBzZXMgaXQgb250byBpdHMgZW5kLiAKLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiAKLSAgICAgKiAgIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29sbGFwc2UoYm9vbGVhbiB0b1N0YXJ0KQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBTZWxlY3QgYSBub2RlIGFuZCBpdHMgY29udGVudHMgCi0gICAgICogQHBhcmFtIHJlZk5vZGVUaGUgbm9kZSB0byBzZWxlY3QuIAotICAgICAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IAotICAgICAqICAgaXMgYW4gRW50aXR5LCBOb3RhdGlvbiBvciBEb2N1bWVudFR5cGUgbm9kZSBvciBpZiAKLSAgICAgKiAgIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGEgRG9jdW1lbnQsIERvY3VtZW50RnJhZ21lbnQsIEF0dHIsIEVudGl0eSwgCi0gICAgICogICBvciBOb3RhdGlvbiBub2RlLgotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIAotICAgICAqICAgaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBzZWxlY3ROb2RlKE5vZGUgcmVmTm9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogU2VsZWN0IHRoZSBjb250ZW50cyB3aXRoaW4gYSBub2RlIAotICAgICAqIEBwYXJhbSByZWZOb2RlTm9kZSB0byBzZWxlY3QgZnJvbSAKLSAgICAgKiBAZXhjZXB0aW9uIFJhbmdlRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX05PREVfVFlQRV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5yZWZOb2RlPC9jb2RlPiBvciBhbiBhbmNlc3RvciAKLSAgICAgKiAgIG9mIDxjb2RlPnJlZk5vZGU8L2NvZGU+IGlzIGFuIEVudGl0eSwgTm90YXRpb24gb3IgRG9jdW1lbnRUeXBlIG5vZGUuCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHNlbGVjdE5vZGVDb250ZW50cyhOb2RlIHJlZk5vZGUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBSYW5nZUV4Y2VwdGlvbiwgRE9NRXhjZXB0aW9uOwotCi0gICAgLy8gQ29tcGFyZUhvdwotICAgIC8qKgotICAgICAqIENvbXBhcmUgc3RhcnQgYm91bmRhcnktcG9pbnQgb2YgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+IHRvIHN0YXJ0IAotICAgICAqIGJvdW5kYXJ5LXBvaW50IG9mIFJhbmdlIG9uIHdoaWNoIDxjb2RlPmNvbXBhcmVCb3VuZGFyeVBvaW50czwvY29kZT4gCi0gICAgICogaXMgaW52b2tlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IFNUQVJUX1RPX1NUQVJUICAgICAgICAgICAgPSAwOwotICAgIC8qKgotICAgICAqIENvbXBhcmUgc3RhcnQgYm91bmRhcnktcG9pbnQgb2YgPGNvZGU+c291cmNlUmFuZ2U8L2NvZGU+IHRvIGVuZCAKLSAgICAgKiBib3VuZGFyeS1wb2ludCBvZiBSYW5nZSBvbiB3aGljaCA8Y29kZT5jb21wYXJlQm91bmRhcnlQb2ludHM8L2NvZGU+IAotICAgICAqIGlzIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBTVEFSVF9UT19FTkQgICAgICAgICAgICAgID0gMTsKLSAgICAvKioKLSAgICAgKiBDb21wYXJlIGVuZCBib3VuZGFyeS1wb2ludCBvZiA8Y29kZT5zb3VyY2VSYW5nZTwvY29kZT4gdG8gZW5kIAotICAgICAqIGJvdW5kYXJ5LXBvaW50IG9mIFJhbmdlIG9uIHdoaWNoIDxjb2RlPmNvbXBhcmVCb3VuZGFyeVBvaW50czwvY29kZT4gCi0gICAgICogaXMgaW52b2tlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEVORF9UT19FTkQgICAgICAgICAgICAgICAgPSAyOwotICAgIC8qKgotICAgICAqIENvbXBhcmUgZW5kIGJvdW5kYXJ5LXBvaW50IG9mIDxjb2RlPnNvdXJjZVJhbmdlPC9jb2RlPiB0byBzdGFydCAKLSAgICAgKiBib3VuZGFyeS1wb2ludCBvZiBSYW5nZSBvbiB3aGljaCA8Y29kZT5jb21wYXJlQm91bmRhcnlQb2ludHM8L2NvZGU+IAotICAgICAqIGlzIGludm9rZWQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBzaG9ydCBFTkRfVE9fU1RBUlQgICAgICAgICAgICAgID0gMzsKLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgdGhlIGJvdW5kYXJ5LXBvaW50cyBvZiB0d28gUmFuZ2VzIGluIGEgZG9jdW1lbnQuCi0gICAgICogQHBhcmFtIGhvd0EgY29kZSByZXByZXNlbnRpbmcgdGhlIHR5cGUgb2YgY29tcGFyaXNvbiwgYXMgZGVmaW5lZCBhYm92ZS4KLSAgICAgKiBAcGFyYW0gc291cmNlUmFuZ2VUaGUgPGNvZGU+UmFuZ2U8L2NvZGU+IG9uIHdoaWNoIHRoaXMgY3VycmVudCAKLSAgICAgKiAgIDxjb2RlPlJhbmdlPC9jb2RlPiBpcyBjb21wYXJlZCB0by4KLSAgICAgKiBAcmV0dXJuICAtMSwgMCBvciAxIGRlcGVuZGluZyBvbiB3aGV0aGVyIHRoZSBjb3JyZXNwb25kaW5nIAotICAgICAqICAgYm91bmRhcnktcG9pbnQgb2YgdGhlIFJhbmdlIGlzIHJlc3BlY3RpdmVseSBiZWZvcmUsIGVxdWFsIHRvLCBvciAKLSAgICAgKiAgIGFmdGVyIHRoZSBjb3JyZXNwb25kaW5nIGJvdW5kYXJ5LXBvaW50IG9mIDxjb2RlPnNvdXJjZVJhbmdlPC9jb2RlPi4gCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIFdST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIHRoZSB0d28gUmFuZ2VzIGFyZSBub3QgaW4gdGhlIHNhbWUgCi0gICAgICogICBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50LgotICAgICAqICAgPGJyPklOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IAotICAgICAqICAgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBzaG9ydCBjb21wYXJlQm91bmRhcnlQb2ludHMoc2hvcnQgaG93LCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJhbmdlIHNvdXJjZVJhbmdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJlbW92ZXMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgZnJvbSB0aGUgY29udGFpbmluZyBkb2N1bWVudCBvciAKLSAgICAgKiBkb2N1bWVudCBmcmFnbWVudCB3aXRob3V0IHJldHVybmluZyBhIHJlZmVyZW5jZSB0byB0aGUgcmVtb3ZlZCAKLSAgICAgKiBjb250ZW50LiAgCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFueSBwb3J0aW9uIG9mIHRoZSBjb250ZW50IG9mIAotICAgICAqICAgdGhlIFJhbmdlIGlzIHJlYWQtb25seSBvciBhbnkgb2YgdGhlIG5vZGVzIHRoYXQgY29udGFpbiBhbnkgb2YgdGhlIAotICAgICAqICAgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlIHJlYWQtb25seS4KLSAgICAgKiAgIDxicj5JTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSAKLSAgICAgKiAgIGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBkZWxldGVDb250ZW50cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIE1vdmVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIGZyb20gdGhlIGNvbnRhaW5pbmcgZG9jdW1lbnQgb3IgZG9jdW1lbnQgCi0gICAgICogZnJhZ21lbnQgdG8gYSBuZXcgRG9jdW1lbnRGcmFnbWVudC4gCi0gICAgICogQHJldHVybiBBIERvY3VtZW50RnJhZ21lbnQgY29udGFpbmluZyB0aGUgZXh0cmFjdGVkIGNvbnRlbnRzLiAKLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW55IHBvcnRpb24gb2YgdGhlIGNvbnRlbnQgb2YgCi0gICAgICogICB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5IG9yIGFueSBvZiB0aGUgbm9kZXMgd2hpY2ggY29udGFpbiBhbnkgb2YgdGhlIAotICAgICAqICAgY29udGVudCBvZiB0aGUgUmFuZ2UgYXJlIHJlYWQtb25seS4KLSAgICAgKiAgIDxicj5ISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiBhIERvY3VtZW50VHlwZSBub2RlIHdvdWxkIGJlIAotICAgICAqICAgZXh0cmFjdGVkIGludG8gdGhlIG5ldyBEb2N1bWVudEZyYWdtZW50LgotICAgICAqICAgPGJyPklOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IAotICAgICAqICAgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyBEb2N1bWVudEZyYWdtZW50IGV4dHJhY3RDb250ZW50cygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBEdXBsaWNhdGVzIHRoZSBjb250ZW50cyBvZiBhIFJhbmdlIAotICAgICAqIEByZXR1cm4gQSBEb2N1bWVudEZyYWdtZW50IHRoYXQgY29udGFpbnMgY29udGVudCBlcXVpdmFsZW50IHRvIHRoaXMgCi0gICAgICogICBSYW5nZS4KLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgSElFUkFSQ0hZX1JFUVVFU1RfRVJSOiBSYWlzZWQgaWYgYSBEb2N1bWVudFR5cGUgbm9kZSB3b3VsZCBiZSAKLSAgICAgKiAgIGV4dHJhY3RlZCBpbnRvIHRoZSBuZXcgRG9jdW1lbnRGcmFnbWVudC4KLSAgICAgKiAgIDxicj5JTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSAKLSAgICAgKiAgIGJlZW4gaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRG9jdW1lbnRGcmFnbWVudCBjbG9uZUNvbnRlbnRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBJbnNlcnRzIGEgbm9kZSBpbnRvIHRoZSBEb2N1bWVudCBvciBEb2N1bWVudEZyYWdtZW50IGF0IHRoZSBzdGFydCBvZiAKLSAgICAgKiB0aGUgUmFuZ2UuIElmIHRoZSBjb250YWluZXIgaXMgYSBUZXh0IG5vZGUsIHRoaXMgd2lsbCBiZSBzcGxpdCBhdCB0aGUgCi0gICAgICogc3RhcnQgb2YgdGhlIFJhbmdlIChhcyBpZiB0aGUgVGV4dCBub2RlJ3Mgc3BsaXRUZXh0IG1ldGhvZCB3YXMgCi0gICAgICogcGVyZm9ybWVkIGF0IHRoZSBpbnNlcnRpb24gcG9pbnQpIGFuZCB0aGUgaW5zZXJ0aW9uIHdpbGwgb2NjdXIgCi0gICAgICogYmV0d2VlbiB0aGUgdHdvIHJlc3VsdGluZyBUZXh0IG5vZGVzLiBBZGphY2VudCBUZXh0IG5vZGVzIHdpbGwgbm90IGJlIAotICAgICAqIGF1dG9tYXRpY2FsbHkgbWVyZ2VkLiBJZiB0aGUgbm9kZSB0byBiZSBpbnNlcnRlZCBpcyBhIAotICAgICAqIERvY3VtZW50RnJhZ21lbnQgbm9kZSwgdGhlIGNoaWxkcmVuIHdpbGwgYmUgaW5zZXJ0ZWQgcmF0aGVyIHRoYW4gdGhlIAotICAgICAqIERvY3VtZW50RnJhZ21lbnQgbm9kZSBpdHNlbGYuCi0gICAgICogQHBhcmFtIG5ld05vZGVUaGUgbm9kZSB0byBpbnNlcnQgYXQgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSAKLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgTk9fTU9ESUZJQ0FUSU9OX0FMTE9XRURfRVJSOiBSYWlzZWQgaWYgYW4gYW5jZXN0b3IgY29udGFpbmVyIG9mIHRoZSAKLSAgICAgKiAgIHN0YXJ0IG9mIHRoZSBSYW5nZSBpcyByZWFkLW9ubHkuCi0gICAgICogICA8YnI+V1JPTkdfRE9DVU1FTlRfRVJSOiBSYWlzZWQgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4gYW5kIHRoZSAKLSAgICAgKiAgIGNvbnRhaW5lciBvZiB0aGUgc3RhcnQgb2YgdGhlIFJhbmdlIHdlcmUgbm90IGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSAKLSAgICAgKiAgIGRvY3VtZW50LgotICAgICAqICAgPGJyPkhJRVJBUkNIWV9SRVFVRVNUX0VSUjogUmFpc2VkIGlmIHRoZSBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIAotICAgICAqICAgdGhlIFJhbmdlIGlzIG9mIGEgdHlwZSB0aGF0IGRvZXMgbm90IGFsbG93IGNoaWxkcmVuIG9mIHRoZSB0eXBlIG9mIAotICAgICAqICAgPGNvZGU+bmV3Tm9kZTwvY29kZT4gb3IgaWYgPGNvZGU+bmV3Tm9kZTwvY29kZT4gaXMgYW4gYW5jZXN0b3Igb2YgCi0gICAgICogICB0aGUgY29udGFpbmVyLgotICAgICAqICAgPGJyPklOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IAotICAgICAqICAgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfTk9ERV9UWVBFX0VSUjogUmFpc2VkIGlmIDxjb2RlPm5ld05vZGU8L2NvZGU+IGlzIGFuIEF0dHIsIAotICAgICAqICAgRW50aXR5LCBOb3RhdGlvbiwgb3IgRG9jdW1lbnQgbm9kZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbnNlcnROb2RlKE5vZGUgbmV3Tm9kZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb24sIFJhbmdlRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmVwYXJlbnRzIHRoZSBjb250ZW50cyBvZiB0aGUgUmFuZ2UgdG8gdGhlIGdpdmVuIG5vZGUgYW5kIGluc2VydHMgdGhlIAotICAgICAqIG5vZGUgYXQgdGhlIHBvc2l0aW9uIG9mIHRoZSBzdGFydCBvZiB0aGUgUmFuZ2UuIAotICAgICAqIEBwYXJhbSBuZXdQYXJlbnRUaGUgbm9kZSB0byBzdXJyb3VuZCB0aGUgY29udGVudHMgd2l0aC4gCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIE5PX01PRElGSUNBVElPTl9BTExPV0VEX0VSUjogUmFpc2VkIGlmIGFuIGFuY2VzdG9yIGNvbnRhaW5lciBvZiAKLSAgICAgKiAgIGVpdGhlciBib3VuZGFyeS1wb2ludCBvZiB0aGUgUmFuZ2UgaXMgcmVhZC1vbmx5LgotICAgICAqICAgPGJyPldST05HX0RPQ1VNRU5UX0VSUjogUmFpc2VkIGlmIDxjb2RlPiBuZXdQYXJlbnQ8L2NvZGU+IGFuZCB0aGUgCi0gICAgICogICBjb250YWluZXIgb2YgdGhlIHN0YXJ0IG9mIHRoZSBSYW5nZSB3ZXJlIG5vdCBjcmVhdGVkIGZyb20gdGhlIHNhbWUgCi0gICAgICogICBkb2N1bWVudC4KLSAgICAgKiAgIDxicj5ISUVSQVJDSFlfUkVRVUVTVF9FUlI6IFJhaXNlZCBpZiB0aGUgY29udGFpbmVyIG9mIHRoZSBzdGFydCBvZiAKLSAgICAgKiAgIHRoZSBSYW5nZSBpcyBvZiBhIHR5cGUgdGhhdCBkb2VzIG5vdCBhbGxvdyBjaGlsZHJlbiBvZiB0aGUgdHlwZSBvZiAKLSAgICAgKiAgIDxjb2RlPm5ld1BhcmVudDwvY29kZT4gb3IgaWYgPGNvZGU+bmV3UGFyZW50PC9jb2RlPiBpcyBhbiBhbmNlc3RvciAKLSAgICAgKiAgIG9mIHRoZSBjb250YWluZXIgb3IgaWYgPGNvZGU+bm9kZTwvY29kZT4gd291bGQgZW5kIHVwIHdpdGggYSBjaGlsZCAKLSAgICAgKiAgIG5vZGUgb2YgYSB0eXBlIG5vdCBhbGxvd2VkIGJ5IHRoZSB0eXBlIG9mIDxjb2RlPm5vZGU8L2NvZGU+LgotICAgICAqICAgPGJyPklOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IAotICAgICAqICAgYmVlbiBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqIEBleGNlcHRpb24gUmFuZ2VFeGNlcHRpb24KLSAgICAgKiAgIEJBRF9CT1VOREFSWVBPSU5UU19FUlI6IFJhaXNlZCBpZiB0aGUgUmFuZ2UgcGFydGlhbGx5IHNlbGVjdHMgYSAKLSAgICAgKiAgIG5vbi10ZXh0IG5vZGUuCi0gICAgICogICA8YnI+SU5WQUxJRF9OT0RFX1RZUEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+IG5vZGU8L2NvZGU+IGlzIGFuIEF0dHIsIAotICAgICAqICAgRW50aXR5LCBEb2N1bWVudFR5cGUsIE5vdGF0aW9uLCBEb2N1bWVudCwgb3IgRG9jdW1lbnRGcmFnbWVudCBub2RlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHN1cnJvdW5kQ29udGVudHMoTm9kZSBuZXdQYXJlbnQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uLCBSYW5nZUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFByb2R1Y2VzIGEgbmV3IFJhbmdlIHdob3NlIGJvdW5kYXJ5LXBvaW50cyBhcmUgZXF1YWwgdG8gdGhlIAotICAgICAqIGJvdW5kYXJ5LXBvaW50cyBvZiB0aGUgUmFuZ2UuIAotICAgICAqIEByZXR1cm4gVGhlIGR1cGxpY2F0ZWQgUmFuZ2UuIAotICAgICAqIEBleGNlcHRpb24gRE9NRXhjZXB0aW9uCi0gICAgICogICBJTlZBTElEX1NUQVRFX0VSUjogUmFpc2VkIGlmIDxjb2RlPmRldGFjaCgpPC9jb2RlPiBoYXMgYWxyZWFkeSBiZWVuIAotICAgICAqICAgaW52b2tlZCBvbiB0aGlzIG9iamVjdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmFuZ2UgY2xvbmVSYW5nZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERPTUV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGNvbnRlbnRzIG9mIGEgUmFuZ2UgYXMgYSBzdHJpbmcuIFRoaXMgc3RyaW5nIGNvbnRhaW5zIG9ubHkgCi0gICAgICogdGhlIGRhdGEgY2hhcmFjdGVycywgbm90IGFueSBtYXJrdXAuIAotICAgICAqIEByZXR1cm4gVGhlIGNvbnRlbnRzIG9mIHRoZSBSYW5nZS4KLSAgICAgKiBAZXhjZXB0aW9uIERPTUV4Y2VwdGlvbgotICAgICAqICAgSU5WQUxJRF9TVEFURV9FUlI6IFJhaXNlZCBpZiA8Y29kZT5kZXRhY2goKTwvY29kZT4gaGFzIGFscmVhZHkgYmVlbiAKLSAgICAgKiAgIGludm9rZWQgb24gdGhpcyBvYmplY3QuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRE9NRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHRvIGluZGljYXRlIHRoYXQgdGhlIFJhbmdlIGlzIG5vIGxvbmdlciBpbiB1c2UgYW5kIHRoYXQgdGhlIAotICAgICAqIGltcGxlbWVudGF0aW9uIG1heSByZWxpbnF1aXNoIGFueSByZXNvdXJjZXMgYXNzb2NpYXRlZCB3aXRoIHRoaXMgCi0gICAgICogUmFuZ2UuIFN1YnNlcXVlbnQgY2FsbHMgdG8gYW55IG1ldGhvZHMgb3IgYXR0cmlidXRlIGdldHRlcnMgb24gdGhpcyAKLSAgICAgKiBSYW5nZSB3aWxsIHJlc3VsdCBpbiBhIDxjb2RlPkRPTUV4Y2VwdGlvbjwvY29kZT4gYmVpbmcgdGhyb3duIHdpdGggYW4gCi0gICAgICogZXJyb3IgY29kZSBvZiA8Y29kZT5JTlZBTElEX1NUQVRFX0VSUjwvY29kZT4uCi0gICAgICogQGV4Y2VwdGlvbiBET01FeGNlcHRpb24KLSAgICAgKiAgIElOVkFMSURfU1RBVEVfRVJSOiBSYWlzZWQgaWYgPGNvZGU+ZGV0YWNoKCk8L2NvZGU+IGhhcyBhbHJlYWR5IGJlZW4gCi0gICAgICogICBpbnZva2VkIG9uIHRoaXMgb2JqZWN0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGRldGFjaCgpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBET01FeGNlcHRpb247Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24uamF2YSBiL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvUmFuZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTUxMDA4ZS4uMDAwMDAwMAotLS0gYS9zcmMvb3JnL3czYy9kb20vcmFuZ2VzL1JhbmdlRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IChjKSAyMDAwIFdvcmxkIFdpZGUgV2ViIENvbnNvcnRpdW0sCi0gKiAoTWFzc2FjaHVzZXR0cyBJbnN0aXR1dGUgb2YgVGVjaG5vbG9neSwgSW5zdGl0dXQgTmF0aW9uYWwgZGUKLSAqIFJlY2hlcmNoZSBlbiBJbmZvcm1hdGlxdWUgZXQgZW4gQXV0b21hdGlxdWUsIEtlaW8gVW5pdmVyc2l0eSkuIEFsbAotICogUmlnaHRzIFJlc2VydmVkLiBUaGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIFczQydzIFNvZnR3YXJlCi0gKiBJbnRlbGxlY3R1YWwgUHJvcGVydHkgTGljZW5zZS4gVGhpcyBwcm9ncmFtIGlzIGRpc3RyaWJ1dGVkIGluIHRoZQotICogaG9wZSB0aGF0IGl0IHdpbGwgYmUgdXNlZnVsLCBidXQgV0lUSE9VVCBBTlkgV0FSUkFOVFk7IHdpdGhvdXQgZXZlbgotICogdGhlIGltcGxpZWQgd2FycmFudHkgb2YgTUVSQ0hBTlRBQklMSVRZIG9yIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgotICogUFVSUE9TRS4KLSAqIFNlZSBXM0MgTGljZW5zZSBodHRwOi8vd3d3LnczLm9yZy9Db25zb3J0aXVtL0xlZ2FsLyBmb3IgbW9yZSBkZXRhaWxzLgotICovCi0KLXBhY2thZ2Ugb3JnLnczYy5kb20ucmFuZ2VzOwotCi0vKioKLSAqIFJhbmdlIG9wZXJhdGlvbnMgbWF5IHRocm93IGEgPGNvZGU+UmFuZ2VFeGNlcHRpb248L2NvZGU+IGFzIHNwZWNpZmllZCBpbiAKLSAqIHRoZWlyIG1ldGhvZCBkZXNjcmlwdGlvbnMuCi0gKiA8cD5TZWUgYWxzbyB0aGUgPGEgaHJlZj0naHR0cDovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItVHJhdmVyc2FsLVJhbmdlLTIwMDAxMTEzJz5Eb2N1bWVudCBPYmplY3QgTW9kZWwgKERPTSkgTGV2ZWwgMiBUcmF2ZXJzYWwgYW5kIFJhbmdlIFNwZWNpZmljYXRpb248L2E+LgotICogQHNpbmNlIERPTSBMZXZlbCAyCi0gKi8KLXB1YmxpYyBjbGFzcyBSYW5nZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICAgIHB1YmxpYyBSYW5nZUV4Y2VwdGlvbihzaG9ydCBjb2RlLCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgICAgIHRoaXMuY29kZSA9IGNvZGU7Ci0gICAgfQotICAgIHB1YmxpYyBzaG9ydCAgIGNvZGU7Ci0gICAgLy8gUmFuZ2VFeGNlcHRpb25Db2RlCi0gICAgLyoqCi0gICAgICogSWYgdGhlIGJvdW5kYXJ5LXBvaW50cyBvZiBhIFJhbmdlIGRvIG5vdCBtZWV0IHNwZWNpZmljIHJlcXVpcmVtZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIHNob3J0IEJBRF9CT1VOREFSWVBPSU5UU19FUlIgICAgPSAxOwotICAgIC8qKgotICAgICAqIElmIHRoZSBjb250YWluZXIgb2YgYW4gYm91bmRhcnktcG9pbnQgb2YgYSBSYW5nZSBpcyBiZWluZyBzZXQgdG8gZWl0aGVyIAotICAgICAqIGEgbm9kZSBvZiBhbiBpbnZhbGlkIHR5cGUgb3IgYSBub2RlIHdpdGggYW4gYW5jZXN0b3Igb2YgYW4gaW52YWxpZCAKLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgc2hvcnQgSU5WQUxJRF9OT0RFX1RZUEVfRVJSICAgICA9IDI7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy9vcmcvdzNjL2RvbS9yYW5nZXMvcGFja2FnZS5odG1sIGIvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9wYWNrYWdlLmh0bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWQ4MGYuLjAwMDAwMDAKLS0tIGEvc3JjL29yZy93M2MvZG9tL3Jhbmdlcy9wYWNrYWdlLmh0bWwKKysrIC9kZXYvbnVsbApAQCAtMSw4ICswLDAgQEAKLTxodG1sPgotICA8dGl0bGU+b3JnLnczYy5kb20ucmFuZ2VzIFBhY2thZ2U8L3RpdGxlPgotICA8Ym9keT4KLSAgICA8cD5ET00gbGV2ZWwgMiByYW5nZSBpbnRlcmZhY2VzLjxwPgotIDwvYm9keT4KLTwvaHRtbD4KLQotCmRpZmYgLS1naXQgYS9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMgYi9zcmMvdHJheC90cmF4LnByb3BlcnRpZXMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1OTNjMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RyYXgvdHJheC5wcm9wZXJ0aWVzCisrKyAvZGV2L251bGwKQEAgLTEsMTEgKzAsMCBAQAotIyAkUmV2aXNpb24kICREYXRlJAotIwotIyBOb3RlOiBUaGlzIHByb3BlcnRpZXMgZmlsZSBpcyBwcm92aWRlZCBmb3IgaWxsdXN0cmF0aXZlIHB1cnBvc2VzCi0jICAgICAgIG9ubHkgYW5kIGlzIG5vdCBwYXJ0IG9mIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4KLSMgICAgICAgVGhpcyBwcm9wZXJ0aWVzIGZpbGUgaXMgbG9jYXRlZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gSkFSCi0jICAgICAgIGFuZCBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb25zIHdpbGwgc3BlY2lmeSBkaWZmZXJlbnQKLSMgICAgICAgaW1wbGVtZW50YXRpb24gY2xhc3NlcyBhbmQgb3V0cHV0IG1ldGhvZHMuCi0jCi0KLSMgVGhlIFRSYVggU3R5bGVzaGVldCBwcm9jZXNzb3IKLXRyYXgucHJvY2Vzc29yLnhzbHQ9b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuU3R5bGVzaGVldFByb2Nlc3NvcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9ET01JbnRlcmZhY2UuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9ET01JbnRlcmZhY2UuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Zjg5MTllLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvRE9NSW50ZXJmYWNlLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvRE9NTG9ja2luZy5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL0RPTUxvY2tpbmcuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYWUzM2I0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvRE9NTG9ja2luZy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRSBiL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlN2I0OThlLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgICAgICBSRUFETUUgRklMRSBGT1IgVEhFIFNVTiBYU0xUIENPTVBJTEVSCi0gICAgICAgICAgICAgICAgIFByZXZpZXcgVmVyc2lvbiA2IAotICAgICAgICAgICAgICAgICAgICBBcHJpbCwgMjAwMQotICAgICAgICAgICBDb3B5cmlnaHQgKGMpIFN1biBNaWNyb3N5c3RlbXMsIDIwMDEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBTdW4gWFNMVCBDb21waWxlciAoWFNMVEMpIGlzIGEgSmF2YS1iYXNlZCB0b29sIGZvciBjb21waWxpbmcgWFNMIAotc3R5bGVzaGVldHMgaW50byBleHRyZW1lbHkgbGlnaHR3ZWlnaHQgYW5kIHBvcnRhYmxlIEphdmEgYnl0ZSBjb2RlLiAKLVRoZSBTdW4gWFNMVEMgSmF2YSBSdW50aW1lIGVudmlyb25tZW50IGNhbiB0aGVuIHByb2Nlc3MgWE1MIGZpbGVzIAotYWdhaW5zdCB0aGVzZSBjb21waWxlZCBzdHlsZXNoZWV0cyAoVHJhbnNsZXRzKSB0byBnZW5lcmF0ZSBhbnkgbWFubmVyIAotb2Ygb3V0cHV0IHBlciB0aGUgc3R5bGUtc2hlZXQgaW5zdHJ1Y3Rpb25zLgotCi1UaGlzIHByZXZpZXcgdmVyc2lvbiBvZiB0aGUgWFNMVCBDb21waWxlciBjYW4gYmUgcnVuIG9uIGFueSAKLXBsYXRmb3JtIC0tIGluY2x1ZGluZyBVTklYLCBXaW5kb3dzLCBOVCwgTWFjIC0tIHRoYXQgc3VwcG9ydHMgCi1KYXZhMiBvciBsYXRlci4gVGhlIFRyYW5zbGV0cyAoY29tcGlsZWQgc3R5bGVzaGVldHMpIGNhbiBiZSBydW4gb24gYW55IAotSmF2YSBwbGF0Zm9ybSBpbmNsdWRpbmcgYSBQYWxtIFBpbG90IHdpdGggSjJNRSBDTERDIAotKEphdmEgMiBNaWNybyBFZGl0aW9uLCBDb25uZWN0ZWQgTGltaXRlZCBEZXZpY2UgQ29uZmlndXJhdGlvbikuIAotV2hpbGUgdGhlIGNvbXBpbGVyIGl0c2VsZiByZXF1aXJlcyBKYXZhMix0cmFuc2xldHMgYXJlIGRlc2lnbmVkIHRvIHJ1biAKLWFueXdoZXJlIEphdmEgaXMgYXZhaWxhYmxlLgotCi1BbG1vc3QgYWxsIGZ1bmN0aW9ucyBvZiB0aGUgWExTVCAxLjAgbGFuZ3VhZ2UgYXJlIGltcGxlbWVudGVkOyAKLW1vcmUgdGhhbiBlbm91Z2ggdG8gc2hvdyB5b3UgaG93IHRoaXMgbmV3IGFwcHJvYWNoIHRvIFhTTFQgd29ya3MgCi1hbmQgaXRzIGFkdmFudGFnZXMhIFVzaW5nIHRoZSBzYW1wbGVzIHByb3ZpZGVkLCB5b3Ugd2lsbCBiZSBhYmxlIAotdG8gc2VlIGZvciB5b3Vyc2VsZi4gQWxzbywgZGVtb3MgZm9yIHRoZSBQYWxtIFBpbG90LCBBcHBsZXRzLCBhbmQgCi1TZXJ2bGV0cyBhcmUgcHJvdmlkZWQuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BVFRSSUJVVElPTlMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1UaGUgWFNMVCBDb21waWxlciBwcm9ncmFtIHVzZXMgdGhlIENVUCBQYXJzZXIgR2VuZXJhdG9yCi1mb3IgSmF2YSwgQ29weXJpZ2h0IDE5OTYtMTk5OSBieSBTY290dCBIdWRzb24sIEZyYW5rIEZsYW5uZXJ5LAotQy4gU2NvdHQgQW5hbmlhbi4gIEZvciBtb3JlIGRldGFpbHMsIHBsZWFzZSBzZWU6Ci1odHRwOi8vd3d3LmNzLnByaW5jZXRvbi5lZHUvfmFwcGVsL21vZGVybi9qYXZhL0NVUC8KLQotVGhlIFhTTFQgQ29tcGlsZXIgcHJvZ3JhbSBhbHNvIHVzZXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIHRoZQotQnl0ZSBDb2RlIEVuZ2luZWVyaW5nIExpYnJhcnkgKEJDRUwpLCBmb3JtZXJseSBrbm93biBhcyAKLShKYXZhQ2xhc3MgQVBJKSwgQ29weXJpZ2h0IDIwMDAgTWFya3VzIERhaG0uCi0KLSoqIFBsZWFzZSBub3RlIHRoYXQgdGhpcyBhZGRpdGlvbmFsIHBhY2thZ2UsIEJDRUwsIGlzCi0qKiBuZWVkZWQgaW4gb3JkZXIgdG8gZ2VuZXJhdGUgdGhlIGNsYXNzIGZpbGVzIGZyb20gdGhlIGNvbXBpbGVyLgotKiogV2l0aG91dCB0aGUgQkNFTCBwYWNrYWdlLCB0aGlzIHByZXZpZXcgdmVyc2lvbiBvZiB0aGUKLSoqIGNvbXBpbGVyIFdJTEwgTk9UIFdPUksuICBCQ0VMIGlzIGZyZWVseSBhdmFpbGFibGUgZm9yCi0qKiBkb3dubG9hZCBhcyBkZXNjcmliZWQgYmVsb3cuCi0KLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1SRVFVSVJFRCBQQUNLQUdFCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotQkNFTCAoZm9ybWVybHkgSmF2YUNsYXNzKSBieSBNYXJrdXMgRGFobSBoYXMgYmVlbiAKLXVzZWQgdG8gYXV0b21hdGljYWxseSBjcmVhdGUgY2xhc3MgZmlsZXMgZnJvbSB0aGUgWFNMVCBjb21waWxlciBvdXRwdXQuICAKLVlvdSBtdXN0IG9idGFpbiB0aGUgQkNFTC5qYXIgZmlsZSBhbmQgaW5zdGFsbCBpdCBiZWZvcmUgdXNpbmcgdGhlIAotWFNMVCBjb21waWxlci4KLQotVGhlIHNpbXBsZXN0IHdheSB0byBkb3dubG9hZCB0aGUgQkNFTC5qYXIgZmlsZSBmcm9tIAotCi0gICAgaHR0cDovL2JjZWwuc291cmNlZm9yZ2UubmV0L2Rvd25sb2Fkcy5odG1sCi0KLWlzIHRvIHVzZSB0aGUgIkpBUiBmaWxlICh3aXRob3V0IGRvY3MpIiBsaW5rLgotCi1Zb3UgbWF5IHdhbnQgdG8gb2J0YWluIHRoZSBwcmVjb21waWxlZCBjbGFzcyBmaWxlcyBhbmQgZG9jdW1lbnRhdGlvbi4KLVRvIGRvd25sb2FkIHRoZW0gdG8gYSBVbml4IHN5c3RlbToKLQotICAgIDEpIENob29zZSB0aGUgImxhdGVzdCB2ZXJzaW9uIChQcmVjb21waWxlZCArIGRvY3MpIiAKLSAgICAgICBHemlwcGVkIFRhci1GaWxlIG9yIFpJUC1GaWxlIGxpbmsuCi0KLSAgICAyKSBVbnBhY2sgYW5kIGV4cGFuZCB0aGUgZG93bmxvYWRlZCBCQ0VMIGZpbGVzIGluIHlvdXIgCi0gICAgICAgZG93bmxvYWQgZGlyZWN0b3J5IChlLmcuLCAvdXNyL2xvY2FsKS4KLQotICAgIDMpIENoYW5nZSBkaXJlY3RvcnkgdG8gQkNFTC4KLQotICAgIDQpIENyZWF0ZSB0aGUgamFyIGZpbGUgQkNFTC5qYXIuCi0gICAgCi0gICAgICAgRnJvbSB3aXRoaW4gdGhlIEJDRUwgZGlyZWN0b3J5LCB5b3UgY2FuIGVpdGhlciB1c2UgdGhlIAotICAgICAgIGluY2x1ZGVkIEdOVW1ha2VmaWxlIG9yIGNyZWF0ZSB0aGUgamFyIHlvdXJzZWxmLgotICAgICAgIAotICAgICAgIFRvIHVzZSB0aGUgR05VbWFrZWZpbGUsIHR5cGUgdGhlIGNvbW1hbmQgJ21ha2UgamFyJy4KLSAgICAgICAKLSAgICAgICBUbyBjcmVhdGUgdGhlIGphciB5b3Vyc2VsZiwgdHlwZSB0aGUgY29tbWFuZDoKLSAgICAgICAKLSAgICAgICAgIGphciBjdmYgQkNFTC5qYXIgYGZpbmQgZGUgZ251IC1uYW1lIFwqLmNsYXNzYCBsaXN0Y2xhc3MuY2xhc3MKLQotVG8gZG93bmxvYWQgdGhlIHByZWNvbXBpbGVkIGNsYXNzIGZpbGVzIGFuZCBkb2N1bWVudGF0aW9uIAotdG8gYSBXaW5kb3dzIHN5c3RlbToKLQotICAgIDEpIENob29zZSB0aGUgImxhdGVzdCB2ZXJzaW9uIChQcmVjb21waWxlZCArIGRvY3MpIiAKLSAgICAgICBaSVAtRmlsZSBsaW5rLgotCi0gICAgMikgVW56aXAgdGhlIGRvd25sb2FkZWQgQkNFTCBmaWxlcyBpbiB5b3VyIAotICAgICAgIGRvd25sb2FkIGRpcmVjdG9yeS4KLQotICAgIDMpIENoYW5nZSBkaXJlY3RvcnkgdG8gQkNFTCBhbmQgZnJvbSBhIERPUyBjb21tYW5kIGxpbmUsCi0gICAgICAgdHlwZSB0aGUgY29tbWFuZDoKLQotICAgICAgICAgamFyIC1jdmYgQkNFTC5qYXIgZGVcZnViXGJ5dGVjb2RlXGNsYXNzZmlsZVwqLmNsYXNzCi0gICAgICAgICAgIGdudVxyZWdleHBcKi5jbGFzcyBsaXN0Y2xhc3MuY2xhc3MKLQotVG8gY29tcGxldGUgdGhlIEJDRUwgc2V0dXA6Ci0KLSAgICAxKSBJbnN0YWxsIFhTTFRDLCBhcyBkZXNjcmliZWQgaW4gdGhlIHNlY3Rpb24gYmVsb3csCi0gICAgICAgIkhPVyBUTyBJTlNUQUxMIFhTTFRDIEFORCBSVU4gVEhFIFNBTVBMRVMuIgotCi0gICAgMikgQ29weSB0aGUgQkNFTC5qYXIgZmlsZSBpbnRvIHRoZSAibGliIiBkaXJlY3RvcnkKLSAgICAgICB1bmRlciB5b3VyICJ4c2x0YyIgZGlyZWN0b3J5LgotCi0gICAgICAgWW91IGFyZSBub3cgc2V0IHRvIHJ1biB0aGUgWFNMVCBjb21waWxlci4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1BRERJVElPTlMgRlJPTSBWRVJTSU9OIDUgKG9mIHRoZSBQUkVWSUVXIENPTVBJTEVSKQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVN1cHBvcnQgZm9yIAotCi0JLSBTaW1wbGlmaWVkIFN0eWxlc2hlZXRzCi0JLSBpZCgpIGFuZCBrZXkoKSBpbiBtYXRjaCBwYXR0ZXJucwotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLVhTTFQgMS4wIEZlYXR1cmVzIE5vdCBTdXBvcnRlZCBpbiBQUkVWSUVXIFZFUlNJT04gNgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBmb2xsb3dpbmcgWFNMVCAxLjAgZmVhdHVyZXMgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkOgotCi0gICAgKiBOb25zdGF0aWMgZXh0ZXJuYWwgSmF2YSBtZXRob2RzLiAKLSAgICAgIFlvdSBtYXkgY2FsbCBzdGF0aWMgSmF2YSBmdW5jdGlvbnMKLSAgICAgIHVzaW5nIGEgbmFtZXNwYWNlIHByZWZpeCBtYXRjaGluZyB0aGUgY2xhc3MgbmFtZSB0aGF0IGlzIAotICAgICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBmb2xsb3dpbmcgVVJMOgotICAgICAgCi0gICAgICAgIGh0dHA6Ly93d3cuc3VuLmNvbS94c2x0Yy9qYXZhL1lvdXJKYXZhQ2xhc3MKLSAgICAgIAotICAgICogTmFtZXNwYWNlIGF4aXMKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSVNUIE9GIEZJTEVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIGZpbGVzIGluY2x1ZGVkIGluIHRoaXMgcHJldmlldyBwYWNrYWdlIGFyZSBhcyBmb2xsb3dzOgotCi14c2x0Yy0xXzAtYWxwaGE1LWJpbi56aXAKLSAgIDxpbnN0YWxsIGRpcj4veHNsdGMKLSAgICAgIExJQ0VOU0UudHh0ICAgICAgICAgICAobGljZW5zZSBmaWxlKQotICAgICAgWFNMVENwcm5fbGcudHh0ICAgICAgIChjb3B5cmlnaHQgbm90aWNlKQotICAgICAgUkVBRE1FICAgICAgICAgICAgICAgICh0aGlzIGZpbGUpCi0gICAgICBSRUFETUUuYXBpICAgICAgICAgICAgKGRlc2NyaWJlcyBUcmFuc2xldCBBUEkpCi0gICAgICBSRUFETUUueHNsdCAgICAgICAgICAgKGRlc2NyaWJlcyBydW50aW1lIGNvbW1hbmQgbGluZSBpbnRlcmZhY2UpCi0gICAgICBSRUFETUUueHNsdGMgICAgICAgICAgKGRlc2NyaWJlcyBjb21waWxlciBjb21tYW5kIGxpbmUgaW50ZXJmYWNlKQotICAgICAgYmluIAotICAgICAgICAgeHNsdCAgICAgICAgICAgICAgIChydW50aW1lIGZvciBVbml4KQotICAgICAgICAgeHNsdGMgICAgICAgICAgICAgIChjb21waWxlciBmb3IgVW5peCkKLQotICAgICAgICAgeHNsdC5iYXQgICAgICAgICAgIChydW50aW1lIGZvciBET1MpCi0gICAgICAgICB4c2x0Yy5iYXQgICAgICAgICAgKGNvbXBpbGVyIGZvciBET1MpCi0gICAgICBkZW1vCi0gICAgICAgICBSRUFETUUKLSAgICAgICAgIFRyYW5zbGV0RGVtby5wcmMgKFBhbG0gUGlsb3QgaW5zdGFsbCBmaWxlKQotICAgICAgbGliCi0gICAgICAgICB4bWwuamFyCi0gICAgICAgICB4c2x0Yy5qYXIKLSAgICAgICAgIHhzbHRjcnQuamFyICAgICAgICAgICAgICAgKCdydCcgPSBydW50aW1lKQotICAgICAgICAgW0JDRUwuamFyIGdvZXMgaGVyZV0gKHNlZSBSRVFVSVJFRCBQQUNLQUdFIGFib3ZlKQotICAgICAgc2FtcGxlcwotICAgICAgICAgc2V0IG9mIHhtbCBhbmQgeHNsIGZpbGVzIGZvciB5b3UgdG8gdHJ5Ci0gICAgICBzcmMKLSAgICAgICAgIHN1YnNldCBvZiB0aGUgcnVudGltZSBwYWNrYWdlIHRvIGNvbXBsZW1lbnQgUkVBRE1FLmFwaQotICAgICAgICAgcGx1cyBhbiBBcHBsZXQgZGVtbyBhbmQgYSBzZXJ2bGV0IGRlbW8KLSAgICAgICAgIGNvbS9zdW4veHNsdC9kZW1vL3NlcnZsZXQKLSAgICAgICAgICAgICBSRUFETUUuc2VydmxldCAgICAgICAgKGRlc2NyaWJlcyBTZXJ2bGV0IGRlbW8pCi0gICAgICAgICBjb20vc3VuL3hzbHQvZGVtby9hcHBsZXQKLSAgICAgICAgICAgICBSRUFETUUuYXBwbGV0ICAgICAgICAgKGRlc2NyaWJlcyBBcHBsZXQgZGVtbykKLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1IT1cgVE8gSU5TVEFMTCBYU0xUQyBBTkQgUlVOIFRIRSBTQU1QTEVTCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotMS4gVW56aXAgdGhlIGZpbGVzIGluIGEgZGlyZWN0b3J5IG9mIHlvdXIgY2hvaWNlLCBmb3IgZXhhbXBsZQotICAgZnJvbSB0aGUgdXNlciBkaXJlY3RvcnkgJy9ob21lL3VzZXIxJywgdGhlIGRpc3RyaWJ1dGlvbgotICAgemlwIGZpbGUgY2FuIGJlIHVuemlwcGVkIHVzaW5nIHRoZSBqYXIgY29tbWFuZCBhczoKLQotICAgamFyIHh2ZiB4c2x0Yy0xXzAtYWxwaGE1LWJpbi56aXAgCi0KLSAgIFRoZSBzdWJkaXJlY3RvcnkgJ3hzbHQnIHdpbGwgYmUgY3JlYXRlZCBpbiAnL2hvbWUvdXNlcjEnLgotCi0yLiBTZXQgdGhlIFhTTFQgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gcG9pbnQgdG8geW91ciBpbnN0YWxsYXRpb24KLSAgIGRpcmVjdG9yeS4gU2V0IHlvdXIgUEFUSCBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBpbmNsdWRlCi0gICB0aGUgYmluIGRpcmVjdG9yeSBvZiBYU0xULiAKLQotICAgRm9yIGV4YW1wbGUsIGluIHRoZSBiYXNoIHNoZWxsOgotIAotICAgICAgZXhwb3J0IFhTTFQ9L2hvbWUvdXNlcjEveHNsdAotICAgICAgZXhwb3J0IFBBVEg9JFhTTFQvYmluOiRQQVRICi0KLTMuIENvbXBpbGUgdGhlIHN0eWxlc2hlZXQgdG8gcHJvZHVjZSBhIEphdmEgY2xhc3MgZmlsZS4KLQotICAgRm9yIGV4YW1wbGUsIG9uIHRoZSBVbml4IHBsYXRmb3JtLCB0byBjb21waWxlIHRoZSBwbGF5MS54c2wKLSAgIHN0eWxlc2hlZXQgZm9yIHRoZSBwbGF5LnhtbCBkb2N1bWVudDoKLQotICAgICAgY2QgL2hvbWUvdXNlcjEveHNsdGMvc2FtcGxlcwotICAgICAgeHNsdGMgcGxheTEueHNsCi0KLSAgIFRoZSBjb21waWxlZCBzdHlsZXNoZWV0IHdpbGwgYmUgaW4gdGhlIG1haW4gSmF2YSBjbGFzcyBmaWxlIAotICAgJ3BsYXkxLmNsYXNzJwotCi0gICBOT1RFOiBUaGUgJ3hsc3RjJyBzaGVsbCBzY3JpcHQgYWRkcyB0aGUgcmVxdWlyZWQgamFycyB0byB5b3VyIENMQVNTUEFUSAotCi0gICBGb3IgZXhhbXBsZSwgb24gdGhlIFdpbmRvd3MgcGxhdGZvcm0sIHRvIGNvbXBpbGUgdGhlIHBsYXkxLnhzbAotICAgc3R5bGVzaGVldCBmb3IgdGhlIHBsYXkueG1sIGRvY3VtZW50OgotICAgCi0gICAgICBzZXQgY2xhc3NwYXRoPWM6XHhzbHRjXHNhbXBsZXM7YzpceHNsdGNcbGliXHhzbHRjLmphcjsKLSAgICAgIGM6XHhzbHRjXGxpYlx4c2x0Y3J0LmphcjtjOlx4c2x0Y1xsaWJceG1sLmphcjsKLSAgICAgIGM6XHhzbHRjXGxpYlxCQ0VMLmphcjsuCi0gICAgICBjZCBjOlx4c2x0Y1xzYW1wbGVzCi0gICAgICBqYXZhIGNvbS5zdW4ueHNsdC5jb21waWxlci5YU0xUQyBwbGF5MS54c2wKLQotNC4gVXNlIHRoZSBjb21waWxlZCBKYXZhIGNsYXNzIGZpbGUgKHBsYXkxLmNsYXNzKSB0byB0cmFuc2Zvcm0gCi0gICB0aGUgZXhhbXBsZSBYTUwgZG9jdW1lbnQuCi0KLSAgIEZvciBleGFtcGxlLCBvbiB0aGUgVW5peCBwbGF0Zm9ybToKLQotICAgICAgeHNsdCBwbGF5LnhtbCBwbGF5MQotCi0gICBGb3IgZXhhbXBsZSwgb24gdGhlIFdpbmRvd3MgcGxhdGZvcm06Ci0KLSAgICAgIGphdmEgY29tLnN1bi54c2x0LnJ1bnRpbWUuRGVmYXVsdFJ1biBwbGF5LnhtbCBwbGF5MQotCi0gICBUaGUgcmVzdWx0IGlzIHNlbnQgdG8gc3RhbmRhcmQgb3V0cHV0LgotCi0gICBOT1RFOiBXaGVuIHJ1bm5pbmcgdGhlIGNvbXBpbGVkIHN0eWxlc2hlZXQsIHlvdSAKLSAgICAgICAgIGp1c3Qgc3BlY2lmeSB0aGUgbmFtZSBvZiBpdHMgSmF2YSBjbGFzcywgbm90IGl0cwotICAgICAgICAgZmlsZSBuYW1lIChlLmcuLCBwbGF5MSwgbm90IHBsYXkxLmNsYXNzKS4KLSAgICAgICAgIFlvdSBkbyBub3QgaW5jbHVkZSB0aGUgIi5jbGFzcyIgZXh0ZW5zaW9uLCBub3IKLSAgICAgICAgIHRoZSBwYXRoIHRvIHRoZSBjbGFzcy4gVGhlIGNsYXNzIGlzIGZvdW5kIGJ5IG1lYW5zIAotICAgICAgICAgb2YgdGhlIEphdmEgQ0xBU1NQQVRIIHZhcmlhYmxlLiBJZiB5b3UgcnVuCi0gICAgICAgICB0aGUgdHJhbnNsZXQgZnJvbSBhIGRpcmVjdG9yeSBvdGhlcgotICAgICAgICAgdGhhbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRoZSBjb21waWxlZAotICAgICAgICAgc3R5bGVzaGVldCBjbGFzcyBpcyBsb2NhdGVkLCB5b3UgbmVlZCB0byBhZGQgCi0gICAgICAgICB0aGF0IGRpcmVjdG9yeSB0byB5b3VyIEphdmEgQ0xBU1NQQVRILiBBbHNvLCB5b3UKLSAgICAgICAgIG5lZWQgdG8gcmVtb3ZlIGRpcmVjdG9yaWVzIGZyb20geW91ciBDTEFTU1BBVEggCi0gICAgICAgICBmb3IgcHJpb3IgaW5zdGFsbGF0aW9ucyBvZiBYU0xUQyBhbmQgYW55IHJlZmVyZW5jZXMgCi0gICAgICAgICB0byBTdW4ncyBwcm9qZWN0IFggcGFyc2VyIChjb20uc3VuLnhtbC50cmVlKQotICAgICAgICAgaW5zdGFsbGVkIGZyb20gc29tZSBvdGhlciBYTUwgYXBwbGljYXRpb24vdG9vbC4KLSAKLSAgIE5PVEU6IFRoZSBqYXZhZG9jVG9IdG1sIHNhbXBsZSBjYWxscyBleHRlcm5hbCBKYXZhIG1ldGhvZHMKLSAgICAgICAgIGZyb20gdGhlIEphdmFkb2NGb3JtYXR0ZXIgY2xhc3MuIEJlZm9yZSBjb21waWxpbmcgdGhlCi0gICAgICAgICBqYXZhZG9jVG9IdG1sLnhzbCBzdHlsZXNoZWV0LCBjb21waWxlIHRoZSAKLSAgICAgICAgIEphdmFkb2NGb3JtYXR0ZXIgY2xhc3MgdXNpbmcgJ2phdmFjJy4KLQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1FTkQgT0YgUkVBRE1FCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS5BUEFDSEUgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS5BUEFDSEUKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3Y2Q2MWYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9SRUFETUUuQVBBQ0hFCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotUkVBRE1FLkFQQUNIRQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1FbnRpcmUgc291cmNlIHRyZWUgYW5kIHN1cHBvcnQgcGFja2FnZXMgYXJlIGxvY2F0ZWQgaW4gdGhlIHNpbmdsZSBqYXIKLWZpbGUgJ2FwYWNoZS5qYXInLiAKLQotCi1JbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLS0KLQotKDEpIGNyZWF0ZSBkaXJlY3RvcnkgW1Jvb3RdLCB1bnBhY2sgJ2FwYWNoZS5qYXInIHRoZXJlLgotCWV4KSAlIGNkIC90bXA7IG1rZGlyIHhzbHRjX2FwYWNoZSAKLQkgICAgJSBjZCB4c2x0Y19hcGFjaGUKLSAgICAgICAgY29weSBhcGFjaGUuamFyIHRvIHhzbHRjX2FwYWNoZSBkaXJlY3RvcnkKLQkgICAgJSBqYXIgeHZmIGFwYWNoZS5qYXIgCi0JY2xlYW51cAotCSAgICAlIHJtIC1yZiBNRVRBLUlORiBhcGFjaGUuamFyCi0KLSAgICBVbnBhY2tpbmcgdGhlIGphciBmaWxlIHdpbGwgcmVzdWx0IGluIHRoZSBmb2xsb3dpbmcgdHJlZToKLQotCVtSb290XQotCSAgRXh0ZXJuYWwvCi0JICAgIEJDRUwvICAgICAgICAgICAgICAgIC4uLiBjb250YWlucyBCQ0VMLmphcgotCSAgICBKTGV4LyAgICAgICAgICAgICAgICAuLi4gY29udGFpbnMgSkxleC5qYXIKLQkgICAgamF2YV9jdXAvICAgICAgICAgICAgLi4uIGNvbnRhaW5zIGphdmFfY3VwLmphciwgcnVudGltZS9ydW50aW1lLmphcgotCSAgICB4bWwtdHIyLyAgICAgICAgICAgICAuLi4gY29udGFpbnMgeG1sLmphcgotCSAgYmluLwotCSAgICB4c2x0Ci0JICAgIHhzbHRjCi0JICBkb2MvCi0JICAgIGFwaS8gICAgICAgICAgICAgICAgIC4uLiBjb250YWlucyBqYXZhZG9jIGZvciBhcGkKLQkgIHNyYy8KLQkgICAgR05VbWFrZWZpbGUKLQkgICAgR05VbWFrZWZpbGUuYWxsaW5jCi0JICAgIGRvY3MvCi0JICAgICAgTElDRU5TRS50eHQKLQkgICAgICBNZXNzYWdlLnR4dAotCSAgICAgIFJFQURNRQotCSAgICAgIFJFQURNRS5hcGkKLQkgICAgICBSRUFETUUueHNsdAotCSAgICAgIFJFQURNRS54c2x0YwotCSAgICAgIFhTTFRDcHJuX2xnLnR4dCoKLQkgICAgICB4c2x0Y0EzLnR4dAotCSAgICBvcmcvCi0JICAgICAgYXBhY2hlLwotCQl4YWxhbi8KLQkJICB4c2x0Yy8KLQkJICAgICAoc3JjIHRyZWUpICAuLi4gYWxsIHRoZSBzb3VyY2UgY29kZSBmaWxlcwotCi0KLSAgICBUaGUgJ3NyYyB0cmVlJyBpcyBhIGhpZXJhcmNoeSBvZiB0aGUgZm9sbG93aW5nIHBhY2thZ2VzOgotCW9yZy5hcGFjaGUueGFsYW4ueHNsdGMKLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyCi0Jb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5jb21waWxlci51dGlsCi0Jb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5kb20KLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUKLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnV0aWwKLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnV0aWwuZ2V0b3B0Ci0KLQotKDIpIG1ha2UgYmluIHByb2dyYW1zIGV4ZWN1dGFibGUKLQkgICAgJSBjaG1vZCAreCBiaW4vKgotCi0oMykgc2V0IGVudiB2YXJpYWJsZSB0byBwb2ludCB0byB0b3Agb2YgZGlyZWN0b3J5IFtSb290XQotCWV4KSAlIHNldGVudiBYU0xUIC90bXAveHNsdGNfYXBhY2hlCi0KLSg0KSBjb21waWxlIHNvdXJjZXMgKHVzZXMgZ251IG1ha2UgYW5kIHRoZSBwcm92aWRlcyAnR05VbWFrZWZpbGUnKS4gVGhpcwotICAgIHdpbGwgY3JlYXRlIGphdmEgY2xhc3NlcyBpbiBbUm9vdF0vY2xhc3NlcywgZS5nLiAvdG1wL3hzbHRjX2FwYWNoZS9jbGFzc2VzLgotICAgIChObyBuZWVkIHRvIHNldCB5b3VyIENMQVNTUEFUSCB2YXJpYWJsZS4pCi0gICAgCi0JZXgpICUgY2Qgc3JjOyBnbWFrZSBhZ2FpbgotCi0gICAgTm90ZTogdGhlICdhZ2FpbicgdGFyZ2V0IGZvcmNlcyBldmVyeXRoaW5nIHRvIGJlIGJ1aWx0IGZyb20gc2NyYXRjaCwKLSAgICBpbmNsdWRpbmcgdGhlIGphdmFfY3VwIHNvdXJjZSBmaWxlcy4gU3Vic2VxdWVudCBidWlsZHMgY2FuIGJlIGRvbmUKLSAgICB1c2luZyB0aGUgJ2NsYXNzZXMnIHRhcmdldC4gCi0KLSg1KSBtYWtlIHRoZSBqYXZhZG9jCi0JZXgpICUgZ21ha2UgamRvYwotCi0oNikgYWRkIGJpbiBkaXJlY3RvcnkgdG8geW91ciBleGVjdXRhYmxlIHBhdGgsIAotCWV4KSAlIHNldCBwYXRoPSgkWFNMVC9iaW4gJHBhdGgpCi0KLSg3KSB0ZXN0IGRpc3RyaWJ1dGlvbiwgZ2l2ZW4gYSBzdHlsZXNoZWV0ICh0ZXN0LnhzbCkgYW5kIGFuIGlucHV0IHhtbCBkb2MKLSAgICAodGVzdC54bWwpLCBhbmQgYmUgc3VyZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5ICguKSBpcyBpbiB5b3VyCi0gICAgQ0xBU1NQQVRILgotIAklIHhzbHRjIHRlc3QueHNsCQkuLi4gY3JlYXRlcyB0cmFuc2xldCwgdGVzdC5jbGFzcwotCSUgeHNsdCB0ZXN0LnhtbCB0ZXN0CQkuLi4gcnVucyB0cmFuc2xldCBvbiB4bWwgaW5wdXQJCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS5hcGkgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS5hcGkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMWIwOTIuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9SRUFETUUuYXBpCisrKyAvZGV2L251bGwKQEAgLTEsNDIyICswLDAgQEAKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgICAgICAgUkVBRE1FIEZJTEUgRk9SIFRIRSBTVU4gWFNMVCBDT01QSUxFUiBBUEkKLSAgICAgICAgICAgICAgICAgIFByZXZpZXcgVmVyc2lvbiA1IAotICAgICAgICAgICAgICAgICAgICBGZWJydWFyeSwgMjAwMQotICAgICAgICAgICBDb3B5cmlnaHQgKGMpIFN1biBNaWNyb3N5c3RlbXMsIDIwMDEKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgU3VuIFhTTFQgQ29tcGlsZXIgKFhTTFRDKSBpcyBhIEphdmEtYmFzZWQgdG9vbCBmb3IgCi1jb21waWxpbmcgWFNMIHN0eWxlc2hlZXRzIGludG8gZXh0cmVtZWx5IGxpZ2h0d2VpZ2h0IGFuZCAKLXBvcnRhYmxlIEphdmEgYnl0ZSBjb2RlLiBUaGUgU3VuIFhTTFRDIEphdmEgUnVudGltZSBlbnZpcm9ubWVudCAKLWNhbiB0aGVuIHByb2Nlc3MgWE1MIGZpbGVzIGFnYWluc3QgdGhlc2UgY29tcGlsZWQgc3R5bGVzaGVldHMgCi0oVHJhbnNsZXRzKSB0byBnZW5lcmF0ZSBhbnkgbWFubmVyIG9mIG91dHB1dCBwZXIgdGhlIHN0eWxlLQotc2hlZXQgaW5zdHJ1Y3Rpb25zLgotCi1DT05URU5UUyBPRiBUSElTIERPQ1VNRU5UOgotCTEuIEhPVyBUTyBJTkNMVURFIFRSQU5TTEVUUyBJTiBZT1VSIEFQUExJQ0FUSU9OUwotCTIuIEZVTEwgQ09ERSBFWEFNUExFIDEsICh1c2VzIGEgU0FYIERvY3VtZW50SGFuZGxlcikuCi0JMy4gQ09NUElMSU5HIEFORCBSVU5OSU5HIFRIRSBFWEFNUExFIAotCTQuIEZVTEwgQ09ERSBFWEFNUExFIDIsICh1c2VzIERlZmF1bHRTQVhPdXRwdXRIYW5kbGVyKS4gCi0JNS4gQVBQRU5ESVggKFRleHRPdXQgYW5kIERlZmF1bHRTQVhPdXRwdXRIYW5kbGVyKQotCi0KLQotCi0xLiBIT1cgVE8gSU5DTFVERSBUUkFOU0xFVFMgSU4gWU9VUiBBUFBMSUNBVElPTlMKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UcmFuc2xldHMgaW1wbGVtZW50IHRoZSBpbnRlcmZhY2UgY29tLnN1bi54c2x0LlRyYW5zbGV0Ci10aGF0IHlvdSB3aWxsIGZpbmQgaW4gdGhlIHNyYyBkaXJlY3RvcnkuCi0KLXB1YmxpYyBpbnRlcmZhY2UgVHJhbnNsZXQgewotICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShET00gZG9jdW1lbnQsIFRyYW5zbGV0T3V0cHV0SGFuZGxlciBoYW5kbGVyKQotCXRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShET00gZG9jdW1lbnQsIFRyYW5zbGV0T3V0cHV0SGFuZGxlcltdIGhhbmRsZXJzKQotCXRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyB2b2lkIHRyYW5zZm9ybShET00gZG9jdW1lbnQsIE5vZGVJdGVyYXRvciBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsZXRPdXRwdXRIYW5kbGVyIGhhbmRsZXIpIHRocm93cyAKLQkJCSAgVHJhbnNsZXRFeGNlcHRpb247Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGFkZFBhcmFtZXRlcihTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKTsKLQotICAgIHB1YmxpYyB2b2lkIGJ1aWxkS2V5cyhET00gZG9jdW1lbnQsIE5vZGVJdGVyYXRvciBpdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVHJhbnNsZXRPdXRwdXRIYW5kbGVyIGhhbmRsZXIsIGludCByb290KSB0aHJvd3MgCi0JCQkgIFRyYW5zbGV0RXhjZXB0aW9uOwotCi0gICAgcHVibGljIFN0cmluZyBnZXRPdXRwdXRFbmNvZGluZygpOwotfQotCi1UaGUgVHJhbnNsZXQgdGFrZXMgYSBET01JbXBsIG9iamVjdCAoY3JlYXRlZCBmcm9tIGFuIGlucHV0IFhNTCBkb2N1bWVudCksCi1hcyBpbnB1dCBhbmQgdHJhbnNmb3JtcyBpdC4gVGhlIHJlc3VsdHMgb2YgdGhlIHRyYW5zZm9ybWF0aW9uIGFyZSAKLXNlbnQgdG8gYW4gIGV2ZW50LWJhc2VkIG91dHB1dCBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cyB0aGUgCi1jb20uc3VuLnhzbHQuVHJhbnNsZXRPdXRwdXRIYW5kbGVyIGludGVyZmFjZSA6Ci0KLQotcHVibGljIGludGVyZmFjZSBjb20uc3VuLnhzbHQuVHJhbnNsZXRPdXRwdXRIYW5kbGVyIHsKLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFRyYW5zbGV0RXhjZXB0aW9uOwotICAgIHB1YmxpYyB2b2lkIGVuZERvY3VtZW50KCkgdGhyb3dzIFRyYW5zbGV0RXhjZXB0aW9uOwotICAgIHB1YmxpYyB2b2lkIGNoYXJhY3RlcnMoY2hhcltdIGNoYXJhY3RlcnMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgICAgIHRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgVHJhbnNsZXRFeGNlcHRpb247Ci0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUpIHRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBhdHRyaWJ1dGUoU3RyaW5nIGF0dHJpYnV0ZU5hbWUsIFN0cmluZyBhdHRyaWJ1dGVWYWx1ZSkKLSAgICAgICAgdGhyb3dzIFRyYW5zbGV0RXhjZXB0aW9uOwotICAgIHB1YmxpYyB2b2lkIGNvbW1lbnQoU3RyaW5nIGNvbW1lbnQpIHRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCi0gICAgICAgIHRocm93cyBUcmFuc2xldEV4Y2VwdGlvbjsKLSAgICBwdWJsaWMgdm9pZCBzZXRUeXBlKGludCB0eXBlKTsKLSAgICBwdWJsaWMgdm9pZCBzZXRJbmRlbnQoYm9vbGVhbiBpbmRlbnQpOwotICAgIHB1YmxpYyBib29sZWFuIHNldEVzY2FwaW5nKGJvb2xlYW4gZXNjYXBlKSB0aHJvd3MgVHJhbnNsZXRFeGNlcHRpb247Ci0gICAgcHVibGljIHZvaWQgaW5zZXJ0Q2RhdGFFbGVtZW50KFN0cmluZyBlbGVtZW50TmFtZSk7Ci19Ci0KLQotWW91IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBUcmFuc2xldCBpbnRlcmZhY2UKLXVzaW5nIEphdmEgcmVmbGVjdGlvbjoKLQotICBDbGFzcyBjbGF6eiA9IENsYXNzLmZvck5hbWUoImNsYXNzbmFtZSIpOwotICBUcmFuc2xldCB0cmFuc2xldCA9IChUcmFuc2xldCkgY2xhenoubmV3SW5zdGFuY2UoKTsKLQotd2hlcmUgImNsYXNzbmFtZSIgaXMgdGhlIG5hbWUgb2YgdGhlIGNsYXNzIGdlbmVyYXRlZCBieSBYU0xUQy4KLUluIG9yZGVyIHRvIGV4ZWN1dGUgYSB0cmFuc2Zvcm1hdGlvbiwgYm90aCBhIGRvY3VtZW50IGFuZCBhIFNBWC1saWtlCi1oYW5kbGVyIChUcmFuc2xldE91dHB1dEhhbmRsZXIpIGFyZSBuZWVkZWQuCi1BIGRvY3VtZW50IGluc3RhbmNlIGNhbiBiZSBjcmVhdGVkIHdpdGggdGhlIGFpZCBvZiBTQVgtY29tcGxhaW50IFhNTCBwYXJzZXIuCi1Gb3IgZXhhbXBsZSwgdXNpbmcgU3VuJ3MgcGFyc2VyIHlvdSB3b3VsZCB3cml0ZSwKLQotICBpbXBvcnQgY29tLnN1bi54c2x0LmRvbS5ET01JbXBsOwotICBpbXBvcnQgY29tLnN1bi54bWwucGFyc2VyLlBhcnNlcjsKLSAgaW1wb3J0IGNvbS5zdW4ueG1sLnBhcnNlci5SZXNvbHZlcjsKLQotICAvLyBDcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBET00gYW5kIFBhcnNlcgotICBET01JbXBsIGRvbSA9IG5ldyBET01JbXBsKCk7Ci0gIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7Ci0KLSAgLy8gU2V0IGEgU0FYIGhhbmRsZXIgdG8gYnVpbGQgYSBET00gdHJlZQotICBwYXJzZXIuc2V0RG9jdW1lbnRIYW5kbGVyKGRvbS5nZXRCdWlsZGVyKCkpOwotCi0gIC8vIFBhcnNlIHRoZSBkb2N1bWVudCBhbmQgYnVpbGQgYSBET00gdHJlZQotICBJbnB1dFNvdXJjZSBpbnB1dCA9IG5ldyBJbnB1dFNvdXJjZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IEZpbGVSZWFkZXIoInhtbGZpbGUueG1sIikpOwotICBwYXJzZXIucGFyc2UoaW5wdXQpOwotICAKLUluIHRoaXMgZXhhbXBsZSBhIGRvY3VtZW50IGlzIHBhcnNlZCBmcm9tIGEgZmlsZSwgYnV0IGl0IGlzIGFsc28gCi1wb3NzaWJsZSB0byBwYXJzZSBhIGRvY3VtZW50IGZyb20gYSBVUkkgYnkgd3JpdGluZywKLQotICBwYXJzZXIucGFyc2UoImh0dHA6Ly8uLi4veG1sZmlsZS54bWwiKTsKLQotVG8gdHJhbnNmb3JtIHRoZSBpbnB1dCBYTUwgZG9jdW1lbnQsIGEgY2FsbCBpcyBtYWRlIHRvIHRoZSB0cmFuc2xldCdzCi10cmFuc2Zvcm0oKSBtZXRob2QuIEluIG9yZGVyIHRvIGRvIGl0cyB3b3JrLCB0aGUgdHJhbnNmb3JtKCkgbWV0aG9kCi10YWtlcyB0d28gYXJndW1lbnRzLCAoMSkgdGhlIERPTUltcGwgb2JqZWN0IGNyZWF0ZWQgZnJvbSBwYXJzaW5nCi10aGUgaW5wdXQgWE1MIGRvY3VtZW50LCBhbmQgKDIpIGFuIG91dHB1dCBoYW5kbGVyLiBUaGUgb3V0cHV0IGhhbmRsZXIKLW11c3QgaW1wbGVtZW50IHRoZSBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXIgaW50ZXJmYWNlLiAgWW91IAotaGF2ZSB0aGUgb3B0aW9uIG9mOiAoMSkgd3JpdGluZyB5b3VyIG93biBjbGFzcyB0aGF0IGltcGxlbWVudHMgCi1Eb2N1bWVudEhhbmRsZXIsIG9yICgyKSB1c2luZyBvdXIgZGVmYXVsdCBjbGFzcwotJ2NvbS5zdW4ueHNsdC5ydW50aW1lLkRlZmF1bHRTQVhPdXRwdXRIYW5kbGVyJyBpbnN0ZWFkLiAgCi1UaGUgc291cmNlIGNvZGUgZm9yIG91ciBEZWZhdWx0U0FYT3V0cHV0SGFuZGxlciBpcyBpbmNsdWRlZAotaW4gdGhpcyBwYWNrYWdlIGluIHRoZSBjb20vc3VuL3hzbHQvcnVudGltZSBkaXJlY3RvcnkuIAotVGhpcyBpcyBhIGNoYW5nZSBmcm9tIHRoZSBwcmV2aW91cyByZWxlYXNlcyBvZgotb3VyIGNvbXBpbGVyIEFQSS4gSWYgeW91ICB3YW50ZWQgdG8gY3JlYXRlIHlvdXIgb3duIAotb3V0cHV0IGhhbmRsZXIgaW4gcHJldmlvdXMgcmVsZWFzZXMsIHlvdSB3b3VsZCBoYXZlIHdyaXRlIGEgY2xhc3MgdGhhdCAKLWltcGxlbWVudGVkIHRoZSBpbnRlcmZhY2UgVHJhbnNsZXRPdXRwdXRIYW5kbGVyLiBUaGlzIGNoYW5nZSB3YXMgbWFkZQotc28gdGhhdCB1c2VycyBjb3VsZCBtb3JlIGVhc2lseSBwbHVnIGluIGFueSBTQVggY29tcGxpYW50IG91dHB1dAotaGFuZGxlci4gVG8gcGx1ZyBpbiB0aGUgU0FYIGNvbXBsaWFudCBvdXRwdXQgaGFuZGxlciwKLSh3aGV0aGVyIGl0IGlzIGEgdXNlciB3cml0dGVuIGNsYXNzIG9yIG91ciBEZWZhdWx0U0FYT3V0cHV0SGFuZGxlcikKLWludG8gdGhlIHRyYW5zZm9ybSgpIG1ldGhvZCwgaXQgbXVzdCBiZSB3cmFwcGVkIGluIGEKLVRleHRPdXRwdXQgb2JqZWN0IGZpcnN0LiAKLQotVGhlIFRyYW5zbGV0LnRyYW5zZm9ybSgpIG1ldGhvZCBtYXkgYWxzbyB0YWtlIGFuIGFycmF5IG9mIG91dHB1dCBoYW5kbGVycy4gCi1JbiB0aGlzIGNhc2UgdGhlIHRyYW5zZm9ybWF0aW9uIHdpbGwgYmUgYWJsZSB0byBzZWxlY3Qgd2hpY2ggaGFuZGxlciAKLXRvIHNlbmQgb3V0cHV0IHRvIGJ5IHVzaW5nIHRoZSBleHRlbnNpb24gZWxlbWVudCA8dHJhbnNsZXQ6b3V0cHV0IHBvcnQ9Im4iPiAKLXdoZXJlICduJyBpcyBhIDAtYmFzZWQgaW5kZXggaW4gdGhlIGFycmF5IG9mIG91dHB1dCBoYW5kbGVycy4KLQotTGV0cyB0YWtlIGEgbG9vayBhdCB0aGUgY29kZSBuZWVkZWQgdG8gY2Fycnkgb3V0IGJvdGggb2YgdGhlIG9wdGlvbnMKLWZvciBwYXNzaW5nIHRoZSBTQVggb3V0cHV0IGhhbmRsZXIgdG8gdGhlIHRyYW5zbGV0J3MgdHJhbnNmb3JtKCkgbWV0aG9kOgotCi0gICAoMSkgWW91IHdvdWxkIHdyaXRlIHlvdXIgb3duIG91dHB1dCBoYW5kbGVyIHRoYXQgaW1wbGVtZW50cwotICAgICAgIHRoZSBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXIgaW50ZXJmYWNlLCBwYXNzIHRoaXMgY2xhc3MKLSAgICAgICBpbnRvIG91ciBjb20uc3VuLnhzbHQucnVudGltZS5UZXh0T3V0cHV0IGNsYXNzIHdoaWNoIGl0c2VsZgotICAgICAgIGltcGxlbWVudHMgdGhlIFRyYW5zbGV0T3V0cHV0SGFuZGxlciBpbnRlcmZhY2UuCi0KLSAgICgyKSBZb3Ugd291bGQgY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBkZWZhdWx0IFNBWCBvdXRwdXQgaGFuZGxlciwKLSAgICAgICBjb20uc3VuLnhzbHQucnVudGltZS5EZWZhdWx0U0FYT3V0cHV0SGFuZGxlciwgcGFzcyB0aGlzCi0gICAgICAgaW5zdGFuY2UgaW50byBvdXIgY29tLnN1bi54c2x0LnJ1bnRpbWUuVGV4dE91dHB1dCBjbGFzcyB3aGljaAotICAgICAgIGl0c2VsZiBpbXBsZW1lbnRzIHRoZSBUcmFuc2xldE91dHB1dEhhbmRsZXIgaW50ZXJmYWNlLgotCi0KLUluIG9wdGlvbiAoMSksIHdlIHdhbnQgdG8gdXNlIGEgU0FYIGNvbXBsaWFudCBvdXRwdXQgaGFuZGxlciB0aGF0IHdlIHdyaXRlCi1vdXJzZWx2ZXMuIEluIHRoaXMgY2FzZSB3ZSBjcmVhdGUgb3VyIEhhbmRsZXIgY2xhc3MsIHdoaWNoIGltcGxlbWVudHMgCi1vcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI6Ci0KLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci0KLS8vIHVzZXIgc3VwcGxpZWQgU0FYIEhhbmRsZXI6Ci1jbGFzcyBIYW5kbGVyIGltcGxlbWVudHMgRG9jdW1lbnRIYW5kbGVyIHsKLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotCi0gICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaGFyYWN0ZXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhjaGFyYWN0ZXJzLCBvZmZzZXQsIGxlbmd0aCkpOwotICAgIH0KLSAgICBwdWJsaWMgdm9pZCBzdGFydEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lLCBBdHRyaWJ1dGVMaXN0IGF0dHJzKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0gICAgcHVibGljIHZvaWQgZW5kRWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUpIHRocm93cyBTQVhFeGNlcHRpb24ge30KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2MpIHt9Ci0gICAgcHVibGljIHZvaWQgaWdub3JhYmxlV2hpdGVzcGFjZShjaGFyW10gY2hhcmFjdGVycywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotICAgIHB1YmxpYyB2b2lkIHByb2Nlc3NpbmdJbnN0cnVjdGlvbihTdHJpbmcgdGFyZ2V0LCBTdHJpbmcgZGF0YSkKLSAgICAgICAgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotfQotCi1Ob3cgYmVmb3JlIHdlIHBhc3Mgb3VyIGhhbmRsZXIgdG8gdGhlIHRyYW5zZm9ybSgpIG1ldGhvZCwgd2Ugd3JhcCBpdAotaW4gYSBUZXh0T3V0cHV0IG9iamVjdCAod2hpY2ggaW1wbGVtZW50cyB0aGUgVHJhbnNsZXRPdXRwdXRIYW5kbGVyCi1pbnRlcmZhY2UgZm9yIHVzKS4gIFRoZW4gZ2l2ZW4gdGhlIGluc3RhbnRpYXRlZCB0cmFuc2xldCBjbGFzcywgCi10aGUgdHJhbnNmb3JtIG1ldGhvZCBjb3VsZCBiZSBjYWxsZWQgYXM6Ci0KLQlpbXBvcnQgY29tLnN1bi54c2x0LnJ1bnRpbWUuVGV4dE91dHB1dDsKLQotCURPTUltcGwgZG9tOwotICAgICAgICAuLi4KLSAgICAgICAgSGFuZGxlciBzYXhIYW5kbGVyOwotICAgICAgICBUZXh0T3V0cHV0IHRleHRPdXRwdXQ7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBzYXhIYW5kbGVyID0gbmV3IEhhbmRsZXIoKTsKLSAgICAgICAgICAgIHRleHRPdXRwdXQgPSBuZXcgVGV4dE91dHB1dChzYXhIYW5kbGVyKTsKLSAgICAgICAgICAgIHRyYW5zbGV0LnRyYW5zZm9ybShkb20sIHRleHRPdXRwdXQpOwotICAgICAgICB9IGNhdGNoIChUcmFuc2xldEV4Y2VwdGlvbiAgZSl7Ci0JICAgIC4uLgotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiAgZSl7Ci0JICAgIC4uLgotICAgICAgICB9Ci0KLQotQnkgdXNpbmcgdGhlIFRleHRPdXRwdXQgd3JhcHBlciBjbGFzcywgb25lIGNhbiBhbHNvIGNvbnRyb2wgdGhlIGNoYXJhY3RlcgotZW5jb2RpbmcuIFRoZSBUZXh0T3V0cHV0IGNsYXNzIGhhcyBhbiBhZGRpdGlvbmFsIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMKLXRoZSBEb2N1bWVudEhhbmRsZXIgYW5kIGEgU3RyaW5nIHRoYXQgZGVzY3JpYmVzIHRoZSBlbmNvZGluZywgZm9yIGV4YW1wbGUKLSd0ZXh0T3V0cHV0JyBjb3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBhczoKLQotCXRleHRPdXRwdXQgPSBuZXcgVGV4dE91dHB1dChzYXhIYW5kbGVyLCAidXRmLTgiKTsKLQotRmluYWxseSwgb3B0aW9uICgyKSBpcyBtdWNoIGxpa2Ugb3B0aW9uICgxKSBleGNlcHQgeW91IGRvIG5vdCBoYXZlCi10byB3cml0ZSB5b3VyIG93biBEb2N1bWVudEhhbmRsZXIuIFdlIHByb3ZpZGUgb25lIGJ5IGRlZmF1bHQuIFRvIHVzZSB0aGUKLWRlZmF1bHQgb25lLCBpbnN0YW50aWF0ZSAnY29tLnN1bi54c2x0LnJ1bnRpbWUuRGVmYXVsdFNBWE91dHB1dEhhbmRsZXInCi1yYXRoZXIgdGhhbiBpbnN0YW50aWF0aW5nIHlvdXIgb3duIGNsYXNzIChzdWNoIGFzIEhhbmRsZXIgYWJvdmUpOgotCi0JaW1wb3J0IGNvbS5zdW4ueHNsdC5ydW50aW1lLkRlZmF1bHRTQVhPdXRwdXRIYW5kbGVyOwotCWltcG9ydCBjb20uc3VuLnhzbHQucnVudGltZS5UZXh0T3V0cHV0OwotCi0JRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIgZGVmaGFuZGxyOwotCXRyeSB7Ci0gICAgICAgICAgICBkZWZoYW5kbHIgPSBuZXcgRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIoU3lzdGVtLm91dCwgInV0Zi04Iik7Ci0gICAgICAgICAgICB0cmFuc2xldC50cmFuc2Zvcm0oZG9tLCBuZXcgVGV4dE91dHB1dChkZWZoYW5kbHIpKTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNsZXRFeGNlcHRpb24gIGUpewotCSAgICAuLi4KLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gIGUpewotCSAgICAuLi4KLSAgICAgICAgfQotCi1Gb3IgYSBxdWljayByZWZlcmVuY2UgdG8gdGhlIFRleHRPdXRwdXQgYW5kIERlZmF1bHRTQVhPdXRwdXRIYW5kbGVyCi1jb25zdHJ1Y3RvcnMgYXZhaWxhYmxlLCBzZWUgdGhlIEFwcGVuZGl4LiAKLQotSW4gdGhlIGZvbGxvd2luZyBzZWN0aW9ucywgZnVsbCBjb2RlIGV4YW1wbGVzIGFyZSBzaG93bi4KLQkKLUZpbmFsbHksIGlmIHlvdSB3YW50IHRoZSB0cmFuc2Zvcm1hdGlvbiByZXN1bHRzIGluIHRoZSBET00gZm9ybToKLQotRE9NIHJlc3VsdCA9IG5ldyBET00oKTsKLXRyYW5zbGV0LnRyYW5zZm9ybShkb20sIHJlc3VsdC5nZXRPdXRwdXREb21CdWlsZGVyKCkpOwotCi1JZiB0aGUgY29tcGlsZWQgc3R5bGVzaGVldCByZXF1aXJlcyB0aGUgdmFsdWVzIG9mIGdsb2JhbCAKLXBhcmFtZXRlcnMgdG8gYmUgc2V0LCB5b3Ugc2hvdWxkIGNhbGwgYWRkUGFyYW1ldGVyKCkgYmVmb3JlIAotY2FsbGluZyB0aGUgdHJhbnNmb3JtKCkgbWV0aG9kLgotCi0gCi0yLiBGVUxMIENPREUgRVhBTVBMRSAxLCBYc2x0QXBwLmphdmEsIHVzZXMgYSBTQVggRG9jdW1lbnRIYW5kbGVyLgotCVRoaXMgZXhhbXBsZSBjb3JyZXNwb25kcyB0byBvcHRpb24gKDEpIGluIGRpc2N1c3Npb24gYWJvdmUuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWltcG9ydCBqYXZhLmlvLkZpbGVSZWFkZXI7Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uc3VuLnhzbHQuZG9tLkRPTUltcGw7Ci1pbXBvcnQgY29tLnN1bi54c2x0LnJ1bnRpbWUuVGV4dE91dHB1dDsKLWltcG9ydCBjb20uc3VuLnhzbHQuVHJhbnNsZXQ7Ci1pbXBvcnQgY29tLnN1bi54c2x0LlRyYW5zbGV0RXhjZXB0aW9uOwotaW1wb3J0IGNvbS5zdW4ueG1sLnBhcnNlci5QYXJzZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguQXR0cmlidXRlTGlzdDsKLWltcG9ydCBvcmcueG1sLnNheC5Eb2N1bWVudEhhbmRsZXI7Ci1pbXBvcnQgb3JnLnhtbC5zYXguSW5wdXRTb3VyY2U7Ci1pbXBvcnQgb3JnLnhtbC5zYXguTG9jYXRvcjsKLWltcG9ydCBvcmcueG1sLnNheC5TQVhFeGNlcHRpb247Ci0KLQotLy8gQ3JlYXRlIGEgU0FYIE91dHB1dCBIYW5kbGVyCi1jbGFzcyBIYW5kbGVyIGltcGxlbWVudHMgRG9jdW1lbnRIYW5kbGVyIHsKLSAgICBwdWJsaWMgdm9pZCBzdGFydERvY3VtZW50KCkgdGhyb3dzIFNBWEV4Y2VwdGlvbiB7fQotCi0gICAgcHVibGljIHZvaWQgZW5kRG9jdW1lbnQoKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBjaGFyYWN0ZXJzKGNoYXJbXSBjaGFyYWN0ZXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uCi0gICAgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50bG4obmV3IFN0cmluZyhjaGFyYWN0ZXJzLCBvZmZzZXQsIGxlbmd0aCkpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHN0YXJ0RWxlbWVudChTdHJpbmcgZWxlbWVudE5hbWUsIEF0dHJpYnV0ZUxpc3QgYXR0cnMpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24ge30KLQotICAgIHB1YmxpYyB2b2lkIGVuZEVsZW1lbnQoU3RyaW5nIGVsZW1lbnROYW1lKSB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREb2N1bWVudExvY2F0b3IoTG9jYXRvciBsb2MpIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBpZ25vcmFibGVXaGl0ZXNwYWNlKGNoYXJbXSBjaGFyYWN0ZXJzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgICAgICB0aHJvd3MgU0FYRXhjZXB0aW9uIHt9Ci0KLSAgICBwdWJsaWMgdm9pZCBwcm9jZXNzaW5nSW5zdHJ1Y3Rpb24oU3RyaW5nIHRhcmdldCwgU3RyaW5nIGRhdGEpCi0gICAgICAgIHRocm93cyBTQVhFeGNlcHRpb24ge30KLQotfQotCi1wdWJsaWMgY2xhc3MgWHNsdEFwcCB7Ci0gICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsKLSAgICAgICAgWHNsdEFwcCBhcHAgPSBuZXcgWHNsdEFwcCgpOwotICAgICAgICBhcHAucnVuKGFyZ3MpOwotICAgfQotCi0gICBwdWJsaWMgdm9pZCBydW4oU3RyaW5nW10gYXJncyl7Ci0gICAgICAgIGlmKGFyZ3MubGVuZ3RoICE9IDIpewotICAgICAgICAgICAgICAgIHVzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RyaW5nIGlucHV0RmlsZU5hbWUgPSBhcmdzWzBdOwotICAgICAgICBTdHJpbmcgdHJhbnNsZXROYW1lID0gYXJnc1sxXTsKLQotICAgICAgICBET01JbXBsIGRvbSA9IG5ldyBET01JbXBsKCk7Ci0gICAgICAgIFBhcnNlciBwYXJzZXIgPSBuZXcgUGFyc2VyKCk7Ci0gICAgICAgIHBhcnNlci5zZXREb2N1bWVudEhhbmRsZXIoZG9tLmdldEJ1aWxkZXIoKSk7Ci0gICAgICAgIElucHV0U291cmNlIGlucHV0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGlucHV0ID0gbmV3IElucHV0U291cmNlKG5ldyBGaWxlUmVhZGVyKGlucHV0RmlsZU5hbWUpKTsKLSAgICAgICAgfSBjYXRjaCggamF2YS5pby5GaWxlTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkZpbGUgIiArIGlucHV0RmlsZU5hbWUgKyAiIG5vdCBmb3VuZCIpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICB0cnkgewotICAgICAgICAgICAgcGFyc2VyLnBhcnNlKGlucHV0KTsKLSAgICAgICAgfSBjYXRjaCAob3JnLnhtbC5zYXguU0FYRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0KLQotICAgICAgICBDbGFzcyB0cmFuc2xldFBsdWdnYWJsZSA9IG51bGw7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICB0cmFuc2xldFBsdWdnYWJsZSA9IENsYXNzLmZvck5hbWUodHJhbnNsZXROYW1lKTsKLSAgICAgICAgfSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yOiAiICsgZSk7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIFRyYW5zbGV0IHRyYW5zbGV0ID0gbnVsbDsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRyYW5zbGV0ID0gKFRyYW5zbGV0KXRyYW5zbGV0UGx1Z2dhYmxlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKGphdmEubGFuZy5FeGNlcHRpb24gZSl7Ci0gICAgICAgICAgICBTeXN0ZW0uZXJyLnByaW50bG4oIkVycm9yIGluc3RhbnRpYXRpbmcgcGx1Z2dhYmxlIHRyYW5zbGV0Iik7Ci0gICAgICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgICAgICAgfQotCi0gICAgICAgIEhhbmRsZXIgc2F4SGFuZGxlcjsKLSAgICAgICAgVGV4dE91dHB1dCB0ZXh0T3V0cHV0OwotICAgICAgICB0cnkgewotICAgICAgICAgICAgc2F4SGFuZGxlciA9IG5ldyBIYW5kbGVyKCk7Ci0gICAgICAgICAgICB0ZXh0T3V0cHV0ID0gbmV3IFRleHRPdXRwdXQoc2F4SGFuZGxlciwgInV0Zi04Iik7Ci0gICAgICAgICAgICB0cmFuc2xldC50cmFuc2Zvcm0oZG9tLCB0ZXh0T3V0cHV0KTsKLSAgICAgICAgfSBjYXRjaCAoVHJhbnNsZXRFeGNlcHRpb24gIGUpewotICAgICAgICAgICAgU3lzdGVtLmVyci5wcmludGxuKCJFcnJvcjogIiArIGUpOwotICAgICAgICAgICAgU3lzdGVtLmV4aXQoMSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uICBlKXsKLSAgICAgICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigiRXJyb3I6ICIgKyBlKTsKLSAgICAgICAgICAgIFN5c3RlbS5leGl0KDEpOwotICAgICAgICB9Ci0gICB9Ci0KLSAgIHB1YmxpYyB2b2lkIHVzYWdlKCl7Ci0gICAgICAgIFN5c3RlbS5vdXQucHJpbnRsbigiVXNhZ2U6IFxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgeHNsdGFwcCA8eG1sX2ZpbGU+IDx0cmFuc2xldF9uYW1lPlxuXG4iICsKLSAgICAgICAgICAgICAgICAiICAgICB3aGVyZSA8ZmlsZT4gaXMgeG1sIHNvdXJjZSAoZS5nLiBwbGF5LnhtbCkuIFxuIiArCi0gICAgICAgICAgICAgICAgIiAgICAgYW5kICA8dHJhbnNsZXRfbmFtZT4gaXMgamF2YSBjbGFzcyAoZS5nLiBwbGF5MSkuIFxuIgotICAgICAgICApOwotICAgICAgICBTeXN0ZW0uZXhpdCgxKTsKLSAgIH0KLX0KLQotCi0KLTMuIENPTVBJTElORyBBTkQgUlVOTklORyBUSEUgRVhBTVBMRToKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBjb21waWxlIHRoZSBleGFtcGxlIGFib3ZlLCBhc3N1bWluZyB5b3UgdW5wYWNrZWQgdGhlIGNvZGUKLWludG8gdGhlIGRpcmVjdG9yeSAvdG1wOgotCi1qYXZhYyAtY2xhc3NwYXRoICIvdG1wL3hzbHRjL2xpYi94bWwuamFyOi90bXAveHNsdGMvbGliL0JDRUwuamFyOi90bXAveHNsdGMKLS9saWIveHNsdGNydC5qYXIiIFhzbHRBcHAuamF2YQotCi1UbyBydW4gdGhlIGV4YW1wbGUgb24geG1sIGRvY3VtZW50ICdwbGF5LnhtbCcgYW5kIHN0eWxlc2hlZXQgJ3BsYXkxLnhzbCc6Ci0KLSgxKSBjb21waWxlIHRoZSBzdHlsZXNoZWV0OgotICAgICAgICB4c2x0YyBwbGF5MS54c2wKLSAKLSAgICB0aGlzIHdpbGwgcHJvZHVjZSB0aGUgdHJhbnNsZXQgJ3BsYXkxLmNsYXNzJy4KLQotKDIpIHJ1biB0aGUgdHJhbnNsZXQgd2l0aCB0aGUgWHNsdEFwcCBkZW1vOgotCi1qYXZhIC1jbGFzc3BhdGggL3RtcC94c2x0Yy9saWIveHNsdGNydC5qYXI6L3RtcC94c2x0Yy9saWIveG1sLmphcjouIFhzbHRBcHAgcGxheQotLnhtbCBwbGF5MQotCi0KLSAKLTQuIEZVTEwgQ09ERSBFWEFNUExFIDIsIERlZmF1bHRSdW4uamF2YQotCVRoaXMgZXhhbXBsZSBjb3JyZXNwb25kcyB0byBvcHRpb24gKDIpIGluIHRoZSBkaXNjdXNzaW9uIGFib3ZlLgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1TZWUgdGhlIHNvdXJjZSBmaWxlIGZvciB0aGUgY2xhc3MgJ2NvbS5zdW4ueHNsdC5ydW50aW1lLkRlZmF1bHRSdW4nLAotd2hpY2ggaXMgaW5jbHVkZWQgaW4gdGhlIHNyYyBkaXJlY3RvcnkuIEl0IHVzZXMgdGhlIAotJ0RlZmF1bHRTQVhPdXRwdXRIYW5kbGVyJyBhcHByb2FjaC4KLQotCi0KLQotNS4gQVBQRU5ESVgKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UZXh0T3V0cHV0Ci0tLS0tLS0tLS0tCi0KLXBhY2thZ2UgY29tLnN1bi54c2x0LnJ1bnRpbWU7Ci0KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0T3V0cHV0IGltcGxlbWVudHMgVHJhbnNsZXRPdXRwdXRIYW5kbGVyIHsKLQlwdWJsaWMgVGV4dE91dHB1dChEb2N1bWVudEhhbmRsZXIgaGFuZGxlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCXB1YmxpYyBUZXh0T3V0cHV0KERvY3VtZW50SGFuZGxlciBoYW5kbGVyLCBTdHJpbmcgZW5jb2RpbmcpIHRocm93cwotCQlJT0V4Y2VwdGlvbjsKLX0KLQotCi1EZWZhdWx0U0FYT3V0cHV0SGFuZGxlcgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXBhY2thZ2UgY29tLnN1bi54c2x0LnJ1bnRpbWU7Ci0KLXB1YmxpYyBjbGFzcyBEZWZhdWx0U0FYT3V0cHV0SGFuZGxlciBpbXBsZW1lbnRzIERvY3VtZW50SGFuZGxlcnsKLQlwdWJsaWMgRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIoV3JpdGVyIHdyaXRlcikgdGhyb3dzIElPRXhjZXB0aW9uOwotCXB1YmxpYyBEZWZhdWx0U0FYT3V0cHV0SGFuZGxlcihPdXRwdXRTdHJlYW0gb3V0LCBTdHJpbmcgZW5jb2RpbmcpCi0JICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQlwdWJsaWMgRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIoU3RyaW5nIGZpbGVuYW1lLCBTdHJpbmcgZW5jb2RpbmcpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0JLi4uCi19Ci0KLQotCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUVORCBPRiBSRUFETUUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FLnhzbHQgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS54c2x0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzBjYmU4Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FLnhzbHQKKysrIC9kZXYvbnVsbApAQCAtMSw5NyArMCwwIEBACi1OQU1FCi0JeHNsdCAtIFN1biBYU0xUIHJ1bnRpbWUgcHJvY2Vzc29yLiAKLQotCi1TWU5PUFNJUwotCXhzbHQgWy1qIDxqYXJmaWxlPl0gey11IDxkb2N1bWVudF91cmw+IHwgPGRvY3VtZW50Pn0gPGNsYXNzPiAKLSAgICAgICAgICAgICBbPG5hbWUxPj08dmFsdWUxPiAuLi5dCi0KLQotREVTQ1JJUFRJT04KLQlUaGUgU3VuIFhTTFQgcnVudGltZSBwcm9jZXNzb3IgaXMgYSBKYXZhLWJhc2VkIHRvb2wgZm9yIAotCXRyYW5zZm9ybWluZyBYTUwgZG9jdW1lbnQgZmlsZXMgdXNpbmcgYSB0cmFuc2xldCAoY29tcGlsZWQgCi0Jc3R5bGVzaGVldCkuIAotCi0JVGhlIFhTTFQgcHJvY2Vzc29yIGNhbiBiZSBydW4gb24gYW55IHBsYXRmb3JtIGluY2x1ZGluZyBVTklYLAotCVdpbmRvd3MsIE5ULCBNYWMgdGhhdCBzdXBwb3J0cyBKYXZhLCBpbmNsdWRpbmcgYSBQYWxtIFBpbG90Ci0Jd2l0aCBKMk1FIENMREMgKEphdmEgMiBNaWNybyBFZGl0aW9uLCBDb25uZWN0ZWQgTGltaXRlZCBEZXZpY2UKLQlDb25maWd1cmF0aW9uKS4KLQotT1BUSU9OUwotCi0JVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6Ci0KLQktaiA8amFyZmlsZT4KLQkJZ2V0cyB0aGUgdHJhbnNsZXQgPGNsYXNzPiBmcm9tIHRoZSBzcGVjaWZpZWQgPGphcmZpbGU+Ci0JCWluc3RlYWQgb2YgZnJvbSB0aGUgdXNlcidzIENMQVNTUEFUSC4JCi0KLQktdQotCQlTcGVjaWZpZXMgdGhhdCB0aGUgWE1MIDxkb2N1bWVudD4gbG9jYXRpb24gd2lsbCBiZSBhIFVSSQotCQlzdWNoIGFzICdodHRwOi8vbXlzZXJ2ZXIvaGFtbGV0LnhtbCcuCQkKLQotCi1PUEVSQU5EUwotCi0JVGhlIGZvbGxvd2luZyBvcGVyYW5kcyBhcmUgc3VwcG9ydGVkOgotCi0JPGRvY3VtZW50PiAgICAgCQlBbiBYTUwgZG9jdW1lbnQgdG8gYmUgcHJvY2Vzc2VkLiAKLQk8ZG9jdW1lbnRfdXJsPiAgICAgCUFuIFhNTCBkb2N1bWVudCB0byBiZSBwcm9jZXNzZWQsIHNwZWNpZmllZAotCQkJCWFzIGEgVVJMIChTZWUgLXUgb3B0aW9uIGFib3ZlKS4gCi0KLQk8Y2xhc3M+CQkJVGhlIHRyYW5zbGV0IHRoYXQgd2lsbCBkbyB0aGUgcHJvY2Vzc2luZy4KLQkJCQlUaGUgdHJhbnNsZXQgbWF5IG9wdGlvbmFsbHkgdGFrZSBhIHNldCBvZiAKLQkJCQlnbG9iYWwgcGFyYW1ldGVycyBzcGVjaWZpZWQgYXMgbmFtZS12YWx1ZSAKLQkJCQlwYWlycy4gQSBuYW1lLXZhbHVlIHBhaXIgdXNlcyB0aGUgZm9ybWF0Ci0JCQkJPG5hbWU+PTx2YWx1ZT4uCi0KLUVYQU1QTEVTCi0JRXhhbXBsZSAxOiAgUHJvY2Vzc2luZyBhbiBYTUwgZG9jdW1lbnQuCi0KLQlleGFtcGxlJSAgeHNsdCBoYW1sZXQueG1sIGhhbWxldCAKLQotCXdoZXJlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGNvbnRhaW5zIGFuIFhNTCBkb2N1bWVudAotCSdoYW1sZXQueG1sJyB0byBiZSBwcm9jZXNzZWQgYnkgdGhlIHRyYW5zbGV0IGNsYXNzICdoYW1sZXQnLgotCVRoZSB0cmFuc2xldCB3b3VsZCBoYXZlIGJlZW4gY3JlYXRlZCBpbml0aWFsbHkgdXNpbmcKLQl4c2x0YyB0byBjb21waWxlIGEgWFNMVCBzdHlsZXNoZWV0IG5hbWVkICdoYW1sZXQueHNsJy4gCi0KLQlFeGFtcGxlIDI6ICBMb2FkaW5nIHRyYW5zbGV0IGZyb20gYSBqYXIgZmlsZS4gCi0KLQlleGFtcGxlJSAgeHNsdCAtaiBoYW1sZXQuamFyIGhhbWxldC54bWwgaGFtbGV0Ci0KLQlJbiB0aGlzIGNhc2UgdGhlIHRyYW5zbGV0IGNsYXNzICdoYW1sZXQnIGlzIGxvYWRlZCBmcm9tIHRoZQotCXNwZWNpZmllZCBqYXIgZmlsZSwgJ2hhbWxldC5qYXInIGluc3RlYWQgb2YgZnJvbSB0aGUgdXNlcidzCi0JQ0xBU1NQQVRILgotCi0JRXhhbXBsZSAzOiBJZiB0aGUgdHJhbnNsZXQgZGVmaW5lZCBnbG9iYWwgcGFyYW1ldGVycywgdGhlbiAKLQl0aGVzZSBjYW4gYmUgcGFzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUgdG8gdGhlIHJ1bnRpbWUgcHJvY2Vzc29yCi0JYXMgYSBzcGFjZSBzZXBhcmF0ZWQgbGlzdCBvZiBuYW1lLXZhbHVlIHBhaXJzIHVzaW5nIHRoZSBmb3JtYXQKLQk8bmFtZT49PHZhbHVlPi4gRm9yIGV4YW1wbGUsCi0KLQlleGFtcGxlJSAgeHNsdCBoYW1sZXQueG1sIGhhbWxldCBzcGVha2VyPUhBTUxFVCAnc2NlbmU9U0NFTkUgSVYnCi0KLQlOb3RpY2UgdGhhdCB0aGUgc2Vjb25kIG5hbWUtdmFsdWUgcGFpciBoYWQgdG8gYmUgcXVvdGVkIGR1ZSB0byAKLQl0aGUgaW50ZXJ2ZW5pbmcgc3BhY2UgaW4gdGhlIHZhbHVlICJTQ0VORSBJViIuCi0KLQlleGFtcGxlJSB4c2x0IC11IGh0dHA6Ly96YXJ5YS5lYXN0L3Rlc3QueG1sIGhhbWxldAotCi0Jd2hlcmUgdGhlIHhtbCBkb2N1bWVudCAndGVzdC54bWwnIGNhbiBiZSBzcGVjaWZpZWQgYXMgYSBVUkwuCi0KLUZJTEVTCi0JZmlsZS54bWwJCWlucHV0IFhNTCBkb2N1bWVudCB0byBiZSBwcm9jZXNzZWQuIAotCWZpbGUuY2xhc3MJCWJ5dGUgY29kZSBmaWxlLgotCWZpbGUuamFyCQlqYXZhIGFyY2hpdmUgZmlsZS4KLQkKLVNFRSBBTFNPCi0JeHNsdGMsIGphci4KLQotQlVHUwotCVJlZmVyIHRvIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGluY2x1ZGVkIGluIHRoaXMgcmVsZWFzZS4KLQotQVVUSE9SUwotCUphY2VrIEFtYnJvemlhaywgICAgICAgICAgICAgICAgICAgICAgIGphY2VrLmFtYnJvemlha0BFYXN0LlN1bi5DT00KLQlTYW50aWFnbyBQZXJpY2FzLUdlZXJ0c2VuLCAgICBzYW50aWFnby5wZXJpY2FzZ2VlcnRzZW5ARWFzdC5TdW4uQ09NIAotCi0JQ29udHJpYnV0b3JzOgotCi0JTW9ydGVuIEpvcmdlbnNlbgkJICAgbW9ydGVuLmpvcmdlbnNlbkBJcmVsYW5kLlN1bi5DT00KLQlHLiBUb2RkIE1pbGxlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9kZC5taWxsZXJARWFzdC5TdW4uQ09NCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRS54c2x0YyBiL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FLnhzbHRjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM3N2Q0Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FLnhzbHRjCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLU5BTUUKLQl4c2x0YyAtIFN1biBYU0xUIENvbXBpbGVyIAotCi0KLVNZTk9QU0lTCi0JeHNsdGMgWy1vIDxvdXRwdXQ+XSBbLWQgPGRpcmVjdG9yeT5dIFstaiA8amFyZmlsZT5dIAotCSAgICAgIFstcCA8cGFja2FnZSBuYW1lPl0KLSAgICAgICAgICAgICAgWy11XSA8c3R5bGVzaGVldD4uLi4gCi0KLQotREVTQ1JJUFRJT04KLQlUaGUgU3VuIFhTTFQgQ29tcGlsZXIgaXMgYSBKYXZhLWJhc2VkIHRvb2wgZm9yIGNvbXBpbGluZyBYU0xUCi0Jc3R5bGVzaGVldHMgaW50byBsaWdodHdlaWdodCBhbmQgcG9ydGFibGUgSmF2YSBieXRlIGNvZGVzIAotCWNhbGxlZCB0cmFuc2xldHMuICAKLQotCVRoZSBYU0xUIENvbXBpbGVyIGNhbiBiZSBydW4gb24gYW55IHBsYXRmb3JtIGluY2x1ZGluZyBVTklYLAotCVdpbmRvd3MsIE5ULCBNYWMgdGhhdCBzdXBwb3J0cyBKYXZhIDEuMi54IG9yIGxhdGVyLiBUaGUgZ2VuZXJhdGVkCi0JdHJhbnNsZXRzIGNhbiBiZSBydW4gb24gYW55IHBsYXRmb3JtIHRoYXQgc3VwcG9ydHMgYSBKYXZhCi0JUnVudGltZSBFbnZpcm9ubWVudCwgaW5jbHVkaW5nIGEgUGFsbSBQaWxvdCB3aXRoIEoyTUUgQ0xEQyAKLQkoSmF2YSAyIE1pY3JvIEVkaXRpb24sIENvbm5lY3RlZCBMaW1pdGVkIERldmljZSBDb25maWd1cmF0aW9uKS4KLQotT1BUSU9OUwotCi0JVGhlIGZvbGxvd2luZyBvcHRpb25zIGFyZSBzdXBwb3J0ZWQ6Ci0KLQktbyA8b3V0cHV0PgotCQlDaGFuZ2VzIHRoZSBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgdHJhbnNsZXQgY2xhc3MuCi0JCUJ5IGRlZmF1bHQsIHRoZSB0cmFuc2xldCBjbGFzcyB3b3VsZCBiZSBuYW1lZAotCQk8c3R5bGVzaGVldD4sIGlmIC1vIDxvdXRwdXQ+IGlzIHNldCwgdGhlbiB0aGUgCi0JCXRyYW5zbGV0IGNsYXNzIHdvdWxkIGJlIG5hbWVkIDxvdXRwdXQ+LiBUcmFuc2xldAotCQljbGFzcyBmaWxlcyBhcmUgd3JpdHRlbiBhcyAuY2xhc3MgZmlsZXMuCi0KLQktZCA8ZGlyZWN0b3J5PgotCQlDaGFuZ2VzIHRoZSBkZXN0aW5hdGlvbiBkaXJlY3RvcnkuIEJ5IGRlZmF1bHQsIGFueQotCQl0cmFuc2xldCBjbGFzcyBmaWxlcyBnZW5lcmF0ZWQgd291bGQgYmUgcGxhY2VkIGluIAotCQl0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gSWYgLWQgPGRpcmVjdG9yeT4gCi0JCWlzIHNwZWNpZmllZCwgdGhlIGZpbGVzIHdvdWxkIGJlIG91dHB1dCB0byA8ZGlyZWN0b3J5Pi4KLQotCS1qIDxqYXJmaWxlPgotCQlPdXRwdXRzIGFsbCBnZW5lcmF0ZWQgdHJhbnNsZXQgY2xhc3MgZmlsZXMgaW50byBhIAotCQlqYXIgZmlsZSBuYW1lZCA8amFyZmlsZT4uamFyLiBXaGVuIHRoaXMgb3B0aW9uIGlzIAotCQl1c2VkIG9ubHkgYSBqYXIgZmlsZSB3aWxsIGJlIG91dHB1dC4KLQotCS1wIDxwYWNrYWdlIG5hbWU+Ci0JCVNwZWNpZnkgYSBwYWNrYWdlIG5hbWUgZm9yIGFsbCBnZW5lcmF0ZWQgdHJhbnNsZXQKLQkJY2xhc3Nlcy4JCQotCi0JLXUKLQkJU3BlY2lmaWVzIHRoYXQgPHN0eWxlc2hlZXQ+IGxvY2F0aW9uIHdpbGwgYmUgYSBVUkkKLQkJc3VjaCBhcyAnaHR0cDovL215c2VydmVyL3N0eWxlc2hlZXQxLnhzbCcuCQkKLQotCi1PUEVSQU5EUwotCi0JVGhlIGZvbGxvd2luZyBvcGVyYW5kIGlzIHN1cHBvcnRlZDoKLQotCTxzdHlsZXNoZWV0PiAgICBBIHBhdGggbmFtZSBvZiBhbiBpbnB1dCBzdHlsZXNoZWV0IGZpbGUuIAotCi0KLUVYQU1QTEVTCi0JRXhhbXBsZSAxOiAgQ3JlYXRpbmcgYSB0cmFuc2xldCBmcm9tIHN0eWxlc2hlZXQgJ2hhbWxldC54c2wnLgotCi0JZXhhbXBsZSUgIHhzbHRjIGhhbWxldC54c2wKLQotCXdvdWxkIHByb2R1Y2UgYSBzZXQgb2YgY2xhc3MgZmlsZXMgc3VjaCBhcyAnaGFtbGV0LmNsYXNzJywKLQknaGFtbGV0JDAuY2xhc3MnLCAnaGFtbGV0JDEuY2xhc3MnLgotCi0JRXhhbXBsZSAyOiAgT3V0cHV0dGluZyBhbGwgY2xhc3NlcyBpbnRvIGEgamFyIGZpbGUuCi0KLQlleGFtcGxlJSAgeHNsdGMgLWogaGFtbGV0LmphciBoYW1sZXQueHNsCi0KLQl3b3VsZCBwcm9kdWNlIGEgc2luZ2xlIGphciBmaWxlIG91dHB1dCwgJ2hhbWxldC5qYXInIHdoaWNoIHdvdWxkCi0JY29udGFpbiBhbGwgdGhlIGdlbmVyYXRlZCAuY2xhc3MgZmlsZXMgZm9yIHRoZSBoYW1sZXQgdHJhbnNsZXQuCi0KLQlFeGFtcGxlIDM6IE5hbWluZyB0aGUgY2xhc3MgZmlsZS4gIAotCi0JZXhhbXBsZSUgIHhzbHRjIC1vIG5ld2hhbWxldCBoYW1sZXQueHNsCi0KLQl3b3VsZCBwcm9kdWNlIGEgc2V0IG9mIGNsYXNzIGZpbGVzIHN1Y2ggYXMgJ25ld2hhbWxldC5jbGFzcycsCi0JJ25ld2hhbWxldCQwLmNsYXNzJywgZXRjIHJhdGhlciB0aGFuIHRoZSBkZWZhdWx0IHdoaWNoIHdvdWxkIAotCWJlICdoYW1sZXQuY2xhc3MnLCAnaGFtbGV0JDAuY2xhc3MnLCBldGMuCQotCi0JRXhhbXBsZSA0OiBNdWx0aXBsZSBzdHlsZXNoZWV0cy4gCi0KLQlleGFtcGxlJSAgeHNsdGMgaGFtbGV0MS54c2wgaGFtbGV0Mi54c2wgaGFtbGV0My54c2wKLQotCXdvdWxkIHByb2R1Y2UgYSBzZXQgb2YgY2xhc3MgZmlsZXMgZGVyaXZlZCBmcm9tIHRoZSB0aHJlZQotCXN0eWxlc2hlZXRzLiAKLQotCUV4YW1wbGUgNTogUGFja2FnZSBTcGVjaWZpY2F0aW9uLgotCi0JZXhhbXBsZSUgeHNsdGMgLXAgY29tLm15Y29tcGFueS50cmFuc2xldHMgaGFtbGV0LnhzbAotCi0Jd291bGQgcHJvZHVjZSBhIHNldCBvZiBjbGFzcyBmaWxlcyBzdWNoIGFzIAotCSdjb20vbXljb21wYW55L3RyYW5zbGV0cy9oYW1sZXQuY2xhc3MnLAotCSdjb20vbXljb21wYW55L3RyYW5zbGV0cy9oYW1sZXQkMC5jbGFzcycsIGV0Yy4KLQotRklMRVMKLQlmaWxlLnhzbAkJaW5wdXQgWFNMVCBzdHlsZXNoZWV0Ci0JZmlsZS5jbGFzcwkJYnl0ZSBjb2RlIGZpbGUKLQlmaWxlLmphcgkJamF2YSBhcmNoaXZlIGZpbGUKLQkKLVNFRSBBTFNPCi0JeHNsdCwgamFyLgotCi1CVUdTCi0JUmVmZXIgdG8gdGhlIHRvcC1sZXZlbCBSRUFETUUgaW5jbHVkZWQgaW4gdGhpcyByZWxlYXNlLgotCi1BVVRIT1JTCi0JSmFjZWsgQW1icm96aWFrLCAgICAgICAgICAgICAgICAgICAgICAgamFjZWsuYW1icm96aWFrQEVhc3QuU3VuLkNPTQotCVNhbnRpYWdvIFBlcmljYXMtR2VlcnRzZW4sICAgIHNhbnRpYWdvLnBlcmljYXNnZWVydHNlbkBFYXN0LlN1bi5DT00gCi0KLQlDb250cmlidXRvcnM6Ci0KLQlNb3J0ZW4gSm9yZ2Vuc2VuCQkgICBtb3J0ZW4uam9yZ2Vuc2VuQElyZWxhbmQuU3VuLkNPTQotCUcuIFRvZGQgTWlsbGVyLCAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2RkLm1pbGxlckBFYXN0LlN1bi5DT00KZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FMiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvUkVBRE1FMgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdjZDYxZi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL1JFQURNRTIKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi1SRUFETUUuQVBBQ0hFCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUVudGlyZSBzb3VyY2UgdHJlZSBhbmQgc3VwcG9ydCBwYWNrYWdlcyBhcmUgbG9jYXRlZCBpbiB0aGUgc2luZ2xlIGphcgotZmlsZSAnYXBhY2hlLmphcicuIAotCi0KLUluc3RhbGxhdGlvbgotLS0tLS0tLS0tLS0tLQotCi0oMSkgY3JlYXRlIGRpcmVjdG9yeSBbUm9vdF0sIHVucGFjayAnYXBhY2hlLmphcicgdGhlcmUuCi0JZXgpICUgY2QgL3RtcDsgbWtkaXIgeHNsdGNfYXBhY2hlIAotCSAgICAlIGNkIHhzbHRjX2FwYWNoZQotICAgICAgICBjb3B5IGFwYWNoZS5qYXIgdG8geHNsdGNfYXBhY2hlIGRpcmVjdG9yeQotCSAgICAlIGphciB4dmYgYXBhY2hlLmphciAKLQljbGVhbnVwCi0JICAgICUgcm0gLXJmIE1FVEEtSU5GIGFwYWNoZS5qYXIKLQotICAgIFVucGFja2luZyB0aGUgamFyIGZpbGUgd2lsbCByZXN1bHQgaW4gdGhlIGZvbGxvd2luZyB0cmVlOgotCi0JW1Jvb3RdCi0JICBFeHRlcm5hbC8KLQkgICAgQkNFTC8gICAgICAgICAgICAgICAgLi4uIGNvbnRhaW5zIEJDRUwuamFyCi0JICAgIEpMZXgvICAgICAgICAgICAgICAgIC4uLiBjb250YWlucyBKTGV4LmphcgotCSAgICBqYXZhX2N1cC8gICAgICAgICAgICAuLi4gY29udGFpbnMgamF2YV9jdXAuamFyLCBydW50aW1lL3J1bnRpbWUuamFyCi0JICAgIHhtbC10cjIvICAgICAgICAgICAgIC4uLiBjb250YWlucyB4bWwuamFyCi0JICBiaW4vCi0JICAgIHhzbHQKLQkgICAgeHNsdGMKLQkgIGRvYy8KLQkgICAgYXBpLyAgICAgICAgICAgICAgICAgLi4uIGNvbnRhaW5zIGphdmFkb2MgZm9yIGFwaQotCSAgc3JjLwotCSAgICBHTlVtYWtlZmlsZQotCSAgICBHTlVtYWtlZmlsZS5hbGxpbmMKLQkgICAgZG9jcy8KLQkgICAgICBMSUNFTlNFLnR4dAotCSAgICAgIE1lc3NhZ2UudHh0Ci0JICAgICAgUkVBRE1FCi0JICAgICAgUkVBRE1FLmFwaQotCSAgICAgIFJFQURNRS54c2x0Ci0JICAgICAgUkVBRE1FLnhzbHRjCi0JICAgICAgWFNMVENwcm5fbGcudHh0KgotCSAgICAgIHhzbHRjQTMudHh0Ci0JICAgIG9yZy8KLQkgICAgICBhcGFjaGUvCi0JCXhhbGFuLwotCQkgIHhzbHRjLwotCQkgICAgIChzcmMgdHJlZSkgIC4uLiBhbGwgdGhlIHNvdXJjZSBjb2RlIGZpbGVzCi0KLQotICAgIFRoZSAnc3JjIHRyZWUnIGlzIGEgaGllcmFyY2h5IG9mIHRoZSBmb2xsb3dpbmcgcGFja2FnZXM6Ci0Jb3JnLmFwYWNoZS54YWxhbi54c2x0YwotCW9yZy5hcGFjaGUueGFsYW4ueHNsdGMuY29tcGlsZXIKLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLnV0aWwKLQlvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmRvbQotCW9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZQotCW9yZy5hcGFjaGUueGFsYW4ueHNsdGMudXRpbAotCW9yZy5hcGFjaGUueGFsYW4ueHNsdGMudXRpbC5nZXRvcHQKLQotCi0oMikgbWFrZSBiaW4gcHJvZ3JhbXMgZXhlY3V0YWJsZQotCSAgICAlIGNobW9kICt4IGJpbi8qCi0KLSgzKSBzZXQgZW52IHZhcmlhYmxlIHRvIHBvaW50IHRvIHRvcCBvZiBkaXJlY3RvcnkgW1Jvb3RdCi0JZXgpICUgc2V0ZW52IFhTTFQgL3RtcC94c2x0Y19hcGFjaGUKLQotKDQpIGNvbXBpbGUgc291cmNlcyAodXNlcyBnbnUgbWFrZSBhbmQgdGhlIHByb3ZpZGVzICdHTlVtYWtlZmlsZScpLiBUaGlzCi0gICAgd2lsbCBjcmVhdGUgamF2YSBjbGFzc2VzIGluIFtSb290XS9jbGFzc2VzLCBlLmcuIC90bXAveHNsdGNfYXBhY2hlL2NsYXNzZXMuCi0gICAgKE5vIG5lZWQgdG8gc2V0IHlvdXIgQ0xBU1NQQVRIIHZhcmlhYmxlLikKLSAgICAKLQlleCkgJSBjZCBzcmM7IGdtYWtlIGFnYWluCi0KLSAgICBOb3RlOiB0aGUgJ2FnYWluJyB0YXJnZXQgZm9yY2VzIGV2ZXJ5dGhpbmcgdG8gYmUgYnVpbHQgZnJvbSBzY3JhdGNoLAotICAgIGluY2x1ZGluZyB0aGUgamF2YV9jdXAgc291cmNlIGZpbGVzLiBTdWJzZXF1ZW50IGJ1aWxkcyBjYW4gYmUgZG9uZQotICAgIHVzaW5nIHRoZSAnY2xhc3NlcycgdGFyZ2V0LiAKLQotKDUpIG1ha2UgdGhlIGphdmFkb2MKLQlleCkgJSBnbWFrZSBqZG9jCi0KLSg2KSBhZGQgYmluIGRpcmVjdG9yeSB0byB5b3VyIGV4ZWN1dGFibGUgcGF0aCwgCi0JZXgpICUgc2V0IHBhdGg9KCRYU0xUL2JpbiAkcGF0aCkKLQotKDcpIHRlc3QgZGlzdHJpYnV0aW9uLCBnaXZlbiBhIHN0eWxlc2hlZXQgKHRlc3QueHNsKSBhbmQgYW4gaW5wdXQgeG1sIGRvYwotICAgICh0ZXN0LnhtbCksIGFuZCBiZSBzdXJlIGN1cnJlbnQgd29ya2luZyBkaXJlY3RvcnkgKC4pIGlzIGluIHlvdXIKLSAgICBDTEFTU1BBVEguCi0gCSUgeHNsdGMgdGVzdC54c2wJCS4uLiBjcmVhdGVzIHRyYW5zbGV0LCB0ZXN0LmNsYXNzCi0JJSB4c2x0IHRlc3QueG1sIHRlc3QJCS4uLiBydW5zIHRyYW5zbGV0IG9uIHhtbCBpbnB1dAkKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvYWxsX25hbWVzcGFjZXMuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9hbGxfbmFtZXNwYWNlcy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MDM0YjcuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9hbGxfbmFtZXNwYWNlcy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2Nhc3RfZXhwcmVzc2lvbi5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL2Nhc3RfZXhwcmVzc2lvbi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDliYjAwOTAuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9jYXN0X2V4cHJlc3Npb24uZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9jb21waWxlcl9BU1QuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9jb21waWxlcl9BU1QuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OTg3MWI2Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvY29tcGlsZXJfQVNULmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvY29tcGlsZXJfRE9NLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvY29tcGlsZXJfRE9NLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA1NmNiYi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2NvbXBpbGVyX0RPTS5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2NvbXBpbGVyX2FyY2hpdGVjdHVyZS5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL2NvbXBpbGVyX2FyY2hpdGVjdHVyZS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1N2Q2NjEuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9jb21waWxlcl9hcmNoaXRlY3R1cmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9kb21fbmFtZXNwYWNlMS5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL2RvbV9uYW1lc3BhY2UxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5NDE4ZS4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2RvbV9uYW1lc3BhY2UxLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvZG9tX25hbWVzcGFjZTIuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9kb21fbmFtZXNwYWNlMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdmY2UyNGQuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9kb21fbmFtZXNwYWNlMi5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2RvbV9uYW1lc3BhY2UzLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvZG9tX25hbWVzcGFjZTMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJiOWI4Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvZG9tX25hbWVzcGFjZTMuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9pbmRleC54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL2luZGV4LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2JlMTg3OC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL2luZGV4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iSW50cm9kdWN0aW9uIHRvIFhTTFRDIj4KLSAgICA8cD48cmVmPkRlc2lnbiBkb2N1bWVudHMgYnkgPGp1bXAgaHJlZj0ibWFpbHRvOm1vcnRlbkB4bWwuYXBhY2hlLm9yZyI+TW9ydGVuIEomb3NsYXNoO3JnZW5zZW48L2p1bXA+IAotICAgIC0gdXBkYXRlZCAwNi4wMy4yMDAxPC9yZWY+PC9wPgotPHVsPgotICA8bGk+PGxpbmsgYW5jaG9yPSJjb21waWxlciI+Q29tcGlsZXIgZGVzaWduPC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9InJ1bnRpbWUiPlJ1bnRpbWUgbGlicmFyeS9ET00gZGVzaWduPC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBpZHJlZj0ieHNsdGNfdHJheCI+SW50ZWdyYXRpb24gb2YgdGhlIFRyYW5zbGV0IEFQSSBhbmQgVHJBWDwvbGluaz4gKGJ5IEcgVG9kZCBNaWxsZXIpPC9saT4gCi0gICAKLTwvdWw+Ci08cD5TZWUgYWxzbyA8anVtcCBocmVmPSIuLi94c2x0Y191c2FnZS5odG1sIj5Vc2luZyBYU0xUQzwvanVtcD4uPC9wPgotPGFuY2hvciBuYW1lPSJjb21waWxlciIvPgotIDxzMiB0aXRsZT0iQ29tcGlsZXIgZGVzaWduIj4KLSAgPHA+PGxpbmsgaWRyZWY9InhzbHRjX2NvbXBpbGVyIj48aW1nIHNyYz0iY29tcGlsZXJfYXJjaGl0ZWN0dXJlLmdpZiIgYWx0PSJjb21waWxlcl9hcmNoaXRlY3R1cmUuZ2lmIi8+PC9saW5rPjwvcD4KLSAgPHA+PHJlZj5GaWd1cmUgMTogQ29tcGlsZXIgYXJjaGl0ZWN0dXJlIG92ZXJ2aWV3PC9yZWY+PC9wPgotICA8cD5DbGljayBvbiB0aGUgcGljdHVyZSB0byBqdW1wIHRvIHRoZSBvdmVyYWxsIGRlc2lnbiBkb2N1bWVudCBmb3IgdGhlIGNvbXBpbGVyLjwvcD4KLSAgICA8cD5FYWNoIFhTTCBlbGVtZW50L2Z1bmN0aW9uIGFuZCBYUGF0aCBleHByZXNzaW9uL3BhdHRlcm4gaXMgcmVwcmVzZW50ZWQgYnkKLSAgaXRzIG93biBjbGFzcyBpbiB0aGUgQWJzdHJhY3QgU3ludGF4IFRyZWUgKEFTVCkuIFNvbWUgb2YgdGhlc2UgY2xhc3NlcyBoYXZlCi0gIHRoZWlyIG93biBkZXNpZ24gZG9jdW1lbnRzIChJIGFtIHdvcmtpbmcgb24gdGhlIHJlc3Qgb2YgdGhlbSk6PC9wPgotICAgIDxzMyB0aXRsZT0iWFNMIGVsZW1lbnRzIj4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxsaW5rIGlkcmVmPSJ4c2xfd2hpdGVzcGFjZV9kZXNpZ24iPiZsdDt4c2w6cHJlc2VydmUtc3BhY2UmZ3Q7LyZsdDt4c2w6c3RyaXAtc3BhY2UmZ3Q7PC9saW5rPgotICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGxpbmsgaWRyZWY9InhzbF9zb3J0X2Rlc2lnbiI+Jmx0O3hzbDpzb3J0Jmd0OzwvbGluaz4KLSAgICAgICAgICA8L2xpPgotICAgICAgICAgIDxsaT4KLSAgICAgICAgICAgIDxsaW5rIGlkcmVmPSJ4c2xfa2V5X2Rlc2lnbiI+Jmx0O3hzbDprZXkmZ3Q7PC9saW5rPgotICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGxpbmsgaWRyZWY9InhzbF9jb21tZW50X2Rlc2lnbiI+Jmx0O3hzbDpjb21tZW50Jmd0Oy8mbHQ7eHNsOm1lc3NhZ2UmZ3Q7PC9saW5rPgotICAgICAgICAgIDwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICAgIDwvczM+Ci0gICAgICAgIDxzMyB0aXRsZT0iWFNMIGZ1bmN0aW9ucyI+Ci0gICAgICAgIDx1bD4KLSAgICAgICAgICA8bGk+Ci0gICAgICAgICAgICA8bGluayBpZHJlZj0ieHNsX2tleV9kZXNpZ24iPmtleSgpPC9saW5rPgotICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGxpbmsgaWRyZWY9InhzbF9sYW5nX2Rlc2lnbiI+bGFuZygpPC9saW5rPgotICAgICAgICAgIDwvbGk+Ci0gICAgICAgICAgPGxpPgotICAgICAgICAgICAgPGxpbmsgaWRyZWY9InhzbF91bnBhcnNlZF9kZXNpZ24iPnVucGFyc2VkLWVudGl0eS11cmkoKTwvbGluaz4KLSAgICAgICAgICA8L2xpPgotICAgICAgICA8L3VsPgotICA8L3MzPgotICA8L3MyPjxhbmNob3IgbmFtZT0icnVudGltZSIvPgotICA8czIgdGl0bGU9IlJ1bnRpbWUgbGlicmFyeS9ET00gZGVzaWduIj4KLSAgPHA+PGxpbmsgaWRyZWY9InhzbHRjX3J1bnRpbWUiPjxpbWcgc3JjPSJydW50aW1lX2FyY2hpdGVjdHVyZS5naWYiIGFsdD0icnVudGltZV9hcmNoaXRlY3R1cmUuZ2lmIi8+PC9saW5rPjwvcD4KLSAgPHA+PHJlZj5GaWd1cmUgMjogUnVudGltZSBsaWJyYXJ5IGFyY2hpdGVjdHVyZSBvdmVydmlldzwvcmVmPjwvcD4KLSAgPHA+Q2xpY2sgb24gdGhlIHBpY3R1cmUgdG8ganVtcCB0byB0aGUgb3ZlcmFsbCBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBYU0xUQwotICBydW50aW1lIGxpYnJhcnkuIFRoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvbXBpbGVkCi0gIHRyYW5zbGV0IGFzIHdlbGwgYXMgdGhlIHRyYW5zbGV0IHJ1bnRpbWUgbGlicmFyeS48L3A+IAotICA8cD5UaGUgPGxpbmsgaWRyZWY9InhzbHRjX2RvbSI+SW50ZXJuYWwgRE9NPC9saW5rPiBkZXNjcmliZXMgdGhlIGNvbXBvbmVudHMgYW5kIHN0cnVjdHVyZSBvZiB0aGUgaW50ZXJuYWwgRE9NLAotICAgc3VwcG9ydCBmb3IgRE9NMiBuYXZpZ2F0aW9uLCB0aGUgRE9NIGFkYXB0ZXIsIERPTSBtdWx0aXBsZXhlciwgYW5kIERPTSBidWlsZGVyLjwvcD4KLSAgICA8cD48bGluayBpZHJlZj0ieHNsdGNfbmFtZXNwYWNlIj5OYW1lc3BhY2VzPC9saW5rPiBleHBsYWlucyBob3cgWFNMVEMgKGluY2x1ZGluZyB0aGUgY29tcGlsZXIpIGhhbmRsZXMKLSAgICAgbmFtZXNwYWNlcy48L3A+ICAgCi0gIDwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMva2V5X3JlbGF0aW9ucy5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL2tleV9yZWxhdGlvbnMuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDZkNGRjLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMva2V5X3JlbGF0aW9ucy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL21hdGNoX25hbWVzcGFjZTEuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9tYXRjaF9uYW1lc3BhY2UxLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQwMDU2ZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL21hdGNoX25hbWVzcGFjZTEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9tYXRjaF9uYW1lc3BhY2UyLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvbWF0Y2hfbmFtZXNwYWNlMi5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiMTAyNzcuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9tYXRjaF9uYW1lc3BhY2UyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvbmFtZXNwYWNlX3N0YWNrLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvbmFtZXNwYWNlX3N0YWNrLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ2OWQyMy4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL25hbWVzcGFjZV9zdGFjay5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL291dHB1dF9uYW1lc3BhY2VzMS5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL291dHB1dF9uYW1lc3BhY2VzMS5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNjhmYzIuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy9vdXRwdXRfbmFtZXNwYWNlczEuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9vdXRwdXRfbmFtZXNwYWNlczIuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy9vdXRwdXRfbmFtZXNwYWNlczIuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWY3Y2Y3Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvb3V0cHV0X25hbWVzcGFjZXMyLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvcGF0dGVybl9vYmplY3RzLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvcGF0dGVybl9vYmplY3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEwNzM5My4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3BhdHRlcm5fb2JqZWN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3J1bnRpbWVfYXJjaGl0ZWN0dXJlLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvcnVudGltZV9hcmNoaXRlY3R1cmUuZ2lmCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YzhlMmU3Li4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMvcnVudGltZV9hcmNoaXRlY3R1cmUuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy9ydW50aW1lX3R5cGVfbWFwcGluZy5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3J1bnRpbWVfdHlwZV9tYXBwaW5nLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzY5YTk5My4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3J1bnRpbWVfdHlwZV9tYXBwaW5nLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvc29ydF9vYmplY3RzLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvc29ydF9vYmplY3RzLmdpZgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVjN2NiYi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3NvcnRfb2JqZWN0cy5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3R5cGVfbWFwcGluZy5naWYgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3R5cGVfbWFwcGluZy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2NiYjkuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy90eXBlX21hcHBpbmcuZ2lmCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy90eXBlX21hcHBpbmdzLmdpZiBiL3hkb2NzL3NvdXJjZXMveHNsdGMvdHlwZV9tYXBwaW5ncy5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZjg4OGMuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy90eXBlX21hcHBpbmdzLmdpZgorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMvdHlwZWNhc3QuZ2lmIGIveGRvY3Mvc291cmNlcy94c2x0Yy90eXBlY2FzdC5naWYKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhOWMxNjguLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy90eXBlY2FzdC5naWYKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9jb21tZW50X2Rlc2lnbi54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9jb21tZW50X2Rlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYzBmZWYuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfY29tbWVudF9kZXNpZ24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEsIFN1bgotICogTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotICA8czEgdGl0bGU9IiZsdDt4c2w6Y29tbWVudCZndDsgLyAmbHQ7eHNsOm1lc3NhZ2UmZ3Q7Ij4KLSAgPHVsPgotICA8bGk+PGxpbmsgYW5jaG9yPSJmdW5jdGlvbmFsaXR5Ij5GdW5jdGlvbmFsaXR5PC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9ImltcGxlbWVudGF0aW9uIj5JbXBsZW1lbnRhdGlvbjwvbGluaz48L2xpPiAgCi0gIDwvdWw+Ci08YW5jaG9yIG5hbWU9ImZ1bmN0aW9uYWxpdHkiLz4KLTxzMiB0aXRsZT0iRnVuY3Rpb25hbGl0eSI+Ci0KLSAgPHA+VGhlIDxjb2RlPiZsdDt4c2w6Y29tbWVudCZndDs8L2NvZGU+IGVsZW1lbnQgaXMgdXNlZCB0byBpbnNlcnQgWE1MIGNvbW1lbnRzCi0gIGludG8gdGhlIHJlc3VsdCBkb2N1bWVudC4gVGhlIGNvbW1lbnQgaXMgaW5zZXJ0ZWQgYXMgZm9sbG93cyBpbiB0aGUgWFNMCi0gIHN0eWxlc2hlZXQ6PC9wPgotCi0gIDxzb3VyY2U+ICAgICZsdDtlbGVtZW50Jmd0OwotICAgICAgJmx0O3hzbDpjb21tZW50Jmd0O1RoaXMgaXMgYSBjb21tZW50ISZsdDsveHNsOmNvbW1lbnQmZ3Q7Ci0gICAgJmx0Oy9lbGVtZW50Jmd0Ozwvc291cmNlPgotCi0gIDxwPmFuZCBpdCB3aWxsIGJlIG91dHB1dCBpbiB0aGUgcmVzdWx0IGRvY3VtZW50IGFzIGZvbGxvd3M6PC9wPgotCi0gIDxzb3VyY2U+ICAgICZsdDtlbGVtZW50Jmd0OwotICAgICAgJmx0OyEtLSBUaGlzIGlzIGEgY29tbWVudCEgLS0mZ3Q7Ci0gICAgJmx0Oy9lbGVtZW50Jmd0Ozwvc291cmNlPgotCi0gIDxwPlRoZSA8Y29kZT4mbHQ7eHNsOm1lc3NhZ2UmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgdG8gc2VuZCBtZXNzYWdlcyB0bwotICB3aG8vd2hhdGV2ZXIgaXMgcGVyZm9ybWluZyB0aGUgdHJhbnNmb3JtYXRpb24uIFRoZSBtZXNzYWdlIGNhbiBiZSBkaXNwbGF5ZWQKLSAgaW4gYSB0ZXJtaW5hbCwgYSBkaWFsb2cgYm94LCBldGMuIFRoZSAgPGNvZGU+Jmx0O3hzbDptZXNzYWdlJmd0OzwvY29kZT4gZWxlbWVudAotICBpcyB1c2VkIGluIHRoZSBzYW1lIHdheSBhcyB0aGUgPGNvZGU+Jmx0O3hzbDpjb21tZW50Jmd0OzwvY29kZT4gZWxlbWVudCwKLSAgaG93ZXZlciB0aGUgbWVzc2FnZSBpcyA8ZW0+bm90PC9lbT4gb3V0cHV0IGluIHRoZSByZXN1bHQgZG9jdW1lbnQuPC9wPgotCi0gIDxwPlRoZSA8Y29kZT4mbHQ7eHNsOm1lc3NhZ2UmZ3Q7PC9jb2RlPiBlbGVtZW50IGhhcyBhbiBhdHRyaWJ1dGUKLSAgPGNvZGU+InRlcm1pbmF0ZSI8L2NvZGU+IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHRlcm1pbmF0ZSB0aGUgdHJhbnNmb3JtYXRpb24gYXQgYW55Ci0gIGdpdmVuIHN0YWdlLiBUaGlzIGlzIHVzZWZ1bCB3aGVuIHVzaW5nIG1lc3NhZ2UgdG8gZ2l2ZSBpbmZvcm1hdGlvbiBhYm91dAotICBpbGxlZ2FsIHZhbHVlcyBpbiB0aGUgaW5wdXQgZG9jdW1lbnQuPC9wPgotPC9zMj48YW5jaG9yIG5hbWU9ImltcGxlbWVudGF0aW9uIi8+Ci08czIgdGl0bGU9IkltcGxlbWVudGF0aW9uIj4KLQotICA8cD5UaGUgb3V0cHV0IGhhbmRsZXIgY2xhc3MgaGFzIGEgbWV0aG9kIGZvciBvdXRwdXR0aW5nIGNvbW1lbnRzIGluIHRoZQotICBvdXRwdXQgZG9jdW1lbnQgYW5kIG1lc3NhZ2VzIHRvIHRoZSBvcGVyYXRvci4gVGhlIGNvZGUgY29tcGlsZWQgZm9yIGEKLSAgY29tbWVudCBnYXRoZXJzIGFsbCB0ZXh0IHRoYXQgZ29lcyBpbnRvIHRoZSBjb21tZW50IGluIGEgU3RyaW5nVmFsdWVIYW5kbGVyCi0gIG9iamVjdCwgcmV0cmlldmVzIHRoZSBmdWxsIHRleHQgc3RyaW5nIGZyb20gdGhpcyBoYW5kbGVyLCBhbmQgdGhlbiBmaW5hbGx5Ci0gIHNlbmRzIGl0IHRvIHRoZSBvdXRwdXQgaGFuZGxlci4gU2ltaWxhcmx5IHRoZSBjb2RlIGNvbXBpbGVkIGZvciBhIG1lc3NhZ2UKLSAgd2lsbCBzaW1wbHkgc2VuZCB0aGUgbWVzc2FnZSB0byB0aGUgb3V0cHV0IGhhbmRsZXIgaW4gdXNlLjwvcD4KLQotICA8cD5NZXNzYWdlcyB3aWxsIGJlIG91dHB1dCB0byB0aGUgdGVybWluYWwgKHN0ZG91dCkgd2hlbiBhIHRyYW5zZm9ybWF0aW9uCi0gIGlzIHJ1biBpbiBhIHRlcm1pbmFsLiBUaGUgbWVzc2FnZSB3aWxsIGJlIG91dHB1dCBiZWZvcmUgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgb3V0cHV0IGRvY3VtZW50LiBNZXNzYWdlcyB3aWxsIGJlIHNob3duIGluIGEgZGlhbG9nIGJveCBpZiBhIHRyYW5zZm9ybWF0aW9uCi0gIGlzIHJ1biBpbiBhbiBhcHBsZXQuPC9wPgotCi0gIDxwPjxjb2RlPiZsdDt4c2w6bWVzc2FnZSZndDs8L2NvZGU+IGVsZW1lbnRzIHRoYXQgdXNlIHRoZSA8Y29kZT4idGVybWluYXRlIjwvY29kZT4KLSAgYXR0cmlidXRlIHRvIGFib3J0IHRyYW5zZm9ybWF0aW9ucyBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLiBBCi0gIFJ1bnRpbWVFeGNlcHRpb24gaXMgdXNlZCBmb3IgdGhpcywgYW5kIHRoZSBleGNlcHRpb24gdGV4dCBpczo8L3A+Ci0gIDxwPjxjb2RlPlRlcm1pbmF0aW9uIGZvcmNlZCBieSBhbiB4c2w6bWVzc2FnZSBpbnN0cnVjdGlvbjwvY29kZT48L3A+Ci0gIDwvczI+Ci08L3MxPiAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfa2V5X2Rlc2lnbi54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9rZXlfZGVzaWduLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWExMzdmNi4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9rZXlfZGVzaWduLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIxNCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLSAgPHMxIHRpdGxlPSImbHQ7eHNsOmtleSZndDsgLyBrZXkoKSAvIEtleVBhdHRlcm4iPgotICA8dWw+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iZnVuY3Rpb25hbGl0eSI+RnVuY3Rpb25hbGl0eTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImltcGxlbWVudGF0aW9uIj5JbXBsZW1lbnRhdGlvbjwvbGluaz48L2xpPiAgICAKLSAgPC91bD4KLSAgPGFuY2hvciBuYW1lPSJmdW5jdGlvbmFsaXR5Ii8+Ci0gIDxzMiB0aXRsZT0iRnVuY3Rpb25hbGl0eSI+Ci0KLSAgPHA+VGhlIDxjb2RlPiZsdDt4c2w6a2V5Jmd0OzwvY29kZT4gZWxlbWVudCBpcyBhIHRvcC1sZXZlbCBlbGVtZW50IHRoYXQgY2FuIGJlCi0gIHVzZWQgdG8gZGVmaW5lIGEgbmFtZWQgaW5kZXggb2Ygbm9kZXMgZnJvbSB0aGUgc291cmNlIFhNTCB0cmVlKHMpLiBUaGUKLSAgZWxlbWVudCBoYXMgdGhyZWUgYXR0cmlidXRlczo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIDxjb2RlPm5hbWU8L2NvZGU+IC0gdGhlIG5hbWUgb2YgdGhlIGluZGV4Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICA8Y29kZT5tYXRjaDwvY29kZT4gLSBhIHBhdHRlcm4gdGhhdCBkZWZpbmVzIHRoZSBub2Rlc2V0IHdlIHdhbnQKLSAgICAgIGluZGV4ZWQKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIDxjb2RlPnVzZTwvY29kZT4gLSBhbiBleHByZXNzaW9uIHRoYXQgZGVmaW5lcyB0aGUgdmFsdWUgdG8gYmUgdXNlZAotICAgICAgYXMgdGhlIGluZGV4IGtleSB2YWx1ZS4KLSAgICA8L2xpPgotICA8L3VsPgotCi0gIDxwPkEgbmFtZWQgaW5kZXggY2FuIGJlIGFjY2Vzc2VkIHVzaW5nIGVpdGhlciB0aGUgPGNvZGU+a2V5KCk8L2NvZGU+IGZ1bmN0aW9uIG9yCi0gIGEgS2V5UGF0dGVybi4gQm90aCB0aGVzZSBtZXRob2RzIGFkZHJlc3MgdGhlIGluZGV4IHVzaW5nIGl0cyBkZWZpbmVkIG5hbWUKLSAgKHRoZSAibmFtZSIgYXR0cmlidXRlIGFib3ZlKSBhbmQgYSBwYXJhbWV0ZXIgZGVmaW5pbmcgb25lIG9yIG1vcmUgbG9va3VwCi0gIHZhbHVlcyBmb3IgdGhlIGluZGV4LiBUaGUgZnVuY3Rpb24gb3IgcGF0dGVybiByZXR1cm5zIGEgbm9kZSBzZXQgY29udGFpbmluZwotICBhbGwgbm9kZXMgaW4gdGhlIGluZGV4IHdob3NlIGtleSB2YWx1ZSBtYXRjaCB0aGUgcGFyYW1ldGVyJ3MgdmFsdWUocyk6PC9wPgotCi0gIDxzb3VyY2U+Ci0gICAgJmx0O3hzbDprZXkgbmFtZT0iYm9vay1hdXRob3IiIG1hdGNoPSJib29rIiB1c2U9ImF1dGhvciIvJmd0OwotICAgIDoKLSAgICA6Ci0gICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9ImtleSgnYm9vay1hdXRob3InLCAnTWlraGFpbCBCdWxnYWtvdicpIiZndDsKLSAgICAgICZsdDt4c2w6dmFsdWUtb2Ygc2VsZWN0PSJhdXRob3IiLyZndDsKLSAgICAgICZsdDt4c2w6dGV4dCZndDs6ICZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAmbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0iYXV0aG9yIi8mZ3Q7Ci0gICAgICAmbHQ7eHNsOnRleHQmZ3Q7JmFtcDsjeGE7Jmx0Oy94c2w6dGV4dCZndDsKLSAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgPC9zb3VyY2U+Ci0KLSAgPHA+VGhlIEtleVBhdHRlcm4gY2FuIGJlIHVzZWQgd2l0aGluIGFuIGluZGV4IGRlZmluaXRpb24gdG8gY3JlYXRlIHVuaW9ucwotICBhbmQgaW50ZXJzZWN0aW9ucyBvZiBub2RlIHNldHM6PC9wPgotCi08c291cmNlPgotICAgICZsdDt4c2w6a2V5IG5hbWU9ImN1bHRjaWVzIiBtYXRjaD0iZmFybWVyIHwgZmlzaGVybWFuIiB1c2U9Im5hbWUiLyZndDsKLTwvc291cmNlPgotCi0gIDxwPlRoaXMgY291bGQgb2YgY291cnNlIGJlIGRvbmUgdXNpbmcgcmVndWxhciA8Y29kZT4mbHQ7eHNsOmZvci1lYWNoJmd0OzwvY29kZT4KLSAgYW5kIDxjb2RlPiZsdDt4c2w6c2VsZWN0Jmd0OzwvY29kZT4gZWxlbWVudHMuIEhvd2V2ZXIsIGlmIHlvdXIgc3R5bGVzaGVldAotICBhY2Nlc3NlcyB0aGUgc2FtZSBzZWxlY3Rpb24gb2Ygbm9kZXMgb3ZlciBhbmQgb3ZlciBhZ2FpbiwgdGhlIHRyYW5zZm9ybWF0aW9uCi0gIHdpbGwgYmUgbXVjaCBtb3JlIGVmZmljaWVudCB1c2luZyBwcmUtaW5kZXhlZCBrZXlzIGFzIHNob3duIGFib3ZlLjwvcD4KLSA8L3MyPjxhbmNob3IgbmFtZT0iaW1wbGVtZW50YXRpb24iLz4KLSA8czIgdGl0bGU9IkltcGxlbWVudGF0aW9uIj4KLQotICA8cD5BYnN0cmFjdFRyYW5zbGV0IGhhcyBhIGdsb2JhbCBoYXNodGFibGUgdGhhdCBob2xkcyBhbiBpbmRleCBmb3IgZWFjaCBuYW1lZAotICBrZXkgaW4gdGhlIHN0eWxlc2hlZXQgKGhhc2hpbmcgb24gdGhlICJuYW1lIiBhdHRyaWJ1dGUgb2YgeHNsOmtleSkuCi0gIEFic3RyYWN0VHJhbnNsZXQgaGFzIGEgY291cGxlIG9mIHB1YmxpYyBtZXRob2RzIGZvciBpbnNlcnRpbmcgYW5kIHJldHJpZXZpbmcKLSAgZGF0YSBmcm9tIHRoaXMgaGFzaHRhYmxlOjwvcD4KLQotPHNvdXJjZT4KLSAgICBwdWJsaWMgdm9pZCBidWlsZEtleUluZGV4KFN0cmluZyBuYW1lLCBpbnQgbm9kZUlELCBTdHJpbmcgdmFsdWUpOwotICAgIHB1YmxpYyBLZXlJbmRleCBLZXlJbmRleCBnZXRLZXlJbmRleChTdHJpbmcgbmFtZSk7Ci08L3NvdXJjZT4KLQotICA8cD5UaGUgS2V5IGNsYXNzIGNvbXBpbGVzIGNvZGUgdGhhdCB0cmF2ZXJzZXMgdGhlIGlucHV0IERPTSBhbmQgZXh0cmFjdHMKLSAgbm9kZXMgdGhhdCBtYXRjaCBzb21lIGdpdmVuIHBhcmFtZXRlcnMgKHRoZSA8Y29kZT4ibWF0Y2giPC9jb2RlPiBhdHRyaWJ1dGUgb2YgdGhlCi0gIDxjb2RlPiZsdDt4c2w6a2V5Jmd0OzwvY29kZT4gZWxlbWVudCkuIEEgbmV3IGVsZW1lbnQgaXMgaW5zZXJ0ZWQgaW50byB0aGUgbmFtZWQKLSAga2V5J3MgaW5kZXguIFRoZSBub2RlcycgRE9NIGluZGV4IGFuZCB0aGUgdmFsdWUgdHJhbnNsYXRlZCBmcm9tIHRoZSAKLSAgPGNvZGU+InVzZSI8L2NvZGU+IGF0dHJpYnV0ZSBvZiB0aGUgPGNvZGU+Jmx0O3hzbDprZXkmZ3Q7PC9jb2RlPiBlbGVtZW50IGFyZSBzdG9yZWQKLSAgaW4gdGhlIG5ldyBlbnRyeSBpbiB0aGUgaW5kZXguPC9wPgotCi0gIDxwPlRoZSBpbmRleCBpdHNlbGYgaXMgaW1wbGVtZW50ZWQgaW4gdGhlIDxjb2RlPktleUluZGV4PC9jb2RlPiBjbGFzcy4KLSAgVGhlIGluZGV4IGhhcyBhbiBoYXNodGFibGUgd2l0aCBhbGwgdGhlIHZhbHVlcyBmcm9tIHRoZSBtYXRjaGluZyBub2RlcyAodGhlCi0gIHBhcnQgb2YgdGhlIG5vZGUgdXNlZCB0byBnZW5lcmF0ZSB0aGlzIHZhbHVlIGlzIHRoZSBvbmUgc3BlY2lmaWVkIGluIHRoZQotICA8Y29kZT4idXNlIjwvY29kZT4gYXR0cmlidXRlKS4gRm9yIGV2ZXJ5IG1hdGNoaW5nIHZhbHVlIHRoZXJlIGlzIGEgVmVjdG9yCi0gIGhvbGRpbmcgYSBsaXN0IG9mIGFsbCBub2RlIGluZGV4ZXMgZm9yIHdoaWNoIHRoaXMgdmFsdWUgZ2l2ZXMgYSBtYXRjaDo8L3A+Ci0KLSAgPHA+PGltZyBzcmM9ImtleV9yZWxhdGlvbnMuZ2lmIiBhbHQ9ImtleV9yZWxhdGlvbnMuZ2lmIi8+PC9wPgotICA8cD48cmVmPkZpZ3VyZSAxOiBJbmRleGluZyB0YWJsZXM8L3JlZj48L3A+Ci0KLSAgPHA+VGhlIDxjb2RlPktleUluZGV4PC9jb2RlPiBjbGFzcyBpbXBsZW1lbnRzIHRoZSA8Y29kZT5Ob2RlSXRlcmF0b3I8L2NvZGU+Ci0gIGludGVyZmFjZSwgc28gdGhhdCBpdCBjYW4gYmUgcmV0dXJuZWQgZGlyZWN0bHkgYnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIHRoZQotICA8Y29kZT5rZXkoKTwvY29kZT4gZnVuY3Rpb24uIFRoaXMgaXMgaG93IHRoZSBpbmRleCBnZW5lcmF0ZWQgYnkKLSAgPGNvZGU+Jmx0O3hzbDprZXkmZ3Q7PC9jb2RlPiBhbmQgdGhlIG5vZGUtc2V0IHJldHVybmVkIGJ5IHRoZSA8Y29kZT5rZXkoKTwvY29kZT4gYW5kCi0gIEtleVBhdHRlcm4gYXJlIHRpZWQgdG9nZXRoZXIuIFlvdSBjYW4gc2VlIGhvdyB0aGlzIGlzIGRvbmUgaW4gdGhlCi0gIDxjb2RlPnRyYW5zbGF0ZSgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIDxjb2RlPktleUNhbGw8L2NvZGU+IGNsYXNzLjwvcD4KLQotICA8cD5UaGUgPGNvZGU+a2V5KCk8L2NvZGU+IGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gdHdvIHdheXM6PC9wPgotCi08c291cmNlPgotICAgIGtleSgna2V5LW5hbWUnLCd2YWx1ZScpCi0gICAga2V5KCdrZXktbmFtZScsJ25vZGUtc2V0JykKLTwvc291cmNlPgotCi0gIDxwPlRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMgYWx3YXlzIHRoZSBuYW1lIG9mIHRoZSBrZXkuIFdlIHVzZSB0aGlzIHZhbHVlIHRvCi0gIGxvb2t1cCBvdXIgaW5kZXggZnJvbSB0aGUgX2tleUluZGV4ZXMgaGFzaHRhYmxlIGluIEFic3RyYWN0VHJhbnNsZXQ6PC9wPgotCi08c291cmNlPgotICAgIGlsLmFwcGVuZChjbGFzc0dlbi5hbG9hZFRoaXMoKSk7Ci0gICAgX25hbWUudHJhbnNsYXRlKGNsYXNzR2VuLCBtZXRob2RHZW4pOwotICAgIGlsLmFwcGVuZChuZXcgSU5WT0tFVklSVFVBTChnZXRLZXlJbmRleCkpOwotPC9zb3VyY2U+Ci0KLSAgPHA+VGhpcyBjb21waWxlcyBpbnRvIGEgY2FsbCB0bwotICA8Y29kZT5BYnN0cmFjdFRyYW5zbGV0LmdldEtleUluZGV4KFN0cmluZyBuYW1lKTwvY29kZT4sIGFuZCBpdCBsZWF2ZXMgYQotICA8Y29kZT5LZXlJbmRleDwvY29kZT4gb2JqZWN0IG9uIHRoZSBzdGFjay4gV2hhdCB3ZSB0aGVuIG5lZWQgdG8gZG8gaXQgdG8KLSAgaW5pdGlhbGlzZSB0aGUgPGNvZGU+S2V5SW5kZXg8L2NvZGU+IHRvIGdpdmUgdXMgbm9kZXMgd2l0aCB0aGUgcmVxdWVzdGVkIHZhbHVlLgotICBUaGlzIGlzIGRvbmUgYnkgbGVhdmluZyB0aGUgPGNvZGU+S2V5SW5kZXg8L2NvZGU+IG9iamVjdCBvbiB0aGUgc3RhY2sgYW5kIHB1c2hpbmcKLSAgdGhlIDxjb2RlPiJ2YWx1ZSI8L2NvZGU+IHBhcmFtZXRlciB0byA8Y29kZT5rZXkoKTwvY29kZT4sIGJlZm9yZSBjYWxsaW5nCi0gIDxjb2RlPmxvb2t1cCgpPC9jb2RlPiBvbiB0aGUgaW5kZXg6PC9wPgotCi08c291cmNlPgotICAgIGlsLmFwcGVuZChEVVApOyAgLy8gZHVwbGljYXRlIHRoZSBLZXlJbmRleCBvYmVqY3QgYmVmb3JlIHJldHVybgotICAgIF92YWx1ZS50cmFuc2xhdGUoY2xhc3NHZW4sIG1ldGhvZEdlbik7Ci0gICAgaWwuYXBwZW5kKG5ldyBJTlZPS0VWSVJUVUFMKGxvb2t1cCkpOwotPC9zb3VyY2U+Ci0KLSAgPHA+VGhpcyBjb21waWxlcyBpbnRvIGEgY2FsbCB0byA8Y29kZT5LZXlJbmRleC5sb29rdXAoU3RyaW5nIHZhbHVlKTwvY29kZT4uIFRoaXMKLSAgd2lsbCBpbml0aWFsaXNlIHRoZSA8Y29kZT5LZXlJbmRleDwvY29kZT4gb2JqZWN0IHRvIHJldHVybiBub2RlcyB0aGF0IG1hdGNoIHRoZQotICBnaXZlbiB2YWx1ZSwgc28gdGhlIDxjb2RlPktleUluZGV4PC9jb2RlPiBvYmplY3QgY2FuIGJlIGxlZnQgb24gdGhlIHN0YWNrIHdoZW4KLSAgd2UgcmV0dXJuLiBUaGlzIGJlY2F1c2UgdGhlIDxjb2RlPktleUluZGV4PC9jb2RlPiBvYmplY3QgaW1wbGVtZW50cyB0aGUKLSAgPGNvZGU+Tm9kZUl0ZXJhdG9yPC9jb2RlPiBpbnRlcmZhY2UuPC9wPgotCi0gIDxwPlRoaXMgbWF0dGVyIGlzIGEgYml0IG1vcmUgY29tcGxleCB3aGVuIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mCi0gIDxjb2RlPmtleSgpPC9jb2RlPiBpcyBhIG5vZGUtc2V0LiBJbiB0aGlzIGNhc2Ugd2UgbmVlZCB0byB0cmF2ZXJzZSB0aGUgbm9kZXMgaW4KLSAgdGhlIHNldCBhbmQgZG8gYSBsb29rdXAgZm9yIGVhY2ggbm9kZSBpbiB0aGUgc2V0LiBXaGF0IEkgZG8gaXMgdGhpczo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIGNvbnN0cnVjdCBhIDxjb2RlPktleUluZGV4PC9jb2RlPiBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIHJldHVybiBub2RlLXNldAotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgZmluZCB0aGUgbmFtZWQgPGNvZGU+S2V5SW5kZXg8L2NvZGU+IG9iamVjdCBmcm9tIHRoZSBoYXNodGFibGUgaW4KLSAgICAgIEFic3RyYWN0VHJhbnNsZXQKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIGdldCBhbiBpdGVyYXRvciBmb3IgdGhlIG5vZGUtc2V0IGFuZCBkbyB0aGUgZm9sb3dpbmcgbG9vcDo8L2xpPgotICAgICAgPHVsPgotICAgICAgICA8bGk+Z2V0IHN0cmluZyB2YWx1ZSBmb3IgY3VycmVudCBub2RlPC9saT4KLSAgICAgICAgPGxpPmRvIGxvb2t1cCBpbiBLZXlJbmRleCBvYmplY3QgZm9yIHRoZSBuYW1lZCBpbmRleDwvbGk+Ci0gICAgICAgIDxsaT5tZXJnZSB0aGUgcmVzdWx0aW5nIG5vZGUtc2V0IGludG8gdGhlIHJldHVybiBub2RlLXNldDwvbGk+Ci0gICAgICA8L3VsPgotICAgIDxsaT4KLSAgICAgIGxlYXZlIHRoZSByZXR1cm4gbm9kZS1zZXQgb24gc3RhY2sgd2hlbiBkb25lCi0gICAgPC9saT4KLSAgPC91bD4KLQotICA8cD5UaGUgb25seSB3b3JrIHRoYXQgcmVtYWlucyBpcyB0byB1cGRhdGUgdGhlIDxjb2RlPm1lcmdlKCk8L2NvZGU+IG1ldGhvZCBvZgotICB0aGUgPGNvZGU+S2V5SW5kZXg8L2NvZGU+IGNsYXNzIHNvIHRoYXQgaXQgZWxpbWluYXRlcyBkdXBsaWNhdGUgbm9kZXMgaW4gdGhlCi0gIHJlc3VsdGluZyBub2RlLXNldC48L3A+Ci0gIDwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfbGFuZ19kZXNpZ24ueG1sIGIveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfbGFuZ19kZXNpZ24ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiOGMwYmYwLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsX2xhbmdfZGVzaWduLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLSAgPHMxIHRpdGxlPSJsYW5nKCkgZnVuY3Rpb24iPgotICA8dWw+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iZnVuY3Rpb25hbGl0eSI+RnVuY3Rpb25hbGl0eTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImltcGxlbWVudGF0aW9uIj5JbXBsZW1lbnRhdGlvbjwvbGluaz48L2xpPiAgICAKLSAgPC91bD4KLSAgPGFuY2hvciBuYW1lPSJmdW5jdGlvbmFsaXR5Ii8+Ci0gIDxzMiB0aXRsZT0iRnVuY3Rpb25hbGl0eSI+Ci0KLSAgPHA+VGhlIDxjb2RlPnhtbDpsYW5nPC9jb2RlPiBjYW4gYmUgdXNlZCB0byBkZXRlcm1pbmUgdGhlIGxhbmd1YWdlIGZvciBhIG5vZGUgb3IKLSAgYSBub2RlLXNldC4gVGhlIGF0dHJpYnV0ZSBjYW4gYmUgdXNlZCB0byBzdG9yZSBsYW5ndWFnZS1zcGVjaWZpYyBkYXRhIGluIGFuCi0gIFhNTCBkb2N1bWVudDo8L3A+Ci0KLSAgPHNvdXJjZT4KLSAgICAmbHQ7cGhyYXNlcyZndDsKLSAgICAgICZsdDtncmVldGluZyB4bWw6bGFuZz0iZW4iJmd0O0hlbGxvISZsdDsvZ3JlZXRpbmcmZ3Q7Ci0gICAgICAmbHQ7Z3JlZXRpbmcgeG1sOmxhbmc9Im5vIiZndDtIZWkhJmx0Oy9ncmVldGluZyZndDsKLSAgICAgICZsdDtncmVldGluZyB4bWw6bGFuZz0iZnIiJmd0O1NhbHV0ISZsdDsvZ3JlZXRpbmcmZ3Q7Ci0gICAgICAmbHQ7Z3JlZXRpbmcgeG1sOmxhbmc9ImVzIiZndDtIb2xhISZsdDsvZ3JlZXRpbmcmZ3Q7Ci0gICAgICAmbHQ7Z3JlZXRpbmcgeG1sOmxhbmc9ImRlIiZndDtTd2Vpbmh1bmQhJmx0Oy9ncmVldGluZyZndDsKLSAgICAmbHQ7L3BocmFzZXMmZ3Q7Ci0gIDwvc291cmNlPgotCi0gIDxwPlRoZSBYU0wgc3R5bGVzaGVldCBjYW4gdXNlIHRoZSA8Y29kZT5sYW5nKCk8L2NvZGU+IGZ1bmN0aW9uIHRvIHNlbGVjdCB0aGUKLSAgZWxlbWVudCB3aXRoIHRoZSBkZXNpcmVkIGxhbmd1YWdlOjwvcD4KLQotICA8c291cmNlPgotICAgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImdyZWV0aW5nIiZndDsKLSAgICAgICZsdDt4c2w6aWYgdGVzdD0ibGFuZygiZGUiKSZndDsKLSAgICAgICAgJmx0O3hzbDp2YWx1ZS1vZiBzZWxlY3Q9Ii4iLyZndDsKLSAgICAgICAgJmx0O3hzbDp0ZXh0Jmd0OyBHcm9zc2dsdWNrbGljaGVyIHd1bmNoZSEmbHQ7L3hzbDp0ZXh0Jmd0OwotICAgICAgJmx0Oy94c2w6aWYmZ3Q7Ci0gICAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gIDwvc291cmNlPgotPC9zMj4gPGFuY2hvciBuYW1lPSJpbXBsZW1lbnRhdGlvbiIvPgotPHMyIHRpdGxlPSJJbXBsZW1lbnRhdGlvbiI+Ci0KLSAgPHA+VGhlIERPTSBpbnRlcmZhY2UgaGFzIGJlZW4gZ2l2ZW4gYSBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBsYW5ndWFnZSBmb3IKLSAgYSBnaXZlbiBub2RlLiBUaGUgbGFuZ3VhZ2UgaXMgcmV0dXJuZWQgYXMgYSBzdHJpbmcgKG9uIHdoYXRldmVyIGZvcm1hdCBpcwotICB1c2VkIGluIHRoZSBYTUwgZG9jdW1lbnQgLSBzaG91bGQgYmUgaXNvKSwgYW5kIG1heSBiZSBudWxsIGlmIG5vIGxhbmd1YWdlIGlzCi0gIGRlZmluZWQuPC9wPgotCi0gIDxzb3VyY2U+Ci0gICAgcHVibGljIFN0cmluZyBET00uZ2V0TGFuZ3VhZ2UoaW50IG5vZGUpOwotICA8L3NvdXJjZT4KLQotICA8cD5UaGUgQmFzaXNMaWJyYXJ5IGNsYXNzIGhhcyBhIHN0YXRpYyBtZXRob2QgdGhhdCB3aWxsIGNvbXBhcmUgdGhlIGxhbmd1YWdlCi0gIG9mIHRoZSBjb250ZXh0IG5vZGUgd2l0aCBzb21lIG90aGVyIGxhbmd1YWdlIGFuZCByZXR1cm4gdGhlIHJlc3VsdCBhcyBhCi0gIGJvb2xlYW4uPC9wPgotCi0gIDxzb3VyY2U+Ci0gICAgcHVibGljIHN0YXRpYyBib29sZWFuIEJhc2lzTGlicmFyeS50ZXN0TGFuZ3VhZ2UoU3RyaW5nIGxhbmd1YWdlLCBET00gZG9tLCBpbnQgbm9kZSk7Ci0gIDwvc291cmNlPgotCi0gIDxwPlRoZSBjb21waWxlZCBjb2RlIGZvciB0aGUgPGNvZGU+bGFuZygpPC9jb2RlPiBtZXRob2QgY2FsbHMgdGhpcyBtZXRob2QgaW4gdGhlCi0gIEJhc2lzTGlicmFyeSBhbmQgbGVhdmVzIHRoZSByZXN1bHQgb24gdGhlIHN0YWNrIGZvciB0aGUgY2FsbGluZyBlbGVtZW50LjwvcD4KLSAgPC9zMj4KLTwvczE+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9zb3J0X2Rlc2lnbi54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF9zb3J0X2Rlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZkZGEzYTQuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfc29ydF9kZXNpZ24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMjExICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEsIFN1bgotICogTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotICA8czEgdGl0bGU9IiZsdDt4c2w6c29ydCZndDsiPgotICA8dWw+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iZnVuY3Rpb25hbGl0eSI+RnVuY3Rpb25hbGl0eTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9InNvcnQtY2xhc3MiPlRoZSBTb3J0IGNsYXNzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ic29ydGluZ2l0ZXJhdG9yLWNsYXNzIj5UaGUgU29ydGluZ0l0ZXJhdG9yIGNsYXNzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ibm9kZXNvcnRyZWNvcmQtY2xhc3MiPlRoZSBOb2RlU29ydFJlY29yZCBjbGFzczwvbGluaz48L2xpPiAgICAKLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJub2Rlc29ydHJlY29yZGZhY3RvcnktY2xhc3MiPlRoZSBOb2RlU29ydFJlY29yZEZhY3RvcnkgY2xhc3M8L2xpbms+PC9saT4KLSAgPC91bD4KLSAgCi0gIDxhbmNob3IgbmFtZT0iZnVuY3Rpb25hbGl0eSIvPgotICA8czIgdGl0bGU9IkZ1bmN0aW9uYWxpdHkiPgotCi0gIDxwPlRoZSA8Y29kZT4mbHQ7eHNsOnNvcnQmZ3Q7PC9jb2RlPiBlbGVtZW50IGlzIHVzZWQgdG8gZGVmaW5lIGEgc29ydCBrZXkgd2hpY2gKLSAgc3BlY2lmaWVzIHRoZSBvcmRlciBpbiB3aGljaCBub2RlcyBzZWxlY3RlZCBieSBlaXRoZXIKLSAgPGNvZGU+Jmx0O3hzbDphcHBseS10ZW1wbGF0ZXMmZ3Q7PC9jb2RlPiBvciA8Y29kZT4mbHQ7eHNsOmZvci1lYWNoJmd0OzwvY29kZT4gYXJlCi0gIHByb2Nlc3NlZC4gVGhlIG5vZGVzIGNhbiBiZSBzb3J0ZWQgZWl0aGVyIGluIG51bWVyaWNhbCBvciBhbHBoYWJldGljIG9yZGVyLAotICBhbmQgdGhlIGFscGhhYmV0aWMgb3JkZXIgbWF5IHZhcnkgZGVwZWluZGluZyBvbiB0aGUgbGFuZ3VhZ2UgaW4gdXNlLiBUaGUKLSAgbm9kZXMgY2FuIGJlIHNvcnRlZCBlaXRoZXIgaW4gYXNjZW5kaW5nIG9yIGRlc2NlbmRpbmcgb3JkZXIuPC9wPgotCi0gIDwvczI+PGFuY2hvciBuYW1lPSJzb3J0LWNsYXNzIi8+Ci0gIDxzMiB0aXRsZT0iVGhlIFNvcnQgY2xhc3MiPgotCi0gIDxwPlN0YXRpYyBtZXRob2RzIG9mIHRoZSBTb3J0IGNsYXNzIGlzIHJlc3BvbnNpYmxlIGZvciBnZW5lcmF0aW5nIHRoZQotICBuZWNlc3NhcnkgY29kZSBmb3IgaW52b2tpbmcgU29ydGluZ0l0ZXJhdG9ycyB1bmRlcgotICA8Y29kZT4mbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7eHNsOmZvci1lYWNoJmd0OzwvY29kZT4KLSAgZWxlbWVudHMuIEJvdGggdGhlc2UgZWxlbWVudHMgY2FuIGhhdmUgc2V2ZXJhbCA8Y29kZT4mbHQ7eHNsOnNvcnQmZ3Q7PC9jb2RlPgotICBjaGlsZCBub2RlcyBkZWZpbmluZyBwcmltYXJ5LCBzZWNvbmRhcnksIHRlcmlhcnksIGV0Yy4ga2V5cy4gVGhlIGNvZGUgZm9yCi0gIDxjb2RlPiZsdDt4c2w6YXBwbHktdGVtcGxhdGVzJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt4c2w6Zm9yLWVhY2gmZ3Q7PC9jb2RlPgotICBjcmVhdGUgIHZlY3RvcnMgY29udGFpbmcgYSBTb3J0IG9iamVjdCBmb3IgZWFjaCBzb3J0IGtleS4gVGhlIG9iamVjdCBtZXRob2RzCi0gIG9mIHRoZSBTb3J0IG9iamVjdCBlbmNhcHN1bGF0ZSBhIGNvbnRhaW5lciBmb3Iga2V5LXNwZWNpZmljIGRhdGEgKHN1Y2ggYXMgdGhlCi0gIHNvcnQga2V5IGl0c2VsZiwgc29ydCBvcmRlciwgc29ydCB0eXBlLCBhbmQgc3VjaCkgd2hpbGUgdGhlIHN0YXRpYyBtZXRob2RzCi0gIHRha2UgYSB2ZWN0b3Igb2YgU29ydCBvYmplY3RzIGFuZCBnZW5lcmF0ZSB0aGUgYWN0dWFsIGNvZGUuPC9wPgotCi0gIDxwPlRoZSA8Y29kZT50cmFuc2xhdGUoKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBTb3J0IG9iamVjdCBpcyBuZXZlciBjYWxsZWQuIFRoZQotICB2ZWN0b3JzIGNvbnRhaW5pbmcgdGhlIFNvcnQgb2JqZWN0cyBmb3IgYSA8Y29kZT4mbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyZndDs8L2NvZGU+Ci0gIG9yIDxjb2RlPiZsdDt4c2w6Zm9yLWVhY2gmZ3Q7PC9jb2RlPiBlbGVtZW50IGFyZSBpbnN0ZWFkIHBhc3NlZCB0byB0aGUgc3RhdGljCi0gIDxjb2RlPnRyYW5zbGF0ZVNvcnRJdGVyYXRvcigpPC9jb2RlPiBtZXRob2QuIFRoaXMgbWV0aG9kIGNvbXBpbGVzIGNvZGUgdGhhdAotICBpbnN0YW5jaWF0ZXMgYSBTb3J0aW5nSXRlcmF0b3Igb2JqZWN0IHRoYXQgd2lsbCBwYXNzIG9uIGEgbm9kZS1zZXQgaW4gYQotICBzcGVjaWZpYyBvcmRlciB0byB0aGUgY29kZSBoYW5kbGluZyB0aGUgPGNvZGU+Jmx0O3hzbDphcHBseS10ZW1wbGF0ZXMmZ3Q7PC9jb2RlPgotICBvciA8Y29kZT4mbHQ7eHNsOmZvci1lYWNoJmd0OzwvY29kZT4gZWxlbWVudC48L3A+Ci0KLSAgPC9zMj48YW5jaG9yIG5hbWU9InNvcnRpbmdpdGVyYXRvci1jbGFzcyIvPgotICA8czIgdGl0bGU9IlRoZSBTb3J0aW5nSXRlcmF0b3IgY2xhc3MiPgotCi0gIDxwPlRoZSBTb3J0aW5nSXRlcmF0b3IgY2xhc3MgaXMgcmVzcG9uc2libGUgZm9yIHNvcnRpbmcgbm9kZXMgZW5jYXBzdWxhdGVkIGluCi0gIHNvcnQgb2JlY3RzLiBUaGVzZSBzb3J0IG9iamVjdHMgbXVzdCBiZSBvZiBhIGNsYXNzIGluaGVyaXRpbmcgZnJvbQotICBOb2RlU29ydFJlY29yZCwgYSB0aGUgU29ydGluZ0l0ZXJhdG9yIG9iamVjdCBuZWVkcyBhIGZhY3Rvcnkgb2JqZWN0IHByb3ZpZGluZwotICBpdCB3aXRoIHRoZSBjb3JyZWN0IHR5cGUgb2Ygb2JqZWN0czo8L3A+Ci0KLSAgPHA+PGltZyBzcmM9InNvcnRfb2JqZWN0cy5naWYiIGFsdD0ic29ydF9vYmplY3RzLmdpZiIvPjwvcD4KLSAgPHA+PHJlZj5GaWd1cmUgMTogU29ydGluZ0l0ZXJhdG9yPC9yZWY+PC9wPgotCi0gIDxwPlRoZSBTb3J0aW5nSXRlcmF0b3IgY2xhc3MgaXMgZmFpcmx5IGR1bWIgYW5kIGxlYXZlcyBtdWNoIG9mIHRoZSB3b3JrIHRvIHRoZQotICBOb2RlU29ydFJlY29yZCBjbGFzcy4gVGhlIGl0ZXJhdG9yIGdldHMgdGhlIE5vZGVTb3J0UmVjb3JkcyBmcm9tIHRoZSBmYWN0b3J5Ci0gIG9iamVjdCBhbmQgc29ydHMgdGhlbSB1c2luZyBxdWlja3NvcnQgYW5kIGNhbGxpbmcgPGNvZGU+Y29tcGFyZVRvKCk8L2NvZGU+IG9uCi0gIHBhaXJzIG9mIE5vZGVTb3J0UmVjb3JkIG9iamVjdHMuPC9wPgotCi0gIDwvczI+PGFuY2hvciBuYW1lPSJub2Rlc29ydHJlY29yZC1jbGFzcyIvPgotICA8czIgdGl0bGU9IlRoZSBOb2RlU29ydFJlY29yZCBjbGFzcyI+Ci0KLSAgPHA+VGhlIHN0YXRpYyBtZXRob2RzIGluIHRoZSBTb3J0IGNsYXNzIGdlbmVyYXRlcyBhIGNsYXNzIGluaGVyaXRpbmcgZnJvbQotICBOb2RlU29ydFJlY29yZCwgd2l0aCB0aGUgZm9sbG93aW5nIG92ZXJsb2FkZWQgbWV0aG9kczo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT48ZW0+Q2xhc3MgQ29uc3RydWN0b3I8L2VtPjwvbGk+Ci0gICAgICA8dWw+PGxpPlRoZSBjbGFzcyBjb25zdHJ1Y3RvciBpcyBvdmVybG9hZGVkIHRvIGNyZWF0ZSBzb3J0LWtleSBnbG9iYWwKLSAgICAgIHRhYmxlcywgc3VjaCBhcyBhbiBhcnJheSBjb250YWluaW5nIHRoZSBzb3J0IG9yZGVyIGZvciBhbGwgdGhlIHNvcnQga2V5cwotICAgICAgYW5kIGFub3RoZXIgYXJyYXkgY29udGFpbmcgYWxsIHRoZSBzb3J0IHR5cGVzLiBEaWZmZXJlbnQgc29ydCBvcmRlci90eXBlcwotICAgICAgY2FuIGJlIHNwZWNpZmllZCBmb3IgdGhlIGRpZmZlcmVudCBsZXZlbHMgb2Ygc29ydCBrZXlzLCBidXQgd2UgYXNzdW1lIHRoYXQKLSAgICAgIHRoZSBzYW1lIGxhbmd1YWdlIGlzIHVzZWQgZm9yIGFsbCBsZXZlbHMuPC9saT48L3VsPgotICAgICAgCi0gICAgPGxpPjxjb2RlPmV4dHJhY3RWYWx1ZUZyb21ET00oaW50IGxldmVsKTwvY29kZT48L2xpPgotICAgICAgPHVsPjxsaT5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgYnkgdGhlIFNvcnRpbmdJdGVyYXRvciBvYmplY3QgdG8gZXh0cmFjdCB0aGUKLSAgICAgIHZhbHVlIGZvciBhIHNwZWNpZmljIHNvcnQga2V5IGZvciBhIG5vZGUuIFRoZSBTb3J0aW5nSXRlcmF0b3Igd2lsbCBvbmx5Ci0gICAgICB1c2UgdGhpcyBtZXRob2Qgb25jZSBhbmQgd2lsbCBjYWNoZSB0aGUgcmV0dXJuZWQgdmFsdWUgZm9yIGxhdGVyIHVzZS4gVGhlCi0gICAgICBtZXRob2Qgd2lsbCBvbmx5IGJlIGNhbGxlZCBpZiBhYnN1bHRlbHkgbmVjZXNzYXJ5LjwvbGk+PC91bD4KLQotICAgIDxsaT48Y29kZT5jb21wYXJlVHlwZShpbnQgbGV2ZWwpPC9jb2RlPjwvbGk+Ci0gICAgICA8dWw+PGxpPlRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHNvcnQgdHlwZSBmb3Igb25lIHNvcnQga2V5IGxldmVsLiBSZXR1cm5zCi0gICAgICBlaXRoZXIgPGNvZGU+Q09NUEFSRV9TVFJJTkc8L2NvZGU+IG9yIDxjb2RlPkNPTVBBUkVfTlVNRVJJQzwvY29kZT4uPC9saT48L3VsPgotICAgIAotICAgIDxsaT48Y29kZT5zb3J0T3JkZXIoaW50IGxldmVsKTwvY29kZT48L2xpPgotICAgICAgPHVsPjxsaT5UaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBzb3J0IG9yZGVyIGZvciBvbmUgc29ydCBrZXkgbGV2ZWwuIFJldHVybnMKLSAgICAgIGVpdGhlciA8Y29kZT5DT01QQVJFX0FTQ0VORElORzwvY29kZT4gb3IgPGNvZGU+Q09NUEFSRV9ERVNDRU5ESU5HPC9jb2RlPjwvbGk+PC91bD4KLSAgICAKLSAgICA8bGk+PGNvZGU+Z2V0Q29sbGF0b3IoaW50IGxldmVsKTwvY29kZT48L2xpPgotICAgICAgPHVsPjxsaT5UaGlzIG1ldGhvZCByZXR1cm5zIGEgQ29sbGF0b3Igb2JqZWN0IGZvciBsYW5ndWFnZS1zcGVjaWZpYwotICAgICAgc3RyaW5nIGNvbXBhcmlzb25zLiBUaGUgc2FtZSBDb2xsYXRvciBpcyB1c2VkIGZvciBhbGwgbGV2ZWxzIG9mIHRoZSBrZXkuCi0gICAgICA8L2xpPjwvdWw+IAotICA8L3VsPgotCi0gIDxwPlRoZSA8Y29kZT5jb21wYXJlVG8oKTwvY29kZT4gbWV0aG9kIG9mIHRoZSBOb2RlU29ydFJlY29yZCBiYXNlIGNsYXNzIGRlc2VydmVzCi0gIGEgYml0IG9mIGF0dGVudGlvbi4gSXQgdGFrZXMgaXRzIG93biBub2RlIChmcm9tIHRoZSB0aGlzIHBvaW50ZXIpIGFuZCBhbm90aGVyCi0gIG5vZGUgYW5kIGNvbXBhcmVzLCBpZiBuZWNlc3NhcnksIHRoZSB2YWx1ZXMgZm9yIGFsbCBzb3J0IGtleXM6PC9wPgotCi0gIDxzb3VyY2U+Ci0gICAgLyoqCi0gICAgICogQ29tcGFyZSB0aGlzIHNvcnQgZWxlbWVudCB0byBhbm90aGVyLiBUaGUgZmlyc3QgbGV2ZWwgaXMgY2hlY2tlZCBmaXJzdCwKLSAgICAgKiBhbmQgd2UgcHJvY2VlZCB0byB0aGUgbmV4dCBsZXZlbCBvbmx5IGlmIHRoZSBmaXJzdCBsZXZlbCBrZXlzIGFyZQotICAgICAqIGlkZW50aWNhbCAoYW5kIHNvIHRoZSBrZXkgdmFsdWVzIG1heSBub3QgZXZlbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgRE9NKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKE5vZGVTb3J0UmVjb3JkIG90aGVyKSB7Ci0JaW50IGNtcDsKLSAgICAKLQlmb3IgKGludCBsZXZlbD0wOyBsZXZlbCZsdDtfbGV2ZWxzOyBsZXZlbCsrKSB7Ci0JICAgIAotCSAgICAvLyBDb21wYXJlIHRoZSB0d28gbm9kZXMgZWl0aGVyIGFzIG51bWVyaWMgb3IgdGV4dCB2YWx1ZXMKLQkgICAgaWYgKGNvbXBhcmVUeXBlKGxldmVsKSA9PSBDT01QQVJFX05VTUVSSUMpIHsKLQkJZmluYWwgRG91YmxlIG91ciA9IG51bWVyaWNWYWx1ZShsZXZlbCk7Ci0JCWZpbmFsIERvdWJsZSB0aGVpciA9IG90aGVyLm51bWVyaWNWYWx1ZShsZXZlbCk7Ci0JCWlmIChvdXIgPT0gbnVsbCkgcmV0dXJuKC0xKTsKLQkJaWYgKHRoZWlyID09IG51bGwpIHJldHVybigxKTsKLQkJY21wID0gb3VyLmNvbXBhcmVUbyh0aGVpcik7Ci0JICAgIH0KLQkgICAgZWxzZSB7Ci0JCVN0cmluZyBvdXIgPSBzdHJpbmdWYWx1ZShsZXZlbCk7Ci0JCVN0cmluZyB0aGVpciA9IG90aGVyLnN0cmluZ1ZhbHVlKGxldmVsKTsKLQkJaWYgKG91ciA9PSBudWxsKSByZXR1cm4oLTEpOwotCQlpZiAodGhlaXIgPT0gbnVsbCkgcmV0dXJuKDEpOwotCQljbXAgPSBnZXRDb2xsYXRvcigpLmNvbXBhcmUob3VyLHRoZWlyKTsKLQkgICAgfQotCSAgICAKLQkgICAgLy8gUmV0dXJuIGludmVyc2UgY29tcGFyZSB2YWx1ZSBpZiBpbnZlcnNlIHNvcnQgb3JkZXIKLQkgICAgaWYgKGNtcCAhPSAwKSB7Ci0JCWlmIChzb3J0T3JkZXIobGV2ZWwpID09IENPTVBBUkVfREVTQ0VORElORykKLQkJICAgIHJldHVybigwIC0gY21wKTsKLQkJZWxzZQotCQkgICAgcmV0dXJuKGNtcCk7Ci0JICAgIH0KLQkgICAgCi0JfQotCXJldHVybigwKTsKLSAgICB9Ci0gIDwvc291cmNlPgotCi0gIDxwPlRoZSB0d28gbWV0aG9kcyA8Y29kZT5zdHJpbmdWYWx1ZShpbnQgbGV2ZWwpPC9jb2RlPiBhbmQgCi0gIDxjb2RlPm51bWVyaWNWYWx1ZShpbnQgbGV2ZWwpPC9jb2RlPiByZXR1cm4gdmFsdWVzIGZvciBvbmUgbGV2ZWwgb2YgdGhlIHNvcnQga2V5Ci0gIG9mIGEgbm9kZS4gVGhlc2UgbWV0aG9kcyBjYWNoZSB0aGVzZSB2YWx1ZXMgYWZ0ZXIgdGhleSBhcmUgZmlyc3QgcmVhZCBzbyB0aGF0Ci0gIHRoZSA8Y29kZT5ET00uZ2V0Tm9kZVZhbHVlKCk8L2NvZGU+IGlzIG9ubHkgY2FsbGVkIG9uY2UuIEFsc28sIHRoZSBhbGdvcml0aG0KLSAgdXNlZCBmb3IgdGhlc2UgdHdvIG1ldGhvZHMgYXNzdXJlIHRoYXQgPGNvZGU+RE9NLmdldE5vZGVWYWx1ZSgpPC9jb2RlPiBpcyBvbmx5Ci0gIGNhbGxlZCB3aGVuIG5lZWRlZC4gVGhlIHZhbHVlIGZvciBhIG5vZGUncyBzZWNvbmRhcnkgc29ydCBrZXkgaXMgbmV2ZXIKLSAgcmV0cmlldmVkIGlmIHRoZSBub2RlIGNhbiBiZSB1bmlxdWVseSBpZGVudGlmaWVkIGJ5IGl0cyBwcmltYXJ5IGtleS48L3A+Ci0KLSAgPC9zMj48YW5jaG9yIG5hbWU9Im5vZGVzb3J0cmVjb3JkZmFjdG9yeS1jbGFzcyIvPgotICA8czIgdGl0bGU9IlRoZSBOb2RlU29ydFJlY29yZEZhY3RvcnkgY2xhc3MiPgotCi0gIDxwPkFmdGVyIHRoZSBzdGF0aWMgbWV0aG9kcyBvZiB0aGUgU29ydCBjbGFzcyBoYXMgZ2VuZXJhdGVkIHRoZSBuZXcgY2xhc3MgZm9yCi0gIHNvcnQgb2JqZWN0cyBpdCBnZW5lcmF0ZXMgY29kZSB0aGF0IGluc3RhbmNpYXRlcyBhIG5ldyBOb2RlU29ydFJlY29yZEZhY3RvcnkKLSAgb2JqZWN0LiBUaGlzIG9iamVjdCBpcyBwYXNzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gU29ydGluZ0l0ZXJhdG9ycyBjb25zdHJ1Y3RvcgotICBhbmQgaXMgdXNlZCBieSB0aGUgaXRlcmF0b3IgdG8gZ2VuZXJhdGUgdGhlIG5lY2Vzc2FyeSBzb3J0IG9iamVjdHMuPC9wPgotCi0gIDwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfdW5wYXJzZWRfZGVzaWduLnhtbCBiL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsX3VucGFyc2VkX2Rlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3NGQ3NDkuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfdW5wYXJzZWRfZGVzaWduLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDk4ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEsIFN1bgotICogTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotICA8czEgdGl0bGU9InVucGFyc2VkLWVudGl0eS11cmkoKSI+Ci0gIDx1bD4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJmdW5jdGlvbmFsaXR5Ij5GdW5jdGlvbmFsaXR5PC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iaW1wbGVtZW50YXRpb24iPkltcGxlbWVudGF0aW9uPC9saW5rPjwvbGk+Ci0gIDwvdWw+Ci0gIAotICA8YW5jaG9yIG5hbWU9ImZ1bmN0aW9uYWxpdHkiLz4KLSAgPHMyIHRpdGxlPSJGdW5jdGlvbmFsaXR5Ij4KLQotCi0gIDxwPlRoZSA8Y29kZT51bnBhcnNlZC1lbnRpdHktdXJpKCk8L2NvZGU+IGZ1bmN0aW9uIGdpdmVzIGFjY2VzcyB0byBkZWNsYXJhdGlvbnMKLSAgb2YgdW5wYXJzZWQgZW50aXRpZXMgaW4gdGhlIERURCBvZiB0aGUgc291cmNlIGRvY3VtZW50LiBJZiB0aGUgRFREIGNvbnRhaW5zCi0gIHRoZSBkZWNsYXJhdGlvbjo8L3A+Ci0KLSAgPHNvdXJjZT4KLSAgICAmbHQ7IUVOVElUWSBtb20tcGljdHVyZSBTWVNURU0gImh0dHA6Ly93d3cuaG9tZS5jb20vbW9tLmpwZyIgTkRBVEEgSlBFRyZndDsKLSAgPC9zb3VyY2U+Ci0KLSAgPHA+dGhlIGV4cHJlc3Npb24gPGNvZGU+dW5wYXJzZWQtZW50aXR5LXVyaSgnbW9tLXBpY3R1cmUnKTwvY29kZT4gcmV0dXJucyBhbgotICBVUkkgZm9yIHRoZSBmaWxlIDxjb2RlPm1vbS5qcGc8L2NvZGU+LjwvcD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0iaW1wbGVtZW50YXRpb24iLz4KLSAgPHMyIHRpdGxlPSJJbXBsZW1lbnRhdGlvbiI+Ci0KLSAgPHA+VW5wYXJzZWQgZW50aXRpZXMgbXVzdCBiZSBnYXRoZXJlZCBmcm9tIHRoZSBYTUwgaW5wdXQgZG9jdW1lbnQgYXQgdGhlIHRpbWUKLSAgd2hlbiB0aGUgRE9NIGlzIGJ1aWx0LiBUbyBhY2hpZXZlIHRoaXMgb3VyIHBhcnNlciBtdXN0IHBhcnNlIHRoZSBkb2N1bWVudCBEVEQKLSAgKGlmIGFueSkgYW5kIHN0b3JlIGFsbCBkYXRhIG9mIHR5cGUgTkRBVEEgKG5vdCBYTUwgZGF0YSkgaW4gYQotICBoYXNodGFibGUgaW4gdGhlIEFic3RyYWN0VHJhbnNsZXQgb2JqZWN0LiBBbGwgdGhlIGNvbXBpbGVkIGNvZGUgZm9yIHRoaXMKLSAgZnVuY3Rpb24gbmVlZHMgdG8gZG8gaXMgY2FsbCBhIG1ldGhvZCBpbiB0aGUgdHJhbnNsZXQgZm9yIHJldHJpZXZpbmcgdGhlCi0gIHZhbHVlIGZvciB0aGUgcmVxdWVzdGVkIGVsZW1lbnQ6PC9wPgotCi0gIDxzb3VyY2U+Ci0gICAgcHVibGljIFN0cmluZyBBYnN0cmFjdFRyYW5zbGV0LmdldFVucGFyc2VkRW50aXR5KFN0cmluZyBlbnRpdHlOYW1lKTsKLSAgPC9zb3VyY2U+Ci0KLSAgPHA+VGhlIHRyYW5zbGV0IHdpbGwgdXNlIHRoZSBzdXBwbGllZCA8Y29kZT5lbnRpdHlOYW1lPC9jb2RlPiB0byBsb29rIHVwIHRoZQotICB2YWx1ZSBpbiB0aGUgaGFzaHRhYmxlIGFuZCB0aGVuIGxlYXZlIHRoZSBzdHJpbmcgdmFsdWUgb24gdGhlIHN0YWNrIGZvciB0aGUKLSAgZWxlbWVudCB0aGF0IGNhbGxlZCA8Y29kZT5sYW5nKCk8L2NvZGU+LjwvcD4KLSAgPC9zMj4KLTwvczE+CmRpZmYgLS1naXQgYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF93aGl0ZXNwYWNlX2Rlc2lnbi54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbF93aGl0ZXNwYWNlX2Rlc2lnbi54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzYjI5ZGIuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2xfd2hpdGVzcGFjZV9kZXNpZ24ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMzQyICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgc3RhbmRhbG9uZT0ibm8iPz4KLTwhRE9DVFlQRSBzMSBTWVNURU0gIi4uLy4uL3N0eWxlL2R0ZC9kb2N1bWVudC5kdGQiPgotPCEtLSAKLSAqIFRoZSBBcGFjaGUgU29mdHdhcmUgTGljZW5zZSwgVmVyc2lvbiAxLjEKLSAqCi0gKgotICogQ29weXJpZ2h0IChjKSAyMDAxIFRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4gIEFsbCByaWdodHMKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKgotICogMi4gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lciBpbgotICogICAgdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogICAgZGlzdHJpYnV0aW9uLgotICoKLSAqIDMuIFRoZSBlbmQtdXNlciBkb2N1bWVudGF0aW9uIGluY2x1ZGVkIHdpdGggdGhlIHJlZGlzdHJpYnV0aW9uLAotICogICAgaWYgYW55LCBtdXN0IGluY2x1ZGUgdGhlIGZvbGxvd2luZyBhY2tub3dsZWRnbWVudDoKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uLCBwbGVhc2UgY29udGFjdCBhcGFjaGVAYXBhY2hlLm9yZy4KLSAqCi0gKiA1LiBQcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcyBzb2Z0d2FyZSBtYXkgbm90IGJlIGNhbGxlZCAiQXBhY2hlIiwKLSAqICAgIG5vciBtYXkgIkFwYWNoZSIgYXBwZWFyIGluIHRoZWlyIG5hbWUsIHdpdGhvdXQgcHJpb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBgYEFTIElTJycgQU5EIEFOWSBFWFBSRVNTRUQgT1IgSU1QTElFRAotICogV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMKLSAqIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFCi0gKiBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hBTEwgVEhFIEFQQUNIRSBTT0ZUV0FSRSBGT1VOREFUSU9OIE9SCi0gKiBJVFMgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GCi0gKiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5ECi0gKiBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwKLSAqIE9SIFRPUlQgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVAotICogT0YgVEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GCi0gKiBTVUNIIERBTUFHRS4KLSAqID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gKgotICogVGhpcyBzb2Z0d2FyZSBjb25zaXN0cyBvZiB2b2x1bnRhcnkgY29udHJpYnV0aW9ucyBtYWRlIGJ5IG1hbnkKLSAqIGluZGl2aWR1YWxzIG9uIGJlaGFsZiBvZiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gYW5kIHdhcwotICogb3JpZ2luYWxseSBiYXNlZCBvbiBzb2Z0d2FyZSBjb3B5cmlnaHQgKGMpIDIwMDEsIFN1bgotICogTWljcm9zeXN0ZW1zLiwgaHR0cDovL3d3dy5zdW4uY29tLiAgRm9yIG1vcmUKLSAqIGluZm9ybWF0aW9uIG9uIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiwgcGxlYXNlIHNlZQotICogPGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8+LgotIC0tPgotICA8czEgdGl0bGU9IiZsdDt4c2w6c3RyaXAvcHJlc2VydmUtc3BhY2UmZ3Q7Ij4KLSAgPHVsPgotICAgIDxsaT48bGluayBhbmNob3I9ImZ1bmN0aW9uYWxpdHkiPkZ1bmN0aW9uYWxpdHk8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJpZGVudGlmeSI+SWRlbnRpZnlpbmcgc3RyaXBwYWJsZSB3aGl0ZXNwYWNlIG5vZGVzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0id2hpY2giPkRldGVybWluaW5nIHdoaWNoIG5vZGVzIHRvIHN0cmlwPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RyaXAiPlN0cmlwcGluZyBub2RlczwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImZpbHRlciI+RmlsdGVyaW5nIHdoaXRlc3BhY2Ugbm9kZXM8L2xpbms+PC9saT4KLSAgPC91bD4KLSAgCi0gIDxhbmNob3IgbmFtZT0iZnVuY3Rpb25hbGl0eSIvPgotICA8czIgdGl0bGU9IkZ1bmN0aW9uYWxpdHkiPgotCi0gIDxwPlRoZSA8Y29kZT4mbHQ7eHNsOnN0cmlwLXNwYWNlJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDt4c2w6cHJlc2VydmUtc3BhY2UmZ3Q7PC9jb2RlPgotICBlbGVtZW50cyBhcmUgdXNlZCB0byBjb250cm9sIHRoZSB3YXkgd2hpdGVzcGFjZSBub2RlcyBpbiB0aGUgc291cmNlIFhNTAotICBkb2N1bWVudCBhcmUgaGFuZGxlZC4gVGhlc2UgZWxlbWVudHMgaGF2ZSBubyBpbXBhY3Qgb24gd2hpdGVzcGFjZSBpbiB0aGUgWFNMVAotICBzdHlsZXNoZWV0LiBCb3RoIGVsZW1lbnRzIGNhbiBvY2N1ciBvbmx5IGFzIHRvcC1sZXZlbCBlbGVtZW50cywgcG9zc2libGUgbW9yZQotICB0aGFuIG9uY2UsIGFuZCB0aGUgZWxlbWVudHMgYXJlIGFsd2F5cyBlbXB0eTwvcD4KLSAKLSAgPHA+Qm90aCBlbGVtZW50cyB0YWtlIG9uZSBhdHRyaWJ1dGUgJnF1b3Q7ZWxlbWVudHMmcXVvdDsgd2hpY2ggY29udGFpbnMgYQotICB3aGl0ZXNwYWNlIHNlcGFyYXRlZCBsaXN0IG9mIG5hbWVkIG5vZGVzIHdoaWNoIHNob3VsZCBiZSBvciBwcmVzZXJ2ZWQKLSAgc3RyaXBwZWQgZnJvbSB0aGUgc291cmNlIGRvY3VtZW50LiBUaGVzZSBuYW1lcyBjYW4gYmUgb24gb25lIG9mIHRoZXNlIHRocmVlCi0gIGZvcm1hdHMgKE5hbWVUZXN0IGZvcm1hdCk6PC9wPgotCi0gIDx1bD4KLSAgICA8bGk+Ci0gICAgICBBbGwgd2hpdGVzcGFjZSBub2RlczoKLSAgICAgIDxjb2RlPmVsZW1lbnRzPSZxdW90OyomcXVvdDs8L2NvZGU+Ci0gICAgPC9saT4KLSAgICA8bGk+Ci0gICAgICBBbGwgd2hpdGVzcGFjZSBub2RlcyB3aXRoIGEgbmFtZXNwYWNlOgotICAgICAgPGNvZGU+ZWxlbWVudHM9JnF1b3Q7Jmx0O25hbWVzcGFjZSZndDs6KiZxdW90OzwvY29kZT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIFNwZWNpZmljIHdoaXRlc3BhY2Ugbm9kZXM6IDxjb2RlPmVsZW1lbnRzPSZxdW90OyZsdDtxbmFtZSZndDsmcXVvdDs8L2NvZGU+Ci0gICAgPC9saT4KLSAgPC91bD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0iaWRlbnRpZnkiLz4KLSAgPHMyIHRpdGxlPSJJZGVudGlmeWluZyBzdHJpcHBhYmxlIHdoaXRlc3BhY2Ugbm9kZXMiPgotCi0gIDxwPlRoZSBET00gZGV0ZWN0cyBhbGwgdGV4dCBub2RlcyBhbmQgYXNzaWducyB0aGVtIHRoZSB0eXBlIDxjb2RlPlRFWFQ8L2NvZGU+LgotICBBbGwgdGV4dCBub2RlcyBhcmUgc2Nhbm5lZCB0byBkZXRlY3Qgd2hpdGVzcGFjZS1vbmx5IG5vZGVzLiBBIHRleHQtbm9kZSBpcwotICBjb25zaWRlcmVkIGEgd2hpdGVzcGFjZSBub2RlIG9ubHkgaWYgaXQgY29uc2lzdCBlbnRpcmVseSBvZiBjaGFyYWN0ZXJzIGZyb20KLSAgdGhlIHNldCB7IDB4MDksIDB4MGEsIDB4MGQsIDB4MjAgfS4gVGhlIERPTSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBoYXMgYSBzdGF0aWMKLSAgbWV0aG9kIHVzZWQgdG8gZGV0ZWN0IHN1Y2ggbm9kZXM6PC9wPgotCi08c291cmNlPgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGJvb2xlYW4gaXNXaGl0ZXNwYWNlQ2hhcihjaGFyIGMpIHsKLSAgICAgICAgcmV0dXJuIGMgPT0gMHgyMCB8fCBjID09IDB4MEEgfHwgYyA9PSAweDBEIHx8IGMgPT0gMHgwOTsKLSAgICB9Ci08L3NvdXJjZT4KLQotICA8cD5UaGUgY2hhcmFjdGVycyBhcmUgY2hlY2tlZCBpbiBwcm9iYWJsZSBvcmRlci48L3A+Ci0KLSAgPHA+IFRoZSBET00gaGFzIGEgYml0LWFycmF5IHRoYXQgaXMgdXNlZCB0byAgdGFnIHRleHQtbm9kZXMgYXMgc3RyaXBwYWJsZQotICB3aGl0ZXNwYWNlIG5vZGVzOjwvcD4KLQotICA8c291cmNlPnByaXZhdGUgaW50W10gX3doaXRlc3BhY2U7PC9zb3VyY2U+Ci0KLSAgPHA+VGhlcmUgYXJlIHR3byBtZXRob2RzIGluIHRoZSBET00gaW1wbGVtZW50YXRpb24gY2xhc3MgZm9yIGFjY2Vzc2luZyB0aGlzCi0gIGJpdC1hcnJheTogPGNvZGU+bWFya1doaXRlc3BhY2Uobm9kZSk8L2NvZGU+IGFuZCA8Y29kZT5pc1doaXRlc3BhY2Uobm9kZSk8L2NvZGU+LgotICBUaGUgYXJyYXkgaXMgcmVzaXplZCB0b2dldGhlciB3aXRoIGFsbCBvdGhlciBhcnJheXMgaW4gdGhlIERPTSBieSB0aGUKLSAgPGNvZGU+RE9NLnJlc2l6ZUFycmF5cygpPC9jb2RlPiBtZXRob2QuIFRoZSBiaXRzIGluIHRoZSBhcnJheSBhcmUgc2V0IGluIHRoZQotICA8Y29kZT5ET00ubWF5YmVDcmVhdGVUZXh0Tm9kZSgpPC9jb2RlPiBtZXRob2QuIFRoaXMgbWV0aG9kIG11c3Qga25vdyB3aGV0aGVyCi0gIHRoZSBjdXJyZW50IG5vZGUgaXMgYSBsb2NhdGVkIHVuZGVyIGFuIGVsZW1lbnQgd2l0aCBhbgotICA8Y29kZT54bWw6c3BhY2U9JnF1b3Q7Jmx0O3ZhbHVlJmd0OyZxdW90OzwvY29kZT4gYXR0cmlidXRlIGluIHRoZSBET00sIGluIHdoaWNoCi0gIGNhc2UgaXQgaXMgbm90IGEgc3RyaXBwYWJsZSB3aGl0ZXNwYWNlIG5vZGUuPC9wPgotCi0gIDxwPkFuIGF1eGlsbGFyeSBjbGFzcywgV2hpdGVzcGFjZUhhbmRsZXIsIGlzIHVzZWQgZm9yIHRoaXMgcHVycG9zZS4gVGhlIGNsYXNzCi0gIHdvcmtzIGluIGEgd2F5IGFzIGEgc3RhY2ssIHdoZXJlIHlvdSAicHVzaCIgYSBuZXcgc3RyaXAvcHJlc2VydmUgc2V0dGluZwotICB0b2dldGhlciB3aXRoIHRoZSBub2RlIGluIHdoaWNoIHRoaXMgc2V0dGluZyB3YXMgZGV0ZXJtaW5lZC4gVGhpcyBtZWFucyB0aGF0Ci0gIGZvciBldmVyeSB0aW1lIHRoZSBET00gYnVpbGRlciBlbmNvdW50ZXJzIGFuIDxjb2RlPnhtbDpzcGFjZTwvY29kZT4gYXR0cmlidXRlCi0gIGl0IHdpbGwgaW52b2tlIGEgbWV0aG9kIG9uIGFuIGluc3RhbmNlIG9mIHRoZSBXaGl0ZXNwYWNlSGFuZGxlciBjbGFzcyB0bwotICBzaWduYWwgdGhhdCBhIG5ldyBwcmVzZXJ2ZS9zdHJpcCBzZXR0aW5nIGhhcyBiZWVuIGVuY291bnRlcmVkLiBUaGlzIGlzIGRvbmUKLSAgaW4gdGhlIDxjb2RlPm1ha2VBdHRyaWJ1dGVOb2RlKCk8L2NvZGU+IG1ldGhvZC4gVGhlIHdoaXRlc3BhY2UgaGFuZGxlciBzdG9yZXMgdGhlCi0gIG5ldyBzZXR0aW5nIGFuZCBwdXNoZXMgdGhlIGN1cnJlbnQgZWxlbWVudCBub2RlIG9uIGl0cyBzdGFjay4gV2hlbiB0aGUKLSAgRE9NIGJ1aWxkZXIgY2xvc2VzIHVwIGFuIGVsZW1lbnQgKGluIDxjb2RlPmVuZEVsZW1lbnQoKTwvY29kZT4pLCBpdCBpbnZva2VzCi0gIGFub3RoZXIgbWV0aG9kIG9mIHRoZSB3aGl0ZXNwYWNlIGhhbmRsZXIgdG8gY2hlY2sgaWYgdGhlIHN0cmlwL3ByZXNlcnZlCi0gIHNldHRpbmcgaXMgc3RpbGwgdmFsaWQuIElmIHRoZSBzZXR0aW5nIGlzIG5vdyBpbnZhbGlkICh3ZSdyZSBjbG9zaW5nIHRoZQotICBlbGVtZW50IHdob3NlIG5vZGUgaWQgaXMgb24gdGhlIHRvcCBvZiB0aGUgc3RhY2spIHRoZSBoYW5kbGVyIGludmVydHMgdGhlCi0gIHNldHRpbmcgYW5kIHBvcHMgdGhlIGVsZW1lbnQgbm9kZSBpZCBvZmYgdGhlIHN0YWNrLiBUaGUgcHJldmlvdXMKLSAgc3RyaXAvcHJlc2VydmUgc2V0dGluZyBpcyB0aGVuIHZhbGlkLCBhbmQgdGhlIGlkIG9mIG5vZGUgd2hlcmUgdGhpcyBzZXR0aW5nCi0gIHdhcyBkZWZpbmVkIGlzIG9uIHRoZSB0b3Agb2YgdGhlIHN0YWNrLjwvcD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0id2hpY2giLz4KLSAgPHMyIHRpdGxlPSJEZXRlcm1pbmluZyB3aGljaCBub2RlcyB0byBzdHJpcCI+Ci0KLSAgPHA+QSB0ZXh0IG5vZGUgaXMgbmV2ZXIgc3RyaXBwZWQgdW5sZXNzIGl0IGNvbnRhaW5zIG9ubHkgd2hpdGVzcGFjZQotICBjaGFyYWN0ZXJzIChVbmljb2RlIGNoYXJhY3RlcnMgMHgwOSwgMHgwQSwgMHgwRCBhbmQgMHgyMCkuIFN0cmlwcGluZyBhIHRleHQKLSAgbm9kZSBtZWFucyB0aGF0IHRoZSBub2RlIGRpc2FwcGVhcnMgZnJvbSB0aGUgRE9NOyBzbyB0aGF0IGl0IGlzIG5ldmVyCi0gIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQgYW5kIHRoYXQgaXQgaXMgaWdub3JlZCBieSBhbGwgZnVuY3Rpb25zIHN1Y2ggYXMKLSAgPGNvZGU+Y291bnQoKTwvY29kZT4uIEEgdGV4dCBub2RlIGlzIHByZXNlcnZlZCBpZiBhbnkgb2YgdGhlIGZvbGxvd2luZyBhcHBseTo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIHRoZSBlbGVtZW50IG5hbWUgb2YgdGhlIHBhcmVudCBvZiB0aGUgdGV4dCBub2RlIGlzIGluIHRoZSBzZXQgb2YKLSAgICAgIGVsZW1lbnRzIGxpc3RlZCBpbiA8Y29kZT4mbHQ7eHNsOnByZXNlcnZlLXNwYWNlJmd0OzwvY29kZT4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIHRoZSB0ZXh0IG5vZGUgY29udGFpbnMgYXQgbGVhc3Qgb25lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgYW4gYW5jZW5zdG9yIG9mIHRoZSB3aGl0ZXNwYWNlIHRleHQgbm9kZSBoYXMgYW4gYXR0cmlidXRlIG9mCi0gICAgICA8Y29kZT54c2w6c3BhY2U9JnF1b3Q7cHJlc2VydmUmcXVvdDs8L2NvZGU+LCBhbmQgbm8gY2xvc2UgYW5jZXN0b3IgaGFzIGFuZAotICAgICAgYXR0cmlidXRlIG9mIDxjb2RlPnhzbDpzcGFjZT0mcXVvdDtkZWZhdWx0JnF1b3Q7PC9jb2RlPi4KLSAgICA8L2xpPgotICA8L3VsPgotCi0gIDxwPk90aGVyd2lzZSwgdGhlIHRleHQgbm9kZSBpcyBzdHJpcHBlZC4gSW5pdGlhbGx5IHRoZSBzZXQgb2YgCi0gIHdoaXRlc3BhY2UtcHJlc2VydmluZyBlbGVtZW50IG5hbWVzIGNvbnRhaW5zIGFsbCBlbGVtZW50IG5hbWVzLCBzbyB0aGUKLSAgZGVmYXVsdCBiZWhhdmlvdXIgaXMgdG8gcHJlc2VydmUgYWxsIHdoaXRlc3BhY2UgdGV4dCBub2Rlcy48L3A+Ci0KLSAgPHA+VGhpcyBzZWVtcyBzaW1wbGUgZW5vdWdoLCBidXQgcmVzb2x2aW5nIGNvbmZsaWN0cyBiZXR3ZWVuIG1hdGNoaW5nCi0gIDxjb2RlPiZsdDt4c2w6c3RyaXAtc3BhY2UmZ3Q7PC9jb2RlPiBhbmQgPGNvZGU+Jmx0O3hzbDpwcmVzZXJ2ZS1zcGFjZSZndDs8L2NvZGU+Ci0gIGVsZW1lbnRzIHJlcXVpcmVzIGEgbG90IG9mIHRob3VnaHQuIE91ciBmaXJzdCBjb25zaWRlcmF0aW9uIGlzIGltcG9ydAotICBwcmVjZWRlbmNlOyB0aGUgbWF0Y2ggd2l0aCB0aGUgaGlnaGVzdCBpbXBvcnQgcHJlY2VkZW5jZSBpcyBhbHdheXMgY2hvc2VuLgotICBJbXBvcnQgcHJlY2VkZW5jZSBpcyBkZXRlcm1pbmVkIGJ5IHRoZSBvcmRlciBpbiB3aGljaCB0aGUgY29tcGFyZWQgZWxlbWVudHMKLSAgYXJlIHZpc2l0ZWQuIChJbiB0aGlzIGNhc2UgdGhvc2UgZWxlbWVudHMgYXJlIHRoZSB0b3AtbGV2ZWwKLSAgPGNvZGU+Jmx0O3hzbDpzdHJpcC1zcGFjZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7eHNsOnByZXNlcnZlLXNwYWNlJmd0OzwvY29kZT4KLSAgZWxlbWVudHMuKSBUaGlzIGV4YW1wbGUgaXMgdGFrZW4gZnJvbSB0aGUgWFNMVCByZWNvbW1lbmRhdGlvbjo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT5zdHlsZXNoZWV0IEEgaW1wb3J0cyBzdHlsZXNoZWV0cyBCIGFuZCBDIGluIHRoYXQgb3JkZXI7PC9saT4KLSAgICA8bGk+c3R5bGVzaGVldCBCIGltcG9ydHMgc3R5bGVzaGVldCBEOzwvbGk+Ci0gICAgPGxpPnN0eWxlc2hlZXQgQyBpbXBvcnRzIHN0eWxlc2hlZXQgRS48L2xpPgotICA8L3VsPgotCi0gIDxwPlRoZW4gdGhlIG9yZGVyIG9mIGltcG9ydCBwcmVjZWRlbmNlIChsb3dlc3QgZmlyc3QpIGlzIEQsIEIsIEUsIEMsIEEuPC9wPgotCi0gIDxwPk91ciBuZXh0IGNvbnNpZGVyYXRpb24gaXMgdGhlIHByaW9yaXR5IG9mIE5hbWVUZXN0cyAoWFBhdGggc3BlYyk6PC9wPgotICA8dWw+Ci0gICAgPGxpPgotICAgICAgPGNvZGU+ZWxlbWVudHM9JnF1b3Q7Jmx0O3FuYW1lJmd0OyZxdW90OzwvY29kZT4gaGFzIHByaW9yaXR5IDAKLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIDxjb2RlPmVsZW1lbnRzPSZxdW90OyZsdDtuYW1lc3BhY2UmZ3Q7OiomcXVvdDs8L2NvZGU+IGhhcyBwcmlvcml0eSAtMC4yNQotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgPGNvZGU+ZWxlbWVudHM9JnF1b3Q7KiZxdW90OzwvY29kZT4gaGFzIHByaW9yaXR5IC0wLjUKLSAgICA8L2xpPgotICA8L3VsPgotCi0gIDxwPkl0IGlzIGNvbnNpZGVyZWQgYW4gZXJyb3IgaWYgdGhlIGRlc2ljaW9uIGlzIHN0aWxsIGFtYmlndW91cyBhZnRlciB0aGlzLAotICBhbmQgaXQgaXMgdXAgdG8gdGhlIGltcGxlbWVudG9ycyB0byBkZWNpZGUgd2hhdCB0aGUgYXByb3ByaWF0ZSBhY3Rpb24gaXMuPC9wPgotCi0gIDxwPldpdGggYWxsIHRoaXMgY29tcGxleGl0eSwgdGhlIG5vcm1hbCB1c2FnZSBmb3IgdGhlc2UgZWxlbWVudHMgaXMgcXVpdGUKLSAgc21pcGxlOyBlaXRoZXIgcHJlc2VydmUgYWxsIHdoaXRlc3BhY2Ugbm9kZXMgYnV0IG9uZSB0eXBlOjwvcD4KLQotICA8c291cmNlPiZsdDt4c2w6c3RyaXAtc3BhY2UgZWxlbWVudHM9ImZvbyIvJmd0Ozwvc291cmNlPgotCi0gIDxwPm9yIHN0cmlwIGFsbCB3aGl0ZXNwYWNlIG5vZGVzIGJ1dCBvbmUgdHlwZTo8L3A+Ci0KLSAgPHNvdXJjZT4KLSAgICAmbHQ7eHNsOnN0cmlwLXNwYWNlIGVsZW1lbnRzPSIqIi8mZ3Q7Ci0gICAgJmx0O3hzbDpwcmVzZXJ2ZS1zcGFjZSBlbGVtZW50cz0iZm9vIi8mZ3Q7PC9zb3VyY2U+Ci0KLSAgPC9zMj48YW5jaG9yIG5hbWU9InN0cmlwIi8+Ci0gIDxzMiB0aXRsZT0iU3RyaXBwaW5nIG5vZGVzIj4KLQotICA8cD5UaGUgdWx0aW1hdGUgZ29hbCBvZiBvdXIgZGVzaWduIHdvdWxkIGJlIHRvIHRvdGFsbHkgc2NyZWVuIGFsbCBzdHJpcHBlZAotICBub2RlcyBmcm9tIHRoZSB0cmFuc2xldDsgdG8gZWl0aGVyIHBoeXNpY2FsbHkgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgRE9NIG9yIHRvCi0gIG1ha2UgaXQgYXBwZWFyIGFzIGlmIHRoZXkgYXJlIG5vdCB0aGVyZS4gVGhlIGZpcnN0IGFwcHJvYWNoIHdpbGwgY2F1c2UKLSAgcHJvYmxlbXMgaW4gY2FzZXMgd2hlcmUgbXVsdGlwbGUgdHJhbnNsZXRzIGFjY2VzcyB0aGUgc2FtZSBET00uIEluIHRoZSBmdXR1cmUKLSAgd2Ugd2lzaCB0byBsZXQgdHJhbnNsZXRzIHJ1biB3aXRoaW4gc2VydmxldHMgLyBKU1BzIHdpdGggYSBjb21tb24gRE9NIGNhY2hlLgotICBUaGlzIERPTSBjYWNoZSB3aWxsIGtlZXAgY29waWVzIG9mIERPTXMgaW4gbWVtb3J5IHRvIHByZXZlbnQgdGhlIHNhbWUgWE1MCi0gIGZpbGUgZnJvbSBiZWluZyBkb3dubG9hZGVkIGFuZCBwYXJzZWQgc2V2ZXJhbCB0aW1lcy4gVGhpcyBpcyBhIHNjZW5hcmlvcyB3ZQotICBtaWdodCBzZWU6PC9wPgotCi0gICAgPHA+PGltZyBzcmM9IkRPTUludGVyZmFjZS5naWYiIGFsdD0iRE9NSW50ZXJmYWNlLmdpZiIvPjwvcD4KLSAgICA8cD48cmVmPkZpZ3VyZSAxOiBNdWx0aXBsZSB0cmFuc2xldHMgYWNjZXNzaW5nIGEgY29tbW9uIHBvb2wgb2YgRE9NczwvcmVmPjwvcD4KLQotICA8cD5UaGUgdGhyZWUgdHJhbnNsZXRzIHJ1bm5pbmcgb24gdGhpcyBob3N0IGFjY2VzcyBhIGNvbW1vbiBwb29sIG9mIDQgRE9Ncy4KLSAgVGhlIERPTXMgYXJlIGFjY2Vzc2VkIHRocm91Z2ggYSBjb21tb24gRE9NIGludGVyZmFjZS4gVHJhbnNsZXRzIGFjY2Vzc2luZwotICBhIHNpbmdsZSBET00gd2lsbCBoYXZlIGEgRE9NQWRhcHRlciBhbmQgYSBzaW5nbGUgRE9NSW1wbCBvYmplY3QgYmVoaW5kIHRoaXMKLSAgaW50ZXJmYWNlLCB3aGlsZSB0cmFuc2xldHMgYWNjZXNzaW5nIHNldmVyYWwgRE9NcyB3aWxsIGJlIGdpdmVuIGEgTXVsdGlET00KLSAgYW5kIGEgc2V0IG9mIERPTUltcGwgb2JqZWN0cy48L3A+Ci0KLSAgPHA+VGhlIHRyYW5zbGV0IHRvIHRoZSBsZWZ0IG1heSB3YW50IHRvIHN0cmlwIHNvbWUgbm9kZXMgZnJvbSB0aGUgc2hhcmVkIERPTQotICBpbiB0aGUgY2FjaGUsIHdoaWxlIHRoZSBvdGhlciB0cmFuc2xldHMgbWF5IHdhbnQgdG8gcHJlc2VydmUgYWxsIHdoaXRlc3BhY2UKLSAgbm9kZXMuIE91ciBpbml0aWFsIHRob3VnaHQgdGhlbiBpcyB0byBrZWVwIHRoZSBET00gYXMgaXQgaXMgYW5kIHNvbWVob3cKLSAgc2NyZWVuIHRoZSBsZWZ0LWhhbmQgdHJhbnNsZXQgb2YgYWxsIHRoZSB3aGl0ZXNwYWNlIG5vZGVzIGl0IGRvZXMgbm90IHdhbnQgdG8KLSAgcHJvY2Vzcy4gVGhlcmUgYXJlIGEgZmV3IHdheXMgaW4gd2hpY2ggd2UgY2FuIGFjY29tcGxpc2ggdGhpczo8L3A+Ci0KLSAgPHVsPgotICAgIDxsaT4KLSAgICAgIFRoZSB0cmFuc2xldCBjYW4sIHByaW9yIHRvIHN0YXJ0aW5nIHRvIHRyYXZlcnNlIHRoZSBET00sIHNlbmQgYSByZWZlcmVuY2UKLSAgICAgIHRvIHRoZSB0YWJsZXMgY29udGFpbmluZyBpbmZvcm1hdGlvbiBvbiB3aGljaCBub2RlcyB3ZSB3YW50IHN0cmlwcGVkIHRvCi0gICAgICB0aGUgRE9NIGludGVyZmFjZS4gVGhlIERPTSBpbnRlcmZhY2UgaXMgdGhlbiByZXNwb25zaWJsZSBmb3IgaGlkaW5nIGFsbAotICAgICAgc3RyaXBwZWQgd2hpdGVzcGFjZSBub2RlcyBmcm9tIHRoZSBpdGVyYXRvcnMgYW5kIHRoZSB0cmFuc2xldC4gQSBwcm9ibGVtCi0gICAgICB3aXRoIHRoaXMgYXBwcm9hY2ggaXMgdGhhdCB3ZSB3YW50IHRvIG9taXQgdGhlIERPTSBpbnRlcmZhY2UgbGF5ZXIgaWYKLSAgICAgIHRoZSB0cmFuc2xldCBpcyBvbmx5IGFjY2Vzc2luZyBhIHNpbmdsZSBET00uIFRoZSBET00gaW50ZXJmYWNlIGxheWVyIHdpbGwKLSAgICAgIG9ubHkgYmUgaW5zdGFuY2lhdGVkIGJ5IHRoZSB0cmFuc2xldCBpZiB0aGUgc3R5bGVzaGVldCBjb250YWluZWQgYSBjYWxsCi0gICAgICB0byB0aGUgPGNvZGU+ZG9jdW1lbnQoKTwvY29kZT4gZnVuY3Rpb24uPGJyLz48YnIvPgotICAgIDwvbGk+Ci0gICAgPGxpPgotICAgICAgVGhlIHRyYW5zbGV0IGNhbiBwcm92aWRlIGl0cyBpdGVyYXRvcnMgd2l0aCBpbmZvcm1hdGlvbiBvbiB3aGljaCBub2RlcyBpdAotICAgICAgZG9lcyBub3Qgd2FudCB0byBzZWUuIFRoZSB0cmFuc2xldCBpcyBzdGlsbCBzaGllbGRlZCBmcm9tIHVud2FudGVkCi0gICAgICB3aGl0ZXNwYWNlIG5vZGVzLCBidXQgaXQgaGFzIHRoZSBoYXNzbGUgb2YgcGFzc2luZyBleHRyYSBpbmZvcm1hdGlvbiBvdmVyCi0gICAgICB0byBtb3N0IGl0ZXJhdG9ycyBpdCBldmVyIGluc3RhbmNpYXRlcy4gTm90ZSB0aGF0IGFsbCBpdGVyYXRvcnMgZG8gbm90Ci0gICAgICBuZWVkIGJlIGF3YXJlIG9mIHdoaXRlcHNwYWNlIG5vZGVzIGluIHRoaXMgY2FzZS4gSWYgeW91IGhhdmUgYSBsb29rIGF0Ci0gICAgICB0aGUgZmlndXJlIGFnYWluIHlvdSB3aWxsIHNlZSB0aGF0IG9ubHkgdGhlIGZpcnN0IGxldmVsIGl0ZXJhdG9yICh0aGF0IGlzCi0gICAgICB0aGUgb25lIGNsb3Nlc3QgdG8gdGhlIERPTSBvciBET00gaW50ZXJmYWNlKSB3aWxsIGhhdmUgdG8gc3RyaXAgb2ZmCi0gICAgICB3aGl0ZXNwYWNlIG5vZGVzLiBCdXQsIHRoZXJlIG1heSBiZSBzZXZlcmFsIGl0ZXJhdG9ycyB0aGF0IG9wZXJhdGUKLSAgICAgIGRpcmVjdGx5IG9uIHRoZSBET00gKCBpbnZva2VkIGJ5IGNvZGUgaGFuZGxpbmcgWFNMIGZ1bmN0aW9ucyBzdWNoIGFzCi0gICAgICA8Y29kZT5jb3VudCgpPC9jb2RlPikgYW5kIGV2ZXJ5IHNpbmdsZSBvbmUgb2YgdGhvc2Ugd2lsbCBuZWVkIHRvIGJlIHRvbGQKLSAgICAgIHdoaWNoIHdoaXRlc3BhY2Ugbm9kZXMgdGhlIHRyYW5zbGV0IGRvZXMgbm90IHdhbnQgdG8gc2VlLjxici8+PGJyLz4KLSAgICA8L2xpPgotICAgIDxsaT4KLSAgICAgIFRoZSB0aGlyZCBhcHByb2FjaCB3aWxsIHRha2UgYWR2YW50YWdlIG9mIHRoZSBmYWN0IHRoYXQgbm90IGFsbAotICAgICAgdHJhbnNsZXRzIHdpbGwgd2FudCB0byBzdHJpcCB3aGl0ZXNwYWNlIG5vZGVzLiBUaGUgbW9zdCBlZmZlY3RpdmUgd2F5IG9mCi0gICAgICByZW1vdmluZyB1bndhbnRlZCB3aGl0ZXNwYWNlIG5vZGVzIGlzIHRvIGRvIGl0IG9uY2UgYW5kIGZvciBhbGwsIGJlZm9yZQotICAgICAgdGhlIGFjdHVhbCB0cmF2ZXJzYWwgb2YgdGhlIERPTSBzdGFydHMuIFRoaXMgY2FuIGJlIGRvbmUgYnkgbWFraW5nIGEKLSAgICAgIGNsb25lIG9mIHRoZSBET00gd2l0aCBleGx1c2l2ZS1hY2Nlc3MgcmlnaHRzIGZvciB0aGlzIHRyYW5zbGV0IG9ubHkuIFdlCi0gICAgICBzdGlsbCBnYWluIHBlcmZvcm1hbmNlIGZyb20gdGhlIGNhY2hlIGJlY2F1c2Ugd2UgZG8gbm90IGhhdmUgdG8gcGF5IHRoZQotICAgICAgY29zdCBvZiB0aGUgZGVsYXkgY2F1c2VkIGJ5IGRvd25sb2FkaW5nIGFuZCBwYXJzaW5nIHRoZSBYTUwgc291cmNlIGZpbGUuCi0gICAgICBUaGUgY29zdCB3ZSBoYXZlIHRvIHBheSBpcyB0aGUgdGltZSBuZWVkZWQgZm9yIHRoZSBhY3R1YWwgY2xvbmluZyBhbmQgdGhlCi0gICAgICBleHRyYSBtZW1vcnkgd2UgdXNlLjxici8+PGJyLz4KLSAgICAgIE5vcm1hbGx5IG9uZSB3b3VsZCBpbWFnaW5lIHRoZSB0cmFuc2xldCAob3IgdGhlIHdyYXBwZXIgY2xhc3MgdGhhdAotICAgICAgaW52b2tlcyB0aGUgdHJhbnNsZXQpIGNhbGxzIHRoZSBET00gY2FjaGUgd2l0aCBqdXN0IGFuIFVSTCBhbmQgcmVjZWl2ZXMKLSAgICAgIGEgcmVmZXJlbmNlIHRvIGFuIGluc3RhbmNpYXRlZCBET00uIFRoZSBjYWNoZSB3aWxsIGVpdGhlciBoYXZlIGJ1aWx0Ci0gICAgICB0aGlzIERPTSBvbi1kZW1hbmQgb3IganVzdCBwYXNzZWQgYmFjayBhIHJlZmVyZW5jZSB0byBhbiBleGlzdGluZyB0cmVlLgotICAgICAgSW4gdGhpcyBjYXNlIHRoZSBET00gd291bGQgbmVlZCBhbiBleHRyYSBjYWxsIHRoYXQgYSB0cmFuc2xldCB3b3VsZCB1c2UKLSAgICAgIHRvIGNsb25lIGEgRE9NLCBwYXNzaW5nIHRoZSBleGlzdGluZyBET00gcmVmZXJlbmNlIHRvIHRoZSBjYWNoZSBhbmQKLSAgICAgIHJlY2lldmluZyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIGNsb25lZCBET00uIFRoZSB0cmFuc2xldCBjYW4gdGhlbiBkbwotICAgICAgd2hhdGV2ZXIgaXQgd2FudHMgd2l0aCB0aGlzIERPTSAodGhlIGNhY2hlIG5lZWQgbm90IGV2ZW4ga2VlcCBhIHJlZmVyZW5jZQotICAgICAgdG8gdGhpcyB0cmVlKS4KLSAgICA8L2xpPgotICA8L3VsPgotICAKLSAgPHA+V2UgYXJlIGx1Y2t5IGVub3VnaCB0byBiZSBhYmxlIHRvIGNvbWJpbmUgdGhlIGZpcnN0IHR3byBhcHByb2FjaGVzLiBBbGwKLSAgaXRlcmF0b3JzIHRoYXQgZGlyZWN0bHkgYWNjZXNzIHRoZSBET00gKGF4aXMgaXRlcmF0b3JzKSBhcmUgaW5zdGFuY2lhdGVkIGJ5Ci0gIGNhbGxzIHRvIHRoZSBET00gaW50ZXJmYWNlIGxheWVyICh0aGUgRE9NIGNsYXNzKS4gVGhlIGFjdHVhbCBpdGVyYXRvcnMgYXJlCi0gIGNyZWF0ZWQgaW4gdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBsYXllciAodGhlIERPTUltcGwgY2xhc3MpLiBTbywgd2UgY2FuIHBhc3MKLSAgcmVmZXJlbmNlcyB0byB0aGUgcHJlc2VydmUvc3RyaXAgd2hpdGVzcGFjZSB0YWJsZXMgdG8gdGhlIERPTSwgYW5kIHRoZSBET00KLSAgd2lsbCBtYWtlIHN1cmUgdGhhdCBhbGwgYXhpcyBpdGVyYXRvcnMgcmV0dXJuIG5vZGUgc2V0cyB3aXRoIHJlc3BlY3QgdG8gdGhlc2UKLSAgdGFibGVzLjwvcD4KLSAgPC9zMj48YW5jaG9yIG5hbWU9ImZpbHRlciIvPiAKLSAgPHMyIHRpdGxlPSJGaWx0ZXJpbmcgd2hpdGVzcGFjZSBub2RlcyI+Ci0KLSAgPHA+Rm9yIGVhY2ggYXhpcyBpdGVyYXRvciBhbmQgZm9yIDxjb2RlPkRPTS5tYWtlU3RyaW5nVmFsdWUoKTwvY29kZT4gYW5kCi0gIDxjb2RlPkRPTS5zdHJpbmdWYWx1ZUF1eCgpPC9jb2RlPiB3ZSBtdXN0IGFwcGx5IGEgZmlsdGVyIGZvciBlbGltaW5hdGluZyBhbGwKLSAgdW53YW50ZWQgd2hpdGVzcGFjZSBub2Rlcy4gVG8gYWNoaXZlIHRoaXMgd2UgbXVzdCBidWlsZCBhIHZlcnkgZWZmaWNpZW50Ci0gIHByZWRpY2F0ZSBmb3IgZGV0ZXJtaW5pbmcgaWYgdGhlIGN1cnJlbnQgbm9kZSBzaG91bGQgYmUgc3RyaXBwZWQgb3Igbm90LiBUaGlzCi0gIHByZWRpY2F0ZSBpcyBidWlsdCBieSA8Y29kZT5XaGl0ZXNwYWNlLmNvbXBpbGVQcmVkaWNhdGUoKTwvY29kZT4uIFRoaXMgbWV0aG9kIGlzCi0gIHN0YXRpYyBhbmQgYnVpbGRzIGEgcHJlZGljYXRlIGZvciBhIHZlY3RvciBvZiBXaGl0ZXNwYWNlUnVsZSBvYmplY3RzLiAoVGhlCi0gIFdoaXRlc3BhY2VSdWxlIGNsYXNzIGlzIGRlZmluZWQgd2l0aGluIHRoZSBXaGl0ZXNwYWNlIGNsYXNzLikgRWFjaAotICBXaGl0ZXNwYWNlUnVsZSBvYmplY3QgY29udGFpbnMgaW5mb3JtYXRpb24gZm9yIGEgc2luZ2xlIGVsZW1lbnQgbGlzdGVkCi0gIGluIGFuIDxjb2RlPiZsdDt4c2w6c3RyaXAvcHJlc2VydmUtc3BhY2UmZ3Q7PC9jb2RlPiBlbGVtZW50LCBhbmQgaXMgYnJva2VuIGRvd24KLSAgaW50byB0aGUgZm9sbG93aW5nIGluZm9ybWF0aW9uOjwvcD4KLQotICA8dWw+Ci0gICAgPGxpPnRoZSBuYW1lc3BhY2UgKGNhbiBiZSB0aGUgZGVmYXVsdCBuYW1lc3BhY2UpPC9saT4KLSAgICA8bGk+dGhlIGVsZW1lbnQgbmFtZSBvciAiPGNvZGU+KjwvY29kZT4iPC9saT4KLSAgICA8bGk+dGhlIHR5cGUgb2YgcnVsZTsgTlM6RUwsIE5TOjxjb2RlPio8L2NvZGU+IG9yIDxjb2RlPio8L2NvZGU+PC9saT4KLSAgICA8bGk+dGhlIHByaW9yaXR5IG9mIHRoZSBydWxlIChiYXNlZCBvbiBpbXBvcnQgcHJlY2VkZW5jZSBhbmQgdHlwZSk8L2xpPgotICAgIDxsaT50aGUgYWN0aW9uOyBlaXRoZXIgc3RyaXAgb3IgcHJlc2VydmVyPC9saT4KLSAgPC91bD4KLQotICA8cD5UaGUgVmVjdG9yIG9mIFdoaXRlc3BhY2VSdWxlcyBpcyBhcnJhbmdlZCBpbiBvcmRlciBvZiBwcmlvcml0eSBhbmQKLSAgcmVkdW5kYW50IHJ1bGVzIGFyZSByZW1vdmVkLiBBIHByZWRpY2F0ZSBtZXRob2QgaXMgdGhlbiBjb21waWxlZCBpbnRvIHRoZQotICB0cmFuc2xldCBhczo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgcHVibGljIGJvb2xlYW4gc3RyaXBTcGFjZShpbnQgbm9kZSk7Ci08L3NvdXJjZT4KLQotICA8cD5VbmZvcnR1bmF0ZWx5IHRoaXMgbWV0aG9kIGNhbm5vdCBiZSBkZWNsYXJlZCBzdGF0aWMuPC9wPgotCi0gIDxwPldoZW4gdGhlIFN0eWxlc2hlZXQgb2JqZWN0Y29tcGlsZXMgdGhlIDxjb2RlPnRvcExldmVsKCk8L2NvZGU+IG1ldGhvZCBvZiB0aGUKLSAgdHJhbnNsZXQgaXQgY2hlY2tzIGZvciB0aGUgZXhpc3RhbmNlIG9mIHRoZSA8Y29kZT5zdHJpcFNwYWNlKCk8L2NvZGU+IG1ldGhvZC4gSWYKLSAgdGhpcyBtZXRob2QgZXhpc3RzIHRoZSA8Y29kZT50b3BMZXZlbCgpPC9jb2RlPiB3aWxsIGJlIGNvbXBpbGVkIHRvIHBhc3MgdGhlCi0gIHRyYW5zbGV0IHRvIHRoZSBET00gYXMgYSBTdHJpcFdoaXRlc3BhY2VGaWx0ZXIgKHRoZSB0cmFuc2xldCBpbXBsZW1lbnRzIHRoaXMKLSAgaW50ZXJmYWNlIHdoZW4gdGhlIDxjb2RlPnN0cmlwU3BhY2UoKTwvY29kZT4gbWV0aG9kIGlzIGNvbXBpbGVkKS48L3A+Ci0KLSAgPHA+QWxsIGF4aXMgaXRlcmF0b3JzIGFuZCB0aGUgPGNvZGU+RE9NLm1ha2VTdHJpbmdWYWx1ZSgpPC9jb2RlPiBhbmQKLSAgPGNvZGU+RE9NLnN0cmluZ1ZhbHVlQXV4KCk8L2NvZGU+IG1ldGhvZHMgY2hlY2sgZm9yIHRoZSBleGlzdGFuY2Ugb2YgdGhpcyBmaWx0ZXIKLSAgKGl0IGlzIGtlcHQgaW4gYSBnbG9iYWwgdmFyaWFibGUgaW4gdGhlIERPTSBpbXBsZW1lbnRhdGlvbiBjbGFzcykgYW5kIHRha2VzCi0gIHRoZSBhcHByb3ByaWF0ZSBhY3Rpb25zLiBUaGUgbWV0aG9kcyBpbiB0aGUgRE9NIGZvciByZXR1cm5pbmcgYXhpcyBpdGVyYXRvcnMKLSAgd2lsbCBwbGFjZSBhIFN0cmlwcGluZ0l0ZXJhdG9yIG9uIHRvcCBvZiB0aGUgYXhpcyBpdGVyYXRvciBpZiB0aGUgZmlsdGVyIGlzCi0gIHByZXNlbnQsIGFuZCB0aGUgdHdvIG1ldGhvZHMganVzdCBtZW50aW9uZWQgd2lsbCByZXR1cm4gZW1wdHkgc3RyaW5ncyBmb3IKLSAgd2hpdGVzcGFjZSBub2RlcyB0aGF0IHNob3VsZCBiZSBzdHJpcHBlZC48L3A+Ci0gCi0gIDwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y19jb21waWxlci54bWwgYi94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbHRjX2NvbXBpbGVyLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWU0ZDY5ZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbHRjX2NvbXBpbGVyLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLSAgPHMxIHRpdGxlPSJYU0xUQyBDb21waWxlciBEZXNpZ24iPgotICAgIDx1bD4gIAotICAgICA8bGk+PGxpbmsgYW5jaG9yPSJvdmVydmlldyI+Q29tcGlsZXIgT3ZlcnZpZXc8L2xpbms+PC9saT4KLSAgICAgPGxpPjxsaW5rIGFuY2hvcj0iYXN0Ij5CdWlsZGluZyBhbiBBYnN0cmFjdCBTeW50YXggVHJlZTwvbGluaz48L2xpPgotICAgICA8bGk+PGxpbmsgYW5jaG9yPSJ0eXBlY2hlY2siPlR5cGUtY2hlY2sgYW5kIENhc3QgRXhwcmVzc2lvbnM8L2xpbms+PC9saT4KLSAgICAgPGxpPjxsaW5rIGFuY2hvcj0iY29tcGlsZSI+Q29kZSBnZW5lcmF0aW9uPC9saW5rPjwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxhbmNob3IgbmFtZT0ib3ZlcnZpZXciLz4KLSAgICA8czIgdGl0bGU9IkNvbXBpbGVyIG92ZXJ2aWV3Ij4KLQotICAgIDxwPlRoZSBpbnB1dCBzdHlsZXNoZWV0IGlzIHBhcnNlZCB1c2luZyB0aGUgU0FYIDEtYmFzZWQgcGFyc2VyIGZyb20gU3VuJ3MKLSAgICBQcm9qZWN0IFg6PC9wPiAgIAotICAgIDx1bD4KLSAgICAgIDxsaT48Y29kZT5jb20uc3VuLnhtbC5wYXJzZXIuUGFyc2VyPC9jb2RlPjwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPlRoaXMgcGFyc2VyIGJ1aWxkcyBhIERPTSBmcm9tIHRoZSBzdHlsZXNoZWV0IGRvY3VtZW50LCBhbmQgaGFuZHMgdGhpcwotICAgIERPTSBvdmVyIHRvIHRoZSBjb21waWxlci4gVGhlIGNvbXBpbGVyIHVzZXMgaXRzIG93biBzcGVjaWFsaXNlZCBwYXJzZXIgdG8KLSAgICBwYXJzZSBYUGF0aCBleHByZXNzaW9ucyBhbmQgcGF0dGVybnM6PC9wPgotICAgIDx1bD4KLSAgICAgIDxsaT48Y29kZT5jb20uc3VuLnhzbHQuY29tcGlsZXIuWFBhdGhQYXJzZXI8L2NvZGU+PC9saT4KLSAgICA8L3VsPgotICAgIDxwPkJvdGggcGFyc2VycyBhcmUgZW5jYXBzdWxhdGVkIGluIFhTTFRDJ3MgcGFyc2VyIGNsYXNzOjwvcD4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGNvZGU+Y29tLnN1bi54c2x0LmNvbXBpbGVyLlBhcnNlcjwvY29kZT48L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0iYXN0Ii8+Ci0gICAgPHMyIHRpdGxlPSJCdWlsZGluZyBhbiBBYnN0cmFjdCBTeW50YXggVHJlZSI+Ci0gICAgPHVsPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0ibWFwcGluZyI+TWFwcGluZyBzdHlsZXNoZWV0IGVsZW1lbnRzIHRvIEphdmEgY2xhc3NlczwvbGluaz48L2xpPgotICAgICAgPGxpPjxsaW5rIGFuY2hvcj0iZG9teHNsIj5CdWlsZGluZyBhIERPTSB0cmVlIGZyb20gdGhlIGlucHV0IFhTTCBmaWxlPC9saW5rPjwvbGk+ICAgICAgCi0gICAgPC91bD4KLSAgICA8cD5UaGUgU0FYIHBhcnNlciBidWlsZHMgYSBzdGFuZGFyZCBXM0MgRE9NIGZyb20gdGhlIHNvdXJjZSBzdHlsZXNoZWV0LgotICAgIFRoaXMgRE9NIGRvZXMgbm90IGNvbnRhaW4gYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVwcmVzZW50IHRoZQotICAgIHdob2xlIHN0eWxlc2hlZXQuICggUmVtZW1iZXIgdGhhdCBYU0wgaXMgdHdvIGxhbmd1YWdlczsgWE1MIGFuZCBYUGF0aC4KLSAgICBUaGUgRE9NIG9ubHkgY292ZXJzIFhNTC4gKSBUaGUgY29tcGlsZXIgdXNlcyB0aGUgRE9NIHRvIGJ1aWxkIGFuCi0gICAgYWJzdHJhY3Qgc3ludGF4IHRyZWUgKEFTVCkgdGhhdCBjb250YWlucyBhbGwgdGhlIG5vZGVzIGZyb20gdGhlIERPTSwgcGx1cwotICAgIGFkZGl0aW9uYWwgbm9kZXMgZm9yIHRoZSBYUGF0aCBleHByZXNzaW9ucy48L3A+Ci0gICAgPGFuY2hvciBuYW1lPSJtYXBwaW5nIi8+Ci0gICAgPHMzIHRpdGxlPSJNYXBwaW5nIHN0eWxlc2hlZXRzIGVsZW1lbnRzIHRvIEphdmEgY2xhc3NlcyI+Ci0gICAgPHA+RWFjaCBYU0wgZWxlbWVudCBpcyByZXByZXNlbnRlZCBieSBhIGNsYXNzIGluIHRoZQotICAgIDxjb2RlPmNvbS5zdW4ueHNsdC5jb21waWxlcjwvY29kZT4gcGFja2FnZS4gVGhlIFBhcnNlciBjbGFzcyBjb250YWlucyBhCi0gICAgSGFzaHRhYmxlIHRoYXQgdGhhdCBtYXBzIFhTTCBpbnN0cnVjdGlvbnMgdG8gY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSBhCi0gICAgY29tbW9uIHBhcmVudCBjbGFzcyAnSW5zdHJ1Y3Rpb24nICh3aGljaCBhZ2FpbiBpbmhlcml0cyBmcm9tCi0gICAgJ1N5bnRheFRyZWVOb2RlJykuIFRoaXMgbWFwcGluZyBpcyBzZXQgdXAgaW4gdGhlIDxjb2RlPmluaXRDbGFzc2VzKCk8L2NvZGU+IG1ldGhvZDo8L3A+Ci08c291cmNlPiAgICBwcml2YXRlIHZvaWQgaW5pdFN0ZENsYXNzZXMoKSB7Ci0JdHJ5IHsKLQkgICAgaW5pdFN0ZENsYXNzKCJ0ZW1wbGF0ZSIsICAgICJUZW1wbGF0ZSIpOwotCSAgICBpbml0U3RkQ2xhc3MoInBhcmFtIiwgICAgICAgIlBhcmFtIik7Ci0JICAgIGluaXRTdGRDbGFzcygid2l0aC1wYXJhbSIsICAiV2l0aFBhcmFtIik7Ci0JICAgIGluaXRTdGRDbGFzcygidmFyaWFibGUiLCAgICAiVmFyaWFibGUiKTsKLQkgICAgaW5pdFN0ZENsYXNzKCJvdXRwdXQiLCAgICAgICJPdXRwdXQiKTsKLQkgICAgOgotCSAgICA6Ci0JICAgIDoKLQl9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRDbGFzcyhTdHJpbmcgZWxlbWVudE5hbWUsIFN0cmluZyBjbGFzc05hbWUpCi0JdGhyb3dzIENsYXNzTm90Rm91bmRFeGNlcHRpb24gewotCV9jbGFzc2VzLnB1dChlbGVtZW50TmFtZSwKLQkJICAgICBDbGFzcy5mb3JOYW1lKENPTVBJTEVSX1BBQ0tBR0UgKyAnLicgKyBjbGFzc05hbWUpKTsKLSAgICB9PC9zb3VyY2U+Ci0gICAgPC9zMz48YW5jaG9yIG5hbWU9ImRvbXhzbCIvPgotICAgIDxzMyB0aXRsZT0iQnVpbGRpbmcgYSBET00gdHJlZSBmcm9tIHRoZSBpbnB1dCBYU0wgZmlsZSI+Ci0gICAgPHA+VGhlIHBhcnNlciBpbnN0YW5jaWF0ZXMgYSBET00gdGhhdCBob2xkcyB0aGUgaW5wdXQgWFNMIHN0eWxlc2hlZXQuIFRoZQotICAgIERPTSBjYW4gb25seSBoYW5kbGUgWE1MIGZpbGVzIGFuZCB3aWxsIG5vdCBicmVhayB1cCBhbmQgaWRlbnRpZnkgWFBhdGgKLSAgICBwYXR0ZXJucy9leHByZXNzaW9ucyAodGhlc2UgYXJlIHN0b3JlZCBhcyBhdHRyaWJ1dGVzIHRvIHRoZSB2YXJpb3VzCi0gICAgbm9kZXMgaW4gdGhlIHRyZWUpIG9yIGNhbGxzIHRvIFhTTCBmdW5jdGlvbnMoKS4gRWFjaCBYU0wgaW5zdHJ1Y3Rpb24gZ2V0cwotICAgIGl0cyBvd24gbm9kZSBpbiB0aGUgRE9NLCBhbmQgdGhlIFhQYXRoIHBhdHRlcm5zL2V4cHJlc3Npb25zIGFyZSBzdG9yZWQgYXMKLSAgICBhdHRyaWJ1dGVzIG9mIHRoZXNlIG5vZGVzLiBBIHN0eWxlc2hlZXQgbG9va2luZyBsaWtlIHRoaXM6PC9wPgotPHNvdXJjZT4KLSAgICAmbHQ7eHNsOnN0eWxlc2hlZXQgLi4uLi4uLiZndDsKLSAgICAgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9ImNoYXB0ZXIiJmd0OwotICAgICAgICAmbHQ7eHNsOnRleHQmZ3Q7Q2hhcHRlciZsdDsveHNsOnRleHQmZ3Q7Ci0gICAgICAgICZsdDt4c2x2YWx1ZS1vZiBzZWxlY3Q9Ii4iJmd0OwotICAgICAgJmx0Oy94c2w6dGVtcGxhdGUmZ3Q7Ci0gICAgJmx0Oy94c2wmZ3Q7c3R5bGVzaGVldCZndDsKLTwvc291cmNlPgotICAgIDxwPndpbGwgYmUgc3RvcmVkIGluIHRoZSBET00gYXMgaW5kaWNhdGVkIGluIHRoZSBmb2xsb3dpbmcgcGljdHVyZTo8L3A+Ci0gICAgPHA+PGltZyBzcmM9ImNvbXBpbGVyX0RPTS5naWYiIGFsdD0iY29tcGlsZXJfRE9NLmdpZiIvPjwvcD4KLSAgICA8cD48cmVmPkZpZ3VyZSAxOiBET00gY29udGFpbmluZyBYU0wgc3R5bGVzaGVldDwvcmVmPjwvcD4KLSAgICA8cD5UaGUgcGF0dGVybiAnPGNvZGU+bWF0Y2g9ImNoYXB0ZXIiPC9jb2RlPicgYW5kIHRoZSBleHByZXNzaW9uCi0gICAgJzxjb2RlPnNlbGVjdD0iLiI8L2NvZGU+JyBhcmUgc3RvcmVkIGFzIGF0dHJpYnV0ZXMgZm9yIHRoZSBub2RlcwotICAgICc8Y29kZT54c2w6dGVtcGxhdGU8L2NvZGU+JyBhbmQgJzxjb2RlPnhzbDp2YWx1ZS1vZjwvY29kZT4nIHJlc3BlY3RpdmVseS4KLSAgICBUaGVzZSBhdHRyaWJ1dGVzIGFyZSBhY2Nlc3NpYmxlIHRocm91Z2ggdGhlIERPTSBpbnRlcmZhY2UuPC9wPgotICAgIDwvczM+Ci0gICAgIDxzMyB0aXRsZT0iQ3JlYXRpbmcgdGhlIEFic3RyYWN0IFN5bnRheCBUcmVlIGZyb20gdGhlIERPTSI+Ci0gICAgPHA+V2hhdCB3ZSBoYXZlIHRvIGRvIG5leHQgaXMgdG8gY3JlYXRlIGEgdHJlZSB0aGF0IGFsc28gaG9sZHMgdGhlIFhTTAotICAgIHNwZWNpZmljIGVsZW1lbnRzOyBYUGF0aCBleHByZXNzaW9ucyBhbmQgcGF0dGVybnMgKHdpdGggcG9zc2libGUgZmlsdGVycykKLSAgICBhbmQgY2FsbHMgdG8gWFNMIGZ1bmN0aW9ucy4gVGhpcyBpcyBkb25lIGJ5IHBhcnNpbmcgdGhlIERPTSBhbmQgY3JlYXRpbmcgYW4KLSAgICBpbnN0YW5jZSBvZiBhIHN1YmNsYXNzIG9mICdTeW50YXhUcmVlTm9kZScgZm9yIGVhY2ggbm9kZSBpbiB0aGUgRE9NLiBBIG5vZGUKLSAgICBpbiB0aGUgRE9NIGNvbnRhaW5pbmcgYW4gWFNMIGluc3RydWN0aW9uIChmb3IgZXhhbXBsZSwgInhzbDp0ZW1wbGF0ZSIpIHJlc3VsdHMgaW4gYW4KLSAgICBpbnN0YW5jZSBvZiB0aGUgY29ycmVzcG9kaW5nIGNsYXNzIGRlcml2ZWQgZnJvbSB0aGUgSGFzaFRhYmxlIGNyZWF0ZWQgYnkKLSAgICB0aGUgcGFyc2VyIChpbiB0aGlzIGNhc2UgaW4gaW5zdGFuY2Ugb2YgdGhlICdUZW1wbGF0ZScgY2xhc3MpLjwvcD4KLQotICAgIDxwPkVhY2ggY2xhc3MgdGhhdCBpbmhlcml0cyBTeW50YXhUcmVlTm9kZSBoYXMgYSB2ZWN0b3IgY2FsbGVkCi0gICAgJzxjb2RlPl9jb250ZW50czwvY29kZT4nIHRoYXQgaG9sZHMgcmVmZXJlbmNlcyB0byBhbGwgdGhlIGNoaWxkcmVuIG9mIHRoZSBub2RlCi0gICAgKGlmIGFueSkuIEVhY2ggbm9kZSBoYXMgYSBtZXRob2QgY2FsbGVkICc8Y29kZT5wYXJzZUNvbnRlbnRzKCk8L2NvZGU+Jy4gSXQgaXMKLSAgICB0aGUgcmVzcG9uc2liaWxpdHkgb2YgdGhpcyBtZXRob2QgdG8gcGFyc2UgYW55IFhQYXRoIGV4cHJlc3Npb25zL3BhdHRlcm5zCi0gICAgdGhhdCBhcmUgZXhwZWN0ZWQgYW5kIGZvdW5kIGluIHRoZSBub2RlJ3MgYXR0cmlidXRlcy4gVGhlIFhQYXRoIHBhdHRlcm5zCi0gICAgYW5kIGluc3RydWN0aW9ucyBhcmUgdG9rZW5pc2VkIHVzaW5nIHRoZSBhdXRvLWdlbmVyYXRlZCBjbGFzcyAnWFBhdGhQYXJzZXInCi0gICAgKGdlbmVyYXRlZCB1c2luZyBKYXZhQ3VwIGFuZCBKTGV4KS4gVGhlIHRva2VuaXNlZCBleHByZXNzaW9ucy9wYXR0ZXJucwotICAgIHdpbGwgcmVzdWx0IGluIGEgc21hbGwgc3ViLXRyZWUgb3duZWQgYnkgdGhlIHN5bnRheCB0cmVlIG5vZGUuPC9wPgotCi0gICAgPHA+WFNMIG5vZGVzIGhvbGRpbmcgZXhwcmVzc2lvbnMgaGFzIGEgcG9pbnRlciBjYWxsZWQgJzxjb2RlPl9zZWxlY3Q8L2NvZGU+JyB0aGF0Ci0gICAgcG9pbnRzIHRvIGEgc3ViLXRyZWUgcmVwcmVzZW50aW5nIHRoZSBleHByZXNzaW9uLiBUaGlzIGNhbiBiZSBzZWVuIGZvcgotICAgIGluc3RhbmNlIGluIHRoZSAnVGVtcGxhdGUnIGNsYXNzOjwvcD4KLSAgICA8cD48aW1nIHNyYz0iY29tcGlsZXJfQVNULmdpZiIgYWx0PSJjb21waWxlcl9BU1QuZ2lmIi8+PC9wPgotICAgIDxwPjxyZWY+Rml1Z3JlIDI6IFNhbXBsZSBBYnN0cmFjdCBTeW50YXggVHJlZTwvcmVmPjwvcD4KLSAgICA8cD5JbiB0aGlzIGV4YW1wbGUgX3NlbGVjdCBvbmx5IHBvaW50cyB0byBhIHNpbmdsZSBub2RlLiBJbiBtb3JlIGNvbXBsZXgKLSAgICBleHByZXNzaW9ucyB0aGUgcG9pbnRlciB3aWxsIHBvaW50IHRvIGFuIHdob2xlIHN1Yi10cmVlLjwvcD4KLSAgICAgPC9zMz4KLSAgICAgPC9zMj48YW5jaG9yIG5hbWU9InR5cGVjaGVjayIvPgotICAgIDxzMiB0aXRsZT0iVHlwZS1jaGVjayBhbmQgQ2FzdCBFeHByZXNzaW9ucyI+Ci0gICAgPHA+SW4gbWFueSBjYXNlcyB3ZSB3aWxsIG5lZWQgdG8gdHlwZWNhc3QgdGhlIHRvcCBub2RlIGluIHRoZSBleHByZXNzaW9uCi0gICAgc3ViLXRyZWUgdG8gc3VpdCB0aGUgZXhwZWN0ZWQgcmVzdWx0LXR5cGUgb2YgdGhlIGV4cHJlc3Npb24sIG9yIHRvIHR5cGVjYXN0Ci0gICAgY2hpbGQgbm9kZXMgdG8gc3VpdCB0aGUgYWxsb3dlZCB0eXBlcyBmb3IgdGhlIHZhcmlvdXMgb3BlcmF0b3JzIGluIHRoZQotICAgIGV4cHJlc3Npb24uIFRoaXMgaXMgZG9uZSBieSBjYWxsaW5nICd0eXBlQ2hlY2soKScgb24gdGhlIHJvb3Qtbm9kZSBpbiB0aGUKLSAgICBYU0wgdHJlZS4gRWFjaCBTeW50YXhUcmVlIG5vZGUgaXMgcmVzcG9uc2libGUgZm9yIGl0cyBvd24gdHlwZSBjaGVja2luZwotICAgIChpZS4gdGhlIDxjb2RlPnR5cGVDaGVjaygpPC9jb2RlPiBtZXRob2QgbXVzdCBiZSBvdmVycmlkZGVuKS4gTGV0IHVzIHNheSB0aGF0Ci0gICAgb3VyIHBhdHRlcm4gd2FzOjwvcD4KLSAgICA8cD48Y29kZT4mbHQ7eHNsOnZhbHVlLW9mIHNlbGVjdD0mcXVvdDsxKzIuNzMmcXVvdDsvJmd0OzwvY29kZT48L3A+Ci0gICAgPHA+PGltZyBzcmM9InR5cGVjYXN0LmdpZiIgYWx0PSJ0eXBlY2FzdC5naWYiLz48L3A+Ci0gICAgPHA+PHJlZj5GaWd1cmUgMzogWFBhdGggZXhwcmVzc2lvbiB0eXBlIGNvbmZsaWN0PC9yZWY+PC9wPgotICAgIDxwPlRoZSBudW1iZXIgMSBpcyBhbiBpbnRlZ2VyLCBhbmQgdGhlIG51bWJlciAyLjczIGlzIGEgcmVhbCBudW1iZXIsIHNvIHRoZQotICAgIDEgaGFzIHRvIGJlIHByb21vdGVkIHRvIGEgcmVhbC4gVGhpcyBpcyBkb25lIG55IGluc2VydGluZyBhIG5ldyBub2RlIGJldHdlZW4KLSAgICB0aGUgWzFdIGFuZCB0aGUgWytdLiBUaGlzIG5vZGUgd2lsbCBjb252ZXJ0IHRoZSAxIHRvIGEgcmVhbCBudW1iZXI6PC9wPgotICAgIDxwPjxpbWcgc3JjPSJjYXN0X2V4cHJlc3Npb24uZ2lmIiBhbHQ9ImNhc3RfZXhwcmVzc2lvbi5naWYiLz48L3A+Ci0gICAgPHA+PHJlZj5GaWd1cmUgNDogVHlwZSBjYXN0aW5nPC9yZWY+PC9wPgotCi0gICAgPHA+VGhlIGluc2VydGVkIG5vZGUgaXMgYW4gb2JqZWN0IG9mIHRoZSBjbGFzcyBDYXN0RXhwci4gVGhlIFN5bWJvbFRhYmxlCi0gICAgdGhhdCB3YXMgaW5zdGFuY2lhdGVkIGluICgxKSBpcyB1c2VkIHRvIGRldGVybWluZSB3aGF0IGNhc3RzIGFyZSBuZWVkZWQgZm9yCi0gICAgdGhlIHZhcmlvdXMgb3BlcmF0b3JzIGFuZCB3aGF0IHJldHVybiB0eXBlcyB0aGUgdmFyaW91cyBleHByZXNzaW9ucyB3aWxsCi0gICAgaGF2ZS48L3A+Ci0KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0iY29tcGlsZSIvPgotICAgIDxzMiB0aXRsZT0iQ29kZSBnZW5lcmF0aW9uIj4KLSAgICA8dWw+Ci0gICAgICA8bGk+PGxpbmsgYW5jaG9yPSJ0b3BsZXZlbGVsZW0iPkNvbXBpbGluZyB0b3AtbGV2ZWwgZWxlbWVudHM8L2xpbms+PC9saT4KLSAgICAgIDxsaT48bGluayBhbmNob3I9InRlbXBsYXRlY29kZSI+Q29tcGlsaW5nIHRlbXBsYXRlIGNvZGU8L2xpbms+PC9saT4KLSAgICAgIDxsaT48bGluayBhbmNob3I9Imluc3RyZnVuYyI+Q29tcGlsaW5nIFhTTCBpbnN0cnVjdGlvbnMgYW5kIGZ1bmN0aW9uczwvbGluaz48L2xpPiAgICAgICAgICAgIAotICAgIDwvdWw+Ci0gICAgPHA+QSBnZW5lcmFsIHJ1bGUgaXMgdGhhdCBhbGwgY2xhc3NlcyB0aGF0IHJlcHJlc2VudCBlbGVtZW50cyBpbiB0aGUgWFNMCi0gICAgdHJlZS9kb2N1bWVudCwgaS5lLiwgY2xhc3NlcyB0aGF0IGluaGVyaXQgZnJvbSBTeW50YXhUcmVlTm9kZSwgb3V0cHV0Ci0gICAgYnl0ZWNvZGUgaW4gdGhlICd0cmFuc2xhdGUoKScgbWV0aG9kLjwvcD4KLSAgICA8YW5jaG9yIG5hbWU9InRvcGxldmVsZWxlbSIvPgotICAgIDxzMyB0aXRsZT0iQ29tcGlsaW5nIHRvcC1sZXZlbCBlbGVtZW50cyI+Ci0gICAgPHA+VGhlIGJ5dGVjb2RlIHRoYXQgaGFuZGxlcyB0b3AtbGV2ZWwgZWxlbWVudHMgbXVzdCBiZSBnZW5lcmF0ZWQgYmVmb3JlIGFueQotICAgIG90aGVyIGNvZGUuIFRoZSAnPGNvZGU+dHJhbnNsYXRlKCk8L2NvZGU+JyBtZXRob2QgaW4gdGhlc2UgY2xhc3NlcyBhcmUgbWFpbmx5Ci0gICAgY2FsbGVkIGZyb20gdGhlc2UgbWV0aG9kcyBpbiB0aGUgU3R5bGVzaGVldCBjbGFzczo8L3A+Ci0KLTxzb3VyY2U+ICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVCdWlsZEtleXMoQ2xhc3NHZW5lcmF0b3IgY2xhc3NHZW4pOwotICAgIHByaXZhdGUgU3RyaW5nIGNvbXBpbGVUb3BMZXZlbChDbGFzc0dlbmVyYXRvciBjbGFzc0dlbiwgRW51bWVyYXRpb24gZWxlbWVudHMpOwotICAgIHByaXZhdGUgdm9pZCBjb21waWxlQ29uc3RydWN0b3IoQ2xhc3NHZW5lcmF0b3IgY2xhc3NHZW4sIE91dHB1dCBvdXRwdXQpOzwvc291cmNlPgotCi0gICAgPHA+VGhlc2UgbWV0aG9kcyBoYW5kbGUgbW9zdCB0b3AtbGV2ZWwgZWxlbWVudHMsIHN1Y2ggYXMgZ2xvYmFsIHZhcmlhYmxlcwotICAgIGFuZCBwYXJhbWV0ZXJzLCA8Y29kZT4mbHQ7eHNsOm91dHB1dCZndDs8L2NvZGU+IGFuZAotICAgIDxjb2RlPiZsdDt4c2w6ZGVjaW1hbC1mb3JtYXQmZ3Q7PC9jb2RlPiBpbnN0cnVjdGlvbnMuPC9wPgotICAgIDwvczM+PGFuY2hvciBuYW1lPSJ0ZW1wbGF0ZWNvZGUiLz4KLSAgICA8czMgdGl0bGU9IkNvbXBpbGluZyB0ZW1wbGF0ZSBjb2RlIj4KLSAgICA8cD5BbGwgWFBhdGggcGF0dGVybnMgaW4gPGNvZGU+Jmx0O3hzbDphcHBseS10ZW1wbGF0ZSZndDs8L2NvZGU+IGluc3RydWN0aW9ucwotICAgIGFyZSBjb252ZXJ0ZWQgaW50byBudW1lcmljIHZhbHVlcyAoa25vd24gYXMgdGhlIHBhdHRlcm4ncyBrZXJuZWwgJ3R5cGUnKS4KLSAgICBBbGwgdGVtcGxhdGVzIHdpdGggaWRlbnRpY2FsIHBhdHRlcm4ga2VybmVsIHR5cGVzIGFyZSBncm91cGVkIHRvZ2V0aGVyIGFuZAotICAgIGluc2VydGVkIGludG8gYSB0YWJsZSB3aXRoIGl0cyBhc3NpZ25lZCB0eXBlLiAoVGhpcyB0YWJsZSBpcyBmb3VuZCBpbiB0aGUKLSAgICBNb2RlIGNsYXNzLiBUaGVyZSB3aWxsIGJlIG9uZSBzdWNoIHRhYmxlIGZvciBlYWNoIG1vZGUgdGhhdCBpcyB1c2VkIGluIHRoZQotICAgIHN0eWxlc2hlZXQpLiBUaGlzIHRhYmxlIGlzIHVzZWQgdG8gYnVpbGQgYSBiaWcgPGNvZGU+c3dpdGNoKCk8L2NvZGU+IHN0YXRlbWVudAotICAgIGluIHRoZSB0cmFuc2xldCdzIDxjb2RlPmFwcGx5VGVtcGxhdGVzKCk8L2NvZGU+IG1ldGhvZC4gVGhpcyBtZXRob2QgaXMgaW5pdGlhbGx5Ci0gICAgY2FsbGVkIHdpdGggdGhlIHJvb3Qgbm9kZSBvZiB0aGUgaW5wdXQgZG9jdW1lbnQuPC9wPgotICAgIDxwPlRoZSA8Y29kZT5hcHBseVRlbXBsYXRlcygpPC9jb2RlPiBtZXRob2QgZGV0ZXJtaW5lcyB0aGUgbm9kZSdzIHR5cGUgYW5kIHBhc3NlcwotICAgIHRoaXMgdHlwZSB0byB0aGUgPGNvZGU+c3dpdGNoKCk8L2NvZGU+IHN0YXRlbWVudCB0byBsb29rIHVwIHRoZSBtYXRjaGluZwotICAgIHRlbXBsYXRlLjwvcD4KLQotICAgIDxwPlRoZXJlIG1heSBiZSBzZXZlcmFsIHRlbXBsYXRlcyB0aGF0IHNoYXJlIHRoZSBzYW1lIHBhdHRlcm4ga2VybmVsIHR5cGUuCi0gICAgSGVyZSBhcmUgYSBmZXcgZXhhbXBsZXMgb2YgdGVtcGxhdGVzIHdpdGggcGF0dGVybnMgdGhhdCBhbGwgaGF2ZSB0aGUgc2FtZQotICAgIGtlcm5lbCB0eXBlOjwvcD4KLQotPHNvdXJjZT4gICAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0mcXVvdDtBL0MmcXVvdDsmZ3Q7Ci0gICAgJmx0O3hzbDp0ZW1wbGF0ZSBtYXRjaD0mcXVvdDtBL0IvQyZxdW90OyZndDsKLSAgICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSZxdW90O0EgfCBDJnF1b3Q7Jmd0Ozwvc291cmNlPgotCi0gICAgPHA+QWxsIHRoZXNlIHRlbXBsYXRlcyB3aWxsIGJlIGdyb3VwZWQgdW5kZXIgdGhlIHR5cGUgZm9yIDxjb2RlPiZsdDtDJmd0OzwvY29kZT4KLSAgICBhbmQgd2lsbCBhbGwgZ2V0IHRoZSBzYW1lIGtlcm5lbCB0eXBlICh0aGUgdHlwZSBmb3IgPGNvZGU+IkMiPC9jb2RlPikuIFRoZSBsYXN0Ci0gICAgdGVtcGxhdGUgd2lsbCBiZSBncm91cGVkIGJvdGggdW5kZXIgPGNvZGU+IkMiPC9jb2RlPiBhbmQgPGNvZGU+IkEiPC9jb2RlPi4gSWYgdGhlCi0gICAgdHlwZSBpZGVudGlmaWVyIGZvciA8Y29kZT4iQyI8L2NvZGU+IGluIHRoaXMgY2FzZSBpcyA4LCBhbGwgdGhlc2UgdGVtcGxhdGVzIHdpbGwKLSAgICBiZSBwdXQgdW5kZXIgPGNvZGU+Y2FzZSA4OjwvY29kZT4gaW4gPGNvZGU+YXBwbHlUZW1wbGF0ZXMoKTwvY29kZT4ncyBiaWcKLSAgICA8Y29kZT5zd2l0Y2goKTwvY29kZT4gc3RhdGVtZW50LiBUaGUgTW9kZSBjbGFzcyB3aWxsIGluc2VydCBleHRyYSBjb2RlIHRvIGNob29zZQotICAgIHdoaWNoIHRlbXBsYXRlIGNvZGUgdG8gaW52b2tlLjwvcD4KLSAgICA8L3MzPjxhbmNob3IgbmFtZT0iaW5zdHJmdW5jIi8+Ci0gICAgPHMzIHRpdGxlPSJDb21waWxpbmcgWFNMIGluc3RydWN0aW9ucyBhbmQgZnVuY3Rpb25zIj4KLQotICAgIDxwPlRoZSB0ZW1wbGF0ZSBjb2RlIGlzIGdlbmVyYXRlZCBieSBjYWxsaW5nIDxjb2RlPnRyYW5zbGF0ZSgpPC9jb2RlPiBvbiBlYWNoCi0gICAgVGVtcGxhdGUgb2JqZWN0IGluIHRoZSBhYnN0cmFjdCBzeW50YXggdHJlZS4gVGhpcyBjYWxsIHdpbGwgYmUgcHJvcGFnYXRlZAotICAgIGRvd24gdGhlIHRyZWUgYW5kIGV2ZXJ5IGVsZW1lbnQgd2lsbCBvdXRwdXQgdGhlIGJ5dGVjb2RlcyBuZWNlc3NhcnkgdG8KLSAgICBjb21wbGV0ZSBpdHMgdGFzay48L3A+Ci0KLSAgICA8cD5FYWNoIG5vZGUgd2lsbCBjYWxsICd0cmFuc2xhdGUoKScgb24gaXRzIGNoaWxkcmVuLCBhbmQgcG9zc2libHkgb24KLSAgICBvYmplY3RzIHJlcHJlc2VudGluZyB0aGUgbm9kZSdzIFhQYXRoIGV4cHJlc3Npb25zLCBiZWZvcmUgb3V0cHV0dGluZyBpdHMKLSAgICBvd24gYnl0ZWNvZGUuIEluIHRoYXQgd2F5IHRoZSBjb3JyZWN0IHNlcXVlbmNlIG9mIGluc3RydWN0aW9ucyBpcyBnZW5lcmF0ZWQuCi0gICAgRWFjaCBvbmUgb2YgdGhlIGNoaWxkIG5vZGVzIGlzIHJlc3BvbnNpYmxlIG9mIGNyZWF0aW5nIGNvZGUgdGhhdCBsZWF2ZXMgdGhlCi0gICAgbm9kZSdzIG91dHB1dCB2YWx1ZSAoaWYgYW55KSBvbiB0aGUgc3RhY2suIFRoZSB0eXBpY2FsIHByb2NlZHVyZSBmb3IgdGhlCi0gICAgcGFyZW50IG5vZGUgaXMgdG8gY3JlYXRlIGNvZGUgdGhhdCBjb25zdW1lcyB0aGVzZSB2YWx1ZXMgb2ZmIHRoZSBzdGFjayBhbmQKLSAgICB0aGVuIGxlYXZlIGl0cyBvd24gb3V0cHV0IG9uIHRoZSBzdGFjayBmb3IgaXRzIHBhcmVudC48L3A+Ci0KLSAgICA8cD5UaGUgdHJlZS1zdHJ1Y3R1cmUgb2YgdGhlIHN0eWxlc2hlZXQgaXMgaW4gdGhpcyB3YXkgY2xvc2VseSB0aWVkIHdpdGgKLSAgICB0aGUgc3RhY2stYmFzZWQgSlZNLiBUaGUgZGVzaWduIGRvZXMgbm90IG9mZmVyIGFueSBvYnZpb3VzIHdheSBvZiBleHRlbmRpbmcKLSAgICB0aGUgY29tcGlsZXIgdG8gb3V0cHV0IGNvZGUgZm9yIG90aGVyIFZNcyBvciBwcm9jZXNzb3JzLjwvcD4KLSAgIDwvczM+Ci0gIDwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdGNfZG9tLnhtbCBiL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdGNfZG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTM1NTdkZC4uMDAwMDAwMAotLS0gYS94ZG9jcy9zb3VyY2VzL3hzbHRjL3hzbHRjX2RvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw0ODMgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBzdGFuZGFsb25lPSJubyI/PgotPCFET0NUWVBFIHMxIFNZU1RFTSAiLi4vLi4vc3R5bGUvZHRkL2RvY3VtZW50LmR0ZCI+Ci08IS0tIAotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMSwgU3VuCi0gKiBNaWNyb3N5c3RlbXMuLCBodHRwOi8vd3d3LnN1bi5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08czEgdGl0bGU9IlhTTFRDIEludGVybmFsIERPTSI+Ci0gIDx1bD4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJmdW5jdGlvbmFsaXR5Ij5HZW5lcmFsIGZ1bmN0aW9ubGFpdHk8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJjb21wb25lbnRzIj5Db21wb25lbnRzIG9mIHRoZSBpbnRlcm5hbCBET008L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJzdHJ1Y3R1cmUiPkludGVybmFsIHN0cnVjdHVyZTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9Im5hdmlnYXRpb24iPlRyZWUgbmF2aWdhdGlvbjwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9Im5hbWVzcGFjZXMiPk5hbWVzcGFjZXM8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJ3M2MiPlczQyBET00yIG5hdmlnYXRpb24gc3VwcG9ydDwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImFkYXB0ZXIiPlRoZSBET00gYWRhcHRlciAtIERPTUFkYXB0ZXI8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJtdWx0aXBsZXhlciI+VGhlIERPTSBtdWx0aXBsZXhlciAtIE11bHRpRE9NPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iYnVpbGRlciI+VGhlIERPTSBidWlsZGVyIC0gRE9NSW1wbCRET01CdWlsZGVyPC9saW5rPjwvbGk+Ci0gIDwvdWw+Ci0KLSAgPGFuY2hvciBuYW1lPSJmdW5jdGlvbmFsaXR5Ii8+Ci0gIDxzMiB0aXRsZT0iR2VuZXJhbCBmdW5jdGlvbmFsaXR5Ij4KLSAgPHA+VGhlIGludGVybmFsIERPTSBnaXZlcyB0aGUgdHJhbnNsZXQgYWNjZXNzIHRvIHRoZSBYTUwgZG9jdW1lbnQocykgaXQgaGFzCi0gIHRvIHRyYW5zZm9ybS4gVGhlIGludGVyZmFjZSB0byB0aGUgaW50ZXJuYWwgRE9NIGlzIHNwZWNpZmllZCBpbiB0aGUgRE9NLmphdmEKLSAgY2xhc3MuIFRoaXMgaXMgdGhlIGludGVyZmFjZSB0aGF0IHRoZSB0cmFuc2xldCB1c2VzIHRvIGFjY2VzcyB0aGUgRE9NLiAKLSAgVGhlcmUgaXMgYWxzbyBhbiBpbnRlcmZhY2Ugc3BlY2lmaWVkIGZvciBET00gY2FjaGVzIC0tIERPTUNhY2hlLmphdmE8L3A+Ci0KLSAgPC9zMj48YW5jaG9yIG5hbWU9ImNvbXBvbmVudHMiLz4KLSAgPHMyIHRpdGxlPSJDb21wb25lbnRzIG9mIHRoZSBpbnRlcm5hbCBET00iPgotCi0gIDxwPlRoaXMgRE9NIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSB0aHJlZSBjbGFzc2VzOjwvcD4KLSAgPHVsPgotICAgIDxsaT48ZW0+b3JnLmFwYWNoZS54YWxhbi54c2x0Yy5kb20uRE9NSW1wbDwvZW0+PGJyLz48YnIvPgotICAgICAgVGhpcyBpcyB0aGUgbWFpbiBET00gY2xhc3MuIEFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgY29udGFpbnMgdGhlIG5vZGVzCi0gICAgICBvZiBhIDxlbT5zaW5nbGU8L2VtPiBYTUwgZG9jdW1lbnQuPGJyLz5ici8+Ci0gICAgPC9saT4KLSAgICA8bGk+PGVtPm9yZy5hcGFjaGUueGFsYW4ueHNsdGMuZG9tLk11bHRpRE9NPC9lbT48YnIvPjxici8+Ci0gICAgICBUaGlzIGNsYXNzIGlzIGJlc3QgZGVzY3JpYmVkIGFzIGEgRE9NIG11bHRpcGxleGVyLiBYU0xUQyB3YXMgaW5pdGlhbGx5Ci0gICAgICBkZXNpZ25lZCB0byBvcGVyYXRlIG9uIGEgc2luZ2xlIFhNTCBkb2N1bWVudCwgYW5kIHRoZSBpbml0aWFsIERPTSBhbmQKLSAgICAgIHRoZSBET00gaW50ZXJmYWNlIHdlcmUgZGVzaWduZWQgYW5kIGltcGxlbWVudGVkIHdpdGhvdXQgdGhlCi0gICAgICA8Y29kZT5kb2N1bWVudCgpPC9jb2RlPiBmdW5jdGlvbiBpbiBtaW5kLiBUaGlzIGNsYXNzIHdpbGwgYWxsb3cgYSB0cmFuc2xldAotICAgICAgdG8gYWNjZXNzIG11bHRpcGxlIERPTXMgdGhyb3VnaCB0aGUgb3JpZ2luYWwgRE9NIGludGVyZmFjZS48YnIvPjxici8+Ci0gICAgPC9saT4KLSAgICA8bGk+PGVtPm9yZy5hcGFjaGUueGFsYW4ueHNsdGMuZG9tLkRPTUFkYXB0ZXI8L2VtPjxici8+YnIvPgotICAgICAgVGhlIERPTSBhZGFwdGVyIGlzIGEgbWVkaWF0b3IgYmV0d2VlbiBhIERPTUltcGwgb3IgYSBNdWx0aURPTSBvYmplY3QgYW5kCi0gICAgICBhIHNpbmdsZSB0cmFuc2xldC4gQSBET01BZGFwdGVyIG9iamVjdCBjb250YWlucyBtYXBwaW5ncyBhbmQgcmV2ZXJzZQotICAgICAgbWFwcGluZ3MgYmV0d2VlbiBub2RlICB0eXBlcyBpbiB0aGUgRE9NKHMpIGFuZCBub2RlIHR5cGVzIGluIHRoZSB0cmFuc2xldC4KLSAgICAgIFRoaXMgbWVkaWF0b3IgaXMgbmVlZGVkIHRvIGFsbG93IHNldmVyYWwgdHJhbnNsZXRzIGFjY2VzcyB0byBhIHNpbmdsZSBET00uCi0gICAgICA8YnIvPmJyLz4KLSAgICA8L2xpPgotICAgIDxsaT48ZW0+b3JnLmFwYWNoZS54YWxhbi54c2x0Yy5kb20uRG9jdW1lbnRDYWNoZTwvZW0+PGJyLz5ici8+Ci0gICAgICBBIHNhbXBsZSBET00gY2FjaGUgKGltcGxlbWVudGluZyBET01DYWNoZSkgdGhhdCBpcyB1c2VkIHdpdGggb3VyIHNhbXBsZQotICAgICAgdHJhbnNmb3JtYXRpb24gYXBwbGljYXRpb25zLgotICAgIDwvbGk+Ci0gIDwvdWw+Ci0KLSAgPHA+PGltZyBzcmM9IkRPTUludGVyZmFjZS5naWYiIGFsdD0iRE9NSW50ZXJmYWNlLmdpZiIvPjwvcD4KLSAgPHA+PHJlZj5GaWd1cmUgMTogTWFpbiBjb21wb25lbnRzIG9mIHRoZSBpbnRlcm5hbCBET008L3JlZj48L3A+Ci0KLSAgPHA+VGhlIGZpZ3VyZSBhYm92ZSBzaG93cyBob3cgc2V2ZXJhbCB0cmFuc2xldHMgY2FuIGFjY2VzcyBvbmUgb3IgbW9yZQotICBpbnRlcm5hbCBET00gZnJvbSBhIHNoYXJlZCBwb29sIG9mIGNhY2hlZCBET01zLiBBIHRyYW5zbGV0IGNhbiBhbHNvIGFjY2VzcyBhCi0gIERPTSB0cmVlIG91dHNpZGUgb2YgYSBjYWNoZS4gVGhlIFN0eWxlc2hlZXQgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBYU0wKLSAgc3R5bGVzaGVldCB0byBjb21waWxlIGNvbnRhaW5zIGEgZmxhZyB0aGF0IGluZGljYXRlcyBpZiB0aGUgdHJhbnNsZXQgdXNlcyB0aGUKLSAgPGNvZGU+ZG9jdW1lbnQoKTwvY29kZT4gZnVuY3Rpb24uIFRoZSBjb2RlIGNvbXBpbGVkIGludG8gdGhlIHRyYW5zbGV0IHdpbGwgYWN0Ci0gIGFjY29yZGluZ2x5IGFuZCBpbnN0YW5jaWF0ZSBhIE11bHRpRE9NIG9iamVjdCBpZiBuZWVkZWQgKHRoaXMgY29kZSBpcyBjb21waWxlZAotICAgaW4gdGhlIGNvbXBpbGVyJ3MgPGNvZGU+U3R5bGVzaGVldC5jb21waWxlVHJhbnNmb3JtKCk8L2NvZGU+IG1ldGhvZCkuPC9wPgotCi0gIDwvczI+PGFuY2hvciBuYW1lPSJzdHJ1Y3R1cmUiLz4KLSAgPHMyIHRpdGxlPSJJbnRlcm5hbCBTdHJ1Y3R1cmUiPgotICA8dWw+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ibm9kZS1pZCI+Tm9kZSBpZGVudGlmaWNhdGlvbjwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImVsZW1lbnQtbm9kZXMiPkVsZW1lbnQgbm9kZXM8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJhdHRyaWJ1dGUtbm9kZXMiPkF0dHJpYnV0ZSBub2RlczwvbGluaz48L2xpPiAgICAKLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJ0ZXh0LW5vZGVzIj5UZXh0IG5vZGVzPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iY29tbWVudC1ub2RlcyI+Q29tbWVudCBub2RlczwvbGluaz48L2xpPiAgICAKLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJwaSI+PC9saW5rPlByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zPC9saT4KLSAgPC91bD4KLSAgPGFuY2hvciBuYW1lPSJub2RlLWlkIi8+Ci0gIDxzMyB0aXRsZT0iTm9kZSBpZGVudGlmYXRpb24iPgotCi0gIDxwPkVhY2ggbm9kZSBpbiB0aGUgRE9NIGlzIHJlcHJlc2VudGVkIGJ5IGFuIGludGVnZXIuIFRoaXMgaW50ZWdlciBpcyBhbgotICBpbmRleCBpbnRvIGEgc2VyaWVzIG9mIGFycmF5cyB0aGF0IGRlc2NyaWJlcyB0aGUgbm9kZS4gTW9zdCBpbXBvcnRhbnQgaXMKLSAgdGhlIDxjb2RlPl90eXBlW108L2NvZGU+IGFycmF5LCB3aGljaCBob2xkcyB0aGUgKERPTSBpbnRlcm5hbCkgbm9kZSB0eXBlLiBUaGVyZQotICBhcmUgc29tZSBnZW5lcmFsIG5vZGUgdHlwZXMgdGhhdCBhcmUgZGVzY3JpYmVkIGluIHRoZSBET00uamF2YSBpbnRlcmZhY2U6PC9wPgotCi08c291cmNlPgotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFJPT1QgICAgICAgICAgICAgICAgICAgPSAwOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFRFWFQgICAgICAgICAgICAgICAgICAgPSAxOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFVOVVNFRCAgICAgICAgICAgICAgICAgPSAyOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEVMRU1FTlQgICAgICAgICAgICAgICAgPSAzOwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IEFUVFJJQlVURSAgICAgICAgICAgICAgPSA0OwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IFBST0NFU1NJTkdfSU5TVFJVQ1RJT04gPSA1OwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IENPTU1FTlQgICAgICAgICAgICAgICAgPSA2OwotICAgIHB1YmxpYyBmaW5hbCBzdGF0aWMgaW50IE5UWVBFUyAgICAgICAgICAgICAgICAgPSA3OwotPC9zb3VyY2U+Ci0KLSAgPHA+RWxlbWVudCBhbmQgYXR0cmlidXRlIG5vZGVzIHdpbGwgYmUgYXNzaWduZWQgdHlwZXMgYmFzZWQgb24gdGhlaXIgZXhwYW5kZWQKLSAgUU5hbWVzLiBUaGUgPGNvZGU+X3R5cGVbXTwvY29kZT4gYXJyYXkgaXMgdXNlZCBmb3IgdGhpczo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgaW50ICAgIHR5cGUgICAgICA9IF90eXBlW25vZGVdOyAgICAgICAgICAgICAvLyBnZXQgbm9kZSB0eXBlCi08L3NvdXJjZT4KLQotICA8cD5UaGUgbm9kZSB0eXBlIGNhbiBiZSB1c2VkIHRvIGxvb2sgdXAgdGhlIGVsZW1lbnQvYXR0cmlidXRlIG5hbWUgaW4gdGhlCi0gIGVsZW1lbnQvYXR0cmlidXRlIG5hbWUgYXJyYXkgPGNvZGU+X25hbWVzQXJyYXlbXTwvY29kZT46PC9wPgotCi08c291cmNlPgotICAgIFN0cmluZyBuYW1lICAgICAgPSBfbmFtZXNBcnJheVt0eXBlLU5UWVBFU107IC8vIGdldCBub2RlIGVsZW1lbnQgbmFtZQotPC9zb3VyY2U+Ci0KLSAgPHA+VGhlIHJlc3VsdGluZyBzdHJpbmcgY29udGFpbnMgdGhlIGZ1bGwsIGV4cGFuZGVkIFFOYW1lIG9mIHRoZSBlbGVtZW50IG9yCi0gIGF0dHJpYnV0ZS4gUmV0cmlldmluZyB0aGUgbmFtZXNwYWNlIFVSSSBvZiBhbiBlbGVtZW50L2F0dHJpYnV0ZSBpcyBkb25lIGluIGEKLSAgdmVyeSBzaW1pbGFyIGZhc2hpb246PC9wPgotCi08c291cmNlPgotICAgIGludCAgICBuc3R5cGUgICAgPSBfbmFtZXNwYWNlW3R5cGUtTlRZUEVTXTsgLy8gZ2V0IG5hbWVzcGFjZSB0eXBlCi0gICAgU3RyaW5nIG5hbWVzcGFjZSA9IF9uc05hbWVzQXJyYXlbbnN0eXBlXTsgICAvLyBnZXQgbm9kZSBuYW1lc3BhY2UgbmFtZQotPC9zb3VyY2U+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJlbGVtZW50LW5vZGVzIi8+Ci0gIDxzMyB0aXRsZT0iRWxlbWVudCBub2RlcyI+Ci0KLSAgPHA+VGhlIGNvbnRlbnRzIG9mIGFuIGVsZW1lbnQgbm9kZSAoY2hpbGQgbm9kZXMpIGNhbiBiZSBpZGVudGlmaWVkIHVzaW5nCi0gIHRoZSA8Y29kZT5fb2Zmc2V0T3JDaGlsZFtdPC9jb2RlPiBhbmQgPGNvZGU+X25leHRTaWJsaW5nW108L2NvZGU+IGFycmF5cy4gVGhlCi0gIDxjb2RlPl9vZmZzZXRPckNoaWxkW108L2NvZGU+IGFycmF5IHdpbGwgZ2l2ZSB5b3UgdGhlIGZpcnN0IGNoaWxkIG9mIGFuIGVsZW1lbnQKLSAgbm9kZTo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgaW50ICAgIGNoaWxkICAgICA9IF9vZmZzZXRPckNoaWxkW25vZGVdOyAgICAvLyBmaXJzdCBjaGlsZAotICAgIGNoaWxkID0gX25leHRTaWJsaW5nW2NoaWxkXTsgICAgICAgICAgICAgICAgLy8gbmV4dCBjaGlsZAotPC9zb3VyY2U+Ci0KLSAgPHA+VGhlIGxhc3QgY2hpbGQgd2lsbCBoYXZlIGEgJnF1b3Q7PGNvZGU+X25leHRTaWJsaW5nW108L2NvZGU+JnF1b3Q7IG9mIDAgKHplcm8pLgotICBUaGlzIHZhbHVlIGlzIE9LIHNpbmNlIHRoZSByb290IG5vZGUgKHRoZSAwIG5vZGUpIHdpbGwgbm90IGJlIGEgY2hpbGQgb2YKLSAgYW55IGVsZW1lbnQuPC9wPgotCi0gIDwvczM+PGFuY2hvciBuYW1lPSJhdHRyaWJ1dGUtbm9kZXMiLz4KLSAgPHMzIHRpdGxlPSJBdHRyaWJ1dGUgbm9kZXMiPgotCi0gIDxwPlRoZSBmaXJzdCBhdHRyaWJ1dGUgbm9kZSBvZiBhbiBlbGVtZW50IGlzIGZvdW5kIGJ5IGEgbG9va3VwIGluIHRoZQotICA8Y29kZT5fbGVuZ3RoT3JBdHRyW108L2NvZGU+IGFycmF5IHVzaW5nIHRoZSBub2RlIGluZGV4OjwvcD4KLQotPHNvdXJjZT4KLSAgICBpbnQgICAgYXR0cmlidXRlID0gX29mZnNldE9yQ2hpbGRbbm9kZV07ICAgIC8vIGZpcnN0IGF0dHJpYnV0ZQotICAgIGF0dHJpYnV0ZSA9IF9uZXh0U2libGluZ1thdHRyaWJ1dGVdOyAgICAgICAgLy8gbmV4dCBhdHRyaWJ1dGUKLTwvc291cmNlPgotCi0gIDxwPlRoZSBuYW1lcyBvZiBhdHRyaWJ1dGVzIGFyZSBjb250YWluZWQgaW4gdGhlIDxjb2RlPl9uYW1lc0FycmF5W108L2NvZGU+IGp1c3QKLSAgbGlrZSB0aGUgbmFtZXMgb2YgZWxlbWVudCBub2Rlcy4gVGhlIHZhbHVlIG9mIGF0dHJpYnV0ZXMgYXJlIHN0b3JlIHRoZSBzYW1lCi0gIHdheSBhcyB0ZXh0IG5vZGVzOjwvcD4KLQotPHNvdXJjZT4KLSAgICBpbnQgICAgb2Zmc2V0ICAgID0gX29mZnNldE9yQ2hpbGRbYXR0cmlidXRlXTsgLy8gb2Zmc2V0IGludG8gY2hhcmFjdGVyIGFycmF5Ci0gICAgaW50ICAgIGxlbmd0aCAgICA9IF9sZW5ndGhPckF0dHJbYXR0cmlidXRlXTsgIC8vIGxlbmd0aCBvZiBhdHRyaWJ1dGUgdmFsdWUKLSAgICBTdHJpbmcgdmFsdWUgICAgID0gbmV3IFN0cmluZyhfdGV4dCwgb2Zmc2V0LCBsZW5ndGgpOwotPC9zb3VyY2U+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJ0ZXh0LW5vZGVzIi8+Ci0gIDxzMyB0aXRsZT0iVGV4dCBub2RlcyI+Ci0KLSAgPHA+VGV4dCBub2RlcyBhcmUgc3RvcmVkIGlkZW50aWNhbGx5IHRvIGF0dHJpYnV0ZSB2YWx1ZXMuIFNlZSB0aGUgcHJldmlvdXMKLSAgc2VjdGlvbiBvbiA8bGluayBhbmNob3I9ImF0dHJpYnV0ZS1ub2RlcyI+YXR0cmlidXRlIG5vZGVzPC9saW5rPi48L3A+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJjb21tZW50LW5vZGVzIi8+Ci0gIDxzMyB0aXRsZT0iQ29tbWVudCBub2RlcyI+Ci0KLSAgPHA+VGhlIGludGVybmFsIERPTSBkb2VzIGN1cnJlbnRseSA8ZW0+bm90PC9lbT4gY29udGFpbiBjb21tZW50IG5vZGVzLiBZZXMsIEkKLSAgYW0gcXVpdGUgYXdhcmUgdGhhdCB0aGUgRE9NIGhhcyBhIHR5cGUgYXNzaWduZWQgdG8gY29tbWVudCBub2RlcywgYnV0IGNvbW1lbnRzCi0gIGFyZSBzdGlsbCBub3QgaW5zZXJ0ZWQgaW50byB0aGUgRE9NLjwvcD4KLSAgPC9zMz48YW5jaG9yIG5hbWU9InBpIi8+Ci0gIDxzMyB0aXRsZT0iUHJvY2Vzc2luZyBpbnN0cnVjdGlvbnMiPgotCi0gIDxwPlByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb25zIGFyZSBoYW5kbGVkIGFzIHRleHQgbm9kZXMuIFRoZXNlIG5vZGVzIGFyZSBzdG9yZWQKLSAgaWRlbnRpY2FsbHkgdG8gYXR0cmlidXRlIHZhbHVlcy4gU2VlIHRoZSBwcmV2aW91cyBzZWN0aW9uIG9uCi0gIDxsaW5rIGFuY2hvcj0iYXR0cmlidXRlLW5vZGVzIj5hdHRyaWJ1dGUgbm9kZXM8L2xpbms+LjwvcD4KLQotICA8L3MzPjwvczI+PGFuY2hvciBuYW1lPSJuYXZpZ2F0aW9uIi8+Ci0gIDxzMiB0aXRsZT0iVHJlZSBuYXZpZ2F0aW9uIj4KLQotICA8cD5UaGUgRE9NIGltcGxlbWVudGF0aW9uIGNvbnRhaW5zIGEgc2VyaWVzIG9mIGl0ZXJhdG9yIHRoYXQgaW1wbGVtZW50IHRoZQotICBYUGF0aCBheGlzLiBBbGwgdGhlc2UgaXRlcmF0b3JzIGltcGxlbWVudCB0aGUgTm9kZUl0ZXJhdG9yIGludGVyZmFjZSBhbmQKLSAgZXh0ZW5kIHRoZSBOb2RlSXRlcmF0b3JCYXNlIGJhc2UgY2xhc3MuIFRoZXNlIGl0ZXJhdG9ycyBkbyB0aGUgam9iIG9mCi0gIG5hdmlnYXRpbmcgdGhlIHRyZWUgdXNpbmcgdGhlIDxjb2RlPl9vZmZzZXRPckNoaWxkW108L2NvZGU+LCA8Y29kZT5fbmV4dFNpYmxpbmc8L2NvZGU+Ci0gIGFuZCA8Y29kZT5fcGFyZW50W108L2NvZGU+IGFycmF5cy4gQWxsIGl0ZXJhdG9ycyB0aGF0IGhhbmRsZXMgWFBhdGggYXhpcyBhcmUKLSAgaW1wbGVtZW50ZWQgYXMgYSBwcml2YXRlIGlubmVyIGNsYXNzIG9mIERPTUltcGwuIFRoZSB0cmFuc2xldCB1c2VzIGEgaGFuZGZ1bAotICBvZiBtZXRob2RzIHRvIGluc3RhbmNpYXRlIHRoZXNlIGl0ZXJhdG9yczo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgcHVibGljIE5vZGVJdGVyYXRvciBnZXRJdGVyYXRvcigpOwotICAgIHB1YmxpYyBOb2RlSXRlcmF0b3IgZ2V0Q2hpbGRyZW4oZmluYWwgaW50IG5vZGUpOwotICAgIHB1YmxpYyBOb2RlSXRlcmF0b3IgZ2V0VHlwZWRDaGlsZHJlbihmaW5hbCBpbnQgdHlwZSk7Ci0gICAgcHVibGljIE5vZGVJdGVyYXRvciBnZXRBeGlzSXRlcmF0b3IoZmluYWwgaW50IGF4aXMpOwotICAgIHB1YmxpYyBOb2RlSXRlcmF0b3IgZ2V0VHlwZWRBeGlzSXRlcmF0b3IoZmluYWwgaW50IGF4aXMsIGZpbmFsIGludCB0eXBlKTsKLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGdldE50aERlc2NlbmRhbnQoaW50IG5vZGUsIGludCBuKTsKLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yIGdldE5hbWVzcGFjZUF4aXNJdGVyYXRvcihmaW5hbCBpbnQgYXhpcywgZmluYWwgaW50IG5zKTsKLSAgICBwdWJsaWMgTm9kZUl0ZXJhdG9yIG9yZGVyTm9kZXMoTm9kZUl0ZXJhdG9yIHNvdXJjZSwgaW50IG5vZGUpOwotPC9zb3VyY2U+Ci0KLSAgPHA+VGhlcmUgYXJlIGEgZmV3IGl0ZXJhdG9ycyBpbiBhZGRpdGlvbiB0byB0aGVzZSwgc3VjaCBhcyBzb3J0aW5nL29yZGVyaW5nCi0gIGl0ZXJhdG9ycyBhbmQgZmlsdGVyaW5nIGl0ZXJhdG9ycy4gVGhlc2UgaXRlcmF0b3JzIGFyZSBpbXBsZW1lbnRlZCBpbgotICBzZXBhcmF0ZSBjbGFzc2VzIGFuZCBjYW4gYmUgaW5zdGFuY2lhdGVkIGRpcmVjdGx5IGJ5IHRoZSB0cmFuc2xldC48L3A+Ci0KLSAgPC9zMj48YW5jaG9yIG5hbWU9Im5hbWVzcGFjZXMiLz4KLSAgPHMyIHRpdGxlPSJOYW1lc3BhY2VzIj4KLQotICA8cD5OYW1lc3BhY2Ugc3VwcG9ydCB3YXMgYWRkZWQgdG8gdGhlIGludGVybmFsIERPTSBhdCBhIGxhdGUgc3RhZ2UsIGFuZCB0aGUKLSAgZGVzaWduIGFuZCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgRE9NIGJlYXJzIGEgZmV3IHNjYXJzIGJlY2F1c2Ugb2YgdGhpcy4gCi0gIFRoZXJlIGlzIGEgc2VwYXJhdGUgPGxpbmsgaWRyZWY9InhzbHRjX25hbWVzcGFjZSI+ZGVzaWduCi0gIGRvY3VtZW50PC9saW5rPiB0aGF0IGNvdmVycyBuYW1lc3BhY2VzLjwvcD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0idzNjIi8+Ci0gIDxzMiB0aXRsZT0iVzNDIERPTTIgbmF2aWdhdGlvbiBzdXBwb3J0Ij4KLQotICA8cD5UaGUgRE9NIGhhcyBhIGZldyBtZXRob2RzIHRoYXQgZ2l2ZSBiYXNpYyBXM0MtdHlwZSBET00gbmF2aWdhdGlvbi4gVGhlc2UKLSAgbWV0aG9kcyBhcmU6PC9wPgotCi08c291cmNlPgotICAgIHB1YmxpYyBOb2RlIG1ha2VOb2RlKGludCBpbmRleCk7Ci0gICAgcHVibGljIE5vZGUgbWFrZU5vZGUoTm9kZUl0ZXJhdG9yIGl0ZXIpOwotICAgIHB1YmxpYyBOb2RlTGlzdCBtYWtlTm9kZUxpc3QoaW50IGluZGV4KTsKLSAgICBwdWJsaWMgTm9kZUxpc3QgbWFrZU5vZGVMaXN0KE5vZGVJdGVyYXRvciBpdGVyKTsKLTwvc291cmNlPgotCi0gIDxwPlRoZXNlIG1ldGhvZHMgcmV0dXJuIGluc3RhbmNlcyBvZiBpbm5lciBjbGFzc2VzIG9mIHRoZSBET00gdGhhdCBpbXBsZW1lbnQKLSAgdGhlIFczQyBOb2RlIGFuZCBOb2RlTGlzdCBpbnRlcmZhY2VzLjwvcD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0iYWRhcHRlciIvPgotICA8czIgdGl0bGU9IlRoZSBET00gYWRhcHRlciAtIERPTUFkYXB0ZXIiPgotICA8dWw+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNsZXQtZG9tIj5UcmFuc2xldC9ET00gdHlwZSBtYXBwaW5nPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0id2hpdGVzcGFjZSI+V2hpdGVzcGFjZSB0ZXh0LW5vZGUgc3RyaXBwaW5nPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ibWV0aG9kLW1hcHBpbmciPk1ldGhvZCBtYXBwaW5nPC9saW5rPjwvbGk+Ci0gIDwvdWw+Ci0gIDxhbmNob3IgbmFtZT0idHJhbnNsZXQtZG9tIi8+Ci0gIDxzMyB0aXRsZT0iVHJhbnNsZXQvRE9NIHR5cGUgbWFwcGluZyI+Ci0KLSAgPHA+VGhlIERPTUFkYXB0ZXIgY2xhc3MgcGVyZm9ybXMgdGhlIG1hcHBpbmdzIGJldHdlZW4gRE9NIGFuZCB0cmFuc2xldCBub2RlCi0gIHR5cGVzLCBhbmQgdmljZSB2ZXJzYS4gVGhlc2UgbWFwcGluZ3MgYXJlIG5lY2Vzc2FyeSBpbiBvcmRlciBmb3IgdGhlIHRyYW5zbGV0Ci0gIHRvIGNvcnJlY3RseSBpZGVudGlmeSBhbiBlbGVtZW50L2F0dHJpYnV0ZSBpbiB0aGUgRE9NIGFuZCBmb3IgdGhlIERPTSB0bwotICBjb3JyZWN0bHkgaWRlbnRpZnkgdGhlIGVsZW1lbnQvYXR0cmlidXRlIHR5cGUgb2YgYSB0eXBlZCBpdGVyYXRvciByZXF1ZXN0ZWQKLSAgYnkgdGhlIHRyYW5zbGV0LiBOb3RlIHRoYXQgdGhlIERPTUFkYXB0ZXIgYWxzbyBtYXBzIHRyYW5zbGV0IG5hbWVzcGFjZSB0eXBlcwotICB0byBET00gbmFtZXNwYWNlIHR5cGVzLCBhbmQgdmljZSB2ZXJzYS48L3A+Ci0KLSAgPHA+VGhlIERPTUFkYXB0ZXIgY2xhc3MgaGFzIGZvdXIgZ2xvYmFsIHRhYmxlcyB0aGF0IGhvbGQgdGhlIHRyYW5zbGV0L0RPTQotICB0eXBlIGFuZCBuYW1lc3BhY2UtdHlwZSBtYXBwaW5ncy4gSWYgdGhlIERPTSBrbm93cyBhbiBlbGVtZW50IGFzIHR5cGUKLSAgMTksIHRoZSBET01BZGFwdGVyIHdpbGwgdHJhbnNsYXRlIHRoaXMgdG8gc29tZSBvdGhlciBpbnRlZ2VyIHVzaW5nIHRoZQotICA8Y29kZT5fbWFwcGluZ1tdPC9jb2RlPiBhcnJheTo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgaW50IGRvbVR5cGUgPSBfbWFwcGluZ1t0cmFuc2xldFR5cGVdOwotPC9zb3VyY2U+Ci0KLSAgPHA+VGhpcyBhY3Rpb24gd2lsbCBiZSBwZXJmb3JtZWQgd2hlbiB0aGUgRE9NIGFza3Mgd2hhdCB0eXBlIGEgc3BlY2lmaWMgbm9kZQotICBpcy4gVGhlIHJldmVyc2UgaXMgZG9uZSB0aGVuIHRoZSB0cmFuc2xldCB3YW50cyBhbiBpdGVyYXRvciBmb3IgYSBzcGVjaWZpYwotICBub2RlIHR5cGUuIFRoZSBET01BZGFwdGVyIG11c3QgdHJhbnNsYXRlIHRoZSB0cmFuc2xldC10eXBlIHRvIHRoZSB0eXBlIHVzZWQKLSAgaW50ZXJuYWxseSBpbiB0aGUgRE9NIGJ5IGxvb2tpbmcgdXAgdGhlIDxjb2RlPl9yZXZlcnNlW108L2NvZGU+IGFycmF5OjwvcD4KLQotPHNvdXJjZT4KLSAgICBpbnQgdHJhbnNsZXRUeXBlID0gX21hcHBpbmdbZG9tVHlwZV07Ci08L3NvdXJjZT4KLQotICA8cD5UaGVyZSBhcmUgdHdvIGFkZGl0aW9uYWwgbWFwcGluZyB0YWJsZXM6IDxjb2RlPl9OU21hcHBpbmdbXTwvY29kZT4gYW5kCi0gIDxjb2RlPl9OU3JldmVyc2VbXTwvY29kZT4gdGhhdCBkbyB0aGUgc2FtZSBmb3IgbmFtZXNwYWNlIHR5cGVzLjwvcD4KLSAgPC9zMz48YW5jaG9yIG5hbWU9IndoaXRlc3BhY2UiLz4KLSAgPHMzIHRpdGxlPSJXaGl0ZXNwYWNlIHRleHQtbm9kZSBzdHJpcHBpbmciPgotCi0gIDxwPlRoZSBET01BZGFwdGVyIGNsYXNzIGhhcyB0aGUgYWRkaXRpb25hbCBmdW5jdGlvbiBvZiBzdHJpcHBpbmcgd2hpdGVzcGFjZQotICBub2RlcyBpbiB0aGUgRE9NLiBUaGlzIGZ1bmN0aW9uYWxpdHkgaGFkIHRvIGJlIHB1dCBpbiB0aGUgRE9NQWRhcHRlciwgYXMKLSAgZGlmZmVyZW50IHRyYW5zbGV0cyB3aWxsIGhhdmUgZGlmZmVyZW50IHByZWZlcmVuY2VzIGZvciBub2RlIHN0cmlwcGluZy48L3A+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJtZXRob2QtbWFwcGluZyIvPgotICA8czMgdGl0bGU9Ik1ldGhvZCBtYXBwaW5nIj4KLQotICA8cD5UaGUgRE9NQWRhcHRlciBjbGFzcyBpbXBsZW1lbnRzIHRoZSBzYW1lIDxjb2RlPkRPTTwvY29kZT4gaW50ZXJmYWNlIGFzIHRoZQotICBET01JbXBsIGNsYXNzLiBBIERPTUFkYXB0ZXIgb2JqZWN0IHdpbGwgbG9vayBsaWtlIGEgRE9NSW1wbCB0cmVlLCBidXQgdGhlCi0gIHRyYW5zbGV0IGNhbiBhY2Nlc3MgaXQgZGlyZWN0bHkgd2l0aG91dCBiZWluZyBjb25jZXJuZWQgd2l0aCB0eXBlIG1hcHBpbmcKLSAgYW5kIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLiBUaGUgPGNvZGU+Z2V0VHlwZWRDaGlsZHJlbigpPC9jb2RlPiBkZW1vbnN0cmF0ZXMgdmVyeQotICB3ZWxsIGhvdyB0aGlzIGlzIGRvbmU6PC9wPgotCi08c291cmNlPgotICAgIHB1YmxpYyBOb2RlSXRlcmF0b3IgZ2V0VHlwZWRDaGlsZHJlbihpbnQgdHlwZSkgewotICAgICAgICAvLyBHZXQgdGhlIERPTSB0eXBlIGZvciB0aGUgcmVxdWVzdGVkIHR5cGVkIGl0ZXJhdG9yCi0gICAgICAgIGZpbmFsIGludCBkb21UeXBlID0gX3JldmVyc2VbdHlwZV07Ci0gICAgICAgIC8vIE5vdyBnZXQgdGhlIHR5cGVkIGNoaWxkIGl0ZXJhdG9yIGZyb20gdGhlIERPTUltcGwgb2JqZWN0Ci0gICAgICAgIE5vZGVJdGVyYXRvciBpdGVyYXRvciA9IF9kb21JbXBsLmdldFR5cGVkQ2hpbGRyZW4oZG9tVHlwZSk7Ci0gICAgICAgIC8vIFdyYXAgdGhlIGl0ZXJhdG9yIGluIGEgV1Mgc3RyaXBwaW5nIGl0ZXJhdG9yIGlmIGNoaWxkLW5vZGVzIGFyZSB0ZXh0IG5vZGVzCi0JaWYgKChkb21UeXBlID09IERPTS5URVhUKSAmYW1wOyZhbXA7IChfZmlsdGVyICE9IG51bGwpKQotCSAgICBpdGVyYXRvciA9IF9kb21JbXBsLnN0cmlwcGluZ0l0ZXJhdG9yKGl0ZXJhdG9yLF9tYXBwaW5nLF9maWx0ZXIpOwotCXJldHVybihpdGVyYXRvcik7Ci0gICAgfQotPC9zb3VyY2U+Ci0KLSAgPC9zMz48L3MyPjxhbmNob3IgbmFtZT0ibXVsdGlwbGV4ZXIiLz4KLSAgPHMyIHRpdGxlPSJUaGUgRE9NIG11bHRpcGxleGVyIC0gTXVsdGlET00iPgotCi0gIDxwPlRoZSBET00gbXVsdGlwbGV4ZXIgY2xhc3MgaXMgb25seSB1c2VkIHdoZW4gdGhlIGNvbXBpbGVkIHN0eWxlc2hlZXQgdXNlcwotICB0aGUgPGNvZGU+ZG9jdW1lbnQoKTwvY29kZT4gZnVuY3Rpb24uIEFuIGluc3RhbmNlIG9mIHRoZSBNdWx0aURPTSBjbGFzcyBhbHNvCi0gIGltcGxlbWVudHMgdGhlIERPTSBpbnRlcmZhY2UsIHNvIHRoYXQgaXQgY2FuIGJlIGFjY2Vzc2VkIGluIHRoZSBzYW1lIHdheQotICBhcyBhIERPTUFkYXB0ZXIgb2JqZWN0LjwvcD4KLQotICA8cD5BIG5vZGUgaW4gdGhlIERPTSBpcyBpZGVudGlmaWVkIGJ5IGFuIGludGVnZXIuIFRoZSBmaXJzdCA4IGJpdHMgb2YgdGhpcwotICBpbnRlZ2VyIGFyZSB1c2VkIHRvIGlkZW50aWZ5IHRoZSBET00gaW4gd2hpY2ggdGhlIG5vZGUgYmVsb25ncywgd2hpbGUgdGhlCi0gIGxvd2VyIDI0IGJpdHMgYXJlIHVzZWQgdG8gaWRlbnRpZnkgdGhlIG5vZGUgd2l0aGluIHRoZSBET006PC9wPgotICAgIDx0YWJsZT4KLSAgICAgIDx0cj4KLSAgICAgICAgPHRkPjMxLTI0PC90ZD4KLSAgICAgICAgPHRkPjIzLTE2PC90ZD4KLSAgICAgICAgPHRkPjE2LTg8L3RkPgotICAgICAgICA8dGQ+Ny0wPC90ZD4KLSAgICAgIDwvdHI+Ci0gICAgICA8dHI+Ci0gICAgICAgIDx0ZD5ET00gaWQ8L3RkPgotICAgICAgICA8dGQgY29sc3Bhbj0iMyI+bm9kZSBpZDwvdGQ+Ci0gICAgICA8L3RyPgotICAgIDwvdGFibGU+Ci0KLSAgPHA+VGhlIERPTSBtdWx0aXBsZXhlciBoYXMgYW4gYXJyYXkgb2YgRE9NQWRhcHRlciBvYmplY3RzLiBUaGUgdG9wbW9zdCA4Ci0gIGJpdHMgb2YgdGhlIGlkZW50aWZpZXIgaXMgdXNlZCB0byBmaW5kIHRoZSBjb3JyZWN0IERPTSBmcm9tIHRoZSBhcnJheS4gVGhlbgotICB0aGUgbG93ZXIgMjQgYml0cyBhcmUgdXNlZCBpbiBjYWxscyB0byBtZXRob2RzIGluIHRoZSBET01BZGFwdGVyIG9iamVjdDo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgcHVibGljIGludCBnZXRQYXJlbnQoaW50IG5vZGUpIHsKLQlyZXR1cm4gX2FkYXB0ZXJzW25vZGU+Pj4yNF0uZ2V0UGFyZW50KG5vZGUgJmFtcDsgMHgwMGZmZmZmZikgfCBub2RlICZhbXA7IDB4ZmYwMDAwMDA7Ci0gICAgfQotPC9zb3VyY2U+Ci0KLSAgPHA+Tm90ZSB0aGF0IHRoZSBub2RlIGlkZW50aWZpZXIgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaGFzIHRoZSBzYW1lIHVwcGVyIDgKLSAgYml0cyBhcyB0aGUgaW5wdXQgbm9kZS4gVGhpcyBpcyB3aHkgd2UgPGNvZGU+T1I8L2NvZGU+IHRoZSByZXN1bHQgZnJvbQotICA8Y29kZT5ET01BZGFwdGVyLmdldFBhcmVudCgpPC9jb2RlPiB3aXRoIHRoZSB0b3AgOCBiaXRzIG9mIHRoZSBpbnB1dCBub2RlLjwvcD4KLQotICA8L3MyPjxhbmNob3IgbmFtZT0iYnVpbGRlciIvPgotICA8czIgdGl0bGU9IlRoZSBET00gYnVpbGRlciAtIERPTUltcGwkRE9NQnVpbGRlciI+Ci0gIDx1bD4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJzdGFydGVsZW1lbnQiPnN0YXJ0RWxlbWVudCgpPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0iZW5kZWxlbWVudCI+ZW5kRWxlbWVudCgpPC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ic3RhcnRwcmVmaXhtYXBwaW5nIj5zdGFydFByZWZpeE1hcHBpbmcoKTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImVuZHByZWZpeG1hcHBpbmciPmVuZFByZWZpeE1hcHBpbmcoKTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImNoYXJhY3RlcnMiPmNoYXJhY3RlcnMoKTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9InN0YXJ0ZG9jdW1lbnQiPnN0YXJ0RG9jdW1lbnQoKTwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9ImVuZGRvY3VtZW50Ij5lbmREb2N1bWVudCgpPC9saW5rPjwvbGk+Ci0gIDwvdWw+Ci0KLSAgPHA+VGhlIERPTSBidWlsZGVyIGlzIGFuIGlubmVyIGNsYXNzIG9mIHRoZSBET00gaW1wbGVtZW50YXRpb24uIFRoZSBidWlsZGVyCi0gIGltcGxlbWVudHMgdGhlIFNBWDIgPGNvZGU+Q29udGVudEhhbmRsZXI8L2NvZGU+IGludGVyZmFjZSBhbmQgcG9wdWxhdGVzIHRoZSBET00KLSAgYnkgcmVjZWl2aW5nIFNBWDIgZXZlbnRzIGZyb20gYSBTQVgyIHBhcnNlciAocHJlc2VudGx5IHhlcmNlcykuIEFuIGluc3RhbmNlCi0gIG9mIHRoZSBET00gYnVpbGRlciBjbGFzcyBjYW4gYmUgcmV0cmlldmVkIGZyb20gPGNvZGU+RE9NSW1wbC5nZXRCdWlsZGVyKCk8L2NvZGU+Ci0gIG1ldGhvZCwgYW5kIHRoaXMgaGFuZGxlciBjYW4gYmUgc2V0IGFzIGFuIFhNTFJlYWRlcidzIGNvbnRlbnQgaGFuZGxlcjo8L3A+Ci0KLTxzb3VyY2U+Ci0gICAgZmluYWwgU0FYUGFyc2VyRmFjdG9yeSBmYWN0b3J5ID0gU0FYUGFyc2VyRmFjdG9yeS5uZXdJbnN0YW5jZSgpOwotICAgIGZpbmFsIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgIGZpbmFsIFhNTFJlYWRlciByZWFkZXIgPSBwYXJzZXIuZ2V0WE1MUmVhZGVyKCk7Ci0gICAgZmluYWwgRE9NSW1wbCBkb20gPSBuZXcgRE9NSW1wbCgpOwotICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihkb20uZ2V0QnVpbGRlcigpKTsKLTwvc291cmNlPgotCi0gIDxwPlRoZSBET00gYnVpbGRlciB3aWxsIHN0YXJ0IHRvIHBvcHVsYXRlIHRoZSBET00gb25jZSB0aGUgWE1MIHBhcnNlciBzdGFydHMKLSAgZ2VuZXJhdGluZyBTQVgyIGV2ZW50czo8L3A+Ci0gIDxhbmNob3IgbmFtZT0ic3RhcnRlbGVtZW50Ii8+Ci0gIDxzMyB0aXRsZT0ic3RhcnRFbGVtZW50KCkiPgotCi0gIDxwPlRoaXMgbWV0aG9kIGNhbiBiZSBjYWxsZWQgaW4gb25lIG9mIHR3byB3YXlzOyBlaXRoZXIgd2l0aCB0aGUgZXhwYW5kZWQKLSAgUU5hbWUgKHRoZSBlbGVtZW50J3Mgc2VwYXJhdGUgdXJpIGFuZCBsb2NhbCBuYW1lIGFyZSBzdXBwbGllZCkgb3IgYXMgYQotICBub3JtYWwgUU5hbWUgKG9uZSBTdHJpbmcgb24gdGhlIGZvcm1hdCBwcmVmaXg6bG9jYWwtbmFtZSkuIFRoZSBET00gc3RvcmVzCi0gIGVsZW1lbnRzIGFzIGV4cGFuZGVkIFFOYW1lcyBzbyBpdCBuZWVkcyB0byBrbm93IHRoZSBlbGVtZW50J3MgbmFtZXNwYWNlIFVSSS4KLSAgU2luY2UgdGhlIFVSSSBpcyBub3Qgc3VwcGxpZWQgd2l0aCB0aGlzIGNhbGwsIHdlIGhhdmUgdG8ga2VlcCB0cmFjayBvZgotICBuYW1lc3BhY2UgcHJlZml4L3VyaSBtYXBwaW5ncyB3aGlsZSB3ZSdyZSBidWlsZGluZyB0aGUgRE9NLiBTZWUgCi0gIDxjb2RlPjxsaW5rIGFuY2hvcj0ic3RhcnRwcmVmaXhtYXBwaW5nIj5zdGFydFByZWZpeE1hcHBpbmcoKTwvbGluaz48L2NvZGU+IGJlbG93IGZvciBkZXRhaWxzIG9uCi0gIG5hbWVzcGFjZSBoYW5kbGluZy48L3A+Ci0KLSAgPHA+VGhlIDxjb2RlPnN0YXJ0RWxlbWVudCgpPC9jb2RlPiBpbnNlcnRzIHRoZSBlbGVtZW50IGFzIGEgY2hpbGQgb2YgdGhlIGN1cnJlbnQKLSAgcGFyZW50IGVsZW1lbnQsIGNyZWF0ZXMgYXR0cmlidXRlIG5vZGVzIGZvciBhbGwgYXR0cmlidXRlcyBpbiB0aGUgc3VwcGxpZWQKLSAgJnF1b3Q7PGNvZGU+QXR0cmlidXRlczwvY29kZT4mcXVvdDsgYXR0cmlidXRlIGxpc3QgKGJ5IGEgc2VyaWVzIG9mIGNhbGxzIHRvCi0gIDxjb2RlPm1ha2VBdHRyaWJ1dGVOb2RlKCk8L2NvZGU+KSwgYW5kIGZpbmFsbHkgY3JlYXRlcyB0aGUgYWN0dWFsIGVsZW1lbnQgbm9kZQotICAoYnkgY2FsbGluZyA8Y29kZT5pbnRlcm5FbGVtZW50KCk8L2NvZGU+LCB3aGljaCBpbnNlcnRzIGEgbmV3IGVudHJ5IGluIHRoZQotICA8Y29kZT5fdHlwZVtdPC9jb2RlPiBhcnJheSkuPC9wPgotICA8L3MzPjxhbmNob3IgbmFtZT0iZW5kZWxlbWVudCIvPgotICA8czMgdGl0bGU9ImVuZEVsZW1lbnQoKSI+Ci0KLSAgPHA+VGhpcyBtZXRob2QgZG9lcyBzb21lIGNsZWFudXAgYWZ0ZXIgdGhlIDxjb2RlPnN0YXJ0RWxlbWVudCgpPC9jb2RlPiBtZXRob2QsCi0gIHN1Y2ggYXMgcmV2ZXJpbmcgPGNvZGU+eG1sOnNwYWNlPC9jb2RlPiBzZXR0aW5ncyBhbmQgbGlua2luZyB0aGUgZWxlbWVudCdzCi0gIGNoaWxkIG5vZGVzLjwvcD4KLSAgPC9zMz48YW5jaG9yIG5hbWU9InN0YXJ0cHJlZml4bWFwcGluZyIvPgotICA8czMgdGl0bGU9InN0YXJ0UHJlZml4TWFwcGluZygpIj4KLQotICA8cD5UaGlzIG1ldGhvZCBpcyBjYWxsZWQgZm9yIGVhY2ggbmFtZXNwYWNlIGRlY2xhcmF0aW9uIGluIHRoZSBzb3VyY2UKLSAgZG9jdW1lbnQuIFRoZSBwYXJzZXIgc2hvdWxkIGNhbGwgdGhpcyBtZXRob2QgYmVmb3JlIHRoZSBwcmVmaXggaXMgcmVmZXJlbmNlZAotICBpbiBhIFFOYW1lIHRoYXQgaXMgcGFzc2VkIHRvIHRoZSA8Y29kZT5zdGFydEVsZW1lbnQoKTwvY29kZT4gY2FsbC4gTmFtZXNwYWNlCi0gIHByZWZpeC91cmkgbWFwcGluZ3MgYXJlIHN0b3JlZCBpbiBhIEhhc2h0YWJsZSBzdHJ1Y3R1cmUuIE5hbWVzcGFjZSBwcmVmaXhlcwotICBhcmUgdXNlZCBhcyB0aGUga2V5cyBpbiB0aGUgSGFzaHRhYmxlLCBhbmQgZWFjaCBrZXkgbWFwcyB0byBhIFN0YWNrIHRoYXQKLSAgY29udGFpbnMgdGhlIHZhcmlvdXMgVVJJcyB0aGF0IHRoZSBwcmVmaXggbWFwcyB0by4gVGhlIFVSSSBvbiB0b3Agb2YgdGhlCi0gIHN0YWNrIGlzIHRoZSBVUkkgdGhhdCB0aGUgcHJlZml4IGN1cnJlbnRseSBtYXBzIHRvLjwvcD4KLQotICAKLSAgICA8cD48aW1nIHNyYz0ibmFtZXNwYWNlX3N0YWNrLmdpZiIgYWx0PSJuYW1lc3BhY2Vfc3RhY2suZ2lmIi8+PC9wPgotICAgIDxwPjxyZWY+RmlndXJlIDI6IE5hbWVzcGFjZSBoYW5kbGluZyBpbiB0aGUgRE9NIGJ1aWxkZXI8L3JlZj48L3A+Ci0KLQotICA8cD5FYWNoIGNhbGwgdG8gPGNvZGU+c3RhcnRQcmVmaXhNYXBwaW5nKCk8L2NvZGU+IHJlc3VsdHMgaW4gYSBsb29rdXAgaW4gdGhlCi0gIEhhc2h0YWJsZSAodXNpbmcgdGhlIHByZWZpeCksIGFuZCBhIDxjb2RlPnB1c2goKTwvY29kZT4gb2YgdGhlIFVSSSBvbnRvIHRoZQotICBTdGFjayB0aGF0IHRoZSBwcmVmaXggbWFwcyB0by48L3A+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJlbmRwcmVmaXhtYXBwaW5nIi8+Ci0gIDxzMyB0aXRsZT0iZW5kUHJlZml4TWFwcGluZygpIj4KLQotICA8cD5BIG5hbWVzcGFjZSBwcmVmaXgvdXJpIG1hcHBpbmcgaXMgY2xvc2VkIGJ5IGxvY2F0aW5nIHRoZSBTdGFjayBmb3IgdGhlCi0gIHByZWZpeCwgYW5kIHRoZW4gPGNvZGU+cG9wKCk8L2NvZGU+J2luZyB0aGUgdG9wbW9zdCBVUkkgb2ZmIHRoaXMgU3RhY2suPC9wPgotICA8L3MzPjxhbmNob3IgbmFtZT0iY2hhcmFjdGVycyIvPgotICA8czMgdGl0bGU9ImNoYXJhY3RlcnMoKSI+Ci0KLSAgPHA+VGV4dCBub2RlcyBhcmUgc3RvcmVkIGFzIHNpbXBsZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIGluIHRoZSBjaGFyYWN0ZXIgYXJyYXkKLSAgPGNvZGU+X3RleHRbXTwvY29kZT4uIFRoZSBzdGFydCBhbmQgbGVuZ2h0IG9mIGEgbm9kZSdzIHRleHQgY2FuIGJlIGRldGVybWluZWQgYnkKLSAgdXNpbmcgdGhlIG5vZGUgaW5kZXggdG8gbG9vayB1cCA8Y29kZT5fb2Zmc2V0T3JDaGlsZFtdPC9jb2RlPiBhbmQKLSAgPGNvZGU+X2xlbmd0aE9yQXR0cmlidXRlW108L2NvZGU+LjwvcD4KLQotICA8cD5XZSB3YW50IHRvIHJlLXVzZSBjaGFyYWN0ZXIgc2VxdWVuY2VzIGlmIHR3byBvciBtb3JlIHRleHQgbm9kZXMgaGF2ZQotICBpZGVudGljYWwgY29udGVudC4gVGhpcyBjYW4gYmUgYWNoaWV2ZWQgYnkgaGF2aW5nIHR3byBkaWZmZXJlbnQgdGV4dCBub2RlCi0gIGluZGV4ZXMgbWFwIHRvIHRoZSBzYW1lIGNoYXJhY3RlciBzZXF1ZW5jZS4gVGhlIDxjb2RlPm1heWJlUmV1c2VUZXh0KCk8L2NvZGU+Ci0gIG1ldGhvZCBpcyBhbHdheXMgY2FsbGVkIGJlZm9yZSBhIG5ldyBjaGFyYWN0ZXIgc3RyaW5nIGlzIHN0b3JlZCBpbiB0aGUKLSAgPGNvZGU+X3RleHRbXTwvY29kZT4gYXJyYXkuIFRoaXMgbWV0aG9kIHdpbGwgbG9jYXRlIHRoZSBvZmZzZXQgb2YgYW4gZXhpc3RpbmcKLSAgaW5zdGFuY2Ugb2YgYSBjaGFyYWN0ZXIgc2VxdWVuY2UuPC9wPgotICA8L3MzPjxhbmNob3IgbmFtZT0ic3RhcnRkb2N1bWVudCIvPgotICA8czMgdGl0bGU9InN0YXJ0RG9jdW1lbnQoKSI+Ci0KLSAgPHA+VGhpcyBtZXRob2QgaW5pdGlhbGlzZXMgYSBidW5jaCBvZiBkYXRhIHN0cnVjdHVyZXMgdGhhdCBhcmUgdXNlZCBieSB0aGUKLSAgYnVpbGRlci4gSXQgYWxzbyBwdXNoZXMgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIG9uIHRoZSBuYW1lc3BhY2Ugc3RhY2sgKHNvIHRoYXQKLSAgdGhlICZxdW90OyZxdW90OyBwcmVmaXggbWFwcyB0byB0aGUgPGNvZGU+bnVsbDwvY29kZT4gbmFtZXNwYWNlKS48L3A+Ci0gIDwvczM+PGFuY2hvciBuYW1lPSJlbmRkb2N1bWVudCIvPgotICA8czMgdGl0bGU9ImVuZERvY3VtZW50KCkiPgotCi0gIDxwPlRoaXMgbWV0aG9kIGJ1aWxkcyB0aGUgPGNvZGU+X25hbWVzQXJyYXlbXTwvY29kZT4sIDxjb2RlPl9uYW1lc3BhY2VbXTwvY29kZT4KLSAgYW5kIDxjb2RlPl9uc05hbWVzQXJyYXlbXTwvY29kZT4gc3RydWN0dXJlcyBmcm9tIHRlbXBvcmFyeSBkYXRhc3RydWN0dXJlcyB1c2VkCi0gIGluIHRoZSBET00gYnVpbGRlci48L3A+Ci0KLSAgIDwvczM+Ci0gPC9zMj4KLTwvczE+ICAgClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y19uYW1lc3BhY2UueG1sIGIveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y19uYW1lc3BhY2UueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWFiMzIzLi4wMDAwMDAwCi0tLSBhL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdGNfbmFtZXNwYWNlLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDYwNiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IS0tIAotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDIwMDEgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cwotICogcmVzZXJ2ZWQuCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMKLSAqIGFyZSBtZXQ6Ci0gKgotICogMS4gUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqICAgIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqCi0gKiAyLiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyIGluCi0gKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiAgICBkaXN0cmlidXRpb24uCi0gKgotICogMy4gVGhlIGVuZC11c2VyIGRvY3VtZW50YXRpb24gaW5jbHVkZWQgd2l0aCB0aGUgcmVkaXN0cmlidXRpb24sCi0gKiAgICBpZiBhbnksIG11c3QgaW5jbHVkZSB0aGUgZm9sbG93aW5nIGFja25vd2xlZGdtZW50OgotICogICAgICAgIlRoaXMgcHJvZHVjdCBpbmNsdWRlcyBzb2Z0d2FyZSBkZXZlbG9wZWQgYnkgdGhlCi0gKiAgICAgICAgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24gKGh0dHA6Ly93d3cuYXBhY2hlLm9yZy8pLiIKLSAqICAgIEFsdGVybmF0ZWx5LCB0aGlzIGFja25vd2xlZGdtZW50IG1heSBhcHBlYXIgaW4gdGhlIHNvZnR3YXJlIGl0c2VsZiwKLSAqICAgIGlmIGFuZCB3aGVyZXZlciBzdWNoIHRoaXJkLXBhcnR5IGFja25vd2xlZGdtZW50cyBub3JtYWxseSBhcHBlYXIuCi0gKgotICogNC4gVGhlIG5hbWVzICJYYWxhbiIgYW5kICJBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiIgbXVzdAotICogICAgbm90IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzCi0gKiAgICBzb2Z0d2FyZSB3aXRob3V0IHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4gRm9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24sIHBsZWFzZSBjb250YWN0IGFwYWNoZUBhcGFjaGUub3JnLgotICoKLSAqIDUuIFByb2R1Y3RzIGRlcml2ZWQgZnJvbSB0aGlzIHNvZnR3YXJlIG1heSBub3QgYmUgY2FsbGVkICJBcGFjaGUiLAotICogICAgbm9yIG1heSAiQXBhY2hlIiBhcHBlYXIgaW4gdGhlaXIgbmFtZSwgd2l0aG91dCBwcmlvciB3cml0dGVuCi0gKiAgICBwZXJtaXNzaW9uIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIGBgQVMgSVMnJyBBTkQgQU5ZIEVYUFJFU1NFRCBPUiBJTVBMSUVECi0gKiBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUwotICogT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUKLSAqIERJU0NMQUlNRUQuICBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQVBBQ0hFIFNPRlRXQVJFIEZPVU5EQVRJT04gT1IKLSAqIElUUyBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YKLSAqIFVTRSwgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQKLSAqIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLAotICogT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUCi0gKiBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YKLSAqIFNVQ0ggREFNQUdFLgotICogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAqCi0gKiBUaGlzIHNvZnR3YXJlIGNvbnNpc3RzIG9mIHZvbHVudGFyeSBjb250cmlidXRpb25zIG1hZGUgYnkgbWFueQotICogaW5kaXZpZHVhbHMgb24gYmVoYWxmIG9mIHRoZSBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiBhbmQgd2FzCi0gKiBvcmlnaW5hbGx5IGJhc2VkIG9uIHNvZnR3YXJlIGNvcHlyaWdodCAoYykgMjAwMSwgU3VuCi0gKiBNaWNyb3N5c3RlbXMuLCBodHRwOi8vd3d3LnN1bi5jb20uICBGb3IgbW9yZQotICogaW5mb3JtYXRpb24gb24gdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBwbGVhc2Ugc2VlCi0gKiA8aHR0cDovL3d3dy5hcGFjaGUub3JnLz4uCi0gLS0+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLSAgPHMxIHRpdGxlPSJYU0xUQyBhbmQgTmFtZXNwYWNlcyI+Ci0gIDx1bD4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJmdW5jdGlvbmFsaXR5Ij5GdW5jdGlvbmFsaXR5PC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0ib3ZlcnZpZXciPk5hbWVzcGFjZSBvdmVydmlldzwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9Ik5TQSI+VGhlIERPTSAmYW1wOyBuYW1lc3BhY2VzPC9saW5rPjwvbGk+ICAgIAotICAgIDxsaT48bGluayBhbmNob3I9Ik5TQiI+TmFtZXNwYWNlcyBpbiB0aGUgWFNMIHN0eWxlc2hlZXQ8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJOU0MiPk5hbWVzcGFjZXMgaW4gdGhlIG91dHB1dCBkb2N1bWVudDwvbGluaz48L2xpPgotICA8L3VsPgotICA8YW5jaG9yIG5hbWU9ImZ1bmN0aW9uYWxpdHkiLz4KLSAgPHMyIHRpdGxlPSJGdW5jdGlvbmFsaXR5Ij4KLQotICAgIDxwPk5hbWVzcGFjZXMgYXJlIHVzZWQgd2hlbiBhbiBYTUwgZG9jdW1lbnRzIGhhcyBlbGVtZW50cyBoYXZlIHRoZSBzYW1lCi0gICAgbmFtZSwgYnV0IGFyZSBmcm9tIGRpZmZlcmVudCBjb250ZXh0cywgYW5kIHRodXMgaGF2ZSBkaWZmZXJlbnQgbWVhbmluZ3MKLSAgICBhbmQgaW50ZXJwcmV0YXRpb25zLiBGb3IgaW5zdGFuY2UsIGEgPGNvZGU+Jmx0O1RJVExFJmd0OzwvY29kZT4gZWxlbWVudCBjYW4KLSAgICBiZSBhIEhUTUwgdGl0bGUgZWxlbWVudCBpbiBvbmUgcGFydCBvZiB0aGUgWE1MIGRvY3VtZW50LCB3aGlsZSBpdCBpbiBvdGhlcgotICAgIHBhcnRzIG9mIHRoZSBkb2N1bWVudCB0aGUgPGNvZGU+Jmx0O1RJVExFJmd0OzwvY29kZT4gZWxlbWVudCBpcyB1c2VkIGZvcgotICAgIGVuY2Fwc3VsYXRpbmcgdGhlIHRpdGxlIG9mIGEgcGxheSBvciBhIGJvb2suIFRoaXMgc29ydCBvZiBjb25mdXNpb24gaXMKLSAgICB2ZXJ5IGNvbW1vbiB3aGVuIHJlYWRpbmcgWE1MIHNvdXJjZSBmcm9tIG11bHRpcGxlIGRvY3VtZW50cywgYnV0IGNhbiBhbHNvCi0gICAgb2NjdXIgd2l0aGluIGEgc2luZ2xlIGRvY3VtZW50LjwvcD4KLQotICAgIDxwPk5hbWVzcGFjZXMgaGF2ZSB0aHJlZSB2ZXJ5IGltcG9ydGFudCBwcm9wZXJ0aWVzOiBhIG5hbWUsIGEgcHJlZml4IChhbgotICAgIGFsaWFzIGZvciBpdHMgbmFtZSkgYW5kIGEgc2NvcGUuIE5hbWVzcGFjZXMgYXJlIGRlY2xhcmVkIGFzIGF0dHJpYnV0ZXMgb2YKLSAgICBhbG1vc3QgYW55IG5vZGUgaW4gYW4gWE1MIGRvY3VtZW50LiBUaGUgZGVjbGFyYXRpb24gbG9va3MgbGlrZSB0aGlzOjwvcD4KLQotPHNvdXJjZT4KLSAgICAmbHQ7ZWxlbWVudCB4bWxuczpwcmVmaXg9Imh0dHA6Ly9zb21lLnNpdGUvc3BlYyImZ3Q7Li4uLiZsdDsvZWxlbWVudCZndDsKLTwvc291cmNlPgotCi0gICAgPHA+VGhlIDxjb2RlPiJ4bWxucyI8L2NvZGU+IHRlbGxzIHRoYXQgdGhpcyBpcyBhIG5hbWVzcGFjZSBkZWNsYXJhdGlvbi4gVGhlCi0gICAgc2NvcGUgb2YgdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyB0aGUgZWxlbWVudCBpbiB3aGljaCBpdCBpcyBkZWZpbmVkCi0gICAgYW5kIGFsbCB0aGUgY2hpbGRyZW4gb2YgdGhhdCBlbGVtZW50LlRoZSBwcmVmaXggaXMgdGhlIGxvY2FsIGFsaWFzIHdlIHVzZQotICAgIGZvciByZWZlcmVuY2luZyB0aGUgbmFtZXNwYWNlLCBhbmQgdGhlIFVSTCAoaXQgY2FuIGJlIGFueXRoaW5nLCByZWFsbHkpIGlzCi0gICAgdGhlIG5hbWUvZGVmaW5pdGlvbiBvZiB0aGUgbmFtZXNwYWNlLiBOb3RlIHRoYXQgZXZlbiB0aG91Z2ggdGhlIG5hbWVzcGFjZQotICAgIGRlZmluaXRpb24gaXMgbm9ybWFsbHkgYW4gVVJMLCBpdCBkb2VzIG5vdCBoYXZlIHRvIHBvaW50IHRvIGFueXRoaW5nLiBJdAotICAgIGlzIHJlY29tbWVuZGVkIHRoYXQgaXQgcG9pbnRzIHRvIGEgcGFnZSB0aGF0IGRlc2NyaWJlcyB0aGUgZWxlbWVudHMgaW4gdGhlCi0gICAgbmFtZXNwYWNlLCBidXQgaXQgZG9lcyBub3QgaGF2ZSB0by4gVGhlIHByZWZpeCBjYW4gYmUganVzdCBhYm91dCBhbnl0aGluZwotICAgIC0gb3Igbm90aGluZyAoaW4gd2hpY2ggY2FzZSBpdCBpcyB0aGUgZGVmYXVsdCBuYW1lc3BhY2UpLiBBbnkgcHJlZml4LAotICAgIGluY2x1ZGluZyB0aGUgZW1wdHkgcHJlZml4IGZvciB0aGUgZGVmYXVsdCBuYW1lc3BhY2UsIGNhbiBiZSByZWRlZmluZWQgdG8KLSAgICByZWZlciB0byBhIGRpZmZlcmVudCBuYW1lc3BhY2UgYXQgYW55IHRpbWUgaW4gYW4gWE1MIGRvY3VtZW50LiBUaGlzIGlzCi0gICAgbW9yZSBsaWtlbHkgdG8gaGFwcGVuIHRvIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSB0aGFuIGFueSBvdGhlciBwcmVmaXguIEhlcmUKLSAgICBpcyBhbiBleGFtcGxlIG9mIHRoaXM6PC9wPgotCi0gICAgPGFuY2hvciBuYW1lPSJ4bWxfc2FtcGxlXzEiLz4KLTxzb3VyY2U+Ci0gICAgJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gICAgCi0gICAgJmx0O2VtcGxveWVlcyB4bWxuczpwb3N0YWw9Imh0dHA6Ly9wb3N0YWwuaWUvc3BlYy0xLjAiCi0gICAgICAgICAgICAgICB4bWxuczplbWFpbD0iaHR0cDovL3d3dy53M2Mub3JnL3NvbWUtc3BlYy0zLjIiJmd0OwotICAgICAgICAmbHQ7ZW1wbG95ZWUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7bmFtZSZndDtCb2IgV29ya2VyJmx0Oy9uYW1lJmd0OwotICAgICAgICAgICAgJmx0O3Bvc3RhbDphZGRyZXNzJmd0OwotICAgICAgICAgICAgICAgICZsdDtwb3N0YWw6c3RyZWV0Jmd0O05hc3NhdSBTdHJlZXQmbHQ7L3Bvc3RhbDpzdHJlZXQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3Bvc3RhbDpjaXR5Jmd0O0R1YmxpbiAzJmx0Oy9wb3N0YWw6Y2l0eSZndDsKLSAgICAgICAgICAgICAgICAmbHQ7cG9zdGFsOmNvdW50cnkmZ3Q7SXJlbGFuZCZsdDsvcG9zdGFsOmNvdW50cnkmZ3Q7Ci0gICAgICAgICAgICAmbHQ7L3Bvc3RhbDphZGRyZXNzJmd0OwotICAgICAgICAgICAgJmx0O2VtYWlsOmFkZHJlc3MmZ3Q7Ym9iLndvcmtlckBoaXNqb2IuaWUmbHQ7L2VtYWlsOmFkZHJlc3MmZ3Q7Ci0gICAgICAgICZsdDsvZW1wbG95ZWUmZ3Q7Ci0gICAgJmx0Oy9lbXBsb3llZXMmZ3Q7Ci08L3NvdXJjZT4KLQotICAgIDxwPlRoaXMgc2hvcnQgZG9jdW1lbnQgaGFzIHR3byBuYW1lc3BhY2UgZGVjbGFyYXRpb25zLCBvbmUgd2l0aCB0aGUgcHJlZml4Ci0gICAgPGNvZGU+InBvc3RhbCI8L2NvZGU+IGFuZCBhbm90aGVyIHdpdGggdGhlIHByZWZpeCA8Y29kZT4iZW1haWwiPC9jb2RlPi4gVGhlCi0gICAgcHJlZml4ZXMgYXJlIHVzZWQgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBlbGVtZW50cyBmb3IgZS1tYWlsIGFkZHJlc3NlcyBhbmQKLSAgICByZWd1bGFyIHBvc3RhbCBhZGRyZXNzZXMuIEluIGFkZGl0aW9uIHRvIHRoZXNlIHR3byBuYW1lc3BhY2VzIHRoZXJlIGlzIGFsc28KLSAgICBhbiBpbml0aWFsICh1bm5hbWVkKSBkZWZhdWx0IG5hbWVzcGFjZSBiZWluZyB1c2VkIGZvciB0aGUKLSAgICA8Y29kZT4mbHQ7bmFtZSZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7ZW1wbG95ZWUmZ3Q7PC9jb2RlPiB0YWdzLiBUaGUgc2NvcGUgb2YgdGhlCi0gICAgZGVmYXVsdCBuYW1lc3BhY2UgaXMgaW4gdGhpcyBjYXNlIHRoZSB3aG9sZSBkb2N1bWVudCwgd2hpbGUgdGhlIHNjb3BlIG9mCi0gICAgdGhlIG90aGVyIHR3byBkZWNsYXJlZCBuYW1lc3BhY2VzIGlzIHRoZSA8Y29kZT4mbHQ7ZW1wbG95ZWVzJmd0OzwvY29kZT4KLSAgICBlbGVtZW50IGFuZCBpdHMgY2hpbGRyZW4uPC9wPgotCi0gICAgPHA+QnkgY2hhbmdpbmcgdGhlIGRlZmF1bHQgbmFtZXNwYWNlIHdlIGNvdWxkIGhhdmUgbWFkZSB0aGUgZG9jdW1lbnQgYQotICAgIGxpdHRsZSBiaXQgc2ltcGxlciBhbmQgbW9yZSByZWFkYWJsZTo8L3A+Ci0KLSAgICA8YW5jaG9yIG5hbWU9InhtbF9zYW1wbGVfMiIvPgotPHNvdXJjZT4KLSAgICAmbHQ7P3htbCB2ZXJzaW9uPSIxLjAiPyZndDsKLSAgICAKLSAgICAmbHQ7ZW1wbG95ZWVzIHhtbG5zOmVtYWlsPSJodHRwOi8vd3d3LnczYy5vcmcvc29tZS1zcGVjLTMuMiImZ3Q7Ci0gICAgICAgICZsdDtlbXBsb3llZSZndDsKLSAgICAgICAgICAgICZsdDtuYW1lJmd0O0JvYiBXb3JrZXImbHQ7L25hbWUmZ3Q7Ci0gICAgICAgICAgICAmbHQ7YWRkcmVzcyB4bWxucz0iaHR0cDovL3Bvc3RhbC5pZS9zcGVjLTEuMCImZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O3N0cmVldCZndDtOYXNzYXUgU3RyZWV0Jmx0Oy9zdHJlZXQmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2NpdHkmZ3Q7RHVibGluIDMmbHQ7L2NpdHkmZ3Q7Ci0gICAgICAgICAgICAgICAgJmx0O2NvdW50cnkmZ3Q7SXJlbGFuZCZsdDsvY291bnRyeSZndDsKLSAgICAgICAgICAgICZsdDsvYWRkcmVzcyZndDsKLSAgICAgICAgICAgICZsdDtlbWFpbDphZGRyZXNzJmd0O2JvYi53b3JrZXJAaGlzam9iLmllJmx0Oy9lbWFpbDphZGRyZXNzJmd0OwotICAgICAgICAmbHQ7L2VtcGxveWVlJmd0OwotICAgICZsdDsvZW1wbG95ZWVzJmd0OwotPC9zb3VyY2U+Ci0KLSAgICA8cD5UaGUgZGVmYXVsdCBuYW1lc3BhY2UgaXMgcmVkZWZpbmVkIGZvciB0aGUgPGNvZGU+Jmx0O2FkZHJlc3MmZ3Q7PC9jb2RlPiBub2RlCi0gICAgYW5kIGl0cyBjaGlsZHJlbiwgc28gdGhlcmUgaXMgbm8gbmVlZCB0byBzcGVjaWZ5IHRoZSBzdHJlZXQgYXMKLSAgICA8Y29kZT4mbHQ7cG9zdGFsOnN0cmVldCZndDs8L2NvZGU+IC0ganVzdCBwbGFpbiA8Y29kZT4mbHQ7c3RyZWV0Jmd0OzwvY29kZT4gaXMKLSAgICBzdWZmaWNpZW50LiBOb3RlIHRoYXQgdGhpcyBhbHNvIGFwcGxpZXMgdG8gdGhlIDxjb2RlPiZsdDthZGRyZXNzJmd0OzwvY29kZT4KLSAgICB3aGVyZSB0aGUgbmFtZXNwYWNlIGlzIGZpcnN0IGRlZmluZWQuIFRoaXMgaXMgaW4gZWZmZWN0IGEgcmVkZWZpbml0aW9uIG9mCi0gICAgdGhlIGRlZmF1bHQgbmFtZXNwYWNlLjwvcD4KLSAgPC9zMj48YW5jaG9yIG5hbWU9Im92ZXJ2aWV3Ii8+Ci0gIDxzMiB0aXRsZT0iTmFtZXNwYWNlIG92ZXJ2aWV3Ij4KLQotICAgIDxwPk5hbWVzcGFjZXMgd2lsbCBoYXZlIHRvIGJlIGhhbmRsZWQgaW4gdGhyZWUgc2VwYXJhdGUgcGFydHMgb2YgdGhlIFhTTFQKLSAgICBjb21waWxlcjo8L3A+Ci0KLSAgICA8YW5jaG9yIG5hbWU9ImFsbF9uYW1lc3BhY2VzIi8+Ci0gICAgICA8cD48aW1nIHNyYz0iYWxsX25hbWVzcGFjZXMuZ2lmIiBhbHQ9ImFsbF9uYW1lc3BhY2VzLmdpZiIvPjwvcD4KLSAgICAgIDxwPjxyZWY+RmlndXJlIDE6IE5hbWVzcGFjZSBoYW5kbGVycyBpbiB0aGUgWFNMVEM8L3JlZj48L3A+Ci0KLSAgICA8cD5UaGUgbW9zdCBvYnZpb3VzIGlzIHRoZSBuYW1lc3BhY2VzIGluIHRoZSBzb3VyY2UgWE1MIGRvY3VtZW50Ci0gICAgKG1hcmtlZCA8bGluayBhbmNob3I9Ik5TQSI+Ik5TIEEiPC9saW5rPiBpbiBmaWd1cmUgMSkuIFRoZXNlIG5hbWVzcGFjZXMgd2lsbCBiZQotICAgIGhhbmRsZWQgYnkgb3VyIERPTSBpbXBsZW1lbnRhdGlvbiBjbGFzcy4gVGhlIHNvdXJjZSBYU0wgc3R5bGVzaGVldCBhbHNvCi0gICAgaGFzIGl0cyBvd24gc2V0IG9mIG5hbWVzcGFjZXMgKDxsaW5rIGlkcmVmPSJOU0IiPiJOUyBCIjwvbGluaz4pIC0gb25lIG9mIHdoaWNoCi0gICAgaXMgdGhlIFhTTCBuYW1lc3BhY2UuIFRoZXNlIG5hbWVzcGFjZXMgd2lsbCBiZSBoYW5kbGVkIGF0IHJ1bi10aW1lIGFuZAotICAgIHdoYXRldmVyIGluZm9ybWF0aW9uIHRoYXQgaXMgbmVlZGVkIHRvIHByb2Nlc3MgdGhlcmUgc2hvdWxkIGJlIGNvbXBpbGVkCi0gICAgaW50byB0aGUgdHJhbnNsZXQuIFRoZXJlIGlzIGFsc28gYSBzZXQgb2YgbmFtZXNwYWNlcyB0aGF0IHdpbGwgYmUgdXNlZCBpbgotICAgIHRoZSByZXN1bHRpbmcgZG9jdW1lbnQgKDxsaW5rIGlkcmVmPSJOU0MiPiJOUyBDIjwvbGluaz4pLiBUaGlzIGlzIGFuCi0gICAgaW50ZXJzZWN0aW9uIG9mIHRoZSBmaXJzdCB0d28uIFRoZSBvdXRwdXQgZG9jdW1lbnQgc2hvdWxkIG5vdCBjb250YWluIGFueQotICAgIG1vcmUgbmFtZXNwYWNlIGRlY2xhcmF0aW9ucyB0aGFuIG5lY2Vzc2FyeS48L3A+Ci0KLSAgICA8L3MyPjxhbmNob3IgbmFtZT0iTlNBIi8+Ci0gICAgPHMyIHRpdGxlPSJUaGUgRE9NICZhbXA7IG5hbWVzcGFjZXMiPgotICAgIDx1bD4KLSAgICAgIDxsaT48bGluayBhbmNob3I9ImRvbS1uYW1lc3BhY2UiPkRPTSBub2RlIHR5cGVzIGFuZCBuYW1lc3BhY2UgdHlwZXM8L2xpbms+PC9saT4KLSAgICAgIDxsaT48bGluayBhbmNob3I9ImFzc2lnbiI+QXNzaWduaW5nIG5hbWVzcGFjZSB0eXBlcyB0byBET00gbm9kZXM8L2xpbms+PC9saT4gICAgICAgICAgICAgICAgCi0gICAgPC91bD4KLSAgICA8YW5jaG9yIG5hbWU9ImRvbS1uYW1lc3BhY2UiLz4KLSAgICA8czMgdGl0bGU9IkRPTSBub2RlIHR5cGVzIGFuZCBuYW1lc3BhY2UgdHlwZXMiPgotCi0gICAgPHA+UmVmZXIgdG8gdGhlIFhTTFRDIDxsaW5rIGlkcmVmPSJ4c2x0Y19ydW50aW1lIj5ydW50aW1lCi0gICAgZW52aXJvbm1lbnQgZGVzaWduPC9saW5rPiBkb2N1bWVudCBmb3IgYSBkZXNjcmlwdGlvbiBvZiBub2RlIHR5cGVzIGJlZm9yZQotICAgIHByb2NlZWRpbmcuIEluIHNob3J0LCBlYWNoIG5vZGUgaW4gdGhlIG91ciBET00gaW1wbGVtZW50YXRpb24gaXMKLSAgICByZXByZXNlbnRlZCBieSBhIHNpbXBsZSBpbnRlZ2VyLiBCeSB1c2luZyB0aGlzIGludGVnZXIgYXMgYW4gaW5kZXggaW50byBhbgotICAgIGFycmF5IGNhbGxlZCA8Y29kZT5fdHlwZVtdPC9jb2RlPiB3ZSBjYW4gZmluZCB0aGUgdHlwZSBvZiB0aGUgbm9kZS48L3A+Ci0KLSAgICA8cD5UaGUgdHlwZSBvZiB0aGUgbm9kZSBpcyBhbiBpbnRlZ2VyIHJlcHJlc2VudGluZyB0aGUgdHlwZSBvZiBlbGVtZW50IHRoZQotICAgIG5vZGUgaXMuIEFsbCBlbGVtZW50cyA8Y29kZT4mbHQ7Ym9iJmd0OzwvY29kZT4gd2lsbCBiZSBnaXZlbiB0aGUgc2FtZSB0eXBlLAotICAgIGFsbCB0ZXh0IG5vZGVzIHdpbGwgYmUgZ2l2ZW4gdGhlIHNhbWUgdHlwZSwgYW5kIHNvIG9uLiBCeSB1c2luZyB0aGUgbm9kZQotICAgIHR5cGUgYXMgYW4gaW5kZXggYW4gYXJyYXkgY2FsbGVkIDxjb2RlPl9uYW1lc0FycmF5W108L2NvZGU+IHdlIGNhbiBmaW5kIHRoZQotICAgIG5hbWUgb2YgdGhlIGVsZW1lbnQgdHlwZSAtIGluIHRoaXMgY2FzZSAiYm9iIi4gVGhpcyBjb2RlIGZyYWdtZW50IHNob3dzCi0gICAgaG93IHlvdSBjYW4sIHdpdGggb3VyIGN1cnJlbnQgaW1wbGVtZW50YXRpb24sIGZpbmQgdGhlIG5hbWUgb2YgYSBub2RlOjwvcD4KLQotPHNvdXJjZT4KLSAgICBpbnQgICAgbm9kZSA9IGl0ZXJhdG9yLmdldE5leHQoKTsgIC8vIGdldCBuZXh0IG5vZGUKLSAgICBpbnQgICAgdHlwZSA9IF90eXBlW25vZGVdOyAgICAgICAgIC8vIGdldCBub2RlIHR5cGUKLSAgICBTdHJpbmcgbmFtZSA9IF9uYW1lc0FycmF5W3R5cGVdOyAgIC8vIGdldCBub2RlIG5hbWUKLTwvc291cmNlPgotCi0gICAgPHA+V2Ugd2FudCB0byBrZWVwIHRoZSBvbmUtdHlwZS1wZXItbm9kZSBhcnJhbmdlbWVudCwgc2luY2UgdGhhdCBsZXRzIHVzCi0gICAgcHJvZHVjZSBmYWlybHkgZWZmaWNpZW50IGNvZGUuIE9uZSB0eXBlIGluIHRoZSBET00gbWFwcyB0byBvbmUgdHlwZSBpbgotICAgIHRoZSBjb21waWxlZCB0cmFuc2xldC4gV2hhdCB3ZSBjb3VsZCBkbyB0byByZXByZXNlbnQgdGhlIG5hbWVzcGFjZSBmb3IKLSAgICBlYWNoIG5vZGUgaW4gdGhlIERPTSBpcyB0byBhZGQgYSA8Y29kZT5fbmFtZXNwYWNlVHlwZVtdPC9jb2RlPiBhcnJheSB0aGF0IGhvbGRzCi0gICAgbmFtZXNwYWNlIHR5cGVzLiBFYWNoIG5vZGUgdHlwZSBtYXBzIHRvIGEgbmFtZXNwYWNlIHR5cGUsIGFuZCBlYWNoCi0gICAgbmFtZXNwYWNlIHR5cGUgbWFwcyB0byBhIG5hbWVzcGFjZSBuYW1lIChhbmQgYSBwcmVmaXggd2l0aCBhIGxpbWl0ZWQKLSAgICBzY29wZSk6PC9wPgotCi0gICAgPGFuY2hvciBuYW1lPSJ0eXBlX21hcHBpbmdzIi8+Ci0gICAgPHA+PGltZyBzcmM9InR5cGVfbWFwcGluZ3MuZ2lmIiBhbHQ9InR5cGVfbWFwcGluZ3MuZ2lmIi8+PC9wPgotICAgICAgPHA+PHJlZj5GaWd1cmUgMjogTWFwcGluZyBiZXR3ZWVuIG5vZGUgdHlwZXMvbmFtZXMsIG5hbWVzcGFjZSB0eXBlcy9uYW1lczwvcmVmPjwvcD4KLQotICAgIDxwPlRoaXMgY29kZSBmcmFnbWVudCBzaG93cyBob3cgd2UgY291bGQgZ2V0IHRoZSBuYW1lc3BhY2UgbmFtZSBmb3IgYSBub2RlOjwvcD4KLQotPHNvdXJjZT4KLSAgICBpbnQgICAgbm9kZSAgICAgID0gaXRlcmF0b3IuZ2V0TmV4dCgpOyAgICAvLyBnZXQgbmV4dCBub2RlCi0gICAgaW50ICAgIHR5cGUgICAgICA9IF90eXBlW25vZGVdOyAgICAgICAgICAgLy8gZ2V0IG5vZGUgdHlwZQotICAgIGludCAgICBuc3R5cGUgICAgPSBfbmFtZXNwYWNlW3R5cGVdOyAgICAgIC8vIGdldCBuYW1lc3BhY2UgdHlwZQotICAgIFN0cmluZyBuYW1lICAgICAgPSBfbmFtZXNBcnJheVt0eXBlXTsgICAgIC8vIGdldCBub2RlIGVsZW1lbnQgbmFtZQotICAgIFN0cmluZyBuYW1lc3BhY2UgPSBfbnNOYW1lc0FycmF5W25zdHlwZV07IC8vIGdldCBub2RlIG5hbWVzcGFjZSBuYW1lCi08L3NvdXJjZT4KLQotICAgIDxwPk5vdGUgdGhhdCBuYW1lc3BhY2UgcHJlZml4ZXMgYXJlIG5vdCBpbmNsdWRlZCBoZXJlLiBOYW1lc3BhY2UgcHJlZml4ZXMKLSAgICBhcmUgbG9jYWwgdG8gdGhlIFhNTCBkb2N1bWVudCBhbmQgd2lsbCBiZSBleHBhbmRlZCB0byB0aGUgZnVsbCBuYW1lc3BhY2UKLSAgICBuYW1lcyB3aGVuIHRoZSBub2RlcyBhcmUgcHV0IGludG8gdGhlIERPTS4gVGhpcywgaG93ZXZlciwgaXMgbm90IGEgdHJpdmlhbAotICAgIG1hdHRlci48L3A+Ci0gICAgPC9zMz48YW5jaG9yIG5hbWU9ImFzc2lnbiIvPgotICAgIDxzMyB0aXRsZT0iQXNzaWduaW5nIG5hbWVzcGFjZSB0eXBlcyB0byBET00gbm9kZXMiPgotCi0gICAgPHA+V2UgY2Fubm90IHNpbXBseSBoYXZlIGEgc2luZ2xlIG5hbWVzcGFjZSBwcmVmaXggYXJyYXkgc2ltaWxhciB0byB0aGUKLSAgICA8Y29kZT5fbmFtZXNwYWNlQXJyYXlbXTwvY29kZT4gYXJyYXkgZm9yIG1hcHBpbmcgYSBuYW1lc3BhY2UgdHlwZSB0byBhIHNpbmdsZQotICAgIHByZWZpeC4gVGhpcyBiZWNhdXNlIHByZWZpeGVzIGNhbiByZWZlciB0byBkaWZmZXJlbnQgbmFtZXNwYWNlcyBkZXBlbmRpbmcKLSAgICBvbiB3aGVyZSBpbiB0aGUgZG9jdW1lbnQgdGhlIHByZWZpeGVzIGFyZSBiZWluZyB1c2VkLiBJbiBvdXIgbGFzdCBleGFtcGxlJ3MKLSAgICA8bGluayBpZHJlZj0ieG1sX3NhbXBsZV8yIj5YTUwgZnJhZ21lbnQ8L2xpbms+IHRoZSBlbXB0eSBwcmVmaXggPGNvZGU+IiI8L2NvZGU+Ci0gICAgaW5pdGlhbGx5IHJlZmVycmVkIHRvIHRoZSBkZWZhdWx0IG5hbWVzcGFjZSAodGhlIG9uZSB3aXRoIG5vIG5hbWUgLSBqdXN0Ci0gICAgbGlrZSBhIENsaW50IEVhc3R3b29kIGNoYXJhY3RlcikuIExhdGVyIG9uIGluIHRoZSBkb2N1bWVudCB0aGUgZW1wdHkKLSAgICBwcmVmaXggaXMgY2hhbmdlZCB0byByZWZlciB0byBhIG5hbWVzcGFjZSBjYWxsZWQgCi0gICAgPGNvZGU+Imh0dHA6Ly9wb3N0YWwuaWUvc3BlYy0xLjAiPC9jb2RlPi48L3A+Ci0KLSAgICA8cD5OYW1lc3BhY2UgcHJlZml4ZXMgYXJlIG9ubHkgcmVsZXZhbnQgYXQgdGhlIHRpbWUgd2hlbiB0aGUgWE1MIGRvY3VtZW50Ci0gICAgaXMgcGFyc2VkIGFuZCB0aGUgRE9NIGlzIGJ1aWx0LiBPbmNlIHdlIGhhdmUgdGhlIERPTSBjb21wbGV0ZWQgd2Ugb25seSBuZWVkCi0gICAgYSB0YWJsZSB0aGF0IG1hcHMgZWFjaCBub2RlIHR5cGUgdG8gYSBuYW1lc3BhY2UgdHlwZSwgYW5kIGFub3RoZXIgYXJyYXkgb2YKLSAgICBhbGwgdGhlIG5hbWVzIG9mIHRoZSBkaWZmZXJlbnQgbmFtZXNwYWNlcy4gU28gd2hhdCB3ZSB3YW50IHRvIGVuZCB1cCB3aXRoCi0gICAgaXMgc29tZXRoaW5nIGxpa2UgdGhpczo8L3A+Ci0KLSAgICAgPHA+PGltZyBzcmM9ImRvbV9uYW1lc3BhY2UxLmdpZiIgYWx0PSJkb21fbmFtZXNwYWNlMS5naWYiLz48L3A+Ci0gICAgIDxwPjxyZWY+RmlndXJlIDM6IEVhY2ggbmFtZXNwYWNlIHJlZmVyZW5jZXMgaW4gdGhlIERPTSBnZXRzIG9uZSBlbnRyeTwvcmVmPjwvcD4KLQotICAgIDxwPlRoZSBuYW1lc3BhY2UgdGFibGUgaGFzIG9uZSBlbnRyeSBmb3IgZWFjaCBuYW1lc3BhY2UsIG5vbWF0dGVyIGhvdyBtYW55Ci0gICAgcHJlZml4ZXMgd2VyZSB1c2VkIHJvIHJlZmVyZW5jZSB0aGlzIG5hbWVzcGFjZSBpbiB0aGUgRE9NLiBUbyBidWlsZCB0aGlzCi0gICAgYXJyYXkgd2UgbmVlZCBhIHRlbXBvcmFyeSBkYXRhIHN0cnVjdHVyZSB1c2VkIGJ5IHRoZSBET00gYnVpbGRlci4gVGhpcwotICAgIHN0cnVjdHVyZSBpcyBhIGhhc2h0YWJsZSAtIHdoZXJlIHRoZSB2YXJpb3VzIHByZWZpeGVzIGFyZSB1c2VkIGZvciB0aGUKLSAgICBoYXNoIHZhbHVlcy4gVGhlIGNvbnRlbnRzIG9mIGVhY2ggZW50cnkgaW4gdGhlIHRhYmxlIHdpbGwgYmUgYSBzbWFsbCBzdGFjawotICAgIHdoZXJlIHByZXZpb3VzIG1lYW5pbmdzIG9mIGVhY2ggcHJlZml4IHdpbGwgYmUgc3RvcmVkOjwvcD4KLQotICAgICA8cD48aW1nIHNyYz0iZG9tX25hbWVzcGFjZTIuZ2lmIiBhbHQ9ImRvbV9uYW1lc3BhY2UyLmdpZiIvPjwvcD4KLSAgICAgPHA+PHJlZj5GaWd1cmUgNDogVGVtcG9yYXJ5IGRhdGEgc3RydWN0dXJlIHVzZWQgYnkgdGhlIERPTSBidWlsZGVyPC9yZWY+PC9wPgotCi0gICAgPHA+V2hlbiB0aGUgZmlyc3Qgbm9kZSBpcyBlbmNvdW50ZXJlZCB3ZSBkZWZpbmUgYSBuZXcgbmFtZXNwYWNlCi0gICAgPGNvZGU+ImZvbyI8L2NvZGU+IGFuZCBhc3NpZ24gdGhpcyBuYW1lc3BhY2UgdHlwZS9pbmRleCAxICh0aGUgZGVmYXVsdCAKLSAgICBuYW1lc3BhY2UgPGNvZGU+IiI8L2NvZGU+IGhhcyBpbmRleCAwKS4gQXQgdGhlIHNhbWUgdGltZSB3ZSB1c2UgdGhlIHByZWZpeAotICAgIDxjb2RlPiJBIjwvY29kZT4gZm9yIGEgbG9va3VwIGluIHRoZSBoYXNodGFibGUuIFRoaXMgZ2l2ZXMgdXMKLSAgICBhbiBpbnRlZ2VyIHN0YWNrIHVzZWQgZm9yIHRoZSBwcmVmaXggPGNvZGU+IkEiPC9jb2RlPi4gV2UgcHVzaCB0aGUgbmFtZXNwYWNlCi0gICAgdHlwZSAxIG9uIHRoaXMgc3RhY2suIEZyb20gbm93IG9uLCB1bnRpbCA8Y29kZT4iQSI8L2NvZGU+IGlzIHBvcCdlZCBvZmYgdGhpcwotICAgIHN0YWNrLCB0aGUgcHJlZml4IDxjb2RlPiJBIjwvY29kZT4gd2lsbCBtYXAgdG8gbmFtZXNwYWNlIHR5cGUgMSwgd2hpY2gKLSAgICByZXByZXNlbnRzIHRoZSBuYW1lc3BhY2UgVVJJIDxjb2RlPiJmb28iPC9jb2RlPi48L3A+Ci0KLSAgICA8cD5XZSB0aGVuIGVuY291bnRlciB0aGUgbmV4dCBub2RlIHdpdGggYSBuZXcgbmFtZXNwYWNlIGRlZmluaXRpb24gd2l0aAotICAgIHRoZSBzYW1lIG5hbWVzcGFjZSBwcmVmaXgsIHdlIGNyZWF0ZSBhIG5ldyBuYW1lc3BhY2UgPGNvZGU+ImJhciI8L2NvZGU+IGFuZAotICAgIHdlIHB1dCB0aGF0IGluIHRoZSBuYW1lc3BhY2UgdGFibGUgdW5kZXIgdHlwZSAyLiBBZ2FpbiB3ZSB1c2UgdGhlIHByZWZpeAotICAgIDxjb2RlPiJBIjwvY29kZT4gYXMgYW4gZW50cnkgaW50byB0aGUgbmFtZXNwYWNlIHByZWZpeCB0YWJsZSBhbmQgd2UgZ2V0IHRoZQotICAgIHNhbWUgaW50ZWdlciBzdGFjay4gV2Ugbm93IHB1c2ggbmFtZXNwYWNlIHR5cGUgMiBvbiB0aGUgc3RhY2ssIHNvIHRoYXQKLSAgICBuYW1lc3BhY2UgcHJlZml4IDxjb2RlPiJBIjwvY29kZT4gbWFwcyB0byBuYW1lc3BhY2UgVVJJIDxjb2RlPiJiYXIiPC9jb2RlPi4gV2hlbgotICAgIHdlIGhhdmUgdHJhdmVyc2VkIHRoaXMgbm9kZSdzIGNoaWxkcmVuIHdlIG5lZWQgdG8gcG9wIHRoZSBpbnRlZ2VyIG9mZiB0aGUKLSAgICBzdGFjaywgc28gd2hlbiB3ZSdyZSBiYWNrIGF0IHRoZSBmaXJzdCBub2RlIHRoZSBwcmVmaXggPGNvZGU+IkEiPC9jb2RlPiBhZ2FpbgotICAgIHdpbGwgcG9pbnQgdG8gbmFtZXNwYWNlIHR5cGUgMCwgd2hpY2ggbWFwcyB0byA8Y29kZT4iZm9vIjwvY29kZT4uIFRvIGtlZXAKLSAgICB0cmFjayBvZiB3aGF0IG5vZGVzIGhhZCB3aGF0IG5hbWVzcGFjZSBkZWNsYXJhdGlvbnMsIHdlIHVzZSBhIG5hbWVzcGFjZQotICAgIGRlY2xhcmF0aW9uIHN0YWNrOjwvcD4KLQotICAgIDxwPjxpbWcgc3JjPSJkb21fbmFtZXNwYWNlMy5naWYiIGFsdD0iZG9tX25hbWVzcGFjZTMuZ2lmIi8+PC9wPgotICAgICA8cD48cmVmPkZpZ3VyZSA1OiBOYW1lc3BhY2UgZGVjbGFyYXRpb24gc3RhY2s8L3JlZj48L3A+Ci0gICAgIAotICAgIDxwPkV2ZXJ5IG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpcyBwdXNoZWQgb24gdGhlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbgotICAgIHN0YWNrLiBUaGlzIHN0YWNrIGhvbGRzIHRoZSBub2RlIGluZGV4IGZvciB3aGVyZSB0aGUgbmFtZXNwYWNlIHdhcwotICAgIGRlY2xhcmVkLCBhbmQgYSByZWZlcmVuY2UgdG8gdGhlIHByZWZpeCBzdGFjayBmb3IgdGhpcyBkZWNsYXJhdGlvbi4KLSAgICBUaGUgPGNvZGU+ZW5kRWxlbWVudCgpPC9jb2RlPiBtZXRob2Qgb2YgdGhlIERPTUJ1aWxkZXIgY2xhc3Mgd2lsbCBuZWVkIHRvCi0gICAgcmVtb3ZlIG5hbWVzcGFjZSBkZWNsYXJhdGlvbiBmb3IgdGhlIG5vZGUgdGhhdCBpcyBjbG9zZWQuIFRoaXMgaXMgZG9uZQotICAgIGJ5IGZpcnN0IGNoZWNraW5nIHRoZSBuYW1lc3BhY2UgZGVjbGFyYXRpb24gc3RhY2sgZm9yIGFueSBuYW1lc3BhY2VzCi0gICAgZGVjbGFyZWQgYnkgdGhpcyBub2RlLiBJZiBhbnkgZGVjbGFyYXRpb25zIGFyZSBmb3VuZCB0aGVzZSBhcmUgdW4tZGVjbGFyZWQKLSAgICBieSBwb3BpbmcgdGhlIG5hbWVzcGFjZSBwcmVmaXhlcyBvZmYgdGhlIHJlc3BlY3RpdmUgcHJlZml4IHN0YWNrKHMpLCBhbmQKLSAgICB0aGVuIHBvcGluZyB0aGUgZW50cnkvZW50cmllcyBmb3IgdGhpcyBub2RlIG9mZiB0aGUgbmFtZXNwYWNlIGRlY2xhcmF0aW9uCi0gICAgc3RhY2suPC9wPgotCi0gICAgPHA+VGhlIDxjb2RlPmVuZERvY3VtZW50KCk8L2NvZGU+IG1ldGhvZCB3aWxsIGJ1aWxkIGFuIGFycmF5IHRoYXQgY29udGFpbnMKLSAgICBhbGwgbmFtZXNwYWNlcyB1c2VkIGluIHRoZSBzb3VyY2UgWE1MIGRvY3VtZW50IC0gPGNvZGU+X25zTmFtZXNBcnJheVtdPC9jb2RlPgotICAgIC0gd2hpY2ggaG9sZHMgdGhlIFVSSXMgb2YgYWxsIHJlZmVyZWQgbmFtZXNwYWNlcy4gVGhpcyBtZXRob2QgYWxzbyBidWlsZHMKLSAgICBhbiBhcnJheSB0aGF0IG1hcHMgYWxsIERPTSBub2RlIHR5cGVzIHRvIG5hbWVzcGFjZSB0eXBlcy4gVGhpcyB0d28gYXJyYXlzCi0gICAgYXJlIGFjY2Vzc2VkIHRocm91Z2ggdHdvIG5ldyBtZXRob2RzIGluIHRoZSBET00gaW50ZXJmYWNlOjwvcD4KLQotPHNvdXJjZT4KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWVzcGFjZU5hbWUoaW50IG5vZGUpOwotICAgIHB1YmxpYyBpbnQgICAgZ2V0TmFtZXNwYWNlVHlwZShpbnQgbm9kZSk7Ci08L3NvdXJjZT4KLQotICA8L3MzPjwvczI+PGFuY2hvciBuYW1lPSJOU0IiLz4KLSAgPHMyIHRpdGxlPSJOYW1lc3BhY2VzIGluIHRoZSBYU0wgc3R5bGVzaGVldCI+Ci0gIDx1bD4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJzdG9yZS1hY2Nlc3MiPlN0b3JpbmcgYW5kIGFjY2Vzc2luZyBuYW1lc3BhY2UgaW5mb3JtYXRpb248L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJtYXBkb20tc3R5bGVzaGVldCI+TWFwcGluZyBET00gbmFtZXNwYWNlcyB0byBzdHlsZXNoZWV0IG5hbWVzcGFjZXM8L2xpbms+PC9saT4KLSAgICA8bGk+PGxpbmsgYW5jaG9yPSJ3aWxkY2FyZHMiPldpbGRjYXJkcyBhbmQgbmFtZXNwYWNlczwvbGluaz48L2xpPgotICA8L3VsPgotICAgIDxhbmNob3IgbmFtZT0ic3RvcmUtYWNjZXNzIi8+Ci0gICAgPHMzIHRpdGxlPSJTdG9yaW5nIGFuZCBhY2Nlc3NpbmcgbmFtZXNwYWNlIGluZm9ybWF0aW9uIj4KLSAgICA8cD5UaGUgU3ltYm9sVGFibGUgY2xhc3MgaGFzIHRocmVlIGRhdGFzdHJ1Y3R1cmVzIHRoYXQgYXJlIHVzZWQgdG8gaG9sZAotICAgIG5hbWVzcGFjZSBpbmZvcm1hdGlvbjo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIEZpcnN0IHRoZXJlIGlzIHRoZSA8Y29kZT5fbmFtZXNwYWNlc1tdPC9jb2RlPiBIYXNodGFibGUgdGhhdCBtYXBzIHRoZSBuYW1lcwotICAgICAgICBvZiBpbi1zY29wZSBuYW1lc3BhY2UgdG8gdGhlaXIgcmVzcGVjdGl2ZSBwcmVmaXhlcy4gRWFjaCBrZXkgaW4gdGhlCi0gICAgICAgIEhhc2h0YWJsZSBvYmplY3QgaGFzIGEgc3RhY2suIEEgbmV3IHByZWZpeCBpcyBwdXNoZWQgb24gdGhlIHN0YWNrIGZvcgotICAgICAgICBlYWNoIG5ldyBkZWNsYXJhdGlvbiBvZiBhIG5hbWVzcGFjZS4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIFRoZW4gdGhlcmUgaXMgdGhlIDxjb2RlPl9wcmVmaXhlc1tdPC9jb2RlPiBIYXNodGFibGUuIFRoaXMgaGFzIHRoZSByZXZlcnNlCi0gICAgICAgIGZ1bmN0aW9uIG9mIHRoZSA8Y29kZT5fbmFtZXNwYWNlc1tdPC9jb2RlPiBIYXNodGFibGUgLSBpdCBtYXBzIGZyb20KLSAgICAgICAgcHJlZml4ZXMgdG8gbmFtZXNwYWNlcy4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIFRoZXJlIGlzIGFsc28gYSBoYXNodGFibGUgdGhhdCBpcyB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlCi0gICAgICAgIDxjb2RlPiZsdDt4c2w6bmFtZXNwYWNlLWFsaWFzJmd0OzwvY29kZT4gZWxlbWVudC4gVGhlIGtleXMgaW4gdGhpcwotICAgICAgICBoYXNodGFibGUgaXMgdGFrZW4gZnJvbSB0aGUgPGNvZGU+c3R5bGVzaGVldC1wcmVmaXg8L2NvZGU+IGF0dHJpYnV0ZSBvZgotICAgICAgICB0aGlzIGVsZW1lbnQsIGFuZCB0aGUgcmVzdWx0aW5nIHByZWZpeCAoZnJvbSB0aGUgPGNvZGU+cmVzdWx0LXByZWZpeDwvY29kZT4KLSAgICAgICAgYXR0cmlidXRlKSBpcyB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgZWFjaCBrZXkuCi0gICAgICA8L2xpPgotICAgIDwvdWw+Ci0KLSAgICA8cD5UaGUgU3ltYm9sVGFibGUgY2xhc3Mgb2ZmZXJzIDQgbWV0aG9kcyBmb3IgYWNjZXNzaW5nIHRoZXNlIGRhdGEKLSAgICBzdHJ1Y3R1cmVzOjwvcD4KLQotPHNvdXJjZT4KLSAgICBwdWJsaWMgdm9pZCAgIHB1c2hOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCwgU3RyaW5nIHVyaSk7Ci0gICAgcHVibGljIHZvaWQgICBwb3BOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCk7Ci0gICAgcHVibGljIFN0cmluZyBsb29rdXBQcmVmaXgoU3RyaW5nIHVyaSk7Ci0gICAgcHVibGljIFN0cmluZyBsb29rdXBOYW1lc3BhY2UoU3RyaW5nIHByZWZpeCk7Ci08L3NvdXJjZT4KLQotICAgIDxwPlRoZXNlIG1ldGhvZHMgYXJlIHdyYXBwZWQgYnkgdHdvIG1ldGhvZHMgaW4gdGhlIFBhcnNlciBjbGFzcyAoYSBQYXJzZXIKLSAgICBvYmplY3QgYWx3YXMgaGFzIGEgU3ltYm9sVGFibGUgb2JqZWN0KTo8L3A+Ci08c291cmNlPgotICAgIC8vIFRoaXMgbWV0aG9kIHB1c2hlcyBhbGwgbmFtZXNwYWNlcyBkZWNsYXJlZCB3aXRoaW4gYSBzaW5nbGUgZWxlbWVudAotICAgIHB1YmxpYyB2b2lkIHB1c2hOYW1lc3BhY2VzKEVsZW1lbnRFeCBlbGVtZW50KTsKLSAgICAvLyBUaGlzIG1ldGhvZCBwb3BzIGFsbCBuYW1lc3BhY2VzIGRlY2xhcmVkIHdpdGhpbiBhIHNpbmdsZSBlbGVtZW50Ci0gICAgcHVibGljIHZvaWQgcG9wTmFtZXNwYWNlcyhFbGVtZW50RXggZWxlbWVudCk7Ci08L3NvdXJjZT4KLQotICAgIDxwPlRoZSB0cmFuc2xldCBjbGFzcyBoYXMsIGp1c3QgbGlrZSB0aGUgRE9NLCBhIDxjb2RlPm5hbWVzQXJyYXlbXTwvY29kZT4KLSAgICBzdHJ1Y3R1cmUgZm9yIGhvbGRpbmcgdGhlIGV4cGFuZGVkIFFOYW1lcyBvZiBhbGwgYWNjZXNzZWQgZWxlbWVudHMuIFRoZQotICAgIGNvbXBpbGVkIHRyYW5zbGV0IGZpbGxzIHRoaXMgYXJyYXkgaW4gaXRzIGNvbnN0cnVjdG9yLiBXaGVuIHRoZSB0cmFuc2xldAotICAgIGhhcyBidWlsdCB0aGUgRE9NIChhIERPTUltcGwgb2JqZWN0KSwgaXQgcGFzc2VzIHRoZSBET00gdG8gdGhlIGEgRE9NCi0gICAgYWRhcHRlciAoYSBET01BZGFwdGVyIG9iamVjdCkgdG9nZXRoZXIgd2l0aCB0aGUgbmFtZXMgYXJyYXkuIFRoZSBET00KLSAgICBhZGFwdGVyIHRoZW4gbWFwcyB0aGUgdHJhbnNsZXQncyB0eXBlcyB0byB0aGUgRE9NJ3MgdHlwZXMuPC9wPgotICAgPC9zMz48YW5jaG9yIG5hbWU9Im1hcGRvbS1zdHlsZXNoZWV0Ii8+Ci0gIDxzMyB0aXRsZT0iTWFwcGluZyBET00gbmFtZXNwYWNlcyBhbmQgc3R5bGVzaGVldCBuYW1lc3BhY2VzIj4KLQotICAgIDxwPkVhY2ggZW50cnkgaW4gdGhlIERPTSdzIDxjb2RlPl9uYW1lc0FycmF5W108L2NvZGU+IGlzIGV4cGFuZGVkIHRvIGNvbnRhaW4KLSAgICB0aGUgZnVsbCBRTmFtZSwgc28gdGhhdCBpbnN0ZWFkIG9mIGNvbnRhaW5pbmcgPGNvZGU+cHJlZml4OmxvY2FsbmFtZTwvY29kZT4gaXQKLSAgICB3aWxsIG5vdyBjb250YWluIDxjb2RlPm5hbWVzcGFjZS11cmk6bG9jYWxuYW1lPC9jb2RlPi4gSW4gdGhpcyB3YXkgdGhlIGV4cGFuZGVkCi0gICAgUU5hbWUgaW4gdGhlIHRyYW5zbGV0IHdpbGwgbWF0Y2ggdGhlIGV4YW5kZWQgUU5hbWUgaW4gdGhlIERPTS4gVGhpcyBhc3N1cmVzCi0gICAgbWF0Y2hlcyBvbiBmdWxsIFFOYW1lcywgYnV0IGRvZXMgbm90IGRvIG11Y2ggZm9yIDxjb2RlPm1hdGNoPSJBOioiPC9jb2RlPiB0eXBlCi0gICAgWFBhdGggcGF0dGVybnMuIFRoaXMgaXMgd2hlcmUgb3VyIG1haW4gY2hhbGxlbmdlIGxpZXMuPC9wPgotICAgIDwvczM+PGFuY2hvciBuYW1lPSJ3aWxkY2FyZHMiLz4KLSAgICA8czMgdGl0bGU9IldpbGRjYXJkcyBhbmQgbmFtZXNwYWNlcyI+Ci0KLSAgICA8cD5UaGUgb3JpZ2luYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIFhTTFRDIHJ1bnRpbWUgZW52aXJvbm1lbnQgd291bGQKLSAgICBvbmx5IGFsbG93IG1hdGNoZXMgb24gIjxjb2RlPio8L2NvZGU+IiBhbmQgIjxjb2RlPkAqPC9jb2RlPiIgcGF0dGVybnMuIFRoaXMgd2FzCi0gICAgYWNoaWV2ZWQgYnkgbWFwcGluZyBhbGwgZWxlbWVudHMgdGhhdCBjb3VsZCBub3QgYmUgbWFwcGVkIHRvIGEgdHJhbnNsZXQKLSAgICB0eXBlIHRvIDMgKERPTS5FTEVNRU5UIHR5cGUpLCBhbmQgc2ltaWxhcmx5IGFsbCB1bmtub3duIGF0dHJpYnV0ZXMgdG8KLSAgICB0eXBlIDQgKERPTS5BVFRSSUJVVEUgdHlwZSkuIFRoZSBtYWluIDxjb2RlPnN3aXRjaCgpPC9jb2RlPiBzdGF0ZW1lbnQgaW4KLSAgICA8Y29kZT5hcHBseVRlbXBsYXRlcygpPC9jb2RlPiB3b3VsZCB0aGVuIGhhdmUgYSBzZXBhcmF0ZSAiPGNvZGU+Y2FzZSgpPC9jb2RlPiIKLSAgICBmb3IgZWFjaCBvZiB0aGVzZS4gKFVuZGVyIGVhY2ggPGNvZGU+Y2FzZSgpPC9jb2RlPiB5b3UgbWlnaHQgaGF2ZSB0byBjaGVjawotICAgIGZvciB0aGUgbm9kZSdzIHBhcmVudHMgaW4gY2FzZSB5b3Ugd2VyZSBtYXRjaGluZyBvbiAiPGNvZGU+cGF0aC8qPC9jb2RlPiItdHlwZQotICAgIHBhdHRlcm5zLikgVGhpcyBmaWd1cmUgc2hvd3MgaG93IHRoYXQgd2FzIGRvbmU6PC9wPgotCi0gICAgPGFuY2hvciBuYW1lPSJtYXRjaF9uYW1lc3BhY2UxIi8+Ci0gICAgPHA+PGltZyBzcmM9Im1hdGNoX25hbWVzcGFjZTEuZ2lmIiBhbHQ9Im1hdGNoX25hbWVzcGFjZTEuZ2lmIi8+PC9wPgotICAgIDxwPjxyZWY+RmlndXJlIDY6IFByZXZpb3VzIHBhdHRlcm4gbWF0Y2hpbmc8L3JlZj48L3A+Ci0KLSAgICA8cD5UaGUgIk5vZGUgdGVzdCIgYm94IGhlcmUgcmVwcmVzZW50cyB0aGUgIjxjb2RlPnN3aXRjaCgpPC9jb2RlPiIgc3RhdGVtZW50LgotICAgIFRoZSAiTm9kZSBwYXJlbnQgdGVzdCIgYm94IHJlcHJlc2VudCBlYWNoICI8Y29kZT5jYXNlOjwvY29kZT4iIGZvciB0aGF0IAotICAgIDxjb2RlPnN3aXRjaCgpPC9jb2RlPiBzdGF0ZW1lbnQuIFRoZXJlIGlzIG9uZSA8Y29kZT5jYXNlOjwvY29kZT4gZm9yIGVhY2gga25vdwotICAgIHRyYW5zbGV0IG5vZGUgdHlwZS4gRm9yIGVhY2ggbm9kZSB0eXBlIHdlIGhhdmUgdG8gY2hlY2sgZm9yIGFueSBwYXJlbnQKLSAgICBwYXR0ZXJucyAtIGZvciBpbnN0YW5jZSwgZm9yIHRoZSBwYXR0ZXJuICI8Y29kZT4vZm9vL2Jhci9iYXo8L2NvZGU+Iiwgd2Ugd2lsbAotICAgIGdldCBhIG1hdGNoIHdpdGggPGNvZGU+Y2FzZSAiYmF6IjwvY29kZT4sIGFuZCB3ZSBoYXZlIHRvIGNoZWNrIHRoYXQgdGhlIHBhcmVudAotICAgIG5vZGUgaXMgIjxjb2RlPmJhcjwvY29kZT4iIGFuZCB0aGF0IHRoZSBncmFuZHBhcmVudCBpcyAiPGNvZGU+Zm9vPC9jb2RlPiIgYmVmb3JlCi0gICAgd2UgY2FuIHNheSB0aGF0IHdlIGhhdmUgYSBoaXQuIFRoZSAiRWxlbWVudCBwYXJlbnQgdGVzdCIgaXMgdGhlIHRlc3QgdGhhdAotICAgIGlzIGRvbmUgYWxsIERPTSBub2RlcyB0aGF0IGRvIG5vdCBkaXJlY3RseSBtYXRjaCBhbnkgdHJhbnNsZXQgdHlwZXMuIFRoaXMKLSAgICBpcyB0aGUgdGVzdCBmb3IgIjxjb2RlPio8L2NvZGU+IiBvciAiPGNvZGU+Zm9vLyo8L2NvZGU+Ii4gU2ltaWxhcmx5IHdlIGhhdmUgYQotICAgICI8Y29kZT5jYXNlOjwvY29kZT4iIGZvciBtYXRjaCBvbiBhdHRyaWJ1dGVzICgiPGNvZGU+QCo8L2NvZGU+IikuPC9wPgotCi0gICAgPHA+V2hhdCB3ZSBub3cgd2FudCB0byBhY2hpZXZlIGlzIHRvIGluc2VydCBhIGNoZWNrIGZvciBwYXR0ZXJucyBvbiB0aGUKLSAgICBmb3JtYXQgIjxjb2RlPm5zOio8L2NvZGU+IiwgIjxjb2RlPmZvby9uczoqPC9jb2RlPiIgb3IgIjxjb2RlPm5zOkAqPC9jb2RlPiIsIHdoaWNoCi0gICAgdGhpcyBmaWd1cmUgaWxsdXN0cmF0ZXM6PC9wPgotCi0gICAgPGFuY2hvciBuYW1lPSJtYXRjaF9uYW1lc3BhY2UyIi8+Ci0gICAgICA8cD48aW1nIHNyYz0ibWF0Y2hfbmFtZXNwYWNlMi5naWYiIGFsdD0ibWF0Y2hfbmFtZXNwYWNlMi5naWYiLz48L3A+Ci0gICAgICA8cD48cmVmPkZpZ3VyZSA3OiBQYXR0ZXJuIG1hdGNoaW5nIHdpdGggbmFtZXNwYWNlIHRlc3RzPC9yZWY+PC9wPgotCi0KLSAgICA8cD5FYWNoIG5vZGUgaW4gdGhlIERPTSBuZWVkcyBhIG5hbWVzcGFjZSB0eXBlIGFzIHdlbGwgYXMgdGhlIFFOYW1lIHR5cGUuCi0gICAgV2l0aCB0aGlzIHR5cGUgd2UgY2FuIG1hdGNoIHdpbGRjYXJkIHJ1bGVzIHRvIGFueSBzcGVjaWZpYyBuYW1lc3BhY2UuCi0gICAgU28gYWZ0ZXIgYW55IGNoZWNrcyBoYXZlIGJlZW4gZG9uZSBvbiB0aGUgd2hvbGUgUU5hbWUgb2YgYSBub2RlICh0aGUgdHlwZSksCi0gICAgd2UgY2FuIG1hdGNoIG9uIHRoZSBuYW1lc3BhY2UgdHlwZSBvZiB0aGUgbm9kZS4gVGhlIG1haW4gZGlzcGF0Y2gKLSAgICA8Y29kZT5zd2l0Y2goKTwvY29kZT4gaW4gPGNvZGU+YXBwbHlUZW1wbGF0ZXMoKTwvY29kZT4gbXVzdCBiZSBjaGFuZ2VkIGZyb20gdGhpczo8L3A+Ci0KLSAgICA8c291cmNlPgotICAgICAgICBwdWJsaWMgdm9pZCBhcHBseVRlbXBsYXRlcyhET00gZG9tLCBOb2RlSXRlcmF0b3IgaXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGV0T3V0cHV0SGFuZGxlciBoYW5kbGVyKSB7Ci0KLSAgICAgICAgICAgIC8vIEdldCBuZXh0IG5vZGUgZnJvbSBpdGVyYXRvcgotICAgICAgICAgICAgd2hpbGUgKChub2RlID0gaXRlcmF0b3IubmV4dCgpKSAhPSBFTkQpIHsKLSAgICAgICAgICAgICAgICAvLyBHZXQgaW50ZXJuYWwgbm9kZSB0eXBlCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBET00uZ2V0VHlwZShub2RlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRE9NLlJPT1Q6ICAgICAgLy8gTWF0Y2ggb24gIi8iIHBhdHRlcm4KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUm9vdE5vZGUoKTsgICAgICAgCi0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgRE9NLlRFWFQ6ICAgICAgLy8gSGFuZGxlIHRleHQgbm9kZXMKLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlVGV4dCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERPTS5FTEVNRU5UOiAgIC8vIE1hdGNoIG9uICIqIiBwYXR0ZXJuCi0gICAgICAgICAgICAgICAgICAgIGhhbmRsZVdpbGRjYXJkRWxlbWVudCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERPTS5BVFRSSUJVVEU6IC8vIEhhbmRsZSBvbiAiQCoiIHBhdHRlcm4KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlV2lsZGNhcmRFbGVtZW50KCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2Ugbm9kZVR5cGUxOiAgICAgLy8gSGFuZGxlIDFzdCBrbm93biBlbGVtZW50IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRDb2RlRm9yVHlwZTEoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgY2FzZSBub2RlVHlwZU46ICAgLy8gSGFuZGxlIG50aCBrbm93biBlbGVtZW50IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgY29tcGlsZWRDb2RlRm9yVHlwZU4oKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICBOb2RlSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBET00uZ2V0Q2hpbGRyZW4obm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgYXBwbHlUZW1wbGF0ZXMoRE9NLCBuZXdJdGVyYXRvciwgaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci08L3NvdXJjZT4KLQotICAgIDxwPlRvIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgotCi0gICAgPHNvdXJjZT4KLSAgICAgICAgcHVibGljIHZvaWQgYXBwbHlUZW1wbGF0ZXMoRE9NIGRvbSwgTm9kZUl0ZXJhdG9yIGl0ZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFuc2xldE91dHB1dEhhbmRsZXIgaGFuZGxlcikgewotCi0gICAgICAgICAgICAvLyBHZXQgbmV4dCBub2RlIGZyb20gaXRlcmF0b3IKLSAgICAgICAgICAgIHdoaWxlICgobm9kZSA9IGl0ZXJhdG9yLm5leHQoKSkgIT0gRU5EKSB7Ci0KLSAgICAgICAgICAgICAgICAvLyBGaXJzdCBydW4gY2hlY2sgb24gbm9kZSB0eXBlCi0gICAgICAgICAgICAgICAgZmluYWwgaW50IHR5cGUgPSBET00uZ2V0VHlwZShub2RlKTsKLSAgICAgICAgICAgICAgICBzd2l0Y2godHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgRE9NLlJPT1Q6ICAgICAgLy8gTWF0Y2ggb24gIi8iIHBhdHRlcm4KLSAgICAgICAgICAgICAgICAgICAgaGFuZGxlUm9vdE5vZGUoKTsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgY2FzZSBET00uVEVYVDogICAgICAvLyBIYW5kbGUgdGV4dCBub2RlcwotICAgICAgICAgICAgICAgICAgICBoYW5kbGVUZXh0KCk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIGNhc2UgRE9NLkVMRU1FTlQ6ICAgLy8gTm90IGhhbmRsZWQgaGVyZSEhIQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIERPTS5BVFRSSUJVVEU6IC8vIE5vdCBoYW5kbGVkIGhlcmUhISEKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBub2RlVHlwZTE6ICAgICAvLyBIYW5kbGUgMXN0IGtub3duIGVsZW1lbnQgdHlwZQotICAgICAgICAgICAgICAgICAgICBpZiAoY29tcGlsZWRDb2RlRm9yVHlwZTEoKSA9PSBtYXRjaCkgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICA6Ci0gICAgICAgICAgICAgICAgICAgIDoKLSAgICAgICAgICAgICAgICAgICAgOgotICAgICAgICAgICAgICAgIGNhc2Ugbm9kZVR5cGVOOiAgICAgLy8gSGFuZGxlIG50aCBrbm93biBlbGVtZW50IHR5cGUKLSAgICAgICAgICAgICAgICAgICAgaWYgKGNvbXBpbGVkQ29kZUZvclR5cGVOKCkgPT0gbWF0Y2gpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUaGVuIHJ1biBjaGVjayBvbiBuYW1lc3BhY2UgdHlwZQotICAgICAgICAgICAgICAgIGZpbmFsIGludCBuYW1lc3BhY2UgPSBET00uZ2V0TmFtZXNwYWNlKHR5cGUpOwotICAgICAgICAgICAgICAgIHN3aXRjaChuYW1lc3BhY2UpIHsKLSAgICAgICAgICAgICAgICBjYXNlIDA6IC8vIEhhbmRsZSBub2RlcyBtYXRjaGluZyAxc3Qga25vd24gbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVUaGlzTmFtZXNwYWNlKCkgPT0gbWF0Y2gpIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIEhhbmRsZSBub2RlcyBtYXRjaGluZyAybmQga25vd24gbmFtZXNwYWNlCi0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVPdGhlck5hbWVzcGFjZSgpID09IG1hdGNoKSBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gRmluYWxseSBjaGVjayBvbiBlbGVtZW50L2F0dHJpYnV0ZSB3aWxkY2FyZAotICAgICAgICAgICAgICAgIGlmICh0eXBlID09IERPTS5FTEVNRU5UKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChoYW5kbGVXaWxkY2FyZEVsZW1lbnQoKSA9PSBtYXRjaCkKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgICAgICBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgYWN0aW9uIGZvciBlbGVtZW50cwotICAgICAgICAgICAgICAgICAgICAgICBOb2RlSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBET00uZ2V0Q2hpbGRyZW4obm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgIGFwcGx5VGVtcGxhdGVzKERPTSwgbmV3SXRlcmF0b3IsIGhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGUgPT0gRE9NLkFUVFJJQlVURSkgewotICAgICAgICAgICAgICAgICAgICBoYW5kbGVXaWxkY2FyZEF0dHJpYnV0ZSgpOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci08L3NvdXJjZT4KLQotICAgIDxwPkZpcnN0IG5vdGUgdGhhdCB0aGUgZGVmYXVsdCBhY3Rpb24gKGl0ZXJhdGUgb24gY2hpbGRyZW4pIGRvZXMgbm90IGhvbGQgZm9yCi0gICAgYXR0cmlidXRlcywgc2luY2UgYXR0cmlidXRlIG5vZGVzIGRvIG5vdCBoYXZlIGNoaWxkcmVuLiBUaGVuIG5vdGUgdGhhdCB0aGUgd2F5Ci0gICAgdGhlIHRocmVlIGxldmVscyBvZiB0ZXN0cyBhcmUgb3JkZXJlZCBpcyBjb25zaXN0ZW50IHdpdGggdGhlIHdheSBwYXR0ZXJucwotICAgIHNob3VsZCBiZSBwcmlvcml0aXNlZDo8L3A+Ci0KLSAgICA8dWw+Ci0KLSAgICAgIDxsaT48ZW0+TWF0Y2ggb24gZWxlbWVudC9hdHRyaWJ1dGUgdHlwZXM6PC9lbT48L2xpPgotICAgICAgICA8dWw+Ci0gICAgICAgICAgPGxpPjxjb2RlPm1hdGNoPSIvIjwvY29kZT4gLSBtYXRjaCBvbiB0aGUgcm9vdCBub2RlPC9saT4KLSAgICAgICAgICA8bGk+PGNvZGU+bWF0Y2g9IkIiPC9jb2RlPiAtIG1hdGNoIG9uIGFueSBCIGVsZW1lbnQ8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iQS9CIjwvY29kZT4gLSBtYXRjaCBvbiBCIGVsZW1lbnRzIHdpdGggQSBwYXJlbnQ8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iQSB8IEIiPC9jb2RlPiAtIG1hdGNoIG9uIEIgb3IgQSBlbGVtZW50PC9saT4KLSAgICAgICAgICA8bGk+PGNvZGU+bWF0Y2g9ImZvbzpCIjwvY29kZT4gLSBtYXRjaCBvbiBCIGVsZW1lbnQgd2l0aGluICJmb28iIG5hbWVzcGFjZTwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgICAgIDxsaT48ZW0+TWF0Y2ggb24gbmFtZXNwYWNlOjwvZW0+PC9saT4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iZm9vOioiPC9jb2RlPiAtIG1hdGNoIG9uIGFueSBlbGVtZW50IHdpdGhpbiAiZm9vIiBuYW1lc3BhY2U8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iZm9vOkAqIjwvY29kZT4gLSBtYXRjaCBvbiBhbnkgYXR0cmlidXRlIHdpdGhpbiAiZm9vIiBuYW1lc3BhY2U8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iQS9mb286KiI8L2NvZGU+IC0gbWF0Y2ggb24gYW55IGVsZW1lbnQgd2l0aGluICJmb28iIG5hbWVzcGFjZSB3aXRoIEEgcGFyZW50PC9saT4KLSAgICAgICAgICA8bGk+PGNvZGU+bWF0Y2g9IkEvZm9vOkAqIjwvY29kZT4gLSBtYXRjaCBvbiBhbnkgYXR0cmlidXRlIHdpdGhpbiAiZm9vIiBuYW1lc3BhY2Ugd2l0aCBBIHBhcmVudDwvbGk+Ci0gICAgICAgIDwvdWw+ICAgICAgCi0KLSAgICAgIDxsaT48ZW0+TWF0Y2ggb24gd2lsZGNhcmQ6PC9lbT4gPC9saT4KLSAgICAgICAgPHVsPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iKiI8L2NvZGU+IC0gbWF0Y2ggb24gYW55IGVsZW1lbnQ8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iQCoiPC9jb2RlPiAtIG1hdGNoIG9uIGFueSBhdHRyaWJ1dGU8L2xpPgotICAgICAgICAgIDxsaT48Y29kZT5tYXRjaD0iQS8qIjwvY29kZT4gLSBtYXRjaCBvbiBhbnkgZWxlbWVudCB3aXRoIEEgcGFyZW50PC9saT4KLSAgICAgICAgICA8bGk+PGNvZGU+bWF0Y2g9IkEvQCoiPC9jb2RlPiAtIG1hdGNoIG9uIGFueSBhdHRyaWJ1dGUgd2l0aCBBIHBhcmVudDwvbGk+Ci0gICAgICAgIDwvdWw+Ci0gICAgIAotICAgIDwvdWw+Ci0KLSAgICAgPC9zMz48L3MyPjxhbmNob3IgbmFtZT0iTlNDIi8+Ci0gICAgIDxzMiB0aXRsZT0iTmFtZXNwYWNlcyBpbiB0aGUgb3V0cHV0IGRvY3VtZW50Ij4KLQotICAgIDxwPlRoZXNlIGFyZSB0aGUgY2F0ZWdvcmllcyBvZiBuYW1lc3BhY2VzIHRoYXQgZW5kIHVwIGluIHRoZSBvdXRwdXQKLSAgICBkb2N1bWVudDo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIE5hbWVzcGFjZXMgdXNlZCBpbiBsaXRlcmFsIGVsZW1lbnRzL2F0dHJpYnV0ZXMgaW4gdGhlIHN0eWxlc2hlZXQuIFRoZXNlCi0gICAgICAgIG5hbWVzcGFjZXMgc2hvdWxkIGJlIGRlY2xhcmVkIDxlbT5vbmNlPC9lbT4gYmVmb3JlIHVzZSBpbiB0aGUgb3V0cHV0Ci0gICAgICAgIGRvY3VtZW50LiBUaGVzZSBlbGVtZW50cyBhcmUgY29waWVkIHRvIHRoZSBvdXRwdXQgZG9jdW1lbnQgaW5kZXBlbmRlbnQKLSAgICAgICAgb2YgbmFtZXNwYWNlcyBpbiB0aGUgaW5wdXQgWE1MIGRvY3VtZW50LiBIb3dldmVyLCB0aGUgbmFtZXNwYWNlcyBjYW4KLSAgICAgICAgYmUgZGVjbGFyZWQgdXNpbmcgdGhlIHNhbWUgcHJlZml4LCBzdWNoIHRoYXQgYSBuYW1lc3BhY2UgdXNlZCBieSBhCi0gICAgICAgIGxpdGVyYWwgcmVzdWx0IGVsZW1lbnQgY2FuIG92ZXJzaGFkb3cgYSBuYW1lc3BhY2UgZnJvbSB0aGUgRE9NLgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgTmFtZXNwYWNlcyBmcm9tIGVsZW1lbnRzIGluIHRoZSBzdHlsZXNoZWV0IHRoYXQgbWF0Y2ggZWxlbWVudHMgaW4gdGhlCi0gICAgICAgIERPTS4gTm8gbmFtZXNwYWNlcyBmcm9tIHRoZSBET00gc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGRvY3VtZW50Ci0gICAgICAgIHVubGVzcyB0aGV5IGFyZSBhY3R1YWxseSByZWZlcmVuY2VkIGluIHRoZSBzdHlsZXNoZWV0LiBObyBuYW1lc3BhY2VzCi0gICAgICAgIGZyb20gdGhlIHN0eWxlc2hlZXQgc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgb3V0cHV0IGRvY3VtZW50IHVubGVzcyB0aGUKLSAgICAgICAgZWxlbWVudHMgaW4gd2hpY2ggdGhleSBhcmUgcmVmZXJlbmNlcyBtYXRjaCBlbGVtZW50cyBpbiB0aGUgRE9NLgotICAgICAgPC9saT4KLSAgICA8L3VsPgotCi0gICAgICA8YW5jaG9yIG5hbWU9Im91dHB1dF9uYW1lc3BhY2VzMSIvPgotICAgICAgPHA+PGltZyBzcmM9Im91dHB1dF9uYW1lc3BhY2VzMS5naWYiIGFsdD0ib3V0cHV0X25hbWVzcGFjZXMxLmdpZiIvPjwvcD4KLSAgICAgIDxwPjxyZWY+RmlndXJlIDg6IE5hbWVzcGFjZSBkZWNsYXJhdGlvbiBpbiB0aGUgb3V0cHV0IGRvY3VtZW50PC9yZWY+PC9wPiAgICAKLQotICAgIDxwPkFueSBsaXRlcmFsIGVsZW1lbnQgdGhhdCBlbmRzIHVwIGluIHRoZSBvdXRwdXQgZG9jdW1lbnQgbXVzdCBkZWNsYXJlIGFsbAotICAgIG5hbWVzcGFjZXMgdGhhdCB3ZXJlIGRlY2xhcmVkIGluIHRoZSA8Y29kZT4mbHQ7eHNsOnN0eWxlc2hlZXQmbHQ7PC9jb2RlPgotICAgIGVsZW1lbnQuIEV4Y2VwdGlvbnMgYXJlIG5hbWVzcGFjZXMgdGhhdCBhcmUgbGlzdGVkIGluIHRoaXMgZWxlbWVudCdzCi0gICAgPGNvZGU+ZXhjbHVkZS1yZXN1bHQtcHJlZml4ZXM8L2NvZGU+IG9yIDxjb2RlPmV4dGVuc2lvbi1lbGVtZW50LXByZWZpeGVzPC9jb2RlPgotICAgIGF0dHJpYnV0ZXMuIFRoZXNlIG5hbWVzcGFjZXMgc2hvdWxkIG9ubHkgYmUgZGVjbGFyZWQgaWYgdGhleSBhcmUgcmVmZXJlbmNlZAotICAgIGluIHRoZSBvdXRwdXQuPC9wPgotCi0gICAgPHA+TGl0ZXJhbCBlbGVtZW50cyBzaG91bGQgb25seSBkZWNsYXJlIG5hbWVzcGFjZXMgd2hlbiBuZWNlc3NhcnkuIEEKLSAgICBsaXRlcmFsIGVsZW1lbnQgc2hvdWxkIG9ubHkgZGVjbGFyZSBhIG5hbWVzcGFjZSBpbiB0aGUgY2FzZSB3aGVyZSBpdAotICAgIHJlZmVyZW5jZXMgYSBuYW1lc3BhY2UgdXNpbmcgcHJlZml4IHRoYXQgaXMgbm90IGluIHNjb3BlIGZvciB0aGlzCi0gICAgbmFtZXNwYWNlLiBUaGUgb3V0cHV0IGhhbmRsZXIgd2lsbCB0YWtlIGNhcmUgb2YgdGhpcyBwcm9ibGVtLiBBbGwgbmFtZXNwYWNlCi0gICAgZGVjbGFyYXRpb25zIGFyZSBwdXQgaW4gdGhlIG91dHB1dCBkb2N1bWVudCB1c2luZyB0aGUgb3V0cHV0IGhhbmRsZXIncwotICAgIDxjb2RlPmRlY2xhcmVuYW1lc3BhY2UoKTwvY29kZT4gbWV0aG9kLiBUaGlzIG1ldGhvZCB3aWxsIG1vbml0b3IgYWxsIG5hbWVzcGFjZQotICAgIGRlY2xhcmF0aW9ucyBhbmQgbWFrZSBzdXJlIHRoYXQgbm8gdW5uZWNlc3NhcnkgZGVjbGFyYXRpb25zIGFyZSBvdXRwdXQuCi0gICAgVGhlIGRhdGFzdHJ1Y3R1cmVzIHVzZWQgZm9yIHRoaXMgYXJlIHNpbWlsYXIgdG8gdGhvc2UgdXNlZCB0byB0cmFjawotICAgIG5hbWVzcGFjZXMgaW4gdGhlIFhTTCBzdHlsZXNoZWV0OjwvcD4KLQotICAgIDxhbmNob3IgbmFtZT0ib3V0cHV0X25hbWVzcGFjZXMyIi8+Ci0gICAgPHA+PGltZyBzcmM9Im91dHB1dF9uYW1lc3BhY2VzMi5naWYiIGFsdD0ib3V0cHV0X25hbWVzcGFjZXMyLmdpZiIvPjwvcD4KLSAgICAgIDxwPjxyZWY+RmlndXJlIDk6IEhhbmRsaW5nIE5hbWVzcGFjZSBkZWNsYXJhdGlvbnMgaW4gdGhlIG91dHB1dCBkb2N1bWVudDwvcmVmPjwvcD4KLQotIDwvczI+Ci08L3MxPgpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y19ydW50aW1lLnhtbCBiL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdGNfcnVudGltZS54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkMGJhNDMuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y19ydW50aW1lLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQxNSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLSAgPHMxIHRpdGxlPSJYU0xUQyBydW50aW1lIGVudmlyb25tZW50Ij4KLSAgPHVsPgotICAgIDxsaT48bGluayBhbmNob3I9Im92ZXJ2aWV3Ij5SdW50aW1lIG92ZXJ2aWV3PC9saW5rPjwvbGk+Ci0gICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNsZXQiPlRoZSBjb21waWxlZCB0cmFuc2xldDwvbGluaz48L2xpPgotICAgIDxsaT48bGluayBhbmNob3I9InR5cGVzIj5FeHRlcm5hbC9pbnRlcm5hbCB0eXBlIG1hcHBpbmc8L2xpbms+PC9saT4gICAgCi0gICAgPGxpPjxsaW5rIGFuY2hvcj0ibWFpbmxvb3AiPk1haW4gcHJvZ3JhbSBsb29wPC9saW5rPjwvbGk+Ci0KLSAgPC91bD4KLSAgPGFuY2hvciBuYW1lPSJvdmVydmlldyIvPgotICA8czIgdGl0bGU9IlJ1bnRpbWUgb3ZlcnZpZXciPgotICAgIDxwPlRoZSBhY3R1YWwgdHJhbnNmb3JtYXRpb24gb2YgdGhlIGlucHV0IFhNTCBkb2N1bWVudCBpcyBpbml0aWF0ZWQgYnkKLSAgICBvbmUgb2YgdGhlc2UgY2xhc3Nlczo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIDxjb2RlPmNvbS5zdW4ueHNsdC5ydW50aW1lLkRlZmF1bHRSdW48L2NvZGU+IChydW5zIGluIGEgdGVybWluYWwpCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICA8Y29kZT5jb20uc3VuLnhzbHQuZGVtby5hcHBsZXQuVHJhbnNmb3JtQXBwbGV0PC9jb2RlPiAocnVucyBpbiBhbiBhcHBsZXQpCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICA8Y29kZT5jb20uc3VuLnhzbHQuZGVtby5zZXJ2bGV0LlRyYW5zbGF0ZTwvY29kZT4gKHJ1bnMgaW4gYSBzZXJ2bGV0KQotICAgICAgPC9saT4KLSAgICA8L3VsPgotCi0gICAgPHA+QW55IG9uZSBvZiB0aGVzZSBjbGFzc2VzIHdpbGwgaGF2ZSB0byBnbyB0aHJvdWdoIHRoZSBmb2xsb2luZyBzdGVwcyBpbgotICAgIG9yZGVyIHRvIGluaXRpYXRlIGEgdHJhbnNmb3JtYXRpb246PC9wPgotCi0gICAgPHVsPgotICAgICAgPGxpPgotICAgICAgICBJbnN0YW5jaWF0ZSB0aGUgdHJhbnNsZXQgb2JqZWN0LiBUaGUgbmFtZSBvZiB0aGUgdHJhbnNsZXQgKGllLiBjbGFzcykKLSAgICAgICAgdG8gdXNlIGlzIHBhc3NlZCB0byB1cyBhcyBhIHN0cmluZy4gV2UgdXNlIHRoaXMgc3RyaW5nIGFzIGEgcGFyYW1ldGVyCi0gICAgICAgIHRvIHRoZSBzdGF0aWMgbWV0aG9kIDxjb2RlPkNsYXNzLmZvck5hbWUoU3RyaW5nIG5hbWUpPC9jb2RlPiB0byBnZXQgYQotICAgICAgICByZWZlcmVuY2UgdG8gYSB0cmFuc2xldCBvYmplY3QuCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBJbnN0YW5jaWF0ZSBhIDxjb2RlPmNvbS5zdW4ueHNsLnBhcnNlci5QYXJzZXI8L2NvZGU+IG9iamVjdCB0byBwYXJzZSB0aGUKLSAgICAgICAgaW5wdXQgWE1MIGZpbGUsIGFuZCBpbnN0YW5jaWF0ZSBhIERPTSAod2UgaGF2ZSBvdXIgb3duIERPTQotICAgICAgICBpbXBsZW1lbnRhdGlvbiBlc3BlY2lhbGx5IGRlc2lnbmVkIGZvciBYU0xUQykgd2hlcmUgd2Ugc3RvcmUgdGhlCi0gICAgICAgIGlucHV0IGRvY3VtZW50LgotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgUGFzcyBhbnkgcGFyYW1ldGVycyB0byB0aGUgdHJhbnNsZXQgKGN1cnJlbnRseSBvbmx5IHBvc3NpYmxlIHdoZW4KLSAgICAgICAgcnVubmluZyB0aGUgdHJhbnNmb3JtYXRpb24gaW4gYSB0ZXJtaW5hbCB1c2luZyBEZWZhdWx0UnVuKQotICAgICAgPC9saT4KLSAgICAgIDxsaT4KLSAgICAgICAgSW5zdGFuY2lhdGUgYSBoYW5kbGVyIGZvciB0aGUgcmVzdWx0IGRvY3VtZW50LiBUaGlzIGhhbmRsZXIgbXVzdCBiZQotICAgICAgICBleHRlbmQgdGhlIDxjb2RlPlRyYW5zbGV0T3V0cHV0SGFuZGxlcjwvY29kZT4gY2xhc3MuCi0gICAgICA8L2xpPgotICAgICAgPGxpPgotICAgICAgICBJbnZva2UgdGhlIDxjb2RlPnRyYW5zZm9ybSgpPC9jb2RlPiBtZXRob2Qgb24gdGhlIHRyYW5zbGV0LCBwYXNzaW5nIHRoZQotICAgICAgICBpbnN0YW5jaWF0ZWQgRE9NIGFuZCB0aGUgb3V0cHV0IGhhbmRsZXIgYXMgcGFyYW1ldGVycy4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLQotICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0cmFuc2xldCIvPgotICAgIDxzMiB0aXRsZT0iVGhlIGNvbXBpbGVkIHRyYW5zbGV0Ij4KLQotICAgIDxwPkEgdHJhbnNsZXQgaXMgYWx3YXlzIGEgc3ViY2xhc3Mgb2YgPGNvZGU+QWJzdHJhY3RUcmFuc2xldDwvY29kZT4uIEFzIHdlbGwKLSAgICBhcyBoYXZpbmcgYWNjZXNzIHRvIHRoZSBwdWJsaWMvcHJvdGVjdGVkIG1ldGhvZHMgaW4gdGhpcyBjbGFzcywgdGhlCi0gICAgdHJhbnNsZXQgaXMgY29tcGlsZWQgd2l0aCB0aGVzZSBtZXRob2RzOjwvcD4KLQotICAgIDxwPjxjb2RlPnB1YmxpYyB2b2lkIHRyYW5zZm9ybShET00sIE5vZGVJdGVyYXRvciwgVHJhbnNsZXRPdXRwdXRIYW5kbGVyKTs8L2NvZGU+PC9wPgotCi0gICAgPHA+VGhpcyBtZXRob2QgaXMgcGFzc2VkIGEgPGNvZGU+RE9NSW1wbDwvY29kZT4gb2JqZWN0LiBEZXBlbmRpbmcgb24gd2hldGhlcgotICAgIHRoZSBzdHlsZXNoZWV0IGhhZCBhbnkgY2FsbHMgdG8gdGhlIDxjb2RlPmRvY3VtZW50KCk8L2NvZGU+IGZ1bmN0aW9uIHRoaXMKLSAgICBtZXRob2Qgd2lsbCBlaXRoZXIgZ2VuZXJhdGUgYSA8Y29kZT5ET01BZGFwdGVyPC9jb2RlPiBvYmplY3QgKHdoZW4gb25seSBvbmUKLSAgICBYTUwgZG9jdW1lbnQgaXMgdXNlZCBhcyBpbnB1dCkgb3IgYSA8Y29kZT5NdWx0aURPTTwvY29kZT4gb2JqZWN0ICh3aGVuIHRoZXJlCi0gICAgYXJlIG1vcmUgdGhhbiBvbmUgWE1MIGlucHV0IGRvY3VtZW50cykuIFRoaXMgRE9NIG9iamVjdCBpcyBwYXNzZWQgb24gdG8KLSAgICB0aGUgPGNvZGU+dG9wTGV2ZWwoKTwvY29kZT4gbWV0aG9kLjwvcD4KLQotICAgIDxwPldoZW4gdGhlIDxjb2RlPnRvcExldmVsKCk8L2NvZGU+IG1ldGhvZCByZXR1cm5zIHdlIGluaXRpYXRlIHRoZSBvdXRwdXQKLSAgICBkb2N1bWVudCBieSBjYWxsaW5nIDxjb2RlPnN0YXJ0RG9jdW1lbnQoKTwvY29kZT4gb24gdGhlIHN1cHBsaWVkIG91dHB1dAotICAgIGhhbmRsZXIgb2JqZWN0LiBXZSB0aGVuIGNhbGwgPGNvZGU+YXBwbHlUZW1wbGF0ZXMoKTwvY29kZT4gdG8gZ2V0IHRoZSBhY3R1YWwKLSAgICBvdXRwdXQgY29udGVudHMsIGJlZm9yZSB3ZSBjbG9zZSB0aGUgb3V0cHV0IGRvY3VtZW50IGJ5IGNhbGxpbmcKLSAgICA8Y29kZT5lbmREb2N1bWVudCgpPC9jb2RlPiBvbiB0aGUgb3V0cHV0IGhhbmRsZXIuPC9wPgotCi0gICAgPHA+PGNvZGU+cHVibGljIHZvaWQgdG9wTGV2ZWwoRE9NLCBOb2RlSXRlcmF0b3IsIFRyYW5zbGV0T3V0cHV0SGFuZGxlcik7PC9jb2RlPjwvcD4KLQotICAgIDxwPlRoaXMgbWV0aG9kIGhhbmRsZXMgYWxsIG9mIHRoZXNlIHRvcC1sZXZlbCBlbGVtZW50czo8L3A+Ci0gICAgPHVsPgotICAgICAgPGxpPjxjb2RlPiZsdDt4c2w6b3V0cHV0Jmd0OzwvY29kZT48L2xpPgotICAgICAgPGxpPjxjb2RlPiZsdDt4c2w6ZGVjaW1hbC1mb3JtYXQmZ3Q7PC9jb2RlPjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+Jmx0O3hzbDprZXkmZ3Q7PC9jb2RlPjwvbGk+Ci0gICAgICA8bGk+PGNvZGU+Jmx0O3hzbDpwYXJhbSZndDs8L2NvZGU+IChmb3IgZ2xvYmFsIHBhcmFtZXRlcnMpPC9saT4KLSAgICAgIDxsaT48Y29kZT4mbHQ7eHNsOnZhcmlhYmxlJmd0OzwvY29kZT4gKGZvciBnbG9iYWwgdmFyaWFibGVzKTwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPjxjb2RlPnB1YmxpYyB2b2lkIGFwcGx5VGVtcGxhdGVzKERPTSwgTm9kZUl0ZXJhdG9yLCBUcmFuc2xldE91dHB1dEhhbmRsZXIpOzwvY29kZT48L3A+Ci0KLSAgICA8cD5UaGlzIGlzIHRoZSBtZXRob2QgdGhhdCBwcm9kdWNlcyB0aGUgYWN0dWFsIG91dHB1dC4gSXRzIGNlbnRyYWwgZWxlbWVudAotICAgIGlzIGEgYmlnIDxjb2RlPnN3aXRjaCgpPC9jb2RlPiBzdGF0ZW1lbnQgdGhhdCBpcyB1c2VkIHRvIGNob29zZSB0aGUgYXZhaWxhYmxlCi0gICAgdGVtcGxhdGVzIGZvciB0aGUgdmFyaW91cyBub2RlIGluIHRoZSBpbnB1dCBkb2N1bWVudC4gU2VlIHRoZSBjaGFwdGVyCi0gICAgPGxpbmsgYW5jaG9yPSJtYWlubG9vcCI+TWFpbiBQcm9ncmFtIExvb3A8L2xpbms+IGZvciBkZXRhaWxzIG9uIHRoaXMgbWV0aG9kLjwvcD4KLQotICAgIDxwPjxjb2RlPnB1YmxpYyB2b2lkICZsdDtpbml0Jmd0OyAoKTs8L2NvZGU+PC9wPgotICAgIDxhbmNob3IgbmFtZT0ibmFtZXNhcnJheSIvPgotICAgIDxwPlRoZSB0cmFuc2xldCdzIGNvbnN0cnVjdG9yIGluaXRpYWxpemVzIGEgdGFibGUKLSAgICBvZiBhbGwgdGhlIGVsZW1lbnRzIHdlIHdhbnQgdG8gc2VhcmNoIGZvciBpbiB0aGUgWE1MIGlucHV0IGRvY3VtZW50LgotICAgIFRoaXMgdGFibGUgaXMgY2FsbGVkIHRoZSA8Y29kZT5uYW1lc0FycmF5PC9jb2RlPiBhbmQgaXQgaXMgcGFzc2VkIHRvIHRoZSBET00KLSAgICBob2xkaW5nIHRoZSBpbnB1dCBYTUwgZG9jdW1lbnQuPC9wPgotCi0gICAgPHA+VGhlIGNvbnN0cnVjdG9yIGFsc28gaW5pdGlhbGl6ZXMgYW55IDxjb2RlPkRlY2ltYWxGb3JtYXRTeW1ib2w8L2NvZGU+Ci0gICAgb2JqZWN0cyB0aGF0IGFyZSB1c2VkIHRvIGZvcm1hdCBudW1iZXJzIGJlZm9yZSBwYXNzaW5nIHRoZW0gdG8gdGhlCi0gICAgb3V0cHV0IGhhbmRsZXIuPC9wPgotCi0gICAgPHA+PGNvZGU+cHVibGljIGJvb2xlYW4gc3RyaXBTcGFjZShpbnQgbm9kZVR5cGUpOzwvY29kZT48L3A+Ci0KLSAgICA8cD5UaGlzIG1ldGhvZCBpcyBvbmx5IHByZXNlbnQgaWYgYW55IDxjb2RlPiZsdDt4c2w6c3RyaXAtc3BhY2UmZ3Q7PC9jb2RlPiBvcgotICAgIDxjb2RlPiZsdDt4c2w6cHJlc2VydmUtc3BhY2UmZ3Q7PC9jb2RlPiBlbGVtZW50cyBhcmUgcHJlc2VudCBpbiB0aGUgc3R5bGVzaGVldC4KLSAgICBJZiB0aGF0IGlzIHRoZSBjYXNlLCB0aGUgdHJhbnNsZXQgaW1wbGVtZW50cyB0aGUKLSAgICA8Y29kZT5TdHJpcFdoaXRlc3BhY2VGaWx0ZXI8L2NvZGU+IGludGVyZmFjZSBieSBjb250YWluaW5nIHRoaXMgbWV0aG9kLjwvcD4KLQotICAgIDwvczI+PGFuY2hvciBuYW1lPSJ0eXBlcyIvPgotICAgIDxzMiB0aXRsZT0iRXh0ZXJuYWwvaW50ZXJuYWwgdHlwZSBtYXBwaW5nIj4KLQotICAgIDxhbmNob3IgbmFtZT0iZXh0ZXJuYWwtdHlwZXMiLz4KLQotICAgIDxwPlRoaXMgaXMgdGhlIHZlcnkgY29yZSBvZiBYU0wgdHJhbnNmb3JtYXRpb25zOiA8ZW0+UmVhZCBjYXJlZnVsbHkhISE8L2VtPjwvcD4KLQotICAgIDxwPkV2ZXJ5IG5vZGUgaW4gdGhlIGlucHV0IFhNTCBkb2N1bWVudChzKSBpcyBhc3NpZ25lZCBhIHR5cGUgYnkgdGhlCi0gICAgRE9NIGJ1aWxkZXIgY2xhc3MuIFRoaXMgdHlwZSBpcyBhbiBpbnRlZ2VyIHZhbHVlIHdoaWNoIHJlcHJlc2VudHMgdGhlCi0gICAgZWxlbWVudCwgc28gdGhhdCBmb3IgaW5zdGFuY2UgYWxsIDxjb2RlPiZsdDtib2ImZ3Q7PC9jb2RlPiBlbGVtZW50cyBpbiB0aGUKLSAgICBpbnB1dCBkb2N1bWVudCB3aWxsIGJlIGdpdmVuIHR5cGUgPHJlZj43PC9yZWY+IGFuZCBjYW4gYmUgcmVmZXJyZWQgdG8gYnkgdXNpbmcKLSAgICB0aGF0IGludGVnZXIuIFRoZXNlIHR5cGVzIGNhbiBiZSB1c2VkIGZvciBsb29rdXBzIGluIHRoZQotICAgIDxsaW5rIGFuY2hvcj0ibmFtZXNhcnJheSI+bmFtZXNBcnJheTwvbGluaz4gdGFibGUgdG8gZ2V0IHRoZSBhY3R1YWwKLSAgICBlbGVtZW50IG5hbWUgKGluIHRoaXMgY2FzZSAiYm9iIikuIFRoZXNlIHR5cGVzIGFyZSByZWZlcnJlZCB0byBhcwotICAgIDxlbT5leHRlcm5hbCB0eXBlczwvZW0+IG9yIDxlbT5ET00gdHlwZXM8L2VtPiwgYXMgdGhleSBhcmUgdHlwZXMga25vd24gb25seQotICAgIHRvIHRoZSBET00gYW5kIHRoZSBET00gYnVpbGRlci48L3A+Ci0KLSAgICA8YW5jaG9yIG5hbWU9ImludGVybmFsLXR5cGVzIi8+Ci0KLSAgICA8cD5TaW1pbGFybHkgdGhlIHRyYW5zbGV0IGFzc2lnbmVzIHR5cGVzIHRvIGFsbCBlbGVtZW50IGFuZCBhdHRyaWJ1dGUgbmFtZXMKLSAgICB0aGF0IGFyZSByZWZlcmVuY2VkIGluIHRoZSBzdHlsZXNoZWV0LiBUaGVzZSB0eXBlcyBhcmUgcmVmZXJyZWQgdG8gYXMKLSAgICA8ZW0+aW50ZXJuYWwgdHlwZXM8L2VtPiBvciA8ZW0+dHJhbnNsZXQgdHlwZXM8L2VtPi48L3A+Ci0KLSAgICA8cD5JdCBpcyBub3QgdmVyeSBwcm9iYWJsZSB0aGF0IHRoZXJlIHdpbGwgYmUgYSBvbmUtdG8tb25lIG1hcHBpbmcgYmV0d2VlbgotICAgIGludGVybmFsIGFuZCBleHRlcm5hbCB0eXBlcy4gVGhlcmUgd2lsbCBtb3N0IG9mdGVuIGJlIGVsZW1lbnRzIGluIHRoZSBET00KLSAgICAoaWUuIHRoZSBpbnB1dCBkb2N1bWVudCkgdGhhdCBhcmUgbm90IG1lbnRpb25lZCBpbiB0aGUgc3R5bGVzaGVldCwgYW5kCi0gICAgdGhlcmUgY291bGQgYmUgZWxlbWVudHMgaW4gdGhlIHN0eWxlc2hlZXQgdGhhdCBkbyBub3QgbWF0Y2ggYW55IGVsZW1lbnRzCi0gICAgaW4gdGhlIERPTS4gSGVyZSBpcyBhbiBleGFtcGxlOjwvcD4KLQotPHNvdXJjZT4KLSAgICAgICZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotICAgICAgJmx0O3hzbDpzdHlsZXNoZWV0IHZlcnNpb249IjEuMCIgeG1sbnM6eHNsPSJibGFoYmxhaGJsYWgiJmd0OwotCi0gICAgICAmbHQ7eHNsOnRlbXBsYXRlIG1hdGNoPSIvIiZndDsKLSAgICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9Ii8vQiImZ3Q7Ci0gICAgICAgICAgJmx0O3hzbDphcHBseS10ZW1wbGF0ZXMgc2VsZWN0PSIuIiAvJmd0OwotICAgICAgICAmbHQ7L3hzbDpmb3ItZWFjaCZndDsKLSAgICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9IkMiJmd0OwotICAgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgLyZndDsKLSAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAgICZsdDt4c2w6Zm9yLWVhY2ggc2VsZWN0PSJBL0IiJmd0OwotICAgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgLyZndDsKLSAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLQotICAgICZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Ci08L3NvdXJjZT4KLQotICAgIDxwPkluIHRoaXMgc3R5bGVzaGVldCB3ZSBhcmUgbG9va2luZyBmb3IgZWxlbWVudHMgPGNvZGU+Jmx0O0ImZ3Q7PC9jb2RlPiwKLSAgICA8Y29kZT4mbHQ7QyZndDs8L2NvZGU+IGFuZCA8Y29kZT4mbHQ7QSZndDs8L2NvZGU+LiBGb3IgdGhpcyBleGFtcGxlIHdlIGNhbiBhc3N1bWUKLSAgICB0aGF0IHRoZXNlIGVsZW1lbnQgdHlwZXMgd2lsbCBiZSBhc3NpZ25lZCB0aGUgdmFsdWVzIDAsIDEgYW5kIDIuIE5vdywgbGV0cwotICAgIHNheSB3ZSBhcmUgdHJhbnNmb3JtaW5nIHRoaXMgWE1MIGRvY3VtZW50OjwvcD4KLQotPHNvdXJjZT4KLSAgICAgICZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotCi0gICAgICAmbHQ7QSZndDsKLSAgICAgICAgVGhlIGNyb2NvZGlsZSBjcmllZDoKLSAgICAgICAgJmx0O0YmZ3Q7Zm9vJmx0Oy9GJmd0OwotICAgICAgICAmbHQ7QiZndDtiYXImbHQ7L0ImZ3Q7Ci0gICAgICAgICZsdDtCJmd0O2JheiZsdDsvQiZndDsKLSAgICAgICZsdDsvQSZndDsKLTwvc291cmNlPgotCi0gICAgPHA+VGhpcyBYTUwgZG9jdW1lbnQgaGFzIHRoZSBlbGVtZW50cyA8Y29kZT4mbHQ7QSZndDs8L2NvZGU+LAotICAgIDxjb2RlPiZsdDtCJmd0OzwvY29kZT4gYW5kIDxjb2RlPiZsdDtGJmd0OzwvY29kZT4sIHdoaWNoIHdlIGFzc3VtZSBhcmUgYXNzaWduZWQgdGhlCi0gICAgdHlwZXMgNywgOCBhbmQgOSByZXNwZWN0aXZlbHkgICh0aGUgbnVtYmVycyBiZWxvdyB0aGF0IGFyZSBhc3NpZ25lZCBmb3IKLSAgICBzcGVjaWZpYyBlbGVtZW50IHR5cGVzLCBzdWNoIGFzIHRoZSByb290IG5vZGUsIHRleHQgbm9kZXMsIGV0Yy4pLiBUaGlzCi0gICAgY2F1c2VzIGEgbWlzbWF0Y2ggYmV0d2VlbiB0aGUgdHlwZSB1c2VkIGZvciA8Y29kZT4mbHQ7QiZndDs8L2NvZGU+IGluIHRoZQotICAgIHRyYW5zbGV0IGFuZCB0aGUgdHlwZSB1c2VkIGZvciA8Y29kZT4mbHQ7QiZndDs8L2NvZGU+IGluIHRoZSBET00uIFRoCi0gICAgRE9NQWRhcHRlciBjbGFzcyAod2hpY2ggbWVkaWF0ZXMgYmV0d2VlbiB0aGUgRE9NIGFuZCB0aGUgdHJhbnNsZXQpIGhhcyBiZWVuCi0gICAgZ2l2ZW4gdHdvIHRhYmxlcyBmb3IgY29udmVydGludCBiZXR3ZWVuIHRoZSB0d28gdHlwZXM7IDxjb2RlPm1hcHBpbmc8L2NvZGU+IGZvcgotICAgIG1hcHBpbmcgZnJvbSBpbnRlcm5hbCB0byBleHRlcm5hbCB0eXBlcywgYW5kIDxjb2RlPnJldmVyc2VNYXBwaW5nPC9jb2RlPiBmb3IKLSAgICB0aGUgb3RoZXIgd2F5IGFyb3VuZC48L3A+Ci0KLSAgICA8cD5UaGUgdHJhbnNsZXQgY29udGFpbnMgYSA8Y29kZT5TdHJpbmdbXTwvY29kZT4gYXJyYXkgY2FsbGVkCi0gICAgPGNvZGU+bmFtZXNBcnJheTwvY29kZT4uIFRoaXMgYXJyYXkgd2lsbCBjb250YWluIGFsbCB0aGUgZWxlbWVudCBhbmQgYXR0cmlidXRlCi0gICAgbmFtZXMgdGhhdCB3ZXJlIHJlZmVyZW5jZWQgaW4gdGhlIHN0eWxlc2hlZXQuIEluIG91ciBleGFtcGxlLCB0aGlzIGFycmF5Ci0gICAgd291bGQgY29udGFpbiB0aGVzZSBzdHJpbmcgKGluIHRoaXMgc3BlY2lmaWMgb3JkZXIpOiAmcXVvdDtCJnF1b3Q7LCAKLSAgICAmcXVvdDtDJnF1b3Q7IGFuZCAmcXVvdDtBJnF1b3Q7LiBUaGlzIGFycmF5IGlzIHBhc3NlZCBhcyBvbmUgb2YgdGhlCi0gICAgcGFyYW1ldGVycyB0byB0aGUgRE9NIGFkYXB0ZXIgY29uc3RydWN0b3IgKHRoZSBvdGhlciBhZGFwdGVyIGlzIHRoZSBET00KLSAgICBpdHNlbGYpLiBUaGUgRE9NIGFkYXB0ZXIgcGFzc2VzIHRoaXMgdGFibGUgb24gdG8gdGhlIERPTS4gVGhlIERPTSBoYXMKLSAgICBhIGhhc2h0YWJsZSB0aGF0IG1hcHMga25vd24gZWxlbWVudCBuYW1lcyB0byBleHRlcm5hbCB0eXBlcy4gVGhlIERPTSBnb2VzCi0gICAgdGhyb3VnaCB0aGUgPGNvZGU+bmFtZXNBcnJheTwvY29kZT4gZnJvbSB0aGUgRE9NIHNlcXVlbnRpYWxseSwgbG9va3MgdXAgZWFjaAotICAgIG5hbWUgaW4gdGhlIGhhc2h0YWJsZSwgYW5kIGlzIHRoZW4gYWJsZSB0byBtYXAgdGhlIGludGVybmFsIHR5cGUgdG8gYW4KLSAgICBleHRlcm5hbCB0eXBlLiBUaGUgcmVzdWx0IGlzIHRoZW4gcGFzc2VkIGJhY2sgdG8gdGhlIERPTSBhZGFwdGVyLjwvcD4KLQotICAgIDxwPlRoZSByZXZlcnNlIGlzIGRvbmUgZm9yIGV4dGVybmFsIHR5cGVzLiBFeHRlcm5hbCB0eXBlcyB0aGF0IGFyZSBub3QKLSAgICBpbnRlcmVzdGluZyBmb3IgdGhlIHRyYW5zbGV0IChzdWNoIGFzIHRoZSB0eXBlIGZvciA8Y29kZT4mbHQ7RiZndDs8L2NvZGU+Ci0gICAgZWxlbWVudHMgaW4gdGhlIGV4YW1wbGUgYWJvdmUpIGFyZSBtYXBwZWQgdG8gYSBnZW5lcmljIDxjb2RlPiJFTEVNRU5UIjwvY29kZT4KLSAgICB0eXBlIDMsIGFuZCBhcmUgbW9yZSBvciBsZXNzIGlnbm9yZWQgYnkgdGhlIHRyYW5zbGV0LjwvcD4KLQotICAgIDxwPkl0IGlzIGltcG9ydGFudCB0aGF0IHdlIHNlcGFyYXRlIHRoZSBET00gZnJvbSB0aGUgdHJhbnNsZXQuIEluIHNldmVyYWwKLSAgICBjYXNlcyB3ZSB3YW50IHRoZSBET00gYXMgYSBzdHJ1Y3R1cmUgY29tcGxldGVseSBpbmRlcGVuZGVudCBmcm9tIHRoZQotICAgIHRyYW5zbGV0IC0gZXZlbiB0aG91Z2ggdGhlIERPTSBpcyBhIHN0cnVjdHVyZSBpbnRlcm5hbCB0byBYU0xUQy4gT25lIHN1Y2gKLSAgICBjYXNlIGlzIHdoZW4gdHJhbnNmb3JtYXRpb25zIGFyZSBvZmZlcmVkIGJ5IGEgc2VydmxldCBhcyBhIHdlYiBzZXJ2aWNlLgotICAgIEFueSBET00gdGhhdCBpcyBidWlsdCBzaG91bGQgcG90ZW50aWFsbHkgYmUgc3RvcmVkIGluIGEgY2FjaGUgYW5kIG1hZGUKLSAgICBhdmFpbGFibGUgZm9yIHNpbXVsdGFuZW91cyBhY2Nlc3MgYnkgc2V2ZXJhbCB0cmFuc2xldC9zZXJ2bGV0IGNvdXBsZXMuPC9wPgotCi0gICAgPHA+PGltZyBzcmM9InJ1bnRpbWVfdHlwZV9tYXBwaW5nLmdpZiIgYWx0PSJydW50aW1lX3R5cGVfbWFwcGluZy5naWYiLz48L3A+Ci0gICAgPHA+PHJlZj5GaWd1cmUgMTogVHdvIHRyYW5zbGV0cyBhY2Nlc3NpbmcgYSBzaW5nbGUgZG9tIHVzaW5nIGRpZmZlcmVudCB0eXBlIG1hcHBpbmdzPC9yZWY+PC9wPgotCi0gICAgPC9zMj48YW5jaG9yIG5hbWU9Im1haW5sb29wIi8+Ci0gICAgPHMyIHRpdGxlPSJNYWluIHByb2dyYW0gbG9vcCI+Ci0KLSAgICA8cD5UaGUgbWFpbiBsb29wIGluIHRoZSB0cmFuc2xldCBpcyBmb3VuZCBpbiB0aGUgPGNvZGU+YXBwbHlUZW1wbGF0ZXMoKTwvY29kZT4KLSAgICBtZXRob2QuIFRoaXMgbWV0aG9kIGdvZXMgdGhyb3VnaCB0aGVzZSBzdGVwczo8L3A+Ci0KLSAgICA8dWw+Ci0gICAgICA8bGk+Ci0gICAgICAgIEdldCB0aGUgbmV4dCBub2RlIGZyb20gdGhlIG5vZGUgaXRlcmF0b3IKLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIEdldCB0aGUgaW50ZXJuYWwgdHlwZSBvZiB0aGlzIG5vZGUuIFRoZSBET01BZGFwdGVyIG9iamVjdCBob2xkcyB0aGUKLSAgICAgICAgaW50ZXJuYWwvZXh0ZXJuYWwgdHlwZSBtYXBwaW5nIHRhYmxlLCBhbmQgaXQgd2lsbCBzdXBwbHkgdGhlIHRyYW5zbGV0Ci0gICAgICAgIHdpdGggdGhlIGludGVybmFsIHR5cGUgb2YgdGhlIGN1cnJlbnQgbm9kZS4KLSAgICAgIDwvbGk+Ci0gICAgICA8bGk+Ci0gICAgICAgIEV4ZWN1dGUgYSBzd2l0Y2ggc3RhdGVtZW50IG9uIHRoZSBpbnRlcm5hbCBub2RlIHR5cGUuIFRoZXJlIHdpbGwgYmUKLSAgICAgICAgb25lICJjYXNlIiBsYWJlbCBmb3IgZWFjaCByZWNvZ25pc2VkIG5vZGUgdHlwZSAtIHRoaXMgaW5jbHVkZXMgdGhlCi0gICAgICAgIGZpcnN0IDcgaW50ZXJuYWwgbm9kZSB0eXBlcy4KLSAgICAgIDwvbGk+Ci0gICAgPC91bD4KLQotICAgIDxwPlRoZSByb290IG5vZGUgd2lsbCBoYXZlIGludGVybmFsIHR5cGUgMCBhbmQgd2lsbCBjYXVzZSBhbnkgaW5pdGlhbAotICAgIGxpdGVyYWwgZWxlbWVudHMgdG8gYmUgb3V0cHV0LiBUZXh0IG5vZGVzIHdpbGwgaGF2ZSBpbnRlcm5hbCBub2RlIHR5cGUgMQotICAgIGFuZCB3aWxsIHNpbXBseSBiZSBkdW1wZWQgdG8gdGhlIG91dHB1dCBoYW5kbGVyLiBVbnJlY29nbml6ZWQgZWxlbWVudHMKLSAgICB3aWxsIGhhdmUgaW50ZXJuYWwgbm9kZSB0eXBlIDMgYW5kIHdpbGwgYmUgZ2l2ZW4gdGhlIGRlZmF1bHQgdHJlYXRtZW50Ci0gICAgKGEgbmV3IGl0ZXJhdG9yIGlzIGNyZWF0ZWQgZm9yIHRoZSBub2RlJ3MgY2hpbGRyZW4sIGFuZCB0aGlzIGl0ZXJhdG9yCi0gICAgaXMgcGFzc2VkIHdpdGggYSByZWN1cnNpdmUgY2FsbCB0byA8Y29kZT5hcHBseVRlbXBsYXRlcygpPC9jb2RlPikuCi0gICAgVW5yZWNvZ25pc2VkIGF0dHJpYnV0ZSBub2RlcyAodHlwZSA0KSB3aWxsIGJlIGhhbmRsZWQgbGlrZSB0ZXh0IG5vZGVzLgotICAgIFRoZSA8Y29kZT5zd2l0Y2goKTwvY29kZT4gc3RhdGVtZW50IGluIDxjb2RlPmFwcGx5VGVtcGxhdGVzPC9jb2RlPiB3aWxsIHRoZXJlYnkKLSAgICBsb29rIHNvbWV0aGluZyBsaWtlIHRoaXM6PC9wPgotCi08c291cmNlPgotICAgICAgICBwdWJsaWMgdm9pZCBhcHBseVRlbXBsYXRlcyhET00gZG9tLCBOb2RlSXRlcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYW5zbGV0T3V0cHV0SGFuZGxlciBoYW5kbGVyKSB7Ci0KLSAgICAgICAgICAgIC8vIGdldCBub2RlcyBmcm9tIGl0ZXJhdG9yCi0gICAgICAgICAgICB3aGlsZSAoKG5vZGUgPSBpdGVyYXRvci5uZXh0KCkpICE9IEVORCkgewotICAgICAgICAgICAgICAgIC8vIGdldCBpbnRlcm5hbCBub2RlIHR5cGUKLSAgICAgICAgICAgICAgICBzd2l0Y2goRE9NLmdldFR5cGUobm9kZSkpIHsKLQotICAgICAgICAgICAgICAgIGNhc2UgMDogLy8gcm9vdAotICAgICAgICAgICAgICAgICAgICBvdXRwdXRQcmVhYmxlKGhhbmRsZXIpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDE6IC8vIHRleHQKLSAgICAgICAgICAgICAgICAgICAgRE9NLmNoYXJhY3RlcnMobm9kZSxoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSAzOiAvLyB1bnJlY29nbmlzZWQgZWxlbWVudAotICAgICAgICAgICAgICAgICAgICBOb2RlSXRlcmF0b3IgbmV3SXRlcmF0b3IgPSBET00uZ2V0Q2hpbGRyZW4obm9kZSk7Ci0gICAgICAgICAgICAgICAgICAgIGFwcGx5VGVtcGxhdGVzKERPTSxuZXdJdGVyYXRvcixoYW5kbGVyKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSA0OiAvLyB1bnJlY29nbmlzZWQgYXR0cmlidXRlCi0gICAgICAgICAgICAgICAgICAgIERPTS5jaGFyYWN0ZXJzKG5vZGUsaGFuZGxlcik7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgNzogLy8gZWxlbWVudHMgb2YgdHlwZSAmbHQ7QiZndDsKLSAgICAgICAgICAgICAgICAgICAgc29tZUNvbXBpbGVkQ29kZSgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIDg6IC8vIGVsZW1lbnRzIG9mIHR5cGUgJmx0O0MmZ3Q7Ci0gICAgICAgICAgICAgICAgICAgIG90aGVyQ29tcGlsZWRDb2RlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotPC9zb3VyY2U+Ci0KLSAgICA8cD5FYWNoIHJlY29nbmlzZWQgZWxlbWVudCB3aWxsIGhhdmUgaXRzIG93biBwaWVjZSBvZiBjb21waWxlZCBjb2RlLjwvcD4KLQotICAgIDxwPk5vdGUgdGhhdCBlYWNoICJjYXNlIiB3aWxsIG5vdCBsZWFkIGRpcmVjdGx5IHRvIGEgc2luZ2xlIHRlbXBsYXRlLgotICAgIFRoZXJlIG1heSBiZSBzZXZlcmFsIHRlbXBsYXRlcyB0aGF0IG1hdGNoIG5vZGUgdHlwZSA3Ci0gICAgKHNheSA8Y29kZT4mbHQ7QiZndDs8L2NvZGU+KS4gSW4gdGhlIHNhbXBsZSBzdHlsZXNoZWV0IGluIHRoZSBwcmV2aW91cyBjaGFwdGVyCi0gICAgd2UgaGF2ZSB0byB0ZW1wbGF0ZXMgdGhhdCB3b3VsZCBtYXRjaCBhIG5vZGUgPGNvZGU+Jmx0O0ImZ3Q7PC9jb2RlPi4gV2UgaGF2ZQotICAgIG9uZSA8Y29kZT5tYXRjaD0iLy9CIjwvY29kZT4gKG1hdGNoIGp1c3QgYW55IDxjb2RlPiZsdDtCJmd0OzwvY29kZT4gZWxlbWVudCkgYW5kCi0gICAgb25lIDxjb2RlPm1hdGNoPSJBL0IiPC9jb2RlPiAobWF0Y2ggYSA8Y29kZT4mbHQ7QiZndDs8L2NvZGU+IGVsZW1lbnQgdGhhdCBpcyBhCi0gICAgY2hpbGQgb2YgYSA8Y29kZT4mbHQ7QSZndDs8L2NvZGU+IGVsZW1lbnQpLiBJbiB0aGlzIGNhc2Ugd2Ugd291bGQgaGF2ZSB0bwotICAgIGNvbXBpbGUgY29kZSB0aGF0IGZpcnN0IGdldHMgdGhlIHR5cGUgb2YgdGhlIGN1cnJlbnQgbm9kZSdzIHBhcmVudCwgYW5kCi0gICAgdGhlbiBjb21wYXJlZCB0aGlzIHR5cGUgd2l0aCB0aGUgdHlwZSBmb3IgPGNvZGU+Jmx0O0EmZ3Q7PC9jb2RlPi4gSWYgdGhlcmUgd2FzCi0gICAgbm8gbWF0Y2ggd2Ugd2lsbCBoYXZlIGV4ZWN1dGVkIHRoZSBmaXJzdCA8Y29kZT4mbHQ7eHNsOmZvci1lYWNoJmd0OzwvY29kZT4KLSAgICBlbGVtZW50LCBidXQgaWYgdGhlcmUgd2FzIGEgbWF0Y2ggd2Ugd2lsbCBoYXZlIGV4ZWN1dGVkIHRoZSBsYXN0IG9uZS4KLSAgICBDb25zZXF1ZW50YWxseSwgdGhlIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgdGhlIGZvbGxvd2luZyBjb2RlOjwvcD4KLQotPHNvdXJjZT4KLSAgICAgICAgc3dpdGNoKERPTS5nZXRUeXBlKG5vZGUpKSB7Ci0gICAgICAgICAgOgotICAgICAgICAgIDoKLSAgICAgICAgY2FzZSA3OiAvLyBlbGVtZW50cyBvZiB0eXBlICZsdDtCJmd0OwotICAgICAgICAgICAgaW50IHBhcmVudCA9IERPTS5nZXRQYXJlbnQobm9kZSk7Ci0gICAgICAgICAgICBpZiAoRE9NLmdldFR5cGUocGFyZW50KSA9PSA5KSAvLyB0eXBlIDkgPSBlbGVtZW50cyAmbHQ7QSZndDsKLSAgICAgICAgICAgICAgICBzb21lQ29tcGlsZWRDb2RlKCk7Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgZXZlbk90aGVyQ29tcGlsZWRDb2RlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICA6Ci0gICAgICAgICAgOgotICAgICAgICB9Ci08L3NvdXJjZT4KLQotICAgIDxwPldlIGNvdWxkIGRvIHRoZSBzYW1lIGZvciBuYW1lc3BhY2VzLCB0aGF0IGlzLCBhc3NpZ24gYSBudW1lcmljIHZhbHVlCi0gICAgdG8gZXZlcnkgbmFtZXNwYWNlIHRoYXQgaXMgcmVmZXJlbmNlcyBpbiB0aGUgc3R5bGVzaGVldCwgYW5kIHVzZSBhbgotICAgIDxjb2RlPiJpZiI8L2NvZGU+IHN0YXRlbWVudCBmb3IgZWFjaCBuYW1lc3BhY2UgdGhhdCBuZWVkcyB0byBiZSBjaGVja2VkIGZvcgotICAgIGVhY2ggdHlwZS4gTGV0cyBzYXkgd2UgaGFkIGEgc3R5bGVzaGVldCBsaWtlIHRoaXM6PC9wPgotCi08c291cmNlPgotICAgICAgJmx0Oz94bWwgdmVyc2lvbj0iMS4wIj8mZ3Q7Ci0gICAgICAmbHQ7eHNsOnN0eWxlc2hlZXQgdmVyc2lvbj0iMS4wIiB4bWxuczp4c2w9ImJsYWhibGFoYmxhaCImZ3Q7Ci0KLSAgICAgICZsdDt4c2w6dGVtcGxhdGUgbWF0Y2g9Ii8iCi0gICAgICAgICAgeG1sbnM6Zm9vPSJodHRwOi8vZm9vLmNvbS9zcGVjIgotICAgICAgICAgIHhtbG5zOmJhcj0iaHR0cDovL2Jhci5uZXQvcmVmIiZndDsKLSAgICAgICAgJmx0O3hzbDpmb3ItZWFjaCBzZWxlY3Q9ImZvbzpBIiZndDsKLSAgICAgICAgICAmbHQ7eHNsOmFwcGx5LXRlbXBsYXRlcyBzZWxlY3Q9Ii4iIC8mZ3Q7Ci0gICAgICAgICZsdDsveHNsOmZvci1lYWNoJmd0OwotICAgICAgICAmbHQ7eHNsOmZvci1lYWNoIHNlbGVjdD0iYmFyOkEiJmd0OwotICAgICAgICAgICZsdDt4c2w6YXBwbHktdGVtcGxhdGVzIHNlbGVjdD0iLiIgLyZndDsKLSAgICAgICAgJmx0Oy94c2w6Zm9yLWVhY2gmZ3Q7Ci0gICAgICAmbHQ7L3hzbDp0ZW1wbGF0ZSZndDsKLQotICAgICZsdDsveHNsOnN0eWxlc2hlZXQmZ3Q7Ci08L3NvdXJjZT4KLQotICAgIDxwPkFuZCBhIHN0eWxlc2hlZXQgbGlrZSB0aGlzOjwvcD4KLQotPHNvdXJjZT4KLSAgICAgICZsdDs/eG1sIHZlcnNpb249IjEuMCI/Jmd0OwotCi0gICAgICAmbHQ7RE9DCi0gICAgICAgICAgeG1sbnM6Zm9vPSJodHRwOi8vZm9vLmNvbS9zcGVjIgotICAgICAgICAgIHhtbG5zOmJhcj0iaHR0cDovL2Jhci5uZXQvcmVmIiZndDsKLSAgICAgICAgJmx0O2ZvbzpBJmd0O0luIGZvbyBuYW1lc3BhY2UmbHQ7L2ZvbzpBJmd0OwotICAgICAgICAmbHQ7YmFyOkEmZ3Q7SW4gYmFyIG5hbWVzcGFjZSZsdDsvYmFyOkEmZ3Q7Ci0gICAgICAmbHQ7L0RPQyZndDsKLTwvc291cmNlPgotCi0gICAgPHA+V2UgY291bGQgc3RpbGwga2VlcCB0aGUgc2FtZSB0eXBlIGZvciBhbGwgPGNvZGU+Jmx0O0EmZ3Q7PC9jb2RlPiBlbGVtZW50cwotICAgIHJlZ2FyZGxlc3Mgb2Ygd2hhdCBuYW1lc3BhY2UgdGhleSBhcmUgaW4sIGFuZCB1c2UgdGhlIHNhbWUgPGNvZGU+ImlmIjwvY29kZT4KLSAgICBzdHJ1Y3R1cmUgd2l0aGluIHRoZSA8Y29kZT5zd2l0Y2goKTwvY29kZT4gc3RhdGVtZW50IGFib3ZlLiBUaGUgb3RoZXIgb3B0aW9uCi0gICAgaXMgdG8gYXNzaWduIGRpZmZlcmVudCB0eXBlcyB0byA8Y29kZT4mbHQ7Zm9vOkEmZ3Q7PC9jb2RlPiBhbmQKLSAgICA8Y29kZT4mbHQ7YmFyOkEmZ3Q7PC9jb2RlPiBlbGVtZW50cy48L3A+Ci0KLSAgPC9zMj4KLTwvczE+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y190cmF4LnhtbCBiL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdGNfdHJheC54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5NTg0YjAuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0Y190cmF4LnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDY5MSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLTwhLS0gCi0gKiBUaGUgQXBhY2hlIFNvZnR3YXJlIExpY2Vuc2UsIFZlcnNpb24gMS4xCi0gKgotICoKLSAqIENvcHlyaWdodCAoYykgMjAwMSBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uICBBbGwgcmlnaHRzCi0gKiByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucwotICogYXJlIG1ldDoKLSAqCi0gKiAxLiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogICAgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6Ci0gKiAgICAgICAiVGhpcyBwcm9kdWN0IGluY2x1ZGVzIHNvZnR3YXJlIGRldmVsb3BlZCBieSB0aGUKLSAqICAgICAgICBBcGFjaGUgU29mdHdhcmUgRm91bmRhdGlvbiAoaHR0cDovL3d3dy5hcGFjaGUub3JnLykuIgotICogICAgQWx0ZXJuYXRlbHksIHRoaXMgYWNrbm93bGVkZ21lbnQgbWF5IGFwcGVhciBpbiB0aGUgc29mdHdhcmUgaXRzZWxmLAotICogICAgaWYgYW5kIHdoZXJldmVyIHN1Y2ggdGhpcmQtcGFydHkgYWNrbm93bGVkZ21lbnRzIG5vcm1hbGx5IGFwcGVhci4KLSAqCi0gKiA0LiBUaGUgbmFtZXMgIlhhbGFuIiBhbmQgIkFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIiBtdXN0Ci0gKiAgICBub3QgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMKLSAqICAgIHNvZnR3YXJlIHdpdGhvdXQgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLiBGb3Igd3JpdHRlbgotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAyMDAxLCBTdW4KLSAqIE1pY3Jvc3lzdGVtcy4sIGh0dHA6Ly93d3cuc3VuLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLTxzMSB0aXRsZT0iVGhlIFRyYW5zbGV0IEFQSSAmYW1wOyBUckFYIj4KLTxwPjxyZWY+Qnk8L3JlZj4gPGp1bXAgaHJlZj0ibWFpbHRvOnRvZGQubWlsbGVyQGVhc3Quc3VuLmNvbSI+Ry4gVG9kZCBNaWxsZXI8L2p1bXA+IC11cGRhdGVkIE1heSAxMSwgMjAwMTwvcD4KLTx1bD4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iYWJzdHJhY3QiPkFic3RyYWN0PC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9InRyYXgiPlRyQVg8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iaW50ZWdyYXRlIj5UcmFuc2xldCBJbnRlZ3JhdGlvbjwvbGluaz48L2xpPgotICA8bGk+PGxpbmsgYW5jaG9yPSJmYWN0b3J5Ij5TQVhUcmFuc2Zvcm1lckZhY3RvcnkgZm9yIFRyYW5zbGV0czwvbGluaz48L2xpPgotICA8bGk+PGxpbmsgYW5jaG9yPSJ0cmFuc2Zvcm0iPkFic3RyYWN0VHJhbnNsZXQgdHJhbnNmb3JtKCkgbWV0aG9kPC9saW5rPjwvbGk+Ci0gIDxsaT48bGluayBhbmNob3I9ImNvbmNsdXNpb24iPkNvbmNsdXNpb248L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iYXBwZW5kaXgiPkFwcGVuZGl4PC9saW5rPjwvbGk+ICAgICAgCi08L3VsPgotPHA+U2VlIGFsc286IDxqdW1wIGhyZWY9Ii4uL3hzbHRjX3VzYWdlLmh0bWwjYXBpIj5DYWxsaW5nIFhTTFRDIHdpdGggdGhlIFRyQVgvSkFYUCBBUEk8L2p1bXA+PC9wPgotPGFuY2hvciBuYW1lPSJhYnN0cmFjdCIvPgotPHMyIHRpdGxlPSJBYnN0cmFjdCI+Ci08cD5UaGlzIGRvY3VtZW50IGRlc2NyaWJlcyB3aGF0IEkgaGF2ZSBzbyBmYXIgYXMgYSBwcm90b3R5cGUgZm9yIGludGVncmF0aW5nCi1UcmFuc2xldHMgd2l0aCB0aGUgSkFYUCBUckFYLiBJbiBhIG51dHNoZWxsLCBhIG5ldyBUcmFuc2Zvcm1lciBmYWN0b3J5Ci1jbGFzcyBoYXMgYmUgd3JpdHRlbiB0aGF0IGV4dGVuZHMgdGhlIEpBWFAgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IGNsYXNzLgotVGhlIG5ld2ZhY3RvcnkgZGVsaXZlcnMgVHJhbnNsZXRzIGFzIFRyYW5zZm9ybWVycywgYW5kIGNyZWF0ZXMgVGVtcGxhdGVzLgotQ2FsbGluZyB0aGUgVHJhbnNmb3JtZXIgdHJhbnNmb3JtKCkgbWV0aG9kIHdpbGwgY2F1c2UgdGhlIGdpdmVuIFhNTAotZG9jdW1lbnQgdG8gYmUgdHJhbnNmb3JtZWQgYnkgYSB0cmFuc2xldCB0aGF0IGhhcyBiZWVuIGNvbXBpbGVkIGZyb20gdGhlCi1zdXBwbGllZCBzdHlsZXNoZWV0LiBUaGUgc3dpdGNoIHRoYXQgZGV0ZXJtaW5lcyB3aGF0IFhTTFQgcHJvY2Vzc29yIGdldHMKLXRvIHRyYW5zZm9ybSB0aGUgWE1MIGRvY3VtZW50IGlzIGJhc2VkIG9uIHRoZSB2YWx1ZSBvZiBhIEpBWFAgc3lzdGVtCi1wcm9wZXJ0eSBmb3IgdGhlIFRyYW5zZm9ybWVycyBmYWN0b3J5LjwvcD4KLTwvczI+PGFuY2hvciBuYW1lPSJ0cmF4Ii8+Ci08czIgdGl0bGU9IlRyQVgiPgotPHA+VGhlIEphdmEgQVBJIGZvciBYTUwgUHJvY2Vzc2luZyAoSkFYUCkgaW5jbHVkZXMgYW4gWFNMVCBmcmFtZXdvcmsgYmFzZWQgb24gdGhlCi1UcmFuc2Zvcm1hdGlvbiBBUEkgZm9yIFhNTCAoVHJBWCkuIEluIGEgdHlwaWNhbCBKQVhQIHRyYW5zZm9ybWF0aW9uIGFwcGxpY2F0aW9uCi10aGUgc3RlcHMgaW52b2x2ZWQgaW4gdHJhbnNmb3JtaW5nIGFuIFhNTCBkb2N1bWVudCB3aXRoIGFuIFhTTFQgc3R5bGVzaGVldCBhcmU6ICgxKQotY3JlYXRlIGFuIGluc3RhbmNlIG9mIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgY2xhc3MsICgyKSBmcm9tIHRoZSBmYWN0b3J5IGluc3RhbmNlIGFuZAotYSBnaXZlbiBYU0xUIHN0eWxlc2hlZXQsIGNyZWF0ZSBhIG5ldyBUcmFuc2Zvcm1lciBvYmplY3QsICgzKSBjYWxsIHRoZSBUcmFuc2Zvcm1lcgotb2JqZWN0cyB0cmFuc2Zvcm0oKSBtZXRob2Qgb24gYSBnaXZlbiBYTUwgZG9jdW1lbnQgYW5kIGEgc3BlY2lmaWVkIFJlc3VsdCBvYmplY3QuCi1BbHRlcm5hdGl2ZWx5LCBvbmUgY291bGQgYWxzbyBhc2sgdGhlIGluc3RhbmNlIG9mIHRoZSBUcmFuc2Zvcm1lckZhY3RvcnkgZm9yCi1hIFRlbXBsYXRlcyBvYmplY3QgZ2l2ZW4gYW4gWFNMVCBzdHlsZXNoZWV0LiBGcm9tIHRoZSBUZW1wbGF0ZXMgb2JqZWN0LCBhIG5ldwotVHJhbnNmb3JtZXIgY2FuIGJlIGNyZWF0ZWQsIGFuZCBhZ2FpbiwgaXRzIHRyYW5zZm9ybSgpIG1ldGhvZCBjYW4gYmUgY2FsbGVkIHdpdGgKLWFuIFhNTCBkb2N1bWVudCBhbmQgc3BlY2lmaWVkIFJlc3VsdCBvYmplY3QuPC9wPgotPHA+VGhlIGNvZGUgYmVsb3cgaWxsdXN0cmF0ZXMgYSBzaW1wbGUgSkFYUCB0cmFuc2Zvcm1hdGlvbiBhcHBsaWNhdGlvbiAoUHJvdG8uamF2YSkKLXRoYXQgY3JlYXRlcyB0aGUgVHJhbnNmb3JtZXIgZGlyZWN0bHkuPC9wPgotPHNvdXJjZT5pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtU291cmNlOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc3RyZWFtLlN0cmVhbVJlc3VsdDsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJGYWN0b3J5OwotCi1wdWJsaWMgY2xhc3MgUHJvdG8gewotICBwdWJsaWMgc3RhdGljIHZvaWQgbWFpbihTdHJpbmdbXSBhcmdzKXsKLSAgICBQcm90byBhcHAgPSBuZXcgUHJvdG8oKTsKLSAgICBhcHAucnVuKGFyZ3MpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgcnVuKFN0cmluZ1tdIGFyZ3MpewotICAgIGlmIChhcmdzLmxlbmd0aCAhPSAyKSB7Ci0gICAgICB1c2FnZSgpOwotICAgIH0KLSAgICBTdHJpbmcgaW5wdXRGaWxlbmFtZSA9IGFyZ3NbMF07Ci0gICAgU3RyaW5nIHN0eWxlc2hlZXQgPSBhcmdzWzFdOwotICAgIFRyYW5zZm9ybWVyIHRyYW5zZm9ybWVyOwotICAgIFRyYW5zZm9ybWVyRmFjdG9yeSBmYWN0b3J5ID0gVHJhbnNmb3JtZXJGYWN0b3J5Lm5ld0luc3RhbmNlKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHRyYW5zZm9ybWVyID0gZmFjdG9yeS5uZXdUcmFuc2Zvcm1lcihuZXcgU3RyZWFtU291cmNlKHN0eWxlc2hlZXQpKTsKLSAgICAgIHRyYW5zZm9ybWVyLnRyYW5zZm9ybShuZXcgU3RyZWFtU291cmNlKGlucHV0RmlsZW5hbWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBub3RoaW5nLi4uCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdXNhZ2UoKSB7Ci0gICAgU3lzdGVtLmVyci5wcmludGxuKAotICAgICAgICJVc2FnZTogcnVuICZsdDt4bWxfZmlsZSZndDsgJmx0O3hzbF9maWxlJmd0OyIpOwotICAgIFN5c3RlbS5leGl0KDEpOwotICB9Ci19PC9zb3VyY2U+Ci08cD5UaGUgdXNlIG9mIFRlbXBsYXRlcyBpcyB1c2VmdWwgd2hlbiBtdWx0aXBsZSBpbnN0YW5jZXMgb2YgdGhlIHNhbWUgdHJhbnNmb3JtZXIKLWFyZSBuZWVkZWQuIEZvciBleGFtcGxlIHRyYW5zZm9ybWluZyBtdWx0aXBsZSBkb2N1bWVudHMgYnkgdGhlIHNhbWUgdHJhbnNmb3JtZXIsCi1lYWNoIHdvcmtpbmcgaW4gYSBzZXBhcmF0ZSB0aHJlYWQuIEluIHRoaXMgY2FzZSwgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBpcyB1c2VkIHRvCi1jcmVhdGUgYSBUZW1wbGF0ZXMgb2JqZWN0IGZvciBhIGdpdmVuIHN0eWxlc2hlZXQuIEVhY2ggVHJhbnNmb3JtZXIgaW5zdGFuY2UgaXMgdGhlbgotY3JlYXRlZCBieSB0aGUgVGVtcGxhdGVzIG9iamVjdC4gSW4gdGhpcyB3YXkgdGhlIFRlbXBsYXRlcyBvYmplY3QgY2FuIGNvbXBpbGUgdGhlCi1zdHlsZXNoZWV0IG9uY2UsIGFuZCBlYWNoIHRpbWUgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIHRyYW5zZm9ybWVyIGlzIGFza2VkIGZvciwgYSBjbG9uZSBpcwotcHJvdmlkZWQgcmF0aGVyIHRoYW4gcmVjb21waWxlIHRoZSBzdHlsZXNoZWV0IGFnYWluIGFuZCBhZ2Fpbi4gVGhlIFByb3RvIGNsYXNzIGFib3ZlCi13b3VsZCBiZSBtb2RpZmllZCBhcyBmb2xsb3dzOjwvcD4KLTxzb3VyY2U+dHJ5IHsKLSAgVGVtcGxhdGVzIHRlbXBsYXRlcyA9IGZhY3RvcnkubmV3VGVtcGxhdGVzKG5ldyBTdHJlYW1Tb3VyY2Uoc3R5bGVzaGVldCkpOwotICB0cmFuc2Zvcm1lciA9IHRlbXBsYXRlcy5uZXdUcmFuc2Zvcm1lcigpOwotICB0cmFuc2Zvcm1lci50cmFuc2Zvcm0obmV3IFN0cmVhbVNvdXJjZShpbnB1dEZpbGVuYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBTdHJlYW1SZXN1bHQoU3lzdGVtLm91dCkpOwotfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgLy8gbm90aGluZy4uLgotfTwvc291cmNlPgotPHA+VGhlIEpBWFAgVHJhbnNmb3JtZXJGYWN0b3J5IGlzIGNvbmZpZ3VyYWJsZS4gVGhlIEFQSSBzdXBwb3J0cyBjb25maWd1cmluZyB0aGUKLWZhY3RvcnkgdG86ICgxKSB1c2UgYXR0cmlidXRlcyB3aGljaCBhcmUgcGFzc2VkIGRvd24gdG8gdGhlIHVuZGVybHlpbmcgWFNMIHByb2Nlc3NvciwKLXRoZXNlIGFyZSB2ZW5kb3IgZGVwZW5kZW50LCAoMikgcmVnaXN0ZXIgYW4gRXJyb3JMaXN0ZW5lciB0aGF0IHByb3ZpZGVzIGNhbGxiYWNrcwotdG8gaGFuZGxlIGVycm9yIGFuZCB3YXJuaW5nIG1lc3NhZ2UgZ2VuZXJhdGVkIGJ5IHRoZSBYU0wgcHJvY2Vzc29yLCAoMykgcmVnaXN0ZXIKLWFuIFVSSVJlc29sdmVyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlc29sdmUgVVJJcyBlbmNvdW50ZXJlZCBpbiB4c2w6aW5jbHVkZSwKLXhzbDppbXBvcnQsYW5kZG9jdW1lbnQoKSBmdW5jdGlvbnMuPC9wPgotPHA+VGhlIEpBWFAgVHJhbnNmb3JtZXJGYWN0b3J5IGNhbiBiZSBxdWVyaWVkIGF0IHJ1bnRtZSB0byBkaXNjb3ZlciB3aGF0IGZlYXR1cmVzCi1pdCBzdXBwb3J0cy4gRm9yIGV4YW1wbGUsIGFuIGFwcGxpY2F0aW9uIG1pZ2h0IHdhbnQgdG8ga25vdyBpZiBhIHBhcnRpY3VsYXIgZmFjdG9yeQotaW1wbGVtZW50YXRpb24gc3VwcG9ydHMgdGhlIHVzZSBvZiBTQVggZXZlbnRzIGFzIGEgc291cmNlLCBvciB3aGV0aGVyIGl0IGNhbiB3cml0ZQotb3V0IHRyYW5zZm9ybWF0aW9uIHJlc3VsdHMgYXMgYSBET00uIFRoZSBmYWN0b3J5IEFQSSBxdWVyaWVzIHdpdGggdGhlIGdldEZlYXR1cmUoKQotbWV0aG9kLiBJbiB0aGUgUHJvdG8gY29kZSBhYm92ZSwgSSBjb3VsZCBhZGQgdGhlIGZvbGxvd2luZyBjb2RlIGJlZm9yZSB0aGUgdHJ5LWNhdGNoCi1ibG9jazo8L3A+Ci08c291cmNlPmlmICghKGZhY3RvcnkuZ2V0RmVhdHVyZShTdHJlYW1Tb3VyY2UuRkVBVFVSRSkpIHx8Ci0gICAgIShmYWN0b3J5LmdldEZlYXR1cmUoU3RyZWFtUmVzdWx0LkZFQVRVUkUpKSkgewotICAgICAgIFN5c3RlbS5lcnIucHJpbnRsbigKLSAgICAgICAgICJTdHJlYW0gU291cmNlL1Jlc3VsdCBub3Qgc3VwcG9ydGVkIGJ5IFRyYW5zZm9ybWVyIEZhY3RvcnlcbiIgKwotICAgICAgICAgImV4aXRpbmcuIik7Ci0gICAgICAgU3lzdGVtLmV4aXQoMSk7Ci19PC9zb3VyY2U+Ci08L3MyPjxhbmNob3IgbmFtZT0iaW50ZWdyYXRlIi8+Ci08czIgdGl0bGU9IlRyYW5zbGV0IEludGVncmF0aW9uIj4KLTxwPlRoZSBjcnV4IG9mIHRoZSBpbnRlZ3JhdGlvbiBzdHJhdGVneSBpcyB0aGUgcGx1Z2dhYmxlIFRyYW5zZm9ybWVyRmFjdG9yeSBjbGFzcy4gVGhlCi1KQVhQIHNwZWNpZmllcyB0aGF0IHRoZSBhY3R1YWwgVHJhbnNmb3JtZXJGYWN0b3J5IGltcGxlbWVudGF0aW9uIGJlIGNvbnRyb2xsZWQgYnkgdGhlCi1hIEphdmEgc3lzdGVtIHByb3BlcnR5IChqYXZheC54bWwudHJhbnNmb3JtZXIuVHJhbnNmb3JtZXJGYWN0b3J5KSAuIFRoaXMgc3lzdGVtIHByb3BlcnR5IGNhbiBiZSBzcGVjaWZpZWQgaW4gdGhlIHVzdWFsIHdheXMsIGZvcgotZXhhbXBsZSBpbiBhIHByb3BlcnRpZXMgZmlsZSBvciBvbiB0aGUgY29tbWFuZCBsaW5lIGFzIGEgLUQgb3B0aW9ucGFzc2VkIHRvIHRoZWphdmEKLWVuZ2luZSBpdHNlbGYuIFRoZSBzdHJhdGVneSBpbnZvbHZlcyB3cml0aW5nIGEgVHJhbnNmb3JtZXJGYWN0b3J5IGZvciBUcmFuc2xldHMuCi1JbiB0aGUgSkFYUCB0aGUgVHJhbnNmb3JtZXJGYWN0b3J5IGlzIGFuIGFic3RyYWN0IGNsYXNzLiBJbiBYYWxhbiwgdGhlIHN5c3RlbQotcHJvcGVydHkgc3BlY2lmaWVzIHRoZSBpbXBsZW1lbnRhdGlvbiBjbGFzcyBUcmFuc2Zvcm1lckZhY3RvcnlJbXBsIChvcmcuYXBhY2hlLnhhbGFuLnByb2Nlc3Nvci5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsKS4KLSBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgYWJzdHJhY3QgU0FYVHJhbnNmb3JtZXJGYWN0b3J5IGNsYXNzLCB3aGljaCBpbgotdHVybiBpcyBhbiBleHRlbnNpb24gb2YgdGhlIGFic3RyYWN0IFRyYW5zZm9ybWVyRmFjdG9yeSBjbGFzcyAoamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5KS48L3A+Ci08cD5JbiB0aGlzIHByb3RvdHlwZSBpbnRlZ3JhdGlvbiBJIGhhdmUgY29uc3RydWN0ZWQgYW4gWFNMVEMgVHJhbnNmb3JtZXJGYWN0b3J5IGFzCi1hbiBleHRlbnNpb24gb2YgdGhlIGFic3RyYWN0IFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBjbGFzcy48L3A+Ci0KLTwvczI+PGFuY2hvciBuYW1lPSJmYWN0b3J5Ii8+Ci08czIgdGl0bGU9IlNBWFRyYW5zZm9ybWVyRmFjdG9yeSBmb3IgVHJhbnNsZXRzIj4KLTxwPlRoZSBwcm90b3R5cGUgWFNMVEMgVHJhbnNmb3JtZXJGYWN0b3J5IG5lZWRzIHRvIGFjY29tcGxpc2ggdGhlIGZvbGxvd2luZzo8L3A+Ci0gPHVsPgotICAgPGxpPjxsaW5rIGFuY2hvcj0ic2F4dHJhbnNmb3JtZXJmYWN0b3J5Ij5JbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZHMgb2YgdGhlIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBjbGFzczwvbGluaz48L2xpPgotICAgPGxpPjxsaW5rIGFuY2hvcj0idHJhbnNmb3JtZXJmYWN0b3J5Ij5JbXBsZW1lbnQgdGhlIGFic3RyYWN0IG1ldGhvZHMgb2YgdGhlIFRyYW5zZm9ybWVyRmFjdG9yeSBjbGFzczwvbGluaz48L2xpPjwvdWw+Ci08YW5jaG9yIG5hbWU9InNheHRyYW5zZm9ybWVyZmFjdG9yeSIvPgotPHMzIHRpdGxlPSJTQVhUcmFuc2Zvcm1lckZhY3RvcnkgTWV0aG9kcyI+Ci0KLTxwPlRoZSBtZXRob2RzIG9mIHRoZSBhYnN0cmFjdCBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgY2xhc3MgaGF2ZSBiZWVuIHN0dWJiZWQgb3V0IGFzCi1mb2xsb3dzLjwvcD4KLTxzb3VyY2U+cHVibGljIFRlbXBsYXRlc0hhbmRsZXIgbmV3VGVtcGxhdGVzSGFuZGxlcigpIHsgcmV0dXJuIG51bGw7IH0KLXB1YmxpYyBUcmFuc2Zvcm1lckhhbmRsZXIgbmV3VHJhbnNmb3JtZXJIYW5kbGVyKCkgeyByZXR1cm4gbnVsbDsgfQotcHVibGljIFRyYW5zZm9ybWVySGFuZGxlciBuZXdUcmFuc2Zvcm1lckhhbmRsZXIoU291cmNlIHNyYykgewotcmV0dXJuIG51bGw7Ci19Ci1wdWJsaWMgVHJhbnNmb3JtZXJIYW5kbGVyIG5ld1RyYW5zZm9ybWVySGFuZGxlcihUZW1wbGF0ZXMgdGVtcGxhdGVzKSB7Ci1yZXR1cm4gbnVsbDsKLX0KLXB1YmxpYyBYTUxGaWx0ZXIgbmV3WE1MRmlsdGVyKFNvdXJjZSBzcmMpIHsgcmV0dXJuIG51bGw7IH0KLXB1YmxpYyBYTUxGaWx0ZXIgbmV3WE1MRmlsdGVyKFRlbXBsYXRlcyB0ZW1wbGF0ZXMpIHsgcmV0dXJuIG51bGw7IH08L3NvdXJjZT4KLTxwPlRoZXNlIHN0dWJiZWQgb3V0IG1ldGhvZHMgd2lsbCBuZWVkIHRvIGJlIHJlcGxhY2VkIHdpdGggcmVhbCBpbXBsZW1lbnRhdGlvbnMuPC9wPgotPC9zMz48YW5jaG9yIG5hbWU9InRyYW5zZm9ybWVyZmFjdG9yeSIvPgotPHMzIHRpdGxlPSJUcmFuc2Zvcm1lckZhY3RvcnkgTWV0aG9kcyI+Ci08cD5UaGUgbWV0aG9kcyBvZiB0aGUgYWJzdHJhY3QgVHJhbnNmb3JtZXJGYWN0b3J5IGNsYXNzIGhhdmUgYmVlbiBzdHViYmVkIG91dCBhcwotZm9sbG93czo8L3A+Ci08c291cmNlPnB1YmxpYyBFcnJvckxpc3RlbmVyIGdldEVycm9yTGlzdGVuZXIoKSB7IHJldHVybiBudWxsOyB9Ci1wdWJsaWMgdm9pZCBzZXRFcnJvckxpc3RlbmVyKEVycm9yTGlzdGVuZXIgbGlzdGVuZXIpIHsgfQotcHVibGljIE9iamVjdCBnZXRBdHRyaWJ1dGUoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIG51bGw7IH0KLXB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7IH0KLXB1YmxpYyBib29sZWFuIGdldEZlYXR1cmUoU3RyaW5nIG5hbWUpIHsgcmV0dXJuIGZhbHNlOyB9Ci1wdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKSB7IHJldHVybiBudWxsOyB9Ci1wdWJsaWMgdm9pZCBzZXRVUklSZXNvbHZlcihVUklSZXNvbHZlciByZXNvbHZlcikgeyB9Ci1wdWJsaWMgU291cmNlIGdldEFzc29jaWF0ZWRTdHlsZXNoZWV0KFNvdXJjZSBzcmMsIFN0cmluZyBtZWRpYSwKLVN0cmluZyB0aXRsZSwgU3RyaW5nIGNoYXJzZXQpIHsgcmV0dXJuIG51bGw7IH0KLXB1YmxpYyBUZW1wbGF0ZXMgbmV3VGVtcGxhdGVzKFNvdXJjZSB4c2xTcmMpIHRocm93cwotVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsgcmV0dXJuIG51bGw7IH0KLXB1YmxpYyBUcmFuc2Zvcm1lciBuZXdUcmFuc2Zvcm1lcigpIHRocm93cwotVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uIHsgcmV0dXJuIG51bGw7IH08L3NvdXJjZT4KLTxwPlRoZSBtZXRob2RzIGxpc3RlZCBhYm92ZSBmYWxsIGludG8gNCBjYXRlZ29yaWVzOiAoMSkgPGxpbmsgYW5jaG9yPSJ0cmFuc2Zvcm1jcmVhdGlvbiI+VHJhbnNmb3JtIGNyZWF0aW9uPC9saW5rPiwgCi0oMikgPGxpbmsgYW5jaG9yPSJ0ZW1wbGF0ZXNjcmVhdGlvbiI+VGVtcGxhdGVzIGNyZWF0aW9uPC9saW5rPiwgKDMpIDxsaW5rIGFuY2hvcj0iZmVhdHVyZWRpc2NvdmVyeSI+ZmVhdHVyZSBkaXNjb3Zlcnk8L2xpbms+LCAKLWFuZCAoNCkgPGxpbmsgYW5jaG9yPSJsaW1pdGF0aW9ucyI+b3RoZXJzIHRoYXQgd2lsbCByZW1haW4gdW5pbXBsZW1lbnRlZCBhdCB0aGlzIHRpbWU8L2xpbms+LjwvcD4KLTxhbmNob3IgbmFtZT0idHJhbnNmb3JtZXJjcmVhdGlvbiIvPgotPHM0IHRpdGxlPSJUcmFuc2Zvcm1lciBDcmVhdGlvbiI+Ci08cD5UaGUgSkFYUCBzcGVjaWZpZXMgYSBtZXRob2QgdGhhdCB0YWtlcyB0aGUgc3R5bGVzaGVldCBhcyBhIFNvdXJjZSBvYmplY3QgYW5kIHJldHVybnMgYQotVHJhbnNmb3JtZXIuPC9wPgotPHA+PGNvZGU+cHVibGljIFRyYW5zZm9ybWVyIG5ld1RyYW5zZm9ybWVyKFNvdXJjZSB4c2xTcmMpPC9jb2RlPjwvcD4KLTxwPlRoaXMgbWV0aG9kIG5lZWRzIHRvIHJldHVybiBhIFRyYW5zZm9ybWVyIHRvIGNvbXBseSB3aXRoIHRoZSBKQVhQIEFQSSwgYnV0IGFsc28KLW5lZWRzIHRvIHJldHVybiBhIFRyYW5zbGV0LiBJbiB0aGUgWFNMVEMvWGFsYW4gQVBJLCBhIFRyYW5zbGV0IGlzIGFuIGludGVyZmFjZSB0aGF0IGlzCi1pbXBsZW1lbnRlZCBieSB0aGUgcnVudGltZSBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFRyYW5zbGV0IChvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLlRyYW5zbGV0IGFuZCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUuQWJzdHJhY3RUcmFuc2xldCwgcmVwZWN0aXZlbHkpLiBUaGVyZWZvcmUsIEkgaGFkIHRvCi1jaGFuZ2UgdGhlIEFic3RyYWN0VHJhbnNsZXQgY2xhc3Mgc28gdGhhdCBpdCB3aWxsIGV4dGVuZCB0aGUgYWJzdHJhY3QgVHJhbnNmb3JtZXIKLWNsYXNzIHdoaWxlIHN0aWxsIGltcGxlbWVudGluZyB0aGUgVHJhbnNsZXQgaW50ZXJmYWNlLiBPbmNlIHRoaXMgaXMgZG9uZSwgdGhlbiB0aGUKLW5ld1RyYW5zZm9ybWVyKCkgbWV0aG9kIG9mIHRoZSBuZXcgVHJhbnNmb3JtZXJGYWN0b3J5IGNhbiByZXR1cm4gYSBUcmFuc2xldCB0aGF0Ci1pcyBhIFRyYW5zZm9ybWVyLjwvcD4KLTxwPkluIG9yZGVyIHRvIGhhdmUgQWJzdHJhY3RUcmFuc2xldCBleHRlbmQgVHJhbnNmb3JtZXIsIHNldmVyYWwgYWJzdHJhY3QgbWV0aG9kcwotaGF2ZSB0byBiZSBpbXBsZW1lbnRlZCBpbiBBYnN0cmFjdFRyYW5zbGV0IGNsYXNzLiBUaGVzZSBhcmU6PC9wPgotPHNvdXJjZT5wdWJsaWMgdm9pZCBjbGVhclBhcmFtZXRlcnMoKSB7IH0KLXB1YmxpYyBFcnJvckxpc3RlbmVyIGdldEVycm9yTGlzdGVuZXIoKSB7IHJldHVybiBudWxsOyB9Ci1wdWJsaWMgUHJvcGVydGllcyBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gIHJldHVybiBudWxsOwotfQotcHVibGljIFN0cmluZyBnZXRPdXRwdXRQcm9wZXJ0eShTdHJpbmcgbmFtZSkKLSAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbnsgcmV0dXJuICIiOyB9Ci0vL3B1YmxpYyBPYmplY3QgZ2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lKSB7IHJldHVybiBudWxsOyB9Ci1wdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKSB7IHJldHVybiBudWxsOyB9Ci1wdWJsaWMgdm9pZCBzZXRFcnJvckxpc3RlbmVyKEVycm9yTGlzdGVuZXIgbGlzdGVuZXIpCi0gIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geyB9Ci1wdWJsaWMgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0aWVzKFByb3BlcnRpZXMgcHJvcHMpCi0gIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24geyB9Ci1wdWJsaWMgdm9pZCBzZXRPdXRwdXRQcm9wZXJ0eShTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKQotICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsgfQotcHVibGljIHZvaWQgc2V0UGFyYW1ldGVyKFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsgfQotcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsgfQotcHVibGljIHZvaWQgdHJhbnNmb3JtKFNvdXJjZSB4bWxzcmMsIFJlc3VsdCBvdXRwdXRUYXJnZXQpCi0gIHRocm93cyBUcmFuc2Zvcm1lckV4Y2VwdGlvbiB7IC4uLiB9PC9zb3VyY2U+Ci08cD5NYXBwaW5nIHRoZXNlIG1ldGhvZHMgdG8gc29tZSBleGlzdGluZyBvbmVzIGluIEFic3RyYWN0VHJhbnNsZXQgc3RpbGwgaGFzIHRvIGJlCi1kb25lLiBJbiBwYXJ0aWN1bGFyIHRoZSB0cmFuc2Zvcm0oKSBtZXRob2Qgd2hpY2ggaXMgZXhwbGFpbmVkIGZ1cnRoZXIgaW4gYSBmb2xsb3dpbmcKLXNlY3Rpb24uPC9wPgotPHA+Tm93IHRoYXQgWFNMVEOScyBBYnN0cmFjdFRyYW5zbGV0IGlzIGEgVHJhbnNmb3JtZXIsIHRoZSBuZXcgVHJhbnNmb3JtZXIKLWZhY3RvcnkgY2xhc3MgY2FuIGltcGxlbWVudCB0aGUgbmV3VHJhbnNmb3JtZXIoKSBtZXRob2QuIFRoaXMgbWV0aG9kIG5lZWRzIHRvIGRvCi10d28gZnVuZGFtZW50YWwgdGhpbmdzOiAoMSkgY3JlYXRlIGEgdHJhbnNsZXQgZnJvbSB0aGUgZ2l2ZW4gWFNMVCBzdHlsZXNoZWV0IGFuZCAoMikKLWluc3RhbnRpYXRlIHRoZSB0cmFuc2xldCBzbyBpdCBjYW4gYmUgcmV0dXJuZWQgYXMgYSBUcmFuc2Zvcm1lci48L3A+Ci08cD5UaGUgY29kZSBiZWxvd3MgaG93cyBteSBjdXJyZW50IGltcGxlbWVudGF0aW9uIG9mIHRoZSBuZXdUcmFuc2Zvcm1lcigpIG1ldGhvZAotaW4gdGhlIG5ldyBmYWN0b3J5IGNsYXNzOjwvcD4KLTxzb3VyY2U+cHVibGljIGNsYXNzIFRvZGRzVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBleHRlbmRzIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB7Ci0gIC4uLgotICBwdWJsaWMgVHJhbnNmb3JtZXIgbmV3VHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIHRocm93cwotICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgWFNMVEMgeHNsdGMgPSBuZXcgWFNMVEMoKTsKLSAgICB4c2x0Yy5pbml0KCk7Ci0gICAgU3RyaW5nIHN0eWxlc2hlZXROYW1lID0gc3R5bGVzaGVldC5nZXRTeXN0ZW1JZCgpOwotICAgIGludCBpbmRleCA9IHN0eWxlc2hlZXROYW1lLmluZGV4T2Yoki6SKTsKLSAgICBTdHJpbmcgdHJhbnNsZXROYW1lID0gc3R5bGVzaGVldE5hbWUuc3Vic3RyaW5nKDAsaW5kZXgpOwotICAgIGJvb2xlYW4gaXNTdWNjZXNzZnVsID0gdHJ1ZTsKLSAgICB0cnkgewotICAgICAgRmlsZSBmaWxlID0gbmV3IEZpbGUoc3R5bGVzaGVldE5hbWUpOwotICAgICAgVVJMIHVybCA9IGZpbGUudG9VUkwoKTsKLSAgICAgIGlzU3VjY2Vzc2Z1bCA9IHhzbHRjLmNvbXBpbGUodXJsKTsKLSAgICB9IGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIlVSTCBmb3Igc3R5bGVzaGVldCCSIiArIHN0eWxlc2hlZXROYW1lICsKLSAgICAgICAgICAgICAgICKSIGNhbiBub3QgYmUgZm9ybWVkLiIpOwotICAgIH0KLQotICAgIGlmICghaXNTdWNjZXNzZnVsKSB7Ci0gICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJDb21waWxhdGlvbiBvZiBzdHlsZXNoZWV0IJIiICsgc3R5bGVzaGVldE5hbWUgKyAikiBmYWlsZWQuIik7Ci0gICAgfQotICAgIAotICAgIFRyYW5zbGV0IHRyYW5zbGV0ID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRyYW5zbGV0TmFtZSk7Ci0gICAgICB0cmFuc2xldCA9IChUcmFuc2xldCljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgKChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0KS5zZXRUcmFuc2xldE5hbWUodHJhbnNsZXROYW1lKTsKLSAgICAgfSBjYXRjaCAoQ2xhc3NOb3RGb3VuZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiVHJhbnNsZXQgY2xhc3MgkiIgKyB0cmFuc2xldE5hbWUgKyAikiBub3QgZm91bmQuIik7Ci0gICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIlRyYW5zbGV0IGNsYXNzIJIiICsgdHJhbnNsZXROYW1lICsKLSAgICAgICAgICAgICAgIpIgY291bGQgbm90IGJlIGluc3RhbnRpYXRlZCIpOwotICAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgIlRyYW5zbGV0IGNsYXNzIJIiICsgdHJhbnNsZXROYW1lICsgIpIgY291bGQgbm90IGJlIGFjY2Vzc2VkLiIpOwotICAgICB9Ci0gICAgIHJldHVybiAoQWJzdHJhY3RUcmFuc2xldCl0cmFuc2xldDsKLSAgfQotfTwvc291cmNlPgotPC9zND48YW5jaG9yIG5hbWU9InRlbXBsYXRlc2NyZWF0aW9uIi8+Ci08czQgdGl0bGU9IlRlbXBsYXRlcyBDcmVhdGlvbiI+Ci08cD5UaGUgSkFYUCBzcGVjaWZpZXMgYSBtZXRob2QgdGhhdCB0YWtlcyB0aGUgc3R5bGVzaGVldCBhcyBhIFNvdXJjZSBvYmplY3QgYW5kIHJldHVybnMgYQotVGVtcGxhdGVzIG9iamVjdC48L3A+Ci08cD48Y29kZT5wdWJsaWMgVGVtcGxhdGVzIG5ld1RlbXBsYXRlcyhTb3VyY2UgeHNsU3JjKTwvY29kZT48L3A+Ci08cD5UbyBpbXBsZW1lbnQgdGhpcyBtZXRob2QgSSBuZWVkZWQgdG8gY3JlYXRlIGEgbmV3IGNsYXNzIHRoYXQgd291bGQgYmUgYSBUZW1wbGF0ZXMKLWZvciBUcmFuc2xldHMgb2JqZWN0LiBUaGUgbmV3IGNsYXNzIFRyYW5zbGV0VGVtcGxhdGVzIChvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUuVHJhbnNsZXRUZW1wbGF0ZXMpIGltcGxlbWVudHMgdGhlIFRlbXBsYXRlcwotaW50ZXJmYWNlIGFzIGlzIHNob3duIGJlbG93OjwvcD4KLTxzb3VyY2U+cGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWUuQWJzdHJhY3RUcmFuc2xldDsKLWltcG9ydCBqYXZhLnV0aWwuUHJvcGVydGllczsKLQotcHVibGljIGNsYXNzIFRyYW5zbGV0VGVtcGxhdGVzIGltcGxlbWVudHMgVGVtcGxhdGVzIHsKLSAgcHVibGljIFRyYW5zbGV0VGVtcGxhdGVzKFRyYW5zZm9ybWVyIHRyYW5zbGV0KSB7Ci0gICAgX3RyYW5zbGV0ID0gKEFic3RyYWN0VHJhbnNsZXQpdHJhbnNsZXQ7Ci0gIH0KLQotICBwdWJsaWMgUHJvcGVydGllcyBnZXRPdXRwdXRQcm9wZXJ0aWVzKCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0KLSAgcHVibGljIFRyYW5zZm9ybWVyIG5ld1RyYW5zZm9ybWVyKCkgdGhyb3dzCi0gICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX3RyYW5zbGV0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICJFcnJvcjogTnVsbCBUcmFuc2xldCIpOwotICAgIH0KLSAgICByZXR1cm4gX3RyYW5zbGV0OwotICB9Ci0gIHByaXZhdGUgQWJzdHJhY3RUcmFuc2xldCBfdHJhbnNsZXQgPSBudWxsOwotfTwvc291cmNlPgotPHA+VGhlIGZhY3RvcnkgbWV0aG9kIG5ld1RlbXBsYXRlcygpIHNpbXBseSBjcmVhdGVzIGEgVHJhbnNmb3JtZXIgZm9yIHRoZSBzdHlsZXNoZWV0LAotYW5kIHJldHVybnMgYSBuZXdUcmFuc2xldFRlbXBsYXRlcyBvYmplY3QuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBuZXdUZW1wbGF0ZXMoKQotaXMgc2hvd24gYmVsb3c6PC9wPgotPHNvdXJjZT5wdWJsaWMgY2xhc3MgVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBleHRlbmRzIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB7Ci0uLi4KLSAgcHVibGljIFRlbXBsYXRlcyBuZXdUZW1wbGF0ZXMoU291cmNlIHN0eWxlc2hlZXQpIHRocm93cwotICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbgotICB7Ci0gICAgVHJhbnNmb3JtZXIgdHJhbnNsZXQgPSBuZXdUcmFuc2Zvcm1lcihzdHlsZXNoZWV0KTsKLSAgICByZXR1cm4gbmV3IFRyYW5zbGV0VGVtcGxhdGVzKHRyYW5zbGV0KTsKLSAgfQotfTwvc291cmNlPgotPHA+VGhpcyBpbXBsZW1lbnRhdGlvbiBvbmx5IHNhdGlzZmllcyB0aGUgSkFYUCwgaXQgZG9lcyBub3QgYWRkcmVzcyBjYWNoaW5nIG9mIHByZXZpb3VzbHkKLWNyZWF0ZWQgdHJhbnNsZXRzLiBUaGlzIHR5cGUgb2YgbWVjaGFuaXNtIGJlbG9uZ3MgaW4gVGVtcGxhdGVzLHdoZXJlIGEgZ2l2ZW4KLXN0eWxlc2hlZXQgd2lsbCBiZSBjb21waWxlZCBvbmUgdGltZSBvbmx5LCBidXQgdGhlIGdlbmVyYXRlZCB0cmFuc2xldCBjYW4gYmUgY2xvbmVkIHRvCi1jcmVhdGUgbXVsdGlwbGUgaW5zdGFuY2VzIHVwb24gZGVtYW5kLjwvcD4KLTwvczQ+PGFuY2hvciBuYW1lPSJmZWF0dXJlZGlzY292ZXJ5Ii8+Ci08czQgdGl0bGU9IkZlYXR1cmUgRGlzY292ZXJ5Ij4KLTxwPlRoZSBKQVhQIHNwZWNpZmllcyBhIG1ldGhvZCB0aGF0IGFsbG93cyBwcm9ncmFtcyB0byBkaXNjb3ZlciB3aGF0IGZlYXR1cmVzIHRoZSBmYWN0b3J5Ci1pcyBjYXBhYmxlIG9mIHN1cHBvcnRpbmcuPC9wPgotPHA+PGNvZGU+cHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgZmVhdHVyZU5hbWUpPC9jb2RlPjwvcD4KLTxwPkF0IHRoaXMgdGltZSB0aGUgbmV3IHRyYW5zZm9ybWVyIGZhY3Rvcnkgc3VwcG9ydHMgU3RyZWFtIHNvdXJjZXMgYW5kIHJlc3VsdHMsIGFuZAotdGhlIFNBWCBUcmFuc2Zvcm0gZmFjdG9yeSBmZWF0dXJlLiBUaGUgZ2V0RmVhdHVyZSgpIGltcGxlbWVudGF0aW9uIGlzIHNob3duIGJlbG93OjwvcD4KLTxzb3VyY2U+cHVibGljIGNsYXNzIFRyYW5zZm9ybWVyRmFjdG9yeUltcGwgZXh0ZW5kcyBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgewotICAuLi4KLSAgcHVibGljIGJvb2xlYW4gZ2V0RmVhdHVyZShTdHJpbmcgbmFtZSkgewotICAgIGlmICgoU3RyZWFtU291cmNlLkZFQVRVUkUgPT0gbmFtZSkgfHwKLSAgICAgICAgKFN0cmVhbVJlc3VsdC5GRUFUVVJFID09IG5hbWUpIHx8Ci0gICAgICAgIChTQVhUcmFuc2Zvcm1lckZhY3RvcnkuRkVBVFVSRSA9PSBuYW1lKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKChTdHJlYW1Tb3VyY2UuRkVBVFVSRS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICB8fCAoU3RyZWFtUmVzdWx0LkZFQVRVUkUuZXF1YWxzKG5hbWUpKQotICAgICAgICAgICAgfHwgKFNBWFRyYW5zZm9ybWVyRmFjdG9yeS5GRUFUVVJFLmVxdWFscyhuYW1lKSkpIHsKLSAgICAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19PC9zb3VyY2U+Ci08cD5BcyB0aGUgb3RoZXIgZmVhdHVyZXMgYXJlIGltcGxlbWVudGVkLCB0aGlzIG1ldGhvZHMgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQuPC9wPgotCi08L3M0PjxhbmNob3IgbmFtZT0ibGltaXRhdGlvbnMiLz4KLTxzNCB0aXRsZT0iTGltaXRhdGlvbnMiPgotPHA+QXMgeW91IGNhbiBzZWUsIHRoZSBwcm90b3R5cGUgd2lsbCBjb21waWxlIHRoZSBzdHlsZXNoZWV0IGV2ZXJ5dGltZS4gVGhpcyBvYnZpb3VzbHkKLW5lZWRzIHRvIGJlIHNtYXJ0ZXIuIFRoaXMgaXMgd2hlcmUgdGhlIHF1ZXN0aW9uIJRkbyBJIGFscmVhZHkgaGF2ZSB0aGlzIHRyYW5zbGV0P5QgbmVlZHMKLXRvIGJlIGFuc3dlcmVkLiBBbHNvIGZvciBub3cgdGhlIHRyYW5zbGV0IGJ5dGVjb2RlcyBhcmUgd3JpdHRlbiBvdXQgdG8gYSBGaWxlIGluIHRoZSBjdXJyZW50Ci13b3JraW5nIGRpcmVjdG9yeSwgYW5kIHRoZW4gaW5zdGFudGlhdGVkIHVzaW5nIGEgQ2xhc3MuZm9yTmFtZSwgbmV3SW5zdGFuY2UoKQotcGFpci4gVGhpcyBhbHNvIG5lZWRzIHdvcmsuIE5vdGUgdGhlIHJldHVybiBzdGF0ZW1lbnQsIHRoZSBUcmFuc2xldCBpcyBjYXN0IHRvIGFuIEFic3RyYWN0VHJhbnNsZXQKLXdoaWNoIG5vdyBpcyBhIFRyYW5zZm9ybWVyLjwvcD4KLTwvczQ+Ci08L3MzPgotPC9zMj48YW5jaG9yIG5hbWU9InRyYW5zZm9ybSIvPgotPHMyIHRpdGxlPSJBYnN0cmFjdFRyYW5zbGV0knMgdHJhbnNmb3JtKCkgTWV0aG9kIj4KLTxwPk5vdyB0aGUgSkFYUCBwcm9ncmFtIChQcm90bykgc2hvd24gaW4gdGhlIGZpcnN0IHNlY3Rpb24gaGFzIGEgd2F5IHRvIGdldCBhIFRyYW5zZm9ybWVyCi1mYWN0b3J5IHRoYXQgY2FuIHJldHVybiBUcmFuc2xldHMuIFRoZSBuZXh0IHN0ZXAgb2YgdGhlIFByb3RvLmphdmEgcHJvZ3JhbSBpcwotY2FsbGluZyB0aGUgdHJhbnNmb3JtKCkgbWV0aG9kIGFuZCBoYXZpbmcgdGhlIFRyYW5zbGV0IHByb2Nlc3MgdGhlIGdpdmVuIFhNTAotZG9jdW1lbnQuPC9wPgotPHA+VGhpcyByZXF1aXJlcyBzb21lIHN1cmdlcnkgaW4gdGhlIEFic3RyYWN0VHJhbnNsZXQgY2xhc3MgYWdhaW4uIFRoZSBBYnN0cmFjdFRyYW5zbGV0Ci1hbHJlYWR5IGhhcyBhIHRyYW5zZm9ybSgpIG1ldGhvZCwgYnV0IGl0cyBzaWduYXR1cmUgaXMgbm90IHRoZSBzYW1lIGFzIHRoZQotSkFYUCBUcmFuc2Zvcm0gc2lnbmF0dXJlLiBJbiB0aGUgQWJzdHJhY3RUcmFuc2xldCwgdHJhbnNmb3JtIG1ldGhvZHMgZXhwZWN0IGEgRE9NCi1hcmd1bWVudCwgaW4gc29tZSBjYXNlcyBhIE5vZGVJdGVyYXRvciwgYW5kIGEgVHJhbnNsZXRPdXRwdXRIYW5kbGVyIGFyZ3VtZW50LiBUaGUKLUpBWFAgVHJhbnNmb3JtknMgdHJhbnNmb3JtKCkgc2lnbmF0dXJlIHJlcXVpcmVzIG9ubHkgdGhlIFhNTCBkb2N1bWVudCBhcyBhIFNvdXJjZQotb2JqZWN0IHJlZmVyZW5jZSBhbmQgYW4gb3V0cHV0VGFyZ2V0IGFzIGEgUmVzdWx0IG9iamVjdCByZWZlcmVuY2UuIE15IGltcGxlbWVudGF0aW9uCi1vZiB0aGUgSkFYUCB0cmFuc2Zvcm0oKSBzaWduYXR1cmUgaXMgYXMgc2hvd246PC9wPgotCi08c291cmNlPnB1YmxpYyB2b2lkIHRyYW5zZm9ybShTb3VyY2UgeG1sc3JjLCBSZXN1bHQgb3V0cHV0VGFyZ2V0KQotICB0aHJvd3MgVHJhbnNmb3JtZXJFeGNlcHRpb24KLXsKLSAgZG9UcmFuc2Zvcm0oIHhtbHNyYy5nZXRTeXN0ZW1JZCgpLAotICAgICgoU3RyZWFtUmVzdWx0KW91dHB1dFRhcmdldCkuZ2V0T3V0cHV0U3RyZWFtKCkgKTsKLX08L3NvdXJjZT4KLTxwPlRoaXMgaW1wbGVtZW50YXRpb24gbGV2ZXJhZ2VzIGNvZGUgZGVyaXZlZCBmcm9tIFhTTFRDknMgRGVmYXVsdFJ1biBjbGFzcy4gSW4KLXRoYXQgY2xhc3MgdGhlcmUgaXMgYSBkb1RyYW5zZm9ybSgpIG1ldGhvZCB0aGF0IGNhcnJpZXMgb3V0IHRoZSB3b3JrIG9mOiAoMSkgcGFyc2luZyB0aGUKLWlucHV0IFhNTCBkb2N1bWVudCAodXNpbmcgYSBKQVhQIFNBWFBhcnNlckZhY3RvcnkgYW5kIFNBWFBhcnNlciksICgyKSBjcmVhdGluZwotYSBET01JbXBsIChvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmRvbS5ET01JbXBsKSwgKDMpIGNyZWF0aW5nIGEgU0FYT3V0cHV0SGFuZGxlciwgYW5kIGZpbmFsbHkgKDQpIGNhbGxpbmcgdGhlIHRyYW5zbGV0IHRvCi10cmFuc2Zvcm0gdGhlIGlucHV0IFhNTCBkb2N1bWVudCAoZnJvbSB0aGUgRE9NSW1wbCkuPC9wPgotPHA+VGhlIGNvZGUgZm9yIGRvVHJhbnNmb3JtIGlzIHNob3duIGJlbG93OjwvcD4KLTxzb3VyY2U+cHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0VHJhbnNsZXQgZXh0ZW5kcyBUcmFuc2Zvcm1lciBpbXBsZW1lbnRzIFRyYW5zbGV0ewotICAuLi4KLSAgcHJpdmF0ZSB2b2lkIGRvVHJhbnNmb3JtKFN0cmluZyB4bWxEb2NOYW1lLCBPdXRwdXRTdHJlYW0gb3N0cmVhbSkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBUcmFuc2xldCB0cmFuc2xldCA9IChUcmFuc2xldCl0aGlzOyAvLyBHVE0gYWRkZWQKLQotICAgICAgLy8gQ3JlYXRlIGEgU0FYIHBhcnNlciBhbmQgZ2V0IHRoZSBYTUxSZWFkZXIgb2JqZWN0IGl0IHVzZXMKLSAgICAgIGZpbmFsIFNBWFBhcnNlckZhY3RvcnkgZmFjdG9yeSA9IFNBWFBhcnNlckZhY3RvcnkubmV3SW5zdGFuY2UoKTsKLSAgICAgIGZpbmFsIFNBWFBhcnNlciBwYXJzZXIgPSBmYWN0b3J5Lm5ld1NBWFBhcnNlcigpOwotICAgICAgZmluYWwgWE1MUmVhZGVyIHJlYWRlciA9IHBhcnNlci5nZXRYTUxSZWFkZXIoKTsKLQotICAgICAgLy8gU2V0IHRoZSBET02ScyBET00gYnVpbGRlciBhcyB0aGUgWE1MUmVhZGVyknMgU0FYMiBjb250ZW50IGhhbmRsZXIKLSAgICAgIGZpbmFsIERPTUltcGwgZG9tID0gbmV3IERPTUltcGwoKTsKLSAgICAgIHJlYWRlci5zZXRDb250ZW50SGFuZGxlcihkb20uZ2V0QnVpbGRlcigpKTsKLSAgICAgIC8vIENyZWF0ZSBhIERURCBtb25pdG9yIGFuZCBwYXNzIGl0IHRvIHRoZSBYTUxSZWFkZXIgb2JqZWN0Ci0gICAgICBmaW5hbCBEVERNb25pdG9yIGR0ZE1vbml0b3IgPSBuZXcgRFRETW9uaXRvcigpOwotICAgICAgZHRkTW9uaXRvci5oYW5kbGVEVEQocmVhZGVyKTsKLSAgICAgIGRvbS5zZXREb2N1bWVudFVSSSh4bWxEb2NOYW1lKTsKLSAgICAgIC8qKioqKioqKioqKioqKioqCi0gICAgICBpZiAoX3VyaSkKLSAgICAgICAgcmVhZGVyLnBhcnNlKHhtbERvY05hbWUpOwotICAgICAgZWxzZQotICAgICAgKioqKioqKioqKioqKioqKioqKi8KLSAgICAgIHJlYWRlci5wYXJzZSgiZmlsZToiKyhuZXcgRmlsZSh4bWxEb2NOYW1lKS5nZXRBYnNvbHV0ZVBhdGgoKSkpOwotCi0gICAgICAvLyBTZXQgc2l6ZSBvZiBrZXkvaWQgaW5kaWNlcwotICAgICAgc2V0SW5kZXhTaXplKGRvbS5nZXRTaXplKCkpOwotICAgICAgLy8gSWYgdGhlcmUgYXJlIGFueSBlbGVtZW50cyB3aXRoIElEIGF0dHJpYnV0ZXMsIGJ1aWxkIGFuIGluZGV4Ci0gICAgICBkdGRNb25pdG9yLmJ1aWxkSWRJbmRleChkb20sIDAsIHRoaXMpOwotCi0gICAgICBzZXRVbnBhcnNlZEVudGl0eVVSSXMoZHRkTW9uaXRvci5nZXRVbnBhcnNlZEVudGl0eVVSSXMoKSk7Ci0gICAgCi0gICAgICAvLyBUcmFuc2Zvcm0gdGhlIGRvY3VtZW50Ci0gICAgICBTdHJpbmcgZW5jb2RpbmcgPSB0cmFuc2xldC5nZXRPdXRwdXRFbmNvZGluZygpOwotICAgICAgaWYgKGVuY29kaW5nID09IG51bGwpIGVuY29kaW5nID0gIlVURi04IjsKLSAgICAKLSAgICAgIC8vVGV4dE91dHB1dCB0ZXh0T3V0cHV0ID0gbmV3IFRleHRPdXRwdXQoU3lzdGVtLm91dCwgZW5jb2RpbmcpOwotICAgICAgRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIgc2F4SGFuZGxlciA9IG5ldwotICAgICAgICAgRGVmYXVsdFNBWE91dHB1dEhhbmRsZXIob3N0cmVhbSwgZW5jb2RpbmcpOwotICAgICAgVGV4dE91dHB1dCB0ZXh0T3V0cHV0ID0gbmV3IFRleHRPdXRwdXQoc2F4SGFuZGxlciwgZW5jb2RpbmcpOwotICAgICAgdHJhbnNsZXQudHJhbnNmb3JtKGRvbSwgdGV4dE91dHB1dCk7Ci0gICAgICB0ZXh0T3V0cHV0LmZsdXNoKCk7Ci0gICAgfQotICAgIGNhdGNoIChUcmFuc2xldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAuLi4KLSAgICB9Ci0gICAgY2F0Y2ggKFJ1bnRpbWVFeGNlcHRpb24gZSkgewotICAgICAgLi4uCi0gICAgfQotICAgIGNhdGNoIChGaWxlTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgLi4uCi0gICAgfQotICAgIGNhdGNoIChNYWxmb3JtZWRVUkxFeGNlcHRpb24gZSkgewotICAgICAgLi4uCi0gICAgfQotICAgIGNhdGNoIChVbmtub3duSG9zdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAuLi4KLSAgICB9Ci0gICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAuLi4KLSAgICB9Ci0gIH0KLX08L3NvdXJjZT4KLTwvczI+PGFuY2hvciBuYW1lPSJjb25jbHVzaW9uIi8+Ci08czIgdGl0bGU9IkNvbmNsdXNpb24iPgotPHA+VGhpcyBpcyB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgaW50ZWdyYXRpb24gb2YgVHJhbnNsZXQgYW5kIFRyQVguIFRoZSBKQVhQIHByb2dyYW0KLWlsbHVzdHJhdGVkIGluIHRoZSBmaXJzdCBzZWN0aW9uIChQcm90by5qYXZhKSBjb21waWxlcyBhbmQgcnVucyB3aXRoIHRoZSBjaGFuZ2VzIG91dGxpbmVkCi1hYm92ZS4gVGhlIG5ldyB0cmFuc2Zvcm1lciBmYWN0b3J5IFRyYW5zZm9ybWVyRmFjdG9yeUltcGwgc3VwcG9ydHMgdHJhbnNmb3JtZXIsCi10ZW1wbGF0ZXMgY3JlYXRpb24sIGFuZCB0aGUgZmVhdHVyZSBkaXNjb3ZlcnkgbWVjaGFuaXNtLiBUaGUgdHJhbnNmb3JtZXJzCi1yZXR1cm5lZCBmcm9tIHRoZSBmYWN0b3J5IGFyZSBpbiBmYWN0IEFic3RyYWN0VHJhbnNsZXQgb2JqZWN0cy4gVGhlIG5ldyBjbGFzcwotVHJhbnNsZXRUZW1wbGF0ZXMgaW1wbGVtZW50cyB0aGUgVGVtcGxhdGVzIGludGVyZmFjZSBmb3IgdHJhbnNsZXRzLiBUaGlzIGlzIHRoZQotcmVzdWx0IG9mIGEgZmlyc3QgcGFzcyBpbXBsZW1lbnRhdGlvbiwgdGhlcmUgYXJlIG1hbnkgc3R1YmJlZCBvdXQgbWV0aG9kcyB0aGF0IG5lZWQgdG8KLWJlIGltcGxlbWVudGVkLCB0cmFuc2xldCBjYWNoaW5nIGluIFRlbXBsYXRlcyBuZWVkcyB0byBiZSBpbXBsZW1lbnRlZCBhbmQgc3VwcG9ydAotZm9yIFNvdXJjZSBhbmQgUmVzdWx0IHR5cGVzIGJleW9uZCBzaW1wbGUgc3RyZWFtIHR5cGVzLCBzdWNoIGFzIERPTSBhbmQgU0FYLjwvcD4KLQotPC9zMj48YW5jaG9yIG5hbWU9ImFwcGVuZGl4Ii8+Ci08czIgdGl0bGU9IkFwcGVuZGl4Ij4KLTx1bD4KLSAgPGxpPjxsaW5rIGFuY2hvcj0icnVuc2NyaXB0Ij5UaGUgUnVuIHNjcmlwdDwvbGluaz48L2xpPgotICA8bGk+PGxpbmsgYW5jaG9yPSJ0cmFuc2Zvcm1lcmZhY3RvcnlpbXBsIj5UcmFuc2Zvcm1lckZhY3RvcnlJbXBsLmphdmE8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0iVHJhbnNsZXRUZW1wbGF0ZXMiPlRyYW5zbGV0VGVtcGxhdGVzLmphdmE8L2xpbms+PC9saT4KLSAgPGxpPjxsaW5rIGFuY2hvcj0ibWFrZWZpbGUiPlRoZSBNYWtlZmlsZTwvbGluaz48L2xpPgotPC91bD4KLTxhbmNob3IgbmFtZT0icnVuc2NyaXB0Ii8+Ci08czMgdGl0bGU9IlRoZSBSdW4gc2NyaXB0Ij4KLTxwPkJ5IGNoYW5naW5nIHRoZSBGQUMgdmFyaWFibGUgSSBjYW4gc3dpdGNoIGJldHdlZW4gdGhlIHR3byBUcmFuc2Zvcm1lciBmYWN0b3J5IGltcGxlbWVudGF0aW9ucwotZm9yIHRlc3RpbmcuPC9wPgotPHNvdXJjZT4jIS9iaW4va3NoCi1KQVhQPS91c3IvbG9jYWwvamF4cC0xLjEvamF4cC5qYXIKLUNSSU1TT049L3Vzci9sb2NhbC9qYXhwLTEuMS9jcmltc29uLmphcgotWFNMVD0vbmV0L2JpZ2Jsb2NrL2ZpbGVzMTgvdG1pbGxlci94bWwteGFsYW4vamF2YS9idWlsZC9jbGFzc2VzCi1YTUw9L25ldC9iaWdibG9jay9maWxlczE4L3RtaWxsZXIveG1sLXhhbGFuL2phdmEvYmluL3htbC5qYXIKLUJDRUw9L25ldC9iaWdibG9jay9maWxlczE4L3RtaWxsZXIveG1sLXhhbGFuL2phdmEvYmluL0JDRUwuamFyCi1KQ1VQPS9uZXQvYmlnYmxvY2svZmlsZXMxOC90bWlsbGVyL3htbC14YWxhbi9qYXZhL2Jpbi9qYXZhX2N1cC5qYXIKLUpDVVBSVD0vbmV0L2JpZ2Jsb2NrL2ZpbGVzMTgvdG1pbGxlci94bWwteGFsYW4vamF2YS9iaW4vcnVudGltZS5qYXIKLUNMQVNTUEFUSD0ke0pBWFB9OiR7Q1JJTVNPTn06JHtYU0xUfToke1hNTH06JHtCQ0VMfToke0pDVVB9OiR7SkNVUFJUfTouCi1GQUM9b3JnLmFwYWNoZS54YWxhbi54c2x0Yy5ydW50aW1lLlRyYW5zZm9ybWVyRmFjdG9yeUltcGwKLSNGQUM9b3JnLmFwYWNoZS54YWxhbi5wcm9jZXNzb3IuVHJhbnNmb3JtZXJGYWN0b3J5SW1wbAotamF2YSAtY2xhc3NwYXRoICR7Q0xBU1NQQVRIfSBcCi0gICAgIC1EamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckZhY3Rvcnk9JHtGQUN9IFwKLSAgICAgUHJvdG8gJEA8L3NvdXJjZT4KLTwvczM+PGFuY2hvciBuYW1lPSJ0cmFuc2Zvcm1lcmZhY3RvcnlpbXBsIi8+Ci08czMgdGl0bGU9IlRyYW5zZm9ybWVyRmFjdG9yeUltcGwuamF2YSI+Ci0KLTxzb3VyY2U+cGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uRXJyb3JMaXN0ZW5lcjsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlNvdXJjZTsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLnN0cmVhbS5TdHJlYW1Tb3VyY2U7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zdHJlYW0uU3RyZWFtUmVzdWx0OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVVJJUmVzb2x2ZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5UcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguU0FYVHJhbnNmb3JtZXJGYWN0b3J5OwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlRlbXBsYXRlc0hhbmRsZXI7Ci1pbXBvcnQgamF2YXgueG1sLnRyYW5zZm9ybS5zYXguVHJhbnNmb3JtZXJIYW5kbGVyOwotCi1pbXBvcnQgb3JnLnhtbC5zYXguWE1MRmlsdGVyOwotCi1pbXBvcnQgb3JnLmFwYWNoZS54YWxhbi54c2x0Yy5UcmFuc2xldDsKLWltcG9ydCBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLmNvbXBpbGVyLlhTTFRDOwotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZS5BYnN0cmFjdFRyYW5zbGV0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEubmV0LlVSTDsKLWltcG9ydCBqYXZhLm5ldC5NYWxmb3JtZWRVUkxFeGNlcHRpb247Ci0KLS8qKgotICogSW1wbGVtZW50YXRpb24gb2YgYSBKQVhQMS4xIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSBmb3IgVHJhbnNsZXRzLgotICovCi1wdWJsaWMgY2xhc3MgVHJhbnNmb3JtZXJGYWN0b3J5SW1wbCBleHRlbmRzIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSB7Ci0gIHB1YmxpYyBUcmFuc2Zvcm1lckZhY3RvcnlJbXBsKCkgeyAvKiBub3RoaW5nIHlldCAqLyB9Ci0KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIC8vIFNBWFRyYW5zZm9ybWVyRmFjdG9yeSAoc3ViY2xhc3Mgb2YgVHJhbnNmb3JtZXJGYWN0b3J5KQotICAvLwotICBwdWJsaWMgVGVtcGxhdGVzSGFuZGxlciBuZXdUZW1wbGF0ZXNIYW5kbGVyKCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyBUcmFuc2Zvcm1lckhhbmRsZXIgbmV3VHJhbnNmb3JtZXJIYW5kbGVyKCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyBUcmFuc2Zvcm1lckhhbmRsZXIgbmV3VHJhbnNmb3JtZXJIYW5kbGVyKFNvdXJjZSBzcmMpIHsKLSAgICAgLypUQkQqLyByZXR1cm4gbnVsbDsKLSAgfQotICBwdWJsaWMgVHJhbnNmb3JtZXJIYW5kbGVyIG5ld1RyYW5zZm9ybWVySGFuZGxlcihUZW1wbGF0ZXMgdGVtcGxhdGVzKSB7Ci0gICAgIC8qVEJEKi8gcmV0dXJuIG51bGw7Ci0gIH0KLSAgcHVibGljIFhNTEZpbHRlciBuZXdYTUxGaWx0ZXIoU291cmNlIHNyYykgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyBYTUxGaWx0ZXIgbmV3WE1MRmlsdGVyKFRlbXBsYXRlcyB0ZW1wbGF0ZXMpIHsgLypUQkQqLyByZXR1cm4gbnVsbDsgfQotCi0gIC8vCi0gIC8vIEVuZCBTQVhUcmFuc2Zvcm1lckZhY3RvcnkgbWV0aG9kcwotICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLSAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0gIC8vIFRyYW5zZm9ybWVyRmFjdG9yeQotICAvLwotICBwdWJsaWMgRXJyb3JMaXN0ZW5lciBnZXRFcnJvckxpc3RlbmVyKCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyB2b2lkIHNldEVycm9yTGlzdGVuZXIoRXJyb3JMaXN0ZW5lciBsaXN0ZW5lcikgey8qVEJEKi8gfQotICBwdWJsaWMgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyB2b2lkIHNldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSwgT2JqZWN0IHZhbHVlKSB7IC8qVEJEKi8gfQotICBwdWJsaWMgYm9vbGVhbiBnZXRGZWF0dXJlKFN0cmluZyBuYW1lKSB7Ci0gICAgaWYgKChTdHJlYW1Tb3VyY2UuRkVBVFVSRSA9PSBuYW1lKSB8fAotICAgICAgICAoU3RyZWFtUmVzdWx0LkZFQVRVUkUgPT0gbmFtZSkgfHwKLSAgICAgICAgKFNBWFRyYW5zZm9ybWVyRmFjdG9yeS5GRUFUVVJFID09IG5hbWUpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICB9IGVsc2UgaWYgKChTdHJlYW1Tb3VyY2UuRkVBVFVSRS5lcXVhbHMobmFtZSkpCi0gICAgICAgICAgICAgfHwgKFN0cmVhbVJlc3VsdC5GRUFUVVJFLmVxdWFscyhuYW1lKSkKLSAgICAgICAgICAgICB8fCAoU0FYVHJhbnNmb3JtZXJGYWN0b3J5LkZFQVRVUkUuZXF1YWxzKG5hbWUpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICBwdWJsaWMgVVJJUmVzb2x2ZXIgZ2V0VVJJUmVzb2x2ZXIoKSB7IC8qVEJEKi8gcmV0dXJuIG51bGw7IH0KLSAgcHVibGljIHZvaWQgc2V0VVJJUmVzb2x2ZXIoVVJJUmVzb2x2ZXIgcmVzb2x2ZXIpIHsvKlRCRCovIH0KLSAgcHVibGljIFNvdXJjZSBnZXRBc3NvY2lhdGVkU3R5bGVzaGVldChTb3VyY2Ugc3JjLCBTdHJpbmcgbWVkaWEsCi0gICAgICAgU3RyaW5nIHRpdGxlLCBTdHJpbmcgY2hhcnNldCkgeyAvKlRCRCovIHJldHVybiBudWxsOyB9Ci0gIHB1YmxpYyBUcmFuc2Zvcm1lciBuZXdUcmFuc2Zvcm1lcigpIHRocm93cwotICAgIFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbiB7IC8qVEJEKi8gcmV0dXJuIG51bGw7IH0KLSAgLy8KLSAgLy8gRW5kIFRyYW5zZm9ybWVyRmFjdG9yeSBtZXRob2RzCi0gIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwotICBwdWJsaWMgVHJhbnNmb3JtZXIgbmV3VHJhbnNmb3JtZXIoU291cmNlIHN0eWxlc2hlZXQpIHRocm93cwotICBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24KLSAgewotICAgIFhTTFRDIHhzbHRjID0gbmV3IFhTTFRDKCk7Ci0gICAgeHNsdGMuaW5pdCgpOwotICAgIFN0cmluZyBzdHlsZXNoZWV0TmFtZSA9IHN0eWxlc2hlZXQuZ2V0U3lzdGVtSWQoKTsKLSAgICBpbnQgaW5kZXggPSBzdHlsZXNoZWV0TmFtZS5pbmRleE9mKJIukik7Ci0gICAgU3RyaW5nIHRyYW5zbGV0TmFtZSA9IHN0eWxlc2hlZXROYW1lLnN1YnN0cmluZygwLGluZGV4KTsKLSAgICBib29sZWFuIGlzU3VjY2Vzc2Z1bCA9IHRydWU7Ci0gICAgdHJ5IHsKLSAgICAgIEZpbGUgZmlsZSA9IG5ldyBGaWxlKHN0eWxlc2hlZXROYW1lKTsKLSAgICAgIFVSTCB1cmwgPSBmaWxlLnRvVVJMKCk7Ci0gICAgICBpc1N1Y2Nlc3NmdWwgPSB4c2x0Yy5jb21waWxlKHVybCk7Ci0gICAgfSBjYXRjaCAoTWFsZm9ybWVkVVJMRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICJVUkwgZm9yIHN0eWxlc2hlZXQgkiIgKyBzdHlsZXNoZWV0TmFtZSArCi0gICAgICAgICAgICAikiBjYW4gbm90IGJlIGZvcm1lZC4iKTsKLSAgICB9Ci0gICAgaWYgKCFpc1N1Y2Nlc3NmdWwpIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICJDb21waWxhdGlvbiBvZiBzdHlsZXNoZWV0IJIiICsgc3R5bGVzaGVldE5hbWUgKyAikiBmYWlsZWQuIik7Ci0gICAgfQotICAgIAotICAgIFRyYW5zbGV0IHRyYW5zbGV0ID0gbnVsbDsKLSAgICB0cnkgewotICAgICAgQ2xhc3MgY2xhenogPSBDbGFzcy5mb3JOYW1lKHRyYW5zbGV0TmFtZSk7Ci0gICAgICB0cmFuc2xldCA9IChUcmFuc2xldCljbGF6ei5uZXdJbnN0YW5jZSgpOwotICAgICAgKChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0KS5zZXRUcmFuc2xldE5hbWUodHJhbnNsZXROYW1lKTsKLSAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgIlRyYW5zbGV0IGNsYXNzIJIiICsgdHJhbnNsZXROYW1lICsgIpIgbm90IGZvdW5kLiIpOwotICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgIlRyYW5zbGV0IGNsYXNzIJIiICsgdHJhbnNsZXROYW1lICsKLSAgICAgICAgICAgICKSIGNvdWxkIG5vdCBiZSBpbnN0YW50aWF0ZWQiKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFRyYW5zZm9ybWVyQ29uZmlndXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICJUcmFuc2xldCBjbGFzcyCSIiArIHRyYW5zbGV0TmFtZSArICKSIGNvdWxkIG5vdCBiZSBhY2Nlc3NlZC4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0OwotICB9Ci0gIHB1YmxpYyBUZW1wbGF0ZXMgbmV3VGVtcGxhdGVzKFNvdXJjZSBzdHlsZXNoZWV0KSB0aHJvd3MKLSAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgVHJhbnNmb3JtZXIgdHJhbnNsZXQgPSBuZXdUcmFuc2Zvcm1lcihzdHlsZXNoZWV0KTsKLSAgcmV0dXJuIG5ldyBUcmFuc2xldFRlbXBsYXRlcyh0cmFuc2xldCk7Ci0gIH0KLX08L3NvdXJjZT4KLTwvczM+PGFuY2hvciBuYW1lPSJ0cmFuc2xldHRlbXBsYXRlcyIvPgotPHMzIHRpdGxlPSJUcmFuc2xldFRlbXBsYXRlcy5qYXZhIj4KLTxzb3VyY2U+cGFja2FnZSBvcmcuYXBhY2hlLnhhbGFuLnhzbHRjLnJ1bnRpbWU7Ci0KLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRlbXBsYXRlczsKLWltcG9ydCBqYXZheC54bWwudHJhbnNmb3JtLlRyYW5zZm9ybWVyOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmF4LnhtbC50cmFuc2Zvcm0uc2F4LlNBWFRyYW5zZm9ybWVyRmFjdG9yeTsKLQotaW1wb3J0IG9yZy5hcGFjaGUueGFsYW4ueHNsdGMucnVudGltZS5BYnN0cmFjdFRyYW5zbGV0OwotaW1wb3J0IGphdmEudXRpbC5Qcm9wZXJ0aWVzOwotCi0vKioKLSAqIEltcGxlbWVudGF0aW9uIG9mIGEgSkFYUDEuMSBUZW1wbGF0ZXMgb2JqZWN0IGZvciBUcmFuc2xldHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBUcmFuc2xldFRlbXBsYXRlcyBpbXBsZW1lbnRzIFRlbXBsYXRlcyB7Ci0gIHB1YmxpYyBUcmFuc2xldFRlbXBsYXRlcyhUcmFuc2Zvcm1lciB0cmFuc2xldCkgewotICAgIF90cmFuc2xldCA9IChBYnN0cmFjdFRyYW5zbGV0KXRyYW5zbGV0OwotICB9Ci0gIHB1YmxpYyBQcm9wZXJ0aWVzIGdldE91dHB1dFByb3BlcnRpZXMoKSB7IC8qVEJEKi8gcmV0dXJuIG51bGw7IH0KLSAgcHVibGljIFRyYW5zZm9ybWVyIG5ld1RyYW5zZm9ybWVyKCkgdGhyb3dzCi0gICAgVHJhbnNmb3JtZXJDb25maWd1cmF0aW9uRXhjZXB0aW9uCi0gIHsKLSAgICBpZiAoX3RyYW5zbGV0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBUcmFuc2Zvcm1lckNvbmZpZ3VyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICJFcnJvcjogTnVsbCBUcmFuc2xldCIpOwotICAgIH0KLSAgICByZXR1cm4gX3RyYW5zbGV0OwotICB9Ci0gIHByaXZhdGUgQWJzdHJhY3RUcmFuc2xldCBfdHJhbnNsZXQgPSBudWxsOwotfTwvc291cmNlPgotPC9zMz48YW5jaG9yIG5hbWU9Im1ha2VmaWxlIi8+IAotPHMzIHRpdGxlPSJUaGUgTWFrZWZpbGUiPgotPHNvdXJjZT5KQVhQPS91c3IvbG9jYWwvamF4cC0xLjEvamF4cC5qYXIKLUNSSU1TT049L3Vzci9sb2NhbC9qYXhwLTEuMS9jcmltc29uLmphcgotWFNMVD0vbmV0L2JpZ2Jsb2NrL2ZpbGVzMTgvdG1pbGxlci94bWwteGFsYW4vamF2YS9idWlsZC9jbGFzc2VzCi1DTEFTU1BBVEg9JHtKQVhQfToke0NSSU1TT059OiR7WFNMVH0KLVNSQ1M9XAotUHJvdG8uamF2YQotYWxsOgotamF2YWMgLWNsYXNzcGF0aCAke0NMQVNTUEFUSH0gJHtTUkNTfTwvc291cmNlPgotPC9zMz4KLTwvczI+Ci08L3MxPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3hkb2NzL3NvdXJjZXMveHNsdGMveHNsdG92ZXIueG1sIGIveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0b3Zlci54bWwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1NTc4MmMuLjAwMDAwMDAKLS0tIGEveGRvY3Mvc291cmNlcy94c2x0Yy94c2x0b3Zlci54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIHN0YW5kYWxvbmU9Im5vIj8+Ci08IURPQ1RZUEUgczEgU1lTVEVNICIuLi8uLi9zdHlsZS9kdGQvZG9jdW1lbnQuZHRkIj4KLQotPCEtLQotICogVGhlIEFwYWNoZSBTb2Z0d2FyZSBMaWNlbnNlLCBWZXJzaW9uIDEuMQotICoKLSAqCi0gKiBDb3B5cmlnaHQgKGMpIDE5OTkgVGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLiAgQWxsIHJpZ2h0cyAKLSAqIHJlc2VydmVkLgotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zCi0gKiBhcmUgbWV0OgotICoKLSAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuIAotICoKLSAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KLSAqICAgIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqICAgIGRpc3RyaWJ1dGlvbi4KLSAqCi0gKiAzLiBUaGUgZW5kLXVzZXIgZG9jdW1lbnRhdGlvbiBpbmNsdWRlZCB3aXRoIHRoZSByZWRpc3RyaWJ1dGlvbiwKLSAqICAgIGlmIGFueSwgbXVzdCBpbmNsdWRlIHRoZSBmb2xsb3dpbmcgYWNrbm93bGVkZ21lbnQ6ICAKLSAqICAgICAgICJUaGlzIHByb2R1Y3QgaW5jbHVkZXMgc29mdHdhcmUgZGV2ZWxvcGVkIGJ5IHRoZQotICogICAgICAgIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIChodHRwOi8vd3d3LmFwYWNoZS5vcmcvKS4iCi0gKiAgICBBbHRlcm5hdGVseSwgdGhpcyBhY2tub3dsZWRnbWVudCBtYXkgYXBwZWFyIGluIHRoZSBzb2Z0d2FyZSBpdHNlbGYsCi0gKiAgICBpZiBhbmQgd2hlcmV2ZXIgc3VjaCB0aGlyZC1wYXJ0eSBhY2tub3dsZWRnbWVudHMgbm9ybWFsbHkgYXBwZWFyLgotICoKLSAqIDQuIFRoZSBuYW1lcyAiWGFsYW4iIGFuZCAiQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24iIG11c3QKLSAqICAgIG5vdCBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20gdGhpcwotICogICAgc29mdHdhcmUgd2l0aG91dCBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uIEZvciB3cml0dGVuIAotICogICAgcGVybWlzc2lvbiwgcGxlYXNlIGNvbnRhY3QgYXBhY2hlQGFwYWNoZS5vcmcuCi0gKgotICogNS4gUHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgbWF5IG5vdCBiZSBjYWxsZWQgIkFwYWNoZSIsCi0gKiAgICBub3IgbWF5ICJBcGFjaGUiIGFwcGVhciBpbiB0aGVpciBuYW1lLCB3aXRob3V0IHByaW9yIHdyaXR0ZW4KLSAqICAgIHBlcm1pc3Npb24gb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgYGBBUyBJUycnIEFORCBBTlkgRVhQUkVTU0VEIE9SIElNUExJRUQKLSAqIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTCi0gKiBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRQotICogRElTQ0xBSU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBBUEFDSEUgU09GVFdBUkUgRk9VTkRBVElPTiBPUgotICogSVRTIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRgotICogVVNFLCBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORAotICogT04gQU5ZIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksCi0gKiBPUiBUT1JUIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQKLSAqIE9GIFRIRSBVU0UgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRgotICogU1VDSCBEQU1BR0UuCi0gKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICoKLSAqIFRoaXMgc29mdHdhcmUgY29uc2lzdHMgb2Ygdm9sdW50YXJ5IGNvbnRyaWJ1dGlvbnMgbWFkZSBieSBtYW55Ci0gKiBpbmRpdmlkdWFscyBvbiBiZWhhbGYgb2YgdGhlIEFwYWNoZSBTb2Z0d2FyZSBGb3VuZGF0aW9uIGFuZCB3YXMKLSAqIG9yaWdpbmFsbHkgYmFzZWQgb24gc29mdHdhcmUgY29weXJpZ2h0IChjKSAxOTk5LCBMb3R1cwotICogRGV2ZWxvcG1lbnQgQ29ycG9yYXRpb24uLCBodHRwOi8vd3d3LmxvdHVzLmNvbS4gIEZvciBtb3JlCi0gKiBpbmZvcm1hdGlvbiBvbiB0aGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24sIHBsZWFzZSBzZWUKLSAqIDxodHRwOi8vd3d3LmFwYWNoZS5vcmcvPi4KLSAtLT4KLSAKLQotPHMxIHRpdGxlPSJYU0xUIENvbXBpbGVyIGFuZCBSdW50aW1lIj4KLSAgIAotICAgPHMyIHRpdGxlPSJVc2luZyB0aGUgQ29tbWFuZC1MaW5lIFV0aWxpdHkiPgotCi0gICA8L3MyPgotPC9zMT4K