PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iSVNPLTg4NTktMSI/Pgo8IURPQ1RZUEUgaHRtbCBQVUJMSUMgIi0vL1czQy8vRFREIFhIVE1MIDEuMCBTdHJpY3QvL0VOIiAiaHR0cDovL3d3dy53My5vcmcvVFIveGh0bWwxL0RURC94aHRtbDEtc3RyaWN0LmR0ZCI+CjxodG1sIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hodG1sIiBsYW5nPSJmciIgeG1sOmxhbmc9ImZyIj48aGVhZD4KPG1ldGEgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgLz4KPCEtLQogICAgICAgIFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYCiAgICAgICAgICAgICAgVGhpcyBmaWxlIGlzIGdlbmVyYXRlZCBmcm9tIHhtbCBzb3VyY2U6IERPIE5PVCBFRElUCiAgICAgICAgWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFhYWFgKICAgICAgLS0+Cjx0aXRsZT5tb2Rfc2xvdG1lbV9zaG0gLSBTZXJ2ZXVyIEFwYWNoZSBIVFRQIFZlcnNpb24gMi40PC90aXRsZT4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9ImFsbCIgdHlwZT0idGV4dC9jc3MiIHRpdGxlPSJNYWluIHN0eWxlc2hlZXQiIC8+CjxsaW5rIGhyZWY9Ii4uL3N0eWxlL2Nzcy9tYW51YWwtbG9vc2UtMTAwcGMuY3NzIiByZWw9ImFsdGVybmF0ZSBzdHlsZXNoZWV0IiBtZWRpYT0iYWxsIiB0eXBlPSJ0ZXh0L2NzcyIgdGl0bGU9Ik5vIFNpZGViYXIgLSBEZWZhdWx0IGZvbnQgc2l6ZSIgLz4KPGxpbmsgaHJlZj0iLi4vc3R5bGUvY3NzL21hbnVhbC1wcmludC5jc3MiIHJlbD0ic3R5bGVzaGVldCIgbWVkaWE9InByaW50IiB0eXBlPSJ0ZXh0L2NzcyIgLz48bGluayByZWw9InN0eWxlc2hlZXQiIHR5cGU9InRleHQvY3NzIiBocmVmPSIuLi9zdHlsZS9jc3MvcHJldHRpZnkuY3NzIiAvPgo8c2NyaXB0IHNyYz0iLi4vc3R5bGUvc2NyaXB0cy9wcmV0dGlmeS5taW4uanMiIHR5cGU9InRleHQvamF2YXNjcmlwdCI+Cjwvc2NyaXB0PgoKPGxpbmsgaHJlZj0iLi4vaW1hZ2VzL2Zhdmljb24uaWNvIiByZWw9InNob3J0Y3V0IGljb24iIC8+PC9oZWFkPgo8Ym9keT4KPGRpdiBpZD0icGFnZS1oZWFkZXIiPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3NhaXJlPC9hPiB8IDxhIGhyZWY9Ii4uL3NpdGVtYXAuaHRtbCI+UGxhbiBkdSBzaXRlPC9hPjwvcD4KPHAgY2xhc3M9ImFwYWNoZSI+U2VydmV1ciBBcGFjaGUgSFRUUCBWZXJzaW9uIDIuNDwvcD4KPGltZyBhbHQ9IiIgc3JjPSIuLi9pbWFnZXMvZmVhdGhlci5wbmciIC8+PC9kaXY+CjxkaXYgY2xhc3M9InVwIj48YSBocmVmPSIuLyI+PGltZyB0aXRsZT0iJmx0Oy0iIGFsdD0iJmx0Oy0iIHNyYz0iLi4vaW1hZ2VzL2xlZnQuZ2lmIiAvPjwvYT48L2Rpdj4KPGRpdiBpZD0icGF0aCI+CjxhIGhyZWY9Imh0dHA6Ly93d3cuYXBhY2hlLm9yZy8iPkFwYWNoZTwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy8iPlNlcnZldXIgSFRUUDwvYT4gJmd0OyA8YSBocmVmPSJodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLyI+RG9jdW1lbnRhdGlvbjwvYT4gJmd0OyA8YSBocmVmPSIuLi8iPlZlcnNpb24gMi40PC9hPiAmZ3Q7IDxhIGhyZWY9Ii4vIj5Nb2R1bGVzPC9hPjwvZGl2Pgo8ZGl2IGlkPSJwYWdlLWNvbnRlbnQiPgo8ZGl2IGlkPSJwcmVhbWJsZSI+PGgxPk1vZHVsZSBBcGFjaGUgbW9kX3Nsb3RtZW1fc2htPC9oMT4KPGRpdiBjbGFzcz0idG9wbGFuZyI+CjxwPjxzcGFuPkxhbmd1ZXMgRGlzcG9uaWJsZXM6IDwvc3Bhbj48YSBocmVmPSIuLi9lbi9tb2QvbW9kX3Nsb3RtZW1fc2htLmh0bWwiIGhyZWZsYW5nPSJlbiIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3Nsb3RtZW1fc2htLmh0bWwiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+PC9wPgo8L2Rpdj4KPHRhYmxlIGNsYXNzPSJtb2R1bGUiPjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNEZXNjcmlwdGlvbiI+RGVzY3JpcHRpb246PC9hPjwvdGg+PHRkPkZvdXJuaXNzZXVyIGRlIG3pbW9pcmUgcGFydGFn6WUgYmFz6WUgc3VyIGxlcwpzbG90cy48L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTdGF0dXMiPlN0YXR1dDo8L2E+PC90aD48dGQ+RXh0ZW5zaW9uPC90ZD48L3RyPgo8dHI+PHRoPjxhIGhyZWY9Im1vZHVsZS1kaWN0Lmh0bWwjTW9kdWxlSWRlbnRpZmllciI+SWRlbnRpZmljYXRldXKgZGWgTW9kdWxlOjwvYT48L3RoPjx0ZD5zbG90bWVtX3NobV9tb2R1bGU8L3RkPjwvdHI+Cjx0cj48dGg+PGEgaHJlZj0ibW9kdWxlLWRpY3QuaHRtbCNTb3VyY2VGaWxlIj5GaWNoaWVyoFNvdXJjZTo8L2E+PC90aD48dGQ+bW9kX3Nsb3RtZW1fc2htLmM8L3RkPjwvdHI+PC90YWJsZT4KPGgzPlNvbW1haXJlPC9oMz4KCiAgICA8cD48Y29kZT5tb2Rfc2xvdG1lbV9zaG08L2NvZGU+IGVzdCB1biBmb3Vybmlzc2V1ciBkZSBt6W1vaXJlIHF1aQogICAgcGVybWV0IGxhIGNy6WF0aW9uIGV0IGwnYWNj6HMg4CB1biBzZWdtZW50IGRlIG3pbW9pcmUgcGFydGFn6WUgZGFucwogICAgbGVxdWVsIGxlcyBlbnNlbWJsZXMgZGUgZG9ubullcyBzb250IG9yZ2FuaXPpcyBlbiAic2xvdHMiLgogICAgPC9wPgoKICAgIDxwPkwnZW5zZW1ibGUgZGUgbGEgbeltb2lyZSBwYXJ0YWfpZSBlc3QgZWZmYWPpIOAgY2hhcXVlCiAgICByZWTpbWFycmFnZSwgcXVlIGNlIGRlcm5pZXIgc29pdCA8Y29kZT5ncmFjZWZ1bDwvY29kZT4gb3Ugbm9uLiBMZXMgZG9ubullcyBzb250CiAgICBzdG9ja+llcyBldCByZXN0aXR16WVzIGRhbnMgZXQg4CBwYXJ0aXIgZCd1biBmaWNoaWVyIGTpZmluaSBwYXIgbGUKICAgIHBhcmFt6HRyZSA8Y29kZT5uYW1lPC9jb2RlPiBkZXMgYXBwZWxzIDxjb2RlPmNyZWF0ZTwvY29kZT4gZXQKICAgIDxjb2RlPmF0dGFjaDwvY29kZT4uIFNpIHNvbiBjaGVtaW4gYWJzb2x1IG4nZXN0IHBhcyBzcOljaWZp6SwgbGUKICAgIGNoZW1pbiBkdSBmaWNoaWVyIHNlcmEgcmVsYXRpZiBhdSBjaGVtaW4gZOlmaW5pIHBhciBsYSBkaXJlY3RpdmUKICAgIDxjb2RlIGNsYXNzPSJkaXJlY3RpdmUiPjxhIGhyZWY9Ii4uL21vZC9jb3JlLmh0bWwjZGVmYXVsdHJ1bnRpbWVkaXIiPkRlZmF1bHRSdW50aW1lRGlyPC9hPjwvY29kZT4uCiAgICA8L3A+CgogICAgPHA+PGNvZGU+bW9kX3Nsb3RtZW1fc2htPC9jb2RlPiBmb3Vybml0IGxlcyBmb25jdGlvbnMgZCdBUEkgc3VpdmFudGVzCiAgICA6CiAgICA8L3A+CgogICAgPGRsPgogICAgICA8ZHQ+YXByX3N0YXR1c190IGRvYWxsKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqcywgYXBfc2xvdG1lbV9jYWxsYmFja19mbl90ICpmdW5jLCB2b2lkICpkYXRhLCBhcHJfcG9vbF90ICpwb29sKTwvZHQ+CiAgICAgIDxkZD5hcHBlbGxlIGxlIGNhbGxiYWNrIHBvdXIgdG91cyBsZXMgc2xvdHMgYWN0aWZzPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3QgY3JlYXRlKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqKm5ldywgY29uc3QgY2hhciAqbmFtZSwgYXByX3NpemVfdCBpdGVtX3NpemUsIHVuc2lnbmVkIGludCBpdGVtX251bSwgYXBfc2xvdG1lbV90eXBlX3QgdHlwZSwgYXByX3Bvb2xfdCAqcG9vbCk8L2R0PgogICAgICA8ZGQ+Y3LpZSB1biBub3V2ZWF1IHNsb3QgZGUgbeltb2lyZSBkb250IGNoYXF1ZSB0YWlsbGUgZCdvYmpldCBlc3QKICAgICAgaXRlbV9zaXplLiA8Y29kZT5uYW1lPC9jb2RlPiBlc3QgdXRpbGlz6SBwb3VyIGfpbulyZXIgbGUgbm9tIGR1IGZpY2hpZXIKICAgICAgcGVybWV0dGFudCBkZSBzdG9ja2VyL3Jlc3RhdXJlciBsZSBjb250ZW51IGRlIGxhIG3pbW9pcmUgcGFydGFn6WUKICAgICAgc2kgbGEgY29uZmlndXJhdGlvbiBsZSBzcOljaWZpZS4gTGVzIHZhbGV1cnMgcG9zc2libGVzIHNvbnQgOgogICAgICA8ZGw+CiAgICAgICAgIDxkdD48Y29kZT4ibm9uZSI8L2NvZGU+PC9kdD4KICAgICAgICAgPGRkPjxjb2RlPk3pbW9pcmUgcGFydGFn6WUgYW5vbnltZSBldCBwYXMgZGUgc3RvY2thZ2UKCSBwZXJzaXN0YW50PC9jb2RlPjwvZGQ+CiAgICAgICAgIDxkdD48Y29kZT4iZmlsZS1uYW1lIjwvY29kZT48L2R0PgogICAgICAgICA8ZGQ+PGNvZGU+W0RlZmF1bHRSdW50aW1lRGlyXS9maWxlLW5hbWU8L2NvZGU+PC9kZD4KICAgICAgICAgPGRkPjxjb2RlPkFic29sdXRlIGZpbGUgbmFtZTwvY29kZT48L2RkPgogICAgICAgICA8ZGQ+PGNvZGU+JGFic29sdXRlLWZpbGUtbmFtZTwvY29kZT48L2RkPgogICAgICAgPC9kbD4KICAgICAgPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3QgYXR0YWNoKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqKm5ldywgY29uc3QgY2hhciAqbmFtZSwgYXByX3NpemVfdCAqaXRlbV9zaXplLCB1bnNpZ25lZCBpbnQgKml0ZW1fbnVtLCBhcHJfcG9vbF90ICpwb29sKTwvZHQ+CiAgICAgIDxkZD5hdHRhY2hlIOAgdW4gc2xvdCBkZSBt6W1vaXJlIGV4aXN0YW50LiBWb2lyCiAgICAgIDxjb2RlPmNyZWF0ZTwvY29kZT4gcG91ciBsYSBkZXNjcmlwdGlvbiBkdSBwYXJhbeh0cmUKICAgICAgPGNvZGU+bmFtZTwvY29kZT4uPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3QgZHB0cihhcF9zbG90bWVtX2luc3RhbmNlX3QgKnMsIHVuc2lnbmVkIGludCBpdGVtX2lkLCB2b2lkKiptZW0pPC9kdD4KICAgICAgPGRkPm9idGllbnQgbGEgbeltb2lyZSBhc3NvY2npZSDgIGNlIHNsb3QgYWN0aWYuPC9kZD4KCiAgICAgIDxkdD5hcHJfc3RhdHVzX3QgZ2V0KGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqcywgdW5zaWduZWQgaW50IGl0ZW1faWQsIHVuc2lnbmVkIGNoYXIgKmRlc3QsIGFwcl9zaXplX3QgZGVzdF9sZW4pPC9kdD4KICAgICAgPGRkPmxpdCBsYSBt6W1vaXJlIGRlcHVpcyBjZSBzbG90IGV0IGxhIHRyYW5zZuhyZSB2ZXJzIGRlc3Q8L2RkPgoKICAgICAgPGR0PmFwcl9zdGF0dXNfdCBwdXQoYXBfc2xvdG1lbV9pbnN0YW5jZV90ICpzbG90LCB1bnNpZ25lZCBpbnQgaXRlbV9pZCwgdW5zaWduZWQgY2hhciAqc3JjLCBhcHJfc2l6ZV90IHNyY19sZW4pPC9kdD4KICAgICAgPGRkPuljcml0IGRhbnMgY2Ugc2xvdCBsYSBt6W1vaXJlIGVuIHByb3ZlbmFuY2UgZGUgc3JjPC9kZD4KCiAgICAgIDxkdD51bnNpZ25lZCBpbnQgbnVtX3Nsb3RzKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqcyk8L2R0PgogICAgICA8ZGQ+cmVudm9pZSBsZSBub21icmUgdG90YWwgZGUgc2xvdHMgY29udGVudXMgZGFucyBjZSBzZWdtZW50PC9kZD4KCiAgICAgIDxkdD5hcHJfc2l6ZV90IHNsb3Rfc2l6ZShhcF9zbG90bWVtX2luc3RhbmNlX3QgKnMpPC9kdD4KICAgICAgPGRkPnJlbnZvaWUgbGEgdGFpbGxlIHRvdGFsZSBkZXMgZG9ubullcywgZW4gb2N0ZXRzLCBjb250ZW51ZXMKICAgICAgZGFucyB1biBzbG90IGRlIGNlIHNlZ21lbnQ8L2RkPgoKICAgICAgPGR0PmFwcl9zdGF0dXNfdCBncmFiKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqcywgdW5zaWduZWQgaW50ICppdGVtX2lkKTs8L2R0PgogICAgICA8ZGQ+YWxsb3VlIG91IHMnYXBwcm9wcmllIGxlIHByZW1pZXIgc2xvdCBkaXNwb25pYmxlIGV0IGxlIG1hcnF1ZSBjb21tZSB1dGlsaXPpIChuJ2VmZmVjdHVlIGF1Y3VuZQogICAgICBjb3BpZSBkZSBkb25u6WVzKTwvZGQ+CgogICAgICA8ZHQ+YXByX3N0YXR1c190IGZncmFiKGFwX3Nsb3RtZW1faW5zdGFuY2VfdCAqcywgdW5zaWduZWQgaW50IGl0ZW1faWQpOzwvZHQ+CiAgICAgIDxkZD5mb3JjZSBsJ2FsbG9jYXRpb24gb3UgbCdhdHRyaWJ1dGlvbiBkdSBzbG90IHNw6WNpZmnpIGV0IGxlIG1hcnF1ZSBjb21tZSB1dGlsaXPpIChuJ2VmZmVjdHVlIGF1Y3VuZQogICAgICBjb3BpZSBkZSBkb25u6WVzKTwvZGQ+CgogICAgICA8ZHQ+YXByX3N0YXR1c190IHJlbGVhc2UoYXBfc2xvdG1lbV9pbnN0YW5jZV90ICpzLCB1bnNpZ25lZCBpbnQgaXRlbV9pZCk7PC9kdD4KICAgICAgPGRkPmxpYuhyZSB1biBzbG90IGV0IGxlIG1hcnF1ZSBjb21tZSBub24gdXRpbGlz6SAobidlZmZlY3R1ZSBhdWN1bmUKICAgICAgY29waWUgZGUgZG9ubullcyk8L2RkPgogICAgPC9kbD4KCjwvZGl2Pgo8ZGl2IGlkPSJxdWlja3ZpZXciPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZm91bmRhdGlvbi9jb250cmlidXRpbmcuaHRtbCIgY2xhc3M9ImJhZGdlIj48aW1nIHNyYz0iaHR0cHM6Ly93d3cuYXBhY2hlLm9yZy9pbWFnZXMvU3VwcG9ydEFwYWNoZS1zbWFsbC5wbmciIGFsdD0iU3VwcG9ydCBBcGFjaGUhIiAvPjwvYT48aDMgY2xhc3M9ImRpcmVjdGl2ZXMiPkRpcmVjdGl2ZXM8L2gzPgo8cD5DZSBtb2R1bGUgbmUgZm91cm5pdCBhdWN1bmUgZGlyZWN0aXZlLjwvcD4KPGgzPlRyYWl0ZW1lbnQgZGVzIGJ1Z3M8L2gzPjx1bCBjbGFzcz0ic2VlYWxzbyI+PGxpPjxhIGhyZWY9Imh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvZGlzdC9odHRwZC9DSEFOR0VTXzIuNCI+Sm91cm5hbCBkZXMgbW9kaWZpY2F0aW9ucyBkZSBodHRwZDwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvYnVnbGlzdC5jZ2k/YnVnX3N0YXR1cz1fX29wZW5fXyZhbXA7bGlzdF9pZD0xNDQ1MzImYW1wO3Byb2R1Y3Q9QXBhY2hlJTIwaHR0cGQtMiZhbXA7cXVlcnlfZm9ybWF0PXNwZWNpZmljJmFtcDtvcmRlcj1jaGFuZ2VkZGF0ZSUyMERFU0MlMkNwcmlvcml0eSUyQ2J1Z19zZXZlcml0eSZhbXA7Y29tcG9uZW50PW1vZF9zbG90bWVtX3NobSI+UHJvYmzobWVzIGNvbm51czwvYT48L2xpPjxsaT48YSBocmVmPSJodHRwczovL2J6LmFwYWNoZS5vcmcvYnVnemlsbGEvZW50ZXJfYnVnLmNnaT9wcm9kdWN0PUFwYWNoZSUyMGh0dHBkLTImYW1wO2NvbXBvbmVudD1tb2Rfc2xvdG1lbV9zaG0iPlNpZ25hbGVyIHVuIGJ1ZzwvYT48L2xpPjwvdWw+PGgzPlZvaXIgYXVzc2k8L2gzPgo8dWwgY2xhc3M9InNlZWFsc28iPgo8bGk+PGEgaHJlZj0iI2NvbW1lbnRzX3NlY3Rpb24iPkNvbW1lbnRhaXJlczwvYT48L2xpPjwvdWw+PC9kaXY+Cgo8L2Rpdj4KPGRpdiBjbGFzcz0iYm90dG9tbGFuZyI+CjxwPjxzcGFuPkxhbmd1ZXMgRGlzcG9uaWJsZXM6IDwvc3Bhbj48YSBocmVmPSIuLi9lbi9tb2QvbW9kX3Nsb3RtZW1fc2htLmh0bWwiIGhyZWZsYW5nPSJlbiIgcmVsPSJhbHRlcm5hdGUiIHRpdGxlPSJFbmdsaXNoIj4mbmJzcDtlbiZuYnNwOzwvYT4gfAo8YSBocmVmPSIuLi9mci9tb2QvbW9kX3Nsb3RtZW1fc2htLmh0bWwiIHRpdGxlPSJGcmFu52FpcyI+Jm5ic3A7ZnImbmJzcDs8L2E+PC9wPgo8L2Rpdj48ZGl2IGNsYXNzPSJ0b3AiPjxhIGhyZWY9IiNwYWdlLWhlYWRlciI+PGltZyBzcmM9Ii4uL2ltYWdlcy91cC5naWYiIGFsdD0idG9wIiAvPjwvYT48L2Rpdj48ZGl2IGNsYXNzPSJzZWN0aW9uIj48aDI+PGEgaWQ9ImNvbW1lbnRzX3NlY3Rpb24iIG5hbWU9ImNvbW1lbnRzX3NlY3Rpb24iPkNvbW1lbnRhaXJlczwvYT48L2gyPjxkaXYgY2xhc3M9Indhcm5pbmciPjxzdHJvbmc+Tm90aWNlOjwvc3Ryb25nPjxiciAvPlRoaXMgaXMgbm90IGEgUSZhbXA7QSBzZWN0aW9uLiBDb21tZW50cyBwbGFjZWQgaGVyZSBzaG91bGQgYmUgcG9pbnRlZCB0b3dhcmRzIHN1Z2dlc3Rpb25zIG9uIGltcHJvdmluZyB0aGUgZG9jdW1lbnRhdGlvbiBvciBzZXJ2ZXIsIGFuZCBtYXkgYmUgcmVtb3ZlZCBhZ2FpbiBieSBvdXIgbW9kZXJhdG9ycyBpZiB0aGV5IGFyZSBlaXRoZXIgaW1wbGVtZW50ZWQgb3IgY29uc2lkZXJlZCBpbnZhbGlkL29mZi10b3BpYy4gUXVlc3Rpb25zIG9uIGhvdyB0byBtYW5hZ2UgdGhlIEFwYWNoZSBIVFRQIFNlcnZlciBzaG91bGQgYmUgZGlyZWN0ZWQgYXQgZWl0aGVyIG91ciBJUkMgY2hhbm5lbCwgI2h0dHBkLCBvbiBGcmVlbm9kZSwgb3Igc2VudCB0byBvdXIgPGEgaHJlZj0iaHR0cDovL2h0dHBkLmFwYWNoZS5vcmcvbGlzdHMuaHRtbCI+bWFpbGluZyBsaXN0czwvYT4uPC9kaXY+CjxzY3JpcHQgdHlwZT0idGV4dC9qYXZhc2NyaXB0Ij48IS0tLy8tLT48IVtDREFUQVsvLz48IS0tCnZhciBjb21tZW50c19zaG9ydG5hbWUgPSAnaHR0cGQnOwp2YXIgY29tbWVudHNfaWRlbnRpZmllciA9ICdodHRwOi8vaHR0cGQuYXBhY2hlLm9yZy9kb2NzLzIuNC9tb2QvbW9kX3Nsb3RtZW1fc2htLmh0bWwnOwooZnVuY3Rpb24odywgZCkgewogICAgaWYgKHcubG9jYXRpb24uaG9zdG5hbWUudG9Mb3dlckNhc2UoKSA9PSAiaHR0cGQuYXBhY2hlLm9yZyIpIHsKICAgICAgICBkLndyaXRlKCc8ZGl2IGlkPSJjb21tZW50c190aHJlYWQiPjxcL2Rpdj4nKTsKICAgICAgICB2YXIgcyA9IGQuY3JlYXRlRWxlbWVudCgnc2NyaXB0Jyk7CiAgICAgICAgcy50eXBlID0gJ3RleHQvamF2YXNjcmlwdCc7CiAgICAgICAgcy5hc3luYyA9IHRydWU7CiAgICAgICAgcy5zcmMgPSAnaHR0cHM6Ly9jb21tZW50cy5hcGFjaGUub3JnL3Nob3dfY29tbWVudHMubHVhP3NpdGU9JyArIGNvbW1lbnRzX3Nob3J0bmFtZSArICcmcGFnZT0nICsgY29tbWVudHNfaWRlbnRpZmllcjsKICAgICAgICAoZC5nZXRFbGVtZW50c0J5VGFnTmFtZSgnaGVhZCcpWzBdIHx8IGQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ2JvZHknKVswXSkuYXBwZW5kQ2hpbGQocyk7CiAgICB9CiAgICBlbHNlIHsgCiAgICAgICAgZC53cml0ZSgnPGRpdiBpZD0iY29tbWVudHNfdGhyZWFkIj5Db21tZW50cyBhcmUgZGlzYWJsZWQgZm9yIHRoaXMgcGFnZSBhdCB0aGUgbW9tZW50LjxcL2Rpdj4nKTsKICAgIH0KfSkod2luZG93LCBkb2N1bWVudCk7Ci8vLS0+PCFdXT48L3NjcmlwdD48L2Rpdj48ZGl2IGlkPSJmb290ZXIiPgo8cCBjbGFzcz0iYXBhY2hlIj5Db3B5cmlnaHQgMjAxOCBUaGUgQXBhY2hlIFNvZnR3YXJlIEZvdW5kYXRpb24uPGJyIC8+QXV0b3Jpc+kgc291cyA8YSBocmVmPSJodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAiPkFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMDwvYT4uPC9wPgo8cCBjbGFzcz0ibWVudSI+PGEgaHJlZj0iLi4vbW9kLyI+TW9kdWxlczwvYT4gfCA8YSBocmVmPSIuLi9tb2QvZGlyZWN0aXZlcy5odG1sIj5EaXJlY3RpdmVzPC9hPiB8IDxhIGhyZWY9Imh0dHA6Ly93aWtpLmFwYWNoZS5vcmcvaHR0cGQvRkFRIj5GQVE8L2E+IHwgPGEgaHJlZj0iLi4vZ2xvc3NhcnkuaHRtbCI+R2xvc3NhaXJlPC9hPiB8IDxhIGhyZWY9Ii4uL3NpdGVtYXAuaHRtbCI+UGxhbiBkdSBzaXRlPC9hPjwvcD48L2Rpdj48c2NyaXB0IHR5cGU9InRleHQvamF2YXNjcmlwdCI+PCEtLS8vLS0+PCFbQ0RBVEFbLy8+PCEtLQppZiAodHlwZW9mKHByZXR0eVByaW50KSAhPT0gJ3VuZGVmaW5lZCcpIHsKICAgIHByZXR0eVByaW50KCk7Cn0KLy8tLT48IV1dPjwvc2NyaXB0Pgo8L2JvZHk+PC9odG1sPg==