PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJlbiIgeG1sOmxhbmc9ImVuIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5tb2RfcmV3cml0ZSAtIEFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuNDwvdGl0bGU+CjxsaW5rIGhyZWY9Ii4uL3N0eWxlL2Nzcy9tYW51YWwuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJhbGwiIHR5cGU9InRleHQvY3NzIiB0aXRsZT0iTWFpbiBzdHlsZXNoZWV0IiAvPgo8bGluayBocmVmPSIuLi9zdHlsZS9jc3MvbWFudWFsLWxvb3NlLTEwMHBjLmNzcyIgcmVsPSJhbHRlcm5hdGUgc3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJObyBTaWRlYmFyIC0gRGVmYXVsdCBmb250IHNpemUiIC8+CjxsaW5rIGhyZWY9Ii4uL3N0eWxlL2Nzcy9tYW51YWwtcHJpbnQuY3NzIiByZWw9InN0eWxlc2hlZXQiIG1lZGlhPSJwcmludCIgdHlwZT0idGV4dC9jc3MiIC8+PGxpbmsgcmVsPSJzdHlsZXNoZWV0IiB0eXBlPSJ0ZXh0L2NzcyIgaHJlZj0iLi4vc3R5bGUvY3NzL3ByZXR0aWZ5LmNzcyIgLz4KPHNjcmlwdCBzcmM9Ii4uL3N0eWxlL3NjcmlwdHMvcHJldHRpZnkubWluLmpzIiB0eXBlPSJ0ZXh0L2phdmFzY3JpcHQiPgo8L3NjcmlwdD4KCjxsaW5rIGhyZWY9Ii4uL2ltYWdlcy9mYXZpY29uLmljbyIgcmVsPSJzaG9ydGN1dCBpY29uIiAvPjwvaGVhZD4KPGJvZHk+CjxkaXYgaWQ9InBhZ2UtaGVhZGVyIj4KPHAgY2xhc3M9Im1lbnUiPjxhIGhyZWY9Ii4uL21vZC8iPk1vZHVsZXM8L2E+IHwgPGEgaHJlZj0iLi4vbW9kL2RpcmVjdGl2ZXMuaHRtbCI+RGlyZWN0aXZlczwvYT4gfCA8YSBocmVmPSJodHRwOi8vd2lraS5hcGFjaGUub3JnL2h0dHBkL0ZBUSI+RkFRPC9hPiB8IDxhIGhyZWY9Ii4uL2dsb3NzYXJ5Lmh0bWwiPkdsb3NzYXJ5PC9hPiB8IDxhIGhyZWY9Ii4uL3NpdGVtYXAuaHRtbCI+U2l0ZW1hcDwvYT48L3A+CjxwIGNsYXNzPSJhcGFjaGUiPkFwYWNoZSBIVFRQIFNlcnZlciBWZXJzaW9uIDIuNDwvcD4KPGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZmVhdGhlci5wbmciIC8+PC9kaXY+CjxkaXYgY2xhc3M9InVwIj48YSBocmVmPSIuLyI+PGltZyB0aXRsZT0iJmx0Oy0iIGFsdD0iJmx0Oy0iIHNyYz0iLi4vaW1hZ2VzL2xlZnQuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBpZD0icGF0aCI+CjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZTwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy8iPkhUVFAgU2VydmVyPC9hPiAmZ3Q7IDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2RvY3MvIj5Eb2N1bWVudGF0aW9uPC9hPiAmZ3Q7IDxhIGhyZWY9Ii4uLyI+VmVyc2lvbiAyLjQ8L2E+ICZndDsgPGEgaHJlZj0iLi8iPk1vZHVsZXM8L2E+PC9kaXY+CjxkaXYgaWQ9InBhZ2UtY29udGVudCI+CjxkaXYgaWQ9InByZWFtYmxlIj48aDE+QXBhY2hlIE1vZHVsZSBtb2RfcmV3cml0ZTwvaDE+CjxkaXYgY2xhc3M9InRvcGxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi4vZW4vbW9kL21vZF9yZXdyaXRlLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3Jld3JpdGUuaHRtbCIgaHJlZmxhbmc9ImZyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkZyYW7nYWlzIj4mbmJzcDtmciZuYnNwOzwvYT48L3A+CjwvZGl2Pgo8dGFibGUgY2xhc3M9Im1vZHVsZSI+PHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI0Rlc2NyaXB0aW9uIj5EZXNjcmlwdGlvbjo8L2E+PC90aD48dGQ+UHJvdmlkZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZyBlbmdpbmUgdG8gcmV3cml0ZSByZXF1ZXN0ZWQKVVJMcyBvbiB0aGUgZmx5PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkV4dGVuc2lvbjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI01vZHVsZUlkZW50aWZpZXIiPk1vZHVsZaBJZGVudGlmaWVyOjwvYT48L3RoPjx0ZD5yZXdyaXRlX21vZHVsZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJtb2R1bGUtZGljdC5odG1sI1NvdXJjZUZpbGUiPlNvdXJjZaBGaWxlOjwvYT48L3RoPjx0ZD5tb2RfcmV3cml0ZS5jPC90ZD48L3RyPjwvdGFibGU+CjxoMz5TdW1tYXJ5PC9oMz4KCgk8cD5UaGUgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4gbW9kdWxlIHVzZXMgYSBydWxlLWJhc2VkIHJld3JpdGluZwogICAgICBlbmdpbmUsIGJhc2VkIG9uIGEgUENSRSByZWd1bGFyLWV4cHJlc3Npb24gcGFyc2VyLCB0byByZXdyaXRlIHJlcXVlc3RlZCBVUkxzIG9uCiAgICAgIHRoZSBmbHkuIEJ5IGRlZmF1bHQsIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT48L2NvZGU+IG1hcHMgYSBVUkwgdG8gYSBmaWxlc3lzdGVtCiAgICAgIHBhdGguIEhvd2V2ZXIsIGl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gcmVkaXJlY3Qgb25lIFVSTCB0byBhbm90aGVyIFVSTCwgb3IKICAgICAgdG8gaW52b2tlIGFuIGludGVybmFsIHByb3h5IGZldGNoLjwvcD4KICAgICAgPHA+PGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4gcHJvdmlkZXMgYSBmbGV4aWJsZSBhbmQgcG93ZXJmdWwgd2F5IHRvCiAgICAgIG1hbmlwdWxhdGUgVVJMcyB1c2luZyBhbiB1bmxpbWl0ZWQgbnVtYmVyIG9mIHJ1bGVzLiBFYWNoIHJ1bGUgY2FuIGhhdmUgYW4KICAgICAgdW5saW1pdGVkIG51bWJlciBvZiBhdHRhY2hlZCBydWxlIGNvbmRpdGlvbnMsIHRvIGFsbG93IHlvdSB0byByZXdyaXRlIFVSTAogICAgICBiYXNlZCBvbiBzZXJ2ZXIgdmFyaWFibGVzLCBlbnZpcm9ubWVudCB2YXJpYWJsZXMsIEhUVFAgaGVhZGVycywgb3IgdGltZQogICAgICBzdGFtcHMuPC9wPgogICAgICA8cD48Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PC9jb2RlPiBvcGVyYXRlcyBvbiB0aGUgZnVsbCBVUkwgcGF0aCwgaW5jbHVkaW5nIHRoZQogICAgICBwYXRoLWluZm8gc2VjdGlvbi4gQSByZXdyaXRlIHJ1bGUgY2FuIGJlIGludm9rZWQgaW4KICAgICAgPGNvZGU+aHR0cGQuY29uZjwvY29kZT4gb3IgaW4gPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPi4gVGhlIHBhdGggZ2VuZXJhdGVkCiAgICAgIGJ5IGEgcmV3cml0ZSBydWxlIGNhbiBpbmNsdWRlIGEgcXVlcnkgc3RyaW5nLCBvciBjYW4gbGVhZCB0byBpbnRlcm5hbAogICAgICBzdWItcHJvY2Vzc2luZywgZXh0ZXJuYWwgcmVxdWVzdCByZWRpcmVjdGlvbiwgb3IgaW50ZXJuYWwgcHJveHkKICAgICAgdGhyb3VnaHB1dC48L3A+CgogICAgICA8cD5GdXJ0aGVyIGRldGFpbHMsIGRpc2N1c3Npb24sIGFuZCBleGFtcGxlcywgYXJlIHByb3ZpZGVkIGluIHRoZQogICAgICA8YSBocmVmPSIuLi9yZXdyaXRlLyI+ZGV0YWlsZWQgbW9kX3Jld3JpdGUgZG9jdW1lbnRhdGlvbjwvYT4uPC9wPgo8L2Rpdj4KPGRpdiBpZD0icXVpY2t2aWV3Ij48aDM+VG9waWNzPC9oMz4KPHVsIGlkPSJ0b3BpY3MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNsb2dnaW5nIj5Mb2dnaW5nPC9hPjwvbGk+CjwvdWw+PGgzIGNsYXNzPSJkaXJlY3RpdmVzIj5EaXJlY3RpdmVzPC9oMz4KPHVsIGlkPSJ0b2MiPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNyZXdyaXRlYmFzZSI+UmV3cml0ZUJhc2U8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjcmV3cml0ZWNvbmQiPlJld3JpdGVDb25kPC9hPjwvbGk+CjxsaT48aW1nIGFsdD0iIiBzcmM9Ii4uL2ltYWdlcy9kb3duLmdpZiIgLz4gPGEgaHJlZj0iI3Jld3JpdGVlbmdpbmUiPlJld3JpdGVFbmdpbmU8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjcmV3cml0ZW1hcCI+UmV3cml0ZU1hcDwvYT48L2xpPgo8bGk+PGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZG93bi5naWYiIC8+IDxhIGhyZWY9IiNyZXdyaXRlb3B0aW9ucyI+UmV3cml0ZU9wdGlvbnM8L2E+PC9saT4KPGxpPjxpbWcgYWx0PSIiIHNyYz0iLi4vaW1hZ2VzL2Rvd24uZ2lmIiAvPiA8YSBocmVmPSIjcmV3cml0ZXJ1bGUiPlJld3JpdGVSdWxlPC9hPjwvbGk+CjwvdWw+CjxoMz5CdWdmaXggY2hlY2tsaXN0PC9oMz48dWwgY2xhc3M9InNlZWFsc28iPjxsaT48YSBocmVmPSJodHRwczovL3d3dy5hcGFjaGUub3JnL2Rpc3QvaHR0cGQvQ0hBTkdFU18yLjQiPmh0dHBkIGNoYW5nZWxvZzwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1fX29wZW5fXyZhbXA7bGlzdF9pZD0xNDQ1MzImYW1wO3Byb2R1Y3Q9QXBhY2hlJTIwaHR0cGQtMiZhbXA7cXVlcnlfZm9ybWF0PXNwZWNpZmljJmFtcDtvcmRlcj1jaGFuZ2VkZGF0ZSUyMERFU0MlMkNwcmlvcml0eSUyQ2J1Z19zZXZlcml0eSZhbXA7Y29tcG9uZW50PW1vZF9yZXdyaXRlIj5Lbm93biBpc3N1ZXM8L2E+PC9saT48bGk+PGEgaHJlZj0iaHR0cHM6Ly9iei5hcGFjaGUub3JnL2J1Z3ppbGxhL2VudGVyX2J1Zy5jZ2k/cHJvZHVjdD1BcGFjaGUlMjBodHRwZC0yJmFtcDtjb21wb25lbnQ9bW9kX3Jld3JpdGUiPlJlcG9ydCBhIGJ1ZzwvYT48L2xpPjwvdWw+PGgzPlNlZSBhbHNvPC9oMz4KPHVsIGNsYXNzPSJzZWVhbHNvIj4KPGxpPjxhIGhyZWY9IiNjb21tZW50c19zZWN0aW9uIj5Db21tZW50czwvYT48L2xpPjwvdWw+PC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJzZWN0aW9uIj4KPGgyPjxhIG5hbWU9ImxvZ2dpbmciIGlkPSJsb2dnaW5nIj5Mb2dnaW5nPC9hPjwvaDI+CgogICAgPHA+PGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4gb2ZmZXJzIGRldGFpbGVkIGxvZ2dpbmcgb2YgaXRzIGFjdGlvbnMKICAgIGF0IHRoZSA8Y29kZT50cmFjZTE8L2NvZGU+IHRvIDxjb2RlPnRyYWNlODwvY29kZT4gbG9nIGxldmVscy4gVGhlCiAgICBsb2cgbGV2ZWwgY2FuIGJlIHNldCBzcGVjaWZpY2FsbHkgZm9yIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT48L2NvZGU+CiAgICB1c2luZyB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCNsb2dsZXZlbCI+TG9nTGV2ZWw8L2E+PC9jb2RlPiBkaXJlY3RpdmU6IFVwIHRvCiAgICBsZXZlbCA8Y29kZT5kZWJ1ZzwvY29kZT4sIG5vIGFjdGlvbnMgYXJlIGxvZ2dlZCwgd2hpbGUgPGNvZGU+dHJhY2U4PC9jb2RlPgogICAgbWVhbnMgdGhhdCBwcmFjdGljYWxseSBhbGwgYWN0aW9ucyBhcmUgbG9nZ2VkLjwvcD4KCiAgICA8ZGl2IGNsYXNzPSJub3RlIj4KICAgICAgVXNpbmcgYSBoaWdoIHRyYWNlIGxvZyBsZXZlbCBmb3IgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4KICAgICAgd2lsbCBzbG93IGRvd24geW91ciBBcGFjaGUgSFRUUCBTZXJ2ZXIgZHJhbWF0aWNhbGx5ISBVc2UgYSBsb2cKICAgICAgbGV2ZWwgaGlnaGVyIHRoYW4gPGNvZGU+dHJhY2UyPC9jb2RlPiBvbmx5IGZvciBkZWJ1Z2dpbmchCiAgICA8L2Rpdj4KCiAgICA8ZGl2IGNsYXNzPSJleGFtcGxlIj48aDM+RXhhbXBsZTwvaDM+PHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPkxvZ0xldmVsIGFsZXJ0IHJld3JpdGU6dHJhY2UzPC9wcmU+CjwvZGl2PgoKICAgIDxkaXYgY2xhc3M9Im5vdGUiPjxoMz5SZXdyaXRlTG9nPC9oMz4KICAgICAgPHA+VGhvc2UgZmFtaWxpYXIgd2l0aCBlYXJsaWVyIHZlcnNpb25zIG9mCiAgICAgIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT48L2NvZGU+IHdpbGwgbm8gZG91YnQgYmUgbG9va2luZyBmb3IgdGhlCiAgICAgIDxjb2RlPlJld3JpdGVMb2c8L2NvZGU+IGFuZCA8Y29kZT5SZXdyaXRlTG9nTGV2ZWw8L2NvZGU+CiAgICAgIGRpcmVjdGl2ZXMuIFRoaXMgZnVuY3Rpb25hbGl0eSBoYXMgYmVlbiBjb21wbGV0ZWx5IHJlcGxhY2VkIGJ5IHRoZQogICAgICBuZXcgcGVyLW1vZHVsZSBsb2dnaW5nIGNvbmZpZ3VyYXRpb24gbWVudGlvbmVkIGFib3ZlLgogICAgICA8L3A+CgogICAgICA8cD5UbyBnZXQganVzdCB0aGUgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4tc3BlY2lmaWMgbG9nCiAgICAgIG1lc3NhZ2VzLCBwaXBlIHRoZSBsb2cgZmlsZSB0aHJvdWdoIGdyZXA6PC9wPgogICAgPGRpdiBjbGFzcz0iZXhhbXBsZSI+PHA+PGNvZGU+CiAgICB0YWlsIC1mIGVycm9yX2xvZ3xmZ3JlcCAnW3Jld3JpdGU6JwogICAgPC9jb2RlPjwvcD48L2Rpdj4KICAgIDwvZGl2PgoKPC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJkaXJlY3RpdmUtc2VjdGlvbiI+PGgyPjxhIG5hbWU9IlJld3JpdGVCYXNlIiBpZD0iUmV3cml0ZUJhc2UiPlJld3JpdGVCYXNlPC9hPiA8YSBuYW1lPSJyZXdyaXRlYmFzZSIgaWQ9InJld3JpdGViYXNlIj5EaXJlY3RpdmU8L2E+PC9oMj4KPHRhYmxlIGNsYXNzPSJkaXJlY3RpdmUiPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uOjwvYT48L3RoPjx0ZD5TZXRzIHRoZSBiYXNlIFVSTCBmb3IgcGVyLWRpcmVjdG9yeSByZXdyaXRlczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5SZXdyaXRlQmFzZSA8ZW0+VVJMLXBhdGg8L2VtPjwvY29kZT48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZWZhdWx0Ij5EZWZhdWx0OjwvYT48L3RoPjx0ZD48Y29kZT5Ob25lPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ6PC9hPjwvdGg+PHRkPmRpcmVjdG9yeSwgLmh0YWNjZXNzPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjT3ZlcnJpZGUiPk92ZXJyaWRlOjwvYT48L3RoPjx0ZD5GaWxlSW5mbzwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5FeHRlbnNpb248L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiPk1vZHVsZTo8L2E+PC90aD48dGQ+bW9kX3Jld3JpdGU8L3RkPjwvdHI+CjwvdGFibGU+CiAgICAgIDxwPlRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5SZXdyaXRlQmFzZTwvY29kZT4gZGlyZWN0aXZlIHNwZWNpZmllcyB0aGUKICAgICAgVVJMIHByZWZpeCB0byBiZSB1c2VkIGZvciBwZXItZGlyZWN0b3J5IChodGFjY2VzcykKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVydWxlIj5SZXdyaXRlUnVsZTwvYT48L2NvZGU+IGRpcmVjdGl2ZXMgdGhhdAogICAgICBzdWJzdGl0dXRlIGEgcmVsYXRpdmUgcGF0aC48L3A+CiAgICAgIDxwPiBUaGlzIGRpcmVjdGl2ZSBpcyA8ZW0+cmVxdWlyZWQ8L2VtPiB3aGVuIHlvdSB1c2UgYSByZWxhdGl2ZSBwYXRoCiAgICAgIGluIGEgc3Vic3RpdHV0aW9uIGluIHBlci1kaXJlY3RvcnkgKGh0YWNjZXNzKSBjb250ZXh0IHVubGVzcyBlaXRoZXIKICAgICAgb2YgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZSB0cnVlOjwvcD4KICAgICAgPHVsPgogICAgICAgICAgPGxpPiBUaGUgb3JpZ2luYWwgcmVxdWVzdCwgYW5kIHRoZSBzdWJzdGl0dXRpb24sIGFyZSB1bmRlcm5lYXRoIHRoZQogICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI2RvY3VtZW50cm9vdCI+RG9jdW1lbnRSb290PC9hPjwvY29kZT4KICAgICAgICAgICAgICAgKGFzIG9wcG9zZWQgdG8gcmVhY2hhYmxlIGJ5IG90aGVyIG1lYW5zLCBzdWNoIGFzCiAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfYWxpYXMuaHRtbCNhbGlhcyI+QWxpYXM8L2E+PC9jb2RlPikuPC9saT4KICAgICAgICAgIDxsaT4gVGhlIDxlbT5maWxlc3lzdGVtPC9lbT4gcGF0aCB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlCiAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9IiNyZXdyaXRlcnVsZSI+UmV3cml0ZVJ1bGU8L2E+PC9jb2RlPiwKICAgICAgICAgICAgICAgc3VmZml4ZWQgYnkgdGhlIHJlbGF0aXZlCiAgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbiBpcyBhbHNvIHZhbGlkIGFzIGEgVVJMIHBhdGggb24gdGhlIHNlcnZlcgogICAgICAgICAgICAgICAodGhpcyBpcyByYXJlKS48L2xpPgogICAgICAgICAgPGxpPiBJbiBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi40LjE2IGFuZCBsYXRlciwgdGhpcyBkaXJlY3RpdmUgbWF5IGJlCiAgICAgICAgICAgICAgICBvbWl0dGVkIHdoZW4gdGhlIHJlcXVlc3QgaXMgbWFwcGVkIHZpYQogICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvYT48L2NvZGU+CiAgICAgICAgICAgICAgICBvciA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3VzZXJkaXIuaHRtbCI+bW9kX3VzZXJkaXI8L2E+PC9jb2RlPi48L2xpPgogICAgICA8L3VsPgoKPHA+IEluIHRoZSBleGFtcGxlIGJlbG93LCA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5SZXdyaXRlQmFzZTwvY29kZT4gaXMgbmVjZXNzYXJ5CiAgICB0byBhdm9pZCByZXdyaXRpbmcgdG8gaHR0cDovL2V4YW1wbGUuY29tL29wdC9teWFwcC0xLjIuMy93ZWxjb21lLmh0bWwKICAgIHNpbmNlIHRoZSByZXNvdXJjZSB3YXMgbm90IHJlbGF0aXZlIHRvIHRoZSBkb2N1bWVudCByb290LiAgVGhpcwogICAgbWlzY29uZmlndXJhdGlvbiB3b3VsZCBub3JtYWxseSBjYXVzZSB0aGUgc2VydmVyIHRvIGxvb2sgZm9yIGFuICJvcHQiCiAgICBkaXJlY3RvcnkgdW5kZXIgdGhlIGRvY3VtZW50IHJvb3QuPC9wPgo8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+RG9jdW1lbnRSb290ICIvdmFyL3d3dy9leGFtcGxlLmNvbSIKQWxpYXNNYXRjaCAiXi9teWFwcCIgIi9vcHQvbXlhcHAtMS4yLjMiCiZsdDtEaXJlY3RvcnkgIi9vcHQvbXlhcHAtMS4yLjMiJmd0OwogICAgUmV3cml0ZUVuZ2luZSBPbgogICAgUmV3cml0ZUJhc2UgIi9teWFwcC8iCiAgICBSZXdyaXRlUnVsZSAiXmluZGV4XC5odG1sJCIgICJ3ZWxjb21lLmh0bWwiCiZsdDsvRGlyZWN0b3J5Jmd0OzwvcHJlPgoKCgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iUmV3cml0ZUNvbmQiIGlkPSJSZXdyaXRlQ29uZCI+UmV3cml0ZUNvbmQ8L2E+IDxhIG5hbWU9InJld3JpdGVjb25kIiBpZD0icmV3cml0ZWNvbmQiPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPkRlZmluZXMgYSBjb25kaXRpb24gdW5kZXIgd2hpY2ggcmV3cml0aW5nIHdpbGwgdGFrZSBwbGFjZQo8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTeW50YXgiPlN5bnRheDo8L2E+PC90aD48dGQ+PGNvZGU+IFJld3JpdGVDb25kCiAgICAgIDxlbT5UZXN0U3RyaW5nPC9lbT4gPGVtPkNvbmRQYXR0ZXJuPC9lbT48L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDo8L2E+PC90aD48dGQ+c2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIj5PdmVycmlkZTo8L2E+PC90aD48dGQ+RmlsZUluZm88L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1czo8L2E+PC90aD48dGQ+RXh0ZW5zaW9uPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9yZXdyaXRlPC90ZD48L3RyPgo8L3RhYmxlPgogICAgICA8cD5UaGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+UmV3cml0ZUNvbmQ8L2NvZGU+IGRpcmVjdGl2ZSBkZWZpbmVzIGEKICAgICAgcnVsZSBjb25kaXRpb24uIE9uZSBvciBtb3JlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVDb25kPC9jb2RlPgogICAgICBjYW4gcHJlY2VkZSBhIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9IiNyZXdyaXRlcnVsZSI+UmV3cml0ZVJ1bGU8L2E+PC9jb2RlPgogICAgICBkaXJlY3RpdmUuIFRoZSBmb2xsb3dpbmcgcnVsZSBpcyB0aGVuIG9ubHkgdXNlZCBpZiBib3RoCiAgICAgIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSBVUkkgbWF0Y2hlcyBpdHMgcGF0dGVybiwgPHN0cm9uZz5hbmQ8L3N0cm9uZz4gaWYgdGhlc2UgY29uZGl0aW9ucyBhcmUgbWV0LjwvcD4KCiAgICAgIDxwPjxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgYSBzdHJpbmcgd2hpY2ggY2FuIGNvbnRhaW4gdGhlCiAgICAgIGZvbGxvd2luZyBleHBhbmRlZCBjb25zdHJ1Y3RzIGluIGFkZGl0aW9uIHRvIHBsYWluIHRleHQ6PC9wPgoKICAgICAgPHVsPgogICAgICAgIDxsaT4KICAgICAgICAgIDxzdHJvbmc+UmV3cml0ZVJ1bGUgYmFja3JlZmVyZW5jZXM8L3N0cm9uZz46IFRoZXNlIGFyZQogICAgICAgICAgYmFja3JlZmVyZW5jZXMgb2YgdGhlIGZvcm0gPHN0cm9uZz48Y29kZT4kTjwvY29kZT48L3N0cm9uZz4KICAgICAgICAgICgwICZsdDs9IE4gJmx0Oz0gOSkuICQxIHRvICQ5IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSBncm91cGVkCiAgICAgICAgICBwYXJ0cyAoaW4gcGFyZW50aGVzZXMpIG9mIHRoZSBwYXR0ZXJuLCBmcm9tIHRoZQogICAgICAgICAgPGNvZGU+UmV3cml0ZVJ1bGU8L2NvZGU+IHdoaWNoIGlzIHN1YmplY3QgdG8gdGhlIGN1cnJlbnQKICAgICAgICAgIHNldCBvZiA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4gY29uZGl0aW9ucy4gJDAgcHJvdmlkZXMKICAgICAgICAgIGFjY2VzcyB0byB0aGUgd2hvbGUgc3RyaW5nIG1hdGNoZWQgYnkgdGhhdCBwYXR0ZXJuLgogICAgICAgIDwvbGk+CiAgICAgICAgPGxpPgogICAgICAgICAgPHN0cm9uZz5SZXdyaXRlQ29uZCBiYWNrcmVmZXJlbmNlczwvc3Ryb25nPjogVGhlc2UgYXJlCiAgICAgICAgICBiYWNrcmVmZXJlbmNlcyBvZiB0aGUgZm9ybSA8c3Ryb25nPjxjb2RlPiVOPC9jb2RlPjwvc3Ryb25nPgogICAgICAgICAgKDAgJmx0Oz0gTiAmbHQ7PSA5KS4gJTEgdG8gJTkgcHJvdmlkZSBhY2Nlc3MgdG8gdGhlIGdyb3VwZWQKICAgICAgICAgIHBhcnRzIChhZ2FpbiwgaW4gcGFyZW50aGVzZXMpIG9mIHRoZSBwYXR0ZXJuLCBmcm9tIHRoZSBsYXN0IG1hdGNoZWQKICAgICAgICAgIDxjb2RlPlJld3JpdGVDb25kPC9jb2RlPiBpbiB0aGUgY3VycmVudCBzZXQKICAgICAgICAgIG9mIGNvbmRpdGlvbnMuICUwIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgd2hvbGUgc3RyaW5nIG1hdGNoZWQgYnkKICAgICAgICAgIHRoYXQgcGF0dGVybi4KICAgICAgICA8L2xpPgogICAgICAgIDxsaT4KICAgICAgICAgIDxzdHJvbmc+UmV3cml0ZU1hcCBleHBhbnNpb25zPC9zdHJvbmc+OiBUaGVzZSBhcmUKICAgICAgICAgIGV4cGFuc2lvbnMgb2YgdGhlIGZvcm0gPHN0cm9uZz48Y29kZT4ke21hcG5hbWU6a2V5fGRlZmF1bHR9PC9jb2RlPjwvc3Ryb25nPi4KICAgICAgICAgIFNlZSA8YSBocmVmPSIjbWFwZnVuYyI+dGhlIGRvY3VtZW50YXRpb24gZm9yCiAgICAgICAgICBSZXdyaXRlTWFwPC9hPiBmb3IgbW9yZSBkZXRhaWxzLgogICAgICAgIDwvbGk+CiAgICAgICAgPGxpPgogICAgICAgICAgPHN0cm9uZz5TZXJ2ZXItVmFyaWFibGVzPC9zdHJvbmc+OiBUaGVzZSBhcmUgdmFyaWFibGVzIG9mCiAgICAgICAgICB0aGUgZm9ybQogICAgICAgICAgICA8c3Ryb25nPjxjb2RlPiV7PC9jb2RlPiA8ZW0+TkFNRV9PRl9WQVJJQUJMRTwvZW0+CiAgICAgICAgICAgIDxjb2RlPn08L2NvZGU+PC9zdHJvbmc+CiAgICAgICAgICB3aGVyZSA8ZW0+TkFNRV9PRl9WQVJJQUJMRTwvZW0+IGNhbiBiZSBhIHN0cmluZyB0YWtlbgogICAgICAgICAgZnJvbSB0aGUgZm9sbG93aW5nIGxpc3Q6CgogICAgICAgICAgPHRhYmxlPgogICAgICAgICAgCiAgICAgICAgICAgIDx0cj4KICAgICAgICAgICAgICA8dGg+SFRUUCBoZWFkZXJzOjwvdGg+IDx0aD5jb25uZWN0aW9uICZhbXA7IHJlcXVlc3Q6PC90aD4gPHRoIC8+CiAgICAgICAgICAgIDwvdHI+CgogICAgICAgICAgICA8dHI+CiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgIEhUVFBfQUNDRVBUPGJyIC8+CiAgICAgICAgICAgICAgICAgSFRUUF9DT09LSUU8YnIgLz4KICAgICAgICAgICAgICAgICBIVFRQX0ZPUldBUkRFRDxiciAvPgogICAgICAgICAgICAgICAgIEhUVFBfSE9TVDxiciAvPgogICAgICAgICAgICAgICAgIEhUVFBfUFJPWFlfQ09OTkVDVElPTjxiciAvPgogICAgICAgICAgICAgICAgIEhUVFBfUkVGRVJFUjxiciAvPgogICAgICAgICAgICAgICAgIEhUVFBfVVNFUl9BR0VOVDxiciAvPgogICAgICAgICAgICAgIDwvdGQ+CgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICBBVVRIX1RZUEU8YnIgLz4KICAgICAgICAgICAgICAgICBDT05OX1JFTU9URV9BRERSPGJyIC8+CiAgICAgICAgICAgICAgICAgQ09OVEVYVF9QUkVGSVg8YnIgLz4KICAgICAgICAgICAgICAgICBDT05URVhUX0RPQ1VNRU5UX1JPT1Q8YnIgLz4KICAgICAgICAgICAgICAgICBJUFY2PGJyIC8+CiAgICAgICAgICAgICAgICAgUEFUSF9JTkZPPGJyIC8+CiAgICAgICAgICAgICAgICAgUVVFUllfU1RSSU5HPGJyIC8+CiAgICAgICAgICAgICAgICAgUkVNT1RFX0FERFI8YnIgLz4KICAgICAgICAgICAgICAgICBSRU1PVEVfSE9TVDxiciAvPgogICAgICAgICAgICAgICAgIFJFTU9URV9JREVOVDxiciAvPgogICAgICAgICAgICAgICAgIFJFTU9URV9QT1JUPGJyIC8+CiAgICAgICAgICAgICAgICAgUkVNT1RFX1VTRVI8YnIgLz4KICAgICAgICAgICAgICAgICBSRVFVRVNUX01FVEhPRDxiciAvPgogICAgICAgICAgICAgICAgIFNDUklQVF9GSUxFTkFNRTxiciAvPgogICAgICAgICAgICAgIDwvdGQ+CgogICAgICAgICAgICAgIDx0ZCAvPgogICAgICAgICAgICA8L3RyPgoKICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0aD5zZXJ2ZXIgaW50ZXJuYWxzOjwvdGg+IDx0aD5kYXRlIGFuZCB0aW1lOjwvdGg+IDx0aD5zcGVjaWFsczo8L3RoPgogICAgICAgICAgICA8L3RyPgoKICAgICAgICAgICAgPHRyPgogICAgICAgICAgICAgIDx0ZD4KICAgICAgICAgICAgICAgICBET0NVTUVOVF9ST09UPGJyIC8+CiAgICAgICAgICAgICAgICAgU0NSSVBUX0dST1VQPGJyIC8+CiAgICAgICAgICAgICAgICAgU0NSSVBUX1VTRVI8YnIgLz4KICAgICAgICAgICAgICAgICBTRVJWRVJfQUREUjxiciAvPgogICAgICAgICAgICAgICAgIFNFUlZFUl9BRE1JTjxiciAvPgogICAgICAgICAgICAgICAgIFNFUlZFUl9OQU1FPGJyIC8+CiAgICAgICAgICAgICAgICAgU0VSVkVSX1BPUlQ8YnIgLz4KICAgICAgICAgICAgICAgICBTRVJWRVJfUFJPVE9DT0w8YnIgLz4KICAgICAgICAgICAgICAgICBTRVJWRVJfU09GVFdBUkU8YnIgLz4KICAgICAgICAgICAgICA8L3RkPgoKICAgICAgICAgICAgICA8dGQ+CiAgICAgICAgICAgICAgICAgVElNRV9ZRUFSPGJyIC8+CiAgICAgICAgICAgICAgICAgVElNRV9NT048YnIgLz4KICAgICAgICAgICAgICAgICBUSU1FX0RBWTxiciAvPgogICAgICAgICAgICAgICAgIFRJTUVfSE9VUjxiciAvPgogICAgICAgICAgICAgICAgIFRJTUVfTUlOPGJyIC8+CiAgICAgICAgICAgICAgICAgVElNRV9TRUM8YnIgLz4KICAgICAgICAgICAgICAgICBUSU1FX1dEQVk8YnIgLz4KICAgICAgICAgICAgICAgICBUSU1FPGJyIC8+CiAgICAgICAgICAgICAgPC90ZD4KCiAgICAgICAgICAgICAgPHRkPgogICAgICAgICAgICAgICAgIEFQSV9WRVJTSU9OPGJyIC8+CiAgICAgICAgICAgICAgICAgQ09OTl9SRU1PVEVfQUREUjxiciAvPgogICAgICAgICAgICAgICAgIEhUVFBTPGJyIC8+CiAgICAgICAgICAgICAgICAgSVNfU1VCUkVRPGJyIC8+CiAgICAgICAgICAgICAgICAgUkVNT1RFX0FERFI8YnIgLz4KICAgICAgICAgICAgICAgICBSRVFVRVNUX0ZJTEVOQU1FPGJyIC8+CiAgICAgICAgICAgICAgICAgUkVRVUVTVF9TQ0hFTUU8YnIgLz4KICAgICAgICAgICAgICAgICBSRVFVRVNUX1VSSTxiciAvPgogICAgICAgICAgICAgICAgIFRIRV9SRVFVRVNUPGJyIC8+CiAgICAgICAgICAgICAgPC90ZD4KICAgICAgICAgICAgPC90cj4KICAgICAgICAgIDwvdGFibGU+CgogICAgICAgICAgICAgICAgPHA+VGhlc2UgdmFyaWFibGVzIGFsbAogICAgICAgICAgICAgICAgY29ycmVzcG9uZCB0byB0aGUgc2ltaWxhcmx5IG5hbWVkIEhUVFAKICAgICAgICAgICAgICAgIE1JTUUtaGVhZGVycywgQyB2YXJpYWJsZXMgb2YgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBvcgogICAgICAgICAgICAgICAgPGNvZGU+c3RydWN0IHRtPC9jb2RlPiBmaWVsZHMgb2YgdGhlIFVuaXggc3lzdGVtLgogICAgICAgICAgICAgICAgTW9zdCBhcmUgZG9jdW1lbnRlZCA8YSBocmVmPSIuLi9leHByLmh0bWwjdmFycyI+aGVyZTwvYT4KICAgICAgICAgICAgICAgIG9yIGVsc2V3aGVyZSBpbiB0aGUgTWFudWFsIG9yIGluIHRoZSBDR0kgc3BlY2lmaWNhdGlvbi48L3A+CgogICAgICAgICAgICAgICAgPHA+U0VSVkVSX05BTUUgYW5kIFNFUlZFUl9QT1JUIGRlcGVuZCBvbiB0aGUgdmFsdWVzIG9mCiAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI3VzZWNhbm9uaWNhbG5hbWUiPlVzZUNhbm9uaWNhbE5hbWU8L2E+PC9jb2RlPiBhbmQKICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjdXNlY2Fub25pY2FscGh5c2ljYWxwb3J0Ij5Vc2VDYW5vbmljYWxQaHlzaWNhbFBvcnQ8L2E+PC9jb2RlPgogICAgICAgICAgICAgICAgcmVzcGVjdGl2ZWx5LjwvcD4KCiAgICAgICAgICAgICAgICA8cD5UaG9zZSB0aGF0IGFyZSBzcGVjaWFsIHRvIG1vZF9yZXdyaXRlIGluY2x1ZGUgdGhvc2UgYmVsb3cuPC9wPgogICAgICAgICAgICAgICAgPGRsPgogICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+QVBJX1ZFUlNJT048L2NvZGU+PC9kdD4KCiAgICAgICAgICAgICAgICAgIDxkZD5UaGlzIGlzIHRoZSB2ZXJzaW9uIG9mIHRoZSBBcGFjaGUgaHR0cGQgbW9kdWxlIEFQSQogICAgICAgICAgICAgICAgICAodGhlIGludGVybmFsIGludGVyZmFjZSBiZXR3ZWVuIHNlcnZlciBhbmQKICAgICAgICAgICAgICAgICAgbW9kdWxlKSBpbiB0aGUgY3VycmVudCBodHRwZCBidWlsZCwgYXMgZGVmaW5lZCBpbgogICAgICAgICAgICAgICAgICBpbmNsdWRlL2FwX21tbi5oLiBUaGUgbW9kdWxlIEFQSSB2ZXJzaW9uCiAgICAgICAgICAgICAgICAgIGNvcnJlc3BvbmRzIHRvIHRoZSB2ZXJzaW9uIG9mIEFwYWNoZSBodHRwZCBpbiB1c2UgKGluCiAgICAgICAgICAgICAgICAgIHRoZSByZWxlYXNlIHZlcnNpb24gb2YgQXBhY2hlIGh0dHBkIDEuMy4xNCwgZm9yCiAgICAgICAgICAgICAgICAgIGluc3RhbmNlLCBpdCBpcyAxOTk5MDMyMDoxMCksIGJ1dCBpcyBtYWlubHkgb2YKICAgICAgICAgICAgICAgICAgaW50ZXJlc3QgdG8gbW9kdWxlIGF1dGhvcnMuPC9kZD4KCiAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5DT05OX1JFTU9URV9BRERSPC9jb2RlPjwvZHQ+CgogICAgICAgICAgICAgICAgICA8ZGQ+U2luY2UgMi40Ljg6IFRoZSBwZWVyIElQIGFkZHJlc3Mgb2YgdGhlIGNvbm5lY3Rpb24gKHNlZSB0aGUKICAgICAgICAgICAgICAgICAgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZW1vdGVpcC5odG1sIj5tb2RfcmVtb3RlaXA8L2E+PC9jb2RlPiBtb2R1bGUpLjwvZGQ+CgogICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+SFRUUFM8L2NvZGU+PC9kdD4KCiAgICAgICAgICAgICAgICAgIDxkZD5XaWxsIGNvbnRhaW4gdGhlIHRleHQgIm9uIiBpZiB0aGUgY29ubmVjdGlvbiBpcwogICAgICAgICAgICAgICAgICB1c2luZyBTU0wvVExTLCBvciAib2ZmIiBvdGhlcndpc2UuICAoVGhpcyB2YXJpYWJsZQogICAgICAgICAgICAgICAgICBjYW4gYmUgc2FmZWx5IHVzZWQgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIG9yIG5vdAogICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3NzbC5odG1sIj5tb2Rfc3NsPC9hPjwvY29kZT4gaXMgbG9hZGVkKS48L2RkPgoKICAgICAgICAgICAgICAgICAgPGR0Pjxjb2RlPklTX1NVQlJFUTwvY29kZT48L2R0PgoKICAgICAgICAgICAgICAgICAgPGRkPldpbGwgY29udGFpbiB0aGUgdGV4dCAidHJ1ZSIgaWYgdGhlIHJlcXVlc3QKICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGJlaW5nIHByb2Nlc3NlZCBpcyBhIHN1Yi1yZXF1ZXN0LAogICAgICAgICAgICAgICAgICAiZmFsc2UiIG90aGVyd2lzZS4gU3ViLXJlcXVlc3RzIG1heSBiZSBnZW5lcmF0ZWQKICAgICAgICAgICAgICAgICAgYnkgbW9kdWxlcyB0aGF0IG5lZWQgdG8gcmVzb2x2ZSBhZGRpdGlvbmFsIGZpbGVzCiAgICAgICAgICAgICAgICAgIG9yIFVSSXMgaW4gb3JkZXIgdG8gY29tcGxldGUgdGhlaXIgdGFza3MuPC9kZD4KCiAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5SRU1PVEVfQUREUjwvY29kZT48L2R0PgoKICAgICAgICAgICAgICAgICAgPGRkPlRoZSBJUCBhZGRyZXNzIG9mIHRoZSByZW1vdGUgaG9zdCAoc2VlIHRoZQogICAgICAgICAgICAgICAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3JlbW90ZWlwLmh0bWwiPm1vZF9yZW1vdGVpcDwvYT48L2NvZGU+IG1vZHVsZSkuPC9kZD4KCiAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5SRVFVRVNUX0ZJTEVOQU1FPC9jb2RlPjwvZHQ+CgogICAgICAgICAgICAgICAgICA8ZGQ+VGhlIGZ1bGwgbG9jYWwgZmlsZXN5c3RlbSBwYXRoIHRvIHRoZSBmaWxlIG9yCiAgICAgICAgICAgICAgICAgIHNjcmlwdCBtYXRjaGluZyB0aGUgcmVxdWVzdCwgaWYgdGhpcyBoYXMgYWxyZWFkeQogICAgICAgICAgICAgICAgICBiZWVuIGRldGVybWluZWQgYnkgdGhlIHNlcnZlciBhdCB0aGUgdGltZQogICAgICAgICAgICAgICAgICA8Y29kZT5SRVFVRVNUX0ZJTEVOQU1FPC9jb2RlPiBpcyByZWZlcmVuY2VkLiBPdGhlcndpc2UsCiAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgd2hlbiB1c2VkIGluIHZpcnR1YWwgaG9zdCBjb250ZXh0LCB0aGUgc2FtZQogICAgICAgICAgICAgICAgICB2YWx1ZSBhcyA8Y29kZT5SRVFVRVNUX1VSSTwvY29kZT4uICBEZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mCiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjYWNjZXB0cGF0aGluZm8iPkFjY2VwdFBhdGhJbmZvPC9hPjwvY29kZT4sIHRoZQogICAgICAgICAgICAgICAgICBzZXJ2ZXIgbWF5IGhhdmUgb25seSB1c2VkIHNvbWUgbGVhZGluZyBjb21wb25lbnRzIG9mIHRoZQogICAgICAgICAgICAgICAgICA8Y29kZT5SRVFVRVNUX1VSSTwvY29kZT4gdG8gbWFwIHRoZSByZXF1ZXN0IHRvIGEgZmlsZS4KICAgICAgICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5SRVFVRVNUX1NDSEVNRTwvY29kZT48L2R0PgoKICAgICAgICAgICAgICAgICAgPGRkPldpbGwgY29udGFpbiB0aGUgc2NoZW1lIG9mIHRoZSByZXF1ZXN0ICh1c3VhbGx5CiAgICAgICAgICAgICAgICAgICJodHRwIiBvciAiaHR0cHMiKS4gVGhpcyB2YWx1ZSBjYW4gYmUgaW5mbHVlbmNlZCB3aXRoCiAgICAgICAgICAgICAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjc2VydmVybmFtZSI+U2VydmVyTmFtZTwvYT48L2NvZGU+LjwvZGQ+CgogICAgICAgICAgICAgICAgICA8ZHQ+PGNvZGU+UkVRVUVTVF9VUkk8L2NvZGU+PC9kdD4KCiAgICAgICAgICAgICAgICAgIDxkZD5UaGUgcGF0aCBjb21wb25lbnQgb2YgdGhlIHJlcXVlc3RlZCBVUkksCiAgICAgICAgICAgICAgICAgIHN1Y2ggYXMgIi9pbmRleC5odG1sIi4gIFRoaXMgbm90YWJseSBleGNsdWRlcyB0aGUKICAgICAgICAgICAgICAgICAgcXVlcnkgc3RyaW5nIHdoaWNoIGlzIGF2YWlsYWJsZSBhcyBpdHMgb3duIHZhcmlhYmxlCiAgICAgICAgICAgICAgICAgIG5hbWVkIDxjb2RlPlFVRVJZX1NUUklORzwvY29kZT4uPC9kZD4KCiAgICAgICAgICAgICAgICAgIDxkdD48Y29kZT5USEVfUkVRVUVTVDwvY29kZT48L2R0PgoKICAgICAgICAgICAgICAgICAgPGRkPlRoZSBmdWxsIEhUVFAgcmVxdWVzdCBsaW5lIHNlbnQgYnkgdGhlCiAgICAgICAgICAgICAgICAgIGJyb3dzZXIgdG8gdGhlIHNlcnZlciAoZS5nLiwgIjxjb2RlPkdFVAogICAgICAgICAgICAgICAgICAvaW5kZXguaHRtbCBIVFRQLzEuMTwvY29kZT4iKS4gVGhpcyBkb2VzIG5vdAogICAgICAgICAgICAgICAgICBpbmNsdWRlIGFueSBhZGRpdGlvbmFsIGhlYWRlcnMgc2VudCBieSB0aGUKICAgICAgICAgICAgICAgICAgYnJvd3Nlci4gIFRoaXMgdmFsdWUgaGFzIG5vdCBiZWVuIHVuZXNjYXBlZAogICAgICAgICAgICAgICAgICAoZGVjb2RlZCksIHVubGlrZSBtb3N0IG90aGVyIHZhcmlhYmxlcyBiZWxvdy48L2RkPgoKICAgICAgICAgICAgICAgIDwvZGw+CiAgICAgICAgPC9saT4KICAgICAgPC91bD4KCiAgICAgIDxwPklmIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGhhcyB0aGUgc3BlY2lhbCB2YWx1ZSA8Y29kZT5leHByPC9jb2RlPiwKICAgICAgdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+IHdpbGwgYmUgdHJlYXRlZCBhcyBhbgogICAgICA8YSBocmVmPSIuLi9leHByLmh0bWwiPmFwX2V4cHI8L2E+LiBIVFRQIGhlYWRlcnMgcmVmZXJlbmNlZCBpbiB0aGUKICAgICAgZXhwcmVzc2lvbiB3aWxsIGJlIGFkZGVkIHRvIHRoZSBWYXJ5IGhlYWRlciBpZiB0aGUgPGNvZGU+bm92YXJ5PC9jb2RlPgogICAgICBmbGFnIGlzIG5vdCBnaXZlbi48L3A+CgogICAgICA8cD5PdGhlciB0aGluZ3MgeW91IHNob3VsZCBiZSBhd2FyZSBvZjo8L3A+CgogICAgICA8b2w+CiAgICAgICAgPGxpPgogICAgICAgIDxwPlRoZSB2YXJpYWJsZXMgU0NSSVBUX0ZJTEVOQU1FIGFuZCBSRVFVRVNUX0ZJTEVOQU1FCiAgICAgICAgY29udGFpbiB0aGUgc2FtZSB2YWx1ZSAtIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICA8Y29kZT5maWxlbmFtZTwvY29kZT4gZmllbGQgb2YgdGhlIGludGVybmFsCiAgICAgICAgPGNvZGU+cmVxdWVzdF9yZWM8L2NvZGU+IHN0cnVjdHVyZSBvZiB0aGUgQXBhY2hlIEhUVFAgU2VydmVyLgogICAgICAgIFRoZSBmaXJzdCBuYW1lIGlzIHRoZSBjb21tb25seSBrbm93biBDR0kgdmFyaWFibGUgbmFtZQogICAgICAgIHdoaWxlIHRoZSBzZWNvbmQgaXMgdGhlIGFwcHJvcHJpYXRlIGNvdW50ZXJwYXJ0IG9mCiAgICAgICAgUkVRVUVTVF9VUkkgKHdoaWNoIGNvbnRhaW5zIHRoZSB2YWx1ZSBvZiB0aGUKICAgICAgICA8Y29kZT51cmk8L2NvZGU+IGZpZWxkIG9mIDxjb2RlPnJlcXVlc3RfcmVjPC9jb2RlPikuPC9wPgogICAgICAgIDxwPklmIGEgc3Vic3RpdHV0aW9uIG9jY3VycmVkIGFuZCB0aGUgcmV3cml0aW5nIGNvbnRpbnVlcywKICAgICAgICB0aGUgdmFsdWUgb2YgYm90aCB2YXJpYWJsZXMgd2lsbCBiZSB1cGRhdGVkIGFjY29yZGluZ2x5LjwvcD4KICAgICAgICA8cD5JZiB1c2VkIGluIHBlci1zZXJ2ZXIgY29udGV4dCAoPGVtPmkuZS48L2VtPiwgYmVmb3JlIHRoZQogICAgICAgIHJlcXVlc3QgaXMgbWFwcGVkIHRvIHRoZSBmaWxlc3lzdGVtKSBTQ1JJUFRfRklMRU5BTUUgYW5kCiAgICAgICAgUkVRVUVTVF9GSUxFTkFNRSBjYW5ub3QgY29udGFpbiB0aGUgZnVsbCBsb2NhbCBmaWxlc3lzdGVtCiAgICAgICAgcGF0aCBzaW5jZSB0aGUgcGF0aCBpcyB1bmtub3duIGF0IHRoaXMgc3RhZ2Ugb2YgcHJvY2Vzc2luZy4KICAgICAgICBCb3RoIHZhcmlhYmxlcyB3aWxsIGluaXRpYWxseSBjb250YWluIHRoZSB2YWx1ZSBvZiBSRVFVRVNUX1VSSQogICAgICAgIGluIHRoYXQgY2FzZS4gSW4gb3JkZXIgdG8gb2J0YWluIHRoZSBmdWxsIGxvY2FsIGZpbGVzeXN0ZW0KICAgICAgICBwYXRoIG9mIHRoZSByZXF1ZXN0IGluIHBlci1zZXJ2ZXIgY29udGV4dCwgdXNlIGFuIFVSTC1iYXNlZAogICAgICAgIGxvb2stYWhlYWQgPGNvZGU+JXtMQS1VOlJFUVVFU1RfRklMRU5BTUV9PC9jb2RlPiB0byBkZXRlcm1pbmUKICAgICAgICB0aGUgZmluYWwgdmFsdWUgb2YgUkVRVUVTVF9GSUxFTkFNRS48L3A+PC9saT4KCiAgICAgICAgPGxpPgogICAgICAgIDxjb2RlPiV7RU5WOnZhcmlhYmxlfTwvY29kZT4sIHdoZXJlIDxlbT52YXJpYWJsZTwvZW0+IGNhbiBiZQogICAgICAgIGFueSBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXMgYWxzbyBhdmFpbGFibGUuCiAgICAgICAgVGhpcyBpcyBsb29rZWQtdXAgdmlhIGludGVybmFsCiAgICAgICAgQXBhY2hlIGh0dHBkIHN0cnVjdHVyZXMgYW5kIChpZiBub3QgZm91bmQgdGhlcmUpIHZpYQogICAgICAgIDxjb2RlPmdldGVudigpPC9jb2RlPiBmcm9tIHRoZSBBcGFjaGUgaHR0cGQgc2VydmVyIHByb2Nlc3MuPC9saT4KCiAgICAgICAgPGxpPgogICAgICAgIDxjb2RlPiV7U1NMOnZhcmlhYmxlfTwvY29kZT4sIHdoZXJlIDxlbT52YXJpYWJsZTwvZW0+IGlzIHRoZQogICAgICAgIG5hbWUgb2YgYW4gPGEgaHJlZj0ibW9kX3NzbC5odG1sI2VudnZhcnMiPlNTTCBlbnZpcm9ubWVudAogICAgICAgIHZhcmlhYmxlPC9hPiwgY2FuIGJlIHVzZWQgd2hldGhlciBvciBub3QKICAgICAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3NzbC5odG1sIj5tb2Rfc3NsPC9hPjwvY29kZT4gaXMgbG9hZGVkLCBidXQgd2lsbCBhbHdheXMgZXhwYW5kIHRvCiAgICAgICAgdGhlIGVtcHR5IHN0cmluZyBpZiBpdCBpcyBub3QuICBFeGFtcGxlOgogICAgICAgIDxjb2RlPiV7U1NMOlNTTF9DSVBIRVJfVVNFS0VZU0laRX08L2NvZGU+IG1heSBleHBhbmQgdG8KICAgICAgICA8Y29kZT4xMjg8L2NvZGU+LiBUaGVzZSB2YXJpYWJsZXMgYXJlIGF2YWlsYWJsZSBldmVuIHdpdGhvdXQKICAgICAgICBzZXR0aW5nIHRoZSA8Y29kZT5TdGRFbnZWYXJzPC9jb2RlPiBvcHRpb24gb2YgdGhlCiAgICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9zc2wuaHRtbCNzc2xvcHRpb25zIj5TU0xPcHRpb25zPC9hPjwvY29kZT4gZGlyZWN0aXZlLjwvbGk+CgogICAgICAgIDxsaT4KICAgICAgICA8Y29kZT4le0hUVFA6aGVhZGVyfTwvY29kZT4sIHdoZXJlIDxlbT5oZWFkZXI8L2VtPiBjYW4gYmUKICAgICAgICBhbnkgSFRUUCBNSU1FLWhlYWRlciBuYW1lLCBjYW4gYWx3YXlzIGJlIHVzZWQgdG8gb2J0YWluIHRoZQogICAgICAgIHZhbHVlIG9mIGEgaGVhZGVyIHNlbnQgaW4gdGhlIEhUVFAgcmVxdWVzdC4KICAgICAgICBFeGFtcGxlOiA8Y29kZT4le0hUVFA6UHJveHktQ29ubmVjdGlvbn08L2NvZGU+IGlzCiAgICAgICAgdGhlIHZhbHVlIG9mIHRoZSBIVFRQIGhlYWRlcgogICAgICAgIGBgPGNvZGU+UHJveHktQ29ubmVjdGlvbjo8L2NvZGU+JycuCiAgICAgICAgPHA+SWYgYSBIVFRQIGhlYWRlciBpcyB1c2VkIGluIGEgY29uZGl0aW9uIHRoaXMgaGVhZGVyIGlzIGFkZGVkIHRvCiAgICAgICAgdGhlIFZhcnkgaGVhZGVyIG9mIHRoZSByZXNwb25zZSBpbiBjYXNlIHRoZSBjb25kaXRpb24gZXZhbHVhdGVzCiAgICAgICAgdG8gdHJ1ZSBmb3IgdGhlIHJlcXVlc3QuIEl0IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IGFkZGVkIGlmIHRoZQogICAgICAgIGNvbmRpdGlvbiBldmFsdWF0ZXMgdG8gZmFsc2UgZm9yIHRoZSByZXF1ZXN0LiBBZGRpbmcgdGhlIEhUVFAgaGVhZGVyCiAgICAgICAgdG8gdGhlIFZhcnkgaGVhZGVyIG9mIHRoZSByZXNwb25zZSBpcyBuZWVkZWQgZm9yIHByb3BlciBjYWNoaW5nLjwvcD4KICAgICAgICA8cD5JdCBoYXMgdG8gYmUga2VwdCBpbiBtaW5kIHRoYXQgY29uZGl0aW9ucyBmb2xsb3cgYSBzaG9ydCBjaXJjdWl0CiAgICAgICAgbG9naWMgaW4gdGhlIGNhc2Ugb2YgdGhlICc8c3Ryb25nPjxjb2RlPm9ybmV4dHxPUjwvY29kZT48L3N0cm9uZz4nIGZsYWcKICAgICAgICBzbyB0aGF0IGNlcnRhaW4gY29uZGl0aW9ucyBtaWdodCBub3QgYmUgZXZhbHVhdGVkIGF0IGFsbC48L3A+PC9saT4KCiAgICAgICAgPGxpPgogICAgICAgIDxhIGlkPSJMQS1VIiBuYW1lPSJMQS1VIj48Y29kZT4le0xBLVU6dmFyaWFibGV9PC9jb2RlPjwvYT4KICAgICAgICBjYW4gYmUgdXNlZCBmb3IgbG9vay1haGVhZHMgd2hpY2ggcGVyZm9ybQogICAgICAgIGFuIGludGVybmFsIChVUkwtYmFzZWQpIHN1Yi1yZXF1ZXN0IHRvIGRldGVybWluZSB0aGUgZmluYWwKICAgICAgICB2YWx1ZSBvZiA8ZW0+dmFyaWFibGU8L2VtPi4gVGhpcyBjYW4gYmUgdXNlZCB0byBhY2Nlc3MKICAgICAgICB2YXJpYWJsZSBmb3IgcmV3cml0aW5nIHdoaWNoIGlzIG5vdCBhdmFpbGFibGUgYXQgdGhlIGN1cnJlbnQKICAgICAgICBzdGFnZSwgYnV0IHdpbGwgYmUgc2V0IGluIGEgbGF0ZXIgcGhhc2UuCiAgICAgICAgPHA+Rm9yIGluc3RhbmNlLCB0byByZXdyaXRlIGFjY29yZGluZyB0byB0aGUKICAgICAgICA8Y29kZT5SRU1PVEVfVVNFUjwvY29kZT4gdmFyaWFibGUgZnJvbSB3aXRoaW4gdGhlCiAgICAgICAgcGVyLXNlcnZlciBjb250ZXh0ICg8Y29kZT5odHRwZC5jb25mPC9jb2RlPiBmaWxlKSB5b3UgbXVzdAogICAgICAgIHVzZSA8Y29kZT4le0xBLVU6UkVNT1RFX1VTRVJ9PC9jb2RlPiAtIHRoaXMKICAgICAgICB2YXJpYWJsZSBpcyBzZXQgYnkgdGhlIGF1dGhvcml6YXRpb24gcGhhc2VzLCB3aGljaCBjb21lCiAgICAgICAgPGVtPmFmdGVyPC9lbT4gdGhlIFVSTCB0cmFuc2xhdGlvbiBwaGFzZSAoZHVyaW5nIHdoaWNoIG1vZF9yZXdyaXRlCiAgICAgICAgb3BlcmF0ZXMpLjwvcD4KICAgICAgICA8cD5PbiB0aGUgb3RoZXIgaGFuZCwgYmVjYXVzZSBtb2RfcmV3cml0ZSBpbXBsZW1lbnRzCiAgICAgICAgaXRzIHBlci1kaXJlY3RvcnkgY29udGV4dCAoPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlKSB2aWEKICAgICAgICB0aGUgRml4dXAgcGhhc2Ugb2YgdGhlIEFQSSBhbmQgYmVjYXVzZSB0aGUgYXV0aG9yaXphdGlvbgogICAgICAgIHBoYXNlcyBjb21lIDxlbT5iZWZvcmU8L2VtPiB0aGlzIHBoYXNlLCB5b3UganVzdCBjYW4gdXNlCiAgICAgICAgPGNvZGU+JXtSRU1PVEVfVVNFUn08L2NvZGU+IGluIHRoYXQgY29udGV4dC48L3A+PC9saT4KCiAgICAgICAgPGxpPgogICAgICAgIDxjb2RlPiV7TEEtRjp2YXJpYWJsZX08L2NvZGU+IGNhbiBiZSB1c2VkIHRvIHBlcmZvcm0gYW4gaW50ZXJuYWwKICAgICAgICAoZmlsZW5hbWUtYmFzZWQpIHN1Yi1yZXF1ZXN0LCB0byBkZXRlcm1pbmUgdGhlIGZpbmFsIHZhbHVlCiAgICAgICAgb2YgPGVtPnZhcmlhYmxlPC9lbT4uIE1vc3Qgb2YgdGhlIHRpbWUsIHRoaXMgaXMgdGhlIHNhbWUgYXMKICAgICAgICBMQS1VIGFib3ZlLjwvbGk+CiAgICAgIDwvb2w+CgogICAgICA8cD48ZW0+Q29uZFBhdHRlcm48L2VtPiBpcyB0aGUgY29uZGl0aW9uIHBhdHRlcm4sCiAgICAgICBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBpcyBhcHBsaWVkIHRvIHRoZQogICAgICBjdXJyZW50IGluc3RhbmNlIG9mIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+LgogICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGZpcnN0IGV2YWx1YXRlZCwgYmVmb3JlIGJlaW5nIG1hdGNoZWQgYWdhaW5zdAogICAgICA8ZW0+Q29uZFBhdHRlcm48L2VtPi48L3A+CgogICAgICA8cD48ZW0+Q29uZFBhdHRlcm48L2VtPiBpcyB1c3VhbGx5IGEKICAgICAgPGVtPnBlcmwgY29tcGF0aWJsZSByZWd1bGFyIGV4cHJlc3Npb248L2VtPiwgYnV0IHRoZXJlIGlzCiAgICAgIGFkZGl0aW9uYWwgc3ludGF4IGF2YWlsYWJsZSB0byBwZXJmb3JtIG90aGVyIHVzZWZ1bCB0ZXN0cyBhZ2FpbnN0CiAgICAgIHRoZSA8ZW0+VGVzdHN0cmluZzwvZW0+OjwvcD4KCiAgICAgIDxvbD4KICAgICAgICA8bGk+WW91IGNhbiBwcmVmaXggdGhlIHBhdHRlcm4gc3RyaW5nIHdpdGggYQogICAgICAgICc8Y29kZT4hPC9jb2RlPicgY2hhcmFjdGVyIChleGNsYW1hdGlvbiBtYXJrKSB0byBuZWdhdGUgdGhlIHJlc3VsdAogICAgICAgIG9mIHRoZSBjb25kaXRpb24sIG5vIG1hdHRlciB3aGF0IGtpbmQgb2YgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gaXMgdXNlZC4KICAgICAgICA8L2xpPgoKICAgICAgICA8bGk+CiAgICAgICAgICBZb3UgY2FuIHBlcmZvcm0gbGV4aWNvZ3JhcGhpY2FsIHN0cmluZyBjb21wYXJpc29uczoKCiAgICAgICAgICA8ZGw+CiAgICAgICAgICAgIDxkdD48c3Ryb25nPiZsdDtDb25kUGF0dGVybjwvc3Ryb25nPjwvZHQ+CiAgICAgICAgICAgIDxkZD5MZXhpY29ncmFwaGljYWxseSBwcmVjZWRlczxiciAvPgogICAgICAgICAgICBUcmVhdHMgdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+IGFzIGEgcGxhaW4gc3RyaW5nIGFuZAogICAgICAgICAgICBjb21wYXJlcyBpdCBsZXhpY29ncmFwaGljYWxseSB0byA8ZW0+VGVzdFN0cmluZzwvZW0+LiBUcnVlIGlmCiAgICAgICAgICAgIDxlbT5UZXN0U3RyaW5nPC9lbT4gbGV4aWNvZ3JhcGhpY2FsbHkgcHJlY2VkZXMKICAgICAgICAgICAgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uPC9kZD4KCiAgICAgICAgICAgIDxkdD48c3Ryb25nPiZndDtDb25kUGF0dGVybjwvc3Ryb25nPjwvZHQ+CiAgICAgICAgICAgIDxkZD5MZXhpY29ncmFwaGljYWxseSBmb2xsb3dzPGJyIC8+CiAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gYXMgYSBwbGFpbiBzdHJpbmcgYW5kCiAgICAgICAgICAgIGNvbXBhcmVzIGl0IGxleGljb2dyYXBoaWNhbGx5IHRvIDxlbT5UZXN0U3RyaW5nPC9lbT4uIFRydWUgaWYKICAgICAgICAgICAgPGVtPlRlc3RTdHJpbmc8L2VtPiBsZXhpY29ncmFwaGljYWxseSBmb2xsb3dzCiAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LjwvZGQ+CgogICAgICAgICAgICA8ZHQ+PHN0cm9uZz49Q29uZFBhdHRlcm48L3N0cm9uZz48L2R0PgogICAgICAgICAgICA8ZGQ+TGV4aWNvZ3JhcGhpY2FsbHkgZXF1YWw8YnIgLz4KICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPiBhcyBhIHBsYWluIHN0cmluZyBhbmQKICAgICAgICAgICAgY29tcGFyZXMgaXQgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gPGVtPlRlc3RTdHJpbmc8L2VtPi4gVHJ1ZSBpZgogICAgICAgICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGxleGljb2dyYXBoaWNhbGx5IGVxdWFsIHRvCiAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+ICh0aGUgdHdvIHN0cmluZ3MgYXJlIGV4YWN0bHkKICAgICAgICAgICAgZXF1YWwsIGNoYXJhY3RlciBmb3IgY2hhcmFjdGVyKS4gSWYgPGVtPkNvbmRQYXR0ZXJuPC9lbT4KICAgICAgICAgICAgaXMgPGNvZGU+IiI8L2NvZGU+ICh0d28gcXVvdGF0aW9uIG1hcmtzKSB0aGlzCiAgICAgICAgICAgIGNvbXBhcmVzIDxlbT5UZXN0U3RyaW5nPC9lbT4gdG8gdGhlIGVtcHR5IHN0cmluZy48L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+Jmx0Oz1Db25kUGF0dGVybjwvc3Ryb25nPjwvZHQ+CiAgICAgICAgICAgIDxkZD5MZXhpY29ncmFwaGljYWxseSBsZXNzIHRoYW4gb3IgZXF1YWwgdG88YnIgLz4KICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPiBhcyBhIHBsYWluIHN0cmluZyBhbmQKICAgICAgICAgICAgY29tcGFyZXMgaXQgbGV4aWNvZ3JhcGhpY2FsbHkgdG8gPGVtPlRlc3RTdHJpbmc8L2VtPi4gVHJ1ZQogICAgICAgICAgICBpZiA8ZW0+VGVzdFN0cmluZzwvZW0+IGxleGljb2dyYXBoaWNhbGx5IHByZWNlZGVzCiAgICAgICAgICAgIDxlbT5Db25kUGF0dGVybjwvZW0+LCBvciBpcyBlcXVhbCB0byA8ZW0+Q29uZFBhdHRlcm48L2VtPgogICAgICAgICAgICAodGhlIHR3byBzdHJpbmdzIGFyZSBlcXVhbCwgY2hhcmFjdGVyIGZvciBjaGFyYWN0ZXIpLjwvZGQ+CgogICAgICAgICAgICA8ZHQ+PHN0cm9uZz4mZ3Q7PUNvbmRQYXR0ZXJuPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPkxleGljb2dyYXBoaWNhbGx5IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0bzxiciAvPgogICAgICAgICAgICBUcmVhdHMgdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+IGFzIGEgcGxhaW4gc3RyaW5nIGFuZAogICAgICAgICAgICBjb21wYXJlcyBpdCBsZXhpY29ncmFwaGljYWxseSB0byA8ZW0+VGVzdFN0cmluZzwvZW0+LiBUcnVlCiAgICAgICAgICAgIGlmIDxlbT5UZXN0U3RyaW5nPC9lbT4gbGV4aWNvZ3JhcGhpY2FsbHkgZm9sbG93cwogICAgICAgICAgICA8ZW0+Q29uZFBhdHRlcm48L2VtPiwgb3IgaXMgZXF1YWwgdG8gPGVtPkNvbmRQYXR0ZXJuPC9lbT4KICAgICAgICAgICAgKHRoZSB0d28gc3RyaW5ncyBhcmUgZXF1YWwsIGNoYXJhY3RlciBmb3IgY2hhcmFjdGVyKS48L2RkPgogICAgICAgIDwvZGw+CiAgICAgICAgPC9saT4KCiAgICAgICAgPGxpPgogICAgICAgICAgWW91IGNhbiBwZXJmb3JtIGludGVnZXIgY29tcGFyaXNvbnM6CiAgICAgICAgICA8ZGw+CgogICAgICAgICAgICA8ZHQ+PHN0cm9uZz4tZXE8L3N0cm9uZz48L2R0PgogICAgICAgICAgICA8ZGQ+SXMgbnVtZXJpY2FsbHkgPHN0cm9uZz5lcTwvc3Ryb25nPnVhbCB0bzxiciAvPgogICAgICAgICAgICBUaGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXIsIGFuZCBpcwogICAgICAgICAgICBudW1lcmljYWxseSBjb21wYXJlZCB0byB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uIFRydWUgaWYKICAgICAgICAgICAgdGhlIHR3byBhcmUgbnVtZXJpY2FsbHkgZXF1YWwuPC9kZD4KCiAgICAgICAgICAgIDxkdD48c3Ryb25nPi1nZTwvc3Ryb25nPjwvZHQ+CiAgICAgICAgICAgIDxkZD5JcyBudW1lcmljYWxseSA8c3Ryb25nPmc8L3N0cm9uZz5yZWF0ZXIgdGhhbiBvciA8c3Ryb25nPmU8L3N0cm9uZz5xdWFsIHRvPGJyIC8+CiAgICAgICAgICAgIFRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIHRyZWF0ZWQgYXMgYW4gaW50ZWdlciwgYW5kIGlzCiAgICAgICAgICAgIG51bWVyaWNhbGx5IGNvbXBhcmVkIHRvIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPi4gVHJ1ZSBpZgogICAgICAgICAgICB0aGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyBudW1lcmljYWxseSBncmVhdGVyIHRoYW4gb3IgZXF1YWwKICAgICAgICAgICAgdG8gdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+LjwvZGQ+CgogICAgICAgICAgICA8ZHQ+PHN0cm9uZz4tZ3Q8L3N0cm9uZz48L2R0PgogICAgICAgICAgICA8ZGQ+SXMgbnVtZXJpY2FsbHkgPHN0cm9uZz5nPC9zdHJvbmc+cmVhdGVyIDxzdHJvbmc+dDwvc3Ryb25nPmhhbjxiciAvPgogICAgICAgICAgICBUaGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBpcyB0cmVhdGVkIGFzIGFuIGludGVnZXIsIGFuZCBpcwogICAgICAgICAgICBudW1lcmljYWxseSBjb21wYXJlZCB0byB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uIFRydWUgaWYKICAgICAgICAgICAgdGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgbnVtZXJpY2FsbHkgZ3JlYXRlciB0aGFuCiAgICAgICAgICAgIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPi48L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+LWxlPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPklzIG51bWVyaWNhbGx5IDxzdHJvbmc+bDwvc3Ryb25nPmVzcyB0aGFuIG9yIDxzdHJvbmc+ZTwvc3Ryb25nPnF1YWwgdG88YnIgLz4KICAgICAgICAgICAgVGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLCBhbmQgaXMKICAgICAgICAgICAgbnVtZXJpY2FsbHkgY29tcGFyZWQgdG8gdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+LiBUcnVlIGlmCiAgICAgICAgICAgIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIG51bWVyaWNhbGx5IGxlc3MgdGhhbiBvciBlcXVhbAogICAgICAgICAgICB0byB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uIEF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZQogICAgICAgICAgICA8c3Ryb25nPi1sPC9zdHJvbmc+IGJ5IHVzaW5nIHRoZSA8c3Ryb25nPi1MPC9zdHJvbmc+IG9yCiAgICAgICAgICAgIDxzdHJvbmc+LWg8L3N0cm9uZz4gdmFyaWFudC48L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+LWx0PC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPklzIG51bWVyaWNhbGx5IDxzdHJvbmc+bDwvc3Ryb25nPmVzcyA8c3Ryb25nPnQ8L3N0cm9uZz5oYW48YnIgLz4KICAgICAgICAgICAgVGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLCBhbmQgaXMKICAgICAgICAgICAgbnVtZXJpY2FsbHkgY29tcGFyZWQgdG8gdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+LiBUcnVlIGlmCiAgICAgICAgICAgIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIG51bWVyaWNhbGx5IGxlc3MgdGhhbgogICAgICAgICAgICB0aGUgPGVtPkNvbmRQYXR0ZXJuPC9lbT4uIEF2b2lkIGNvbmZ1c2lvbiB3aXRoIHRoZQogICAgICAgICAgICA8c3Ryb25nPi1sPC9zdHJvbmc+IGJ5IHVzaW5nIHRoZSA8c3Ryb25nPi1MPC9zdHJvbmc+IG9yCiAgICAgICAgICAgIDxzdHJvbmc+LWg8L3N0cm9uZz4gdmFyaWFudC48L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+LW5lPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPklzIG51bWVyaWNhbGx5IDxzdHJvbmc+bjwvc3Ryb25nPm90IDxzdHJvbmc+ZTwvc3Ryb25nPnF1YWwgdG88YnIgLz4KICAgICAgICAgICAgVGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gaXMgdHJlYXRlZCBhcyBhbiBpbnRlZ2VyLCBhbmQgaXMKICAgICAgICAgICAgbnVtZXJpY2FsbHkgY29tcGFyZWQgdG8gdGhlIDxlbT5Db25kUGF0dGVybjwvZW0+LiBUcnVlIGlmCiAgICAgICAgICAgIHRoZSB0d28gYXJlIG51bWVyaWNhbGx5IGRpZmZlcmVudC4gVGhpcyBpcyBlcXVpdmFsZW50IHRvCiAgICAgICAgICAgIDxjb2RlPiEtZXE8L2NvZGU+LjwvZGQ+CgogICAgICAgICAgIDwvZGw+CiAgICAgICAgPC9saT4KCiAgICAgICAgPGxpPllvdSBjYW4gcGVyZm9ybSB2YXJpb3VzIGZpbGUgYXR0cmlidXRlIHRlc3RzOgoKCiAgICAgICAgICA8ZGw+CgogICAgICAgICAgPGR0PjxzdHJvbmc+LWQ8L3N0cm9uZz48L2R0PgoKICAgICAgICAgIDxkZD5JcyA8c3Ryb25nPmQ8L3N0cm9uZz5pcmVjdG9yeS48YnIgLz4KICAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBhcyBhIHBhdGhuYW1lIGFuZCB0ZXN0cwogICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBpdCBleGlzdHMsIGFuZCBpcyBhIGRpcmVjdG9yeS4KICAgICAgICAgIDwvZGQ+CgogICAgICAgICAgPGR0PjxzdHJvbmc+LWY8L3N0cm9uZz48L2R0PgoKICAgICAgICAgIDxkZD5JcyByZWd1bGFyIDxzdHJvbmc+Zjwvc3Ryb25nPmlsZS48YnIgLz4KCiAgICAgICAgICAgICBUcmVhdHMgdGhlIDxlbT5UZXN0U3RyaW5nPC9lbT4gYXMgYSBwYXRobmFtZSBhbmQgdGVzdHMKICAgICAgICAgICAgd2hldGhlciBvciBub3QgaXQgZXhpc3RzLCBhbmQgaXMgYSByZWd1bGFyIGZpbGUuCiAgICAgICAgPC9kZD4KCiAgICAgICAgICAgPGR0PjxzdHJvbmc+LUY8L3N0cm9uZz48L2R0PgoKICAgICAgICAgICA8ZGQ+SXMgZXhpc3RpbmcgZmlsZSwgdmlhIHN1YnJlcXVlc3QuPGJyIC8+CiAgICAgICAgICAgIENoZWNrcyB3aGV0aGVyIG9yIG5vdCA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGEgdmFsaWQgZmlsZSwKICAgICAgICAgICAgYWNjZXNzaWJsZSB2aWEgYWxsIHRoZSBzZXJ2ZXIncyBjdXJyZW50bHktY29uZmlndXJlZAogICAgICAgICAgICBhY2Nlc3MgY29udHJvbHMgZm9yIHRoYXQgcGF0aC4gVGhpcyB1c2VzIGFuIGludGVybmFsCiAgICAgICAgICAgIHN1YnJlcXVlc3QgdG8gZG8gdGhlIGNoZWNrLCBzbyB1c2UgaXQgd2l0aCBjYXJlIC0KICAgICAgICAgICAgaXQgY2FuIGltcGFjdCB5b3VyIHNlcnZlcidzIHBlcmZvcm1hbmNlIQogICAgICAgICAgIDwvZGQ+CgogICAgICAgICAgICA8ZHQ+PHN0cm9uZz4taDwvc3Ryb25nPjwvZHQ+CiAgICAgICAgICAgIDxkZD5JcyBzeW1ib2xpYyBsaW5rLCBiYXNoIGNvbnZlbnRpb24uPGJyIC8+CiAgICAgICAgICAgIFNlZSA8c3Ryb25nPi1sPC9zdHJvbmc+LgogICAgICAgICAgICA8L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+LWw8L3N0cm9uZz48L2R0PgoKICAgICAgICAgICAgPGRkPklzIHN5bWJvbGljIDxzdHJvbmc+bDwvc3Ryb25nPmluay48YnIgLz4KICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGFzIGEgcGF0aG5hbWUgYW5kIHRlc3RzCiAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IGl0IGV4aXN0cywgYW5kIGlzIGEgc3ltYm9saWMgbGluay4gTWF5IGFsc28KICAgICAgICAgICAgdXNlIHRoZSBiYXNoIGNvbnZlbnRpb24gb2YgPHN0cm9uZz4tTDwvc3Ryb25nPiBvcgogICAgICAgICAgICA8c3Ryb25nPi1oPC9zdHJvbmc+IGlmIHRoZXJlJ3MgYSBwb3NzaWJpbGl0eSBvZiBjb25mdXNpb24KICAgICAgICAgICAgc3VjaCBhcyB3aGVuIHVzaW5nIHRoZSA8c3Ryb25nPi1sdDwvc3Ryb25nPiBvcgogICAgICAgICAgICA8c3Ryb25nPi1sZTwvc3Ryb25nPiB0ZXN0cy4KICAgICAgICAgICAgPC9kZD4KCiAgICAgICAgICAgIDxkdD48c3Ryb25nPi1MPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPklzIHN5bWJvbGljIGxpbmssIGJhc2ggY29udmVudGlvbi48YnIgLz4KICAgICAgICAgICAgU2VlIDxzdHJvbmc+LWw8L3N0cm9uZz4uPC9kZD4KCiAgICAgICAgICAgIDxkdD48c3Ryb25nPi1zPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPklzIHJlZ3VsYXIgZmlsZSwgd2l0aCA8c3Ryb25nPnM8L3N0cm9uZz5pemUuPGJyIC8+CiAgICAgICAgICAgIFRyZWF0cyB0aGUgPGVtPlRlc3RTdHJpbmc8L2VtPiBhcyBhIHBhdGhuYW1lIGFuZCB0ZXN0cwogICAgICAgICAgICB3aGV0aGVyIG9yIG5vdCBpdCBleGlzdHMsIGFuZCBpcyBhIHJlZ3VsYXIgZmlsZSB3aXRoIHNpemUgZ3JlYXRlcgogICAgICAgICAgICB0aGFuIHplcm8uPC9kZD4KCiAgICAgICAgICAgIDxkdD48c3Ryb25nPi1VPC9zdHJvbmc+PC9kdD4KICAgICAgICAgICAgPGRkPjxwPklzIGV4aXN0aW5nIFVSTCwgdmlhIHN1YnJlcXVlc3QuPGJyIC8+CiAgICAgICAgICAgIENoZWNrcyB3aGV0aGVyIG9yIG5vdCA8ZW0+VGVzdFN0cmluZzwvZW0+IGlzIGEgdmFsaWQgVVJMLAogICAgICAgICAgICBhY2Nlc3NpYmxlIHZpYSBhbGwgdGhlIHNlcnZlcidzIGN1cnJlbnRseS1jb25maWd1cmVkCiAgICAgICAgICAgIGFjY2VzcyBjb250cm9scyBmb3IgdGhhdCBwYXRoLiBUaGlzIHVzZXMgYW4gaW50ZXJuYWwKICAgICAgICAgICAgc3VicmVxdWVzdCB0byBkbyB0aGUgY2hlY2ssIHNvIHVzZSBpdCB3aXRoIGNhcmUgLQogICAgICAgICAgICBpdCBjYW4gaW1wYWN0IHlvdXIgc2VydmVyJ3MgcGVyZm9ybWFuY2UhPC9wPgogICAgICAgICAgICA8cD4gVGhpcyBmbGFnIDxlbT5vbmx5PC9lbT4gcmV0dXJucyBpbmZvcm1hdGlvbiBhYm91dCB0aGluZ3MKICAgICAgICAgICAgbGlrZSBhY2Nlc3MgY29udHJvbCwgYXV0aGVudGljYXRpb24sIGFuZCBhdXRob3JpemF0aW9uLiAgVGhpcyBmbGFnCiAgICAgICAgICAgIDxlbT5kb2VzIG5vdDwvZW0+IHJldHVybiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc3RhdHVzIGNvZGUgdGhlCiAgICAgICAgICAgIGNvbmZpZ3VyZWQgaGFuZGxlciAoc3RhdGljIGZpbGUsIENHSSwgcHJveHksIGV0Yy4pIHdvdWxkIGhhdmUKICAgICAgICAgICAgcmV0dXJuZWQuPC9wPiA8L2RkPgoKICAgICAgICAgICAgPGR0PjxzdHJvbmc+LXg8L3N0cm9uZz48L2R0PgogICAgICAgICAgICA8ZGQ+SGFzIGU8c3Ryb25nPng8L3N0cm9uZz5lY3V0YWJsZSBwZXJtaXNzaW9ucy48YnIgLz4KICAgICAgICAgICAgVHJlYXRzIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGFzIGEgcGF0aG5hbWUgYW5kIHRlc3RzCiAgICAgICAgICAgIHdoZXRoZXIgb3Igbm90IGl0IGV4aXN0cywgYW5kIGhhcyBleGVjdXRhYmxlIHBlcm1pc3Npb25zLgogICAgICAgICAgICBUaGVzZSBwZXJtaXNzaW9ucyBhcmUgZGV0ZXJtaW5lZCBhY2NvcmRpbmcgdG8KICAgICAgICAgICAgdGhlIHVuZGVybHlpbmcgT1MuPC9kZD4KCiAgICAgICAgICA8L2RsPgoKICAgICAgICAgIEZvciBleGFtcGxlOgoKICAgICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+UmV3cml0ZUNvbmQgL3Zhci93d3cvJXtSRVFVRVNUX1VSSX0gIS1mClJld3JpdGVSdWxlIF4oLispIC9vdGhlci9hcmNoaXZlLyQxIFtSXTwvcHJlPgoKCiAgICAgICAgPC9saT4KCiAgICAgICAgPGxpPgogICAgICAgICAgIDxwPklmIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IGhhcyB0aGUgc3BlY2lhbCB2YWx1ZSA8Y29kZT5leHByPC9jb2RlPiwgdGhlCiAgICAgICAgICAgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gd2lsbCBiZSB0cmVhdGVkIGFzIGFuCiAgICAgICAgICAgPGEgaHJlZj0iLi4vZXhwci5odG1sIj5hcF9leHByPC9hPi48L3A+CgogICAgICAgICAgIDxwPgogICAgICAgICAgICBJbiB0aGUgYmVsb3cgZXhhbXBsZSwgPGNvZGU+LXN0cm1hdGNoPC9jb2RlPiBpcyB1c2VkIHRvCiAgICAgICAgICAgIGNvbXBhcmUgdGhlIDxjb2RlPlJFRkVSRVI8L2NvZGU+IGFnYWluc3QgdGhlIHNpdGUgaG9zdG5hbWUsCiAgICAgICAgICAgIHRvIGJsb2NrIHVud2FudGVkIGhvdGxpbmtpbmcuCiAgICAgICAgICAgPC9wPgoKICAgICAgICAgICA8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+UmV3cml0ZUNvbmQgZXhwciAiISAle0hUVFBfUkVGRVJFUn0gLXN0cm1hdGNoICcqOi8vJXtIVFRQX0hPU1R9LyonIgpSZXdyaXRlUnVsZSAiXi9pbWFnZXMiICItIiBbRl08L3ByZT4KCiAgICAgICAgPC9saT4KCiAgICAgICAgPGxpPllvdSBjYW4gYWxzbyBzZXQgc3BlY2lhbCBmbGFncyBmb3IKICAgICAgPGVtPkNvbmRQYXR0ZXJuPC9lbT4gYnkgYXBwZW5kaW5nCiAgICAgICAgPHN0cm9uZz48Y29kZT5bPC9jb2RlPjxlbT5mbGFnczwvZW0+PGNvZGU+XTwvY29kZT48L3N0cm9uZz4KICAgICAgYXMgdGhlIHRoaXJkIGFyZ3VtZW50IHRvIHRoZSA8Y29kZT5SZXdyaXRlQ29uZDwvY29kZT4KICAgICAgZGlyZWN0aXZlLCB3aGVyZSA8ZW0+ZmxhZ3M8L2VtPiBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIGFueSBvZiB0aGUKICAgICAgZm9sbG93aW5nIGZsYWdzOgoKICAgICAgPHVsPgogICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5ub2Nhc2V8TkM8L2NvZGU+PC9zdHJvbmc+JwogICAgICAgICg8c3Ryb25nPm48L3N0cm9uZz5vIDxzdHJvbmc+Yzwvc3Ryb25nPmFzZSk8YnIgLz4KICAgICAgICBUaGlzIG1ha2VzIHRoZSB0ZXN0IGNhc2UtaW5zZW5zaXRpdmUgLSBkaWZmZXJlbmNlcwogICAgICAgIGJldHdlZW4gJ0EtWicgYW5kICdhLXonIGFyZSBpZ25vcmVkLCBib3RoIGluIHRoZQogICAgICAgIGV4cGFuZGVkIDxlbT5UZXN0U3RyaW5nPC9lbT4gYW5kIHRoZSA8ZW0+Q29uZFBhdHRlcm48L2VtPi4KICAgICAgICBUaGlzIGZsYWcgaXMgZWZmZWN0aXZlIG9ubHkgZm9yIGNvbXBhcmlzb25zIGJldHdlZW4KICAgICAgICA8ZW0+VGVzdFN0cmluZzwvZW0+IGFuZCA8ZW0+Q29uZFBhdHRlcm48L2VtPi4gSXQgaGFzIG5vCiAgICAgICAgZWZmZWN0IG9uIGZpbGVzeXN0ZW0gYW5kIHN1YnJlcXVlc3QgY2hlY2tzLjwvbGk+CgogICAgICAgIDxsaT4KICAgICAgICAgICc8c3Ryb25nPjxjb2RlPm9ybmV4dHxPUjwvY29kZT48L3N0cm9uZz4nCiAgICAgICAgICAoPHN0cm9uZz5vcjwvc3Ryb25nPiBuZXh0IGNvbmRpdGlvbik8YnIgLz4KICAgICAgICAgIFVzZSB0aGlzIHRvIGNvbWJpbmUgcnVsZSBjb25kaXRpb25zIHdpdGggYSBsb2NhbCBPUgogICAgICAgICAgaW5zdGVhZCBvZiB0aGUgaW1wbGljaXQgQU5ELiBUeXBpY2FsIGV4YW1wbGU6Cgo8cHJlIGNsYXNzPSJwcmV0dHlwcmludCBsYW5nLWNvbmZpZyI+UmV3cml0ZUNvbmQgIiV7UkVNT1RFX0hPU1R9IiAgIl5ob3N0MSIgIFtPUl0KUmV3cml0ZUNvbmQgIiV7UkVNT1RFX0hPU1R9IiAgIl5ob3N0MiIgIFtPUl0KUmV3cml0ZUNvbmQgIiV7UkVNT1RFX0hPU1R9IiAgIl5ob3N0MyIKUmV3cml0ZVJ1bGUgLi4uc29tZSBzcGVjaWFsIHN0dWZmIGZvciBhbnkgb2YgdGhlc2UgaG9zdHMuLi48L3ByZT4KCgogICAgICAgICAgV2l0aG91dCB0aGlzIGZsYWcgeW91IHdvdWxkIGhhdmUgdG8gd3JpdGUgdGhlIGNvbmRpdGlvbi9ydWxlCiAgICAgICAgICBwYWlyIHRocmVlIHRpbWVzLgogICAgICAgIDwvbGk+CgogICAgICAgIDxsaT4nPHN0cm9uZz48Y29kZT5ub3Zhcnl8TlY8L2NvZGU+PC9zdHJvbmc+JwogICAgICAgICg8c3Ryb25nPm48L3N0cm9uZz5vIDxzdHJvbmc+djwvc3Ryb25nPmFyeSk8YnIgLz4KICAgICAgICBJZiBhIEhUVFAgaGVhZGVyIGlzIHVzZWQgaW4gdGhlIGNvbmRpdGlvbiwgdGhpcyBmbGFnIHByZXZlbnRzCiAgICAgICAgdGhpcyBoZWFkZXIgZnJvbSBiZWluZyBhZGRlZCB0byB0aGUgVmFyeSBoZWFkZXIgb2YgdGhlIHJlc3BvbnNlLiA8YnIgLz4KICAgICAgICBVc2luZyB0aGlzIGZsYWcgbWlnaHQgYnJlYWsgcHJvcGVyIGNhY2hpbmcgb2YgdGhlIHJlc3BvbnNlIGlmCiAgICAgICAgdGhlIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgcmVzcG9uc2UgdmFyaWVzIG9uIHRoZSB2YWx1ZSBvZiB0aGlzIGhlYWRlci4KICAgICAgICBTbyB0aGlzIGZsYWcgc2hvdWxkIGJlIG9ubHkgdXNlZCBpZiB0aGUgbWVhbmluZyBvZiB0aGUgVmFyeSBoZWFkZXIKICAgICAgICBpcyB3ZWxsIHVuZGVyc3Rvb2QuCiAgICAgICAgPC9saT4KICAgICAgPC91bD4KICAgICAgPC9saT4KICAgICA8L29sPgoKICAgICAgPHA+PHN0cm9uZz5FeGFtcGxlOjwvc3Ryb25nPjwvcD4KCiAgICAgICA8cD5UbyByZXdyaXRlIHRoZSBIb21lcGFnZSBvZiBhIHNpdGUgYWNjb3JkaW5nIHRvIHRoZQogICAgICAgIGBgPGNvZGU+VXNlci1BZ2VudDo8L2NvZGU+JycgaGVhZGVyIG9mIHRoZSByZXF1ZXN0LCB5b3UgY2FuCiAgICAgICAgdXNlIHRoZSBmb2xsb3dpbmc6IDwvcD4KCjxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj5SZXdyaXRlQ29uZCAgIiV7SFRUUF9VU0VSX0FHRU5UfSIgICIoaVBob25lfEJsYWNrYmVycnl8QW5kcm9pZCkiClJld3JpdGVSdWxlICAiXi8kIiAgICAgICAgICAgICAgICAgIi9ob21lcGFnZS5tb2JpbGUuaHRtbCIgIFtMXQoKUmV3cml0ZVJ1bGUgICJeLyQiICAgICAgICAgICAgICAgICAiL2hvbWVwYWdlLnN0ZC5odG1sIiAgICAgW0xdPC9wcmU+CgoKICAgICAgICA8cD5FeHBsYW5hdGlvbjogSWYgeW91IHVzZSBhIGJyb3dzZXIgd2hpY2ggaWRlbnRpZmllcyBpdHNlbGYKICAgICAgICBhcyBhIG1vYmlsZSBicm93c2VyIChub3RlIHRoYXQgdGhlIGV4YW1wbGUgaXMgaW5jb21wbGV0ZSwgYXMKICAgICAgICB0aGVyZSBhcmUgbWFueSBvdGhlciBtb2JpbGUgcGxhdGZvcm1zKSwgdGhlIG1vYmlsZSB2ZXJzaW9uIG9mCiAgICAgICAgdGhlIGhvbWVwYWdlIGlzIHNlcnZlZC4gT3RoZXJ3aXNlLCB0aGUgc3RhbmRhcmQgcGFnZSBpcyBzZXJ2ZWQuCiAgICAgICAgPC9wPgoKCjwvZGl2Pgo8ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBhbHQ9InRvcCIgc3JjPSIuLi9pbWFnZXMvdXAuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBjbGFzcz0iZGlyZWN0aXZlLXNlY3Rpb24iPjxoMj48YSBuYW1lPSJSZXdyaXRlRW5naW5lIiBpZD0iUmV3cml0ZUVuZ2luZSI+UmV3cml0ZUVuZ2luZTwvYT4gPGEgbmFtZT0icmV3cml0ZWVuZ2luZSIgaWQ9InJld3JpdGVlbmdpbmUiPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPkVuYWJsZXMgb3IgZGlzYWJsZXMgcnVudGltZSByZXdyaXRpbmcgZW5naW5lPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4Ij5TeW50YXg6PC9hPjwvdGg+PHRkPjxjb2RlPlJld3JpdGVFbmdpbmUgb258b2ZmPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0RlZmF1bHQiPkRlZmF1bHQ6PC9hPjwvdGg+PHRkPjxjb2RlPlJld3JpdGVFbmdpbmUgb2ZmPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ6PC9hPjwvdGg+PHRkPnNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSI+T3ZlcnJpZGU6PC9hPjwvdGg+PHRkPkZpbGVJbmZvPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkV4dGVuc2lvbjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSI+TW9kdWxlOjwvYT48L3RoPjx0ZD5tb2RfcmV3cml0ZTwvdGQ+PC90cj4KPC90YWJsZT4KCiAgICAgIDxwPlRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5SZXdyaXRlRW5naW5lPC9jb2RlPiBkaXJlY3RpdmUgZW5hYmxlcyBvcgogICAgICBkaXNhYmxlcyB0aGUgcnVudGltZSByZXdyaXRpbmcgZW5naW5lLiBJZiBpdCBpcyBzZXQgdG8KICAgICAgPGNvZGU+b2ZmPC9jb2RlPiB0aGlzIG1vZHVsZSBkb2VzIG5vIHJ1bnRpbWUgcHJvY2Vzc2luZyBhdAogICAgICBhbGwuIEl0IGRvZXMgbm90IGV2ZW4gdXBkYXRlIHRoZSA8Y29kZT5TQ1JJUFRfVVJ4PC9jb2RlPgogICAgICBlbnZpcm9ubWVudCB2YXJpYWJsZXMuPC9wPgoKICAgICAgPHA+VXNlIHRoaXMgZGlyZWN0aXZlIHRvIGRpc2FibGUgcnVsZXMgaW4gYSBwYXJ0aWN1bGFyIGNvbnRleHQsCiAgICAgIHJhdGhlciB0aGFuIGNvbW1lbnRpbmcgb3V0IGFsbCB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVydWxlIj5SZXdyaXRlUnVsZTwvYT48L2NvZGU+IGRpcmVjdGl2ZXMuPC9wPgoKICAgICAgPHA+Tm90ZSB0aGF0IHJld3JpdGUgY29uZmlndXJhdGlvbnMgYXJlIG5vdAogICAgICBpbmhlcml0ZWQgYnkgdmlydHVhbCBob3N0cy4gVGhpcyBtZWFucyB0aGF0IHlvdSBuZWVkIHRvIGhhdmUgYQogICAgICA8Y29kZT5SZXdyaXRlRW5naW5lIG9uPC9jb2RlPiBkaXJlY3RpdmUgZm9yIGVhY2ggdmlydHVhbCBob3N0CiAgICAgIGluIHdoaWNoIHlvdSB3aXNoIHRvIHVzZSByZXdyaXRlIHJ1bGVzLjwvcD4KCiAgICAgIDxwPjxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9IiNyZXdyaXRlbWFwIj5SZXdyaXRlTWFwPC9hPjwvY29kZT4gZGlyZWN0aXZlcwogICAgICBvZiB0aGUgdHlwZSA8Y29kZT5wcmc8L2NvZGU+CiAgICAgIGFyZSBub3Qgc3RhcnRlZCBkdXJpbmcgc2VydmVyIGluaXRpYWxpemF0aW9uIGlmIHRoZXkncmUgZGVmaW5lZCBpbiBhCiAgICAgIGNvbnRleHQgdGhhdCBkb2VzIG5vdCBoYXZlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVFbmdpbmU8L2NvZGU+IHNldCB0bwogICAgICA8Y29kZT5vbjwvY29kZT48L3A+Cgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iUmV3cml0ZU1hcCIgaWQ9IlJld3JpdGVNYXAiPlJld3JpdGVNYXA8L2E+IDxhIG5hbWU9InJld3JpdGVtYXAiIGlkPSJyZXdyaXRlbWFwIj5EaXJlY3RpdmU8L2E+PC9oMj4KPHRhYmxlIGNsYXNzPSJkaXJlY3RpdmUiPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uOjwvYT48L3RoPjx0ZD5EZWZpbmVzIGEgbWFwcGluZyBmdW5jdGlvbiBmb3Iga2V5LWxvb2t1cDwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5SZXdyaXRlTWFwIDxlbT5NYXBOYW1lPC9lbT4gPGVtPk1hcFR5cGU8L2VtPjo8ZW0+TWFwU291cmNlPC9lbT4KPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ6PC9hPjwvdGg+PHRkPnNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdDwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N0YXR1cyI+U3RhdHVzOjwvYT48L3RoPjx0ZD5FeHRlbnNpb248L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNNb2R1bGUiPk1vZHVsZTo8L2E+PC90aD48dGQ+bW9kX3Jld3JpdGU8L3RkPjwvdHI+CjwvdGFibGU+CiAgICAgIDxwPlRoZSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5SZXdyaXRlTWFwPC9jb2RlPiBkaXJlY3RpdmUgZGVmaW5lcyBhCiAgICAgIDxlbT5SZXdyaXRpbmcgTWFwPC9lbT4gd2hpY2ggY2FuIGJlIHVzZWQgaW5zaWRlIHJ1bGUKICAgICAgc3Vic3RpdHV0aW9uIHN0cmluZ3MgYnkgdGhlIG1hcHBpbmctZnVuY3Rpb25zIHRvCiAgICAgIGluc2VydC9zdWJzdGl0dXRlIGZpZWxkcyB0aHJvdWdoIGEga2V5IGxvb2t1cC4gVGhlIHNvdXJjZSBvZgogICAgICB0aGlzIGxvb2t1cCBjYW4gYmUgb2YgdmFyaW91cyB0eXBlcy48L3A+CgogICAgICA8cD5UaGUgPGEgaWQ9Im1hcGZ1bmMiIG5hbWU9Im1hcGZ1bmMiPjxlbT5NYXBOYW1lPC9lbT48L2E+IGlzCiAgICAgIHRoZSBuYW1lIG9mIHRoZSBtYXAgYW5kIHdpbGwgYmUgdXNlZCB0byBzcGVjaWZ5IGEKICAgICAgbWFwcGluZy1mdW5jdGlvbiBmb3IgdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmdzIG9mIGEgcmV3cml0aW5nCiAgICAgIHJ1bGUgdmlhIG9uZSBvZiB0aGUgZm9sbG93aW5nIGNvbnN0cnVjdHM6PC9wPgoKICAgICAgPHAgY2xhc3M9ImluZGVudCI+CiAgICAgICAgPHN0cm9uZz48Y29kZT4kezwvY29kZT4gPGVtPk1hcE5hbWU8L2VtPiA8Y29kZT46PC9jb2RlPgogICAgICAgIDxlbT5Mb29rdXBLZXk8L2VtPiA8Y29kZT59PC9jb2RlPjxiciAvPgogICAgICAgICA8Y29kZT4kezwvY29kZT4gPGVtPk1hcE5hbWU8L2VtPiA8Y29kZT46PC9jb2RlPgogICAgICAgIDxlbT5Mb29rdXBLZXk8L2VtPiA8Y29kZT58PC9jb2RlPiA8ZW0+RGVmYXVsdFZhbHVlPC9lbT4KICAgICAgICA8Y29kZT59PC9jb2RlPjwvc3Ryb25nPgogICAgICA8L3A+CgogICAgICA8cD5XaGVuIHN1Y2ggYSBjb25zdHJ1Y3Qgb2NjdXJzLCB0aGUgbWFwIDxlbT5NYXBOYW1lPC9lbT4gaXMKICAgICAgY29uc3VsdGVkIGFuZCB0aGUga2V5IDxlbT5Mb29rdXBLZXk8L2VtPiBpcyBsb29rZWQtdXAuIElmIHRoZQogICAgICBrZXkgaXMgZm91bmQsIHRoZSBtYXAtZnVuY3Rpb24gY29uc3RydWN0IGlzIHN1YnN0aXR1dGVkIGJ5CiAgICAgIDxlbT5TdWJzdFZhbHVlPC9lbT4uIElmIHRoZSBrZXkgaXMgbm90IGZvdW5kIHRoZW4gaXQgaXMKICAgICAgc3Vic3RpdHV0ZWQgYnkgPGVtPkRlZmF1bHRWYWx1ZTwvZW0+IG9yIGJ5IHRoZSBlbXB0eSBzdHJpbmcKICAgICAgaWYgbm8gPGVtPkRlZmF1bHRWYWx1ZTwvZW0+IHdhcyBzcGVjaWZpZWQuIEVtcHR5IHZhbHVlcwogICAgICBiZWhhdmUgYXMgaWYgdGhlIGtleSB3YXMgYWJzZW50LCB0aGVyZWZvcmUgaXQgaXMgbm90IHBvc3NpYmxlCiAgICAgIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW1wdHktdmFsdWVkIGtleXMgYW5kIGFic2VudCBrZXlzLjwvcD4KCiAgICAgIDxwPkZvciBleGFtcGxlLCB5b3UgbWlnaHQgZGVmaW5lIGEKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+UmV3cml0ZU1hcDwvY29kZT4gYXM6PC9wPgoKICAgICAgPHByZSBjbGFzcz0icHJldHR5cHJpbnQgbGFuZy1jb25maWciPlJld3JpdGVNYXAgZXhhbXBsZW1hcCAidHh0Oi9wYXRoL3RvL2ZpbGUvbWFwLnR4dCI8L3ByZT4KCgogICAgICA8cD5Zb3Ugd291bGQgdGhlbiBiZSBhYmxlIHRvIHVzZSB0aGlzIG1hcCBpbiBhCiAgICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVSdWxlPC9jb2RlPiBhcyBmb2xsb3dzOjwvcD4KCiAgICAgIDxwcmUgY2xhc3M9InByZXR0eXByaW50IGxhbmctY29uZmlnIj5SZXdyaXRlUnVsZSAiXi9leC8oLiopIiAiJHtleGFtcGxlbWFwOiQxfSI8L3ByZT4KCgogICAgICA8cD5UaGUgZm9sbG93aW5nIGNvbWJpbmF0aW9ucyBmb3IgPGVtPk1hcFR5cGU8L2VtPiBhbmQKICAgICAgPGVtPk1hcFNvdXJjZTwvZW0+IGNhbiBiZSB1c2VkOjwvcD4KCiAgICA8ZGw+CgogICAgPGR0PnR4dDwvZHQ+CiAgICAgICAgPGRkPkEgcGxhaW4gdGV4dCBmaWxlIGNvbnRhaW5pbmcgc3BhY2Utc2VwYXJhdGVkIGtleS12YWx1ZQogICAgICAgIHBhaXJzLCBvbmUgcGVyIGxpbmUuICg8YSBocmVmPSIuLi9yZXdyaXRlL3Jld3JpdGVtYXAuaHRtbCN0eHQiPkRldGFpbHMgLi4uPC9hPik8L2RkPgoKICAgIDxkdD5ybmQ8L2R0PgogICAgICAgIDxkZD5SYW5kb21seSBzZWxlY3RzIGFuIGVudHJ5IGZyb20gYSBwbGFpbiB0ZXh0IGZpbGUgKDxhIGhyZWY9Ii4uL3Jld3JpdGUvcmV3cml0ZW1hcC5odG1sI3JuZCI+RGV0YWlscyAuLi48L2E+KTwvZGQ+CgogICAgPGR0PmRibTwvZHQ+CiAgICAgICAgPGRkPkxvb2tzIHVwIGFuIGVudHJ5IGluIGEgZGJtIGZpbGUgY29udGFpbmluZyBuYW1lLCB2YWx1ZQogICAgICAgIHBhaXJzLiBIYXNoIGlzIGNvbnN0cnVjdGVkIGZyb20gYSBwbGFpbiB0ZXh0IGZpbGUgZm9ybWF0IHVzaW5nCiAgICAgICAgdGhlIDxjb2RlPjxhIGhyZWY9Ii4uL3Byb2dyYW1zL2h0dHh0MmRibS5odG1sIj5odHR4dDJkYm08L2E+PC9jb2RlPgogICAgICAgIHV0aWxpdHkuICAoPGEgaHJlZj0iLi4vcmV3cml0ZS9yZXdyaXRlbWFwLmh0bWwjZGJtIj5EZXRhaWxzIC4uLjwvYT4pPC9kZD4KCiAgICA8ZHQ+aW50PC9kdD4KICAgICAgICA8ZGQ+T25lIG9mIHRoZSBmb3VyIGF2YWlsYWJsZSBpbnRlcm5hbCBmdW5jdGlvbnMgcHJvdmlkZWQgYnkKICAgICAgICA8Y29kZT5SZXdyaXRlTWFwPC9jb2RlPjogdG91cHBlciwgdG9sb3dlciwgZXNjYXBlIG9yCiAgICAgICAgdW5lc2NhcGUuICg8YSBocmVmPSIuLi9yZXdyaXRlL3Jld3JpdGVtYXAuaHRtbCNpbnQiPkRldGFpbHMgLi4uPC9hPik8L2RkPgoKICAgIDxkdD5wcmc8L2R0PgogICAgICAgIDxkZD5DYWxscyBhbiBleHRlcm5hbCBwcm9ncmFtIG9yIHNjcmlwdCB0byBwcm9jZXNzIHRoZQogICAgICAgIHJld3JpdGluZy4gKDxhIGhyZWY9Ii4uL3Jld3JpdGUvcmV3cml0ZW1hcC5odG1sI3ByZyI+RGV0YWlscyAuLi48L2E+KTwvZGQ+CgogICAgPGR0PmRiZCBvciBmYXN0ZGJkPC9kdD4KICAgICAgICA8ZGQ+QSBTUUwgU0VMRUNUIHN0YXRlbWVudCB0byBiZSBwZXJmb3JtZWQgdG8gbG9vayB1cCB0aGUKICAgICAgICByZXdyaXRlIHRhcmdldC4gKDxhIGhyZWY9Ii4uL3Jld3JpdGUvcmV3cml0ZW1hcC5odG1sI2RiZCI+RGV0YWlscyAuLi48L2E+KTwvZGQ+CiAgICA8L2RsPgoKICAgIDxwPkZ1cnRoZXIgZGV0YWlscywgYW5kIG51bWVyb3VzIGV4YW1wbGVzLCBtYXkgYmUgZm91bmQgaW4gdGhlIDxhIGhyZWY9Ii4uL3Jld3JpdGUvcmV3cml0ZW1hcC5odG1sIj5SZXdyaXRlTWFwIEhvd1RvPC9hPjwvcD4KCgo8L2Rpdj4KPGRpdiBjbGFzcz0idG9wIj48YSBocmVmPSIjcGFnZS1oZWFkZXIiPjxpbWcgYWx0PSJ0b3AiIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgLz48L2E+PC9kaXY+CjxkaXYgY2xhc3M9ImRpcmVjdGl2ZS1zZWN0aW9uIj48aDI+PGEgbmFtZT0iUmV3cml0ZU9wdGlvbnMiIGlkPSJSZXdyaXRlT3B0aW9ucyI+UmV3cml0ZU9wdGlvbnM8L2E+IDxhIG5hbWU9InJld3JpdGVvcHRpb25zIiBpZD0icmV3cml0ZW9wdGlvbnMiPkRpcmVjdGl2ZTwvYT48L2gyPgo8dGFibGUgY2xhc3M9ImRpcmVjdGl2ZSI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPlNldHMgc29tZSBzcGVjaWFsIG9wdGlvbnMgZm9yIHRoZSByZXdyaXRlIGVuZ2luZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5SZXdyaXRlT3B0aW9ucyA8dmFyPk9wdGlvbnM8L3Zhcj48L2NvZGU+PC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjQ29udGV4dCI+Q29udGV4dDo8L2E+PC90aD48dGQ+c2VydmVyIGNvbmZpZywgdmlydHVhbCBob3N0LCBkaXJlY3RvcnksIC5odGFjY2VzczwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI092ZXJyaWRlIj5PdmVycmlkZTo8L2E+PC90aD48dGQ+RmlsZUluZm88L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1czo8L2E+PC90aD48dGQ+RXh0ZW5zaW9uPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjTW9kdWxlIj5Nb2R1bGU6PC9hPjwvdGg+PHRkPm1vZF9yZXdyaXRlPC90ZD48L3RyPgo8L3RhYmxlPgoKICAgICAgPHA+VGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVPcHRpb25zPC9jb2RlPiBkaXJlY3RpdmUgc2V0cyBzb21lCiAgICAgIHNwZWNpYWwgb3B0aW9ucyBmb3IgdGhlIGN1cnJlbnQgcGVyLXNlcnZlciBvciBwZXItZGlyZWN0b3J5CiAgICAgIGNvbmZpZ3VyYXRpb24uIFRoZSA8ZW0+T3B0aW9uPC9lbT4gc3RyaW5nIGNhbiBjdXJyZW50bHkKICAgICAgb25seSBiZSBvbmUgb2YgdGhlIGZvbGxvd2luZzo8L3A+CgogICAgICA8ZGw+CiAgICAgIDxkdD48Y29kZT5Jbmhlcml0PC9jb2RlPjwvZHQ+CiAgICAgIDxkZD4KCiAgICAgIDxwPlRoaXMgZm9yY2VzIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24gdG8gaW5oZXJpdCB0aGUKICAgICAgY29uZmlndXJhdGlvbiBvZiB0aGUgcGFyZW50LiBJbiBwZXItdmlydHVhbC1zZXJ2ZXIgY29udGV4dCwKICAgICAgdGhpcyBtZWFucyB0aGF0IHRoZSBtYXBzLCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgbWFpbgogICAgICBzZXJ2ZXIgYXJlIGluaGVyaXRlZC4gSW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IHRoaXMgbWVhbnMKICAgICAgdGhhdCBjb25kaXRpb25zIGFuZCBydWxlcyBvZiB0aGUgcGFyZW50IGRpcmVjdG9yeSdzCiAgICAgIDxjb2RlPi5odGFjY2VzczwvY29kZT4gY29uZmlndXJhdGlvbiBvcgogICAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI2RpcmVjdG9yeSI+Jmx0O0RpcmVjdG9yeSZndDs8L2E+PC9jb2RlPgogICAgICBzZWN0aW9ucyBhcmUgaW5oZXJpdGVkLiBUaGUgaW5oZXJpdGVkIHJ1bGVzIGFyZSB2aXJ0dWFsbHkgY29waWVkCiAgICAgIHRvIHRoZSBzZWN0aW9uIHdoZXJlIHRoaXMgZGlyZWN0aXZlIGlzIGJlaW5nIHVzZWQuIElmIHVzZWQgaW4KICAgICAgY29tYmluYXRpb24gd2l0aCBsb2NhbCBydWxlcywgdGhlIGluaGVyaXRlZCBydWxlcyBhcmUgY29waWVkIGJlaGluZAogICAgICB0aGUgbG9jYWwgcnVsZXMuIFRoZSBwb3NpdGlvbiBvZiB0aGlzIGRpcmVjdGl2ZSAtIGJlbG93IG9yIGFib3ZlCiAgICAgIG9mIGxvY2FsIHJ1bGVzIC0gaGFzIG5vIGluZmx1ZW5jZSBvbiB0aGlzIGJlaGF2aW9yLiBJZiBsb2NhbAogICAgICBydWxlcyBmb3JjZWQgdGhlIHJld3JpdGluZyB0byBzdG9wLCB0aGUgaW5oZXJpdGVkIHJ1bGVzIHdvbid0CiAgICAgIGJlIHByb2Nlc3NlZC48L3A+CgogICAgICA8ZGl2IGNsYXNzPSJ3YXJuaW5nIj4KICAgICAgUnVsZXMgaW5oZXJpdGVkIGZyb20gdGhlIHBhcmVudCBzY29wZSBhcmUgYXBwbGllZAogICAgICA8c3Ryb25nPmFmdGVyPC9zdHJvbmc+IHJ1bGVzIHNwZWNpZmllZCBpbiB0aGUgY2hpbGQgc2NvcGUuCiAgICAgIDwvZGl2PgogICAgICA8L2RkPgoKICAgICAgPGR0Pjxjb2RlPkluaGVyaXRCZWZvcmU8L2NvZGU+PC9kdD4KICAgICAgPGRkPgogICAgICA8cD4gTGlrZSA8Y29kZT5Jbmhlcml0PC9jb2RlPiBhYm92ZSwgYnV0IHRoZSBydWxlcyBmcm9tIHRoZSBwYXJlbnQgc2NvcGUKICAgICAgYXJlIGFwcGxpZWQgPHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gcnVsZXMgc3BlY2lmaWVkIGluIHRoZSBjaGlsZCBzY29wZS48YnIgLz4KICAgICAgQXZhaWxhYmxlIGluIEFwYWNoZSBIVFRQIFNlcnZlciAyLjMuMTAgYW5kIGxhdGVyLjwvcD4KICAgICAgPC9kZD4KCiAgICAgIDxkdD48Y29kZT5Jbmhlcml0RG93bjwvY29kZT48L2R0PgogICAgICA8ZGQ+CgogICAgICA8cD5JZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCBhbGwgY2hpbGQgY29uZmlndXJhdGlvbnMgd2lsbCBpbmhlcml0CiAgICAgIHRoZSBjb25maWd1cmF0aW9uIG9mIHRoZSBjdXJyZW50IGNvbmZpZ3VyYXRpb24uIEl0IGlzIGVxdWl2YWxlbnQgdG8KICAgICAgc3BlY2lmeWluZyA8Y29kZT5SZXdyaXRlT3B0aW9ucyBJbmhlcml0PC9jb2RlPiBpbiBhbGwgY2hpbGQKICAgICAgY29uZmlndXJhdGlvbnMuIFNlZSB0aGUgPGNvZGU+SW5oZXJpdDwvY29kZT4gb3B0aW9uIGZvciBtb3JlIGRldGFpbHMKICAgICAgb24gaG93IHRoZSBwYXJlbnQtY2hpbGQgcmVsYXRpb25zaGlwcyBhcmUgaGFuZGxlZC48YnIgLz4KICAgICAgQXZhaWxhYmxlIGluIEFwYWNoZSBIVFRQIFNlcnZlciAyLjQuOCBhbmQgbGF0ZXIuPC9wPgogICAgICA8L2RkPgoKICAgICAgPGR0Pjxjb2RlPkluaGVyaXREb3duQmVmb3JlPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD4KCiAgICAgIDxwPkxpa2UgPGNvZGU+SW5oZXJpdERvd248L2NvZGU+IGFib3ZlLCBidXQgdGhlIHJ1bGVzIGZyb20gdGhlIGN1cnJlbnQKICAgICAgc2NvcGUgYXJlIGFwcGxpZWQgPHN0cm9uZz5iZWZvcmU8L3N0cm9uZz4gcnVsZXMgc3BlY2lmaWVkIGluIGFueSBjaGlsZCdzCiAgICAgIHNjb3BlLjxiciAvPgogICAgICBBdmFpbGFibGUgaW4gQXBhY2hlIEhUVFAgU2VydmVyIDIuNC44IGFuZCBsYXRlci48L3A+CiAgICAgIDwvZGQ+CgogICAgICA8ZHQ+PGNvZGU+SWdub3JlSW5oZXJpdDwvY29kZT48L2R0PgogICAgICA8ZGQ+CgogICAgICA8cD5UaGlzIG9wdGlvbiBmb3JjZXMgdGhlIGN1cnJlbnQgYW5kIGNoaWxkIGNvbmZpZ3VyYXRpb25zIHRvIGlnbm9yZQogICAgICBhbGwgcnVsZXMgdGhhdCB3b3VsZCBiZSBpbmhlcml0ZWQgZnJvbSBhIHBhcmVudCBzcGVjaWZ5aW5nCiAgICAgIDxjb2RlPkluaGVyaXREb3duPC9jb2RlPiBvciA8Y29kZT5Jbmhlcml0RG93bkJlZm9yZTwvY29kZT4uPGJyIC8+CiAgICAgIEF2YWlsYWJsZSBpbiBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi40LjggYW5kIGxhdGVyLjwvcD4KICAgICAgPC9kZD4KCiAgICAgIDxkdD48Y29kZT5BbGxvd05vU2xhc2g8L2NvZGU+PC9kdD4KICAgICAgPGRkPgogICAgICA8cD5CeSBkZWZhdWx0LCA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PC9jb2RlPiB3aWxsIGlnbm9yZSBVUkxzIHRoYXQgbWFwIHRvIGEKICAgICAgZGlyZWN0b3J5IG9uIGRpc2sgYnV0IGxhY2sgYSB0cmFpbGluZyBzbGFzaCwgaW4gdGhlIGV4cGVjdGF0aW9uIHRoYXQKICAgICAgdGhlIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfZGlyLmh0bWwiPm1vZF9kaXI8L2E+PC9jb2RlPiBtb2R1bGUgd2lsbCBpc3N1ZSB0aGUgY2xpZW50IHdpdGggYSByZWRpcmVjdCB0bwogICAgICB0aGUgY2Fub25pY2FsIFVSTCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guPC9wPgoKICAgICAgPHA+V2hlbiB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9kaXIuaHRtbCNkaXJlY3RvcnlzbGFzaCI+RGlyZWN0b3J5U2xhc2g8L2E+PC9jb2RlPiBkaXJlY3RpdmUKICAgICAgaXMgc2V0IHRvIG9mZiwgdGhlIDxjb2RlPkFsbG93Tm9TbGFzaDwvY29kZT4gb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGVuc3VyZQogICAgICB0aGF0IHJld3JpdGUgcnVsZXMgYXJlIG5vIGxvbmdlciBpZ25vcmVkLiBUaGlzIG9wdGlvbiBtYWtlcyBpdCBwb3NzaWJsZSB0bwogICAgICBhcHBseSByZXdyaXRlIHJ1bGVzIHdpdGhpbiAuaHRhY2Nlc3MgZmlsZXMgdGhhdCBtYXRjaCB0aGUgZGlyZWN0b3J5IHdpdGhvdXQKICAgICAgYSB0cmFpbGluZyBzbGFzaCwgaWYgc28gZGVzaXJlZC48YnIgLz4KICAgICAgQXZhaWxhYmxlIGluIEFwYWNoZSBIVFRQIFNlcnZlciAyLjQuMCBhbmQgbGF0ZXIuPC9wPgogICAgICA8L2RkPgoKICAgICAgPGR0Pjxjb2RlPkFsbG93QW55VVJJPC9jb2RlPjwvZHQ+CiAgICAgIDxkZD4KCiAgICAgIDxwPldoZW4gPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVydWxlIj5SZXdyaXRlUnVsZTwvYT48L2NvZGU+CiAgICAgIGlzIHVzZWQgaW4gPGNvZGU+VmlydHVhbEhvc3Q8L2NvZGU+IG9yIHNlcnZlciBjb250ZXh0IHdpdGgKICAgICAgdmVyc2lvbiAyLjIuMjIgb3IgbGF0ZXIgb2YgaHR0cGQsIDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT48L2NvZGU+CiAgICAgIHdpbGwgb25seSBwcm9jZXNzIHRoZSByZXdyaXRlIHJ1bGVzIGlmIHRoZSByZXF1ZXN0IFVSSSBpcyBhIDxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3ludGF4Ij5VUkwtcGF0aDwvYT4uICBUaGlzIGF2b2lkcwogICAgICBzb21lIHNlY3VyaXR5IGlzc3VlcyB3aGVyZSBwYXJ0aWN1bGFyIHJ1bGVzIGNvdWxkIGFsbG93CiAgICAgICJzdXJwcmlzaW5nIiBwYXR0ZXJuIGV4cGFuc2lvbnMgKHNlZSA8YSBocmVmPSJodHRwOi8vY3ZlLm1pdHJlLm9yZy9jZ2ktYmluL2N2ZW5hbWUuY2dpP25hbWU9Q1ZFLTIwMTEtMzM2OCI+Q1ZFLTIwMTEtMzM2ODwvYT4KICAgICAgYW5kIDxhIGhyZWY9Imh0dHA6Ly9jdmUubWl0cmUub3JnL2NnaS1iaW4vY3ZlbmFtZS5jZ2k/bmFtZT1DVkUtMjAxMS00MzE3Ij5DVkUtMjAxMS00MzE3PC9hPikuCiAgICAgIFRvIGxpZnQgdGhlIHJlc3RyaWN0aW9uIG9uIG1hdGNoaW5nIGEgVVJMLXBhdGgsIHRoZQogICAgICA8Y29kZT5BbGxvd0FueVVSSTwvY29kZT4gb3B0aW9uIGNhbiBiZSBlbmFibGVkLCBhbmQKICAgICAgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9yZXdyaXRlLmh0bWwiPm1vZF9yZXdyaXRlPC9hPjwvY29kZT4gd2lsbCBhcHBseSB0aGUgcnVsZSBzZXQgdG8gYW55CiAgICAgIHJlcXVlc3QgVVJJIHN0cmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoYXQgc3RyaW5nIG1hdGNoZXMKICAgICAgdGhlIFVSTC1wYXRoIGdyYW1tYXIgcmVxdWlyZWQgYnkgdGhlIEhUVFAgc3BlY2lmaWNhdGlvbi48YnIgLz4KICAgICAgQXZhaWxhYmxlIGluIEFwYWNoZSBIVFRQIFNlcnZlciAyLjQuMyBhbmQgbGF0ZXIuPC9wPgoKICAgICAgPGRpdiBjbGFzcz0id2FybmluZyI+CiAgICAgIDxoMz5TZWN1cml0eSBXYXJuaW5nPC9oMz4KCiAgICAgIDxwPkVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgbWFrZSB0aGUgc2VydmVyIHZ1bG5lcmFibGUgdG8KICAgICAgc2VjdXJpdHkgaXNzdWVzIGlmIHVzZWQgd2l0aCByZXdyaXRlIHJ1bGVzIHdoaWNoIGFyZSBub3QKICAgICAgY2FyZWZ1bGx5IGF1dGhvcmVkLiAgSXQgaXMgPHN0cm9uZz5zdHJvbmdseSByZWNvbW1lbmRlZDwvc3Ryb25nPgogICAgICB0aGF0IHRoaXMgb3B0aW9uIGlzIG5vdCB1c2VkLiAgSW4gcGFydGljdWxhciwgYmV3YXJlIG9mIGlucHV0CiAgICAgIHN0cmluZ3MgY29udGFpbmluZyB0aGUgJzxjb2RlPkA8L2NvZGU+JyBjaGFyYWN0ZXIgd2hpY2ggY291bGQKICAgICAgY2hhbmdlIHRoZSBpbnRlcnByZXRhdGlvbiBvZiB0aGUgdHJhbnNmb3JtZWQgVVJJLCBhcyBwZXIgdGhlCiAgICAgIGFib3ZlIENWRSBuYW1lcy48L3A+CiAgICAgIDwvZGl2PgogICAgICA8L2RkPgoKICAgICAgPGR0Pjxjb2RlPk1lcmdlQmFzZTwvY29kZT48L2R0PgogICAgICA8ZGQ+CgogICAgICA8cD5XaXRoIHRoaXMgb3B0aW9uLCB0aGUgdmFsdWUgb2YgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGViYXNlIj5SZXdyaXRlQmFzZTwvYT48L2NvZGU+IGlzIGNvcGllZCBmcm9tIHdoZXJlIGl0J3MgZXhwbGljaXRseSBkZWZpbmVkCiAgICAgIGludG8gYW55IHN1Yi1kaXJlY3Rvcnkgb3Igc3ViLWxvY2F0aW9uIHRoYXQgZG9lc24ndCBkZWZpbmUgaXRzIG93bgogICAgICA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIjcmV3cml0ZWJhc2UiPlJld3JpdGVCYXNlPC9hPjwvY29kZT4uIFRoaXMgd2FzIHRoZQogICAgICBkZWZhdWx0IGJlaGF2aW9yIGluIDIuNC4wIHRocm91Z2ggMi40LjMsIGFuZCB0aGUgZmxhZyB0byByZXN0b3JlIGl0IGlzCiAgICAgIGF2YWlsYWJsZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgMi40LjQgYW5kIGxhdGVyLjwvcD4KICAgICAgPC9kZD4KCiAgICAgIDxkdD48Y29kZT5JZ25vcmVDb250ZXh0SW5mbzwvY29kZT48L2R0PgogICAgICA8ZGQ+CgogICAgICA8cD5XaGVuIGEgcmVsYXRpdmUgc3Vic3RpdHV0aW9uIGlzIG1hZGUKICAgICAgICAgaW4gZGlyZWN0b3J5IChodGFjY2VzcykgY29udGV4dCBhbmQgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGViYXNlIj5SZXdyaXRlQmFzZTwvYT48L2NvZGU+IGhhcyBub3QgYmVlbiBzZXQsIHRoaXMgbW9kdWxlIHVzZXMgc29tZQogICAgICAgICBleHRlbmRlZCBVUkwgYW5kIGZpbGVzeXN0ZW0gY29udGV4dCBpbmZvcm1hdGlvbiB0byBjaGFuZ2UgdGhlCiAgICAgICAgIHJlbGF0aXZlIHN1YnN0aXR1dGlvbiBiYWNrIGludG8gYSBVUkwuIE1vZHVsZXMgc3VjaCBhcwogICAgICAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3VzZXJkaXIuaHRtbCI+bW9kX3VzZXJkaXI8L2E+PC9jb2RlPiBhbmQgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hbGlhcy5odG1sIj5tb2RfYWxpYXM8L2E+PC9jb2RlPgogICAgICAgICBzdXBwbHkgdGhpcyBleHRlbmRlZCBjb250ZXh0IGluZm8uICBBdmFpbGFibGUgaW4gMi40LjE2IGFuZCBsYXRlci48L3A+CiAgICAgIDwvZGQ+CgogICAgICA8L2RsPgoKPC9kaXY+CjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIGFsdD0idG9wIiBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIC8+PC9hPjwvZGl2Pgo8ZGl2IGNsYXNzPSJkaXJlY3RpdmUtc2VjdGlvbiI+PGgyPjxhIG5hbWU9IlJld3JpdGVSdWxlIiBpZD0iUmV3cml0ZVJ1bGUiPlJld3JpdGVSdWxlPC9hPiA8YSBuYW1lPSJyZXdyaXRlcnVsZSIgaWQ9InJld3JpdGVydWxlIj5EaXJlY3RpdmU8L2E+PC9oMj4KPHRhYmxlIGNsYXNzPSJkaXJlY3RpdmUiPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjRGVzY3JpcHRpb24iPkRlc2NyaXB0aW9uOjwvYT48L3RoPjx0ZD5EZWZpbmVzIHJ1bGVzIGZvciB0aGUgcmV3cml0aW5nIGVuZ2luZTwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+U3ludGF4OjwvYT48L3RoPjx0ZD48Y29kZT5SZXdyaXRlUnVsZQogICAgICA8ZW0+UGF0dGVybjwvZW0+IDxlbT5TdWJzdGl0dXRpb248L2VtPiBbPGVtPmZsYWdzPC9lbT5dPC9jb2RlPjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI0NvbnRleHQiPkNvbnRleHQ6PC9hPjwvdGg+PHRkPnNlcnZlciBjb25maWcsIHZpcnR1YWwgaG9zdCwgZGlyZWN0b3J5LCAuaHRhY2Nlc3M8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0iZGlyZWN0aXZlLWRpY3QuaHRtbCNPdmVycmlkZSI+T3ZlcnJpZGU6PC9hPjwvdGg+PHRkPkZpbGVJbmZvPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9ImRpcmVjdGl2ZS1kaWN0Lmh0bWwjU3RhdHVzIj5TdGF0dXM6PC9hPjwvdGg+PHRkPkV4dGVuc2lvbjwvdGQ+PC90cj4KPHRyPjx0aD48YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI01vZHVsZSI+TW9kdWxlOjwvYT48L3RoPjx0ZD5tb2RfcmV3cml0ZTwvdGQ+PC90cj4KPC90YWJsZT4KICAgICAgPHA+VGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVSdWxlPC9jb2RlPiBkaXJlY3RpdmUgaXMgdGhlIHJlYWwKICAgICAgcmV3cml0aW5nIHdvcmtob3JzZS4gVGhlIGRpcmVjdGl2ZSBjYW4gb2NjdXIgbW9yZSB0aGFuIG9uY2UsCiAgICAgIHdpdGggZWFjaCBpbnN0YW5jZSBkZWZpbmluZyBhIHNpbmdsZSByZXdyaXRlIHJ1bGUuIFRoZQogICAgICBvcmRlciBpbiB3aGljaCB0aGVzZSBydWxlcyBhcmUgZGVmaW5lZCBpcyBpbXBvcnRhbnQgLSB0aGlzIGlzIHRoZSBvcmRlcgogICAgICBpbiB3aGljaCB0aGV5IHdpbGwgYmUgYXBwbGllZCBhdCBydW4tdGltZS48L3A+CgogICAgICA8cD48YSBpZD0icGF0dGVybnMiIG5hbWU9InBhdHRlcm5zIj48ZW0+UGF0dGVybjwvZW0+PC9hPiBpcwogICAgICBhIHBlcmwgY29tcGF0aWJsZSA8YSBpZD0icmVnZXhwIiBuYW1lPSJyZWdleHAiPnJlZ3VsYXIKICAgICAgZXhwcmVzc2lvbjwvYT4uIE9uIHRoZSBmaXJzdCBSZXdyaXRlUnVsZSwgaXQgaXMgbWF0Y2hlZCBhZ2FpbnN0CiAgICAgIHRoZSAoJS1kZWNvZGVkKSA8YSBocmVmPSJkaXJlY3RpdmUtZGljdC5odG1sI1N5bnRheCI+VVJMLXBhdGg8L2E+CiAgICAgIG9mIHRoZSByZXF1ZXN0LCBvciwgaW4gcGVyLWRpcmVjdG9yeSBjb250ZXh0IChzZWUgYmVsb3cpLCB0aGUgVVJMCiAgICAgIHBhdGggcmVsYXRpdmUgdG8gdGhhdCBwZXItZGlyZWN0b3J5IGNvbnRleHQuIFN1YnNlcXVlbnQgcGF0dGVybnMKICAgICAgYXJlIG1hdGNoZWQgYWdhaW5zdCB0aGUgb3V0cHV0IG9mIHRoZSBsYXN0IG1hdGNoaW5nIFJld3JpdGVSdWxlLjwvcD4KCjxkaXYgY2xhc3M9Im5vdGUiPjxoMz48YSBpZD0id2hhdF9pc19tYXRjaGVkIiBuYW1lPSJ3aGF0X2lzX21hdGNoZWQiPldoYXQgaXMgbWF0Y2hlZD88L2E+PC9oMz4KICAgICAgPHA+SW4gPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL2NvcmUuaHRtbCN2aXJ0dWFsaG9zdCI+VmlydHVhbEhvc3Q8L2E+PC9jb2RlPiBjb250ZXh0LAogICAgICBUaGUgPGVtPlBhdHRlcm48L2VtPiB3aWxsIGluaXRpYWxseSBiZSBtYXRjaGVkIGFnYWluc3QgdGhlIHBhcnQgb2YgdGhlCiAgICAgIFVSTCBhZnRlciB0aGUgaG9zdG5hbWUgYW5kIHBvcnQsIGFuZCBiZWZvcmUgdGhlIHF1ZXJ5IHN0cmluZyAoZS5nLiAiL2FwcDEvaW5kZXguaHRtbCIpLjwvcD4KCiAgICAgIDxwPkluIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij5EaXJlY3Rvcnk8L2E+PC9jb2RlPiBhbmQgaHRhY2Nlc3MgY29udGV4dCwKICAgICAgdGhlIDxlbT5QYXR0ZXJuPC9lbT4gd2lsbCBpbml0aWFsbHkgYmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZQogICAgICA8ZW0+ZmlsZXN5c3RlbTwvZW0+IHBhdGgsIGFmdGVyIHJlbW92aW5nIHRoZSBwcmVmaXggdGhhdCBsZWQgdGhlIHNlcnZlcgogICAgICB0byB0aGUgY3VycmVudCA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj5SZXdyaXRlUnVsZTwvY29kZT4gKGUuZy4gImFwcDEvaW5kZXguaHRtbCIKICAgICAgb3IgImluZGV4Lmh0bWwiIGRlcGVuZGluZyBvbiB3aGVyZSB0aGUgZGlyZWN0aXZlcyBhcmUgZGVmaW5lZCkuPC9wPgoKICAgICAgPHA+SWYgeW91IHdpc2ggdG8gbWF0Y2ggYWdhaW5zdCB0aGUgaG9zdG5hbWUsIHBvcnQsIG9yIHF1ZXJ5IHN0cmluZywgdXNlIGEKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVjb25kIj5SZXdyaXRlQ29uZDwvYT48L2NvZGU+IHdpdGggdGhlCiAgICAgIDxjb2RlPiV7SFRUUF9IT1NUfTwvY29kZT4sIDxjb2RlPiV7U0VSVkVSX1BPUlR9PC9jb2RlPiwgb3IKICAgICAgPGNvZGU+JXtRVUVSWV9TVFJJTkd9PC9jb2RlPiB2YXJpYWJsZXMgcmVzcGVjdGl2ZWx5LjwvcD4KCiAgICAgIDxwPkluIGFueSBjYXNlLCByZW1lbWJlciB0aGF0IHJlZ3VsYXIgZXhwcmVzc2lvbnMgYXJlIHN1YnN0cmluZwogICAgICBtYXRjaGVzLiBUaGF0IGlzLCB5b3UgZG9uJ3QgbmVlZCB0aGUgcmVnZXggdG8gZGVzY3JpYmUgdGhlIGVudGlyZQogICAgICBzdHJpbmcsIGp1c3QgdGhlIHBhcnQgdGhhdCB5b3Ugd2lzaCB0byBtYXRjaC4gVGh1cywgdXNpbmcgYSByZWdleAogICAgICBvZiA8Y29kZT4uPC9jb2RlPiBpcyBvZnRlbiBzdWZmaWNpZW50IHJhdGhlciB0aGFuIDxjb2RlPi4qPC9jb2RlPiwKICAgICAgYW5kIHRoZSByZWdleCA8Y29kZT5hYmM8L2NvZGU+IGlzIDxzdHJvbmc+bm90PC9zdHJvbmc+IHRoZSBzYW1lIGFzCiAgICAgIDxjb2RlPl5hYmMkPC9jb2RlPi48L3A+Cgo8L2Rpdj4KCjxkaXYgY2xhc3M9Im5vdGUiPjxoMz5QZXItZGlyZWN0b3J5IFJld3JpdGVzPC9oMz4KPHVsPgo8bGk+VGhlIHJld3JpdGUgZW5naW5lIG1heSBiZSB1c2VkIGluIDxhIGhyZWY9Ii4uL2hvd3RvL2h0YWNjZXNzLmh0bWwiPi5odGFjY2VzczwvYT4gZmlsZXMgYW5kIGluIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZGlyZWN0b3J5Ij4mbHQ7RGlyZWN0b3J5Jmd0OzwvYT48L2NvZGU+IHNlY3Rpb25zLCB3aXRoIHNvbWUgYWRkaXRpb25hbApjb21wbGV4aXR5LjwvbGk+Cgo8bGk+VG8gZW5hYmxlIHRoZSByZXdyaXRlIGVuZ2luZSBpbiB0aGlzIGNvbnRleHQsIHlvdSBuZWVkIHRvIHNldAoiPGNvZGU+UmV3cml0ZUVuZ2luZSBPbjwvY29kZT4iIDxzdHJvbmc+YW5kPC9zdHJvbmc+CiI8Y29kZT5PcHRpb25zIEZvbGxvd1N5bUxpbmtzPC9jb2RlPiIgbXVzdCBiZSBlbmFibGVkLiBJZiB5b3VyCmFkbWluaXN0cmF0b3IgaGFzIGRpc2FibGVkIG92ZXJyaWRlIG9mIDxjb2RlPkZvbGxvd1N5bUxpbmtzPC9jb2RlPiBmb3IKYSB1c2VyJ3MgZGlyZWN0b3J5LCB0aGVuIHlvdSBjYW5ub3QgdXNlIHRoZSByZXdyaXRlIGVuZ2luZS4gVGhpcwpyZXN0cmljdGlvbiBpcyByZXF1aXJlZCBmb3Igc2VjdXJpdHkgcmVhc29ucy48L2xpPgoKPGxpPldoZW4gdXNpbmcgdGhlIHJld3JpdGUgZW5naW5lIGluIDxjb2RlPi5odGFjY2VzczwvY29kZT4gZmlsZXMgdGhlCnBlci1kaXJlY3RvcnkgcHJlZml4ICh3aGljaCBhbHdheXMgaXMgdGhlIHNhbWUgZm9yIGEgc3BlY2lmaWMKZGlyZWN0b3J5KSBpcyBhdXRvbWF0aWNhbGx5IDxlbT5yZW1vdmVkPC9lbT4gZm9yIHRoZSBSZXdyaXRlUnVsZSBwYXR0ZXJuIG1hdGNoaW5nCmFuZCBhdXRvbWF0aWNhbGx5IDxlbT5hZGRlZDwvZW0+IGFmdGVyIGFueSByZWxhdGl2ZSAobm90IHN0YXJ0aW5nIHdpdGggYQpzbGFzaCBvciBwcm90b2NvbCBuYW1lKSBzdWJzdGl0dXRpb24gZW5jb3VudGVycyB0aGUgZW5kIG9mIGEgcnVsZSBzZXQuClNlZSB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGViYXNlIj5SZXdyaXRlQmFzZTwvYT48L2NvZGU+CmRpcmVjdGl2ZSBmb3IgbW9yZSBpbmZvcm1hdGlvbiByZWdhcmRpbmcgd2hhdCBwcmVmaXggd2lsbCBiZSBhZGRlZCBiYWNrIHRvCnJlbGF0aXZlIHN1YnN0aXR1dGlvbnMuPC9saT4KCjxsaT4gSWYgeW91IHdpc2ggdG8gbWF0Y2ggYWdhaW5zdCB0aGUgZnVsbCBVUkwtcGF0aCBpbiBhIHBlci1kaXJlY3RvcnkKKGh0YWNjZXNzKSBSZXdyaXRlUnVsZSwgdXNlIHRoZSA8Y29kZT4le1JFUVVFU1RfVVJJfTwvY29kZT4gdmFyaWFibGUgaW4KYSA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIjcmV3cml0ZWNvbmQiPlJld3JpdGVDb25kPC9hPjwvY29kZT4uPC9saT4KCjxsaT5UaGUgcmVtb3ZlZCBwcmVmaXggYWx3YXlzIGVuZHMgd2l0aCBhIHNsYXNoLCBtZWFuaW5nIHRoZSBtYXRjaGluZyBvY2N1cnMgYWdhaW5zdCBhIHN0cmluZyB3aGljaAo8ZW0+bmV2ZXI8L2VtPiBoYXMgYSBsZWFkaW5nIHNsYXNoLiAgVGhlcmVmb3JlLCBhIDxlbT5QYXR0ZXJuPC9lbT4gd2l0aCA8Y29kZT5eLzwvY29kZT4gbmV2ZXIKbWF0Y2hlcyBpbiBwZXItZGlyZWN0b3J5IGNvbnRleHQuPC9saT4KCjxsaT5BbHRob3VnaCByZXdyaXRlIHJ1bGVzIGFyZSBzeW50YWN0aWNhbGx5IHBlcm1pdHRlZCBpbiA8Y29kZSBjbGFzcz0iZGlyZWN0aXZlIj48YSBocmVmPSIuLi9tb2QvY29yZS5odG1sI2xvY2F0aW9uIj4mbHQ7TG9jYXRpb24mZ3Q7PC9hPjwvY29kZT4gYW5kIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZmlsZXMiPiZsdDtGaWxlcyZndDs8L2E+PC9jb2RlPiBzZWN0aW9ucwooaW5jbHVkaW5nIHRoZWlyIHJlZ3VsYXIgZXhwcmVzc2lvbiBjb3VudGVycGFydHMpLCB0aGlzCnNob3VsZCBuZXZlciBiZSBuZWNlc3NhcnkgYW5kIGlzIHVuc3VwcG9ydGVkLiBBIGxpa2VseSBmZWF0dXJlCnRvIGJyZWFrIGluIHRoZXNlIGNvbnRleHRzIGlzIHJlbGF0aXZlIHN1YnN0aXR1dGlvbnMuPC9saT4KPC91bD4KPC9kaXY+CgogICAgICA8cD5Gb3Igc29tZSBoaW50cyBvbiA8YSBjbGFzcz0iZ2xvc3NhcnlsaW5rIiBocmVmPSIuLi9nbG9zc2FyeS5odG1sI3JlZ2V4IiB0aXRsZT0ic2VlIGdsb3NzYXJ5Ij5yZWd1bGFyCiAgICAgIGV4cHJlc3Npb25zPC9hPiwgc2VlCiAgICAgIHRoZSA8YSBocmVmPSIuLi9yZXdyaXRlL2ludHJvLmh0bWwjcmVnZXgiPm1vZF9yZXdyaXRlCiAgICAgIEludHJvZHVjdGlvbjwvYT4uPC9wPgoKICAgICAgPHA+SW4gbW9kX3Jld3JpdGUsIHRoZSBOT1QgY2hhcmFjdGVyCiAgICAgICgnPGNvZGU+ITwvY29kZT4nKSBpcyBhbHNvIGF2YWlsYWJsZSBhcyBhIHBvc3NpYmxlIHBhdHRlcm4KICAgICAgcHJlZml4LiBUaGlzIGVuYWJsZXMgeW91IHRvIG5lZ2F0ZSBhIHBhdHRlcm47IHRvIHNheSwgZm9yIGluc3RhbmNlOgogICAgICBgYDxlbT5pZiB0aGUgY3VycmVudCBVUkwgZG9lcyA8c3Ryb25nPk5PVDwvc3Ryb25nPiBtYXRjaCB0aGlzCiAgICAgIHBhdHRlcm48L2VtPicnLiBUaGlzIGNhbiBiZSB1c2VkIGZvciBleGNlcHRpb25hbCBjYXNlcywgd2hlcmUKICAgICAgaXQgaXMgZWFzaWVyIHRvIG1hdGNoIHRoZSBuZWdhdGl2ZSBwYXR0ZXJuLCBvciBhcyBhIGxhc3QKICAgICAgZGVmYXVsdCBydWxlLjwvcD4KCjxkaXYgY2xhc3M9Im5vdGUiPjxoMz5Ob3RlPC9oMz4KV2hlbiB1c2luZyB0aGUgTk9UIGNoYXJhY3RlciB0byBuZWdhdGUgYSBwYXR0ZXJuLCB5b3UgY2Fubm90IGluY2x1ZGUKZ3JvdXBlZCB3aWxkY2FyZCBwYXJ0cyBpbiB0aGF0IHBhdHRlcm4uIFRoaXMgaXMgYmVjYXVzZSwgd2hlbiB0aGUKcGF0dGVybiBkb2VzIE5PVCBtYXRjaCAoaWUsIHRoZSBuZWdhdGlvbiBtYXRjaGVzKSwgdGhlcmUgYXJlIG5vCmNvbnRlbnRzIGZvciB0aGUgZ3JvdXBzLiBUaHVzLCBpZiBuZWdhdGVkIHBhdHRlcm5zIGFyZSB1c2VkLCB5b3UKY2Fubm90IHVzZSA8Y29kZT4kTjwvY29kZT4gaW4gdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmchCjwvZGl2PgoKICAgICAgPHA+VGhlIDxhIGlkPSJyaHMiIG5hbWU9InJocyI+PGVtPlN1YnN0aXR1dGlvbjwvZW0+PC9hPiBvZiBhCiAgICAgIHJld3JpdGUgcnVsZSBpcyB0aGUgc3RyaW5nIHRoYXQgcmVwbGFjZXMgdGhlIG9yaWdpbmFsIFVSTC1wYXRoIHRoYXQKICAgICAgd2FzIG1hdGNoZWQgYnkgPGVtPlBhdHRlcm48L2VtPi4gIFRoZSA8ZW0+U3Vic3RpdHV0aW9uPC9lbT4gbWF5CiAgICAgIGJlIGE6PC9wPgoKICAgICAgPGRsPgoKICAgICAgICA8ZHQ+ZmlsZS1zeXN0ZW0gcGF0aDwvZHQ+CgogICAgICAgIDxkZD5EZXNpZ25hdGVzIHRoZSBsb2NhdGlvbiBvbiB0aGUgZmlsZS1zeXN0ZW0gb2YgdGhlIHJlc291cmNlCiAgICAgICAgdG8gYmUgZGVsaXZlcmVkIHRvIHRoZSBjbGllbnQuICBTdWJzdGl0dXRpb25zIGFyZSBvbmx5CiAgICAgICAgdHJlYXRlZCBhcyBhIGZpbGUtc3lzdGVtIHBhdGggd2hlbiB0aGUgcnVsZSBpcyBjb25maWd1cmVkIGluCiAgICAgICAgc2VydmVyICh2aXJ0dWFsaG9zdCkgY29udGV4dCBhbmQgdGhlIGZpcnN0IGNvbXBvbmVudCBvZiB0aGUKICAgICAgICBwYXRoIGluIHRoZSBzdWJzdGl0dXRpb24gZXhpc3RzIGluIHRoZSBmaWxlLXN5c3RlbTwvZGQ+CgogICAgICAgIDxkdD5VUkwtcGF0aDwvZHQ+CgogICAgICAgIDxkZD5BIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZG9jdW1lbnRyb290Ij5Eb2N1bWVudFJvb3Q8L2E+PC9jb2RlPi1yZWxhdGl2ZSBwYXRoIHRvIHRoZQogICAgICAgIHJlc291cmNlIHRvIGJlIHNlcnZlZC4gTm90ZSB0aGF0IDxjb2RlIGNsYXNzPSJtb2R1bGUiPjxhIGhyZWY9Ii4uL21vZC9tb2RfcmV3cml0ZS5odG1sIj5tb2RfcmV3cml0ZTwvYT48L2NvZGU+CiAgICAgICAgdHJpZXMgdG8gZ3Vlc3Mgd2hldGhlciB5b3UgaGF2ZSBzcGVjaWZpZWQgYSBmaWxlLXN5c3RlbSBwYXRoCiAgICAgICAgb3IgYSBVUkwtcGF0aCBieSBjaGVja2luZyB0byBzZWUgaWYgdGhlIGZpcnN0IHNlZ21lbnQgb2YgdGhlCiAgICAgICAgcGF0aCBleGlzdHMgYXQgdGhlIHJvb3Qgb2YgdGhlIGZpbGUtc3lzdGVtLiBGb3IgZXhhbXBsZSwgaWYKICAgICAgICB5b3Ugc3BlY2lmeSBhIDxlbT5TdWJzdGl0dXRpb248L2VtPiBzdHJpbmcgb2YKICAgICAgICA8Y29kZT4vd3d3L2ZpbGUuaHRtbDwvY29kZT4sIHRoZW4gdGhpcyB3aWxsIGJlIHRyZWF0ZWQgYXMgYQogICAgICAgIFVSTC1wYXRoIDxlbT51bmxlc3M8L2VtPiBhIGRpcmVjdG9yeSBuYW1lZCA8Y29kZT53d3c8L2NvZGU+CiAgICAgICAgZXhpc3RzIGF0IHRoZSByb290IG9yIHlvdXIgZmlsZS1zeXN0ZW0gKG9yLCBpbiB0aGUgY2FzZSBvZgogICAgICAgIHVzaW5nIHJld3JpdGVzIGluIGEgPGNvZGU+Lmh0YWNjZXNzPC9jb2RlPiBmaWxlLCByZWxhdGl2ZSB0bwogICAgICAgIHlvdXIgZG9jdW1lbnQgcm9vdCksIGluIHdoaWNoIGNhc2UgaXQgd2lsbAogICAgICAgIGJlIHRyZWF0ZWQgYXMgYSBmaWxlLXN5c3RlbSBwYXRoLiBJZiB5b3Ugd2lzaCBvdGhlcgogICAgICAgIFVSTC1tYXBwaW5nIGRpcmVjdGl2ZXMgKHN1Y2ggYXMgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iLi4vbW9kL21vZF9hbGlhcy5odG1sI2FsaWFzIj5BbGlhczwvYT48L2NvZGU+KSB0byBiZSBhcHBsaWVkIHRvIHRoZQogICAgICAgIHJlc3VsdGluZyBVUkwtcGF0aCwgdXNlIHRoZSA8Y29kZT5bUFRdPC9jb2RlPiBmbGFnIGFzCiAgICAgICAgZGVzY3JpYmVkIGJlbG93LjwvZGQ+CgogICAgICAgIDxkdD5BYnNvbHV0ZSBVUkw8L2R0PgoKICAgICAgICA8ZGQ+SWYgYW4gYWJzb2x1dGUgVVJMIGlzIHNwZWNpZmllZCwKICAgICAgICA8Y29kZSBjbGFzcz0ibW9kdWxlIj48YSBocmVmPSIuLi9tb2QvbW9kX3Jld3JpdGUuaHRtbCI+bW9kX3Jld3JpdGU8L2E+PC9jb2RlPiBjaGVja3MgdG8gc2VlIHdoZXRoZXIgdGhlCiAgICAgICAgaG9zdG5hbWUgbWF0Y2hlcyB0aGUgY3VycmVudCBob3N0LiBJZiBpdCBkb2VzLCB0aGUgc2NoZW1lIGFuZAogICAgICAgIGhvc3RuYW1lIGFyZSBzdHJpcHBlZCBvdXQgYW5kIHRoZSByZXN1bHRpbmcgcGF0aCBpcyB0cmVhdGVkIGFzCiAgICAgICAgYSBVUkwtcGF0aC4gT3RoZXJ3aXNlLCBhbiBleHRlcm5hbCByZWRpcmVjdCBpcyBwZXJmb3JtZWQgZm9yCiAgICAgICAgdGhlIGdpdmVuIFVSTC4gVG8gZm9yY2UgYW4gZXh0ZXJuYWwgcmVkaXJlY3QgYmFjayB0byB0aGUKICAgICAgICBjdXJyZW50IGhvc3QsIHNlZSB0aGUgPGNvZGU+W1JdPC9jb2RlPiBmbGFnIGJlbG93LjwvZGQ+CgogICAgICAgIDxkdD48Y29kZT4tPC9jb2RlPiAoZGFzaCk8L2R0PgoKICAgICAgICA8ZGQ+QSBkYXNoIGluZGljYXRlcyB0aGF0IG5vIHN1YnN0aXR1dGlvbiBzaG91bGQgYmUgcGVyZm9ybWVkCiAgICAgICAgKHRoZSBleGlzdGluZyBwYXRoIGlzIHBhc3NlZCB0aHJvdWdoIHVudG91Y2hlZCkuIFRoaXMgaXMgdXNlZAogICAgICAgIHdoZW4gYSBmbGFnIChzZWUgYmVsb3cpIG5lZWRzIHRvIGJlIGFwcGxpZWQgd2l0aG91dCBjaGFuZ2luZwogICAgICAgIHRoZSBwYXRoLjwvZGQ+CgogICAgICA8L2RsPgoKICAgICAgPHA+SW4gYWRkaXRpb24gdG8gcGxhaW4gdGV4dCwgdGhlIDxlbT5TdWJzdGl0dXRpb248L2VtPiBzdHJpbmcgY2FuIGluY2x1ZGU8L3A+CgogICAgICA8b2w+CiAgICAgICAgPGxpPmJhY2stcmVmZXJlbmNlcyAoPGNvZGU+JE48L2NvZGU+KSB0byB0aGUgUmV3cml0ZVJ1bGUKICAgICAgICBwYXR0ZXJuPC9saT4KCiAgICAgICAgPGxpPmJhY2stcmVmZXJlbmNlcyAoPGNvZGU+JU48L2NvZGU+KSB0byB0aGUgbGFzdCBtYXRjaGVkCiAgICAgICAgUmV3cml0ZUNvbmQgcGF0dGVybjwvbGk+CgogICAgICAgIDxsaT5zZXJ2ZXItdmFyaWFibGVzIGFzIGluIHJ1bGUgY29uZGl0aW9uIHRlc3Qtc3RyaW5ncwogICAgICAgICg8Y29kZT4le1ZBUk5BTUV9PC9jb2RlPik8L2xpPgoKICAgICAgICA8bGk+PGEgaHJlZj0iI21hcGZ1bmMiPm1hcHBpbmctZnVuY3Rpb248L2E+IGNhbGxzCiAgICAgICAgKDxjb2RlPiR7bWFwbmFtZTprZXl8ZGVmYXVsdH08L2NvZGU+KTwvbGk+CiAgICAgIDwvb2w+CgogICAgICA8cD5CYWNrLXJlZmVyZW5jZXMgYXJlIGlkZW50aWZpZXJzIG9mIHRoZSBmb3JtCiAgICAgIDxjb2RlPiQ8L2NvZGU+PHN0cm9uZz5OPC9zdHJvbmc+CiAgICAgICg8c3Ryb25nPk48L3N0cm9uZz49MC4uOSksIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQKICAgICAgYnkgdGhlIGNvbnRlbnRzIG9mIHRoZSA8c3Ryb25nPk48L3N0cm9uZz50aCBncm91cCBvZiB0aGUKICAgICAgbWF0Y2hlZCA8ZW0+UGF0dGVybjwvZW0+LiBUaGUgc2VydmVyLXZhcmlhYmxlcyBhcmUgdGhlIHNhbWUKICAgICAgYXMgZm9yIHRoZSA8ZW0+VGVzdFN0cmluZzwvZW0+IG9mIGEKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVjb25kIj5SZXdyaXRlQ29uZDwvYT48L2NvZGU+CiAgICAgIGRpcmVjdGl2ZS4gVGhlIG1hcHBpbmctZnVuY3Rpb25zIGNvbWUgZnJvbSB0aGUKICAgICAgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVtYXAiPlJld3JpdGVNYXA8L2E+PC9jb2RlPgogICAgICBkaXJlY3RpdmUgYW5kIGFyZSBleHBsYWluZWQgdGhlcmUuCiAgICAgIFRoZXNlIHRocmVlIHR5cGVzIG9mIHZhcmlhYmxlcyBhcmUgZXhwYW5kZWQgaW4gdGhlIG9yZGVyIGFib3ZlLjwvcD4KCiAgICAgIDxwPlJld3JpdGUgcnVsZXMgYXJlIGFwcGxpZWQgdG8gdGhlIHJlc3VsdHMgb2YgcHJldmlvdXMgcmV3cml0ZQogICAgICBydWxlcywgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQKICAgICAgaW4gdGhlIGNvbmZpZyBmaWxlLiBUaGUgVVJMLXBhdGggb3IgZmlsZS1zeXN0ZW0gcGF0aCAoc2VlIDxhIGhyZWY9IiN3aGF0X2lzX21hdGNoZWQiPiJXaGF0IGlzIG1hdGNoZWQ/IjwvYT4sIGFib3ZlKSBpcyA8c3Ryb25nPmNvbXBsZXRlbHkKICAgICAgcmVwbGFjZWQ8L3N0cm9uZz4gYnkgdGhlIDxlbT5TdWJzdGl0dXRpb248L2VtPiBhbmQgdGhlCiAgICAgIHJld3JpdGluZyBwcm9jZXNzIGNvbnRpbnVlcyB1bnRpbCBhbGwgcnVsZXMgaGF2ZSBiZWVuIGFwcGxpZWQsCiAgICAgIG9yIGl0IGlzIGV4cGxpY2l0bHkgdGVybWluYXRlZCBieSBhbgogICAgICA8YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19sIj48Y29kZT48c3Ryb25nPkw8L3N0cm9uZz48L2NvZGU+IGZsYWc8L2E+LAogICAgICBvciBvdGhlciBmbGFnIHdoaWNoIGltcGxpZXMgaW1tZWRpYXRlIHRlcm1pbmF0aW9uLCBzdWNoIGFzCiAgICAgIDxjb2RlPjxzdHJvbmc+RU5EPC9zdHJvbmc+PC9jb2RlPiBvcgogICAgICA8Y29kZT48c3Ryb25nPkY8L3N0cm9uZz48L2NvZGU+LjwvcD4KCiAgICAgPGRpdiBjbGFzcz0ibm90ZSI+PGgzPk1vZGlmeWluZyB0aGUgUXVlcnkgU3RyaW5nPC9oMz4KICAgICAgPHA+QnkgZGVmYXVsdCwgdGhlIHF1ZXJ5IHN0cmluZyBpcyBwYXNzZWQgdGhyb3VnaCB1bmNoYW5nZWQuIFlvdQogICAgICBjYW4sIGhvd2V2ZXIsIGNyZWF0ZSBVUkxzIGluIHRoZSBzdWJzdGl0dXRpb24gc3RyaW5nIGNvbnRhaW5pbmcKICAgICAgYSBxdWVyeSBzdHJpbmcgcGFydC4gU2ltcGx5IHVzZSBhIHF1ZXN0aW9uIG1hcmsgaW5zaWRlIHRoZQogICAgICBzdWJzdGl0dXRpb24gc3RyaW5nIHRvIGluZGljYXRlIHRoYXQgdGhlIGZvbGxvd2luZyB0ZXh0IHNob3VsZAogICAgICBiZSByZS1pbmplY3RlZCBpbnRvIHRoZSBxdWVyeSBzdHJpbmcuIFdoZW4geW91IHdhbnQgdG8gZXJhc2UgYW4KICAgICAgZXhpc3RpbmcgcXVlcnkgc3RyaW5nLCBlbmQgdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmcgd2l0aCBqdXN0IGEKICAgICAgcXVlc3Rpb24gbWFyay4gVG8gY29tYmluZSBuZXcgYW5kIG9sZCBxdWVyeSBzdHJpbmdzLCB1c2UgdGhlCiAgICAgIDxjb2RlPltRU0FdPC9jb2RlPiBmbGFnLjwvcD4KICAgICA8L2Rpdj4KCiAgICAgIDxwPkFkZGl0aW9uYWxseSB5b3UgY2FuIHNldCBzcGVjaWFsIDxhIG5hbWU9InJld3JpdGVmbGFncyIgaWQ9InJld3JpdGVmbGFncyI+YWN0aW9uczwvYT4gdG8gYmUgcGVyZm9ybWVkIGJ5CiAgICAgIGFwcGVuZGluZyA8c3Ryb25nPjxjb2RlPls8L2NvZGU+PGVtPmZsYWdzPC9lbT48Y29kZT5dPC9jb2RlPjwvc3Ryb25nPgogICAgICBhcyB0aGUgdGhpcmQgYXJndW1lbnQgdG8gdGhlIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPlJld3JpdGVSdWxlPC9jb2RlPgogICAgICBkaXJlY3RpdmUuIDxlbT5GbGFnczwvZW0+IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3QsIHN1cnJvdW5kIGJ5IHNxdWFyZQogICAgICBicmFja2V0cywgb2YgYW55IG9mIHRoZSBmbGFncyBpbiB0aGUgZm9sbG93aW5nIHRhYmxlLiBNb3JlCiAgICAgIGRldGFpbHMsIGFuZCBleGFtcGxlcywgZm9yIGVhY2ggZmxhZywgYXJlIGF2YWlsYWJsZSBpbiB0aGUgPGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sIj5SZXdyaXRlIEZsYWdzIGRvY3VtZW50PC9hPi48L3A+CgogICAgPHRhYmxlIGNsYXNzPSJib3JkZXJlZCI+PHRyIGNsYXNzPSJoZWFkZXIiPjx0aD5GbGFnIGFuZCBzeW50YXg8L3RoPgogICAgICAgIDx0aD5GdW5jdGlvbjwvdGg+CiAgICA8L3RyPgo8dHI+CiAgICAgICAgPHRkPkI8L3RkPgogICAgICAgIDx0ZD5Fc2NhcGUgbm9uLWFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGluIGJhY2tyZWZlcmVuY2VzIDxlbT5iZWZvcmU8L2VtPgogICAgICAgIGFwcGx5aW5nIHRoZSB0cmFuc2Zvcm1hdGlvbi4gPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX2IiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+YmFja3JlZm5vcGx1c3xCTlA8L3RkPgogICAgICAgIDx0ZD5JZiBiYWNrcmVmZXJlbmNlcyBhcmUgYmVpbmcgZXNjYXBlZCwgc3BhY2VzIHNob3VsZCBiZSBlc2NhcGVkIHRvCiAgICAgICAgJTIwIGluc3RlYWQgb2YgKy4gVXNlZnVsIHdoZW4gdGhlIGJhY2tyZWZlcmVuY2Ugd2lsbCBiZSB1c2VkIGluIHRoZQogICAgICAgIHBhdGggY29tcG9uZW50IHJhdGhlciB0aGFuIHRoZSBxdWVyeSBzdHJpbmcuPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX2JucCI+ZGV0YWlscyAuLi48L2E+PC9lbT48L3RkPgogICAgPC90cj4KPHRyPgogICAgICAgIDx0ZD5jaGFpbnxDPC90ZD4KICAgICAgICA8dGQ+UnVsZSBpcyBjaGFpbmVkIHRvIHRoZSBmb2xsb3dpbmcgcnVsZS4gSWYgdGhlIHJ1bGUgZmFpbHMsCiAgICAgICAgdGhlIHJ1bGUocykgY2hhaW5lZCB0byBpdCB3aWxsIGJlIHNraXBwZWQuIDxlbT48YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19jIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHIgY2xhc3M9Im9kZCI+CiAgICAgICAgPHRkPmNvb2tpZXxDTz08ZW0+TkFNRTwvZW0+OjxlbT5WQUw8L2VtPjwvdGQ+CiAgICAgICAgPHRkPlNldHMgYSBjb29raWUgaW4gdGhlIGNsaWVudCBicm93c2VyLiBGdWxsIHN5bnRheCBpczoKICAgICAgICBDTz08ZW0+TkFNRTwvZW0+OjxlbT5WQUw8L2VtPjo8ZW0+ZG9tYWluPC9lbT5bOjxlbT5saWZldGltZTwvZW0+Wzo8ZW0+cGF0aDwvZW0+Wzo8ZW0+c2VjdXJlPC9lbT5bOjxlbT5odHRwb25seTwvZW0+XV1dXSA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfY28iPmRldGFpbHMgLi4uPC9hPjwvZW0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+Cjx0cj4KICAgICAgICA8dGQ+ZGlzY2FyZHBhdGh8RFBJPC90ZD4KICAgICAgICA8dGQ+Q2F1c2VzIHRoZSBQQVRIX0lORk8gcG9ydGlvbiBvZiB0aGUgcmV3cml0dGVuIFVSSSB0byBiZQogICAgICAgIGRpc2NhcmRlZC4gPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX2RwaSI+ZGV0YWlscwogICAgICAgIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHIgY2xhc3M9Im9kZCI+CiAgICAgICAgPHRkPkVORDwvdGQ+CiAgICAgICAgPHRkPlN0b3AgdGhlIHJld3JpdGluZyBwcm9jZXNzIGltbWVkaWF0ZWx5IGFuZCBkb24ndCBhcHBseSBhbnkKICAgICAgICBtb3JlIHJ1bGVzLiBBbHNvIHByZXZlbnRzIGZ1cnRoZXIgZXhlY3V0aW9uIG9mIHJld3JpdGUgcnVsZXMKICAgICAgICBpbiBwZXItZGlyZWN0b3J5IGFuZCAuaHRhY2Nlc3MgY29udGV4dC4gKEF2YWlsYWJsZSBpbiAyLjMuOSBhbmQgbGF0ZXIpCiAgICAgICAgPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX2VuZCI+ZGV0YWlscyAuLi48L2E+PC9lbT48L3RkPgogICAgPC90cj4KPHRyPgogICAgICAgIDx0ZD5lbnZ8RT1bIV08ZW0+VkFSPC9lbT5bOjxlbT5WQUw8L2VtPl08L3RkPgogICAgICAgIDx0ZD5DYXVzZXMgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUgPGVtPlZBUjwvZW0+IHRvIGJlIHNldCAodG8gdGhlCiAgICAgICAgdmFsdWUgPGVtPlZBTDwvZW0+IGlmIHByb3ZpZGVkKS4gVGhlIGZvcm0gITxlbT5WQVI8L2VtPiBjYXVzZXMKICAgICAgICB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgPGVtPlZBUjwvZW0+IHRvIGJlIHVuc2V0LgogICAgICAgIDxlbT48YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19lIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHIgY2xhc3M9Im9kZCI+CiAgICAgICAgPHRkPmZvcmJpZGRlbnxGPC90ZD4KICAgICAgICA8dGQ+UmV0dXJucyBhIDQwMyBGT1JCSURERU4gcmVzcG9uc2UgdG8gdGhlIGNsaWVudCBicm93c2VyLgogICAgICAgIDxlbT48YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19mIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHI+CiAgICAgICAgPHRkPmdvbmV8RzwvdGQ+CiAgICAgICAgPHRkPlJldHVybnMgYSA0MTAgR09ORSByZXNwb25zZSB0byB0aGUgY2xpZW50IGJyb3dzZXIuIDxlbT48YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19nIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHIgY2xhc3M9Im9kZCI+CiAgICAgICAgPHRkPkhhbmRsZXJ8SD08ZW0+Q29udGVudC1oYW5kbGVyPC9lbT48L3RkPgogICAgICAgIDx0ZD5DYXVzZXMgdGhlIHJlc3VsdGluZyBVUkkgdG8gYmUgc2VudCB0byB0aGUgc3BlY2lmaWVkCiAgICAgICAgPGVtPkNvbnRlbnQtaGFuZGxlcjwvZW0+IGZvciBwcm9jZXNzaW5nLiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfaCI+ZGV0YWlscyAuLi48L2E+PC9lbT48L3RkPgogICAgPC90cj4KPHRyPgogICAgICAgIDx0ZD5sYXN0fEw8L3RkPgogICAgICAgIDx0ZD5TdG9wIHRoZSByZXdyaXRpbmcgcHJvY2VzcyBpbW1lZGlhdGVseSBhbmQgZG9uJ3QgYXBwbHkgYW55CiAgICAgICAgbW9yZSBydWxlcy4gRXNwZWNpYWxseSBub3RlIGNhdmVhdHMgZm9yIHBlci1kaXJlY3RvcnkgYW5kCiAgICAgICAgLmh0YWNjZXNzIGNvbnRleHQgKHNlZSBhbHNvIHRoZSBFTkQgZmxhZykuIDxlbT48YSBocmVmPSIuLi9yZXdyaXRlL2ZsYWdzLmh0bWwjZmxhZ19sIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHIgY2xhc3M9Im9kZCI+CiAgICAgICAgPHRkPm5leHR8TjwvdGQ+CiAgICAgICAgPHRkPlJlLXJ1biB0aGUgcmV3cml0aW5nIHByb2Nlc3MsIHN0YXJ0aW5nIGFnYWluIHdpdGggdGhlIGZpcnN0CiAgICAgICAgcnVsZSwgdXNpbmcgdGhlIHJlc3VsdCBvZiB0aGUgcnVsZXNldCBzbyBmYXIgYXMgYSBzdGFydGluZwogICAgICAgIHBvaW50LiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfbiI+ZGV0YWlscwogICAgICAgIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHI+CiAgICAgICAgPHRkPm5vY2FzZXxOQzwvdGQ+CiAgICAgICAgPHRkPk1ha2VzIHRoZSBwYXR0ZXJuIGNvbXBhcmlzb24gY2FzZS1pbnNlbnNpdGl2ZS4KICAgICAgICA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfbmMiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+bm9lc2NhcGV8TkU8L3RkPgogICAgICAgIDx0ZD5QcmV2ZW50IG1vZF9yZXdyaXRlIGZyb20gYXBwbHlpbmcgaGV4Y29kZSBlc2NhcGluZyBvZgogICAgICAgIHNwZWNpYWwgY2hhcmFjdGVycyBpbiB0aGUgcmVzdWx0IG9mIHRoZSByZXdyaXRlLiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfbmUiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0cj4KICAgICAgICA8dGQ+bm9zdWJyZXF8TlM8L3RkPgogICAgICAgIDx0ZD5DYXVzZXMgYSBydWxlIHRvIGJlIHNraXBwZWQgaWYgdGhlIGN1cnJlbnQgcmVxdWVzdCBpcyBhbgogICAgICAgIGludGVybmFsIHN1Yi1yZXF1ZXN0LiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfbnMiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+cHJveHl8UDwvdGQ+CiAgICAgICAgPHRkPkZvcmNlIHRoZSBzdWJzdGl0dXRpb24gVVJMIHRvIGJlIGludGVybmFsbHkgc2VudCBhcyBhIHByb3h5CiAgICAgICAgcmVxdWVzdC4gPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX3AiPmRldGFpbHMKICAgICAgICAuLi48L2E+PC9lbT48L3RkPgogICAgPC90cj4KPHRyPgogICAgICAgIDx0ZD5wYXNzdGhyb3VnaHxQVDwvdGQ+CiAgICAgICAgPHRkPkZvcmNlcyB0aGUgcmVzdWx0aW5nIFVSSSB0byBiZSBwYXNzZWQgYmFjayB0byB0aGUgVVJMCiAgICAgICAgbWFwcGluZyBlbmdpbmUgZm9yIHByb2Nlc3Npbmcgb2Ygb3RoZXIgVVJJLXRvLWZpbGVuYW1lCiAgICAgICAgdHJhbnNsYXRvcnMsIHN1Y2ggYXMgPGNvZGU+QWxpYXM8L2NvZGU+IG9yCiAgICAgICAgPGNvZGU+UmVkaXJlY3Q8L2NvZGU+LiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfcHQiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+cXNhcHBlbmR8UVNBPC90ZD4KICAgICAgICA8dGQ+QXBwZW5kcyBhbnkgcXVlcnkgc3RyaW5nIGZyb20gdGhlIG9yaWdpbmFsIHJlcXVlc3QgVVJMIHRvCiAgICAgICAgYW55IHF1ZXJ5IHN0cmluZyBjcmVhdGVkIGluIHRoZSByZXdyaXRlIHRhcmdldC48ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfcXNhIj5kZXRhaWxzIC4uLjwvYT48L2VtPjwvdGQ+CiAgICA8L3RyPgo8dHI+CiAgICAgICAgPHRkPnFzZGlzY2FyZHxRU0Q8L3RkPgogICAgICAgIDx0ZD5EaXNjYXJkIGFueSBxdWVyeSBzdHJpbmcgYXR0YWNoZWQgdG8gdGhlIGluY29taW5nIFVSSS4KICAgICAgICA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfcXNkIj5kZXRhaWxzCiAgICAgICAgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+cXNsYXN0fFFTTDwvdGQ+CiAgICAgICAgPHRkPkludGVycHJldCB0aGUgbGFzdCAocmlnaHQtbW9zdCkgcXVlc3Rpb24gbWFyayBhcyB0aGUgcXVlcnkgc3RyaW5nCiAgICAgICAgICAgIGRlbGltZXRlciwgaW5zdGVhZCBvZiB0aGUgZmlyc3QgKGxlZnQtbW9zdCkgYXMgbm9ybWFsbHkgdXNlZC4gIAogICAgICAgICAgICBBdmFpbGFibGUgaW4gMi40LjE5IGFuZCBsYXRlci4KICAgICAgICA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfcXNsIj5kZXRhaWxzCiAgICAgICAgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+Cjx0cj4KICAgICAgICA8dGQ+cmVkaXJlY3R8Uls9PGVtPmNvZGU8L2VtPl08L3RkPgogICAgICAgIDx0ZD5Gb3JjZXMgYW4gZXh0ZXJuYWwgcmVkaXJlY3QsIG9wdGlvbmFsbHkgd2l0aCB0aGUgc3BlY2lmaWVkCiAgICAgICAgSFRUUCBzdGF0dXMgY29kZS4gPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX3IiPmRldGFpbHMgLi4uPC9hPjwvZW0+CiAgICAgICAgPC90ZD4KICAgIDwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KICAgICAgICA8dGQ+c2tpcHxTPTxlbT5udW08L2VtPjwvdGQ+CiAgICAgICAgPHRkPlRlbGxzIHRoZSByZXdyaXRpbmcgZW5naW5lIHRvIHNraXAgdGhlIG5leHQgPGVtPm51bTwvZW0+CiAgICAgICAgcnVsZXMgaWYgdGhlIGN1cnJlbnQgcnVsZSBtYXRjaGVzLiA8ZW0+PGEgaHJlZj0iLi4vcmV3cml0ZS9mbGFncy5odG1sI2ZsYWdfcyI+ZGV0YWlscyAuLi48L2E+PC9lbT48L3RkPgogICAgPC90cj4KPHRyPgogICAgICAgIDx0ZD50eXBlfFQ9PGVtPk1JTUUtdHlwZTwvZW0+PC90ZD4KICAgICAgICA8dGQ+Rm9yY2UgdGhlIDxhIGNsYXNzPSJnbG9zc2FyeWxpbmsiIGhyZWY9Ii4uL2dsb3NzYXJ5Lmh0bWwjbWltZS10eXBlIiB0aXRsZT0ic2VlIGdsb3NzYXJ5Ij5NSU1FLXR5cGU8L2E+IG9mIHRoZSB0YXJnZXQgZmlsZQogICAgICAgIHRvIGJlIHRoZSBzcGVjaWZpZWQgdHlwZS4gPGVtPjxhIGhyZWY9Ii4uL3Jld3JpdGUvZmxhZ3MuaHRtbCNmbGFnX3QiPmRldGFpbHMgLi4uPC9hPjwvZW0+PC90ZD4KICAgIDwvdHI+CjwvdGFibGU+Cgo8ZGl2IGNsYXNzPSJub3RlIj48aDM+SG9tZSBkaXJlY3RvcnkgZXhwYW5zaW9uPC9oMz4KPHA+IFdoZW4gdGhlIHN1YnN0aXR1dGlvbiBzdHJpbmcgYmVnaW5zIHdpdGggYSBzdHJpbmcKcmVzZW1ibGluZyAiL351c2VyIiAodmlhIGV4cGxpY2l0IHRleHQgb3IgYmFja3JlZmVyZW5jZXMpLCBtb2RfcmV3cml0ZSBwZXJmb3Jtcwpob21lIGRpcmVjdG9yeSBleHBhbnNpb24gaW5kZXBlbmRlbnQgb2YgdGhlIHByZXNlbmNlIG9yIGNvbmZpZ3VyYXRpb24Kb2YgPGNvZGUgY2xhc3M9Im1vZHVsZSI+PGEgaHJlZj0iLi4vbW9kL21vZF91c2VyZGlyLmh0bWwiPm1vZF91c2VyZGlyPC9hPjwvY29kZT4uPC9wPgoKPHA+IFRoaXMgZXhwYW5zaW9uIGRvZXMgbm90IG9jY3VyIHdoZW4gdGhlIDxlbT5QVDwvZW0+CmZsYWcgaXMgdXNlZCBvbiB0aGUgPGNvZGUgY2xhc3M9ImRpcmVjdGl2ZSI+PGEgaHJlZj0iI3Jld3JpdGVydWxlIj5SZXdyaXRlUnVsZTwvYT48L2NvZGU+CmRpcmVjdGl2ZS48L3A+CjwvZGl2PgoKCiAgICAgPHA+SGVyZSBhcmUgYWxsIHBvc3NpYmxlIHN1YnN0aXR1dGlvbiBjb21iaW5hdGlvbnMgYW5kIHRoZWlyCiAgICAgIG1lYW5pbmdzOjwvcD4KCiAgICAgIDxwPjxzdHJvbmc+SW5zaWRlIHBlci1zZXJ2ZXIgY29uZmlndXJhdGlvbgogICAgICAoPGNvZGU+aHR0cGQuY29uZjwvY29kZT4pPGJyIC8+CiAgICAgICBmb3IgcmVxdWVzdCBgYDxjb2RlPkdFVAogICAgICAvc29tZXBhdGgvcGF0aGluZm88L2NvZGU+Jyc6PC9zdHJvbmc+PGJyIC8+CiAgICAgIDwvcD4KCjx0YWJsZSBjbGFzcz0iYm9yZGVyZWQiPjx0ciBjbGFzcz0iaGVhZGVyIj4KPHRoPkdpdmVuIFJ1bGU8L3RoPgo8dGg+UmVzdWx0aW5nIFN1YnN0aXR1dGlvbjwvdGg+CjwvdHI+Cjx0cj4KPHRkPl4vc29tZXBhdGgoLiopIG90aGVycGF0aCQxPC90ZD4KPHRkPmludmFsaWQsIG5vdCBzdXBwb3J0ZWQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9Im9kZCI+Cjx0ZD5eL3NvbWVwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1JdPC90ZD4KPHRkPmludmFsaWQsIG5vdCBzdXBwb3J0ZWQ8L3RkPgo8L3RyPgo8dHI+Cjx0ZD5eL3NvbWVwYXRoKC4qKSBvdGhlcnBhdGgkMSAgW1BdPC90ZD4KPHRkPmludmFsaWQsIG5vdCBzdXBwb3J0ZWQ8L3RkPgo8L3RyPgo8dHIgY2xhc3M9Im9kZCI+Cjx0ZD5eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDE8L3RkPgo8dGQ+L290aGVycGF0aC9wYXRoaW5mbzwvdGQ+CjwvdHI+Cjx0cj4KPHRkPl4vc29tZXBhdGgoLiopIC9vdGhlcnBhdGgkMSBbUl08L3RkPgo8dGQ+aHR0cDovL3RoaXNob3N0L290aGVycGF0aC9wYXRoaW5mbyB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb248L3RkPgo8L3RyPgo8dHIgY2xhc3M9Im9kZCI+Cjx0ZD5eL3NvbWVwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1BdPC90ZD4KPHRkPmRvZXNuJ3QgbWFrZSBzZW5zZSwgbm90IHN1cHBvcnRlZDwvdGQ+CjwvdHI+Cjx0cj4KPHRkPl4vc29tZXBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMTwvdGQ+Cjx0ZD4vb3RoZXJwYXRoL3BhdGhpbmZvPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+Xi9zb21lcGF0aCguKikgaHR0cDovL3RoaXNob3N0L290aGVycGF0aCQxIFtSXTwvdGQ+Cjx0ZD5odHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvIHZpYSBleHRlcm5hbCByZWRpcmVjdGlvbjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPl4vc29tZXBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMSBbUF08L3RkPgo8dGQ+ZG9lc24ndCBtYWtlIHNlbnNlLCBub3Qgc3VwcG9ydGVkPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+Xi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMTwvdGQ+Cjx0ZD5odHRwOi8vb3RoZXJob3N0L290aGVycGF0aC9wYXRoaW5mbyB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb248L3RkPgo8L3RyPgo8dHI+Cjx0ZD5eL3NvbWVwYXRoKC4qKSBodHRwOi8vb3RoZXJob3N0L290aGVycGF0aCQxIFtSXTwvdGQ+Cjx0ZD5odHRwOi8vb3RoZXJob3N0L290aGVycGF0aC9wYXRoaW5mbyB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb24gKHRoZSBbUl0gZmxhZyBpcyByZWR1bmRhbnQpPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+Xi9zb21lcGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUF08L3RkPgo8dGQ+aHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8gdmlhIGludGVybmFsIHByb3h5PC90ZD4KPC90cj4KPC90YWJsZT4KCiAgICAgIDxwPjxzdHJvbmc+SW5zaWRlIHBlci1kaXJlY3RvcnkgY29uZmlndXJhdGlvbiBmb3IKICAgICAgPGNvZGU+L3NvbWVwYXRoPC9jb2RlPjxiciAvPgogICAgICAgKDxjb2RlPi9waHlzaWNhbC9wYXRoL3RvL3NvbWVwYXRoLy5odGFjY2VzczwvY29kZT4sIHdpdGgKICAgICAgPGNvZGU+UmV3cml0ZUJhc2UgIi9zb21lcGF0aCI8L2NvZGU+KTxiciAvPgogICAgICAgZm9yIHJlcXVlc3QgYGA8Y29kZT5HRVQKICAgICAgL3NvbWVwYXRoL2xvY2FscGF0aC9wYXRoaW5mbzwvY29kZT4nJzo8L3N0cm9uZz48YnIgLz4KICAgICA8L3A+Cgo8dGFibGUgY2xhc3M9ImJvcmRlcmVkIj48dHIgY2xhc3M9ImhlYWRlciI+Cjx0aD5HaXZlbiBSdWxlPC90aD4KPHRoPlJlc3VsdGluZyBTdWJzdGl0dXRpb248L3RoPgo8L3RyPgo8dHI+Cjx0ZD5ebG9jYWxwYXRoKC4qKSBvdGhlcnBhdGgkMTwvdGQ+Cjx0ZD4vc29tZXBhdGgvb3RoZXJwYXRoL3BhdGhpbmZvPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+XmxvY2FscGF0aCguKikgb3RoZXJwYXRoJDEgIFtSXTwvdGQ+Cjx0ZD5odHRwOi8vdGhpc2hvc3Qvc29tZXBhdGgvb3RoZXJwYXRoL3BhdGhpbmZvIHZpYSBleHRlcm5hbApyZWRpcmVjdGlvbjwvdGQ+CjwvdHI+Cjx0cj4KPHRkPl5sb2NhbHBhdGgoLiopIG90aGVycGF0aCQxICBbUF08L3RkPgo8dGQ+ZG9lc24ndCBtYWtlIHNlbnNlLCBub3Qgc3VwcG9ydGVkPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+XmxvY2FscGF0aCguKikgL290aGVycGF0aCQxPC90ZD4KPHRkPi9vdGhlcnBhdGgvcGF0aGluZm88L3RkPgo8L3RyPgo8dHI+Cjx0ZD5ebG9jYWxwYXRoKC4qKSAvb3RoZXJwYXRoJDEgW1JdPC90ZD4KPHRkPmh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8gdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uPC90ZD4KPC90cj4KPHRyIGNsYXNzPSJvZGQiPgo8dGQ+XmxvY2FscGF0aCguKikgL290aGVycGF0aCQxIFtQXTwvdGQ+Cjx0ZD5kb2Vzbid0IG1ha2Ugc2Vuc2UsIG5vdCBzdXBwb3J0ZWQ8L3RkPgo8L3RyPgo8dHI+Cjx0ZD5ebG9jYWxwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDE8L3RkPgo8dGQ+L290aGVycGF0aC9wYXRoaW5mbzwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KPHRkPl5sb2NhbHBhdGgoLiopIGh0dHA6Ly90aGlzaG9zdC9vdGhlcnBhdGgkMSBbUl08L3RkPgo8dGQ+aHR0cDovL3RoaXNob3N0L290aGVycGF0aC9wYXRoaW5mbyB2aWEgZXh0ZXJuYWwgcmVkaXJlY3Rpb248L3RkPgo8L3RyPgo8dHI+Cjx0ZD5ebG9jYWxwYXRoKC4qKSBodHRwOi8vdGhpc2hvc3Qvb3RoZXJwYXRoJDEgW1BdPC90ZD4KPHRkPmRvZXNuJ3QgbWFrZSBzZW5zZSwgbm90IHN1cHBvcnRlZDwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KPHRkPl5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDE8L3RkPgo8dGQ+aHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8gdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uPC90ZD4KPC90cj4KPHRyPgo8dGQ+XmxvY2FscGF0aCguKikgaHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgkMSBbUl08L3RkPgo8dGQ+aHR0cDovL290aGVyaG9zdC9vdGhlcnBhdGgvcGF0aGluZm8gdmlhIGV4dGVybmFsIHJlZGlyZWN0aW9uICh0aGUgW1JdIGZsYWcgaXMgcmVkdW5kYW50KTwvdGQ+CjwvdHI+Cjx0ciBjbGFzcz0ib2RkIj4KPHRkPl5sb2NhbHBhdGgoLiopIGh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoJDEgW1BdPC90ZD4KPHRkPmh0dHA6Ly9vdGhlcmhvc3Qvb3RoZXJwYXRoL3BhdGhpbmZvIHZpYSBpbnRlcm5hbCBwcm94eTwvdGQ+CjwvdHI+CjwvdGFibGU+CgogIAo8L2Rpdj4KPC9kaXY+CjxkaXYgY2xhc3M9ImJvdHRvbWxhbmciPgo8cD48c3Bhbj5BdmFpbGFibGUgTGFuZ3VhZ2VzOiA8L3NwYW4+PGEgaHJlZj0iLi4vZW4vbW9kL21vZF9yZXdyaXRlLmh0bWwiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3Jld3JpdGUuaHRtbCIgaHJlZmxhbmc9ImZyIiByZWw9ImFsdGVybmF0ZSIgdGl0bGU9IkZyYW7nYWlzIj4mbmJzcDtmciZuYnNwOzwvYT48L3A+CjwvZGl2PjxkaXYgY2xhc3M9InRvcCI+PGEgaHJlZj0iI3BhZ2UtaGVhZGVyIj48aW1nIHNyYz0iLi4vaW1hZ2VzL3VwLmdpZiIgYWx0PSJ0b3AiIC8+PC9hPjwvZGl2PjxkaXYgY2xhc3M9InNlY3Rpb24iPjxoMj48YSBpZD0iY29tbWVudHNfc2VjdGlvbiIgbmFtZT0iY29tbWVudHNfc2VjdGlvbiI+Q29tbWVudHM8L2E+PC9oMj48ZGl2IGNsYXNzPSJ3YXJuaW5nIj48c3Ryb25nPk5vdGljZTo8L3N0cm9uZz48YnIgLz5UaGlzIGlzIG5vdCBhIFEmYW1wO0Egc2VjdGlvbi4gQ29tbWVudHMgcGxhY2VkIGhlcmUgc2hvdWxkIGJlIHBvaW50ZWQgdG93YXJkcyBzdWdnZXN0aW9ucyBvbiBpbXByb3ZpbmcgdGhlIGRvY3VtZW50YXRpb24gb3Igc2VydmVyLCBhbmQgbWF5IGJlIHJlbW92ZWQgYWdhaW4gYnkgb3VyIG1vZGVyYXRvcnMgaWYgdGhleSBhcmUgZWl0aGVyIGltcGxlbWVudGVkIG9yIGNvbnNpZGVyZWQgaW52YWxpZC9vZmYtdG9waWMuIFF1ZXN0aW9ucyBvbiBob3cgdG8gbWFuYWdlIHRoZSBBcGFjaGUgSFRUUCBTZXJ2ZXIgc2hvdWxkIGJlIGRpcmVjdGVkIGF0IGVpdGhlciBvdXIgSVJDIGNoYW5uZWwsICNodHRwZCwgb24gRnJlZW5vZGUsIG9yIHNlbnQgdG8gb3VyIDxhIGhyZWY9Imh0dHA6Ly9odHRwZC5hcGFjaGUub3JnL2xpc3RzLmh0bWwiPm1haWxpbmcgbGlzdHM8L2E+LjwvZGl2Pgo8c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQp2YXIgY29tbWVudHNfc2hvcnRuYW1lID0gJ2h0dHBkJzsKdmFyIGNvbW1lbnRzX2lkZW50aWZpZXIgPSAnaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvZG9jcy8yLjQvbW9kL21vZF9yZXdyaXRlLmh0bWwnOwooZnVuY3Rpb24odywgZCkgewogICAgaWYgKHcubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PSAiaHR0cGQuYXBhY2hlLm9yZyIpIHsKICAgICAgICBkLndyaXRlKCc8ZGl2IGlkPSJjb21tZW50c190aHJlYWQiPjxcL2Rpdj4nKTsKICAgICAgICB2YXIgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgcy50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgcy5hc3luYyA9IHRydWU7CiAgICAgICAgcy5zcmMgPSAnaHR0cHM6Ly9jb21tZW50cy5hcGFjaGUub3JnL3Nob3dfY29tbWVudHMubHVhP3NpdGU9JyArIGNvbW1lbnRzX3Nob3J0bmFtZSArICcmcGFnZT0nICsgY29tbWVudHNfaWRlbnRpZmllcjsKICAgICAgICAoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSkuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBlbHNlIHsgCiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj5Db21tZW50cyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgcGFnZSBhdCB0aGUgbW9tZW50LjxcL2Rpdj4nKTsKICAgIH0KfSkod2luZG93LCBkb2N1bWVudCk7Ci8vLS0+PCFdXT48L3NjcmlwdD48L2Rpdj48ZGl2IGlkPSJmb290ZXIiPgo8cCBjbGFzcz0iYXBhY2hlIj5Db3B5cmlnaHQgMjAxNiBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyIC8+TGljZW5zZWQgdW5kZXIgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMCI+QXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wPC9hPi48L3A+CjxwIGNsYXNzPSJtZW51Ij48YSBocmVmPSIuLi9tb2QvIj5Nb2R1bGVzPC9hPiB8IDxhIGhyZWY9Ii4uL21vZC9kaXJlY3RpdmVzLmh0bWwiPkRpcmVjdGl2ZXM8L2E+IHwgPGEgaHJlZj0iaHR0cDovL3dpa2kuYXBhY2hlLm9yZy9odHRwZC9GQVEiPkZBUTwvYT4gfCA8YSBocmVmPSIuLi9nbG9zc2FyeS5odG1sIj5HbG9zc2FyeTwvYT4gfCA8YSBocmVmPSIuLi9zaXRlbWFwLmh0bWwiPlNpdGVtYXA8L2E+PC9wPjwvZGl2PjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCmlmICh0eXBlb2YocHJldHR5UHJpbnQpICE9PSAndW5kZWZpbmVkJykgewogICAgcHJldHR5UHJpbnQoKTsKfQovLy0tPjwhXV0+PC9zY3JpcHQ+CjwvYm9keT48L2h0bWw+