ZGlmZiAtLWdpdCBhL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9yZXN0L2pzb24vSnNvQ29sdW1uTWV0YS5qYXZhIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL3Jlc3QvanNvbi9Kc29Db2x1bW5NZXRhLmphdmEKaW5kZXggMTY1NjAxNi4uNWZkNTkxMyAxMDA2NDQKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL3Jlc3QvanNvbi9Kc29Db2x1bW5NZXRhLmphdmEKKysrIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL3Jlc3QvanNvbi9Kc29Db2x1bW5NZXRhLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwogCitpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuY29tbW9ucy5BdHRyaWJ1dGVzOwogaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuT3B0aW9uRW50cnk7CiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuY29tbW9ucy5PcHRpb25zOwogaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuU3RyaW5nVXRpbHM7CkBAIC03Myw2ICs3NCwxOSBAQAogICAgICAgICB7ICAgLy8gYWRkIG1heExlbmd0aAogICAgICAgICAgICAgcHV0KF9tYXhMZW5ndGgsIChpbnQpY29sdW1uLmdldFNpemUoKSk7CiAgICAgICAgIH0KKyAgICAgICAgZm9yIChBdHRyaWJ1dGVzLkF0dHJpYnV0ZSBhdHRyIDogY29sdW1uLmdldEF0dHJpYnV0ZXMoKSkKKyAgICAgICAgeworICAgICAgICAgICAgU3RyaW5nIG5hbWUgPSBhdHRyLmdldE5hbWUoKTsKKyAgICAgICAgICAgIGlmIChEQkNvbHVtbkV4cHIuREJDT0xBVFRSX1RJVExFLmVxdWFscyhuYW1lKSB8fAorICAgICAgICAgICAgICAgIERCQ29sdW1uRXhwci5EQkNPTEFUVFJfVFlQRS5lcXVhbHMobmFtZSkpCisgICAgICAgICAgICAgICAgY29udGludWU7IC8vIGlnbm9yZQorICAgICAgICAgICAgLy8gYWRkIGF0dHJpYnV0ZQorICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0gYXR0ci5nZXRWYWx1ZSgpOworICAgICAgICAgICAgaWYgKCh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgfHwKKyAgICAgICAgICAgICAgICAodmFsdWUgaW5zdGFuY2VvZiBOdW1iZXIpIHx8CisgICAgICAgICAgICAgICAgKHZhbHVlIGluc3RhbmNlb2YgQm9vbGVhbikpCisgICAgICAgICAgICAgICAgcHV0KG5hbWUsIHZhbHVlKTsKKyAgICAgICAgfQogICAgICAgICAvLyBDb250cm9sVHlwZSBBbmQgT3B0aW9ucwogICAgICAgICBhZGRDb250cm9sVHlwZUFuZE9wdGlvbnMoY29sdW1uLmdldENvbnRyb2xUeXBlKCksIG9wdGlvbnMsIHJlc29sdmVyKTsKICAgICB9CmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvdnVlL3NhbXBsZS9kYi9TYW1wbGVEQi5qYXZhIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL3Z1ZS9zYW1wbGUvZGIvU2FtcGxlREIuamF2YQppbmRleCBjMjJjMTk1Li5jY2RlYzlhIDEwMDY0NAotLS0gYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvdnVlL3NhbXBsZS9kYi9TYW1wbGVEQi5qYXZhCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS92dWUvc2FtcGxlL2RiL1NhbXBsZURCLmphdmEKQEAgLTIwLDYgKzIwLDcgQEAKIAogaW1wb3J0IGphdmEuc3FsLlNRTEV4Y2VwdGlvbjsKIAoraW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmRhdGEuQ29sdW1uOwogaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmRhdGEuRGF0YVR5cGU7CiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuZGIuREJDb2x1bW47CiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuZGIuREJDb250ZXh0OwpAQCAtMTQ5LDYgKzE1MCwxNSBAQAogCiAgICAgICAgICAgICAvLyBvcHRpb25hbDogc2V0IGVudGl0eSBuYW1lIGZvciBzZWxlY3RRdWFsaWZpZWQoKSB0byBzaW5ndWxhciBzaW5jZSB0YWJsZSBpcyBwbHVyYWwKICAgICAgICAgICAgIHNldEVudGl0eU5hbWUoIkVNUExPWUVFIik7CisgICAgICAgICAgICAKKyAgICAgICAgICAgIC8vIFNldCBjdXN0b20gc3R5bGUgZm9yIFNBTFVUQVRJT04KKyAgICAgICAgICAgIFNBTFVUQVRJT04uc2V0QXR0cmlidXRlKCJzdHlsZUNsYXNzIiwgImVJbnBTaG9ydCIpOworICAgICAgICAgICAgLy8gU2FsYXJ5IHNwZWNpYWwKKyAgICAgICAgICAgIFNBTEFSWS5zZXRBdHRyaWJ1dGUoInN0eWxlQ2xhc3MiLCAiZUlucERlY2ltYWwiKQorICAgICAgICAgICAgICAgICAgLnNldEF0dHJpYnV0ZSgiZm9ybWF0OnVuaXQiLCAiVVNEIikKKyAgICAgICAgICAgICAgICAgIC5zZXRBdHRyaWJ1dGUoQ29sdW1uLkNPTEFUVFJfTlVNQkVSX1RZUEUsICJEZWNpbWFsIikKKyAgICAgICAgICAgICAgICAgIC5zZXRBdHRyaWJ1dGUoQ29sdW1uLkNPTEFUVFJfRlJBQ1RJT05fRElHSVRTLCAyKQorICAgICAgICAgICAgICAgICAgLnNldEF0dHJpYnV0ZShDb2x1bW4uQ09MQVRUUl9OVU1CRVJfR1JPVVBTRVAsIHRydWUpOwogICAgICAgICB9CiAgICAgfQogCmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Jlc291cmNlcy9sYW5nL21lc3NhZ2VzX2RlLnByb3BlcnRpZXMgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Jlc291cmNlcy9sYW5nL21lc3NhZ2VzX2RlLnByb3BlcnRpZXMKaW5kZXggOTIzNzU0Ny4uNjYxZThmNSAxMDA2NDQKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9yZXNvdXJjZXMvbGFuZy9tZXNzYWdlc19kZS5wcm9wZXJ0aWVzCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vcmVzb3VyY2VzL2xhbmcvbWVzc2FnZXNfZGUucHJvcGVydGllcwpAQCAtMjYsNiArMjYsNyBAQAogZmllbGQudGl0bGUuZW1wbG95ZWVzLmdlbmRlcj1HZXNjaGxlY2h0CiBmaWVsZC50aXRsZS5lbXBsb3llZXMucGhvbmVOdW1iZXI9VGVsZWZvbm51bW1lcgogZmllbGQudGl0bGUuZW1wbG95ZWVzLmVtYWlsPUUtTWFpbAorZmllbGQudGl0bGUuZW1wbG95ZWVzLnNhbGFyeT1KYWhyZXNnZWhhbHQKIGZpZWxkLnRpdGxlLmVtcGxveWVlcy5yZXRpcmVkPUF1c2dlc2NoaWVkZW4KIGZpZWxkLnRpdGxlLmVtcGxveWVlcy51cGRhdGVUaW1lc3RhbXA9WnVsZXR6dCBnZeRuZGVydCBhbQogCmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Jlc291cmNlcy9sYW5nL21lc3NhZ2VzX2VuLnByb3BlcnRpZXMgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Jlc291cmNlcy9sYW5nL21lc3NhZ2VzX2VuLnByb3BlcnRpZXMKaW5kZXggYTNhZGMxZC4uOGQ3MGQ1OCAxMDA2NDQKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi9yZXNvdXJjZXMvbGFuZy9tZXNzYWdlc19lbi5wcm9wZXJ0aWVzCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vcmVzb3VyY2VzL2xhbmcvbWVzc2FnZXNfZW4ucHJvcGVydGllcwpAQCAtMjYsNiArMjYsNyBAQAogZmllbGQudGl0bGUuZW1wbG95ZWVzLmdlbmRlcj1HZW5kZXIKIGZpZWxkLnRpdGxlLmVtcGxveWVlcy5waG9uZU51bWJlcj1QaG9uZQogZmllbGQudGl0bGUuZW1wbG95ZWVzLmVtYWlsPUUtTWFpbAorZmllbGQudGl0bGUuZW1wbG95ZWVzLnNhbGFyeT1TYWxhcnkgcC5hLgogZmllbGQudGl0bGUuZW1wbG95ZWVzLnJldGlyZWQ9UmV0aXJlZAogZmllbGQudGl0bGUuZW1wbG95ZWVzLnVwZGF0ZVRpbWVzdGFtcD1MYXN0IGNoYW5nZQogCmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Z1ZS9zcmMvYXNzZXRzL2Nzcy9sYXlvdXQuY3NzIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi92dWUvc3JjL2Fzc2V0cy9jc3MvbGF5b3V0LmNzcwppbmRleCBlNDNjNzY3Li5lMjRiY2I1IDEwMDY0NAotLS0gYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Z1ZS9zcmMvYXNzZXRzL2Nzcy9sYXlvdXQuY3NzCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vdnVlL3NyYy9hc3NldHMvY3NzL2xheW91dC5jc3MKQEAgLTE2Miw3ICsxNjIsOCBAQAogfQogc2VsZWN0LmVJbnBSZXEsCiBpbnB1dFt0eXBlPXRleHRdLmVJbnBSZXEgewotCWJvcmRlcjogMXB4IGJyb3duIHNvbGlkOworLyoJYm9yZGVyOiAxcHggYnJvd24gc29saWQ7ICovCisJYmFja2dyb3VuZC1jb2xvcjogI0ZGRkZFMDsKIH0KIHNlbGVjdC5lSW5wRGlzLAogaW5wdXRbdHlwZT10ZXh0XS5lSW5wRGlzIHsKQEAgLTE4Myw4ICsxODQsMTQgQEAKIC5lU2VsZWN0IHsKICAgd2lkdGg6IDEwMCU7CiB9Ci0uZUlucFRleHQuZVR5cGVEQVRFIHsKLSAgd2lkdGg6IDEwMHB4Oworc2VsZWN0LmVJbnB1dC5lSW5wU2hvcnQsCitpbnB1dC5lSW5wdXQuZUlucFNob3J0LAoraW5wdXQuZUlucHV0LmVUeXBlREFURSB7CisJd2lkdGg6IDEwMHB4OworfQoraW5wdXQuZUlucHV0LmVJbnBEZWNpbWFsIHsKKwl3aWR0aDogMTAwcHg7CisJdGV4dC1hbGlnbjogcmlnaHQ7CiB9CiAuZUlucHV0SGludCB7CiAJcGFkZGluZy1sZWZ0OiA0cHg7CmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Z1ZS9zcmMvY29tcG9uZW50cy9lLWlucHV0LnZ1ZSBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vdnVlL3NyYy9jb21wb25lbnRzL2UtaW5wdXQudnVlCmluZGV4IDM1MjY0NDUuLjVjMjQ3Y2MgMTAwNjQ0Ci0tLSBhL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vdnVlL3NyYy9jb21wb25lbnRzL2UtaW5wdXQudnVlCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vdnVlL3NyYy9jb21wb25lbnRzL2UtaW5wdXQudnVlCkBAIC0xNDUsNiArMTQ1LDkgQEAKICAgICAgICAgaWYgKG1ldGEucmVxdWlyZWQpIHsKICAgICAgICAgICBjbHMgKz0gJyBlSW5wUmVxJwogICAgICAgICB9CisgICAgICAgIGlmIChtZXRhLnN0eWxlQ2xhc3MpIHsKKyAgICAgICAgICBjbHMgKz0gJyAnICsgbWV0YS5zdHlsZUNsYXNzCisgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNscwogICAgICAgfSwKICAgICAgIGlucHV0VmFsdWUgKGV2ZW50KSB7CmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Z1ZS9zcmMvcGFnZXMvZW1wbG95ZWVEZXRhaWwudnVlIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi92dWUvc3JjL3BhZ2VzL2VtcGxveWVlRGV0YWlsLnZ1ZQppbmRleCBiZmNhOGQwLi4wZjk1NjM2IDEwMDY0NAotLS0gYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3Z1ZS9zcmMvcGFnZXMvZW1wbG95ZWVEZXRhaWwudnVlCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vdnVlL3NyYy9wYWdlcy9lbXBsb3llZURldGFpbC52dWUKQEAgLTMyLDYgKzMyLDcgQEAKICAgICAgICAgPHRyPjxlLWNvbnRyb2wgY29sdW1uPSJnZW5kZXIiICAgLz4gPC90cj4KICAgICAgICAgPHRyPjxlLWNvbnRyb2wgY29sdW1uPSJwaG9uZU51bWJlciIgLz48L3RyPgogICAgICAgICA8dHI+PGUtY29udHJvbCBjb2x1bW49ImVtYWlsIiAvPjwvdHI+CisgICAgICAgIDx0cj48ZS1jb250cm9sIGNvbHVtbj0ic2FsYXJ5IiAvPjwvdHI+CiAgICAgICAgIDx0cj48ZS1jb250cm9sIGNvbHVtbj0icmV0aXJlZCIgLz48L3RyPgogICAgICAgPC90YWJsZT4KICAgICA8L2UtcmVjb3JkPgpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbCBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL2luZGV4Lmh0bWwKaW5kZXggMWM4MDI0MS4uNjM0ZGE4YyAxMDA2NDQKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvaW5kZXguaHRtbAorKysgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9pbmRleC5odG1sCkBAIC0xNSw0ICsxNSw0IEBACiAgIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuICBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZQogICBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kIGxpbWl0YXRpb25zCiAgIHVuZGVyIHRoZSBMaWNlbnNlLgotIC0tPjxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9dXRmLTg+PG1ldGEgbmFtZT12aWV3cG9ydCBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+RW1waXJlLWRiIGVtcGxveWVlIGFwcCB1c2luZyB2dWUuanM8L3RpdGxlPjxsaW5rIGhyZWY9c3RhdGljL2Nzcy9hcHAuZTlhNDhlNTAzMTUxNjJkODE3YzdlZThjNjY0ODhhNzUuY3NzIHJlbD1zdHlsZXNoZWV0PjwvaGVhZD48Ym9keT48ZGl2IGNsYXNzPWNvbnRhaW5lcj48ZGl2IGlkPWFwcD48L2Rpdj48L2Rpdj48c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0IHNyYz1zdGF0aWMvanMvbWFuaWZlc3QuZGVkYWQ5MWUyNzc4N2Q2MTVhOGIuanM+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPXRleHQvamF2YXNjcmlwdCBzcmM9c3RhdGljL2pzL3ZlbmRvci43OTcwMzBjOTIxY2VkNzg2YmIwYS5qcz48L3NjcmlwdD48c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0IHNyYz1zdGF0aWMvanMvYXBwLmJjNTAxYzFlOGI1MTRhYjRiMmJlLmpzPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorIC0tPjxodG1sPjxoZWFkPjxtZXRhIGNoYXJzZXQ9dXRmLTg+PG1ldGEgbmFtZT12aWV3cG9ydCBjb250ZW50PSJ3aWR0aD1kZXZpY2Utd2lkdGgsaW5pdGlhbC1zY2FsZT0xIj48dGl0bGU+RW1waXJlLWRiIGVtcGxveWVlIGFwcCB1c2luZyB2dWUuanM8L3RpdGxlPjxsaW5rIGhyZWY9c3RhdGljL2Nzcy9hcHAuNmY3M2U1OWQwYzA3MDMxN2U2NzZmZDI2NzAxOThlMDYuY3NzIHJlbD1zdHlsZXNoZWV0PjwvaGVhZD48Ym9keT48ZGl2IGNsYXNzPWNvbnRhaW5lcj48ZGl2IGlkPWFwcD48L2Rpdj48IS0tIGJ1aWx0IGZpbGVzIHdpbGwgYmUgYXV0byBpbmplY3RlZCAtLT48L2Rpdj48c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0IHNyYz1zdGF0aWMvanMvbWFuaWZlc3QuMGFjY2MxN2VjMzU5OGY5MzIyODMuanM+PC9zY3JpcHQ+PHNjcmlwdCB0eXBlPXRleHQvamF2YXNjcmlwdCBzcmM9c3RhdGljL2pzL3ZlbmRvci4zNWIwYjM0MGUwZGFiN2YzNDBlMi5qcz48L3NjcmlwdD48c2NyaXB0IHR5cGU9dGV4dC9qYXZhc2NyaXB0IHNyYz1zdGF0aWMvanMvYXBwLjVhOTk4NDcwNDQ4YjI1NTg4NjE1LmpzPjwvc2NyaXB0PjwvYm9keT48L2h0bWw+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2Nzcy9hcHAuNmY3M2U1OWQwYzA3MDMxN2U2NzZmZDI2NzAxOThlMDYuY3NzIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2Nzcy9hcHAuNmY3M2U1OWQwYzA3MDMxN2U2NzZmZDI2NzAxOThlMDYuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI3NzhjZWEKLS0tIC9kZXYvbnVsbAorKysgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvY3NzL2FwcC42ZjczZTU5ZDBjMDcwMzE3ZTY3NmZkMjY3MDE5OGUwNi5jc3MKQEAgLTAsMCArMSBAQAorKiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9Ym9keSxodG1se3dpZHRoOjgwMHB4O21hcmdpbi1sZWZ0OjEwcHg7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWJvdHRvbTo1cHg7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Zm9udC1mYW1pbHk6VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS50aXRsZURpdntiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWY7Zm9udC1zaXplOjE4cHg7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlcjoycHggc29saWQgIzhmOTllZn0udGl0bGVEaXYsaDF7Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246bGVmdH1oMXtjb2xvcjpicm93bjtmb250LXNpemU6MTVweH10ZHtmb250LXNpemU6MTJweH10ZCx0aHtwYWRkaW5nLXJpZ2h0OjEwcHh9dGh7dGV4dC1hbGlnbjpsZWZ0O2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTNweH1BOmxpbmssQTp2aXNpdGVke3RleHQtZGVjb3JhdGlvbjpub25lfUE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0ucm93LWV2ZW57YmFja2dyb3VuZC1jb2xvcjojZWZlZmZiO3RleHQtYWxpZ246bGVmdH0ucm93LW9kZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7dGV4dC1hbGlnbjpsZWZ0fS5ub3dyYXB7d2hpdGUtc3BhY2U6bm93cmFwfSNtZXNzYWdlcyB1bHtiYWNrZ3JvdW5kLWNvbG9yOiNmYmYwZjA7Ym9yZGVyOjJweCBzb2xpZCAjOTIyNzI3O2xpc3Qtc3R5bGUtdHlwZTpzcXVhcmU7cGFkZGluZzo4cHg7cGFkZGluZy1sZWZ0OjI0cHh9I21lc3NhZ2VzIHVsIGxpe3BhZGRpbmc6NHB4IDA7Y29sb3I6IzkyMjcyNztmb250LXdlaWdodDo3MDB9ZGl2LmZvcm1QYW5lbHtib3JkZXI6MXB4IHNvbGlkICM4Zjk5ZWY7YmFja2dyb3VuZC1jb2xvcjojZjhmOGY4O3BhZGRpbmc6OHB4IDRweH10YWJsZS5pbnB1dEZvcm17d2lkdGg6MTAwJTt0YWJsZS1sYXlvdXQ6Zml4ZWR9dGFibGUuaW5wdXRGb3JtIHRkLmVDdGxMYWJlbHt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6MTQwcHg7aGVpZ2h0OjI0cHg7cGFkZGluZy10b3A6M3B4O2ZvbnQtd2VpZ2h0OjcwMH10YWJsZS5pbnB1dEZvcm0gdGQuZUN0bElucHV0e3ZlcnRpY2FsLWFsaWduOnRvcH10YWJsZS5pbnB1dEZvcm0gdGQuYnV0dG9uQmFye3BhZGRpbmctdG9wOjhweH1kaXYuYnV0dG9uQmFye21hcmdpbjoxMnB4IDB9LmJ1dHRvbkJhciBhLC5idXR0b25CYXIgYTp2aXNpdGVke2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlcjoxcHggc29saWQgIzhmOTllZjtwYWRkaW5nOjRweCAxMnB4O2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLXJpZ2h0OjE2cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idXR0b25CYXIgYTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWZ9ZGl2LnNlYXJjaFJlc3VsdCxzcGFuLnNlYXJjaFJlc3VsdHtkaXNwbGF5OmJsb2NrO21hcmdpbjoxMnB4IDA7cGFkZGluZzo0cHggMH0uc2VhcmNoUmVzdWx0IHRhYmxle3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uc2VhcmNoUmVzdWx0IHRhYmxlIHRyIHRkLC5zZWFyY2hSZXN1bHQgdGFibGUgdHIgdGh7cGFkZGluZzo0cHh9LnNlYXJjaFJlc3VsdCB0YWJsZSB0ciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzhmOTllZn0uc2VhcmNoUmVzdWx0IHRhYmxlIGEuZUxpbmssLnNlYXJjaFJlc3VsdCB0YWJsZSBhLmVMaW5rOnZpc2l0ZWR7Y29sb3I6YnJvd247Zm9udC13ZWlnaHQ6NzAwfXNwYW4ucmVxdWlyZWR7Y29sb3I6YnJvd259aW5wdXRbdHlwZT1wYXNzd29yZF0saW5wdXRbdHlwZT10ZXh0XSxzZWxlY3R7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmfWlucHV0W3R5cGU9dGV4dF0uZUlucFJlcSxzZWxlY3QuZUlucFJlcXtiYWNrZ3JvdW5kLWNvbG9yOiNmZmZmZTB9aW5wdXRbdHlwZT10ZXh0XS5lSW5wRGlzLHNlbGVjdC5lSW5wRGlze2JvcmRlcjoxcHggc29saWQgc2lsdmVyO2NvbG9yOmdyYXl9c3Bhbi5lSW5wRGlze2Rpc3BsYXk6aW5saW5lLWJsb2NrO3BhZGRpbmctdG9wOjNweH0uZVVuaXR7cGFkZGluZy1sZWZ0OjRweDtmb250LXN0eWxlOmJvbGR9LmVJbnBUZXh0LC5lU2VsZWN0e3dpZHRoOjEwMCV9aW5wdXQuZUlucHV0LmVJbnBTaG9ydCxpbnB1dC5lSW5wdXQuZVR5cGVEQVRFLHNlbGVjdC5lSW5wdXQuZUlucFNob3J0e3dpZHRoOjEwMHB4fWlucHV0LmVJbnB1dC5lSW5wRGVjaW1hbHt3aWR0aDoxMDBweDt0ZXh0LWFsaWduOnJpZ2h0fS5lSW5wdXRIaW50e3BhZGRpbmctbGVmdDo0cHg7Zm9udC1zdHlsZTppdGFsaWN9ZGl2LmVUeXBlQm9vbEZhbHNle2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEpBQVlBUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdNREF3TURjd0tiSzhETkRURHhNVkVSTVZFUlVYRXhjWkdSMGZIeUVqSVNNbEltVW9KU2NySnlrckp5c3RLU3N0S1Nzdkt5MHZMUzh2TFM4eExtL3hyekV6TVRFek1UTXpNVE0xTXpVMU16VTNOVFUzTnpjM056YzVOems1T1RrNU9UazdPenM3T3pzOVBUMDlKZ2dTTUFnU09nZ1NDQWdnRWdnZ0hBZ2dKZ2dnTUFnZ09nZ2dDQWd1RWdndUhBZ3VKZ2d1TUFndU9nZ3VDQWc4RWdnOEhBZzhKZ2c4TUFnOE9nZzhIeE1NSXhVT0NCSUVFaElFSEJJRUpoSUVNQklFT2hJRUNCSVNFaElTSEJJU0poSVNNQklTT2hJU0NCSWdFaElnSEJJZ0poSWdNQklnT2hJZ0NCSXVFaEl1SEJJdUpoSXVNQkl1T2hJdUNCSThFaEk4SEJJOEpoSThNQkk4T2hJOEpoY1FLaGtUQ0J3RUVod0VIQndFSmh3RU1Cd0VPaHdFQ0J3U0Vod1NIQndTSmh3U01Cd1NPaHdTQ0J3Z0Vod2dIQndnSmh3Z01Cd2dPaHdnQ0J3dUVod3VIQnd1Smh3dU1Cd3VPaHd1Q0J3OEVodzhIQnc4Smh3OE1CdzhPaHc4TEIwWUx5SWFDQ1lFRWlZRUhDWUVKaVlFTUNZRU9pWUVDQ1lTRWlZU0hDWVNKaVlTTUNZU09pWVNDQ1lnRWlZZ0hDWWdKaVlnTUNZZ09pWWdDQ1l1RWlZdUhDWXVKaVl1TUNZdU9pWXVDQ1k4RWlZOEhDWThKaVk4TUNZOE9pWThNaVFiTkNnZENEQUVFakFFSERBRUpqQUVNREFFT2pBRUNEQVNFakFTSERBU0pqQVNNREFTT2pBU0NEQWdFakFnSERBZ0pqQWdNREFnT2pBZ0NEQXVFakF1SERBdUpqQXVNREF1T2pBdUNEQThFakE4SERBOEtiSzhNREE4T2pBOE5pb2dPQ3drQ0RvRUVqb0VIRG9FSmpvRU1Eb0VPam9FQ0RvU0Vqb1NIRG9TSmpvU01Eb1NPam9TQ0RvZ0Vqb2dIRG9nSmpvZ01Eb2dPam9nQ0RvdUVqb3VIRG91SmpvdU1EY3dPam91Q0RvOEVqbzhIRG84SmpvOE1EbzhPam84T2pBblBEVXVBQTRBQUJnQUFDZ0FBRFFBTkRRQUtDZ0FHQmdBRGc0QURnQUFHQUFBS0FBQU5BQUFOQUEwS0FBb0dBQVlEZ0FPQUFBT0FBQVlBQUFvQUFBMFAvNzhLQ2dwSUNBZ1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvLy8vLy95SDVCQUVBQVAwQUxBQUFBQUFrQUJnQUJ3ai9BQ1VJSEVpd29NR0RDQ1g4Vzhpd29jQ0dFUDg5ak1od0lrV0pDaTlpL0xlaG84ZU9HelZhaEtoZzQ4ZVBJUytPWktpZzVNT1RIbE5Tbk5oeVlVMlRNRGZJakVpejVFMmNNSGRDN1BrVDZFbWhEak8yTEptVVkwNmtGWlV5YlpwVDU4cWhHVlZtblptd3ExZUQvY0wyVTJIQ2hOaXpZY21hUlN0V0xkdXhGaVpjdUNDaEExb1ZjZWZXdlp1WHJsMnhKaXFjYVBqQkFtREJoQTJIRFV5aWNlUENZaXVvaUJoaVExakpDMEdNV0ZqNXN1UFBuVHQ4dUVnaGhlaC9LQnd3V0FCaFlXblJueitYdm1EaW9nWVJ0UDg5V0xwZzgrMExzVC9mbmpDWm9nY1B4UDh0V0txQXdyL2pFNEk3UG82QnhNWHExZjlGNEQwWXUvVEcxVUZ3U1NDdFF2eENDQW9hWkhCZG5zTjNDaXI2V1JnTWtjT0hzUE1qMnNjdmZmL1lDaCtrc0pBSkdGaVdGb0FDL2tPZ2dmOTk4Rm1CYUhWQWdVQVhsTUNXaEJSYUdPR0VFbFFvVmtBQU93PT0pO2JhY2tncm91bmQtcG9zaXRpb246MCAwfWRpdi5lVHlwZUJvb2xGYWxzZSxkaXYuZVR5cGVCb29sVHJ1ZXt3aWR0aDoxMnB4O2hlaWdodDoxMnB4O2JhY2tncm91bmQtcmVwZWF0Om5vLXJlcGVhdH1kaXYuZVR5cGVCb29sVHJ1ZXtiYWNrZ3JvdW5kLWltYWdlOnVybChkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhKQUFZQVBjQUFBQUFBSUFBQUFDQUFJQ0FBQUFBZ0lBQWdBQ0FnTURBd01EY3dLYks4RE5EVER4TVZFUk1WRVJVWEV4Y1pHUjBmSHlFaklTTWxJbVVvSlNjckp5a3JKeXN0S1NzdEtTc3ZLeTB2TFM4dkxTOHhMbS94cnpFek1URXpNVE16TVRNMU16VTFNelUzTlRVM056YzNOemM1TnprNU9UazVPVGs3T3pzN096czlQVDA5SmdnU01BZ1NPZ2dTQ0FnZ0VnZ2dIQWdnSmdnZ01BZ2dPZ2dnQ0FndUVnZ3VIQWd1SmdndU1BZ3VPZ2d1Q0FnOEVnZzhIQWc4SmdnOE1BZzhPZ2c4SHhNTUl4VU9DQklFRWhJRUhCSUVKaElFTUJJRU9oSUVDQklTRWhJU0hCSVNKaElTTUJJU09oSVNDQklnRWhJZ0hCSWdKaElnTUJJZ09oSWdDQkl1RWhJdUhCSXVKaEl1TUJJdU9oSXVDQkk4RWhJOEhCSThKaEk4TUJJOE9oSThKaGNRS2hrVENCd0VFaHdFSEJ3RUpod0VNQndFT2h3RUNCd1NFaHdTSEJ3U0pod1NNQndTT2h3U0NCd2dFaHdnSEJ3Z0pod2dNQndnT2h3Z0NCd3VFaHd1SEJ3dUpod3VNQnd1T2h3dUNCdzhFaHc4SEJ3OEpodzhNQnc4T2h3OExCMFlMeUlhQ0NZRUVpWUVIQ1lFSmlZRU1DWUVPaVlFQ0NZU0VpWVNIQ1lTSmlZU01DWVNPaVlTQ0NZZ0VpWWdIQ1lnSmlZZ01DWWdPaVlnQ0NZdUVpWXVIQ1l1SmlZdU1DWXVPaVl1Q0NZOEVpWThIQ1k4SmlZOE1DWThPaVk4TWlRYk5DZ2RDREFFRWpBRUhEQUVKakFFTURBRU9qQUVDREFTRWpBU0hEQVNKakFTTURBU09qQVNDREFnRWpBZ0hEQWdKakFnTURBZ09qQWdDREF1RWpBdUhEQXVKakF1TURBdU9qQXVDREE4RWpBOEhEQThLYks4TURBOE9qQThOaW9nT0N3a0NEb0VFam9FSERvRUpqb0VNRG9FT2pvRUNEb1NFam9TSERvU0pqb1NNRG9TT2pvU0NEb2dFam9nSERvZ0pqb2dNRG9nT2pvZ0NEb3VFam91SERvdUpqb3VNRGN3T2pvdUNEbzhFam84SERvOEpqbzhNRG84T2pvOE9qQW5QRFV1QUE0QUFCZ0FBQ2dBQURRQU5EUUFLQ2dBR0JnQURnNEFEZ0FBR0FBQUtBQUFOQUFBTkFBMEtBQW9HQUFZRGdBT0FBQU9BQUFZQUFBb0FBQTBQLzc4S0NncElDQWdQOEFBQUQvQVAvL0FBQUEvLzhBL3dELy8vLy8veUg1QkFFQUFQMEFMQUFBQUFBa0FCZ0FCd2ovQUNVSUhFaXdvTUdEQ0NYOFc4aXdvY0NHRVA4OWpNaHdJa1dKQ2k5aS9MZWhvOGVPR3pWYWhLaGc0OGVQSVMrT1pLaWc1TU9USGxOU25OaHlZVTJUTURmSWpFaXo1RTJjTUhkQzdQa1Q2RW1oRGpPMkxKbVVZMDZrRlpVeWJacFQ1OHFoR1ZWbW5abXdxMWVEL2NMMlUySENoTml6WWNtYVJTdFdMZHV4RmlaY3VDQ2hBMW9WY2VmV3ZadVhybDJ4SmlxY2FQakJBbURCaEEySERVeWljZVBDWWl1b2lCaGlRMWpKQzBHTVdGajVzdVBQblR0OHVFZ2hoZWgvS0J3d1dBQmhZV25SbnorWHZtRGlvZ1lSdFA4OVdMcGc4KzBMc1QvZm5qQ1pvZ2NQeFA4dFdLcUF3ci9qRTRJN1BvNkJ4TVhxMWY5RjREMFl1L1RHMVVGd1NTQ3RRdnhDQ0FvYVpIQmRuc04zQ2lyNldSZ01rY09Ic1BNajJzY3ZmZi9ZQ2gra3NKQUpHRmlXRm9BQy9rT2dnZjk5OEZtQmFIVkFnVUFYbE1DV2hCUmFHT0dFRWxRb1ZrQUFPdz09KTtiYWNrZ3JvdW5kLXBvc2l0aW9uOi0xMnB4IDB9ZGl2LmVUYWJWaWV3e3dpZHRoOjUwMHB4fXRhYmxlLmVUYWJCYXJ7d2lkdGg6MTAwJTtib3JkZXItc3BhY2luZzowO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZTt0YWJsZS1sYXlvdXQ6YXV0bztwYWRkaW5nOjB9dGFibGUuZVRhYkJhciB0ciB0ZC5lVGFiTGFiZWx7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmO3BhZGRpbmc6OHB4O3doaXRlLXNwYWNlOm5vd3JhcH10YWJsZS5lVGFiQmFyIHRyIHRkLmVUYWJMYWJlbC5lVGFiQWN0aXZle2JvcmRlci1ib3R0b206MXB4IHNvbGlkICNmOGY4Zjg7YmFja2dyb3VuZC1jb2xvcjojZjhmOGY4fXRhYmxlLmVUYWJCYXIgdHIgdGQuZVRhYkxhYmVsLmVUYWJEaXNhYmxlZHtjb2xvcjpncmF5O2ZvbnQtc3R5bGU6aXRhbGljfXRhYmxlLmVUYWJCYXIgdHIgdGQuZVRhYkJhckVtcHR5e3dpZHRoOjk5JTtib3JkZXItYm90dG9tOjFweCBzb2xpZCAjOGY5OWVmfXRhYmxlLmVUYWJQYW5lbHt3aWR0aDoxMDAlO2JvcmRlci1zcGFjaW5nOjA7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO2JvcmRlcjoxcHggc29saWQgIzhmOTllZjtib3JkZXItdG9wOjB9dGFibGUuZVRhYlBhbmVsIHRyIHRkLmVUYWJQYWdle3BhZGRpbmc6OHB4O2JhY2tncm91bmQtY29sb3I6I2Y4ZjhmOH10YWJsZS5lVGFiUGFuZWwgdHIgdGQuZVRhYlBhZ2UgZGl2LmZvcm1QYW5lbHtib3JkZXI6MH1kaXYuaW5mby1tc2d7cGFkZGluZzoxMnB4O2JhY2tncm91bmQtY29sb3I6I2ZmZmZjYX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvY3NzL2FwcC5lOWE0OGU1MDMxNTE2MmQ4MTdjN2VlOGM2NjQ4OGE3NS5jc3MgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvY3NzL2FwcC5lOWE0OGU1MDMxNTE2MmQ4MTdjN2VlOGM2NjQ4OGE3NS5jc3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYmY0OTIuLjAwMDAwMDAKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2Nzcy9hcHAuZTlhNDhlNTAzMTUxNjJkODE3YzdlZThjNjY0ODhhNzUuY3NzCisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotKiw6YWZ0ZXIsOmJlZm9yZXtib3gtc2l6aW5nOmJvcmRlci1ib3h9Ym9keSxodG1se3dpZHRoOjgwMHB4O21hcmdpbi1sZWZ0OjEwcHg7bWFyZ2luLXJpZ2h0OmF1dG87bWFyZ2luLWJvdHRvbTo1cHg7Y29sb3I6IzAwMDtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7Zm9udC1mYW1pbHk6VmVyZGFuYSxBcmlhbCxzYW5zLXNlcmlmO2ZvbnQtc2l6ZToxMnB4fS50aXRsZURpdntiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWY7Zm9udC1zaXplOjE4cHg7cGFkZGluZy1sZWZ0OjEwcHg7cGFkZGluZy10b3A6MTBweDtwYWRkaW5nLWJvdHRvbToxMHB4O2JvcmRlcjoycHggc29saWQgIzhmOTllZn0udGl0bGVEaXYsaDF7Zm9udC13ZWlnaHQ6NzAwO3RleHQtYWxpZ246bGVmdH1oMXtjb2xvcjpicm93bjtmb250LXNpemU6MTVweH10ZHtmb250LXNpemU6MTJweH10ZCx0aHtwYWRkaW5nLXJpZ2h0OjEwcHh9dGh7dGV4dC1hbGlnbjpsZWZ0O2ZvbnQtd2VpZ2h0OjcwMDtmb250LXNpemU6MTNweH1BOmxpbmssQTp2aXNpdGVke3RleHQtZGVjb3JhdGlvbjpub25lfUE6aG92ZXJ7dGV4dC1kZWNvcmF0aW9uOnVuZGVybGluZX0ucm93LWV2ZW57YmFja2dyb3VuZC1jb2xvcjojZWZlZmZiO3RleHQtYWxpZ246bGVmdH0ucm93LW9kZHtiYWNrZ3JvdW5kLWNvbG9yOiNmZmY7dGV4dC1hbGlnbjpsZWZ0fS5ub3dyYXB7d2hpdGUtc3BhY2U6bm93cmFwfSNtZXNzYWdlcyB1bHtiYWNrZ3JvdW5kLWNvbG9yOiNmYmYwZjA7Ym9yZGVyOjJweCBzb2xpZCAjOTIyNzI3O2xpc3Qtc3R5bGUtdHlwZTpzcXVhcmU7cGFkZGluZzo4cHg7cGFkZGluZy1sZWZ0OjI0cHh9I21lc3NhZ2VzIHVsIGxpe3BhZGRpbmc6NHB4IDA7Y29sb3I6IzkyMjcyNztmb250LXdlaWdodDo3MDB9ZGl2LmZvcm1QYW5lbHtib3JkZXI6MXB4IHNvbGlkICM4Zjk5ZWY7YmFja2dyb3VuZC1jb2xvcjojZjhmOGY4O3BhZGRpbmc6OHB4IDRweH10YWJsZS5pbnB1dEZvcm17d2lkdGg6MTAwJTt0YWJsZS1sYXlvdXQ6Zml4ZWR9dGFibGUuaW5wdXRGb3JtIHRkLmVDdGxMYWJlbHt2ZXJ0aWNhbC1hbGlnbjp0b3A7d2lkdGg6MTQwcHg7aGVpZ2h0OjI0cHg7cGFkZGluZy10b3A6M3B4O2ZvbnQtd2VpZ2h0OjcwMH10YWJsZS5pbnB1dEZvcm0gdGQuZUN0bElucHV0e3ZlcnRpY2FsLWFsaWduOnRvcH10YWJsZS5pbnB1dEZvcm0gdGQuYnV0dG9uQmFye3BhZGRpbmctdG9wOjhweH1kaXYuYnV0dG9uQmFye21hcmdpbjoxMnB4IDB9LmJ1dHRvbkJhciBhLC5idXR0b25CYXIgYTp2aXNpdGVke2Rpc3BsYXk6aW5saW5lLWJsb2NrO2JvcmRlcjoxcHggc29saWQgIzhmOTllZjtwYWRkaW5nOjRweCAxMnB4O2NvbG9yOiMwMDA7dGV4dC1kZWNvcmF0aW9uOm5vbmU7bWFyZ2luLXJpZ2h0OjE2cHg7YmFja2dyb3VuZC1jb2xvcjojZmZmfS5idXR0b25CYXIgYTpob3ZlcntiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWZ9ZGl2LnNlYXJjaFJlc3VsdCxzcGFuLnNlYXJjaFJlc3VsdHtkaXNwbGF5OmJsb2NrO21hcmdpbjoxMnB4IDA7cGFkZGluZzo0cHggMH0uc2VhcmNoUmVzdWx0IHRhYmxle3dpZHRoOjEwMCU7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmO2JvcmRlci1jb2xsYXBzZTpjb2xsYXBzZX0uc2VhcmNoUmVzdWx0IHRhYmxlIHRyIHRkLC5zZWFyY2hSZXN1bHQgdGFibGUgdHIgdGh7cGFkZGluZzo0cHh9LnNlYXJjaFJlc3VsdCB0YWJsZSB0ciB0aHtiYWNrZ3JvdW5kLWNvbG9yOiNlZmZiZWY7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgIzhmOTllZn0uc2VhcmNoUmVzdWx0IHRhYmxlIGEuZUxpbmssLnNlYXJjaFJlc3VsdCB0YWJsZSBhLmVMaW5rOnZpc2l0ZWR7Y29sb3I6YnJvd247Zm9udC13ZWlnaHQ6NzAwfXNwYW4ucmVxdWlyZWR7Y29sb3I6YnJvd259aW5wdXRbdHlwZT1wYXNzd29yZF0saW5wdXRbdHlwZT10ZXh0XSxzZWxlY3R7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmfWlucHV0W3R5cGU9dGV4dF0uZUlucFJlcSxzZWxlY3QuZUlucFJlcXtib3JkZXI6MXB4IHNvbGlkIGJyb3dufWlucHV0W3R5cGU9dGV4dF0uZUlucERpcyxzZWxlY3QuZUlucERpc3tib3JkZXI6MXB4IHNvbGlkIHNpbHZlcjtjb2xvcjpncmF5fXNwYW4uZUlucERpc3tkaXNwbGF5OmlubGluZS1ibG9jaztwYWRkaW5nLXRvcDozcHh9LmVVbml0e3BhZGRpbmctbGVmdDo0cHg7Zm9udC1zdHlsZTpib2xkfS5lSW5wVGV4dCwuZVNlbGVjdHt3aWR0aDoxMDAlfS5lSW5wVGV4dC5lVHlwZURBVEV7d2lkdGg6MTAwcHh9LmVJbnB1dEhpbnR7cGFkZGluZy1sZWZ0OjRweDtmb250LXN0eWxlOml0YWxpY31kaXYuZVR5cGVCb29sRmFsc2V7YmFja2dyb3VuZC1pbWFnZTp1cmwoZGF0YTppbWFnZS9naWY7YmFzZTY0LFIwbEdPRGxoSkFBWUFQY0FBQUFBQUlBQUFBQ0FBSUNBQUFBQWdJQUFnQUNBZ01EQXdNRGN3S2JLOERORFREeE1WRVJNVkVSVVhFeGNaR1IwZkh5RWpJU01sSW1Vb0pTY3JKeWtySnlzdEtTc3RLU3N2S3kwdkxTOHZMUzh4TG0veHJ6RXpNVEV6TVRNek1UTTFNelUxTXpVM05UVTNOemMzTnpjNU56azVPVGs1T1RrN096czdPenM5UFQwOUpnZ1NNQWdTT2dnU0NBZ2dFZ2dnSEFnZ0pnZ2dNQWdnT2dnZ0NBZ3VFZ2d1SEFndUpnZ3VNQWd1T2dndUNBZzhFZ2c4SEFnOEpnZzhNQWc4T2dnOEh4TU1JeFVPQ0JJRUVoSUVIQklFSmhJRU1CSUVPaElFQ0JJU0VoSVNIQklTSmhJU01CSVNPaElTQ0JJZ0VoSWdIQklnSmhJZ01CSWdPaElnQ0JJdUVoSXVIQkl1SmhJdU1CSXVPaEl1Q0JJOEVoSThIQkk4SmhJOE1CSThPaEk4SmhjUUtoa1RDQndFRWh3RUhCd0VKaHdFTUJ3RU9od0VDQndTRWh3U0hCd1NKaHdTTUJ3U09od1NDQndnRWh3Z0hCd2dKaHdnTUJ3Z09od2dDQnd1RWh3dUhCd3VKaHd1TUJ3dU9od3VDQnc4RWh3OEhCdzhKaHc4TUJ3OE9odzhMQjBZTHlJYUNDWUVFaVlFSENZRUppWUVNQ1lFT2lZRUNDWVNFaVlTSENZU0ppWVNNQ1lTT2lZU0NDWWdFaVlnSENZZ0ppWWdNQ1lnT2lZZ0NDWXVFaVl1SENZdUppWXVNQ1l1T2lZdUNDWThFaVk4SENZOEppWThNQ1k4T2lZOE1pUWJOQ2dkQ0RBRUVqQUVIREFFSmpBRU1EQUVPakFFQ0RBU0VqQVNIREFTSmpBU01EQVNPakFTQ0RBZ0VqQWdIREFnSmpBZ01EQWdPakFnQ0RBdUVqQXVIREF1SmpBdU1EQXVPakF1Q0RBOEVqQThIREE4S2JLOE1EQThPakE4TmlvZ09Dd2tDRG9FRWpvRUhEb0VKam9FTURvRU9qb0VDRG9TRWpvU0hEb1NKam9TTURvU09qb1NDRG9nRWpvZ0hEb2dKam9nTURvZ09qb2dDRG91RWpvdUhEb3VKam91TURjd09qb3VDRG84RWpvOEhEbzhKam84TURvOE9qbzhPakFuUERVdUFBNEFBQmdBQUNnQUFEUUFORFFBS0NnQUdCZ0FEZzRBRGdBQUdBQUFLQUFBTkFBQU5BQTBLQUFvR0FBWURnQU9BQUFPQUFBWUFBQW9BQUEwUC83OEtDZ3BJQ0FnUDhBQUFEL0FQLy9BQUFBLy84QS93RC8vLy8vL3lINUJBRUFBUDBBTEFBQUFBQWtBQmdBQndqL0FDVUlIRWl3b01HRENDWDhXOGl3b2NDR0VQODlqTWh3SWtXSkNpOWkvTGVobzhlT0d6VmFoS2hnNDhlUElTK09aS2lnNU1PVEhsTlNuTmh5WVUyVE1EZklqRWl6NUUyY01IZEM3UGtUNkVtaERqTzJMSm1VWTA2a0ZaVXliWnBUNThxaEdWVm1uWm13cTFlRC9jTDJVMkhDaE5pelljbWFSU3RXTGR1eEZpWmN1Q0NoQTFvVmNlZld2WnVYcmwyeEppcWNhUGpCQW1EQmhBMkhEVXlpY2VQQ1lpdW9pQmhpUTFqSkMwR01XRmo1c3VQUG5UdDh1RWdoaGVoL0tCd3dXQUJoWVduUm56K1h2bURpb2dZUnRQODlXTHBnOCswTHNUL2ZuakNab2djUHhQOHRXS3FBd3IvakU0STdQbzZCeE1YcTFmOUY0RDBZdS9URzFVRndTU0N0UXZ4Q0NBb2FaSEJkbnNOM0NpcjZXUmdNa2NPSHNQTWoyc2N2ZmYvWUNoK2tzSkFKR0ZpV0ZvQUMva09nZ2Y5OThGbUJhSFZBZ1VBWGxNQ1doQlJhR09HRUVsUW9Wa0FBT3c9PSk7YmFja2dyb3VuZC1wb3NpdGlvbjowIDB9ZGl2LmVUeXBlQm9vbEZhbHNlLGRpdi5lVHlwZUJvb2xUcnVle3dpZHRoOjEycHg7aGVpZ2h0OjEycHg7YmFja2dyb3VuZC1yZXBlYXQ6bm8tcmVwZWF0fWRpdi5lVHlwZUJvb2xUcnVle2JhY2tncm91bmQtaW1hZ2U6dXJsKGRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEpBQVlBUGNBQUFBQUFJQUFBQUNBQUlDQUFBQUFnSUFBZ0FDQWdNREF3TURjd0tiSzhETkRURHhNVkVSTVZFUlVYRXhjWkdSMGZIeUVqSVNNbEltVW9KU2NySnlrckp5c3RLU3N0S1Nzdkt5MHZMUzh2TFM4eExtL3hyekV6TVRFek1UTXpNVE0xTXpVMU16VTNOVFUzTnpjM056YzVOems1T1RrNU9UazdPenM3T3pzOVBUMDlKZ2dTTUFnU09nZ1NDQWdnRWdnZ0hBZ2dKZ2dnTUFnZ09nZ2dDQWd1RWdndUhBZ3VKZ2d1TUFndU9nZ3VDQWc4RWdnOEhBZzhKZ2c4TUFnOE9nZzhIeE1NSXhVT0NCSUVFaElFSEJJRUpoSUVNQklFT2hJRUNCSVNFaElTSEJJU0poSVNNQklTT2hJU0NCSWdFaElnSEJJZ0poSWdNQklnT2hJZ0NCSXVFaEl1SEJJdUpoSXVNQkl1T2hJdUNCSThFaEk4SEJJOEpoSThNQkk4T2hJOEpoY1FLaGtUQ0J3RUVod0VIQndFSmh3RU1Cd0VPaHdFQ0J3U0Vod1NIQndTSmh3U01Cd1NPaHdTQ0J3Z0Vod2dIQndnSmh3Z01Cd2dPaHdnQ0J3dUVod3VIQnd1Smh3dU1Cd3VPaHd1Q0J3OEVodzhIQnc4Smh3OE1CdzhPaHc4TEIwWUx5SWFDQ1lFRWlZRUhDWUVKaVlFTUNZRU9pWUVDQ1lTRWlZU0hDWVNKaVlTTUNZU09pWVNDQ1lnRWlZZ0hDWWdKaVlnTUNZZ09pWWdDQ1l1RWlZdUhDWXVKaVl1TUNZdU9pWXVDQ1k4RWlZOEhDWThKaVk4TUNZOE9pWThNaVFiTkNnZENEQUVFakFFSERBRUpqQUVNREFFT2pBRUNEQVNFakFTSERBU0pqQVNNREFTT2pBU0NEQWdFakFnSERBZ0pqQWdNREFnT2pBZ0NEQXVFakF1SERBdUpqQXVNREF1T2pBdUNEQThFakE4SERBOEtiSzhNREE4T2pBOE5pb2dPQ3drQ0RvRUVqb0VIRG9FSmpvRU1Eb0VPam9FQ0RvU0Vqb1NIRG9TSmpvU01Eb1NPam9TQ0RvZ0Vqb2dIRG9nSmpvZ01Eb2dPam9nQ0RvdUVqb3VIRG91SmpvdU1EY3dPam91Q0RvOEVqbzhIRG84SmpvOE1EbzhPam84T2pBblBEVXVBQTRBQUJnQUFDZ0FBRFFBTkRRQUtDZ0FHQmdBRGc0QURnQUFHQUFBS0FBQU5BQUFOQUEwS0FBb0dBQVlEZ0FPQUFBT0FBQVlBQUFvQUFBMFAvNzhLQ2dwSUNBZ1A4QUFBRC9BUC8vQUFBQS8vOEEvd0QvLy8vLy95SDVCQUVBQVAwQUxBQUFBQUFrQUJnQUJ3ai9BQ1VJSEVpd29NR0RDQ1g4Vzhpd29jQ0dFUDg5ak1od0lrV0pDaTlpL0xlaG84ZU9HelZhaEtoZzQ4ZVBJUytPWktpZzVNT1RIbE5Tbk5oeVlVMlRNRGZJakVpejVFMmNNSGRDN1BrVDZFbWhEak8yTEptVVkwNmtGWlV5YlpwVDU4cWhHVlZtblptd3ExZUQvY0wyVTJIQ2hOaXpZY21hUlN0V0xkdXhGaVpjdUNDaEExb1ZjZWZXdlp1WHJsMnhKaXFjYVBqQkFtREJoQTJIRFV5aWNlUENZaXVvaUJoaVExakpDMEdNV0ZqNXN1UFBuVHQ4dUVnaGhlaC9LQnd3V0FCaFlXblJueitYdm1EaW9nWVJ0UDg5V0xwZzgrMExzVC9mbmpDWm9nY1B4UDh0V0txQXdyL2pFNEk3UG82QnhNWHExZjlGNEQwWXUvVEcxVUZ3U1NDdFF2eENDQW9hWkhCZG5zTjNDaXI2V1JnTWtjT0hzUE1qMnNjdmZmL1lDaCtrc0pBSkdGaVdGb0FDL2tPZ2dmOTk4Rm1CYUhWQWdVQVhsTUNXaEJSYUdPR0VFbFFvVmtBQU93PT0pO2JhY2tncm91bmQtcG9zaXRpb246LTEycHggMH1kaXYuZVRhYlZpZXd7d2lkdGg6NTAwcHh9dGFibGUuZVRhYkJhcnt3aWR0aDoxMDAlO2JvcmRlci1zcGFjaW5nOjA7Ym9yZGVyLWNvbGxhcHNlOmNvbGxhcHNlO3RhYmxlLWxheW91dDphdXRvO3BhZGRpbmc6MH10YWJsZS5lVGFiQmFyIHRyIHRkLmVUYWJMYWJlbHtib3JkZXI6MXB4IHNvbGlkICM4Zjk5ZWY7cGFkZGluZzo4cHg7d2hpdGUtc3BhY2U6bm93cmFwfXRhYmxlLmVUYWJCYXIgdHIgdGQuZVRhYkxhYmVsLmVUYWJBY3RpdmV7Ym9yZGVyLWJvdHRvbToxcHggc29saWQgI2Y4ZjhmODtiYWNrZ3JvdW5kLWNvbG9yOiNmOGY4Zjh9dGFibGUuZVRhYkJhciB0ciB0ZC5lVGFiTGFiZWwuZVRhYkRpc2FibGVke2NvbG9yOmdyYXk7Zm9udC1zdHlsZTppdGFsaWN9dGFibGUuZVRhYkJhciB0ciB0ZC5lVGFiQmFyRW1wdHl7d2lkdGg6OTklO2JvcmRlci1ib3R0b206MXB4IHNvbGlkICM4Zjk5ZWZ9dGFibGUuZVRhYlBhbmVse3dpZHRoOjEwMCU7Ym9yZGVyLXNwYWNpbmc6MDtib3JkZXItY29sbGFwc2U6Y29sbGFwc2U7Ym9yZGVyOjFweCBzb2xpZCAjOGY5OWVmO2JvcmRlci10b3A6MH10YWJsZS5lVGFiUGFuZWwgdHIgdGQuZVRhYlBhZ2V7cGFkZGluZzo4cHg7YmFja2dyb3VuZC1jb2xvcjojZjhmOGY4fXRhYmxlLmVUYWJQYW5lbCB0ciB0ZC5lVGFiUGFnZSBkaXYuZm9ybVBhbmVse2JvcmRlcjowfWRpdi5pbmZvLW1zZ3twYWRkaW5nOjEycHg7YmFja2dyb3VuZC1jb2xvcjojZmZmZmNhfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy9hcHAuNWE5OTg0NzA0NDhiMjU1ODg2MTUuanMgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvanMvYXBwLjVhOTk4NDcwNDQ4YjI1NTg4NjE1LmpzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRiY2M5Y2MKLS0tIC9kZXYvbnVsbAorKysgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvanMvYXBwLjVhOTk4NDcwNDQ4YjI1NTg4NjE1LmpzCkBAIC0wLDAgKzEsMiBAQAord2VicGFja0pzb25wKFsxXSxbLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzUpLG89bi5uKHIpLGE9bigxNykscz1uLm4oYSksaT17aW5pdGlhbGl6ZWQ6ITEsYmFzZVVSTDoiYXBpIixkZWZhdWx0T3B0aW9uczp7eGhyRmllbGRzOnt3aXRoQ3JlZGVudGlhbHM6ITB9LHN0YXR1c0NvZGU6ezQwMTpmdW5jdGlvbigpe2wubG9nZ2VkSW49ITF9LDQwNDpmdW5jdGlvbigpe2FsZXJ0KCJUaGUgcmVxdWVzdGVkIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSEiKX19LGVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdHVzVGV4dCsiICgiK2Uuc3RhdHVzKyIpIjtlLnJlc3BvbnNlVGV4dCYmKHQ9dCsiOiAiK2UucmVzcG9uc2VUZXh0KSxsLmRlYnVnKCJBamF4IGVycm9yOiAiK3QpfX0sc2V0dXA6ZnVuY3Rpb24oKXtzLmEuYWpheFNldHVwKGkuZGVmYXVsdE9wdGlvbnMpLGkuaW5pdGlhbGl6ZWQ9ITB9LGNhbGw6ZnVuY3Rpb24oZSl7cmV0dXJuITAhPT1pLmluaXRpYWxpemVkJiYobC5kZWJ1ZygiQUpBWCBub3QgaW5pdGlhbGl6ZWQuIEluaXRpYWxpbmcgbm93Li4uIiksaS5zZXR1cCgpKSxlLnVybD1pLmJhc2VVUkwrZS51cmwscy5hLmFqYXgoZSl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJHRVQiLHVybDplfSl9LHBvc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJQT1NUIix1cmw6ZSxkYXRhOnR9KX0scG9zdEpTT046ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJQT1NUIix1cmw6ZSxjb250ZW50VHlwZToiYXBwbGljYXRpb24vanNvbiIsZGF0YTpvKCkodCl9KX19O2kuc2V0dXAoKTt2YXIgbD17bG9nZ2VkSW46ITEsZGVidWc6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LGFzc2VydExvZ2dlZEluOmZ1bmN0aW9uKGUpe3RoaXMubG9nZ2VkSW58fGUuJHJvdXRlci5wdXNoKCIvbG9naW4iKX0sbG9naW46ZnVuY3Rpb24oZSx0KXt2YXIgbj17dXNlcm5hbWU6ZSxwYXNzd29yZDp0fTtyZXR1cm4gaS5wb3N0KCIvYXV0aC9sb2dpbiIsbil9LGxvZ291dDpmdW5jdGlvbigpe3JldHVybiBpLnBvc3QoIi9hdXRoL2xvZ291dCIpfSxnZXRFbXBsb3llZUZpbHRlcjpmdW5jdGlvbigpe3JldHVybiBpLmdldCgiL2VtcGxveWVlL2ZpbHRlciIpfSxmaW5kRW1wbG95ZWVzOmZ1bmN0aW9uKGUpe3JldHVybiBpLnBvc3RKU09OKCIvZW1wbG95ZWUvbGlzdCIsZSl9LGNyZWF0ZUVtcGxveWVlUmVjb3JkOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0KCIvZW1wbG95ZWUvYWRkIil9LHJlYWRFbXBsb3llZVJlY29yZDpmdW5jdGlvbihlKXtyZXR1cm4gaS5nZXQoIi9lbXBsb3llZS9nZXQvIitlKX0sdXBkYXRlRW1wbG95ZWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGkucG9zdEpTT04oIi9lbXBsb3llZS91cGRhdGUiLGUpfSxkZWxldGVFbXBsb3llZTpmdW5jdGlvbihlKXtyZXR1cm4gaS5nZXQoIi9lbXBsb3llZS9kZWxldGUvIitlKX19O3QuYT1sfSwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigwKShuKDI3KSxudWxsLG51bGwsbnVsbCxudWxsKTtlLmV4cG9ydHM9ci5leHBvcnRzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigwKShuKDI4KSxuKDgzKSxudWxsLG51bGwsbnVsbCk7ZS5leHBvcnRzPXIuZXhwb3J0c30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMCkobigyOSksbig4NCksbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzApLG51bGwsbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzEpLG51bGwsbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNiksbz1uLm4ociksYT1uKDM3KSxzPW4ubihhKSxpPW4oNyksbD1uKDg2KSx1PW4oNzkpLGM9bi5uKHUpLGQ9big3OCkscD1uLm4oZCksbT1uKDc3KSxmPW4ubihtKTtpLmEudXNlKGwuYSksdC5hPW5ldyBsLmEoe3JvdXRlczpbe3BhdGg6Ii9sb2dpbiIsY29tcG9uZW50OmMuYX0se3BhdGg6Ii9lbXBsb3llZUxpc3QiLGNvbXBvbmVudDpwLmF9LHtwYXRoOiIvZW1wbG95ZWVEZXRhaWwvOmVtcGxveWVlSWQiLGNvbXBvbmVudDpmLmEscHJvcHM6ZnVuY3Rpb24oZSl7dmFyIHQ9cygpKGUucGFyYW1zLmVtcGxveWVlSWQpO3JldHVybiBvKCkodCk/MDp7ZW1wbG95ZWVJZDp0fX19LHtwYXRoOiIqIixyZWRpcmVjdDoiL2xvZ2luIn1dfSl9LGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe24oNzIpfXZhciBvPW4oMCkobigyNiksbig4MikscixudWxsLG51bGwpO2UuZXhwb3J0cz1vLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oNyksbz1uKDI0KSxhPW4ubihvKSxzPW4oMjMpO3IuYS5jb25maWcucHJvZHVjdGlvblRpcD0hMSxuZXcgci5hKHtlbDoiI2FwcCIscm91dGVyOnMuYSx0ZW1wbGF0ZToiPEFwcC8+Iixjb21wb25lbnRzOntBcHA6YS5hfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDcpLG89bigyKTt0LmRlZmF1bHQ9e25hbWU6ImFwcCIsZGF0YTpmdW5jdGlvbigpe3JldHVybntlbXBsb3llZUZpbHRlcjp2b2lkIDAsbWVzc2FnZXM6dm9pZCAwLHJlZGlyZWN0V2l0aEVycm9yOiExfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuc3RhcnR1cCgpfSx3YXRjaDp7JHJvdXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZWRpcmVjdFdpdGhFcnJvcj90aGlzLnJlZGlyZWN0V2l0aEVycm9yPSExOnRoaXMuY2xlYXJNZXNzYWdlcygpfX0sbWV0aG9kczp7c3RhcnR1cDpmdW5jdGlvbigpe28uYS5kZWJ1ZygiQXBwbGljYXRpb24gc3RhcnR1cCEgVnVlIHZlcnNpb24gaXMgIityLmEudmVyc2lvbil9LGNsZWFyRGF0YTpmdW5jdGlvbigpe3RoaXMuZW1wbG95ZWVGaWx0ZXI9dm9pZCAwfSxjbGVhck1lc3NhZ2VzOmZ1bmN0aW9uKCl7dGhpcy5tZXNzYWdlcz12b2lkIDB9LGFkZE1lc3NhZ2VzOmZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZXM/dGhpcy5tZXNzYWdlcz10aGlzLm1lc3NhZ2VzLmNvbmNhdChlKTp0aGlzLm1lc3NhZ2VzPWV9LHJlZGlyZWN0OmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXJNZXNzYWdlcygpLHRoaXMuJHJvdXRlci5wdXNoKGUpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihlLHQpe3QmJih0aGlzLnJlZGlyZWN0V2l0aEVycm9yPSEwLHRoaXMuJHJvdXRlci5wdXNoKHQpKSxlLnJlc3BvbnNlSlNPTj90aGlzLmFkZE1lc3NhZ2VzKGUucmVzcG9uc2VKU09OKTp0aGlzLmFkZE1lc3NhZ2VzKFtlLnN0YXR1c1RleHRdKX0saXNMb2dnZWRJbjpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1vLmEubG9nZ2VkSW4mJihvLmEuZGVidWcoIkVNUEFQSS5sb2dnZWRJbiBpcyB1bmRlZmluZWQhIiksby5hLmxvZ2dlZEluPSEwKSxvLmEubG9nZ2VkSW59LGRvTG9nb3V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztjb25maXJtKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gbG9nb3V0PyIpJiZvLmEubG9nb3V0KCkuZG9uZShmdW5jdGlvbigpe3JldHVybiBlLm9uTG9nb3V0Q29tcGxldGUoKX0pfSxvbkxvZ2luQ29tcGxldGU6ZnVuY3Rpb24oKXtvLmEubG9nZ2VkSW49ITAsdGhpcy5jbGVhckRhdGEoKSx0aGlzLiRyb3V0ZXIucHVzaCgiL2VtcGxveWVlTGlzdCIpfSxvbkxvZ291dENvbXBsZXRlOmZ1bmN0aW9uKCl7by5hLmxvZ2dlZEluPSExLHRoaXMuY2xlYXJEYXRhKCksdGhpcy4kcm91dGVyLnB1c2goIi9sb2dpbiIpfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDExKSxvPW4ubihyKSxhPW4oMjApLHM9bi5uKGEpLGk9bigxOSksbD1uLm4oaSk7dC5kZWZhdWx0PXtmdW5jdGlvbmFsOiEwLG5hbWU6ImUtY29udHJvbCIscHJvcHM6e2NvbHVtbjp7cmVxdWlyZWQ6ITB9LHJlY29yZDp7dHlwZTpPYmplY3R9LGRhdGE6e3R5cGU6T2JqZWN0fX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuW2UoInRkIix7Y2xhc3M6ImVDdGxMYWJlbCJ9LFtlKHMuYSx7cHJvcHM6bygpKHtjb2x1bW46dC5wcm9wcy5jb2x1bW4sZm9ySW5wdXQ6ITB9KX0pXSksZSgidGQiLHtjbGFzczoiZUN0bElucHV0In0sW2UobC5hLHtwcm9wczp0LnByb3BzfSldKV19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigyKSxvPW4oMjIpLGE9bi5uKG8pLHM9bigxNyksaT1uLm4ocyk7dC5kZWZhdWx0PXtuYW1lOiJlLWlucHV0Iixjb21wb25lbnRzOntlVmFsdWU6YS5hfSxwcm9wczp7Y29sdW1uOntyZXF1aXJlZDohMH0scmVjb3JkOnt0eXBlOk9iamVjdH0sZGF0YTp7dHlwZTpPYmplY3R9fSxjb21wdXRlZDp7X3JlY29yZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVjb3JkO2lmKHZvaWQgMD09PWUpZm9yKHZhciB0PXRoaXMuJHBhcmVudDt0Oyl7aWYodC5yZWNvcmQpe2U9dC5yZWNvcmQ7YnJlYWt9dD10LiRwYXJlbnR9aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBObyBkYXRhIG9yIHJlY29yZCBwcm92aWRlZCEiKTtpZih2b2lkIDA9PT1lLm1ldGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiZS1pbnB1dDogSW52YWxpZCByZWNvcmQgcGFyYW06IG5vIG1ldGEgcHJvcGVydHkhIik7aWYodm9pZCAwPT09ZS5kYXRhKXRocm93IG5ldyBUeXBlRXJyb3IoImUtaW5wdXQ6IEludmFsaWQgcmVjb3JkIHBhcmFtOiBubyBkYXRhIHByb3BlcnR5ISIpO3JldHVybiBlfSxfcmVjb3JkRGF0YTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLmRhdGE/dGhpcy5fcmVjb3JkLmRhdGE6dGhpcy5kYXRhfSxtZXRhOmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLmNvbHVtbnx8dGhpcy5jb2x1bW4gaW5zdGFuY2VvZiBTdHJpbmcpcmV0dXJuIHRoaXMuX3JlY29yZC5tZXRhW3RoaXMuY29sdW1uXTtpZih2b2lkIDA9PT10aGlzLmNvbHVtbi5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gdGhpcy5jb2x1bW59LGRhdGFWYWx1ZTp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tZXRhLnByb3BlcnR5O3JldHVybiB0aGlzLl9yZWNvcmREYXRhW2VdfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZXRhLnByb3BlcnR5O3RoaXMuX3JlY29yZERhdGFbdF09ZX19fSxtZXRob2RzOntpc1ZhbHVlRXF1YWxUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmRhdGFWYWx1ZTtyZXR1cm4iIj09PWUmJihlPW51bGwpLHQ9PT1lfSxzdHlsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49ImVJbnB1dCAiK2U7cmV0dXJuIG4rPSIgZVR5cGUiK3QuZGF0YVR5cGUsdC5kaXNhYmxlZCYmKG4rPSIgZUlucERpcyIpLHQucmVxdWlyZWQmJihuKz0iIGVJbnBSZXEiKSx0LnN0eWxlQ2xhc3MmJihuKz0iICIrdC5zdHlsZUNsYXNzKSxufSxpbnB1dFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBpKCkoZS5jdXJyZW50VGFyZ2V0KS52YWwoKX0sY2hlY2tib3hWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gaSgpKGUuY3VycmVudFRhcmdldCkucHJvcCgiY2hlY2tlZCIpfSx1cGRhdGVEYXRhOmZ1bmN0aW9uKGUpe3RoaXMuZGF0YVZhbHVlPWUsci5hLmRlYnVnKCdWYWx1ZSBmb3I6ICInK3RoaXMubWV0YS5uYW1lKyciIGhhcyBiZWVuIHNldCB0bzogJytlKX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PXtuYW1lOiJlLWxhYmVsIixwcm9wczp7Y29sdW1uOntyZXF1aXJlZDohMH0scmVjb3JkOnt0eXBlOk9iamVjdH0sZm9ySW5wdXQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sY29tcHV0ZWQ6e21ldGE6ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuY29sdW1ufHx0aGlzLmNvbHVtbiBpbnN0YW5jZW9mIFN0cmluZyl7dmFyIGU9dGhpcy5yZWNvcmQ7aWYodm9pZCAwPT09ZSlmb3IodmFyIHQ9dGhpcy4kcGFyZW50O3Q7KXtpZih0LnJlY29yZCl7ZT10LnJlY29yZDticmVha310PXQuJHBhcmVudH1pZih2b2lkIDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoImUtbGFiZWw6IE5vIGRhdGEgb3IgcmVjb3JkIHByb3ZpZGVkISIpO2lmKHZvaWQgMD09PWUubWV0YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWxhYmVsOiBJbnZhbGlkIHJlY29yZCBwYXJhbTogbm8gbWV0YSBwcm9wZXJ0eSEiKTtyZXR1cm4gZS5tZXRhW3RoaXMuY29sdW1uXX1pZih2b2lkIDA9PT10aGlzLmNvbHVtbi5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWxhYmVsOiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gdGhpcy5jb2x1bW59fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD17bmFtZToiZS1yZWNvcmQiLHByb3BzOntyZWNvcmQ6e3R5cGU6T2JqZWN0fSxzdHlsZUNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJlUmVjb3JkIn19LHJlbmRlcjpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT10aGlzLnJlY29yZClyZXR1cm4gZSgiZGl2Iix7Y2xhc3M6dGhpcy5zdHlsZUNsYXNzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9e2Z1bmN0aW9uYWw6ITAsbmFtZToiZS12YWx1ZSIscHJvcHM6e2NvbHVtbjp7cmVxdWlyZWQ6ITB9LHJlY29yZDp7dHlwZTpPYmplY3R9LGRhdGE6e3R5cGU6T2JqZWN0fX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD1lLnByb3BzLnJlY29yZDtpZih2b2lkIDA9PT10KWZvcih2YXIgbj1lLnBhcmVudDtuOyl7aWYobi5yZWNvcmQpe3Q9bi5yZWNvcmQ7YnJlYWt9bj1uLiRwYXJlbnR9aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBObyBkYXRhIG9yIHJlY29yZCBwcm92aWRlZCEiKTtpZih2b2lkIDA9PT10Lm1ldGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiZS1pbnB1dDogSW52YWxpZCByZWNvcmQgcGFyYW06IG5vIG1ldGEgcHJvcGVydHkhIik7aWYodm9pZCAwPT09dC5kYXRhKXRocm93IG5ldyBUeXBlRXJyb3IoImUtaW5wdXQ6IEludmFsaWQgcmVjb3JkIHBhcmFtOiBubyBkYXRhIHByb3BlcnR5ISIpO3JldHVybiB0fXZhciByPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgU3RyaW5nKXJldHVybiBuKHQpLm1ldGFbZV07aWYodm9pZCAwPT09ZS5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLXZhbHVlOiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gZX0odC5wcm9wcy5jb2x1bW4sdCksbz1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10LnByb3BzLmRhdGE/bih0KS5kYXRhW2VdOnQucHJvcHMuZGF0YVtlXX0oci5wcm9wZXJ0eSx0KTtyZXR1cm4gci5vcHRpb25zJiYobz1yLm9wdGlvbnNbb10pLGUoInNwYW4iLHtjbGFzczoiZVZhbCJ9LG8pfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMiksbz1uKDIxKSxhPW4ubihvKSxzPW4oMTgpLGk9bi5uKHMpO3QuZGVmYXVsdD17bmFtZToiZW1wbG95ZWVEZXRhaWwiLGNvbXBvbmVudHM6e2VSZWNvcmQ6YS5hLGVDb250cm9sOmkuYX0scHJvcHM6e2VtcGxveWVlSWQ6e3JlcXVpcmVkOiEwfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntlbXBsb3llZVJlY29yZDp2b2lkIDB9fSxjb21wdXRlZDp7YWxsb3dEZWxldGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbXBsb3llZVJlY29yZCYmIXRoaXMuZW1wbG95ZWVSZWNvcmQuZGF0YS5fbmV3UmVjb3JkfX0sY3JlYXRlZDpmdW5jdGlvbihlKXtyLmEuYXNzZXJ0TG9nZ2VkSW4odGhpcyksMD09PXRoaXMuZW1wbG95ZWVJZD90aGlzLmFkZE5ldygpOnRoaXMubG9hZERldGFpbHMoKX0sbWV0aG9kczp7YWRkTmV3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyLmEuZGVidWcoImNyZWF0ZSBlbXBsb3llZSByZWNvcmQiKSxyLmEuY3JlYXRlRW1wbG95ZWVSZWNvcmQodGhpcy5lbXBsb3llZUlkKS5kb25lKGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTG9hZERvbmUodCl9KS5mYWlsKGZ1bmN0aW9uKHQpe3JldHVybiBlLiRwYXJlbnQuaGFuZGxlRXJyb3IodCwiL2VtcGxveWVlTGlzdCIpfSl9LGxvYWREZXRhaWxzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyLmEuZGVidWcoImxvYWQgZW1wbG95ZWUgcmVjb3JkIiksci5hLnJlYWRFbXBsb3llZVJlY29yZCh0aGlzLmVtcGxveWVlSWQpLmRvbmUoZnVuY3Rpb24odCl7cmV0dXJuIGUub25Mb2FkRG9uZSh0KX0pLmZhaWwoZnVuY3Rpb24odCl7cmV0dXJuIGUuJHBhcmVudC5oYW5kbGVFcnJvcih0LCIvZW1wbG95ZWVMaXN0Iil9KX0sZG9TYXZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy4kcGFyZW50LmNsZWFyTWVzc2FnZXMoKSxyLmEuZGVidWcoImxvYWQgZW1wbG95ZWUgcmVjb3JkIiksci5hLnVwZGF0ZUVtcGxveWVlKHRoaXMuZW1wbG95ZWVSZWNvcmQuZGF0YSkuZG9uZShmdW5jdGlvbihlKXtyZXR1cm4gdC5vblVwZGF0ZURvbmUoZSl9KS5mYWlsKGZ1bmN0aW9uKGUpe3JldHVybiB0LiRwYXJlbnQuaGFuZGxlRXJyb3IoZSl9KX0sZG9EZWxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztjb25maXJtKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgZW1wbG95ZWU/IikmJih0aGlzLiRwYXJlbnQuY2xlYXJNZXNzYWdlcygpLHIuYS5kZWJ1ZygibG9hZCBlbXBsb3llZSByZWNvcmQiKSxyLmEuZGVsZXRlRW1wbG95ZWUodGhpcy5lbXBsb3llZUlkKS5kb25lKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uVXBkYXRlRG9uZShlKX0pLmZhaWwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuJHBhcmVudC5oYW5kbGVFcnJvcihlLCIvZW1wbG95ZWVMaXN0Iil9KSl9LGRvUmV0dXJuVG9MaXN0OmZ1bmN0aW9uKGUpe3RoaXMuJHJvdXRlci5wdXNoKCIvZW1wbG95ZWVMaXN0Iil9LG9uTG9hZERvbmU6ZnVuY3Rpb24oZSl7dGhpcy5lbXBsb3llZVJlY29yZD1lfSxvblVwZGF0ZURvbmU6ZnVuY3Rpb24oZSl7ci5hLmRlYnVnKCJlbXBsb3llZSByZWNvcmQgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQiKSx0aGlzLiRyb3V0ZXIucHVzaCgiL2VtcGxveWVlTGlzdCIpfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDExKSxvPW4ubihyKSxhPW4oMikscz1uKDIxKSxpPW4ubihzKSxsPW4oMTgpLHU9bi5uKGwpLGM9bigxOSksZD1uLm4oYykscD1uKDIwKSxtPW4ubihwKSxmPW4oMjIpLHY9bi5uKGYpO3QuZGVmYXVsdD17bmFtZToiZW1wbG95ZWVMaXN0Iixjb21wb25lbnRzOntlUmVjb3JkOmkuYSxlQ29udHJvbDp1LmEsZUlucHV0OmQuYSxlTGFiZWw6bS5hLGVWYWx1ZTp2LmF9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57ZmlsdGVyOnZvaWQgMCxzZWFyY2hEb25lOiExLGVtcGxveWVlTGlzdDp2b2lkIDB9fSxjb21wdXRlZDp7bWV0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtcGxveWVlTGlzdC5tZXRhfX0sY3JlYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7YS5hLmFzc2VydExvZ2dlZEluKHRoaXMpLHRoaXMuJHBhcmVudC5lbXBsb3llZUZpbHRlcj8odGhpcy5maWx0ZXI9dGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyLHRoaXMuZG9TZWFyY2goKSk6YS5hLmdldEVtcGxveWVlRmlsdGVyKCkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5pbml0U2VhcmNoKHQpfSl9LG1ldGhvZHM6e2luaXRTZWFyY2g6ZnVuY3Rpb24oZSl7dGhpcy5maWx0ZXI9ZSx0aGlzLnNlYXJjaERvbmU9ITEsdGhpcy5lbXBsb3llZUxpc3Q9dm9pZCAwfSxkb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczthLmEuZGVidWcoInJlc2V0dGluZyBzZWFyY2ggZmlsdGVyIiksYS5hLmdldEVtcGxveWVlRmlsdGVyKCkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5pbml0U2VhcmNoKHQpfSksdGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyPXZvaWQgMH0sZG9TZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2EuYS5kZWJ1ZygibG9hZCBlbXBsb3llZSBsaXN0IiksYS5hLmZpbmRFbXBsb3llZXModGhpcy5maWx0ZXIuZGF0YSkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5vblNlYXJjaENvbXBsZXRlKHQpfSl9LGRvQWRkTmV3OmZ1bmN0aW9uKCl7dGhpcy4kcm91dGVyLnB1c2goIi9lbXBsb3llZURldGFpbC8wIil9LG9uU2VhcmNoQ29tcGxldGU6ZnVuY3Rpb24oZSl7dGhpcy5lbXBsb3llZUxpc3Q9ZSx0aGlzLnNlYXJjaERvbmU9ITAsdGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyPXttZXRhOnRoaXMuZmlsdGVyLm1ldGEsZGF0YTpvKCkoe30sdGhpcy5maWx0ZXIuZGF0YSl9fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDIpO3QuZGVmYXVsdD17bmFtZToidXNlckxvZ2luIixkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3VzZXJuYW1lOiIiLHBhc3N3b3JkOiIifX0sbWV0aG9kczp7bG9naW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3IuYS5sb2dpbih0aGlzLnVzZXJuYW1lLHRoaXMucGFzc3dvcmQpLmRvbmUoZnVuY3Rpb24oKXtyZXR1cm4gZS4kcGFyZW50Lm9uTG9naW5Db21wbGV0ZSgpfSkuZmFpbChmdW5jdGlvbih0KXtyZXR1cm4gZS4kcGFyZW50LmhhbmRsZUVycm9yKHQpfSl9fX19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQpe30sZnVuY3Rpb24oZSx0KXt9LCwsLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzIpLG4oODEpLG51bGwsbnVsbCxudWxsKTtlLmV4cG9ydHM9ci5leHBvcnRzfSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtuKDcxKX12YXIgbz1uKDApKG4oMzMpLG4oODApLHIsImRhdGEtdi0wMDdjOGZjZSIsbnVsbCk7ZS5leHBvcnRzPW8uZXhwb3J0c30sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSl7big3Myl9dmFyIG89bigwKShuKDM0KSxuKDg1KSxyLCJkYXRhLXYtN2IzMjRjMGMiLG51bGwpO2UuZXhwb3J0cz1vLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImRpdiIse3N0YXRpY0NsYXNzOiJwYWdlLWNvbnRlbnQifSxbbigiaDEiLFtlLl92KCJFbXBsb3llZS1MaXN0IildKSxlLl92KCIgIiksbigiZS1yZWNvcmQiLHthdHRyczp7c3R5bGVDbGFzczoiZm9ybVBhbmVsIixyZWNvcmQ6ZS5maWx0ZXJ9fSxbbigidGFibGUiLHtzdGF0aWNDbGFzczoiaW5wdXRGb3JtIn0sW24oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoiZmlyc3ROYW1lIn19KSxlLl92KCIgIiksbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoibGFzdE5hbWUifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJkZXBhcnRtZW50SWQifX0pLGUuX3YoIiAiKSxuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJnZW5kZXIifX0pXSwxKSxlLl92KCIgIiksbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtuKCJ0ZCIpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJidXR0b25CYXIiLGF0dHJzOntjb2xzcGFuOiIzIn19LFtuKCJidXR0b24iLHthdHRyczp7ZGlzYWJsZWQ6IWUuc2VhcmNoRG9uZX0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRvUmVzZXQoKX19fSxbZS5fdigiU2VhcmNoIHJlc2V0IildKSxlLl92KCIgIiksbigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRvU2VhcmNoKCl9fX0sW2UuX3YoIlNlYXJjaCIpXSldKV0pXSldKSxlLl92KCIgIiksZS5zZWFyY2hEb25lP24oImRpdiIse3N0YXRpY0NsYXNzOiJzZWFyY2hSZXN1bHQifSxbbigiaDEiLFtlLl92KCJTZWFyY2ggZm91bmQgIitlLl9zKGUuZW1wbG95ZWVMaXN0LmRhdGEubGVuZ3RoKSsiIEVtcGxveWVlcyIpXSksZS5fdigiICIpLG4oInRhYmxlIix7c3RhdGljQ2xhc3M6ImVtcGxveWVlTGlzdCJ9LFtlLl9tKDApLGUuX3YoIiAiKSxuKCJ0aGVhZCIsW24oInRyIixbbigidGgiLFtlLl92KCJJRCIpXSksZS5fdigiICIpLG4oInRoIixbbigiZS1sYWJlbCIse2F0dHJzOntjb2x1bW46ZS5tZXRhLm5hbWV9fSldLDEpLGUuX3YoIiAiKSxuKCJ0aCIsW24oImUtbGFiZWwiLHthdHRyczp7Y29sdW1uOmUubWV0YS5kZXBhcnRtZW50fX0pXSwxKSxlLl92KCIgIiksbigidGgiLFtuKCJlLWxhYmVsIix7YXR0cnM6e2NvbHVtbjplLm1ldGEuZ2VuZGVyfX0pXSwxKSxlLl92KCIgIiksbigidGgiLFtuKCJlLWxhYmVsIix7YXR0cnM6e2NvbHVtbjplLm1ldGEuZGF0ZU9mQmlydGh9fSldLDEpLGUuX3YoIiAiKSxuKCJ0aCIsW2UuX3YoIlJldGlyZWQiKV0pXSldKSxlLl92KCIgIiksbigidGJvZHkiLFtlLl9sKGUuZW1wbG95ZWVMaXN0LmRhdGEsZnVuY3Rpb24odCxyKXtyZXR1cm5bbigidHIiLHtrZXk6cixjbGFzczpbciUyPT0wPyJyb3ctZXZlbiI6InJvdy1vZGQiXX0sW24oInRkIixbZS5fdihlLl9zKHQuZW1wbG95ZWVJZCkpXSksZS5fdigiICIpLG4oInRkIixbbigicm91dGVyLWxpbmsiLHtzdGF0aWNDbGFzczoiZUxpbmsiLGF0dHJzOnt0bzp7cGF0aDoiL2VtcGxveWVlRGV0YWlsLyIrdC5lbXBsb3llZUlkfX19LFtuKCJlLXZhbHVlIix7YXR0cnM6e2NvbHVtbjplLm1ldGEubmFtZSxkYXRhOnR9fSldLDEpXSwxKSxlLl92KCIgIiksbigidGQiLFtuKCJlLXZhbHVlIix7YXR0cnM6e2RhdGE6dCxjb2x1bW46ZS5tZXRhLmRlcGFydG1lbnR9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ZCIsW24oImUtdmFsdWUiLHthdHRyczp7ZGF0YTp0LGNvbHVtbjplLm1ldGEuZ2VuZGVyfX0pXSwxKSxlLl92KCIgIiksbigidGQiLFtuKCJlLXZhbHVlIix7YXR0cnM6e2RhdGE6dCxjb2x1bW46ZS5tZXRhLmRhdGVPZkJpcnRofX0pXSwxKSxlLl92KCIgIiksbigidGQiLFtuKCJlLXZhbHVlIix7YXR0cnM6e2RhdGE6dCxjb2x1bW46ZS5tZXRhLnJldGlyZWR9fSldLDEpXSldfSldLDIpXSldKTplLl9lKCksZS5fdigiICIpLG4oImRpdiIse3N0YXRpY0NsYXNzOiJidXR0b25CYXIifSxbbigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLiRwYXJlbnQuZG9Mb2dvdXQoKX19fSxbZS5fdigiTG9nb3V0IildKSxlLl92KCIgIiksbigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRvQWRkTmV3KCl9fX0sW2UuX3YoIkFkZCBuZXcgZW1wbG95ZWUiKV0pXSldLDEpfSxzdGF0aWNSZW5kZXJGbnM6W2Z1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKCJjb2xncm91cCIsW24oImNvbCIse3N0YXRpY0NsYXNzOiJjb2wtaWQifSksZS5fdigiICIpLG4oImNvbCIse3N0YXRpY0NsYXNzOiJjb2wtbmFtZSJ9KSxlLl92KCIgIiksbigiY29sIix7c3RhdGljQ2xhc3M6ImNvbC1kZXBhcnRtZW50In0pLGUuX3YoIiAiKSxuKCJjb2wiLHtzdGF0aWNDbGFzczoiY29sLWdlbmRlciJ9KSxlLl92KCIgIiksbigiY29sIix7c3RhdGljQ2xhc3M6ImNvbC1kYXRlT2ZCaXJ0aCJ9KSxlLl92KCIgIiksbigiY29sIix7c3RhdGljQ2xhc3M6ImNvbC1SZXRpcmVkIn0pXSl9XX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImRpdiIse3N0YXRpY0NsYXNzOiJwYWdlLWNvbnRlbnQifSxbbigiaDEiLFtlLl92KCJFbXBsb3llZS1EZXRhaWxzICgiK2UuX3MoZS5lbXBsb3llZUlkKSsiKSIpXSksZS5fdigiICIpLG4oImUtcmVjb3JkIix7YXR0cnM6e3N0eWxlQ2xhc3M6ImZvcm1QYW5lbCIscmVjb3JkOmUuZW1wbG95ZWVSZWNvcmR9fSxbbigidGFibGUiLHtzdGF0aWNDbGFzczoiaW5wdXRGb3JtIixzdGF0aWNTdHlsZTp7d2lkdGg6IjQwMHB4In19LFtuKCJjb2xncm91cCIsW24oImNvbCIse2F0dHJzOnt3aWR0aDoiMTIwcHgifX0pLGUuX3YoIiAiKSxuKCJjb2wiKV0pLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46InNhbHV0YXRpb24ifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJmaXJzdE5hbWUifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJsYXN0TmFtZSJ9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46ImRhdGVPZkJpcnRoIixmb3JtYXQ6Ilt5eXl5LU1NLWRkXSJ9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46ImRlcGFydG1lbnRJZCJ9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46ImdlbmRlciJ9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46InBob25lTnVtYmVyIn19KV0sMSksZS5fdigiICIpLG4oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoiZW1haWwifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJzYWxhcnkifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJyZXRpcmVkIn19KV0sMSldKV0pLGUuX3YoIiAiKSxuKCJkaXYiLHtzdGF0aWNDbGFzczoiYnV0dG9uQmFyIn0sW24oImJ1dHRvbiIse29uOntjbGljazpmdW5jdGlvbih0KXtyZXR1cm4gZS5kb1JldHVyblRvTGlzdCh0KX19fSxbZS5fdigiQmFjayIpXSksZS5fdigiICIpLGUuYWxsb3dEZWxldGU/bigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRvRGVsZXRlKHQpfX19LFtlLl92KCJEZWxldGUiKV0pOmUuX2UoKSxlLl92KCIgIiksbigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe3JldHVybiBlLmRvU2F2ZSh0KX19fSxbZS5fdigiU2F2ZSIpXSldKV0sMSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImRpdiIse2F0dHJzOntpZDoiYXBwIn19LFtuKCJkaXYiLHtzdGF0aWNDbGFzczoidGl0bGVEaXYifSxbbigic3BhbiIsW2UuX3YoIkVtcGxveWVlIE1hbmFnZW1lbnQgQXBwbGljYXRpb24iKV0pLGUuX3YoIiAiKSx0aGlzLmlzTG9nZ2VkSW4oKT9uKCJidXR0b24iLHtvbjp7Y2xpY2s6ZS5kb0xvZ291dH19LFtlLl92KCJMb2dvdXQiKV0pOmUuX2UoKV0pLGUuX3YoIiAiKSxlLm1lc3NhZ2VzP24oImRpdiIse2F0dHJzOntpZDoibWVzc2FnZXMifX0sW24oInVsIixbZS5fbChlLm1lc3NhZ2VzLGZ1bmN0aW9uKHQpe3JldHVybltuKCJsaSIsW2UuX3YoZS5fcyh0KSldKV19KV0sMildKTplLl9lKCksZS5fdigiICIpLG4oInJvdXRlci12aWV3IildLDEpfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKCJkaXYiLHtzdGF0aWNDbGFzczoiZUlucFdyYXAifSxbZS5tZXRhLnJlYWRPbmx5P1tuKCJlLXZhbHVlIix7YXR0cnM6e2NvbHVtbjplLm1ldGEsZGF0YTplLl9yZWNvcmREYXRhfX0pXToic2VsZWN0Ij09PWUubWV0YS5jb250cm9sVHlwZT9bbigic2VsZWN0Iix7Y2xhc3M6ZS5zdHlsZUNsYXNzKCJlU2VsZWN0IixlLm1ldGEpLGF0dHJzOntpZDoiQ1RMXyIrZS5tZXRhLm5hbWUsbmFtZTplLm1ldGEubmFtZSxkaXNhYmxlZDplLm1ldGEuZGlzYWJsZWR9LG9uOntjaGFuZ2U6ZnVuY3Rpb24odCl7ZS51cGRhdGVEYXRhKGUuaW5wdXRWYWx1ZSh0KSl9fX0sWyExIT09ZS5tZXRhLnJlcXVpcmVkJiYhZS5pc1ZhbHVlRXF1YWxUbyhudWxsKXx8dm9pZCAwIT09ZS5tZXRhLm9wdGlvbnNbIiJdP2UuX2UoKTpbbigib3B0aW9uIix7YXR0cnM6e3ZhbHVlOiIifSxkb21Qcm9wczp7c2VsZWN0ZWQ6ZS5pc1ZhbHVlRXF1YWxUbyhudWxsKX19KV0sZS5fdigiICIpLGUuX2woZS5tZXRhLm9wdGlvbnMsZnVuY3Rpb24odCxyKXtyZXR1cm5bbigib3B0aW9uIix7ZG9tUHJvcHM6e3ZhbHVlOnIsc2VsZWN0ZWQ6ZS5pc1ZhbHVlRXF1YWxUbyhyKX19LFtlLl92KGUuX3ModCkpXSldfSldLDIpXToiY2hlY2tib3giPT09ZS5tZXRhLmNvbnRyb2xUeXBlP1tuKCJpbnB1dCIse2NsYXNzOmUuc3R5bGVDbGFzcygiZUNoZWNrYm94IixlLm1ldGEpLGF0dHJzOntpZDoiQ1RMXyIrZS5tZXRhLm5hbWUsbmFtZTplLm1ldGEubmFtZSxsYW5nOiJlbiIsdHlwZToiY2hlY2tib3giLHJlYWRvbmx5OmUubWV0YS5kaXNhYmxlZH0sZG9tUHJvcHM6e2NoZWNrZWQ6ZS5kYXRhVmFsdWV9LG9uOntpbnB1dDpmdW5jdGlvbih0KXtlLnVwZGF0ZURhdGEoZS5jaGVja2JveFZhbHVlKHQpKX19fSldOltuKCJpbnB1dCIse2NsYXNzOmUuc3R5bGVDbGFzcygiZUlucFRleHQiLGUubWV0YSksYXR0cnM6e2lkOiJDVExfIitlLm1ldGEubmFtZSxuYW1lOmUubWV0YS5uYW1lLGxhbmc6ImVuIix0eXBlOiJ0ZXh0IixyZWFkb25seTplLm1ldGEuZGlzYWJsZWQsbWF4bGVuZ3RoOmUubWV0YS5tYXhMZW5ndGh9LGRvbVByb3BzOnt2YWx1ZTplLmRhdGFWYWx1ZX0sb246e2lucHV0OmZ1bmN0aW9uKHQpe2UudXBkYXRlRGF0YShlLmlucHV0VmFsdWUodCkpfX19KV1dLDIpfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBlLmZvcklucHV0P24oImxhYmVsIix7c3RhdGljQ2xhc3M6ImVMYWJlbCIsYXR0cnM6e2ZvcjoiQ1RMXyIrZS5tZXRhLm5hbWV9fSxbZS5fdihlLl9zKGUubWV0YS50aXRsZSkrIjoiKSxlLm1ldGEucmVxdWlyZWQ/bigic3BhbiIse3N0YXRpY0NsYXNzOiJyZXF1aXJlZCJ9LFtlLl92KCIqIildKTplLl9lKCldKTpuKCJzcGFuIix7c3RhdGljQ2xhc3M6ImVMYWJlbCJ9LFtlLl92KGUuX3MoZS5tZXRhLnRpdGxlKSldKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigiZGl2Iix7c3RhdGljQ2xhc3M6InBhZ2UtY29udGVudCJ9LFtuKCJmb3JtIix7YXR0cnM6e2lkOiJsb2dpbkZvcm0iLG5hbWU6ImxvZ2luRm9ybSIsZW5jdHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIn0sb246e3N1Ym1pdDpmdW5jdGlvbih0KXtyZXR1cm4gdC5wcmV2ZW50RGVmYXVsdCgpLGUubG9naW4uYXBwbHkobnVsbCxhcmd1bWVudHMpfX19LFtuKCJwIixbZS5fdigiSGludDogZW50ZXIgYW55IG5vbiBudWxsIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4iKV0pLGUuX3YoIiAiKSxuKCJkaXYiLHtzdGF0aWNDbGFzczoiZm9ybVBhbmVsIn0sW24oInRhYmxlIix7c3RhdGljQ2xhc3M6ImlucHV0Rm9ybSJ9LFtuKCJ0ciIse3N0YXRpY0NsYXNzOiJmb3JtQnV0dG9uUm93In0sW2UuX20oMCksZS5fdigiICIpLG4oInRkIix7c3RhdGljQ2xhc3M6ImVDdGxJbnB1dCJ9LFtuKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6ZS51c2VybmFtZSxleHByZXNzaW9uOiJ1c2VybmFtZSJ9XSxhdHRyczp7aWQ6ImlucHV0VXNlcm5hbWUiLG5hbWU6InVzZXJuYW1lIix0eXBlOiJ0ZXh0Iix0YWJpbmRleDoiMSJ9LGRvbVByb3BzOnt2YWx1ZTplLnVzZXJuYW1lfSxvbjp7aW5wdXQ6ZnVuY3Rpb24odCl7dC50YXJnZXQuY29tcG9zaW5nfHwoZS51c2VybmFtZT10LnRhcmdldC52YWx1ZSl9fX0pXSldKSxlLl92KCIgIiksbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtlLl9tKDEpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJlQ3RsSW5wdXQifSxbbigiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUucGFzc3dvcmQsZXhwcmVzc2lvbjoicGFzc3dvcmQifV0sYXR0cnM6e2lkOiJpbnB1dFBhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIscGxhY2Vob2xkZXI6IlBhc3N3b3JkIix0YWJpbmRleDoiMiJ9LGRvbVByb3BzOnt2YWx1ZTplLnBhc3N3b3JkfSxvbjp7aW5wdXQ6ZnVuY3Rpb24odCl7dC50YXJnZXQuY29tcG9zaW5nfHwoZS5wYXNzd29yZD10LnRhcmdldC52YWx1ZSl9fX0pXSldKSxlLl92KCIgIiksZS5fbSgyKV0pXSldKV0pfSxzdGF0aWNSZW5kZXJGbnM6W2Z1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKCJ0ZCIse3N0YXRpY0NsYXNzOiJlQ3RsTGFiZWwifSxbbigibGFiZWwiLHthdHRyczp7Zm9yOiJpbnB1dFVzZXJuYW1lIn19LFtlLl92KCJVc2VyIG5hbWUiKV0pLGUuX3YoIjoiKV0pfSxmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigidGQiLHtzdGF0aWNDbGFzczoiZUN0bExhYmVsIn0sW24oImxhYmVsIix7YXR0cnM6e2ZvcjoiaW5wdXRQYXNzd29yZCJ9fSxbZS5fdigiUGFzc3dvcmQiKV0pLGUuX3YoIjoiKV0pfSxmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtuKCJ0ZCIpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJidXR0b25CYXIiLGF0dHJzOntjb2xzcGFuOiIzIn19LFtuKCJidXR0b24iLHthdHRyczp7dHlwZToic3VibWl0In19LFtlLl92KCJMb2dpbiIpXSldKV0pfV19fV0sWzI1XSk7CisvLyMgc291cmNlTWFwcGluZ1VSTD1hcHAuNWE5OTg0NzA0NDhiMjU1ODg2MTUuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL2FwcC5iYzUwMWMxZThiNTE0YWI0YjJiZS5qcyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy9hcHAuYmM1MDFjMWU4YjUxNGFiNGIyYmUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwMjgzNjQuLjAwMDAwMDAKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL2FwcC5iYzUwMWMxZThiNTE0YWI0YjJiZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotd2VicGFja0pzb25wKFsxXSxbLCxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMzUpLG89bi5uKHIpLGE9bigxNykscz1uLm4oYSksaT17aW5pdGlhbGl6ZWQ6ITEsYmFzZVVSTDoiYXBpIixkZWZhdWx0T3B0aW9uczp7eGhyRmllbGRzOnt3aXRoQ3JlZGVudGlhbHM6ITB9LHN0YXR1c0NvZGU6ezQwMTpmdW5jdGlvbigpe2wubG9nZ2VkSW49ITF9LDQwNDpmdW5jdGlvbigpe2FsZXJ0KCJUaGUgcmVxdWVzdGVkIHNlcnZpY2UgaXMgbm90IGF2YWlsYWJsZSEiKX19LGVycm9yOmZ1bmN0aW9uKGUpe3ZhciB0PWUuc3RhdHVzVGV4dCsiICgiK2Uuc3RhdHVzKyIpIjtlLnJlc3BvbnNlVGV4dCYmKHQ9dCsiOiAiK2UucmVzcG9uc2VUZXh0KSxsLmRlYnVnKCJBamF4IGVycm9yOiAiK3QpfX0sc2V0dXA6ZnVuY3Rpb24oKXtzLmEuYWpheFNldHVwKGkuZGVmYXVsdE9wdGlvbnMpLGkuaW5pdGlhbGl6ZWQ9ITB9LGNhbGw6ZnVuY3Rpb24oZSl7cmV0dXJuITAhPT1pLmluaXRpYWxpemVkJiYobC5kZWJ1ZygiQUpBWCBub3QgaW5pdGlhbGl6ZWQuIEluaXRpYWxpbmcgbm93Li4uIiksaS5zZXR1cCgpKSxlLnVybD1pLmJhc2VVUkwrZS51cmwscy5hLmFqYXgoZSl9LGdldDpmdW5jdGlvbihlKXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJHRVQiLHVybDplfSl9LHBvc3Q6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJQT1NUIix1cmw6ZSxkYXRhOnR9KX0scG9zdEpTT046ZnVuY3Rpb24oZSx0KXtyZXR1cm4gaS5jYWxsKHt0eXBlOiJQT1NUIix1cmw6ZSxjb250ZW50VHlwZToiYXBwbGljYXRpb24vanNvbiIsZGF0YTpvKCkodCl9KX19O2kuc2V0dXAoKTt2YXIgbD17bG9nZ2VkSW46ITEsZGVidWc6ZnVuY3Rpb24oZSl7Y29uc29sZS5sb2coZSl9LGFzc2VydExvZ2dlZEluOmZ1bmN0aW9uKGUpe3RoaXMubG9nZ2VkSW58fGUuJHJvdXRlci5wdXNoKCIvbG9naW4iKX0sbG9naW46ZnVuY3Rpb24oZSx0KXt2YXIgbj17dXNlcm5hbWU6ZSxwYXNzd29yZDp0fTtyZXR1cm4gaS5wb3N0KCIvYXV0aC9sb2dpbiIsbil9LGxvZ291dDpmdW5jdGlvbigpe3JldHVybiBpLnBvc3QoIi9hdXRoL2xvZ291dCIpfSxnZXRFbXBsb3llZUZpbHRlcjpmdW5jdGlvbigpe3JldHVybiBpLmdldCgiL2VtcGxveWVlL2ZpbHRlciIpfSxmaW5kRW1wbG95ZWVzOmZ1bmN0aW9uKGUpe3JldHVybiBpLnBvc3RKU09OKCIvZW1wbG95ZWUvbGlzdCIsZSl9LGNyZWF0ZUVtcGxveWVlUmVjb3JkOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZ2V0KCIvZW1wbG95ZWUvYWRkIil9LHJlYWRFbXBsb3llZVJlY29yZDpmdW5jdGlvbihlKXtyZXR1cm4gaS5nZXQoIi9lbXBsb3llZS9nZXQvIitlKX0sdXBkYXRlRW1wbG95ZWU6ZnVuY3Rpb24oZSl7cmV0dXJuIGkucG9zdEpTT04oIi9lbXBsb3llZS91cGRhdGUiLGUpfSxkZWxldGVFbXBsb3llZTpmdW5jdGlvbihlKXtyZXR1cm4gaS5nZXQoIi9lbXBsb3llZS9kZWxldGUvIitlKX19O3QuYT1sfSwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigwKShuKDI3KSxudWxsLG51bGwsbnVsbCxudWxsKTtlLmV4cG9ydHM9ci5leHBvcnRzfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigwKShuKDI4KSxuKDgzKSxudWxsLG51bGwsbnVsbCk7ZS5leHBvcnRzPXIuZXhwb3J0c30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMCkobigyOSksbig4NCksbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzApLG51bGwsbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzEpLG51bGwsbnVsbCxudWxsLG51bGwpO2UuZXhwb3J0cz1yLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7dmFyIHI9bigzNiksbz1uLm4ociksYT1uKDM3KSxzPW4ubihhKSxpPW4oNiksbD1uKDg2KSx1PW4oNzkpLGM9bi5uKHUpLGQ9big3OCkscD1uLm4oZCksbT1uKDc3KSxmPW4ubihtKTtpLmEudXNlKGwuYSksdC5hPW5ldyBsLmEoe3JvdXRlczpbe3BhdGg6Ii9sb2dpbiIsY29tcG9uZW50OmMuYX0se3BhdGg6Ii9lbXBsb3llZUxpc3QiLGNvbXBvbmVudDpwLmF9LHtwYXRoOiIvZW1wbG95ZWVEZXRhaWwvOmVtcGxveWVlSWQiLGNvbXBvbmVudDpmLmEscHJvcHM6ZnVuY3Rpb24oZSl7dmFyIHQ9cygpKGUucGFyYW1zLmVtcGxveWVlSWQpO3JldHVybiBvKCkodCk/MDp7ZW1wbG95ZWVJZDp0fX19LHtwYXRoOiIqIixyZWRpcmVjdDoiL2xvZ2luIn1dfSl9LGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe24oNzIpfXZhciBvPW4oMCkobigyNiksbig4MikscixudWxsLG51bGwpO2UuZXhwb3J0cz1vLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oNiksbz1uKDI0KSxhPW4ubihvKSxzPW4oMjMpO3IuYS5jb25maWcucHJvZHVjdGlvblRpcD0hMSxuZXcgci5hKHtlbDoiI2FwcCIscm91dGVyOnMuYSx0ZW1wbGF0ZToiPEFwcC8+Iixjb21wb25lbnRzOntBcHA6YS5hfX0pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDYpLG89bigyKTt0LmRlZmF1bHQ9e25hbWU6ImFwcCIsZGF0YTpmdW5jdGlvbigpe3JldHVybntlbXBsb3llZUZpbHRlcjp2b2lkIDAsbWVzc2FnZXM6dm9pZCAwLHJlZGlyZWN0V2l0aEVycm9yOiExfX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuc3RhcnR1cCgpfSx3YXRjaDp7JHJvdXRlOmZ1bmN0aW9uKGUsdCl7dGhpcy5yZWRpcmVjdFdpdGhFcnJvcj90aGlzLnJlZGlyZWN0V2l0aEVycm9yPSExOnRoaXMuY2xlYXJNZXNzYWdlcygpfX0sbWV0aG9kczp7c3RhcnR1cDpmdW5jdGlvbigpe28uYS5kZWJ1ZygiQXBwbGljYXRpb24gc3RhcnR1cCEgVnVlIHZlcnNpb24gaXMgIityLmEudmVyc2lvbil9LGNsZWFyRGF0YTpmdW5jdGlvbigpe3RoaXMuZW1wbG95ZWVGaWx0ZXI9dm9pZCAwfSxjbGVhck1lc3NhZ2VzOmZ1bmN0aW9uKCl7dGhpcy5tZXNzYWdlcz12b2lkIDB9LGFkZE1lc3NhZ2VzOmZ1bmN0aW9uKGUpe3RoaXMubWVzc2FnZXM/dGhpcy5tZXNzYWdlcz10aGlzLm1lc3NhZ2VzLmNvbmNhdChlKTp0aGlzLm1lc3NhZ2VzPWV9LHJlZGlyZWN0OmZ1bmN0aW9uKGUpe3RoaXMuY2xlYXJNZXNzYWdlcygpLHRoaXMuJHJvdXRlci5wdXNoKGUpfSxoYW5kbGVFcnJvcjpmdW5jdGlvbihlLHQpe3QmJih0aGlzLnJlZGlyZWN0V2l0aEVycm9yPSEwLHRoaXMuJHJvdXRlci5wdXNoKHQpKSxlLnJlc3BvbnNlSlNPTj90aGlzLmFkZE1lc3NhZ2VzKGUucmVzcG9uc2VKU09OKTp0aGlzLmFkZE1lc3NhZ2VzKFtlLnN0YXR1c1RleHRdKX0saXNMb2dnZWRJbjpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT1vLmEubG9nZ2VkSW4mJihvLmEuZGVidWcoIkVNUEFQSS5sb2dnZWRJbiBpcyB1bmRlZmluZWQhIiksby5hLmxvZ2dlZEluPSEwKSxvLmEubG9nZ2VkSW59LGRvTG9nb3V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztjb25maXJtKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gbG9nb3V0PyIpJiZvLmEubG9nb3V0KCkuZG9uZShmdW5jdGlvbigpe3JldHVybiBlLm9uTG9nb3V0Q29tcGxldGUoKX0pfSxvbkxvZ2luQ29tcGxldGU6ZnVuY3Rpb24oKXtvLmEubG9nZ2VkSW49ITAsdGhpcy5jbGVhckRhdGEoKSx0aGlzLiRyb3V0ZXIucHVzaCgiL2VtcGxveWVlTGlzdCIpfSxvbkxvZ291dENvbXBsZXRlOmZ1bmN0aW9uKCl7by5hLmxvZ2dlZEluPSExLHRoaXMuY2xlYXJEYXRhKCksdGhpcy4kcm91dGVyLnB1c2goIi9sb2dpbiIpfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDExKSxvPW4ubihyKSxhPW4oMjApLHM9bi5uKGEpLGk9bigxOSksbD1uLm4oaSk7dC5kZWZhdWx0PXtmdW5jdGlvbmFsOiEwLG5hbWU6ImUtY29udHJvbCIscHJvcHM6e2NvbHVtbjp7cmVxdWlyZWQ6ITB9LHJlY29yZDp7dHlwZTpPYmplY3R9LGRhdGE6e3R5cGU6T2JqZWN0fX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuW2UoInRkIix7Y2xhc3M6ImVDdGxMYWJlbCJ9LFtlKHMuYSx7cHJvcHM6bygpKHtjb2x1bW46dC5wcm9wcy5jb2x1bW4sZm9ySW5wdXQ6ITB9KX0pXSksZSgidGQiLHtjbGFzczoiZUN0bElucHV0In0sW2UobC5hLHtwcm9wczp0LnByb3BzfSldKV19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSk7dmFyIHI9bigyKSxvPW4oMjIpLGE9bi5uKG8pLHM9bigxNyksaT1uLm4ocyk7dC5kZWZhdWx0PXtuYW1lOiJlLWlucHV0Iixjb21wb25lbnRzOntlVmFsdWU6YS5hfSxwcm9wczp7Y29sdW1uOntyZXF1aXJlZDohMH0scmVjb3JkOnt0eXBlOk9iamVjdH0sZGF0YTp7dHlwZTpPYmplY3R9fSxjb21wdXRlZDp7X3JlY29yZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucmVjb3JkO2lmKHZvaWQgMD09PWUpZm9yKHZhciB0PXRoaXMuJHBhcmVudDt0Oyl7aWYodC5yZWNvcmQpe2U9dC5yZWNvcmQ7YnJlYWt9dD10LiRwYXJlbnR9aWYodm9pZCAwPT09ZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBObyBkYXRhIG9yIHJlY29yZCBwcm92aWRlZCEiKTtpZih2b2lkIDA9PT1lLm1ldGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiZS1pbnB1dDogSW52YWxpZCByZWNvcmQgcGFyYW06IG5vIG1ldGEgcHJvcGVydHkhIik7aWYodm9pZCAwPT09ZS5kYXRhKXRocm93IG5ldyBUeXBlRXJyb3IoImUtaW5wdXQ6IEludmFsaWQgcmVjb3JkIHBhcmFtOiBubyBkYXRhIHByb3BlcnR5ISIpO3JldHVybiBlfSxfcmVjb3JkRGF0YTpmdW5jdGlvbigpe3JldHVybiB2b2lkIDA9PT10aGlzLmRhdGE/dGhpcy5fcmVjb3JkLmRhdGE6dGhpcy5kYXRhfSxtZXRhOmZ1bmN0aW9uKCl7aWYoInN0cmluZyI9PXR5cGVvZiB0aGlzLmNvbHVtbnx8dGhpcy5jb2x1bW4gaW5zdGFuY2VvZiBTdHJpbmcpcmV0dXJuIHRoaXMuX3JlY29yZC5tZXRhW3RoaXMuY29sdW1uXTtpZih2b2lkIDA9PT10aGlzLmNvbHVtbi5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gdGhpcy5jb2x1bW59LGRhdGFWYWx1ZTp7Z2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5tZXRhLnByb3BlcnR5O3JldHVybiB0aGlzLl9yZWNvcmREYXRhW2VdfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5tZXRhLnByb3BlcnR5O3RoaXMuX3JlY29yZERhdGFbdF09ZX19fSxtZXRob2RzOntpc1ZhbHVlRXF1YWxUbzpmdW5jdGlvbihlKXt2YXIgdD10aGlzLmRhdGFWYWx1ZTtyZXR1cm4iIj09PWUmJihlPW51bGwpLHQ9PT1lfSxzdHlsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49ImVJbnB1dCAiK2U7cmV0dXJuIG4rPSIgZVR5cGUiK3QuZGF0YVR5cGUsdC5kaXNhYmxlZCYmKG4rPSIgZUlucERpcyIpLHQucmVxdWlyZWQmJihuKz0iIGVJbnBSZXEiKSxufSxpbnB1dFZhbHVlOmZ1bmN0aW9uKGUpe3JldHVybiBpKCkoZS5jdXJyZW50VGFyZ2V0KS52YWwoKX0sY2hlY2tib3hWYWx1ZTpmdW5jdGlvbihlKXtyZXR1cm4gaSgpKGUuY3VycmVudFRhcmdldCkucHJvcCgiY2hlY2tlZCIpfSx1cGRhdGVEYXRhOmZ1bmN0aW9uKGUpe3RoaXMuZGF0YVZhbHVlPWUsci5hLmRlYnVnKCdWYWx1ZSBmb3I6ICInK3RoaXMubWV0YS5uYW1lKyciIGhhcyBiZWVuIHNldCB0bzogJytlKX19fX0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0IjtPYmplY3QuZGVmaW5lUHJvcGVydHkodCwiX19lc01vZHVsZSIse3ZhbHVlOiEwfSksdC5kZWZhdWx0PXtuYW1lOiJlLWxhYmVsIixwcm9wczp7Y29sdW1uOntyZXF1aXJlZDohMH0scmVjb3JkOnt0eXBlOk9iamVjdH0sZm9ySW5wdXQ6e3R5cGU6Qm9vbGVhbixkZWZhdWx0OiExfX0sY29tcHV0ZWQ6e21ldGE6ZnVuY3Rpb24oKXtpZigic3RyaW5nIj09dHlwZW9mIHRoaXMuY29sdW1ufHx0aGlzLmNvbHVtbiBpbnN0YW5jZW9mIFN0cmluZyl7dmFyIGU9dGhpcy5yZWNvcmQ7aWYodm9pZCAwPT09ZSlmb3IodmFyIHQ9dGhpcy4kcGFyZW50O3Q7KXtpZih0LnJlY29yZCl7ZT10LnJlY29yZDticmVha310PXQuJHBhcmVudH1pZih2b2lkIDA9PT1lKXRocm93IG5ldyBUeXBlRXJyb3IoImUtbGFiZWw6IE5vIGRhdGEgb3IgcmVjb3JkIHByb3ZpZGVkISIpO2lmKHZvaWQgMD09PWUubWV0YSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWxhYmVsOiBJbnZhbGlkIHJlY29yZCBwYXJhbTogbm8gbWV0YSBwcm9wZXJ0eSEiKTtyZXR1cm4gZS5tZXRhW3RoaXMuY29sdW1uXX1pZih2b2lkIDA9PT10aGlzLmNvbHVtbi5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWxhYmVsOiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gdGhpcy5jb2x1bW59fX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pLHQuZGVmYXVsdD17bmFtZToiZS1yZWNvcmQiLHByb3BzOntyZWNvcmQ6e3R5cGU6T2JqZWN0fSxzdHlsZUNsYXNzOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJlUmVjb3JkIn19LHJlbmRlcjpmdW5jdGlvbihlKXtpZih2b2lkIDAhPT10aGlzLnJlY29yZClyZXR1cm4gZSgiZGl2Iix7Y2xhc3M6dGhpcy5zdHlsZUNsYXNzfSx0aGlzLiRzbG90cy5kZWZhdWx0KX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KSx0LmRlZmF1bHQ9e2Z1bmN0aW9uYWw6ITAsbmFtZToiZS12YWx1ZSIscHJvcHM6e2NvbHVtbjp7cmVxdWlyZWQ6ITB9LHJlY29yZDp7dHlwZTpPYmplY3R9LGRhdGE6e3R5cGU6T2JqZWN0fX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gbihlKXt2YXIgdD1lLnByb3BzLnJlY29yZDtpZih2b2lkIDA9PT10KWZvcih2YXIgbj1lLnBhcmVudDtuOyl7aWYobi5yZWNvcmQpe3Q9bi5yZWNvcmQ7YnJlYWt9bj1uLiRwYXJlbnR9aWYodm9pZCAwPT09dCl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLWlucHV0OiBObyBkYXRhIG9yIHJlY29yZCBwcm92aWRlZCEiKTtpZih2b2lkIDA9PT10Lm1ldGEpdGhyb3cgbmV3IFR5cGVFcnJvcigiZS1pbnB1dDogSW52YWxpZCByZWNvcmQgcGFyYW06IG5vIG1ldGEgcHJvcGVydHkhIik7aWYodm9pZCAwPT09dC5kYXRhKXRocm93IG5ldyBUeXBlRXJyb3IoImUtaW5wdXQ6IEludmFsaWQgcmVjb3JkIHBhcmFtOiBubyBkYXRhIHByb3BlcnR5ISIpO3JldHVybiB0fXZhciByPWZ1bmN0aW9uKGUsdCl7aWYoInN0cmluZyI9PXR5cGVvZiBlfHxlIGluc3RhbmNlb2YgU3RyaW5nKXJldHVybiBuKHQpLm1ldGFbZV07aWYodm9pZCAwPT09ZS5kYXRhVHlwZSl0aHJvdyBuZXcgVHlwZUVycm9yKCJlLXZhbHVlOiBJbnZhbGlkIGNvbHVtbiBwYXJhbSEiKTtyZXR1cm4gZX0odC5wcm9wcy5jb2x1bW4sdCksbz1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10LnByb3BzLmRhdGE/bih0KS5kYXRhW2VdOnQucHJvcHMuZGF0YVtlXX0oci5wcm9wZXJ0eSx0KTtyZXR1cm4gci5vcHRpb25zJiYobz1yLm9wdGlvbnNbb10pLGUoInNwYW4iLHtjbGFzczoiZVZhbCJ9LG8pfX19LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsIl9fZXNNb2R1bGUiLHt2YWx1ZTohMH0pO3ZhciByPW4oMiksbz1uKDIxKSxhPW4ubihvKSxzPW4oMTgpLGk9bi5uKHMpO3QuZGVmYXVsdD17bmFtZToiZW1wbG95ZWVEZXRhaWwiLGNvbXBvbmVudHM6e2VSZWNvcmQ6YS5hLGVDb250cm9sOmkuYX0scHJvcHM6e2VtcGxveWVlSWQ6e3JlcXVpcmVkOiEwfX0sZGF0YTpmdW5jdGlvbigpe3JldHVybntlbXBsb3llZVJlY29yZDp2b2lkIDB9fSxjb21wdXRlZDp7YWxsb3dEZWxldGU6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lbXBsb3llZVJlY29yZCYmIXRoaXMuZW1wbG95ZWVSZWNvcmQuZGF0YS5fbmV3UmVjb3JkfX0sY3JlYXRlZDpmdW5jdGlvbihlKXtyLmEuYXNzZXJ0TG9nZ2VkSW4odGhpcyksMD09PXRoaXMuZW1wbG95ZWVJZD90aGlzLmFkZE5ldygpOnRoaXMubG9hZERldGFpbHMoKX0sbWV0aG9kczp7YWRkTmV3OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyLmEuZGVidWcoImNyZWF0ZSBlbXBsb3llZSByZWNvcmQiKSxyLmEuY3JlYXRlRW1wbG95ZWVSZWNvcmQodGhpcy5lbXBsb3llZUlkKS5kb25lKGZ1bmN0aW9uKHQpe3JldHVybiBlLm9uTG9hZERvbmUodCl9KS5mYWlsKGZ1bmN0aW9uKHQpe3JldHVybiBlLiRwYXJlbnQuaGFuZGxlRXJyb3IodCwiL2VtcGxveWVlTGlzdCIpfSl9LGxvYWREZXRhaWxzOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcztyLmEuZGVidWcoImxvYWQgZW1wbG95ZWUgcmVjb3JkIiksci5hLnJlYWRFbXBsb3llZVJlY29yZCh0aGlzLmVtcGxveWVlSWQpLmRvbmUoZnVuY3Rpb24odCl7cmV0dXJuIGUub25Mb2FkRG9uZSh0KX0pLmZhaWwoZnVuY3Rpb24odCl7cmV0dXJuIGUuJHBhcmVudC5oYW5kbGVFcnJvcih0LCIvZW1wbG95ZWVMaXN0Iil9KX0sZG9TYXZlOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXM7dGhpcy4kcGFyZW50LmNsZWFyTWVzc2FnZXMoKSxyLmEuZGVidWcoImxvYWQgZW1wbG95ZWUgcmVjb3JkIiksci5hLnVwZGF0ZUVtcGxveWVlKHRoaXMuZW1wbG95ZWVSZWNvcmQuZGF0YSkuZG9uZShmdW5jdGlvbihlKXtyZXR1cm4gdC5vblVwZGF0ZURvbmUoZSl9KS5mYWlsKGZ1bmN0aW9uKGUpe3JldHVybiB0LiRwYXJlbnQuaGFuZGxlRXJyb3IoZSl9KX0sZG9EZWxldGU6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcztjb25maXJtKCJEbyB5b3UgcmVhbGx5IHdhbnQgdG8gZGVsZXRlIHRoaXMgZW1wbG95ZWU/IikmJih0aGlzLiRwYXJlbnQuY2xlYXJNZXNzYWdlcygpLHIuYS5kZWJ1ZygibG9hZCBlbXBsb3llZSByZWNvcmQiKSxyLmEuZGVsZXRlRW1wbG95ZWUodGhpcy5lbXBsb3llZUlkKS5kb25lKGZ1bmN0aW9uKGUpe3JldHVybiB0Lm9uVXBkYXRlRG9uZShlKX0pLmZhaWwoZnVuY3Rpb24oZSl7cmV0dXJuIHQuJHBhcmVudC5oYW5kbGVFcnJvcihlLCIvZW1wbG95ZWVMaXN0Iil9KSl9LGRvUmV0dXJuVG9MaXN0OmZ1bmN0aW9uKGUpe3RoaXMuJHJvdXRlci5wdXNoKCIvZW1wbG95ZWVMaXN0Iil9LG9uTG9hZERvbmU6ZnVuY3Rpb24oZSl7dGhpcy5lbXBsb3llZVJlY29yZD1lfSxvblVwZGF0ZURvbmU6ZnVuY3Rpb24oZSl7ci5hLmRlYnVnKCJlbXBsb3llZSByZWNvcmQgc3VjY2Vzc2Z1bGx5IHVwZGF0ZWQiKSx0aGlzLiRyb3V0ZXIucHVzaCgiL2VtcGxveWVlTGlzdCIpfX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDExKSxvPW4ubihyKSxhPW4oMikscz1uKDIxKSxpPW4ubihzKSxsPW4oMTgpLHU9bi5uKGwpLGM9bigxOSksZD1uLm4oYykscD1uKDIwKSxtPW4ubihwKSxmPW4oMjIpLHY9bi5uKGYpO3QuZGVmYXVsdD17bmFtZToiZW1wbG95ZWVMaXN0Iixjb21wb25lbnRzOntlUmVjb3JkOmkuYSxlQ29udHJvbDp1LmEsZUlucHV0OmQuYSxlTGFiZWw6bS5hLGVWYWx1ZTp2LmF9LGRhdGE6ZnVuY3Rpb24oKXtyZXR1cm57ZmlsdGVyOnZvaWQgMCxzZWFyY2hEb25lOiExLGVtcGxveWVlTGlzdDp2b2lkIDB9fSxjb21wdXRlZDp7bWV0YTpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVtcGxveWVlTGlzdC5tZXRhfX0sY3JlYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXM7YS5hLmFzc2VydExvZ2dlZEluKHRoaXMpLHRoaXMuJHBhcmVudC5lbXBsb3llZUZpbHRlcj8odGhpcy5maWx0ZXI9dGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyLHRoaXMuZG9TZWFyY2goKSk6YS5hLmdldEVtcGxveWVlRmlsdGVyKCkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5pbml0U2VhcmNoKHQpfSl9LG1ldGhvZHM6e2luaXRTZWFyY2g6ZnVuY3Rpb24oZSl7dGhpcy5maWx0ZXI9ZSx0aGlzLnNlYXJjaERvbmU9ITEsdGhpcy5lbXBsb3llZUxpc3Q9dm9pZCAwfSxkb1Jlc2V0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpczthLmEuZGVidWcoInJlc2V0dGluZyBzZWFyY2ggZmlsdGVyIiksYS5hLmdldEVtcGxveWVlRmlsdGVyKCkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5pbml0U2VhcmNoKHQpfSksdGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyPXZvaWQgMH0sZG9TZWFyY2g6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2EuYS5kZWJ1ZygibG9hZCBlbXBsb3llZSBsaXN0IiksYS5hLmZpbmRFbXBsb3llZXModGhpcy5maWx0ZXIuZGF0YSkuZG9uZShmdW5jdGlvbih0KXtyZXR1cm4gZS5vblNlYXJjaENvbXBsZXRlKHQpfSl9LGRvQWRkTmV3OmZ1bmN0aW9uKCl7dGhpcy4kcm91dGVyLnB1c2goIi9lbXBsb3llZURldGFpbC8wIil9LG9uU2VhcmNoQ29tcGxldGU6ZnVuY3Rpb24oZSl7dGhpcy5lbXBsb3llZUxpc3Q9ZSx0aGlzLnNlYXJjaERvbmU9ITAsdGhpcy4kcGFyZW50LmVtcGxveWVlRmlsdGVyPXttZXRhOnRoaXMuZmlsdGVyLm1ldGEsZGF0YTpvKCkoe30sdGhpcy5maWx0ZXIuZGF0YSl9fX19fSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KTt2YXIgcj1uKDIpO3QuZGVmYXVsdD17bmFtZToidXNlckxvZ2luIixkYXRhOmZ1bmN0aW9uKCl7cmV0dXJue3VzZXJuYW1lOiIiLHBhc3N3b3JkOiIifX0sbWV0aG9kczp7bG9naW46ZnVuY3Rpb24oKXt2YXIgZT10aGlzO3IuYS5sb2dpbih0aGlzLnVzZXJuYW1lLHRoaXMucGFzc3dvcmQpLmRvbmUoZnVuY3Rpb24oKXtyZXR1cm4gZS4kcGFyZW50Lm9uTG9naW5Db21wbGV0ZSgpfSkuZmFpbChmdW5jdGlvbih0KXtyZXR1cm4gZS4kcGFyZW50LmhhbmRsZUVycm9yKHQpfSl9fX19LCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCl7fSxmdW5jdGlvbihlLHQpe30sZnVuY3Rpb24oZSx0KXt9LCwsLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDApKG4oMzIpLG4oODEpLG51bGwsbnVsbCxudWxsKTtlLmV4cG9ydHM9ci5leHBvcnRzfSxmdW5jdGlvbihlLHQsbil7ZnVuY3Rpb24gcihlKXtuKDcxKX12YXIgbz1uKDApKG4oMzMpLG4oODApLHIsImRhdGEtdi0wMDdjOGZjZSIsbnVsbCk7ZS5leHBvcnRzPW8uZXhwb3J0c30sZnVuY3Rpb24oZSx0LG4pe2Z1bmN0aW9uIHIoZSl7big3Myl9dmFyIG89bigwKShuKDM0KSxuKDg1KSxyLCJkYXRhLXYtN2IzMjRjMGMiLG51bGwpO2UuZXhwb3J0cz1vLmV4cG9ydHN9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImRpdiIse3N0YXRpY0NsYXNzOiJwYWdlLWNvbnRlbnQifSxbbigiaDEiLFtlLl92KCJFbXBsb3llZS1MaXN0IildKSxlLl92KCIgIiksbigiZS1yZWNvcmQiLHthdHRyczp7c3R5bGVDbGFzczoiZm9ybVBhbmVsIixyZWNvcmQ6ZS5maWx0ZXJ9fSxbbigidGFibGUiLHtzdGF0aWNDbGFzczoiaW5wdXRGb3JtIn0sW24oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoiZmlyc3ROYW1lIn19KSxlLl92KCIgIiksbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoibGFzdE5hbWUifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJkZXBhcnRtZW50SWQifX0pLGUuX3YoIiAiKSxuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJnZW5kZXIifX0pXSwxKSxlLl92KCIgIiksbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtuKCJ0ZCIpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJidXR0b25CYXIiLGF0dHJzOntjb2xzcGFuOiIzIn19LFtuKCJidXR0b24iLHthdHRyczp7ZGlzYWJsZWQ6IWUuc2VhcmNoRG9uZX0sb246e2NsaWNrOmZ1bmN0aW9uKHQpe2UuZG9SZXNldCgpfX19LFtlLl92KCJTZWFyY2ggcmVzZXQiKV0pLGUuX3YoIiAiKSxuKCJidXR0b24iLHtvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7ZS5kb1NlYXJjaCgpfX19LFtlLl92KCJTZWFyY2giKV0pXSldKV0pXSksZS5fdigiICIpLGUuc2VhcmNoRG9uZT9uKCJkaXYiLHtzdGF0aWNDbGFzczoic2VhcmNoUmVzdWx0In0sW24oImgxIixbZS5fdigiU2VhcmNoIGZvdW5kICIrZS5fcyhlLmVtcGxveWVlTGlzdC5kYXRhLmxlbmd0aCkrIiBFbXBsb3llZXMiKV0pLGUuX3YoIiAiKSxuKCJ0YWJsZSIse3N0YXRpY0NsYXNzOiJlbXBsb3llZUxpc3QifSxbZS5fbSgwKSxlLl92KCIgIiksbigidGhlYWQiLFtuKCJ0ciIsW24oInRoIixbZS5fdigiSUQiKV0pLGUuX3YoIiAiKSxuKCJ0aCIsW24oImUtbGFiZWwiLHthdHRyczp7Y29sdW1uOmUubWV0YS5uYW1lfX0pXSwxKSxlLl92KCIgIiksbigidGgiLFtuKCJlLWxhYmVsIix7YXR0cnM6e2NvbHVtbjplLm1ldGEuZGVwYXJ0bWVudH19KV0sMSksZS5fdigiICIpLG4oInRoIixbbigiZS1sYWJlbCIse2F0dHJzOntjb2x1bW46ZS5tZXRhLmdlbmRlcn19KV0sMSksZS5fdigiICIpLG4oInRoIixbbigiZS1sYWJlbCIse2F0dHJzOntjb2x1bW46ZS5tZXRhLmRhdGVPZkJpcnRofX0pXSwxKSxlLl92KCIgIiksbigidGgiLFtlLl92KCJSZXRpcmVkIildKV0pXSksZS5fdigiICIpLG4oInRib2R5IixbZS5fbChlLmVtcGxveWVlTGlzdC5kYXRhLGZ1bmN0aW9uKHQscil7cmV0dXJuW24oInRyIix7a2V5OnIsY2xhc3M6W3IlMj09MD8icm93LWV2ZW4iOiJyb3ctb2RkIl19LFtuKCJ0ZCIsW2UuX3YoZS5fcyh0LmVtcGxveWVlSWQpKV0pLGUuX3YoIiAiKSxuKCJ0ZCIsW24oInJvdXRlci1saW5rIix7c3RhdGljQ2xhc3M6ImVMaW5rIixhdHRyczp7dG86e3BhdGg6Ii9lbXBsb3llZURldGFpbC8iK3QuZW1wbG95ZWVJZH19fSxbbigiZS12YWx1ZSIse2F0dHJzOntjb2x1bW46ZS5tZXRhLm5hbWUsZGF0YTp0fX0pXSwxKV0sMSksZS5fdigiICIpLG4oInRkIixbbigiZS12YWx1ZSIse2F0dHJzOntkYXRhOnQsY29sdW1uOmUubWV0YS5kZXBhcnRtZW50fX0pXSwxKSxlLl92KCIgIiksbigidGQiLFtuKCJlLXZhbHVlIix7YXR0cnM6e2RhdGE6dCxjb2x1bW46ZS5tZXRhLmdlbmRlcn19KV0sMSksZS5fdigiICIpLG4oInRkIixbbigiZS12YWx1ZSIse2F0dHJzOntkYXRhOnQsY29sdW1uOmUubWV0YS5kYXRlT2ZCaXJ0aH19KV0sMSksZS5fdigiICIpLG4oInRkIixbbigiZS12YWx1ZSIse2F0dHJzOntkYXRhOnQsY29sdW1uOmUubWV0YS5yZXRpcmVkfX0pXSwxKV0pXX0pXSwyKV0pXSk6ZS5fZSgpLGUuX3YoIiAiKSxuKCJkaXYiLHtzdGF0aWNDbGFzczoiYnV0dG9uQmFyIn0sW24oImJ1dHRvbiIse29uOntjbGljazpmdW5jdGlvbih0KXtlLiRwYXJlbnQuZG9Mb2dvdXQoKX19fSxbZS5fdigiTG9nb3V0IildKSxlLl92KCIgIiksbigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe2UuZG9BZGROZXcoKX19fSxbZS5fdigiQWRkIG5ldyBlbXBsb3llZSIpXSldKV0sMSl9LHN0YXRpY1JlbmRlckZuczpbZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImNvbGdyb3VwIixbbigiY29sIix7c3RhdGljQ2xhc3M6ImNvbC1pZCJ9KSxlLl92KCIgIiksbigiY29sIix7c3RhdGljQ2xhc3M6ImNvbC1uYW1lIn0pLGUuX3YoIiAiKSxuKCJjb2wiLHtzdGF0aWNDbGFzczoiY29sLWRlcGFydG1lbnQifSksZS5fdigiICIpLG4oImNvbCIse3N0YXRpY0NsYXNzOiJjb2wtZ2VuZGVyIn0pLGUuX3YoIiAiKSxuKCJjb2wiLHtzdGF0aWNDbGFzczoiY29sLWRhdGVPZkJpcnRoIn0pLGUuX3YoIiAiKSxuKCJjb2wiLHtzdGF0aWNDbGFzczoiY29sLVJldGlyZWQifSldKX1dfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigiZGl2Iix7c3RhdGljQ2xhc3M6InBhZ2UtY29udGVudCJ9LFtuKCJoMSIsW2UuX3YoIkVtcGxveWVlLURldGFpbHMiKV0pLGUuX3YoIiAiKSxuKCJlLXJlY29yZCIse2F0dHJzOntzdHlsZUNsYXNzOiJmb3JtUGFuZWwiLHJlY29yZDplLmVtcGxveWVlUmVjb3JkfX0sW24oInRhYmxlIix7c3RhdGljQ2xhc3M6ImlucHV0Rm9ybSIsc3RhdGljU3R5bGU6e3dpZHRoOiI0MDBweCJ9fSxbbigiY29sZ3JvdXAiLFtuKCJjb2wiLHthdHRyczp7d2lkdGg6IjEyMHB4In19KSxlLl92KCIgIiksbigiY29sIildKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJzYWx1dGF0aW9uIn19KV0sMSksZS5fdigiICIpLG4oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoiZmlyc3ROYW1lIn19KV0sMSksZS5fdigiICIpLG4oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoibGFzdE5hbWUifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJkYXRlT2ZCaXJ0aCIsZm9ybWF0OiJbeXl5eS1NTS1kZF0ifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJkZXBhcnRtZW50SWQifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJnZW5kZXIifX0pXSwxKSxlLl92KCIgIiksbigidHIiLFtuKCJlLWNvbnRyb2wiLHthdHRyczp7Y29sdW1uOiJwaG9uZU51bWJlciJ9fSldLDEpLGUuX3YoIiAiKSxuKCJ0ciIsW24oImUtY29udHJvbCIse2F0dHJzOntjb2x1bW46ImVtYWlsIn19KV0sMSksZS5fdigiICIpLG4oInRyIixbbigiZS1jb250cm9sIix7YXR0cnM6e2NvbHVtbjoicmV0aXJlZCJ9fSldLDEpXSldKSxlLl92KCIgIiksbigiZGl2Iix7c3RhdGljQ2xhc3M6ImJ1dHRvbkJhciJ9LFtuKCJidXR0b24iLHtvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7ZS5kb1JldHVyblRvTGlzdCh0KX19fSxbZS5fdigiQmFjayIpXSksZS5fdigiICIpLGUuYWxsb3dEZWxldGU/bigiYnV0dG9uIix7b246e2NsaWNrOmZ1bmN0aW9uKHQpe2UuZG9EZWxldGUodCl9fX0sW2UuX3YoIkRlbGV0ZSIpXSk6ZS5fZSgpLGUuX3YoIiAiKSxuKCJidXR0b24iLHtvbjp7Y2xpY2s6ZnVuY3Rpb24odCl7ZS5kb1NhdmUodCl9fX0sW2UuX3YoIlNhdmUiKV0pXSldLDEpfSxzdGF0aWNSZW5kZXJGbnM6W119fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz17cmVuZGVyOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKCJkaXYiLHthdHRyczp7aWQ6ImFwcCJ9fSxbbigiZGl2Iix7c3RhdGljQ2xhc3M6InRpdGxlRGl2In0sW24oInNwYW4iLFtlLl92KCJFbXBsb3llZSBNYW5hZ2VtZW50IEFwcGxpY2F0aW9uIildKSxlLl92KCIgIiksdGhpcy5pc0xvZ2dlZEluKCk/bigiYnV0dG9uIix7b246e2NsaWNrOmUuZG9Mb2dvdXR9fSxbZS5fdigiTG9nb3V0IildKTplLl9lKCldKSxlLl92KCIgIiksZS5tZXNzYWdlcz9uKCJkaXYiLHthdHRyczp7aWQ6Im1lc3NhZ2VzIn19LFtuKCJ1bCIsW2UuX2woZS5tZXNzYWdlcyxmdW5jdGlvbih0KXtyZXR1cm5bbigibGkiLFtlLl92KGUuX3ModCkpXSldfSldLDIpXSk6ZS5fZSgpLGUuX3YoIiAiKSxuKCJyb3V0ZXItdmlldyIpXSwxKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigiZGl2Iix7c3RhdGljQ2xhc3M6ImVJbnBXcmFwIn0sW2UubWV0YS5yZWFkT25seT9bbigiZS12YWx1ZSIse2F0dHJzOntjb2x1bW46ZS5tZXRhLGRhdGE6ZS5fcmVjb3JkRGF0YX19KV06InNlbGVjdCI9PT1lLm1ldGEuY29udHJvbFR5cGU/W24oInNlbGVjdCIse2NsYXNzOmUuc3R5bGVDbGFzcygiZVNlbGVjdCIsZS5tZXRhKSxhdHRyczp7aWQ6IkNUTF8iK2UubWV0YS5uYW1lLG5hbWU6ZS5tZXRhLm5hbWUsZGlzYWJsZWQ6ZS5tZXRhLmRpc2FibGVkfSxvbjp7Y2hhbmdlOmZ1bmN0aW9uKHQpe2UudXBkYXRlRGF0YShlLmlucHV0VmFsdWUodCkpfX19LFshMSE9PWUubWV0YS5yZXF1aXJlZCYmIWUuaXNWYWx1ZUVxdWFsVG8obnVsbCl8fHZvaWQgMCE9PWUubWV0YS5vcHRpb25zWyIiXT9lLl9lKCk6W24oIm9wdGlvbiIse2F0dHJzOnt2YWx1ZToiIn0sZG9tUHJvcHM6e3NlbGVjdGVkOmUuaXNWYWx1ZUVxdWFsVG8obnVsbCl9fSldLGUuX3YoIiAiKSxlLl9sKGUubWV0YS5vcHRpb25zLGZ1bmN0aW9uKHQscil7cmV0dXJuW24oIm9wdGlvbiIse2RvbVByb3BzOnt2YWx1ZTpyLHNlbGVjdGVkOmUuaXNWYWx1ZUVxdWFsVG8ocil9fSxbZS5fdihlLl9zKHQpKV0pXX0pXSwyKV06ImNoZWNrYm94Ij09PWUubWV0YS5jb250cm9sVHlwZT9bbigiaW5wdXQiLHtjbGFzczplLnN0eWxlQ2xhc3MoImVDaGVja2JveCIsZS5tZXRhKSxhdHRyczp7aWQ6IkNUTF8iK2UubWV0YS5uYW1lLG5hbWU6ZS5tZXRhLm5hbWUsbGFuZzoiZW4iLHR5cGU6ImNoZWNrYm94IixyZWFkb25seTplLm1ldGEuZGlzYWJsZWR9LGRvbVByb3BzOntjaGVja2VkOmUuZGF0YVZhbHVlfSxvbjp7aW5wdXQ6ZnVuY3Rpb24odCl7ZS51cGRhdGVEYXRhKGUuY2hlY2tib3hWYWx1ZSh0KSl9fX0pXTpbbigiaW5wdXQiLHtjbGFzczplLnN0eWxlQ2xhc3MoImVJbnBUZXh0IixlLm1ldGEpLGF0dHJzOntpZDoiQ1RMXyIrZS5tZXRhLm5hbWUsbmFtZTplLm1ldGEubmFtZSxsYW5nOiJlbiIsdHlwZToidGV4dCIscmVhZG9ubHk6ZS5tZXRhLmRpc2FibGVkLG1heGxlbmd0aDplLm1ldGEubWF4TGVuZ3RofSxkb21Qcm9wczp7dmFsdWU6ZS5kYXRhVmFsdWV9LG9uOntpbnB1dDpmdW5jdGlvbih0KXtlLnVwZGF0ZURhdGEoZS5pbnB1dFZhbHVlKHQpKX19fSldXSwyKX0sc3RhdGljUmVuZGVyRm5zOltdfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9e3JlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gZS5mb3JJbnB1dD9uKCJsYWJlbCIse3N0YXRpY0NsYXNzOiJlTGFiZWwiLGF0dHJzOntmb3I6IkNUTF8iK2UubWV0YS5uYW1lfX0sW2UuX3YoZS5fcyhlLm1ldGEudGl0bGUpKyI6IiksZS5tZXRhLnJlcXVpcmVkP24oInNwYW4iLHtzdGF0aWNDbGFzczoicmVxdWlyZWQifSxbZS5fdigiKiIpXSk6ZS5fZSgpXSk6bigic3BhbiIse3N0YXRpY0NsYXNzOiJlTGFiZWwifSxbZS5fdihlLl9zKGUubWV0YS50aXRsZSkpXSl9LHN0YXRpY1JlbmRlckZuczpbXX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPXtyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9ZS4kY3JlYXRlRWxlbWVudCxuPWUuX3NlbGYuX2N8fHQ7cmV0dXJuIG4oImRpdiIse3N0YXRpY0NsYXNzOiJwYWdlLWNvbnRlbnQifSxbbigiZm9ybSIse2F0dHJzOntpZDoibG9naW5Gb3JtIixuYW1lOiJsb2dpbkZvcm0iLGVuY3R5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZCJ9LG9uOntzdWJtaXQ6ZnVuY3Rpb24odCl7cmV0dXJuIHQucHJldmVudERlZmF1bHQoKSxlLmxvZ2luKHQpfX19LFtuKCJwIixbZS5fdigiSGludDogZW50ZXIgYW55IG5vbiBudWxsIHVzZXJuYW1lIGFuZCBwYXNzd29yZC4iKV0pLGUuX3YoIiAiKSxuKCJkaXYiLHtzdGF0aWNDbGFzczoiZm9ybVBhbmVsIn0sW24oInRhYmxlIix7c3RhdGljQ2xhc3M6ImlucHV0Rm9ybSJ9LFtuKCJ0ciIse3N0YXRpY0NsYXNzOiJmb3JtQnV0dG9uUm93In0sW2UuX20oMCksZS5fdigiICIpLG4oInRkIix7c3RhdGljQ2xhc3M6ImVDdGxJbnB1dCJ9LFtuKCJpbnB1dCIse2RpcmVjdGl2ZXM6W3tuYW1lOiJtb2RlbCIscmF3TmFtZToidi1tb2RlbCIsdmFsdWU6ZS51c2VybmFtZSxleHByZXNzaW9uOiJ1c2VybmFtZSJ9XSxhdHRyczp7aWQ6ImlucHV0VXNlcm5hbWUiLG5hbWU6InVzZXJuYW1lIix0eXBlOiJ0ZXh0Iix0YWJpbmRleDoiMSJ9LGRvbVByb3BzOnt2YWx1ZTplLnVzZXJuYW1lfSxvbjp7aW5wdXQ6ZnVuY3Rpb24odCl7dC50YXJnZXQuY29tcG9zaW5nfHwoZS51c2VybmFtZT10LnRhcmdldC52YWx1ZSl9fX0pXSldKSxlLl92KCIgIiksbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtlLl9tKDEpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJlQ3RsSW5wdXQifSxbbigiaW5wdXQiLHtkaXJlY3RpdmVzOlt7bmFtZToibW9kZWwiLHJhd05hbWU6InYtbW9kZWwiLHZhbHVlOmUucGFzc3dvcmQsZXhwcmVzc2lvbjoicGFzc3dvcmQifV0sYXR0cnM6e2lkOiJpbnB1dFBhc3N3b3JkIix0eXBlOiJwYXNzd29yZCIscGxhY2Vob2xkZXI6IlBhc3N3b3JkIix0YWJpbmRleDoiMiJ9LGRvbVByb3BzOnt2YWx1ZTplLnBhc3N3b3JkfSxvbjp7aW5wdXQ6ZnVuY3Rpb24odCl7dC50YXJnZXQuY29tcG9zaW5nfHwoZS5wYXNzd29yZD10LnRhcmdldC52YWx1ZSl9fX0pXSldKSxlLl92KCIgIiksZS5fbSgyKV0pXSldKV0pfSxzdGF0aWNSZW5kZXJGbnM6W2Z1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJGNyZWF0ZUVsZW1lbnQsbj1lLl9zZWxmLl9jfHx0O3JldHVybiBuKCJ0ZCIse3N0YXRpY0NsYXNzOiJlQ3RsTGFiZWwifSxbbigibGFiZWwiLHthdHRyczp7Zm9yOiJpbnB1dFVzZXJuYW1lIn19LFtlLl92KCJVc2VyIG5hbWUiKV0pLGUuX3YoIjoiKV0pfSxmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigidGQiLHtzdGF0aWNDbGFzczoiZUN0bExhYmVsIn0sW24oImxhYmVsIix7YXR0cnM6e2ZvcjoiaW5wdXRQYXNzd29yZCJ9fSxbZS5fdigiUGFzc3dvcmQiKV0pLGUuX3YoIjoiKV0pfSxmdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRjcmVhdGVFbGVtZW50LG49ZS5fc2VsZi5fY3x8dDtyZXR1cm4gbigidHIiLHtzdGF0aWNDbGFzczoiZm9ybUJ1dHRvblJvdyJ9LFtuKCJ0ZCIpLGUuX3YoIiAiKSxuKCJ0ZCIse3N0YXRpY0NsYXNzOiJidXR0b25CYXIiLGF0dHJzOntjb2xzcGFuOiIzIn19LFtuKCJidXR0b24iLHthdHRyczp7dHlwZToic3VibWl0In19LFtlLl92KCJMb2dpbiIpXSldKV0pfV19fV0sWzI1XSk7Ci0vLyMgc291cmNlTWFwcGluZ1VSTD1hcHAuYmM1MDFjMWU4YjUxNGFiNGIyYmUuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL21hbmlmZXN0LmRlZGFkOTFlMjc3ODdkNjE1YThiLmpzIGIvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL21hbmlmZXN0LjBhY2NjMTdlYzM1OThmOTMyMjgzLmpzCnNpbWlsYXJpdHkgaW5kZXggODclCnJlbmFtZSBmcm9tIGVtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy9tYW5pZmVzdC5kZWRhZDkxZTI3Nzg3ZDYxNWE4Yi5qcwpyZW5hbWUgdG8gZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL21hbmlmZXN0LjBhY2NjMTdlYzM1OThmOTMyMjgzLmpzCmluZGV4IDRhY2JhNDcuLjE2NGNjMTggMTAwNjQ0Ci0tLSBhL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy9tYW5pZmVzdC5kZWRhZDkxZTI3Nzg3ZDYxNWE4Yi5qcworKysgYi9lbXBpcmUtZGItZXhhbXBsZXMvZW1waXJlLWRiLWV4YW1wbGUtdnVlL3NyYy9tYWluL3dlYmFwcC9zdGF0aWMvanMvbWFuaWZlc3QuMGFjY2MxN2VjMzU5OGY5MzIyODMuanMKQEAgLTEsMiArMSwyIEBACi0hZnVuY3Rpb24oZSl7ZnVuY3Rpb24gbihyKXtpZih0W3JdKXJldHVybiB0W3JdLmV4cG9ydHM7dmFyIG89dFtyXT17aTpyLGw6ITEsZXhwb3J0czp7fX07cmV0dXJuIGVbcl0uY2FsbChvLmV4cG9ydHMsbyxvLmV4cG9ydHMsbiksby5sPSEwLG8uZXhwb3J0c312YXIgcj13aW5kb3cud2VicGFja0pzb25wO3dpbmRvdy53ZWJwYWNrSnNvbnA9ZnVuY3Rpb24odCxjLGkpe2Zvcih2YXIgdSxhLGYscz0wLGw9W107czx0Lmxlbmd0aDtzKyspYT10W3NdLG9bYV0mJmwucHVzaChvW2FdWzBdKSxvW2FdPTA7Zm9yKHUgaW4gYylPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoYyx1KSYmKGVbdV09Y1t1XSk7Zm9yKHImJnIodCxjLGkpO2wubGVuZ3RoOylsLnNoaWZ0KCkoKTtpZihpKWZvcihzPTA7czxpLmxlbmd0aDtzKyspZj1uKG4ucz1pW3NdKTtyZXR1cm4gZn07dmFyIHQ9e30sbz17MjowfTtuLmU9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcigpe3Uub25lcnJvcj11Lm9ubG9hZD1udWxsLGNsZWFyVGltZW91dChhKTt2YXIgbj1vW2VdOzAhPT1uJiYobiYmblsxXShuZXcgRXJyb3IoIkxvYWRpbmcgY2h1bmsgIitlKyIgZmFpbGVkLiIpKSxvW2VdPXZvaWQgMCl9dmFyIHQ9b1tlXTtpZigwPT09dClyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7ZSgpfSk7aWYodClyZXR1cm4gdFsyXTt2YXIgYz1uZXcgUHJvbWlzZShmdW5jdGlvbihuLHIpe3Q9b1tlXT1bbixyXX0pO3RbMl09Yzt2YXIgaT1kb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdLHU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic2NyaXB0Iik7dS50eXBlPSJ0ZXh0L2phdmFzY3JpcHQiLHUuY2hhcnNldD0idXRmLTgiLHUuYXN5bmM9ITAsdS50aW1lb3V0PTEyZTQsbi5uYyYmdS5zZXRBdHRyaWJ1dGUoIm5vbmNlIixuLm5jKSx1LnNyYz1uLnArInN0YXRpYy9qcy8iK2UrIi4iK3swOiI3OTcwMzBjOTIxY2VkNzg2YmIwYSIsMToiYmM1MDFjMWU4YjUxNGFiNGIyYmUifVtlXSsiLmpzIjt2YXIgYT1zZXRUaW1lb3V0KHIsMTJlNCk7cmV0dXJuIHUub25lcnJvcj11Lm9ubG9hZD1yLGkuYXBwZW5kQ2hpbGQodSksY30sbi5tPWUsbi5jPXQsbi5pPWZ1bmN0aW9uKGUpe3JldHVybiBlfSxuLmQ9ZnVuY3Rpb24oZSxyLHQpe24ubyhlLHIpfHxPYmplY3QuZGVmaW5lUHJvcGVydHkoZSxyLHtjb25maWd1cmFibGU6ITEsZW51bWVyYWJsZTohMCxnZXQ6dH0pfSxuLm49ZnVuY3Rpb24oZSl7dmFyIHI9ZSYmZS5fX2VzTW9kdWxlP2Z1bmN0aW9uKCl7cmV0dXJuIGUuZGVmYXVsdH06ZnVuY3Rpb24oKXtyZXR1cm4gZX07cmV0dXJuIG4uZChyLCJhIixyKSxyfSxuLm89ZnVuY3Rpb24oZSxuKXtyZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGUsbil9LG4ucD0iIixuLm9lPWZ1bmN0aW9uKGUpe3Rocm93IGNvbnNvbGUuZXJyb3IoZSksZX19KFtdKTsKLS8vIyBzb3VyY2VNYXBwaW5nVVJMPW1hbmlmZXN0LmRlZGFkOTFlMjc3ODdkNjE1YThiLmpzLm1hcApcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyFmdW5jdGlvbihlKXtmdW5jdGlvbiBuKHIpe2lmKHRbcl0pcmV0dXJuIHRbcl0uZXhwb3J0czt2YXIgbz10W3JdPXtpOnIsbDohMSxleHBvcnRzOnt9fTtyZXR1cm4gZVtyXS5jYWxsKG8uZXhwb3J0cyxvLG8uZXhwb3J0cyxuKSxvLmw9ITAsby5leHBvcnRzfXZhciByPXdpbmRvdy53ZWJwYWNrSnNvbnA7d2luZG93LndlYnBhY2tKc29ucD1mdW5jdGlvbih0LGMsaSl7Zm9yKHZhciB1LGEsZixzPTAsbD1bXTtzPHQubGVuZ3RoO3MrKylhPXRbc10sb1thXSYmbC5wdXNoKG9bYV1bMF0pLG9bYV09MDtmb3IodSBpbiBjKU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChjLHUpJiYoZVt1XT1jW3VdKTtmb3IociYmcih0LGMsaSk7bC5sZW5ndGg7KWwuc2hpZnQoKSgpO2lmKGkpZm9yKHM9MDtzPGkubGVuZ3RoO3MrKylmPW4obi5zPWlbc10pO3JldHVybiBmfTt2YXIgdD17fSxvPXsyOjB9O24uZT1mdW5jdGlvbihlKXtmdW5jdGlvbiByKCl7dS5vbmVycm9yPXUub25sb2FkPW51bGwsY2xlYXJUaW1lb3V0KGEpO3ZhciBuPW9bZV07MCE9PW4mJihuJiZuWzFdKG5ldyBFcnJvcigiTG9hZGluZyBjaHVuayAiK2UrIiBmYWlsZWQuIikpLG9bZV09dm9pZCAwKX12YXIgdD1vW2VdO2lmKDA9PT10KXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtlKCl9KTtpZih0KXJldHVybiB0WzJdO3ZhciBjPW5ldyBQcm9taXNlKGZ1bmN0aW9uKG4scil7dD1vW2VdPVtuLHJdfSk7dFsyXT1jO3ZhciBpPWRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJoZWFkIilbMF0sdT1kb2N1bWVudC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTt1LnR5cGU9InRleHQvamF2YXNjcmlwdCIsdS5jaGFyc2V0PSJ1dGYtOCIsdS5hc3luYz0hMCx1LnRpbWVvdXQ9MTJlNCxuLm5jJiZ1LnNldEF0dHJpYnV0ZSgibm9uY2UiLG4ubmMpLHUuc3JjPW4ucCsic3RhdGljL2pzLyIrZSsiLiIrezA6IjM1YjBiMzQwZTBkYWI3ZjM0MGUyIiwxOiI1YTk5ODQ3MDQ0OGIyNTU4ODYxNSJ9W2VdKyIuanMiO3ZhciBhPXNldFRpbWVvdXQociwxMmU0KTtyZXR1cm4gdS5vbmVycm9yPXUub25sb2FkPXIsaS5hcHBlbmRDaGlsZCh1KSxjfSxuLm09ZSxuLmM9dCxuLmk9ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LG4uZD1mdW5jdGlvbihlLHIsdCl7bi5vKGUscil8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHIse2NvbmZpZ3VyYWJsZTohMSxlbnVtZXJhYmxlOiEwLGdldDp0fSl9LG4ubj1mdW5jdGlvbihlKXt2YXIgcj1lJiZlLl9fZXNNb2R1bGU/ZnVuY3Rpb24oKXtyZXR1cm4gZS5kZWZhdWx0fTpmdW5jdGlvbigpe3JldHVybiBlfTtyZXR1cm4gbi5kKHIsImEiLHIpLHJ9LG4ubz1mdW5jdGlvbihlLG4pe3JldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSxuKX0sbi5wPSIiLG4ub2U9ZnVuY3Rpb24oZSl7dGhyb3cgY29uc29sZS5lcnJvcihlKSxlfX0oW10pOworLy8jIHNvdXJjZU1hcHBpbmdVUkw9bWFuaWZlc3QuMGFjY2MxN2VjMzU5OGY5MzIyODMuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL3ZlbmRvci4zNWIwYjM0MGUwZGFiN2YzNDBlMi5qcyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy92ZW5kb3IuMzViMGIzNDBlMGRhYjdmMzQwZTIuanMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTgyMGVhZAotLS0gL2Rldi9udWxsCisrKyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy92ZW5kb3IuMzViMGIzNDBlMGRhYjdmMzQwZTIuanMKQEAgLTAsMCArMSwzMCBAQAord2VicGFja0pzb25wKFswXSxbZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4scixvKXt2YXIgaSxhPWU9ZXx8e30scz10eXBlb2YgZS5kZWZhdWx0OyJvYmplY3QiIT09cyYmImZ1bmN0aW9uIiE9PXN8fChpPWUsYT1lLmRlZmF1bHQpO3ZhciB1PSJmdW5jdGlvbiI9PXR5cGVvZiBhP2Eub3B0aW9uczphO3QmJih1LnJlbmRlcj10LnJlbmRlcix1LnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyksciYmKHUuX3Njb3BlSWQ9cik7dmFyIGM7aWYobz8oYz1mdW5jdGlvbihlKXtlPWV8fHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fHx0aGlzLnBhcmVudCYmdGhpcy5wYXJlbnQuJHZub2RlJiZ0aGlzLnBhcmVudC4kdm5vZGUuc3NyQ29udGV4dCxlfHwidW5kZWZpbmVkIj09dHlwZW9mIF9fVlVFX1NTUl9DT05URVhUX198fChlPV9fVlVFX1NTUl9DT05URVhUX18pLG4mJm4uY2FsbCh0aGlzLGUpLGUmJmUuX3JlZ2lzdGVyZWRDb21wb25lbnRzJiZlLl9yZWdpc3RlcmVkQ29tcG9uZW50cy5hZGQobyl9LHUuX3NzclJlZ2lzdGVyPWMpOm4mJihjPW4pLGMpe3ZhciBsPXUuZnVuY3Rpb25hbCxmPWw/dS5yZW5kZXI6dS5iZWZvcmVDcmVhdGU7bD91LnJlbmRlcj1mdW5jdGlvbihlLHQpe3JldHVybiBjLmNhbGwodCksZihlLHQpfTp1LmJlZm9yZUNyZWF0ZT1mP1tdLmNvbmNhdChmLGMpOltjXX1yZXR1cm57ZXNNb2R1bGU6aSxleHBvcnRzOmEsb3B0aW9uczp1fX19LGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5leHBvcnRzPXt2ZXJzaW9uOiIyLjYuMTIifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1uKX0sLGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9IW4oNSkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2KSxvPW4oMSksaT1uKDQ2KSxhPW4oNDkpLHM9bigxMiksdT1mdW5jdGlvbihlLHQsbil7dmFyIGMsbCxmLHA9ZSZ1LkYsZD1lJnUuRyxoPWUmdS5TLHY9ZSZ1LlAsbT1lJnUuQix5PWUmdS5XLGc9ZD9vOm9bdF18fChvW3RdPXt9KSxiPWcucHJvdG90eXBlLHg9ZD9yOmg/clt0XTooclt0XXx8e30pLnByb3RvdHlwZTtkJiYobj10KTtmb3IoYyBpbiBuKShsPSFwJiZ4JiZ2b2lkIDAhPT14W2NdKSYmcyhnLGMpfHwoZj1sP3hbY106bltjXSxnW2NdPWQmJiJmdW5jdGlvbiIhPXR5cGVvZiB4W2NdP25bY106bSYmbD9pKGYscik6eSYmeFtjXT09Zj9mdW5jdGlvbihlKXt2YXIgdD1mdW5jdGlvbih0LG4scil7aWYodGhpcyBpbnN0YW5jZW9mIGUpe3N3aXRjaChhcmd1bWVudHMubGVuZ3RoKXtjYXNlIDA6cmV0dXJuIG5ldyBlO2Nhc2UgMTpyZXR1cm4gbmV3IGUodCk7Y2FzZSAyOnJldHVybiBuZXcgZSh0LG4pfXJldHVybiBuZXcgZSh0LG4scil9cmV0dXJuIGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfTtyZXR1cm4gdC5wcm90b3R5cGU9ZS5wcm90b3R5cGUsdH0oZik6diYmImZ1bmN0aW9uIj09dHlwZW9mIGY/aShGdW5jdGlvbi5jYWxsLGYpOmYsdiYmKChnLnZpcnR1YWx8fChnLnZpcnR1YWw9e30pKVtjXT1mLGUmdS5SJiZiJiYhYltjXSYmYShiLGMsZikpKX07dS5GPTEsdS5HPTIsdS5TPTQsdS5QPTgsdS5CPTE2LHUuVz0zMix1LlU9NjQsdS5SPTEyOCxlLmV4cG9ydHM9dX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dHJ5e3JldHVybiEhZSgpfWNhdGNoKGUpe3JldHVybiEwfX19LGZ1bmN0aW9uKGUsdCl7dmFyIG49ZS5leHBvcnRzPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93JiZ3aW5kb3cuTWF0aD09TWF0aD93aW5kb3c6InVuZGVmaW5lZCIhPXR5cGVvZiBzZWxmJiZzZWxmLk1hdGg9PU1hdGg/c2VsZjpGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpOyJudW1iZXIiPT10eXBlb2YgX19nJiYoX19nPW4pfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiOyhmdW5jdGlvbihlLG4pe2Z1bmN0aW9uIHIoZSl7cmV0dXJuIHZvaWQgMD09PWV8fG51bGw9PT1lfWZ1bmN0aW9uIG8oZSl7cmV0dXJuIHZvaWQgMCE9PWUmJm51bGwhPT1lfWZ1bmN0aW9uIGkoZSl7cmV0dXJuITA9PT1lfWZ1bmN0aW9uIGEoZSl7cmV0dXJuITE9PT1lfWZ1bmN0aW9uIHMoZSl7cmV0dXJuInN0cmluZyI9PXR5cGVvZiBlfHwibnVtYmVyIj09dHlwZW9mIGV8fCJzeW1ib2wiPT10eXBlb2YgZXx8ImJvb2xlYW4iPT10eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3JldHVybiBudWxsIT09ZSYmIm9iamVjdCI9PXR5cGVvZiBlfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIltvYmplY3QgT2JqZWN0XSI9PT1raS5jYWxsKGUpfWZ1bmN0aW9uIGwoZSl7cmV0dXJuIltvYmplY3QgUmVnRXhwXSI9PT1raS5jYWxsKGUpfWZ1bmN0aW9uIGYoZSl7dmFyIHQ9cGFyc2VGbG9hdChTdHJpbmcoZSkpO3JldHVybiB0Pj0wJiZNYXRoLmZsb29yKHQpPT09dCYmaXNGaW5pdGUoZSl9ZnVuY3Rpb24gcChlKXtyZXR1cm4gbyhlKSYmImZ1bmN0aW9uIj09dHlwZW9mIGUudGhlbiYmImZ1bmN0aW9uIj09dHlwZW9mIGUuY2F0Y2h9ZnVuY3Rpb24gZChlKXtyZXR1cm4gbnVsbD09ZT8iIjpBcnJheS5pc0FycmF5KGUpfHxjKGUpJiZlLnRvU3RyaW5nPT09a2k/SlNPTi5zdHJpbmdpZnkoZSxudWxsLDIpOlN0cmluZyhlKX1mdW5jdGlvbiBoKGUpe3ZhciB0PXBhcnNlRmxvYXQoZSk7cmV0dXJuIGlzTmFOKHQpP2U6dH1mdW5jdGlvbiB2KGUsdCl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1lLnNwbGl0KCIsIiksbz0wO288ci5sZW5ndGg7bysrKW5bcltvXV09ITA7cmV0dXJuIHQ/ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZS50b0xvd2VyQ2FzZSgpXX06ZnVuY3Rpb24oZSl7cmV0dXJuIG5bZV19fWZ1bmN0aW9uIG0oZSx0KXtpZihlLmxlbmd0aCl7dmFyIG49ZS5pbmRleE9mKHQpO2lmKG4+LTEpcmV0dXJuIGUuc3BsaWNlKG4sMSl9fWZ1bmN0aW9uIHkoZSx0KXtyZXR1cm4gJGkuY2FsbChlLHQpfWZ1bmN0aW9uIGcoZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obil7cmV0dXJuIHRbbl18fCh0W25dPWUobikpfX1mdW5jdGlvbiBiKGUsdCl7ZnVuY3Rpb24gbihuKXt2YXIgcj1hcmd1bWVudHMubGVuZ3RoO3JldHVybiByP3I+MT9lLmFwcGx5KHQsYXJndW1lbnRzKTplLmNhbGwodCxuKTplLmNhbGwodCl9cmV0dXJuIG4uX2xlbmd0aD1lLmxlbmd0aCxufWZ1bmN0aW9uIHgoZSx0KXtyZXR1cm4gZS5iaW5kKHQpfWZ1bmN0aW9uIHcoZSx0KXt0PXR8fDA7Zm9yKHZhciBuPWUubGVuZ3RoLXQscj1uZXcgQXJyYXkobik7bi0tOylyW25dPWVbbit0XTtyZXR1cm4gcn1mdW5jdGlvbiBfKGUsdCl7Zm9yKHZhciBuIGluIHQpZVtuXT10W25dO3JldHVybiBlfWZ1bmN0aW9uIEMoZSl7Zm9yKHZhciB0PXt9LG49MDtuPGUubGVuZ3RoO24rKyllW25dJiZfKHQsZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gVChlLHQsbil7fWZ1bmN0aW9uIGsoZSx0KXtpZihlPT09dClyZXR1cm4hMDt2YXIgbj11KGUpLHI9dSh0KTtpZighbnx8IXIpcmV0dXJuIW4mJiFyJiZTdHJpbmcoZSk9PT1TdHJpbmcodCk7dHJ5e3ZhciBvPUFycmF5LmlzQXJyYXkoZSksaT1BcnJheS5pc0FycmF5KHQpO2lmKG8mJmkpcmV0dXJuIGUubGVuZ3RoPT09dC5sZW5ndGgmJmUuZXZlcnkoZnVuY3Rpb24oZSxuKXtyZXR1cm4gayhlLHRbbl0pfSk7aWYoZSBpbnN0YW5jZW9mIERhdGUmJnQgaW5zdGFuY2VvZiBEYXRlKXJldHVybiBlLmdldFRpbWUoKT09PXQuZ2V0VGltZSgpO2lmKG98fGkpcmV0dXJuITE7dmFyIGE9T2JqZWN0LmtleXMoZSkscz1PYmplY3Qua2V5cyh0KTtyZXR1cm4gYS5sZW5ndGg9PT1zLmxlbmd0aCYmYS5ldmVyeShmdW5jdGlvbihuKXtyZXR1cm4gayhlW25dLHRbbl0pfSl9Y2F0Y2goZSl7cmV0dXJuITF9fWZ1bmN0aW9uIEEoZSx0KXtmb3IodmFyIG49MDtuPGUubGVuZ3RoO24rKylpZihrKGVbbl0sdCkpcmV0dXJuIG47cmV0dXJuLTF9ZnVuY3Rpb24gUyhlKXt2YXIgdD0hMTtyZXR1cm4gZnVuY3Rpb24oKXt0fHwodD0hMCxlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9fWZ1bmN0aW9uICQoZSl7dmFyIHQ9KGUrIiIpLmNoYXJDb2RlQXQoMCk7cmV0dXJuIDM2PT09dHx8OTU9PT10fWZ1bmN0aW9uIEUoZSx0LG4scil7T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7dmFsdWU6bixlbnVtZXJhYmxlOiEhcix3cml0YWJsZTohMCxjb25maWd1cmFibGU6ITB9KX1mdW5jdGlvbiBPKGUpe2lmKCFCaS50ZXN0KGUpKXt2YXIgdD1lLnNwbGl0KCIuIik7cmV0dXJuIGZ1bmN0aW9uKGUpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bisrKXtpZighZSlyZXR1cm47ZT1lW3Rbbl1dfXJldHVybiBlfX19ZnVuY3Rpb24gaihlKXtyZXR1cm4iZnVuY3Rpb24iPT10eXBlb2YgZSYmL25hdGl2ZSBjb2RlLy50ZXN0KGUudG9TdHJpbmcoKSl9ZnVuY3Rpb24gTihlKXtsYS5wdXNoKGUpLGNhLnRhcmdldD1lfWZ1bmN0aW9uIEQoKXtsYS5wb3AoKSxjYS50YXJnZXQ9bGFbbGEubGVuZ3RoLTFdfWZ1bmN0aW9uIEwoZSl7cmV0dXJuIG5ldyBmYSh2b2lkIDAsdm9pZCAwLHZvaWQgMCxTdHJpbmcoZSkpfWZ1bmN0aW9uIFIoZSl7dmFyIHQ9bmV3IGZhKGUudGFnLGUuZGF0YSxlLmNoaWxkcmVuJiZlLmNoaWxkcmVuLnNsaWNlKCksZS50ZXh0LGUuZWxtLGUuY29udGV4dCxlLmNvbXBvbmVudE9wdGlvbnMsZS5hc3luY0ZhY3RvcnkpO3JldHVybiB0Lm5zPWUubnMsdC5pc1N0YXRpYz1lLmlzU3RhdGljLHQua2V5PWUua2V5LHQuaXNDb21tZW50PWUuaXNDb21tZW50LHQuZm5Db250ZXh0PWUuZm5Db250ZXh0LHQuZm5PcHRpb25zPWUuZm5PcHRpb25zLHQuZm5TY29wZUlkPWUuZm5TY29wZUlkLHQuYXN5bmNNZXRhPWUuYXN5bmNNZXRhLHQuaXNDbG9uZWQ9ITAsdH1mdW5jdGlvbiBNKGUpe3lhPWV9ZnVuY3Rpb24gSShlLHQpe2UuX19wcm90b19fPXR9ZnVuY3Rpb24gUChlLHQsbil7Zm9yKHZhciByPTAsbz1uLmxlbmd0aDtyPG87cisrKXt2YXIgaT1uW3JdO0UoZSxpLHRbaV0pfX1mdW5jdGlvbiBxKGUsdCl7aWYodShlKSYmIShlIGluc3RhbmNlb2YgZmEpKXt2YXIgbjtyZXR1cm4geShlLCJfX29iX18iKSYmZS5fX29iX18gaW5zdGFuY2VvZiBnYT9uPWUuX19vYl9fOnlhJiYhb2EoKSYmKEFycmF5LmlzQXJyYXkoZSl8fGMoZSkpJiZPYmplY3QuaXNFeHRlbnNpYmxlKGUpJiYhZS5faXNWdWUmJihuPW5ldyBnYShlKSksdCYmbiYmbi52bUNvdW50Kyssbn19ZnVuY3Rpb24gSChlLHQsbixyLG8pe3ZhciBpPW5ldyBjYSxhPU9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoZSx0KTtpZighYXx8ITEhPT1hLmNvbmZpZ3VyYWJsZSl7dmFyIHM9YSYmYS5nZXQsdT1hJiZhLnNldDtzJiYhdXx8MiE9PWFyZ3VtZW50cy5sZW5ndGh8fChuPWVbdF0pO3ZhciBjPSFvJiZxKG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciB0PXM/cy5jYWxsKGUpOm47cmV0dXJuIGNhLnRhcmdldCYmKGkuZGVwZW5kKCksYyYmKGMuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkodCkmJlUodCkpKSx0fSxzZXQ6ZnVuY3Rpb24odCl7dmFyIHI9cz9zLmNhbGwoZSk6bjt0PT09cnx8dCE9PXQmJnIhPT1yfHxzJiYhdXx8KHU/dS5jYWxsKGUsdCk6bj10LGM9IW8mJnEodCksaS5ub3RpZnkoKSl9fSl9fWZ1bmN0aW9uIEYoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkmJmYodCkpcmV0dXJuIGUubGVuZ3RoPU1hdGgubWF4KGUubGVuZ3RoLHQpLGUuc3BsaWNlKHQsMSxuKSxuO2lmKHQgaW4gZSYmISh0IGluIE9iamVjdC5wcm90b3R5cGUpKXJldHVybiBlW3RdPW4sbjt2YXIgcj1lLl9fb2JfXztyZXR1cm4gZS5faXNWdWV8fHImJnIudm1Db3VudD9uOnI/KEgoci52YWx1ZSx0LG4pLHIuZGVwLm5vdGlmeSgpLG4pOihlW3RdPW4sbil9ZnVuY3Rpb24gQihlLHQpe2lmKEFycmF5LmlzQXJyYXkoZSkmJmYodCkpcmV0dXJuIHZvaWQgZS5zcGxpY2UodCwxKTt2YXIgbj1lLl9fb2JfXztlLl9pc1Z1ZXx8biYmbi52bUNvdW50fHx5KGUsdCkmJihkZWxldGUgZVt0XSxuJiZuLmRlcC5ub3RpZnkoKSl9ZnVuY3Rpb24gVShlKXtmb3IodmFyIHQ9dm9pZCAwLG49MCxyPWUubGVuZ3RoO248cjtuKyspdD1lW25dLHQmJnQuX19vYl9fJiZ0Ll9fb2JfXy5kZXAuZGVwZW5kKCksQXJyYXkuaXNBcnJheSh0KSYmVSh0KX1mdW5jdGlvbiBXKGUsdCl7aWYoIXQpcmV0dXJuIGU7Zm9yKHZhciBuLHIsbyxpPWFhP1JlZmxlY3Qub3duS2V5cyh0KTpPYmplY3Qua2V5cyh0KSxhPTA7YTxpLmxlbmd0aDthKyspIl9fb2JfXyIhPT0obj1pW2FdKSYmKHI9ZVtuXSxvPXRbbl0seShlLG4pP3IhPT1vJiZjKHIpJiZjKG8pJiZXKHIsbyk6RihlLG4sbykpO3JldHVybiBlfWZ1bmN0aW9uIHooZSx0LG4pe3JldHVybiBuP2Z1bmN0aW9uKCl7dmFyIHI9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKG4sbik6dCxvPSJmdW5jdGlvbiI9PXR5cGVvZiBlP2UuY2FsbChuLG4pOmU7cmV0dXJuIHI/VyhyLG8pOm99OnQ/ZT9mdW5jdGlvbigpe3JldHVybiBXKCJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbCh0aGlzLHRoaXMpOnQsImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKHRoaXMsdGhpcyk6ZSl9OnQ6ZX1mdW5jdGlvbiBWKGUsdCl7dmFyIG49dD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZTtyZXR1cm4gbj9YKG4pOm59ZnVuY3Rpb24gWChlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKS0xPT09dC5pbmRleE9mKGVbbl0pJiZ0LnB1c2goZVtuXSk7cmV0dXJuIHR9ZnVuY3Rpb24gSihlLHQsbixyKXt2YXIgbz1PYmplY3QuY3JlYXRlKGV8fG51bGwpO3JldHVybiB0P18obyx0KTpvfWZ1bmN0aW9uIEsoZSx0KXt2YXIgbj1lLnByb3BzO2lmKG4pe3ZhciByLG8saSxhPXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHI9bi5sZW5ndGg7ci0tOykic3RyaW5nIj09dHlwZW9mKG89bltyXSkmJihpPU9pKG8pLGFbaV09e3R5cGU6bnVsbH0pO2Vsc2UgaWYoYyhuKSlmb3IodmFyIHMgaW4gbilvPW5bc10saT1PaShzKSxhW2ldPWMobyk/bzp7dHlwZTpvfTtlLnByb3BzPWF9fWZ1bmN0aW9uIEcoZSx0KXt2YXIgbj1lLmluamVjdDtpZihuKXt2YXIgcj1lLmluamVjdD17fTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgbz0wO288bi5sZW5ndGg7bysrKXJbbltvXV09e2Zyb206bltvXX07ZWxzZSBpZihjKG4pKWZvcih2YXIgaSBpbiBuKXt2YXIgYT1uW2ldO3JbaV09YyhhKT9fKHtmcm9tOml9LGEpOntmcm9tOmF9fX19ZnVuY3Rpb24gWShlKXt2YXIgdD1lLmRpcmVjdGl2ZXM7aWYodClmb3IodmFyIG4gaW4gdCl7dmFyIHI9dFtuXTsiZnVuY3Rpb24iPT10eXBlb2YgciYmKHRbbl09e2JpbmQ6cix1cGRhdGU6cn0pfX1mdW5jdGlvbiBRKGUsdCxuKXtmdW5jdGlvbiByKHIpe3ZhciBvPWJhW3JdfHx3YTtzW3JdPW8oZVtyXSx0W3JdLG4scil9aWYoImZ1bmN0aW9uIj09dHlwZW9mIHQmJih0PXQub3B0aW9ucyksSyh0LG4pLEcodCxuKSxZKHQpLCF0Ll9iYXNlJiYodC5leHRlbmRzJiYoZT1RKGUsdC5leHRlbmRzLG4pKSx0Lm1peGlucykpZm9yKHZhciBvPTAsaT10Lm1peGlucy5sZW5ndGg7bzxpO28rKyllPVEoZSx0Lm1peGluc1tvXSxuKTt2YXIgYSxzPXt9O2ZvcihhIGluIGUpcihhKTtmb3IoYSBpbiB0KXkoZSxhKXx8cihhKTtyZXR1cm4gc31mdW5jdGlvbiBaKGUsdCxuLHIpe2lmKCJzdHJpbmciPT10eXBlb2Ygbil7dmFyIG89ZVt0XTtpZih5KG8sbikpcmV0dXJuIG9bbl07dmFyIGk9T2kobik7aWYoeShvLGkpKXJldHVybiBvW2ldO3ZhciBhPWppKGkpO2lmKHkobyxhKSlyZXR1cm4gb1thXTtyZXR1cm4gb1tuXXx8b1tpXXx8b1thXX19ZnVuY3Rpb24gZWUoZSx0LG4scil7dmFyIG89dFtlXSxpPSF5KG4sZSksYT1uW2VdLHM9b2UoQm9vbGVhbixvLnR5cGUpO2lmKHM+LTEpaWYoaSYmIXkobywiZGVmYXVsdCIpKWE9ITE7ZWxzZSBpZigiIj09PWF8fGE9PT1EaShlKSl7dmFyIHU9b2UoU3RyaW5nLG8udHlwZSk7KHU8MHx8czx1KSYmKGE9ITApfWlmKHZvaWQgMD09PWEpe2E9dGUocixvLGUpO3ZhciBjPXlhO00oITApLHEoYSksTShjKX1yZXR1cm4gYX1mdW5jdGlvbiB0ZShlLHQsbil7aWYoeSh0LCJkZWZhdWx0Iikpe3ZhciByPXQuZGVmYXVsdDtyZXR1cm4gZSYmZS4kb3B0aW9ucy5wcm9wc0RhdGEmJnZvaWQgMD09PWUuJG9wdGlvbnMucHJvcHNEYXRhW25dJiZ2b2lkIDAhPT1lLl9wcm9wc1tuXT9lLl9wcm9wc1tuXToiZnVuY3Rpb24iPT10eXBlb2YgciYmIkZ1bmN0aW9uIiE9PW5lKHQudHlwZSk/ci5jYWxsKGUpOnJ9fWZ1bmN0aW9uIG5lKGUpe3ZhciB0PWUmJmUudG9TdHJpbmcoKS5tYXRjaChfYSk7cmV0dXJuIHQ/dFsxXToiIn1mdW5jdGlvbiByZShlLHQpe3JldHVybiBuZShlKT09PW5lKHQpfWZ1bmN0aW9uIG9lKGUsdCl7aWYoIUFycmF5LmlzQXJyYXkodCkpcmV0dXJuIHJlKHQsZSk/MDotMTtmb3IodmFyIG49MCxyPXQubGVuZ3RoO248cjtuKyspaWYocmUodFtuXSxlKSlyZXR1cm4gbjtyZXR1cm4tMX1mdW5jdGlvbiBpZShlLHQsbil7TigpO3RyeXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIG89ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKG8pZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspdHJ5e3ZhciBhPSExPT09b1tpXS5jYWxsKHIsZSx0LG4pO2lmKGEpcmV0dXJufWNhdGNoKGUpe3NlKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fXNlKGUsdCxuKX1maW5hbGx5e0QoKX19ZnVuY3Rpb24gYWUoZSx0LG4scixvKXt2YXIgaTt0cnl7aT1uP2UuYXBwbHkodCxuKTplLmNhbGwodCksaSYmIWkuX2lzVnVlJiZwKGkpJiYhaS5faGFuZGxlZCYmKGkuY2F0Y2goZnVuY3Rpb24oZSl7cmV0dXJuIGllKGUscixvKyIgKFByb21pc2UvYXN5bmMpIil9KSxpLl9oYW5kbGVkPSEwKX1jYXRjaChlKXtpZShlLHIsbyl9cmV0dXJuIGl9ZnVuY3Rpb24gc2UoZSx0LG4pe2lmKEhpLmVycm9ySGFuZGxlcil0cnl7cmV0dXJuIEhpLmVycm9ySGFuZGxlci5jYWxsKG51bGwsZSx0LG4pfWNhdGNoKHQpe3QhPT1lJiZ1ZSh0LG51bGwsImNvbmZpZy5lcnJvckhhbmRsZXIiKX11ZShlLHQsbil9ZnVuY3Rpb24gdWUoZSx0LG4pe2lmKCFXaSYmIXppfHwidW5kZWZpbmVkIj09dHlwZW9mIGNvbnNvbGUpdGhyb3cgZTtjb25zb2xlLmVycm9yKGUpfWZ1bmN0aW9uIGNlKCl7a2E9ITE7dmFyIGU9VGEuc2xpY2UoMCk7VGEubGVuZ3RoPTA7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XSgpfWZ1bmN0aW9uIGxlKGUsdCl7dmFyIG47aWYoVGEucHVzaChmdW5jdGlvbigpe2lmKGUpdHJ5e2UuY2FsbCh0KX1jYXRjaChlKXtpZShlLHQsIm5leHRUaWNrIil9ZWxzZSBuJiZuKHQpfSksa2F8fChrYT0hMCx4YSgpKSwhZSYmInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlKXJldHVybiBuZXcgUHJvbWlzZShmdW5jdGlvbihlKXtuPWV9KX1mdW5jdGlvbiBmZShlKXtwZShlLE9hKSxPYS5jbGVhcigpfWZ1bmN0aW9uIHBlKGUsdCl7dmFyIG4scixvPUFycmF5LmlzQXJyYXkoZSk7aWYoISghbyYmIXUoZSl8fE9iamVjdC5pc0Zyb3plbihlKXx8ZSBpbnN0YW5jZW9mIGZhKSl7aWYoZS5fX29iX18pe3ZhciBpPWUuX19vYl9fLmRlcC5pZDtpZih0LmhhcyhpKSlyZXR1cm47dC5hZGQoaSl9aWYobylmb3Iobj1lLmxlbmd0aDtuLS07KXBlKGVbbl0sdCk7ZWxzZSBmb3Iocj1PYmplY3Qua2V5cyhlKSxuPXIubGVuZ3RoO24tLTspcGUoZVtyW25dXSx0KX19ZnVuY3Rpb24gZGUoZSx0KXtmdW5jdGlvbiBuKCl7dmFyIGU9YXJndW1lbnRzLHI9bi5mbnM7aWYoIUFycmF5LmlzQXJyYXkocikpcmV0dXJuIGFlKHIsbnVsbCxhcmd1bWVudHMsdCwidi1vbiBoYW5kbGVyIik7Zm9yKHZhciBvPXIuc2xpY2UoKSxpPTA7aTxvLmxlbmd0aDtpKyspYWUob1tpXSxudWxsLGUsdCwidi1vbiBoYW5kbGVyIil9cmV0dXJuIG4uZm5zPWUsbn1mdW5jdGlvbiBoZShlLHQsbixvLGEscyl7dmFyIHUsYyxsLGY7Zm9yKHUgaW4gZSljPWVbdV0sbD10W3VdLGY9amEodSkscihjKXx8KHIobCk/KHIoYy5mbnMpJiYoYz1lW3VdPWRlKGMscykpLGkoZi5vbmNlKSYmKGM9ZVt1XT1hKGYubmFtZSxjLGYuY2FwdHVyZSkpLG4oZi5uYW1lLGMsZi5jYXB0dXJlLGYucGFzc2l2ZSxmLnBhcmFtcykpOmMhPT1sJiYobC5mbnM9YyxlW3VdPWwpKTtmb3IodSBpbiB0KXIoZVt1XSkmJihmPWphKHUpLG8oZi5uYW1lLHRbdV0sZi5jYXB0dXJlKSl9ZnVuY3Rpb24gdmUoZSx0LG4pe2Z1bmN0aW9uIGEoKXtuLmFwcGx5KHRoaXMsYXJndW1lbnRzKSxtKHMuZm5zLGEpfWUgaW5zdGFuY2VvZiBmYSYmKGU9ZS5kYXRhLmhvb2t8fChlLmRhdGEuaG9vaz17fSkpO3ZhciBzLHU9ZVt0XTtyKHUpP3M9ZGUoW2FdKTpvKHUuZm5zKSYmaSh1Lm1lcmdlZCk/KHM9dSxzLmZucy5wdXNoKGEpKTpzPWRlKFt1LGFdKSxzLm1lcmdlZD0hMCxlW3RdPXN9ZnVuY3Rpb24gbWUoZSx0LG4pe3ZhciBpPXQub3B0aW9ucy5wcm9wcztpZighcihpKSl7dmFyIGE9e30scz1lLmF0dHJzLHU9ZS5wcm9wcztpZihvKHMpfHxvKHUpKWZvcih2YXIgYyBpbiBpKXt2YXIgbD1EaShjKTt5ZShhLHUsYyxsLCEwKXx8eWUoYSxzLGMsbCwhMSl9cmV0dXJuIGF9fWZ1bmN0aW9uIHllKGUsdCxuLHIsaSl7aWYobyh0KSl7aWYoeSh0LG4pKXJldHVybiBlW25dPXRbbl0saXx8ZGVsZXRlIHRbbl0sITA7aWYoeSh0LHIpKXJldHVybiBlW25dPXRbcl0saXx8ZGVsZXRlIHRbcl0sITB9cmV0dXJuITF9ZnVuY3Rpb24gZ2UoZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspaWYoQXJyYXkuaXNBcnJheShlW3RdKSlyZXR1cm4gQXJyYXkucHJvdG90eXBlLmNvbmNhdC5hcHBseShbXSxlKTtyZXR1cm4gZX1mdW5jdGlvbiBiZShlKXtyZXR1cm4gcyhlKT9bTChlKV06QXJyYXkuaXNBcnJheShlKT93ZShlKTp2b2lkIDB9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIG8oZSkmJm8oZS50ZXh0KSYmYShlLmlzQ29tbWVudCl9ZnVuY3Rpb24gd2UoZSx0KXt2YXIgbixhLHUsYyxsPVtdO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspYT1lW25dLHIoYSl8fCJib29sZWFuIj09dHlwZW9mIGF8fCh1PWwubGVuZ3RoLTEsYz1sW3VdLEFycmF5LmlzQXJyYXkoYSk/YS5sZW5ndGg+MCYmKGE9d2UoYSwodHx8IiIpKyJfIituKSx4ZShhWzBdKSYmeGUoYykmJihsW3VdPUwoYy50ZXh0K2FbMF0udGV4dCksYS5zaGlmdCgpKSxsLnB1c2guYXBwbHkobCxhKSk6cyhhKT94ZShjKT9sW3VdPUwoYy50ZXh0K2EpOiIiIT09YSYmbC5wdXNoKEwoYSkpOnhlKGEpJiZ4ZShjKT9sW3VdPUwoYy50ZXh0K2EudGV4dCk6KGkoZS5faXNWTGlzdCkmJm8oYS50YWcpJiZyKGEua2V5KSYmbyh0KSYmKGEua2V5PSJfX3ZsaXN0Iit0KyJfIituKyJfXyIpLGwucHVzaChhKSkpO3JldHVybiBsfWZ1bmN0aW9uIF9lKGUpe3ZhciB0PWUuJG9wdGlvbnMucHJvdmlkZTt0JiYoZS5fcHJvdmlkZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKGUpOnQpfWZ1bmN0aW9uIENlKGUpe3ZhciB0PVRlKGUuJG9wdGlvbnMuaW5qZWN0LGUpO3QmJihNKCExKSxPYmplY3Qua2V5cyh0KS5mb3JFYWNoKGZ1bmN0aW9uKG4pe0goZSxuLHRbbl0pfSksTSghMCkpfWZ1bmN0aW9uIFRlKGUsdCl7aWYoZSl7Zm9yKHZhciBuPU9iamVjdC5jcmVhdGUobnVsbCkscj1hYT9SZWZsZWN0Lm93bktleXMoZSk6T2JqZWN0LmtleXMoZSksbz0wO288ci5sZW5ndGg7bysrKXt2YXIgaT1yW29dO2lmKCJfX29iX18iIT09aSl7Zm9yKHZhciBhPWVbaV0uZnJvbSxzPXQ7czspe2lmKHMuX3Byb3ZpZGVkJiZ5KHMuX3Byb3ZpZGVkLGEpKXtuW2ldPXMuX3Byb3ZpZGVkW2FdO2JyZWFrfXM9cy4kcGFyZW50fWlmKCFzJiYiZGVmYXVsdCJpbiBlW2ldKXt2YXIgdT1lW2ldLmRlZmF1bHQ7bltpXT0iZnVuY3Rpb24iPT10eXBlb2YgdT91LmNhbGwodCk6dX19fXJldHVybiBufX1mdW5jdGlvbiBrZShlLHQpe2lmKCFlfHwhZS5sZW5ndGgpcmV0dXJue307Zm9yKHZhciBuPXt9LHI9MCxvPWUubGVuZ3RoO3I8bztyKyspe3ZhciBpPWVbcl0sYT1pLmRhdGE7aWYoYSYmYS5hdHRycyYmYS5hdHRycy5zbG90JiZkZWxldGUgYS5hdHRycy5zbG90LGkuY29udGV4dCE9PXQmJmkuZm5Db250ZXh0IT09dHx8IWF8fG51bGw9PWEuc2xvdCkobi5kZWZhdWx0fHwobi5kZWZhdWx0PVtdKSkucHVzaChpKTtlbHNle3ZhciBzPWEuc2xvdCx1PW5bc118fChuW3NdPVtdKTsidGVtcGxhdGUiPT09aS50YWc/dS5wdXNoLmFwcGx5KHUsaS5jaGlsZHJlbnx8W10pOnUucHVzaChpKX19Zm9yKHZhciBjIGluIG4pbltjXS5ldmVyeShBZSkmJmRlbGV0ZSBuW2NdO3JldHVybiBufWZ1bmN0aW9uIEFlKGUpe3JldHVybiBlLmlzQ29tbWVudCYmIWUuYXN5bmNGYWN0b3J5fHwiICI9PT1lLnRleHR9ZnVuY3Rpb24gU2UoZSl7cmV0dXJuIGUuaXNDb21tZW50JiZlLmFzeW5jRmFjdG9yeX1mdW5jdGlvbiAkZShlLHQsbil7dmFyIHIsbz1PYmplY3Qua2V5cyh0KS5sZW5ndGg+MCxpPWU/ISFlLiRzdGFibGU6IW8sYT1lJiZlLiRrZXk7aWYoZSl7aWYoZS5fbm9ybWFsaXplZClyZXR1cm4gZS5fbm9ybWFsaXplZDtpZihpJiZuJiZuIT09VGkmJmE9PT1uLiRrZXkmJiFvJiYhbi4kaGFzTm9ybWFsKXJldHVybiBuO3I9e307Zm9yKHZhciBzIGluIGUpZVtzXSYmIiQiIT09c1swXSYmKHJbc109RWUodCxzLGVbc10pKX1lbHNlIHI9e307Zm9yKHZhciB1IGluIHQpdSBpbiByfHwoclt1XT1PZSh0LHUpKTtyZXR1cm4gZSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmKGUuX25vcm1hbGl6ZWQ9ciksRShyLCIkc3RhYmxlIixpKSxFKHIsIiRrZXkiLGEpLEUociwiJGhhc05vcm1hbCIsbykscn1mdW5jdGlvbiBFZShlLHQsbil7dmFyIHI9ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHMubGVuZ3RoP24uYXBwbHkobnVsbCxhcmd1bWVudHMpOm4oe30pO2U9ZSYmIm9iamVjdCI9PXR5cGVvZiBlJiYhQXJyYXkuaXNBcnJheShlKT9bZV06YmUoZSk7dmFyIHQ9ZSYmZVswXTtyZXR1cm4gZSYmKCF0fHwxPT09ZS5sZW5ndGgmJnQuaXNDb21tZW50JiYhU2UodCkpP3ZvaWQgMDplfTtyZXR1cm4gbi5wcm94eSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCx7Z2V0OnIsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KSxyfWZ1bmN0aW9uIE9lKGUsdCl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGVbdF19fWZ1bmN0aW9uIGplKGUsdCl7dmFyIG4scixpLGEscztpZihBcnJheS5pc0FycmF5KGUpfHwic3RyaW5nIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUubGVuZ3RoKSxyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW5bcl09dChlW3JdLHIpO2Vsc2UgaWYoIm51bWJlciI9PXR5cGVvZiBlKWZvcihuPW5ldyBBcnJheShlKSxyPTA7cjxlO3IrKyluW3JdPXQocisxLHIpO2Vsc2UgaWYodShlKSlpZihhYSYmZVtTeW1ib2wuaXRlcmF0b3JdKXtuPVtdO2Zvcih2YXIgYz1lW1N5bWJvbC5pdGVyYXRvcl0oKSxsPWMubmV4dCgpOyFsLmRvbmU7KW4ucHVzaCh0KGwudmFsdWUsbi5sZW5ndGgpKSxsPWMubmV4dCgpfWVsc2UgZm9yKGE9T2JqZWN0LmtleXMoZSksbj1uZXcgQXJyYXkoYS5sZW5ndGgpLHI9MCxpPWEubGVuZ3RoO3I8aTtyKyspcz1hW3JdLG5bcl09dChlW3NdLHMscik7cmV0dXJuIG8obil8fChuPVtdKSxuLl9pc1ZMaXN0PSEwLG59ZnVuY3Rpb24gTmUoZSx0LG4scil7dmFyIG8saT10aGlzLiRzY29wZWRTbG90c1tlXTtpPyhuPW58fHt9LHImJihuPV8oXyh7fSxyKSxuKSksbz1pKG4pfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpKTpvPXRoaXMuJHNsb3RzW2VdfHwoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dCgpOnQpO3ZhciBhPW4mJm4uc2xvdDtyZXR1cm4gYT90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6YX0sbyk6b31mdW5jdGlvbiBEZShlKXtyZXR1cm4gWih0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlLCEwKXx8TWl9ZnVuY3Rpb24gTGUoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBSZShlLHQsbixyLG8pe3ZhciBpPUhpLmtleUNvZGVzW3RdfHxuO3JldHVybiBvJiZyJiYhSGkua2V5Q29kZXNbdF0/TGUobyxyKTppP0xlKGksZSk6cj9EaShyKSE9PXQ6dm9pZCAwPT09ZX1mdW5jdGlvbiBNZShlLHQsbixyLG8pe2lmKG4paWYodShuKSl7QXJyYXkuaXNBcnJheShuKSYmKG49QyhuKSk7dmFyIGk7Zm9yKHZhciBhIGluIG4pIWZ1bmN0aW9uKGEpe2lmKCJjbGFzcyI9PT1hfHwic3R5bGUiPT09YXx8U2koYSkpaT1lO2Vsc2V7dmFyIHM9ZS5hdHRycyYmZS5hdHRycy50eXBlO2k9cnx8SGkubXVzdFVzZVByb3AodCxzLGEpP2UuZG9tUHJvcHN8fChlLmRvbVByb3BzPXt9KTplLmF0dHJzfHwoZS5hdHRycz17fSl9dmFyIHU9T2koYSksYz1EaShhKTtpZighKHUgaW4gaXx8YyBpbiBpKSYmKGlbYV09blthXSxvKSl7KGUub258fChlLm9uPXt9KSlbInVwZGF0ZToiK2FdPWZ1bmN0aW9uKGUpe25bYV09ZX19fShhKX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIEllKGUsdCl7dmFyIG49dGhpcy5fc3RhdGljVHJlZXN8fCh0aGlzLl9zdGF0aWNUcmVlcz1bXSkscj1uW2VdO3JldHVybiByJiYhdD9yOihyPW5bZV09dGhpcy4kb3B0aW9ucy5zdGF0aWNSZW5kZXJGbnNbZV0uY2FsbCh0aGlzLl9yZW5kZXJQcm94eSxudWxsLHRoaXMpLHFlKHIsIl9fc3RhdGljX18iK2UsITEpLHIpfWZ1bmN0aW9uIFBlKGUsdCxuKXtyZXR1cm4gcWUoZSwiX19vbmNlX18iK3QrKG4/Il8iK246IiIpLCEwKSxlfWZ1bmN0aW9uIHFlKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgcj0wO3I8ZS5sZW5ndGg7cisrKWVbcl0mJiJzdHJpbmciIT10eXBlb2YgZVtyXSYmSGUoZVtyXSx0KyJfIityLG4pO2Vsc2UgSGUoZSx0LG4pfWZ1bmN0aW9uIEhlKGUsdCxuKXtlLmlzU3RhdGljPSEwLGUua2V5PXQsZS5pc09uY2U9bn1mdW5jdGlvbiBGZShlLHQpe2lmKHQpaWYoYyh0KSl7dmFyIG49ZS5vbj1lLm9uP18oe30sZS5vbik6e307Zm9yKHZhciByIGluIHQpe3ZhciBvPW5bcl0saT10W3JdO25bcl09bz9bXS5jb25jYXQobyxpKTppfX1lbHNlO3JldHVybiBlfWZ1bmN0aW9uIEJlKGUsdCxuLHIpe3Q9dHx8eyRzdGFibGU6IW59O2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKXt2YXIgaT1lW29dO0FycmF5LmlzQXJyYXkoaSk/QmUoaSx0LG4pOmkmJihpLnByb3h5JiYoaS5mbi5wcm94eT0hMCksdFtpLmtleV09aS5mbil9cmV0dXJuIHImJih0LiRrZXk9ciksdH1mdW5jdGlvbiBVZShlLHQpe2Zvcih2YXIgbj0wO248dC5sZW5ndGg7bis9Mil7dmFyIHI9dFtuXTsic3RyaW5nIj09dHlwZW9mIHImJnImJihlW3Rbbl1dPXRbbisxXSl9cmV0dXJuIGV9ZnVuY3Rpb24gV2UoZSx0KXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/dCtlOmV9ZnVuY3Rpb24gemUoZSl7ZS5fbz1QZSxlLl9uPWgsZS5fcz1kLGUuX2w9amUsZS5fdD1OZSxlLl9xPWssZS5faT1BLGUuX209SWUsZS5fZj1EZSxlLl9rPVJlLGUuX2I9TWUsZS5fdj1MLGUuX2U9ZGEsZS5fdT1CZSxlLl9nPUZlLGUuX2Q9VWUsZS5fcD1XZX1mdW5jdGlvbiBWZShlLHQsbixyLG8pe3ZhciBhLHM9dGhpcyx1PW8ub3B0aW9uczt5KHIsIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKHIpLGEuX29yaWdpbmFsPXIpOihhPXIscj1yLl9vcmlnaW5hbCk7dmFyIGM9aSh1Ll9jb21waWxlZCksbD0hYzt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PXIsdGhpcy5saXN0ZW5lcnM9ZS5vbnx8VGksdGhpcy5pbmplY3Rpb25zPVRlKHUuaW5qZWN0LHIpLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gcy4kc2xvdHN8fCRlKGUuc2NvcGVkU2xvdHMscy4kc2xvdHM9a2UobixyKSkscy4kc2xvdHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY29wZWRTbG90cyIse2VudW1lcmFibGU6ITAsZ2V0OmZ1bmN0aW9uKCl7cmV0dXJuICRlKGUuc2NvcGVkU2xvdHMsdGhpcy5zbG90cygpKX19KSxjJiYodGhpcy4kb3B0aW9ucz11LHRoaXMuJHNsb3RzPXRoaXMuc2xvdHMoKSx0aGlzLiRzY29wZWRTbG90cz0kZShlLnNjb3BlZFNsb3RzLHRoaXMuJHNsb3RzKSksdS5fc2NvcGVJZD90aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLG8pe3ZhciBpPXR0KGEsZSx0LG4sbyxsKTtyZXR1cm4gaSYmIUFycmF5LmlzQXJyYXkoaSkmJihpLmZuU2NvcGVJZD11Ll9zY29wZUlkLGkuZm5Db250ZXh0PXIpLGl9OnRoaXMuX2M9ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHR0KGEsZSx0LG4scixsKX19ZnVuY3Rpb24gWGUoZSx0LG4scixpKXt2YXIgYT1lLm9wdGlvbnMscz17fSx1PWEucHJvcHM7aWYobyh1KSlmb3IodmFyIGMgaW4gdSlzW2NdPWVlKGMsdSx0fHxUaSk7ZWxzZSBvKG4uYXR0cnMpJiZLZShzLG4uYXR0cnMpLG8obi5wcm9wcykmJktlKHMsbi5wcm9wcyk7dmFyIGw9bmV3IFZlKG4scyxpLHIsZSksZj1hLnJlbmRlci5jYWxsKG51bGwsbC5fYyxsKTtpZihmIGluc3RhbmNlb2YgZmEpcmV0dXJuIEplKGYsbixsLnBhcmVudCxhLGwpO2lmKEFycmF5LmlzQXJyYXkoZikpe2Zvcih2YXIgcD1iZShmKXx8W10sZD1uZXcgQXJyYXkocC5sZW5ndGgpLGg9MDtoPHAubGVuZ3RoO2grKylkW2hdPUplKHBbaF0sbixsLnBhcmVudCxhLGwpO3JldHVybiBkfX1mdW5jdGlvbiBKZShlLHQsbixyLG8pe3ZhciBpPVIoZSk7cmV0dXJuIGkuZm5Db250ZXh0PW4saS5mbk9wdGlvbnM9cix0LnNsb3QmJigoaS5kYXRhfHwoaS5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLGl9ZnVuY3Rpb24gS2UoZSx0KXtmb3IodmFyIG4gaW4gdCllW09pKG4pXT10W25dfWZ1bmN0aW9uIEdlKGUsdCxuLGEscyl7aWYoIXIoZSkpe3ZhciBjPW4uJG9wdGlvbnMuX2Jhc2U7aWYodShlKSYmKGU9Yy5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgbDtpZihyKGUuY2lkKSYmKGw9ZSx2b2lkIDA9PT0oZT11dChsLGMpKSkpcmV0dXJuIHN0KGwsdCxuLGEscyk7dD10fHx7fSxCdChlKSxvKHQubW9kZWwpJiZldChlLm9wdGlvbnMsdCk7dmFyIGY9bWUodCxlLHMpO2lmKGkoZS5vcHRpb25zLmZ1bmN0aW9uYWwpKXJldHVybiBYZShlLGYsdCxuLGEpO3ZhciBwPXQub247aWYodC5vbj10Lm5hdGl2ZU9uLGkoZS5vcHRpb25zLmFic3RyYWN0KSl7dmFyIGQ9dC5zbG90O3Q9e30sZCYmKHQuc2xvdD1kKX1RZSh0KTt2YXIgaD1lLm9wdGlvbnMubmFtZXx8cztyZXR1cm4gbmV3IGZhKCJ2dWUtY29tcG9uZW50LSIrZS5jaWQrKGg/Ii0iK2g6IiIpLHQsdm9pZCAwLHZvaWQgMCx2b2lkIDAsbix7Q3RvcjplLHByb3BzRGF0YTpmLGxpc3RlbmVyczpwLHRhZzpzLGNoaWxkcmVuOmF9LGwpfX19ZnVuY3Rpb24gWWUoZSx0KXt2YXIgbj17X2lzQ29tcG9uZW50OiEwLF9wYXJlbnRWbm9kZTplLHBhcmVudDp0fSxyPWUuZGF0YS5pbmxpbmVUZW1wbGF0ZTtyZXR1cm4gbyhyKSYmKG4ucmVuZGVyPXIucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXIuc3RhdGljUmVuZGVyRm5zKSxuZXcgZS5jb21wb25lbnRPcHRpb25zLkN0b3Iobil9ZnVuY3Rpb24gUWUoZSl7Zm9yKHZhciB0PWUuaG9va3x8KGUuaG9vaz17fSksbj0wO248TGEubGVuZ3RoO24rKyl7dmFyIHI9TGFbbl0sbz10W3JdLGk9RGFbcl07bz09PWl8fG8mJm8uX21lcmdlZHx8KHRbcl09bz9aZShpLG8pOmkpfX1mdW5jdGlvbiBaZShlLHQpe3ZhciBuPWZ1bmN0aW9uKG4scil7ZShuLHIpLHQobixyKX07cmV0dXJuIG4uX21lcmdlZD0hMCxufWZ1bmN0aW9uIGV0KGUsdCl7dmFyIG49ZS5tb2RlbCYmZS5tb2RlbC5wcm9wfHwidmFsdWUiLHI9ZS5tb2RlbCYmZS5tb2RlbC5ldmVudHx8ImlucHV0IjsodC5hdHRyc3x8KHQuYXR0cnM9e30pKVtuXT10Lm1vZGVsLnZhbHVlO3ZhciBpPXQub258fCh0Lm9uPXt9KSxhPWlbcl0scz10Lm1vZGVsLmNhbGxiYWNrO28oYSk/KEFycmF5LmlzQXJyYXkoYSk/LTE9PT1hLmluZGV4T2Yocyk6YSE9PXMpJiYoaVtyXT1bc10uY29uY2F0KGEpKTppW3JdPXN9ZnVuY3Rpb24gdHQoZSx0LG4scixvLGEpe3JldHVybihBcnJheS5pc0FycmF5KG4pfHxzKG4pKSYmKG89cixyPW4sbj12b2lkIDApLGkoYSkmJihvPU1hKSxudChlLHQsbixyLG8pfWZ1bmN0aW9uIG50KGUsdCxuLHIsaSl7aWYobyhuKSYmbyhuLl9fb2JfXykpcmV0dXJuIGRhKCk7aWYobyhuKSYmbyhuLmlzKSYmKHQ9bi5pcyksIXQpcmV0dXJuIGRhKCk7QXJyYXkuaXNBcnJheShyKSYmImZ1bmN0aW9uIj09dHlwZW9mIHJbMF0mJihuPW58fHt9LG4uc2NvcGVkU2xvdHM9e2RlZmF1bHQ6clswXX0sci5sZW5ndGg9MCksaT09PU1hP3I9YmUocik6aT09PVJhJiYocj1nZShyKSk7dmFyIGEscztpZigic3RyaW5nIj09dHlwZW9mIHQpe3ZhciB1O3M9ZS4kdm5vZGUmJmUuJHZub2RlLm5zfHxIaS5nZXRUYWdOYW1lc3BhY2UodCksYT1IaS5pc1Jlc2VydmVkVGFnKHQpP25ldyBmYShIaS5wYXJzZVBsYXRmb3JtVGFnTmFtZSh0KSxuLHIsdm9pZCAwLHZvaWQgMCxlKTpuJiZuLnByZXx8IW8odT1aKGUuJG9wdGlvbnMsImNvbXBvbmVudHMiLHQpKT9uZXcgZmEodCxuLHIsdm9pZCAwLHZvaWQgMCxlKTpHZSh1LG4sZSxyLHQpfWVsc2UgYT1HZSh0LG4sZSxyKTtyZXR1cm4gQXJyYXkuaXNBcnJheShhKT9hOm8oYSk/KG8ocykmJnJ0KGEscyksbyhuKSYmb3QobiksYSk6ZGEoKX1mdW5jdGlvbiBydChlLHQsbil7aWYoZS5ucz10LCJmb3JlaWduT2JqZWN0Ij09PWUudGFnJiYodD12b2lkIDAsbj0hMCksbyhlLmNoaWxkcmVuKSlmb3IodmFyIGE9MCxzPWUuY2hpbGRyZW4ubGVuZ3RoO2E8czthKyspe3ZhciB1PWUuY2hpbGRyZW5bYV07byh1LnRhZykmJihyKHUubnMpfHxpKG4pJiYic3ZnIiE9PXUudGFnKSYmcnQodSx0LG4pfX1mdW5jdGlvbiBvdChlKXt1KGUuc3R5bGUpJiZmZShlLnN0eWxlKSx1KGUuY2xhc3MpJiZmZShlLmNsYXNzKX1mdW5jdGlvbiBpdChlKXtlLl92bm9kZT1udWxsLGUuX3N0YXRpY1RyZWVzPW51bGw7dmFyIHQ9ZS4kb3B0aW9ucyxuPWUuJHZub2RlPXQuX3BhcmVudFZub2RlLHI9biYmbi5jb250ZXh0O2UuJHNsb3RzPWtlKHQuX3JlbmRlckNoaWxkcmVuLHIpLGUuJHNjb3BlZFNsb3RzPVRpLGUuX2M9ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIHR0KGUsdCxuLHIsbywhMSl9LGUuJGNyZWF0ZUVsZW1lbnQ9ZnVuY3Rpb24odCxuLHIsbyl7cmV0dXJuIHR0KGUsdCxuLHIsbywhMCl9O3ZhciBvPW4mJm4uZGF0YTtIKGUsIiRhdHRycyIsbyYmby5hdHRyc3x8VGksbnVsbCwhMCksSChlLCIkbGlzdGVuZXJzIix0Ll9wYXJlbnRMaXN0ZW5lcnN8fFRpLG51bGwsITApfWZ1bmN0aW9uIGF0KGUsdCl7cmV0dXJuKGUuX19lc01vZHVsZXx8YWEmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddKSYmKGU9ZS5kZWZhdWx0KSx1KGUpP3QuZXh0ZW5kKGUpOmV9ZnVuY3Rpb24gc3QoZSx0LG4scixvKXt2YXIgaT1kYSgpO3JldHVybiBpLmFzeW5jRmFjdG9yeT1lLGkuYXN5bmNNZXRhPXtkYXRhOnQsY29udGV4dDpuLGNoaWxkcmVuOnIsdGFnOm99LGl9ZnVuY3Rpb24gdXQoZSx0KXtpZihpKGUuZXJyb3IpJiZvKGUuZXJyb3JDb21wKSlyZXR1cm4gZS5lcnJvckNvbXA7aWYobyhlLnJlc29sdmVkKSlyZXR1cm4gZS5yZXNvbHZlZDt2YXIgbj1JYTtpZihuJiZvKGUub3duZXJzKSYmLTE9PT1lLm93bmVycy5pbmRleE9mKG4pJiZlLm93bmVycy5wdXNoKG4pLGkoZS5sb2FkaW5nKSYmbyhlLmxvYWRpbmdDb21wKSlyZXR1cm4gZS5sb2FkaW5nQ29tcDtpZihuJiYhbyhlLm93bmVycykpe3ZhciBhPWUub3duZXJzPVtuXSxzPSEwLGM9bnVsbCxsPW51bGw7bi4kb24oImhvb2s6ZGVzdHJveWVkIixmdW5jdGlvbigpe3JldHVybiBtKGEsbil9KTt2YXIgZj1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWEubGVuZ3RoO3Q8bjt0KyspYVt0XS4kZm9yY2VVcGRhdGUoKTtlJiYoYS5sZW5ndGg9MCxudWxsIT09YyYmKGNsZWFyVGltZW91dChjKSxjPW51bGwpLG51bGwhPT1sJiYoY2xlYXJUaW1lb3V0KGwpLGw9bnVsbCkpfSxkPVMoZnVuY3Rpb24obil7ZS5yZXNvbHZlZD1hdChuLHQpLHM/YS5sZW5ndGg9MDpmKCEwKX0pLGg9UyhmdW5jdGlvbih0KXtvKGUuZXJyb3JDb21wKSYmKGUuZXJyb3I9ITAsZighMCkpfSksdj1lKGQsaCk7cmV0dXJuIHUodikmJihwKHYpP3IoZS5yZXNvbHZlZCkmJnYudGhlbihkLGgpOnAodi5jb21wb25lbnQpJiYodi5jb21wb25lbnQudGhlbihkLGgpLG8odi5lcnJvcikmJihlLmVycm9yQ29tcD1hdCh2LmVycm9yLHQpKSxvKHYubG9hZGluZykmJihlLmxvYWRpbmdDb21wPWF0KHYubG9hZGluZyx0KSwwPT09di5kZWxheT9lLmxvYWRpbmc9ITA6Yz1zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Yz1udWxsLHIoZS5yZXNvbHZlZCkmJnIoZS5lcnJvcikmJihlLmxvYWRpbmc9ITAsZighMSkpfSx2LmRlbGF5fHwyMDApKSxvKHYudGltZW91dCkmJihsPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtsPW51bGwscihlLnJlc29sdmVkKSYmaChudWxsKX0sdi50aW1lb3V0KSkpKSxzPSExLGUubG9hZGluZz9lLmxvYWRpbmdDb21wOmUucmVzb2x2ZWR9fWZ1bmN0aW9uIGN0KGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYobyhuKSYmKG8obi5jb21wb25lbnRPcHRpb25zKXx8U2UobikpKXJldHVybiBufX1mdW5jdGlvbiBsdChlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJmh0KGUsdCl9ZnVuY3Rpb24gZnQoZSx0KXtOYS4kb24oZSx0KX1mdW5jdGlvbiBwdChlLHQpe05hLiRvZmYoZSx0KX1mdW5jdGlvbiBkdChlLHQpe3ZhciBuPU5hO3JldHVybiBmdW5jdGlvbiByKCl7bnVsbCE9PXQuYXBwbHkobnVsbCxhcmd1bWVudHMpJiZuLiRvZmYoZSxyKX19ZnVuY3Rpb24gaHQoZSx0LG4pe05hPWUsaGUodCxufHx7fSxmdCxwdCxkdCxlKSxOYT12b2lkIDB9ZnVuY3Rpb24gdnQoZSl7dmFyIHQ9UGE7cmV0dXJuIFBhPWUsZnVuY3Rpb24oKXtQYT10fX1mdW5jdGlvbiBtdChlKXt2YXIgdD1lLiRvcHRpb25zLG49dC5wYXJlbnQ7aWYobiYmIXQuYWJzdHJhY3Qpe2Zvcig7bi4kb3B0aW9ucy5hYnN0cmFjdCYmbi4kcGFyZW50OyluPW4uJHBhcmVudDtuLiRjaGlsZHJlbi5wdXNoKGUpfWUuJHBhcmVudD1uLGUuJHJvb3Q9bj9uLiRyb290OmUsZS4kY2hpbGRyZW49W10sZS4kcmVmcz17fSxlLl93YXRjaGVyPW51bGwsZS5faW5hY3RpdmU9bnVsbCxlLl9kaXJlY3RJbmFjdGl2ZT0hMSxlLl9pc01vdW50ZWQ9ITEsZS5faXNEZXN0cm95ZWQ9ITEsZS5faXNCZWluZ0Rlc3Ryb3llZD0hMX1mdW5jdGlvbiB5dChlLHQsbil7ZS4kZWw9dCxlLiRvcHRpb25zLnJlbmRlcnx8KGUuJG9wdGlvbnMucmVuZGVyPWRhKSxfdChlLCJiZWZvcmVNb3VudCIpO3ZhciByO3JldHVybiByPWZ1bmN0aW9uKCl7ZS5fdXBkYXRlKGUuX3JlbmRlcigpLG4pfSxuZXcgS2EoZSxyLFQse2JlZm9yZTpmdW5jdGlvbigpe2UuX2lzTW91bnRlZCYmIWUuX2lzRGVzdHJveWVkJiZfdChlLCJiZWZvcmVVcGRhdGUiKX19LCEwKSxuPSExLG51bGw9PWUuJHZub2RlJiYoZS5faXNNb3VudGVkPSEwLF90KGUsIm1vdW50ZWQiKSksZX1mdW5jdGlvbiBndChlLHQsbixyLG8pe3ZhciBpPXIuZGF0YS5zY29wZWRTbG90cyxhPWUuJHNjb3BlZFNsb3RzLHM9ISEoaSYmIWkuJHN0YWJsZXx8YSE9PVRpJiYhYS4kc3RhYmxlfHxpJiZlLiRzY29wZWRTbG90cy4ka2V5IT09aS4ka2V5fHwhaSYmZS4kc2NvcGVkU2xvdHMuJGtleSksdT0hIShvfHxlLiRvcHRpb25zLl9yZW5kZXJDaGlsZHJlbnx8cyk7aWYoZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpLGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPW8sZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxUaSxlLiRsaXN0ZW5lcnM9bnx8VGksdCYmZS4kb3B0aW9ucy5wcm9wcyl7TSghMSk7Zm9yKHZhciBjPWUuX3Byb3BzLGw9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLGY9MDtmPGwubGVuZ3RoO2YrKyl7dmFyIHA9bFtmXSxkPWUuJG9wdGlvbnMucHJvcHM7Y1twXT1lZShwLGQsdCxlKX1NKCEwKSxlLiRvcHRpb25zLnByb3BzRGF0YT10fW49bnx8VGk7dmFyIGg9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO2UuJG9wdGlvbnMuX3BhcmVudExpc3RlbmVycz1uLGh0KGUsbixoKSx1JiYoZS4kc2xvdHM9a2UobyxyLmNvbnRleHQpLGUuJGZvcmNlVXBkYXRlKCkpfWZ1bmN0aW9uIGJ0KGUpe2Zvcig7ZSYmKGU9ZS4kcGFyZW50KTspaWYoZS5faW5hY3RpdmUpcmV0dXJuITA7cmV0dXJuITF9ZnVuY3Rpb24geHQoZSx0KXtpZih0KXtpZihlLl9kaXJlY3RJbmFjdGl2ZT0hMSxidChlKSlyZXR1cm59ZWxzZSBpZihlLl9kaXJlY3RJbmFjdGl2ZSlyZXR1cm47aWYoZS5faW5hY3RpdmV8fG51bGw9PT1lLl9pbmFjdGl2ZSl7ZS5faW5hY3RpdmU9ITE7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKXh0KGUuJGNoaWxkcmVuW25dKTtfdChlLCJhY3RpdmF0ZWQiKX19ZnVuY3Rpb24gd3QoZSx0KXtpZighKHQmJihlLl9kaXJlY3RJbmFjdGl2ZT0hMCxidChlKSl8fGUuX2luYWN0aXZlKSl7ZS5faW5hY3RpdmU9ITA7Zm9yKHZhciBuPTA7bjxlLiRjaGlsZHJlbi5sZW5ndGg7bisrKXd0KGUuJGNoaWxkcmVuW25dKTtfdChlLCJkZWFjdGl2YXRlZCIpfX1mdW5jdGlvbiBfdChlLHQpe04oKTt2YXIgbj1lLiRvcHRpb25zW3RdLHI9dCsiIGhvb2siO2lmKG4pZm9yKHZhciBvPTAsaT1uLmxlbmd0aDtvPGk7bysrKWFlKG5bb10sZSxudWxsLGUscik7ZS5faGFzSG9va0V2ZW50JiZlLiRlbWl0KCJob29rOiIrdCksRCgpfWZ1bmN0aW9uIEN0KCl7V2E9cWEubGVuZ3RoPUhhLmxlbmd0aD0wLEZhPXt9LEJhPVVhPSExfWZ1bmN0aW9uIFR0KCl7emE9VmEoKSxVYT0hMDt2YXIgZSx0O2ZvcihxYS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLFdhPTA7V2E8cWEubGVuZ3RoO1dhKyspZT1xYVtXYV0sZS5iZWZvcmUmJmUuYmVmb3JlKCksdD1lLmlkLEZhW3RdPW51bGwsZS5ydW4oKTt2YXIgbj1IYS5zbGljZSgpLHI9cWEuc2xpY2UoKTtDdCgpLFN0KG4pLGt0KHIpLGlhJiZIaS5kZXZ0b29scyYmaWEuZW1pdCgiZmx1c2giKX1mdW5jdGlvbiBrdChlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmIXIuX2lzRGVzdHJveWVkJiZfdChyLCJ1cGRhdGVkIil9fWZ1bmN0aW9uIEF0KGUpe2UuX2luYWN0aXZlPSExLEhhLnB1c2goZSl9ZnVuY3Rpb24gU3QoZSl7Zm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0KyspZVt0XS5faW5hY3RpdmU9ITAseHQoZVt0XSwhMCl9ZnVuY3Rpb24gJHQoZSl7dmFyIHQ9ZS5pZDtpZihudWxsPT1GYVt0XSl7aWYoRmFbdF09ITAsVWEpe2Zvcih2YXIgbj1xYS5sZW5ndGgtMTtuPldhJiZxYVtuXS5pZD5lLmlkOyluLS07cWEuc3BsaWNlKG4rMSwwLGUpfWVsc2UgcWEucHVzaChlKTtCYXx8KEJhPSEwLGxlKFR0KSl9fWZ1bmN0aW9uIEV0KGUsdCxuKXtHYS5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc1t0XVtuXX0sR2Euc2V0PWZ1bmN0aW9uKGUpe3RoaXNbdF1bbl09ZX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbixHYSl9ZnVuY3Rpb24gT3QoZSl7ZS5fd2F0Y2hlcnM9W107dmFyIHQ9ZS4kb3B0aW9uczt0LnByb3BzJiZqdChlLHQucHJvcHMpLHQubWV0aG9kcyYmUHQoZSx0Lm1ldGhvZHMpLHQuZGF0YT9OdChlKTpxKGUuX2RhdGE9e30sITApLHQuY29tcHV0ZWQmJkx0KGUsdC5jb21wdXRlZCksdC53YXRjaCYmdC53YXRjaCE9PVppJiZxdChlLHQud2F0Y2gpfWZ1bmN0aW9uIGp0KGUsdCl7dmFyIG49ZS4kb3B0aW9ucy5wcm9wc0RhdGF8fHt9LHI9ZS5fcHJvcHM9e30sbz1lLiRvcHRpb25zLl9wcm9wS2V5cz1bXSxpPSFlLiRwYXJlbnQ7aXx8TSghMSk7Zm9yKHZhciBhIGluIHQpIWZ1bmN0aW9uKGkpe28ucHVzaChpKTt2YXIgYT1lZShpLHQsbixlKTtIKHIsaSxhKSxpIGluIGV8fEV0KGUsIl9wcm9wcyIsaSl9KGEpO00oITApfWZ1bmN0aW9uIE50KGUpe3ZhciB0PWUuJG9wdGlvbnMuZGF0YTt0PWUuX2RhdGE9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/RHQodCxlKTp0fHx7fSxjKHQpfHwodD17fSk7Zm9yKHZhciBuPU9iamVjdC5rZXlzKHQpLHI9ZS4kb3B0aW9ucy5wcm9wcyxvPShlLiRvcHRpb25zLm1ldGhvZHMsbi5sZW5ndGgpO28tLTspe3ZhciBpPW5bb107ciYmeShyLGkpfHwkKGkpfHxFdChlLCJfZGF0YSIsaSl9cSh0LCEwKX1mdW5jdGlvbiBEdChlLHQpe04oKTt0cnl7cmV0dXJuIGUuY2FsbCh0LHQpfWNhdGNoKGUpe3JldHVybiBpZShlLHQsImRhdGEoKSIpLHt9fWZpbmFsbHl7RCgpfX1mdW5jdGlvbiBMdChlLHQpe3ZhciBuPWUuX2NvbXB1dGVkV2F0Y2hlcnM9T2JqZWN0LmNyZWF0ZShudWxsKSxyPW9hKCk7Zm9yKHZhciBvIGluIHQpe3ZhciBpPXRbb10sYT0iZnVuY3Rpb24iPT10eXBlb2YgaT9pOmkuZ2V0O3J8fChuW29dPW5ldyBLYShlLGF8fFQsVCxZYSkpLG8gaW4gZXx8UnQoZSxvLGkpfX1mdW5jdGlvbiBSdChlLHQsbil7dmFyIHI9IW9hKCk7ImZ1bmN0aW9uIj09dHlwZW9mIG4/KEdhLmdldD1yP010KHQpOkl0KG4pLEdhLnNldD1UKTooR2EuZ2V0PW4uZ2V0P3ImJiExIT09bi5jYWNoZT9NdCh0KTpJdChuLmdldCk6VCxHYS5zZXQ9bi5zZXR8fFQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQsR2EpfWZ1bmN0aW9uIE10KGUpe3JldHVybiBmdW5jdGlvbigpe3ZhciB0PXRoaXMuX2NvbXB1dGVkV2F0Y2hlcnMmJnRoaXMuX2NvbXB1dGVkV2F0Y2hlcnNbZV07aWYodClyZXR1cm4gdC5kaXJ0eSYmdC5ldmFsdWF0ZSgpLGNhLnRhcmdldCYmdC5kZXBlbmQoKSx0LnZhbHVlfX1mdW5jdGlvbiBJdChlKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5jYWxsKHRoaXMsdGhpcyl9fWZ1bmN0aW9uIFB0KGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPSJmdW5jdGlvbiIhPXR5cGVvZiB0W25dP1Q6TGkodFtuXSxlKX1mdW5jdGlvbiBxdChlLHQpe2Zvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKHZhciBvPTA7bzxyLmxlbmd0aDtvKyspSHQoZSxuLHJbb10pO2Vsc2UgSHQoZSxuLHIpfX1mdW5jdGlvbiBIdChlLHQsbixyKXtyZXR1cm4gYyhuKSYmKHI9bixuPW4uaGFuZGxlciksInN0cmluZyI9PXR5cGVvZiBuJiYobj1lW25dKSxlLiR3YXRjaCh0LG4scil9ZnVuY3Rpb24gRnQoZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXI7dmFyIG89ci5jb21wb25lbnRPcHRpb25zO24ucHJvcHNEYXRhPW8ucHJvcHNEYXRhLG4uX3BhcmVudExpc3RlbmVycz1vLmxpc3RlbmVycyxuLl9yZW5kZXJDaGlsZHJlbj1vLmNoaWxkcmVuLG4uX2NvbXBvbmVudFRhZz1vLnRhZyx0LnJlbmRlciYmKG4ucmVuZGVyPXQucmVuZGVyLG4uc3RhdGljUmVuZGVyRm5zPXQuc3RhdGljUmVuZGVyRm5zKX1mdW5jdGlvbiBCdChlKXt2YXIgdD1lLm9wdGlvbnM7aWYoZS5zdXBlcil7dmFyIG49QnQoZS5zdXBlcik7aWYobiE9PWUuc3VwZXJPcHRpb25zKXtlLnN1cGVyT3B0aW9ucz1uO3ZhciByPVV0KGUpO3ImJl8oZS5leHRlbmRPcHRpb25zLHIpLHQ9ZS5vcHRpb25zPVEobixlLmV4dGVuZE9wdGlvbnMpLHQubmFtZSYmKHQuY29tcG9uZW50c1t0Lm5hbWVdPWUpfX1yZXR1cm4gdH1mdW5jdGlvbiBVdChlKXt2YXIgdCxuPWUub3B0aW9ucyxyPWUuc2VhbGVkT3B0aW9ucztmb3IodmFyIG8gaW4gbiluW29dIT09cltvXSYmKHR8fCh0PXt9KSx0W29dPW5bb10pO3JldHVybiB0fWZ1bmN0aW9uIFd0KGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24genQoZSl7ZS51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKHQuaW5kZXhPZihlKT4tMSlyZXR1cm4gdGhpczt2YXIgbj13KGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc319ZnVuY3Rpb24gVnQoZSl7ZS5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPVEodGhpcy5vcHRpb25zLGUpLHRoaXN9fWZ1bmN0aW9uIFh0KGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxvPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihvW3JdKXJldHVybiBvW3JdO3ZhciBpPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4gYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YSxhLmNpZD10KyssYS5vcHRpb25zPVEobi5vcHRpb25zLGUpLGEuc3VwZXI9bixhLm9wdGlvbnMucHJvcHMmJkp0KGEpLGEub3B0aW9ucy5jb21wdXRlZCYmS3QoYSksYS5leHRlbmQ9bi5leHRlbmQsYS5taXhpbj1uLm1peGluLGEudXNlPW4udXNlLFBpLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlXT1uW2VdfSksaSYmKGEub3B0aW9ucy5jb21wb25lbnRzW2ldPWEpLGEuc3VwZXJPcHRpb25zPW4ub3B0aW9ucyxhLmV4dGVuZE9wdGlvbnM9ZSxhLnNlYWxlZE9wdGlvbnM9Xyh7fSxhLm9wdGlvbnMpLG9bcl09YSxhfX1mdW5jdGlvbiBKdChlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpRXQoZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9ZnVuY3Rpb24gS3QoZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVJ0KGUucHJvdG90eXBlLG4sdFtuXSl9ZnVuY3Rpb24gR3QoZSl7UGkuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KCJjb21wb25lbnQiPT09dCYmYyhuKSYmKG4ubmFtZT1uLm5hbWV8fGUsbj10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKG4pKSwiZGlyZWN0aXZlIj09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj17YmluZDpuLHVwZGF0ZTpufSksdGhpcy5vcHRpb25zW3QrInMiXVtlXT1uLG4pOnRoaXMub3B0aW9uc1t0KyJzIl1bZV19fSl9ZnVuY3Rpb24gWXQoZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gUXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmluZGV4T2YodCk+LTE6InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiwiKS5pbmRleE9mKHQpPi0xOiEhbChlKSYmZS50ZXN0KHQpfWZ1bmN0aW9uIFp0KGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxvPWUuX3Zub2RlO2Zvcih2YXIgaSBpbiBuKXt2YXIgYT1uW2ldO2lmKGEpe3ZhciBzPWEubmFtZTtzJiYhdChzKSYmZW4obixpLHIsbyl9fX1mdW5jdGlvbiBlbihlLHQsbixyKXt2YXIgbz1lW3RdOyFvfHxyJiZvLnRhZz09PXIudGFnfHxvLmNvbXBvbmVudEluc3RhbmNlLiRkZXN0cm95KCksZVt0XT1udWxsLG0obix0KX1mdW5jdGlvbiB0bihlKXtmb3IodmFyIHQ9ZS5kYXRhLG49ZSxyPWU7byhyLmNvbXBvbmVudEluc3RhbmNlKTspKHI9ci5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZyLmRhdGEmJih0PW5uKHIuZGF0YSx0KSk7Zm9yKDtvKG49bi5wYXJlbnQpOyluJiZuLmRhdGEmJih0PW5uKHQsbi5kYXRhKSk7cmV0dXJuIHJuKHQuc3RhdGljQ2xhc3MsdC5jbGFzcyl9ZnVuY3Rpb24gbm4oZSx0KXtyZXR1cm57c3RhdGljQ2xhc3M6b24oZS5zdGF0aWNDbGFzcyx0LnN0YXRpY0NsYXNzKSxjbGFzczpvKGUuY2xhc3MpP1tlLmNsYXNzLHQuY2xhc3NdOnQuY2xhc3N9fWZ1bmN0aW9uIHJuKGUsdCl7cmV0dXJuIG8oZSl8fG8odCk/b24oZSxhbih0KSk6IiJ9ZnVuY3Rpb24gb24oZSx0KXtyZXR1cm4gZT90P2UrIiAiK3Q6ZTp0fHwiIn1mdW5jdGlvbiBhbihlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9zbihlKTp1KGUpP3VuKGUpOiJzdHJpbmciPT10eXBlb2YgZT9lOiIifWZ1bmN0aW9uIHNuKGUpe2Zvcih2YXIgdCxuPSIiLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbyh0PWFuKGVbcl0pKSYmIiIhPT10JiYobiYmKG4rPSIgIiksbis9dCk7cmV0dXJuIG59ZnVuY3Rpb24gdW4oZSl7dmFyIHQ9IiI7Zm9yKHZhciBuIGluIGUpZVtuXSYmKHQmJih0Kz0iICIpLHQrPW4pO3JldHVybiB0fWZ1bmN0aW9uIGNuKGUpe3JldHVybiBrcyhlKT8ic3ZnIjoibWF0aCI9PT1lPyJtYXRoIjp2b2lkIDB9ZnVuY3Rpb24gbG4oZSl7aWYoIVdpKXJldHVybiEwO2lmKFNzKGUpKXJldHVybiExO2lmKGU9ZS50b0xvd2VyQ2FzZSgpLG51bGwhPSRzW2VdKXJldHVybiAkc1tlXTt2YXIgdD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiBlLmluZGV4T2YoIi0iKT4tMT8kc1tlXT10LmNvbnN0cnVjdG9yPT09d2luZG93LkhUTUxVbmtub3duRWxlbWVudHx8dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MRWxlbWVudDokc1tlXT0vSFRNTFVua25vd25FbGVtZW50Ly50ZXN0KHQudG9TdHJpbmcoKSl9ZnVuY3Rpb24gZm4oZSl7aWYoInN0cmluZyI9PXR5cGVvZiBlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKGUpO3JldHVybiB0fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKX1yZXR1cm4gZX1mdW5jdGlvbiBwbihlLHQpe3ZhciBuPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoZSk7cmV0dXJuInNlbGVjdCIhPT1lP246KHQuZGF0YSYmdC5kYXRhLmF0dHJzJiZ2b2lkIDAhPT10LmRhdGEuYXR0cnMubXVsdGlwbGUmJm4uc2V0QXR0cmlidXRlKCJtdWx0aXBsZSIsIm11bHRpcGxlIiksbil9ZnVuY3Rpb24gZG4oZSx0KXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlRWxlbWVudE5TKENzW2VdLHQpfWZ1bmN0aW9uIGhuKGUpe3JldHVybiBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShlKX1mdW5jdGlvbiB2bihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlQ29tbWVudChlKX1mdW5jdGlvbiBtbihlLHQsbil7ZS5pbnNlcnRCZWZvcmUodCxuKX1mdW5jdGlvbiB5bihlLHQpe2UucmVtb3ZlQ2hpbGQodCl9ZnVuY3Rpb24gZ24oZSx0KXtlLmFwcGVuZENoaWxkKHQpfWZ1bmN0aW9uIGJuKGUpe3JldHVybiBlLnBhcmVudE5vZGV9ZnVuY3Rpb24geG4oZSl7cmV0dXJuIGUubmV4dFNpYmxpbmd9ZnVuY3Rpb24gd24oZSl7cmV0dXJuIGUudGFnTmFtZX1mdW5jdGlvbiBfbihlLHQpe2UudGV4dENvbnRlbnQ9dH1mdW5jdGlvbiBDbihlLHQpe2Uuc2V0QXR0cmlidXRlKHQsIiIpfWZ1bmN0aW9uIFRuKGUsdCl7dmFyIG49ZS5kYXRhLnJlZjtpZihvKG4pKXt2YXIgcj1lLmNvbnRleHQsaT1lLmNvbXBvbmVudEluc3RhbmNlfHxlLmVsbSxhPXIuJHJlZnM7dD9BcnJheS5pc0FycmF5KGFbbl0pP20oYVtuXSxpKTphW25dPT09aSYmKGFbbl09dm9pZCAwKTplLmRhdGEucmVmSW5Gb3I/QXJyYXkuaXNBcnJheShhW25dKT9hW25dLmluZGV4T2YoaSk8MCYmYVtuXS5wdXNoKGkpOmFbbl09W2ldOmFbbl09aX19ZnVuY3Rpb24ga24oZSx0KXtyZXR1cm4gZS5rZXk9PT10LmtleSYmZS5hc3luY0ZhY3Rvcnk9PT10LmFzeW5jRmFjdG9yeSYmKGUudGFnPT09dC50YWcmJmUuaXNDb21tZW50PT09dC5pc0NvbW1lbnQmJm8oZS5kYXRhKT09PW8odC5kYXRhKSYmQW4oZSx0KXx8aShlLmlzQXN5bmNQbGFjZWhvbGRlcikmJnIodC5hc3luY0ZhY3RvcnkuZXJyb3IpKX1mdW5jdGlvbiBBbihlLHQpe2lmKCJpbnB1dCIhPT1lLnRhZylyZXR1cm4hMDt2YXIgbixyPW8obj1lLmRhdGEpJiZvKG49bi5hdHRycykmJm4udHlwZSxpPW8obj10LmRhdGEpJiZvKG49bi5hdHRycykmJm4udHlwZTtyZXR1cm4gcj09PWl8fEVzKHIpJiZFcyhpKX1mdW5jdGlvbiBTbihlLHQsbil7dmFyIHIsaSxhPXt9O2ZvcihyPXQ7cjw9bjsrK3IpaT1lW3JdLmtleSxvKGkpJiYoYVtpXT1yKTtyZXR1cm4gYX1mdW5jdGlvbiAkbihlLHQpeyhlLmRhdGEuZGlyZWN0aXZlc3x8dC5kYXRhLmRpcmVjdGl2ZXMpJiZFbihlLHQpfWZ1bmN0aW9uIEVuKGUsdCl7dmFyIG4scixvLGk9ZT09PU5zLGE9dD09PU5zLHM9T24oZS5kYXRhLmRpcmVjdGl2ZXMsZS5jb250ZXh0KSx1PU9uKHQuZGF0YS5kaXJlY3RpdmVzLHQuY29udGV4dCksYz1bXSxsPVtdO2ZvcihuIGluIHUpcj1zW25dLG89dVtuXSxyPyhvLm9sZFZhbHVlPXIudmFsdWUsby5vbGRBcmc9ci5hcmcsTm4obywidXBkYXRlIix0LGUpLG8uZGVmJiZvLmRlZi5jb21wb25lbnRVcGRhdGVkJiZsLnB1c2gobykpOihObihvLCJiaW5kIix0LGUpLG8uZGVmJiZvLmRlZi5pbnNlcnRlZCYmYy5wdXNoKG8pKTtpZihjLmxlbmd0aCl7dmFyIGY9ZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGMubGVuZ3RoO24rKylObihjW25dLCJpbnNlcnRlZCIsdCxlKX07aT92ZSh0LCJpbnNlcnQiLGYpOmYoKX1pZihsLmxlbmd0aCYmdmUodCwicG9zdHBhdGNoIixmdW5jdGlvbigpe2Zvcih2YXIgbj0wO248bC5sZW5ndGg7bisrKU5uKGxbbl0sImNvbXBvbmVudFVwZGF0ZWQiLHQsZSl9KSwhaSlmb3IobiBpbiBzKXVbbl18fE5uKHNbbl0sInVuYmluZCIsZSxlLGEpfWZ1bmN0aW9uIE9uKGUsdCl7dmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKTtpZighZSlyZXR1cm4gbjt2YXIgcixvO2ZvcihyPTA7cjxlLmxlbmd0aDtyKyspbz1lW3JdLG8ubW9kaWZpZXJzfHwoby5tb2RpZmllcnM9UnMpLG5bam4obyldPW8sby5kZWY9Wih0LiRvcHRpb25zLCJkaXJlY3RpdmVzIixvLm5hbWUsITApO3JldHVybiBufWZ1bmN0aW9uIGpuKGUpe3JldHVybiBlLnJhd05hbWV8fGUubmFtZSsiLiIrT2JqZWN0LmtleXMoZS5tb2RpZmllcnN8fHt9KS5qb2luKCIuIil9ZnVuY3Rpb24gTm4oZSx0LG4scixvKXt2YXIgaT1lLmRlZiYmZS5kZWZbdF07aWYoaSl0cnl7aShuLmVsbSxlLG4scixvKX1jYXRjaChyKXtpZShyLG4uY29udGV4dCwiZGlyZWN0aXZlICIrZS5uYW1lKyIgIit0KyIgaG9vayIpfX1mdW5jdGlvbiBEbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9ucztpZighKG8obikmJiExPT09bi5DdG9yLm9wdGlvbnMuaW5oZXJpdEF0dHJzfHxyKGUuZGF0YS5hdHRycykmJnIodC5kYXRhLmF0dHJzKSkpe3ZhciBpLGEscz10LmVsbSx1PWUuZGF0YS5hdHRyc3x8e30sYz10LmRhdGEuYXR0cnN8fHt9O28oYy5fX29iX18pJiYoYz10LmRhdGEuYXR0cnM9Xyh7fSxjKSk7Zm9yKGkgaW4gYylhPWNbaV0sdVtpXSE9PWEmJkxuKHMsaSxhLHQuZGF0YS5wcmUpOyhKaXx8R2kpJiZjLnZhbHVlIT09dS52YWx1ZSYmTG4ocywidmFsdWUiLGMudmFsdWUpO2ZvcihpIGluIHUpcihjW2ldKSYmKHhzKGkpP3MucmVtb3ZlQXR0cmlidXRlTlMoYnMsd3MoaSkpOnZzKGkpfHxzLnJlbW92ZUF0dHJpYnV0ZShpKSl9fWZ1bmN0aW9uIExuKGUsdCxuLHIpe3J8fGUudGFnTmFtZS5pbmRleE9mKCItIik+LTE/Um4oZSx0LG4pOmdzKHQpP19zKG4pP2UucmVtb3ZlQXR0cmlidXRlKHQpOihuPSJhbGxvd2Z1bGxzY3JlZW4iPT09dCYmIkVNQkVEIj09PWUudGFnTmFtZT8idHJ1ZSI6dCxlLnNldEF0dHJpYnV0ZSh0LG4pKTp2cyh0KT9lLnNldEF0dHJpYnV0ZSh0LHlzKHQsbikpOnhzKHQpP19zKG4pP2UucmVtb3ZlQXR0cmlidXRlTlMoYnMsd3ModCkpOmUuc2V0QXR0cmlidXRlTlMoYnMsdCxuKTpSbihlLHQsbil9ZnVuY3Rpb24gUm4oZSx0LG4pe2lmKF9zKG4pKWUucmVtb3ZlQXR0cmlidXRlKHQpO2Vsc2V7aWYoSmkmJiFLaSYmIlRFWFRBUkVBIj09PWUudGFnTmFtZSYmInBsYWNlaG9sZGVyIj09PXQmJiIiIT09biYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSxlLl9faWVwaD0hMH1lLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBNbihlLHQpe3ZhciBuPXQuZWxtLGk9dC5kYXRhLGE9ZS5kYXRhO2lmKCEocihpLnN0YXRpY0NsYXNzKSYmcihpLmNsYXNzKSYmKHIoYSl8fHIoYS5zdGF0aWNDbGFzcykmJnIoYS5jbGFzcykpKSl7dmFyIHM9dG4odCksdT1uLl90cmFuc2l0aW9uQ2xhc3NlcztvKHUpJiYocz1vbihzLGFuKHUpKSkscyE9PW4uX3ByZXZDbGFzcyYmKG4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyksbi5fcHJldkNsYXNzPXMpfX1mdW5jdGlvbiBJbihlKXtmdW5jdGlvbiB0KCl7KGF8fChhPVtdKSkucHVzaChlLnNsaWNlKGgsbykudHJpbSgpKSxoPW8rMX12YXIgbixyLG8saSxhLHM9ITEsdT0hMSxjPSExLGw9ITEsZj0wLHA9MCxkPTAsaD0wO2ZvcihvPTA7bzxlLmxlbmd0aDtvKyspaWYocj1uLG49ZS5jaGFyQ29kZUF0KG8pLHMpMzk9PT1uJiY5MiE9PXImJihzPSExKTtlbHNlIGlmKHUpMzQ9PT1uJiY5MiE9PXImJih1PSExKTtlbHNlIGlmKGMpOTY9PT1uJiY5MiE9PXImJihjPSExKTtlbHNlIGlmKGwpNDc9PT1uJiY5MiE9PXImJihsPSExKTtlbHNlIGlmKDEyNCE9PW58fDEyND09PWUuY2hhckNvZGVBdChvKzEpfHwxMjQ9PT1lLmNoYXJDb2RlQXQoby0xKXx8Znx8cHx8ZCl7c3dpdGNoKG4pe2Nhc2UgMzQ6dT0hMDticmVhaztjYXNlIDM5OnM9ITA7YnJlYWs7Y2FzZSA5NjpjPSEwO2JyZWFrO2Nhc2UgNDA6ZCsrO2JyZWFrO2Nhc2UgNDE6ZC0tO2JyZWFrO2Nhc2UgOTE6cCsrO2JyZWFrO2Nhc2UgOTM6cC0tO2JyZWFrO2Nhc2UgMTIzOmYrKzticmVhaztjYXNlIDEyNTpmLS19aWYoNDc9PT1uKXtmb3IodmFyIHY9by0xLG09dm9pZCAwO3Y+PTAmJiIgIj09PShtPWUuY2hhckF0KHYpKTt2LS0pO20mJnFzLnRlc3QobSl8fChsPSEwKX19ZWxzZSB2b2lkIDA9PT1pPyhoPW8rMSxpPWUuc2xpY2UoMCxvKS50cmltKCkpOnQoKTtpZih2b2lkIDA9PT1pP2k9ZS5zbGljZSgwLG8pLnRyaW0oKTowIT09aCYmdCgpLGEpZm9yKG89MDtvPGEubGVuZ3RoO28rKylpPVBuKGksYVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gUG4oZSx0KXt2YXIgbj10LmluZGV4T2YoIigiKTtpZihuPDApcmV0dXJuJ19mKCInK3QrJyIpKCcrZSsiKSI7dmFyIHI9dC5zbGljZSgwLG4pLG89dC5zbGljZShuKzEpO3JldHVybidfZigiJytyKyciKSgnK2UrKCIpIiE9PW8/IiwiK286byl9ZnVuY3Rpb24gcW4oZSx0KXtjb25zb2xlLmVycm9yKCJbVnVlIGNvbXBpbGVyXTogIitlKX1mdW5jdGlvbiBIbihlLHQpe3JldHVybiBlP2UubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlW3RdfSkuZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlfSk6W119ZnVuY3Rpb24gRm4oZSx0LG4scixvKXsoZS5wcm9wc3x8KGUucHJvcHM9W10pKS5wdXNoKFluKHtuYW1lOnQsdmFsdWU6bixkeW5hbWljOm99LHIpKSxlLnBsYWluPSExfWZ1bmN0aW9uIEJuKGUsdCxuLHIsbyl7KG8/ZS5keW5hbWljQXR0cnN8fChlLmR5bmFtaWNBdHRycz1bXSk6ZS5hdHRyc3x8KGUuYXR0cnM9W10pKS5wdXNoKFluKHtuYW1lOnQsdmFsdWU6bixkeW5hbWljOm99LHIpKSxlLnBsYWluPSExfWZ1bmN0aW9uIFVuKGUsdCxuLHIpe2UuYXR0cnNNYXBbdF09bixlLmF0dHJzTGlzdC5wdXNoKFluKHtuYW1lOnQsdmFsdWU6bn0scikpfWZ1bmN0aW9uIFduKGUsdCxuLHIsbyxpLGEscyl7KGUuZGlyZWN0aXZlc3x8KGUuZGlyZWN0aXZlcz1bXSkpLnB1c2goWW4oe25hbWU6dCxyYXdOYW1lOm4sdmFsdWU6cixhcmc6byxpc0R5bmFtaWNBcmc6aSxtb2RpZmllcnM6YX0scykpLGUucGxhaW49ITF9ZnVuY3Rpb24gem4oZSx0LG4pe3JldHVybiBuPyJfcCgiK3QrJywiJytlKyciKSc6ZSt0fWZ1bmN0aW9uIFZuKGUsdCxuLHIsbyxpLGEscyl7cj1yfHxUaSxyLnJpZ2h0P3M/dD0iKCIrdCsiKT09PSdjbGljayc/J2NvbnRleHRtZW51JzooIit0KyIpIjoiY2xpY2siPT09dCYmKHQ9ImNvbnRleHRtZW51IixkZWxldGUgci5yaWdodCk6ci5taWRkbGUmJihzP3Q9IigiK3QrIik9PT0nY2xpY2snPydtb3VzZXVwJzooIit0KyIpIjoiY2xpY2siPT09dCYmKHQ9Im1vdXNldXAiKSksci5jYXB0dXJlJiYoZGVsZXRlIHIuY2FwdHVyZSx0PXpuKCIhIix0LHMpKSxyLm9uY2UmJihkZWxldGUgci5vbmNlLHQ9em4oIn4iLHQscykpLHIucGFzc2l2ZSYmKGRlbGV0ZSByLnBhc3NpdmUsdD16bigiJiIsdCxzKSk7dmFyIHU7ci5uYXRpdmU/KGRlbGV0ZSByLm5hdGl2ZSx1PWUubmF0aXZlRXZlbnRzfHwoZS5uYXRpdmVFdmVudHM9e30pKTp1PWUuZXZlbnRzfHwoZS5ldmVudHM9e30pO3ZhciBjPVluKHt2YWx1ZTpuLnRyaW0oKSxkeW5hbWljOnN9LGEpO3IhPT1UaSYmKGMubW9kaWZpZXJzPXIpO3ZhciBsPXVbdF07QXJyYXkuaXNBcnJheShsKT9vP2wudW5zaGlmdChjKTpsLnB1c2goYyk6dVt0XT1sP28/W2MsbF06W2wsY106YyxlLnBsYWluPSExfWZ1bmN0aW9uIFhuKGUsdCl7cmV0dXJuIGUucmF3QXR0cnNNYXBbIjoiK3RdfHxlLnJhd0F0dHJzTWFwWyJ2LWJpbmQ6Iit0XXx8ZS5yYXdBdHRyc01hcFt0XX1mdW5jdGlvbiBKbihlLHQsbil7dmFyIHI9S24oZSwiOiIrdCl8fEtuKGUsInYtYmluZDoiK3QpO2lmKG51bGwhPXIpcmV0dXJuIEluKHIpO2lmKCExIT09bil7dmFyIG89S24oZSx0KTtpZihudWxsIT1vKXJldHVybiBKU09OLnN0cmluZ2lmeShvKX19ZnVuY3Rpb24gS24oZSx0LG4pe3ZhciByO2lmKG51bGwhPShyPWUuYXR0cnNNYXBbdF0pKWZvcih2YXIgbz1lLmF0dHJzTGlzdCxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKG9baV0ubmFtZT09PXQpe28uc3BsaWNlKGksMSk7YnJlYWt9cmV0dXJuIG4mJmRlbGV0ZSBlLmF0dHJzTWFwW3RdLHJ9ZnVuY3Rpb24gR24oZSx0KXtmb3IodmFyIG49ZS5hdHRyc0xpc3Qscj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7dmFyIGk9bltyXTtpZih0LnRlc3QoaS5uYW1lKSlyZXR1cm4gbi5zcGxpY2UociwxKSxpfX1mdW5jdGlvbiBZbihlLHQpe3JldHVybiB0JiYobnVsbCE9dC5zdGFydCYmKGUuc3RhcnQ9dC5zdGFydCksbnVsbCE9dC5lbmQmJihlLmVuZD10LmVuZCkpLGV9ZnVuY3Rpb24gUW4oZSx0LG4pe3ZhciByPW58fHt9LG89ci5udW1iZXIsaT1yLnRyaW0sYT0iJCR2IjtpJiYoYT0iKHR5cGVvZiAkJHYgPT09ICdzdHJpbmcnPyAkJHYudHJpbSgpOiAkJHYpIiksbyYmKGE9Il9uKCIrYSsiKSIpO3ZhciBzPVpuKHQsYSk7ZS5tb2RlbD17dmFsdWU6IigiK3QrIikiLGV4cHJlc3Npb246SlNPTi5zdHJpbmdpZnkodCksY2FsbGJhY2s6ImZ1bmN0aW9uICgkJHYpIHsiK3MrIn0ifX1mdW5jdGlvbiBabihlLHQpe3ZhciBuPWVyKGUpO3JldHVybiBudWxsPT09bi5rZXk/ZSsiPSIrdDoiJHNldCgiK24uZXhwKyIsICIrbi5rZXkrIiwgIit0KyIpIn1mdW5jdGlvbiBlcihlKXtpZihlPWUudHJpbSgpLG5zPWUubGVuZ3RoLGUuaW5kZXhPZigiWyIpPDB8fGUubGFzdEluZGV4T2YoIl0iKTxucy0xKXJldHVybiBpcz1lLmxhc3RJbmRleE9mKCIuIiksaXM+LTE/e2V4cDplLnNsaWNlKDAsaXMpLGtleTonIicrZS5zbGljZShpcysxKSsnIid9OntleHA6ZSxrZXk6bnVsbH07Zm9yKHJzPWUsaXM9YXM9c3M9MDshbnIoKTspb3M9dHIoKSxycihvcyk/aXIob3MpOjkxPT09b3MmJm9yKG9zKTtyZXR1cm57ZXhwOmUuc2xpY2UoMCxhcyksa2V5OmUuc2xpY2UoYXMrMSxzcyl9fWZ1bmN0aW9uIHRyKCl7cmV0dXJuIHJzLmNoYXJDb2RlQXQoKytpcyl9ZnVuY3Rpb24gbnIoKXtyZXR1cm4gaXM+PW5zfWZ1bmN0aW9uIHJyKGUpe3JldHVybiAzND09PWV8fDM5PT09ZX1mdW5jdGlvbiBvcihlKXt2YXIgdD0xO2Zvcihhcz1pczshbnIoKTspaWYoZT10cigpLHJyKGUpKWlyKGUpO2Vsc2UgaWYoOTE9PT1lJiZ0KyssOTM9PT1lJiZ0LS0sMD09PXQpe3NzPWlzO2JyZWFrfX1mdW5jdGlvbiBpcihlKXtmb3IodmFyIHQ9ZTshbnIoKSYmKGU9dHIoKSkhPT10Oyk7fWZ1bmN0aW9uIGFyKGUsdCxuKXt1cz1uO3ZhciByPXQudmFsdWUsbz10Lm1vZGlmaWVycyxpPWUudGFnLGE9ZS5hdHRyc01hcC50eXBlO2lmKGUuY29tcG9uZW50KXJldHVybiBRbihlLHIsbyksITE7aWYoInNlbGVjdCI9PT1pKWNyKGUscixvKTtlbHNlIGlmKCJpbnB1dCI9PT1pJiYiY2hlY2tib3giPT09YSlzcihlLHIsbyk7ZWxzZSBpZigiaW5wdXQiPT09aSYmInJhZGlvIj09PWEpdXIoZSxyLG8pO2Vsc2UgaWYoImlucHV0Ij09PWl8fCJ0ZXh0YXJlYSI9PT1pKWxyKGUscixvKTtlbHNlIGlmKCFIaS5pc1Jlc2VydmVkVGFnKGkpKXJldHVybiBRbihlLHIsbyksITE7cmV0dXJuITB9ZnVuY3Rpb24gc3IoZSx0LG4pe3ZhciByPW4mJm4ubnVtYmVyLG89Sm4oZSwidmFsdWUiKXx8Im51bGwiLGk9Sm4oZSwidHJ1ZS12YWx1ZSIpfHwidHJ1ZSIsYT1KbihlLCJmYWxzZS12YWx1ZSIpfHwiZmFsc2UiO0ZuKGUsImNoZWNrZWQiLCJBcnJheS5pc0FycmF5KCIrdCsiKT9faSgiK3QrIiwiK28rIik+LTEiKygidHJ1ZSI9PT1pPyI6KCIrdCsiKSI6IjpfcSgiK3QrIiwiK2krIikiKSksVm4oZSwiY2hhbmdlIiwidmFyICQkYT0iK3QrIiwkJGVsPSRldmVudC50YXJnZXQsJCRjPSQkZWwuY2hlY2tlZD8oIitpKyIpOigiK2ErIik7aWYoQXJyYXkuaXNBcnJheSgkJGEpKXt2YXIgJCR2PSIrKHI/Il9uKCIrbysiKSI6bykrIiwkJGk9X2koJCRhLCQkdik7aWYoJCRlbC5jaGVja2VkKXskJGk8MCYmKCIrWm4odCwiJCRhLmNvbmNhdChbJCR2XSkiKSsiKX1lbHNleyQkaT4tMSYmKCIrWm4odCwiJCRhLnNsaWNlKDAsJCRpKS5jb25jYXQoJCRhLnNsaWNlKCQkaSsxKSkiKSsiKX19ZWxzZXsiK1puKHQsIiQkYyIpKyJ9IixudWxsLCEwKX1mdW5jdGlvbiB1cihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsbz1KbihlLCJ2YWx1ZSIpfHwibnVsbCI7bz1yPyJfbigiK28rIikiOm8sRm4oZSwiY2hlY2tlZCIsIl9xKCIrdCsiLCIrbysiKSIpLFZuKGUsImNoYW5nZSIsWm4odCxvKSxudWxsLCEwKX1mdW5jdGlvbiBjcihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsbz0nQXJyYXkucHJvdG90eXBlLmZpbHRlci5jYWxsKCRldmVudC50YXJnZXQub3B0aW9ucyxmdW5jdGlvbihvKXtyZXR1cm4gby5zZWxlY3RlZH0pLm1hcChmdW5jdGlvbihvKXt2YXIgdmFsID0gIl92YWx1ZSIgaW4gbyA/IG8uX3ZhbHVlIDogby52YWx1ZTtyZXR1cm4gJysocj8iX24odmFsKSI6InZhbCIpKyJ9KSIsaT0idmFyICQkc2VsZWN0ZWRWYWwgPSAiK28rIjsiO2k9aSsiICIrWm4odCwiJGV2ZW50LnRhcmdldC5tdWx0aXBsZSA/ICQkc2VsZWN0ZWRWYWwgOiAkJHNlbGVjdGVkVmFsWzBdIiksVm4oZSwiY2hhbmdlIixpLG51bGwsITApfWZ1bmN0aW9uIGxyKGUsdCxuKXt2YXIgcj1lLmF0dHJzTWFwLnR5cGUsbz1ufHx7fSxpPW8ubGF6eSxhPW8ubnVtYmVyLHM9by50cmltLHU9IWkmJiJyYW5nZSIhPT1yLGM9aT8iY2hhbmdlIjoicmFuZ2UiPT09cj9IczoiaW5wdXQiLGw9IiRldmVudC50YXJnZXQudmFsdWUiO3MmJihsPSIkZXZlbnQudGFyZ2V0LnZhbHVlLnRyaW0oKSIpLGEmJihsPSJfbigiK2wrIikiKTt2YXIgZj1abih0LGwpO3UmJihmPSJpZigkZXZlbnQudGFyZ2V0LmNvbXBvc2luZylyZXR1cm47IitmKSxGbihlLCJ2YWx1ZSIsIigiK3QrIikiKSxWbihlLGMsZixudWxsLCEwKSwoc3x8YSkmJlZuKGUsImJsdXIiLCIkZm9yY2VVcGRhdGUoKSIpfWZ1bmN0aW9uIGZyKGUpe2lmKG8oZVtIc10pKXt2YXIgdD1KaT8iY2hhbmdlIjoiaW5wdXQiO2VbdF09W10uY29uY2F0KGVbSHNdLGVbdF18fFtdKSxkZWxldGUgZVtIc119byhlW0ZzXSkmJihlLmNoYW5nZT1bXS5jb25jYXQoZVtGc10sZS5jaGFuZ2V8fFtdKSxkZWxldGUgZVtGc10pfWZ1bmN0aW9uIHByKGUsdCxuKXt2YXIgcj1jcztyZXR1cm4gZnVuY3Rpb24gbygpe251bGwhPT10LmFwcGx5KG51bGwsYXJndW1lbnRzKSYmaHIoZSxvLG4scil9fWZ1bmN0aW9uIGRyKGUsdCxuLHIpe2lmKEJzKXt2YXIgbz16YSxpPXQ7dD1pLl93cmFwcGVyPWZ1bmN0aW9uKGUpe2lmKGUudGFyZ2V0PT09ZS5jdXJyZW50VGFyZ2V0fHxlLnRpbWVTdGFtcD49b3x8ZS50aW1lU3RhbXA8PTB8fGUudGFyZ2V0Lm93bmVyRG9jdW1lbnQhPT1kb2N1bWVudClyZXR1cm4gaS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9fWNzLmFkZEV2ZW50TGlzdGVuZXIoZSx0LGVhP3tjYXB0dXJlOm4scGFzc2l2ZTpyfTpuKX1mdW5jdGlvbiBocihlLHQsbixyKXsocnx8Y3MpLnJlbW92ZUV2ZW50TGlzdGVuZXIoZSx0Ll93cmFwcGVyfHx0LG4pfWZ1bmN0aW9uIHZyKGUsdCl7aWYoIXIoZS5kYXRhLm9uKXx8IXIodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxvPWUuZGF0YS5vbnx8e307Y3M9dC5lbG0sZnIobiksaGUobixvLGRyLGhyLHByLHQuY29udGV4dCksY3M9dm9pZCAwfX1mdW5jdGlvbiBtcihlLHQpe2lmKCFyKGUuZGF0YS5kb21Qcm9wcyl8fCFyKHQuZGF0YS5kb21Qcm9wcykpe3ZhciBuLGksYT10LmVsbSxzPWUuZGF0YS5kb21Qcm9wc3x8e30sdT10LmRhdGEuZG9tUHJvcHN8fHt9O28odS5fX29iX18pJiYodT10LmRhdGEuZG9tUHJvcHM9Xyh7fSx1KSk7Zm9yKG4gaW4gcyluIGluIHV8fChhW25dPSIiKTtmb3IobiBpbiB1KXtpZihpPXVbbl0sInRleHRDb250ZW50Ij09PW58fCJpbm5lckhUTUwiPT09bil7aWYodC5jaGlsZHJlbiYmKHQuY2hpbGRyZW4ubGVuZ3RoPTApLGk9PT1zW25dKWNvbnRpbnVlOzE9PT1hLmNoaWxkTm9kZXMubGVuZ3RoJiZhLnJlbW92ZUNoaWxkKGEuY2hpbGROb2Rlc1swXSl9aWYoInZhbHVlIj09PW4mJiJQUk9HUkVTUyIhPT1hLnRhZ05hbWUpe2EuX3ZhbHVlPWk7dmFyIGM9cihpKT8iIjpTdHJpbmcoaSk7eXIoYSxjKSYmKGEudmFsdWU9Yyl9ZWxzZSBpZigiaW5uZXJIVE1MIj09PW4mJmtzKGEudGFnTmFtZSkmJnIoYS5pbm5lckhUTUwpKXtscz1sc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2IiksbHMuaW5uZXJIVE1MPSI8c3ZnPiIraSsiPC9zdmc+Ijtmb3IodmFyIGw9bHMuZmlyc3RDaGlsZDthLmZpcnN0Q2hpbGQ7KWEucmVtb3ZlQ2hpbGQoYS5maXJzdENoaWxkKTtmb3IoO2wuZmlyc3RDaGlsZDspYS5hcHBlbmRDaGlsZChsLmZpcnN0Q2hpbGQpfWVsc2UgaWYoaSE9PXNbbl0pdHJ5e2Fbbl09aX1jYXRjaChlKXt9fX19ZnVuY3Rpb24geXIoZSx0KXtyZXR1cm4hZS5jb21wb3NpbmcmJigiT1BUSU9OIj09PWUudGFnTmFtZXx8Z3IoZSx0KXx8YnIoZSx0KSl9ZnVuY3Rpb24gZ3IoZSx0KXt2YXIgbj0hMDt0cnl7bj1kb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZX1jYXRjaChlKXt9cmV0dXJuIG4mJmUudmFsdWUhPT10fWZ1bmN0aW9uIGJyKGUsdCl7dmFyIG49ZS52YWx1ZSxyPWUuX3ZNb2RpZmllcnM7aWYobyhyKSl7aWYoci5udW1iZXIpcmV0dXJuIGgobikhPT1oKHQpO2lmKHIudHJpbSlyZXR1cm4gbi50cmltKCkhPT10LnRyaW0oKX1yZXR1cm4gbiE9PXR9ZnVuY3Rpb24geHIoZSl7dmFyIHQ9d3IoZS5zdHlsZSk7cmV0dXJuIGUuc3RhdGljU3R5bGU/XyhlLnN0YXRpY1N0eWxlLHQpOnR9ZnVuY3Rpb24gd3IoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/QyhlKToic3RyaW5nIj09dHlwZW9mIGU/enMoZSk6ZX1mdW5jdGlvbiBfcihlLHQpe3ZhciBuLHI9e307aWYodClmb3IodmFyIG89ZTtvLmNvbXBvbmVudEluc3RhbmNlOykobz1vLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSkmJm8uZGF0YSYmKG49eHIoby5kYXRhKSkmJl8ocixuKTsobj14cihlLmRhdGEpKSYmXyhyLG4pO2Zvcih2YXIgaT1lO2k9aS5wYXJlbnQ7KWkuZGF0YSYmKG49eHIoaS5kYXRhKSkmJl8ocixuKTtyZXR1cm4gcn1mdW5jdGlvbiBDcihlLHQpe3ZhciBuPXQuZGF0YSxpPWUuZGF0YTtpZighKHIobi5zdGF0aWNTdHlsZSkmJnIobi5zdHlsZSkmJnIoaS5zdGF0aWNTdHlsZSkmJnIoaS5zdHlsZSkpKXt2YXIgYSxzLHU9dC5lbG0sYz1pLnN0YXRpY1N0eWxlLGw9aS5ub3JtYWxpemVkU3R5bGV8fGkuc3R5bGV8fHt9LGY9Y3x8bCxwPXdyKHQuZGF0YS5zdHlsZSl8fHt9O3QuZGF0YS5ub3JtYWxpemVkU3R5bGU9byhwLl9fb2JfXyk/Xyh7fSxwKTpwO3ZhciBkPV9yKHQsITApO2ZvcihzIGluIGYpcihkW3NdKSYmSnModSxzLCIiKTtmb3IocyBpbiBkKShhPWRbc10pIT09ZltzXSYmSnModSxzLG51bGw9PWE/IiI6YSl9fWZ1bmN0aW9uIFRyKGUsdCl7aWYodCYmKHQ9dC50cmltKCkpKWlmKGUuY2xhc3NMaXN0KXQuaW5kZXhPZigiICIpPi0xP3Quc3BsaXQoUXMpLmZvckVhY2goZnVuY3Rpb24odCl7cmV0dXJuIGUuY2xhc3NMaXN0LmFkZCh0KX0pOmUuY2xhc3NMaXN0LmFkZCh0KTtlbHNle3ZhciBuPSIgIisoZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKSsiICI7bi5pbmRleE9mKCIgIit0KyIgIik8MCYmZS5zZXRBdHRyaWJ1dGUoImNsYXNzIiwobit0KS50cmltKCkpfX1mdW5jdGlvbiBrcihlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KFFzKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5yZW1vdmUodCl9KTplLmNsYXNzTGlzdC5yZW1vdmUodCksZS5jbGFzc0xpc3QubGVuZ3RofHxlLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKTtlbHNle2Zvcih2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiLHI9IiAiK3QrIiAiO24uaW5kZXhPZihyKT49MDspbj1uLnJlcGxhY2UociwiICIpO249bi50cmltKCksbj9lLnNldEF0dHJpYnV0ZSgiY2xhc3MiLG4pOmUucmVtb3ZlQXR0cmlidXRlKCJjbGFzcyIpfX1mdW5jdGlvbiBBcihlKXtpZihlKXtpZigib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O3JldHVybiExIT09ZS5jc3MmJl8odCxacyhlLm5hbWV8fCJ2IikpLF8odCxlKSx0fXJldHVybiJzdHJpbmciPT10eXBlb2YgZT9acyhlKTp2b2lkIDB9fWZ1bmN0aW9uIFNyKGUpe3N1KGZ1bmN0aW9uKCl7c3UoZSl9KX1mdW5jdGlvbiAkcihlLHQpe3ZhciBuPWUuX3RyYW5zaXRpb25DbGFzc2VzfHwoZS5fdHJhbnNpdGlvbkNsYXNzZXM9W10pO24uaW5kZXhPZih0KTwwJiYobi5wdXNoKHQpLFRyKGUsdCkpfWZ1bmN0aW9uIEVyKGUsdCl7ZS5fdHJhbnNpdGlvbkNsYXNzZXMmJm0oZS5fdHJhbnNpdGlvbkNsYXNzZXMsdCksa3IoZSx0KX1mdW5jdGlvbiBPcihlLHQsbil7dmFyIHI9anIoZSx0KSxvPXIudHlwZSxpPXIudGltZW91dCxhPXIucHJvcENvdW50O2lmKCFvKXJldHVybiBuKCk7dmFyIHM9bz09PXR1P291OmF1LHU9MCxjPWZ1bmN0aW9uKCl7ZS5yZW1vdmVFdmVudExpc3RlbmVyKHMsbCksbigpfSxsPWZ1bmN0aW9uKHQpe3QudGFyZ2V0PT09ZSYmKyt1Pj1hJiZjKCl9O3NldFRpbWVvdXQoZnVuY3Rpb24oKXt1PGEmJmMoKX0saSsxKSxlLmFkZEV2ZW50TGlzdGVuZXIocyxsKX1mdW5jdGlvbiBqcihlLHQpe3ZhciBuLHI9d2luZG93LmdldENvbXB1dGVkU3R5bGUoZSksbz0ocltydSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLGk9KHJbcnUrIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSxhPU5yKG8saSkscz0ocltpdSsiRGVsYXkiXXx8IiIpLnNwbGl0KCIsICIpLHU9KHJbaXUrIkR1cmF0aW9uIl18fCIiKS5zcGxpdCgiLCAiKSxjPU5yKHMsdSksbD0wLGY9MDtyZXR1cm4gdD09PXR1P2E+MCYmKG49dHUsbD1hLGY9aS5sZW5ndGgpOnQ9PT1udT9jPjAmJihuPW51LGw9YyxmPXUubGVuZ3RoKToobD1NYXRoLm1heChhLGMpLG49bD4wP2E+Yz90dTpudTpudWxsLGY9bj9uPT09dHU/aS5sZW5ndGg6dS5sZW5ndGg6MCkse3R5cGU6bix0aW1lb3V0OmwscHJvcENvdW50OmYsaGFzVHJhbnNmb3JtOm49PT10dSYmdXUudGVzdChyW3J1KyJQcm9wZXJ0eSJdKX19ZnVuY3Rpb24gTnIoZSx0KXtmb3IoO2UubGVuZ3RoPHQubGVuZ3RoOyllPWUuY29uY2F0KGUpO3JldHVybiBNYXRoLm1heC5hcHBseShudWxsLHQubWFwKGZ1bmN0aW9uKHQsbil7cmV0dXJuIERyKHQpK0RyKGVbbl0pfSkpfWZ1bmN0aW9uIERyKGUpe3JldHVybiAxZTMqTnVtYmVyKGUuc2xpY2UoMCwtMSkucmVwbGFjZSgiLCIsIi4iKSl9ZnVuY3Rpb24gTHIoZSx0KXt2YXIgbj1lLmVsbTtvKG4uX2xlYXZlQ2IpJiYobi5fbGVhdmVDYi5jYW5jZWxsZWQ9ITAsbi5fbGVhdmVDYigpKTt2YXIgaT1BcihlLmRhdGEudHJhbnNpdGlvbik7aWYoIXIoaSkmJiFvKG4uX2VudGVyQ2IpJiYxPT09bi5ub2RlVHlwZSl7Zm9yKHZhciBhPWkuY3NzLHM9aS50eXBlLGM9aS5lbnRlckNsYXNzLGw9aS5lbnRlclRvQ2xhc3MsZj1pLmVudGVyQWN0aXZlQ2xhc3MscD1pLmFwcGVhckNsYXNzLGQ9aS5hcHBlYXJUb0NsYXNzLHY9aS5hcHBlYXJBY3RpdmVDbGFzcyxtPWkuYmVmb3JlRW50ZXIseT1pLmVudGVyLGc9aS5hZnRlckVudGVyLGI9aS5lbnRlckNhbmNlbGxlZCx4PWkuYmVmb3JlQXBwZWFyLHc9aS5hcHBlYXIsXz1pLmFmdGVyQXBwZWFyLEM9aS5hcHBlYXJDYW5jZWxsZWQsVD1pLmR1cmF0aW9uLGs9UGEsQT1QYS4kdm5vZGU7QSYmQS5wYXJlbnQ7KWs9QS5jb250ZXh0LEE9QS5wYXJlbnQ7dmFyICQ9IWsuX2lzTW91bnRlZHx8IWUuaXNSb290SW5zZXJ0O2lmKCEkfHx3fHwiIj09PXcpe3ZhciBFPSQmJnA/cDpjLE89JCYmdj92OmYsaj0kJiZkP2Q6bCxOPSQ/eHx8bTptLEQ9JCYmImZ1bmN0aW9uIj09dHlwZW9mIHc/dzp5LEw9JD9ffHxnOmcsUj0kP0N8fGI6YixNPWgodShUKT9ULmVudGVyOlQpLEk9ITEhPT1hJiYhS2ksUD1JcihEKSxxPW4uX2VudGVyQ2I9UyhmdW5jdGlvbigpe0kmJihFcihuLGopLEVyKG4sTykpLHEuY2FuY2VsbGVkPyhJJiZFcihuLEUpLFImJlIobikpOkwmJkwobiksbi5fZW50ZXJDYj1udWxsfSk7ZS5kYXRhLnNob3d8fHZlKGUsImluc2VydCIsZnVuY3Rpb24oKXt2YXIgdD1uLnBhcmVudE5vZGUscj10JiZ0Ll9wZW5kaW5nJiZ0Ll9wZW5kaW5nW2Uua2V5XTtyJiZyLnRhZz09PWUudGFnJiZyLmVsbS5fbGVhdmVDYiYmci5lbG0uX2xlYXZlQ2IoKSxEJiZEKG4scSl9KSxOJiZOKG4pLEkmJigkcihuLEUpLCRyKG4sTyksU3IoZnVuY3Rpb24oKXtFcihuLEUpLHEuY2FuY2VsbGVkfHwoJHIobixqKSxQfHwoTXIoTSk/c2V0VGltZW91dChxLE0pOk9yKG4scyxxKSkpfSkpLGUuZGF0YS5zaG93JiYodCYmdCgpLEQmJkQobixxKSksSXx8UHx8cSgpfX19ZnVuY3Rpb24gUnIoZSx0KXtmdW5jdGlvbiBuKCl7Qy5jYW5jZWxsZWR8fCghZS5kYXRhLnNob3cmJmkucGFyZW50Tm9kZSYmKChpLnBhcmVudE5vZGUuX3BlbmRpbmd8fChpLnBhcmVudE5vZGUuX3BlbmRpbmc9e30pKVtlLmtleV09ZSksZCYmZChpKSx4JiYoJHIoaSxsKSwkcihpLHApLFNyKGZ1bmN0aW9uKCl7RXIoaSxsKSxDLmNhbmNlbGxlZHx8KCRyKGksZiksd3x8KE1yKF8pP3NldFRpbWVvdXQoQyxfKTpPcihpLGMsQykpKX0pKSx2JiZ2KGksQykseHx8d3x8QygpKX12YXIgaT1lLmVsbTtvKGkuX2VudGVyQ2IpJiYoaS5fZW50ZXJDYi5jYW5jZWxsZWQ9ITAsaS5fZW50ZXJDYigpKTt2YXIgYT1BcihlLmRhdGEudHJhbnNpdGlvbik7aWYocihhKXx8MSE9PWkubm9kZVR5cGUpcmV0dXJuIHQoKTtpZighbyhpLl9sZWF2ZUNiKSl7dmFyIHM9YS5jc3MsYz1hLnR5cGUsbD1hLmxlYXZlQ2xhc3MsZj1hLmxlYXZlVG9DbGFzcyxwPWEubGVhdmVBY3RpdmVDbGFzcyxkPWEuYmVmb3JlTGVhdmUsdj1hLmxlYXZlLG09YS5hZnRlckxlYXZlLHk9YS5sZWF2ZUNhbmNlbGxlZCxnPWEuZGVsYXlMZWF2ZSxiPWEuZHVyYXRpb24seD0hMSE9PXMmJiFLaSx3PUlyKHYpLF89aCh1KGIpP2IubGVhdmU6YiksQz1pLl9sZWF2ZUNiPVMoZnVuY3Rpb24oKXtpLnBhcmVudE5vZGUmJmkucGFyZW50Tm9kZS5fcGVuZGluZyYmKGkucGFyZW50Tm9kZS5fcGVuZGluZ1tlLmtleV09bnVsbCkseCYmKEVyKGksZiksRXIoaSxwKSksQy5jYW5jZWxsZWQ/KHgmJkVyKGksbCkseSYmeShpKSk6KHQoKSxtJiZtKGkpKSxpLl9sZWF2ZUNiPW51bGx9KTtnP2cobik6bigpfX1mdW5jdGlvbiBNcihlKXtyZXR1cm4ibnVtYmVyIj09dHlwZW9mIGUmJiFpc05hTihlKX1mdW5jdGlvbiBJcihlKXtpZihyKGUpKXJldHVybiExO3ZhciB0PWUuZm5zO3JldHVybiBvKHQpP0lyKEFycmF5LmlzQXJyYXkodCk/dFswXTp0KTooZS5fbGVuZ3RofHxlLmxlbmd0aCk+MX1mdW5jdGlvbiBQcihlLHQpeyEwIT09dC5kYXRhLnNob3cmJkxyKHQpfWZ1bmN0aW9uIHFyKGUsdCxuKXtIcihlLHQsbiksKEppfHxHaSkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtIcihlLHQsbil9LDApfWZ1bmN0aW9uIEhyKGUsdCxuKXt2YXIgcj10LnZhbHVlLG89ZS5tdWx0aXBsZTtpZighb3x8QXJyYXkuaXNBcnJheShyKSl7Zm9yKHZhciBpLGEscz0wLHU9ZS5vcHRpb25zLmxlbmd0aDtzPHU7cysrKWlmKGE9ZS5vcHRpb25zW3NdLG8paT1BKHIsQnIoYSkpPi0xLGEuc2VsZWN0ZWQhPT1pJiYoYS5zZWxlY3RlZD1pKTtlbHNlIGlmKGsoQnIoYSkscikpcmV0dXJuIHZvaWQoZS5zZWxlY3RlZEluZGV4IT09cyYmKGUuc2VsZWN0ZWRJbmRleD1zKSk7b3x8KGUuc2VsZWN0ZWRJbmRleD0tMSl9fWZ1bmN0aW9uIEZyKGUsdCl7cmV0dXJuIHQuZXZlcnkoZnVuY3Rpb24odCl7cmV0dXJuIWsodCxlKX0pfWZ1bmN0aW9uIEJyKGUpe3JldHVybiJfdmFsdWUiaW4gZT9lLl92YWx1ZTplLnZhbHVlfWZ1bmN0aW9uIFVyKGUpe2UudGFyZ2V0LmNvbXBvc2luZz0hMH1mdW5jdGlvbiBXcihlKXtlLnRhcmdldC5jb21wb3NpbmcmJihlLnRhcmdldC5jb21wb3Npbmc9ITEsenIoZS50YXJnZXQsImlucHV0IikpfWZ1bmN0aW9uIHpyKGUsdCl7dmFyIG49ZG9jdW1lbnQuY3JlYXRlRXZlbnQoIkhUTUxFdmVudHMiKTtuLmluaXRFdmVudCh0LCEwLCEwKSxlLmRpc3BhdGNoRXZlbnQobil9ZnVuY3Rpb24gVnIoZSl7cmV0dXJuIWUuY29tcG9uZW50SW5zdGFuY2V8fGUuZGF0YSYmZS5kYXRhLnRyYW5zaXRpb24/ZTpWcihlLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSl9ZnVuY3Rpb24gWHIoZSl7dmFyIHQ9ZSYmZS5jb21wb25lbnRPcHRpb25zO3JldHVybiB0JiZ0LkN0b3Iub3B0aW9ucy5hYnN0cmFjdD9YcihjdCh0LmNoaWxkcmVuKSk6ZX1mdW5jdGlvbiBKcihlKXt2YXIgdD17fSxuPWUuJG9wdGlvbnM7Zm9yKHZhciByIGluIG4ucHJvcHNEYXRhKXRbcl09ZVtyXTt2YXIgbz1uLl9wYXJlbnRMaXN0ZW5lcnM7Zm9yKHZhciBpIGluIG8pdFtPaShpKV09b1tpXTtyZXR1cm4gdH1mdW5jdGlvbiBLcihlLHQpe2lmKC9cZC1rZWVwLWFsaXZlJC8udGVzdCh0LnRhZykpcmV0dXJuIGUoImtlZXAtYWxpdmUiLHtwcm9wczp0LmNvbXBvbmVudE9wdGlvbnMucHJvcHNEYXRhfSl9ZnVuY3Rpb24gR3IoZSl7Zm9yKDtlPWUucGFyZW50OylpZihlLmRhdGEudHJhbnNpdGlvbilyZXR1cm4hMH1mdW5jdGlvbiBZcihlLHQpe3JldHVybiB0LmtleT09PWUua2V5JiZ0LnRhZz09PWUudGFnfWZ1bmN0aW9uIFFyKGUpe2UuZWxtLl9tb3ZlQ2ImJmUuZWxtLl9tb3ZlQ2IoKSxlLmVsbS5fZW50ZXJDYiYmZS5lbG0uX2VudGVyQ2IoKX1mdW5jdGlvbiBacihlKXtlLmRhdGEubmV3UG9zPWUuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpfWZ1bmN0aW9uIGVvKGUpe3ZhciB0PWUuZGF0YS5wb3Msbj1lLmRhdGEubmV3UG9zLHI9dC5sZWZ0LW4ubGVmdCxvPXQudG9wLW4udG9wO2lmKHJ8fG8pe2UuZGF0YS5tb3ZlZD0hMDt2YXIgaT1lLmVsbS5zdHlsZTtpLnRyYW5zZm9ybT1pLldlYmtpdFRyYW5zZm9ybT0idHJhbnNsYXRlKCIrcisicHgsIitvKyJweCkiLGkudHJhbnNpdGlvbkR1cmF0aW9uPSIwcyJ9fWZ1bmN0aW9uIHRvKGUsdCl7dmFyIG49dD9QdSh0KTpNdTtpZihuLnRlc3QoZSkpe2Zvcih2YXIgcixvLGksYT1bXSxzPVtdLHU9bi5sYXN0SW5kZXg9MDtyPW4uZXhlYyhlKTspe289ci5pbmRleCxvPnUmJihzLnB1c2goaT1lLnNsaWNlKHUsbykpLGEucHVzaChKU09OLnN0cmluZ2lmeShpKSkpO3ZhciBjPUluKHJbMV0udHJpbSgpKTthLnB1c2goIl9zKCIrYysiKSIpLHMucHVzaCh7IkBiaW5kaW5nIjpjfSksdT1vK3JbMF0ubGVuZ3RofXJldHVybiB1PGUubGVuZ3RoJiYocy5wdXNoKGk9ZS5zbGljZSh1KSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KGkpKSkse2V4cHJlc3Npb246YS5qb2luKCIrIiksdG9rZW5zOnN9fX1mdW5jdGlvbiBubyhlLHQpe3ZhciBuPSh0Lndhcm4sS24oZSwiY2xhc3MiKSk7biYmKGUuc3RhdGljQ2xhc3M9SlNPTi5zdHJpbmdpZnkobikpO3ZhciByPUpuKGUsImNsYXNzIiwhMSk7ciYmKGUuY2xhc3NCaW5kaW5nPXIpfWZ1bmN0aW9uIHJvKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY0NsYXNzJiYodCs9InN0YXRpY0NsYXNzOiIrZS5zdGF0aWNDbGFzcysiLCIpLGUuY2xhc3NCaW5kaW5nJiYodCs9ImNsYXNzOiIrZS5jbGFzc0JpbmRpbmcrIiwiKSx0fWZ1bmN0aW9uIG9vKGUsdCl7dmFyIG49KHQud2FybixLbihlLCJzdHlsZSIpKTtpZihuKXtlLnN0YXRpY1N0eWxlPUpTT04uc3RyaW5naWZ5KHpzKG4pKX12YXIgcj1KbihlLCJzdHlsZSIsITEpO3ImJihlLnN0eWxlQmluZGluZz1yKX1mdW5jdGlvbiBpbyhlKXt2YXIgdD0iIjtyZXR1cm4gZS5zdGF0aWNTdHlsZSYmKHQrPSJzdGF0aWNTdHlsZToiK2Uuc3RhdGljU3R5bGUrIiwiKSxlLnN0eWxlQmluZGluZyYmKHQrPSJzdHlsZTooIitlLnN0eWxlQmluZGluZysiKSwiKSx0fWZ1bmN0aW9uIGFvKGUsdCl7dmFyIG49dD9pYzpvYztyZXR1cm4gZS5yZXBsYWNlKG4sZnVuY3Rpb24oZSl7cmV0dXJuIHJjW2VdfSl9ZnVuY3Rpb24gc28oZSx0KXtmdW5jdGlvbiBuKHQpe2wrPXQsZT1lLnN1YnN0cmluZyh0KX1mdW5jdGlvbiByKGUsbixyKXt2YXIgbyxzO2lmKG51bGw9PW4mJihuPWwpLG51bGw9PXImJihyPWwpLGUpZm9yKHM9ZS50b0xvd2VyQ2FzZSgpLG89YS5sZW5ndGgtMTtvPj0wJiZhW29dLmxvd2VyQ2FzZWRUYWchPT1zO28tLSk7ZWxzZSBvPTA7aWYobz49MCl7Zm9yKHZhciB1PWEubGVuZ3RoLTE7dT49bzt1LS0pdC5lbmQmJnQuZW5kKGFbdV0udGFnLG4scik7YS5sZW5ndGg9byxpPW8mJmFbby0xXS50YWd9ZWxzZSJiciI9PT1zP3Quc3RhcnQmJnQuc3RhcnQoZSxbXSwhMCxuLHIpOiJwIj09PXMmJih0LnN0YXJ0JiZ0LnN0YXJ0KGUsW10sITEsbixyKSx0LmVuZCYmdC5lbmQoZSxuLHIpKX1mb3IodmFyIG8saSxhPVtdLHM9dC5leHBlY3RIVE1MLHU9dC5pc1VuYXJ5VGFnfHxSaSxjPXQuY2FuQmVMZWZ0T3BlblRhZ3x8UmksbD0wO2U7KXtpZihvPWUsaSYmdGMoaSkpe3ZhciBmPTAscD1pLnRvTG93ZXJDYXNlKCksZD1uY1twXXx8KG5jW3BdPW5ldyBSZWdFeHAoIihbXFxzXFxTXSo/KSg8LyIrcCsiW14+XSo+KSIsImkiKSksaD1lLnJlcGxhY2UoZCxmdW5jdGlvbihlLG4scil7cmV0dXJuIGY9ci5sZW5ndGgsdGMocCl8fCJub3NjcmlwdCI9PT1wfHwobj1uLnJlcGxhY2UoLzwhXC0tKFtcc1xTXSo/KS0tPi9nLCIkMSIpLnJlcGxhY2UoLzwhXFtDREFUQVxbKFtcc1xTXSo/KV1dPi9nLCIkMSIpKSxzYyhwLG4pJiYobj1uLnNsaWNlKDEpKSx0LmNoYXJzJiZ0LmNoYXJzKG4pLCIifSk7bCs9ZS5sZW5ndGgtaC5sZW5ndGgsZT1oLHIocCxsLWYsbCl9ZWxzZXt2YXIgdj1lLmluZGV4T2YoIjwiKTtpZigwPT09dil7aWYoWnUudGVzdChlKSl7dmFyIG09ZS5pbmRleE9mKCItLVx4M2UiKTtpZihtPj0wKXt0LnNob3VsZEtlZXBDb21tZW50JiZ0LmNvbW1lbnQoZS5zdWJzdHJpbmcoNCxtKSxsLGwrbSszKSxuKG0rMyk7Y29udGludWV9fWlmKGVjLnRlc3QoZSkpe3ZhciB5PWUuaW5kZXhPZigiXT4iKTtpZih5Pj0wKXtuKHkrMik7Y29udGludWV9fXZhciBnPWUubWF0Y2goUXUpO2lmKGcpe24oZ1swXS5sZW5ndGgpO2NvbnRpbnVlfXZhciBiPWUubWF0Y2goWXUpO2lmKGIpe3ZhciB4PWw7bihiWzBdLmxlbmd0aCkscihiWzFdLHgsbCk7Y29udGludWV9dmFyIHc9ZnVuY3Rpb24oKXt2YXIgdD1lLm1hdGNoKEt1KTtpZih0KXt2YXIgcj17dGFnTmFtZTp0WzFdLGF0dHJzOltdLHN0YXJ0Omx9O24odFswXS5sZW5ndGgpO2Zvcih2YXIgbyxpOyEobz1lLm1hdGNoKEd1KSkmJihpPWUubWF0Y2goVnUpfHxlLm1hdGNoKHp1KSk7KWkuc3RhcnQ9bCxuKGlbMF0ubGVuZ3RoKSxpLmVuZD1sLHIuYXR0cnMucHVzaChpKTtpZihvKXJldHVybiByLnVuYXJ5U2xhc2g9b1sxXSxuKG9bMF0ubGVuZ3RoKSxyLmVuZD1sLHJ9fSgpO2lmKHcpeyFmdW5jdGlvbihlKXt2YXIgbj1lLnRhZ05hbWUsbz1lLnVuYXJ5U2xhc2g7cyYmKCJwIj09PWkmJld1KG4pJiZyKGkpLGMobikmJmk9PT1uJiZyKG4pKTtmb3IodmFyIGw9dShuKXx8ISFvLGY9ZS5hdHRycy5sZW5ndGgscD1uZXcgQXJyYXkoZiksZD0wO2Q8ZjtkKyspe3ZhciBoPWUuYXR0cnNbZF0sdj1oWzNdfHxoWzRdfHxoWzVdfHwiIixtPSJhIj09PW4mJiJocmVmIj09PWhbMV0/dC5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6dC5zaG91bGREZWNvZGVOZXdsaW5lcztwW2RdPXtuYW1lOmhbMV0sdmFsdWU6YW8odixtKX19bHx8KGEucHVzaCh7dGFnOm4sbG93ZXJDYXNlZFRhZzpuLnRvTG93ZXJDYXNlKCksYXR0cnM6cCxzdGFydDplLnN0YXJ0LGVuZDplLmVuZH0pLGk9biksdC5zdGFydCYmdC5zdGFydChuLHAsbCxlLnN0YXJ0LGUuZW5kKX0odyksc2Mody50YWdOYW1lLGUpJiZuKDEpO2NvbnRpbnVlfX12YXIgXz12b2lkIDAsQz12b2lkIDAsVD12b2lkIDA7aWYodj49MCl7Zm9yKEM9ZS5zbGljZSh2KTshKFl1LnRlc3QoQyl8fEt1LnRlc3QoQyl8fFp1LnRlc3QoQyl8fGVjLnRlc3QoQyl8fChUPUMuaW5kZXhPZigiPCIsMSkpPDApOyl2Kz1ULEM9ZS5zbGljZSh2KTtfPWUuc3Vic3RyaW5nKDAsdil9djwwJiYoXz1lKSxfJiZuKF8ubGVuZ3RoKSx0LmNoYXJzJiZfJiZ0LmNoYXJzKF8sbC1fLmxlbmd0aCxsKX1pZihlPT09byl7dC5jaGFycyYmdC5jaGFycyhlKTticmVha319cigpfWZ1bmN0aW9uIHVvKGUsdCxuKXtyZXR1cm57dHlwZToxLHRhZzplLGF0dHJzTGlzdDp0LGF0dHJzTWFwOk9vKHQpLHJhd0F0dHJzTWFwOnt9LHBhcmVudDpuLGNoaWxkcmVuOltdfX1mdW5jdGlvbiBjbyhlLHQpe2Z1bmN0aW9uIG4oZSl7aWYocihlKSxsfHxlLnByb2Nlc3NlZHx8KGU9cG8oZSx0KSkscy5sZW5ndGh8fGU9PT1pfHxpLmlmJiYoZS5lbHNlaWZ8fGUuZWxzZSkmJndvKGkse2V4cDplLmVsc2VpZixibG9jazplfSksYSYmIWUuZm9yYmlkZGVuKWlmKGUuZWxzZWlmfHxlLmVsc2UpYm8oZSxhKTtlbHNle2lmKGUuc2xvdFNjb3BlKXt2YXIgbj1lLnNsb3RUYXJnZXR8fCciZGVmYXVsdCInOyhhLnNjb3BlZFNsb3RzfHwoYS5zY29wZWRTbG90cz17fSkpW25dPWV9YS5jaGlsZHJlbi5wdXNoKGUpLGUucGFyZW50PWF9ZS5jaGlsZHJlbj1lLmNoaWxkcmVuLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5zbG90U2NvcGV9KSxyKGUpLGUucHJlJiYobD0hMSksRXUoZS50YWcpJiYoZj0hMSk7Zm9yKHZhciBvPTA7bzwkdS5sZW5ndGg7bysrKSR1W29dKGUsdCl9ZnVuY3Rpb24gcihlKXtpZighZilmb3IodmFyIHQ7KHQ9ZS5jaGlsZHJlbltlLmNoaWxkcmVuLmxlbmd0aC0xXSkmJjM9PT10LnR5cGUmJiIgIj09PXQudGV4dDspZS5jaGlsZHJlbi5wb3AoKX1UdT10Lndhcm58fHFuLEV1PXQuaXNQcmVUYWd8fFJpLE91PXQubXVzdFVzZVByb3B8fFJpLGp1PXQuZ2V0VGFnTmFtZXNwYWNlfHxSaTt2YXIgbz10LmlzUmVzZXJ2ZWRUYWd8fFJpO051PWZ1bmN0aW9uKGUpe3JldHVybiEoIShlLmNvbXBvbmVudHx8ZS5hdHRyc01hcFsiOmlzIl18fGUuYXR0cnNNYXBbInYtYmluZDppcyJdKSYmbyhlLmF0dHJzTWFwLmlzP2UuYXR0cnNNYXAuaXM6ZS50YWcpKX0sQXU9SG4odC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksU3U9SG4odC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksJHU9SG4odC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLGt1PXQuZGVsaW1pdGVyczt2YXIgaSxhLHM9W10sdT0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLGM9dC53aGl0ZXNwYWNlLGw9ITEsZj0hMTtyZXR1cm4gc28oZSx7d2FybjpUdSxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLG91dHB1dFNvdXJjZVJhbmdlOnQub3V0cHV0U291cmNlUmFuZ2Usc3RhcnQ6ZnVuY3Rpb24oZSxyLG8sdSxjKXt2YXIgcD1hJiZhLm5zfHxqdShlKTtKaSYmInN2ZyI9PT1wJiYocj1EbyhyKSk7dmFyIGQ9dW8oZSxyLGEpO3AmJihkLm5zPXApLE5vKGQpJiYhb2EoKSYmKGQuZm9yYmlkZGVuPSEwKTtmb3IodmFyIGg9MDtoPFN1Lmxlbmd0aDtoKyspZD1TdVtoXShkLHQpfHxkO2x8fChsbyhkKSxkLnByZSYmKGw9ITApKSxFdShkLnRhZykmJihmPSEwKSxsP2ZvKGQpOmQucHJvY2Vzc2VkfHwobW8oZCksZ28oZCksX28oZCkpLGl8fChpPWQpLG8/bihkKTooYT1kLHMucHVzaChkKSl9LGVuZDpmdW5jdGlvbihlLHQscil7dmFyIG89c1tzLmxlbmd0aC0xXTtzLmxlbmd0aC09MSxhPXNbcy5sZW5ndGgtMV0sbihvKX0sY2hhcnM6ZnVuY3Rpb24oZSx0LG4pe2lmKGEmJighSml8fCJ0ZXh0YXJlYSIhPT1hLnRhZ3x8YS5hdHRyc01hcC5wbGFjZWhvbGRlciE9PWUpKXt2YXIgcj1hLmNoaWxkcmVuO2lmKGU9Znx8ZS50cmltKCk/am8oYSk/ZTp4YyhlKTpyLmxlbmd0aD9jPyJjb25kZW5zZSI9PT1jJiZnYy50ZXN0KGUpPyIiOiIgIjp1PyIgIjoiIjoiIil7Znx8ImNvbmRlbnNlIiE9PWN8fChlPWUucmVwbGFjZShiYywiICIpKTt2YXIgbyxpOyFsJiYiICIhPT1lJiYobz10byhlLGt1KSk/aT17dHlwZToyLGV4cHJlc3Npb246by5leHByZXNzaW9uLHRva2VuczpvLnRva2Vucyx0ZXh0OmV9OiIgIj09PWUmJnIubGVuZ3RoJiYiICI9PT1yW3IubGVuZ3RoLTFdLnRleHR8fChpPXt0eXBlOjMsdGV4dDplfSksaSYmci5wdXNoKGkpfX19LGNvbW1lbnQ6ZnVuY3Rpb24oZSx0LG4pe2lmKGEpe3ZhciByPXt0eXBlOjMsdGV4dDplLGlzQ29tbWVudDohMH07YS5jaGlsZHJlbi5wdXNoKHIpfX19KSxpfWZ1bmN0aW9uIGxvKGUpe251bGwhPUtuKGUsInYtcHJlIikmJihlLnByZT0hMCl9ZnVuY3Rpb24gZm8oZSl7dmFyIHQ9ZS5hdHRyc0xpc3Qsbj10Lmxlbmd0aDtpZihuKWZvcih2YXIgcj1lLmF0dHJzPW5ldyBBcnJheShuKSxvPTA7bzxuO28rKylyW29dPXtuYW1lOnRbb10ubmFtZSx2YWx1ZTpKU09OLnN0cmluZ2lmeSh0W29dLnZhbHVlKX0sbnVsbCE9dFtvXS5zdGFydCYmKHJbb10uc3RhcnQ9dFtvXS5zdGFydCxyW29dLmVuZD10W29dLmVuZCk7ZWxzZSBlLnByZXx8KGUucGxhaW49ITApfWZ1bmN0aW9uIHBvKGUsdCl7aG8oZSksZS5wbGFpbj0hZS5rZXkmJiFlLnNjb3BlZFNsb3RzJiYhZS5hdHRyc0xpc3QubGVuZ3RoLHZvKGUpLENvKGUpLGtvKGUpLEFvKGUpO2Zvcih2YXIgbj0wO248QXUubGVuZ3RoO24rKyllPUF1W25dKGUsdCl8fGU7cmV0dXJuIFNvKGUpLGV9ZnVuY3Rpb24gaG8oZSl7dmFyIHQ9Sm4oZSwia2V5Iik7aWYodCl7ZS5rZXk9dH19ZnVuY3Rpb24gdm8oZSl7dmFyIHQ9Sm4oZSwicmVmIik7dCYmKGUucmVmPXQsZS5yZWZJbkZvcj0kbyhlKSl9ZnVuY3Rpb24gbW8oZSl7dmFyIHQ7aWYodD1LbihlLCJ2LWZvciIpKXt2YXIgbj15byh0KTtuJiZfKGUsbil9fWZ1bmN0aW9uIHlvKGUpe3ZhciB0PWUubWF0Y2gobGMpO2lmKHQpe3ZhciBuPXt9O24uZm9yPXRbMl0udHJpbSgpO3ZhciByPXRbMV0udHJpbSgpLnJlcGxhY2UocGMsIiIpLG89ci5tYXRjaChmYyk7cmV0dXJuIG8/KG4uYWxpYXM9ci5yZXBsYWNlKGZjLCIiKS50cmltKCksbi5pdGVyYXRvcjE9b1sxXS50cmltKCksb1syXSYmKG4uaXRlcmF0b3IyPW9bMl0udHJpbSgpKSk6bi5hbGlhcz1yLG59fWZ1bmN0aW9uIGdvKGUpe3ZhciB0PUtuKGUsInYtaWYiKTtpZih0KWUuaWY9dCx3byhlLHtleHA6dCxibG9jazplfSk7ZWxzZXtudWxsIT1LbihlLCJ2LWVsc2UiKSYmKGUuZWxzZT0hMCk7dmFyIG49S24oZSwidi1lbHNlLWlmIik7biYmKGUuZWxzZWlmPW4pfX1mdW5jdGlvbiBibyhlLHQpe3ZhciBuPXhvKHQuY2hpbGRyZW4pO24mJm4uaWYmJndvKG4se2V4cDplLmVsc2VpZixibG9jazplfSl9ZnVuY3Rpb24geG8oZSl7Zm9yKHZhciB0PWUubGVuZ3RoO3QtLTspe2lmKDE9PT1lW3RdLnR5cGUpcmV0dXJuIGVbdF07ZS5wb3AoKX19ZnVuY3Rpb24gd28oZSx0KXtlLmlmQ29uZGl0aW9uc3x8KGUuaWZDb25kaXRpb25zPVtdKSxlLmlmQ29uZGl0aW9ucy5wdXNoKHQpfWZ1bmN0aW9uIF9vKGUpe251bGwhPUtuKGUsInYtb25jZSIpJiYoZS5vbmNlPSEwKX1mdW5jdGlvbiBDbyhlKXt2YXIgdDsidGVtcGxhdGUiPT09ZS50YWc/KHQ9S24oZSwic2NvcGUiKSxlLnNsb3RTY29wZT10fHxLbihlLCJzbG90LXNjb3BlIikpOih0PUtuKGUsInNsb3Qtc2NvcGUiKSkmJihlLnNsb3RTY29wZT10KTt2YXIgbj1KbihlLCJzbG90Iik7aWYobiYmKGUuc2xvdFRhcmdldD0nIiInPT09bj8nImRlZmF1bHQiJzpuLGUuc2xvdFRhcmdldER5bmFtaWM9ISghZS5hdHRyc01hcFsiOnNsb3QiXSYmIWUuYXR0cnNNYXBbInYtYmluZDpzbG90Il0pLCJ0ZW1wbGF0ZSI9PT1lLnRhZ3x8ZS5zbG90U2NvcGV8fEJuKGUsInNsb3QiLG4sWG4oZSwic2xvdCIpKSksInRlbXBsYXRlIj09PWUudGFnKXt2YXIgcj1HbihlLHljKTtpZihyKXt2YXIgbz1UbyhyKSxpPW8ubmFtZSxhPW8uZHluYW1pYztlLnNsb3RUYXJnZXQ9aSxlLnNsb3RUYXJnZXREeW5hbWljPWEsZS5zbG90U2NvcGU9ci52YWx1ZXx8d2N9fWVsc2V7dmFyIHM9R24oZSx5Yyk7aWYocyl7dmFyIHU9ZS5zY29wZWRTbG90c3x8KGUuc2NvcGVkU2xvdHM9e30pLGM9VG8ocyksbD1jLm5hbWUsZj1jLmR5bmFtaWMscD11W2xdPXVvKCJ0ZW1wbGF0ZSIsW10sZSk7cC5zbG90VGFyZ2V0PWwscC5zbG90VGFyZ2V0RHluYW1pYz1mLHAuY2hpbGRyZW49ZS5jaGlsZHJlbi5maWx0ZXIoZnVuY3Rpb24oZSl7aWYoIWUuc2xvdFNjb3BlKXJldHVybiBlLnBhcmVudD1wLCEwfSkscC5zbG90U2NvcGU9cy52YWx1ZXx8d2MsZS5jaGlsZHJlbj1bXSxlLnBsYWluPSExfX19ZnVuY3Rpb24gVG8oZSl7dmFyIHQ9ZS5uYW1lLnJlcGxhY2UoeWMsIiIpO3JldHVybiB0fHwiIyIhPT1lLm5hbWVbMF0mJih0PSJkZWZhdWx0IiksZGMudGVzdCh0KT97bmFtZTp0LnNsaWNlKDEsLTEpLGR5bmFtaWM6ITB9OntuYW1lOiciJyt0KyciJyxkeW5hbWljOiExfX1mdW5jdGlvbiBrbyhlKXsic2xvdCI9PT1lLnRhZyYmKGUuc2xvdE5hbWU9Sm4oZSwibmFtZSIpKX1mdW5jdGlvbiBBbyhlKXt2YXIgdDsodD1KbihlLCJpcyIpKSYmKGUuY29tcG9uZW50PXQpLG51bGwhPUtuKGUsImlubGluZS10ZW1wbGF0ZSIpJiYoZS5pbmxpbmVUZW1wbGF0ZT0hMCl9ZnVuY3Rpb24gU28oZSl7dmFyIHQsbixyLG8saSxhLHMsdSxjPWUuYXR0cnNMaXN0O2Zvcih0PTAsbj1jLmxlbmd0aDt0PG47dCsrKWlmKHI9bz1jW3RdLm5hbWUsaT1jW3RdLnZhbHVlLGNjLnRlc3QocikpaWYoZS5oYXNCaW5kaW5ncz0hMCxhPUVvKHIucmVwbGFjZShjYywiIikpLGEmJihyPXIucmVwbGFjZShtYywiIikpLHZjLnRlc3Qocikpcj1yLnJlcGxhY2UodmMsIiIpLGk9SW4oaSksdT1kYy50ZXN0KHIpLHUmJihyPXIuc2xpY2UoMSwtMSkpLGEmJihhLnByb3AmJiF1JiYiaW5uZXJIdG1sIj09PShyPU9pKHIpKSYmKHI9ImlubmVySFRNTCIpLGEuY2FtZWwmJiF1JiYocj1PaShyKSksYS5zeW5jJiYocz1abihpLCIkZXZlbnQiKSx1P1ZuKGUsJyJ1cGRhdGU6IisoJytyKyIpIixzLG51bGwsITEsVHUsY1t0XSwhMCk6KFZuKGUsInVwZGF0ZToiK09pKHIpLHMsbnVsbCwhMSxUdSxjW3RdKSxEaShyKSE9PU9pKHIpJiZWbihlLCJ1cGRhdGU6IitEaShyKSxzLG51bGwsITEsVHUsY1t0XSkpKSksYSYmYS5wcm9wfHwhZS5jb21wb25lbnQmJk91KGUudGFnLGUuYXR0cnNNYXAudHlwZSxyKT9GbihlLHIsaSxjW3RdLHUpOkJuKGUscixpLGNbdF0sdSk7ZWxzZSBpZih1Yy50ZXN0KHIpKXI9ci5yZXBsYWNlKHVjLCIiKSx1PWRjLnRlc3QociksdSYmKHI9ci5zbGljZSgxLC0xKSksVm4oZSxyLGksYSwhMSxUdSxjW3RdLHUpO2Vsc2V7cj1yLnJlcGxhY2UoY2MsIiIpO3ZhciBsPXIubWF0Y2goaGMpLGY9bCYmbFsxXTt1PSExLGYmJihyPXIuc2xpY2UoMCwtKGYubGVuZ3RoKzEpKSxkYy50ZXN0KGYpJiYoZj1mLnNsaWNlKDEsLTEpLHU9ITApKSxXbihlLHIsbyxpLGYsdSxhLGNbdF0pfWVsc2V7Qm4oZSxyLEpTT04uc3RyaW5naWZ5KGkpLGNbdF0pLCFlLmNvbXBvbmVudCYmIm11dGVkIj09PXImJk91KGUudGFnLGUuYXR0cnNNYXAudHlwZSxyKSYmRm4oZSxyLCJ0cnVlIixjW3RdKX19ZnVuY3Rpb24gJG8oZSl7Zm9yKHZhciB0PWU7dDspe2lmKHZvaWQgMCE9PXQuZm9yKXJldHVybiEwO3Q9dC5wYXJlbnR9cmV0dXJuITF9ZnVuY3Rpb24gRW8oZSl7dmFyIHQ9ZS5tYXRjaChtYyk7aWYodCl7dmFyIG49e307cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihlKXtuW2Uuc2xpY2UoMSldPSEwfSksbn19ZnVuY3Rpb24gT28oZSl7Zm9yKHZhciB0PXt9LG49MCxyPWUubGVuZ3RoO248cjtuKyspdFtlW25dLm5hbWVdPWVbbl0udmFsdWU7cmV0dXJuIHR9ZnVuY3Rpb24gam8oZSl7cmV0dXJuInNjcmlwdCI9PT1lLnRhZ3x8InN0eWxlIj09PWUudGFnfWZ1bmN0aW9uIE5vKGUpe3JldHVybiJzdHlsZSI9PT1lLnRhZ3x8InNjcmlwdCI9PT1lLnRhZyYmKCFlLmF0dHJzTWFwLnR5cGV8fCJ0ZXh0L2phdmFzY3JpcHQiPT09ZS5hdHRyc01hcC50eXBlKX1mdW5jdGlvbiBEbyhlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO19jLnRlc3Qoci5uYW1lKXx8KHIubmFtZT1yLm5hbWUucmVwbGFjZShDYywiIiksdC5wdXNoKHIpKX1yZXR1cm4gdH1mdW5jdGlvbiBMbyhlLHQpe2lmKCJpbnB1dCI9PT1lLnRhZyl7dmFyIG49ZS5hdHRyc01hcDtpZighblsidi1tb2RlbCJdKXJldHVybjt2YXIgcjtpZigoblsiOnR5cGUiXXx8blsidi1iaW5kOnR5cGUiXSkmJihyPUpuKGUsInR5cGUiKSksbi50eXBlfHxyfHwhblsidi1iaW5kIl18fChyPSIoIituWyJ2LWJpbmQiXSsiKS50eXBlIikscil7dmFyIG89S24oZSwidi1pZiIsITApLGk9bz8iJiYoIitvKyIpIjoiIixhPW51bGwhPUtuKGUsInYtZWxzZSIsITApLHM9S24oZSwidi1lbHNlLWlmIiwhMCksdT1SbyhlKTttbyh1KSxVbih1LCJ0eXBlIiwiY2hlY2tib3giKSxwbyh1LHQpLHUucHJvY2Vzc2VkPSEwLHUuaWY9IigiK3IrIik9PT0nY2hlY2tib3gnIitpLHdvKHUse2V4cDp1LmlmLGJsb2NrOnV9KTt2YXIgYz1SbyhlKTtLbihjLCJ2LWZvciIsITApLFVuKGMsInR5cGUiLCJyYWRpbyIpLHBvKGMsdCksd28odSx7ZXhwOiIoIityKyIpPT09J3JhZGlvJyIraSxibG9jazpjfSk7dmFyIGw9Um8oZSk7cmV0dXJuIEtuKGwsInYtZm9yIiwhMCksVW4obCwiOnR5cGUiLHIpLHBvKGwsdCksd28odSx7ZXhwOm8sYmxvY2s6bH0pLGE/dS5lbHNlPSEwOnMmJih1LmVsc2VpZj1zKSx1fX19ZnVuY3Rpb24gUm8oZSl7cmV0dXJuIHVvKGUudGFnLGUuYXR0cnNMaXN0LnNsaWNlKCksZS5wYXJlbnQpfWZ1bmN0aW9uIE1vKGUsdCl7dC52YWx1ZSYmRm4oZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiLHQpfWZ1bmN0aW9uIElvKGUsdCl7dC52YWx1ZSYmRm4oZSwiaW5uZXJIVE1MIiwiX3MoIit0LnZhbHVlKyIpIix0KX1mdW5jdGlvbiBQbyhlLHQpe2UmJihEdT0kYyh0LnN0YXRpY0tleXN8fCIiKSxMdT10LmlzUmVzZXJ2ZWRUYWd8fFJpLEhvKGUpLEZvKGUsITEpKX1mdW5jdGlvbiBxbyhlKXtyZXR1cm4gdigidHlwZSx0YWcsYXR0cnNMaXN0LGF0dHJzTWFwLHBsYWluLHBhcmVudCxjaGlsZHJlbixhdHRycyxzdGFydCxlbmQscmF3QXR0cnNNYXAiKyhlPyIsIitlOiIiKSl9ZnVuY3Rpb24gSG8oZSl7aWYoZS5zdGF0aWM9Qm8oZSksMT09PWUudHlwZSl7aWYoIUx1KGUudGFnKSYmInNsb3QiIT09ZS50YWcmJm51bGw9PWUuYXR0cnNNYXBbImlubGluZS10ZW1wbGF0ZSJdKXJldHVybjtmb3IodmFyIHQ9MCxuPWUuY2hpbGRyZW4ubGVuZ3RoO3Q8bjt0Kyspe3ZhciByPWUuY2hpbGRyZW5bdF07SG8ociksci5zdGF0aWN8fChlLnN0YXRpYz0hMSl9aWYoZS5pZkNvbmRpdGlvbnMpZm9yKHZhciBvPTEsaT1lLmlmQ29uZGl0aW9ucy5sZW5ndGg7bzxpO28rKyl7dmFyIGE9ZS5pZkNvbmRpdGlvbnNbb10uYmxvY2s7SG8oYSksYS5zdGF0aWN8fChlLnN0YXRpYz0hMSl9fX1mdW5jdGlvbiBGbyhlLHQpe2lmKDE9PT1lLnR5cGUpe2lmKChlLnN0YXRpY3x8ZS5vbmNlKSYmKGUuc3RhdGljSW5Gb3I9dCksZS5zdGF0aWMmJmUuY2hpbGRyZW4ubGVuZ3RoJiYoMSE9PWUuY2hpbGRyZW4ubGVuZ3RofHwzIT09ZS5jaGlsZHJlblswXS50eXBlKSlyZXR1cm4gdm9pZChlLnN0YXRpY1Jvb3Q9ITApO2lmKGUuc3RhdGljUm9vdD0hMSxlLmNoaWxkcmVuKWZvcih2YXIgbj0wLHI9ZS5jaGlsZHJlbi5sZW5ndGg7bjxyO24rKylGbyhlLmNoaWxkcmVuW25dLHR8fCEhZS5mb3IpO2lmKGUuaWZDb25kaXRpb25zKWZvcih2YXIgbz0xLGk9ZS5pZkNvbmRpdGlvbnMubGVuZ3RoO288aTtvKyspRm8oZS5pZkNvbmRpdGlvbnNbb10uYmxvY2ssdCl9fWZ1bmN0aW9uIEJvKGUpe3JldHVybiAyIT09ZS50eXBlJiYoMz09PWUudHlwZXx8ISghZS5wcmUmJihlLmhhc0JpbmRpbmdzfHxlLmlmfHxlLmZvcnx8QWkoZS50YWcpfHwhTHUoZS50YWcpfHxVbyhlKXx8IU9iamVjdC5rZXlzKGUpLmV2ZXJ5KER1KSkpKX1mdW5jdGlvbiBVbyhlKXtmb3IoO2UucGFyZW50Oyl7aWYoZT1lLnBhcmVudCwidGVtcGxhdGUiIT09ZS50YWcpcmV0dXJuITE7aWYoZS5mb3IpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gV28oZSx0KXt2YXIgbj10PyJuYXRpdmVPbjoiOiJvbjoiLHI9IiIsbz0iIjtmb3IodmFyIGkgaW4gZSl7dmFyIGE9em8oZVtpXSk7ZVtpXSYmZVtpXS5keW5hbWljP28rPWkrIiwiK2ErIiwiOnIrPSciJytpKyciOicrYSsiLCJ9cmV0dXJuIHI9InsiK3Iuc2xpY2UoMCwtMSkrIn0iLG8/bisiX2QoIityKyIsWyIrby5zbGljZSgwLC0xKSsiXSkiOm4rcn1mdW5jdGlvbiB6byhlKXtpZighZSlyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiJbIitlLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gem8oZSl9KS5qb2luKCIsIikrIl0iO3ZhciB0PWpjLnRlc3QoZS52YWx1ZSksbj1FYy50ZXN0KGUudmFsdWUpLHI9amMudGVzdChlLnZhbHVlLnJlcGxhY2UoT2MsIiIpKTtpZihlLm1vZGlmaWVycyl7dmFyIG89IiIsaT0iIixhPVtdO2Zvcih2YXIgcyBpbiBlLm1vZGlmaWVycylpZihSY1tzXSlpKz1SY1tzXSxOY1tzXSYmYS5wdXNoKHMpO2Vsc2UgaWYoImV4YWN0Ij09PXMpe3ZhciB1PWUubW9kaWZpZXJzO2krPUxjKFsiY3RybCIsInNoaWZ0IiwiYWx0IiwibWV0YSJdLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hdVtlXX0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4iJGV2ZW50LiIrZSsiS2V5In0pLmpvaW4oInx8IikpfWVsc2UgYS5wdXNoKHMpO2EubGVuZ3RoJiYobys9Vm8oYSkpLGkmJihvKz1pKTtyZXR1cm4iZnVuY3Rpb24oJGV2ZW50KXsiK28rKHQ/InJldHVybiAiK2UudmFsdWUrIi5hcHBseShudWxsLCBhcmd1bWVudHMpIjpuPyJyZXR1cm4gKCIrZS52YWx1ZSsiKS5hcHBseShudWxsLCBhcmd1bWVudHMpIjpyPyJyZXR1cm4gIitlLnZhbHVlOmUudmFsdWUpKyJ9In1yZXR1cm4gdHx8bj9lLnZhbHVlOiJmdW5jdGlvbigkZXZlbnQpeyIrKHI/InJldHVybiAiK2UudmFsdWU6ZS52YWx1ZSkrIn0ifWZ1bmN0aW9uIFZvKGUpe3JldHVybiJpZighJGV2ZW50LnR5cGUuaW5kZXhPZigna2V5JykmJiIrZS5tYXAoWG8pLmpvaW4oIiYmIikrIilyZXR1cm4gbnVsbDsifWZ1bmN0aW9uIFhvKGUpe3ZhciB0PXBhcnNlSW50KGUsMTApO2lmKHQpcmV0dXJuIiRldmVudC5rZXlDb2RlIT09Iit0O3ZhciBuPU5jW2VdLHI9RGNbZV07cmV0dXJuIl9rKCRldmVudC5rZXlDb2RlLCIrSlNPTi5zdHJpbmdpZnkoZSkrIiwiK0pTT04uc3RyaW5naWZ5KG4pKyIsJGV2ZW50LmtleSwiK0pTT04uc3RyaW5naWZ5KHIpKyIpIn1mdW5jdGlvbiBKbyhlLHQpe2Uud3JhcExpc3RlbmVycz1mdW5jdGlvbihlKXtyZXR1cm4iX2coIitlKyIsIit0LnZhbHVlKyIpIn19ZnVuY3Rpb24gS28oZSx0KXtlLndyYXBEYXRhPWZ1bmN0aW9uKG4pe3JldHVybiJfYigiK24rIiwnIitlLnRhZysiJywiK3QudmFsdWUrIiwiKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMucHJvcD8idHJ1ZSI6ImZhbHNlIikrKHQubW9kaWZpZXJzJiZ0Lm1vZGlmaWVycy5zeW5jPyIsdHJ1ZSI6IiIpKyIpIn19ZnVuY3Rpb24gR28oZSx0KXt2YXIgbj1uZXcgSWModCk7cmV0dXJue3JlbmRlcjoid2l0aCh0aGlzKXtyZXR1cm4gIisoZT8ic2NyaXB0Ij09PWUudGFnPyJudWxsIjpZbyhlLG4pOidfYygiZGl2IiknKSsifSIsc3RhdGljUmVuZGVyRm5zOm4uc3RhdGljUmVuZGVyRm5zfX1mdW5jdGlvbiBZbyhlLHQpe2lmKGUucGFyZW50JiYoZS5wcmU9ZS5wcmV8fGUucGFyZW50LnByZSksZS5zdGF0aWNSb290JiYhZS5zdGF0aWNQcm9jZXNzZWQpcmV0dXJuIFFvKGUsdCk7aWYoZS5vbmNlJiYhZS5vbmNlUHJvY2Vzc2VkKXJldHVybiBabyhlLHQpO2lmKGUuZm9yJiYhZS5mb3JQcm9jZXNzZWQpcmV0dXJuIG5pKGUsdCk7aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQpcmV0dXJuIGVpKGUsdCk7aWYoInRlbXBsYXRlIiE9PWUudGFnfHxlLnNsb3RUYXJnZXR8fHQucHJlKXtpZigic2xvdCI9PT1lLnRhZylyZXR1cm4gbWkoZSx0KTt2YXIgbjtpZihlLmNvbXBvbmVudCluPXlpKGUuY29tcG9uZW50LGUsdCk7ZWxzZXt2YXIgcjsoIWUucGxhaW58fGUucHJlJiZ0Lm1heWJlQ29tcG9uZW50KGUpKSYmKHI9cmkoZSx0KSk7dmFyIG89ZS5pbmxpbmVUZW1wbGF0ZT9udWxsOmxpKGUsdCwhMCk7bj0iX2MoJyIrZS50YWcrIiciKyhyPyIsIityOiIiKSsobz8iLCIrbzoiIikrIikifWZvcih2YXIgaT0wO2k8dC50cmFuc2Zvcm1zLmxlbmd0aDtpKyspbj10LnRyYW5zZm9ybXNbaV0oZSxuKTtyZXR1cm4gbn1yZXR1cm4gbGkoZSx0KXx8InZvaWQgMCJ9ZnVuY3Rpb24gUW8oZSx0KXtlLnN0YXRpY1Byb2Nlc3NlZD0hMDt2YXIgbj10LnByZTtyZXR1cm4gZS5wcmUmJih0LnByZT1lLnByZSksdC5zdGF0aWNSZW5kZXJGbnMucHVzaCgid2l0aCh0aGlzKXtyZXR1cm4gIitZbyhlLHQpKyJ9IiksdC5wcmU9biwiX20oIisodC5zdGF0aWNSZW5kZXJGbnMubGVuZ3RoLTEpKyhlLnN0YXRpY0luRm9yPyIsdHJ1ZSI6IiIpKyIpIn1mdW5jdGlvbiBabyhlLHQpe2lmKGUub25jZVByb2Nlc3NlZD0hMCxlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gZWkoZSx0KTtpZihlLnN0YXRpY0luRm9yKXtmb3IodmFyIG49IiIscj1lLnBhcmVudDtyOyl7aWYoci5mb3Ipe249ci5rZXk7YnJlYWt9cj1yLnBhcmVudH1yZXR1cm4gbj8iX28oIitZbyhlLHQpKyIsIit0Lm9uY2VJZCsrKyIsIituKyIpIjpZbyhlLHQpfXJldHVybiBRbyhlLHQpfWZ1bmN0aW9uIGVpKGUsdCxuLHIpe3JldHVybiBlLmlmUHJvY2Vzc2VkPSEwLHRpKGUuaWZDb25kaXRpb25zLnNsaWNlKCksdCxuLHIpfWZ1bmN0aW9uIHRpKGUsdCxuLHIpe2Z1bmN0aW9uIG8oZSl7cmV0dXJuIG4/bihlLHQpOmUub25jZT9abyhlLHQpOllvKGUsdCl9aWYoIWUubGVuZ3RoKXJldHVybiByfHwiX2UoKSI7dmFyIGk9ZS5zaGlmdCgpO3JldHVybiBpLmV4cD8iKCIraS5leHArIik/IitvKGkuYmxvY2spKyI6Iit0aShlLHQsbixyKToiIitvKGkuYmxvY2spfWZ1bmN0aW9uIG5pKGUsdCxuLHIpe3ZhciBvPWUuZm9yLGk9ZS5hbGlhcyxhPWUuaXRlcmF0b3IxPyIsIitlLml0ZXJhdG9yMToiIixzPWUuaXRlcmF0b3IyPyIsIitlLml0ZXJhdG9yMjoiIjtyZXR1cm4gZS5mb3JQcm9jZXNzZWQ9ITAsKHJ8fCJfbCIpKyIoKCIrbysiKSxmdW5jdGlvbigiK2krYStzKyIpe3JldHVybiAiKyhufHxZbykoZSx0KSsifSkifWZ1bmN0aW9uIHJpKGUsdCl7dmFyIG49InsiLHI9b2koZSx0KTtyJiYobis9cisiLCIpLGUua2V5JiYobis9ImtleToiK2Uua2V5KyIsIiksZS5yZWYmJihuKz0icmVmOiIrZS5yZWYrIiwiKSxlLnJlZkluRm9yJiYobis9InJlZkluRm9yOnRydWUsIiksZS5wcmUmJihuKz0icHJlOnRydWUsIiksZS5jb21wb25lbnQmJihuKz0ndGFnOiInK2UudGFnKyciLCcpO2Zvcih2YXIgbz0wO288dC5kYXRhR2VuRm5zLmxlbmd0aDtvKyspbis9dC5kYXRhR2VuRm5zW29dKGUpO2lmKGUuYXR0cnMmJihuKz0iYXR0cnM6IitnaShlLmF0dHJzKSsiLCIpLGUucHJvcHMmJihuKz0iZG9tUHJvcHM6IitnaShlLnByb3BzKSsiLCIpLGUuZXZlbnRzJiYobis9V28oZS5ldmVudHMsITEpKyIsIiksZS5uYXRpdmVFdmVudHMmJihuKz1XbyhlLm5hdGl2ZUV2ZW50cywhMCkrIiwiKSxlLnNsb3RUYXJnZXQmJiFlLnNsb3RTY29wZSYmKG4rPSJzbG90OiIrZS5zbG90VGFyZ2V0KyIsIiksZS5zY29wZWRTbG90cyYmKG4rPWFpKGUsZS5zY29wZWRTbG90cyx0KSsiLCIpLGUubW9kZWwmJihuKz0ibW9kZWw6e3ZhbHVlOiIrZS5tb2RlbC52YWx1ZSsiLGNhbGxiYWNrOiIrZS5tb2RlbC5jYWxsYmFjaysiLGV4cHJlc3Npb246IitlLm1vZGVsLmV4cHJlc3Npb24rIn0sIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIGk9aWkoZSx0KTtpJiYobis9aSsiLCIpfXJldHVybiBuPW4ucmVwbGFjZSgvLCQvLCIiKSsifSIsZS5keW5hbWljQXR0cnMmJihuPSJfYigiK24rJywiJytlLnRhZysnIiwnK2dpKGUuZHluYW1pY0F0dHJzKSsiKSIpLGUud3JhcERhdGEmJihuPWUud3JhcERhdGEobikpLGUud3JhcExpc3RlbmVycyYmKG49ZS53cmFwTGlzdGVuZXJzKG4pKSxufWZ1bmN0aW9uIG9pKGUsdCl7dmFyIG49ZS5kaXJlY3RpdmVzO2lmKG4pe3ZhciByLG8saSxhLHM9ImRpcmVjdGl2ZXM6WyIsdT0hMTtmb3Iocj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7aT1uW3JdLGE9ITA7dmFyIGM9dC5kaXJlY3RpdmVzW2kubmFtZV07YyYmKGE9ISFjKGUsaSx0Lndhcm4pKSxhJiYodT0hMCxzKz0ne25hbWU6IicraS5uYW1lKyciLHJhd05hbWU6IicraS5yYXdOYW1lKyciJysoaS52YWx1ZT8iLHZhbHVlOigiK2kudmFsdWUrIiksZXhwcmVzc2lvbjoiK0pTT04uc3RyaW5naWZ5KGkudmFsdWUpOiIiKSsoaS5hcmc/Iixhcmc6IisoaS5pc0R5bmFtaWNBcmc/aS5hcmc6JyInK2kuYXJnKyciJyk6IiIpKyhpLm1vZGlmaWVycz8iLG1vZGlmaWVyczoiK0pTT04uc3RyaW5naWZ5KGkubW9kaWZpZXJzKToiIikrIn0sIil9cmV0dXJuIHU/cy5zbGljZSgwLC0xKSsiXSI6dm9pZCAwfX1mdW5jdGlvbiBpaShlLHQpe3ZhciBuPWUuY2hpbGRyZW5bMF07aWYobiYmMT09PW4udHlwZSl7dmFyIHI9R28obix0Lm9wdGlvbnMpO3JldHVybiJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IityLnJlbmRlcisifSxzdGF0aWNSZW5kZXJGbnM6WyIrci5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbigpeyIrZSsifSJ9KS5qb2luKCIsIikrIl19In19ZnVuY3Rpb24gYWkoZSx0LG4pe3ZhciByPWUuZm9yfHxPYmplY3Qua2V5cyh0KS5zb21lKGZ1bmN0aW9uKGUpe3ZhciBuPXRbZV07cmV0dXJuIG4uc2xvdFRhcmdldER5bmFtaWN8fG4uaWZ8fG4uZm9yfHx1aShuKX0pLG89ISFlLmlmO2lmKCFyKWZvcih2YXIgaT1lLnBhcmVudDtpOyl7aWYoaS5zbG90U2NvcGUmJmkuc2xvdFNjb3BlIT09d2N8fGkuZm9yKXtyPSEwO2JyZWFrfWkuaWYmJihvPSEwKSxpPWkucGFyZW50fXZhciBhPU9iamVjdC5rZXlzKHQpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gY2kodFtlXSxuKX0pLmpvaW4oIiwiKTtyZXR1cm4ic2NvcGVkU2xvdHM6X3UoWyIrYSsiXSIrKHI/IixudWxsLHRydWUiOiIiKSsoIXImJm8/IixudWxsLGZhbHNlLCIrc2koYSk6IiIpKyIpIn1mdW5jdGlvbiBzaShlKXtmb3IodmFyIHQ9NTM4MSxuPWUubGVuZ3RoO247KXQ9MzMqdF5lLmNoYXJDb2RlQXQoLS1uKTtyZXR1cm4gdD4+PjB9ZnVuY3Rpb24gdWkoZSl7cmV0dXJuIDE9PT1lLnR5cGUmJigic2xvdCI9PT1lLnRhZ3x8ZS5jaGlsZHJlbi5zb21lKHVpKSl9ZnVuY3Rpb24gY2koZSx0KXt2YXIgbj1lLmF0dHJzTWFwWyJzbG90LXNjb3BlIl07aWYoZS5pZiYmIWUuaWZQcm9jZXNzZWQmJiFuKXJldHVybiBlaShlLHQsY2ksIm51bGwiKTtpZihlLmZvciYmIWUuZm9yUHJvY2Vzc2VkKXJldHVybiBuaShlLHQsY2kpO3ZhciByPWUuc2xvdFNjb3BlPT09d2M/IiI6U3RyaW5nKGUuc2xvdFNjb3BlKSxvPSJmdW5jdGlvbigiK3IrIil7cmV0dXJuICIrKCJ0ZW1wbGF0ZSI9PT1lLnRhZz9lLmlmJiZuPyIoIitlLmlmKyIpPyIrKGxpKGUsdCl8fCJ1bmRlZmluZWQiKSsiOnVuZGVmaW5lZCI6bGkoZSx0KXx8InVuZGVmaW5lZCI6WW8oZSx0KSkrIn0iLGk9cj8iIjoiLHByb3h5OnRydWUiO3JldHVybiJ7a2V5OiIrKGUuc2xvdFRhcmdldHx8JyJkZWZhdWx0IicpKyIsZm46IitvK2krIn0ifWZ1bmN0aW9uIGxpKGUsdCxuLHIsbyl7dmFyIGk9ZS5jaGlsZHJlbjtpZihpLmxlbmd0aCl7dmFyIGE9aVswXTtpZigxPT09aS5sZW5ndGgmJmEuZm9yJiYidGVtcGxhdGUiIT09YS50YWcmJiJzbG90IiE9PWEudGFnKXt2YXIgcz1uP3QubWF5YmVDb21wb25lbnQoYSk/IiwxIjoiLDAiOiIiO3JldHVybiIiKyhyfHxZbykoYSx0KStzfXZhciB1PW4/ZmkoaSx0Lm1heWJlQ29tcG9uZW50KTowLGM9b3x8ZGk7cmV0dXJuIlsiK2kubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBjKGUsdCl9KS5qb2luKCIsIikrIl0iKyh1PyIsIit1OiIiKX19ZnVuY3Rpb24gZmkoZSx0KXtmb3IodmFyIG49MCxyPTA7cjxlLmxlbmd0aDtyKyspe3ZhciBvPWVbcl07aWYoMT09PW8udHlwZSl7aWYocGkobyl8fG8uaWZDb25kaXRpb25zJiZvLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBwaShlLmJsb2NrKX0pKXtuPTI7YnJlYWt9KHQobyl8fG8uaWZDb25kaXRpb25zJiZvLmlmQ29uZGl0aW9ucy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiB0KGUuYmxvY2spfSkpJiYobj0xKX19cmV0dXJuIG59ZnVuY3Rpb24gcGkoZSl7cmV0dXJuIHZvaWQgMCE9PWUuZm9yfHwidGVtcGxhdGUiPT09ZS50YWd8fCJzbG90Ij09PWUudGFnfWZ1bmN0aW9uIGRpKGUsdCl7cmV0dXJuIDE9PT1lLnR5cGU/WW8oZSx0KTozPT09ZS50eXBlJiZlLmlzQ29tbWVudD92aShlKTpoaShlKX1mdW5jdGlvbiBoaShlKXtyZXR1cm4iX3YoIisoMj09PWUudHlwZT9lLmV4cHJlc3Npb246YmkoSlNPTi5zdHJpbmdpZnkoZS50ZXh0KSkpKyIpIn1mdW5jdGlvbiB2aShlKXtyZXR1cm4iX2UoIitKU09OLnN0cmluZ2lmeShlLnRleHQpKyIpIn1mdW5jdGlvbiBtaShlLHQpe3ZhciBuPWUuc2xvdE5hbWV8fCciZGVmYXVsdCInLHI9bGkoZSx0KSxvPSJfdCgiK24rKHI/IixmdW5jdGlvbigpe3JldHVybiAiK3IrIn0iOiIiKSxpPWUuYXR0cnN8fGUuZHluYW1pY0F0dHJzP2dpKChlLmF0dHJzfHxbXSkuY29uY2F0KGUuZHluYW1pY0F0dHJzfHxbXSkubWFwKGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOk9pKGUubmFtZSksdmFsdWU6ZS52YWx1ZSxkeW5hbWljOmUuZHluYW1pY319KSk6bnVsbCxhPWUuYXR0cnNNYXBbInYtYmluZCJdO3JldHVybiFpJiYhYXx8cnx8KG8rPSIsbnVsbCIpLGkmJihvKz0iLCIraSksYSYmKG8rPShpPyIiOiIsbnVsbCIpKyIsIithKSxvKyIpIn1mdW5jdGlvbiB5aShlLHQsbil7dmFyIHI9dC5pbmxpbmVUZW1wbGF0ZT9udWxsOmxpKHQsbiwhMCk7cmV0dXJuIl9jKCIrZSsiLCIrcmkodCxuKSsocj8iLCIrcjoiIikrIikifWZ1bmN0aW9uIGdpKGUpe2Zvcih2YXIgdD0iIixuPSIiLHI9MDtyPGUubGVuZ3RoO3IrKyl7dmFyIG89ZVtyXSxpPWJpKG8udmFsdWUpO28uZHluYW1pYz9uKz1vLm5hbWUrIiwiK2krIiwiOnQrPSciJytvLm5hbWUrJyI6JytpKyIsIn1yZXR1cm4gdD0ieyIrdC5zbGljZSgwLC0xKSsifSIsbj8iX2QoIit0KyIsWyIrbi5zbGljZSgwLC0xKSsiXSkiOnR9ZnVuY3Rpb24gYmkoZSl7cmV0dXJuIGUucmVwbGFjZSgvXHUyMDI4L2csIlxcdTIwMjgiKS5yZXBsYWNlKC9cdTIwMjkvZywiXFx1MjAyOSIpfWZ1bmN0aW9uIHhpKGUsdCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oZSl9Y2F0Y2gobil7cmV0dXJuIHQucHVzaCh7ZXJyOm4sY29kZTplfSksVH19ZnVuY3Rpb24gd2koZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obixyLG8pe3I9Xyh7fSxyKTtyLndhcm47ZGVsZXRlIHIud2Fybjt2YXIgaT1yLmRlbGltaXRlcnM/U3RyaW5nKHIuZGVsaW1pdGVycykrbjpuO2lmKHRbaV0pcmV0dXJuIHRbaV07dmFyIGE9ZShuLHIpLHM9e30sdT1bXTtyZXR1cm4gcy5yZW5kZXI9eGkoYS5yZW5kZXIsdSkscy5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiB4aShlLHUpfSksdFtpXT1zfX1mdW5jdGlvbiBfaShlKXtyZXR1cm4gUnU9UnV8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLFJ1LmlubmVySFRNTD1lPyc8YSBocmVmPSJcbiIvPic6JzxkaXYgYT0iXG4iLz4nLFJ1LmlubmVySFRNTC5pbmRleE9mKCImIzEwOyIpPjB9ZnVuY3Rpb24gQ2koZSl7aWYoZS5vdXRlckhUTUwpcmV0dXJuIGUub3V0ZXJIVE1MO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmFwcGVuZENoaWxkKGUuY2xvbmVOb2RlKCEwKSksdC5pbm5lckhUTUx9LyohCisgKiBWdWUuanMgdjIuNi4xNAorICogKGMpIDIwMTQtMjAyMSBFdmFuIFlvdQorICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgorICovCit2YXIgVGk9T2JqZWN0LmZyZWV6ZSh7fSksa2k9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxBaT12KCJzbG90LGNvbXBvbmVudCIsITApLFNpPXYoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIiksJGk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxFaT0vLShcdykvZyxPaT1nKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoRWksZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLGppPWcoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLE5pPS9cQihbQS1aXSkvZyxEaT1nKGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UoTmksIi0kMSIpLnRvTG93ZXJDYXNlKCl9KSxMaT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD94OmIsUmk9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxNaT1mdW5jdGlvbihlKXtyZXR1cm4gZX0sSWk9ImRhdGEtc2VydmVyLXJlbmRlcmVkIixQaT1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLHFpPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIiwic2VydmVyUHJlZmV0Y2giXSxIaT17b3B0aW9uTWVyZ2VTdHJhdGVnaWVzOk9iamVjdC5jcmVhdGUobnVsbCksc2lsZW50OiExLHByb2R1Y3Rpb25UaXA6ITEsZGV2dG9vbHM6ITEscGVyZm9ybWFuY2U6ITEsZXJyb3JIYW5kbGVyOm51bGwsd2FybkhhbmRsZXI6bnVsbCxpZ25vcmVkRWxlbWVudHM6W10sa2V5Q29kZXM6T2JqZWN0LmNyZWF0ZShudWxsKSxpc1Jlc2VydmVkVGFnOlJpLGlzUmVzZXJ2ZWRBdHRyOlJpLGlzVW5rbm93bkVsZW1lbnQ6UmksZ2V0VGFnTmFtZXNwYWNlOlQscGFyc2VQbGF0Zm9ybVRhZ05hbWU6TWksbXVzdFVzZVByb3A6UmksYXN5bmM6ITAsX2xpZmVjeWNsZUhvb2tzOnFpfSxGaT0vYS16QS1aXHUwMEI3XHUwMEMwLVx1MDBENlx1MDBEOC1cdTAwRjZcdTAwRjgtXHUwMzdEXHUwMzdGLVx1MUZGRlx1MjAwQy1cdTIwMERcdTIwM0YtXHUyMDQwXHUyMDcwLVx1MjE4Rlx1MkMwMC1cdTJGRUZcdTMwMDEtXHVEN0ZGXHVGOTAwLVx1RkRDRlx1RkRGMC1cdUZGRkQvLEJpPW5ldyBSZWdFeHAoIlteIitGaS5zb3VyY2UrIi4kX1xcZF0iKSxVaT0iX19wcm90b19fImlue30sV2k9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3csemk9InVuZGVmaW5lZCIhPXR5cGVvZiBXWEVudmlyb25tZW50JiYhIVdYRW52aXJvbm1lbnQucGxhdGZvcm0sVmk9emkmJldYRW52aXJvbm1lbnQucGxhdGZvcm0udG9Mb3dlckNhc2UoKSxYaT1XaSYmd2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQudG9Mb3dlckNhc2UoKSxKaT1YaSYmL21zaWV8dHJpZGVudC8udGVzdChYaSksS2k9WGkmJlhpLmluZGV4T2YoIm1zaWUgOS4wIik+MCxHaT1YaSYmWGkuaW5kZXhPZigiZWRnZS8iKT4wLFlpPShYaSYmWGkuaW5kZXhPZigiYW5kcm9pZCIpLFhpJiYvaXBob25lfGlwYWR8aXBvZHxpb3MvLnRlc3QoWGkpfHwiaW9zIj09PVZpKSxRaT0oWGkmJi9jaHJvbWVcL1xkKy8udGVzdChYaSksWGkmJi9waGFudG9tanMvLnRlc3QoWGkpLFhpJiZYaS5tYXRjaCgvZmlyZWZveFwvKFxkKykvKSksWmk9e30ud2F0Y2gsZWE9ITE7aWYoV2kpdHJ5e3ZhciB0YT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkodGEsInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtlYT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLHRhKX1jYXRjaChlKXt9dmFyIG5hLHJhLG9hPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PW5hJiYobmE9IVdpJiYhemkmJnZvaWQgMCE9PWUmJihlLnByb2Nlc3MmJiJzZXJ2ZXIiPT09ZS5wcm9jZXNzLmVudi5WVUVfRU5WKSksbmF9LGlhPVdpJiZ3aW5kb3cuX19WVUVfREVWVE9PTFNfR0xPQkFMX0hPT0tfXyxhYT0idW5kZWZpbmVkIiE9dHlwZW9mIFN5bWJvbCYmaihTeW1ib2wpJiYidW5kZWZpbmVkIiE9dHlwZW9mIFJlZmxlY3QmJmooUmVmbGVjdC5vd25LZXlzKTtyYT0idW5kZWZpbmVkIiE9dHlwZW9mIFNldCYmaihTZXQpP1NldDpmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt0aGlzLnNldD1PYmplY3QuY3JlYXRlKG51bGwpfXJldHVybiBlLnByb3RvdHlwZS5oYXM9ZnVuY3Rpb24oZSl7cmV0dXJuITA9PT10aGlzLnNldFtlXX0sZS5wcm90b3R5cGUuYWRkPWZ1bmN0aW9uKGUpe3RoaXMuc2V0W2VdPSEwfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9LGV9KCk7dmFyIHNhPVQsdWE9MCxjYT1mdW5jdGlvbigpe3RoaXMuaWQ9dWErKyx0aGlzLnN1YnM9W119O2NhLnByb3RvdHlwZS5hZGRTdWI9ZnVuY3Rpb24oZSl7dGhpcy5zdWJzLnB1c2goZSl9LGNhLnByb3RvdHlwZS5yZW1vdmVTdWI9ZnVuY3Rpb24oZSl7bSh0aGlzLnN1YnMsZSl9LGNhLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtjYS50YXJnZXQmJmNhLnRhcmdldC5hZGREZXAodGhpcyl9LGNhLnByb3RvdHlwZS5ub3RpZnk9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5zdWJzLnNsaWNlKCksdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyllW3RdLnVwZGF0ZSgpfSxjYS50YXJnZXQ9bnVsbDt2YXIgbGE9W10sZmE9ZnVuY3Rpb24oZSx0LG4scixvLGksYSxzKXt0aGlzLnRhZz1lLHRoaXMuZGF0YT10LHRoaXMuY2hpbGRyZW49bix0aGlzLnRleHQ9cix0aGlzLmVsbT1vLHRoaXMubnM9dm9pZCAwLHRoaXMuY29udGV4dD1pLHRoaXMuZm5Db250ZXh0PXZvaWQgMCx0aGlzLmZuT3B0aW9ucz12b2lkIDAsdGhpcy5mblNjb3BlSWQ9dm9pZCAwLHRoaXMua2V5PXQmJnQua2V5LHRoaXMuY29tcG9uZW50T3B0aW9ucz1hLHRoaXMuY29tcG9uZW50SW5zdGFuY2U9dm9pZCAwLHRoaXMucGFyZW50PXZvaWQgMCx0aGlzLnJhdz0hMSx0aGlzLmlzU3RhdGljPSExLHRoaXMuaXNSb290SW5zZXJ0PSEwLHRoaXMuaXNDb21tZW50PSExLHRoaXMuaXNDbG9uZWQ9ITEsdGhpcy5pc09uY2U9ITEsdGhpcy5hc3luY0ZhY3Rvcnk9cyx0aGlzLmFzeW5jTWV0YT12b2lkIDAsdGhpcy5pc0FzeW5jUGxhY2Vob2xkZXI9ITF9LHBhPXtjaGlsZDp7Y29uZmlndXJhYmxlOiEwfX07cGEuY2hpbGQuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuY29tcG9uZW50SW5zdGFuY2V9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGZhLnByb3RvdHlwZSxwYSk7dmFyIGRhPWZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUmJihlPSIiKTt2YXIgdD1uZXcgZmE7cmV0dXJuIHQudGV4dD1lLHQuaXNDb21tZW50PSEwLHR9LGhhPUFycmF5LnByb3RvdHlwZSx2YT1PYmplY3QuY3JlYXRlKGhhKTtbInB1c2giLCJwb3AiLCJzaGlmdCIsInVuc2hpZnQiLCJzcGxpY2UiLCJzb3J0IiwicmV2ZXJzZSJdLmZvckVhY2goZnVuY3Rpb24oZSl7dmFyIHQ9aGFbZV07RSh2YSxlLGZ1bmN0aW9uKCl7Zm9yKHZhciBuPVtdLHI9YXJndW1lbnRzLmxlbmd0aDtyLS07KW5bcl09YXJndW1lbnRzW3JdO3ZhciBvLGk9dC5hcHBseSh0aGlzLG4pLGE9dGhpcy5fX29iX187c3dpdGNoKGUpe2Nhc2UicHVzaCI6Y2FzZSJ1bnNoaWZ0IjpvPW47YnJlYWs7Y2FzZSJzcGxpY2UiOm89bi5zbGljZSgyKX1yZXR1cm4gbyYmYS5vYnNlcnZlQXJyYXkobyksYS5kZXAubm90aWZ5KCksaX0pfSk7dmFyIG1hPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhKSx5YT0hMCxnYT1mdW5jdGlvbihlKXt0aGlzLnZhbHVlPWUsdGhpcy5kZXA9bmV3IGNhLHRoaXMudm1Db3VudD0wLEUoZSwiX19vYl9fIix0aGlzKSxBcnJheS5pc0FycmF5KGUpPyhVaT9JKGUsdmEpOlAoZSx2YSxtYSksdGhpcy5vYnNlcnZlQXJyYXkoZSkpOnRoaXMud2FsayhlKX07Z2EucHJvdG90eXBlLndhbGs9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PU9iamVjdC5rZXlzKGUpLG49MDtuPHQubGVuZ3RoO24rKylIKGUsdFtuXSl9LGdhLnByb3RvdHlwZS5vYnNlcnZlQXJyYXk9ZnVuY3Rpb24oZSl7Zm9yKHZhciB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXEoZVt0XSl9O3ZhciBiYT1IaS5vcHRpb25NZXJnZVN0cmF0ZWdpZXM7YmEuZGF0YT1mdW5jdGlvbihlLHQsbil7cmV0dXJuIG4/eihlLHQsbik6dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHQ/ZTp6KGUsdCl9LHFpLmZvckVhY2goZnVuY3Rpb24oZSl7YmFbZV09Vn0pLFBpLmZvckVhY2goZnVuY3Rpb24oZSl7YmFbZSsicyJdPUp9KSxiYS53YXRjaD1mdW5jdGlvbihlLHQsbixyKXtpZihlPT09WmkmJihlPXZvaWQgMCksdD09PVppJiYodD12b2lkIDApLCF0KXJldHVybiBPYmplY3QuY3JlYXRlKGV8fG51bGwpO2lmKCFlKXJldHVybiB0O3ZhciBvPXt9O18obyxlKTtmb3IodmFyIGkgaW4gdCl7dmFyIGE9b1tpXSxzPXRbaV07YSYmIUFycmF5LmlzQXJyYXkoYSkmJihhPVthXSksb1tpXT1hP2EuY29uY2F0KHMpOkFycmF5LmlzQXJyYXkocyk/czpbc119cmV0dXJuIG99LGJhLnByb3BzPWJhLm1ldGhvZHM9YmEuaW5qZWN0PWJhLmNvbXB1dGVkPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKCFlKXJldHVybiB0O3ZhciBvPU9iamVjdC5jcmVhdGUobnVsbCk7cmV0dXJuIF8obyxlKSx0JiZfKG8sdCksb30sYmEucHJvdmlkZT16O3ZhciB4YSx3YT1mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDA9PT10P2U6dH0sX2E9L15ccypmdW5jdGlvbiAoXHcrKS8sQ2E9ITEsVGE9W10sa2E9ITE7aWYoInVuZGVmaW5lZCIhPXR5cGVvZiBQcm9taXNlJiZqKFByb21pc2UpKXt2YXIgQWE9UHJvbWlzZS5yZXNvbHZlKCk7eGE9ZnVuY3Rpb24oKXtBYS50aGVuKGNlKSxZaSYmc2V0VGltZW91dChUKX0sQ2E9ITB9ZWxzZSBpZihKaXx8InVuZGVmaW5lZCI9PXR5cGVvZiBNdXRhdGlvbk9ic2VydmVyfHwhaihNdXRhdGlvbk9ic2VydmVyKSYmIltvYmplY3QgTXV0YXRpb25PYnNlcnZlckNvbnN0cnVjdG9yXSIhPT1NdXRhdGlvbk9ic2VydmVyLnRvU3RyaW5nKCkpeGE9dm9pZCAwIT09biYmaihuKT9mdW5jdGlvbigpe24oY2UpfTpmdW5jdGlvbigpe3NldFRpbWVvdXQoY2UsMCl9O2Vsc2V7dmFyIFNhPTEsJGE9bmV3IE11dGF0aW9uT2JzZXJ2ZXIoY2UpLEVhPWRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFN0cmluZyhTYSkpOyRhLm9ic2VydmUoRWEse2NoYXJhY3RlckRhdGE6ITB9KSx4YT1mdW5jdGlvbigpe1NhPShTYSsxKSUyLEVhLmRhdGE9U3RyaW5nKFNhKX0sQ2E9ITB9dmFyIE9hPW5ldyByYSxqYT1nKGZ1bmN0aW9uKGUpe3ZhciB0PSImIj09PWUuY2hhckF0KDApO2U9dD9lLnNsaWNlKDEpOmU7dmFyIG49In4iPT09ZS5jaGFyQXQoMCk7ZT1uP2Uuc2xpY2UoMSk6ZTt2YXIgcj0iISI9PT1lLmNoYXJBdCgwKTtyZXR1cm4gZT1yP2Uuc2xpY2UoMSk6ZSx7bmFtZTplLG9uY2U6bixjYXB0dXJlOnIscGFzc2l2ZTp0fX0pO3plKFZlLnByb3RvdHlwZSk7dmFyIE5hLERhPXtpbml0OmZ1bmN0aW9uKGUsdCl7aWYoZS5jb21wb25lbnRJbnN0YW5jZSYmIWUuY29tcG9uZW50SW5zdGFuY2UuX2lzRGVzdHJveWVkJiZlLmRhdGEua2VlcEFsaXZlKXt2YXIgbj1lO0RhLnByZXBhdGNoKG4sbil9ZWxzZXsoZS5jb21wb25lbnRJbnN0YW5jZT1ZZShlLFBhKSkuJG1vdW50KHQ/ZS5lbG06dm9pZCAwLHQpfX0scHJlcGF0Y2g6ZnVuY3Rpb24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7Z3QodC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlLG4ucHJvcHNEYXRhLG4ubGlzdGVuZXJzLHQsbi5jaGlsZHJlbil9LGluc2VydDpmdW5jdGlvbihlKXt2YXIgdD1lLmNvbnRleHQsbj1lLmNvbXBvbmVudEluc3RhbmNlO24uX2lzTW91bnRlZHx8KG4uX2lzTW91bnRlZD0hMCxfdChuLCJtb3VudGVkIikpLGUuZGF0YS5rZWVwQWxpdmUmJih0Ll9pc01vdW50ZWQ/QXQobik6eHQobiwhMCkpfSxkZXN0cm95OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29tcG9uZW50SW5zdGFuY2U7dC5faXNEZXN0cm95ZWR8fChlLmRhdGEua2VlcEFsaXZlP3d0KHQsITApOnQuJGRlc3Ryb3koKSl9fSxMYT1PYmplY3Qua2V5cyhEYSksUmE9MSxNYT0yLElhPW51bGwsUGE9bnVsbCxxYT1bXSxIYT1bXSxGYT17fSxCYT0hMSxVYT0hMSxXYT0wLHphPTAsVmE9RGF0ZS5ub3c7aWYoV2kmJiFKaSl7dmFyIFhhPXdpbmRvdy5wZXJmb3JtYW5jZTtYYSYmImZ1bmN0aW9uIj09dHlwZW9mIFhhLm5vdyYmVmEoKT5kb2N1bWVudC5jcmVhdGVFdmVudCgiRXZlbnQiKS50aW1lU3RhbXAmJihWYT1mdW5jdGlvbigpe3JldHVybiBYYS5ub3coKX0pfXZhciBKYT0wLEthPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dGhpcy52bT1lLG8mJihlLl93YXRjaGVyPXRoaXMpLGUuX3dhdGNoZXJzLnB1c2godGhpcykscj8odGhpcy5kZWVwPSEhci5kZWVwLHRoaXMudXNlcj0hIXIudXNlcix0aGlzLmxhenk9ISFyLmxhenksdGhpcy5zeW5jPSEhci5zeW5jLHRoaXMuYmVmb3JlPXIuYmVmb3JlKTp0aGlzLmRlZXA9dGhpcy51c2VyPXRoaXMubGF6eT10aGlzLnN5bmM9ITEsdGhpcy5jYj1uLHRoaXMuaWQ9KytKYSx0aGlzLmFjdGl2ZT0hMCx0aGlzLmRpcnR5PXRoaXMubGF6eSx0aGlzLmRlcHM9W10sdGhpcy5uZXdEZXBzPVtdLHRoaXMuZGVwSWRzPW5ldyByYSx0aGlzLm5ld0RlcElkcz1uZXcgcmEsdGhpcy5leHByZXNzaW9uPSIiLCJmdW5jdGlvbiI9PXR5cGVvZiB0P3RoaXMuZ2V0dGVyPXQ6KHRoaXMuZ2V0dGVyPU8odCksdGhpcy5nZXR0ZXJ8fCh0aGlzLmdldHRlcj1UKSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O0thLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtOKHRoaXMpO3ZhciBlLHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO2llKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZmZShlKSxEKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSxLYS5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSxLYS5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcy5kZXBzLmxlbmd0aDtlLS07KXt2YXIgdD10aGlzLmRlcHNbZV07dGhpcy5uZXdEZXBJZHMuaGFzKHQuaWQpfHx0LnJlbW92ZVN1Yih0aGlzKX12YXIgbj10aGlzLmRlcElkczt0aGlzLmRlcElkcz10aGlzLm5ld0RlcElkcyx0aGlzLm5ld0RlcElkcz1uLHRoaXMubmV3RGVwSWRzLmNsZWFyKCksbj10aGlzLmRlcHMsdGhpcy5kZXBzPXRoaXMubmV3RGVwcyx0aGlzLm5ld0RlcHM9bix0aGlzLm5ld0RlcHMubGVuZ3RoPTB9LEthLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oKXt0aGlzLmxhenk/dGhpcy5kaXJ0eT0hMDp0aGlzLnN5bmM/dGhpcy5ydW4oKTokdCh0aGlzKX0sS2EucHJvdG90eXBlLnJ1bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt2YXIgZT10aGlzLmdldCgpO2lmKGUhPT10aGlzLnZhbHVlfHx1KGUpfHx0aGlzLmRlZXApe3ZhciB0PXRoaXMudmFsdWU7aWYodGhpcy52YWx1ZT1lLHRoaXMudXNlcil7dmFyIG49J2NhbGxiYWNrIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIic7YWUodGhpcy5jYix0aGlzLnZtLFtlLHRdLHRoaXMudm0sbil9ZWxzZSB0aGlzLmNiLmNhbGwodGhpcy52bSxlLHQpfX19LEthLnByb3RvdHlwZS5ldmFsdWF0ZT1mdW5jdGlvbigpe3RoaXMudmFsdWU9dGhpcy5nZXQoKSx0aGlzLmRpcnR5PSExfSxLYS5wcm90b3R5cGUuZGVwZW5kPWZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMuZGVwcy5sZW5ndGg7ZS0tOyl0aGlzLmRlcHNbZV0uZGVwZW5kKCl9LEthLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe2lmKHRoaXMuYWN0aXZlKXt0aGlzLnZtLl9pc0JlaW5nRGVzdHJveWVkfHxtKHRoaXMudm0uX3dhdGNoZXJzLHRoaXMpO2Zvcih2YXIgZT10aGlzLmRlcHMubGVuZ3RoO2UtLTspdGhpcy5kZXBzW2VdLnJlbW92ZVN1Yih0aGlzKTt0aGlzLmFjdGl2ZT0hMX19O3ZhciBHYT17ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsZ2V0OlQsc2V0OlR9LFlhPXtsYXp5OiEwfSxRYT0wOyFmdW5jdGlvbihlKXtlLnByb3RvdHlwZS5faW5pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO3QuX3VpZD1RYSsrLHQuX2lzVnVlPSEwLGUmJmUuX2lzQ29tcG9uZW50P0Z0KHQsZSk6dC4kb3B0aW9ucz1RKEJ0KHQuY29uc3RydWN0b3IpLGV8fHt9LHQpLHQuX3JlbmRlclByb3h5PXQsdC5fc2VsZj10LG10KHQpLGx0KHQpLGl0KHQpLF90KHQsImJlZm9yZUNyZWF0ZSIpLENlKHQpLE90KHQpLF9lKHQpLF90KHQsImNyZWF0ZWQiKSx0LiRvcHRpb25zLmVsJiZ0LiRtb3VudCh0LiRvcHRpb25zLmVsKX19KFd0KSxmdW5jdGlvbihlKXt2YXIgdD17fTt0LmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9kYXRhfTt2YXIgbj17fTtuLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLl9wcm9wc30sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkZGF0YSIsdCksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkcHJvcHMiLG4pLGUucHJvdG90eXBlLiRzZXQ9RixlLnByb3RvdHlwZS4kZGVsZXRlPUIsZS5wcm90b3R5cGUuJHdhdGNoPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzO2lmKGModCkpcmV0dXJuIEh0KHIsZSx0LG4pO249bnx8e30sbi51c2VyPSEwO3ZhciBvPW5ldyBLYShyLGUsdCxuKTtpZihuLmltbWVkaWF0ZSl7dmFyIGk9J2NhbGxiYWNrIGZvciBpbW1lZGlhdGUgd2F0Y2hlciAiJytvLmV4cHJlc3Npb24rJyInO04oKSxhZSh0LHIsW28udmFsdWVdLHIsaSksRCgpfXJldHVybiBmdW5jdGlvbigpe28udGVhcmRvd24oKX19fShXdCksZnVuY3Rpb24oZSl7dmFyIHQ9L15ob29rOi87ZS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcztpZihBcnJheS5pc0FycmF5KGUpKWZvcih2YXIgbz0wLGk9ZS5sZW5ndGg7bzxpO28rKylyLiRvbihlW29dLG4pO2Vsc2Uoci5fZXZlbnRzW2VdfHwoci5fZXZlbnRzW2VdPVtdKSkucHVzaChuKSx0LnRlc3QoZSkmJihyLl9oYXNIb29rRXZlbnQ9ITApO3JldHVybiByfSxlLnByb3RvdHlwZS4kb25jZT1mdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oKXtyLiRvZmYoZSxuKSx0LmFwcGx5KHIsYXJndW1lbnRzKX12YXIgcj10aGlzO3JldHVybiBuLmZuPXQsci4kb24oZSxuKSxyfSxlLnByb3RvdHlwZS4kb2ZmPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztpZighYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gbi5fZXZlbnRzPU9iamVjdC5jcmVhdGUobnVsbCksbjtpZihBcnJheS5pc0FycmF5KGUpKXtmb3IodmFyIHI9MCxvPWUubGVuZ3RoO3I8bztyKyspbi4kb2ZmKGVbcl0sdCk7cmV0dXJuIG59dmFyIGk9bi5fZXZlbnRzW2VdO2lmKCFpKXJldHVybiBuO2lmKCF0KXJldHVybiBuLl9ldmVudHNbZV09bnVsbCxuO2Zvcih2YXIgYSxzPWkubGVuZ3RoO3MtLTspaWYoKGE9aVtzXSk9PT10fHxhLmZuPT09dCl7aS5zcGxpY2UocywxKTticmVha31yZXR1cm4gbn0sZS5wcm90b3R5cGUuJGVtaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXQuX2V2ZW50c1tlXTtpZihuKXtuPW4ubGVuZ3RoPjE/dyhuKTpuO2Zvcih2YXIgcj13KGFyZ3VtZW50cywxKSxvPSdldmVudCBoYW5kbGVyIGZvciAiJytlKyciJyxpPTAsYT1uLmxlbmd0aDtpPGE7aSsrKWFlKG5baV0sdCxyLHQsbyl9cmV0dXJuIHR9fShXdCksZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuX3VwZGF0ZT1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj1uLiRlbCxvPW4uX3Zub2RlLGk9dnQobik7bi5fdm5vZGU9ZSxuLiRlbD1vP24uX19wYXRjaF9fKG8sZSk6bi5fX3BhdGNoX18obi4kZWwsZSx0LCExKSxpKCksciYmKHIuX192dWVfXz1udWxsKSxuLiRlbCYmKG4uJGVsLl9fdnVlX189biksbi4kdm5vZGUmJm4uJHBhcmVudCYmbi4kdm5vZGU9PT1uLiRwYXJlbnQuX3Zub2RlJiYobi4kcGFyZW50LiRlbD1uLiRlbCl9LGUucHJvdG90eXBlLiRmb3JjZVVwZGF0ZT1mdW5jdGlvbigpe3ZhciBlPXRoaXM7ZS5fd2F0Y2hlciYmZS5fd2F0Y2hlci51cGRhdGUoKX0sZS5wcm90b3R5cGUuJGRlc3Ryb3k9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2lmKCFlLl9pc0JlaW5nRGVzdHJveWVkKXtfdChlLCJiZWZvcmVEZXN0cm95IiksZS5faXNCZWluZ0Rlc3Ryb3llZD0hMDt2YXIgdD1lLiRwYXJlbnQ7IXR8fHQuX2lzQmVpbmdEZXN0cm95ZWR8fGUuJG9wdGlvbnMuYWJzdHJhY3R8fG0odC4kY2hpbGRyZW4sZSksZS5fd2F0Y2hlciYmZS5fd2F0Y2hlci50ZWFyZG93bigpO2Zvcih2YXIgbj1lLl93YXRjaGVycy5sZW5ndGg7bi0tOyllLl93YXRjaGVyc1tuXS50ZWFyZG93bigpO2UuX2RhdGEuX19vYl9fJiZlLl9kYXRhLl9fb2JfXy52bUNvdW50LS0sZS5faXNEZXN0cm95ZWQ9ITAsZS5fX3BhdGNoX18oZS5fdm5vZGUsbnVsbCksX3QoZSwiZGVzdHJveWVkIiksZS4kb2ZmKCksZS4kZWwmJihlLiRlbC5fX3Z1ZV9fPW51bGwpLGUuJHZub2RlJiYoZS4kdm5vZGUucGFyZW50PW51bGwpfX19KFd0KSxmdW5jdGlvbihlKXt6ZShlLnByb3RvdHlwZSksZS5wcm90b3R5cGUuJG5leHRUaWNrPWZ1bmN0aW9uKGUpe3JldHVybiBsZShlLHRoaXMpfSxlLnByb3RvdHlwZS5fcmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuJG9wdGlvbnMsbj10LnJlbmRlcixyPXQuX3BhcmVudFZub2RlO3ImJihlLiRzY29wZWRTbG90cz0kZShyLmRhdGEuc2NvcGVkU2xvdHMsZS4kc2xvdHMsZS4kc2NvcGVkU2xvdHMpKSxlLiR2bm9kZT1yO3ZhciBvO3RyeXtJYT1lLG89bi5jYWxsKGUuX3JlbmRlclByb3h5LGUuJGNyZWF0ZUVsZW1lbnQpfWNhdGNoKHQpe2llKHQsZSwicmVuZGVyIiksbz1lLl92bm9kZX1maW5hbGx5e0lhPW51bGx9cmV0dXJuIEFycmF5LmlzQXJyYXkobykmJjE9PT1vLmxlbmd0aCYmKG89b1swXSksbyBpbnN0YW5jZW9mIGZhfHwobz1kYSgpKSxvLnBhcmVudD1yLG99fShXdCk7dmFyIFphPVtTdHJpbmcsUmVnRXhwLEFycmF5XSxlcz17bmFtZToia2VlcC1hbGl2ZSIsYWJzdHJhY3Q6ITAscHJvcHM6e2luY2x1ZGU6WmEsZXhjbHVkZTpaYSxtYXg6W1N0cmluZyxOdW1iZXJdfSxtZXRob2RzOntjYWNoZVZOb2RlOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcyx0PWUuY2FjaGUsbj1lLmtleXMscj1lLnZub2RlVG9DYWNoZSxvPWUua2V5VG9DYWNoZTtpZihyKXt2YXIgaT1yLnRhZyxhPXIuY29tcG9uZW50SW5zdGFuY2Uscz1yLmNvbXBvbmVudE9wdGlvbnM7dFtvXT17bmFtZTpZdChzKSx0YWc6aSxjb21wb25lbnRJbnN0YW5jZTphfSxuLnB1c2gobyksdGhpcy5tYXgmJm4ubGVuZ3RoPnBhcnNlSW50KHRoaXMubWF4KSYmZW4odCxuWzBdLG4sdGhpcy5fdm5vZGUpLHRoaXMudm5vZGVUb0NhY2hlPW51bGx9fX0sY3JlYXRlZDpmdW5jdGlvbigpe3RoaXMuY2FjaGU9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLmtleXM9W119LGRlc3Ryb3llZDpmdW5jdGlvbigpe2Zvcih2YXIgZSBpbiB0aGlzLmNhY2hlKWVuKHRoaXMuY2FjaGUsZSx0aGlzLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLmNhY2hlVk5vZGUoKSx0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7WnQoZSxmdW5jdGlvbihlKXtyZXR1cm4gUXQodCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe1p0KGUsZnVuY3Rpb24oZSl7cmV0dXJuIVF0KHQsZSl9KX0pfSx1cGRhdGVkOmZ1bmN0aW9uKCl7dGhpcy5jYWNoZVZOb2RlKCl9LHJlbmRlcjpmdW5jdGlvbigpe3ZhciBlPXRoaXMuJHNsb3RzLmRlZmF1bHQsdD1jdChlKSxuPXQmJnQuY29tcG9uZW50T3B0aW9ucztpZihuKXt2YXIgcj1ZdChuKSxvPXRoaXMsaT1vLmluY2x1ZGUsYT1vLmV4Y2x1ZGU7aWYoaSYmKCFyfHwhUXQoaSxyKSl8fGEmJnImJlF0KGEscikpcmV0dXJuIHQ7dmFyIHM9dGhpcyx1PXMuY2FjaGUsYz1zLmtleXMsbD1udWxsPT10LmtleT9uLkN0b3IuY2lkKyhuLnRhZz8iOjoiK24udGFnOiIiKTp0LmtleTt1W2xdPyh0LmNvbXBvbmVudEluc3RhbmNlPXVbbF0uY29tcG9uZW50SW5zdGFuY2UsbShjLGwpLGMucHVzaChsKSk6KHRoaXMudm5vZGVUb0NhY2hlPXQsdGhpcy5rZXlUb0NhY2hlPWwpLHQuZGF0YS5rZWVwQWxpdmU9ITB9cmV0dXJuIHR8fGUmJmVbMF19fSx0cz17S2VlcEFsaXZlOmVzfTshZnVuY3Rpb24oZSl7dmFyIHQ9e307dC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gSGl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLCJjb25maWciLHQpLGUudXRpbD17d2FybjpzYSxleHRlbmQ6XyxtZXJnZU9wdGlvbnM6USxkZWZpbmVSZWFjdGl2ZTpIfSxlLnNldD1GLGUuZGVsZXRlPUIsZS5uZXh0VGljaz1sZSxlLm9ic2VydmFibGU9ZnVuY3Rpb24oZSl7cmV0dXJuIHEoZSksZX0sZS5vcHRpb25zPU9iamVjdC5jcmVhdGUobnVsbCksUGkuZm9yRWFjaChmdW5jdGlvbih0KXtlLm9wdGlvbnNbdCsicyJdPU9iamVjdC5jcmVhdGUobnVsbCl9KSxlLm9wdGlvbnMuX2Jhc2U9ZSxfKGUub3B0aW9ucy5jb21wb25lbnRzLHRzKSx6dChlKSxWdChlKSxYdChlKSxHdChlKX0oV3QpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsIiRpc1NlcnZlciIse2dldDpvYX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdC5wcm90b3R5cGUsIiRzc3JDb250ZXh0Iix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJHZub2RlJiZ0aGlzLiR2bm9kZS5zc3JDb250ZXh0fX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXdCwiRnVuY3Rpb25hbFJlbmRlckNvbnRleHQiLHt2YWx1ZTpWZX0pLFd0LnZlcnNpb249IjIuNi4xNCI7dmFyIG5zLHJzLG9zLGlzLGFzLHNzLHVzLGNzLGxzLGZzLHBzPXYoInN0eWxlLGNsYXNzIiksZHM9digiaW5wdXQsdGV4dGFyZWEsb3B0aW9uLHNlbGVjdCxwcm9ncmVzcyIpLGhzPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4idmFsdWUiPT09biYmZHMoZSkmJiJidXR0b24iIT09dHx8InNlbGVjdGVkIj09PW4mJiJvcHRpb24iPT09ZXx8ImNoZWNrZWQiPT09biYmImlucHV0Ij09PWV8fCJtdXRlZCI9PT1uJiYidmlkZW8iPT09ZX0sdnM9digiY29udGVudGVkaXRhYmxlLGRyYWdnYWJsZSxzcGVsbGNoZWNrIiksbXM9digiZXZlbnRzLGNhcmV0LHR5cGluZyxwbGFpbnRleHQtb25seSIpLHlzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIF9zKHQpfHwiZmFsc2UiPT09dD8iZmFsc2UiOiJjb250ZW50ZWRpdGFibGUiPT09ZSYmbXModCk/dDoidHJ1ZSJ9LGdzPXYoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJ1ZXNwZWVkLHR5cGVtdXN0bWF0Y2gsdmlzaWJsZSIpLGJzPSJodHRwOi8vd3d3LnczLm9yZy8xOTk5L3hsaW5rIix4cz1mdW5jdGlvbihlKXtyZXR1cm4iOiI9PT1lLmNoYXJBdCg1KSYmInhsaW5rIj09PWUuc2xpY2UoMCw1KX0sd3M9ZnVuY3Rpb24oZSl7cmV0dXJuIHhzKGUpP2Uuc2xpY2UoNixlLmxlbmd0aCk6IiJ9LF9zPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lfHwhMT09PWV9LENzPXtzdmc6Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIixtYXRoOiJodHRwOi8vd3d3LnczLm9yZy8xOTk4L01hdGgvTWF0aE1MIn0sVHM9digiaHRtbCxib2R5LGJhc2UsaGVhZCxsaW5rLG1ldGEsc3R5bGUsdGl0bGUsYWRkcmVzcyxhcnRpY2xlLGFzaWRlLGZvb3RlcixoZWFkZXIsaDEsaDIsaDMsaDQsaDUsaDYsaGdyb3VwLG5hdixzZWN0aW9uLGRpdixkZCxkbCxkdCxmaWdjYXB0aW9uLGZpZ3VyZSxwaWN0dXJlLGhyLGltZyxsaSxtYWluLG9sLHAscHJlLHVsLGEsYixhYmJyLGJkaSxiZG8sYnIsY2l0ZSxjb2RlLGRhdGEsZGZuLGVtLGksa2JkLG1hcmsscSxycCxydCxydGMscnVieSxzLHNhbXAsc21hbGwsc3BhbixzdHJvbmcsc3ViLHN1cCx0aW1lLHUsdmFyLHdicixhcmVhLGF1ZGlvLG1hcCx0cmFjayx2aWRlbyxlbWJlZCxvYmplY3QscGFyYW0sc291cmNlLGNhbnZhcyxzY3JpcHQsbm9zY3JpcHQsZGVsLGlucyxjYXB0aW9uLGNvbCxjb2xncm91cCx0YWJsZSx0aGVhZCx0Ym9keSx0ZCx0aCx0cixidXR0b24sZGF0YWxpc3QsZmllbGRzZXQsZm9ybSxpbnB1dCxsYWJlbCxsZWdlbmQsbWV0ZXIsb3B0Z3JvdXAsb3B0aW9uLG91dHB1dCxwcm9ncmVzcyxzZWxlY3QsdGV4dGFyZWEsZGV0YWlscyxkaWFsb2csbWVudSxtZW51aXRlbSxzdW1tYXJ5LGNvbnRlbnQsZWxlbWVudCxzaGFkb3csdGVtcGxhdGUsYmxvY2txdW90ZSxpZnJhbWUsdGZvb3QiKSxrcz12KCJzdmcsYW5pbWF0ZSxjaXJjbGUsY2xpcHBhdGgsY3Vyc29yLGRlZnMsZGVzYyxlbGxpcHNlLGZpbHRlcixmb250LWZhY2UsZm9yZWlnbm9iamVjdCxnLGdseXBoLGltYWdlLGxpbmUsbWFya2VyLG1hc2ssbWlzc2luZy1nbHlwaCxwYXRoLHBhdHRlcm4scG9seWdvbixwb2x5bGluZSxyZWN0LHN3aXRjaCxzeW1ib2wsdGV4dCx0ZXh0cGF0aCx0c3Bhbix1c2UsdmlldyIsITApLEFzPWZ1bmN0aW9uKGUpe3JldHVybiJwcmUiPT09ZX0sU3M9ZnVuY3Rpb24oZSl7cmV0dXJuIFRzKGUpfHxrcyhlKX0sJHM9T2JqZWN0LmNyZWF0ZShudWxsKSxFcz12KCJ0ZXh0LG51bWJlcixwYXNzd29yZCxzZWFyY2gsZW1haWwsdGVsLHVybCIpLE9zPU9iamVjdC5mcmVlemUoe2NyZWF0ZUVsZW1lbnQ6cG4sY3JlYXRlRWxlbWVudE5TOmRuLGNyZWF0ZVRleHROb2RlOmhuLGNyZWF0ZUNvbW1lbnQ6dm4saW5zZXJ0QmVmb3JlOm1uLHJlbW92ZUNoaWxkOnluLGFwcGVuZENoaWxkOmduLHBhcmVudE5vZGU6Ym4sbmV4dFNpYmxpbmc6eG4sdGFnTmFtZTp3bixzZXRUZXh0Q29udGVudDpfbixzZXRTdHlsZVNjb3BlOkNufSksanM9e2NyZWF0ZTpmdW5jdGlvbihlLHQpe1RuKHQpfSx1cGRhdGU6ZnVuY3Rpb24oZSx0KXtlLmRhdGEucmVmIT09dC5kYXRhLnJlZiYmKFRuKGUsITApLFRuKHQpKX0sZGVzdHJveTpmdW5jdGlvbihlKXtUbihlLCEwKX19LE5zPW5ldyBmYSgiIix7fSxbXSksRHM9WyJjcmVhdGUiLCJhY3RpdmF0ZSIsInVwZGF0ZSIsInJlbW92ZSIsImRlc3Ryb3kiXSxMcz17Y3JlYXRlOiRuLHVwZGF0ZTokbixkZXN0cm95OmZ1bmN0aW9uKGUpeyRuKGUsTnMpfX0sUnM9T2JqZWN0LmNyZWF0ZShudWxsKSxNcz1banMsTHNdLElzPXtjcmVhdGU6RG4sdXBkYXRlOkRufSxQcz17Y3JlYXRlOk1uLHVwZGF0ZTpNbn0scXM9L1tcdykuK1wtXyRcXV0vLEhzPSJfX3IiLEZzPSJfX2MiLEJzPUNhJiYhKFFpJiZOdW1iZXIoUWlbMV0pPD01MyksVXM9e2NyZWF0ZTp2cix1cGRhdGU6dnJ9LFdzPXtjcmVhdGU6bXIsdXBkYXRlOm1yfSx6cz1nKGZ1bmN0aW9uKGUpe3ZhciB0PXt9LG49LzsoPyFbXihdKlwpKS9nLHI9LzooLispLztyZXR1cm4gZS5zcGxpdChuKS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUpe3ZhciBuPWUuc3BsaXQocik7bi5sZW5ndGg+MSYmKHRbblswXS50cmltKCldPW5bMV0udHJpbSgpKX19KSx0fSksVnM9L14tLS8sWHM9L1xzKiFpbXBvcnRhbnQkLyxKcz1mdW5jdGlvbihlLHQsbil7aWYoVnMudGVzdCh0KSllLnN0eWxlLnNldFByb3BlcnR5KHQsbik7ZWxzZSBpZihYcy50ZXN0KG4pKWUuc3R5bGUuc2V0UHJvcGVydHkoRGkodCksbi5yZXBsYWNlKFhzLCIiKSwiaW1wb3J0YW50Iik7ZWxzZXt2YXIgcj1Hcyh0KTtpZihBcnJheS5pc0FycmF5KG4pKWZvcih2YXIgbz0wLGk9bi5sZW5ndGg7bzxpO28rKyllLnN0eWxlW3JdPW5bb107ZWxzZSBlLnN0eWxlW3JdPW59fSxLcz1bIldlYmtpdCIsIk1veiIsIm1zIl0sR3M9ZyhmdW5jdGlvbihlKXtpZihmcz1mc3x8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iikuc3R5bGUsImZpbHRlciIhPT0oZT1PaShlKSkmJmUgaW4gZnMpcmV0dXJuIGU7Zm9yKHZhciB0PWUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPTA7bjxLcy5sZW5ndGg7bisrKXt2YXIgcj1Lc1tuXSt0O2lmKHIgaW4gZnMpcmV0dXJuIHJ9fSksWXM9e2NyZWF0ZTpDcix1cGRhdGU6Q3J9LFFzPS9ccysvLFpzPWcoZnVuY3Rpb24oZSl7cmV0dXJue2VudGVyQ2xhc3M6ZSsiLWVudGVyIixlbnRlclRvQ2xhc3M6ZSsiLWVudGVyLXRvIixlbnRlckFjdGl2ZUNsYXNzOmUrIi1lbnRlci1hY3RpdmUiLGxlYXZlQ2xhc3M6ZSsiLWxlYXZlIixsZWF2ZVRvQ2xhc3M6ZSsiLWxlYXZlLXRvIixsZWF2ZUFjdGl2ZUNsYXNzOmUrIi1sZWF2ZS1hY3RpdmUifX0pLGV1PVdpJiYhS2ksdHU9InRyYW5zaXRpb24iLG51PSJhbmltYXRpb24iLHJ1PSJ0cmFuc2l0aW9uIixvdT0idHJhbnNpdGlvbmVuZCIsaXU9ImFuaW1hdGlvbiIsYXU9ImFuaW1hdGlvbmVuZCI7ZXUmJih2b2lkIDA9PT13aW5kb3cub250cmFuc2l0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXR0cmFuc2l0aW9uZW5kJiYocnU9IldlYmtpdFRyYW5zaXRpb24iLG91PSJ3ZWJraXRUcmFuc2l0aW9uRW5kIiksdm9pZCAwPT09d2luZG93Lm9uYW5pbWF0aW9uZW5kJiZ2b2lkIDAhPT13aW5kb3cub253ZWJraXRhbmltYXRpb25lbmQmJihpdT0iV2Via2l0QW5pbWF0aW9uIixhdT0id2Via2l0QW5pbWF0aW9uRW5kIikpO3ZhciBzdT1XaT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lP3dpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYmluZCh3aW5kb3cpOnNldFRpbWVvdXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUoKX0sdXU9L1xiKHRyYW5zZm9ybXxhbGwpKCx8JCkvLGN1PVdpP3tjcmVhdGU6UHIsYWN0aXZhdGU6UHIscmVtb3ZlOmZ1bmN0aW9uKGUsdCl7ITAhPT1lLmRhdGEuc2hvdz9ScihlLHQpOnQoKX19Ont9LGx1PVtJcyxQcyxVcyxXcyxZcyxjdV0sZnU9bHUuY29uY2F0KE1zKSxwdT1mdW5jdGlvbihlKXtmdW5jdGlvbiB0KGUpe3JldHVybiBuZXcgZmEoai50YWdOYW1lKGUpLnRvTG93ZXJDYXNlKCkse30sW10sdm9pZCAwLGUpfWZ1bmN0aW9uIG4oZSx0KXtmdW5jdGlvbiBuKCl7MD09LS1uLmxpc3RlbmVycyYmYShlKX1yZXR1cm4gbi5saXN0ZW5lcnM9dCxufWZ1bmN0aW9uIGEoZSl7dmFyIHQ9ai5wYXJlbnROb2RlKGUpO28odCkmJmoucmVtb3ZlQ2hpbGQodCxlKX1mdW5jdGlvbiB1KGUsdCxuLHIsYSxzLHUpe2lmKG8oZS5lbG0pJiZvKHMpJiYoZT1zW3VdPVIoZSkpLGUuaXNSb290SW5zZXJ0PSFhLCFjKGUsdCxuLHIpKXt2YXIgbD1lLmRhdGEsZj1lLmNoaWxkcmVuLGg9ZS50YWc7byhoKT8oZS5lbG09ZS5ucz9qLmNyZWF0ZUVsZW1lbnROUyhlLm5zLGgpOmouY3JlYXRlRWxlbWVudChoLGUpLHkoZSksZChlLGYsdCksbyhsKSYmbShlLHQpLHAobixlLmVsbSxyKSk6aShlLmlzQ29tbWVudCk/KGUuZWxtPWouY3JlYXRlQ29tbWVudChlLnRleHQpLHAobixlLmVsbSxyKSk6KGUuZWxtPWouY3JlYXRlVGV4dE5vZGUoZS50ZXh0KSxwKG4sZS5lbG0scikpfX1mdW5jdGlvbiBjKGUsdCxuLHIpe3ZhciBhPWUuZGF0YTtpZihvKGEpKXt2YXIgcz1vKGUuY29tcG9uZW50SW5zdGFuY2UpJiZhLmtlZXBBbGl2ZTtpZihvKGE9YS5ob29rKSYmbyhhPWEuaW5pdCkmJmEoZSwhMSksbyhlLmNvbXBvbmVudEluc3RhbmNlKSlyZXR1cm4gbChlLHQpLHAobixlLmVsbSxyKSxpKHMpJiZmKGUsdCxuLHIpLCEwfX1mdW5jdGlvbiBsKGUsdCl7byhlLmRhdGEucGVuZGluZ0luc2VydCkmJih0LnB1c2guYXBwbHkodCxlLmRhdGEucGVuZGluZ0luc2VydCksZS5kYXRhLnBlbmRpbmdJbnNlcnQ9bnVsbCksZS5lbG09ZS5jb21wb25lbnRJbnN0YW5jZS4kZWwsaChlKT8obShlLHQpLHkoZSkpOihUbihlKSx0LnB1c2goZSkpfWZ1bmN0aW9uIGYoZSx0LG4scil7Zm9yKHZhciBpLGE9ZTthLmNvbXBvbmVudEluc3RhbmNlOylpZihhPWEuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlLG8oaT1hLmRhdGEpJiZvKGk9aS50cmFuc2l0aW9uKSl7Zm9yKGk9MDtpPEUuYWN0aXZhdGUubGVuZ3RoOysraSlFLmFjdGl2YXRlW2ldKE5zLGEpO3QucHVzaChhKTticmVha31wKG4sZS5lbG0scil9ZnVuY3Rpb24gcChlLHQsbil7byhlKSYmKG8obik/ai5wYXJlbnROb2RlKG4pPT09ZSYmai5pbnNlcnRCZWZvcmUoZSx0LG4pOmouYXBwZW5kQ2hpbGQoZSx0KSl9ZnVuY3Rpb24gZChlLHQsbil7aWYoQXJyYXkuaXNBcnJheSh0KSlmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil1KHRbcl0sbixlLmVsbSxudWxsLCEwLHQscik7ZWxzZSBzKGUudGV4dCkmJmouYXBwZW5kQ2hpbGQoZS5lbG0sai5jcmVhdGVUZXh0Tm9kZShTdHJpbmcoZS50ZXh0KSkpfWZ1bmN0aW9uIGgoZSl7Zm9yKDtlLmNvbXBvbmVudEluc3RhbmNlOyllPWUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlO3JldHVybiBvKGUudGFnKX1mdW5jdGlvbiBtKGUsdCl7Zm9yKHZhciBuPTA7bjxFLmNyZWF0ZS5sZW5ndGg7KytuKUUuY3JlYXRlW25dKE5zLGUpO1M9ZS5kYXRhLmhvb2ssbyhTKSYmKG8oUy5jcmVhdGUpJiZTLmNyZWF0ZShOcyxlKSxvKFMuaW5zZXJ0KSYmdC5wdXNoKGUpKX1mdW5jdGlvbiB5KGUpe3ZhciB0O2lmKG8odD1lLmZuU2NvcGVJZCkpai5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpO2Vsc2UgZm9yKHZhciBuPWU7bjspbyh0PW4uY29udGV4dCkmJm8odD10LiRvcHRpb25zLl9zY29wZUlkKSYmai5zZXRTdHlsZVNjb3BlKGUuZWxtLHQpLG49bi5wYXJlbnQ7byh0PVBhKSYmdCE9PWUuY29udGV4dCYmdCE9PWUuZm5Db250ZXh0JiZvKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJmouc2V0U3R5bGVTY29wZShlLmVsbSx0KX1mdW5jdGlvbiBnKGUsdCxuLHIsbyxpKXtmb3IoO3I8PW87KytyKXUobltyXSxpLGUsdCwhMSxuLHIpfWZ1bmN0aW9uIGIoZSl7dmFyIHQsbixyPWUuZGF0YTtpZihvKHIpKWZvcihvKHQ9ci5ob29rKSYmbyh0PXQuZGVzdHJveSkmJnQoZSksdD0wO3Q8RS5kZXN0cm95Lmxlbmd0aDsrK3QpRS5kZXN0cm95W3RdKGUpO2lmKG8odD1lLmNoaWxkcmVuKSlmb3Iobj0wO248ZS5jaGlsZHJlbi5sZW5ndGg7KytuKWIoZS5jaGlsZHJlbltuXSl9ZnVuY3Rpb24geChlLHQsbil7Zm9yKDt0PD1uOysrdCl7dmFyIHI9ZVt0XTtvKHIpJiYobyhyLnRhZyk/KHcociksYihyKSk6YShyLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobyh0KXx8byhlLmRhdGEpKXt2YXIgcixpPUUucmVtb3ZlLmxlbmd0aCsxO2ZvcihvKHQpP3QubGlzdGVuZXJzKz1pOnQ9bihlLmVsbSxpKSxvKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm8ocj1yLl92bm9kZSkmJm8oci5kYXRhKSYmdyhyLHQpLHI9MDtyPEUucmVtb3ZlLmxlbmd0aDsrK3IpRS5yZW1vdmVbcl0oZSx0KTtvKHI9ZS5kYXRhLmhvb2spJiZvKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBhKGUuZWxtKX1mdW5jdGlvbiBfKGUsdCxuLGksYSl7Zm9yKHZhciBzLGMsbCxmLHA9MCxkPTAsaD10Lmxlbmd0aC0xLHY9dFswXSxtPXRbaF0seT1uLmxlbmd0aC0xLGI9blswXSx3PW5beV0sXz0hYTtwPD1oJiZkPD15OylyKHYpP3Y9dFsrK3BdOnIobSk/bT10Wy0taF06a24odixiKT8oVCh2LGIsaSxuLGQpLHY9dFsrK3BdLGI9blsrK2RdKTprbihtLHcpPyhUKG0sdyxpLG4seSksbT10Wy0taF0sdz1uWy0teV0pOmtuKHYsdyk/KFQodix3LGksbix5KSxfJiZqLmluc2VydEJlZm9yZShlLHYuZWxtLGoubmV4dFNpYmxpbmcobS5lbG0pKSx2PXRbKytwXSx3PW5bLS15XSk6a24obSxiKT8oVChtLGIsaSxuLGQpLF8mJmouaW5zZXJ0QmVmb3JlKGUsbS5lbG0sdi5lbG0pLG09dFstLWhdLGI9blsrK2RdKToocihzKSYmKHM9U24odCxwLGgpKSxjPW8oYi5rZXkpP3NbYi5rZXldOkMoYix0LHAsaCkscihjKT91KGIsaSxlLHYuZWxtLCExLG4sZCk6KGw9dFtjXSxrbihsLGIpPyhUKGwsYixpLG4sZCksdFtjXT12b2lkIDAsXyYmai5pbnNlcnRCZWZvcmUoZSxsLmVsbSx2LmVsbSkpOnUoYixpLGUsdi5lbG0sITEsbixkKSksYj1uWysrZF0pO3A+aD8oZj1yKG5beSsxXSk/bnVsbDpuW3krMV0uZWxtLGcoZSxmLG4sZCx5LGkpKTpkPnkmJngodCxwLGgpfWZ1bmN0aW9uIEMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIGE9dFtpXTtpZihvKGEpJiZrbihlLGEpKXJldHVybiBpfX1mdW5jdGlvbiBUKGUsdCxuLGEscyx1KXtpZihlIT09dCl7byh0LmVsbSkmJm8oYSkmJih0PWFbc109Uih0KSk7dmFyIGM9dC5lbG09ZS5lbG07aWYoaShlLmlzQXN5bmNQbGFjZWhvbGRlcikpcmV0dXJuIHZvaWQobyh0LmFzeW5jRmFjdG9yeS5yZXNvbHZlZCk/QShlLmVsbSx0LG4pOnQuaXNBc3luY1BsYWNlaG9sZGVyPSEwKTtpZihpKHQuaXNTdGF0aWMpJiZpKGUuaXNTdGF0aWMpJiZ0LmtleT09PWUua2V5JiYoaSh0LmlzQ2xvbmVkKXx8aSh0LmlzT25jZSkpKXJldHVybiB2b2lkKHQuY29tcG9uZW50SW5zdGFuY2U9ZS5jb21wb25lbnRJbnN0YW5jZSk7dmFyIGwsZj10LmRhdGE7byhmKSYmbyhsPWYuaG9vaykmJm8obD1sLnByZXBhdGNoKSYmbChlLHQpO3ZhciBwPWUuY2hpbGRyZW4sZD10LmNoaWxkcmVuO2lmKG8oZikmJmgodCkpe2ZvcihsPTA7bDxFLnVwZGF0ZS5sZW5ndGg7KytsKUUudXBkYXRlW2xdKGUsdCk7byhsPWYuaG9vaykmJm8obD1sLnVwZGF0ZSkmJmwoZSx0KX1yKHQudGV4dCk/byhwKSYmbyhkKT9wIT09ZCYmXyhjLHAsZCxuLHUpOm8oZCk/KG8oZS50ZXh0KSYmai5zZXRUZXh0Q29udGVudChjLCIiKSxnKGMsbnVsbCxkLDAsZC5sZW5ndGgtMSxuKSk6byhwKT94KHAsMCxwLmxlbmd0aC0xKTpvKGUudGV4dCkmJmouc2V0VGV4dENvbnRlbnQoYywiIik6ZS50ZXh0IT09dC50ZXh0JiZqLnNldFRleHRDb250ZW50KGMsdC50ZXh0KSxvKGYpJiZvKGw9Zi5ob29rKSYmbyhsPWwucG9zdHBhdGNoKSYmbChlLHQpfX1mdW5jdGlvbiBrKGUsdCxuKXtpZihpKG4pJiZvKGUucGFyZW50KSllLnBhcmVudC5kYXRhLnBlbmRpbmdJbnNlcnQ9dDtlbHNlIGZvcih2YXIgcj0wO3I8dC5sZW5ndGg7KytyKXRbcl0uZGF0YS5ob29rLmluc2VydCh0W3JdKX1mdW5jdGlvbiBBKGUsdCxuLHIpe3ZhciBhLHM9dC50YWcsdT10LmRhdGEsYz10LmNoaWxkcmVuO2lmKHI9cnx8dSYmdS5wcmUsdC5lbG09ZSxpKHQuaXNDb21tZW50KSYmbyh0LmFzeW5jRmFjdG9yeSkpcmV0dXJuIHQuaXNBc3luY1BsYWNlaG9sZGVyPSEwLCEwO2lmKG8odSkmJihvKGE9dS5ob29rKSYmbyhhPWEuaW5pdCkmJmEodCwhMCksbyhhPXQuY29tcG9uZW50SW5zdGFuY2UpKSlyZXR1cm4gbCh0LG4pLCEwO2lmKG8ocykpe2lmKG8oYykpaWYoZS5oYXNDaGlsZE5vZGVzKCkpaWYobyhhPXUpJiZvKGE9YS5kb21Qcm9wcykmJm8oYT1hLmlubmVySFRNTCkpe2lmKGEhPT1lLmlubmVySFRNTClyZXR1cm4hMX1lbHNle2Zvcih2YXIgZj0hMCxwPWUuZmlyc3RDaGlsZCxoPTA7aDxjLmxlbmd0aDtoKyspe2lmKCFwfHwhQShwLGNbaF0sbixyKSl7Zj0hMTticmVha31wPXAubmV4dFNpYmxpbmd9aWYoIWZ8fHApcmV0dXJuITF9ZWxzZSBkKHQsYyxuKTtpZihvKHUpKXt2YXIgdj0hMTtmb3IodmFyIHkgaW4gdSlpZighTih5KSl7dj0hMCxtKHQsbik7YnJlYWt9IXYmJnUuY2xhc3MmJmZlKHUuY2xhc3MpfX1lbHNlIGUuZGF0YSE9PXQudGV4dCYmKGUuZGF0YT10LnRleHQpO3JldHVybiEwfXZhciBTLCQsRT17fSxPPWUubW9kdWxlcyxqPWUubm9kZU9wcztmb3IoUz0wO1M8RHMubGVuZ3RoOysrUylmb3IoRVtEc1tTXV09W10sJD0wOyQ8Ty5sZW5ndGg7KyskKW8oT1skXVtEc1tTXV0pJiZFW0RzW1NdXS5wdXNoKE9bJF1bRHNbU11dKTt2YXIgTj12KCJhdHRycyxjbGFzcyxzdGF0aWNDbGFzcyxzdGF0aWNTdHlsZSxrZXkiKTtyZXR1cm4gZnVuY3Rpb24oZSxuLGEscyl7aWYocihuKSlyZXR1cm4gdm9pZChvKGUpJiZiKGUpKTt2YXIgYz0hMSxsPVtdO2lmKHIoZSkpYz0hMCx1KG4sbCk7ZWxzZXt2YXIgZj1vKGUubm9kZVR5cGUpO2lmKCFmJiZrbihlLG4pKVQoZSxuLGwsbnVsbCxudWxsLHMpO2Vsc2V7aWYoZil7aWYoMT09PWUubm9kZVR5cGUmJmUuaGFzQXR0cmlidXRlKElpKSYmKGUucmVtb3ZlQXR0cmlidXRlKElpKSxhPSEwKSxpKGEpJiZBKGUsbixsKSlyZXR1cm4gayhuLGwsITApLGU7ZT10KGUpfXZhciBwPWUuZWxtLGQ9ai5wYXJlbnROb2RlKHApO2lmKHUobixsLHAuX2xlYXZlQ2I/bnVsbDpkLGoubmV4dFNpYmxpbmcocCkpLG8obi5wYXJlbnQpKWZvcih2YXIgdj1uLnBhcmVudCxtPWgobik7djspe2Zvcih2YXIgeT0wO3k8RS5kZXN0cm95Lmxlbmd0aDsrK3kpRS5kZXN0cm95W3ldKHYpO2lmKHYuZWxtPW4uZWxtLG0pe2Zvcih2YXIgZz0wO2c8RS5jcmVhdGUubGVuZ3RoOysrZylFLmNyZWF0ZVtnXShOcyx2KTt2YXIgdz12LmRhdGEuaG9vay5pbnNlcnQ7aWYody5tZXJnZWQpZm9yKHZhciBfPTE7Xzx3LmZucy5sZW5ndGg7XysrKXcuZm5zW19dKCl9ZWxzZSBUbih2KTt2PXYucGFyZW50fW8oZCk/eChbZV0sMCwwKTpvKGUudGFnKSYmYihlKX19cmV0dXJuIGsobixsLGMpLG4uZWxtfX0oe25vZGVPcHM6T3MsbW9kdWxlczpmdX0pO0tpJiZkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCJzZWxlY3Rpb25jaGFuZ2UiLGZ1bmN0aW9uKCl7dmFyIGU9ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDtlJiZlLnZtb2RlbCYmenIoZSwiaW5wdXQiKX0pO3ZhciBkdT17aW5zZXJ0ZWQ6ZnVuY3Rpb24oZSx0LG4scil7InNlbGVjdCI9PT1uLnRhZz8oci5lbG0mJiFyLmVsbS5fdk9wdGlvbnM/dmUobiwicG9zdHBhdGNoIixmdW5jdGlvbigpe2R1LmNvbXBvbmVudFVwZGF0ZWQoZSx0LG4pfSk6cXIoZSx0LG4uY29udGV4dCksZS5fdk9wdGlvbnM9W10ubWFwLmNhbGwoZS5vcHRpb25zLEJyKSk6KCJ0ZXh0YXJlYSI9PT1uLnRhZ3x8RXMoZS50eXBlKSkmJihlLl92TW9kaWZpZXJzPXQubW9kaWZpZXJzLHQubW9kaWZpZXJzLmxhenl8fChlLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uc3RhcnQiLFVyKSxlLmFkZEV2ZW50TGlzdGVuZXIoImNvbXBvc2l0aW9uZW5kIixXciksZS5hZGRFdmVudExpc3RlbmVyKCJjaGFuZ2UiLFdyKSxLaSYmKGUudm1vZGVsPSEwKSkpfSxjb21wb25lbnRVcGRhdGVkOmZ1bmN0aW9uKGUsdCxuKXtpZigic2VsZWN0Ij09PW4udGFnKXtxcihlLHQsbi5jb250ZXh0KTt2YXIgcj1lLl92T3B0aW9ucyxvPWUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucyxCcik7aWYoby5zb21lKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIWsoZSxyW3RdKX0pKXsoZS5tdWx0aXBsZT90LnZhbHVlLnNvbWUoZnVuY3Rpb24oZSl7cmV0dXJuIEZyKGUsbyl9KTp0LnZhbHVlIT09dC5vbGRWYWx1ZSYmRnIodC52YWx1ZSxvKSkmJnpyKGUsImNoYW5nZSIpfX19fSxodT17YmluZDpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTtuPVZyKG4pO3ZhciBvPW4uZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24saT1lLl9fdk9yaWdpbmFsRGlzcGxheT0ibm9uZSI9PT1lLnN0eWxlLmRpc3BsYXk/IiI6ZS5zdHlsZS5kaXNwbGF5O3ImJm8/KG4uZGF0YS5zaG93PSEwLExyKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9aX0pKTplLnN0eWxlLmRpc3BsYXk9cj9pOiJub25lIn0sdXBkYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10LnZhbHVlOyFyIT0hdC5vbGRWYWx1ZSYmKG49VnIobiksbi5kYXRhJiZuLmRhdGEudHJhbnNpdGlvbj8obi5kYXRhLnNob3c9ITAscj9McihuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PWUuX192T3JpZ2luYWxEaXNwbGF5fSk6UnIobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT0ibm9uZSJ9KSk6ZS5zdHlsZS5kaXNwbGF5PXI/ZS5fX3ZPcmlnaW5hbERpc3BsYXk6Im5vbmUiKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCxuLHIsbyl7b3x8KGUuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheSl9fSx2dT17bW9kZWw6ZHUsc2hvdzpodX0sbXU9e25hbWU6U3RyaW5nLGFwcGVhcjpCb29sZWFuLGNzczpCb29sZWFuLG1vZGU6U3RyaW5nLHR5cGU6U3RyaW5nLGVudGVyQ2xhc3M6U3RyaW5nLGxlYXZlQ2xhc3M6U3RyaW5nLGVudGVyVG9DbGFzczpTdHJpbmcsbGVhdmVUb0NsYXNzOlN0cmluZyxlbnRlckFjdGl2ZUNsYXNzOlN0cmluZyxsZWF2ZUFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJDbGFzczpTdHJpbmcsYXBwZWFyQWN0aXZlQ2xhc3M6U3RyaW5nLGFwcGVhclRvQ2xhc3M6U3RyaW5nLGR1cmF0aW9uOltOdW1iZXIsU3RyaW5nLE9iamVjdF19LHl1PWZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ3x8U2UoZSl9LGd1PWZ1bmN0aW9uKGUpe3JldHVybiJzaG93Ij09PWUubmFtZX0sYnU9e25hbWU6InRyYW5zaXRpb24iLHByb3BzOm11LGFic3RyYWN0OiEwLHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kc2xvdHMuZGVmYXVsdDtpZihuJiYobj1uLmZpbHRlcih5dSksbi5sZW5ndGgpKXt2YXIgcj10aGlzLm1vZGUsbz1uWzBdO2lmKEdyKHRoaXMuJHZub2RlKSlyZXR1cm4gbzt2YXIgaT1YcihvKTtpZighaSlyZXR1cm4gbztpZih0aGlzLl9sZWF2aW5nKXJldHVybiBLcihlLG8pO3ZhciBhPSJfX3RyYW5zaXRpb24tIit0aGlzLl91aWQrIi0iO2kua2V5PW51bGw9PWkua2V5P2kuaXNDb21tZW50P2ErImNvbW1lbnQiOmEraS50YWc6cyhpLmtleSk/MD09PVN0cmluZyhpLmtleSkuaW5kZXhPZihhKT9pLmtleTphK2kua2V5Omkua2V5O3ZhciB1PShpLmRhdGF8fChpLmRhdGE9e30pKS50cmFuc2l0aW9uPUpyKHRoaXMpLGM9dGhpcy5fdm5vZGUsbD1YcihjKTtpZihpLmRhdGEuZGlyZWN0aXZlcyYmaS5kYXRhLmRpcmVjdGl2ZXMuc29tZShndSkmJihpLmRhdGEuc2hvdz0hMCksbCYmbC5kYXRhJiYhWXIoaSxsKSYmIVNlKGwpJiYoIWwuY29tcG9uZW50SW5zdGFuY2V8fCFsLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZS5pc0NvbW1lbnQpKXt2YXIgZj1sLmRhdGEudHJhbnNpdGlvbj1fKHt9LHUpO2lmKCJvdXQtaW4iPT09cilyZXR1cm4gdGhpcy5fbGVhdmluZz0hMCx2ZShmLCJhZnRlckxlYXZlIixmdW5jdGlvbigpe3QuX2xlYXZpbmc9ITEsdC4kZm9yY2VVcGRhdGUoKX0pLEtyKGUsbyk7aWYoImluLW91dCI9PT1yKXtpZihTZShpKSlyZXR1cm4gYzt2YXIgcCxkPWZ1bmN0aW9uKCl7cCgpfTt2ZSh1LCJhZnRlckVudGVyIixkKSx2ZSh1LCJlbnRlckNhbmNlbGxlZCIsZCksdmUoZiwiZGVsYXlMZWF2ZSIsZnVuY3Rpb24oZSl7cD1lfSl9fXJldHVybiBvfX19LHh1PV8oe3RhZzpTdHJpbmcsbW92ZUNsYXNzOlN0cmluZ30sbXUpO2RlbGV0ZSB4dS5tb2RlO3ZhciB3dT17cHJvcHM6eHUsYmVmb3JlTW91bnQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5fdXBkYXRlO3RoaXMuX3VwZGF0ZT1mdW5jdGlvbihuLHIpe3ZhciBvPXZ0KGUpO2UuX19wYXRjaF9fKGUuX3Zub2RlLGUua2VwdCwhMSwhMCksZS5fdm5vZGU9ZS5rZXB0LG8oKSx0LmNhbGwoZSxuLHIpfX0scmVuZGVyOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdD10aGlzLnRhZ3x8dGhpcy4kdm5vZGUuZGF0YS50YWd8fCJzcGFuIixuPU9iamVjdC5jcmVhdGUobnVsbCkscj10aGlzLnByZXZDaGlsZHJlbj10aGlzLmNoaWxkcmVuLG89dGhpcy4kc2xvdHMuZGVmYXVsdHx8W10saT10aGlzLmNoaWxkcmVuPVtdLGE9SnIodGhpcykscz0wO3M8by5sZW5ndGg7cysrKXt2YXIgdT1vW3NdO2lmKHUudGFnKWlmKG51bGwhPXUua2V5JiYwIT09U3RyaW5nKHUua2V5KS5pbmRleE9mKCJfX3ZsaXN0IikpaS5wdXNoKHUpLG5bdS5rZXldPXUsKHUuZGF0YXx8KHUuZGF0YT17fSkpLnRyYW5zaXRpb249YTtlbHNlO31pZihyKXtmb3IodmFyIGM9W10sbD1bXSxmPTA7ZjxyLmxlbmd0aDtmKyspe3ZhciBwPXJbZl07cC5kYXRhLnRyYW5zaXRpb249YSxwLmRhdGEucG9zPXAuZWxtLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG5bcC5rZXldP2MucHVzaChwKTpsLnB1c2gocCl9dGhpcy5rZXB0PWUodCxudWxsLGMpLHRoaXMucmVtb3ZlZD1sfXJldHVybiBlKHQsbnVsbCxpKX0sdXBkYXRlZDpmdW5jdGlvbigpe3ZhciBlPXRoaXMucHJldkNoaWxkcmVuLHQ9dGhpcy5tb3ZlQ2xhc3N8fCh0aGlzLm5hbWV8fCJ2IikrIi1tb3ZlIjtlLmxlbmd0aCYmdGhpcy5oYXNNb3ZlKGVbMF0uZWxtLHQpJiYoZS5mb3JFYWNoKFFyKSxlLmZvckVhY2goWnIpLGUuZm9yRWFjaChlbyksdGhpcy5fcmVmbG93PWRvY3VtZW50LmJvZHkub2Zmc2V0SGVpZ2h0LGUuZm9yRWFjaChmdW5jdGlvbihlKXtpZihlLmRhdGEubW92ZWQpe3ZhciBuPWUuZWxtLHI9bi5zdHlsZTskcihuLHQpLHIudHJhbnNmb3JtPXIuV2Via2l0VHJhbnNmb3JtPXIudHJhbnNpdGlvbkR1cmF0aW9uPSIiLG4uYWRkRXZlbnRMaXN0ZW5lcihvdSxuLl9tb3ZlQ2I9ZnVuY3Rpb24gZShyKXtyJiZyLnRhcmdldCE9PW58fHImJiEvdHJhbnNmb3JtJC8udGVzdChyLnByb3BlcnR5TmFtZSl8fChuLnJlbW92ZUV2ZW50TGlzdGVuZXIob3UsZSksbi5fbW92ZUNiPW51bGwsRXIobix0KSl9KX19KSl9LG1ldGhvZHM6e2hhc01vdmU6ZnVuY3Rpb24oZSx0KXtpZighZXUpcmV0dXJuITE7aWYodGhpcy5faGFzTW92ZSlyZXR1cm4gdGhpcy5faGFzTW92ZTt2YXIgbj1lLmNsb25lTm9kZSgpO2UuX3RyYW5zaXRpb25DbGFzc2VzJiZlLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2tyKG4sZSl9KSxUcihuLHQpLG4uc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy4kZWwuYXBwZW5kQ2hpbGQobik7dmFyIHI9anIobik7cmV0dXJuIHRoaXMuJGVsLnJlbW92ZUNoaWxkKG4pLHRoaXMuX2hhc01vdmU9ci5oYXNUcmFuc2Zvcm19fX0sX3U9e1RyYW5zaXRpb246YnUsVHJhbnNpdGlvbkdyb3VwOnd1fTtXdC5jb25maWcubXVzdFVzZVByb3A9aHMsV3QuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9U3MsV3QuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPXBzLFd0LmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9Y24sV3QuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9bG4sXyhXdC5vcHRpb25zLmRpcmVjdGl2ZXMsdnUpLF8oV3Qub3B0aW9ucy5jb21wb25lbnRzLF91KSxXdC5wcm90b3R5cGUuX19wYXRjaF9fPVdpP3B1OlQsV3QucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWUmJldpP2ZuKGUpOnZvaWQgMCx5dCh0aGlzLGUsdCl9LFdpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7SGkuZGV2dG9vbHMmJmlhJiZpYS5lbWl0KCJpbml0IixXdCl9LDApO3ZhciBDdSxUdSxrdSxBdSxTdSwkdSxFdSxPdSxqdSxOdSxEdSxMdSxSdSxNdT0vXHtceygoPzoufFxyP1xuKSs/KVx9XH0vZyxJdT0vWy0uKis/XiR7fSgpfFtcXVwvXFxdL2csUHU9ZyhmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnJlcGxhY2UoSXUsIlxcJCYiKSxuPWVbMV0ucmVwbGFjZShJdSwiXFwkJiIpO3JldHVybiBuZXcgUmVnRXhwKHQrIigoPzoufFxcbikrPykiK24sImciKX0pLHF1PXtzdGF0aWNLZXlzOlsic3RhdGljQ2xhc3MiXSx0cmFuc2Zvcm1Ob2RlOm5vLGdlbkRhdGE6cm99LEh1PXtzdGF0aWNLZXlzOlsic3RhdGljU3R5bGUiXSx0cmFuc2Zvcm1Ob2RlOm9vLGdlbkRhdGE6aW99LEZ1PXtkZWNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIEN1PUN1fHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxDdS5pbm5lckhUTUw9ZSxDdS50ZXh0Q29udGVudH19LEJ1PXYoImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyIiksVXU9digiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZSIpLFd1PXYoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCxkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0saDEsaDIsaDMsaDQsaDUsaDYsaGVhZCxoZWFkZXIsaGdyb3VwLGhyLGh0bWwsbGVnZW5kLGxpLG1lbnVpdGVtLG1ldGEsb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRpdGxlLHRyLHRyYWNrIiksenU9L15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLFZ1PS9eXHMqKCg/OnYtW1x3LV0rOnxAfDp8IylcW1tePV0rP1xdW15ccyInPD5cLz1dKikoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLFh1PSJbYS16QS1aX11bXFwtXFwuMC05X2EtekEtWiIrRmkuc291cmNlKyJdKiIsSnU9IigoPzoiK1h1KyJcXDopPyIrWHUrIikiLEt1PW5ldyBSZWdFeHAoIl48IitKdSksR3U9L15ccyooXC8/KT4vLFl1PW5ldyBSZWdFeHAoIl48XFwvIitKdSsiW14+XSo+IiksUXU9L148IURPQ1RZUEUgW14+XSs+L2ksWnU9L148IVwtLS8sZWM9L148IVxbLyx0Yz12KCJzY3JpcHQsc3R5bGUsdGV4dGFyZWEiLCEwKSxuYz17fSxyYz17IiZsdDsiOiI8IiwiJmd0OyI6Ij4iLCImcXVvdDsiOiciJywiJmFtcDsiOiImIiwiJiMxMDsiOiJcbiIsIiYjOTsiOiJcdCIsIiYjMzk7IjoiJyJ9LG9jPS8mKD86bHR8Z3R8cXVvdHxhbXB8IzM5KTsvZyxpYz0vJig/Omx0fGd0fHF1b3R8YW1wfCMzOXwjMTB8IzkpOy9nLGFjPXYoInByZSx0ZXh0YXJlYSIsITApLHNjPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUmJmFjKGUpJiYiXG4iPT09dFswXX0sdWM9L15AfF52LW9uOi8sY2M9L152LXxeQHxeOnxeIy8sbGM9LyhbXHNcU10qPylccysoPzppbnxvZilccysoW1xzXFNdKikvLGZjPS8sKFteLFx9XF1dKikoPzosKFteLFx9XF1dKikpPyQvLHBjPS9eXCh8XCkkL2csZGM9L15cWy4qXF0kLyxoYz0vOiguKikkLyx2Yz0vXjp8XlwufF52LWJpbmQ6LyxtYz0vXC5bXi5cXV0rKD89W15cXV0qJCkvZyx5Yz0vXnYtc2xvdCg6fCQpfF4jLyxnYz0vW1xyXG5dLyxiYz0vWyBcZlx0XHJcbl0rL2cseGM9ZyhGdS5kZWNvZGUpLHdjPSJfZW1wdHlfIixfYz0vXnhtbG5zOk5TXGQrLyxDYz0vXk5TXGQrOi8sVGM9e3ByZVRyYW5zZm9ybU5vZGU6TG99LGtjPVtxdSxIdSxUY10sQWM9e21vZGVsOmFyLHRleHQ6TW8saHRtbDpJb30sU2M9e2V4cGVjdEhUTUw6ITAsbW9kdWxlczprYyxkaXJlY3RpdmVzOkFjLGlzUHJlVGFnOkFzLGlzVW5hcnlUYWc6QnUsbXVzdFVzZVByb3A6aHMsY2FuQmVMZWZ0T3BlblRhZzpVdSxpc1Jlc2VydmVkVGFnOlNzLGdldFRhZ05hbWVzcGFjZTpjbixzdGF0aWNLZXlzOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlZHVjZShmdW5jdGlvbihlLHQpe3JldHVybiBlLmNvbmNhdCh0LnN0YXRpY0tleXN8fFtdKX0sW10pLmpvaW4oIiwiKX0oa2MpfSwkYz1nKHFvKSxFYz0vXihbXHckX10rfFwoW14pXSo/XCkpXHMqPT58XmZ1bmN0aW9uKD86XHMrW1x3JF0rKT9ccypcKC8sT2M9L1woW14pXSo/XCk7KiQvLGpjPS9eW0EtWmEtel8kXVtcdyRdKig/OlwuW0EtWmEtel8kXVtcdyRdKnxcWydbXiddKj8nXXxcWyJbXiJdKj8iXXxcW1xkK118XFtbQS1aYS16XyRdW1x3JF0qXSkqJC8sTmM9e2VzYzoyNyx0YWI6OSxlbnRlcjoxMyxzcGFjZTozMix1cDozOCxsZWZ0OjM3LHJpZ2h0OjM5LGRvd246NDAsZGVsZXRlOls4LDQ2XX0sRGM9e2VzYzpbIkVzYyIsIkVzY2FwZSJdLHRhYjoiVGFiIixlbnRlcjoiRW50ZXIiLHNwYWNlOlsiICIsIlNwYWNlYmFyIl0sdXA6WyJVcCIsIkFycm93VXAiXSxsZWZ0OlsiTGVmdCIsIkFycm93TGVmdCJdLHJpZ2h0OlsiUmlnaHQiLCJBcnJvd1JpZ2h0Il0sZG93bjpbIkRvd24iLCJBcnJvd0Rvd24iXSxkZWxldGU6WyJCYWNrc3BhY2UiLCJEZWxldGUiLCJEZWwiXX0sTGM9ZnVuY3Rpb24oZSl7cmV0dXJuImlmKCIrZSsiKXJldHVybiBudWxsOyJ9LFJjPXtzdG9wOiIkZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7IixwcmV2ZW50OiIkZXZlbnQucHJldmVudERlZmF1bHQoKTsiLHNlbGY6TGMoIiRldmVudC50YXJnZXQgIT09ICRldmVudC5jdXJyZW50VGFyZ2V0IiksY3RybDpMYygiISRldmVudC5jdHJsS2V5Iiksc2hpZnQ6TGMoIiEkZXZlbnQuc2hpZnRLZXkiKSxhbHQ6TGMoIiEkZXZlbnQuYWx0S2V5IiksbWV0YTpMYygiISRldmVudC5tZXRhS2V5IiksbGVmdDpMYygiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDAiKSxtaWRkbGU6TGMoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAxIikscmlnaHQ6TGMoIididXR0b24nIGluICRldmVudCAmJiAkZXZlbnQuYnV0dG9uICE9PSAyIil9LE1jPXtvbjpKbyxiaW5kOktvLGNsb2FrOlR9LEljPWZ1bmN0aW9uKGUpe3RoaXMub3B0aW9ucz1lLHRoaXMud2Fybj1lLndhcm58fHFuLHRoaXMudHJhbnNmb3Jtcz1IbihlLm1vZHVsZXMsInRyYW5zZm9ybUNvZGUiKSx0aGlzLmRhdGFHZW5GbnM9SG4oZS5tb2R1bGVzLCJnZW5EYXRhIiksdGhpcy5kaXJlY3RpdmVzPV8oXyh7fSxNYyksZS5kaXJlY3RpdmVzKTt2YXIgdD1lLmlzUmVzZXJ2ZWRUYWd8fFJpO3RoaXMubWF5YmVDb21wb25lbnQ9ZnVuY3Rpb24oZSl7cmV0dXJuISFlLmNvbXBvbmVudHx8IXQoZS50YWcpfSx0aGlzLm9uY2VJZD0wLHRoaXMuc3RhdGljUmVuZGVyRm5zPVtdLHRoaXMucHJlPSExfSxQYz0obmV3IFJlZ0V4cCgiXFxiIisiZG8saWYsZm9yLGxldCxuZXcsdHJ5LHZhcixjYXNlLGVsc2Usd2l0aCxhd2FpdCxicmVhayxjYXRjaCxjbGFzcyxjb25zdCxzdXBlcix0aHJvdyx3aGlsZSx5aWVsZCxkZWxldGUsZXhwb3J0LGltcG9ydCxyZXR1cm4sc3dpdGNoLGRlZmF1bHQsZXh0ZW5kcyxmaW5hbGx5LGNvbnRpbnVlLGRlYnVnZ2VyLGZ1bmN0aW9uLGFyZ3VtZW50cyIuc3BsaXQoIiwiKS5qb2luKCJcXGJ8XFxiIikrIlxcYiIpLG5ldyBSZWdFeHAoIlxcYiIrImRlbGV0ZSx0eXBlb2Ysdm9pZCIuc3BsaXQoIiwiKS5qb2luKCJcXHMqXFwoW15cXCldKlxcKXxcXGIiKSsiXFxzKlxcKFteXFwpXSpcXCkiKSxmdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7ZnVuY3Rpb24gbihuLHIpe3ZhciBvPU9iamVjdC5jcmVhdGUodCksaT1bXSxhPVtdLHM9ZnVuY3Rpb24oZSx0LG4peyhuP2E6aSkucHVzaChlKX07aWYocil7ci5tb2R1bGVzJiYoby5tb2R1bGVzPSh0Lm1vZHVsZXN8fFtdKS5jb25jYXQoci5tb2R1bGVzKSksci5kaXJlY3RpdmVzJiYoby5kaXJlY3RpdmVzPV8oT2JqZWN0LmNyZWF0ZSh0LmRpcmVjdGl2ZXN8fG51bGwpLHIuZGlyZWN0aXZlcykpO2Zvcih2YXIgdSBpbiByKSJtb2R1bGVzIiE9PXUmJiJkaXJlY3RpdmVzIiE9PXUmJihvW3VdPXJbdV0pfW8ud2Fybj1zO3ZhciBjPWUobi50cmltKCksbyk7cmV0dXJuIGMuZXJyb3JzPWksYy50aXBzPWEsY31yZXR1cm57Y29tcGlsZTpuLGNvbXBpbGVUb0Z1bmN0aW9uczp3aShuKX19fShmdW5jdGlvbihlLHQpe3ZhciBuPWNvKGUudHJpbSgpLHQpOyExIT09dC5vcHRpbWl6ZSYmUG8obix0KTt2YXIgcj1HbyhuLHQpO3JldHVybnthc3Q6bixyZW5kZXI6ci5yZW5kZXIsc3RhdGljUmVuZGVyRm5zOnIuc3RhdGljUmVuZGVyRm5zfX0pKSxxYz1QYyhTYyksSGM9KHFjLmNvbXBpbGUscWMuY29tcGlsZVRvRnVuY3Rpb25zKSxGYz0hIVdpJiZfaSghMSksQmM9ISFXaSYmX2koITApLFVjPWcoZnVuY3Rpb24oZSl7dmFyIHQ9Zm4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksV2M9V3QucHJvdG90eXBlLiRtb3VudDtXdC5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmZm4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKCJzdHJpbmciPT10eXBlb2YgcikiIyI9PT1yLmNoYXJBdCgwKSYmKHI9VWMocikpO2Vsc2V7aWYoIXIubm9kZVR5cGUpcmV0dXJuIHRoaXM7cj1yLmlubmVySFRNTH1lbHNlIGUmJihyPUNpKGUpKTtpZihyKXt2YXIgbz1IYyhyLHtvdXRwdXRTb3VyY2VSYW5nZTohMSxzaG91bGREZWNvZGVOZXdsaW5lczpGYyxzaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6QmMsZGVsaW1pdGVyczpuLmRlbGltaXRlcnMsY29tbWVudHM6bi5jb21tZW50c30sdGhpcyksaT1vLnJlbmRlcixhPW8uc3RhdGljUmVuZGVyRm5zO24ucmVuZGVyPWksbi5zdGF0aWNSZW5kZXJGbnM9YX19cmV0dXJuIFdjLmNhbGwodGhpcyxlLHQpfSxXdC5jb21waWxlPUhjLHQuYT1XdH0pLmNhbGwodCxuKDEwKSxuKDc2KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiJvYmplY3QiPT10eXBlb2YgZT9udWxsIT09ZToiZnVuY3Rpb24iPT10eXBlb2YgZX19LGZ1bmN0aW9uKGUsdCl7dmFyIG47bj1mdW5jdGlvbigpe3JldHVybiB0aGlzfSgpO3RyeXtuPW58fEZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCl8fCgwLGV2YWwpKCJ0aGlzIil9Y2F0Y2goZSl7Im9iamVjdCI9PXR5cGVvZiB3aW5kb3cmJihuPXdpbmRvdyl9ZS5leHBvcnRzPW59LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9e2RlZmF1bHQ6big0MSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGUsdCl7dmFyIG49e30uaGFzT3duUHJvcGVydHk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIG4uY2FsbChlLHQpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDUpO2UuZXhwb3J0cz1PYmplY3QoInoiKS5wcm9wZXJ0eUlzRW51bWVyYWJsZSgwKT9PYmplY3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIlN0cmluZyI9PXIoZSk/ZS5zcGxpdCgiIik6T2JqZWN0KGUpfX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9Ilx0XG5cdlxmXHIgwqDhmoDhoI7igIDigIHigILigIPigITigIXigIbigIfigIjigInigIrigK/igZ/jgIBcdTIwMjhcdTIwMjlcdWZlZmYifSxmdW5jdGlvbihlLHQpe3ZhciBuPU1hdGguY2VpbCxyPU1hdGguZmxvb3I7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBpc05hTihlPStlKT8wOihlPjA/cjpuKShlKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEzKSxvPW4oOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiByKG8oZSkpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByLG87LyohCisgKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYzLjYuMAorICogaHR0cHM6Ly9qcXVlcnkuY29tLworICoKKyAqIEluY2x1ZGVzIFNpenpsZS5qcworICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCisgKgorICogQ29weXJpZ2h0IE9wZW5KUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKKyAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQorICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKKyAqCisgKiBEYXRlOiAyMDIxLTAzLTAyVDE3OjA4WgorICovCishZnVuY3Rpb24odCxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZXhwb3J0cz9lLmV4cG9ydHM9dC5kb2N1bWVudD9uKHQsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBuKGUpfTpuKHQpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihuLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCxuKXtuPW58fGtlO3ZhciByLG8saT1uLmNyZWF0ZUVsZW1lbnQoInNjcmlwdCIpO2lmKGkudGV4dD1lLHQpZm9yKHIgaW4gQWUpKG89dFtyXXx8dC5nZXRBdHRyaWJ1dGUmJnQuZ2V0QXR0cmlidXRlKHIpKSYmaS5zZXRBdHRyaWJ1dGUocixvKTtuLmhlYWQuYXBwZW5kQ2hpbGQoaSkucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChpKX1mdW5jdGlvbiBzKGUpe3JldHVybiBudWxsPT1lP2UrIiI6Im9iamVjdCI9PXR5cGVvZiBlfHwiZnVuY3Rpb24iPT10eXBlb2YgZT95ZVtnZS5jYWxsKGUpXXx8Im9iamVjdCI6dHlwZW9mIGV9ZnVuY3Rpb24gdShlKXt2YXIgdD0hIWUmJiJsZW5ndGgiaW4gZSYmZS5sZW5ndGgsbj1zKGUpO3JldHVybiFDZShlKSYmIVRlKGUpJiYoImFycmF5Ij09PW58fDA9PT10fHwibnVtYmVyIj09dHlwZW9mIHQmJnQ+MCYmdC0xIGluIGUpfWZ1bmN0aW9uIGMoZSx0KXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfWZ1bmN0aW9uIGwoZSx0LG4pe3JldHVybiBDZSh0KT9TZS5ncmVwKGUsZnVuY3Rpb24oZSxyKXtyZXR1cm4hIXQuY2FsbChlLHIsZSkhPT1ufSk6dC5ub2RlVHlwZT9TZS5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10IT09bn0pOiJzdHJpbmciIT10eXBlb2YgdD9TZS5ncmVwKGUsZnVuY3Rpb24oZSl7cmV0dXJuIG1lLmNhbGwodCxlKT4tMSE9PW59KTpTZS5maWx0ZXIodCxlLG4pfWZ1bmN0aW9uIGYoZSx0KXtmb3IoOyhlPWVbdF0pJiYxIT09ZS5ub2RlVHlwZTspO3JldHVybiBlfWZ1bmN0aW9uIHAoZSl7dmFyIHQ9e307cmV0dXJuIFNlLmVhY2goZS5tYXRjaChJZSl8fFtdLGZ1bmN0aW9uKGUsbil7dFtuXT0hMH0pLHR9ZnVuY3Rpb24gZChlKXtyZXR1cm4gZX1mdW5jdGlvbiBoKGUpe3Rocm93IGV9ZnVuY3Rpb24gdihlLHQsbixyKXt2YXIgbzt0cnl7ZSYmQ2Uobz1lLnByb21pc2UpP28uY2FsbChlKS5kb25lKHQpLmZhaWwobik6ZSYmQ2Uobz1lLnRoZW4pP28uY2FsbChlLHQsbik6dC5hcHBseSh2b2lkIDAsW2VdLnNsaWNlKHIpKX1jYXRjaChlKXtuLmFwcGx5KHZvaWQgMCxbZV0pfX1mdW5jdGlvbiBtKCl7a2UucmVtb3ZlRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbSksbi5yZW1vdmVFdmVudExpc3RlbmVyKCJsb2FkIixtKSxTZS5yZWFkeSgpfWZ1bmN0aW9uIHkoZSx0KXtyZXR1cm4gdC50b1VwcGVyQ2FzZSgpfWZ1bmN0aW9uIGcoZSl7cmV0dXJuIGUucmVwbGFjZShGZSwibXMtIikucmVwbGFjZShCZSx5KX1mdW5jdGlvbiBiKCl7dGhpcy5leHBhbmRvPVNlLmV4cGFuZG8rYi51aWQrK31mdW5jdGlvbiB4KGUpe3JldHVybiJ0cnVlIj09PWV8fCJmYWxzZSIhPT1lJiYoIm51bGwiPT09ZT9udWxsOmU9PT0rZSsiIj8rZTpWZS50ZXN0KGUpP0pTT04ucGFyc2UoZSk6ZSl9ZnVuY3Rpb24gdyhlLHQsbil7dmFyIHI7aWYodm9pZCAwPT09biYmMT09PWUubm9kZVR5cGUpaWYocj0iZGF0YS0iK3QucmVwbGFjZShYZSwiLSQmIikudG9Mb3dlckNhc2UoKSwic3RyaW5nIj09dHlwZW9mKG49ZS5nZXRBdHRyaWJ1dGUocikpKXt0cnl7bj14KG4pfWNhdGNoKGUpe316ZS5zZXQoZSx0LG4pfWVsc2Ugbj12b2lkIDA7cmV0dXJuIG59ZnVuY3Rpb24gXyhlLHQsbixyKXt2YXIgbyxpLGE9MjAscz1yP2Z1bmN0aW9uKCl7cmV0dXJuIHIuY3VyKCl9OmZ1bmN0aW9uKCl7cmV0dXJuIFNlLmNzcyhlLHQsIiIpfSx1PXMoKSxjPW4mJm5bM118fChTZS5jc3NOdW1iZXJbdF0/IiI6InB4IiksbD1lLm5vZGVUeXBlJiYoU2UuY3NzTnVtYmVyW3RdfHwicHgiIT09YyYmK3UpJiZLZS5leGVjKFNlLmNzcyhlLHQpKTtpZihsJiZsWzNdIT09Yyl7Zm9yKHUvPTIsYz1jfHxsWzNdLGw9K3V8fDE7YS0tOylTZS5zdHlsZShlLHQsbCtjKSwoMS1pKSooMS0oaT1zKCkvdXx8LjUpKTw9MCYmKGE9MCksbC89aTtsKj0yLFNlLnN0eWxlKGUsdCxsK2MpLG49bnx8W119cmV0dXJuIG4mJihsPStsfHwrdXx8MCxvPW5bMV0/bCsoblsxXSsxKSpuWzJdOituWzJdLHImJihyLnVuaXQ9YyxyLnN0YXJ0PWwsci5lbmQ9bykpLG99ZnVuY3Rpb24gQyhlKXt2YXIgdCxuPWUub3duZXJEb2N1bWVudCxyPWUubm9kZU5hbWUsbz10dFtyXTtyZXR1cm4gb3x8KHQ9bi5ib2R5LmFwcGVuZENoaWxkKG4uY3JlYXRlRWxlbWVudChyKSksbz1TZS5jc3ModCwiZGlzcGxheSIpLHQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSwibm9uZSI9PT1vJiYobz0iYmxvY2siKSx0dFtyXT1vLG8pfWZ1bmN0aW9uIFQoZSx0KXtmb3IodmFyIG4scixvPVtdLGk9MCxhPWUubGVuZ3RoO2k8YTtpKyspcj1lW2ldLHIuc3R5bGUmJihuPXIuc3R5bGUuZGlzcGxheSx0Pygibm9uZSI9PT1uJiYob1tpXT1XZS5nZXQociwiZGlzcGxheSIpfHxudWxsLG9baV18fChyLnN0eWxlLmRpc3BsYXk9IiIpKSwiIj09PXIuc3R5bGUuZGlzcGxheSYmZXQocikmJihvW2ldPUMocikpKToibm9uZSIhPT1uJiYob1tpXT0ibm9uZSIsV2Uuc2V0KHIsImRpc3BsYXkiLG4pKSk7Zm9yKGk9MDtpPGE7aSsrKW51bGwhPW9baV0mJihlW2ldLnN0eWxlLmRpc3BsYXk9b1tpXSk7cmV0dXJuIGV9ZnVuY3Rpb24gayhlLHQpe3ZhciBuO3JldHVybiBuPXZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZS5nZXRFbGVtZW50c0J5VGFnTmFtZSh0fHwiKiIpOnZvaWQgMCE9PWUucXVlcnlTZWxlY3RvckFsbD9lLnF1ZXJ5U2VsZWN0b3JBbGwodHx8IioiKTpbXSx2b2lkIDA9PT10fHx0JiZjKGUsdCk/U2UubWVyZ2UoW2VdLG4pOm59ZnVuY3Rpb24gQShlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylXZS5zZXQoZVtuXSwiZ2xvYmFsRXZhbCIsIXR8fFdlLmdldCh0W25dLCJnbG9iYWxFdmFsIikpfWZ1bmN0aW9uIFMoZSx0LG4scixvKXtmb3IodmFyIGksYSx1LGMsbCxmLHA9dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksZD1bXSxoPTAsdj1lLmxlbmd0aDtoPHY7aCsrKWlmKChpPWVbaF0pfHwwPT09aSlpZigib2JqZWN0Ij09PXMoaSkpU2UubWVyZ2UoZCxpLm5vZGVUeXBlP1tpXTppKTtlbHNlIGlmKGF0LnRlc3QoaSkpe2ZvcihhPWF8fHAuYXBwZW5kQ2hpbGQodC5jcmVhdGVFbGVtZW50KCJkaXYiKSksdT0ocnQuZXhlYyhpKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKSxjPWl0W3VdfHxpdC5fZGVmYXVsdCxhLmlubmVySFRNTD1jWzFdK1NlLmh0bWxQcmVmaWx0ZXIoaSkrY1syXSxmPWNbMF07Zi0tOylhPWEubGFzdENoaWxkO1NlLm1lcmdlKGQsYS5jaGlsZE5vZGVzKSxhPXAuZmlyc3RDaGlsZCxhLnRleHRDb250ZW50PSIifWVsc2UgZC5wdXNoKHQuY3JlYXRlVGV4dE5vZGUoaSkpO2ZvcihwLnRleHRDb250ZW50PSIiLGg9MDtpPWRbaCsrXTspaWYociYmU2UuaW5BcnJheShpLHIpPi0xKW8mJm8ucHVzaChpKTtlbHNlIGlmKGw9UWUoaSksYT1rKHAuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGwmJkEoYSksbilmb3IoZj0wO2k9YVtmKytdOylvdC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSk7cmV0dXJuIHB9ZnVuY3Rpb24gJCgpe3JldHVybiEwfWZ1bmN0aW9uIEUoKXtyZXR1cm4hMX1mdW5jdGlvbiBPKGUsdCl7cmV0dXJuIGU9PT1qKCk9PSgiZm9jdXMiPT09dCl9ZnVuY3Rpb24gaigpe3RyeXtyZXR1cm4ga2UuYWN0aXZlRWxlbWVudH1jYXRjaChlKXt9fWZ1bmN0aW9uIE4oZSx0LG4scixvLGkpe3ZhciBhLHM7aWYoIm9iamVjdCI9PXR5cGVvZiB0KXsic3RyaW5nIiE9dHlwZW9mIG4mJihyPXJ8fG4sbj12b2lkIDApO2ZvcihzIGluIHQpTihlLHMsbixyLHRbc10saSk7cmV0dXJuIGV9aWYobnVsbD09ciYmbnVsbD09bz8obz1uLHI9bj12b2lkIDApOm51bGw9PW8mJigic3RyaW5nIj09dHlwZW9mIG4/KG89cixyPXZvaWQgMCk6KG89cixyPW4sbj12b2lkIDApKSwhMT09PW8pbz1FO2Vsc2UgaWYoIW8pcmV0dXJuIGU7cmV0dXJuIDE9PT1pJiYoYT1vLG89ZnVuY3Rpb24oZSl7cmV0dXJuIFNlKCkub2ZmKGUpLGEuYXBwbHkodGhpcyxhcmd1bWVudHMpfSxvLmd1aWQ9YS5ndWlkfHwoYS5ndWlkPVNlLmd1aWQrKykpLGUuZWFjaChmdW5jdGlvbigpe1NlLmV2ZW50LmFkZCh0aGlzLHQsbyxyLG4pfSl9ZnVuY3Rpb24gRChlLHQsbil7aWYoIW4pcmV0dXJuIHZvaWQodm9pZCAwPT09V2UuZ2V0KGUsdCkmJlNlLmV2ZW50LmFkZChlLHQsJCkpO1dlLnNldChlLHQsITEpLFNlLmV2ZW50LmFkZChlLHQse25hbWVzcGFjZTohMSxoYW5kbGVyOmZ1bmN0aW9uKGUpe3ZhciByLG8saT1XZS5nZXQodGhpcyx0KTtpZigxJmUuaXNUcmlnZ2VyJiZ0aGlzW3RdKXtpZihpLmxlbmd0aCkoU2UuZXZlbnQuc3BlY2lhbFt0XXx8e30pLmRlbGVnYXRlVHlwZSYmZS5zdG9wUHJvcGFnYXRpb24oKTtlbHNlIGlmKGk9ZGUuY2FsbChhcmd1bWVudHMpLFdlLnNldCh0aGlzLHQsaSkscj1uKHRoaXMsdCksdGhpc1t0XSgpLG89V2UuZ2V0KHRoaXMsdCksaSE9PW98fHI/V2Uuc2V0KHRoaXMsdCwhMSk6bz17fSxpIT09bylyZXR1cm4gZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSxlLnByZXZlbnREZWZhdWx0KCksbyYmby52YWx1ZX1lbHNlIGkubGVuZ3RoJiYoV2Uuc2V0KHRoaXMsdCx7dmFsdWU6U2UuZXZlbnQudHJpZ2dlcihTZS5leHRlbmQoaVswXSxTZS5FdmVudC5wcm90b3R5cGUpLGkuc2xpY2UoMSksdGhpcyl9KSxlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpKX19KX1mdW5jdGlvbiBMKGUsdCl7cmV0dXJuIGMoZSwidGFibGUiKSYmYygxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/U2UoZSkuY2hpbGRyZW4oInRib2R5IilbMF18fGU6ZX1mdW5jdGlvbiBSKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gTShlKXtyZXR1cm4idHJ1ZS8iPT09KGUudHlwZXx8IiIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gSShlLHQpe3ZhciBuLHIsbyxpLGEscyx1O2lmKDE9PT10Lm5vZGVUeXBlKXtpZihXZS5oYXNEYXRhKGUpJiYoaT1XZS5nZXQoZSksdT1pLmV2ZW50cykpe1dlLnJlbW92ZSh0LCJoYW5kbGUgZXZlbnRzIik7Zm9yKG8gaW4gdSlmb3Iobj0wLHI9dVtvXS5sZW5ndGg7bjxyO24rKylTZS5ldmVudC5hZGQodCxvLHVbb11bbl0pfXplLmhhc0RhdGEoZSkmJihhPXplLmFjY2VzcyhlKSxzPVNlLmV4dGVuZCh7fSxhKSx6ZS5zZXQodCxzKSl9fWZ1bmN0aW9uIFAoZSx0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJm50LnRlc3QoZS50eXBlKT90LmNoZWNrZWQ9ZS5jaGVja2VkOiJpbnB1dCIhPT1uJiYidGV4dGFyZWEiIT09bnx8KHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBxKGUsdCxuLHIpe3Q9aGUodCk7dmFyIG8saSxzLHUsYyxsLGY9MCxwPWUubGVuZ3RoLGQ9cC0xLGg9dFswXSx2PUNlKGgpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBoJiYhX2UuY2hlY2tDbG9uZSYmY3QudGVzdChoKSlyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPWUuZXEobyk7diYmKHRbMF09aC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLHEoaSx0LG4scil9KTtpZihwJiYobz1TKHQsZVswXS5vd25lckRvY3VtZW50LCExLGUsciksaT1vLmZpcnN0Q2hpbGQsMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihvPWkpLGl8fHIpKXtmb3Iocz1TZS5tYXAoayhvLCJzY3JpcHQiKSxSKSx1PXMubGVuZ3RoO2Y8cDtmKyspYz1vLGYhPT1kJiYoYz1TZS5jbG9uZShjLCEwLCEwKSx1JiZTZS5tZXJnZShzLGsoYywic2NyaXB0IikpKSxuLmNhbGwoZVtmXSxjLGYpO2lmKHUpZm9yKGw9c1tzLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LFNlLm1hcChzLE0pLGY9MDtmPHU7ZisrKWM9c1tmXSxvdC50ZXN0KGMudHlwZXx8IiIpJiYhV2UuYWNjZXNzKGMsImdsb2JhbEV2YWwiKSYmU2UuY29udGFpbnMobCxjKSYmKGMuc3JjJiYibW9kdWxlIiE9PShjLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP1NlLl9ldmFsVXJsJiYhYy5ub01vZHVsZSYmU2UuX2V2YWxVcmwoYy5zcmMse25vbmNlOmMubm9uY2V8fGMuZ2V0QXR0cmlidXRlKCJub25jZSIpfSxsKTphKGMudGV4dENvbnRlbnQucmVwbGFjZShsdCwiIiksYyxsKSl9cmV0dXJuIGV9ZnVuY3Rpb24gSChlLHQsbil7Zm9yKHZhciByLG89dD9TZS5maWx0ZXIodCxlKTplLGk9MDtudWxsIT0ocj1vW2ldKTtpKyspbnx8MSE9PXIubm9kZVR5cGV8fFNlLmNsZWFuRGF0YShrKHIpKSxyLnBhcmVudE5vZGUmJihuJiZRZShyKSYmQShrKHIsInNjcmlwdCIpKSxyLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQocikpO3JldHVybiBlfWZ1bmN0aW9uIEYoZSx0LG4pe3ZhciByLG8saSxhLHM9ZS5zdHlsZTtyZXR1cm4gbj1ufHxwdChlKSxuJiYoYT1uLmdldFByb3BlcnR5VmFsdWUodCl8fG5bdF0sIiIhPT1hfHxRZShlKXx8KGE9U2Uuc3R5bGUoZSx0KSksIV9lLnBpeGVsQm94U3R5bGVzKCkmJmZ0LnRlc3QoYSkmJmh0LnRlc3QodCkmJihyPXMud2lkdGgsbz1zLm1pbldpZHRoLGk9cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1vLHMubWF4V2lkdGg9aSkpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIEIoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19ZnVuY3Rpb24gVShlKXtmb3IodmFyIHQ9ZVswXS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj12dC5sZW5ndGg7bi0tOylpZigoZT12dFtuXSt0KWluIG10KXJldHVybiBlfWZ1bmN0aW9uIFcoZSl7dmFyIHQ9U2UuY3NzUHJvcHNbZV18fHl0W2VdO3JldHVybiB0fHwoZSBpbiBtdD9lOnl0W2VdPVUoZSl8fGUpfWZ1bmN0aW9uIHooZSx0LG4pe3ZhciByPUtlLmV4ZWModCk7cmV0dXJuIHI/TWF0aC5tYXgoMCxyWzJdLShufHwwKSkrKHJbM118fCJweCIpOnR9ZnVuY3Rpb24gVihlLHQsbixyLG8saSl7dmFyIGE9IndpZHRoIj09PXQ/MTowLHM9MCx1PTA7aWYobj09PShyPyJib3JkZXIiOiJjb250ZW50IikpcmV0dXJuIDA7Zm9yKDthPDQ7YSs9MikibWFyZ2luIj09PW4mJih1Kz1TZS5jc3MoZSxuK0dlW2FdLCEwLG8pKSxyPygiY29udGVudCI9PT1uJiYodS09U2UuY3NzKGUsInBhZGRpbmciK0dlW2FdLCEwLG8pKSwibWFyZ2luIiE9PW4mJih1LT1TZS5jc3MoZSwiYm9yZGVyIitHZVthXSsiV2lkdGgiLCEwLG8pKSk6KHUrPVNlLmNzcyhlLCJwYWRkaW5nIitHZVthXSwhMCxvKSwicGFkZGluZyIhPT1uP3UrPVNlLmNzcyhlLCJib3JkZXIiK0dlW2FdKyJXaWR0aCIsITAsbyk6cys9U2UuY3NzKGUsImJvcmRlciIrR2VbYV0rIldpZHRoIiwhMCxvKSk7cmV0dXJuIXImJmk+PTAmJih1Kz1NYXRoLm1heCgwLE1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1pLXUtcy0uNSkpfHwwKSx1fWZ1bmN0aW9uIFgoZSx0LG4pe3ZhciByPXB0KGUpLG89IV9lLmJveFNpemluZ1JlbGlhYmxlKCl8fG4saT1vJiYiYm9yZGVyLWJveCI9PT1TZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxyKSxhPWkscz1GKGUsdCxyKSx1PSJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpO2lmKGZ0LnRlc3Qocykpe2lmKCFuKXJldHVybiBzO3M9ImF1dG8ifXJldHVybighX2UuYm94U2l6aW5nUmVsaWFibGUoKSYmaXx8IV9lLnJlbGlhYmxlVHJEaW1lbnNpb25zKCkmJmMoZSwidHIiKXx8ImF1dG8iPT09c3x8IXBhcnNlRmxvYXQocykmJiJpbmxpbmUiPT09U2UuY3NzKGUsImRpc3BsYXkiLCExLHIpKSYmZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmKGk9ImJvcmRlci1ib3giPT09U2UuY3NzKGUsImJveFNpemluZyIsITEsciksKGE9dSBpbiBlKSYmKHM9ZVt1XSkpLChzPXBhcnNlRmxvYXQocyl8fDApK1YoZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksYSxyLHMpKyJweCJ9ZnVuY3Rpb24gSihlLHQsbixyLG8pe3JldHVybiBuZXcgSi5wcm90b3R5cGUuaW5pdChlLHQsbixyLG8pfWZ1bmN0aW9uIEsoKXtDdCYmKCExPT09a2UuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShLKTpuLnNldFRpbWVvdXQoSyxTZS5meC5pbnRlcnZhbCksU2UuZngudGljaygpKX1mdW5jdGlvbiBHKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe190PXZvaWQgMH0pLF90PURhdGUubm93KCl9ZnVuY3Rpb24gWShlLHQpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdCluPUdlW3JdLG9bIm1hcmdpbiIrbl09b1sicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKG8ub3BhY2l0eT1vLndpZHRoPWUpLG99ZnVuY3Rpb24gUShlLHQsbil7Zm9yKHZhciByLG89KHRlLnR3ZWVuZXJzW3RdfHxbXSkuY29uY2F0KHRlLnR3ZWVuZXJzWyIqIl0pLGk9MCxhPW8ubGVuZ3RoO2k8YTtpKyspaWYocj1vW2ldLmNhbGwobix0LGUpKXJldHVybiByfWZ1bmN0aW9uIFooZSx0LG4pe3ZhciByLG8saSxhLHMsdSxjLGwsZj0id2lkdGgiaW4gdHx8ImhlaWdodCJpbiB0LHA9dGhpcyxkPXt9LGg9ZS5zdHlsZSx2PWUubm9kZVR5cGUmJmV0KGUpLG09V2UuZ2V0KGUsImZ4c2hvdyIpO24ucXVldWV8fChhPVNlLl9xdWV1ZUhvb2tzKGUsImZ4IiksbnVsbD09YS51bnF1ZXVlZCYmKGEudW5xdWV1ZWQ9MCxzPWEuZW1wdHkuZmlyZSxhLmVtcHR5LmZpcmU9ZnVuY3Rpb24oKXthLnVucXVldWVkfHxzKCl9KSxhLnVucXVldWVkKysscC5hbHdheXMoZnVuY3Rpb24oKXtwLmFsd2F5cyhmdW5jdGlvbigpe2EudW5xdWV1ZWQtLSxTZS5xdWV1ZShlLCJmeCIpLmxlbmd0aHx8YS5lbXB0eS5maXJlKCl9KX0pKTtmb3IociBpbiB0KWlmKG89dFtyXSxUdC50ZXN0KG8pKXtpZihkZWxldGUgdFtyXSxpPWl8fCJ0b2dnbGUiPT09byxvPT09KHY/ImhpZGUiOiJzaG93Iikpe2lmKCJzaG93IiE9PW98fCFtfHx2b2lkIDA9PT1tW3JdKWNvbnRpbnVlO3Y9ITB9ZFtyXT1tJiZtW3JdfHxTZS5zdHlsZShlLHIpfWlmKCh1PSFTZS5pc0VtcHR5T2JqZWN0KHQpKXx8IVNlLmlzRW1wdHlPYmplY3QoZCkpe2YmJjE9PT1lLm5vZGVUeXBlJiYobi5vdmVyZmxvdz1baC5vdmVyZmxvdyxoLm92ZXJmbG93WCxoLm92ZXJmbG93WV0sYz1tJiZtLmRpc3BsYXksbnVsbD09YyYmKGM9V2UuZ2V0KGUsImRpc3BsYXkiKSksbD1TZS5jc3MoZSwiZGlzcGxheSIpLCJub25lIj09PWwmJihjP2w9YzooVChbZV0sITApLGM9ZS5zdHlsZS5kaXNwbGF5fHxjLGw9U2UuY3NzKGUsImRpc3BsYXkiKSxUKFtlXSkpKSwoImlubGluZSI9PT1sfHwiaW5saW5lLWJsb2NrIj09PWwmJm51bGwhPWMpJiYibm9uZSI9PT1TZS5jc3MoZSwiZmxvYXQiKSYmKHV8fChwLmRvbmUoZnVuY3Rpb24oKXtoLmRpc3BsYXk9Y30pLG51bGw9PWMmJihsPWguZGlzcGxheSxjPSJub25lIj09PWw/IiI6bCkpLGguZGlzcGxheT0iaW5saW5lLWJsb2NrIikpLG4ub3ZlcmZsb3cmJihoLm92ZXJmbG93PSJoaWRkZW4iLHAuYWx3YXlzKGZ1bmN0aW9uKCl7aC5vdmVyZmxvdz1uLm92ZXJmbG93WzBdLGgub3ZlcmZsb3dYPW4ub3ZlcmZsb3dbMV0saC5vdmVyZmxvd1k9bi5vdmVyZmxvd1syXX0pKSx1PSExO2ZvcihyIGluIGQpdXx8KG0/ImhpZGRlbiJpbiBtJiYodj1tLmhpZGRlbik6bT1XZS5hY2Nlc3MoZSwiZnhzaG93Iix7ZGlzcGxheTpjfSksaSYmKG0uaGlkZGVuPSF2KSx2JiZUKFtlXSwhMCkscC5kb25lKGZ1bmN0aW9uKCl7dnx8VChbZV0pLFdlLnJlbW92ZShlLCJmeHNob3ciKTtmb3IociBpbiBkKVNlLnN0eWxlKGUscixkW3JdKX0pKSx1PVEodj9tW3JdOjAscixwKSxyIGluIG18fChtW3JdPXUuc3RhcnQsdiYmKHUuZW5kPXUuc3RhcnQsdS5zdGFydD0wKSl9fWZ1bmN0aW9uIGVlKGUsdCl7dmFyIG4scixvLGksYTtmb3IobiBpbiBlKWlmKHI9ZyhuKSxvPXRbcl0saT1lW25dLEFycmF5LmlzQXJyYXkoaSkmJihvPWlbMV0saT1lW25dPWlbMF0pLG4hPT1yJiYoZVtyXT1pLGRlbGV0ZSBlW25dKSwoYT1TZS5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSl7aT1hLmV4cGFuZChpKSxkZWxldGUgZVtyXTtmb3IobiBpbiBpKW4gaW4gZXx8KGVbbl09aVtuXSx0W25dPW8pfWVsc2UgdFtyXT1vfWZ1bmN0aW9uIHRlKGUsdCxuKXt2YXIgcixvLGk9MCxhPXRlLnByZWZpbHRlcnMubGVuZ3RoLHM9U2UuRGVmZXJyZWQoKS5hbHdheXMoZnVuY3Rpb24oKXtkZWxldGUgdS5lbGVtfSksdT1mdW5jdGlvbigpe2lmKG8pcmV0dXJuITE7Zm9yKHZhciB0PV90fHxHKCksbj1NYXRoLm1heCgwLGMuc3RhcnRUaW1lK2MuZHVyYXRpb24tdCkscj1uL2MuZHVyYXRpb258fDAsaT0xLXIsYT0wLHU9Yy50d2VlbnMubGVuZ3RoO2E8dTthKyspYy50d2VlbnNbYV0ucnVuKGkpO3JldHVybiBzLm5vdGlmeVdpdGgoZSxbYyxpLG5dKSxpPDEmJnU/bjoodXx8cy5ub3RpZnlXaXRoKGUsW2MsMSwwXSkscy5yZXNvbHZlV2l0aChlLFtjXSksITEpfSxjPXMucHJvbWlzZSh7ZWxlbTplLHByb3BzOlNlLmV4dGVuZCh7fSx0KSxvcHRzOlNlLmV4dGVuZCghMCx7c3BlY2lhbEVhc2luZzp7fSxlYXNpbmc6U2UuZWFzaW5nLl9kZWZhdWx0fSxuKSxvcmlnaW5hbFByb3BlcnRpZXM6dCxvcmlnaW5hbE9wdGlvbnM6bixzdGFydFRpbWU6X3R8fEcoKSxkdXJhdGlvbjpuLmR1cmF0aW9uLHR3ZWVuczpbXSxjcmVhdGVUd2VlbjpmdW5jdGlvbih0LG4pe3ZhciByPVNlLlR3ZWVuKGUsYy5vcHRzLHQsbixjLm9wdHMuc3BlY2lhbEVhc2luZ1t0XXx8Yy5vcHRzLmVhc2luZyk7cmV0dXJuIGMudHdlZW5zLnB1c2gocikscn0sc3RvcDpmdW5jdGlvbih0KXt2YXIgbj0wLHI9dD9jLnR3ZWVucy5sZW5ndGg6MDtpZihvKXJldHVybiB0aGlzO2ZvcihvPSEwO248cjtuKyspYy50d2VlbnNbbl0ucnVuKDEpO3JldHVybiB0PyhzLm5vdGlmeVdpdGgoZSxbYywxLDBdKSxzLnJlc29sdmVXaXRoKGUsW2MsdF0pKTpzLnJlamVjdFdpdGgoZSxbYyx0XSksdGhpc319KSxsPWMucHJvcHM7Zm9yKGVlKGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj10ZS5wcmVmaWx0ZXJzW2ldLmNhbGwoYyxlLGwsYy5vcHRzKSlyZXR1cm4gQ2Uoci5zdG9wKSYmKFNlLl9xdWV1ZUhvb2tzKGMuZWxlbSxjLm9wdHMucXVldWUpLnN0b3A9ci5zdG9wLmJpbmQocikpLHI7cmV0dXJuIFNlLm1hcChsLFEsYyksQ2UoYy5vcHRzLnN0YXJ0KSYmYy5vcHRzLnN0YXJ0LmNhbGwoZSxjKSxjLnByb2dyZXNzKGMub3B0cy5wcm9ncmVzcykuZG9uZShjLm9wdHMuZG9uZSxjLm9wdHMuY29tcGxldGUpLmZhaWwoYy5vcHRzLmZhaWwpLmFsd2F5cyhjLm9wdHMuYWx3YXlzKSxTZS5meC50aW1lcihTZS5leHRlbmQodSx7ZWxlbTplLGFuaW06YyxxdWV1ZTpjLm9wdHMucXVldWV9KSksY31mdW5jdGlvbiBuZShlKXtyZXR1cm4oZS5tYXRjaChJZSl8fFtdKS5qb2luKCIgIil9ZnVuY3Rpb24gcmUoZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlJiZlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiJ9ZnVuY3Rpb24gb2UoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/ZToic3RyaW5nIj09dHlwZW9mIGU/ZS5tYXRjaChJZSl8fFtdOltdfWZ1bmN0aW9uIGllKGUsdCxuLHIpe3ZhciBvO2lmKEFycmF5LmlzQXJyYXkodCkpU2UuZWFjaCh0LGZ1bmN0aW9uKHQsbyl7bnx8TXQudGVzdChlKT9yKGUsbyk6aWUoZSsiWyIrKCJvYmplY3QiPT10eXBlb2YgbyYmbnVsbCE9bz90OiIiKSsiXSIsbyxuLHIpfSk7ZWxzZSBpZihufHwib2JqZWN0IiE9PXModCkpcihlLHQpO2Vsc2UgZm9yKG8gaW4gdClpZShlKyJbIitvKyJdIix0W29dLG4scil9ZnVuY3Rpb24gYWUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbil7InN0cmluZyIhPXR5cGVvZiB0JiYobj10LHQ9IioiKTt2YXIgcixvPTAsaT10LnRvTG93ZXJDYXNlKCkubWF0Y2goSWUpfHxbXTtpZihDZShuKSlmb3IoO3I9aVtvKytdOykiKyI9PT1yWzBdPyhyPXIuc2xpY2UoMSl8fCIqIiwoZVtyXT1lW3JdfHxbXSkudW5zaGlmdChuKSk6KGVbcl09ZVtyXXx8W10pLnB1c2gobil9fWZ1bmN0aW9uIHNlKGUsdCxuLHIpe2Z1bmN0aW9uIG8ocyl7dmFyIHU7cmV0dXJuIGlbc109ITAsU2UuZWFjaChlW3NdfHxbXSxmdW5jdGlvbihlLHMpe3ZhciBjPXModCxuLHIpO3JldHVybiJzdHJpbmciIT10eXBlb2YgY3x8YXx8aVtjXT9hPyEodT1jKTp2b2lkIDA6KHQuZGF0YVR5cGVzLnVuc2hpZnQoYyksbyhjKSwhMSl9KSx1fXZhciBpPXt9LGE9ZT09PUp0O3JldHVybiBvKHQuZGF0YVR5cGVzWzBdKXx8IWlbIioiXSYmbygiKiIpfWZ1bmN0aW9uIHVlKGUsdCl7dmFyIG4scixvPVNlLmFqYXhTZXR0aW5ncy5mbGF0T3B0aW9uc3x8e307Zm9yKG4gaW4gdCl2b2lkIDAhPT10W25dJiYoKG9bbl0/ZTpyfHwocj17fSkpW25dPXRbbl0pO3JldHVybiByJiZTZS5leHRlbmQoITAsZSxyKSxlfWZ1bmN0aW9uIGNlKGUsdCxuKXtmb3IodmFyIHIsbyxpLGEscz1lLmNvbnRlbnRzLHU9ZS5kYXRhVHlwZXM7IioiPT09dVswXTspdS5zaGlmdCgpLHZvaWQgMD09PXImJihyPWUubWltZVR5cGV8fHQuZ2V0UmVzcG9uc2VIZWFkZXIoIkNvbnRlbnQtVHlwZSIpKTtpZihyKWZvcihvIGluIHMpaWYoc1tvXSYmc1tvXS50ZXN0KHIpKXt1LnVuc2hpZnQobyk7YnJlYWt9aWYodVswXWluIG4paT11WzBdO2Vsc2V7Zm9yKG8gaW4gbil7aWYoIXVbMF18fGUuY29udmVydGVyc1tvKyIgIit1WzBdXSl7aT1vO2JyZWFrfWF8fChhPW8pfWk9aXx8YX1pZihpKXJldHVybiBpIT09dVswXSYmdS51bnNoaWZ0KGkpLG5baV19ZnVuY3Rpb24gbGUoZSx0LG4scil7dmFyIG8saSxhLHMsdSxjPXt9LGw9ZS5kYXRhVHlwZXMuc2xpY2UoKTtpZihsWzFdKWZvcihhIGluIGUuY29udmVydGVycyljW2EudG9Mb3dlckNhc2UoKV09ZS5jb252ZXJ0ZXJzW2FdO2ZvcihpPWwuc2hpZnQoKTtpOylpZihlLnJlc3BvbnNlRmllbGRzW2ldJiYobltlLnJlc3BvbnNlRmllbGRzW2ldXT10KSwhdSYmciYmZS5kYXRhRmlsdGVyJiYodD1lLmRhdGFGaWx0ZXIodCxlLmRhdGFUeXBlKSksdT1pLGk9bC5zaGlmdCgpKWlmKCIqIj09PWkpaT11O2Vsc2UgaWYoIioiIT09dSYmdSE9PWkpe2lmKCEoYT1jW3UrIiAiK2ldfHxjWyIqICIraV0pKWZvcihvIGluIGMpaWYocz1vLnNwbGl0KCIgIiksc1sxXT09PWkmJihhPWNbdSsiICIrc1swXV18fGNbIiogIitzWzBdXSkpeyEwPT09YT9hPWNbb106ITAhPT1jW29dJiYoaT1zWzBdLGwudW5zaGlmdChzWzFdKSk7YnJlYWt9aWYoITAhPT1hKWlmKGEmJmUudGhyb3dzKXQ9YSh0KTtlbHNlIHRyeXt0PWEodCl9Y2F0Y2goZSl7cmV0dXJue3N0YXRlOiJwYXJzZXJlcnJvciIsZXJyb3I6YT9lOiJObyBjb252ZXJzaW9uIGZyb20gIit1KyIgdG8gIitpfX19cmV0dXJue3N0YXRlOiJzdWNjZXNzIixkYXRhOnR9fXZhciBmZT1bXSxwZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YsZGU9ZmUuc2xpY2UsaGU9ZmUuZmxhdD9mdW5jdGlvbihlKXtyZXR1cm4gZmUuZmxhdC5jYWxsKGUpfTpmdW5jdGlvbihlKXtyZXR1cm4gZmUuY29uY2F0LmFwcGx5KFtdLGUpfSx2ZT1mZS5wdXNoLG1lPWZlLmluZGV4T2YseWU9e30sZ2U9eWUudG9TdHJpbmcsYmU9eWUuaGFzT3duUHJvcGVydHkseGU9YmUudG9TdHJpbmcsd2U9eGUuY2FsbChPYmplY3QpLF9lPXt9LENlPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGUmJiJmdW5jdGlvbiIhPXR5cGVvZiBlLml0ZW19LFRlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LGtlPW4uZG9jdW1lbnQsQWU9e3R5cGU6ITAsc3JjOiEwLG5vbmNlOiEwLG5vTW9kdWxlOiEwfSxTZT1mdW5jdGlvbihlLHQpe3JldHVybiBuZXcgU2UuZm4uaW5pdChlLHQpfTtTZS5mbj1TZS5wcm90b3R5cGU9e2pxdWVyeToiMy42LjAiLGNvbnN0cnVjdG9yOlNlLGxlbmd0aDowLHRvQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gZGUuY2FsbCh0aGlzKX0sZ2V0OmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lP2RlLmNhbGwodGhpcyk6ZTwwP3RoaXNbZSt0aGlzLmxlbmd0aF06dGhpc1tlXX0scHVzaFN0YWNrOmZ1bmN0aW9uKGUpe3ZhciB0PVNlLm1lcmdlKHRoaXMuY29uc3RydWN0b3IoKSxlKTtyZXR1cm4gdC5wcmV2T2JqZWN0PXRoaXMsdH0sZWFjaDpmdW5jdGlvbihlKXtyZXR1cm4gU2UuZWFjaCh0aGlzLGUpfSxtYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFNlLm1hcCh0aGlzLGZ1bmN0aW9uKHQsbil7cmV0dXJuIGUuY2FsbCh0LG4sdCl9KSl9LHNsaWNlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGRlLmFwcGx5KHRoaXMsYXJndW1lbnRzKSl9LGZpcnN0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZXEoMCl9LGxhc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgtMSl9LGV2ZW46ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soU2UuZ3JlcCh0aGlzLGZ1bmN0aW9uKGUsdCl7cmV0dXJuKHQrMSklMn0pKX0sb2RkOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKFNlLmdyZXAodGhpcyxmdW5jdGlvbihlLHQpe3JldHVybiB0JTJ9KSl9LGVxOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMubGVuZ3RoLG49K2UrKGU8MD90OjApO3JldHVybiB0aGlzLnB1c2hTdGFjayhuPj0wJiZuPHQ/W3RoaXNbbl1dOltdKX0sZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMucHJldk9iamVjdHx8dGhpcy5jb25zdHJ1Y3RvcigpfSxwdXNoOnZlLHNvcnQ6ZmUuc29ydCxzcGxpY2U6ZmUuc3BsaWNlfSxTZS5leHRlbmQ9U2UuZm4uZXh0ZW5kPWZ1bmN0aW9uKCl7dmFyIGUsdCxuLHIsbyxpLGE9YXJndW1lbnRzWzBdfHx7fSxzPTEsdT1hcmd1bWVudHMubGVuZ3RoLGM9ITE7Zm9yKCJib29sZWFuIj09dHlwZW9mIGEmJihjPWEsYT1hcmd1bWVudHNbc118fHt9LHMrKyksIm9iamVjdCI9PXR5cGVvZiBhfHxDZShhKXx8KGE9e30pLHM9PT11JiYoYT10aGlzLHMtLSk7czx1O3MrKylpZihudWxsIT0oZT1hcmd1bWVudHNbc10pKWZvcih0IGluIGUpcj1lW3RdLCJfX3Byb3RvX18iIT09dCYmYSE9PXImJihjJiZyJiYoU2UuaXNQbGFpbk9iamVjdChyKXx8KG89QXJyYXkuaXNBcnJheShyKSkpPyhuPWFbdF0saT1vJiYhQXJyYXkuaXNBcnJheShuKT9bXTpvfHxTZS5pc1BsYWluT2JqZWN0KG4pP246e30sbz0hMSxhW3RdPVNlLmV4dGVuZChjLGkscikpOnZvaWQgMCE9PXImJihhW3RdPXIpKTtyZXR1cm4gYX0sU2UuZXh0ZW5kKHtleHBhbmRvOiJqUXVlcnkiKygiMy42LjAiK01hdGgucmFuZG9tKCkpLnJlcGxhY2UoL1xEL2csIiIpLGlzUmVhZHk6ITAsZXJyb3I6ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKGUpfSxub29wOmZ1bmN0aW9uKCl7fSxpc1BsYWluT2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0LG47cmV0dXJuISghZXx8IltvYmplY3QgT2JqZWN0XSIhPT1nZS5jYWxsKGUpKSYmKCEodD1wZShlKSl8fCJmdW5jdGlvbiI9PXR5cGVvZihuPWJlLmNhbGwodCwiY29uc3RydWN0b3IiKSYmdC5jb25zdHJ1Y3RvcikmJnhlLmNhbGwobik9PT13ZSl9LGlzRW1wdHlPYmplY3Q6ZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZSlyZXR1cm4hMTtyZXR1cm4hMH0sZ2xvYmFsRXZhbDpmdW5jdGlvbihlLHQsbil7YShlLHtub25jZTp0JiZ0Lm5vbmNlfSxuKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZih1KGUpKWZvcihuPWUubGVuZ3RoO3I8biYmITEhPT10LmNhbGwoZVtyXSxyLGVbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sbWFrZUFycmF5OmZ1bmN0aW9uKGUsdCl7dmFyIG49dHx8W107cmV0dXJuIG51bGwhPWUmJih1KE9iamVjdChlKSk/U2UubWVyZ2Uobiwic3RyaW5nIj09dHlwZW9mIGU/W2VdOmUpOnZlLmNhbGwobixlKSksbn0saW5BcnJheTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIG51bGw9PXQ/LTE6bWUuY2FsbCh0LGUsbil9LG1lcmdlOmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPSt0Lmxlbmd0aCxyPTAsbz1lLmxlbmd0aDtyPG47cisrKWVbbysrXT10W3JdO3JldHVybiBlLmxlbmd0aD1vLGV9LGdyZXA6ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxvPTAsaT1lLmxlbmd0aCxhPSFuO288aTtvKyspIXQoZVtvXSxvKSE9PWEmJnIucHVzaChlW29dKTtyZXR1cm4gcn0sbWFwOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9MCxhPVtdO2lmKHUoZSkpZm9yKHI9ZS5sZW5ndGg7aTxyO2krKyludWxsIT0obz10KGVbaV0saSxuKSkmJmEucHVzaChvKTtlbHNlIGZvcihpIGluIGUpbnVsbCE9KG89dChlW2ldLGksbikpJiZhLnB1c2gobyk7cmV0dXJuIGhlKGEpfSxndWlkOjEsc3VwcG9ydDpfZX0pLCJmdW5jdGlvbiI9PXR5cGVvZiBTeW1ib2wmJihTZS5mbltTeW1ib2wuaXRlcmF0b3JdPWZlW1N5bWJvbC5pdGVyYXRvcl0pLFNlLmVhY2goIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sIi5zcGxpdCgiICIpLGZ1bmN0aW9uKGUsdCl7eWVbIltvYmplY3QgIit0KyJdIl09dC50b0xvd2VyQ2FzZSgpfSk7dmFyICRlPS8qIQorICogU2l6emxlIENTUyBTZWxlY3RvciBFbmdpbmUgdjIuMy42CisgKiBodHRwczovL3NpenpsZWpzLmNvbS8KKyAqCisgKiBDb3B5cmlnaHQgSlMgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzCisgKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UKKyAqIGh0dHBzOi8vanMuZm91bmRhdGlvbi8KKyAqCisgKiBEYXRlOiAyMDIxLTAyLTE2CisgKi8KK2Z1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoZSx0LG4scil7dmFyIG8saSxhLHMsdSxsLHAsZD10JiZ0Lm93bmVyRG9jdW1lbnQsaD10P3Qubm9kZVR5cGU6OTtpZihuPW58fFtdLCJzdHJpbmciIT10eXBlb2YgZXx8IWV8fDEhPT1oJiY5IT09aCYmMTEhPT1oKXJldHVybiBuO2lmKCFyJiYoTyh0KSx0PXR8fGosRCkpe2lmKDExIT09aCYmKHU9eWUuZXhlYyhlKSkpaWYobz11WzFdKXtpZig5PT09aCl7aWYoIShhPXQuZ2V0RWxlbWVudEJ5SWQobykpKXJldHVybiBuO2lmKGEuaWQ9PT1vKXJldHVybiBuLnB1c2goYSksbn1lbHNlIGlmKGQmJihhPWQuZ2V0RWxlbWVudEJ5SWQobykpJiZJKHQsYSkmJmEuaWQ9PT1vKXJldHVybiBuLnB1c2goYSksbn1lbHNle2lmKHVbMl0pcmV0dXJuIFkuYXBwbHkobix0LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpKSxuO2lmKChvPXVbM10pJiZ4LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJnQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSlyZXR1cm4gWS5hcHBseShuLHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShvKSksbn1pZih4LnFzYSYmIXpbZSsiICJdJiYoIUx8fCFMLnRlc3QoZSkpJiYoMSE9PWh8fCJvYmplY3QiIT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKSl7aWYocD1lLGQ9dCwxPT09aCYmKGNlLnRlc3QoZSl8fHVlLnRlc3QoZSkpKXtmb3IoZD1nZS50ZXN0KGUpJiZjKHQucGFyZW50Tm9kZSl8fHQsZD09PXQmJnguc2NvcGV8fCgocz10LmdldEF0dHJpYnV0ZSgiaWQiKSk/cz1zLnJlcGxhY2Uod2UsX2UpOnQuc2V0QXR0cmlidXRlKCJpZCIscz1QKSksbD1UKGUpLGk9bC5sZW5ndGg7aS0tOylsW2ldPShzPyIjIitzOiI6c2NvcGUiKSsiICIrZihsW2ldKTtwPWwuam9pbigiLCIpfXRyeXtyZXR1cm4gWS5hcHBseShuLGQucXVlcnlTZWxlY3RvckFsbChwKSksbn1jYXRjaCh0KXt6KGUsITApfWZpbmFsbHl7cz09PVAmJnQucmVtb3ZlQXR0cmlidXRlKCJpZCIpfX19cmV0dXJuIEEoZS5yZXBsYWNlKGFlLCIkMSIpLHQsbixyKX1mdW5jdGlvbiBuKCl7ZnVuY3Rpb24gZShuLHIpe3JldHVybiB0LnB1c2gobisiICIpPncuY2FjaGVMZW5ndGgmJmRlbGV0ZSBlW3Quc2hpZnQoKV0sZVtuKyIgIl09cn12YXIgdD1bXTtyZXR1cm4gZX1mdW5jdGlvbiByKGUpe3JldHVybiBlW1BdPSEwLGV9ZnVuY3Rpb24gbyhlKXt2YXIgdD1qLmNyZWF0ZUVsZW1lbnQoImZpZWxkc2V0Iik7dHJ5e3JldHVybiEhZSh0KX1jYXRjaChlKXtyZXR1cm4hMX1maW5hbGx5e3QucGFyZW50Tm9kZSYmdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLHQ9bnVsbH19ZnVuY3Rpb24gaShlLHQpe2Zvcih2YXIgbj1lLnNwbGl0KCJ8Iikscj1uLmxlbmd0aDtyLS07KXcuYXR0ckhhbmRsZVtuW3JdXT10fWZ1bmN0aW9uIGEoZSx0KXt2YXIgbj10JiZlLHI9biYmMT09PWUubm9kZVR5cGUmJjE9PT10Lm5vZGVUeXBlJiZlLnNvdXJjZUluZGV4LXQuc291cmNlSW5kZXg7aWYocilyZXR1cm4gcjtpZihuKWZvcig7bj1uLm5leHRTaWJsaW5nOylpZihuPT09dClyZXR1cm4tMTtyZXR1cm4gZT8xOi0xfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIGZ1bmN0aW9uKHQpe3JldHVybiJmb3JtImluIHQ/dC5wYXJlbnROb2RlJiYhMT09PXQuZGlzYWJsZWQ/ImxhYmVsImluIHQ/ImxhYmVsImluIHQucGFyZW50Tm9kZT90LnBhcmVudE5vZGUuZGlzYWJsZWQ9PT1lOnQuZGlzYWJsZWQ9PT1lOnQuaXNEaXNhYmxlZD09PWV8fHQuaXNEaXNhYmxlZCE9PSFlJiZUZSh0KT09PWU6dC5kaXNhYmxlZD09PWU6ImxhYmVsImluIHQmJnQuZGlzYWJsZWQ9PT1lfX1mdW5jdGlvbiB1KGUpe3JldHVybiByKGZ1bmN0aW9uKHQpe3JldHVybiB0PSt0LHIoZnVuY3Rpb24obixyKXtmb3IodmFyIG8saT1lKFtdLG4ubGVuZ3RoLHQpLGE9aS5sZW5ndGg7YS0tOyluW289aVthXV0mJihuW29dPSEocltvXT1uW29dKSl9KX0pfWZ1bmN0aW9uIGMoZSl7cmV0dXJuIGUmJnZvaWQgMCE9PWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUmJmV9ZnVuY3Rpb24gbCgpe31mdW5jdGlvbiBmKGUpe2Zvcih2YXIgdD0wLG49ZS5sZW5ndGgscj0iIjt0PG47dCsrKXIrPWVbdF0udmFsdWU7cmV0dXJuIHJ9ZnVuY3Rpb24gcChlLHQsbil7dmFyIHI9dC5kaXIsbz10Lm5leHQsaT1vfHxyLGE9biYmInBhcmVudE5vZGUiPT09aSxzPUYrKztyZXR1cm4gdC5maXJzdD9mdW5jdGlvbih0LG4sbyl7Zm9yKDt0PXRbcl07KWlmKDE9PT10Lm5vZGVUeXBlfHxhKXJldHVybiBlKHQsbixvKTtyZXR1cm4hMX06ZnVuY3Rpb24odCxuLHUpe3ZhciBjLGwsZixwPVtILHNdO2lmKHUpe2Zvcig7dD10W3JdOylpZigoMT09PXQubm9kZVR5cGV8fGEpJiZlKHQsbix1KSlyZXR1cm4hMH1lbHNlIGZvcig7dD10W3JdOylpZigxPT09dC5ub2RlVHlwZXx8YSlpZihmPXRbUF18fCh0W1BdPXt9KSxsPWZbdC51bmlxdWVJRF18fChmW3QudW5pcXVlSURdPXt9KSxvJiZvPT09dC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXQ9dFtyXXx8dDtlbHNle2lmKChjPWxbaV0pJiZjWzBdPT09SCYmY1sxXT09PXMpcmV0dXJuIHBbMl09Y1syXTtpZihsW2ldPXAscFsyXT1lKHQsbix1KSlyZXR1cm4hMH1yZXR1cm4hMX19ZnVuY3Rpb24gZChlKXtyZXR1cm4gZS5sZW5ndGg+MT9mdW5jdGlvbih0LG4scil7Zm9yKHZhciBvPWUubGVuZ3RoO28tLTspaWYoIWVbb10odCxuLHIpKXJldHVybiExO3JldHVybiEwfTplWzBdfWZ1bmN0aW9uIGgoZSxuLHIpe2Zvcih2YXIgbz0wLGk9bi5sZW5ndGg7bzxpO28rKyl0KGUsbltvXSxyKTtyZXR1cm4gcn1mdW5jdGlvbiB2KGUsdCxuLHIsbyl7Zm9yKHZhciBpLGE9W10scz0wLHU9ZS5sZW5ndGgsYz1udWxsIT10O3M8dTtzKyspKGk9ZVtzXSkmJihuJiYhbihpLHIsbyl8fChhLnB1c2goaSksYyYmdC5wdXNoKHMpKSk7cmV0dXJuIGF9ZnVuY3Rpb24gbShlLHQsbixvLGksYSl7cmV0dXJuIG8mJiFvW1BdJiYobz1tKG8pKSxpJiYhaVtQXSYmKGk9bShpLGEpKSxyKGZ1bmN0aW9uKHIsYSxzLHUpe3ZhciBjLGwsZixwPVtdLGQ9W10sbT1hLmxlbmd0aCx5PXJ8fGgodHx8IioiLHMubm9kZVR5cGU/W3NdOnMsW10pLGc9IWV8fCFyJiZ0P3k6dih5LHAsZSxzLHUpLGI9bj9pfHwocj9lOm18fG8pP1tdOmE6ZztpZihuJiZuKGcsYixzLHUpLG8pZm9yKGM9dihiLGQpLG8oYyxbXSxzLHUpLGw9Yy5sZW5ndGg7bC0tOykoZj1jW2xdKSYmKGJbZFtsXV09IShnW2RbbF1dPWYpKTtpZihyKXtpZihpfHxlKXtpZihpKXtmb3IoYz1bXSxsPWIubGVuZ3RoO2wtLTspKGY9YltsXSkmJmMucHVzaChnW2xdPWYpO2kobnVsbCxiPVtdLGMsdSl9Zm9yKGw9Yi5sZW5ndGg7bC0tOykoZj1iW2xdKSYmKGM9aT9aKHIsZik6cFtsXSk+LTEmJihyW2NdPSEoYVtjXT1mKSl9fWVsc2UgYj12KGI9PT1hP2Iuc3BsaWNlKG0sYi5sZW5ndGgpOmIpLGk/aShudWxsLGEsYix1KTpZLmFwcGx5KGEsYil9KX1mdW5jdGlvbiB5KGUpe2Zvcih2YXIgdCxuLHIsbz1lLmxlbmd0aCxpPXcucmVsYXRpdmVbZVswXS50eXBlXSxhPWl8fHcucmVsYXRpdmVbIiAiXSxzPWk/MTowLHU9cChmdW5jdGlvbihlKXtyZXR1cm4gZT09PXR9LGEsITApLGM9cChmdW5jdGlvbihlKXtyZXR1cm4gWih0LGUpPi0xfSxhLCEwKSxsPVtmdW5jdGlvbihlLG4scil7dmFyIG89IWkmJihyfHxuIT09Uyl8fCgodD1uKS5ub2RlVHlwZT91KGUsbixyKTpjKGUsbixyKSk7cmV0dXJuIHQ9bnVsbCxvfV07czxvO3MrKylpZihuPXcucmVsYXRpdmVbZVtzXS50eXBlXSlsPVtwKGQobCksbildO2Vsc2V7aWYobj13LmZpbHRlcltlW3NdLnR5cGVdLmFwcGx5KG51bGwsZVtzXS5tYXRjaGVzKSxuW1BdKXtmb3Iocj0rK3M7cjxvJiYhdy5yZWxhdGl2ZVtlW3JdLnR5cGVdO3IrKyk7cmV0dXJuIG0ocz4xJiZkKGwpLHM+MSYmZihlLnNsaWNlKDAscy0xKS5jb25jYXQoe3ZhbHVlOiIgIj09PWVbcy0yXS50eXBlPyIqIjoiIn0pKS5yZXBsYWNlKGFlLCIkMSIpLG4sczxyJiZ5KGUuc2xpY2UocyxyKSkscjxvJiZ5KGU9ZS5zbGljZShyKSkscjxvJiZmKGUpKX1sLnB1c2gobil9cmV0dXJuIGQobCl9ZnVuY3Rpb24gZyhlLG4pe3ZhciBvPW4ubGVuZ3RoPjAsaT1lLmxlbmd0aD4wLGE9ZnVuY3Rpb24ocixhLHMsdSxjKXt2YXIgbCxmLHAsZD0wLGg9IjAiLG09ciYmW10seT1bXSxnPVMsYj1yfHxpJiZ3LmZpbmQuVEFHKCIqIixjKSx4PUgrPW51bGw9PWc/MTpNYXRoLnJhbmRvbSgpfHwuMSxfPWIubGVuZ3RoO2ZvcihjJiYoUz1hPT1qfHxhfHxjKTtoIT09XyYmbnVsbCE9KGw9YltoXSk7aCsrKXtpZihpJiZsKXtmb3IoZj0wLGF8fGwub3duZXJEb2N1bWVudD09anx8KE8obCkscz0hRCk7cD1lW2YrK107KWlmKHAobCxhfHxqLHMpKXt1LnB1c2gobCk7YnJlYWt9YyYmKEg9eCl9byYmKChsPSFwJiZsKSYmZC0tLHImJm0ucHVzaChsKSl9aWYoZCs9aCxvJiZoIT09ZCl7Zm9yKGY9MDtwPW5bZisrXTspcChtLHksYSxzKTtpZihyKXtpZihkPjApZm9yKDtoLS07KW1baF18fHlbaF18fCh5W2hdPUsuY2FsbCh1KSk7eT12KHkpfVkuYXBwbHkodSx5KSxjJiYhciYmeS5sZW5ndGg+MCYmZCtuLmxlbmd0aD4xJiZ0LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGMmJihIPXgsUz1nKSxtfTtyZXR1cm4gbz9yKGEpOmF9dmFyIGIseCx3LF8sQyxULGssQSxTLCQsRSxPLGosTixELEwsUixNLEksUD0ic2l6emxlIisxKm5ldyBEYXRlLHE9ZS5kb2N1bWVudCxIPTAsRj0wLEI9bigpLFU9bigpLFc9bigpLHo9bigpLFY9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihFPSEwKSwwfSxYPXt9Lmhhc093blByb3BlcnR5LEo9W10sSz1KLnBvcCxHPUoucHVzaCxZPUoucHVzaCxRPUouc2xpY2UsWj1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sZWU9ImNoZWNrZWR8c2VsZWN0ZWR8YXN5bmN8YXV0b2ZvY3VzfGF1dG9wbGF5fGNvbnRyb2xzfGRlZmVyfGRpc2FibGVkfGhpZGRlbnxpc21hcHxsb29wfG11bHRpcGxlfG9wZW58cmVhZG9ubHl8cmVxdWlyZWR8c2NvcGVkIix0ZT0iW1xceDIwXFx0XFxyXFxuXFxmXSIsbmU9Iig/OlxcXFxbXFxkYS1mQS1GXXsxLDZ9Iit0ZSsiP3xcXFxcW15cXHJcXG5cXGZdfFtcXHctXXxbXlwwLVxceDdmXSkrIixyZT0iXFxbIit0ZSsiKigiK25lKyIpKD86Iit0ZSsiKihbKl4kfCF+XT89KSIrdGUrIiooPzonKCg/OlxcXFwufFteXFxcXCddKSopJ3xcIigoPzpcXFxcLnxbXlxcXFxcIl0pKilcInwoIituZSsiKSl8KSIrdGUrIipcXF0iLG9lPSI6KCIrbmUrIikoPzpcXCgoKCcoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwiKXwoKD86XFxcXC58W15cXFxcKClbXFxdXXwiK3JlKyIpKil8LiopXFwpfCkiLGllPW5ldyBSZWdFeHAodGUrIisiLCJnIiksYWU9bmV3IFJlZ0V4cCgiXiIrdGUrIit8KCg/Ol58W15cXFxcXSkoPzpcXFxcLikqKSIrdGUrIiskIiwiZyIpLHNlPW5ldyBSZWdFeHAoIl4iK3RlKyIqLCIrdGUrIioiKSx1ZT1uZXcgUmVnRXhwKCJeIit0ZSsiKihbPit+XXwiK3RlKyIpIit0ZSsiKiIpLGNlPW5ldyBSZWdFeHAodGUrInw+IiksbGU9bmV3IFJlZ0V4cChvZSksZmU9bmV3IFJlZ0V4cCgiXiIrbmUrIiQiKSxwZT17SUQ6bmV3IFJlZ0V4cCgiXiMoIituZSsiKSIpLENMQVNTOm5ldyBSZWdFeHAoIl5cXC4oIituZSsiKSIpLFRBRzpuZXcgUmVnRXhwKCJeKCIrbmUrInxbKl0pIiksQVRUUjpuZXcgUmVnRXhwKCJeIityZSksUFNFVURPOm5ldyBSZWdFeHAoIl4iK29lKSxDSElMRDpuZXcgUmVnRXhwKCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXCgiK3RlKyIqKGV2ZW58b2RkfCgoWystXXwpKFxcZCopbnwpIit0ZSsiKig/OihbKy1dfCkiK3RlKyIqKFxcZCspfCkpIit0ZSsiKlxcKXwpIiwiaSIpLGJvb2w6bmV3IFJlZ0V4cCgiXig/OiIrZWUrIikkIiwiaSIpLG5lZWRzQ29udGV4dDpuZXcgUmVnRXhwKCJeIit0ZSsiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFwoIit0ZSsiKigoPzotXFxkKT9cXGQqKSIrdGUrIipcXCl8KSg/PVteLV18JCkiLCJpIil9LGRlPS9IVE1MJC9pLGhlPS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGJ1dHRvbikkL2ksdmU9L15oXGQkL2ksbWU9L15bXntdK1x7XHMqXFtuYXRpdmUgXHcvLHllPS9eKD86IyhbXHctXSspfChcdyspfFwuKFtcdy1dKykpJC8sZ2U9L1srfl0vLGJlPW5ldyBSZWdFeHAoIlxcXFxbXFxkYS1mQS1GXXsxLDZ9Iit0ZSsiP3xcXFxcKFteXFxyXFxuXFxmXSkiLCJnIikseGU9ZnVuY3Rpb24oZSx0KXt2YXIgbj0iMHgiK2Uuc2xpY2UoMSktNjU1MzY7cmV0dXJuIHR8fChuPDA/U3RyaW5nLmZyb21DaGFyQ29kZShuKzY1NTM2KTpTdHJpbmcuZnJvbUNoYXJDb2RlKG4+PjEwfDU1Mjk2LDEwMjMmbnw1NjMyMCkpfSx3ZT0vKFtcMC1ceDFmXHg3Zl18Xi0/XGQpfF4tJHxbXlwwLVx4MWZceDdmLVx1RkZGRlx3LV0vZyxfZT1mdW5jdGlvbihlLHQpe3JldHVybiB0PyJcMCI9PT1lPyLvv70iOmUuc2xpY2UoMCwtMSkrIlxcIitlLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSkudG9TdHJpbmcoMTYpKyIgIjoiXFwiK2V9LENlPWZ1bmN0aW9uKCl7TygpfSxUZT1wKGZ1bmN0aW9uKGUpe3JldHVybiEwPT09ZS5kaXNhYmxlZCYmImZpZWxkc2V0Ij09PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKX0se2RpcjoicGFyZW50Tm9kZSIsbmV4dDoibGVnZW5kIn0pO3RyeXtZLmFwcGx5KEo9US5jYWxsKHEuY2hpbGROb2RlcykscS5jaGlsZE5vZGVzKSxKW3EuY2hpbGROb2Rlcy5sZW5ndGhdLm5vZGVUeXBlfWNhdGNoKGUpe1k9e2FwcGx5OkoubGVuZ3RoP2Z1bmN0aW9uKGUsdCl7Ry5hcHBseShlLFEuY2FsbCh0KSl9OmZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWUubGVuZ3RoLHI9MDtlW24rK109dFtyKytdOyk7ZS5sZW5ndGg9bi0xfX19eD10LnN1cHBvcnQ9e30sQz10LmlzWE1MPWZ1bmN0aW9uKGUpe3ZhciB0PWUmJmUubmFtZXNwYWNlVVJJLG49ZSYmKGUub3duZXJEb2N1bWVudHx8ZSkuZG9jdW1lbnRFbGVtZW50O3JldHVybiFkZS50ZXN0KHR8fG4mJm4ubm9kZU5hbWV8fCJIVE1MIil9LE89dC5zZXREb2N1bWVudD1mdW5jdGlvbihlKXt2YXIgdCxuLHI9ZT9lLm93bmVyRG9jdW1lbnR8fGU6cTtyZXR1cm4gciE9aiYmOT09PXIubm9kZVR5cGUmJnIuZG9jdW1lbnRFbGVtZW50PyhqPXIsTj1qLmRvY3VtZW50RWxlbWVudCxEPSFDKGopLHEhPWomJihuPWouZGVmYXVsdFZpZXcpJiZuLnRvcCE9PW4mJihuLmFkZEV2ZW50TGlzdGVuZXI/bi5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLENlLCExKTpuLmF0dGFjaEV2ZW50JiZuLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsQ2UpKSx4LnNjb3BlPW8oZnVuY3Rpb24oZSl7cmV0dXJuIE4uYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQoai5jcmVhdGVFbGVtZW50KCJkaXYiKSksdm9pZCAwIT09ZS5xdWVyeVNlbGVjdG9yQWxsJiYhZS5xdWVyeVNlbGVjdG9yQWxsKCI6c2NvcGUgZmllbGRzZXQgZGl2IikubGVuZ3RofSkseC5hdHRyaWJ1dGVzPW8oZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2xhc3NOYW1lPSJpIiwhZS5nZXRBdHRyaWJ1dGUoImNsYXNzTmFtZSIpfSkseC5nZXRFbGVtZW50c0J5VGFnTmFtZT1vKGZ1bmN0aW9uKGUpe3JldHVybiBlLmFwcGVuZENoaWxkKGouY3JlYXRlQ29tbWVudCgiIikpLCFlLmdldEVsZW1lbnRzQnlUYWdOYW1lKCIqIikubGVuZ3RofSkseC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lPW1lLnRlc3Qoai5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKSx4LmdldEJ5SWQ9byhmdW5jdGlvbihlKXtyZXR1cm4gTi5hcHBlbmRDaGlsZChlKS5pZD1QLCFqLmdldEVsZW1lbnRzQnlOYW1lfHwhai5nZXRFbGVtZW50c0J5TmFtZShQKS5sZW5ndGh9KSx4LmdldEJ5SWQ/KHcuZmlsdGVyLklEPWZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZShiZSx4ZSk7cmV0dXJuIGZ1bmN0aW9uKGUpe3JldHVybiBlLmdldEF0dHJpYnV0ZSgiaWQiKT09PXR9fSx3LmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10LmdldEVsZW1lbnRCeUlkJiZEKXt2YXIgbj10LmdldEVsZW1lbnRCeUlkKGUpO3JldHVybiBuP1tuXTpbXX19KToody5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKGJlLHhlKTtyZXR1cm4gZnVuY3Rpb24oZSl7dmFyIG49dm9pZCAwIT09ZS5nZXRBdHRyaWJ1dGVOb2RlJiZlLmdldEF0dHJpYnV0ZU5vZGUoImlkIik7cmV0dXJuIG4mJm4udmFsdWU9PT10fX0sdy5maW5kLklEPWZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09dC5nZXRFbGVtZW50QnlJZCYmRCl7dmFyIG4scixvLGk9dC5nZXRFbGVtZW50QnlJZChlKTtpZihpKXtpZigobj1pLmdldEF0dHJpYnV0ZU5vZGUoImlkIikpJiZuLnZhbHVlPT09ZSlyZXR1cm5baV07Zm9yKG89dC5nZXRFbGVtZW50c0J5TmFtZShlKSxyPTA7aT1vW3IrK107KWlmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltpXX1yZXR1cm5bXX19KSx3LmZpbmQuVEFHPXguZ2V0RWxlbWVudHNCeVRhZ05hbWU/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwIT09dC5nZXRFbGVtZW50c0J5VGFnTmFtZT90LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpOngucXNhP3QucXVlcnlTZWxlY3RvckFsbChlKTp2b2lkIDB9OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1bXSxvPTAsaT10LmdldEVsZW1lbnRzQnlUYWdOYW1lKGUpO2lmKCIqIj09PWUpe2Zvcig7bj1pW28rK107KTE9PT1uLm5vZGVUeXBlJiZyLnB1c2gobik7cmV0dXJuIHJ9cmV0dXJuIGl9LHcuZmluZC5DTEFTUz14LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJmZ1bmN0aW9uKGUsdCl7aWYodm9pZCAwIT09dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lJiZEKXJldHVybiB0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoZSl9LFI9W10sTD1bXSwoeC5xc2E9bWUudGVzdChqLnF1ZXJ5U2VsZWN0b3JBbGwpKSYmKG8oZnVuY3Rpb24oZSl7dmFyIHQ7Ti5hcHBlbmRDaGlsZChlKS5pbm5lckhUTUw9IjxhIGlkPSciK1ArIic+PC9hPjxzZWxlY3QgaWQ9JyIrUCsiLVxyXFwnIG1zYWxsb3djYXB0dXJlPScnPjxvcHRpb24gc2VsZWN0ZWQ9Jyc+PC9vcHRpb24+PC9zZWxlY3Q+IixlLnF1ZXJ5U2VsZWN0b3JBbGwoIlttc2FsbG93Y2FwdHVyZV49JyddIikubGVuZ3RoJiZMLnB1c2goIlsqXiRdPSIrdGUrIiooPzonJ3xcIlwiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW3NlbGVjdGVkXSIpLmxlbmd0aHx8TC5wdXNoKCJcXFsiK3RlKyIqKD86dmFsdWV8IitlZSsiKSIpLGUucXVlcnlTZWxlY3RvckFsbCgiW2lkfj0iK1ArIi1dIikubGVuZ3RofHxMLnB1c2goIn49IiksdD1qLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksdC5zZXRBdHRyaWJ1dGUoIm5hbWUiLCIiKSxlLmFwcGVuZENoaWxkKHQpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9JyddIikubGVuZ3RofHxMLnB1c2goIlxcWyIrdGUrIipuYW1lIit0ZSsiKj0iK3RlKyIqKD86Jyd8XCJcIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIjpjaGVja2VkIikubGVuZ3RofHxMLnB1c2goIjpjaGVja2VkIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJhIyIrUCsiKyoiKS5sZW5ndGh8fEwucHVzaCgiLiMuK1srfl0iKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIlxcXGYiKSxMLnB1c2goIltcXHJcXG5cXGZdIil9KSxvKGZ1bmN0aW9uKGUpe2UuaW5uZXJIVE1MPSI8YSBocmVmPScnIGRpc2FibGVkPSdkaXNhYmxlZCc+PC9hPjxzZWxlY3QgZGlzYWJsZWQ9J2Rpc2FibGVkJz48b3B0aW9uLz48L3NlbGVjdD4iO3ZhciB0PWouY3JlYXRlRWxlbWVudCgiaW5wdXQiKTt0LnNldEF0dHJpYnV0ZSgidHlwZSIsImhpZGRlbiIpLGUuYXBwZW5kQ2hpbGQodCkuc2V0QXR0cmlidXRlKCJuYW1lIiwiRCIpLGUucXVlcnlTZWxlY3RvckFsbCgiW25hbWU9ZF0iKS5sZW5ndGgmJkwucHVzaCgibmFtZSIrdGUrIipbKl4kfCF+XT89IiksMiE9PWUucXVlcnlTZWxlY3RvckFsbCgiOmVuYWJsZWQiKS5sZW5ndGgmJkwucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxOLmFwcGVuZENoaWxkKGUpLmRpc2FibGVkPSEwLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjpkaXNhYmxlZCIpLmxlbmd0aCYmTC5wdXNoKCI6ZW5hYmxlZCIsIjpkaXNhYmxlZCIpLGUucXVlcnlTZWxlY3RvckFsbCgiKiw6eCIpLEwucHVzaCgiLC4qOiIpfSkpLCh4Lm1hdGNoZXNTZWxlY3Rvcj1tZS50ZXN0KE09Ti5tYXRjaGVzfHxOLndlYmtpdE1hdGNoZXNTZWxlY3Rvcnx8Ti5tb3pNYXRjaGVzU2VsZWN0b3J8fE4ub01hdGNoZXNTZWxlY3Rvcnx8Ti5tc01hdGNoZXNTZWxlY3RvcikpJiZvKGZ1bmN0aW9uKGUpe3guZGlzY29ubmVjdGVkTWF0Y2g9TS5jYWxsKGUsIioiKSxNLmNhbGwoZSwiW3MhPScnXTp4IiksUi5wdXNoKCIhPSIsb2UpfSksTD1MLmxlbmd0aCYmbmV3IFJlZ0V4cChMLmpvaW4oInwiKSksUj1SLmxlbmd0aCYmbmV3IFJlZ0V4cChSLmpvaW4oInwiKSksdD1tZS50ZXN0KE4uY29tcGFyZURvY3VtZW50UG9zaXRpb24pLEk9dHx8bWUudGVzdChOLmNvbnRhaW5zKT9mdW5jdGlvbihlLHQpe3ZhciBuPTk9PT1lLm5vZGVUeXBlP2UuZG9jdW1lbnRFbGVtZW50OmUscj10JiZ0LnBhcmVudE5vZGU7cmV0dXJuIGU9PT1yfHwhKCFyfHwxIT09ci5ub2RlVHlwZXx8IShuLmNvbnRhaW5zP24uY29udGFpbnMocik6ZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiYmMTYmZS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihyKSkpfTpmdW5jdGlvbihlLHQpe2lmKHQpZm9yKDt0PXQucGFyZW50Tm9kZTspaWYodD09PWUpcmV0dXJuITA7cmV0dXJuITF9LFY9dD9mdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBFPSEwLDA7dmFyIG49IWUuY29tcGFyZURvY3VtZW50UG9zaXRpb24tIXQuY29tcGFyZURvY3VtZW50UG9zaXRpb247cmV0dXJuIG58fChuPShlLm93bmVyRG9jdW1lbnR8fGUpPT0odC5vd25lckRvY3VtZW50fHx0KT9lLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKHQpOjEsMSZufHwheC5zb3J0RGV0YWNoZWQmJnQuY29tcGFyZURvY3VtZW50UG9zaXRpb24oZSk9PT1uP2U9PWp8fGUub3duZXJEb2N1bWVudD09cSYmSShxLGUpPy0xOnQ9PWp8fHQub3duZXJEb2N1bWVudD09cSYmSShxLHQpPzE6JD9aKCQsZSktWigkLHQpOjA6NCZuPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBFPSEwLDA7dmFyIG4scj0wLG89ZS5wYXJlbnROb2RlLGk9dC5wYXJlbnROb2RlLHM9W2VdLHU9W3RdO2lmKCFvfHwhaSlyZXR1cm4gZT09aj8tMTp0PT1qPzE6bz8tMTppPzE6JD9aKCQsZSktWigkLHQpOjA7aWYobz09PWkpcmV0dXJuIGEoZSx0KTtmb3Iobj1lO249bi5wYXJlbnROb2RlOylzLnVuc2hpZnQobik7Zm9yKG49dDtuPW4ucGFyZW50Tm9kZTspdS51bnNoaWZ0KG4pO2Zvcig7c1tyXT09PXVbcl07KXIrKztyZXR1cm4gcj9hKHNbcl0sdVtyXSk6c1tyXT09cT8tMTp1W3JdPT1xPzE6MH0saik6an0sdC5tYXRjaGVzPWZ1bmN0aW9uKGUsbil7cmV0dXJuIHQoZSxudWxsLG51bGwsbil9LHQubWF0Y2hlc1NlbGVjdG9yPWZ1bmN0aW9uKGUsbil7aWYoTyhlKSx4Lm1hdGNoZXNTZWxlY3RvciYmRCYmIXpbbisiICJdJiYoIVJ8fCFSLnRlc3QobikpJiYoIUx8fCFMLnRlc3QobikpKXRyeXt2YXIgcj1NLmNhbGwoZSxuKTtpZihyfHx4LmRpc2Nvbm5lY3RlZE1hdGNofHxlLmRvY3VtZW50JiYxMSE9PWUuZG9jdW1lbnQubm9kZVR5cGUpcmV0dXJuIHJ9Y2F0Y2goZSl7eihuLCEwKX1yZXR1cm4gdChuLGosbnVsbCxbZV0pLmxlbmd0aD4wfSx0LmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPWomJk8oZSksSShlLHQpfSx0LmF0dHI9ZnVuY3Rpb24oZSx0KXsoZS5vd25lckRvY3VtZW50fHxlKSE9aiYmTyhlKTt2YXIgbj13LmF0dHJIYW5kbGVbdC50b0xvd2VyQ2FzZSgpXSxyPW4mJlguY2FsbCh3LmF0dHJIYW5kbGUsdC50b0xvd2VyQ2FzZSgpKT9uKGUsdCwhRCk6dm9pZCAwO3JldHVybiB2b2lkIDAhPT1yP3I6eC5hdHRyaWJ1dGVzfHwhRD9lLmdldEF0dHJpYnV0ZSh0KToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9LHQuZXNjYXBlPWZ1bmN0aW9uKGUpe3JldHVybihlKyIiKS5yZXBsYWNlKHdlLF9lKX0sdC5lcnJvcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoIlN5bnRheCBlcnJvciwgdW5yZWNvZ25pemVkIGV4cHJlc3Npb246ICIrZSl9LHQudW5pcXVlU29ydD1mdW5jdGlvbihlKXt2YXIgdCxuPVtdLHI9MCxvPTA7aWYoRT0heC5kZXRlY3REdXBsaWNhdGVzLCQ9IXguc29ydFN0YWJsZSYmZS5zbGljZSgwKSxlLnNvcnQoViksRSl7Zm9yKDt0PWVbbysrXTspdD09PWVbb10mJihyPW4ucHVzaChvKSk7Zm9yKDtyLS07KWUuc3BsaWNlKG5bcl0sMSl9cmV0dXJuICQ9bnVsbCxlfSxfPXQuZ2V0VGV4dD1mdW5jdGlvbihlKXt2YXIgdCxuPSIiLHI9MCxvPWUubm9kZVR5cGU7aWYobyl7aWYoMT09PW98fDk9PT1vfHwxMT09PW8pe2lmKCJzdHJpbmciPT10eXBlb2YgZS50ZXh0Q29udGVudClyZXR1cm4gZS50ZXh0Q29udGVudDtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpbis9XyhlKX1lbHNlIGlmKDM9PT1vfHw0PT09bylyZXR1cm4gZS5ub2RlVmFsdWV9ZWxzZSBmb3IoO3Q9ZVtyKytdOyluKz1fKHQpO3JldHVybiBufSx3PXQuc2VsZWN0b3JzPXtjYWNoZUxlbmd0aDo1MCxjcmVhdGVQc2V1ZG86cixtYXRjaDpwZSxhdHRySGFuZGxlOnt9LGZpbmQ6e30scmVsYXRpdmU6eyI+Ijp7ZGlyOiJwYXJlbnROb2RlIixmaXJzdDohMH0sIiAiOntkaXI6InBhcmVudE5vZGUifSwiKyI6e2RpcjoicHJldmlvdXNTaWJsaW5nIixmaXJzdDohMH0sIn4iOntkaXI6InByZXZpb3VzU2libGluZyJ9fSxwcmVGaWx0ZXI6e0FUVFI6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbMV09ZVsxXS5yZXBsYWNlKGJlLHhlKSxlWzNdPShlWzNdfHxlWzRdfHxlWzVdfHwiIikucmVwbGFjZShiZSx4ZSksIn49Ij09PWVbMl0mJihlWzNdPSIgIitlWzNdKyIgIiksZS5zbGljZSgwLDQpfSxDSElMRDpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnRvTG93ZXJDYXNlKCksIm50aCI9PT1lWzFdLnNsaWNlKDAsMyk/KGVbM118fHQuZXJyb3IoZVswXSksZVs0XT0rKGVbNF0/ZVs1XSsoZVs2XXx8MSk6MiooImV2ZW4iPT09ZVszXXx8Im9kZCI9PT1lWzNdKSksZVs1XT0rKGVbN10rZVs4XXx8Im9kZCI9PT1lWzNdKSk6ZVszXSYmdC5lcnJvcihlWzBdKSxlfSxQU0VVRE86ZnVuY3Rpb24oZSl7dmFyIHQsbj0hZVs2XSYmZVsyXTtyZXR1cm4gcGUuQ0hJTEQudGVzdChlWzBdKT9udWxsOihlWzNdP2VbMl09ZVs0XXx8ZVs1XXx8IiI6biYmbGUudGVzdChuKSYmKHQ9VChuLCEwKSkmJih0PW4uaW5kZXhPZigiKSIsbi5sZW5ndGgtdCktbi5sZW5ndGgpJiYoZVswXT1lWzBdLnNsaWNlKDAsdCksZVsyXT1uLnNsaWNlKDAsdCkpLGUuc2xpY2UoMCwzKSl9fSxmaWx0ZXI6e1RBRzpmdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoYmUseGUpLnRvTG93ZXJDYXNlKCk7cmV0dXJuIioiPT09ZT9mdW5jdGlvbigpe3JldHVybiEwfTpmdW5jdGlvbihlKXtyZXR1cm4gZS5ub2RlTmFtZSYmZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09dH19LENMQVNTOmZ1bmN0aW9uKGUpe3ZhciB0PUJbZSsiICJdO3JldHVybiB0fHwodD1uZXcgUmVnRXhwKCIoXnwiK3RlKyIpIitlKyIoIit0ZSsifCQpIikpJiZCKGUsZnVuY3Rpb24oZSl7cmV0dXJuIHQudGVzdCgic3RyaW5nIj09dHlwZW9mIGUuY2xhc3NOYW1lJiZlLmNsYXNzTmFtZXx8dm9pZCAwIT09ZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIil9KX0sQVRUUjpmdW5jdGlvbihlLG4scil7cmV0dXJuIGZ1bmN0aW9uKG8pe3ZhciBpPXQuYXR0cihvLGUpO3JldHVybiBudWxsPT1pPyIhPSI9PT1uOiFufHwoaSs9IiIsIj0iPT09bj9pPT09cjoiIT0iPT09bj9pIT09cjoiXj0iPT09bj9yJiYwPT09aS5pbmRleE9mKHIpOiIqPSI9PT1uP3ImJmkuaW5kZXhPZihyKT4tMToiJD0iPT09bj9yJiZpLnNsaWNlKC1yLmxlbmd0aCk9PT1yOiJ+PSI9PT1uPygiICIraS5yZXBsYWNlKGllLCIgIikrIiAiKS5pbmRleE9mKHIpPi0xOiJ8PSI9PT1uJiYoaT09PXJ8fGkuc2xpY2UoMCxyLmxlbmd0aCsxKT09PXIrIi0iKSl9fSxDSElMRDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpPSJudGgiIT09ZS5zbGljZSgwLDMpLGE9Imxhc3QiIT09ZS5zbGljZSgtNCkscz0ib2YtdHlwZSI9PT10O3JldHVybiAxPT09ciYmMD09PW8/ZnVuY3Rpb24oZSl7cmV0dXJuISFlLnBhcmVudE5vZGV9OmZ1bmN0aW9uKHQsbix1KXt2YXIgYyxsLGYscCxkLGgsdj1pIT09YT8ibmV4dFNpYmxpbmciOiJwcmV2aW91c1NpYmxpbmciLG09dC5wYXJlbnROb2RlLHk9cyYmdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpLGc9IXUmJiFzLGI9ITE7aWYobSl7aWYoaSl7Zm9yKDt2Oyl7Zm9yKHA9dDtwPXBbdl07KWlmKHM/cC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpPT09eToxPT09cC5ub2RlVHlwZSlyZXR1cm4hMTtoPXY9Im9ubHkiPT09ZSYmIWgmJiJuZXh0U2libGluZyJ9cmV0dXJuITB9aWYoaD1bYT9tLmZpcnN0Q2hpbGQ6bS5sYXN0Q2hpbGRdLGEmJmcpe2ZvcihwPW0sZj1wW1BdfHwocFtQXT17fSksbD1mW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSksYz1sW2VdfHxbXSxkPWNbMF09PT1IJiZjWzFdLGI9ZCYmY1syXSxwPWQmJm0uY2hpbGROb2Rlc1tkXTtwPSsrZCYmcCYmcFt2XXx8KGI9ZD0wKXx8aC5wb3AoKTspaWYoMT09PXAubm9kZVR5cGUmJisrYiYmcD09PXQpe2xbZV09W0gsZCxiXTticmVha319ZWxzZSBpZihnJiYocD10LGY9cFtQXXx8KHBbUF09e30pLGw9ZltwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pLGM9bFtlXXx8W10sZD1jWzBdPT09SCYmY1sxXSxiPWQpLCExPT09Yilmb3IoOyhwPSsrZCYmcCYmcFt2XXx8KGI9ZD0wKXx8aC5wb3AoKSkmJigocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkhPT15OjEhPT1wLm5vZGVUeXBlKXx8ISsrYnx8KGcmJihmPXBbUF18fChwW1BdPXt9KSxsPWZbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSxsW2VdPVtILGJdKSxwIT09dCkpOyk7cmV0dXJuKGItPW8pPT09cnx8YiVyPT0wJiZiL3I+PTB9fX0sUFNFVURPOmZ1bmN0aW9uKGUsbil7dmFyIG8saT13LnBzZXVkb3NbZV18fHcuc2V0RmlsdGVyc1tlLnRvTG93ZXJDYXNlKCldfHx0LmVycm9yKCJ1bnN1cHBvcnRlZCBwc2V1ZG86ICIrZSk7cmV0dXJuIGlbUF0/aShuKTppLmxlbmd0aD4xPyhvPVtlLGUsIiIsbl0sdy5zZXRGaWx0ZXJzLmhhc093blByb3BlcnR5KGUudG9Mb3dlckNhc2UoKSk/cihmdW5jdGlvbihlLHQpe2Zvcih2YXIgcixvPWkoZSxuKSxhPW8ubGVuZ3RoO2EtLTspcj1aKGUsb1thXSksZVtyXT0hKHRbcl09b1thXSl9KTpmdW5jdGlvbihlKXtyZXR1cm4gaShlLDAsbyl9KTppfX0scHNldWRvczp7bm90OnIoZnVuY3Rpb24oZSl7dmFyIHQ9W10sbj1bXSxvPWsoZS5yZXBsYWNlKGFlLCIkMSIpKTtyZXR1cm4gb1tQXT9yKGZ1bmN0aW9uKGUsdCxuLHIpe2Zvcih2YXIgaSxhPW8oZSxudWxsLHIsW10pLHM9ZS5sZW5ndGg7cy0tOykoaT1hW3NdKSYmKGVbc109ISh0W3NdPWkpKX0pOmZ1bmN0aW9uKGUscixpKXtyZXR1cm4gdFswXT1lLG8odCxudWxsLGksbiksdFswXT1udWxsLCFuLnBvcCgpfX0pLGhhczpyKGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdChlLG4pLmxlbmd0aD4wfX0pLGNvbnRhaW5zOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGU9ZS5yZXBsYWNlKGJlLHhlKSxmdW5jdGlvbih0KXtyZXR1cm4odC50ZXh0Q29udGVudHx8Xyh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGZlLnRlc3QoZXx8IiIpfHx0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKGJlLHhlKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2Rve2lmKG49RD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PWV8fDA9PT1uLmluZGV4T2YoZSsiLSIpfXdoaWxlKCh0PXQucGFyZW50Tm9kZSkmJjE9PT10Lm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS5sb2NhdGlvbiYmZS5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09dC5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PU59LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ai5hY3RpdmVFbGVtZW50JiYoIWouaGFzRm9jdXN8fGouaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6cyghMSksZGlzYWJsZWQ6cyghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXcucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiB2ZS50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gaGUudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6dShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om4+dD90Om47LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp1KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LHcucHNldWRvcy5udGg9dy5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXcucHNldWRvc1tiXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19KGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pdy5wc2V1ZG9zW2JdPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX0oYik7cmV0dXJuIGwucHJvdG90eXBlPXcuZmlsdGVycz13LnBzZXVkb3Msdy5zZXRGaWx0ZXJzPW5ldyBsLFQ9dC50b2tlbml6ZT1mdW5jdGlvbihlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9VVtlKyIgIl07aWYobClyZXR1cm4gbj8wOmwuc2xpY2UoMCk7Zm9yKHM9ZSx1PVtdLGM9dy5wcmVGaWx0ZXI7czspe3ImJiEobz1zZS5leGVjKHMpKXx8KG8mJihzPXMuc2xpY2Uob1swXS5sZW5ndGgpfHxzKSx1LnB1c2goaT1bXSkpLHI9ITEsKG89dWUuZXhlYyhzKSkmJihyPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOnIsdHlwZTpvWzBdLnJlcGxhY2UoYWUsIiAiKX0pLHM9cy5zbGljZShyLmxlbmd0aCkpO2ZvcihhIGluIHcuZmlsdGVyKSEobz1wZVthXS5leGVjKHMpKXx8Y1thXSYmIShvPWNbYV0obykpfHwocj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpyLHR5cGU6YSxtYXRjaGVzOm99KSxzPXMuc2xpY2Uoci5sZW5ndGgpKTtpZighcilicmVha31yZXR1cm4gbj9zLmxlbmd0aDpzP3QuZXJyb3IoZSk6VShlLHUpLnNsaWNlKDApfSxrPXQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10sbz1bXSxpPVdbZSsiICJdO2lmKCFpKXtmb3IodHx8KHQ9VChlKSksbj10Lmxlbmd0aDtuLS07KWk9eSh0W25dKSxpW1BdP3IucHVzaChpKTpvLnB1c2goaSk7aT1XKGUsZyhvLHIpKSxpLnNlbGVjdG9yPWV9cmV0dXJuIGl9LEE9dC5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG8saSxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHA9IXImJlQoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1wLmxlbmd0aCl7aWYoaT1wWzBdPXBbMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShhPWlbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZEJiZ3LnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKCEodD0ody5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKGJlLHhlKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShpLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3Iobz1wZS5uZWVkc0NvbnRleHQudGVzdChlKT8wOmkubGVuZ3RoO28tLSYmKGE9aVtvXSwhdy5yZWxhdGl2ZVtzPWEudHlwZV0pOylpZigodT13LmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKGJlLHhlKSxnZS50ZXN0KGlbMF0udHlwZSkmJmModC5wYXJlbnROb2RlKXx8dCkpKXtpZihpLnNwbGljZShvLDEpLCEoZT1yLmxlbmd0aCYmZihpKSkpcmV0dXJuIFkuYXBwbHkobixyKSxuO2JyZWFrfX1yZXR1cm4obHx8ayhlLHApKShyLHQsIUQsbiwhdHx8Z2UudGVzdChlKSYmYyh0LnBhcmVudE5vZGUpfHx0KSxufSx4LnNvcnRTdGFibGU9UC5zcGxpdCgiIikuc29ydChWKS5qb2luKCIiKT09PVAseC5kZXRlY3REdXBsaWNhdGVzPSEhRSxPKCkseC5zb3J0RGV0YWNoZWQ9byhmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGouY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxvKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGkoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLHguYXR0cmlidXRlcyYmbyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxpKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLG8oZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGkoZWUsZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKCFuKXJldHVybiEwPT09ZVt0XT90LnRvTG93ZXJDYXNlKCk6KHI9ZS5nZXRBdHRyaWJ1dGVOb2RlKHQpKSYmci5zcGVjaWZpZWQ/ci52YWx1ZTpudWxsfSksdH0obik7U2UuZmluZD0kZSxTZS5leHByPSRlLnNlbGVjdG9ycyxTZS5leHByWyI6Il09U2UuZXhwci5wc2V1ZG9zLFNlLnVuaXF1ZVNvcnQ9U2UudW5pcXVlPSRlLnVuaXF1ZVNvcnQsU2UudGV4dD0kZS5nZXRUZXh0LFNlLmlzWE1MRG9jPSRlLmlzWE1MLFNlLmNvbnRhaW5zPSRlLmNvbnRhaW5zLFNlLmVzY2FwZVNlbGVjdG9yPSRlLmVzY2FwZTt2YXIgRWU9ZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1bXSxvPXZvaWQgMCE9PW47KGU9ZVt0XSkmJjkhPT1lLm5vZGVUeXBlOylpZigxPT09ZS5ub2RlVHlwZSl7aWYobyYmU2UoZSkuaXMobikpYnJlYWs7ci5wdXNoKGUpfXJldHVybiByfSxPZT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1bXTtlO2U9ZS5uZXh0U2libGluZykxPT09ZS5ub2RlVHlwZSYmZSE9PXQmJm4ucHVzaChlKTtyZXR1cm4gbn0samU9U2UuZXhwci5tYXRjaC5uZWVkc0NvbnRleHQsTmU9L148KFthLXpdW15cL1wwPjpceDIwXHRcclxuXGZdKilbXHgyMFx0XHJcblxmXSpcLz8+KD86PFwvXDE+fCkkL2k7U2UuZmlsdGVyPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10WzBdO3JldHVybiBuJiYoZT0iOm5vdCgiK2UrIikiKSwxPT09dC5sZW5ndGgmJjE9PT1yLm5vZGVUeXBlP1NlLmZpbmQubWF0Y2hlc1NlbGVjdG9yKHIsZSk/W3JdOltdOlNlLmZpbmQubWF0Y2hlcyhlLFNlLmdyZXAodCxmdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV9KSl9LFNlLmZuLmV4dGVuZCh7ZmluZDpmdW5jdGlvbihlKXt2YXIgdCxuLHI9dGhpcy5sZW5ndGgsbz10aGlzO2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm4gdGhpcy5wdXNoU3RhY2soU2UoZSkuZmlsdGVyKGZ1bmN0aW9uKCl7Zm9yKHQ9MDt0PHI7dCsrKWlmKFNlLmNvbnRhaW5zKG9bdF0sdGhpcykpcmV0dXJuITB9KSk7Zm9yKG49dGhpcy5wdXNoU3RhY2soW10pLHQ9MDt0PHI7dCsrKVNlLmZpbmQoZSxvW3RdLG4pO3JldHVybiByPjE/U2UudW5pcXVlU29ydChuKTpufSxmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGwodGhpcyxlfHxbXSwhMSkpfSxub3Q6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucHVzaFN0YWNrKGwodGhpcyxlfHxbXSwhMCkpfSxpczpmdW5jdGlvbihlKXtyZXR1cm4hIWwodGhpcywic3RyaW5nIj09dHlwZW9mIGUmJmplLnRlc3QoZSk/U2UoZSk6ZXx8W10sITEpLmxlbmd0aH19KTt2YXIgRGUsTGU9L14oPzpccyooPFtcd1xXXSs+KVtePl0qfCMoW1x3LV0rKSkkLzsoU2UuZm4uaW5pdD1mdW5jdGlvbihlLHQsbil7dmFyIHIsbztpZighZSlyZXR1cm4gdGhpcztpZihuPW58fERlLCJzdHJpbmciPT10eXBlb2YgZSl7aWYoIShyPSI8Ij09PWVbMF0mJiI+Ij09PWVbZS5sZW5ndGgtMV0mJmUubGVuZ3RoPj0zP1tudWxsLGUsbnVsbF06TGUuZXhlYyhlKSl8fCFyWzFdJiZ0KXJldHVybiF0fHx0LmpxdWVyeT8odHx8bikuZmluZChlKTp0aGlzLmNvbnN0cnVjdG9yKHQpLmZpbmQoZSk7aWYoclsxXSl7aWYodD10IGluc3RhbmNlb2YgU2U/dFswXTp0LFNlLm1lcmdlKHRoaXMsU2UucGFyc2VIVE1MKHJbMV0sdCYmdC5ub2RlVHlwZT90Lm93bmVyRG9jdW1lbnR8fHQ6a2UsITApKSxOZS50ZXN0KHJbMV0pJiZTZS5pc1BsYWluT2JqZWN0KHQpKWZvcihyIGluIHQpQ2UodGhpc1tyXSk/dGhpc1tyXSh0W3JdKTp0aGlzLmF0dHIocix0W3JdKTtyZXR1cm4gdGhpc31yZXR1cm4gbz1rZS5nZXRFbGVtZW50QnlJZChyWzJdKSxvJiYodGhpc1swXT1vLHRoaXMubGVuZ3RoPTEpLHRoaXN9cmV0dXJuIGUubm9kZVR5cGU/KHRoaXNbMF09ZSx0aGlzLmxlbmd0aD0xLHRoaXMpOkNlKGUpP3ZvaWQgMCE9PW4ucmVhZHk/bi5yZWFkeShlKTplKFNlKTpTZS5tYWtlQXJyYXkoZSx0aGlzKX0pLnByb3RvdHlwZT1TZS5mbixEZT1TZShrZSk7dmFyIFJlPS9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLE1lPXtjaGlsZHJlbjohMCxjb250ZW50czohMCxuZXh0OiEwLHByZXY6ITB9O1NlLmZuLmV4dGVuZCh7aGFzOmZ1bmN0aW9uKGUpe3ZhciB0PVNlKGUsdGhpcyksbj10Lmxlbmd0aDtyZXR1cm4gdGhpcy5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodmFyIGU9MDtlPG47ZSsrKWlmKFNlLmNvbnRhaW5zKHRoaXMsdFtlXSkpcmV0dXJuITB9KX0sY2xvc2VzdDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MCxvPXRoaXMubGVuZ3RoLGk9W10sYT0ic3RyaW5nIiE9dHlwZW9mIGUmJlNlKGUpO2lmKCFqZS50ZXN0KGUpKWZvcig7cjxvO3IrKylmb3Iobj10aGlzW3JdO24mJm4hPT10O249bi5wYXJlbnROb2RlKWlmKG4ubm9kZVR5cGU8MTEmJihhP2EuaW5kZXgobik+LTE6MT09PW4ubm9kZVR5cGUmJlNlLmZpbmQubWF0Y2hlc1NlbGVjdG9yKG4sZSkpKXtpLnB1c2gobik7YnJlYWt9cmV0dXJuIHRoaXMucHVzaFN0YWNrKGkubGVuZ3RoPjE/U2UudW5pcXVlU29ydChpKTppKX0saW5kZXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/InN0cmluZyI9PXR5cGVvZiBlP21lLmNhbGwoU2UoZSksdGhpc1swXSk6bWUuY2FsbCh0aGlzLGUuanF1ZXJ5P2VbMF06ZSk6dGhpc1swXSYmdGhpc1swXS5wYXJlbnROb2RlP3RoaXMuZmlyc3QoKS5wcmV2QWxsKCkubGVuZ3RoOi0xfSxhZGQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soU2UudW5pcXVlU29ydChTZS5tZXJnZSh0aGlzLmdldCgpLFNlKGUsdCkpKSl9LGFkZEJhY2s6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMuYWRkKG51bGw9PWU/dGhpcy5wcmV2T2JqZWN0OnRoaXMucHJldk9iamVjdC5maWx0ZXIoZSkpfX0pLFNlLmVhY2goe3BhcmVudDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7cmV0dXJuIHQmJjExIT09dC5ub2RlVHlwZT90Om51bGx9LHBhcmVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIEVlKGUsInBhcmVudE5vZGUiKX0scGFyZW50c1VudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWUoZSwicGFyZW50Tm9kZSIsbil9LG5leHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGYoZSwibmV4dFNpYmxpbmciKX0scHJldjpmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dEFsbDpmdW5jdGlvbihlKXtyZXR1cm4gRWUoZSwibmV4dFNpYmxpbmciKX0scHJldkFsbDpmdW5jdGlvbihlKXtyZXR1cm4gRWUoZSwicHJldmlvdXNTaWJsaW5nIil9LG5leHRVbnRpbDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIEVlKGUsIm5leHRTaWJsaW5nIixuKX0scHJldlVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gRWUoZSwicHJldmlvdXNTaWJsaW5nIixuKX0sc2libGluZ3M6ZnVuY3Rpb24oZSl7cmV0dXJuIE9lKChlLnBhcmVudE5vZGV8fHt9KS5maXJzdENoaWxkLGUpfSxjaGlsZHJlbjpmdW5jdGlvbihlKXtyZXR1cm4gT2UoZS5maXJzdENoaWxkKX0sY29udGVudHM6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGwhPWUuY29udGVudERvY3VtZW50JiZwZShlLmNvbnRlbnREb2N1bWVudCk/ZS5jb250ZW50RG9jdW1lbnQ6KGMoZSwidGVtcGxhdGUiKSYmKGU9ZS5jb250ZW50fHxlKSxTZS5tZXJnZShbXSxlLmNoaWxkTm9kZXMpKX19LGZ1bmN0aW9uKGUsdCl7U2UuZm5bZV09ZnVuY3Rpb24obixyKXt2YXIgbz1TZS5tYXAodGhpcyx0LG4pO3JldHVybiJVbnRpbCIhPT1lLnNsaWNlKC01KSYmKHI9biksciYmInN0cmluZyI9PXR5cGVvZiByJiYobz1TZS5maWx0ZXIocixvKSksdGhpcy5sZW5ndGg+MSYmKE1lW2VdfHxTZS51bmlxdWVTb3J0KG8pLFJlLnRlc3QoZSkmJm8ucmV2ZXJzZSgpKSx0aGlzLnB1c2hTdGFjayhvKX19KTt2YXIgSWU9L1teXHgyMFx0XHJcblxmXSsvZztTZS5DYWxsYmFja3M9ZnVuY3Rpb24oZSl7ZT0ic3RyaW5nIj09dHlwZW9mIGU/cChlKTpTZS5leHRlbmQoe30sZSk7dmFyIHQsbixyLG8saT1bXSxhPVtdLHU9LTEsYz1mdW5jdGlvbigpe2ZvcihvPW98fGUub25jZSxyPXQ9ITA7YS5sZW5ndGg7dT0tMSlmb3Iobj1hLnNoaWZ0KCk7Kyt1PGkubGVuZ3RoOykhMT09PWlbdV0uYXBwbHkoblswXSxuWzFdKSYmZS5zdG9wT25GYWxzZSYmKHU9aS5sZW5ndGgsbj0hMSk7ZS5tZW1vcnl8fChuPSExKSx0PSExLG8mJihpPW4/W106IiIpfSxsPXthZGQ6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKG4mJiF0JiYodT1pLmxlbmd0aC0xLGEucHVzaChuKSksZnVuY3Rpb24gdChuKXtTZS5lYWNoKG4sZnVuY3Rpb24obixyKXtDZShyKT9lLnVuaXF1ZSYmbC5oYXMocil8fGkucHVzaChyKTpyJiZyLmxlbmd0aCYmInN0cmluZyIhPT1zKHIpJiZ0KHIpfSl9KGFyZ3VtZW50cyksbiYmIXQmJmMoKSksdGhpc30scmVtb3ZlOmZ1bmN0aW9uKCl7cmV0dXJuIFNlLmVhY2goYXJndW1lbnRzLGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuOyhuPVNlLmluQXJyYXkodCxpLG4pKT4tMTspaS5zcGxpY2UobiwxKSxuPD11JiZ1LS19KSx0aGlzfSxoYXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGU/U2UuaW5BcnJheShlLGkpPi0xOmkubGVuZ3RoPjB9LGVtcHR5OmZ1bmN0aW9uKCl7cmV0dXJuIGkmJihpPVtdKSx0aGlzfSxkaXNhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxpPW49IiIsdGhpc30sZGlzYWJsZWQ6ZnVuY3Rpb24oKXtyZXR1cm4haX0sbG9jazpmdW5jdGlvbigpe3JldHVybiBvPWE9W10sbnx8dHx8KGk9bj0iIiksdGhpc30sbG9ja2VkOmZ1bmN0aW9uKCl7cmV0dXJuISFvfSxmaXJlV2l0aDpmdW5jdGlvbihlLG4pe3JldHVybiBvfHwobj1ufHxbXSxuPVtlLG4uc2xpY2U/bi5zbGljZSgpOm5dLGEucHVzaChuKSx0fHxjKCkpLHRoaXN9LGZpcmU6ZnVuY3Rpb24oKXtyZXR1cm4gbC5maXJlV2l0aCh0aGlzLGFyZ3VtZW50cyksdGhpc30sZmlyZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIXJ9fTtyZXR1cm4gbH0sU2UuZXh0ZW5kKHtEZWZlcnJlZDpmdW5jdGlvbihlKXt2YXIgdD1bWyJub3RpZnkiLCJwcm9ncmVzcyIsU2UuQ2FsbGJhY2tzKCJtZW1vcnkiKSxTZS5DYWxsYmFja3MoIm1lbW9yeSIpLDJdLFsicmVzb2x2ZSIsImRvbmUiLFNlLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMCwicmVzb2x2ZWQiXSxbInJlamVjdCIsImZhaWwiLFNlLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxTZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksMSwicmVqZWN0ZWQiXV0scj0icGVuZGluZyIsbz17c3RhdGU6ZnVuY3Rpb24oKXtyZXR1cm4gcn0sYWx3YXlzOmZ1bmN0aW9uKCl7cmV0dXJuIGkuZG9uZShhcmd1bWVudHMpLmZhaWwoYXJndW1lbnRzKSx0aGlzfSxjYXRjaDpmdW5jdGlvbihlKXtyZXR1cm4gby50aGVuKG51bGwsZSl9LHBpcGU6ZnVuY3Rpb24oKXt2YXIgZT1hcmd1bWVudHM7cmV0dXJuIFNlLkRlZmVycmVkKGZ1bmN0aW9uKG4pe1NlLmVhY2godCxmdW5jdGlvbih0LHIpe3ZhciBvPUNlKGVbcls0XV0pJiZlW3JbNF1dO2lbclsxXV0oZnVuY3Rpb24oKXt2YXIgZT1vJiZvLmFwcGx5KHRoaXMsYXJndW1lbnRzKTtlJiZDZShlLnByb21pc2UpP2UucHJvbWlzZSgpLnByb2dyZXNzKG4ubm90aWZ5KS5kb25lKG4ucmVzb2x2ZSkuZmFpbChuLnJlamVjdCk6bltyWzBdKyJXaXRoIl0odGhpcyxvP1tlXTphcmd1bWVudHMpfSl9KSxlPW51bGx9KS5wcm9taXNlKCl9LHRoZW46ZnVuY3Rpb24oZSxyLG8pe2Z1bmN0aW9uIGkoZSx0LHIsbyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHM9dGhpcyx1PWFyZ3VtZW50cyxjPWZ1bmN0aW9uKCl7dmFyIG4sYztpZighKGU8YSkpe2lmKChuPXIuYXBwbHkocyx1KSk9PT10LnByb21pc2UoKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJUaGVuYWJsZSBzZWxmLXJlc29sdXRpb24iKTtjPW4mJigib2JqZWN0Ij09dHlwZW9mIG58fCJmdW5jdGlvbiI9PXR5cGVvZiBuKSYmbi50aGVuLENlKGMpP28/Yy5jYWxsKG4saShhLHQsZCxvKSxpKGEsdCxoLG8pKTooYSsrLGMuY2FsbChuLGkoYSx0LGQsbyksaShhLHQsaCxvKSxpKGEsdCxkLHQubm90aWZ5V2l0aCkpKToociE9PWQmJihzPXZvaWQgMCx1PVtuXSksKG98fHQucmVzb2x2ZVdpdGgpKHMsdSkpfX0sbD1vP2M6ZnVuY3Rpb24oKXt0cnl7YygpfWNhdGNoKG4pe1NlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2smJlNlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2sobixsLnN0YWNrVHJhY2UpLGUrMT49YSYmKHIhPT1oJiYocz12b2lkIDAsdT1bbl0pLHQucmVqZWN0V2l0aChzLHUpKX19O2U/bCgpOihTZS5EZWZlcnJlZC5nZXRTdGFja0hvb2smJihsLnN0YWNrVHJhY2U9U2UuRGVmZXJyZWQuZ2V0U3RhY2tIb29rKCkpLG4uc2V0VGltZW91dChsKSl9fXZhciBhPTA7cmV0dXJuIFNlLkRlZmVycmVkKGZ1bmN0aW9uKG4pe3RbMF1bM10uYWRkKGkoMCxuLENlKG8pP286ZCxuLm5vdGlmeVdpdGgpKSx0WzFdWzNdLmFkZChpKDAsbixDZShlKT9lOmQpKSx0WzJdWzNdLmFkZChpKDAsbixDZShyKT9yOmgpKX0pLnByb21pc2UoKX0scHJvbWlzZTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbCE9ZT9TZS5leHRlbmQoZSxvKTpvfX0saT17fTtyZXR1cm4gU2UuZWFjaCh0LGZ1bmN0aW9uKGUsbil7dmFyIGE9blsyXSxzPW5bNV07b1tuWzFdXT1hLmFkZCxzJiZhLmFkZChmdW5jdGlvbigpe3I9c30sdFszLWVdWzJdLmRpc2FibGUsdFszLWVdWzNdLmRpc2FibGUsdFswXVsyXS5sb2NrLHRbMF1bM10ubG9jayksYS5hZGQoblszXS5maXJlKSxpW25bMF1dPWZ1bmN0aW9uKCl7cmV0dXJuIGlbblswXSsiV2l0aCJdKHRoaXM9PT1pP3ZvaWQgMDp0aGlzLGFyZ3VtZW50cyksdGhpc30saVtuWzBdKyJXaXRoIl09YS5maXJlV2l0aH0pLG8ucHJvbWlzZShpKSxlJiZlLmNhbGwoaSxpKSxpfSx3aGVuOmZ1bmN0aW9uKGUpe3ZhciB0PWFyZ3VtZW50cy5sZW5ndGgsbj10LHI9QXJyYXkobiksbz1kZS5jYWxsKGFyZ3VtZW50cyksaT1TZS5EZWZlcnJlZCgpLGE9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JbZV09dGhpcyxvW2VdPWFyZ3VtZW50cy5sZW5ndGg+MT9kZS5jYWxsKGFyZ3VtZW50cyk6biwtLXR8fGkucmVzb2x2ZVdpdGgocixvKX19O2lmKHQ8PTEmJih2KGUsaS5kb25lKGEobikpLnJlc29sdmUsaS5yZWplY3QsIXQpLCJwZW5kaW5nIj09PWkuc3RhdGUoKXx8Q2Uob1tuXSYmb1tuXS50aGVuKSkpcmV0dXJuIGkudGhlbigpO2Zvcig7bi0tOyl2KG9bbl0sYShuKSxpLnJlamVjdCk7cmV0dXJuIGkucHJvbWlzZSgpfX0pO3ZhciBQZT0vXihFdmFsfEludGVybmFsfFJhbmdlfFJlZmVyZW5jZXxTeW50YXh8VHlwZXxVUkkpRXJyb3IkLztTZS5EZWZlcnJlZC5leGNlcHRpb25Ib29rPWZ1bmN0aW9uKGUsdCl7bi5jb25zb2xlJiZuLmNvbnNvbGUud2FybiYmZSYmUGUudGVzdChlLm5hbWUpJiZuLmNvbnNvbGUud2FybigialF1ZXJ5LkRlZmVycmVkIGV4Y2VwdGlvbjogIitlLm1lc3NhZ2UsZS5zdGFjayx0KX0sU2UucmVhZHlFeGNlcHRpb249ZnVuY3Rpb24oZSl7bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dGhyb3cgZX0pfTt2YXIgcWU9U2UuRGVmZXJyZWQoKTtTZS5mbi5yZWFkeT1mdW5jdGlvbihlKXtyZXR1cm4gcWUudGhlbihlKS5jYXRjaChmdW5jdGlvbihlKXtTZS5yZWFkeUV4Y2VwdGlvbihlKX0pLHRoaXN9LFNlLmV4dGVuZCh7aXNSZWFkeTohMSxyZWFkeVdhaXQ6MSxyZWFkeTpmdW5jdGlvbihlKXsoITA9PT1lPy0tU2UucmVhZHlXYWl0OlNlLmlzUmVhZHkpfHwoU2UuaXNSZWFkeT0hMCwhMCE9PWUmJi0tU2UucmVhZHlXYWl0PjB8fHFlLnJlc29sdmVXaXRoKGtlLFtTZV0pKX19KSxTZS5yZWFkeS50aGVuPXFlLnRoZW4sImNvbXBsZXRlIj09PWtlLnJlYWR5U3RhdGV8fCJsb2FkaW5nIiE9PWtlLnJlYWR5U3RhdGUmJiFrZS5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGw/bi5zZXRUaW1lb3V0KFNlLnJlYWR5KTooa2UuYWRkRXZlbnRMaXN0ZW5lcigiRE9NQ29udGVudExvYWRlZCIsbSksbi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixtKSk7dmFyIEhlPWZ1bmN0aW9uKGUsdCxuLHIsbyxpLGEpe3ZhciB1PTAsYz1lLmxlbmd0aCxsPW51bGw9PW47aWYoIm9iamVjdCI9PT1zKG4pKXtvPSEwO2Zvcih1IGluIG4pSGUoZSx0LHUsblt1XSwhMCxpLGEpfWVsc2UgaWYodm9pZCAwIT09ciYmKG89ITAsQ2Uocil8fChhPSEwKSxsJiYoYT8odC5jYWxsKGUsciksdD1udWxsKToobD10LHQ9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBsLmNhbGwoU2UoZSksbil9KSksdCkpZm9yKDt1PGM7dSsrKXQoZVt1XSxuLGE/cjpyLmNhbGwoZVt1XSx1LHQoZVt1XSxuKSkpO3JldHVybiBvP2U6bD90LmNhbGwoZSk6Yz90KGVbMF0sbik6aX0sRmU9L14tbXMtLyxCZT0vLShbYS16XSkvZyxVZT1mdW5jdGlvbihlKXtyZXR1cm4gMT09PWUubm9kZVR5cGV8fDk9PT1lLm5vZGVUeXBlfHwhK2Uubm9kZVR5cGV9O2IudWlkPTEsYi5wcm90b3R5cGU9e2NhY2hlOmZ1bmN0aW9uKGUpe3ZhciB0PWVbdGhpcy5leHBhbmRvXTtyZXR1cm4gdHx8KHQ9e30sVWUoZSkmJihlLm5vZGVUeXBlP2VbdGhpcy5leHBhbmRvXT10Ok9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHRoaXMuZXhwYW5kbyx7dmFsdWU6dCxjb25maWd1cmFibGU6ITB9KSkpLHR9LHNldDpmdW5jdGlvbihlLHQsbil7dmFyIHIsbz10aGlzLmNhY2hlKGUpO2lmKCJzdHJpbmciPT10eXBlb2YgdClvW2codCldPW47ZWxzZSBmb3IociBpbiB0KW9bZyhyKV09dFtyXTtyZXR1cm4gb30sZ2V0OmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/dGhpcy5jYWNoZShlKTplW3RoaXMuZXhwYW5kb10mJmVbdGhpcy5leHBhbmRvXVtnKHQpXX0sYWNjZXNzOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdm9pZCAwPT09dHx8dCYmInN0cmluZyI9PXR5cGVvZiB0JiZ2b2lkIDA9PT1uP3RoaXMuZ2V0KGUsdCk6KHRoaXMuc2V0KGUsdCxuKSx2b2lkIDAhPT1uP246dCl9LHJlbW92ZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9ZVt0aGlzLmV4cGFuZG9dO2lmKHZvaWQgMCE9PXIpe2lmKHZvaWQgMCE9PXQpe0FycmF5LmlzQXJyYXkodCk/dD10Lm1hcChnKToodD1nKHQpLHQ9dCBpbiByP1t0XTp0Lm1hdGNoKEllKXx8W10pLG49dC5sZW5ndGg7Zm9yKDtuLS07KWRlbGV0ZSByW3Rbbl1dfSh2b2lkIDA9PT10fHxTZS5pc0VtcHR5T2JqZWN0KHIpKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXZvaWQgMDpkZWxldGUgZVt0aGlzLmV4cGFuZG9dKX19LGhhc0RhdGE6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB2b2lkIDAhPT10JiYhU2UuaXNFbXB0eU9iamVjdCh0KX19O3ZhciBXZT1uZXcgYix6ZT1uZXcgYixWZT0vXig/Olx7W1x3XFddKlx9fFxbW1x3XFddKlxdKSQvLFhlPS9bQS1aXS9nO1NlLmV4dGVuZCh7aGFzRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gemUuaGFzRGF0YShlKXx8V2UuaGFzRGF0YShlKX0sZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHplLmFjY2VzcyhlLHQsbil9LHJlbW92ZURhdGE6ZnVuY3Rpb24oZSx0KXt6ZS5yZW1vdmUoZSx0KX0sX2RhdGE6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBXZS5hY2Nlc3MoZSx0LG4pfSxfcmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1dlLnJlbW92ZShlLHQpfX0pLFNlLmZuLmV4dGVuZCh7ZGF0YTpmdW5jdGlvbihlLHQpe3ZhciBuLHIsbyxpPXRoaXNbMF0sYT1pJiZpLmF0dHJpYnV0ZXM7aWYodm9pZCAwPT09ZSl7aWYodGhpcy5sZW5ndGgmJihvPXplLmdldChpKSwxPT09aS5ub2RlVHlwZSYmIVdlLmdldChpLCJoYXNEYXRhQXR0cnMiKSkpe2ZvcihuPWEubGVuZ3RoO24tLTspYVtuXSYmKHI9YVtuXS5uYW1lLDA9PT1yLmluZGV4T2YoImRhdGEtIikmJihyPWcoci5zbGljZSg1KSksdyhpLHIsb1tyXSkpKTtXZS5zZXQoaSwiaGFzRGF0YUF0dHJzIiwhMCl9cmV0dXJuIG99cmV0dXJuIm9iamVjdCI9PXR5cGVvZiBlP3RoaXMuZWFjaChmdW5jdGlvbigpe3plLnNldCh0aGlzLGUpfSk6SGUodGhpcyxmdW5jdGlvbih0KXt2YXIgbjtpZihpJiZ2b2lkIDA9PT10KXtpZih2b2lkIDAhPT0obj16ZS5nZXQoaSxlKSkpcmV0dXJuIG47aWYodm9pZCAwIT09KG49dyhpLGUpKSlyZXR1cm4gbn1lbHNlIHRoaXMuZWFjaChmdW5jdGlvbigpe3plLnNldCh0aGlzLGUsdCl9KX0sbnVsbCx0LGFyZ3VtZW50cy5sZW5ndGg+MSxudWxsLCEwKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7emUucmVtb3ZlKHRoaXMsZSl9KX19KSxTZS5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcjtpZihlKXJldHVybiB0PSh0fHwiZngiKSsicXVldWUiLHI9V2UuZ2V0KGUsdCksbiYmKCFyfHxBcnJheS5pc0FycmF5KG4pP3I9V2UuYWNjZXNzKGUsdCxTZS5tYWtlQXJyYXkobikpOnIucHVzaChuKSkscnx8W119LGRlcXVldWU6ZnVuY3Rpb24oZSx0KXt0PXR8fCJmeCI7dmFyIG49U2UucXVldWUoZSx0KSxyPW4ubGVuZ3RoLG89bi5zaGlmdCgpLGk9U2UuX3F1ZXVlSG9va3MoZSx0KSxhPWZ1bmN0aW9uKCl7U2UuZGVxdWV1ZShlLHQpfTsiaW5wcm9ncmVzcyI9PT1vJiYobz1uLnNoaWZ0KCksci0tKSxvJiYoImZ4Ij09PXQmJm4udW5zaGlmdCgiaW5wcm9ncmVzcyIpLGRlbGV0ZSBpLnN0b3Asby5jYWxsKGUsYSxpKSksIXImJmkmJmkuZW1wdHkuZmlyZSgpfSxfcXVldWVIb29rczpmdW5jdGlvbihlLHQpe3ZhciBuPXQrInF1ZXVlSG9va3MiO3JldHVybiBXZS5nZXQoZSxuKXx8V2UuYWNjZXNzKGUsbix7ZW1wdHk6U2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLmFkZChmdW5jdGlvbigpe1dlLnJlbW92ZShlLFt0KyJxdWV1ZSIsbl0pfSl9KX19KSxTZS5mbi5leHRlbmQoe3F1ZXVlOmZ1bmN0aW9uKGUsdCl7dmFyIG49MjtyZXR1cm4ic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT0iZngiLG4tLSksYXJndW1lbnRzLmxlbmd0aDxuP1NlLnF1ZXVlKHRoaXNbMF0sZSk6dm9pZCAwPT09dD90aGlzOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciBuPVNlLnF1ZXVlKHRoaXMsZSx0KTtTZS5fcXVldWVIb29rcyh0aGlzLGUpLCJmeCI9PT1lJiYiaW5wcm9ncmVzcyIhPT1uWzBdJiZTZS5kZXF1ZXVlKHRoaXMsZSl9KX0sZGVxdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7U2UuZGVxdWV1ZSh0aGlzLGUpfSl9LGNsZWFyUXVldWU6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucXVldWUoZXx8ImZ4IixbXSl9LHByb21pc2U6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTEsbz1TZS5EZWZlcnJlZCgpLGk9dGhpcyxhPXRoaXMubGVuZ3RoLHM9ZnVuY3Rpb24oKXstLXJ8fG8ucmVzb2x2ZVdpdGgoaSxbaV0pfTtmb3IoInN0cmluZyIhPXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSxlPWV8fCJmeCI7YS0tOykobj1XZS5nZXQoaVthXSxlKyJxdWV1ZUhvb2tzIikpJiZuLmVtcHR5JiYocisrLG4uZW1wdHkuYWRkKHMpKTtyZXR1cm4gcygpLG8ucHJvbWlzZSh0KX19KTt2YXIgSmU9L1srLV0/KD86XGQqXC58KVxkKyg/OltlRV1bKy1dP1xkK3wpLy5zb3VyY2UsS2U9bmV3IFJlZ0V4cCgiXig/OihbKy1dKT18KSgiK0plKyIpKFthLXolXSopJCIsImkiKSxHZT1bIlRvcCIsIlJpZ2h0IiwiQm90dG9tIiwiTGVmdCJdLFllPWtlLmRvY3VtZW50RWxlbWVudCxRZT1mdW5jdGlvbihlKXtyZXR1cm4gU2UuY29udGFpbnMoZS5vd25lckRvY3VtZW50LGUpfSxaZT17Y29tcG9zZWQ6ITB9O1llLmdldFJvb3ROb2RlJiYoUWU9ZnVuY3Rpb24oZSl7cmV0dXJuIFNlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8ZS5nZXRSb290Tm9kZShaZSk9PT1lLm93bmVyRG9jdW1lbnR9KTt2YXIgZXQ9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10fHxlLCJub25lIj09PWUuc3R5bGUuZGlzcGxheXx8IiI9PT1lLnN0eWxlLmRpc3BsYXkmJlFlKGUpJiYibm9uZSI9PT1TZS5jc3MoZSwiZGlzcGxheSIpfSx0dD17fTtTZS5mbi5leHRlbmQoe3Nob3c6ZnVuY3Rpb24oKXtyZXR1cm4gVCh0aGlzLCEwKX0saGlkZTpmdW5jdGlvbigpe3JldHVybiBUKHRoaXMpfSx0b2dnbGU6ZnVuY3Rpb24oZSl7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgZT9lP3RoaXMuc2hvdygpOnRoaXMuaGlkZSgpOnRoaXMuZWFjaChmdW5jdGlvbigpe2V0KHRoaXMpP1NlKHRoaXMpLnNob3coKTpTZSh0aGlzKS5oaWRlKCl9KX19KTt2YXIgbnQ9L14oPzpjaGVja2JveHxyYWRpbykkL2kscnQ9LzwoW2Etel1bXlwvXDA+XHgyMFx0XHJcblxmXSopL2ksb3Q9L14kfF5tb2R1bGUkfFwvKD86amF2YXxlY21hKXNjcmlwdC9pOyFmdW5jdGlvbigpe3ZhciBlPWtlLmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSx0PWUuYXBwZW5kQ2hpbGQoa2UuY3JlYXRlRWxlbWVudCgiZGl2IikpLG49a2UuY3JlYXRlRWxlbWVudCgiaW5wdXQiKTtuLnNldEF0dHJpYnV0ZSgidHlwZSIsInJhZGlvIiksbi5zZXRBdHRyaWJ1dGUoImNoZWNrZWQiLCJjaGVja2VkIiksbi5zZXRBdHRyaWJ1dGUoIm5hbWUiLCJ0IiksdC5hcHBlbmRDaGlsZChuKSxfZS5jaGVja0Nsb25lPXQuY2xvbmVOb2RlKCEwKS5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5jaGVja2VkLHQuaW5uZXJIVE1MPSI8dGV4dGFyZWE+eDwvdGV4dGFyZWE+IixfZS5ub0Nsb25lQ2hlY2tlZD0hIXQuY2xvbmVOb2RlKCEwKS5sYXN0Q2hpbGQuZGVmYXVsdFZhbHVlLHQuaW5uZXJIVE1MPSI8b3B0aW9uPjwvb3B0aW9uPiIsX2Uub3B0aW9uPSEhdC5sYXN0Q2hpbGR9KCk7dmFyIGl0PXt0aGVhZDpbMSwiPHRhYmxlPiIsIjwvdGFibGU+Il0sY29sOlsyLCI8dGFibGU+PGNvbGdyb3VwPiIsIjwvY29sZ3JvdXA+PC90YWJsZT4iXSx0cjpbMiwiPHRhYmxlPjx0Ym9keT4iLCI8L3Rib2R5PjwvdGFibGU+Il0sdGQ6WzMsIjx0YWJsZT48dGJvZHk+PHRyPiIsIjwvdHI+PC90Ym9keT48L3RhYmxlPiJdLF9kZWZhdWx0OlswLCIiLCIiXX07aXQudGJvZHk9aXQudGZvb3Q9aXQuY29sZ3JvdXA9aXQuY2FwdGlvbj1pdC50aGVhZCxpdC50aD1pdC50ZCxfZS5vcHRpb258fChpdC5vcHRncm91cD1pdC5vcHRpb249WzEsIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz4iLCI8L3NlbGVjdD4iXSk7dmFyIGF0PS88fCYjP1x3KzsvLHN0PS9eKFteLl0qKSg/OlwuKC4rKXwpLztTZS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsZCxoLHYsbT1XZS5nZXQoZSk7aWYoVWUoZSkpZm9yKG4uaGFuZGxlciYmKGk9bixuPWkuaGFuZGxlcixvPWkuc2VsZWN0b3IpLG8mJlNlLmZpbmQubWF0Y2hlc1NlbGVjdG9yKFllLG8pLG4uZ3VpZHx8KG4uZ3VpZD1TZS5ndWlkKyspLCh1PW0uZXZlbnRzKXx8KHU9bS5ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSksKGE9bS5oYW5kbGUpfHwoYT1tLmhhbmRsZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09U2UmJlNlLmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT9TZS5ldmVudC5kaXNwYXRjaC5hcHBseShlLGFyZ3VtZW50cyk6dm9pZCAwfSksdD0odHx8IiIpLm1hdGNoKEllKXx8WyIiXSxjPXQubGVuZ3RoO2MtLTspcz1zdC5leGVjKHRbY10pfHxbXSxkPXY9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9U2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPVNlLmV2ZW50LnNwZWNpYWxbZF18fHt9LGw9U2UuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6dixkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJlNlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmguam9pbigiLiIpfSxpKSwocD11W2RdKXx8KHA9dVtkXT1bXSxwLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbChlLHIsaCxhKXx8ZS5hZGRFdmVudExpc3RlbmVyJiZlLmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKGUsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLFNlLmV2ZW50Lmdsb2JhbFtkXT0hMCl9LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsZCxoLHYsbT1XZS5oYXNEYXRhKGUpJiZXZS5nZXQoZSk7aWYobSYmKHU9bS5ldmVudHMpKXtmb3IodD0odHx8IiIpLm1hdGNoKEllKXx8WyIiXSxjPXQubGVuZ3RoO2MtLTspaWYocz1zdC5leGVjKHRbY10pfHxbXSxkPXY9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zm9yKGY9U2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxwPXVbZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPWk9cC5sZW5ndGg7aS0tOylsPXBbaV0sIW8mJnYhPT1sLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1sLmd1aWR8fHMmJiFzLnRlc3QobC5uYW1lc3BhY2UpfHxyJiZyIT09bC5zZWxlY3RvciYmKCIqKiIhPT1yfHwhbC5zZWxlY3Rvcil8fChwLnNwbGljZShpLDEpLGwuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsbCkpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCxtLmhhbmRsZSl8fFNlLnJlbW92ZUV2ZW50KGUsZCxtLmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlTZS5ldmVudC5yZW1vdmUoZSxkK3RbY10sbixyLCEwKTtTZS5pc0VtcHR5T2JqZWN0KHUpJiZXZS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saSxhLHM9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLHU9U2UuZXZlbnQuZml4KGUpLGM9KFdlLmdldCh0aGlzLCJldmVudHMiKXx8T2JqZWN0LmNyZWF0ZShudWxsKSlbdS50eXBlXXx8W10sbD1TZS5ldmVudC5zcGVjaWFsW3UudHlwZV18fHt9O2ZvcihzWzBdPXUsdD0xO3Q8YXJndW1lbnRzLmxlbmd0aDt0Kyspc1t0XT1hcmd1bWVudHNbdF07aWYodS5kZWxlZ2F0ZVRhcmdldD10aGlzLCFsLnByZURpc3BhdGNofHwhMSE9PWwucHJlRGlzcGF0Y2guY2FsbCh0aGlzLHUpKXtmb3IoYT1TZS5ldmVudC5oYW5kbGVycy5jYWxsKHRoaXMsdSxjKSx0PTA7KG89YVt0KytdKSYmIXUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKTspZm9yKHUuY3VycmVudFRhcmdldD1vLmVsZW0sbj0wOyhpPW8uaGFuZGxlcnNbbisrXSkmJiF1LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCk7KXUucm5hbWVzcGFjZSYmITEhPT1pLm5hbWVzcGFjZSYmIXUucm5hbWVzcGFjZS50ZXN0KGkubmFtZXNwYWNlKXx8KHUuaGFuZGxlT2JqPWksdS5kYXRhPWkuZGF0YSx2b2lkIDAhPT0ocj0oKFNlLmV2ZW50LnNwZWNpYWxbaS5vcmlnVHlwZV18fHt9KS5oYW5kbGV8fGkuaGFuZGxlcikuYXBwbHkoby5lbGVtLHMpKSYmITE9PT0odS5yZXN1bHQ9cikmJih1LnByZXZlbnREZWZhdWx0KCksdS5zdG9wUHJvcGFnYXRpb24oKSkpO3JldHVybiBsLnBvc3REaXNwYXRjaCYmbC5wb3N0RGlzcGF0Y2guY2FsbCh0aGlzLHUpLHUucmVzdWx0fX0saGFuZGxlcnM6ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG8saSxhLHM9W10sdT10LmRlbGVnYXRlQ291bnQsYz1lLnRhcmdldDtpZih1JiZjLm5vZGVUeXBlJiYhKCJjbGljayI9PT1lLnR5cGUmJmUuYnV0dG9uPj0xKSlmb3IoO2MhPT10aGlzO2M9Yy5wYXJlbnROb2RlfHx0aGlzKWlmKDE9PT1jLm5vZGVUeXBlJiYoImNsaWNrIiE9PWUudHlwZXx8ITAhPT1jLmRpc2FibGVkKSl7Zm9yKGk9W10sYT17fSxuPTA7bjx1O24rKylyPXRbbl0sbz1yLnNlbGVjdG9yKyIgIix2b2lkIDA9PT1hW29dJiYoYVtvXT1yLm5lZWRzQ29udGV4dD9TZShvLHRoaXMpLmluZGV4KGMpPi0xOlNlLmZpbmQobyx0aGlzLG51bGwsW2NdKS5sZW5ndGgpLGFbb10mJmkucHVzaChyKTtpLmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6aX0pfXJldHVybiBjPXRoaXMsdTx0Lmxlbmd0aCYmcy5wdXNoKHtlbGVtOmMsaGFuZGxlcnM6dC5zbGljZSh1KX0pLHN9LGFkZFByb3A6ZnVuY3Rpb24oZSx0KXtPYmplY3QuZGVmaW5lUHJvcGVydHkoU2UuRXZlbnQucHJvdG90eXBlLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpDZSh0KT9mdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdCh0aGlzLm9yaWdpbmFsRXZlbnQpfTpmdW5jdGlvbigpe2lmKHRoaXMub3JpZ2luYWxFdmVudClyZXR1cm4gdGhpcy5vcmlnaW5hbEV2ZW50W2VdfSxzZXQ6ZnVuY3Rpb24odCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsZSx7ZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITAsd3JpdGFibGU6ITAsdmFsdWU6dH0pfX0pfSxmaXg6ZnVuY3Rpb24oZSl7cmV0dXJuIGVbU2UuZXhwYW5kb10/ZTpuZXcgU2UuRXZlbnQoZSl9LHNwZWNpYWw6e2xvYWQ6e25vQnViYmxlOiEwfSxjbGljazp7c2V0dXA6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc3x8ZTtyZXR1cm4gbnQudGVzdCh0LnR5cGUpJiZ0LmNsaWNrJiZjKHQsImlucHV0IikmJkQodCwiY2xpY2siLCQpLCExfSx0cmlnZ2VyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXN8fGU7cmV0dXJuIG50LnRlc3QodC50eXBlKSYmdC5jbGljayYmYyh0LCJpbnB1dCIpJiZEKHQsImNsaWNrIiksITB9LF9kZWZhdWx0OmZ1bmN0aW9uKGUpe3ZhciB0PWUudGFyZ2V0O3JldHVybiBudC50ZXN0KHQudHlwZSkmJnQuY2xpY2smJmModCwiaW5wdXQiKSYmV2UuZ2V0KHQsImNsaWNrIil8fGModCwiYSIpfX0sYmVmb3JldW5sb2FkOntwb3N0RGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dm9pZCAwIT09ZS5yZXN1bHQmJmUub3JpZ2luYWxFdmVudCYmKGUub3JpZ2luYWxFdmVudC5yZXR1cm5WYWx1ZT1lLnJlc3VsdCl9fX19LFNlLnJlbW92ZUV2ZW50PWZ1bmN0aW9uKGUsdCxuKXtlLnJlbW92ZUV2ZW50TGlzdGVuZXImJmUucmVtb3ZlRXZlbnRMaXN0ZW5lcih0LG4pfSxTZS5FdmVudD1mdW5jdGlvbihlLHQpe2lmKCEodGhpcyBpbnN0YW5jZW9mIFNlLkV2ZW50KSlyZXR1cm4gbmV3IFNlLkV2ZW50KGUsdCk7ZSYmZS50eXBlPyh0aGlzLm9yaWdpbmFsRXZlbnQ9ZSx0aGlzLnR5cGU9ZS50eXBlLHRoaXMuaXNEZWZhdWx0UHJldmVudGVkPWUuZGVmYXVsdFByZXZlbnRlZHx8dm9pZCAwPT09ZS5kZWZhdWx0UHJldmVudGVkJiYhMT09PWUucmV0dXJuVmFsdWU/JDpFLHRoaXMudGFyZ2V0PWUudGFyZ2V0JiYzPT09ZS50YXJnZXQubm9kZVR5cGU/ZS50YXJnZXQucGFyZW50Tm9kZTplLnRhcmdldCx0aGlzLmN1cnJlbnRUYXJnZXQ9ZS5jdXJyZW50VGFyZ2V0LHRoaXMucmVsYXRlZFRhcmdldD1lLnJlbGF0ZWRUYXJnZXQpOnRoaXMudHlwZT1lLHQmJlNlLmV4dGVuZCh0aGlzLHQpLHRoaXMudGltZVN0YW1wPWUmJmUudGltZVN0YW1wfHxEYXRlLm5vdygpLHRoaXNbU2UuZXhwYW5kb109ITB9LFNlLkV2ZW50LnByb3RvdHlwZT17Y29uc3RydWN0b3I6U2UuRXZlbnQsaXNEZWZhdWx0UHJldmVudGVkOkUsaXNQcm9wYWdhdGlvblN0b3BwZWQ6RSxpc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZDpFLGlzU2ltdWxhdGVkOiExLHByZXZlbnREZWZhdWx0OmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNEZWZhdWx0UHJldmVudGVkPSQsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUucHJldmVudERlZmF1bHQoKX0sc3RvcFByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNQcm9wYWdhdGlvblN0b3BwZWQ9JCxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wUHJvcGFnYXRpb24oKX0sc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5vcmlnaW5hbEV2ZW50O3RoaXMuaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ9JCxlJiYhdGhpcy5pc1NpbXVsYXRlZCYmZS5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSx0aGlzLnN0b3BQcm9wYWdhdGlvbigpfX0sU2UuZWFjaCh7YWx0S2V5OiEwLGJ1YmJsZXM6ITAsY2FuY2VsYWJsZTohMCxjaGFuZ2VkVG91Y2hlczohMCxjdHJsS2V5OiEwLGRldGFpbDohMCxldmVudFBoYXNlOiEwLG1ldGFLZXk6ITAscGFnZVg6ITAscGFnZVk6ITAsc2hpZnRLZXk6ITAsdmlldzohMCxjaGFyOiEwLGNvZGU6ITAsY2hhckNvZGU6ITAsa2V5OiEwLGtleUNvZGU6ITAsYnV0dG9uOiEwLGJ1dHRvbnM6ITAsY2xpZW50WDohMCxjbGllbnRZOiEwLG9mZnNldFg6ITAsb2Zmc2V0WTohMCxwb2ludGVySWQ6ITAscG9pbnRlclR5cGU6ITAsc2NyZWVuWDohMCxzY3JlZW5ZOiEwLHRhcmdldFRvdWNoZXM6ITAsdG9FbGVtZW50OiEwLHRvdWNoZXM6ITAsd2hpY2g6ITB9LFNlLmV2ZW50LmFkZFByb3ApLFNlLmVhY2goe2ZvY3VzOiJmb2N1c2luIixibHVyOiJmb2N1c291dCJ9LGZ1bmN0aW9uKGUsdCl7U2UuZXZlbnQuc3BlY2lhbFtlXT17c2V0dXA6ZnVuY3Rpb24oKXtyZXR1cm4gRCh0aGlzLGUsTyksITF9LHRyaWdnZXI6ZnVuY3Rpb24oKXtyZXR1cm4gRCh0aGlzLGUpLCEwfSxfZGVmYXVsdDpmdW5jdGlvbigpe3JldHVybiEwfSxkZWxlZ2F0ZVR5cGU6dH19KSxTZS5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe1NlLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxvPWUucmVsYXRlZFRhcmdldCxpPWUuaGFuZGxlT2JqO3JldHVybiBvJiYobz09PXJ8fFNlLmNvbnRhaW5zKHIsbykpfHwoZS50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSxTZS5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBOKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gTih0aGlzLGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gcj1lLmhhbmRsZU9iaixTZShlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihvIGluIGUpdGhpcy5vZmYobyx0LGVbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49RSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7U2UuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIHV0PS88c2NyaXB0fDxzdHlsZXw8bGluay9pLGN0PS9jaGVja2VkXHMqKD86W149XXw9XHMqLmNoZWNrZWQuKS9pLGx0PS9eXHMqPCEoPzpcW0NEQVRBXFt8LS0pfCg/OlxdXF18LS0pPlxzKiQvZztTZS5leHRlbmQoe2h0bWxQcmVmaWx0ZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LGNsb25lOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGksYSxzPWUuY2xvbmVOb2RlKCEwKSx1PVFlKGUpO2lmKCEoX2Uubm9DbG9uZUNoZWNrZWR8fDEhPT1lLm5vZGVUeXBlJiYxMSE9PWUubm9kZVR5cGV8fFNlLmlzWE1MRG9jKGUpKSlmb3IoYT1rKHMpLGk9ayhlKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKVAoaVtyXSxhW3JdKTtpZih0KWlmKG4pZm9yKGk9aXx8ayhlKSxhPWF8fGsocykscj0wLG89aS5sZW5ndGg7cjxvO3IrKylJKGlbcl0sYVtyXSk7ZWxzZSBJKGUscyk7cmV0dXJuIGE9ayhzLCJzY3JpcHQiKSxhLmxlbmd0aD4wJiZBKGEsIXUmJmsoZSwic2NyaXB0IikpLHN9LGNsZWFuRGF0YTpmdW5jdGlvbihlKXtmb3IodmFyIHQsbixyLG89U2UuZXZlbnQuc3BlY2lhbCxpPTA7dm9pZCAwIT09KG49ZVtpXSk7aSsrKWlmKFVlKG4pKXtpZih0PW5bV2UuZXhwYW5kb10pe2lmKHQuZXZlbnRzKWZvcihyIGluIHQuZXZlbnRzKW9bcl0/U2UuZXZlbnQucmVtb3ZlKG4scik6U2UucmVtb3ZlRXZlbnQobixyLHQuaGFuZGxlKTtuW1dlLmV4cGFuZG9dPXZvaWQgMH1uW3plLmV4cGFuZG9dJiYoblt6ZS5leHBhbmRvXT12b2lkIDApfX19KSxTZS5mbi5leHRlbmQoe2RldGFjaDpmdW5jdGlvbihlKXtyZXR1cm4gSCh0aGlzLGUsITApfSxyZW1vdmU6ZnVuY3Rpb24oZSl7cmV0dXJuIEgodGhpcyxlKX0sdGV4dDpmdW5jdGlvbihlKXtyZXR1cm4gSGUodGhpcyxmdW5jdGlvbihlKXtyZXR1cm4gdm9pZCAwPT09ZT9TZS50ZXh0KHRoaXMpOnRoaXMuZW1wdHkoKS5lYWNoKGZ1bmN0aW9uKCl7MSE9PXRoaXMubm9kZVR5cGUmJjExIT09dGhpcy5ub2RlVHlwZSYmOSE9PXRoaXMubm9kZVR5cGV8fCh0aGlzLnRleHRDb250ZW50PWUpfSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0sYXBwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIHEodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe0wodGhpcyxlKS5hcHBlbmRDaGlsZChlKX19KX0scHJlcGVuZDpmdW5jdGlvbigpe3JldHVybiBxKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe2lmKDE9PT10aGlzLm5vZGVUeXBlfHwxMT09PXRoaXMubm9kZVR5cGV8fDk9PT10aGlzLm5vZGVUeXBlKXt2YXIgdD1MKHRoaXMsZSk7dC5pbnNlcnRCZWZvcmUoZSx0LmZpcnN0Q2hpbGQpfX0pfSxiZWZvcmU6ZnVuY3Rpb24oKXtyZXR1cm4gcSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXt0aGlzLnBhcmVudE5vZGUmJnRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoZSx0aGlzKX0pfSxhZnRlcjpmdW5jdGlvbigpe3JldHVybiBxKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMubmV4dFNpYmxpbmcpfSl9LGVtcHR5OmZ1bmN0aW9uKCl7Zm9yKHZhciBlLHQ9MDtudWxsIT0oZT10aGlzW3RdKTt0KyspMT09PWUubm9kZVR5cGUmJihTZS5jbGVhbkRhdGEoayhlLCExKSksZS50ZXh0Q29udGVudD0iIik7cmV0dXJuIHRoaXN9LGNsb25lOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIGU9bnVsbCE9ZSYmZSx0PW51bGw9PXQ/ZTp0LHRoaXMubWFwKGZ1bmN0aW9uKCl7cmV0dXJuIFNlLmNsb25lKHRoaXMsZSx0KX0pfSxodG1sOmZ1bmN0aW9uKGUpe3JldHVybiBIZSh0aGlzLGZ1bmN0aW9uKGUpe3ZhciB0PXRoaXNbMF18fHt9LG49MCxyPXRoaXMubGVuZ3RoO2lmKHZvaWQgMD09PWUmJjE9PT10Lm5vZGVUeXBlKXJldHVybiB0LmlubmVySFRNTDtpZigic3RyaW5nIj09dHlwZW9mIGUmJiF1dC50ZXN0KGUpJiYhaXRbKHJ0LmV4ZWMoZSl8fFsiIiwiIl0pWzFdLnRvTG93ZXJDYXNlKCldKXtlPVNlLmh0bWxQcmVmaWx0ZXIoZSk7dHJ5e2Zvcig7bjxyO24rKyl0PXRoaXNbbl18fHt9LDE9PT10Lm5vZGVUeXBlJiYoU2UuY2xlYW5EYXRhKGsodCwhMSkpLHQuaW5uZXJIVE1MPWUpO3Q9MH1jYXRjaChlKXt9fXQmJnRoaXMuZW1wdHkoKS5hcHBlbmQoZSl9LG51bGwsZSxhcmd1bWVudHMubGVuZ3RoKX0scmVwbGFjZVdpdGg6ZnVuY3Rpb24oKXt2YXIgZT1bXTtyZXR1cm4gcSh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbih0KXt2YXIgbj10aGlzLnBhcmVudE5vZGU7U2UuaW5BcnJheSh0aGlzLGUpPDAmJihTZS5jbGVhbkRhdGEoayh0aGlzKSksbiYmbi5yZXBsYWNlQ2hpbGQodCx0aGlzKSl9LGUpfX0pLFNlLmVhY2goe2FwcGVuZFRvOiJhcHBlbmQiLHByZXBlbmRUbzoicHJlcGVuZCIsaW5zZXJ0QmVmb3JlOiJiZWZvcmUiLGluc2VydEFmdGVyOiJhZnRlciIscmVwbGFjZUFsbDoicmVwbGFjZVdpdGgifSxmdW5jdGlvbihlLHQpe1NlLmZuW2VdPWZ1bmN0aW9uKGUpe2Zvcih2YXIgbixyPVtdLG89U2UoZSksaT1vLmxlbmd0aC0xLGE9MDthPD1pO2ErKyluPWE9PT1pP3RoaXM6dGhpcy5jbG9uZSghMCksU2Uob1thXSlbdF0obiksdmUuYXBwbHkocixuLmdldCgpKTtyZXR1cm4gdGhpcy5wdXNoU3RhY2socil9fSk7dmFyIGZ0PW5ldyBSZWdFeHAoIl4oIitKZSsiKSg/IXB4KVthLXolXSskIiwiaSIpLHB0PWZ1bmN0aW9uKGUpe3ZhciB0PWUub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztyZXR1cm4gdCYmdC5vcGVuZXJ8fCh0PW4pLHQuZ2V0Q29tcHV0ZWRTdHlsZShlKX0sZHQ9ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saT17fTtmb3IobyBpbiB0KWlbb109ZS5zdHlsZVtvXSxlLnN0eWxlW29dPXRbb107cj1uLmNhbGwoZSk7Zm9yKG8gaW4gdCllLnN0eWxlW29dPWlbb107cmV0dXJuIHJ9LGh0PW5ldyBSZWdFeHAoR2Uuam9pbigifCIpLCJpIik7IWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe2lmKGwpe2Muc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDt3aWR0aDo2MHB4O21hcmdpbi10b3A6MXB4O3BhZGRpbmc6MDtib3JkZXI6MCIsbC5zdHlsZS5jc3NUZXh0PSJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO2JveC1zaXppbmc6Ym9yZGVyLWJveDtvdmVyZmxvdzpzY3JvbGw7bWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDt3aWR0aDo2MCU7dG9wOjElIixZZS5hcHBlbmRDaGlsZChjKS5hcHBlbmRDaGlsZChsKTt2YXIgZT1uLmdldENvbXB1dGVkU3R5bGUobCk7cj0iMSUiIT09ZS50b3AsdT0xMj09PXQoZS5tYXJnaW5MZWZ0KSxsLnN0eWxlLnJpZ2h0PSI2MCUiLGE9MzY9PT10KGUucmlnaHQpLG89MzY9PT10KGUud2lkdGgpLGwuc3R5bGUucG9zaXRpb249ImFic29sdXRlIixpPTEyPT09dChsLm9mZnNldFdpZHRoLzMpLFllLnJlbW92ZUNoaWxkKGMpLGw9bnVsbH19ZnVuY3Rpb24gdChlKXtyZXR1cm4gTWF0aC5yb3VuZChwYXJzZUZsb2F0KGUpKX12YXIgcixvLGksYSxzLHUsYz1rZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxsPWtlLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2wuc3R5bGUmJihsLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsbC5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLF9lLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09bC5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxTZS5leHRlbmQoX2Use2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksYX0scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSx1fSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfSxyZWxpYWJsZVRyRGltZW5zaW9uczpmdW5jdGlvbigpe3ZhciBlLHQscixvO3JldHVybiBudWxsPT1zJiYoZT1rZS5jcmVhdGVFbGVtZW50KCJ0YWJsZSIpLHQ9a2UuY3JlYXRlRWxlbWVudCgidHIiKSxyPWtlLmNyZWF0ZUVsZW1lbnQoImRpdiIpLGUuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246YWJzb2x1dGU7bGVmdDotMTExMTFweDtib3JkZXItY29sbGFwc2U6c2VwYXJhdGUiLHQuc3R5bGUuY3NzVGV4dD0iYm9yZGVyOjFweCBzb2xpZCIsdC5zdHlsZS5oZWlnaHQ9IjFweCIsci5zdHlsZS5oZWlnaHQ9IjlweCIsci5zdHlsZS5kaXNwbGF5PSJibG9jayIsWWUuYXBwZW5kQ2hpbGQoZSkuYXBwZW5kQ2hpbGQodCkuYXBwZW5kQ2hpbGQociksbz1uLmdldENvbXB1dGVkU3R5bGUodCkscz1wYXJzZUludChvLmhlaWdodCwxMCkrcGFyc2VJbnQoby5ib3JkZXJUb3BXaWR0aCwxMCkrcGFyc2VJbnQoby5ib3JkZXJCb3R0b21XaWR0aCwxMCk9PT10Lm9mZnNldEhlaWdodCxZZS5yZW1vdmVDaGlsZChlKSksc319KSl9KCk7dmFyIHZ0PVsiV2Via2l0IiwiTW96IiwibXMiXSxtdD1rZS5jcmVhdGVFbGVtZW50KCJkaXYiKS5zdHlsZSx5dD17fSxndD0vXihub25lfHRhYmxlKD8hLWNbZWFdKS4rKS8sYnQ9L14tLS8seHQ9e3Bvc2l0aW9uOiJhYnNvbHV0ZSIsdmlzaWJpbGl0eToiaGlkZGVuIixkaXNwbGF5OiJibG9jayJ9LHd0PXtsZXR0ZXJTcGFjaW5nOiIwIixmb250V2VpZ2h0OiI0MDAifTtTZS5leHRlbmQoe2Nzc0hvb2tzOntvcGFjaXR5OntnZXQ6ZnVuY3Rpb24oZSx0KXtpZih0KXt2YXIgbj1GKGUsIm9wYWNpdHkiKTtyZXR1cm4iIj09PW4/IjEiOm59fX19LGNzc051bWJlcjp7YW5pbWF0aW9uSXRlcmF0aW9uQ291bnQ6ITAsY29sdW1uQ291bnQ6ITAsZmlsbE9wYWNpdHk6ITAsZmxleEdyb3c6ITAsZmxleFNocmluazohMCxmb250V2VpZ2h0OiEwLGdyaWRBcmVhOiEwLGdyaWRDb2x1bW46ITAsZ3JpZENvbHVtbkVuZDohMCxncmlkQ29sdW1uU3RhcnQ6ITAsZ3JpZFJvdzohMCxncmlkUm93RW5kOiEwLGdyaWRSb3dTdGFydDohMCxsaW5lSGVpZ2h0OiEwLG9wYWNpdHk6ITAsb3JkZXI6ITAsb3JwaGFuczohMCx3aWRvd3M6ITAsekluZGV4OiEwLHpvb206ITB9LGNzc1Byb3BzOnt9LHN0eWxlOmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUmJjMhPT1lLm5vZGVUeXBlJiY4IT09ZS5ub2RlVHlwZSYmZS5zdHlsZSl7dmFyIG8saSxhLHM9Zyh0KSx1PWJ0LnRlc3QodCksYz1lLnN0eWxlO2lmKHV8fCh0PVcocykpLGE9U2UuY3NzSG9va3NbdF18fFNlLmNzc0hvb2tzW3NdLHZvaWQgMD09PW4pcmV0dXJuIGEmJiJnZXQiaW4gYSYmdm9pZCAwIT09KG89YS5nZXQoZSwhMSxyKSk/bzpjW3RdO2k9dHlwZW9mIG4sInN0cmluZyI9PT1pJiYobz1LZS5leGVjKG4pKSYmb1sxXSYmKG49XyhlLHQsbyksaT0ibnVtYmVyIiksbnVsbCE9biYmbj09PW4mJigibnVtYmVyIiE9PWl8fHV8fChuKz1vJiZvWzNdfHwoU2UuY3NzTnVtYmVyW3NdPyIiOiJweCIpKSxfZS5jbGVhckNsb25lU3R5bGV8fCIiIT09bnx8MCE9PXQuaW5kZXhPZigiYmFja2dyb3VuZCIpfHwoY1t0XT0iaW5oZXJpdCIpLGEmJiJzZXQiaW4gYSYmdm9pZCAwPT09KG49YS5zZXQoZSxuLHIpKXx8KHU/Yy5zZXRQcm9wZXJ0eSh0LG4pOmNbdF09bikpfX0sY3NzOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvLGksYSxzPWcodCk7cmV0dXJuIGJ0LnRlc3QodCl8fCh0PVcocykpLGE9U2UuY3NzSG9va3NbdF18fFNlLmNzc0hvb2tzW3NdLGEmJiJnZXQiaW4gYSYmKG89YS5nZXQoZSwhMCxuKSksdm9pZCAwPT09byYmKG89RihlLHQscikpLCJub3JtYWwiPT09byYmdCBpbiB3dCYmKG89d3RbdF0pLCIiPT09bnx8bj8oaT1wYXJzZUZsb2F0KG8pLCEwPT09bnx8aXNGaW5pdGUoaSk/aXx8MDpvKTpvfX0pLFNlLmVhY2goWyJoZWlnaHQiLCJ3aWR0aCJdLGZ1bmN0aW9uKGUsdCl7U2UuY3NzSG9va3NbdF09e2dldDpmdW5jdGlvbihlLG4scil7aWYobilyZXR1cm4hZ3QudGVzdChTZS5jc3MoZSwiZGlzcGxheSIpKXx8ZS5nZXRDbGllbnRSZWN0cygpLmxlbmd0aCYmZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS53aWR0aD9YKGUsdCxyKTpkdChlLHh0LGZ1bmN0aW9uKCl7cmV0dXJuIFgoZSx0LHIpfSl9LHNldDpmdW5jdGlvbihlLG4scil7dmFyIG8saT1wdChlKSxhPSFfZS5zY3JvbGxib3hTaXplKCkmJiJhYnNvbHV0ZSI9PT1pLnBvc2l0aW9uLHM9YXx8cix1PXMmJiJib3JkZXItYm94Ij09PVNlLmNzcyhlLCJib3hTaXppbmciLCExLGkpLGM9cj9WKGUsdCxyLHUsaSk6MDtyZXR1cm4gdSYmYSYmKGMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdF0pLVYoZSx0LCJib3JkZXIiLCExLGkpLS41KSksYyYmKG89S2UuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJihlLnN0eWxlW3RdPW4sbj1TZS5jc3MoZSx0KSkseihlLG4sYyl9fX0pLFNlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9QihfZS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KEYoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LWR0KGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxTZS5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXtTZS5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1tlK0dlW3JdK3RdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09ZSYmKFNlLmNzc0hvb2tzW2UrdF0uc2V0PXopfSksU2UuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gSGUodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1wdChlKSxvPXQubGVuZ3RoO2E8bzthKyspaVt0W2FdXT1TZS5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP1NlLnN0eWxlKGUsdCxuKTpTZS5jc3MoZSx0KX0sZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9fSksU2UuVHdlZW49SixKLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Sixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxTZS5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChTZS5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPUoucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOkoucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49Si5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9U2UuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpKLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LEoucHJvdG90eXBlLmluaXQucHJvdG90eXBlPUoucHJvdG90eXBlLEoucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9U2UuY3NzKGUuZWxlbSxlLnByb3AsIiIpLHQmJiJhdXRvIiE9PXQ/dDowKX0sc2V0OmZ1bmN0aW9uKGUpe1NlLmZ4LnN0ZXBbZS5wcm9wXT9TZS5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8IVNlLmNzc0hvb2tzW2UucHJvcF0mJm51bGw9PWUuZWxlbS5zdHlsZVtXKGUucHJvcCldP2UuZWxlbVtlLnByb3BdPWUubm93OlNlLnN0eWxlKGUuZWxlbSxlLnByb3AsZS5ub3crZS51bml0KX19fSxKLnByb3BIb29rcy5zY3JvbGxUb3A9Si5wcm9wSG9va3Muc2Nyb2xsTGVmdD17c2V0OmZ1bmN0aW9uKGUpe2UuZWxlbS5ub2RlVHlwZSYmZS5lbGVtLnBhcmVudE5vZGUmJihlLmVsZW1bZS5wcm9wXT1lLm5vdyl9fSxTZS5lYXNpbmc9e2xpbmVhcjpmdW5jdGlvbihlKXtyZXR1cm4gZX0sc3dpbmc6ZnVuY3Rpb24oZSl7cmV0dXJuLjUtTWF0aC5jb3MoZSpNYXRoLlBJKS8yfSxfZGVmYXVsdDoic3dpbmcifSxTZS5meD1KLnByb3RvdHlwZS5pbml0LFNlLmZ4LnN0ZXA9e307dmFyIF90LEN0LFR0PS9eKD86dG9nZ2xlfHNob3d8aGlkZSkkLyxrdD0vcXVldWVIb29rcyQvO1NlLkFuaW1hdGlvbj1TZS5leHRlbmQodGUse3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBfKG4uZWxlbSxlLEtlLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7Q2UoZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goSWUpO2Zvcih2YXIgbixyPTAsbz1lLmxlbmd0aDtyPG87cisrKW49ZVtyXSx0ZS50d2VlbmVyc1tuXT10ZS50d2VlbmVyc1tuXXx8W10sdGUudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbWl0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD90ZS5wcmVmaWx0ZXJzLnVuc2hpZnQoZSk6dGUucHJlZmlsdGVycy5wdXNoKGUpfX0pLFNlLnNwZWVkPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1lJiYib2JqZWN0Ij09dHlwZW9mIGU/U2UuZXh0ZW5kKHt9LGUpOntjb21wbGV0ZTpufHwhbiYmdHx8Q2UoZSkmJmUsZHVyYXRpb246ZSxlYXNpbmc6biYmdHx8dCYmIUNlKHQpJiZ0fTtyZXR1cm4gU2UuZngub2ZmP3IuZHVyYXRpb249MDoibnVtYmVyIiE9dHlwZW9mIHIuZHVyYXRpb24mJihyLmR1cmF0aW9uIGluIFNlLmZ4LnNwZWVkcz9yLmR1cmF0aW9uPVNlLmZ4LnNwZWVkc1tyLmR1cmF0aW9uXTpyLmR1cmF0aW9uPVNlLmZ4LnNwZWVkcy5fZGVmYXVsdCksbnVsbCE9ci5xdWV1ZSYmITAhPT1yLnF1ZXVlfHwoci5xdWV1ZT0iZngiKSxyLm9sZD1yLmNvbXBsZXRlLHIuY29tcGxldGU9ZnVuY3Rpb24oKXtDZShyLm9sZCkmJnIub2xkLmNhbGwodGhpcyksci5xdWV1ZSYmU2UuZGVxdWV1ZSh0aGlzLHIucXVldWUpfSxyfSxTZS5mbi5leHRlbmQoe2ZhZGVUbzpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gdGhpcy5maWx0ZXIoZXQpLmNzcygib3BhY2l0eSIsMCkuc2hvdygpLmVuZCgpLmFuaW1hdGUoe29wYWNpdHk6dH0sZSxuLHIpfSxhbmltYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3ZhciBvPVNlLmlzRW1wdHlPYmplY3QoZSksaT1TZS5zcGVlZCh0LG4sciksYT1mdW5jdGlvbigpe3ZhciB0PXRlKHRoaXMsU2UuZXh0ZW5kKHt9LGUpLGkpOyhvfHxXZS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxvfHwhMT09PWkucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoaS5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXZvaWQgMCksdCYmdGhpcy5xdWV1ZShlfHwiZngiLFtdKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD0hMCxvPW51bGwhPWUmJmUrInF1ZXVlSG9va3MiLGk9U2UudGltZXJzLGE9V2UuZ2V0KHRoaXMpO2lmKG8pYVtvXSYmYVtvXS5zdG9wJiZyKGFbb10pO2Vsc2UgZm9yKG8gaW4gYSlhW29dJiZhW29dLnN0b3AmJmt0LnRlc3QobykmJnIoYVtvXSk7Zm9yKG89aS5sZW5ndGg7by0tOylpW29dLmVsZW0hPT10aGlzfHxudWxsIT1lJiZpW29dLnF1ZXVlIT09ZXx8KGlbb10uYW5pbS5zdG9wKG4pLHQ9ITEsaS5zcGxpY2UobywxKSk7IXQmJm58fFNlLmRlcXVldWUodGhpcyxlKX0pfSxmaW5pc2g6ZnVuY3Rpb24oZSl7cmV0dXJuITEhPT1lJiYoZT1lfHwiZngiKSx0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdCxuPVdlLmdldCh0aGlzKSxyPW5bZSsicXVldWUiXSxvPW5bZSsicXVldWVIb29rcyJdLGk9U2UudGltZXJzLGE9cj9yLmxlbmd0aDowO2ZvcihuLmZpbmlzaD0hMCxTZS5xdWV1ZSh0aGlzLGUsW10pLG8mJm8uc3RvcCYmby5zdG9wLmNhbGwodGhpcywhMCksdD1pLmxlbmd0aDt0LS07KWlbdF0uZWxlbT09PXRoaXMmJmlbdF0ucXVldWU9PT1lJiYoaVt0XS5hbmltLnN0b3AoITApLGkuc3BsaWNlKHQsMSkpO2Zvcih0PTA7dDxhO3QrKylyW3RdJiZyW3RdLmZpbmlzaCYmclt0XS5maW5pc2guY2FsbCh0aGlzKTtkZWxldGUgbi5maW5pc2h9KX19KSxTZS5lYWNoKFsidG9nZ2xlIiwic2hvdyIsImhpZGUiXSxmdW5jdGlvbihlLHQpe3ZhciBuPVNlLmZuW3RdO1NlLmZuW3RdPWZ1bmN0aW9uKGUscixvKXtyZXR1cm4gbnVsbD09ZXx8ImJvb2xlYW4iPT10eXBlb2YgZT9uLmFwcGx5KHRoaXMsYXJndW1lbnRzKTp0aGlzLmFuaW1hdGUoWSh0LCEwKSxlLHIsbyl9fSksU2UuZWFjaCh7c2xpZGVEb3duOlkoInNob3ciKSxzbGlkZVVwOlkoImhpZGUiKSxzbGlkZVRvZ2dsZTpZKCJ0b2dnbGUiKSxmYWRlSW46e29wYWNpdHk6InNob3cifSxmYWRlT3V0OntvcGFjaXR5OiJoaWRlIn0sZmFkZVRvZ2dsZTp7b3BhY2l0eToidG9nZ2xlIn19LGZ1bmN0aW9uKGUsdCl7U2UuZm5bZV09ZnVuY3Rpb24oZSxuLHIpe3JldHVybiB0aGlzLmFuaW1hdGUodCxlLG4scil9fSksU2UudGltZXJzPVtdLFNlLmZ4LnRpY2s9ZnVuY3Rpb24oKXt2YXIgZSx0PTAsbj1TZS50aW1lcnM7Zm9yKF90PURhdGUubm93KCk7dDxuLmxlbmd0aDt0KyspKGU9blt0XSkoKXx8blt0XSE9PWV8fG4uc3BsaWNlKHQtLSwxKTtuLmxlbmd0aHx8U2UuZnguc3RvcCgpLF90PXZvaWQgMH0sU2UuZngudGltZXI9ZnVuY3Rpb24oZSl7U2UudGltZXJzLnB1c2goZSksU2UuZnguc3RhcnQoKX0sU2UuZnguaW50ZXJ2YWw9MTMsU2UuZnguc3RhcnQ9ZnVuY3Rpb24oKXtDdHx8KEN0PSEwLEsoKSl9LFNlLmZ4LnN0b3A9ZnVuY3Rpb24oKXtDdD1udWxsfSxTZS5meC5zcGVlZHM9e3Nsb3c6NjAwLGZhc3Q6MjAwLF9kZWZhdWx0OjQwMH0sU2UuZm4uZGVsYXk9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1TZS5meD9TZS5meC5zcGVlZHNbZV18fGU6ZSx0PXR8fCJmeCIsdGhpcy5xdWV1ZSh0LGZ1bmN0aW9uKHQscil7dmFyIG89bi5zZXRUaW1lb3V0KHQsZSk7ci5zdG9wPWZ1bmN0aW9uKCl7bi5jbGVhclRpbWVvdXQobyl9fSl9LGZ1bmN0aW9uKCl7dmFyIGU9a2UuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSx0PWtlLmNyZWF0ZUVsZW1lbnQoInNlbGVjdCIpLG49dC5hcHBlbmRDaGlsZChrZS5jcmVhdGVFbGVtZW50KCJvcHRpb24iKSk7ZS50eXBlPSJjaGVja2JveCIsX2UuY2hlY2tPbj0iIiE9PWUudmFsdWUsX2Uub3B0U2VsZWN0ZWQ9bi5zZWxlY3RlZCxlPWtlLmNyZWF0ZUVsZW1lbnQoImlucHV0IiksZS52YWx1ZT0idCIsZS50eXBlPSJyYWRpbyIsX2UucmFkaW9WYWx1ZT0idCI9PT1lLnZhbHVlfSgpO3ZhciBBdCxTdD1TZS5leHByLmF0dHJIYW5kbGU7U2UuZm4uZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhlKHRoaXMsU2UuYXR0cixlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlQXR0cjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7U2UucmVtb3ZlQXR0cih0aGlzLGUpfSl9fSksU2UuZXh0ZW5kKHthdHRyOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGk9ZS5ub2RlVHlwZTtpZigzIT09aSYmOCE9PWkmJjIhPT1pKXJldHVybiB2b2lkIDA9PT1lLmdldEF0dHJpYnV0ZT9TZS5wcm9wKGUsdCxuKTooMT09PWkmJlNlLmlzWE1MRG9jKGUpfHwobz1TZS5hdHRySG9va3NbdC50b0xvd2VyQ2FzZSgpXXx8KFNlLmV4cHIubWF0Y2guYm9vbC50ZXN0KHQpP0F0OnZvaWQgMCkpLHZvaWQgMCE9PW4/bnVsbD09PW4/dm9pZCBTZS5yZW1vdmVBdHRyKGUsdCk6byYmInNldCJpbiBvJiZ2b2lkIDAhPT0ocj1vLnNldChlLG4sdCkpP3I6KGUuc2V0QXR0cmlidXRlKHQsbisiIiksbik6byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQoZSx0KSk/cjoocj1TZS5maW5kLmF0dHIoZSx0KSxudWxsPT1yP3ZvaWQgMDpyKSl9LGF0dHJIb29rczp7dHlwZTp7c2V0OmZ1bmN0aW9uKGUsdCl7aWYoIV9lLnJhZGlvVmFsdWUmJiJyYWRpbyI9PT10JiZjKGUsImlucHV0Iikpe3ZhciBuPWUudmFsdWU7cmV0dXJuIGUuc2V0QXR0cmlidXRlKCJ0eXBlIix0KSxuJiYoZS52YWx1ZT1uKSx0fX19fSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLG89dCYmdC5tYXRjaChJZSk7aWYobyYmMT09PWUubm9kZVR5cGUpZm9yKDtuPW9bcisrXTspZS5yZW1vdmVBdHRyaWJ1dGUobil9fSksQXQ9e3NldDpmdW5jdGlvbihlLHQsbil7cmV0dXJuITE9PT10P1NlLnJlbW92ZUF0dHIoZSxuKTplLnNldEF0dHJpYnV0ZShuLG4pLG59fSxTZS5lYWNoKFNlLmV4cHIubWF0Y2guYm9vbC5zb3VyY2UubWF0Y2goL1x3Ky9nKSxmdW5jdGlvbihlLHQpe3ZhciBuPVN0W3RdfHxTZS5maW5kLmF0dHI7U3RbdF09ZnVuY3Rpb24oZSx0LHIpe3ZhciBvLGksYT10LnRvTG93ZXJDYXNlKCk7cmV0dXJuIHJ8fChpPVN0W2FdLFN0W2FdPW8sbz1udWxsIT1uKGUsdCxyKT9hOm51bGwsU3RbYV09aSksb319KTt2YXIgJHQ9L14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxFdD0vXig/OmF8YXJlYSkkL2k7U2UuZm4uZXh0ZW5kKHtwcm9wOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIEhlKHRoaXMsU2UucHJvcCxlLHQsYXJndW1lbnRzLmxlbmd0aD4xKX0scmVtb3ZlUHJvcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7ZGVsZXRlIHRoaXNbU2UucHJvcEZpeFtlXXx8ZV19KX19KSxTZS5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saT1lLm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIDE9PT1pJiZTZS5pc1hNTERvYyhlKXx8KHQ9U2UucHJvcEZpeFt0XXx8dCxvPVNlLnByb3BIb29rc1t0XSksdm9pZCAwIT09bj9vJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KGUsbix0KSk/cjplW3RdPW46byYmImdldCJpbiBvJiZudWxsIT09KHI9by5nZXQoZSx0KSk/cjplW3RdfSxwcm9wSG9va3M6e3RhYkluZGV4OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9U2UuZmluZC5hdHRyKGUsInRhYmluZGV4Iik7cmV0dXJuIHQ/cGFyc2VJbnQodCwxMCk6JHQudGVzdChlLm5vZGVOYW1lKXx8RXQudGVzdChlLm5vZGVOYW1lKSYmZS5ocmVmPzA6LTF9fX0scHJvcEZpeDp7Zm9yOiJodG1sRm9yIixjbGFzczoiY2xhc3NOYW1lIn19KSxfZS5vcHRTZWxlY3RlZHx8KFNlLnByb3BIb29rcy5zZWxlY3RlZD17Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCxudWxsfSxzZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3QmJih0LnNlbGVjdGVkSW5kZXgsdC5wYXJlbnROb2RlJiZ0LnBhcmVudE5vZGUuc2VsZWN0ZWRJbmRleCl9fSksU2UuZWFjaChbInRhYkluZGV4IiwicmVhZE9ubHkiLCJtYXhMZW5ndGgiLCJjZWxsU3BhY2luZyIsImNlbGxQYWRkaW5nIiwicm93U3BhbiIsImNvbFNwYW4iLCJ1c2VNYXAiLCJmcmFtZUJvcmRlciIsImNvbnRlbnRFZGl0YWJsZSJdLGZ1bmN0aW9uKCl7U2UucHJvcEZpeFt0aGlzLnRvTG93ZXJDYXNlKCldPXRoaXN9KSxTZS5mbi5leHRlbmQoe2FkZENsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGksYSxzLHU9MDtpZihDZShlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe1NlKHRoaXMpLmFkZENsYXNzKGUuY2FsbCh0aGlzLHQscmUodGhpcykpKX0pO2lmKHQ9b2UoZSksdC5sZW5ndGgpZm9yKDtuPXRoaXNbdSsrXTspaWYobz1yZShuKSxyPTE9PT1uLm5vZGVUeXBlJiYiICIrbmUobykrIiAiKXtmb3IoYT0wO2k9dFthKytdOylyLmluZGV4T2YoIiAiK2krIiAiKTwwJiYocis9aSsiICIpO3M9bmUociksbyE9PXMmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHJlbW92ZUNsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scixvLGksYSxzLHU9MDtpZihDZShlKSlyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKHQpe1NlKHRoaXMpLnJlbW92ZUNsYXNzKGUuY2FsbCh0aGlzLHQscmUodGhpcykpKX0pO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiB0aGlzLmF0dHIoImNsYXNzIiwiIik7aWYodD1vZShlKSx0Lmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXJlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIituZShvKSsiICIpe2ZvcihhPTA7aT10W2ErK107KWZvcig7ci5pbmRleE9mKCIgIitpKyIgIik+LTE7KXI9ci5yZXBsYWNlKCIgIitpKyIgIiwiICIpO3M9bmUociksbyE9PXMmJm4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyl9cmV0dXJuIHRoaXN9LHRvZ2dsZUNsYXNzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dHlwZW9mIGUscj0ic3RyaW5nIj09PW58fEFycmF5LmlzQXJyYXkoZSk7cmV0dXJuImJvb2xlYW4iPT10eXBlb2YgdCYmcj90P3RoaXMuYWRkQ2xhc3MoZSk6dGhpcy5yZW1vdmVDbGFzcyhlKTpDZShlKT90aGlzLmVhY2goZnVuY3Rpb24obil7U2UodGhpcykudG9nZ2xlQ2xhc3MoZS5jYWxsKHRoaXMsbixyZSh0aGlzKSx0KSx0KX0pOnRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG8saSxhO2lmKHIpZm9yKG89MCxpPVNlKHRoaXMpLGE9b2UoZSk7dD1hW28rK107KWkuaGFzQ2xhc3ModCk/aS5yZW1vdmVDbGFzcyh0KTppLmFkZENsYXNzKHQpO2Vsc2Ugdm9pZCAwIT09ZSYmImJvb2xlYW4iIT09bnx8KHQ9cmUodGhpcyksdCYmV2Uuc2V0KHRoaXMsIl9fY2xhc3NOYW1lX18iLHQpLHRoaXMuc2V0QXR0cmlidXRlJiZ0aGlzLnNldEF0dHJpYnV0ZSgiY2xhc3MiLHR8fCExPT09ZT8iIjpXZS5nZXQodGhpcywiX19jbGFzc05hbWVfXyIpfHwiIikpfSl9LGhhc0NsYXNzOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj0wO2Zvcih0PSIgIitlKyIgIjtuPXRoaXNbcisrXTspaWYoMT09PW4ubm9kZVR5cGUmJigiICIrbmUocmUobikpKyIgIikuaW5kZXhPZih0KT4tMSlyZXR1cm4hMDtyZXR1cm4hMX19KTt2YXIgT3Q9L1xyL2c7U2UuZm4uZXh0ZW5kKHt2YWw6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG89dGhpc1swXTt7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gcj1DZShlKSx0aGlzLmVhY2goZnVuY3Rpb24obil7dmFyIG87MT09PXRoaXMubm9kZVR5cGUmJihvPXI/ZS5jYWxsKHRoaXMsbixTZSh0aGlzKS52YWwoKSk6ZSxudWxsPT1vP289IiI6Im51bWJlciI9PXR5cGVvZiBvP28rPSIiOkFycmF5LmlzQXJyYXkobykmJihvPVNlLm1hcChvLGZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1lPyIiOmUrIiJ9KSksKHQ9U2UudmFsSG9va3NbdGhpcy50eXBlXXx8U2UudmFsSG9va3NbdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJzZXQiaW4gdCYmdm9pZCAwIT09dC5zZXQodGhpcyxvLCJ2YWx1ZSIpfHwodGhpcy52YWx1ZT1vKSl9KTtpZihvKXJldHVybih0PVNlLnZhbEhvb2tzW28udHlwZV18fFNlLnZhbEhvb2tzW28ubm9kZU5hbWUudG9Mb3dlckNhc2UoKV0pJiYiZ2V0ImluIHQmJnZvaWQgMCE9PShuPXQuZ2V0KG8sInZhbHVlIikpP246KG49by52YWx1ZSwic3RyaW5nIj09dHlwZW9mIG4/bi5yZXBsYWNlKE90LCIiKTpudWxsPT1uPyIiOm4pfX19KSxTZS5leHRlbmQoe3ZhbEhvb2tzOntvcHRpb246e2dldDpmdW5jdGlvbihlKXt2YXIgdD1TZS5maW5kLmF0dHIoZSwidmFsdWUiKTtyZXR1cm4gbnVsbCE9dD90Om5lKFNlLnRleHQoZSkpfX0sc2VsZWN0OntnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG89ZS5vcHRpb25zLGk9ZS5zZWxlY3RlZEluZGV4LGE9InNlbGVjdC1vbmUiPT09ZS50eXBlLHM9YT9udWxsOltdLHU9YT9pKzE6by5sZW5ndGg7Zm9yKHI9aTwwP3U6YT9pOjA7cjx1O3IrKylpZihuPW9bcl0sKG4uc2VsZWN0ZWR8fHI9PT1pKSYmIW4uZGlzYWJsZWQmJighbi5wYXJlbnROb2RlLmRpc2FibGVkfHwhYyhuLnBhcmVudE5vZGUsIm9wdGdyb3VwIikpKXtpZih0PVNlKG4pLnZhbCgpLGEpcmV0dXJuIHQ7cy5wdXNoKHQpfXJldHVybiBzfSxzZXQ6ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG4scixvPWUub3B0aW9ucyxpPVNlLm1ha2VBcnJheSh0KSxhPW8ubGVuZ3RoO2EtLTspcj1vW2FdLChyLnNlbGVjdGVkPVNlLmluQXJyYXkoU2UudmFsSG9va3Mub3B0aW9uLmdldChyKSxpKT4tMSkmJihuPSEwKTtyZXR1cm4gbnx8KGUuc2VsZWN0ZWRJbmRleD0tMSksaX19fX0pLFNlLmVhY2goWyJyYWRpbyIsImNoZWNrYm94Il0sZnVuY3Rpb24oKXtTZS52YWxIb29rc1t0aGlzXT17c2V0OmZ1bmN0aW9uKGUsdCl7aWYoQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gZS5jaGVja2VkPVNlLmluQXJyYXkoU2UoZSkudmFsKCksdCk+LTF9fSxfZS5jaGVja09ufHwoU2UudmFsSG9va3NbdGhpc10uZ2V0PWZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT09ZS5nZXRBdHRyaWJ1dGUoInZhbHVlIik/Im9uIjplLnZhbHVlfSl9KSxfZS5mb2N1c2luPSJvbmZvY3VzaW4iaW4gbjt2YXIganQ9L14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvLE50PWZ1bmN0aW9uKGUpe2Uuc3RvcFByb3BhZ2F0aW9uKCl9O1NlLmV4dGVuZChTZS5ldmVudCx7dHJpZ2dlcjpmdW5jdGlvbihlLHQscixvKXt2YXIgaSxhLHMsdSxjLGwsZixwLGQ9W3J8fGtlXSxoPWJlLmNhbGwoZSwidHlwZSIpP2UudHlwZTplLHY9YmUuY2FsbChlLCJuYW1lc3BhY2UiKT9lLm5hbWVzcGFjZS5zcGxpdCgiLiIpOltdO2lmKGE9cD1zPXI9cnx8a2UsMyE9PXIubm9kZVR5cGUmJjghPT1yLm5vZGVUeXBlJiYhanQudGVzdChoK1NlLmV2ZW50LnRyaWdnZXJlZCkmJihoLmluZGV4T2YoIi4iKT4tMSYmKHY9aC5zcGxpdCgiLiIpLGg9di5zaGlmdCgpLHYuc29ydCgpKSxjPWguaW5kZXhPZigiOiIpPDAmJiJvbiIraCxlPWVbU2UuZXhwYW5kb10/ZTpuZXcgU2UuRXZlbnQoaCwib2JqZWN0Ij09dHlwZW9mIGUmJmUpLGUuaXNUcmlnZ2VyPW8/MjozLGUubmFtZXNwYWNlPXYuam9pbigiLiIpLGUucm5hbWVzcGFjZT1lLm5hbWVzcGFjZT9uZXcgUmVnRXhwKCIoXnxcXC4pIit2LmpvaW4oIlxcLig/Oi4qXFwufCkiKSsiKFxcLnwkKSIpOm51bGwsZS5yZXN1bHQ9dm9pZCAwLGUudGFyZ2V0fHwoZS50YXJnZXQ9ciksdD1udWxsPT10P1tlXTpTZS5tYWtlQXJyYXkodCxbZV0pLGY9U2UuZXZlbnQuc3BlY2lhbFtoXXx8e30sb3x8IWYudHJpZ2dlcnx8ITEhPT1mLnRyaWdnZXIuYXBwbHkocix0KSkpe2lmKCFvJiYhZi5ub0J1YmJsZSYmIVRlKHIpKXtmb3IodT1mLmRlbGVnYXRlVHlwZXx8aCxqdC50ZXN0KHUraCl8fChhPWEucGFyZW50Tm9kZSk7YTthPWEucGFyZW50Tm9kZSlkLnB1c2goYSkscz1hO3M9PT0oci5vd25lckRvY3VtZW50fHxrZSkmJmQucHVzaChzLmRlZmF1bHRWaWV3fHxzLnBhcmVudFdpbmRvd3x8bil9Zm9yKGk9MDsoYT1kW2krK10pJiYhZS5pc1Byb3BhZ2F0aW9uU3RvcHBlZCgpOylwPWEsZS50eXBlPWk+MT91OmYuYmluZFR5cGV8fGgsbD0oV2UuZ2V0KGEsImV2ZW50cyIpfHxPYmplY3QuY3JlYXRlKG51bGwpKVtlLnR5cGVdJiZXZS5nZXQoYSwiaGFuZGxlIiksbCYmbC5hcHBseShhLHQpLChsPWMmJmFbY10pJiZsLmFwcGx5JiZVZShhKSYmKGUucmVzdWx0PWwuYXBwbHkoYSx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9aCxvfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLl9kZWZhdWx0JiYhMSE9PWYuX2RlZmF1bHQuYXBwbHkoZC5wb3AoKSx0KXx8IVVlKHIpfHxjJiZDZShyW2hdKSYmIVRlKHIpJiYocz1yW2NdLHMmJihyW2NdPW51bGwpLFNlLmV2ZW50LnRyaWdnZXJlZD1oLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmcC5hZGRFdmVudExpc3RlbmVyKGgsTnQpLHJbaF0oKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJnAucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLE50KSxTZS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHMmJihyW2NdPXMpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1TZS5leHRlbmQobmV3IFNlLkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO1NlLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLFNlLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtTZS5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4gU2UuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSksX2UuZm9jdXNpbnx8U2UuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtTZS5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LFNlLmV2ZW50LmZpeChlKSl9O1NlLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLG89V2UuYWNjZXNzKHIsdCk7b3x8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksV2UuYWNjZXNzKHIsdCwob3x8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLmRvY3VtZW50fHx0aGlzLG89V2UuYWNjZXNzKHIsdCktMTtvP1dlLmFjY2VzcyhyLHQsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLFdlLnJlbW92ZShyLHQpKX19fSk7dmFyIER0PW4ubG9jYXRpb24sTHQ9e2d1aWQ6RGF0ZS5ub3coKX0sUnQ9L1w/LztTZS5wYXJzZVhNTD1mdW5jdGlvbihlKXt2YXIgdCxyO2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7fXJldHVybiByPXQmJnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoInBhcnNlcmVycm9yIilbMF0sdCYmIXJ8fFNlLmVycm9yKCJJbnZhbGlkIFhNTDogIisocj9TZS5tYXAoci5jaGlsZE5vZGVzLGZ1bmN0aW9uKGUpe3JldHVybiBlLnRleHRDb250ZW50fSkuam9pbigiXG4iKTplKSksdH07dmFyIE10PS9cW1xdJC8sSXQ9L1xyP1xuL2csUHQ9L14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLHF0PS9eKD86aW5wdXR8c2VsZWN0fHRleHRhcmVhfGtleWdlbikvaTtTZS5wYXJhbT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10sbz1mdW5jdGlvbihlLHQpe3ZhciBuPUNlKHQpP3QoKTp0O3Jbci5sZW5ndGhdPWVuY29kZVVSSUNvbXBvbmVudChlKSsiPSIrZW5jb2RlVVJJQ29tcG9uZW50KG51bGw9PW4/IiI6bil9O2lmKG51bGw9PWUpcmV0dXJuIiI7aWYoQXJyYXkuaXNBcnJheShlKXx8ZS5qcXVlcnkmJiFTZS5pc1BsYWluT2JqZWN0KGUpKVNlLmVhY2goZSxmdW5jdGlvbigpe28odGhpcy5uYW1lLHRoaXMudmFsdWUpfSk7ZWxzZSBmb3IobiBpbiBlKWllKG4sZVtuXSx0LG8pO3JldHVybiByLmpvaW4oIiYiKX0sU2UuZm4uZXh0ZW5kKHtzZXJpYWxpemU6ZnVuY3Rpb24oKXtyZXR1cm4gU2UucGFyYW0odGhpcy5zZXJpYWxpemVBcnJheSgpKX0sc2VyaWFsaXplQXJyYXk6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24oKXt2YXIgZT1TZS5wcm9wKHRoaXMsImVsZW1lbnRzIik7cmV0dXJuIGU/U2UubWFrZUFycmF5KGUpOnRoaXN9KS5maWx0ZXIoZnVuY3Rpb24oKXt2YXIgZT10aGlzLnR5cGU7cmV0dXJuIHRoaXMubmFtZSYmIVNlKHRoaXMpLmlzKCI6ZGlzYWJsZWQiKSYmcXQudGVzdCh0aGlzLm5vZGVOYW1lKSYmIVB0LnRlc3QoZSkmJih0aGlzLmNoZWNrZWR8fCFudC50ZXN0KGUpKX0pLm1hcChmdW5jdGlvbihlLHQpe3ZhciBuPVNlKHRoaXMpLnZhbCgpO3JldHVybiBudWxsPT1uP251bGw6QXJyYXkuaXNBcnJheShuKT9TZS5tYXAobixmdW5jdGlvbihlKXtyZXR1cm57bmFtZTp0Lm5hbWUsdmFsdWU6ZS5yZXBsYWNlKEl0LCJcclxuIil9fSk6e25hbWU6dC5uYW1lLHZhbHVlOm4ucmVwbGFjZShJdCwiXHJcbiIpfX0pLmdldCgpfX0pO3ZhciBIdD0vJTIwL2csRnQ9LyMuKiQvLEJ0PS8oWz8mXSlfPVteJl0qLyxVdD0vXiguKj8pOlsgXHRdKihbXlxyXG5dKikkL2dtLFd0PS9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLHp0PS9eKD86R0VUfEhFQUQpJC8sVnQ9L15cL1wvLyxYdD17fSxKdD17fSxLdD0iKi8iLmNvbmNhdCgiKiIpLEd0PWtlLmNyZWF0ZUVsZW1lbnQoImEiKTtHdC5ocmVmPUR0LmhyZWYsU2UuZXh0ZW5kKHthY3RpdmU6MCxsYXN0TW9kaWZpZWQ6e30sZXRhZzp7fSxhamF4U2V0dGluZ3M6e3VybDpEdC5ocmVmLHR5cGU6IkdFVCIsaXNMb2NhbDpXdC50ZXN0KER0LnByb3RvY29sKSxnbG9iYWw6ITAscHJvY2Vzc0RhdGE6ITAsYXN5bmM6ITAsY29udGVudFR5cGU6ImFwcGxpY2F0aW9uL3gtd3d3LWZvcm0tdXJsZW5jb2RlZDsgY2hhcnNldD1VVEYtOCIsYWNjZXB0czp7IioiOkt0LHRleHQ6InRleHQvcGxhaW4iLGh0bWw6InRleHQvaHRtbCIseG1sOiJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sIixqc29uOiJhcHBsaWNhdGlvbi9qc29uLCB0ZXh0L2phdmFzY3JpcHQifSxjb250ZW50czp7eG1sOi9cYnhtbFxiLyxodG1sOi9cYmh0bWwvLGpzb246L1xianNvblxiL30scmVzcG9uc2VGaWVsZHM6e3htbDoicmVzcG9uc2VYTUwiLHRleHQ6InJlc3BvbnNlVGV4dCIsanNvbjoicmVzcG9uc2VKU09OIn0sY29udmVydGVyczp7IiogdGV4dCI6U3RyaW5nLCJ0ZXh0IGh0bWwiOiEwLCJ0ZXh0IGpzb24iOkpTT04ucGFyc2UsInRleHQgeG1sIjpTZS5wYXJzZVhNTH0sZmxhdE9wdGlvbnM6e3VybDohMCxjb250ZXh0OiEwfX0sYWpheFNldHVwOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHQ/dWUodWUoZSxTZS5hamF4U2V0dGluZ3MpLHQpOnVlKFNlLmFqYXhTZXR0aW5ncyxlKX0sYWpheFByZWZpbHRlcjphZShYdCksYWpheFRyYW5zcG9ydDphZShKdCksYWpheDpmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIHIoZSx0LHIscyl7dmFyIGMscCxkLHgsdyxfPXQ7bHx8KGw9ITAsdSYmbi5jbGVhclRpbWVvdXQodSksbz12b2lkIDAsYT1zfHwiIixDLnJlYWR5U3RhdGU9ZT4wPzQ6MCxjPWU+PTIwMCYmZTwzMDB8fDMwND09PWUsciYmKHg9Y2UoaCxDLHIpKSwhYyYmU2UuaW5BcnJheSgic2NyaXB0IixoLmRhdGFUeXBlcyk+LTEmJlNlLmluQXJyYXkoImpzb24iLGguZGF0YVR5cGVzKTwwJiYoaC5jb252ZXJ0ZXJzWyJ0ZXh0IHNjcmlwdCJdPWZ1bmN0aW9uKCl7fSkseD1sZShoLHgsQyxjKSxjPyhoLmlmTW9kaWZpZWQmJih3PUMuZ2V0UmVzcG9uc2VIZWFkZXIoIkxhc3QtTW9kaWZpZWQiKSx3JiYoU2UubGFzdE1vZGlmaWVkW2ldPXcpLCh3PUMuZ2V0UmVzcG9uc2VIZWFkZXIoImV0YWciKSkmJihTZS5ldGFnW2ldPXcpKSwyMDQ9PT1lfHwiSEVBRCI9PT1oLnR5cGU/Xz0ibm9jb250ZW50IjozMDQ9PT1lP189Im5vdG1vZGlmaWVkIjooXz14LnN0YXRlLHA9eC5kYXRhLGQ9eC5lcnJvcixjPSFkKSk6KGQ9XywhZSYmX3x8KF89ImVycm9yIixlPDAmJihlPTApKSksQy5zdGF0dXM9ZSxDLnN0YXR1c1RleHQ9KHR8fF8pKyIiLGM/eS5yZXNvbHZlV2l0aCh2LFtwLF8sQ10pOnkucmVqZWN0V2l0aCh2LFtDLF8sZF0pLEMuc3RhdHVzQ29kZShiKSxiPXZvaWQgMCxmJiZtLnRyaWdnZXIoYz8iYWpheFN1Y2Nlc3MiOiJhamF4RXJyb3IiLFtDLGgsYz9wOmRdKSxnLmZpcmVXaXRoKHYsW0MsX10pLGYmJihtLnRyaWdnZXIoImFqYXhDb21wbGV0ZSIsW0MsaF0pLC0tU2UuYWN0aXZlfHxTZS5ldmVudC50cmlnZ2VyKCJhamF4U3RvcCIpKSl9Im9iamVjdCI9PXR5cGVvZiBlJiYodD1lLGU9dm9pZCAwKSx0PXR8fHt9O3ZhciBvLGksYSxzLHUsYyxsLGYscCxkLGg9U2UuYWpheFNldHVwKHt9LHQpLHY9aC5jb250ZXh0fHxoLG09aC5jb250ZXh0JiYodi5ub2RlVHlwZXx8di5qcXVlcnkpP1NlKHYpOlNlLmV2ZW50LHk9U2UuRGVmZXJyZWQoKSxnPVNlLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSxiPWguc3RhdHVzQ29kZXx8e30seD17fSx3PXt9LF89ImNhbmNlbGVkIixDPXtyZWFkeVN0YXRlOjAsZ2V0UmVzcG9uc2VIZWFkZXI6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYobCl7aWYoIXMpZm9yKHM9e307dD1VdC5leGVjKGEpOylzW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdPShzW3RbMV0udG9Mb3dlckNhc2UoKSsiICJdfHxbXSkuY29uY2F0KHRbMl0pO3Q9c1tlLnRvTG93ZXJDYXNlKCkrIiAiXX1yZXR1cm4gbnVsbD09dD9udWxsOnQuam9pbigiLCAiKX0sZ2V0QWxsUmVzcG9uc2VIZWFkZXJzOmZ1bmN0aW9uKCl7cmV0dXJuIGw/YTpudWxsfSxzZXRSZXF1ZXN0SGVhZGVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIG51bGw9PWwmJihlPXdbZS50b0xvd2VyQ2FzZSgpXT13W2UudG9Mb3dlckNhc2UoKV18fGUseFtlXT10KSx0aGlzfSxvdmVycmlkZU1pbWVUeXBlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsPT1sJiYoaC5taW1lVHlwZT1lKSx0aGlzfSxzdGF0dXNDb2RlOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGUpaWYobClDLmFsd2F5cyhlW0Muc3RhdHVzXSk7ZWxzZSBmb3IodCBpbiBlKWJbdF09W2JbdF0sZVt0XV07cmV0dXJuIHRoaXN9LGFib3J0OmZ1bmN0aW9uKGUpe3ZhciB0PWV8fF87cmV0dXJuIG8mJm8uYWJvcnQodCkscigwLHQpLHRoaXN9fTtpZih5LnByb21pc2UoQyksaC51cmw9KChlfHxoLnVybHx8RHQuaHJlZikrIiIpLnJlcGxhY2UoVnQsRHQucHJvdG9jb2wrIi8vIiksaC50eXBlPXQubWV0aG9kfHx0LnR5cGV8fGgubWV0aG9kfHxoLnR5cGUsaC5kYXRhVHlwZXM9KGguZGF0YVR5cGV8fCIqIikudG9Mb3dlckNhc2UoKS5tYXRjaChJZSl8fFsiIl0sbnVsbD09aC5jcm9zc0RvbWFpbil7Yz1rZS5jcmVhdGVFbGVtZW50KCJhIik7dHJ5e2MuaHJlZj1oLnVybCxjLmhyZWY9Yy5ocmVmLGguY3Jvc3NEb21haW49R3QucHJvdG9jb2wrIi8vIitHdC5ob3N0IT1jLnByb3RvY29sKyIvLyIrYy5ob3N0fWNhdGNoKGUpe2guY3Jvc3NEb21haW49ITB9fWlmKGguZGF0YSYmaC5wcm9jZXNzRGF0YSYmInN0cmluZyIhPXR5cGVvZiBoLmRhdGEmJihoLmRhdGE9U2UucGFyYW0oaC5kYXRhLGgudHJhZGl0aW9uYWwpKSxzZShYdCxoLHQsQyksbClyZXR1cm4gQztmPVNlLmV2ZW50JiZoLmdsb2JhbCxmJiYwPT1TZS5hY3RpdmUrKyYmU2UuZXZlbnQudHJpZ2dlcigiYWpheFN0YXJ0IiksaC50eXBlPWgudHlwZS50b1VwcGVyQ2FzZSgpLGguaGFzQ29udGVudD0henQudGVzdChoLnR5cGUpLGk9aC51cmwucmVwbGFjZShGdCwiIiksaC5oYXNDb250ZW50P2guZGF0YSYmaC5wcm9jZXNzRGF0YSYmMD09PShoLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJihoLmRhdGE9aC5kYXRhLnJlcGxhY2UoSHQsIisiKSk6KGQ9aC51cmwuc2xpY2UoaS5sZW5ndGgpLGguZGF0YSYmKGgucHJvY2Vzc0RhdGF8fCJzdHJpbmciPT10eXBlb2YgaC5kYXRhKSYmKGkrPShSdC50ZXN0KGkpPyImIjoiPyIpK2guZGF0YSxkZWxldGUgaC5kYXRhKSwhMT09PWguY2FjaGUmJihpPWkucmVwbGFjZShCdCwiJDEiKSxkPShSdC50ZXN0KGkpPyImIjoiPyIpKyJfPSIrTHQuZ3VpZCsrK2QpLGgudXJsPWkrZCksaC5pZk1vZGlmaWVkJiYoU2UubGFzdE1vZGlmaWVkW2ldJiZDLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixTZS5sYXN0TW9kaWZpZWRbaV0pLFNlLmV0YWdbaV0mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsU2UuZXRhZ1tpXSkpLChoLmRhdGEmJmguaGFzQ29udGVudCYmITEhPT1oLmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGguY29udGVudFR5cGUpLEMuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixoLmRhdGFUeXBlc1swXSYmaC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXT9oLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dKygiKiIhPT1oLmRhdGFUeXBlc1swXT8iLCAiK0t0KyI7IHE9MC4wMSI6IiIpOmguYWNjZXB0c1siKiJdKTtmb3IocCBpbiBoLmhlYWRlcnMpQy5zZXRSZXF1ZXN0SGVhZGVyKHAsaC5oZWFkZXJzW3BdKTtpZihoLmJlZm9yZVNlbmQmJighMT09PWguYmVmb3JlU2VuZC5jYWxsKHYsQyxoKXx8bCkpcmV0dXJuIEMuYWJvcnQoKTtpZihfPSJhYm9ydCIsZy5hZGQoaC5jb21wbGV0ZSksQy5kb25lKGguc3VjY2VzcyksQy5mYWlsKGguZXJyb3IpLG89c2UoSnQsaCx0LEMpKXtpZihDLnJlYWR5U3RhdGU9MSxmJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbQyxoXSksbClyZXR1cm4gQztoLmFzeW5jJiZoLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5hYm9ydCgidGltZW91dCIpfSxoLnRpbWVvdXQpKTt0cnl7bD0hMSxvLnNlbmQoeCxyKX1jYXRjaChlKXtpZihsKXRocm93IGU7cigtMSxlKX19ZWxzZSByKC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4gQ30sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFNlLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gU2UuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIpfX0pLFNlLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSx0KXtTZVt0XT1mdW5jdGlvbihlLG4scixvKXtyZXR1cm4gQ2UobikmJihvPW98fHIscj1uLG49dm9pZCAwKSxTZS5hamF4KFNlLmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOm8sZGF0YTpuLHN1Y2Nlc3M6cn0sU2UuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLFNlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7dmFyIHQ7Zm9yKHQgaW4gZS5oZWFkZXJzKSJjb250ZW50LXR5cGUiPT09dC50b0xvd2VyQ2FzZSgpJiYoZS5jb250ZW50VHlwZT1lLmhlYWRlcnNbdF18fCIiKX0pLFNlLl9ldmFsVXJsPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gU2UuYWpheCh7dXJsOmUsdHlwZToiR0VUIixkYXRhVHlwZToic2NyaXB0IixjYWNoZTohMCxhc3luYzohMSxnbG9iYWw6ITEsY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbigpe319LGRhdGFGaWx0ZXI6ZnVuY3Rpb24oZSl7U2UuZ2xvYmFsRXZhbChlLHQsbil9fSl9LFNlLmZuLmV4dGVuZCh7d3JhcEFsbDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4gdGhpc1swXSYmKENlKGUpJiYoZT1lLmNhbGwodGhpc1swXSkpLHQ9U2UoZSx0aGlzWzBdLm93bmVyRG9jdW1lbnQpLmVxKDApLmNsb25lKCEwKSx0aGlzWzBdLnBhcmVudE5vZGUmJnQuaW5zZXJ0QmVmb3JlKHRoaXNbMF0pLHQubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXM7ZS5maXJzdEVsZW1lbnRDaGlsZDspZT1lLmZpcnN0RWxlbWVudENoaWxkO3JldHVybiBlfSkuYXBwZW5kKHRoaXMpKSx0aGlzfSx3cmFwSW5uZXI6ZnVuY3Rpb24oZSl7cmV0dXJuIENlKGUpP3RoaXMuZWFjaChmdW5jdGlvbih0KXtTZSh0aGlzKS53cmFwSW5uZXIoZS5jYWxsKHRoaXMsdCkpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQ9U2UodGhpcyksbj10LmNvbnRlbnRzKCk7bi5sZW5ndGg/bi53cmFwQWxsKGUpOnQuYXBwZW5kKGUpfSl9LHdyYXA6ZnVuY3Rpb24oZSl7dmFyIHQ9Q2UoZSk7cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbihuKXtTZSh0aGlzKS53cmFwQWxsKHQ/ZS5jYWxsKHRoaXMsbik6ZSl9KX0sdW53cmFwOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLnBhcmVudChlKS5ub3QoImJvZHkiKS5lYWNoKGZ1bmN0aW9uKCl7U2UodGhpcykucmVwbGFjZVdpdGgodGhpcy5jaGlsZE5vZGVzKX0pLHRoaXN9fSksU2UuZXhwci5wc2V1ZG9zLmhpZGRlbj1mdW5jdGlvbihlKXtyZXR1cm4hU2UuZXhwci5wc2V1ZG9zLnZpc2libGUoZSl9LFNlLmV4cHIucHNldWRvcy52aXNpYmxlPWZ1bmN0aW9uKGUpe3JldHVybiEhKGUub2Zmc2V0V2lkdGh8fGUub2Zmc2V0SGVpZ2h0fHxlLmdldENsaWVudFJlY3RzKCkubGVuZ3RoKX0sU2UuYWpheFNldHRpbmdzLnhocj1mdW5jdGlvbigpe3RyeXtyZXR1cm4gbmV3IG4uWE1MSHR0cFJlcXVlc3R9Y2F0Y2goZSl7fX07dmFyIFl0PXswOjIwMCwxMjIzOjIwNH0sUXQ9U2UuYWpheFNldHRpbmdzLnhocigpO19lLmNvcnM9ISFRdCYmIndpdGhDcmVkZW50aWFscyJpbiBRdCxfZS5hamF4PVF0PSEhUXQsU2UuYWpheFRyYW5zcG9ydChmdW5jdGlvbihlKXt2YXIgdCxyO2lmKF9lLmNvcnN8fFF0JiYhZS5jcm9zc0RvbWFpbilyZXR1cm57c2VuZDpmdW5jdGlvbihvLGkpe3ZhciBhLHM9ZS54aHIoKTtpZihzLm9wZW4oZS50eXBlLGUudXJsLGUuYXN5bmMsZS51c2VybmFtZSxlLnBhc3N3b3JkKSxlLnhockZpZWxkcylmb3IoYSBpbiBlLnhockZpZWxkcylzW2FdPWUueGhyRmllbGRzW2FdO2UubWltZVR5cGUmJnMub3ZlcnJpZGVNaW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlKGUubWltZVR5cGUpLGUuY3Jvc3NEb21haW58fG9bIlgtUmVxdWVzdGVkLVdpdGgiXXx8KG9bIlgtUmVxdWVzdGVkLVdpdGgiXT0iWE1MSHR0cFJlcXVlc3QiKTtmb3IoYSBpbiBvKXMuc2V0UmVxdWVzdEhlYWRlcihhLG9bYV0pO3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dCYmKHQ9cj1zLm9ubG9hZD1zLm9uZXJyb3I9cy5vbmFib3J0PXMub250aW1lb3V0PXMub25yZWFkeXN0YXRlY2hhbmdlPW51bGwsImFib3J0Ij09PWU/cy5hYm9ydCgpOiJlcnJvciI9PT1lPyJudW1iZXIiIT10eXBlb2Ygcy5zdGF0dXM/aSgwLCJlcnJvciIpOmkocy5zdGF0dXMscy5zdGF0dXNUZXh0KTppKFl0W3Muc3RhdHVzXXx8cy5zdGF0dXMscy5zdGF0dXNUZXh0LCJ0ZXh0IiE9PShzLnJlc3BvbnNlVHlwZXx8InRleHQiKXx8InN0cmluZyIhPXR5cGVvZiBzLnJlc3BvbnNlVGV4dD97YmluYXJ5OnMucmVzcG9uc2V9Ont0ZXh0OnMucmVzcG9uc2VUZXh0fSxzLmdldEFsbFJlc3BvbnNlSGVhZGVycygpKSl9fSxzLm9ubG9hZD10KCkscj1zLm9uZXJyb3I9cy5vbnRpbWVvdXQ9dCgiZXJyb3IiKSx2b2lkIDAhPT1zLm9uYWJvcnQ/cy5vbmFib3J0PXI6cy5vbnJlYWR5c3RhdGVjaGFuZ2U9ZnVuY3Rpb24oKXs0PT09cy5yZWFkeVN0YXRlJiZuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0JiZyKCl9KX0sdD10KCJhYm9ydCIpO3RyeXtzLnNlbmQoZS5oYXNDb250ZW50JiZlLmRhdGF8fG51bGwpfWNhdGNoKGUpe2lmKHQpdGhyb3cgZX19LGFib3J0OmZ1bmN0aW9uKCl7dCYmdCgpfX19KSxTZS5hamF4UHJlZmlsdGVyKGZ1bmN0aW9uKGUpe2UuY3Jvc3NEb21haW4mJihlLmNvbnRlbnRzLnNjcmlwdD0hMSl9KSxTZS5hamF4U2V0dXAoe2FjY2VwdHM6e3NjcmlwdDoidGV4dC9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9qYXZhc2NyaXB0LCBhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHQifSxjb250ZW50czp7c2NyaXB0Oi9cYig/OmphdmF8ZWNtYSlzY3JpcHRcYi99LGNvbnZlcnRlcnM6eyJ0ZXh0IHNjcmlwdCI6ZnVuY3Rpb24oZSl7cmV0dXJuIFNlLmdsb2JhbEV2YWwoZSksZX19fSksU2UuYWpheFByZWZpbHRlcigic2NyaXB0IixmdW5jdGlvbihlKXt2b2lkIDA9PT1lLmNhY2hlJiYoZS5jYWNoZT0hMSksZS5jcm9zc0RvbWFpbiYmKGUudHlwZT0iR0VUIil9KSxTZS5hamF4VHJhbnNwb3J0KCJzY3JpcHQiLGZ1bmN0aW9uKGUpe2lmKGUuY3Jvc3NEb21haW58fGUuc2NyaXB0QXR0cnMpe3ZhciB0LG47cmV0dXJue3NlbmQ6ZnVuY3Rpb24ocixvKXt0PVNlKCI8c2NyaXB0PiIpLmF0dHIoZS5zY3JpcHRBdHRyc3x8e30pLnByb3Aoe2NoYXJzZXQ6ZS5zY3JpcHRDaGFyc2V0LHNyYzplLnVybH0pLm9uKCJsb2FkIGVycm9yIixuPWZ1bmN0aW9uKGUpe3QucmVtb3ZlKCksbj1udWxsLGUmJm8oImVycm9yIj09PWUudHlwZT80MDQ6MjAwLGUudHlwZSl9KSxrZS5oZWFkLmFwcGVuZENoaWxkKHRbMF0pfSxhYm9ydDpmdW5jdGlvbigpe24mJm4oKX19fX0pO3ZhciBadD1bXSxlbj0vKD0pXD8oPz0mfCQpfFw/XD8vO1NlLmFqYXhTZXR1cCh7anNvbnA6ImNhbGxiYWNrIixqc29ucENhbGxiYWNrOmZ1bmN0aW9uKCl7dmFyIGU9WnQucG9wKCl8fFNlLmV4cGFuZG8rIl8iK0x0Lmd1aWQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLFNlLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxpLGEscz0hMSE9PWUuanNvbnAmJihlbi50ZXN0KGUudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJmVuLnRlc3QoZS5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09ZS5kYXRhVHlwZXNbMF0pcmV0dXJuIG89ZS5qc29ucENhbGxiYWNrPUNlKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLHM/ZVtzXT1lW3NdLnJlcGxhY2UoZW4sIiQxIitvKTohMSE9PWUuanNvbnAmJihlLnVybCs9KFJ0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK28pLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxTZS5lcnJvcihvKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1uW29dLG5bb109ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP1NlKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLGVbb10mJihlLmpzb25wQ2FsbGJhY2s9dC5qc29ucENhbGxiYWNrLFp0LnB1c2gobykpLGEmJkNlKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLF9lLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPWtlLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gZS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09ZS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxTZS5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm5bXTsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpO3ZhciByLG8saTtyZXR1cm4gdHx8KF9lLmNyZWF0ZUhUTUxEb2N1bWVudD8odD1rZS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLHI9dC5jcmVhdGVFbGVtZW50KCJiYXNlIiksci5ocmVmPWtlLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PWtlKSxvPU5lLmV4ZWMoZSksaT0hbiYmW10sbz9bdC5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1TKFtlXSx0LGkpLGkmJmkubGVuZ3RoJiZTZShpKS5yZW1vdmUoKSxTZS5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKX0sU2UuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj1uZShlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksQ2UodCk/KG49dCx0PXZvaWQgMCk6dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYobz0iUE9TVCIpLGEubGVuZ3RoPjAmJlNlLmFqYXgoe3VybDplLHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7aT1hcmd1bWVudHMsYS5odG1sKHI/U2UoIjxkaXY+IikuYXBwZW5kKFNlLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxpfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LFNlLmV4cHIucHNldWRvcy5hbmltYXRlZD1mdW5jdGlvbihlKXtyZXR1cm4gU2UuZ3JlcChTZS50aW1lcnMsZnVuY3Rpb24odCl7cmV0dXJuIGU9PT10LmVsZW19KS5sZW5ndGh9LFNlLm9mZnNldD17c2V0T2Zmc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvLGksYSxzLHUsYyxsPVNlLmNzcyhlLCJwb3NpdGlvbiIpLGY9U2UoZSkscD17fTsic3RhdGljIj09PWwmJihlLnN0eWxlLnBvc2l0aW9uPSJyZWxhdGl2ZSIpLHM9Zi5vZmZzZXQoKSxpPVNlLmNzcyhlLCJ0b3AiKSx1PVNlLmNzcyhlLCJsZWZ0IiksYz0oImFic29sdXRlIj09PWx8fCJmaXhlZCI9PT1sKSYmKGkrdSkuaW5kZXhPZigiYXV0byIpPi0xLGM/KHI9Zi5wb3NpdGlvbigpLGE9ci50b3Asbz1yLmxlZnQpOihhPXBhcnNlRmxvYXQoaSl8fDAsbz1wYXJzZUZsb2F0KHUpfHwwKSxDZSh0KSYmKHQ9dC5jYWxsKGUsbixTZS5leHRlbmQoe30scykpKSxudWxsIT10LnRvcCYmKHAudG9wPXQudG9wLXMudG9wK2EpLG51bGwhPXQubGVmdCYmKHAubGVmdD10LmxlZnQtcy5sZWZ0K28pLCJ1c2luZyJpbiB0P3QudXNpbmcuY2FsbChlLHApOmYuY3NzKHApfX0sU2UuZm4uZXh0ZW5kKHtvZmZzZXQ6ZnVuY3Rpb24oZSl7aWYoYXJndW1lbnRzLmxlbmd0aClyZXR1cm4gdm9pZCAwPT09ZT90aGlzOnRoaXMuZWFjaChmdW5jdGlvbih0KXtTZS5vZmZzZXQuc2V0T2Zmc2V0KHRoaXMsZSx0KX0pO3ZhciB0LG4scj10aGlzWzBdO2lmKHIpcmV0dXJuIHIuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGg/KHQ9ci5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuPXIub3duZXJEb2N1bWVudC5kZWZhdWx0Vmlldyx7dG9wOnQudG9wK24ucGFnZVlPZmZzZXQsbGVmdDp0LmxlZnQrbi5wYWdlWE9mZnNldH0pOnt0b3A6MCxsZWZ0OjB9fSxwb3NpdGlvbjpmdW5jdGlvbigpe2lmKHRoaXNbMF0pe3ZhciBlLHQsbixyPXRoaXNbMF0sbz17dG9wOjAsbGVmdDowfTtpZigiZml4ZWQiPT09U2UuY3NzKHIsInBvc2l0aW9uIikpdD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO2Vsc2V7Zm9yKHQ9dGhpcy5vZmZzZXQoKSxuPXIub3duZXJEb2N1bWVudCxlPXIub2Zmc2V0UGFyZW50fHxuLmRvY3VtZW50RWxlbWVudDtlJiYoZT09PW4uYm9keXx8ZT09PW4uZG9jdW1lbnRFbGVtZW50KSYmInN0YXRpYyI9PT1TZS5jc3MoZSwicG9zaXRpb24iKTspZT1lLnBhcmVudE5vZGU7ZSYmZSE9PXImJjE9PT1lLm5vZGVUeXBlJiYobz1TZShlKS5vZmZzZXQoKSxvLnRvcCs9U2UuY3NzKGUsImJvcmRlclRvcFdpZHRoIiwhMCksby5sZWZ0Kz1TZS5jc3MoZSwiYm9yZGVyTGVmdFdpZHRoIiwhMCkpfXJldHVybnt0b3A6dC50b3Atby50b3AtU2UuY3NzKHIsIm1hcmdpblRvcCIsITApLGxlZnQ6dC5sZWZ0LW8ubGVmdC1TZS5jc3MociwibWFyZ2luTGVmdCIsITApfX19LG9mZnNldFBhcmVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLm9mZnNldFBhcmVudDtlJiYic3RhdGljIj09PVNlLmNzcyhlLCJwb3NpdGlvbiIpOyllPWUub2Zmc2V0UGFyZW50O3JldHVybiBlfHxZZX0pfX0pLFNlLmVhY2goe3Njcm9sbExlZnQ6InBhZ2VYT2Zmc2V0IixzY3JvbGxUb3A6InBhZ2VZT2Zmc2V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj0icGFnZVlPZmZzZXQiPT09dDtTZS5mbltlXT1mdW5jdGlvbihyKXtyZXR1cm4gSGUodGhpcyxmdW5jdGlvbihlLHIsbyl7dmFyIGk7aWYoVGUoZSk/aT1lOjk9PT1lLm5vZGVUeXBlJiYoaT1lLmRlZmF1bHRWaWV3KSx2b2lkIDA9PT1vKXJldHVybiBpP2lbdF06ZVtyXTtpP2kuc2Nyb2xsVG8obj9pLnBhZ2VYT2Zmc2V0Om8sbj9vOmkucGFnZVlPZmZzZXQpOmVbcl09b30sZSxyLGFyZ3VtZW50cy5sZW5ndGgpfX0pLFNlLmVhY2goWyJ0b3AiLCJsZWZ0Il0sZnVuY3Rpb24oZSx0KXtTZS5jc3NIb29rc1t0XT1CKF9lLnBpeGVsUG9zaXRpb24sZnVuY3Rpb24oZSxuKXtpZihuKXJldHVybiBuPUYoZSx0KSxmdC50ZXN0KG4pP1NlKGUpLnBvc2l0aW9uKClbdF0rInB4IjpufSl9KSxTZS5lYWNoKHtIZWlnaHQ6ImhlaWdodCIsV2lkdGg6IndpZHRoIn0sZnVuY3Rpb24oZSx0KXtTZS5lYWNoKHtwYWRkaW5nOiJpbm5lciIrZSxjb250ZW50OnQsIiI6Im91dGVyIitlfSxmdW5jdGlvbihuLHIpe1NlLmZuW3JdPWZ1bmN0aW9uKG8saSl7dmFyIGE9YXJndW1lbnRzLmxlbmd0aCYmKG58fCJib29sZWFuIiE9dHlwZW9mIG8pLHM9bnx8KCEwPT09b3x8ITA9PT1pPyJtYXJnaW4iOiJib3JkZXIiKTtyZXR1cm4gSGUodGhpcyxmdW5jdGlvbih0LG4sbyl7dmFyIGk7cmV0dXJuIFRlKHQpPzA9PT1yLmluZGV4T2YoIm91dGVyIik/dFsiaW5uZXIiK2VdOnQuZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50WyJjbGllbnQiK2VdOjk9PT10Lm5vZGVUeXBlPyhpPXQuZG9jdW1lbnRFbGVtZW50LE1hdGgubWF4KHQuYm9keVsic2Nyb2xsIitlXSxpWyJzY3JvbGwiK2VdLHQuYm9keVsib2Zmc2V0IitlXSxpWyJvZmZzZXQiK2VdLGlbImNsaWVudCIrZV0pKTp2b2lkIDA9PT1vP1NlLmNzcyh0LG4scyk6U2Uuc3R5bGUodCxuLG8scyl9LHQsYT9vOnZvaWQgMCxhKX19KX0pLFNlLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe1NlLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksU2UuZm4uZXh0ZW5kKHtiaW5kOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5vbihlLG51bGwsdCxuKX0sdW5iaW5kOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMub2ZmKGUsbnVsbCx0KX0sZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMub24odCxlLG4scil9LHVuZGVsZWdhdGU6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAxPT09YXJndW1lbnRzLmxlbmd0aD90aGlzLm9mZihlLCIqKiIpOnRoaXMub2ZmKHQsZXx8IioqIixuKX0saG92ZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdGhpcy5tb3VzZWVudGVyKGUpLm1vdXNlbGVhdmUodHx8ZSl9fSksU2UuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe1NlLmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KTt2YXIgdG49L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO1NlLnByb3h5PWZ1bmN0aW9uKGUsdCl7dmFyIG4scixvO2lmKCJzdHJpbmciPT10eXBlb2YgdCYmKG49ZVt0XSx0PWUsZT1uKSxDZShlKSlyZXR1cm4gcj1kZS5jYWxsKGFyZ3VtZW50cywyKSxvPWZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodHx8dGhpcyxyLmNvbmNhdChkZS5jYWxsKGFyZ3VtZW50cykpKX0sby5ndWlkPWUuZ3VpZD1lLmd1aWR8fFNlLmd1aWQrKyxvfSxTZS5ob2xkUmVhZHk9ZnVuY3Rpb24oZSl7ZT9TZS5yZWFkeVdhaXQrKzpTZS5yZWFkeSghMCl9LFNlLmlzQXJyYXk9QXJyYXkuaXNBcnJheSxTZS5wYXJzZUpTT049SlNPTi5wYXJzZSxTZS5ub2RlTmFtZT1jLFNlLmlzRnVuY3Rpb249Q2UsU2UuaXNXaW5kb3c9VGUsU2UuY2FtZWxDYXNlPWcsU2UudHlwZT1zLFNlLm5vdz1EYXRlLm5vdyxTZS5pc051bWVyaWM9ZnVuY3Rpb24oZSl7dmFyIHQ9U2UudHlwZShlKTtyZXR1cm4oIm51bWJlciI9PT10fHwic3RyaW5nIj09PXQpJiYhaXNOYU4oZS1wYXJzZUZsb2F0KGUpKX0sU2UudHJpbT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZSh0biwiIil9LHI9W10sdm9pZCAwIT09KG89ZnVuY3Rpb24oKXtyZXR1cm4gU2V9LmFwcGx5KHQscikpJiYoZS5leHBvcnRzPW8pO3ZhciBubj1uLmpRdWVyeSxybj1uLiQ7cmV0dXJuIFNlLm5vQ29uZmxpY3Q9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uJD09PVNlJiYobi4kPXJuKSxlJiZuLmpRdWVyeT09PVNlJiYobi5qUXVlcnk9bm4pLFNlfSx2b2lkIDA9PT1pJiYobi5qUXVlcnk9bi4kPVNlKSxTZX0pfSwsLCwsLCwsLCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9e2RlZmF1bHQ6bigzOCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9e2RlZmF1bHQ6bigzOSksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9e2RlZmF1bHQ6big0MCksX19lc01vZHVsZTohMH19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDEpLG89ci5KU09OfHwoci5KU09OPXtzdHJpbmdpZnk6SlNPTi5zdHJpbmdpZnl9KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG8uc3RyaW5naWZ5LmFwcGx5KG8sYXJndW1lbnRzKX19LGZ1bmN0aW9uKGUsdCxuKXtuKDY4KSxlLmV4cG9ydHM9bigxKS5OdW1iZXIuaXNOYU59LGZ1bmN0aW9uKGUsdCxuKXtuKDY5KSxlLmV4cG9ydHM9bigxKS5OdW1iZXIucGFyc2VJbnR9LGZ1bmN0aW9uKGUsdCxuKXtuKDcwKSxlLmV4cG9ydHM9bigxKS5PYmplY3QuYXNzaWdufSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZigiZnVuY3Rpb24iIT10eXBlb2YgZSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhIGZ1bmN0aW9uISIpO3JldHVybiBlfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oOSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe2lmKCFyKGUpKXRocm93IFR5cGVFcnJvcihlKyIgaXMgbm90IGFuIG9iamVjdCEiKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE2KSxvPW4oNjQpLGk9big2Myk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0LG4sYSl7dmFyIHMsdT1yKHQpLGM9byh1Lmxlbmd0aCksbD1pKGEsYyk7aWYoZSYmbiE9bil7Zm9yKDtjPmw7KWlmKChzPXVbbCsrXSkhPXMpcmV0dXJuITB9ZWxzZSBmb3IoO2M+bDtsKyspaWYoKGV8fGwgaW4gdSkmJnVbbF09PT1uKXJldHVybiBlfHxsfHwwO3JldHVybiFlJiYtMX19fSxmdW5jdGlvbihlLHQpe3ZhciBuPXt9LnRvU3RyaW5nO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gbi5jYWxsKGUpLnNsaWNlKDgsLTEpfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDIpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbil7aWYocihlKSx2b2lkIDA9PT10KXJldHVybiBlO3N3aXRjaChuKXtjYXNlIDE6cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiBlLmNhbGwodCxuKX07Y2FzZSAyOnJldHVybiBmdW5jdGlvbihuLHIpe3JldHVybiBlLmNhbGwodCxuLHIpfTtjYXNlIDM6cmV0dXJuIGZ1bmN0aW9uKG4scixvKXtyZXR1cm4gZS5jYWxsKHQsbixyLG8pfX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0LGFyZ3VtZW50cyl9fX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oOSksbz1uKDYpLmRvY3VtZW50LGk9cihvKSYmcihvLmNyZWF0ZUVsZW1lbnQpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaT9vLmNyZWF0ZUVsZW1lbnQoZSk6e319fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0iY29uc3RydWN0b3IsaGFzT3duUHJvcGVydHksaXNQcm90b3R5cGVPZixwcm9wZXJ0eUlzRW51bWVyYWJsZSx0b0xvY2FsZVN0cmluZyx0b1N0cmluZyx2YWx1ZU9mIi5zcGxpdCgiLCIpfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big1Myksbz1uKDU5KTtlLmV4cG9ydHM9bigzKT9mdW5jdGlvbihlLHQsbil7cmV0dXJuIHIuZihlLHQsbygxLG4pKX06ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBlW3RdPW4sZX19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9IW4oMykmJiFuKDUpKGZ1bmN0aW9uKCl7cmV0dXJuIDchPU9iamVjdC5kZWZpbmVQcm9wZXJ0eShuKDQ3KSgiZGl2IiksImEiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gN319KS5hfSl9LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPSEwfSxmdW5jdGlvbihlLHQsbil7InVzZSBzdHJpY3QiO3ZhciByPW4oMyksbz1uKDU2KSxpPW4oNTQpLGE9big1Nykscz1uKDY1KSx1PW4oMTMpLGM9T2JqZWN0LmFzc2lnbjtlLmV4cG9ydHM9IWN8fG4oNSkoZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCkscj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsci5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWV9KSw3IT1jKHt9LGUpW25dfHxPYmplY3Qua2V5cyhjKHt9LHQpKS5qb2luKCIiKSE9cn0pP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPXMoZSksYz1hcmd1bWVudHMubGVuZ3RoLGw9MSxmPWkuZixwPWEuZjtjPmw7KWZvcih2YXIgZCxoPXUoYXJndW1lbnRzW2wrK10pLHY9Zj9vKGgpLmNvbmNhdChmKGgpKTpvKGgpLG09di5sZW5ndGgseT0wO20+eTspZD12W3krK10sciYmIXAuY2FsbChoLGQpfHwobltkXT1oW2RdKTtyZXR1cm4gbn06Y30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDMpLG89big1MCksaT1uKDY2KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt0LmY9bigzKT9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKHIoZSksdD1pKHQsITApLHIobiksbyl0cnl7cmV0dXJuIGEoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBuJiYoZVt0XT1uLnZhbHVlKSxlfX0sZnVuY3Rpb24oZSx0KXt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTIpLG89bigxNiksaT1uKDQ0KSghMSksYT1uKDYwKSgiSUVfUFJPVE8iKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbixzPW8oZSksdT0wLGM9W107Zm9yKG4gaW4gcyluIT1hJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO3QubGVuZ3RoPnU7KXIocyxuPXRbdSsrXSkmJih+aShjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTUpLG89big0OCk7ZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gcihlLG8pfX0sZnVuY3Rpb24oZSx0KXt0LmY9e30ucHJvcGVydHlJc0VudW1lcmFibGV9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDYpLnBhcnNlSW50LG89big2MikudHJpbSxpPW4oMTQpLGE9L15bLStdPzBbeFhdLztlLmV4cG9ydHM9OCE9PXIoaSsiMDgiKXx8MjIhPT1yKGkrIjB4MTYiKT9mdW5jdGlvbihlLHQpe3ZhciBuPW8oU3RyaW5nKGUpLDMpO3JldHVybiByKG4sdD4+PjB8fChhLnRlc3Qobik/MTY6MTApKX06cn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2MSkoImtleXMiKSxvPW4oNjcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcltlXXx8KHJbZV09byhlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxKSxvPW4oNiksaT1vWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8KG9bIl9fY29yZS1qc19zaGFyZWRfXyJdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlbZV18fChpW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOnIudmVyc2lvbixtb2RlOm4oNTEpPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMjAgRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQpLG89big4KSxpPW4oNSksYT1uKDE0KSxzPSJbIithKyJdIix1PSLigIvChSIsYz1SZWdFeHAoIl4iK3MrcysiKiIpLGw9UmVnRXhwKHMrcysiKiQiKSxmPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz17fSxzPWkoZnVuY3Rpb24oKXtyZXR1cm4hIWFbZV0oKXx8dVtlXSgpIT11fSksYz1vW2VdPXM/dChwKTphW2VdO24mJihvW25dPWMpLHIoci5QK3IuRipzLCJTdHJpbmciLG8pfSxwPWYudHJpbT1mdW5jdGlvbihlLHQpe3JldHVybiBlPVN0cmluZyhvKGUpKSwxJnQmJihlPWUucmVwbGFjZShjLCIiKSksMiZ0JiYoZT1lLnJlcGxhY2UobCwiIikpLGV9O2UuZXhwb3J0cz1mfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNSksbz1NYXRoLm1heCxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBlPXIoZSksZTwwP28oZSt0LDApOmkoZSx0KX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE1KSxvPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP28ocihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oOCk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QocihlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighcihlKSlyZXR1cm4gZTt2YXIgbixvO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhcihvPW4uY2FsbChlKSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49ZS52YWx1ZU9mKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO2lmKCF0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1NYXRoLnJhbmRvbSgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iU3ltYm9sKCIuY29uY2F0KHZvaWQgMD09PWU/IiI6ZSwiKV8iLCgrK24rcikudG9TdHJpbmcoMzYpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQpO3Ioci5TLCJOdW1iZXIiLHtpc05hTjpmdW5jdGlvbihlKXtyZXR1cm4gZSE9ZX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNCksbz1uKDU4KTtyKHIuUytyLkYqKE51bWJlci5wYXJzZUludCE9byksIk51bWJlciIse3BhcnNlSW50Om99KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNCk7cihyLlMrci5GLCJPYmplY3QiLHthc3NpZ246big1Mil9KX0sLCwsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gbyhlKXtpZihsPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChsPT09bnx8IWwpJiZzZXRUaW1lb3V0KXJldHVybiBsPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gbChlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gbC5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gbC5jYWxsKHRoaXMsZSwwKX19fWZ1bmN0aW9uIGkoZSl7aWYoZj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChmPT09cnx8IWYpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGY9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIGYoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBmLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gZi5jYWxsKHRoaXMsZSl9fX1mdW5jdGlvbiBhKCl7diYmZCYmKHY9ITEsZC5sZW5ndGg/aD1kLmNvbmNhdChoKTptPS0xLGgubGVuZ3RoJiZzKCkpfWZ1bmN0aW9uIHMoKXtpZighdil7dmFyIGU9byhhKTt2PSEwO2Zvcih2YXIgdD1oLmxlbmd0aDt0Oyl7Zm9yKGQ9aCxoPVtdOysrbTx0OylkJiZkW21dLnJ1bigpO209LTEsdD1oLmxlbmd0aH1kPW51bGwsdj0hMSxpKGUpfX1mdW5jdGlvbiB1KGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gYygpe312YXIgbCxmLHA9ZS5leHBvcnRzPXt9OyFmdW5jdGlvbigpe3RyeXtsPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6bn1jYXRjaChlKXtsPW59dHJ5e2Y9ImZ1bmN0aW9uIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6cn1jYXRjaChlKXtmPXJ9fSgpO3ZhciBkLGg9W10sdj0hMSxtPS0xO3AubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtoLnB1c2gobmV3IHUoZSx0KSksMSE9PWgubGVuZ3RofHx2fHxvKHMpfSx1LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxwLnRpdGxlPSJicm93c2VyIixwLmJyb3dzZXI9ITAscC5lbnY9e30scC5hcmd2PVtdLHAudmVyc2lvbj0iIixwLnZlcnNpb25zPXt9LHAub249YyxwLmFkZExpc3RlbmVyPWMscC5vbmNlPWMscC5vZmY9YyxwLnJlbW92ZUxpc3RlbmVyPWMscC5yZW1vdmVBbGxMaXN0ZW5lcnM9YyxwLmVtaXQ9YyxwLnByZXBlbmRMaXN0ZW5lcj1jLHAucHJlcGVuZE9uY2VMaXN0ZW5lcj1jLHAubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxwLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxwLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0scC5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxwLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPW5ldyBGdW5jdGlvbigiIitlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXtjYWxsYmFjazplLGFyZ3M6dH07cmV0dXJuIGNbdV09cixzKHUpLHUrK31mdW5jdGlvbiBvKGUpe2RlbGV0ZSBjW2VdfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5jYWxsYmFjayxyPWUuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDp0KCk7YnJlYWs7Y2FzZSAxOnQoclswXSk7YnJlYWs7Y2FzZSAyOnQoclswXSxyWzFdKTticmVhaztjYXNlIDM6dChyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDp0LmFwcGx5KG4scil9fWZ1bmN0aW9uIGEoZSl7aWYobClzZXRUaW1lb3V0KGEsMCxlKTtlbHNle3ZhciB0PWNbZV07aWYodCl7bD0hMDt0cnl7aSh0KX1maW5hbGx5e28oZSksbD0hMX19fX1pZighZS5zZXRJbW1lZGlhdGUpe3ZhciBzLHU9MSxjPXt9LGw9ITEsZj1lLmRvY3VtZW50LHA9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cD1wJiZwLnNldFRpbWVvdXQ/cDplLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoZS5wcm9jZXNzKT9mdW5jdGlvbigpe3M9ZnVuY3Rpb24oZSl7dC5uZXh0VGljayhmdW5jdGlvbigpe2EoZSl9KX19KCk6ZnVuY3Rpb24oKXtpZihlLnBvc3RNZXNzYWdlJiYhZS5pbXBvcnRTY3JpcHRzKXt2YXIgdD0hMCxuPWUub25tZXNzYWdlO3JldHVybiBlLm9ubWVzc2FnZT1mdW5jdGlvbigpe3Q9ITF9LGUucG9zdE1lc3NhZ2UoIiIsIioiKSxlLm9ubWVzc2FnZT1uLHR9fSgpP2Z1bmN0aW9uKCl7dmFyIHQ9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLG49ZnVuY3Rpb24obil7bi5zb3VyY2U9PT1lJiYic3RyaW5nIj09dHlwZW9mIG4uZGF0YSYmMD09PW4uZGF0YS5pbmRleE9mKHQpJiZhKCtuLmRhdGEuc2xpY2UodC5sZW5ndGgpKX07ZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMSk6ZS5hdHRhY2hFdmVudCgib25tZXNzYWdlIixuKSxzPWZ1bmN0aW9uKG4pe2UucG9zdE1lc3NhZ2UodCtuLCIqIil9fSgpOmUuTWVzc2FnZUNoYW5uZWw/ZnVuY3Rpb24oKXt2YXIgZT1uZXcgTWVzc2FnZUNoYW5uZWw7ZS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7YShlLmRhdGEpfSxzPWZ1bmN0aW9uKHQpe2UucG9ydDIucG9zdE1lc3NhZ2UodCl9fSgpOmYmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciBlPWYuZG9jdW1lbnRFbGVtZW50O3M9ZnVuY3Rpb24odCl7dmFyIG49Zi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2EodCksbi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlLnJlbW92ZUNoaWxkKG4pLG49bnVsbH0sZS5hcHBlbmRDaGlsZChuKX19KCk6ZnVuY3Rpb24oKXtzPWZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYSwwLGUpfX0oKSxwLnNldEltbWVkaWF0ZT1yLHAuY2xlYXJJbW1lZGlhdGU9b319KCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT1lP3RoaXM6ZTpzZWxmKX0pLmNhbGwodCxuKDEwKSxuKDc0KSl9LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fXZhciBvPXZvaWQgMCE9PWUmJmV8fCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZnx8d2luZG93LGk9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O3Quc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgcihpLmNhbGwoc2V0VGltZW91dCxvLGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sdC5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgcihpLmNhbGwoc2V0SW50ZXJ2YWwsbyxhcmd1bWVudHMpLGNsZWFySW50ZXJ2YWwpfSx0LmNsZWFyVGltZW91dD10LmNsZWFySW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZSYmZS5jbG9zZSgpfSxyLnByb3RvdHlwZS51bnJlZj1yLnByb3RvdHlwZS5yZWY9ZnVuY3Rpb24oKXt9LHIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJGbi5jYWxsKG8sdGhpcy5faWQpfSx0LmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSx0LnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sdC5fdW5yZWZBY3RpdmU9dC5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9vblRpbWVvdXQmJmUuX29uVGltZW91dCgpfSx0KSl9LG4oNzUpLHQuc2V0SW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5zZXRJbW1lZGlhdGV8fHZvaWQgMCE9PWUmJmUuc2V0SW1tZWRpYXRlfHx0aGlzJiZ0aGlzLnNldEltbWVkaWF0ZSx0LmNsZWFySW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jbGVhckltbWVkaWF0ZXx8dm9pZCAwIT09ZSYmZS5jbGVhckltbWVkaWF0ZXx8dGhpcyYmdGhpcy5jbGVhckltbWVkaWF0ZX0pLmNhbGwodCxuKDEwKSl9LCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe31mdW5jdGlvbiBvKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuaW5kZXhPZigiRXJyb3IiKT4tMX1mdW5jdGlvbiBpKGUsdCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlInVuZGVmaW5lZCI6cmV0dXJuO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdDtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gdChlKTtjYXNlImJvb2xlYW4iOnJldHVybiB0P2UucGFyYW1zOnZvaWQgMH19ZnVuY3Rpb24gYShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBzKGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHIsbz1ufHx1O3RyeXtyPW8oZXx8IiIpfWNhdGNoKGUpe3I9e319Zm9yKHZhciBpIGluIHQpcltpXT10W2ldO3JldHVybiByfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpPyhlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLHI9SGUobi5zaGlmdCgpKSxvPW4ubGVuZ3RoPjA/SGUobi5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09dFtyXT90W3JdPW86QXJyYXkuaXNBcnJheSh0W3JdKT90W3JdLnB1c2gobyk6dFtyXT1bdFtyXSxvXX0pLHQpOnR9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lP09iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbih0KXt2YXIgbj1lW3RdO2lmKHZvaWQgMD09PW4pcmV0dXJuIiI7aWYobnVsbD09PW4pcmV0dXJuIHFlKHQpO2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciByPVtdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7dm9pZCAwIT09ZSYmKG51bGw9PT1lP3IucHVzaChxZSh0KSk6ci5wdXNoKHFlKHQpKyI9IitxZShlKSkpfSksci5qb2luKCImIil9cmV0dXJuIHFlKHQpKyI9IitxZShuKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGg+MH0pLmpvaW4oIiYiKTpudWxsO3JldHVybiB0PyI/Iit0OiIifWZ1bmN0aW9uIGwoZSx0LG4scil7dmFyIG89ciYmci5vcHRpb25zLnN0cmluZ2lmeVF1ZXJ5LGk9dC5xdWVyeXx8e307dHJ5e2k9ZihpKX1jYXRjaChlKXt9dmFyIGE9e25hbWU6dC5uYW1lfHxlJiZlLm5hbWUsbWV0YTplJiZlLm1ldGF8fHt9LHBhdGg6dC5wYXRofHwiLyIsaGFzaDp0Lmhhc2h8fCIiLHF1ZXJ5OmkscGFyYW1zOnQucGFyYW1zfHx7fSxmdWxsUGF0aDpkKHQsbyksbWF0Y2hlZDplP3AoZSk6W119O3JldHVybiBuJiYoYS5yZWRpcmVjdGVkRnJvbT1kKG4sbykpLE9iamVjdC5mcmVlemUoYSl9ZnVuY3Rpb24gZihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChmKTtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09ZihlW25dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiBwKGUpe2Zvcih2YXIgdD1bXTtlOyl0LnVuc2hpZnQoZSksZT1lLnBhcmVudDtyZXR1cm4gdH1mdW5jdGlvbiBkKGUsdCl7dmFyIG49ZS5wYXRoLHI9ZS5xdWVyeTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIG89ZS5oYXNoO3ZvaWQgMD09PW8mJihvPSIiKTt2YXIgaT10fHxjO3JldHVybihufHwiLyIpK2kocikrb31mdW5jdGlvbiBoKGUsdCl7cmV0dXJuIHQ9PT1CZT9lPT09dDohIXQmJihlLnBhdGgmJnQucGF0aD9lLnBhdGgucmVwbGFjZShGZSwiIik9PT10LnBhdGgucmVwbGFjZShGZSwiIikmJmUuaGFzaD09PXQuaGFzaCYmdihlLnF1ZXJ5LHQucXVlcnkpOiEoIWUubmFtZXx8IXQubmFtZSkmJihlLm5hbWU9PT10Lm5hbWUmJmUuaGFzaD09PXQuaGFzaCYmdihlLnF1ZXJ5LHQucXVlcnkpJiZ2KGUucGFyYW1zLHQucGFyYW1zKSkpfWZ1bmN0aW9uIHYoZSx0KXtpZih2b2lkIDA9PT1lJiYoZT17fSksdm9pZCAwPT09dCYmKHQ9e30pLCFlfHwhdClyZXR1cm4gZT09PXQ7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtyZXR1cm4gbi5sZW5ndGg9PT1yLmxlbmd0aCYmbi5ldmVyeShmdW5jdGlvbihuKXt2YXIgcj1lW25dLG89dFtuXTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHImJiJvYmplY3QiPT10eXBlb2Ygbz92KHIsbyk6U3RyaW5nKHIpPT09U3RyaW5nKG8pfSl9ZnVuY3Rpb24gbShlLHQpe3JldHVybiAwPT09ZS5wYXRoLnJlcGxhY2UoRmUsIi8iKS5pbmRleE9mKHQucGF0aC5yZXBsYWNlKEZlLCIvIikpJiYoIXQuaGFzaHx8ZS5oYXNoPT09dC5oYXNoKSYmeShlLnF1ZXJ5LHQucXVlcnkpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIG4gaW4gdClpZighKG4gaW4gZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyhlKXtpZighKGUubWV0YUtleXx8ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5zaGlmdEtleXx8ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDAhPT1lLmJ1dHRvbiYmMCE9PWUuYnV0dG9uKSl7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKXtpZigvXGJfYmxhbmtcYi9pLnRlc3QoZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFyZ2V0IikpKXJldHVybn1yZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpLCEwfX1mdW5jdGlvbiBiKGUpe2lmKGUpZm9yKHZhciB0LG49MDtuPGUubGVuZ3RoO24rKyl7aWYodD1lW25dLCJhIj09PXQudGFnKXJldHVybiB0O2lmKHQuY2hpbGRyZW4mJih0PWIodC5jaGlsZHJlbikpKXJldHVybiB0fX1mdW5jdGlvbiB4KGUpe2lmKCF4Lmluc3RhbGxlZHx8TGUhPT1lKXt4Lmluc3RhbGxlZD0hMCxMZT1lO3ZhciB0PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lfSxuPWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU7dChyKSYmdChyPXIuZGF0YSkmJnQocj1yLnJlZ2lzdGVyUm91dGVJbnN0YW5jZSkmJnIoZSxuKX07ZS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dCh0aGlzLiRvcHRpb25zLnJvdXRlcik/KHRoaXMuX3JvdXRlclJvb3Q9dGhpcyx0aGlzLl9yb3V0ZXI9dGhpcy4kb3B0aW9ucy5yb3V0ZXIsdGhpcy5fcm91dGVyLmluaXQodGhpcyksZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsIl9yb3V0ZSIsdGhpcy5fcm91dGVyLmhpc3RvcnkuY3VycmVudCkpOnRoaXMuX3JvdXRlclJvb3Q9dGhpcy4kcGFyZW50JiZ0aGlzLiRwYXJlbnQuX3JvdXRlclJvb3R8fHRoaXMsbih0aGlzLHRoaXMpfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtuKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiJHJvdXRlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJSb290Ll9yb3V0ZXJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkcm91dGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm91dGVyUm9vdC5fcm91dGV9fSksZS5jb21wb25lbnQoInJvdXRlci12aWV3IixSZSksZS5jb21wb25lbnQoInJvdXRlci1saW5rIix6ZSk7dmFyIHI9ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO3IuYmVmb3JlUm91dGVFbnRlcj1yLmJlZm9yZVJvdXRlTGVhdmU9ci5iZWZvcmVSb3V0ZVVwZGF0ZT1yLmNyZWF0ZWR9fWZ1bmN0aW9uIHcoZSx0LG4pe3ZhciByPWUuY2hhckF0KDApO2lmKCIvIj09PXIpcmV0dXJuIGU7aWYoIj8iPT09cnx8IiMiPT09cilyZXR1cm4gdCtlO3ZhciBvPXQuc3BsaXQoIi8iKTtuJiZvW28ubGVuZ3RoLTFdfHxvLnBvcCgpO2Zvcih2YXIgaT1lLnJlcGxhY2UoL15cLy8sIiIpLnNwbGl0KCIvIiksYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgcz1pW2FdOyIuLiI9PT1zP28ucG9wKCk6Ii4iIT09cyYmby5wdXNoKHMpfXJldHVybiIiIT09b1swXSYmby51bnNoaWZ0KCIiKSxvLmpvaW4oIi8iKX1mdW5jdGlvbiBfKGUpe3ZhciB0PSIiLG49IiIscj1lLmluZGV4T2YoIiMiKTtyPj0wJiYodD1lLnNsaWNlKHIpLGU9ZS5zbGljZSgwLHIpKTt2YXIgbz1lLmluZGV4T2YoIj8iKTtyZXR1cm4gbz49MCYmKG49ZS5zbGljZShvKzEpLGU9ZS5zbGljZSgwLG8pKSx7cGF0aDplLHF1ZXJ5Om4saGFzaDp0fX1mdW5jdGlvbiBDKGUpe3JldHVybiBlLnJlcGxhY2UoL1wvXC8vZywiLyIpfWZ1bmN0aW9uIFQoZSx0KXtmb3IodmFyIG4scj1bXSxvPTAsaT0wLGE9IiIscz10JiZ0LmRlbGltaXRlcnx8Ii8iO251bGwhPShuPVplLmV4ZWMoZSkpOyl7dmFyIHU9blswXSxjPW5bMV0sbD1uLmluZGV4O2lmKGErPWUuc2xpY2UoaSxsKSxpPWwrdS5sZW5ndGgsYylhKz1jWzFdO2Vsc2V7dmFyIGY9ZVtpXSxwPW5bMl0sZD1uWzNdLGg9bls0XSx2PW5bNV0sbT1uWzZdLHk9bls3XTthJiYoci5wdXNoKGEpLGE9IiIpO3ZhciBnPW51bGwhPXAmJm51bGwhPWYmJmYhPT1wLGI9IisiPT09bXx8IioiPT09bSx4PSI/Ij09PW18fCIqIj09PW0sdz1uWzJdfHxzLF89aHx8djtyLnB1c2goe25hbWU6ZHx8bysrLHByZWZpeDpwfHwiIixkZWxpbWl0ZXI6dyxvcHRpb25hbDp4LHJlcGVhdDpiLHBhcnRpYWw6Zyxhc3RlcmlzazohIXkscGF0dGVybjpfP08oXyk6eT8iLioiOiJbXiIrRSh3KSsiXSs/In0pfX1yZXR1cm4gaTxlLmxlbmd0aCYmKGErPWUuc3Vic3RyKGkpKSxhJiZyLnB1c2goYSkscn1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuICQoVChlLHQpKX1mdW5jdGlvbiBBKGUpe3JldHVybiBlbmNvZGVVUkkoZSkucmVwbGFjZSgvW1wvPyNdL2csZnVuY3Rpb24oZSl7cmV0dXJuIiUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIGVuY29kZVVSSShlKS5yZXBsYWNlKC9bPyNdL2csZnVuY3Rpb24oZSl7cmV0dXJuIiUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uICQoZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKSJvYmplY3QiPT10eXBlb2YgZVtuXSYmKHRbbl09bmV3IFJlZ0V4cCgiXig/OiIrZVtuXS5wYXR0ZXJuKyIpJCIpKTtyZXR1cm4gZnVuY3Rpb24obixyKXtmb3IodmFyIG89IiIsaT1ufHx7fSxhPXJ8fHt9LHM9YS5wcmV0dHk/QTplbmNvZGVVUklDb21wb25lbnQsdT0wO3U8ZS5sZW5ndGg7dSsrKXt2YXIgYz1lW3VdO2lmKCJzdHJpbmciIT10eXBlb2YgYyl7dmFyIGwsZj1pW2MubmFtZV07aWYobnVsbD09Zil7aWYoYy5vcHRpb25hbCl7Yy5wYXJ0aWFsJiYobys9Yy5wcmVmaXgpO2NvbnRpbnVlfXRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkICInK2MubmFtZSsnIiB0byBiZSBkZWZpbmVkJyl9aWYoWGUoZikpe2lmKCFjLnJlcGVhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCAiJytjLm5hbWUrJyIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnK0pTT04uc3RyaW5naWZ5KGYpKyJgIik7aWYoMD09PWYubGVuZ3RoKXtpZihjLm9wdGlvbmFsKWNvbnRpbnVlO3Rocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkICInK2MubmFtZSsnIiB0byBub3QgYmUgZW1wdHknKX1mb3IodmFyIHA9MDtwPGYubGVuZ3RoO3ArKyl7aWYobD1zKGZbcF0pLCF0W3VdLnRlc3QobCkpdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsICInK2MubmFtZSsnIiB0byBtYXRjaCAiJytjLnBhdHRlcm4rJyIsIGJ1dCByZWNlaXZlZCBgJytKU09OLnN0cmluZ2lmeShsKSsiYCIpO28rPSgwPT09cD9jLnByZWZpeDpjLmRlbGltaXRlcikrbH19ZWxzZXtpZihsPWMuYXN0ZXJpc2s/UyhmKTpzKGYpLCF0W3VdLnRlc3QobCkpdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgIicrYy5uYW1lKyciIHRvIG1hdGNoICInK2MucGF0dGVybisnIiwgYnV0IHJlY2VpdmVkICInK2wrJyInKTtvKz1jLnByZWZpeCtsfX1lbHNlIG8rPWN9cmV0dXJuIG99fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xdfFwvXFxdKS9nLCJcXCQxIil9ZnVuY3Rpb24gTyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWz0hOiRcLygpXSkvZywiXFwkMSIpfWZ1bmN0aW9uIGooZSx0KXtyZXR1cm4gZS5rZXlzPXQsZX1mdW5jdGlvbiBOKGUpe3JldHVybiBlLnNlbnNpdGl2ZT8iIjoiaSJ9ZnVuY3Rpb24gRChlLHQpe3ZhciBuPWUuc291cmNlLm1hdGNoKC9cKCg/IVw/KS9nKTtpZihuKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQucHVzaCh7bmFtZTpyLHByZWZpeDpudWxsLGRlbGltaXRlcjpudWxsLG9wdGlvbmFsOiExLHJlcGVhdDohMSxwYXJ0aWFsOiExLGFzdGVyaXNrOiExLHBhdHRlcm46bnVsbH0pO3JldHVybiBqKGUsdCl9ZnVuY3Rpb24gTChlLHQsbil7Zm9yKHZhciByPVtdLG89MDtvPGUubGVuZ3RoO28rKylyLnB1c2goSShlW29dLHQsbikuc291cmNlKTtyZXR1cm4gaihuZXcgUmVnRXhwKCIoPzoiK3Iuam9pbigifCIpKyIpIixOKG4pKSx0KX1mdW5jdGlvbiBSKGUsdCxuKXtyZXR1cm4gTShUKGUsbiksdCxuKX1mdW5jdGlvbiBNKGUsdCxuKXtYZSh0KXx8KG49dHx8bix0PVtdKSxuPW58fHt9O2Zvcih2YXIgcj1uLnN0cmljdCxvPSExIT09bi5lbmQsaT0iIixhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBzPWVbYV07aWYoInN0cmluZyI9PXR5cGVvZiBzKWkrPUUocyk7ZWxzZXt2YXIgdT1FKHMucHJlZml4KSxjPSIoPzoiK3MucGF0dGVybisiKSI7dC5wdXNoKHMpLHMucmVwZWF0JiYoYys9Iig/OiIrdStjKyIpKiIpLGM9cy5vcHRpb25hbD9zLnBhcnRpYWw/dSsiKCIrYysiKT8iOiIoPzoiK3UrIigiK2MrIikpPyI6dSsiKCIrYysiKSIsaSs9Y319dmFyIGw9RShuLmRlbGltaXRlcnx8Ii8iKSxmPWkuc2xpY2UoLWwubGVuZ3RoKT09PWw7cmV0dXJuIHJ8fChpPShmP2kuc2xpY2UoMCwtbC5sZW5ndGgpOmkpKyIoPzoiK2wrIig/PSQpKT8iKSxpKz1vPyIkIjpyJiZmPyIiOiIoPz0iK2wrInwkKSIsaihuZXcgUmVnRXhwKCJeIitpLE4obikpLHQpfWZ1bmN0aW9uIEkoZSx0LG4pe3JldHVybiBYZSh0KXx8KG49dHx8bix0PVtdKSxuPW58fHt9LGUgaW5zdGFuY2VvZiBSZWdFeHA/RChlLHQpOlhlKGUpP0woZSx0LG4pOlIoZSx0LG4pfWZ1bmN0aW9uIFAoZSx0LG4pe3RyeXtyZXR1cm4oZXRbZV18fChldFtlXT1KZS5jb21waWxlKGUpKSkodHx8e30se3ByZXR0eTohMH0pfWNhdGNoKGUpe3JldHVybiIifX1mdW5jdGlvbiBxKGUsdCxuLHIpe3ZhciBvPXR8fFtdLGk9bnx8T2JqZWN0LmNyZWF0ZShudWxsKSxhPXJ8fE9iamVjdC5jcmVhdGUobnVsbCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0gobyxpLGEsZSl9KTtmb3IodmFyIHM9MCx1PW8ubGVuZ3RoO3M8dTtzKyspIioiPT09b1tzXSYmKG8ucHVzaChvLnNwbGljZShzLDEpWzBdKSx1LS0scy0tKTtyZXR1cm57cGF0aExpc3Q6byxwYXRoTWFwOmksbmFtZU1hcDphfX1mdW5jdGlvbiBIKGUsdCxuLHIsbyxpKXt2YXIgYT1yLnBhdGgscz1yLm5hbWUsdT1yLnBhdGhUb1JlZ2V4cE9wdGlvbnN8fHt9LGM9QihhLG8sdS5zdHJpY3QpOyJib29sZWFuIj09dHlwZW9mIHIuY2FzZVNlbnNpdGl2ZSYmKHUuc2Vuc2l0aXZlPXIuY2FzZVNlbnNpdGl2ZSk7dmFyIGw9e3BhdGg6YyxyZWdleDpGKGMsdSksY29tcG9uZW50czpyLmNvbXBvbmVudHN8fHtkZWZhdWx0OnIuY29tcG9uZW50fSxpbnN0YW5jZXM6e30sbmFtZTpzLHBhcmVudDpvLG1hdGNoQXM6aSxyZWRpcmVjdDpyLnJlZGlyZWN0LGJlZm9yZUVudGVyOnIuYmVmb3JlRW50ZXIsbWV0YTpyLm1ldGF8fHt9LHByb3BzOm51bGw9PXIucHJvcHM/e306ci5jb21wb25lbnRzP3IucHJvcHM6e2RlZmF1bHQ6ci5wcm9wc319O2lmKHIuY2hpbGRyZW4mJnIuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1pP0MoaSsiLyIrci5wYXRoKTp2b2lkIDA7SChlLHQsbixyLGwsbyl9KSx2b2lkIDAhPT1yLmFsaWFzKXsoQXJyYXkuaXNBcnJheShyLmFsaWFzKT9yLmFsaWFzOltyLmFsaWFzXSkuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgYT17cGF0aDppLGNoaWxkcmVuOnIuY2hpbGRyZW59O0goZSx0LG4sYSxvLGwucGF0aHx8Ii8iKX0pfXRbbC5wYXRoXXx8KGUucHVzaChsLnBhdGgpLHRbbC5wYXRoXT1sKSxzJiYobltzXXx8KG5bc109bCkpfWZ1bmN0aW9uIEYoZSx0KXt2YXIgbj1KZShlLFtdLHQpO3JldHVybiBufWZ1bmN0aW9uIEIoZSx0LG4pe3JldHVybiBufHwoZT1lLnJlcGxhY2UoL1wvJC8sIiIpKSwiLyI9PT1lWzBdP2U6bnVsbD09dD9lOkModC5wYXRoKyIvIitlKX1mdW5jdGlvbiBVKGUsdCxuLHIpe3ZhciBvPSJzdHJpbmciPT10eXBlb2YgZT97cGF0aDplfTplO2lmKG8ubmFtZXx8by5fbm9ybWFsaXplZClyZXR1cm4gbztpZighby5wYXRoJiZvLnBhcmFtcyYmdCl7bz1XKHt9LG8pLG8uX25vcm1hbGl6ZWQ9ITA7dmFyIGk9VyhXKHt9LHQucGFyYW1zKSxvLnBhcmFtcyk7aWYodC5uYW1lKW8ubmFtZT10Lm5hbWUsby5wYXJhbXM9aTtlbHNlIGlmKHQubWF0Y2hlZC5sZW5ndGgpe3ZhciBhPXQubWF0Y2hlZFt0Lm1hdGNoZWQubGVuZ3RoLTFdLnBhdGg7by5wYXRoPVAoYSxpLCJwYXRoICIrdC5wYXRoKX1yZXR1cm4gb312YXIgdT1fKG8ucGF0aHx8IiIpLGM9dCYmdC5wYXRofHwiLyIsbD11LnBhdGg/dyh1LnBhdGgsYyxufHxvLmFwcGVuZCk6YyxmPXModS5xdWVyeSxvLnF1ZXJ5LHImJnIub3B0aW9ucy5wYXJzZVF1ZXJ5KSxwPW8uaGFzaHx8dS5oYXNoO3JldHVybiBwJiYiIyIhPT1wLmNoYXJBdCgwKSYmKHA9IiMiK3ApLHtfbm9ybWFsaXplZDohMCxwYXRoOmwscXVlcnk6ZixoYXNoOnB9fWZ1bmN0aW9uIFcoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geihlLHQpe2Z1bmN0aW9uIG4oZSl7cShlLHUsYyxmKX1mdW5jdGlvbiByKGUsbixyKXt2YXIgbz1VKGUsbiwhMSx0KSxpPW8ubmFtZTtpZihpKXt2YXIgcz1mW2ldO2lmKCFzKXJldHVybiBhKG51bGwsbyk7dmFyIGw9cy5yZWdleC5rZXlzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5vcHRpb25hbH0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSk7aWYoIm9iamVjdCIhPXR5cGVvZiBvLnBhcmFtcyYmKG8ucGFyYW1zPXt9KSxuJiYib2JqZWN0Ij09dHlwZW9mIG4ucGFyYW1zKWZvcih2YXIgcCBpbiBuLnBhcmFtcykhKHAgaW4gby5wYXJhbXMpJiZsLmluZGV4T2YocCk+LTEmJihvLnBhcmFtc1twXT1uLnBhcmFtc1twXSk7aWYocylyZXR1cm4gby5wYXRoPVAocy5wYXRoLG8ucGFyYW1zLCduYW1lZCByb3V0ZSAiJytpKyciJyksYShzLG8scil9ZWxzZSBpZihvLnBhdGgpe28ucGFyYW1zPXt9O2Zvcih2YXIgZD0wO2Q8dS5sZW5ndGg7ZCsrKXt2YXIgaD11W2RdLHY9Y1toXTtpZihWKHYucmVnZXgsby5wYXRoLG8ucGFyYW1zKSlyZXR1cm4gYSh2LG8scil9fXJldHVybiBhKG51bGwsbyl9ZnVuY3Rpb24gbyhlLG4pe3ZhciBvPWUucmVkaXJlY3QsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKGwoZSxuLG51bGwsdCkpOm87aWYoInN0cmluZyI9PXR5cGVvZiBpJiYoaT17cGF0aDppfSksIWl8fCJvYmplY3QiIT10eXBlb2YgaSlyZXR1cm4gYShudWxsLG4pO3ZhciBzPWksdT1zLm5hbWUsYz1zLnBhdGgscD1uLnF1ZXJ5LGQ9bi5oYXNoLGg9bi5wYXJhbXM7aWYocD1zLmhhc093blByb3BlcnR5KCJxdWVyeSIpP3MucXVlcnk6cCxkPXMuaGFzT3duUHJvcGVydHkoImhhc2giKT9zLmhhc2g6ZCxoPXMuaGFzT3duUHJvcGVydHkoInBhcmFtcyIpP3MucGFyYW1zOmgsdSl7Zlt1XTtyZXR1cm4gcih7X25vcm1hbGl6ZWQ6ITAsbmFtZTp1LHF1ZXJ5OnAsaGFzaDpkLHBhcmFtczpofSx2b2lkIDAsbil9aWYoYyl7dmFyIHY9WChjLGUpO3JldHVybiByKHtfbm9ybWFsaXplZDohMCxwYXRoOlAodixoLCdyZWRpcmVjdCByb3V0ZSB3aXRoIHBhdGggIicrdisnIicpLHF1ZXJ5OnAsaGFzaDpkfSx2b2lkIDAsbil9cmV0dXJuIGEobnVsbCxuKX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgbz1QKG4sdC5wYXJhbXMsJ2FsaWFzZWQgcm91dGUgd2l0aCBwYXRoICInK24rJyInKSxpPXIoe19ub3JtYWxpemVkOiEwLHBhdGg6b30pO2lmKGkpe3ZhciBzPWkubWF0Y2hlZCx1PXNbcy5sZW5ndGgtMV07cmV0dXJuIHQucGFyYW1zPWkucGFyYW1zLGEodSx0KX1yZXR1cm4gYShudWxsLHQpfWZ1bmN0aW9uIGEoZSxuLHIpe3JldHVybiBlJiZlLnJlZGlyZWN0P28oZSxyfHxuKTplJiZlLm1hdGNoQXM/aShlLG4sZS5tYXRjaEFzKTpsKGUsbixyLHQpfXZhciBzPXEoZSksdT1zLnBhdGhMaXN0LGM9cy5wYXRoTWFwLGY9cy5uYW1lTWFwO3JldHVybnttYXRjaDpyLGFkZFJvdXRlczpufX1mdW5jdGlvbiBWKGUsdCxuKXt2YXIgcj10Lm1hdGNoKGUpO2lmKCFyKXJldHVybiExO2lmKCFuKXJldHVybiEwO2Zvcih2YXIgbz0xLGk9ci5sZW5ndGg7bzxpOysrbyl7dmFyIGE9ZS5rZXlzW28tMV0scz0ic3RyaW5nIj09dHlwZW9mIHJbb10/ZGVjb2RlVVJJQ29tcG9uZW50KHJbb10pOnJbb107YSYmKG5bYS5uYW1lXT1zKX1yZXR1cm4hMH1mdW5jdGlvbiBYKGUsdCl7cmV0dXJuIHcoZSx0LnBhcmVudD90LnBhcmVudC5wYXRoOiIvIiwhMCl9ZnVuY3Rpb24gSigpe3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7a2V5OmllKCl9LCIiKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLGZ1bmN0aW9uKGUpe0coKSxlLnN0YXRlJiZlLnN0YXRlLmtleSYmYWUoZS5zdGF0ZS5rZXkpfSl9ZnVuY3Rpb24gSyhlLHQsbixyKXtpZihlLmFwcCl7dmFyIG89ZS5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO28mJmUuYXBwLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciBlPVkoKSxpPW8odCxuLHI/ZTpudWxsKTtpJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkudGhlbj9pLnRoZW4oZnVuY3Rpb24odCl7cmUodCxlKX0pLmNhdGNoKGZ1bmN0aW9uKGUpe30pOnJlKGksZSkpfSl9fWZ1bmN0aW9uIEcoKXt2YXIgZT1pZSgpO2UmJih0dFtlXT17eDp3aW5kb3cucGFnZVhPZmZzZXQseTp3aW5kb3cucGFnZVlPZmZzZXR9KX1mdW5jdGlvbiBZKCl7dmFyIGU9aWUoKTtpZihlKXJldHVybiB0dFtlXX1mdW5jdGlvbiBRKGUsdCl7dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6by5sZWZ0LXIubGVmdC10LngseTpvLnRvcC1yLnRvcC10Lnl9fWZ1bmN0aW9uIFooZSl7cmV0dXJuIG5lKGUueCl8fG5lKGUueSl9ZnVuY3Rpb24gZWUoZSl7cmV0dXJue3g6bmUoZS54KT9lLng6d2luZG93LnBhZ2VYT2Zmc2V0LHk6bmUoZS55KT9lLnk6d2luZG93LnBhZ2VZT2Zmc2V0fX1mdW5jdGlvbiB0ZShlKXtyZXR1cm57eDpuZShlLngpP2UueDowLHk6bmUoZS55KT9lLnk6MH19ZnVuY3Rpb24gbmUoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfWZ1bmN0aW9uIHJlKGUsdCl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlO2lmKG4mJiJzdHJpbmciPT10eXBlb2YgZS5zZWxlY3Rvcil7dmFyIHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnNlbGVjdG9yKTtpZihyKXt2YXIgbz1lLm9mZnNldCYmIm9iamVjdCI9PXR5cGVvZiBlLm9mZnNldD9lLm9mZnNldDp7fTtvPXRlKG8pLHQ9UShyLG8pfWVsc2UgWihlKSYmKHQ9ZWUoZSkpfWVsc2UgbiYmWihlKSYmKHQ9ZWUoZSkpO3QmJndpbmRvdy5zY3JvbGxUbyh0LngsdC55KX1mdW5jdGlvbiBvZSgpe3JldHVybiBydC5ub3coKS50b0ZpeGVkKDMpfWZ1bmN0aW9uIGllKCl7cmV0dXJuIG90fWZ1bmN0aW9uIGFlKGUpe290PWV9ZnVuY3Rpb24gc2UoZSx0KXtHKCk7dmFyIG49d2luZG93Lmhpc3Rvcnk7dHJ5e3Q/bi5yZXBsYWNlU3RhdGUoe2tleTpvdH0sIiIsZSk6KG90PW9lKCksbi5wdXNoU3RhdGUoe2tleTpvdH0sIiIsZSkpfWNhdGNoKG4pe3dpbmRvdy5sb2NhdGlvblt0PyJyZXBsYWNlIjoiYXNzaWduIl0oZSl9fWZ1bmN0aW9uIHVlKGUpe3NlKGUsITApfWZ1bmN0aW9uIGNlKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihvKXtvPj1lLmxlbmd0aD9uKCk6ZVtvXT90KGVbb10sZnVuY3Rpb24oKXtyKG8rMSl9KTpyKG8rMSl9O3IoMCl9ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0hMSxhPTAscz1udWxsO2ZlKGUsZnVuY3Rpb24oZSx0LG4sdSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJnZvaWQgMD09PWUuY2lkKXtpPSEwLGErKzt2YXIgYyxsPWhlKGZ1bmN0aW9uKHQpe2RlKHQpJiYodD10LmRlZmF1bHQpLGUucmVzb2x2ZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpMZS5leHRlbmQodCksbi5jb21wb25lbnRzW3VdPXQsLS1hPD0wJiZyKCl9KSxmPWhlKGZ1bmN0aW9uKGUpe3ZhciB0PSJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQgIit1KyI6ICIrZTtzfHwocz1vKGUpP2U6bmV3IEVycm9yKHQpLHIocykpfSk7dHJ5e2M9ZShsLGYpfWNhdGNoKGUpe2YoZSl9aWYoYylpZigiZnVuY3Rpb24iPT10eXBlb2YgYy50aGVuKWMudGhlbihsLGYpO2Vsc2V7dmFyIHA9Yy5jb21wb25lbnQ7cCYmImZ1bmN0aW9uIj09dHlwZW9mIHAudGhlbiYmcC50aGVuKGwsZil9fX0pLGl8fHIoKX19ZnVuY3Rpb24gZmUoZSx0KXtyZXR1cm4gcGUoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUuY29tcG9uZW50cykubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0KGUuY29tcG9uZW50c1tuXSxlLmluc3RhbmNlc1tuXSxlLG4pfSl9KSl9ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSl9ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUuX19lc01vZHVsZXx8aXQmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddfWZ1bmN0aW9uIGhlKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPWFyZ3VtZW50c1tyXTtpZighdClyZXR1cm4gdD0hMCxlLmFwcGx5KHRoaXMsbil9fWZ1bmN0aW9uIHZlKGUpe2lmKCFlKWlmKFZlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIik7ZT10JiZ0LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiLyIsZT1lLnJlcGxhY2UoL15odHRwcz86XC9cL1teXC9dKy8sIiIpfWVsc2UgZT0iLyI7cmV0dXJuIi8iIT09ZS5jaGFyQXQoMCkmJihlPSIvIitlKSxlLnJlcGxhY2UoL1wvJC8sIiIpfWZ1bmN0aW9uIG1lKGUsdCl7dmFyIG4scj1NYXRoLm1heChlLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKG49MDtuPHImJmVbbl09PT10W25dO24rKyk7cmV0dXJue3VwZGF0ZWQ6dC5zbGljZSgwLG4pLGFjdGl2YXRlZDp0LnNsaWNlKG4pLGRlYWN0aXZhdGVkOmUuc2xpY2Uobil9fWZ1bmN0aW9uIHllKGUsdCxuLHIpe3ZhciBvPWZlKGUsZnVuY3Rpb24oZSxyLG8saSl7dmFyIGE9Z2UoZSx0KTtpZihhKXJldHVybiBBcnJheS5pc0FycmF5KGEpP2EubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUscixvLGkpfSk6bihhLHIsbyxpKX0pO3JldHVybiBwZShyP28ucmV2ZXJzZSgpOm8pfWZ1bmN0aW9uIGdlKGUsdCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPUxlLmV4dGVuZChlKSksZS5vcHRpb25zW3RdfWZ1bmN0aW9uIGJlKGUpe3JldHVybiB5ZShlLCJiZWZvcmVSb3V0ZUxlYXZlIix3ZSwhMCl9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIHllKGUsImJlZm9yZVJvdXRlVXBkYXRlIix3ZSl9ZnVuY3Rpb24gd2UoZSx0KXtpZih0KXJldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gX2UoZSx0LG4pe3JldHVybiB5ZShlLCJiZWZvcmVSb3V0ZUVudGVyIixmdW5jdGlvbihlLHIsbyxpKXtyZXR1cm4gQ2UoZSxvLGksdCxuKX0pfWZ1bmN0aW9uIENlKGUsdCxuLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKGksYSxzKXtyZXR1cm4gZShpLGEsZnVuY3Rpb24oZSl7cyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmci5wdXNoKGZ1bmN0aW9uKCl7VGUoZSx0Lmluc3RhbmNlcyxuLG8pfSl9KX19ZnVuY3Rpb24gVGUoZSx0LG4scil7dFtuXT9lKHRbbl0pOnIoKSYmc2V0VGltZW91dChmdW5jdGlvbigpe1RlKGUsdCxuLHIpfSwxNil9ZnVuY3Rpb24ga2UoZSl7dmFyIHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO3JldHVybiBlJiYwPT09dC5pbmRleE9mKGUpJiYodD10LnNsaWNlKGUubGVuZ3RoKSksKHR8fCIvIikrd2luZG93LmxvY2F0aW9uLnNlYXJjaCt3aW5kb3cubG9jYXRpb24uaGFzaH1mdW5jdGlvbiBBZShlKXt2YXIgdD1rZShlKTtpZighL15cLyMvLnRlc3QodCkpcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKEMoZSsiLyMiK3QpKSwhMH1mdW5jdGlvbiBTZSgpe3ZhciBlPSRlKCk7cmV0dXJuIi8iPT09ZS5jaGFyQXQoMCl8fChqZSgiLyIrZSksITEpfWZ1bmN0aW9uICRlKCl7dmFyIGU9d2luZG93LmxvY2F0aW9uLmhyZWYsdD1lLmluZGV4T2YoIiMiKTtyZXR1cm4tMT09PXQ/IiI6ZS5zbGljZSh0KzEpfWZ1bmN0aW9uIEVlKGUpe3ZhciB0PXdpbmRvdy5sb2NhdGlvbi5ocmVmLG49dC5pbmRleE9mKCIjIik7cmV0dXJuKG4+PTA/dC5zbGljZSgwLG4pOnQpKyIjIitlfWZ1bmN0aW9uIE9lKGUpe250P3NlKEVlKGUpKTp3aW5kb3cubG9jYXRpb24uaGFzaD1lfWZ1bmN0aW9uIGplKGUpe250P3VlKEVlKGUpKTp3aW5kb3cubG9jYXRpb24ucmVwbGFjZShFZShlKSl9ZnVuY3Rpb24gTmUoZSx0KXtyZXR1cm4gZS5wdXNoKHQpLGZ1bmN0aW9uKCl7dmFyIG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9fWZ1bmN0aW9uIERlKGUsdCxuKXt2YXIgcj0iaGFzaCI9PT1uPyIjIit0OnQ7cmV0dXJuIGU/QyhlKyIvIityKTpyfXZhciBMZSxSZT17bmFtZToicm91dGVyLXZpZXciLGZ1bmN0aW9uYWw6ITAscHJvcHM6e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wcm9wcyxyPXQuY2hpbGRyZW4sbz10LnBhcmVudCxzPXQuZGF0YTtzLnJvdXRlclZpZXc9ITA7Zm9yKHZhciB1PW8uJGNyZWF0ZUVsZW1lbnQsYz1uLm5hbWUsbD1vLiRyb3V0ZSxmPW8uX3JvdXRlclZpZXdDYWNoZXx8KG8uX3JvdXRlclZpZXdDYWNoZT17fSkscD0wLGQ9ITE7byYmby5fcm91dGVyUm9vdCE9PW87KW8uJHZub2RlJiZvLiR2bm9kZS5kYXRhLnJvdXRlclZpZXcmJnArKyxvLl9pbmFjdGl2ZSYmKGQ9ITApLG89by4kcGFyZW50O2lmKHMucm91dGVyVmlld0RlcHRoPXAsZClyZXR1cm4gdShmW2NdLHMscik7dmFyIGg9bC5tYXRjaGVkW3BdO2lmKCFoKXJldHVybiBmW2NdPW51bGwsdSgpO3ZhciB2PWZbY109aC5jb21wb25lbnRzW2NdO3MucmVnaXN0ZXJSb3V0ZUluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49aC5pbnN0YW5jZXNbY107KHQmJm4hPT1lfHwhdCYmbj09PWUpJiYoaC5pbnN0YW5jZXNbY109dCl9LChzLmhvb2t8fChzLmhvb2s9e30pKS5wcmVwYXRjaD1mdW5jdGlvbihlLHQpe2guaW5zdGFuY2VzW2NdPXQuY29tcG9uZW50SW5zdGFuY2V9O3ZhciBtPXMucHJvcHM9aShsLGgucHJvcHMmJmgucHJvcHNbY10pO2lmKG0pe209cy5wcm9wcz1hKHt9LG0pO3ZhciB5PXMuYXR0cnM9cy5hdHRyc3x8e307Zm9yKHZhciBnIGluIG0pdi5wcm9wcyYmZyBpbiB2LnByb3BzfHwoeVtnXT1tW2ddLGRlbGV0ZSBtW2ddKX1yZXR1cm4gdSh2LHMscil9fSxNZT0vWyEnKCkqXS9nLEllPWZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpfSxQZT0vJTJDL2cscWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKE1lLEllKS5yZXBsYWNlKFBlLCIsIil9LEhlPWRlY29kZVVSSUNvbXBvbmVudCxGZT0vXC8/JC8sQmU9bChudWxsLHtwYXRoOiIvIn0pLFVlPVtTdHJpbmcsT2JqZWN0XSxXZT1bU3RyaW5nLEFycmF5XSx6ZT17bmFtZToicm91dGVyLWxpbmsiLHByb3BzOnt0bzp7dHlwZTpVZSxyZXF1aXJlZDohMH0sdGFnOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJhIn0sZXhhY3Q6Qm9vbGVhbixhcHBlbmQ6Qm9vbGVhbixyZXBsYWNlOkJvb2xlYW4sYWN0aXZlQ2xhc3M6U3RyaW5nLGV4YWN0QWN0aXZlQ2xhc3M6U3RyaW5nLGV2ZW50Ont0eXBlOldlLGRlZmF1bHQ6ImNsaWNrIn19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kcm91dGVyLHI9dGhpcy4kcm91dGUsbz1uLnJlc29sdmUodGhpcy50byxyLHRoaXMuYXBwZW5kKSxpPW8ubG9jYXRpb24sYT1vLnJvdXRlLHM9by5ocmVmLHU9e30sYz1uLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzLGY9bi5vcHRpb25zLmxpbmtFeGFjdEFjdGl2ZUNsYXNzLHA9bnVsbD09Yz8icm91dGVyLWxpbmstYWN0aXZlIjpjLGQ9bnVsbD09Zj8icm91dGVyLWxpbmstZXhhY3QtYWN0aXZlIjpmLHY9bnVsbD09dGhpcy5hY3RpdmVDbGFzcz9wOnRoaXMuYWN0aXZlQ2xhc3MseT1udWxsPT10aGlzLmV4YWN0QWN0aXZlQ2xhc3M/ZDp0aGlzLmV4YWN0QWN0aXZlQ2xhc3MseD1pLnBhdGg/bChudWxsLGksbnVsbCxuKTphO3VbeV09aChyLHgpLHVbdl09dGhpcy5leGFjdD91W3ldOm0ocix4KTt2YXIgdz1mdW5jdGlvbihlKXtnKGUpJiYodC5yZXBsYWNlP24ucmVwbGFjZShpKTpuLnB1c2goaSkpfSxfPXtjbGljazpnfTtBcnJheS5pc0FycmF5KHRoaXMuZXZlbnQpP3RoaXMuZXZlbnQuZm9yRWFjaChmdW5jdGlvbihlKXtfW2VdPXd9KTpfW3RoaXMuZXZlbnRdPXc7dmFyIEM9e2NsYXNzOnV9O2lmKCJhIj09PXRoaXMudGFnKUMub249XyxDLmF0dHJzPXtocmVmOnN9O2Vsc2V7dmFyIFQ9Yih0aGlzLiRzbG90cy5kZWZhdWx0KTtpZihUKXtULmlzU3RhdGljPSExO3ZhciBrPUxlLnV0aWwuZXh0ZW5kOyhULmRhdGE9ayh7fSxULmRhdGEpKS5vbj1fOyhULmRhdGEuYXR0cnM9ayh7fSxULmRhdGEuYXR0cnMpKS5ocmVmPXN9ZWxzZSBDLm9uPV99cmV0dXJuIGUodGhpcy50YWcsQyx0aGlzLiRzbG90cy5kZWZhdWx0KX19LFZlPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFhlPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sSmU9SSxLZT1ULEdlPWssWWU9JCxRZT1NLFplPW5ldyBSZWdFeHAoWyIoXFxcXC4pIiwiKFtcXC8uXSk/KD86KD86XFw6KFxcdyspKD86XFwoKCg/OlxcXFwufFteXFxcXCgpXSkrKVxcKSk/fFxcKCgoPzpcXFxcLnxbXlxcXFwoKV0pKylcXCkpKFsrKj9dKT98KFxcKikpIl0uam9pbigifCIpLCJnIik7SmUucGFyc2U9S2UsSmUuY29tcGlsZT1HZSxKZS50b2tlbnNUb0Z1bmN0aW9uPVllLEplLnRva2Vuc1RvUmVnRXhwPVFlO3ZhciBldD1PYmplY3QuY3JlYXRlKG51bGwpLHR0PU9iamVjdC5jcmVhdGUobnVsbCksbnQ9VmUmJmZ1bmN0aW9uKCl7dmFyIGU9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7cmV0dXJuKC0xPT09ZS5pbmRleE9mKCJBbmRyb2lkIDIuIikmJi0xPT09ZS5pbmRleE9mKCJBbmRyb2lkIDQuMCIpfHwtMT09PWUuaW5kZXhPZigiTW9iaWxlIFNhZmFyaSIpfHwtMSE9PWUuaW5kZXhPZigiQ2hyb21lIil8fC0xIT09ZS5pbmRleE9mKCJXaW5kb3dzIFBob25lIikpJiYod2luZG93Lmhpc3RvcnkmJiJwdXNoU3RhdGUiaW4gd2luZG93Lmhpc3RvcnkpfSgpLHJ0PVZlJiZ3aW5kb3cucGVyZm9ybWFuY2UmJndpbmRvdy5wZXJmb3JtYW5jZS5ub3c/d2luZG93LnBlcmZvcm1hbmNlOkRhdGUsb3Q9b2UoKSxpdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyxhdD1mdW5jdGlvbihlLHQpe3RoaXMucm91dGVyPWUsdGhpcy5iYXNlPXZlKHQpLHRoaXMuY3VycmVudD1CZSx0aGlzLnBlbmRpbmc9bnVsbCx0aGlzLnJlYWR5PSExLHRoaXMucmVhZHlDYnM9W10sdGhpcy5yZWFkeUVycm9yQ2JzPVtdLHRoaXMuZXJyb3JDYnM9W119O2F0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24oZSl7dGhpcy5jYj1lfSxhdC5wcm90b3R5cGUub25SZWFkeT1mdW5jdGlvbihlLHQpe3RoaXMucmVhZHk/ZSgpOih0aGlzLnJlYWR5Q2JzLnB1c2goZSksdCYmdGhpcy5yZWFkeUVycm9yQ2JzLnB1c2godCkpfSxhdC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0aGlzLmVycm9yQ2JzLnB1c2goZSl9LGF0LnByb3RvdHlwZS50cmFuc2l0aW9uVG89ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsbz10aGlzLnJvdXRlci5tYXRjaChlLHRoaXMuY3VycmVudCk7dGhpcy5jb25maXJtVHJhbnNpdGlvbihvLGZ1bmN0aW9uKCl7ci51cGRhdGVSb3V0ZShvKSx0JiZ0KG8pLHIuZW5zdXJlVVJMKCksci5yZWFkeXx8KHIucmVhZHk9ITAsci5yZWFkeUNicy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uobyl9KSl9LGZ1bmN0aW9uKGUpe24mJm4oZSksZSYmIXIucmVhZHkmJihyLnJlYWR5PSEwLHIucmVhZHlFcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QoZSl9KSl9KX0sYXQucHJvdG90eXBlLmNvbmZpcm1UcmFuc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLGE9dGhpcy5jdXJyZW50LHM9ZnVuY3Rpb24oZSl7byhlKSYmKGkuZXJyb3JDYnMubGVuZ3RoP2kuZXJyb3JDYnMuZm9yRWFjaChmdW5jdGlvbih0KXt0KGUpfSk6KHIoITEsInVuY2F1Z2h0IGVycm9yIGR1cmluZyByb3V0ZSBuYXZpZ2F0aW9uOiIpLGNvbnNvbGUuZXJyb3IoZSkpKSxuJiZuKGUpfTtpZihoKGUsYSkmJmUubWF0Y2hlZC5sZW5ndGg9PT1hLm1hdGNoZWQubGVuZ3RoKXJldHVybiB0aGlzLmVuc3VyZVVSTCgpLHMoKTt2YXIgdT1tZSh0aGlzLmN1cnJlbnQubWF0Y2hlZCxlLm1hdGNoZWQpLGM9dS51cGRhdGVkLGw9dS5kZWFjdGl2YXRlZCxmPXUuYWN0aXZhdGVkLHA9W10uY29uY2F0KGJlKGwpLHRoaXMucm91dGVyLmJlZm9yZUhvb2tzLHhlKGMpLGYubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJlZm9yZUVudGVyfSksbGUoZikpO3RoaXMucGVuZGluZz1lO3ZhciBkPWZ1bmN0aW9uKHQsbil7aWYoaS5wZW5kaW5nIT09ZSlyZXR1cm4gcygpO3RyeXt0KGUsYSxmdW5jdGlvbihlKXshMT09PWV8fG8oZSk/KGkuZW5zdXJlVVJMKCEwKSxzKGUpKToic3RyaW5nIj09dHlwZW9mIGV8fCJvYmplY3QiPT10eXBlb2YgZSYmKCJzdHJpbmciPT10eXBlb2YgZS5wYXRofHwic3RyaW5nIj09dHlwZW9mIGUubmFtZSk/KHMoKSwib2JqZWN0Ij09dHlwZW9mIGUmJmUucmVwbGFjZT9pLnJlcGxhY2UoZSk6aS5wdXNoKGUpKTpuKGUpfSl9Y2F0Y2goZSl7cyhlKX19O2NlKHAsZCxmdW5jdGlvbigpe3ZhciBuPVtdO2NlKF9lKGYsbixmdW5jdGlvbigpe3JldHVybiBpLmN1cnJlbnQ9PT1lfSkuY29uY2F0KGkucm91dGVyLnJlc29sdmVIb29rcyksZCxmdW5jdGlvbigpe2lmKGkucGVuZGluZyE9PWUpcmV0dXJuIHMoKTtpLnBlbmRpbmc9bnVsbCx0KGUpLGkucm91dGVyLmFwcCYmaS5yb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbigpe24uZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pfSl9KX0sYXQucHJvdG90eXBlLnVwZGF0ZVJvdXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3VycmVudDt0aGlzLmN1cnJlbnQ9ZSx0aGlzLmNiJiZ0aGlzLmNiKGUpLHRoaXMucm91dGVyLmFmdGVySG9va3MuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZuKGUsdCl9KX07dmFyIHN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXt2YXIgcj10aGlzO2UuY2FsbCh0aGlzLHQsbik7dmFyIG89dC5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO28mJkooKTt2YXIgaT1rZSh0aGlzLmJhc2UpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsZnVuY3Rpb24oZSl7dmFyIG49ci5jdXJyZW50LGE9a2Uoci5iYXNlKTtyLmN1cnJlbnQ9PT1CZSYmYT09PWl8fHIudHJhbnNpdGlvblRvKGEsZnVuY3Rpb24oZSl7byYmSyh0LGUsbiwhMCl9KX0pfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5nbz1mdW5jdGlvbihlKXt3aW5kb3cuaGlzdG9yeS5nbyhlKX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyxvPXRoaXMsaT1vLmN1cnJlbnQ7dGhpcy50cmFuc2l0aW9uVG8oZSxmdW5jdGlvbihlKXtzZShDKHIuYmFzZStlLmZ1bGxQYXRoKSksSyhyLnJvdXRlcixlLGksITEpLHQmJnQoZSl9LG4pfSx0LnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLG89dGhpcyxpPW8uY3VycmVudDt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3VlKEMoci5iYXNlK2UuZnVsbFBhdGgpKSxLKHIucm91dGVyLGUsaSwhMSksdCYmdChlKX0sbil9LHQucHJvdG90eXBlLmVuc3VyZVVSTD1mdW5jdGlvbihlKXtpZihrZSh0aGlzLmJhc2UpIT09dGhpcy5jdXJyZW50LmZ1bGxQYXRoKXt2YXIgdD1DKHRoaXMuYmFzZSt0aGlzLmN1cnJlbnQuZnVsbFBhdGgpO2U/c2UodCk6dWUodCl9fSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4ga2UodGhpcy5iYXNlKX0sdH0oYXQpLHV0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIpe2UuY2FsbCh0aGlzLHQsbiksciYmQWUodGhpcy5iYXNlKXx8U2UoKX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuc2V0dXBMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5yb3V0ZXIsbj10Lm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3Iscj1udCYmbjtyJiZKKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIobnQ/InBvcHN0YXRlIjoiaGFzaGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgdD1lLmN1cnJlbnQ7U2UoKSYmZS50cmFuc2l0aW9uVG8oJGUoKSxmdW5jdGlvbihuKXtyJiZLKGUucm91dGVyLG4sdCwhMCksbnR8fGplKG4uZnVsbFBhdGgpfSl9KX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyxvPXRoaXMsaT1vLmN1cnJlbnQ7dGhpcy50cmFuc2l0aW9uVG8oZSxmdW5jdGlvbihlKXtPZShlLmZ1bGxQYXRoKSxLKHIucm91dGVyLGUsaSwhMSksdCYmdChlKX0sbil9LHQucHJvdG90eXBlLnJlcGxhY2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsbz10aGlzLGk9by5jdXJyZW50O3RoaXMudHJhbnNpdGlvblRvKGUsZnVuY3Rpb24oZSl7amUoZS5mdWxsUGF0aCksSyhyLnJvdXRlcixlLGksITEpLHQmJnQoZSl9LG4pfSx0LnByb3RvdHlwZS5nbz1mdW5jdGlvbihlKXt3aW5kb3cuaGlzdG9yeS5nbyhlKX0sdC5wcm90b3R5cGUuZW5zdXJlVVJMPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3VycmVudC5mdWxsUGF0aDskZSgpIT09dCYmKGU/T2UodCk6amUodCkpfSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gJGUoKX0sdH0oYXQpLGN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXtlLmNhbGwodGhpcyx0LG4pLHRoaXMuc3RhY2s9W10sdGhpcy5pbmRleD0tMX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpczt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3Iuc3RhY2s9ci5zdGFjay5zbGljZSgwLHIuaW5kZXgrMSkuY29uY2F0KGUpLHIuaW5kZXgrKyx0JiZ0KGUpfSxuKX0sdC5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpczt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3Iuc3RhY2s9ci5zdGFjay5zbGljZSgwLHIuaW5kZXgpLmNvbmNhdChlKSx0JiZ0KGUpfSxuKX0sdC5wcm90b3R5cGUuZ289ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuaW5kZXgrZTtpZighKG48MHx8bj49dGhpcy5zdGFjay5sZW5ndGgpKXt2YXIgcj10aGlzLnN0YWNrW25dO3RoaXMuY29uZmlybVRyYW5zaXRpb24ocixmdW5jdGlvbigpe3QuaW5kZXg9bix0LnVwZGF0ZVJvdXRlKHIpfSl9fSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3JldHVybiBlP2UuZnVsbFBhdGg6Ii8ifSx0LnByb3RvdHlwZS5lbnN1cmVVUkw9ZnVuY3Rpb24oKXt9LHR9KGF0KSxsdD1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5hcHA9bnVsbCx0aGlzLmFwcHM9W10sdGhpcy5vcHRpb25zPWUsdGhpcy5iZWZvcmVIb29rcz1bXSx0aGlzLnJlc29sdmVIb29rcz1bXSx0aGlzLmFmdGVySG9va3M9W10sdGhpcy5tYXRjaGVyPXooZS5yb3V0ZXN8fFtdLHRoaXMpO3ZhciB0PWUubW9kZXx8Imhhc2giO3N3aXRjaCh0aGlzLmZhbGxiYWNrPSJoaXN0b3J5Ij09PXQmJiFudCYmITEhPT1lLmZhbGxiYWNrLHRoaXMuZmFsbGJhY2smJih0PSJoYXNoIiksVmV8fCh0PSJhYnN0cmFjdCIpLHRoaXMubW9kZT10LHQpe2Nhc2UiaGlzdG9yeSI6dGhpcy5oaXN0b3J5PW5ldyBzdCh0aGlzLGUuYmFzZSk7YnJlYWs7Y2FzZSJoYXNoIjp0aGlzLmhpc3Rvcnk9bmV3IHV0KHRoaXMsZS5iYXNlLHRoaXMuZmFsbGJhY2spO2JyZWFrO2Nhc2UiYWJzdHJhY3QiOnRoaXMuaGlzdG9yeT1uZXcgY3QodGhpcyxlLmJhc2UpfX0sZnQ9e2N1cnJlbnRSb3V0ZTp7Y29uZmlndXJhYmxlOiEwfX07bHQucHJvdG90eXBlLm1hdGNoPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5tYXRjaGVyLm1hdGNoKGUsdCxuKX0sZnQuY3VycmVudFJvdXRlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpc3RvcnkmJnRoaXMuaGlzdG9yeS5jdXJyZW50fSxsdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuYXBwcy5wdXNoKGUpLCF0aGlzLmFwcCl7dGhpcy5hcHA9ZTt2YXIgbj10aGlzLmhpc3Rvcnk7aWYobiBpbnN0YW5jZW9mIHN0KW4udHJhbnNpdGlvblRvKG4uZ2V0Q3VycmVudExvY2F0aW9uKCkpO2Vsc2UgaWYobiBpbnN0YW5jZW9mIHV0KXt2YXIgcj1mdW5jdGlvbigpe24uc2V0dXBMaXN0ZW5lcnMoKX07bi50cmFuc2l0aW9uVG8obi5nZXRDdXJyZW50TG9jYXRpb24oKSxyLHIpfW4ubGlzdGVuKGZ1bmN0aW9uKGUpe3QuYXBwcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX3JvdXRlPWV9KX0pfX0sbHQucHJvdG90eXBlLmJlZm9yZUVhY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIE5lKHRoaXMuYmVmb3JlSG9va3MsZSl9LGx0LnByb3RvdHlwZS5iZWZvcmVSZXNvbHZlPWZ1bmN0aW9uKGUpe3JldHVybiBOZSh0aGlzLnJlc29sdmVIb29rcyxlKX0sbHQucHJvdG90eXBlLmFmdGVyRWFjaD1mdW5jdGlvbihlKXtyZXR1cm4gTmUodGhpcy5hZnRlckhvb2tzLGUpfSxsdC5wcm90b3R5cGUub25SZWFkeT1mdW5jdGlvbihlLHQpe3RoaXMuaGlzdG9yeS5vblJlYWR5KGUsdCl9LGx0LnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3RoaXMuaGlzdG9yeS5vbkVycm9yKGUpfSxsdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dGhpcy5oaXN0b3J5LnB1c2goZSx0LG4pfSxsdC5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbihlLHQsbil7dGhpcy5oaXN0b3J5LnJlcGxhY2UoZSx0LG4pfSxsdC5wcm90b3R5cGUuZ289ZnVuY3Rpb24oZSl7dGhpcy5oaXN0b3J5LmdvKGUpfSxsdC5wcm90b3R5cGUuYmFjaz1mdW5jdGlvbigpe3RoaXMuZ28oLTEpfSxsdC5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuZ28oMSl9LGx0LnByb3RvdHlwZS5nZXRNYXRjaGVkQ29tcG9uZW50cz1mdW5jdGlvbihlKXt2YXIgdD1lP2UubWF0Y2hlZD9lOnRoaXMucmVzb2x2ZShlKS5yb3V0ZTp0aGlzLmN1cnJlbnRSb3V0ZTtyZXR1cm4gdD9bXS5jb25jYXQuYXBwbHkoW10sdC5tYXRjaGVkLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZS5jb21wb25lbnRzKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUuY29tcG9uZW50c1t0XX0pfSkpOltdfSxsdC5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9VShlLHR8fHRoaXMuaGlzdG9yeS5jdXJyZW50LG4sdGhpcyksbz10aGlzLm1hdGNoKHIsdCksaT1vLnJlZGlyZWN0ZWRGcm9tfHxvLmZ1bGxQYXRoO3JldHVybntsb2NhdGlvbjpyLHJvdXRlOm8saHJlZjpEZSh0aGlzLmhpc3RvcnkuYmFzZSxpLHRoaXMubW9kZSksbm9ybWFsaXplZFRvOnIscmVzb2x2ZWQ6b319LGx0LnByb3RvdHlwZS5hZGRSb3V0ZXM9ZnVuY3Rpb24oZSl7dGhpcy5tYXRjaGVyLmFkZFJvdXRlcyhlKSx0aGlzLmhpc3RvcnkuY3VycmVudCE9PUJlJiZ0aGlzLmhpc3RvcnkudHJhbnNpdGlvblRvKHRoaXMuaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGx0LnByb3RvdHlwZSxmdCksbHQuaW5zdGFsbD14LGx0LnZlcnNpb249IjIuOC4xIixWZSYmd2luZG93LlZ1ZSYmd2luZG93LlZ1ZS51c2UobHQpLHQuYT1sdH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj17fSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBpPXRbb10sYT1pWzBdLHM9aVsxXSx1PWlbMl0sYz1pWzNdLGw9e2lkOmUrIjoiK28sY3NzOnMsbWVkaWE6dSxzb3VyY2VNYXA6Y307clthXT9yW2FdLnBhcnRzLnB1c2gobCk6bi5wdXNoKHJbYV09e2lkOmEscGFydHM6W2xdfSl9cmV0dXJuIG59fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1lWzFdfHwiIixvPWVbM107aWYoIW8pcmV0dXJuIG47aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2Epe3ZhciBpPXIobyk7cmV0dXJuW25dLmNvbmNhdChvLnNvdXJjZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIvKiMgc291cmNlVVJMPSIrby5zb3VyY2VSb290K2UrIiAqLyJ9KSkuY29uY2F0KFtpXSkuam9pbigiXG4iKX1yZXR1cm5bbl0uam9pbigiXG4iKX1mdW5jdGlvbiByKGUpe3JldHVybiIvKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSkpKSsiICovIn1lLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odCl7dmFyIHI9bih0LGUpO3JldHVybiB0WzJdPyJAbWVkaWEgIit0WzJdKyJ7IityKyJ9IjpyfSkuam9pbigiIil9LHQuaT1mdW5jdGlvbihlLG4peyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W1tudWxsLGUsIiJdXSk7Zm9yKHZhciByPXt9LG89MDtvPHRoaXMubGVuZ3RoO28rKyl7dmFyIGk9dGhpc1tvXVswXTsibnVtYmVyIj09dHlwZW9mIGkmJihyW2ldPSEwKX1mb3Iobz0wO288ZS5sZW5ndGg7bysrKXt2YXIgYT1lW29dOyJudW1iZXIiPT10eXBlb2YgYVswXSYmclthWzBdXXx8KG4mJiFhWzJdP2FbMl09bjpuJiYoYVsyXT0iKCIrYVsyXSsiKSBhbmQgKCIrbisiKSIpLHQucHVzaChhKSl9fSx0fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2U6KC9eWyciXS4qWyciXSQvLnRlc3QoZSkmJihlPWUuc2xpY2UoMSwtMSkpLC9bIicoKSBcdFxuXS8udGVzdChlKT8nIicrZS5yZXBsYWNlKC8iL2csJ1xcIicpLnJlcGxhY2UoL1xuL2csIlxcbiIpKyciJzplKX19LGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9bFtuLmlkXTtpZihyKXtyLnJlZnMrKztmb3IodmFyIG89MDtvPHIucGFydHMubGVuZ3RoO28rKylyLnBhcnRzW29dKG4ucGFydHNbb10pO2Zvcig7bzxuLnBhcnRzLmxlbmd0aDtvKyspci5wYXJ0cy5wdXNoKGkobi5wYXJ0c1tvXSkpO3IucGFydHMubGVuZ3RoPm4ucGFydHMubGVuZ3RoJiYoci5wYXJ0cy5sZW5ndGg9bi5wYXJ0cy5sZW5ndGgpfWVsc2V7Zm9yKHZhciBhPVtdLG89MDtvPG4ucGFydHMubGVuZ3RoO28rKylhLnB1c2goaShuLnBhcnRzW29dKSk7bFtuLmlkXT17aWQ6bi5pZCxyZWZzOjEscGFydHM6YX19fX1mdW5jdGlvbiBvKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gZS50eXBlPSJ0ZXh0L2NzcyIsZi5hcHBlbmRDaGlsZChlKSxlfWZ1bmN0aW9uIGkoZSl7dmFyIHQsbixyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInN0eWxlWyIreSsnfj0iJytlLmlkKyciXScpO2lmKHIpe2lmKGgpcmV0dXJuIHY7ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfWlmKGcpe3ZhciBpPWQrKztyPXB8fChwPW8oKSksdD1hLmJpbmQobnVsbCxyLGksITEpLG49YS5iaW5kKG51bGwscixpLCEwKX1lbHNlIHI9bygpLHQ9cy5iaW5kKG51bGwsciksbj1mdW5jdGlvbigpe3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKX07cmV0dXJuIHQoZSksZnVuY3Rpb24ocil7aWYocil7aWYoci5jc3M9PT1lLmNzcyYmci5tZWRpYT09PWUubWVkaWEmJnIuc291cmNlTWFwPT09ZS5zb3VyY2VNYXApcmV0dXJuO3QoZT1yKX1lbHNlIG4oKX19ZnVuY3Rpb24gYShlLHQsbixyKXt2YXIgbz1uPyIiOnIuY3NzO2lmKGUuc3R5bGVTaGVldCllLnN0eWxlU2hlZXQuY3NzVGV4dD1iKHQsbyk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKSxhPWUuY2hpbGROb2RlczthW3RdJiZlLnJlbW92ZUNoaWxkKGFbdF0pLGEubGVuZ3RoP2UuaW5zZXJ0QmVmb3JlKGksYVt0XSk6ZS5hcHBlbmRDaGlsZChpKX19ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPXQuY3NzLHI9dC5tZWRpYSxvPXQuc291cmNlTWFwO2lmKHImJmUuc2V0QXR0cmlidXRlKCJtZWRpYSIsciksbS5zc3JJZCYmZS5zZXRBdHRyaWJ1dGUoeSx0LmlkKSxvJiYobis9IlxuLyojIHNvdXJjZVVSTD0iK28uc291cmNlc1swXSsiICovIixuKz0iXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkobykpKSkrIiAqLyIpLGUuc3R5bGVTaGVldCllLnN0eWxlU2hlZXQuY3NzVGV4dD1uO2Vsc2V7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19dmFyIHU9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERFQlVHJiZERUJVRyYmIXUpdGhyb3cgbmV3IEVycm9yKCJ2dWUtc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuIFVzZSB7IHRhcmdldDogJ25vZGUnIH0gaW4geW91ciBXZWJwYWNrIGNvbmZpZyB0byBpbmRpY2F0ZSBhIHNlcnZlci1yZW5kZXJpbmcgZW52aXJvbm1lbnQuIik7dmFyIGM9big4NyksbD17fSxmPXUmJihkb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdKSxwPW51bGwsZD0wLGg9ITEsdj1mdW5jdGlvbigpe30sbT1udWxsLHk9ImRhdGEtdnVlLXNzci1pZCIsZz0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmL21zaWUgWzYtOV1cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXtoPW4sbT1vfHx7fTt2YXIgaT1jKGUsdCk7cmV0dXJuIHIoaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPVtdLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9aVtvXSxzPWxbYS5pZF07cy5yZWZzLS0sbi5wdXNoKHMpfXQ/KGk9YyhlLHQpLHIoaSkpOmk9W107Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBzPW5bb107aWYoMD09PXMucmVmcyl7Zm9yKHZhciB1PTA7dTxzLnBhcnRzLmxlbmd0aDt1Kyspcy5wYXJ0c1t1XSgpO2RlbGV0ZSBsW3MuaWRdfX19fTt2YXIgYj1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBlW3RdPW4sZS5maWx0ZXIoQm9vbGVhbikuam9pbigiXG4iKX19KCl9XSk7CisvLyMgc291cmNlTWFwcGluZ1VSTD12ZW5kb3IuMzViMGIzNDBlMGRhYjdmMzQwZTIuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL3ZlbmRvci43OTcwMzBjOTIxY2VkNzg2YmIwYS5qcyBiL2VtcGlyZS1kYi1leGFtcGxlcy9lbXBpcmUtZGItZXhhbXBsZS12dWUvc3JjL21haW4vd2ViYXBwL3N0YXRpYy9qcy92ZW5kb3IuNzk3MDMwYzkyMWNlZDc4NmJiMGEuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWNmMTUuLjAwMDAwMDAKLS0tIGEvZW1waXJlLWRiLWV4YW1wbGVzL2VtcGlyZS1kYi1leGFtcGxlLXZ1ZS9zcmMvbWFpbi93ZWJhcHAvc3RhdGljL2pzL3ZlbmRvci43OTcwMzBjOTIxY2VkNzg2YmIwYS5qcworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLXdlYnBhY2tKc29ucChbMF0sW2Z1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGksYT1lPWV8fHt9LHM9dHlwZW9mIGUuZGVmYXVsdDsib2JqZWN0IiE9PXMmJiJmdW5jdGlvbiIhPT1zfHwoaT1lLGE9ZS5kZWZhdWx0KTt2YXIgdT0iZnVuY3Rpb24iPT10eXBlb2YgYT9hLm9wdGlvbnM6YTt0JiYodS5yZW5kZXI9dC5yZW5kZXIsdS5zdGF0aWNSZW5kZXJGbnM9dC5zdGF0aWNSZW5kZXJGbnMpLHImJih1Ll9zY29wZUlkPXIpO3ZhciBjO2lmKG8/KGM9ZnVuY3Rpb24oZSl7ZT1lfHx0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dHx8dGhpcy5wYXJlbnQmJnRoaXMucGFyZW50LiR2bm9kZSYmdGhpcy5wYXJlbnQuJHZub2RlLnNzckNvbnRleHQsZXx8InVuZGVmaW5lZCI9PXR5cGVvZiBfX1ZVRV9TU1JfQ09OVEVYVF9ffHwoZT1fX1ZVRV9TU1JfQ09OVEVYVF9fKSxuJiZuLmNhbGwodGhpcyxlKSxlJiZlLl9yZWdpc3RlcmVkQ29tcG9uZW50cyYmZS5fcmVnaXN0ZXJlZENvbXBvbmVudHMuYWRkKG8pfSx1Ll9zc3JSZWdpc3Rlcj1jKTpuJiYoYz1uKSxjKXt2YXIgbD11LmZ1bmN0aW9uYWwsZj1sP3UucmVuZGVyOnUuYmVmb3JlQ3JlYXRlO2w/dS5yZW5kZXI9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gYy5jYWxsKHQpLGYoZSx0KX06dS5iZWZvcmVDcmVhdGU9Zj9bXS5jb25jYXQoZixjKTpbY119cmV0dXJue2VzTW9kdWxlOmksZXhwb3J0czphLG9wdGlvbnM6dX19fSxmdW5jdGlvbihlLHQpe3ZhciBuPWUuZXhwb3J0cz17dmVyc2lvbjoiMi41LjcifTsibnVtYmVyIj09dHlwZW9mIF9fZSYmKF9fZT1uKX0sLGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDUpLG89bigxKSxpPW4oNDYpLGE9big0OSkscz1uKDEyKSx1PWZ1bmN0aW9uKGUsdCxuKXt2YXIgYyxsLGYscD1lJnUuRixkPWUmdS5HLGg9ZSZ1LlMsdj1lJnUuUCxtPWUmdS5CLHk9ZSZ1LlcsZz1kP286b1t0XXx8KG9bdF09e30pLGI9Zy5wcm90b3R5cGUseD1kP3I6aD9yW3RdOihyW3RdfHx7fSkucHJvdG90eXBlO2QmJihuPXQpO2ZvcihjIGluIG4pKGw9IXAmJngmJnZvaWQgMCE9PXhbY10pJiZzKGcsYyl8fChmPWw/eFtjXTpuW2NdLGdbY109ZCYmImZ1bmN0aW9uIiE9dHlwZW9mIHhbY10/bltjXTptJiZsP2koZixyKTp5JiZ4W2NdPT1mP2Z1bmN0aW9uKGUpe3ZhciB0PWZ1bmN0aW9uKHQsbixyKXtpZih0aGlzIGluc3RhbmNlb2YgZSl7c3dpdGNoKGFyZ3VtZW50cy5sZW5ndGgpe2Nhc2UgMDpyZXR1cm4gbmV3IGU7Y2FzZSAxOnJldHVybiBuZXcgZSh0KTtjYXNlIDI6cmV0dXJuIG5ldyBlKHQsbil9cmV0dXJuIG5ldyBlKHQsbixyKX1yZXR1cm4gZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9O3JldHVybiB0LnByb3RvdHlwZT1lLnByb3RvdHlwZSx0fShmKTp2JiYiZnVuY3Rpb24iPT10eXBlb2YgZj9pKEZ1bmN0aW9uLmNhbGwsZik6Zix2JiYoKGcudmlydHVhbHx8KGcudmlydHVhbD17fSkpW2NdPWYsZSZ1LlImJmImJiFiW2NdJiZhKGIsYyxmKSkpfTt1LkY9MSx1Lkc9Mix1LlM9NCx1LlA9OCx1LkI9MTYsdS5XPTMyLHUuVT02NCx1LlI9MTI4LGUuZXhwb3J0cz11fSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXt0cnl7cmV0dXJuISFlKCl9Y2F0Y2goZSl7cmV0dXJuITB9fX0sZnVuY3Rpb24oZSx0KXt2YXIgbj1lLmV4cG9ydHM9InVuZGVmaW5lZCIhPXR5cGVvZiB3aW5kb3cmJndpbmRvdy5NYXRoPT1NYXRoP3dpbmRvdzoidW5kZWZpbmVkIiE9dHlwZW9mIHNlbGYmJnNlbGYuTWF0aD09TWF0aD9zZWxmOkZ1bmN0aW9uKCJyZXR1cm4gdGhpcyIpKCk7Im51bWJlciI9PXR5cGVvZiBfX2cmJihfX2c9bil9LGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7KGZ1bmN0aW9uKGUsbil7ZnVuY3Rpb24gcihlKXtyZXR1cm4gdm9pZCAwPT09ZXx8bnVsbD09PWV9ZnVuY3Rpb24gbyhlKXtyZXR1cm4gdm9pZCAwIT09ZSYmbnVsbCE9PWV9ZnVuY3Rpb24gaShlKXtyZXR1cm4hMD09PWV9ZnVuY3Rpb24gYShlKXtyZXR1cm4hMT09PWV9ZnVuY3Rpb24gcyhlKXtyZXR1cm4ic3RyaW5nIj09dHlwZW9mIGV8fCJudW1iZXIiPT10eXBlb2YgZXx8InN5bWJvbCI9PXR5cGVvZiBlfHwiYm9vbGVhbiI9PXR5cGVvZiBlfWZ1bmN0aW9uIHUoZSl7cmV0dXJuIG51bGwhPT1lJiYib2JqZWN0Ij09dHlwZW9mIGV9ZnVuY3Rpb24gYyhlKXtyZXR1cm4iW29iamVjdCBPYmplY3RdIj09PXVpLmNhbGwoZSl9ZnVuY3Rpb24gbChlKXtyZXR1cm4iW29iamVjdCBSZWdFeHBdIj09PXVpLmNhbGwoZSl9ZnVuY3Rpb24gZihlKXt2YXIgdD1wYXJzZUZsb2F0KFN0cmluZyhlKSk7cmV0dXJuIHQ+PTAmJk1hdGguZmxvb3IodCk9PT10JiZpc0Zpbml0ZShlKX1mdW5jdGlvbiBwKGUpe3JldHVybiBudWxsPT1lPyIiOiJvYmplY3QiPT10eXBlb2YgZT9KU09OLnN0cmluZ2lmeShlLG51bGwsMik6U3RyaW5nKGUpfWZ1bmN0aW9uIGQoZSl7dmFyIHQ9cGFyc2VGbG9hdChlKTtyZXR1cm4gaXNOYU4odCk/ZTp0fWZ1bmN0aW9uIGgoZSx0KXtmb3IodmFyIG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWUuc3BsaXQoIiwiKSxvPTA7bzxyLmxlbmd0aDtvKyspbltyW29dXT0hMDtyZXR1cm4gdD9mdW5jdGlvbihlKXtyZXR1cm4gbltlLnRvTG93ZXJDYXNlKCldfTpmdW5jdGlvbihlKXtyZXR1cm4gbltlXX19ZnVuY3Rpb24gdihlLHQpe2lmKGUubGVuZ3RoKXt2YXIgbj1lLmluZGV4T2YodCk7aWYobj4tMSlyZXR1cm4gZS5zcGxpY2UobiwxKX19ZnVuY3Rpb24gbShlLHQpe3JldHVybiBmaS5jYWxsKGUsdCl9ZnVuY3Rpb24geShlKXt2YXIgdD1PYmplY3QuY3JlYXRlKG51bGwpO3JldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gdFtuXXx8KHRbbl09ZShuKSl9fWZ1bmN0aW9uIGcoZSx0KXtmdW5jdGlvbiBuKG4pe3ZhciByPWFyZ3VtZW50cy5sZW5ndGg7cmV0dXJuIHI/cj4xP2UuYXBwbHkodCxhcmd1bWVudHMpOmUuY2FsbCh0LG4pOmUuY2FsbCh0KX1yZXR1cm4gbi5fbGVuZ3RoPWUubGVuZ3RoLG59ZnVuY3Rpb24gYihlLHQpe3JldHVybiBlLmJpbmQodCl9ZnVuY3Rpb24geChlLHQpe3Q9dHx8MDtmb3IodmFyIG49ZS5sZW5ndGgtdCxyPW5ldyBBcnJheShuKTtuLS07KXJbbl09ZVtuK3RdO3JldHVybiByfWZ1bmN0aW9uIHcoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24gXyhlKXtmb3IodmFyIHQ9e30sbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJncodCxlW25dKTtyZXR1cm4gdH1mdW5jdGlvbiBDKGUsdCxuKXt9ZnVuY3Rpb24gVChlLHQpe2lmKGU9PT10KXJldHVybiEwO3ZhciBuPXUoZSkscj11KHQpO2lmKCFufHwhcilyZXR1cm4hbiYmIXImJlN0cmluZyhlKT09PVN0cmluZyh0KTt0cnl7dmFyIG89QXJyYXkuaXNBcnJheShlKSxpPUFycmF5LmlzQXJyYXkodCk7aWYobyYmaSlyZXR1cm4gZS5sZW5ndGg9PT10Lmxlbmd0aCYmZS5ldmVyeShmdW5jdGlvbihlLG4pe3JldHVybiBUKGUsdFtuXSl9KTtpZihvfHxpKXJldHVybiExO3ZhciBhPU9iamVjdC5rZXlzKGUpLHM9T2JqZWN0LmtleXModCk7cmV0dXJuIGEubGVuZ3RoPT09cy5sZW5ndGgmJmEuZXZlcnkoZnVuY3Rpb24obil7cmV0dXJuIFQoZVtuXSx0W25dKX0pfWNhdGNoKGUpe3JldHVybiExfX1mdW5jdGlvbiBrKGUsdCl7Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspaWYoVChlW25dLHQpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIEEoZSl7dmFyIHQ9ITE7cmV0dXJuIGZ1bmN0aW9uKCl7dHx8KHQ9ITAsZS5hcHBseSh0aGlzLGFyZ3VtZW50cykpfX1mdW5jdGlvbiBTKGUpe3ZhciB0PShlKyIiKS5jaGFyQ29kZUF0KDApO3JldHVybiAzNj09PXR8fDk1PT09dH1mdW5jdGlvbiAkKGUsdCxuLHIpe09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse3ZhbHVlOm4sZW51bWVyYWJsZTohIXIsd3JpdGFibGU6ITAsY29uZmlndXJhYmxlOiEwfSl9ZnVuY3Rpb24gRShlKXtpZighVGkudGVzdChlKSl7dmFyIHQ9ZS5zcGxpdCgiLiIpO3JldHVybiBmdW5jdGlvbihlKXtmb3IodmFyIG49MDtuPHQubGVuZ3RoO24rKyl7aWYoIWUpcmV0dXJuO2U9ZVt0W25dXX1yZXR1cm4gZX19fWZ1bmN0aW9uIE8oZSl7cmV0dXJuImZ1bmN0aW9uIj09dHlwZW9mIGUmJi9uYXRpdmUgY29kZS8udGVzdChlLnRvU3RyaW5nKCkpfWZ1bmN0aW9uIGooZSl7V2kudGFyZ2V0JiZ6aS5wdXNoKFdpLnRhcmdldCksV2kudGFyZ2V0PWV9ZnVuY3Rpb24gTigpe1dpLnRhcmdldD16aS5wb3AoKX1mdW5jdGlvbiBMKGUpe3JldHVybiBuZXcgVmkodm9pZCAwLHZvaWQgMCx2b2lkIDAsU3RyaW5nKGUpKX1mdW5jdGlvbiBEKGUpe3ZhciB0PW5ldyBWaShlLnRhZyxlLmRhdGEsZS5jaGlsZHJlbixlLnRleHQsZS5lbG0sZS5jb250ZXh0LGUuY29tcG9uZW50T3B0aW9ucyxlLmFzeW5jRmFjdG9yeSk7cmV0dXJuIHQubnM9ZS5ucyx0LmlzU3RhdGljPWUuaXNTdGF0aWMsdC5rZXk9ZS5rZXksdC5pc0NvbW1lbnQ9ZS5pc0NvbW1lbnQsdC5mbkNvbnRleHQ9ZS5mbkNvbnRleHQsdC5mbk9wdGlvbnM9ZS5mbk9wdGlvbnMsdC5mblNjb3BlSWQ9ZS5mblNjb3BlSWQsdC5pc0Nsb25lZD0hMCx0fWZ1bmN0aW9uIEkoZSl7UWk9ZX1mdW5jdGlvbiBSKGUsdCxuKXtlLl9fcHJvdG9fXz10fWZ1bmN0aW9uIFAoZSx0LG4pe2Zvcih2YXIgcj0wLG89bi5sZW5ndGg7cjxvO3IrKyl7dmFyIGk9bltyXTskKGUsaSx0W2ldKX19ZnVuY3Rpb24gTShlLHQpe2lmKHUoZSkmJiEoZSBpbnN0YW5jZW9mIFZpKSl7dmFyIG47cmV0dXJuIG0oZSwiX19vYl9fIikmJmUuX19vYl9fIGluc3RhbmNlb2YgWmk/bj1lLl9fb2JfXzpRaSYmIXFpKCkmJihBcnJheS5pc0FycmF5KGUpfHxjKGUpKSYmT2JqZWN0LmlzRXh0ZW5zaWJsZShlKSYmIWUuX2lzVnVlJiYobj1uZXcgWmkoZSkpLHQmJm4mJm4udm1Db3VudCsrLG59fWZ1bmN0aW9uIHEoZSx0LG4scixvKXt2YXIgaT1uZXcgV2ksYT1PYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGUsdCk7aWYoIWF8fCExIT09YS5jb25maWd1cmFibGUpe3ZhciBzPWEmJmEuZ2V0O3N8fDIhPT1hcmd1bWVudHMubGVuZ3RofHwobj1lW3RdKTt2YXIgdT1hJiZhLnNldCxjPSFvJiZNKG4pO09iamVjdC5kZWZpbmVQcm9wZXJ0eShlLHQse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLGdldDpmdW5jdGlvbigpe3ZhciB0PXM/cy5jYWxsKGUpOm47cmV0dXJuIFdpLnRhcmdldCYmKGkuZGVwZW5kKCksYyYmKGMuZGVwLmRlcGVuZCgpLEFycmF5LmlzQXJyYXkodCkmJkIodCkpKSx0fSxzZXQ6ZnVuY3Rpb24odCl7dmFyIHI9cz9zLmNhbGwoZSk6bjt0PT09cnx8dCE9PXQmJnIhPT1yfHwodT91LmNhbGwoZSx0KTpuPXQsYz0hbyYmTSh0KSxpLm5vdGlmeSgpKX19KX19ZnVuY3Rpb24gSChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSYmZih0KSlyZXR1cm4gZS5sZW5ndGg9TWF0aC5tYXgoZS5sZW5ndGgsdCksZS5zcGxpY2UodCwxLG4pLG47aWYodCBpbiBlJiYhKHQgaW4gT2JqZWN0LnByb3RvdHlwZSkpcmV0dXJuIGVbdF09bixuO3ZhciByPWUuX19vYl9fO3JldHVybiBlLl9pc1Z1ZXx8ciYmci52bUNvdW50P246cj8ocShyLnZhbHVlLHQsbiksci5kZXAubm90aWZ5KCksbik6KGVbdF09bixuKX1mdW5jdGlvbiBGKGUsdCl7aWYoQXJyYXkuaXNBcnJheShlKSYmZih0KSlyZXR1cm4gdm9pZCBlLnNwbGljZSh0LDEpO3ZhciBuPWUuX19vYl9fO2UuX2lzVnVlfHxuJiZuLnZtQ291bnR8fG0oZSx0KSYmKGRlbGV0ZSBlW3RdLG4mJm4uZGVwLm5vdGlmeSgpKX1mdW5jdGlvbiBCKGUpe2Zvcih2YXIgdD12b2lkIDAsbj0wLHI9ZS5sZW5ndGg7bjxyO24rKyl0PWVbbl0sdCYmdC5fX29iX18mJnQuX19vYl9fLmRlcC5kZXBlbmQoKSxBcnJheS5pc0FycmF5KHQpJiZCKHQpfWZ1bmN0aW9uIFUoZSx0KXtpZighdClyZXR1cm4gZTtmb3IodmFyIG4scixvLGk9T2JqZWN0LmtleXModCksYT0wO2E8aS5sZW5ndGg7YSsrKW49aVthXSxyPWVbbl0sbz10W25dLG0oZSxuKT9jKHIpJiZjKG8pJiZVKHIsbyk6SChlLG4sbyk7cmV0dXJuIGV9ZnVuY3Rpb24gVyhlLHQsbil7cmV0dXJuIG4/ZnVuY3Rpb24oKXt2YXIgcj0iZnVuY3Rpb24iPT10eXBlb2YgdD90LmNhbGwobixuKTp0LG89ImZ1bmN0aW9uIj09dHlwZW9mIGU/ZS5jYWxsKG4sbik6ZTtyZXR1cm4gcj9VKHIsbyk6b306dD9lP2Z1bmN0aW9uKCl7cmV0dXJuIFUoImZ1bmN0aW9uIj09dHlwZW9mIHQ/dC5jYWxsKHRoaXMsdGhpcyk6dCwiZnVuY3Rpb24iPT10eXBlb2YgZT9lLmNhbGwodGhpcyx0aGlzKTplKX06dDplfWZ1bmN0aW9uIHooZSx0KXtyZXR1cm4gdD9lP2UuY29uY2F0KHQpOkFycmF5LmlzQXJyYXkodCk/dDpbdF06ZX1mdW5jdGlvbiBWKGUsdCxuLHIpe3ZhciBvPU9iamVjdC5jcmVhdGUoZXx8bnVsbCk7cmV0dXJuIHQ/dyhvLHQpOm99ZnVuY3Rpb24gWChlLHQpe3ZhciBuPWUucHJvcHM7aWYobil7dmFyIHIsbyxpLGE9e307aWYoQXJyYXkuaXNBcnJheShuKSlmb3Iocj1uLmxlbmd0aDtyLS07KSJzdHJpbmciPT10eXBlb2Yobz1uW3JdKSYmKGk9ZGkobyksYVtpXT17dHlwZTpudWxsfSk7ZWxzZSBpZihjKG4pKWZvcih2YXIgcyBpbiBuKW89bltzXSxpPWRpKHMpLGFbaV09YyhvKT9vOnt0eXBlOm99O2UucHJvcHM9YX19ZnVuY3Rpb24gSihlLHQpe3ZhciBuPWUuaW5qZWN0O2lmKG4pe3ZhciByPWUuaW5qZWN0PXt9O2lmKEFycmF5LmlzQXJyYXkobikpZm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspcltuW29dXT17ZnJvbTpuW29dfTtlbHNlIGlmKGMobikpZm9yKHZhciBpIGluIG4pe3ZhciBhPW5baV07cltpXT1jKGEpP3coe2Zyb206aX0sYSk6e2Zyb206YX19fX1mdW5jdGlvbiBLKGUpe3ZhciB0PWUuZGlyZWN0aXZlcztpZih0KWZvcih2YXIgbiBpbiB0KXt2YXIgcj10W25dOyJmdW5jdGlvbiI9PXR5cGVvZiByJiYodFtuXT17YmluZDpyLHVwZGF0ZTpyfSl9fWZ1bmN0aW9uIEcoZSx0LG4pe2Z1bmN0aW9uIHIocil7dmFyIG89ZWFbcl18fHJhO3Vbcl09byhlW3JdLHRbcl0sbixyKX0iZnVuY3Rpb24iPT10eXBlb2YgdCYmKHQ9dC5vcHRpb25zKSxYKHQsbiksSih0LG4pLEsodCk7dmFyIG89dC5leHRlbmRzO2lmKG8mJihlPUcoZSxvLG4pKSx0Lm1peGlucylmb3IodmFyIGk9MCxhPXQubWl4aW5zLmxlbmd0aDtpPGE7aSsrKWU9RyhlLHQubWl4aW5zW2ldLG4pO3ZhciBzLHU9e307Zm9yKHMgaW4gZSlyKHMpO2ZvcihzIGluIHQpbShlLHMpfHxyKHMpO3JldHVybiB1fWZ1bmN0aW9uIFkoZSx0LG4scil7aWYoInN0cmluZyI9PXR5cGVvZiBuKXt2YXIgbz1lW3RdO2lmKG0obyxuKSlyZXR1cm4gb1tuXTt2YXIgaT1kaShuKTtpZihtKG8saSkpcmV0dXJuIG9baV07dmFyIGE9aGkoaSk7aWYobShvLGEpKXJldHVybiBvW2FdO3JldHVybiBvW25dfHxvW2ldfHxvW2FdfX1mdW5jdGlvbiBRKGUsdCxuLHIpe3ZhciBvPXRbZV0saT0hbShuLGUpLGE9bltlXSxzPW5lKEJvb2xlYW4sby50eXBlKTtpZihzPi0xKWlmKGkmJiFtKG8sImRlZmF1bHQiKSlhPSExO2Vsc2UgaWYoIiI9PT1hfHxhPT09bWkoZSkpe3ZhciB1PW5lKFN0cmluZyxvLnR5cGUpOyh1PDB8fHM8dSkmJihhPSEwKX1pZih2b2lkIDA9PT1hKXthPVoocixvLGUpO3ZhciBjPVFpO0koITApLE0oYSksSShjKX1yZXR1cm4gYX1mdW5jdGlvbiBaKGUsdCxuKXtpZihtKHQsImRlZmF1bHQiKSl7dmFyIHI9dC5kZWZhdWx0O3JldHVybiBlJiZlLiRvcHRpb25zLnByb3BzRGF0YSYmdm9pZCAwPT09ZS4kb3B0aW9ucy5wcm9wc0RhdGFbbl0mJnZvaWQgMCE9PWUuX3Byb3BzW25dP2UuX3Byb3BzW25dOiJmdW5jdGlvbiI9PXR5cGVvZiByJiYiRnVuY3Rpb24iIT09ZWUodC50eXBlKT9yLmNhbGwoZSk6cn19ZnVuY3Rpb24gZWUoZSl7dmFyIHQ9ZSYmZS50b1N0cmluZygpLm1hdGNoKC9eXHMqZnVuY3Rpb24gKFx3KykvKTtyZXR1cm4gdD90WzFdOiIifWZ1bmN0aW9uIHRlKGUsdCl7cmV0dXJuIGVlKGUpPT09ZWUodCl9ZnVuY3Rpb24gbmUoZSx0KXtpZighQXJyYXkuaXNBcnJheSh0KSlyZXR1cm4gdGUodCxlKT8wOi0xO2Zvcih2YXIgbj0wLHI9dC5sZW5ndGg7bjxyO24rKylpZih0ZSh0W25dLGUpKXJldHVybiBuO3JldHVybi0xfWZ1bmN0aW9uIHJlKGUsdCxuKXtpZih0KWZvcih2YXIgcj10O3I9ci4kcGFyZW50Oyl7dmFyIG89ci4kb3B0aW9ucy5lcnJvckNhcHR1cmVkO2lmKG8pZm9yKHZhciBpPTA7aTxvLmxlbmd0aDtpKyspdHJ5e3ZhciBhPSExPT09b1tpXS5jYWxsKHIsZSx0LG4pO2lmKGEpcmV0dXJufWNhdGNoKGUpe29lKGUsciwiZXJyb3JDYXB0dXJlZCBob29rIil9fW9lKGUsdCxuKX1mdW5jdGlvbiBvZShlLHQsbil7aWYoQ2kuZXJyb3JIYW5kbGVyKXRyeXtyZXR1cm4gQ2kuZXJyb3JIYW5kbGVyLmNhbGwobnVsbCxlLHQsbil9Y2F0Y2goZSl7aWUoZSxudWxsLCJjb25maWcuZXJyb3JIYW5kbGVyIil9aWUoZSx0LG4pfWZ1bmN0aW9uIGllKGUsdCxuKXtpZighQWkmJiFTaXx8InVuZGVmaW5lZCI9PXR5cGVvZiBjb25zb2xlKXRocm93IGU7Y29uc29sZS5lcnJvcihlKX1mdW5jdGlvbiBhZSgpe2lhPSExO3ZhciBlPW9hLnNsaWNlKDApO29hLmxlbmd0aD0wO2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0oKX1mdW5jdGlvbiBzZShlKXtyZXR1cm4gZS5fd2l0aFRhc2t8fChlLl93aXRoVGFzaz1mdW5jdGlvbigpe2FhPSEwO3ZhciB0PWUuYXBwbHkobnVsbCxhcmd1bWVudHMpO3JldHVybiBhYT0hMSx0fSl9ZnVuY3Rpb24gdWUoZSx0KXt2YXIgbjtpZihvYS5wdXNoKGZ1bmN0aW9uKCl7aWYoZSl0cnl7ZS5jYWxsKHQpfWNhdGNoKGUpe3JlKGUsdCwibmV4dFRpY2siKX1lbHNlIG4mJm4odCl9KSxpYXx8KGlhPSEwLGFhP25hKCk6dGEoKSksIWUmJiJ1bmRlZmluZWQiIT10eXBlb2YgUHJvbWlzZSlyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oZSl7bj1lfSl9ZnVuY3Rpb24gY2UoZSl7bGUoZSxmYSksZmEuY2xlYXIoKX1mdW5jdGlvbiBsZShlLHQpe3ZhciBuLHIsbz1BcnJheS5pc0FycmF5KGUpO2lmKCEoIW8mJiF1KGUpfHxPYmplY3QuaXNGcm96ZW4oZSl8fGUgaW5zdGFuY2VvZiBWaSkpe2lmKGUuX19vYl9fKXt2YXIgaT1lLl9fb2JfXy5kZXAuaWQ7aWYodC5oYXMoaSkpcmV0dXJuO3QuYWRkKGkpfWlmKG8pZm9yKG49ZS5sZW5ndGg7bi0tOylsZShlW25dLHQpO2Vsc2UgZm9yKHI9T2JqZWN0LmtleXMoZSksbj1yLmxlbmd0aDtuLS07KWxlKGVbcltuXV0sdCl9fWZ1bmN0aW9uIGZlKGUpe2Z1bmN0aW9uIHQoKXt2YXIgZT1hcmd1bWVudHMsbj10LmZucztpZighQXJyYXkuaXNBcnJheShuKSlyZXR1cm4gbi5hcHBseShudWxsLGFyZ3VtZW50cyk7Zm9yKHZhciByPW4uc2xpY2UoKSxvPTA7bzxyLmxlbmd0aDtvKyspcltvXS5hcHBseShudWxsLGUpfXJldHVybiB0LmZucz1lLHR9ZnVuY3Rpb24gcGUoZSx0LG4sbyxpKXt2YXIgYSxzLHUsYztmb3IoYSBpbiBlKXM9ZVthXSx1PXRbYV0sYz1wYShhKSxyKHMpfHwocih1KT8ocihzLmZucykmJihzPWVbYV09ZmUocykpLG4oYy5uYW1lLHMsYy5vbmNlLGMuY2FwdHVyZSxjLnBhc3NpdmUsYy5wYXJhbXMpKTpzIT09dSYmKHUuZm5zPXMsZVthXT11KSk7Zm9yKGEgaW4gdClyKGVbYV0pJiYoYz1wYShhKSxvKGMubmFtZSx0W2FdLGMuY2FwdHVyZSkpfWZ1bmN0aW9uIGRlKGUsdCxuKXtmdW5jdGlvbiBhKCl7bi5hcHBseSh0aGlzLGFyZ3VtZW50cyksdihzLmZucyxhKX1lIGluc3RhbmNlb2YgVmkmJihlPWUuZGF0YS5ob29rfHwoZS5kYXRhLmhvb2s9e30pKTt2YXIgcyx1PWVbdF07cih1KT9zPWZlKFthXSk6byh1LmZucykmJmkodS5tZXJnZWQpPyhzPXUscy5mbnMucHVzaChhKSk6cz1mZShbdSxhXSkscy5tZXJnZWQ9ITAsZVt0XT1zfWZ1bmN0aW9uIGhlKGUsdCxuKXt2YXIgaT10Lm9wdGlvbnMucHJvcHM7aWYoIXIoaSkpe3ZhciBhPXt9LHM9ZS5hdHRycyx1PWUucHJvcHM7aWYobyhzKXx8byh1KSlmb3IodmFyIGMgaW4gaSl7dmFyIGw9bWkoYyk7dmUoYSx1LGMsbCwhMCl8fHZlKGEscyxjLGwsITEpfXJldHVybiBhfX1mdW5jdGlvbiB2ZShlLHQsbixyLGkpe2lmKG8odCkpe2lmKG0odCxuKSlyZXR1cm4gZVtuXT10W25dLGl8fGRlbGV0ZSB0W25dLCEwO2lmKG0odCxyKSlyZXR1cm4gZVtuXT10W3JdLGl8fGRlbGV0ZSB0W3JdLCEwfXJldHVybiExfWZ1bmN0aW9uIG1lKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWlmKEFycmF5LmlzQXJyYXkoZVt0XSkpcmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSk7cmV0dXJuIGV9ZnVuY3Rpb24geWUoZSl7cmV0dXJuIHMoZSk/W0woZSldOkFycmF5LmlzQXJyYXkoZSk/YmUoZSk6dm9pZCAwfWZ1bmN0aW9uIGdlKGUpe3JldHVybiBvKGUpJiZvKGUudGV4dCkmJmEoZS5pc0NvbW1lbnQpfWZ1bmN0aW9uIGJlKGUsdCl7dmFyIG4sYSx1LGMsbD1bXTtmb3Iobj0wO248ZS5sZW5ndGg7bisrKWE9ZVtuXSxyKGEpfHwiYm9vbGVhbiI9PXR5cGVvZiBhfHwodT1sLmxlbmd0aC0xLGM9bFt1XSxBcnJheS5pc0FycmF5KGEpP2EubGVuZ3RoPjAmJihhPWJlKGEsKHR8fCIiKSsiXyIrbiksZ2UoYVswXSkmJmdlKGMpJiYobFt1XT1MKGMudGV4dCthWzBdLnRleHQpLGEuc2hpZnQoKSksbC5wdXNoLmFwcGx5KGwsYSkpOnMoYSk/Z2UoYyk/bFt1XT1MKGMudGV4dCthKToiIiE9PWEmJmwucHVzaChMKGEpKTpnZShhKSYmZ2UoYyk/bFt1XT1MKGMudGV4dCthLnRleHQpOihpKGUuX2lzVkxpc3QpJiZvKGEudGFnKSYmcihhLmtleSkmJm8odCkmJihhLmtleT0iX192bGlzdCIrdCsiXyIrbisiX18iKSxsLnB1c2goYSkpKTtyZXR1cm4gbH1mdW5jdGlvbiB4ZShlLHQpe3JldHVybihlLl9fZXNNb2R1bGV8fEZpJiYiTW9kdWxlIj09PWVbU3ltYm9sLnRvU3RyaW5nVGFnXSkmJihlPWUuZGVmYXVsdCksdShlKT90LmV4dGVuZChlKTplfWZ1bmN0aW9uIHdlKGUsdCxuLHIsbyl7dmFyIGk9SmkoKTtyZXR1cm4gaS5hc3luY0ZhY3Rvcnk9ZSxpLmFzeW5jTWV0YT17ZGF0YTp0LGNvbnRleHQ6bixjaGlsZHJlbjpyLHRhZzpvfSxpfWZ1bmN0aW9uIF9lKGUsdCxuKXtpZihpKGUuZXJyb3IpJiZvKGUuZXJyb3JDb21wKSlyZXR1cm4gZS5lcnJvckNvbXA7aWYobyhlLnJlc29sdmVkKSlyZXR1cm4gZS5yZXNvbHZlZDtpZihpKGUubG9hZGluZykmJm8oZS5sb2FkaW5nQ29tcCkpcmV0dXJuIGUubG9hZGluZ0NvbXA7aWYoIW8oZS5jb250ZXh0cykpe3ZhciBhPWUuY29udGV4dHM9W25dLHM9ITAsYz1mdW5jdGlvbigpe2Zvcih2YXIgZT0wLHQ9YS5sZW5ndGg7ZTx0O2UrKylhW2VdLiRmb3JjZVVwZGF0ZSgpfSxsPUEoZnVuY3Rpb24obil7ZS5yZXNvbHZlZD14ZShuLHQpLHN8fGMoKX0pLGY9QShmdW5jdGlvbih0KXtvKGUuZXJyb3JDb21wKSYmKGUuZXJyb3I9ITAsYygpKX0pLHA9ZShsLGYpO3JldHVybiB1KHApJiYoImZ1bmN0aW9uIj09dHlwZW9mIHAudGhlbj9yKGUucmVzb2x2ZWQpJiZwLnRoZW4obCxmKTpvKHAuY29tcG9uZW50KSYmImZ1bmN0aW9uIj09dHlwZW9mIHAuY29tcG9uZW50LnRoZW4mJihwLmNvbXBvbmVudC50aGVuKGwsZiksbyhwLmVycm9yKSYmKGUuZXJyb3JDb21wPXhlKHAuZXJyb3IsdCkpLG8ocC5sb2FkaW5nKSYmKGUubG9hZGluZ0NvbXA9eGUocC5sb2FkaW5nLHQpLDA9PT1wLmRlbGF5P2UubG9hZGluZz0hMDpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cihlLnJlc29sdmVkKSYmcihlLmVycm9yKSYmKGUubG9hZGluZz0hMCxjKCkpfSxwLmRlbGF5fHwyMDApKSxvKHAudGltZW91dCkmJnNldFRpbWVvdXQoZnVuY3Rpb24oKXtyKGUucmVzb2x2ZWQpJiZmKG51bGwpfSxwLnRpbWVvdXQpKSkscz0hMSxlLmxvYWRpbmc/ZS5sb2FkaW5nQ29tcDplLnJlc29sdmVkfWUuY29udGV4dHMucHVzaChuKX1mdW5jdGlvbiBDZShlKXtyZXR1cm4gZS5pc0NvbW1lbnQmJmUuYXN5bmNGYWN0b3J5fWZ1bmN0aW9uIFRlKGUpe2lmKEFycmF5LmlzQXJyYXkoZSkpZm9yKHZhciB0PTA7dDxlLmxlbmd0aDt0Kyspe3ZhciBuPWVbdF07aWYobyhuKSYmKG8obi5jb21wb25lbnRPcHRpb25zKXx8Q2UobikpKXJldHVybiBufX1mdW5jdGlvbiBrZShlKXtlLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxlLl9oYXNIb29rRXZlbnQ9ITE7dmFyIHQ9ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzO3QmJiRlKGUsdCl9ZnVuY3Rpb24gQWUoZSx0LG4pe24/bGEuJG9uY2UoZSx0KTpsYS4kb24oZSx0KX1mdW5jdGlvbiBTZShlLHQpe2xhLiRvZmYoZSx0KX1mdW5jdGlvbiAkZShlLHQsbil7bGE9ZSxwZSh0LG58fHt9LEFlLFNlLGUpLGxhPXZvaWQgMH1mdW5jdGlvbiBFZShlLHQpe3ZhciBuPXt9O2lmKCFlKXJldHVybiBuO2Zvcih2YXIgcj0wLG89ZS5sZW5ndGg7cjxvO3IrKyl7dmFyIGk9ZVtyXSxhPWkuZGF0YTtpZihhJiZhLmF0dHJzJiZhLmF0dHJzLnNsb3QmJmRlbGV0ZSBhLmF0dHJzLnNsb3QsaS5jb250ZXh0IT09dCYmaS5mbkNvbnRleHQhPT10fHwhYXx8bnVsbD09YS5zbG90KShuLmRlZmF1bHR8fChuLmRlZmF1bHQ9W10pKS5wdXNoKGkpO2Vsc2V7dmFyIHM9YS5zbG90LHU9bltzXXx8KG5bc109W10pOyJ0ZW1wbGF0ZSI9PT1pLnRhZz91LnB1c2guYXBwbHkodSxpLmNoaWxkcmVufHxbXSk6dS5wdXNoKGkpfX1mb3IodmFyIGMgaW4gbiluW2NdLmV2ZXJ5KE9lKSYmZGVsZXRlIG5bY107cmV0dXJuIG59ZnVuY3Rpb24gT2UoZSl7cmV0dXJuIGUuaXNDb21tZW50JiYhZS5hc3luY0ZhY3Rvcnl8fCIgIj09PWUudGV4dH1mdW5jdGlvbiBqZShlLHQpe3Q9dHx8e307Zm9yKHZhciBuPTA7bjxlLmxlbmd0aDtuKyspQXJyYXkuaXNBcnJheShlW25dKT9qZShlW25dLHQpOnRbZVtuXS5rZXldPWVbbl0uZm47cmV0dXJuIHR9ZnVuY3Rpb24gTmUoZSl7dmFyIHQ9ZS4kb3B0aW9ucyxuPXQucGFyZW50O2lmKG4mJiF0LmFic3RyYWN0KXtmb3IoO24uJG9wdGlvbnMuYWJzdHJhY3QmJm4uJHBhcmVudDspbj1uLiRwYXJlbnQ7bi4kY2hpbGRyZW4ucHVzaChlKX1lLiRwYXJlbnQ9bixlLiRyb290PW4/bi4kcm9vdDplLGUuJGNoaWxkcmVuPVtdLGUuJHJlZnM9e30sZS5fd2F0Y2hlcj1udWxsLGUuX2luYWN0aXZlPW51bGwsZS5fZGlyZWN0SW5hY3RpdmU9ITEsZS5faXNNb3VudGVkPSExLGUuX2lzRGVzdHJveWVkPSExLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITF9ZnVuY3Rpb24gTGUoZSx0LG4pe2UuJGVsPXQsZS4kb3B0aW9ucy5yZW5kZXJ8fChlLiRvcHRpb25zLnJlbmRlcj1KaSksTWUoZSwiYmVmb3JlTW91bnQiKTt2YXIgcjtyZXR1cm4gcj1mdW5jdGlvbigpe2UuX3VwZGF0ZShlLl9yZW5kZXIoKSxuKX0sbmV3IHdhKGUscixDLG51bGwsITApLG49ITEsbnVsbD09ZS4kdm5vZGUmJihlLl9pc01vdW50ZWQ9ITAsTWUoZSwibW91bnRlZCIpKSxlfWZ1bmN0aW9uIERlKGUsdCxuLHIsbyl7dmFyIGk9ISEob3x8ZS4kb3B0aW9ucy5fcmVuZGVyQ2hpbGRyZW58fHIuZGF0YS5zY29wZWRTbG90c3x8ZS4kc2NvcGVkU2xvdHMhPT1zaSk7aWYoZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU9cixlLiR2bm9kZT1yLGUuX3Zub2RlJiYoZS5fdm5vZGUucGFyZW50PXIpLGUuJG9wdGlvbnMuX3JlbmRlckNoaWxkcmVuPW8sZS4kYXR0cnM9ci5kYXRhLmF0dHJzfHxzaSxlLiRsaXN0ZW5lcnM9bnx8c2ksdCYmZS4kb3B0aW9ucy5wcm9wcyl7SSghMSk7Zm9yKHZhciBhPWUuX3Byb3BzLHM9ZS4kb3B0aW9ucy5fcHJvcEtleXN8fFtdLHU9MDt1PHMubGVuZ3RoO3UrKyl7dmFyIGM9c1t1XSxsPWUuJG9wdGlvbnMucHJvcHM7YVtjXT1RKGMsbCx0LGUpfUkoITApLGUuJG9wdGlvbnMucHJvcHNEYXRhPXR9bj1ufHxzaTt2YXIgZj1lLiRvcHRpb25zLl9wYXJlbnRMaXN0ZW5lcnM7ZS4kb3B0aW9ucy5fcGFyZW50TGlzdGVuZXJzPW4sJGUoZSxuLGYpLGkmJihlLiRzbG90cz1FZShvLHIuY29udGV4dCksZS4kZm9yY2VVcGRhdGUoKSl9ZnVuY3Rpb24gSWUoZSl7Zm9yKDtlJiYoZT1lLiRwYXJlbnQpOylpZihlLl9pbmFjdGl2ZSlyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBSZShlLHQpe2lmKHQpe2lmKGUuX2RpcmVjdEluYWN0aXZlPSExLEllKGUpKXJldHVybn1lbHNlIGlmKGUuX2RpcmVjdEluYWN0aXZlKXJldHVybjtpZihlLl9pbmFjdGl2ZXx8bnVsbD09PWUuX2luYWN0aXZlKXtlLl9pbmFjdGl2ZT0hMTtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspUmUoZS4kY2hpbGRyZW5bbl0pO01lKGUsImFjdGl2YXRlZCIpfX1mdW5jdGlvbiBQZShlLHQpe2lmKCEodCYmKGUuX2RpcmVjdEluYWN0aXZlPSEwLEllKGUpKXx8ZS5faW5hY3RpdmUpKXtlLl9pbmFjdGl2ZT0hMDtmb3IodmFyIG49MDtuPGUuJGNoaWxkcmVuLmxlbmd0aDtuKyspUGUoZS4kY2hpbGRyZW5bbl0pO01lKGUsImRlYWN0aXZhdGVkIil9fWZ1bmN0aW9uIE1lKGUsdCl7aigpO3ZhciBuPWUuJG9wdGlvbnNbdF07aWYobilmb3IodmFyIHI9MCxvPW4ubGVuZ3RoO3I8bztyKyspdHJ5e25bcl0uY2FsbChlKX1jYXRjaChuKXtyZShuLGUsdCsiIGhvb2siKX1lLl9oYXNIb29rRXZlbnQmJmUuJGVtaXQoImhvb2s6Iit0KSxOKCl9ZnVuY3Rpb24gcWUoKXtiYT1oYS5sZW5ndGg9dmEubGVuZ3RoPTAsbWE9e30seWE9Z2E9ITF9ZnVuY3Rpb24gSGUoKXtnYT0hMDt2YXIgZSx0O2ZvcihoYS5zb3J0KGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuaWQtdC5pZH0pLGJhPTA7YmE8aGEubGVuZ3RoO2JhKyspZT1oYVtiYV0sdD1lLmlkLG1hW3RdPW51bGwsZS5ydW4oKTt2YXIgbj12YS5zbGljZSgpLHI9aGEuc2xpY2UoKTtxZSgpLFVlKG4pLEZlKHIpLEhpJiZDaS5kZXZ0b29scyYmSGkuZW1pdCgiZmx1c2giKX1mdW5jdGlvbiBGZShlKXtmb3IodmFyIHQ9ZS5sZW5ndGg7dC0tOyl7dmFyIG49ZVt0XSxyPW4udm07ci5fd2F0Y2hlcj09PW4mJnIuX2lzTW91bnRlZCYmTWUociwidXBkYXRlZCIpfX1mdW5jdGlvbiBCZShlKXtlLl9pbmFjdGl2ZT0hMSx2YS5wdXNoKGUpfWZ1bmN0aW9uIFVlKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKWVbdF0uX2luYWN0aXZlPSEwLFJlKGVbdF0sITApfWZ1bmN0aW9uIFdlKGUpe3ZhciB0PWUuaWQ7aWYobnVsbD09bWFbdF0pe2lmKG1hW3RdPSEwLGdhKXtmb3IodmFyIG49aGEubGVuZ3RoLTE7bj5iYSYmaGFbbl0uaWQ+ZS5pZDspbi0tO2hhLnNwbGljZShuKzEsMCxlKX1lbHNlIGhhLnB1c2goZSk7eWF8fCh5YT0hMCx1ZShIZSkpfX1mdW5jdGlvbiB6ZShlLHQsbil7X2EuZ2V0PWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXNbdF1bbl19LF9hLnNldD1mdW5jdGlvbihlKXt0aGlzW3RdW25dPWV9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLG4sX2EpfWZ1bmN0aW9uIFZlKGUpe2UuX3dhdGNoZXJzPVtdO3ZhciB0PWUuJG9wdGlvbnM7dC5wcm9wcyYmWGUoZSx0LnByb3BzKSx0Lm1ldGhvZHMmJlplKGUsdC5tZXRob2RzKSx0LmRhdGE/SmUoZSk6TShlLl9kYXRhPXt9LCEwKSx0LmNvbXB1dGVkJiZHZShlLHQuY29tcHV0ZWQpLHQud2F0Y2gmJnQud2F0Y2ghPT1EaSYmZXQoZSx0LndhdGNoKX1mdW5jdGlvbiBYZShlLHQpe3ZhciBuPWUuJG9wdGlvbnMucHJvcHNEYXRhfHx7fSxyPWUuX3Byb3BzPXt9LG89ZS4kb3B0aW9ucy5fcHJvcEtleXM9W107IWUuJHBhcmVudHx8SSghMSk7Zm9yKHZhciBpIGluIHQpIWZ1bmN0aW9uKGkpe28ucHVzaChpKTt2YXIgYT1RKGksdCxuLGUpO3EocixpLGEpLGkgaW4gZXx8emUoZSwiX3Byb3BzIixpKX0oaSk7SSghMCl9ZnVuY3Rpb24gSmUoZSl7dmFyIHQ9ZS4kb3B0aW9ucy5kYXRhO3Q9ZS5fZGF0YT0iZnVuY3Rpb24iPT10eXBlb2YgdD9LZSh0LGUpOnR8fHt9LGModCl8fCh0PXt9KTtmb3IodmFyIG49T2JqZWN0LmtleXModCkscj1lLiRvcHRpb25zLnByb3BzLG89KGUuJG9wdGlvbnMubWV0aG9kcyxuLmxlbmd0aCk7by0tOyl7dmFyIGk9bltvXTtyJiZtKHIsaSl8fFMoaSl8fHplKGUsIl9kYXRhIixpKX1NKHQsITApfWZ1bmN0aW9uIEtlKGUsdCl7aigpO3RyeXtyZXR1cm4gZS5jYWxsKHQsdCl9Y2F0Y2goZSl7cmV0dXJuIHJlKGUsdCwiZGF0YSgpIikse319ZmluYWxseXtOKCl9fWZ1bmN0aW9uIEdlKGUsdCl7dmFyIG49ZS5fY29tcHV0ZWRXYXRjaGVycz1PYmplY3QuY3JlYXRlKG51bGwpLHI9cWkoKTtmb3IodmFyIG8gaW4gdCl7dmFyIGk9dFtvXSxhPSJmdW5jdGlvbiI9PXR5cGVvZiBpP2k6aS5nZXQ7cnx8KG5bb109bmV3IHdhKGUsYXx8QyxDLENhKSksbyBpbiBlfHxZZShlLG8saSl9fWZ1bmN0aW9uIFllKGUsdCxuKXt2YXIgcj0hcWkoKTsiZnVuY3Rpb24iPT10eXBlb2Ygbj8oX2EuZ2V0PXI/UWUodCk6bixfYS5zZXQ9Qyk6KF9hLmdldD1uLmdldD9yJiYhMSE9PW4uY2FjaGU/UWUodCk6bi5nZXQ6QyxfYS5zZXQ9bi5zZXQ/bi5zZXQ6QyksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdCxfYSl9ZnVuY3Rpb24gUWUoZSl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIHQ9dGhpcy5fY29tcHV0ZWRXYXRjaGVycyYmdGhpcy5fY29tcHV0ZWRXYXRjaGVyc1tlXTtpZih0KXJldHVybiB0LmRpcnR5JiZ0LmV2YWx1YXRlKCksV2kudGFyZ2V0JiZ0LmRlcGVuZCgpLHQudmFsdWV9fWZ1bmN0aW9uIFplKGUsdCl7ZS4kb3B0aW9ucy5wcm9wcztmb3IodmFyIG4gaW4gdCllW25dPW51bGw9PXRbbl0/Qzp5aSh0W25dLGUpfWZ1bmN0aW9uIGV0KGUsdCl7Zm9yKHZhciBuIGluIHQpe3ZhciByPXRbbl07aWYoQXJyYXkuaXNBcnJheShyKSlmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKyl0dChlLG4scltvXSk7ZWxzZSB0dChlLG4scil9fWZ1bmN0aW9uIHR0KGUsdCxuLHIpe3JldHVybiBjKG4pJiYocj1uLG49bi5oYW5kbGVyKSwic3RyaW5nIj09dHlwZW9mIG4mJihuPWVbbl0pLGUuJHdhdGNoKHQsbixyKX1mdW5jdGlvbiBudChlKXt2YXIgdD1lLiRvcHRpb25zLnByb3ZpZGU7dCYmKGUuX3Byb3ZpZGVkPSJmdW5jdGlvbiI9PXR5cGVvZiB0P3QuY2FsbChlKTp0KX1mdW5jdGlvbiBydChlKXt2YXIgdD1vdChlLiRvcHRpb25zLmluamVjdCxlKTt0JiYoSSghMSksT2JqZWN0LmtleXModCkuZm9yRWFjaChmdW5jdGlvbihuKXtxKGUsbix0W25dKX0pLEkoITApKX1mdW5jdGlvbiBvdChlLHQpe2lmKGUpe2Zvcih2YXIgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9Rmk/UmVmbGVjdC5vd25LZXlzKGUpLmZpbHRlcihmdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLHQpLmVudW1lcmFibGV9KTpPYmplY3Qua2V5cyhlKSxvPTA7bzxyLmxlbmd0aDtvKyspe2Zvcih2YXIgaT1yW29dLGE9ZVtpXS5mcm9tLHM9dDtzOyl7aWYocy5fcHJvdmlkZWQmJm0ocy5fcHJvdmlkZWQsYSkpe25baV09cy5fcHJvdmlkZWRbYV07YnJlYWt9cz1zLiRwYXJlbnR9aWYoIXMmJiJkZWZhdWx0ImluIGVbaV0pe3ZhciB1PWVbaV0uZGVmYXVsdDtuW2ldPSJmdW5jdGlvbiI9PXR5cGVvZiB1P3UuY2FsbCh0KTp1fX1yZXR1cm4gbn19ZnVuY3Rpb24gaXQoZSx0KXt2YXIgbixyLGksYSxzO2lmKEFycmF5LmlzQXJyYXkoZSl8fCJzdHJpbmciPT10eXBlb2YgZSlmb3Iobj1uZXcgQXJyYXkoZS5sZW5ndGgpLHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspbltyXT10KGVbcl0scik7ZWxzZSBpZigibnVtYmVyIj09dHlwZW9mIGUpZm9yKG49bmV3IEFycmF5KGUpLHI9MDtyPGU7cisrKW5bcl09dChyKzEscik7ZWxzZSBpZih1KGUpKWZvcihhPU9iamVjdC5rZXlzKGUpLG49bmV3IEFycmF5KGEubGVuZ3RoKSxyPTAsaT1hLmxlbmd0aDtyPGk7cisrKXM9YVtyXSxuW3JdPXQoZVtzXSxzLHIpO3JldHVybiBvKG4pJiYobi5faXNWTGlzdD0hMCksbn1mdW5jdGlvbiBhdChlLHQsbixyKXt2YXIgbyxpPXRoaXMuJHNjb3BlZFNsb3RzW2VdO2lmKGkpbj1ufHx7fSxyJiYobj13KHcoe30sciksbikpLG89aShuKXx8dDtlbHNle3ZhciBhPXRoaXMuJHNsb3RzW2VdO2EmJihhLl9yZW5kZXJlZD0hMCksbz1hfHx0fXZhciBzPW4mJm4uc2xvdDtyZXR1cm4gcz90aGlzLiRjcmVhdGVFbGVtZW50KCJ0ZW1wbGF0ZSIse3Nsb3Q6c30sbyk6b31mdW5jdGlvbiBzdChlKXtyZXR1cm4gWSh0aGlzLiRvcHRpb25zLCJmaWx0ZXJzIixlLCEwKXx8Yml9ZnVuY3Rpb24gdXQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT8tMT09PWUuaW5kZXhPZih0KTplIT09dH1mdW5jdGlvbiBjdChlLHQsbixyLG8pe3ZhciBpPUNpLmtleUNvZGVzW3RdfHxuO3JldHVybiBvJiZyJiYhQ2kua2V5Q29kZXNbdF0/dXQobyxyKTppP3V0KGksZSk6cj9taShyKSE9PXQ6dm9pZCAwfWZ1bmN0aW9uIGx0KGUsdCxuLHIsbyl7aWYobilpZih1KG4pKXtBcnJheS5pc0FycmF5KG4pJiYobj1fKG4pKTt2YXIgaTtmb3IodmFyIGEgaW4gbikhZnVuY3Rpb24oYSl7aWYoImNsYXNzIj09PWF8fCJzdHlsZSI9PT1hfHxsaShhKSlpPWU7ZWxzZXt2YXIgcz1lLmF0dHJzJiZlLmF0dHJzLnR5cGU7aT1yfHxDaS5tdXN0VXNlUHJvcCh0LHMsYSk/ZS5kb21Qcm9wc3x8KGUuZG9tUHJvcHM9e30pOmUuYXR0cnN8fChlLmF0dHJzPXt9KX1pZighKGEgaW4gaSkmJihpW2FdPW5bYV0sbykpeyhlLm9ufHwoZS5vbj17fSkpWyJ1cGRhdGU6IithXT1mdW5jdGlvbihlKXtuW2FdPWV9fX0oYSl9ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBmdChlLHQpe3ZhciBuPXRoaXMuX3N0YXRpY1RyZWVzfHwodGhpcy5fc3RhdGljVHJlZXM9W10pLHI9bltlXTtyZXR1cm4gciYmIXQ/cjoocj1uW2VdPXRoaXMuJG9wdGlvbnMuc3RhdGljUmVuZGVyRm5zW2VdLmNhbGwodGhpcy5fcmVuZGVyUHJveHksbnVsbCx0aGlzKSxkdChyLCJfX3N0YXRpY19fIitlLCExKSxyKX1mdW5jdGlvbiBwdChlLHQsbil7cmV0dXJuIGR0KGUsIl9fb25jZV9fIit0KyhuPyJfIituOiIiKSwhMCksZX1mdW5jdGlvbiBkdChlLHQsbil7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIHI9MDtyPGUubGVuZ3RoO3IrKyllW3JdJiYic3RyaW5nIiE9dHlwZW9mIGVbcl0mJmh0KGVbcl0sdCsiXyIrcixuKTtlbHNlIGh0KGUsdCxuKX1mdW5jdGlvbiBodChlLHQsbil7ZS5pc1N0YXRpYz0hMCxlLmtleT10LGUuaXNPbmNlPW59ZnVuY3Rpb24gdnQoZSx0KXtpZih0KWlmKGModCkpe3ZhciBuPWUub249ZS5vbj93KHt9LGUub24pOnt9O2Zvcih2YXIgciBpbiB0KXt2YXIgbz1uW3JdLGk9dFtyXTtuW3JdPW8/W10uY29uY2F0KG8saSk6aX19ZWxzZTtyZXR1cm4gZX1mdW5jdGlvbiBtdChlKXtlLl9vPXB0LGUuX249ZCxlLl9zPXAsZS5fbD1pdCxlLl90PWF0LGUuX3E9VCxlLl9pPWssZS5fbT1mdCxlLl9mPXN0LGUuX2s9Y3QsZS5fYj1sdCxlLl92PUwsZS5fZT1KaSxlLl91PWplLGUuX2c9dnR9ZnVuY3Rpb24geXQoZSx0LG4scixvKXt2YXIgYSxzPW8ub3B0aW9uczttKHIsIl91aWQiKT8oYT1PYmplY3QuY3JlYXRlKHIpLGEuX29yaWdpbmFsPXIpOihhPXIscj1yLl9vcmlnaW5hbCk7dmFyIHU9aShzLl9jb21waWxlZCksYz0hdTt0aGlzLmRhdGE9ZSx0aGlzLnByb3BzPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMucGFyZW50PXIsdGhpcy5saXN0ZW5lcnM9ZS5vbnx8c2ksdGhpcy5pbmplY3Rpb25zPW90KHMuaW5qZWN0LHIpLHRoaXMuc2xvdHM9ZnVuY3Rpb24oKXtyZXR1cm4gRWUobixyKX0sdSYmKHRoaXMuJG9wdGlvbnM9cyx0aGlzLiRzbG90cz10aGlzLnNsb3RzKCksdGhpcy4kc2NvcGVkU2xvdHM9ZS5zY29wZWRTbG90c3x8c2kpLHMuX3Njb3BlSWQ/dGhpcy5fYz1mdW5jdGlvbihlLHQsbixvKXt2YXIgaT1rdChhLGUsdCxuLG8sYyk7cmV0dXJuIGkmJiFBcnJheS5pc0FycmF5KGkpJiYoaS5mblNjb3BlSWQ9cy5fc2NvcGVJZCxpLmZuQ29udGV4dD1yKSxpfTp0aGlzLl9jPWZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBrdChhLGUsdCxuLHIsYyl9fWZ1bmN0aW9uIGd0KGUsdCxuLHIsaSl7dmFyIGE9ZS5vcHRpb25zLHM9e30sdT1hLnByb3BzO2lmKG8odSkpZm9yKHZhciBjIGluIHUpc1tjXT1RKGMsdSx0fHxzaSk7ZWxzZSBvKG4uYXR0cnMpJiZ4dChzLG4uYXR0cnMpLG8obi5wcm9wcykmJnh0KHMsbi5wcm9wcyk7dmFyIGw9bmV3IHl0KG4scyxpLHIsZSksZj1hLnJlbmRlci5jYWxsKG51bGwsbC5fYyxsKTtpZihmIGluc3RhbmNlb2YgVmkpcmV0dXJuIGJ0KGYsbixsLnBhcmVudCxhKTtpZihBcnJheS5pc0FycmF5KGYpKXtmb3IodmFyIHA9eWUoZil8fFtdLGQ9bmV3IEFycmF5KHAubGVuZ3RoKSxoPTA7aDxwLmxlbmd0aDtoKyspZFtoXT1idChwW2hdLG4sbC5wYXJlbnQsYSk7cmV0dXJuIGR9fWZ1bmN0aW9uIGJ0KGUsdCxuLHIpe3ZhciBvPUQoZSk7cmV0dXJuIG8uZm5Db250ZXh0PW4sby5mbk9wdGlvbnM9cix0LnNsb3QmJigoby5kYXRhfHwoby5kYXRhPXt9KSkuc2xvdD10LnNsb3QpLG99ZnVuY3Rpb24geHQoZSx0KXtmb3IodmFyIG4gaW4gdCllW2RpKG4pXT10W25dfWZ1bmN0aW9uIHd0KGUsdCxuLGEscyl7aWYoIXIoZSkpe3ZhciBjPW4uJG9wdGlvbnMuX2Jhc2U7aWYodShlKSYmKGU9Yy5leHRlbmQoZSkpLCJmdW5jdGlvbiI9PXR5cGVvZiBlKXt2YXIgbDtpZihyKGUuY2lkKSYmKGw9ZSx2b2lkIDA9PT0oZT1fZShsLGMsbikpKSlyZXR1cm4gd2UobCx0LG4sYSxzKTt0PXR8fHt9LGp0KGUpLG8odC5tb2RlbCkmJlR0KGUub3B0aW9ucyx0KTt2YXIgZj1oZSh0LGUscyk7aWYoaShlLm9wdGlvbnMuZnVuY3Rpb25hbCkpcmV0dXJuIGd0KGUsZix0LG4sYSk7dmFyIHA9dC5vbjtpZih0Lm9uPXQubmF0aXZlT24saShlLm9wdGlvbnMuYWJzdHJhY3QpKXt2YXIgZD10LnNsb3Q7dD17fSxkJiYodC5zbG90PWQpfUN0KHQpO3ZhciBoPWUub3B0aW9ucy5uYW1lfHxzO3JldHVybiBuZXcgVmkoInZ1ZS1jb21wb25lbnQtIitlLmNpZCsoaD8iLSIraDoiIiksdCx2b2lkIDAsdm9pZCAwLHZvaWQgMCxuLHtDdG9yOmUscHJvcHNEYXRhOmYsbGlzdGVuZXJzOnAsdGFnOnMsY2hpbGRyZW46YX0sbCl9fX1mdW5jdGlvbiBfdChlLHQsbixyKXt2YXIgaT17X2lzQ29tcG9uZW50OiEwLHBhcmVudDp0LF9wYXJlbnRWbm9kZTplLF9wYXJlbnRFbG06bnx8bnVsbCxfcmVmRWxtOnJ8fG51bGx9LGE9ZS5kYXRhLmlubGluZVRlbXBsYXRlO3JldHVybiBvKGEpJiYoaS5yZW5kZXI9YS5yZW5kZXIsaS5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMpLG5ldyBlLmNvbXBvbmVudE9wdGlvbnMuQ3RvcihpKX1mdW5jdGlvbiBDdChlKXtmb3IodmFyIHQ9ZS5ob29rfHwoZS5ob29rPXt9KSxuPTA7bjxrYS5sZW5ndGg7bisrKXt2YXIgcj1rYVtuXTt0W3JdPVRhW3JdfX1mdW5jdGlvbiBUdChlLHQpe3ZhciBuPWUubW9kZWwmJmUubW9kZWwucHJvcHx8InZhbHVlIixyPWUubW9kZWwmJmUubW9kZWwuZXZlbnR8fCJpbnB1dCI7KHQucHJvcHN8fCh0LnByb3BzPXt9KSlbbl09dC5tb2RlbC52YWx1ZTt2YXIgaT10Lm9ufHwodC5vbj17fSk7byhpW3JdKT9pW3JdPVt0Lm1vZGVsLmNhbGxiYWNrXS5jb25jYXQoaVtyXSk6aVtyXT10Lm1vZGVsLmNhbGxiYWNrfWZ1bmN0aW9uIGt0KGUsdCxuLHIsbyxhKXtyZXR1cm4oQXJyYXkuaXNBcnJheShuKXx8cyhuKSkmJihvPXIscj1uLG49dm9pZCAwKSxpKGEpJiYobz1TYSksQXQoZSx0LG4scixvKX1mdW5jdGlvbiBBdChlLHQsbixyLGkpe2lmKG8obikmJm8obi5fX29iX18pKXJldHVybiBKaSgpO2lmKG8obikmJm8obi5pcykmJih0PW4uaXMpLCF0KXJldHVybiBKaSgpO0FycmF5LmlzQXJyYXkocikmJiJmdW5jdGlvbiI9PXR5cGVvZiByWzBdJiYobj1ufHx7fSxuLnNjb3BlZFNsb3RzPXtkZWZhdWx0OnJbMF19LHIubGVuZ3RoPTApLGk9PT1TYT9yPXllKHIpOmk9PT1BYSYmKHI9bWUocikpO3ZhciBhLHM7aWYoInN0cmluZyI9PXR5cGVvZiB0KXt2YXIgdTtzPWUuJHZub2RlJiZlLiR2bm9kZS5uc3x8Q2kuZ2V0VGFnTmFtZXNwYWNlKHQpLGE9Q2kuaXNSZXNlcnZlZFRhZyh0KT9uZXcgVmkoQ2kucGFyc2VQbGF0Zm9ybVRhZ05hbWUodCksbixyLHZvaWQgMCx2b2lkIDAsZSk6byh1PVkoZS4kb3B0aW9ucywiY29tcG9uZW50cyIsdCkpP3d0KHUsbixlLHIsdCk6bmV3IFZpKHQsbixyLHZvaWQgMCx2b2lkIDAsZSl9ZWxzZSBhPXd0KHQsbixlLHIpO3JldHVybiBBcnJheS5pc0FycmF5KGEpP2E6byhhKT8obyhzKSYmU3QoYSxzKSxvKG4pJiYkdChuKSxhKTpKaSgpfWZ1bmN0aW9uIFN0KGUsdCxuKXtpZihlLm5zPXQsImZvcmVpZ25PYmplY3QiPT09ZS50YWcmJih0PXZvaWQgMCxuPSEwKSxvKGUuY2hpbGRyZW4pKWZvcih2YXIgYT0wLHM9ZS5jaGlsZHJlbi5sZW5ndGg7YTxzO2ErKyl7dmFyIHU9ZS5jaGlsZHJlblthXTtvKHUudGFnKSYmKHIodS5ucyl8fGkobikmJiJzdmciIT09dS50YWcpJiZTdCh1LHQsbil9fWZ1bmN0aW9uICR0KGUpe3UoZS5zdHlsZSkmJmNlKGUuc3R5bGUpLHUoZS5jbGFzcykmJmNlKGUuY2xhc3MpfWZ1bmN0aW9uIEV0KGUpe2UuX3Zub2RlPW51bGwsZS5fc3RhdGljVHJlZXM9bnVsbDt2YXIgdD1lLiRvcHRpb25zLG49ZS4kdm5vZGU9dC5fcGFyZW50Vm5vZGUscj1uJiZuLmNvbnRleHQ7ZS4kc2xvdHM9RWUodC5fcmVuZGVyQ2hpbGRyZW4sciksZS4kc2NvcGVkU2xvdHM9c2ksZS5fYz1mdW5jdGlvbih0LG4scixvKXtyZXR1cm4ga3QoZSx0LG4scixvLCExKX0sZS4kY3JlYXRlRWxlbWVudD1mdW5jdGlvbih0LG4scixvKXtyZXR1cm4ga3QoZSx0LG4scixvLCEwKX07dmFyIG89biYmbi5kYXRhO3EoZSwiJGF0dHJzIixvJiZvLmF0dHJzfHxzaSxudWxsLCEwKSxxKGUsIiRsaXN0ZW5lcnMiLHQuX3BhcmVudExpc3RlbmVyc3x8c2ksbnVsbCwhMCl9ZnVuY3Rpb24gT3QoZSx0KXt2YXIgbj1lLiRvcHRpb25zPU9iamVjdC5jcmVhdGUoZS5jb25zdHJ1Y3Rvci5vcHRpb25zKSxyPXQuX3BhcmVudFZub2RlO24ucGFyZW50PXQucGFyZW50LG4uX3BhcmVudFZub2RlPXIsbi5fcGFyZW50RWxtPXQuX3BhcmVudEVsbSxuLl9yZWZFbG09dC5fcmVmRWxtO3ZhciBvPXIuY29tcG9uZW50T3B0aW9ucztuLnByb3BzRGF0YT1vLnByb3BzRGF0YSxuLl9wYXJlbnRMaXN0ZW5lcnM9by5saXN0ZW5lcnMsbi5fcmVuZGVyQ2hpbGRyZW49by5jaGlsZHJlbixuLl9jb21wb25lbnRUYWc9by50YWcsdC5yZW5kZXImJihuLnJlbmRlcj10LnJlbmRlcixuLnN0YXRpY1JlbmRlckZucz10LnN0YXRpY1JlbmRlckZucyl9ZnVuY3Rpb24ganQoZSl7dmFyIHQ9ZS5vcHRpb25zO2lmKGUuc3VwZXIpe3ZhciBuPWp0KGUuc3VwZXIpO2lmKG4hPT1lLnN1cGVyT3B0aW9ucyl7ZS5zdXBlck9wdGlvbnM9bjt2YXIgcj1OdChlKTtyJiZ3KGUuZXh0ZW5kT3B0aW9ucyxyKSx0PWUub3B0aW9ucz1HKG4sZS5leHRlbmRPcHRpb25zKSx0Lm5hbWUmJih0LmNvbXBvbmVudHNbdC5uYW1lXT1lKX19cmV0dXJuIHR9ZnVuY3Rpb24gTnQoZSl7dmFyIHQsbj1lLm9wdGlvbnMscj1lLmV4dGVuZE9wdGlvbnMsbz1lLnNlYWxlZE9wdGlvbnM7Zm9yKHZhciBpIGluIG4pbltpXSE9PW9baV0mJih0fHwodD17fSksdFtpXT1MdChuW2ldLHJbaV0sb1tpXSkpO3JldHVybiB0fWZ1bmN0aW9uIEx0KGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXt2YXIgcj1bXTtuPUFycmF5LmlzQXJyYXkobik/bjpbbl0sdD1BcnJheS5pc0FycmF5KHQpP3Q6W3RdO2Zvcih2YXIgbz0wO288ZS5sZW5ndGg7bysrKSh0LmluZGV4T2YoZVtvXSk+PTB8fG4uaW5kZXhPZihlW29dKTwwKSYmci5wdXNoKGVbb10pO3JldHVybiByfXJldHVybiBlfWZ1bmN0aW9uIER0KGUpe3RoaXMuX2luaXQoZSl9ZnVuY3Rpb24gSXQoZSl7ZS51c2U9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5faW5zdGFsbGVkUGx1Z2luc3x8KHRoaXMuX2luc3RhbGxlZFBsdWdpbnM9W10pO2lmKHQuaW5kZXhPZihlKT4tMSlyZXR1cm4gdGhpczt2YXIgbj14KGFyZ3VtZW50cywxKTtyZXR1cm4gbi51bnNoaWZ0KHRoaXMpLCJmdW5jdGlvbiI9PXR5cGVvZiBlLmluc3RhbGw/ZS5pbnN0YWxsLmFwcGx5KGUsbik6ImZ1bmN0aW9uIj09dHlwZW9mIGUmJmUuYXBwbHkobnVsbCxuKSx0LnB1c2goZSksdGhpc319ZnVuY3Rpb24gUnQoZSl7ZS5taXhpbj1mdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5vcHRpb25zPUcodGhpcy5vcHRpb25zLGUpLHRoaXN9fWZ1bmN0aW9uIFB0KGUpe2UuY2lkPTA7dmFyIHQ9MTtlLmV4dGVuZD1mdW5jdGlvbihlKXtlPWV8fHt9O3ZhciBuPXRoaXMscj1uLmNpZCxvPWUuX0N0b3J8fChlLl9DdG9yPXt9KTtpZihvW3JdKXJldHVybiBvW3JdO3ZhciBpPWUubmFtZXx8bi5vcHRpb25zLm5hbWUsYT1mdW5jdGlvbihlKXt0aGlzLl9pbml0KGUpfTtyZXR1cm4gYS5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShuLnByb3RvdHlwZSksYS5wcm90b3R5cGUuY29uc3RydWN0b3I9YSxhLmNpZD10KyssYS5vcHRpb25zPUcobi5vcHRpb25zLGUpLGEuc3VwZXI9bixhLm9wdGlvbnMucHJvcHMmJk10KGEpLGEub3B0aW9ucy5jb21wdXRlZCYmcXQoYSksYS5leHRlbmQ9bi5leHRlbmQsYS5taXhpbj1uLm1peGluLGEudXNlPW4udXNlLHdpLmZvckVhY2goZnVuY3Rpb24oZSl7YVtlXT1uW2VdfSksaSYmKGEub3B0aW9ucy5jb21wb25lbnRzW2ldPWEpLGEuc3VwZXJPcHRpb25zPW4ub3B0aW9ucyxhLmV4dGVuZE9wdGlvbnM9ZSxhLnNlYWxlZE9wdGlvbnM9dyh7fSxhLm9wdGlvbnMpLG9bcl09YSxhfX1mdW5jdGlvbiBNdChlKXt2YXIgdD1lLm9wdGlvbnMucHJvcHM7Zm9yKHZhciBuIGluIHQpemUoZS5wcm90b3R5cGUsIl9wcm9wcyIsbil9ZnVuY3Rpb24gcXQoZSl7dmFyIHQ9ZS5vcHRpb25zLmNvbXB1dGVkO2Zvcih2YXIgbiBpbiB0KVllKGUucHJvdG90eXBlLG4sdFtuXSl9ZnVuY3Rpb24gSHQoZSl7d2kuZm9yRWFjaChmdW5jdGlvbih0KXtlW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIG4/KCJjb21wb25lbnQiPT09dCYmYyhuKSYmKG4ubmFtZT1uLm5hbWV8fGUsbj10aGlzLm9wdGlvbnMuX2Jhc2UuZXh0ZW5kKG4pKSwiZGlyZWN0aXZlIj09PXQmJiJmdW5jdGlvbiI9PXR5cGVvZiBuJiYobj17YmluZDpuLHVwZGF0ZTpufSksdGhpcy5vcHRpb25zW3QrInMiXVtlXT1uLG4pOnRoaXMub3B0aW9uc1t0KyJzIl1bZV19fSl9ZnVuY3Rpb24gRnQoZSl7cmV0dXJuIGUmJihlLkN0b3Iub3B0aW9ucy5uYW1lfHxlLnRhZyl9ZnVuY3Rpb24gQnQoZSx0KXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lLmluZGV4T2YodCk+LTE6InN0cmluZyI9PXR5cGVvZiBlP2Uuc3BsaXQoIiwiKS5pbmRleE9mKHQpPi0xOiEhbChlKSYmZS50ZXN0KHQpfWZ1bmN0aW9uIFV0KGUsdCl7dmFyIG49ZS5jYWNoZSxyPWUua2V5cyxvPWUuX3Zub2RlO2Zvcih2YXIgaSBpbiBuKXt2YXIgYT1uW2ldO2lmKGEpe3ZhciBzPUZ0KGEuY29tcG9uZW50T3B0aW9ucyk7cyYmIXQocykmJld0KG4saSxyLG8pfX19ZnVuY3Rpb24gV3QoZSx0LG4scil7dmFyIG89ZVt0XTshb3x8ciYmby50YWc9PT1yLnRhZ3x8by5jb21wb25lbnRJbnN0YW5jZS4kZGVzdHJveSgpLGVbdF09bnVsbCx2KG4sdCl9ZnVuY3Rpb24genQoZSl7Zm9yKHZhciB0PWUuZGF0YSxuPWUscj1lO28oci5jb21wb25lbnRJbnN0YW5jZSk7KShyPXIuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKSYmci5kYXRhJiYodD1WdChyLmRhdGEsdCkpO2Zvcig7byhuPW4ucGFyZW50KTspbiYmbi5kYXRhJiYodD1WdCh0LG4uZGF0YSkpO3JldHVybiBYdCh0LnN0YXRpY0NsYXNzLHQuY2xhc3MpfWZ1bmN0aW9uIFZ0KGUsdCl7cmV0dXJue3N0YXRpY0NsYXNzOkp0KGUuc3RhdGljQ2xhc3MsdC5zdGF0aWNDbGFzcyksY2xhc3M6byhlLmNsYXNzKT9bZS5jbGFzcyx0LmNsYXNzXTp0LmNsYXNzfX1mdW5jdGlvbiBYdChlLHQpe3JldHVybiBvKGUpfHxvKHQpP0p0KGUsS3QodCkpOiIifWZ1bmN0aW9uIEp0KGUsdCl7cmV0dXJuIGU/dD9lKyIgIit0OmU6dHx8IiJ9ZnVuY3Rpb24gS3QoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/R3QoZSk6dShlKT9ZdChlKToic3RyaW5nIj09dHlwZW9mIGU/ZToiIn1mdW5jdGlvbiBHdChlKXtmb3IodmFyIHQsbj0iIixyPTAsaT1lLmxlbmd0aDtyPGk7cisrKW8odD1LdChlW3JdKSkmJiIiIT09dCYmKG4mJihuKz0iICIpLG4rPXQpO3JldHVybiBufWZ1bmN0aW9uIFl0KGUpe3ZhciB0PSIiO2Zvcih2YXIgbiBpbiBlKWVbbl0mJih0JiYodCs9IiAiKSx0Kz1uKTtyZXR1cm4gdH1mdW5jdGlvbiBRdChlKXtyZXR1cm4gUWEoZSk/InN2ZyI6Im1hdGgiPT09ZT8ibWF0aCI6dm9pZCAwfWZ1bmN0aW9uIFp0KGUpe2lmKCFBaSlyZXR1cm4hMDtpZihlcyhlKSlyZXR1cm4hMTtpZihlPWUudG9Mb3dlckNhc2UoKSxudWxsIT10c1tlXSlyZXR1cm4gdHNbZV07dmFyIHQ9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChlKTtyZXR1cm4gZS5pbmRleE9mKCItIik+LTE/dHNbZV09dC5jb25zdHJ1Y3Rvcj09PXdpbmRvdy5IVE1MVW5rbm93bkVsZW1lbnR8fHQuY29uc3RydWN0b3I9PT13aW5kb3cuSFRNTEVsZW1lbnQ6dHNbZV09L0hUTUxVbmtub3duRWxlbWVudC8udGVzdCh0LnRvU3RyaW5nKCkpfWZ1bmN0aW9uIGVuKGUpe2lmKCJzdHJpbmciPT10eXBlb2YgZSl7dmFyIHQ9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlKTtyZXR1cm4gdHx8ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgiZGl2Iil9cmV0dXJuIGV9ZnVuY3Rpb24gdG4oZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFbGVtZW50KGUpO3JldHVybiJzZWxlY3QiIT09ZT9uOih0LmRhdGEmJnQuZGF0YS5hdHRycyYmdm9pZCAwIT09dC5kYXRhLmF0dHJzLm11bHRpcGxlJiZuLnNldEF0dHJpYnV0ZSgibXVsdGlwbGUiLCJtdWx0aXBsZSIpLG4pfWZ1bmN0aW9uIG5uKGUsdCl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnROUyhHYVtlXSx0KX1mdW5jdGlvbiBybihlKXtyZXR1cm4gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoZSl9ZnVuY3Rpb24gb24oZSl7cmV0dXJuIGRvY3VtZW50LmNyZWF0ZUNvbW1lbnQoZSl9ZnVuY3Rpb24gYW4oZSx0LG4pe2UuaW5zZXJ0QmVmb3JlKHQsbil9ZnVuY3Rpb24gc24oZSx0KXtlLnJlbW92ZUNoaWxkKHQpfWZ1bmN0aW9uIHVuKGUsdCl7ZS5hcHBlbmRDaGlsZCh0KX1mdW5jdGlvbiBjbihlKXtyZXR1cm4gZS5wYXJlbnROb2RlfWZ1bmN0aW9uIGxuKGUpe3JldHVybiBlLm5leHRTaWJsaW5nfWZ1bmN0aW9uIGZuKGUpe3JldHVybiBlLnRhZ05hbWV9ZnVuY3Rpb24gcG4oZSx0KXtlLnRleHRDb250ZW50PXR9ZnVuY3Rpb24gZG4oZSx0KXtlLnNldEF0dHJpYnV0ZSh0LCIiKX1mdW5jdGlvbiBobihlLHQpe3ZhciBuPWUuZGF0YS5yZWY7aWYobyhuKSl7dmFyIHI9ZS5jb250ZXh0LGk9ZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5lbG0sYT1yLiRyZWZzO3Q/QXJyYXkuaXNBcnJheShhW25dKT92KGFbbl0saSk6YVtuXT09PWkmJihhW25dPXZvaWQgMCk6ZS5kYXRhLnJlZkluRm9yP0FycmF5LmlzQXJyYXkoYVtuXSk/YVtuXS5pbmRleE9mKGkpPDAmJmFbbl0ucHVzaChpKTphW25dPVtpXTphW25dPWl9fWZ1bmN0aW9uIHZuKGUsdCl7cmV0dXJuIGUua2V5PT09dC5rZXkmJihlLnRhZz09PXQudGFnJiZlLmlzQ29tbWVudD09PXQuaXNDb21tZW50JiZvKGUuZGF0YSk9PT1vKHQuZGF0YSkmJm1uKGUsdCl8fGkoZS5pc0FzeW5jUGxhY2Vob2xkZXIpJiZlLmFzeW5jRmFjdG9yeT09PXQuYXN5bmNGYWN0b3J5JiZyKHQuYXN5bmNGYWN0b3J5LmVycm9yKSl9ZnVuY3Rpb24gbW4oZSx0KXtpZigiaW5wdXQiIT09ZS50YWcpcmV0dXJuITA7dmFyIG4scj1vKG49ZS5kYXRhKSYmbyhuPW4uYXR0cnMpJiZuLnR5cGUsaT1vKG49dC5kYXRhKSYmbyhuPW4uYXR0cnMpJiZuLnR5cGU7cmV0dXJuIHI9PT1pfHxucyhyKSYmbnMoaSl9ZnVuY3Rpb24geW4oZSx0LG4pe3ZhciByLGksYT17fTtmb3Iocj10O3I8PW47KytyKWk9ZVtyXS5rZXksbyhpKSYmKGFbaV09cik7cmV0dXJuIGF9ZnVuY3Rpb24gZ24oZSx0KXsoZS5kYXRhLmRpcmVjdGl2ZXN8fHQuZGF0YS5kaXJlY3RpdmVzKSYmYm4oZSx0KX1mdW5jdGlvbiBibihlLHQpe3ZhciBuLHIsbyxpPWU9PT1pcyxhPXQ9PT1pcyxzPXhuKGUuZGF0YS5kaXJlY3RpdmVzLGUuY29udGV4dCksdT14bih0LmRhdGEuZGlyZWN0aXZlcyx0LmNvbnRleHQpLGM9W10sbD1bXTtmb3IobiBpbiB1KXI9c1tuXSxvPXVbbl0scj8oby5vbGRWYWx1ZT1yLnZhbHVlLF9uKG8sInVwZGF0ZSIsdCxlKSxvLmRlZiYmby5kZWYuY29tcG9uZW50VXBkYXRlZCYmbC5wdXNoKG8pKTooX24obywiYmluZCIsdCxlKSxvLmRlZiYmby5kZWYuaW5zZXJ0ZWQmJmMucHVzaChvKSk7aWYoYy5sZW5ndGgpe3ZhciBmPWZ1bmN0aW9uKCl7Zm9yKHZhciBuPTA7bjxjLmxlbmd0aDtuKyspX24oY1tuXSwiaW5zZXJ0ZWQiLHQsZSl9O2k/ZGUodCwiaW5zZXJ0IixmKTpmKCl9aWYobC5sZW5ndGgmJmRlKHQsInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtmb3IodmFyIG49MDtuPGwubGVuZ3RoO24rKylfbihsW25dLCJjb21wb25lbnRVcGRhdGVkIix0LGUpfSksIWkpZm9yKG4gaW4gcyl1W25dfHxfbihzW25dLCJ1bmJpbmQiLGUsZSxhKX1mdW5jdGlvbiB4bihlLHQpe3ZhciBuPU9iamVjdC5jcmVhdGUobnVsbCk7aWYoIWUpcmV0dXJuIG47dmFyIHIsbztmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKW89ZVtyXSxvLm1vZGlmaWVyc3x8KG8ubW9kaWZpZXJzPXVzKSxuW3duKG8pXT1vLG8uZGVmPVkodC4kb3B0aW9ucywiZGlyZWN0aXZlcyIsby5uYW1lLCEwKTtyZXR1cm4gbn1mdW5jdGlvbiB3bihlKXtyZXR1cm4gZS5yYXdOYW1lfHxlLm5hbWUrIi4iK09iamVjdC5rZXlzKGUubW9kaWZpZXJzfHx7fSkuam9pbigiLiIpfWZ1bmN0aW9uIF9uKGUsdCxuLHIsbyl7dmFyIGk9ZS5kZWYmJmUuZGVmW3RdO2lmKGkpdHJ5e2kobi5lbG0sZSxuLHIsbyl9Y2F0Y2gocil7cmUocixuLmNvbnRleHQsImRpcmVjdGl2ZSAiK2UubmFtZSsiICIrdCsiIGhvb2siKX19ZnVuY3Rpb24gQ24oZSx0KXt2YXIgbj10LmNvbXBvbmVudE9wdGlvbnM7aWYoIShvKG4pJiYhMT09PW4uQ3Rvci5vcHRpb25zLmluaGVyaXRBdHRyc3x8cihlLmRhdGEuYXR0cnMpJiZyKHQuZGF0YS5hdHRycykpKXt2YXIgaSxhLHM9dC5lbG0sdT1lLmRhdGEuYXR0cnN8fHt9LGM9dC5kYXRhLmF0dHJzfHx7fTtvKGMuX19vYl9fKSYmKGM9dC5kYXRhLmF0dHJzPXcoe30sYykpO2ZvcihpIGluIGMpYT1jW2ldLHVbaV0hPT1hJiZUbihzLGksYSk7KE9pfHxOaSkmJmMudmFsdWUhPT11LnZhbHVlJiZUbihzLCJ2YWx1ZSIsYy52YWx1ZSk7Zm9yKGkgaW4gdSlyKGNbaV0pJiYoWGEoaSk/cy5yZW1vdmVBdHRyaWJ1dGVOUyhWYSxKYShpKSk6V2EoaSl8fHMucmVtb3ZlQXR0cmlidXRlKGkpKX19ZnVuY3Rpb24gVG4oZSx0LG4pe2UudGFnTmFtZS5pbmRleE9mKCItIik+LTE/a24oZSx0LG4pOnphKHQpP0thKG4pP2UucmVtb3ZlQXR0cmlidXRlKHQpOihuPSJhbGxvd2Z1bGxzY3JlZW4iPT09dCYmIkVNQkVEIj09PWUudGFnTmFtZT8idHJ1ZSI6dCxlLnNldEF0dHJpYnV0ZSh0LG4pKTpXYSh0KT9lLnNldEF0dHJpYnV0ZSh0LEthKG4pfHwiZmFsc2UiPT09bj8iZmFsc2UiOiJ0cnVlIik6WGEodCk/S2Eobik/ZS5yZW1vdmVBdHRyaWJ1dGVOUyhWYSxKYSh0KSk6ZS5zZXRBdHRyaWJ1dGVOUyhWYSx0LG4pOmtuKGUsdCxuKX1mdW5jdGlvbiBrbihlLHQsbil7aWYoS2EobikpZS5yZW1vdmVBdHRyaWJ1dGUodCk7ZWxzZXtpZihPaSYmIWppJiYiVEVYVEFSRUEiPT09ZS50YWdOYW1lJiYicGxhY2Vob2xkZXIiPT09dCYmIWUuX19pZXBoKXt2YXIgcj1mdW5jdGlvbih0KXt0LnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpLGUucmVtb3ZlRXZlbnRMaXN0ZW5lcigiaW5wdXQiLHIpfTtlLmFkZEV2ZW50TGlzdGVuZXIoImlucHV0IixyKSxlLl9faWVwaD0hMH1lLnNldEF0dHJpYnV0ZSh0LG4pfX1mdW5jdGlvbiBBbihlLHQpe3ZhciBuPXQuZWxtLGk9dC5kYXRhLGE9ZS5kYXRhO2lmKCEocihpLnN0YXRpY0NsYXNzKSYmcihpLmNsYXNzKSYmKHIoYSl8fHIoYS5zdGF0aWNDbGFzcykmJnIoYS5jbGFzcykpKSl7dmFyIHM9enQodCksdT1uLl90cmFuc2l0aW9uQ2xhc3NlcztvKHUpJiYocz1KdChzLEt0KHUpKSkscyE9PW4uX3ByZXZDbGFzcyYmKG4uc2V0QXR0cmlidXRlKCJjbGFzcyIscyksbi5fcHJldkNsYXNzPXMpfX1mdW5jdGlvbiBTbihlKXtmdW5jdGlvbiB0KCl7KGF8fChhPVtdKSkucHVzaChlLnNsaWNlKGgsbykudHJpbSgpKSxoPW8rMX12YXIgbixyLG8saSxhLHM9ITEsdT0hMSxjPSExLGw9ITEsZj0wLHA9MCxkPTAsaD0wO2ZvcihvPTA7bzxlLmxlbmd0aDtvKyspaWYocj1uLG49ZS5jaGFyQ29kZUF0KG8pLHMpMzk9PT1uJiY5MiE9PXImJihzPSExKTtlbHNlIGlmKHUpMzQ9PT1uJiY5MiE9PXImJih1PSExKTtlbHNlIGlmKGMpOTY9PT1uJiY5MiE9PXImJihjPSExKTtlbHNlIGlmKGwpNDc9PT1uJiY5MiE9PXImJihsPSExKTtlbHNlIGlmKDEyNCE9PW58fDEyND09PWUuY2hhckNvZGVBdChvKzEpfHwxMjQ9PT1lLmNoYXJDb2RlQXQoby0xKXx8Znx8cHx8ZCl7c3dpdGNoKG4pe2Nhc2UgMzQ6dT0hMDticmVhaztjYXNlIDM5OnM9ITA7YnJlYWs7Y2FzZSA5NjpjPSEwO2JyZWFrO2Nhc2UgNDA6ZCsrO2JyZWFrO2Nhc2UgNDE6ZC0tO2JyZWFrO2Nhc2UgOTE6cCsrO2JyZWFrO2Nhc2UgOTM6cC0tO2JyZWFrO2Nhc2UgMTIzOmYrKzticmVhaztjYXNlIDEyNTpmLS19aWYoNDc9PT1uKXtmb3IodmFyIHY9by0xLG09dm9pZCAwO3Y+PTAmJiIgIj09PShtPWUuY2hhckF0KHYpKTt2LS0pO20mJnBzLnRlc3QobSl8fChsPSEwKX19ZWxzZSB2b2lkIDA9PT1pPyhoPW8rMSxpPWUuc2xpY2UoMCxvKS50cmltKCkpOnQoKTtpZih2b2lkIDA9PT1pP2k9ZS5zbGljZSgwLG8pLnRyaW0oKTowIT09aCYmdCgpLGEpZm9yKG89MDtvPGEubGVuZ3RoO28rKylpPSRuKGksYVtvXSk7cmV0dXJuIGl9ZnVuY3Rpb24gJG4oZSx0KXt2YXIgbj10LmluZGV4T2YoIigiKTtpZihuPDApcmV0dXJuJ19mKCInK3QrJyIpKCcrZSsiKSI7dmFyIHI9dC5zbGljZSgwLG4pLG89dC5zbGljZShuKzEpO3JldHVybidfZigiJytyKyciKSgnK2UrKCIpIiE9PW8/IiwiK286byl9ZnVuY3Rpb24gRW4oZSl7Y29uc29sZS5lcnJvcigiW1Z1ZSBjb21waWxlcl06ICIrZSl9ZnVuY3Rpb24gT24oZSx0KXtyZXR1cm4gZT9lLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZVt0XX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZX0pOltdfWZ1bmN0aW9uIGpuKGUsdCxuKXsoZS5wcm9wc3x8KGUucHJvcHM9W10pKS5wdXNoKHtuYW1lOnQsdmFsdWU6bn0pLGUucGxhaW49ITF9ZnVuY3Rpb24gTm4oZSx0LG4peyhlLmF0dHJzfHwoZS5hdHRycz1bXSkpLnB1c2goe25hbWU6dCx2YWx1ZTpufSksZS5wbGFpbj0hMX1mdW5jdGlvbiBMbihlLHQsbil7ZS5hdHRyc01hcFt0XT1uLGUuYXR0cnNMaXN0LnB1c2goe25hbWU6dCx2YWx1ZTpufSl9ZnVuY3Rpb24gRG4oZSx0LG4scixvLGkpeyhlLmRpcmVjdGl2ZXN8fChlLmRpcmVjdGl2ZXM9W10pKS5wdXNoKHtuYW1lOnQscmF3TmFtZTpuLHZhbHVlOnIsYXJnOm8sbW9kaWZpZXJzOml9KSxlLnBsYWluPSExfWZ1bmN0aW9uIEluKGUsdCxuLHIsbyxpKXtyPXJ8fHNpLHIuY2FwdHVyZSYmKGRlbGV0ZSByLmNhcHR1cmUsdD0iISIrdCksci5vbmNlJiYoZGVsZXRlIHIub25jZSx0PSJ+Iit0KSxyLnBhc3NpdmUmJihkZWxldGUgci5wYXNzaXZlLHQ9IiYiK3QpLCJjbGljayI9PT10JiYoci5yaWdodD8odD0iY29udGV4dG1lbnUiLGRlbGV0ZSByLnJpZ2h0KTpyLm1pZGRsZSYmKHQ9Im1vdXNldXAiKSk7dmFyIGE7ci5uYXRpdmU/KGRlbGV0ZSByLm5hdGl2ZSxhPWUubmF0aXZlRXZlbnRzfHwoZS5uYXRpdmVFdmVudHM9e30pKTphPWUuZXZlbnRzfHwoZS5ldmVudHM9e30pO3ZhciBzPXt2YWx1ZTpuLnRyaW0oKX07ciE9PXNpJiYocy5tb2RpZmllcnM9cik7dmFyIHU9YVt0XTtBcnJheS5pc0FycmF5KHUpP28/dS51bnNoaWZ0KHMpOnUucHVzaChzKTphW3RdPXU/bz9bcyx1XTpbdSxzXTpzLGUucGxhaW49ITF9ZnVuY3Rpb24gUm4oZSx0LG4pe3ZhciByPVBuKGUsIjoiK3QpfHxQbihlLCJ2LWJpbmQ6Iit0KTtpZihudWxsIT1yKXJldHVybiBTbihyKTtpZighMSE9PW4pe3ZhciBvPVBuKGUsdCk7aWYobnVsbCE9bylyZXR1cm4gSlNPTi5zdHJpbmdpZnkobyl9fWZ1bmN0aW9uIFBuKGUsdCxuKXt2YXIgcjtpZihudWxsIT0ocj1lLmF0dHJzTWFwW3RdKSlmb3IodmFyIG89ZS5hdHRyc0xpc3QsaT0wLGE9by5sZW5ndGg7aTxhO2krKylpZihvW2ldLm5hbWU9PT10KXtvLnNwbGljZShpLDEpO2JyZWFrfXJldHVybiBuJiZkZWxldGUgZS5hdHRyc01hcFt0XSxyfWZ1bmN0aW9uIE1uKGUsdCxuKXt2YXIgcj1ufHx7fSxvPXIubnVtYmVyLGk9ci50cmltLGE9IiQkdiI7aSYmKGE9Iih0eXBlb2YgJCR2ID09PSAnc3RyaW5nJz8gJCR2LnRyaW0oKTogJCR2KSIpLG8mJihhPSJfbigiK2ErIikiKTt2YXIgcz1xbih0LGEpO2UubW9kZWw9e3ZhbHVlOiIoIit0KyIpIixleHByZXNzaW9uOiciJyt0KyciJyxjYWxsYmFjazoiZnVuY3Rpb24gKCQkdikgeyIrcysifSJ9fWZ1bmN0aW9uIHFuKGUsdCl7dmFyIG49SG4oZSk7cmV0dXJuIG51bGw9PT1uLmtleT9lKyI9Iit0OiIkc2V0KCIrbi5leHArIiwgIituLmtleSsiLCAiK3QrIikifWZ1bmN0aW9uIEhuKGUpe2lmKGU9ZS50cmltKCksTmE9ZS5sZW5ndGgsZS5pbmRleE9mKCJbIik8MHx8ZS5sYXN0SW5kZXhPZigiXSIpPE5hLTEpcmV0dXJuIElhPWUubGFzdEluZGV4T2YoIi4iKSxJYT4tMT97ZXhwOmUuc2xpY2UoMCxJYSksa2V5OiciJytlLnNsaWNlKElhKzEpKyciJ306e2V4cDplLGtleTpudWxsfTtmb3IoTGE9ZSxJYT1SYT1QYT0wOyFCbigpOylEYT1GbigpLFVuKERhKT96bihEYSk6OTE9PT1EYSYmV24oRGEpO3JldHVybntleHA6ZS5zbGljZSgwLFJhKSxrZXk6ZS5zbGljZShSYSsxLFBhKX19ZnVuY3Rpb24gRm4oKXtyZXR1cm4gTGEuY2hhckNvZGVBdCgrK0lhKX1mdW5jdGlvbiBCbigpe3JldHVybiBJYT49TmF9ZnVuY3Rpb24gVW4oZSl7cmV0dXJuIDM0PT09ZXx8Mzk9PT1lfWZ1bmN0aW9uIFduKGUpe3ZhciB0PTE7Zm9yKFJhPUlhOyFCbigpOylpZihlPUZuKCksVW4oZSkpem4oZSk7ZWxzZSBpZig5MT09PWUmJnQrKyw5Mz09PWUmJnQtLSwwPT09dCl7UGE9SWE7YnJlYWt9fWZ1bmN0aW9uIHpuKGUpe2Zvcih2YXIgdD1lOyFCbigpJiYoZT1GbigpKSE9PXQ7KTt9ZnVuY3Rpb24gVm4oZSx0LG4pe01hPW47dmFyIHI9dC52YWx1ZSxvPXQubW9kaWZpZXJzLGk9ZS50YWcsYT1lLmF0dHJzTWFwLnR5cGU7aWYoZS5jb21wb25lbnQpcmV0dXJuIE1uKGUscixvKSwhMTtpZigic2VsZWN0Ij09PWkpS24oZSxyLG8pO2Vsc2UgaWYoImlucHV0Ij09PWkmJiJjaGVja2JveCI9PT1hKVhuKGUscixvKTtlbHNlIGlmKCJpbnB1dCI9PT1pJiYicmFkaW8iPT09YSlKbihlLHIsbyk7ZWxzZSBpZigiaW5wdXQiPT09aXx8InRleHRhcmVhIj09PWkpR24oZSxyLG8pO2Vsc2UgaWYoIUNpLmlzUmVzZXJ2ZWRUYWcoaSkpcmV0dXJuIE1uKGUscixvKSwhMTtyZXR1cm4hMH1mdW5jdGlvbiBYbihlLHQsbil7dmFyIHI9biYmbi5udW1iZXIsbz1SbihlLCJ2YWx1ZSIpfHwibnVsbCIsaT1SbihlLCJ0cnVlLXZhbHVlIil8fCJ0cnVlIixhPVJuKGUsImZhbHNlLXZhbHVlIil8fCJmYWxzZSI7am4oZSwiY2hlY2tlZCIsIkFycmF5LmlzQXJyYXkoIit0KyIpP19pKCIrdCsiLCIrbysiKT4tMSIrKCJ0cnVlIj09PWk/IjooIit0KyIpIjoiOl9xKCIrdCsiLCIraSsiKSIpKSxJbihlLCJjaGFuZ2UiLCJ2YXIgJCRhPSIrdCsiLCQkZWw9JGV2ZW50LnRhcmdldCwkJGM9JCRlbC5jaGVja2VkPygiK2krIik6KCIrYSsiKTtpZihBcnJheS5pc0FycmF5KCQkYSkpe3ZhciAkJHY9Iisocj8iX24oIitvKyIpIjpvKSsiLCQkaT1faSgkJGEsJCR2KTtpZigkJGVsLmNoZWNrZWQpeyQkaTwwJiYoIitxbih0LCIkJGEuY29uY2F0KFskJHZdKSIpKyIpfWVsc2V7JCRpPi0xJiYoIitxbih0LCIkJGEuc2xpY2UoMCwkJGkpLmNvbmNhdCgkJGEuc2xpY2UoJCRpKzEpKSIpKyIpfX1lbHNleyIrcW4odCwiJCRjIikrIn0iLG51bGwsITApfWZ1bmN0aW9uIEpuKGUsdCxuKXt2YXIgcj1uJiZuLm51bWJlcixvPVJuKGUsInZhbHVlIil8fCJudWxsIjtvPXI/Il9uKCIrbysiKSI6byxqbihlLCJjaGVja2VkIiwiX3EoIit0KyIsIitvKyIpIiksSW4oZSwiY2hhbmdlIixxbih0LG8pLG51bGwsITApfWZ1bmN0aW9uIEtuKGUsdCxuKXt2YXIgcj1uJiZuLm51bWJlcixvPSdBcnJheS5wcm90b3R5cGUuZmlsdGVyLmNhbGwoJGV2ZW50LnRhcmdldC5vcHRpb25zLGZ1bmN0aW9uKG8pe3JldHVybiBvLnNlbGVjdGVkfSkubWFwKGZ1bmN0aW9uKG8pe3ZhciB2YWwgPSAiX3ZhbHVlIiBpbiBvID8gby5fdmFsdWUgOiBvLnZhbHVlO3JldHVybiAnKyhyPyJfbih2YWwpIjoidmFsIikrIn0pIixpPSJ2YXIgJCRzZWxlY3RlZFZhbCA9ICIrbysiOyI7aT1pKyIgIitxbih0LCIkZXZlbnQudGFyZ2V0Lm11bHRpcGxlID8gJCRzZWxlY3RlZFZhbCA6ICQkc2VsZWN0ZWRWYWxbMF0iKSxJbihlLCJjaGFuZ2UiLGksbnVsbCwhMCl9ZnVuY3Rpb24gR24oZSx0LG4pe3ZhciByPWUuYXR0cnNNYXAudHlwZSxvPW58fHt9LGk9by5sYXp5LGE9by5udW1iZXIscz1vLnRyaW0sdT0haSYmInJhbmdlIiE9PXIsYz1pPyJjaGFuZ2UiOiJyYW5nZSI9PT1yP2RzOiJpbnB1dCIsbD0iJGV2ZW50LnRhcmdldC52YWx1ZSI7cyYmKGw9IiRldmVudC50YXJnZXQudmFsdWUudHJpbSgpIiksYSYmKGw9Il9uKCIrbCsiKSIpO3ZhciBmPXFuKHQsbCk7dSYmKGY9ImlmKCRldmVudC50YXJnZXQuY29tcG9zaW5nKXJldHVybjsiK2YpLGpuKGUsInZhbHVlIiwiKCIrdCsiKSIpLEluKGUsYyxmLG51bGwsITApLChzfHxhKSYmSW4oZSwiYmx1ciIsIiRmb3JjZVVwZGF0ZSgpIil9ZnVuY3Rpb24gWW4oZSl7aWYobyhlW2RzXSkpe3ZhciB0PU9pPyJjaGFuZ2UiOiJpbnB1dCI7ZVt0XT1bXS5jb25jYXQoZVtkc10sZVt0XXx8W10pLGRlbGV0ZSBlW2RzXX1vKGVbaHNdKSYmKGUuY2hhbmdlPVtdLmNvbmNhdChlW2hzXSxlLmNoYW5nZXx8W10pLGRlbGV0ZSBlW2hzXSl9ZnVuY3Rpb24gUW4oZSx0LG4pe3ZhciByPXFhO3JldHVybiBmdW5jdGlvbiBvKCl7bnVsbCE9PWUuYXBwbHkobnVsbCxhcmd1bWVudHMpJiZlcih0LG8sbixyKX19ZnVuY3Rpb24gWm4oZSx0LG4scixvKXt0PXNlKHQpLG4mJih0PVFuKHQsZSxyKSkscWEuYWRkRXZlbnRMaXN0ZW5lcihlLHQsSWk/e2NhcHR1cmU6cixwYXNzaXZlOm99OnIpfWZ1bmN0aW9uIGVyKGUsdCxuLHIpeyhyfHxxYSkucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLHQuX3dpdGhUYXNrfHx0LG4pfWZ1bmN0aW9uIHRyKGUsdCl7aWYoIXIoZS5kYXRhLm9uKXx8IXIodC5kYXRhLm9uKSl7dmFyIG49dC5kYXRhLm9ufHx7fSxvPWUuZGF0YS5vbnx8e307cWE9dC5lbG0sWW4obikscGUobixvLFpuLGVyLHQuY29udGV4dCkscWE9dm9pZCAwfX1mdW5jdGlvbiBucihlLHQpe2lmKCFyKGUuZGF0YS5kb21Qcm9wcyl8fCFyKHQuZGF0YS5kb21Qcm9wcykpe3ZhciBuLGksYT10LmVsbSxzPWUuZGF0YS5kb21Qcm9wc3x8e30sdT10LmRhdGEuZG9tUHJvcHN8fHt9O28odS5fX29iX18pJiYodT10LmRhdGEuZG9tUHJvcHM9dyh7fSx1KSk7Zm9yKG4gaW4gcylyKHVbbl0pJiYoYVtuXT0iIik7Zm9yKG4gaW4gdSl7aWYoaT11W25dLCJ0ZXh0Q29udGVudCI9PT1ufHwiaW5uZXJIVE1MIj09PW4pe2lmKHQuY2hpbGRyZW4mJih0LmNoaWxkcmVuLmxlbmd0aD0wKSxpPT09c1tuXSljb250aW51ZTsxPT09YS5jaGlsZE5vZGVzLmxlbmd0aCYmYS5yZW1vdmVDaGlsZChhLmNoaWxkTm9kZXNbMF0pfWlmKCJ2YWx1ZSI9PT1uKXthLl92YWx1ZT1pO3ZhciBjPXIoaSk/IiI6U3RyaW5nKGkpO3JyKGEsYykmJihhLnZhbHVlPWMpfWVsc2UgYVtuXT1pfX19ZnVuY3Rpb24gcnIoZSx0KXtyZXR1cm4hZS5jb21wb3NpbmcmJigiT1BUSU9OIj09PWUudGFnTmFtZXx8b3IoZSx0KXx8aXIoZSx0KSl9ZnVuY3Rpb24gb3IoZSx0KXt2YXIgbj0hMDt0cnl7bj1kb2N1bWVudC5hY3RpdmVFbGVtZW50IT09ZX1jYXRjaChlKXt9cmV0dXJuIG4mJmUudmFsdWUhPT10fWZ1bmN0aW9uIGlyKGUsdCl7dmFyIG49ZS52YWx1ZSxyPWUuX3ZNb2RpZmllcnM7aWYobyhyKSl7aWYoci5sYXp5KXJldHVybiExO2lmKHIubnVtYmVyKXJldHVybiBkKG4pIT09ZCh0KTtpZihyLnRyaW0pcmV0dXJuIG4udHJpbSgpIT09dC50cmltKCl9cmV0dXJuIG4hPT10fWZ1bmN0aW9uIGFyKGUpe3ZhciB0PXNyKGUuc3R5bGUpO3JldHVybiBlLnN0YXRpY1N0eWxlP3coZS5zdGF0aWNTdHlsZSx0KTp0fWZ1bmN0aW9uIHNyKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpP18oZSk6InN0cmluZyI9PXR5cGVvZiBlP3lzKGUpOmV9ZnVuY3Rpb24gdXIoZSx0KXt2YXIgbixyPXt9O2lmKHQpZm9yKHZhciBvPWU7by5jb21wb25lbnRJbnN0YW5jZTspKG89by5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUpJiZvLmRhdGEmJihuPWFyKG8uZGF0YSkpJiZ3KHIsbik7KG49YXIoZS5kYXRhKSkmJncocixuKTtmb3IodmFyIGk9ZTtpPWkucGFyZW50OylpLmRhdGEmJihuPWFyKGkuZGF0YSkpJiZ3KHIsbik7cmV0dXJuIHJ9ZnVuY3Rpb24gY3IoZSx0KXt2YXIgbj10LmRhdGEsaT1lLmRhdGE7aWYoIShyKG4uc3RhdGljU3R5bGUpJiZyKG4uc3R5bGUpJiZyKGkuc3RhdGljU3R5bGUpJiZyKGkuc3R5bGUpKSl7dmFyIGEscyx1PXQuZWxtLGM9aS5zdGF0aWNTdHlsZSxsPWkubm9ybWFsaXplZFN0eWxlfHxpLnN0eWxlfHx7fSxmPWN8fGwscD1zcih0LmRhdGEuc3R5bGUpfHx7fTt0LmRhdGEubm9ybWFsaXplZFN0eWxlPW8ocC5fX29iX18pP3coe30scCk6cDt2YXIgZD11cih0LCEwKTtmb3IocyBpbiBmKXIoZFtzXSkmJnhzKHUscywiIik7Zm9yKHMgaW4gZCkoYT1kW3NdKSE9PWZbc10mJnhzKHUscyxudWxsPT1hPyIiOmEpfX1mdW5jdGlvbiBscihlLHQpe2lmKHQmJih0PXQudHJpbSgpKSlpZihlLmNsYXNzTGlzdCl0LmluZGV4T2YoIiAiKT4tMT90LnNwbGl0KC9ccysvKS5mb3JFYWNoKGZ1bmN0aW9uKHQpe3JldHVybiBlLmNsYXNzTGlzdC5hZGQodCl9KTplLmNsYXNzTGlzdC5hZGQodCk7ZWxzZXt2YXIgbj0iICIrKGUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIikrIiAiO24uaW5kZXhPZigiICIrdCsiICIpPDAmJmUuc2V0QXR0cmlidXRlKCJjbGFzcyIsKG4rdCkudHJpbSgpKX19ZnVuY3Rpb24gZnIoZSx0KXtpZih0JiYodD10LnRyaW0oKSkpaWYoZS5jbGFzc0xpc3QpdC5pbmRleE9mKCIgIik+LTE/dC5zcGxpdCgvXHMrLykuZm9yRWFjaChmdW5jdGlvbih0KXtyZXR1cm4gZS5jbGFzc0xpc3QucmVtb3ZlKHQpfSk6ZS5jbGFzc0xpc3QucmVtb3ZlKHQpLGUuY2xhc3NMaXN0Lmxlbmd0aHx8ZS5yZW1vdmVBdHRyaWJ1dGUoImNsYXNzIik7ZWxzZXtmb3IodmFyIG49IiAiKyhlLmdldEF0dHJpYnV0ZSgiY2xhc3MiKXx8IiIpKyIgIixyPSIgIit0KyIgIjtuLmluZGV4T2Yocik+PTA7KW49bi5yZXBsYWNlKHIsIiAiKTtuPW4udHJpbSgpLG4/ZS5zZXRBdHRyaWJ1dGUoImNsYXNzIixuKTplLnJlbW92ZUF0dHJpYnV0ZSgiY2xhc3MiKX19ZnVuY3Rpb24gcHIoZSl7aWYoZSl7aWYoIm9iamVjdCI9PXR5cGVvZiBlKXt2YXIgdD17fTtyZXR1cm4hMSE9PWUuY3NzJiZ3KHQsVHMoZS5uYW1lfHwidiIpKSx3KHQsZSksdH1yZXR1cm4ic3RyaW5nIj09dHlwZW9mIGU/VHMoZSk6dm9pZCAwfX1mdW5jdGlvbiBkcihlKXtOcyhmdW5jdGlvbigpe05zKGUpfSl9ZnVuY3Rpb24gaHIoZSx0KXt2YXIgbj1lLl90cmFuc2l0aW9uQ2xhc3Nlc3x8KGUuX3RyYW5zaXRpb25DbGFzc2VzPVtdKTtuLmluZGV4T2YodCk8MCYmKG4ucHVzaCh0KSxscihlLHQpKX1mdW5jdGlvbiB2cihlLHQpe2UuX3RyYW5zaXRpb25DbGFzc2VzJiZ2KGUuX3RyYW5zaXRpb25DbGFzc2VzLHQpLGZyKGUsdCl9ZnVuY3Rpb24gbXIoZSx0LG4pe3ZhciByPXlyKGUsdCksbz1yLnR5cGUsaT1yLnRpbWVvdXQsYT1yLnByb3BDb3VudDtpZighbylyZXR1cm4gbigpO3ZhciBzPW89PT1Bcz9Fczpqcyx1PTAsYz1mdW5jdGlvbigpe2UucmVtb3ZlRXZlbnRMaXN0ZW5lcihzLGwpLG4oKX0sbD1mdW5jdGlvbih0KXt0LnRhcmdldD09PWUmJisrdT49YSYmYygpfTtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7dTxhJiZjKCl9LGkrMSksZS5hZGRFdmVudExpc3RlbmVyKHMsbCl9ZnVuY3Rpb24geXIoZSx0KXt2YXIgbixyPXdpbmRvdy5nZXRDb21wdXRlZFN0eWxlKGUpLG89clskcysiRGVsYXkiXS5zcGxpdCgiLCAiKSxpPXJbJHMrIkR1cmF0aW9uIl0uc3BsaXQoIiwgIiksYT1ncihvLGkpLHM9cltPcysiRGVsYXkiXS5zcGxpdCgiLCAiKSx1PXJbT3MrIkR1cmF0aW9uIl0uc3BsaXQoIiwgIiksYz1ncihzLHUpLGw9MCxmPTA7cmV0dXJuIHQ9PT1Bcz9hPjAmJihuPUFzLGw9YSxmPWkubGVuZ3RoKTp0PT09U3M/Yz4wJiYobj1TcyxsPWMsZj11Lmxlbmd0aCk6KGw9TWF0aC5tYXgoYSxjKSxuPWw+MD9hPmM/QXM6U3M6bnVsbCxmPW4/bj09PUFzP2kubGVuZ3RoOnUubGVuZ3RoOjApLHt0eXBlOm4sdGltZW91dDpsLHByb3BDb3VudDpmLGhhc1RyYW5zZm9ybTpuPT09QXMmJkxzLnRlc3QoclskcysiUHJvcGVydHkiXSl9fWZ1bmN0aW9uIGdyKGUsdCl7Zm9yKDtlLmxlbmd0aDx0Lmxlbmd0aDspZT1lLmNvbmNhdChlKTtyZXR1cm4gTWF0aC5tYXguYXBwbHkobnVsbCx0Lm1hcChmdW5jdGlvbih0LG4pe3JldHVybiBicih0KSticihlW25dKX0pKX1mdW5jdGlvbiBicihlKXtyZXR1cm4gMWUzKk51bWJlcihlLnNsaWNlKDAsLTEpKX1mdW5jdGlvbiB4cihlLHQpe3ZhciBuPWUuZWxtO28obi5fbGVhdmVDYikmJihuLl9sZWF2ZUNiLmNhbmNlbGxlZD0hMCxuLl9sZWF2ZUNiKCkpO3ZhciBpPXByKGUuZGF0YS50cmFuc2l0aW9uKTtpZighcihpKSYmIW8obi5fZW50ZXJDYikmJjE9PT1uLm5vZGVUeXBlKXtmb3IodmFyIGE9aS5jc3Mscz1pLnR5cGUsYz1pLmVudGVyQ2xhc3MsbD1pLmVudGVyVG9DbGFzcyxmPWkuZW50ZXJBY3RpdmVDbGFzcyxwPWkuYXBwZWFyQ2xhc3MsaD1pLmFwcGVhclRvQ2xhc3Msdj1pLmFwcGVhckFjdGl2ZUNsYXNzLG09aS5iZWZvcmVFbnRlcix5PWkuZW50ZXIsZz1pLmFmdGVyRW50ZXIsYj1pLmVudGVyQ2FuY2VsbGVkLHg9aS5iZWZvcmVBcHBlYXIsdz1pLmFwcGVhcixfPWkuYWZ0ZXJBcHBlYXIsQz1pLmFwcGVhckNhbmNlbGxlZCxUPWkuZHVyYXRpb24saz1kYSxTPWRhLiR2bm9kZTtTJiZTLnBhcmVudDspUz1TLnBhcmVudCxrPVMuY29udGV4dDt2YXIgJD0hay5faXNNb3VudGVkfHwhZS5pc1Jvb3RJbnNlcnQ7aWYoISR8fHd8fCIiPT09dyl7dmFyIEU9JCYmcD9wOmMsTz0kJiZ2P3Y6ZixqPSQmJmg/aDpsLE49JD94fHxtOm0sTD0kJiYiZnVuY3Rpb24iPT10eXBlb2Ygdz93OnksRD0kP198fGc6ZyxJPSQ/Q3x8YjpiLFI9ZCh1KFQpP1QuZW50ZXI6VCksUD0hMSE9PWEmJiFqaSxNPUNyKEwpLHE9bi5fZW50ZXJDYj1BKGZ1bmN0aW9uKCl7UCYmKHZyKG4saiksdnIobixPKSkscS5jYW5jZWxsZWQ/KFAmJnZyKG4sRSksSSYmSShuKSk6RCYmRChuKSxuLl9lbnRlckNiPW51bGx9KTtlLmRhdGEuc2hvd3x8ZGUoZSwiaW5zZXJ0IixmdW5jdGlvbigpe3ZhciB0PW4ucGFyZW50Tm9kZSxyPXQmJnQuX3BlbmRpbmcmJnQuX3BlbmRpbmdbZS5rZXldO3ImJnIudGFnPT09ZS50YWcmJnIuZWxtLl9sZWF2ZUNiJiZyLmVsbS5fbGVhdmVDYigpLEwmJkwobixxKX0pLE4mJk4obiksUCYmKGhyKG4sRSksaHIobixPKSxkcihmdW5jdGlvbigpe3ZyKG4sRSkscS5jYW5jZWxsZWR8fChocihuLGopLE18fChfcihSKT9zZXRUaW1lb3V0KHEsUik6bXIobixzLHEpKSl9KSksZS5kYXRhLnNob3cmJih0JiZ0KCksTCYmTChuLHEpKSxQfHxNfHxxKCl9fX1mdW5jdGlvbiB3cihlLHQpe2Z1bmN0aW9uIG4oKXtDLmNhbmNlbGxlZHx8KGUuZGF0YS5zaG93fHwoKGkucGFyZW50Tm9kZS5fcGVuZGluZ3x8KGkucGFyZW50Tm9kZS5fcGVuZGluZz17fSkpW2Uua2V5XT1lKSxoJiZoKGkpLHgmJihocihpLGwpLGhyKGkscCksZHIoZnVuY3Rpb24oKXt2cihpLGwpLEMuY2FuY2VsbGVkfHwoaHIoaSxmKSx3fHwoX3IoXyk/c2V0VGltZW91dChDLF8pOm1yKGksYyxDKSkpfSkpLHYmJnYoaSxDKSx4fHx3fHxDKCkpfXZhciBpPWUuZWxtO28oaS5fZW50ZXJDYikmJihpLl9lbnRlckNiLmNhbmNlbGxlZD0hMCxpLl9lbnRlckNiKCkpO3ZhciBhPXByKGUuZGF0YS50cmFuc2l0aW9uKTtpZihyKGEpfHwxIT09aS5ub2RlVHlwZSlyZXR1cm4gdCgpO2lmKCFvKGkuX2xlYXZlQ2IpKXt2YXIgcz1hLmNzcyxjPWEudHlwZSxsPWEubGVhdmVDbGFzcyxmPWEubGVhdmVUb0NsYXNzLHA9YS5sZWF2ZUFjdGl2ZUNsYXNzLGg9YS5iZWZvcmVMZWF2ZSx2PWEubGVhdmUsbT1hLmFmdGVyTGVhdmUseT1hLmxlYXZlQ2FuY2VsbGVkLGc9YS5kZWxheUxlYXZlLGI9YS5kdXJhdGlvbix4PSExIT09cyYmIWppLHc9Q3IodiksXz1kKHUoYik/Yi5sZWF2ZTpiKSxDPWkuX2xlYXZlQ2I9QShmdW5jdGlvbigpe2kucGFyZW50Tm9kZSYmaS5wYXJlbnROb2RlLl9wZW5kaW5nJiYoaS5wYXJlbnROb2RlLl9wZW5kaW5nW2Uua2V5XT1udWxsKSx4JiYodnIoaSxmKSx2cihpLHApKSxDLmNhbmNlbGxlZD8oeCYmdnIoaSxsKSx5JiZ5KGkpKToodCgpLG0mJm0oaSkpLGkuX2xlYXZlQ2I9bnVsbH0pO2c/ZyhuKTpuKCl9fWZ1bmN0aW9uIF9yKGUpe3JldHVybiJudW1iZXIiPT10eXBlb2YgZSYmIWlzTmFOKGUpfWZ1bmN0aW9uIENyKGUpe2lmKHIoZSkpcmV0dXJuITE7dmFyIHQ9ZS5mbnM7cmV0dXJuIG8odCk/Q3IoQXJyYXkuaXNBcnJheSh0KT90WzBdOnQpOihlLl9sZW5ndGh8fGUubGVuZ3RoKT4xfWZ1bmN0aW9uIFRyKGUsdCl7ITAhPT10LmRhdGEuc2hvdyYmeHIodCl9ZnVuY3Rpb24ga3IoZSx0LG4pe0FyKGUsdCxuKSwoT2l8fE5pKSYmc2V0VGltZW91dChmdW5jdGlvbigpe0FyKGUsdCxuKX0sMCl9ZnVuY3Rpb24gQXIoZSx0LG4pe3ZhciByPXQudmFsdWUsbz1lLm11bHRpcGxlO2lmKCFvfHxBcnJheS5pc0FycmF5KHIpKXtmb3IodmFyIGksYSxzPTAsdT1lLm9wdGlvbnMubGVuZ3RoO3M8dTtzKyspaWYoYT1lLm9wdGlvbnNbc10sbylpPWsociwkcihhKSk+LTEsYS5zZWxlY3RlZCE9PWkmJihhLnNlbGVjdGVkPWkpO2Vsc2UgaWYoVCgkcihhKSxyKSlyZXR1cm4gdm9pZChlLnNlbGVjdGVkSW5kZXghPT1zJiYoZS5zZWxlY3RlZEluZGV4PXMpKTtvfHwoZS5zZWxlY3RlZEluZGV4PS0xKX19ZnVuY3Rpb24gU3IoZSx0KXtyZXR1cm4gdC5ldmVyeShmdW5jdGlvbih0KXtyZXR1cm4hVCh0LGUpfSl9ZnVuY3Rpb24gJHIoZSl7cmV0dXJuIl92YWx1ZSJpbiBlP2UuX3ZhbHVlOmUudmFsdWV9ZnVuY3Rpb24gRXIoZSl7ZS50YXJnZXQuY29tcG9zaW5nPSEwfWZ1bmN0aW9uIE9yKGUpe2UudGFyZ2V0LmNvbXBvc2luZyYmKGUudGFyZ2V0LmNvbXBvc2luZz0hMSxqcihlLnRhcmdldCwiaW5wdXQiKSl9ZnVuY3Rpb24ganIoZSx0KXt2YXIgbj1kb2N1bWVudC5jcmVhdGVFdmVudCgiSFRNTEV2ZW50cyIpO24uaW5pdEV2ZW50KHQsITAsITApLGUuZGlzcGF0Y2hFdmVudChuKX1mdW5jdGlvbiBOcihlKXtyZXR1cm4hZS5jb21wb25lbnRJbnN0YW5jZXx8ZS5kYXRhJiZlLmRhdGEudHJhbnNpdGlvbj9lOk5yKGUuY29tcG9uZW50SW5zdGFuY2UuX3Zub2RlKX1mdW5jdGlvbiBMcihlKXt2YXIgdD1lJiZlLmNvbXBvbmVudE9wdGlvbnM7cmV0dXJuIHQmJnQuQ3Rvci5vcHRpb25zLmFic3RyYWN0P0xyKFRlKHQuY2hpbGRyZW4pKTplfWZ1bmN0aW9uIERyKGUpe3ZhciB0PXt9LG49ZS4kb3B0aW9ucztmb3IodmFyIHIgaW4gbi5wcm9wc0RhdGEpdFtyXT1lW3JdO3ZhciBvPW4uX3BhcmVudExpc3RlbmVycztmb3IodmFyIGkgaW4gbyl0W2RpKGkpXT1vW2ldO3JldHVybiB0fWZ1bmN0aW9uIElyKGUsdCl7aWYoL1xkLWtlZXAtYWxpdmUkLy50ZXN0KHQudGFnKSlyZXR1cm4gZSgia2VlcC1hbGl2ZSIse3Byb3BzOnQuY29tcG9uZW50T3B0aW9ucy5wcm9wc0RhdGF9KX1mdW5jdGlvbiBScihlKXtmb3IoO2U9ZS5wYXJlbnQ7KWlmKGUuZGF0YS50cmFuc2l0aW9uKXJldHVybiEwfWZ1bmN0aW9uIFByKGUsdCl7cmV0dXJuIHQua2V5PT09ZS5rZXkmJnQudGFnPT09ZS50YWd9ZnVuY3Rpb24gTXIoZSl7ZS5lbG0uX21vdmVDYiYmZS5lbG0uX21vdmVDYigpLGUuZWxtLl9lbnRlckNiJiZlLmVsbS5fZW50ZXJDYigpfWZ1bmN0aW9uIHFyKGUpe2UuZGF0YS5uZXdQb3M9ZS5lbG0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCl9ZnVuY3Rpb24gSHIoZSl7dmFyIHQ9ZS5kYXRhLnBvcyxuPWUuZGF0YS5uZXdQb3Mscj10LmxlZnQtbi5sZWZ0LG89dC50b3Atbi50b3A7aWYocnx8byl7ZS5kYXRhLm1vdmVkPSEwO3ZhciBpPWUuZWxtLnN0eWxlO2kudHJhbnNmb3JtPWkuV2Via2l0VHJhbnNmb3JtPSJ0cmFuc2xhdGUoIityKyJweCwiK28rInB4KSIsaS50cmFuc2l0aW9uRHVyYXRpb249IjBzIn19ZnVuY3Rpb24gRnIoZSx0KXt2YXIgbj10P0tzKHQpOlhzO2lmKG4udGVzdChlKSl7Zm9yKHZhciByLG8saSxhPVtdLHM9W10sdT1uLmxhc3RJbmRleD0wO3I9bi5leGVjKGUpOyl7bz1yLmluZGV4LG8+dSYmKHMucHVzaChpPWUuc2xpY2UodSxvKSksYS5wdXNoKEpTT04uc3RyaW5naWZ5KGkpKSk7dmFyIGM9U24oclsxXS50cmltKCkpO2EucHVzaCgiX3MoIitjKyIpIikscy5wdXNoKHsiQGJpbmRpbmciOmN9KSx1PW8rclswXS5sZW5ndGh9cmV0dXJuIHU8ZS5sZW5ndGgmJihzLnB1c2goaT1lLnNsaWNlKHUpKSxhLnB1c2goSlNPTi5zdHJpbmdpZnkoaSkpKSx7ZXhwcmVzc2lvbjphLmpvaW4oIisiKSx0b2tlbnM6c319fWZ1bmN0aW9uIEJyKGUsdCl7dmFyIG49KHQud2FybixQbihlLCJjbGFzcyIpKTtuJiYoZS5zdGF0aWNDbGFzcz1KU09OLnN0cmluZ2lmeShuKSk7dmFyIHI9Um4oZSwiY2xhc3MiLCExKTtyJiYoZS5jbGFzc0JpbmRpbmc9cil9ZnVuY3Rpb24gVXIoZSl7dmFyIHQ9IiI7cmV0dXJuIGUuc3RhdGljQ2xhc3MmJih0Kz0ic3RhdGljQ2xhc3M6IitlLnN0YXRpY0NsYXNzKyIsIiksZS5jbGFzc0JpbmRpbmcmJih0Kz0iY2xhc3M6IitlLmNsYXNzQmluZGluZysiLCIpLHR9ZnVuY3Rpb24gV3IoZSx0KXt2YXIgbj0odC53YXJuLFBuKGUsInN0eWxlIikpO2lmKG4pe2Uuc3RhdGljU3R5bGU9SlNPTi5zdHJpbmdpZnkoeXMobikpfXZhciByPVJuKGUsInN0eWxlIiwhMSk7ciYmKGUuc3R5bGVCaW5kaW5nPXIpfWZ1bmN0aW9uIHpyKGUpe3ZhciB0PSIiO3JldHVybiBlLnN0YXRpY1N0eWxlJiYodCs9InN0YXRpY1N0eWxlOiIrZS5zdGF0aWNTdHlsZSsiLCIpLGUuc3R5bGVCaW5kaW5nJiYodCs9InN0eWxlOigiK2Uuc3R5bGVCaW5kaW5nKyIpLCIpLHR9ZnVuY3Rpb24gVnIoZSx0KXt2YXIgbj10P1N1OkF1O3JldHVybiBlLnJlcGxhY2UobixmdW5jdGlvbihlKXtyZXR1cm4ga3VbZV19KX1mdW5jdGlvbiBYcihlLHQpe2Z1bmN0aW9uIG4odCl7bCs9dCxlPWUuc3Vic3RyaW5nKHQpfWZ1bmN0aW9uIHIoZSxuLHIpe3ZhciBvLHM7aWYobnVsbD09biYmKG49bCksbnVsbD09ciYmKHI9bCksZSYmKHM9ZS50b0xvd2VyQ2FzZSgpKSxlKWZvcihvPWEubGVuZ3RoLTE7bz49MCYmYVtvXS5sb3dlckNhc2VkVGFnIT09cztvLS0pO2Vsc2Ugbz0wO2lmKG8+PTApe2Zvcih2YXIgdT1hLmxlbmd0aC0xO3U+PW87dS0tKXQuZW5kJiZ0LmVuZChhW3VdLnRhZyxuLHIpO2EubGVuZ3RoPW8saT1vJiZhW28tMV0udGFnfWVsc2UiYnIiPT09cz90LnN0YXJ0JiZ0LnN0YXJ0KGUsW10sITAsbixyKToicCI9PT1zJiYodC5zdGFydCYmdC5zdGFydChlLFtdLCExLG4sciksdC5lbmQmJnQuZW5kKGUsbixyKSl9Zm9yKHZhciBvLGksYT1bXSxzPXQuZXhwZWN0SFRNTCx1PXQuaXNVbmFyeVRhZ3x8Z2ksYz10LmNhbkJlTGVmdE9wZW5UYWd8fGdpLGw9MDtlOyl7aWYobz1lLGkmJkN1KGkpKXt2YXIgZj0wLHA9aS50b0xvd2VyQ2FzZSgpLGQ9VHVbcF18fChUdVtwXT1uZXcgUmVnRXhwKCIoW1xcc1xcU10qPykoPC8iK3ArIltePl0qPikiLCJpIikpLGg9ZS5yZXBsYWNlKGQsZnVuY3Rpb24oZSxuLHIpe3JldHVybiBmPXIubGVuZ3RoLEN1KHApfHwibm9zY3JpcHQiPT09cHx8KG49bi5yZXBsYWNlKC88IVwtLShbXHNcU10qPyktLT4vZywiJDEiKS5yZXBsYWNlKC88IVxbQ0RBVEFcWyhbXHNcU10qPyldXT4vZywiJDEiKSksRXUocCxuKSYmKG49bi5zbGljZSgxKSksdC5jaGFycyYmdC5jaGFycyhuKSwiIn0pO2wrPWUubGVuZ3RoLWgubGVuZ3RoLGU9aCxyKHAsbC1mLGwpfWVsc2V7dmFyIHY9ZS5pbmRleE9mKCI8Iik7aWYoMD09PXYpe2lmKGN1LnRlc3QoZSkpe3ZhciBtPWUuaW5kZXhPZigiLS1ceDNlIik7aWYobT49MCl7dC5zaG91bGRLZWVwQ29tbWVudCYmdC5jb21tZW50KGUuc3Vic3RyaW5nKDQsbSkpLG4obSszKTtjb250aW51ZX19aWYobHUudGVzdChlKSl7dmFyIHk9ZS5pbmRleE9mKCJdPiIpO2lmKHk+PTApe24oeSsyKTtjb250aW51ZX19dmFyIGc9ZS5tYXRjaCh1dSk7aWYoZyl7bihnWzBdLmxlbmd0aCk7Y29udGludWV9dmFyIGI9ZS5tYXRjaChzdSk7aWYoYil7dmFyIHg9bDtuKGJbMF0ubGVuZ3RoKSxyKGJbMV0seCxsKTtjb250aW51ZX12YXIgdz1mdW5jdGlvbigpe3ZhciB0PWUubWF0Y2goaXUpO2lmKHQpe3ZhciByPXt0YWdOYW1lOnRbMV0sYXR0cnM6W10sc3RhcnQ6bH07bih0WzBdLmxlbmd0aCk7Zm9yKHZhciBvLGk7IShvPWUubWF0Y2goYXUpKSYmKGk9ZS5tYXRjaChudSkpOyluKGlbMF0ubGVuZ3RoKSxyLmF0dHJzLnB1c2goaSk7aWYobylyZXR1cm4gci51bmFyeVNsYXNoPW9bMV0sbihvWzBdLmxlbmd0aCksci5lbmQ9bCxyfX0oKTtpZih3KXshZnVuY3Rpb24oZSl7dmFyIG49ZS50YWdOYW1lLG89ZS51bmFyeVNsYXNoO3MmJigicCI9PT1pJiZ0dShuKSYmcihpKSxjKG4pJiZpPT09biYmcihuKSk7Zm9yKHZhciBsPXUobil8fCEhbyxmPWUuYXR0cnMubGVuZ3RoLHA9bmV3IEFycmF5KGYpLGQ9MDtkPGY7ZCsrKXt2YXIgaD1lLmF0dHJzW2RdO2Z1JiYtMT09PWhbMF0uaW5kZXhPZignIiInKSYmKCIiPT09aFszXSYmZGVsZXRlIGhbM10sIiI9PT1oWzRdJiZkZWxldGUgaFs0XSwiIj09PWhbNV0mJmRlbGV0ZSBoWzVdKTt2YXIgdj1oWzNdfHxoWzRdfHxoWzVdfHwiIixtPSJhIj09PW4mJiJocmVmIj09PWhbMV0/dC5zaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6dC5zaG91bGREZWNvZGVOZXdsaW5lcztwW2RdPXtuYW1lOmhbMV0sdmFsdWU6VnIodixtKX19bHx8KGEucHVzaCh7dGFnOm4sbG93ZXJDYXNlZFRhZzpuLnRvTG93ZXJDYXNlKCksYXR0cnM6cH0pLGk9biksdC5zdGFydCYmdC5zdGFydChuLHAsbCxlLnN0YXJ0LGUuZW5kKX0odyksRXUoaSxlKSYmbigxKTtjb250aW51ZX19dmFyIF89dm9pZCAwLEM9dm9pZCAwLFQ9dm9pZCAwO2lmKHY+PTApe2ZvcihDPWUuc2xpY2Uodik7IShzdS50ZXN0KEMpfHxpdS50ZXN0KEMpfHxjdS50ZXN0KEMpfHxsdS50ZXN0KEMpfHwoVD1DLmluZGV4T2YoIjwiLDEpKTwwKTspdis9VCxDPWUuc2xpY2Uodik7Xz1lLnN1YnN0cmluZygwLHYpLG4odil9djwwJiYoXz1lLGU9IiIpLHQuY2hhcnMmJl8mJnQuY2hhcnMoXyl9aWYoZT09PW8pe3QuY2hhcnMmJnQuY2hhcnMoZSk7YnJlYWt9fXIoKX1mdW5jdGlvbiBKcihlLHQsbil7cmV0dXJue3R5cGU6MSx0YWc6ZSxhdHRyc0xpc3Q6dCxhdHRyc01hcDpobyh0KSxwYXJlbnQ6bixjaGlsZHJlbjpbXX19ZnVuY3Rpb24gS3IoZSx0KXtmdW5jdGlvbiBuKGUpe2UucHJlJiYocz0hMSkseXUoZS50YWcpJiYodT0hMSk7Zm9yKHZhciBuPTA7bjxtdS5sZW5ndGg7bisrKW11W25dKGUsdCl9cHU9dC53YXJufHxFbix5dT10LmlzUHJlVGFnfHxnaSxndT10Lm11c3RVc2VQcm9wfHxnaSxidT10LmdldFRhZ05hbWVzcGFjZXx8Z2ksaHU9T24odC5tb2R1bGVzLCJ0cmFuc2Zvcm1Ob2RlIiksdnU9T24odC5tb2R1bGVzLCJwcmVUcmFuc2Zvcm1Ob2RlIiksbXU9T24odC5tb2R1bGVzLCJwb3N0VHJhbnNmb3JtTm9kZSIpLGR1PXQuZGVsaW1pdGVyczt2YXIgcixvLGk9W10sYT0hMSE9PXQucHJlc2VydmVXaGl0ZXNwYWNlLHM9ITEsdT0hMTtyZXR1cm4gWHIoZSx7d2FybjpwdSxleHBlY3RIVE1MOnQuZXhwZWN0SFRNTCxpc1VuYXJ5VGFnOnQuaXNVbmFyeVRhZyxjYW5CZUxlZnRPcGVuVGFnOnQuY2FuQmVMZWZ0T3BlblRhZyxzaG91bGREZWNvZGVOZXdsaW5lczp0LnNob3VsZERlY29kZU5ld2xpbmVzLHNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZjp0LnNob3VsZERlY29kZU5ld2xpbmVzRm9ySHJlZixzaG91bGRLZWVwQ29tbWVudDp0LmNvbW1lbnRzLHN0YXJ0OmZ1bmN0aW9uKGUsYSxjKXt2YXIgbD1vJiZvLm5zfHxidShlKTtPaSYmInN2ZyI9PT1sJiYoYT15byhhKSk7dmFyIGY9SnIoZSxhLG8pO2wmJihmLm5zPWwpLG1vKGYpJiYhcWkoKSYmKGYuZm9yYmlkZGVuPSEwKTtmb3IodmFyIHA9MDtwPHZ1Lmxlbmd0aDtwKyspZj12dVtwXShmLHQpfHxmO2lmKHN8fChHcihmKSxmLnByZSYmKHM9ITApKSx5dShmLnRhZykmJih1PSEwKSxzP1lyKGYpOmYucHJvY2Vzc2VkfHwodG8oZikscm8oZiksc28oZiksUXIoZix0KSkscj9pLmxlbmd0aHx8ci5pZiYmKGYuZWxzZWlmfHxmLmVsc2UpJiZhbyhyLHtleHA6Zi5lbHNlaWYsYmxvY2s6Zn0pOnI9ZixvJiYhZi5mb3JiaWRkZW4paWYoZi5lbHNlaWZ8fGYuZWxzZSlvbyhmLG8pO2Vsc2UgaWYoZi5zbG90U2NvcGUpe28ucGxhaW49ITE7dmFyIGQ9Zi5zbG90VGFyZ2V0fHwnImRlZmF1bHQiJzsoby5zY29wZWRTbG90c3x8KG8uc2NvcGVkU2xvdHM9e30pKVtkXT1mfWVsc2Ugby5jaGlsZHJlbi5wdXNoKGYpLGYucGFyZW50PW87Yz9uKGYpOihvPWYsaS5wdXNoKGYpKX0sZW5kOmZ1bmN0aW9uKCl7dmFyIGU9aVtpLmxlbmd0aC0xXSx0PWUuY2hpbGRyZW5bZS5jaGlsZHJlbi5sZW5ndGgtMV07dCYmMz09PXQudHlwZSYmIiAiPT09dC50ZXh0JiYhdSYmZS5jaGlsZHJlbi5wb3AoKSxpLmxlbmd0aC09MSxvPWlbaS5sZW5ndGgtMV0sbihlKX0sY2hhcnM6ZnVuY3Rpb24oZSl7aWYobyYmKCFPaXx8InRleHRhcmVhIiE9PW8udGFnfHxvLmF0dHJzTWFwLnBsYWNlaG9sZGVyIT09ZSkpe3ZhciB0PW8uY2hpbGRyZW47aWYoZT11fHxlLnRyaW0oKT92byhvKT9lOk11KGUpOmEmJnQubGVuZ3RoPyIgIjoiIil7dmFyIG47IXMmJiIgIiE9PWUmJihuPUZyKGUsZHUpKT90LnB1c2goe3R5cGU6MixleHByZXNzaW9uOm4uZXhwcmVzc2lvbix0b2tlbnM6bi50b2tlbnMsdGV4dDplfSk6IiAiPT09ZSYmdC5sZW5ndGgmJiIgIj09PXRbdC5sZW5ndGgtMV0udGV4dHx8dC5wdXNoKHt0eXBlOjMsdGV4dDplfSl9fX0sY29tbWVudDpmdW5jdGlvbihlKXtvLmNoaWxkcmVuLnB1c2goe3R5cGU6Myx0ZXh0OmUsaXNDb21tZW50OiEwfSl9fSkscn1mdW5jdGlvbiBHcihlKXtudWxsIT1QbihlLCJ2LXByZSIpJiYoZS5wcmU9ITApfWZ1bmN0aW9uIFlyKGUpe3ZhciB0PWUuYXR0cnNMaXN0Lmxlbmd0aDtpZih0KWZvcih2YXIgbj1lLmF0dHJzPW5ldyBBcnJheSh0KSxyPTA7cjx0O3IrKyluW3JdPXtuYW1lOmUuYXR0cnNMaXN0W3JdLm5hbWUsdmFsdWU6SlNPTi5zdHJpbmdpZnkoZS5hdHRyc0xpc3Rbcl0udmFsdWUpfTtlbHNlIGUucHJlfHwoZS5wbGFpbj0hMCl9ZnVuY3Rpb24gUXIoZSx0KXtacihlKSxlLnBsYWluPSFlLmtleSYmIWUuYXR0cnNMaXN0Lmxlbmd0aCxlbyhlKSx1byhlKSxjbyhlKTtmb3IodmFyIG49MDtuPGh1Lmxlbmd0aDtuKyspZT1odVtuXShlLHQpfHxlO2xvKGUpfWZ1bmN0aW9uIFpyKGUpe3ZhciB0PVJuKGUsImtleSIpO3QmJihlLmtleT10KX1mdW5jdGlvbiBlbyhlKXt2YXIgdD1SbihlLCJyZWYiKTt0JiYoZS5yZWY9dCxlLnJlZkluRm9yPWZvKGUpKX1mdW5jdGlvbiB0byhlKXt2YXIgdDtpZih0PVBuKGUsInYtZm9yIikpe3ZhciBuPW5vKHQpO24mJncoZSxuKX19ZnVuY3Rpb24gbm8oZSl7dmFyIHQ9ZS5tYXRjaChOdSk7aWYodCl7dmFyIG49e307bi5mb3I9dFsyXS50cmltKCk7dmFyIHI9dFsxXS50cmltKCkucmVwbGFjZShEdSwiIiksbz1yLm1hdGNoKEx1KTtyZXR1cm4gbz8obi5hbGlhcz1yLnJlcGxhY2UoTHUsIiIpLG4uaXRlcmF0b3IxPW9bMV0udHJpbSgpLG9bMl0mJihuLml0ZXJhdG9yMj1vWzJdLnRyaW0oKSkpOm4uYWxpYXM9cixufX1mdW5jdGlvbiBybyhlKXt2YXIgdD1QbihlLCJ2LWlmIik7aWYodCllLmlmPXQsYW8oZSx7ZXhwOnQsYmxvY2s6ZX0pO2Vsc2V7bnVsbCE9UG4oZSwidi1lbHNlIikmJihlLmVsc2U9ITApO3ZhciBuPVBuKGUsInYtZWxzZS1pZiIpO24mJihlLmVsc2VpZj1uKX19ZnVuY3Rpb24gb28oZSx0KXt2YXIgbj1pbyh0LmNoaWxkcmVuKTtuJiZuLmlmJiZhbyhuLHtleHA6ZS5lbHNlaWYsYmxvY2s6ZX0pfWZ1bmN0aW9uIGlvKGUpe2Zvcih2YXIgdD1lLmxlbmd0aDt0LS07KXtpZigxPT09ZVt0XS50eXBlKXJldHVybiBlW3RdO2UucG9wKCl9fWZ1bmN0aW9uIGFvKGUsdCl7ZS5pZkNvbmRpdGlvbnN8fChlLmlmQ29uZGl0aW9ucz1bXSksZS5pZkNvbmRpdGlvbnMucHVzaCh0KX1mdW5jdGlvbiBzbyhlKXtudWxsIT1QbihlLCJ2LW9uY2UiKSYmKGUub25jZT0hMCl9ZnVuY3Rpb24gdW8oZSl7aWYoInNsb3QiPT09ZS50YWcpZS5zbG90TmFtZT1SbihlLCJuYW1lIik7ZWxzZXt2YXIgdDsidGVtcGxhdGUiPT09ZS50YWc/KHQ9UG4oZSwic2NvcGUiKSxlLnNsb3RTY29wZT10fHxQbihlLCJzbG90LXNjb3BlIikpOih0PVBuKGUsInNsb3Qtc2NvcGUiKSkmJihlLnNsb3RTY29wZT10KTt2YXIgbj1SbihlLCJzbG90Iik7biYmKGUuc2xvdFRhcmdldD0nIiInPT09bj8nImRlZmF1bHQiJzpuLCJ0ZW1wbGF0ZSI9PT1lLnRhZ3x8ZS5zbG90U2NvcGV8fE5uKGUsInNsb3QiLG4pKX19ZnVuY3Rpb24gY28oZSl7dmFyIHQ7KHQ9Um4oZSwiaXMiKSkmJihlLmNvbXBvbmVudD10KSxudWxsIT1QbihlLCJpbmxpbmUtdGVtcGxhdGUiKSYmKGUuaW5saW5lVGVtcGxhdGU9ITApfWZ1bmN0aW9uIGxvKGUpe3ZhciB0LG4scixvLGksYSxzLHU9ZS5hdHRyc0xpc3Q7Zm9yKHQ9MCxuPXUubGVuZ3RoO3Q8bjt0KyspaWYocj1vPXVbdF0ubmFtZSxpPXVbdF0udmFsdWUsanUudGVzdChyKSlpZihlLmhhc0JpbmRpbmdzPSEwLGE9cG8ociksYSYmKHI9ci5yZXBsYWNlKFB1LCIiKSksUnUudGVzdChyKSlyPXIucmVwbGFjZShSdSwiIiksaT1TbihpKSxzPSExLGEmJihhLnByb3AmJihzPSEwLCJpbm5lckh0bWwiPT09KHI9ZGkocikpJiYocj0iaW5uZXJIVE1MIikpLGEuY2FtZWwmJihyPWRpKHIpKSxhLnN5bmMmJkluKGUsInVwZGF0ZToiK2RpKHIpLHFuKGksIiRldmVudCIpKSksc3x8IWUuY29tcG9uZW50JiZndShlLnRhZyxlLmF0dHJzTWFwLnR5cGUscik/am4oZSxyLGkpOk5uKGUscixpKTtlbHNlIGlmKE91LnRlc3Qocikpcj1yLnJlcGxhY2UoT3UsIiIpLEluKGUscixpLGEsITEscHUpO2Vsc2V7cj1yLnJlcGxhY2UoanUsIiIpO3ZhciBjPXIubWF0Y2goSXUpLGw9YyYmY1sxXTtsJiYocj1yLnNsaWNlKDAsLShsLmxlbmd0aCsxKSkpLERuKGUscixvLGksbCxhKX1lbHNle05uKGUscixKU09OLnN0cmluZ2lmeShpKSksIWUuY29tcG9uZW50JiYibXV0ZWQiPT09ciYmZ3UoZS50YWcsZS5hdHRyc01hcC50eXBlLHIpJiZqbihlLHIsInRydWUiKX19ZnVuY3Rpb24gZm8oZSl7Zm9yKHZhciB0PWU7dDspe2lmKHZvaWQgMCE9PXQuZm9yKXJldHVybiEwO3Q9dC5wYXJlbnR9cmV0dXJuITF9ZnVuY3Rpb24gcG8oZSl7dmFyIHQ9ZS5tYXRjaChQdSk7aWYodCl7dmFyIG49e307cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbihlKXtuW2Uuc2xpY2UoMSldPSEwfSksbn19ZnVuY3Rpb24gaG8oZSl7Zm9yKHZhciB0PXt9LG49MCxyPWUubGVuZ3RoO248cjtuKyspdFtlW25dLm5hbWVdPWVbbl0udmFsdWU7cmV0dXJuIHR9ZnVuY3Rpb24gdm8oZSl7cmV0dXJuInNjcmlwdCI9PT1lLnRhZ3x8InN0eWxlIj09PWUudGFnfWZ1bmN0aW9uIG1vKGUpe3JldHVybiJzdHlsZSI9PT1lLnRhZ3x8InNjcmlwdCI9PT1lLnRhZyYmKCFlLmF0dHJzTWFwLnR5cGV8fCJ0ZXh0L2phdmFzY3JpcHQiPT09ZS5hdHRyc01hcC50eXBlKX1mdW5jdGlvbiB5byhlKXtmb3IodmFyIHQ9W10sbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3F1LnRlc3Qoci5uYW1lKXx8KHIubmFtZT1yLm5hbWUucmVwbGFjZShIdSwiIiksdC5wdXNoKHIpKX1yZXR1cm4gdH1mdW5jdGlvbiBnbyhlLHQpe2lmKCJpbnB1dCI9PT1lLnRhZyl7dmFyIG49ZS5hdHRyc01hcDtpZighblsidi1tb2RlbCJdKXJldHVybjt2YXIgcjtpZigoblsiOnR5cGUiXXx8blsidi1iaW5kOnR5cGUiXSkmJihyPVJuKGUsInR5cGUiKSksbi50eXBlfHxyfHwhblsidi1iaW5kIl18fChyPSIoIituWyJ2LWJpbmQiXSsiKS50eXBlIikscil7dmFyIG89UG4oZSwidi1pZiIsITApLGk9bz8iJiYoIitvKyIpIjoiIixhPW51bGwhPVBuKGUsInYtZWxzZSIsITApLHM9UG4oZSwidi1lbHNlLWlmIiwhMCksdT1ibyhlKTt0byh1KSxMbih1LCJ0eXBlIiwiY2hlY2tib3giKSxRcih1LHQpLHUucHJvY2Vzc2VkPSEwLHUuaWY9IigiK3IrIik9PT0nY2hlY2tib3gnIitpLGFvKHUse2V4cDp1LmlmLGJsb2NrOnV9KTt2YXIgYz1ibyhlKTtQbihjLCJ2LWZvciIsITApLExuKGMsInR5cGUiLCJyYWRpbyIpLFFyKGMsdCksYW8odSx7ZXhwOiIoIityKyIpPT09J3JhZGlvJyIraSxibG9jazpjfSk7dmFyIGw9Ym8oZSk7cmV0dXJuIFBuKGwsInYtZm9yIiwhMCksTG4obCwiOnR5cGUiLHIpLFFyKGwsdCksYW8odSx7ZXhwOm8sYmxvY2s6bH0pLGE/dS5lbHNlPSEwOnMmJih1LmVsc2VpZj1zKSx1fX19ZnVuY3Rpb24gYm8oZSl7cmV0dXJuIEpyKGUudGFnLGUuYXR0cnNMaXN0LnNsaWNlKCksZS5wYXJlbnQpfWZ1bmN0aW9uIHhvKGUsdCl7dC52YWx1ZSYmam4oZSwidGV4dENvbnRlbnQiLCJfcygiK3QudmFsdWUrIikiKX1mdW5jdGlvbiB3byhlLHQpe3QudmFsdWUmJmpuKGUsImlubmVySFRNTCIsIl9zKCIrdC52YWx1ZSsiKSIpfWZ1bmN0aW9uIF9vKGUsdCl7ZSYmKHh1PXp1KHQuc3RhdGljS2V5c3x8IiIpLHd1PXQuaXNSZXNlcnZlZFRhZ3x8Z2ksVG8oZSksa28oZSwhMSkpfWZ1bmN0aW9uIENvKGUpe3JldHVybiBoKCJ0eXBlLHRhZyxhdHRyc0xpc3QsYXR0cnNNYXAscGxhaW4scGFyZW50LGNoaWxkcmVuLGF0dHJzIisoZT8iLCIrZToiIikpfWZ1bmN0aW9uIFRvKGUpe2lmKGUuc3RhdGljPUFvKGUpLDE9PT1lLnR5cGUpe2lmKCF3dShlLnRhZykmJiJzbG90IiE9PWUudGFnJiZudWxsPT1lLmF0dHJzTWFwWyJpbmxpbmUtdGVtcGxhdGUiXSlyZXR1cm47Zm9yKHZhciB0PTAsbj1lLmNoaWxkcmVuLmxlbmd0aDt0PG47dCsrKXt2YXIgcj1lLmNoaWxkcmVuW3RdO1RvKHIpLHIuc3RhdGljfHwoZS5zdGF0aWM9ITEpfWlmKGUuaWZDb25kaXRpb25zKWZvcih2YXIgbz0xLGk9ZS5pZkNvbmRpdGlvbnMubGVuZ3RoO288aTtvKyspe3ZhciBhPWUuaWZDb25kaXRpb25zW29dLmJsb2NrO1RvKGEpLGEuc3RhdGljfHwoZS5zdGF0aWM9ITEpfX19ZnVuY3Rpb24ga28oZSx0KXtpZigxPT09ZS50eXBlKXtpZigoZS5zdGF0aWN8fGUub25jZSkmJihlLnN0YXRpY0luRm9yPXQpLGUuc3RhdGljJiZlLmNoaWxkcmVuLmxlbmd0aCYmKDEhPT1lLmNoaWxkcmVuLmxlbmd0aHx8MyE9PWUuY2hpbGRyZW5bMF0udHlwZSkpcmV0dXJuIHZvaWQoZS5zdGF0aWNSb290PSEwKTtpZihlLnN0YXRpY1Jvb3Q9ITEsZS5jaGlsZHJlbilmb3IodmFyIG49MCxyPWUuY2hpbGRyZW4ubGVuZ3RoO248cjtuKyspa28oZS5jaGlsZHJlbltuXSx0fHwhIWUuZm9yKTtpZihlLmlmQ29uZGl0aW9ucylmb3IodmFyIG89MSxpPWUuaWZDb25kaXRpb25zLmxlbmd0aDtvPGk7bysrKWtvKGUuaWZDb25kaXRpb25zW29dLmJsb2NrLHQpfX1mdW5jdGlvbiBBbyhlKXtyZXR1cm4gMiE9PWUudHlwZSYmKDM9PT1lLnR5cGV8fCEoIWUucHJlJiYoZS5oYXNCaW5kaW5nc3x8ZS5pZnx8ZS5mb3J8fGNpKGUudGFnKXx8IXd1KGUudGFnKXx8U28oZSl8fCFPYmplY3Qua2V5cyhlKS5ldmVyeSh4dSkpKSl9ZnVuY3Rpb24gU28oZSl7Zm9yKDtlLnBhcmVudDspe2lmKGU9ZS5wYXJlbnQsInRlbXBsYXRlIiE9PWUudGFnKXJldHVybiExO2lmKGUuZm9yKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uICRvKGUsdCxuKXt2YXIgcj10PyJuYXRpdmVPbjp7Ijoib246eyI7Zm9yKHZhciBvIGluIGUpcis9JyInK28rJyI6JytFbyhvLGVbb10pKyIsIjtyZXR1cm4gci5zbGljZSgwLC0xKSsifSJ9ZnVuY3Rpb24gRW8oZSx0KXtpZighdClyZXR1cm4iZnVuY3Rpb24oKXt9IjtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiJbIit0Lm1hcChmdW5jdGlvbih0KXtyZXR1cm4gRW8oZSx0KX0pLmpvaW4oIiwiKSsiXSI7dmFyIG49WHUudGVzdCh0LnZhbHVlKSxyPVZ1LnRlc3QodC52YWx1ZSk7aWYodC5tb2RpZmllcnMpe3ZhciBvPSIiLGk9IiIsYT1bXTtmb3IodmFyIHMgaW4gdC5tb2RpZmllcnMpaWYoWXVbc10paSs9WXVbc10sSnVbc10mJmEucHVzaChzKTtlbHNlIGlmKCJleGFjdCI9PT1zKXt2YXIgdT10Lm1vZGlmaWVycztpKz1HdShbImN0cmwiLCJzaGlmdCIsImFsdCIsIm1ldGEiXS5maWx0ZXIoZnVuY3Rpb24oZSl7cmV0dXJuIXVbZV19KS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIiRldmVudC4iK2UrIktleSJ9KS5qb2luKCJ8fCIpKX1lbHNlIGEucHVzaChzKTthLmxlbmd0aCYmKG8rPU9vKGEpKSxpJiYobys9aSk7cmV0dXJuImZ1bmN0aW9uKCRldmVudCl7IitvKyhuPyJyZXR1cm4gIit0LnZhbHVlKyIoJGV2ZW50KSI6cj8icmV0dXJuICgiK3QudmFsdWUrIikoJGV2ZW50KSI6dC52YWx1ZSkrIn0ifXJldHVybiBufHxyP3QudmFsdWU6ImZ1bmN0aW9uKCRldmVudCl7Iit0LnZhbHVlKyJ9In1mdW5jdGlvbiBPbyhlKXtyZXR1cm4iaWYoISgnYnV0dG9uJyBpbiAkZXZlbnQpJiYiK2UubWFwKGpvKS5qb2luKCImJiIpKyIpcmV0dXJuIG51bGw7In1mdW5jdGlvbiBqbyhlKXt2YXIgdD1wYXJzZUludChlLDEwKTtpZih0KXJldHVybiIkZXZlbnQua2V5Q29kZSE9PSIrdDt2YXIgbj1KdVtlXSxyPUt1W2VdO3JldHVybiJfaygkZXZlbnQua2V5Q29kZSwiK0pTT04uc3RyaW5naWZ5KGUpKyIsIitKU09OLnN0cmluZ2lmeShuKSsiLCRldmVudC5rZXksIitKU09OLnN0cmluZ2lmeShyKSsiKSJ9ZnVuY3Rpb24gTm8oZSx0KXtlLndyYXBMaXN0ZW5lcnM9ZnVuY3Rpb24oZSl7cmV0dXJuIl9nKCIrZSsiLCIrdC52YWx1ZSsiKSJ9fWZ1bmN0aW9uIExvKGUsdCl7ZS53cmFwRGF0YT1mdW5jdGlvbihuKXtyZXR1cm4iX2IoIituKyIsJyIrZS50YWcrIicsIit0LnZhbHVlKyIsIisodC5tb2RpZmllcnMmJnQubW9kaWZpZXJzLnByb3A/InRydWUiOiJmYWxzZSIpKyh0Lm1vZGlmaWVycyYmdC5tb2RpZmllcnMuc3luYz8iLHRydWUiOiIiKSsiKSJ9fWZ1bmN0aW9uIERvKGUsdCl7dmFyIG49bmV3IFp1KHQpO3JldHVybntyZW5kZXI6IndpdGgodGhpcyl7cmV0dXJuICIrKGU/SW8oZSxuKTonX2MoImRpdiIpJykrIn0iLHN0YXRpY1JlbmRlckZuczpuLnN0YXRpY1JlbmRlckZuc319ZnVuY3Rpb24gSW8oZSx0KXtpZihlLnN0YXRpY1Jvb3QmJiFlLnN0YXRpY1Byb2Nlc3NlZClyZXR1cm4gUm8oZSx0KTtpZihlLm9uY2UmJiFlLm9uY2VQcm9jZXNzZWQpcmV0dXJuIFBvKGUsdCk7aWYoZS5mb3ImJiFlLmZvclByb2Nlc3NlZClyZXR1cm4gSG8oZSx0KTtpZihlLmlmJiYhZS5pZlByb2Nlc3NlZClyZXR1cm4gTW8oZSx0KTtpZigidGVtcGxhdGUiIT09ZS50YWd8fGUuc2xvdFRhcmdldCl7aWYoInNsb3QiPT09ZS50YWcpcmV0dXJuIFpvKGUsdCk7dmFyIG47aWYoZS5jb21wb25lbnQpbj1laShlLmNvbXBvbmVudCxlLHQpO2Vsc2V7dmFyIHI9ZS5wbGFpbj92b2lkIDA6Rm8oZSx0KSxvPWUuaW5saW5lVGVtcGxhdGU/bnVsbDpYbyhlLHQsITApO249Il9jKCciK2UudGFnKyInIisocj8iLCIrcjoiIikrKG8/IiwiK286IiIpKyIpIn1mb3IodmFyIGk9MDtpPHQudHJhbnNmb3Jtcy5sZW5ndGg7aSsrKW49dC50cmFuc2Zvcm1zW2ldKGUsbik7cmV0dXJuIG59cmV0dXJuIFhvKGUsdCl8fCJ2b2lkIDAifWZ1bmN0aW9uIFJvKGUsdCl7cmV0dXJuIGUuc3RhdGljUHJvY2Vzc2VkPSEwLHQuc3RhdGljUmVuZGVyRm5zLnB1c2goIndpdGgodGhpcyl7cmV0dXJuICIrSW8oZSx0KSsifSIpLCJfbSgiKyh0LnN0YXRpY1JlbmRlckZucy5sZW5ndGgtMSkrKGUuc3RhdGljSW5Gb3I/Iix0cnVlIjoiIikrIikifWZ1bmN0aW9uIFBvKGUsdCl7aWYoZS5vbmNlUHJvY2Vzc2VkPSEwLGUuaWYmJiFlLmlmUHJvY2Vzc2VkKXJldHVybiBNbyhlLHQpO2lmKGUuc3RhdGljSW5Gb3Ipe2Zvcih2YXIgbj0iIixyPWUucGFyZW50O3I7KXtpZihyLmZvcil7bj1yLmtleTticmVha31yPXIucGFyZW50fXJldHVybiBuPyJfbygiK0lvKGUsdCkrIiwiK3Qub25jZUlkKysrIiwiK24rIikiOklvKGUsdCl9cmV0dXJuIFJvKGUsdCl9ZnVuY3Rpb24gTW8oZSx0LG4scil7cmV0dXJuIGUuaWZQcm9jZXNzZWQ9ITAscW8oZS5pZkNvbmRpdGlvbnMuc2xpY2UoKSx0LG4scil9ZnVuY3Rpb24gcW8oZSx0LG4scil7ZnVuY3Rpb24gbyhlKXtyZXR1cm4gbj9uKGUsdCk6ZS5vbmNlP1BvKGUsdCk6SW8oZSx0KX1pZighZS5sZW5ndGgpcmV0dXJuIHJ8fCJfZSgpIjt2YXIgaT1lLnNoaWZ0KCk7cmV0dXJuIGkuZXhwPyIoIitpLmV4cCsiKT8iK28oaS5ibG9jaykrIjoiK3FvKGUsdCxuLHIpOiIiK28oaS5ibG9jayl9ZnVuY3Rpb24gSG8oZSx0LG4scil7dmFyIG89ZS5mb3IsaT1lLmFsaWFzLGE9ZS5pdGVyYXRvcjE/IiwiK2UuaXRlcmF0b3IxOiIiLHM9ZS5pdGVyYXRvcjI/IiwiK2UuaXRlcmF0b3IyOiIiO3JldHVybiBlLmZvclByb2Nlc3NlZD0hMCwocnx8Il9sIikrIigoIitvKyIpLGZ1bmN0aW9uKCIraSthK3MrIil7cmV0dXJuICIrKG58fElvKShlLHQpKyJ9KSJ9ZnVuY3Rpb24gRm8oZSx0KXt2YXIgbj0ieyIscj1CbyhlLHQpO3ImJihuKz1yKyIsIiksZS5rZXkmJihuKz0ia2V5OiIrZS5rZXkrIiwiKSxlLnJlZiYmKG4rPSJyZWY6IitlLnJlZisiLCIpLGUucmVmSW5Gb3ImJihuKz0icmVmSW5Gb3I6dHJ1ZSwiKSxlLnByZSYmKG4rPSJwcmU6dHJ1ZSwiKSxlLmNvbXBvbmVudCYmKG4rPSd0YWc6IicrZS50YWcrJyIsJyk7Zm9yKHZhciBvPTA7bzx0LmRhdGFHZW5GbnMubGVuZ3RoO28rKyluKz10LmRhdGFHZW5GbnNbb10oZSk7aWYoZS5hdHRycyYmKG4rPSJhdHRyczp7Iit0aShlLmF0dHJzKSsifSwiKSxlLnByb3BzJiYobis9ImRvbVByb3BzOnsiK3RpKGUucHJvcHMpKyJ9LCIpLGUuZXZlbnRzJiYobis9JG8oZS5ldmVudHMsITEsdC53YXJuKSsiLCIpLGUubmF0aXZlRXZlbnRzJiYobis9JG8oZS5uYXRpdmVFdmVudHMsITAsdC53YXJuKSsiLCIpLGUuc2xvdFRhcmdldCYmIWUuc2xvdFNjb3BlJiYobis9InNsb3Q6IitlLnNsb3RUYXJnZXQrIiwiKSxlLnNjb3BlZFNsb3RzJiYobis9V28oZS5zY29wZWRTbG90cyx0KSsiLCIpLGUubW9kZWwmJihuKz0ibW9kZWw6e3ZhbHVlOiIrZS5tb2RlbC52YWx1ZSsiLGNhbGxiYWNrOiIrZS5tb2RlbC5jYWxsYmFjaysiLGV4cHJlc3Npb246IitlLm1vZGVsLmV4cHJlc3Npb24rIn0sIiksZS5pbmxpbmVUZW1wbGF0ZSl7dmFyIGk9VW8oZSx0KTtpJiYobis9aSsiLCIpfXJldHVybiBuPW4ucmVwbGFjZSgvLCQvLCIiKSsifSIsZS53cmFwRGF0YSYmKG49ZS53cmFwRGF0YShuKSksZS53cmFwTGlzdGVuZXJzJiYobj1lLndyYXBMaXN0ZW5lcnMobikpLG59ZnVuY3Rpb24gQm8oZSx0KXt2YXIgbj1lLmRpcmVjdGl2ZXM7aWYobil7dmFyIHIsbyxpLGEscz0iZGlyZWN0aXZlczpbIix1PSExO2ZvcihyPTAsbz1uLmxlbmd0aDtyPG87cisrKXtpPW5bcl0sYT0hMDt2YXIgYz10LmRpcmVjdGl2ZXNbaS5uYW1lXTtjJiYoYT0hIWMoZSxpLHQud2FybikpLGEmJih1PSEwLHMrPSd7bmFtZToiJytpLm5hbWUrJyIscmF3TmFtZToiJytpLnJhd05hbWUrJyInKyhpLnZhbHVlPyIsdmFsdWU6KCIraS52YWx1ZSsiKSxleHByZXNzaW9uOiIrSlNPTi5zdHJpbmdpZnkoaS52YWx1ZSk6IiIpKyhpLmFyZz8nLGFyZzoiJytpLmFyZysnIic6IiIpKyhpLm1vZGlmaWVycz8iLG1vZGlmaWVyczoiK0pTT04uc3RyaW5naWZ5KGkubW9kaWZpZXJzKToiIikrIn0sIil9cmV0dXJuIHU/cy5zbGljZSgwLC0xKSsiXSI6dm9pZCAwfX1mdW5jdGlvbiBVbyhlLHQpe3ZhciBuPWUuY2hpbGRyZW5bMF07aWYoMT09PW4udHlwZSl7dmFyIHI9RG8obix0Lm9wdGlvbnMpO3JldHVybiJpbmxpbmVUZW1wbGF0ZTp7cmVuZGVyOmZ1bmN0aW9uKCl7IityLnJlbmRlcisifSxzdGF0aWNSZW5kZXJGbnM6WyIrci5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbigpeyIrZSsifSJ9KS5qb2luKCIsIikrIl19In19ZnVuY3Rpb24gV28oZSx0KXtyZXR1cm4ic2NvcGVkU2xvdHM6X3UoWyIrT2JqZWN0LmtleXMoZSkubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB6byhuLGVbbl0sdCl9KS5qb2luKCIsIikrIl0pIn1mdW5jdGlvbiB6byhlLHQsbil7cmV0dXJuIHQuZm9yJiYhdC5mb3JQcm9jZXNzZWQ/Vm8oZSx0LG4pOiJ7a2V5OiIrZSsiLGZuOmZ1bmN0aW9uKCIrU3RyaW5nKHQuc2xvdFNjb3BlKSsiKXtyZXR1cm4gIisoInRlbXBsYXRlIj09PXQudGFnP3QuaWY/dC5pZisiPyIrKFhvKHQsbil8fCJ1bmRlZmluZWQiKSsiOnVuZGVmaW5lZCI6WG8odCxuKXx8InVuZGVmaW5lZCI6SW8odCxuKSkrIn19In1mdW5jdGlvbiBWbyhlLHQsbil7dmFyIHI9dC5mb3Isbz10LmFsaWFzLGk9dC5pdGVyYXRvcjE/IiwiK3QuaXRlcmF0b3IxOiIiLGE9dC5pdGVyYXRvcjI/IiwiK3QuaXRlcmF0b3IyOiIiO3JldHVybiB0LmZvclByb2Nlc3NlZD0hMCwiX2woKCIrcisiKSxmdW5jdGlvbigiK28raSthKyIpe3JldHVybiAiK3pvKGUsdCxuKSsifSkifWZ1bmN0aW9uIFhvKGUsdCxuLHIsbyl7dmFyIGk9ZS5jaGlsZHJlbjtpZihpLmxlbmd0aCl7dmFyIGE9aVswXTtpZigxPT09aS5sZW5ndGgmJmEuZm9yJiYidGVtcGxhdGUiIT09YS50YWcmJiJzbG90IiE9PWEudGFnKXJldHVybihyfHxJbykoYSx0KTt2YXIgcz1uP0pvKGksdC5tYXliZUNvbXBvbmVudCk6MCx1PW98fEdvO3JldHVybiJbIitpLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gdShlLHQpfSkuam9pbigiLCIpKyJdIisocz8iLCIrczoiIil9fWZ1bmN0aW9uIEpvKGUsdCl7Zm9yKHZhciBuPTAscj0wO3I8ZS5sZW5ndGg7cisrKXt2YXIgbz1lW3JdO2lmKDE9PT1vLnR5cGUpe2lmKEtvKG8pfHxvLmlmQ29uZGl0aW9ucyYmby5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gS28oZS5ibG9jayl9KSl7bj0yO2JyZWFrfSh0KG8pfHxvLmlmQ29uZGl0aW9ucyYmby5pZkNvbmRpdGlvbnMuc29tZShmdW5jdGlvbihlKXtyZXR1cm4gdChlLmJsb2NrKX0pKSYmKG49MSl9fXJldHVybiBufWZ1bmN0aW9uIEtvKGUpe3JldHVybiB2b2lkIDAhPT1lLmZvcnx8InRlbXBsYXRlIj09PWUudGFnfHwic2xvdCI9PT1lLnRhZ31mdW5jdGlvbiBHbyhlLHQpe3JldHVybiAxPT09ZS50eXBlP0lvKGUsdCk6Mz09PWUudHlwZSYmZS5pc0NvbW1lbnQ/UW8oZSk6WW8oZSl9ZnVuY3Rpb24gWW8oZSl7cmV0dXJuIl92KCIrKDI9PT1lLnR5cGU/ZS5leHByZXNzaW9uOm5pKEpTT04uc3RyaW5naWZ5KGUudGV4dCkpKSsiKSJ9ZnVuY3Rpb24gUW8oZSl7cmV0dXJuIl9lKCIrSlNPTi5zdHJpbmdpZnkoZS50ZXh0KSsiKSJ9ZnVuY3Rpb24gWm8oZSx0KXt2YXIgbj1lLnNsb3ROYW1lfHwnImRlZmF1bHQiJyxyPVhvKGUsdCksbz0iX3QoIituKyhyPyIsIityOiIiKSxpPWUuYXR0cnMmJiJ7IitlLmF0dHJzLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZGkoZS5uYW1lKSsiOiIrZS52YWx1ZX0pLmpvaW4oIiwiKSsifSIsYT1lLmF0dHJzTWFwWyJ2LWJpbmQiXTtyZXR1cm4haSYmIWF8fHJ8fChvKz0iLG51bGwiKSxpJiYobys9IiwiK2kpLGEmJihvKz0oaT8iIjoiLG51bGwiKSsiLCIrYSksbysiKSJ9ZnVuY3Rpb24gZWkoZSx0LG4pe3ZhciByPXQuaW5saW5lVGVtcGxhdGU/bnVsbDpYbyh0LG4sITApO3JldHVybiJfYygiK2UrIiwiK0ZvKHQsbikrKHI/IiwiK3I6IiIpKyIpIn1mdW5jdGlvbiB0aShlKXtmb3IodmFyIHQ9IiIsbj0wO248ZS5sZW5ndGg7bisrKXt2YXIgcj1lW25dO3QrPSciJytyLm5hbWUrJyI6JytuaShyLnZhbHVlKSsiLCJ9cmV0dXJuIHQuc2xpY2UoMCwtMSl9ZnVuY3Rpb24gbmkoZSl7cmV0dXJuIGUucmVwbGFjZSgvXHUyMDI4L2csIlxcdTIwMjgiKS5yZXBsYWNlKC9cdTIwMjkvZywiXFx1MjAyOSIpfWZ1bmN0aW9uIHJpKGUsdCl7dHJ5e3JldHVybiBuZXcgRnVuY3Rpb24oZSl9Y2F0Y2gobil7cmV0dXJuIHQucHVzaCh7ZXJyOm4sY29kZTplfSksQ319ZnVuY3Rpb24gb2koZSl7dmFyIHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gZnVuY3Rpb24obixyLG8pe3I9dyh7fSxyKTtyLndhcm47ZGVsZXRlIHIud2Fybjt2YXIgaT1yLmRlbGltaXRlcnM/U3RyaW5nKHIuZGVsaW1pdGVycykrbjpuO2lmKHRbaV0pcmV0dXJuIHRbaV07dmFyIGE9ZShuLHIpLHM9e30sdT1bXTtyZXR1cm4gcy5yZW5kZXI9cmkoYS5yZW5kZXIsdSkscy5zdGF0aWNSZW5kZXJGbnM9YS5zdGF0aWNSZW5kZXJGbnMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiByaShlLHUpfSksdFtpXT1zfX1mdW5jdGlvbiBpaShlKXtyZXR1cm4gX3U9X3V8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLF91LmlubmVySFRNTD1lPyc8YSBocmVmPSJcbiIvPic6JzxkaXYgYT0iXG4iLz4nLF91LmlubmVySFRNTC5pbmRleE9mKCImIzEwOyIpPjB9ZnVuY3Rpb24gYWkoZSl7aWYoZS5vdXRlckhUTUwpcmV0dXJuIGUub3V0ZXJIVE1MO3ZhciB0PWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpO3JldHVybiB0LmFwcGVuZENoaWxkKGUuY2xvbmVOb2RlKCEwKSksdC5pbm5lckhUTUx9LyohCi0gKiBWdWUuanMgdjIuNS4xNwotICogKGMpIDIwMTQtMjAxOCBFdmFuIFlvdQotICogUmVsZWFzZWQgdW5kZXIgdGhlIE1JVCBMaWNlbnNlLgotICovCi12YXIgc2k9T2JqZWN0LmZyZWV6ZSh7fSksdWk9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZyxjaT1oKCJzbG90LGNvbXBvbmVudCIsITApLGxpPWgoImtleSxyZWYsc2xvdCxzbG90LXNjb3BlLGlzIiksZmk9T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eSxwaT0vLShcdykvZyxkaT15KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UocGksZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD90LnRvVXBwZXJDYXNlKCk6IiJ9KX0pLGhpPXkoZnVuY3Rpb24oZSl7cmV0dXJuIGUuY2hhckF0KDApLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKX0pLHZpPS9cQihbQS1aXSkvZyxtaT15KGZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UodmksIi0kMSIpLnRvTG93ZXJDYXNlKCl9KSx5aT1GdW5jdGlvbi5wcm90b3R5cGUuYmluZD9iOmcsZ2k9ZnVuY3Rpb24oZSx0LG4pe3JldHVybiExfSxiaT1mdW5jdGlvbihlKXtyZXR1cm4gZX0seGk9ImRhdGEtc2VydmVyLXJlbmRlcmVkIix3aT1bImNvbXBvbmVudCIsImRpcmVjdGl2ZSIsImZpbHRlciJdLF9pPVsiYmVmb3JlQ3JlYXRlIiwiY3JlYXRlZCIsImJlZm9yZU1vdW50IiwibW91bnRlZCIsImJlZm9yZVVwZGF0ZSIsInVwZGF0ZWQiLCJiZWZvcmVEZXN0cm95IiwiZGVzdHJveWVkIiwiYWN0aXZhdGVkIiwiZGVhY3RpdmF0ZWQiLCJlcnJvckNhcHR1cmVkIl0sQ2k9e29wdGlvbk1lcmdlU3RyYXRlZ2llczpPYmplY3QuY3JlYXRlKG51bGwpLHNpbGVudDohMSxwcm9kdWN0aW9uVGlwOiExLGRldnRvb2xzOiExLHBlcmZvcm1hbmNlOiExLGVycm9ySGFuZGxlcjpudWxsLHdhcm5IYW5kbGVyOm51bGwsaWdub3JlZEVsZW1lbnRzOltdLGtleUNvZGVzOk9iamVjdC5jcmVhdGUobnVsbCksaXNSZXNlcnZlZFRhZzpnaSxpc1Jlc2VydmVkQXR0cjpnaSxpc1Vua25vd25FbGVtZW50OmdpLGdldFRhZ05hbWVzcGFjZTpDLHBhcnNlUGxhdGZvcm1UYWdOYW1lOmJpLG11c3RVc2VQcm9wOmdpLF9saWZlY3ljbGVIb29rczpfaX0sVGk9L1teXHcuJF0vLGtpPSJfX3Byb3RvX18iaW57fSxBaT0idW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdyxTaT0idW5kZWZpbmVkIiE9dHlwZW9mIFdYRW52aXJvbm1lbnQmJiEhV1hFbnZpcm9ubWVudC5wbGF0Zm9ybSwkaT1TaSYmV1hFbnZpcm9ubWVudC5wbGF0Zm9ybS50b0xvd2VyQ2FzZSgpLEVpPUFpJiZ3aW5kb3cubmF2aWdhdG9yLnVzZXJBZ2VudC50b0xvd2VyQ2FzZSgpLE9pPUVpJiYvbXNpZXx0cmlkZW50Ly50ZXN0KEVpKSxqaT1FaSYmRWkuaW5kZXhPZigibXNpZSA5LjAiKT4wLE5pPUVpJiZFaS5pbmRleE9mKCJlZGdlLyIpPjAsTGk9KEVpJiZFaS5pbmRleE9mKCJhbmRyb2lkIiksRWkmJi9pcGhvbmV8aXBhZHxpcG9kfGlvcy8udGVzdChFaSl8fCJpb3MiPT09JGkpLERpPShFaSYmL2Nocm9tZVwvXGQrLy50ZXN0KEVpKSx7fS53YXRjaCksSWk9ITE7aWYoQWkpdHJ5e3ZhciBSaT17fTtPYmplY3QuZGVmaW5lUHJvcGVydHkoUmksInBhc3NpdmUiLHtnZXQ6ZnVuY3Rpb24oKXtJaT0hMH19KSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigidGVzdC1wYXNzaXZlIixudWxsLFJpKX1jYXRjaChlKXt9dmFyIFBpLE1pLHFpPWZ1bmN0aW9uKCl7cmV0dXJuIHZvaWQgMD09PVBpJiYoUGk9IUFpJiYhU2kmJnZvaWQgMCE9PWUmJiJzZXJ2ZXIiPT09ZS5wcm9jZXNzLmVudi5WVUVfRU5WKSxQaX0sSGk9QWkmJndpbmRvdy5fX1ZVRV9ERVZUT09MU19HTE9CQUxfSE9PS19fLEZpPSJ1bmRlZmluZWQiIT10eXBlb2YgU3ltYm9sJiZPKFN5bWJvbCkmJiJ1bmRlZmluZWQiIT10eXBlb2YgUmVmbGVjdCYmTyhSZWZsZWN0Lm93bktleXMpO01pPSJ1bmRlZmluZWQiIT10eXBlb2YgU2V0JiZPKFNldCk/U2V0OmZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSgpe3RoaXMuc2V0PU9iamVjdC5jcmVhdGUobnVsbCl9cmV0dXJuIGUucHJvdG90eXBlLmhhcz1mdW5jdGlvbihlKXtyZXR1cm4hMD09PXRoaXMuc2V0W2VdfSxlLnByb3RvdHlwZS5hZGQ9ZnVuY3Rpb24oZSl7dGhpcy5zZXRbZV09ITB9LGUucHJvdG90eXBlLmNsZWFyPWZ1bmN0aW9uKCl7dGhpcy5zZXQ9T2JqZWN0LmNyZWF0ZShudWxsKX0sZX0oKTt2YXIgQmk9QyxVaT0wLFdpPWZ1bmN0aW9uKCl7dGhpcy5pZD1VaSsrLHRoaXMuc3Vicz1bXX07V2kucHJvdG90eXBlLmFkZFN1Yj1mdW5jdGlvbihlKXt0aGlzLnN1YnMucHVzaChlKX0sV2kucHJvdG90eXBlLnJlbW92ZVN1Yj1mdW5jdGlvbihlKXt2KHRoaXMuc3VicyxlKX0sV2kucHJvdG90eXBlLmRlcGVuZD1mdW5jdGlvbigpe1dpLnRhcmdldCYmV2kudGFyZ2V0LmFkZERlcCh0aGlzKX0sV2kucHJvdG90eXBlLm5vdGlmeT1mdW5jdGlvbigpe2Zvcih2YXIgZT10aGlzLnN1YnMuc2xpY2UoKSx0PTAsbj1lLmxlbmd0aDt0PG47dCsrKWVbdF0udXBkYXRlKCl9LFdpLnRhcmdldD1udWxsO3ZhciB6aT1bXSxWaT1mdW5jdGlvbihlLHQsbixyLG8saSxhLHMpe3RoaXMudGFnPWUsdGhpcy5kYXRhPXQsdGhpcy5jaGlsZHJlbj1uLHRoaXMudGV4dD1yLHRoaXMuZWxtPW8sdGhpcy5ucz12b2lkIDAsdGhpcy5jb250ZXh0PWksdGhpcy5mbkNvbnRleHQ9dm9pZCAwLHRoaXMuZm5PcHRpb25zPXZvaWQgMCx0aGlzLmZuU2NvcGVJZD12b2lkIDAsdGhpcy5rZXk9dCYmdC5rZXksdGhpcy5jb21wb25lbnRPcHRpb25zPWEsdGhpcy5jb21wb25lbnRJbnN0YW5jZT12b2lkIDAsdGhpcy5wYXJlbnQ9dm9pZCAwLHRoaXMucmF3PSExLHRoaXMuaXNTdGF0aWM9ITEsdGhpcy5pc1Jvb3RJbnNlcnQ9ITAsdGhpcy5pc0NvbW1lbnQ9ITEsdGhpcy5pc0Nsb25lZD0hMSx0aGlzLmlzT25jZT0hMSx0aGlzLmFzeW5jRmFjdG9yeT1zLHRoaXMuYXN5bmNNZXRhPXZvaWQgMCx0aGlzLmlzQXN5bmNQbGFjZWhvbGRlcj0hMX0sWGk9e2NoaWxkOntjb25maWd1cmFibGU6ITB9fTtYaS5jaGlsZC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5jb21wb25lbnRJbnN0YW5jZX0sT2JqZWN0LmRlZmluZVByb3BlcnRpZXMoVmkucHJvdG90eXBlLFhpKTt2YXIgSmk9ZnVuY3Rpb24oZSl7dm9pZCAwPT09ZSYmKGU9IiIpO3ZhciB0PW5ldyBWaTtyZXR1cm4gdC50ZXh0PWUsdC5pc0NvbW1lbnQ9ITAsdH0sS2k9QXJyYXkucHJvdG90eXBlLEdpPU9iamVjdC5jcmVhdGUoS2kpO1sicHVzaCIsInBvcCIsInNoaWZ0IiwidW5zaGlmdCIsInNwbGljZSIsInNvcnQiLCJyZXZlcnNlIl0uZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgdD1LaVtlXTskKEdpLGUsZnVuY3Rpb24oKXtmb3IodmFyIG49W10scj1hcmd1bWVudHMubGVuZ3RoO3ItLTspbltyXT1hcmd1bWVudHNbcl07dmFyIG8saT10LmFwcGx5KHRoaXMsbiksYT10aGlzLl9fb2JfXztzd2l0Y2goZSl7Y2FzZSJwdXNoIjpjYXNlInVuc2hpZnQiOm89bjticmVhaztjYXNlInNwbGljZSI6bz1uLnNsaWNlKDIpfXJldHVybiBvJiZhLm9ic2VydmVBcnJheShvKSxhLmRlcC5ub3RpZnkoKSxpfSl9KTt2YXIgWWk9T2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoR2kpLFFpPSEwLFppPWZ1bmN0aW9uKGUpe2lmKHRoaXMudmFsdWU9ZSx0aGlzLmRlcD1uZXcgV2ksdGhpcy52bUNvdW50PTAsJChlLCJfX29iX18iLHRoaXMpLEFycmF5LmlzQXJyYXkoZSkpeyhraT9SOlApKGUsR2ksWWkpLHRoaXMub2JzZXJ2ZUFycmF5KGUpfWVsc2UgdGhpcy53YWxrKGUpfTtaaS5wcm90b3R5cGUud2Fsaz1mdW5jdGlvbihlKXtmb3IodmFyIHQ9T2JqZWN0LmtleXMoZSksbj0wO248dC5sZW5ndGg7bisrKXEoZSx0W25dKX0sWmkucHJvdG90eXBlLm9ic2VydmVBcnJheT1mdW5jdGlvbihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoO3Q8bjt0KyspTShlW3RdKX07dmFyIGVhPUNpLm9wdGlvbk1lcmdlU3RyYXRlZ2llcztlYS5kYXRhPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gbj9XKGUsdCxuKTp0JiYiZnVuY3Rpb24iIT10eXBlb2YgdD9lOlcoZSx0KX0sX2kuZm9yRWFjaChmdW5jdGlvbihlKXtlYVtlXT16fSksd2kuZm9yRWFjaChmdW5jdGlvbihlKXtlYVtlKyJzIl09Vn0pLGVhLndhdGNoPWZ1bmN0aW9uKGUsdCxuLHIpe2lmKGU9PT1EaSYmKGU9dm9pZCAwKSx0PT09RGkmJih0PXZvaWQgMCksIXQpcmV0dXJuIE9iamVjdC5jcmVhdGUoZXx8bnVsbCk7aWYoIWUpcmV0dXJuIHQ7dmFyIG89e307dyhvLGUpO2Zvcih2YXIgaSBpbiB0KXt2YXIgYT1vW2ldLHM9dFtpXTthJiYhQXJyYXkuaXNBcnJheShhKSYmKGE9W2FdKSxvW2ldPWE/YS5jb25jYXQocyk6QXJyYXkuaXNBcnJheShzKT9zOltzXX1yZXR1cm4gb30sZWEucHJvcHM9ZWEubWV0aG9kcz1lYS5pbmplY3Q9ZWEuY29tcHV0ZWQ9ZnVuY3Rpb24oZSx0LG4scil7aWYoIWUpcmV0dXJuIHQ7dmFyIG89T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gdyhvLGUpLHQmJncobyx0KSxvfSxlYS5wcm92aWRlPVc7dmFyIHRhLG5hLHJhPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIHZvaWQgMD09PXQ/ZTp0fSxvYT1bXSxpYT0hMSxhYT0hMTtpZih2b2lkIDAhPT1uJiZPKG4pKW5hPWZ1bmN0aW9uKCl7bihhZSl9O2Vsc2UgaWYoInVuZGVmaW5lZCI9PXR5cGVvZiBNZXNzYWdlQ2hhbm5lbHx8IU8oTWVzc2FnZUNoYW5uZWwpJiYiW29iamVjdCBNZXNzYWdlQ2hhbm5lbENvbnN0cnVjdG9yXSIhPT1NZXNzYWdlQ2hhbm5lbC50b1N0cmluZygpKW5hPWZ1bmN0aW9uKCl7c2V0VGltZW91dChhZSwwKX07ZWxzZXt2YXIgc2E9bmV3IE1lc3NhZ2VDaGFubmVsLHVhPXNhLnBvcnQyO3NhLnBvcnQxLm9ubWVzc2FnZT1hZSxuYT1mdW5jdGlvbigpe3VhLnBvc3RNZXNzYWdlKDEpfX1pZigidW5kZWZpbmVkIiE9dHlwZW9mIFByb21pc2UmJk8oUHJvbWlzZSkpe3ZhciBjYT1Qcm9taXNlLnJlc29sdmUoKTt0YT1mdW5jdGlvbigpe2NhLnRoZW4oYWUpLExpJiZzZXRUaW1lb3V0KEMpfX1lbHNlIHRhPW5hO3ZhciBsYSxmYT1uZXcgTWkscGE9eShmdW5jdGlvbihlKXt2YXIgdD0iJiI9PT1lLmNoYXJBdCgwKTtlPXQ/ZS5zbGljZSgxKTplO3ZhciBuPSJ+Ij09PWUuY2hhckF0KDApO2U9bj9lLnNsaWNlKDEpOmU7dmFyIHI9IiEiPT09ZS5jaGFyQXQoMCk7cmV0dXJuIGU9cj9lLnNsaWNlKDEpOmUse25hbWU6ZSxvbmNlOm4sY2FwdHVyZTpyLHBhc3NpdmU6dH19KSxkYT1udWxsLGhhPVtdLHZhPVtdLG1hPXt9LHlhPSExLGdhPSExLGJhPTAseGE9MCx3YT1mdW5jdGlvbihlLHQsbixyLG8pe3RoaXMudm09ZSxvJiYoZS5fd2F0Y2hlcj10aGlzKSxlLl93YXRjaGVycy5wdXNoKHRoaXMpLHI/KHRoaXMuZGVlcD0hIXIuZGVlcCx0aGlzLnVzZXI9ISFyLnVzZXIsdGhpcy5sYXp5PSEhci5sYXp5LHRoaXMuc3luYz0hIXIuc3luYyk6dGhpcy5kZWVwPXRoaXMudXNlcj10aGlzLmxhenk9dGhpcy5zeW5jPSExLHRoaXMuY2I9bix0aGlzLmlkPSsreGEsdGhpcy5hY3RpdmU9ITAsdGhpcy5kaXJ0eT10aGlzLmxhenksdGhpcy5kZXBzPVtdLHRoaXMubmV3RGVwcz1bXSx0aGlzLmRlcElkcz1uZXcgTWksdGhpcy5uZXdEZXBJZHM9bmV3IE1pLHRoaXMuZXhwcmVzc2lvbj0iIiwiZnVuY3Rpb24iPT10eXBlb2YgdD90aGlzLmdldHRlcj10Oih0aGlzLmdldHRlcj1FKHQpLHRoaXMuZ2V0dGVyfHwodGhpcy5nZXR0ZXI9ZnVuY3Rpb24oKXt9KSksdGhpcy52YWx1ZT10aGlzLmxhenk/dm9pZCAwOnRoaXMuZ2V0KCl9O3dhLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oKXtqKHRoaXMpO3ZhciBlLHQ9dGhpcy52bTt0cnl7ZT10aGlzLmdldHRlci5jYWxsKHQsdCl9Y2F0Y2goZSl7aWYoIXRoaXMudXNlcil0aHJvdyBlO3JlKGUsdCwnZ2V0dGVyIGZvciB3YXRjaGVyICInK3RoaXMuZXhwcmVzc2lvbisnIicpfWZpbmFsbHl7dGhpcy5kZWVwJiZjZShlKSxOKCksdGhpcy5jbGVhbnVwRGVwcygpfXJldHVybiBlfSx3YS5wcm90b3R5cGUuYWRkRGVwPWZ1bmN0aW9uKGUpe3ZhciB0PWUuaWQ7dGhpcy5uZXdEZXBJZHMuaGFzKHQpfHwodGhpcy5uZXdEZXBJZHMuYWRkKHQpLHRoaXMubmV3RGVwcy5wdXNoKGUpLHRoaXMuZGVwSWRzLmhhcyh0KXx8ZS5hZGRTdWIodGhpcykpfSx3YS5wcm90b3R5cGUuY2xlYW51cERlcHM9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyx0PXRoaXMuZGVwcy5sZW5ndGg7dC0tOyl7dmFyIG49ZS5kZXBzW3RdO2UubmV3RGVwSWRzLmhhcyhuLmlkKXx8bi5yZW1vdmVTdWIoZSl9dmFyIHI9dGhpcy5kZXBJZHM7dGhpcy5kZXBJZHM9dGhpcy5uZXdEZXBJZHMsdGhpcy5uZXdEZXBJZHM9cix0aGlzLm5ld0RlcElkcy5jbGVhcigpLHI9dGhpcy5kZXBzLHRoaXMuZGVwcz10aGlzLm5ld0RlcHMsdGhpcy5uZXdEZXBzPXIsdGhpcy5uZXdEZXBzLmxlbmd0aD0wfSx3YS5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKCl7dGhpcy5sYXp5P3RoaXMuZGlydHk9ITA6dGhpcy5zeW5jP3RoaXMucnVuKCk6V2UodGhpcyl9LHdhLnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXtpZih0aGlzLmFjdGl2ZSl7dmFyIGU9dGhpcy5nZXQoKTtpZihlIT09dGhpcy52YWx1ZXx8dShlKXx8dGhpcy5kZWVwKXt2YXIgdD10aGlzLnZhbHVlO2lmKHRoaXMudmFsdWU9ZSx0aGlzLnVzZXIpdHJ5e3RoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9Y2F0Y2goZSl7cmUoZSx0aGlzLnZtLCdjYWxsYmFjayBmb3Igd2F0Y2hlciAiJyt0aGlzLmV4cHJlc3Npb24rJyInKX1lbHNlIHRoaXMuY2IuY2FsbCh0aGlzLnZtLGUsdCl9fX0sd2EucHJvdG90eXBlLmV2YWx1YXRlPWZ1bmN0aW9uKCl7dGhpcy52YWx1ZT10aGlzLmdldCgpLHRoaXMuZGlydHk9ITF9LHdhLnByb3RvdHlwZS5kZXBlbmQ9ZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcyx0PXRoaXMuZGVwcy5sZW5ndGg7dC0tOyllLmRlcHNbdF0uZGVwZW5kKCl9LHdhLnByb3RvdHlwZS50ZWFyZG93bj1mdW5jdGlvbigpe3ZhciBlPXRoaXM7aWYodGhpcy5hY3RpdmUpe3RoaXMudm0uX2lzQmVpbmdEZXN0cm95ZWR8fHYodGhpcy52bS5fd2F0Y2hlcnMsdGhpcyk7Zm9yKHZhciB0PXRoaXMuZGVwcy5sZW5ndGg7dC0tOyllLmRlcHNbdF0ucmVtb3ZlU3ViKGUpO3RoaXMuYWN0aXZlPSExfX07dmFyIF9hPXtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6QyxzZXQ6Q30sQ2E9e2xhenk6ITB9O210KHl0LnByb3RvdHlwZSk7dmFyIFRhPXtpbml0OmZ1bmN0aW9uKGUsdCxuLHIpe2lmKGUuY29tcG9uZW50SW5zdGFuY2UmJiFlLmNvbXBvbmVudEluc3RhbmNlLl9pc0Rlc3Ryb3llZCYmZS5kYXRhLmtlZXBBbGl2ZSl7dmFyIG89ZTtUYS5wcmVwYXRjaChvLG8pfWVsc2V7KGUuY29tcG9uZW50SW5zdGFuY2U9X3QoZSxkYSxuLHIpKS4kbW91bnQodD9lLmVsbTp2b2lkIDAsdCl9fSxwcmVwYXRjaDpmdW5jdGlvbihlLHQpe3ZhciBuPXQuY29tcG9uZW50T3B0aW9ucztEZSh0LmNvbXBvbmVudEluc3RhbmNlPWUuY29tcG9uZW50SW5zdGFuY2Usbi5wcm9wc0RhdGEsbi5saXN0ZW5lcnMsdCxuLmNoaWxkcmVuKX0saW5zZXJ0OmZ1bmN0aW9uKGUpe3ZhciB0PWUuY29udGV4dCxuPWUuY29tcG9uZW50SW5zdGFuY2U7bi5faXNNb3VudGVkfHwobi5faXNNb3VudGVkPSEwLE1lKG4sIm1vdW50ZWQiKSksZS5kYXRhLmtlZXBBbGl2ZSYmKHQuX2lzTW91bnRlZD9CZShuKTpSZShuLCEwKSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5jb21wb25lbnRJbnN0YW5jZTt0Ll9pc0Rlc3Ryb3llZHx8KGUuZGF0YS5rZWVwQWxpdmU/UGUodCwhMCk6dC4kZGVzdHJveSgpKX19LGthPU9iamVjdC5rZXlzKFRhKSxBYT0xLFNhPTIsJGE9MDshZnVuY3Rpb24oZSl7ZS5wcm90b3R5cGUuX2luaXQ9ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpczt0Ll91aWQ9JGErKyx0Ll9pc1Z1ZT0hMCxlJiZlLl9pc0NvbXBvbmVudD9PdCh0LGUpOnQuJG9wdGlvbnM9RyhqdCh0LmNvbnN0cnVjdG9yKSxlfHx7fSx0KSx0Ll9yZW5kZXJQcm94eT10LHQuX3NlbGY9dCxOZSh0KSxrZSh0KSxFdCh0KSxNZSh0LCJiZWZvcmVDcmVhdGUiKSxydCh0KSxWZSh0KSxudCh0KSxNZSh0LCJjcmVhdGVkIiksdC4kb3B0aW9ucy5lbCYmdC4kbW91bnQodC4kb3B0aW9ucy5lbCl9fShEdCksZnVuY3Rpb24oZSl7dmFyIHQ9e307dC5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fZGF0YX07dmFyIG49e307bi5nZXQ9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcHJvcHN9LE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiJGRhdGEiLHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiJHByb3BzIixuKSxlLnByb3RvdHlwZS4kc2V0PUgsZS5wcm90b3R5cGUuJGRlbGV0ZT1GLGUucHJvdG90eXBlLiR3YXRjaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcztpZihjKHQpKXJldHVybiB0dChyLGUsdCxuKTtuPW58fHt9LG4udXNlcj0hMDt2YXIgbz1uZXcgd2EocixlLHQsbik7cmV0dXJuIG4uaW1tZWRpYXRlJiZ0LmNhbGwocixvLnZhbHVlKSxmdW5jdGlvbigpe28udGVhcmRvd24oKX19fShEdCksZnVuY3Rpb24oZSl7dmFyIHQ9L15ob29rOi87ZS5wcm90b3R5cGUuJG9uPWZ1bmN0aW9uKGUsbil7dmFyIHI9dGhpcyxvPXRoaXM7aWYoQXJyYXkuaXNBcnJheShlKSlmb3IodmFyIGk9MCxhPWUubGVuZ3RoO2k8YTtpKyspci4kb24oZVtpXSxuKTtlbHNlKG8uX2V2ZW50c1tlXXx8KG8uX2V2ZW50c1tlXT1bXSkpLnB1c2gobiksdC50ZXN0KGUpJiYoby5faGFzSG9va0V2ZW50PSEwKTtyZXR1cm4gb30sZS5wcm90b3R5cGUuJG9uY2U9ZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7ci4kb2ZmKGUsbiksdC5hcHBseShyLGFyZ3VtZW50cyl9dmFyIHI9dGhpcztyZXR1cm4gbi5mbj10LHIuJG9uKGUsbikscn0sZS5wcm90b3R5cGUuJG9mZj1mdW5jdGlvbihlLHQpe3ZhciBuPXRoaXMscj10aGlzO2lmKCFhcmd1bWVudHMubGVuZ3RoKXJldHVybiByLl9ldmVudHM9T2JqZWN0LmNyZWF0ZShudWxsKSxyO2lmKEFycmF5LmlzQXJyYXkoZSkpe2Zvcih2YXIgbz0wLGk9ZS5sZW5ndGg7bzxpO28rKyluLiRvZmYoZVtvXSx0KTtyZXR1cm4gcn12YXIgYT1yLl9ldmVudHNbZV07aWYoIWEpcmV0dXJuIHI7aWYoIXQpcmV0dXJuIHIuX2V2ZW50c1tlXT1udWxsLHI7aWYodClmb3IodmFyIHMsdT1hLmxlbmd0aDt1LS07KWlmKChzPWFbdV0pPT09dHx8cy5mbj09PXQpe2Euc3BsaWNlKHUsMSk7YnJlYWt9cmV0dXJuIHJ9LGUucHJvdG90eXBlLiRlbWl0PWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10Ll9ldmVudHNbZV07aWYobil7bj1uLmxlbmd0aD4xP3gobik6bjtmb3IodmFyIHI9eChhcmd1bWVudHMsMSksbz0wLGk9bi5sZW5ndGg7bzxpO28rKyl0cnl7bltvXS5hcHBseSh0LHIpfWNhdGNoKG4pe3JlKG4sdCwnZXZlbnQgaGFuZGxlciBmb3IgIicrZSsnIicpfX1yZXR1cm4gdH19KER0KSxmdW5jdGlvbihlKXtlLnByb3RvdHlwZS5fdXBkYXRlPWZ1bmN0aW9uKGUsdCl7dmFyIG49dGhpcztuLl9pc01vdW50ZWQmJk1lKG4sImJlZm9yZVVwZGF0ZSIpO3ZhciByPW4uJGVsLG89bi5fdm5vZGUsaT1kYTtkYT1uLG4uX3Zub2RlPWUsbz9uLiRlbD1uLl9fcGF0Y2hfXyhvLGUpOihuLiRlbD1uLl9fcGF0Y2hfXyhuLiRlbCxlLHQsITEsbi4kb3B0aW9ucy5fcGFyZW50RWxtLG4uJG9wdGlvbnMuX3JlZkVsbSksbi4kb3B0aW9ucy5fcGFyZW50RWxtPW4uJG9wdGlvbnMuX3JlZkVsbT1udWxsKSxkYT1pLHImJihyLl9fdnVlX189bnVsbCksbi4kZWwmJihuLiRlbC5fX3Z1ZV9fPW4pLG4uJHZub2RlJiZuLiRwYXJlbnQmJm4uJHZub2RlPT09bi4kcGFyZW50Ll92bm9kZSYmKG4uJHBhcmVudC4kZWw9bi4kZWwpfSxlLnByb3RvdHlwZS4kZm9yY2VVcGRhdGU9ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2UuX3dhdGNoZXImJmUuX3dhdGNoZXIudXBkYXRlKCl9LGUucHJvdG90eXBlLiRkZXN0cm95PWZ1bmN0aW9uKCl7dmFyIGU9dGhpcztpZighZS5faXNCZWluZ0Rlc3Ryb3llZCl7TWUoZSwiYmVmb3JlRGVzdHJveSIpLGUuX2lzQmVpbmdEZXN0cm95ZWQ9ITA7dmFyIHQ9ZS4kcGFyZW50OyF0fHx0Ll9pc0JlaW5nRGVzdHJveWVkfHxlLiRvcHRpb25zLmFic3RyYWN0fHx2KHQuJGNoaWxkcmVuLGUpLGUuX3dhdGNoZXImJmUuX3dhdGNoZXIudGVhcmRvd24oKTtmb3IodmFyIG49ZS5fd2F0Y2hlcnMubGVuZ3RoO24tLTspZS5fd2F0Y2hlcnNbbl0udGVhcmRvd24oKTtlLl9kYXRhLl9fb2JfXyYmZS5fZGF0YS5fX29iX18udm1Db3VudC0tLGUuX2lzRGVzdHJveWVkPSEwLGUuX19wYXRjaF9fKGUuX3Zub2RlLG51bGwpLE1lKGUsImRlc3Ryb3llZCIpLGUuJG9mZigpLGUuJGVsJiYoZS4kZWwuX192dWVfXz1udWxsKSxlLiR2bm9kZSYmKGUuJHZub2RlLnBhcmVudD1udWxsKX19fShEdCksZnVuY3Rpb24oZSl7bXQoZS5wcm90b3R5cGUpLGUucHJvdG90eXBlLiRuZXh0VGljaz1mdW5jdGlvbihlKXtyZXR1cm4gdWUoZSx0aGlzKX0sZS5wcm90b3R5cGUuX3JlbmRlcj1mdW5jdGlvbigpe3ZhciBlPXRoaXMsdD1lLiRvcHRpb25zLG49dC5yZW5kZXIscj10Ll9wYXJlbnRWbm9kZTtyJiYoZS4kc2NvcGVkU2xvdHM9ci5kYXRhLnNjb3BlZFNsb3RzfHxzaSksZS4kdm5vZGU9cjt2YXIgbzt0cnl7bz1uLmNhbGwoZS5fcmVuZGVyUHJveHksZS4kY3JlYXRlRWxlbWVudCl9Y2F0Y2godCl7cmUodCxlLCJyZW5kZXIiKSxvPWUuX3Zub2RlfXJldHVybiBvIGluc3RhbmNlb2YgVml8fChvPUppKCkpLG8ucGFyZW50PXIsb319KER0KTt2YXIgRWE9W1N0cmluZyxSZWdFeHAsQXJyYXldLE9hPXtuYW1lOiJrZWVwLWFsaXZlIixhYnN0cmFjdDohMCxwcm9wczp7aW5jbHVkZTpFYSxleGNsdWRlOkVhLG1heDpbU3RyaW5nLE51bWJlcl19LGNyZWF0ZWQ6ZnVuY3Rpb24oKXt0aGlzLmNhY2hlPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5rZXlzPVtdfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXt2YXIgZT10aGlzO2Zvcih2YXIgdCBpbiBlLmNhY2hlKVd0KGUuY2FjaGUsdCxlLmtleXMpfSxtb3VudGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpczt0aGlzLiR3YXRjaCgiaW5jbHVkZSIsZnVuY3Rpb24odCl7VXQoZSxmdW5jdGlvbihlKXtyZXR1cm4gQnQodCxlKX0pfSksdGhpcy4kd2F0Y2goImV4Y2x1ZGUiLGZ1bmN0aW9uKHQpe1V0KGUsZnVuY3Rpb24oZSl7cmV0dXJuIUJ0KHQsZSl9KX0pfSxyZW5kZXI6ZnVuY3Rpb24oKXt2YXIgZT10aGlzLiRzbG90cy5kZWZhdWx0LHQ9VGUoZSksbj10JiZ0LmNvbXBvbmVudE9wdGlvbnM7aWYobil7dmFyIHI9RnQobiksbz10aGlzLGk9by5pbmNsdWRlLGE9by5leGNsdWRlO2lmKGkmJighcnx8IUJ0KGkscikpfHxhJiZyJiZCdChhLHIpKXJldHVybiB0O3ZhciBzPXRoaXMsdT1zLmNhY2hlLGM9cy5rZXlzLGw9bnVsbD09dC5rZXk/bi5DdG9yLmNpZCsobi50YWc/Ijo6IituLnRhZzoiIik6dC5rZXk7dVtsXT8odC5jb21wb25lbnRJbnN0YW5jZT11W2xdLmNvbXBvbmVudEluc3RhbmNlLHYoYyxsKSxjLnB1c2gobCkpOih1W2xdPXQsYy5wdXNoKGwpLHRoaXMubWF4JiZjLmxlbmd0aD5wYXJzZUludCh0aGlzLm1heCkmJld0KHUsY1swXSxjLHRoaXMuX3Zub2RlKSksdC5kYXRhLmtlZXBBbGl2ZT0hMH1yZXR1cm4gdHx8ZSYmZVswXX19LGphPXtLZWVwQWxpdmU6T2F9OyFmdW5jdGlvbihlKXt2YXIgdD17fTt0LmdldD1mdW5jdGlvbigpe3JldHVybiBDaX0sT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsImNvbmZpZyIsdCksZS51dGlsPXt3YXJuOkJpLGV4dGVuZDp3LG1lcmdlT3B0aW9uczpHLGRlZmluZVJlYWN0aXZlOnF9LGUuc2V0PUgsZS5kZWxldGU9RixlLm5leHRUaWNrPXVlLGUub3B0aW9ucz1PYmplY3QuY3JlYXRlKG51bGwpLHdpLmZvckVhY2goZnVuY3Rpb24odCl7ZS5vcHRpb25zW3QrInMiXT1PYmplY3QuY3JlYXRlKG51bGwpfSksZS5vcHRpb25zLl9iYXNlPWUsdyhlLm9wdGlvbnMuY29tcG9uZW50cyxqYSksSXQoZSksUnQoZSksUHQoZSksSHQoZSl9KER0KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHQucHJvdG90eXBlLCIkaXNTZXJ2ZXIiLHtnZXQ6cWl9KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHQucHJvdG90eXBlLCIkc3NyQ29udGV4dCIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLiR2bm9kZSYmdGhpcy4kdm5vZGUuc3NyQ29udGV4dH19KSxPYmplY3QuZGVmaW5lUHJvcGVydHkoRHQsIkZ1bmN0aW9uYWxSZW5kZXJDb250ZXh0Iix7dmFsdWU6eXR9KSxEdC52ZXJzaW9uPSIyLjUuMTciO3ZhciBOYSxMYSxEYSxJYSxSYSxQYSxNYSxxYSxIYSxGYT1oKCJzdHlsZSxjbGFzcyIpLEJhPWgoImlucHV0LHRleHRhcmVhLG9wdGlvbixzZWxlY3QscHJvZ3Jlc3MiKSxVYT1mdW5jdGlvbihlLHQsbil7cmV0dXJuInZhbHVlIj09PW4mJkJhKGUpJiYiYnV0dG9uIiE9PXR8fCJzZWxlY3RlZCI9PT1uJiYib3B0aW9uIj09PWV8fCJjaGVja2VkIj09PW4mJiJpbnB1dCI9PT1lfHwibXV0ZWQiPT09biYmInZpZGVvIj09PWV9LFdhPWgoImNvbnRlbnRlZGl0YWJsZSxkcmFnZ2FibGUsc3BlbGxjaGVjayIpLHphPWgoImFsbG93ZnVsbHNjcmVlbixhc3luYyxhdXRvZm9jdXMsYXV0b3BsYXksY2hlY2tlZCxjb21wYWN0LGNvbnRyb2xzLGRlY2xhcmUsZGVmYXVsdCxkZWZhdWx0Y2hlY2tlZCxkZWZhdWx0bXV0ZWQsZGVmYXVsdHNlbGVjdGVkLGRlZmVyLGRpc2FibGVkLGVuYWJsZWQsZm9ybW5vdmFsaWRhdGUsaGlkZGVuLGluZGV0ZXJtaW5hdGUsaW5lcnQsaXNtYXAsaXRlbXNjb3BlLGxvb3AsbXVsdGlwbGUsbXV0ZWQsbm9ocmVmLG5vcmVzaXplLG5vc2hhZGUsbm92YWxpZGF0ZSxub3dyYXAsb3BlbixwYXVzZW9uZXhpdCxyZWFkb25seSxyZXF1aXJlZCxyZXZlcnNlZCxzY29wZWQsc2VhbWxlc3Msc2VsZWN0ZWQsc29ydGFibGUsdHJhbnNsYXRlLHRydWVzcGVlZCx0eXBlbXVzdG1hdGNoLHZpc2libGUiKSxWYT0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIsWGE9ZnVuY3Rpb24oZSl7cmV0dXJuIjoiPT09ZS5jaGFyQXQoNSkmJiJ4bGluayI9PT1lLnNsaWNlKDAsNSl9LEphPWZ1bmN0aW9uKGUpe3JldHVybiBYYShlKT9lLnNsaWNlKDYsZS5sZW5ndGgpOiIifSxLYT1mdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZXx8ITE9PT1lfSxHYT17c3ZnOiJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIsbWF0aDoiaHR0cDovL3d3dy53My5vcmcvMTk5OC9NYXRoL01hdGhNTCJ9LFlhPWgoImh0bWwsYm9keSxiYXNlLGhlYWQsbGluayxtZXRhLHN0eWxlLHRpdGxlLGFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxmb290ZXIsaGVhZGVyLGgxLGgyLGgzLGg0LGg1LGg2LGhncm91cCxuYXYsc2VjdGlvbixkaXYsZGQsZGwsZHQsZmlnY2FwdGlvbixmaWd1cmUscGljdHVyZSxocixpbWcsbGksbWFpbixvbCxwLHByZSx1bCxhLGIsYWJicixiZGksYmRvLGJyLGNpdGUsY29kZSxkYXRhLGRmbixlbSxpLGtiZCxtYXJrLHEscnAscnQscnRjLHJ1YnkscyxzYW1wLHNtYWxsLHNwYW4sc3Ryb25nLHN1YixzdXAsdGltZSx1LHZhcix3YnIsYXJlYSxhdWRpbyxtYXAsdHJhY2ssdmlkZW8sZW1iZWQsb2JqZWN0LHBhcmFtLHNvdXJjZSxjYW52YXMsc2NyaXB0LG5vc2NyaXB0LGRlbCxpbnMsY2FwdGlvbixjb2wsY29sZ3JvdXAsdGFibGUsdGhlYWQsdGJvZHksdGQsdGgsdHIsYnV0dG9uLGRhdGFsaXN0LGZpZWxkc2V0LGZvcm0saW5wdXQsbGFiZWwsbGVnZW5kLG1ldGVyLG9wdGdyb3VwLG9wdGlvbixvdXRwdXQscHJvZ3Jlc3Msc2VsZWN0LHRleHRhcmVhLGRldGFpbHMsZGlhbG9nLG1lbnUsbWVudWl0ZW0sc3VtbWFyeSxjb250ZW50LGVsZW1lbnQsc2hhZG93LHRlbXBsYXRlLGJsb2NrcXVvdGUsaWZyYW1lLHRmb290IiksUWE9aCgic3ZnLGFuaW1hdGUsY2lyY2xlLGNsaXBwYXRoLGN1cnNvcixkZWZzLGRlc2MsZWxsaXBzZSxmaWx0ZXIsZm9udC1mYWNlLGZvcmVpZ25PYmplY3QsZyxnbHlwaCxpbWFnZSxsaW5lLG1hcmtlcixtYXNrLG1pc3NpbmctZ2x5cGgscGF0aCxwYXR0ZXJuLHBvbHlnb24scG9seWxpbmUscmVjdCxzd2l0Y2gsc3ltYm9sLHRleHQsdGV4dHBhdGgsdHNwYW4sdXNlLHZpZXciLCEwKSxaYT1mdW5jdGlvbihlKXtyZXR1cm4icHJlIj09PWV9LGVzPWZ1bmN0aW9uKGUpe3JldHVybiBZYShlKXx8UWEoZSl9LHRzPU9iamVjdC5jcmVhdGUobnVsbCksbnM9aCgidGV4dCxudW1iZXIscGFzc3dvcmQsc2VhcmNoLGVtYWlsLHRlbCx1cmwiKSxycz1PYmplY3QuZnJlZXplKHtjcmVhdGVFbGVtZW50OnRuLGNyZWF0ZUVsZW1lbnROUzpubixjcmVhdGVUZXh0Tm9kZTpybixjcmVhdGVDb21tZW50Om9uLGluc2VydEJlZm9yZTphbixyZW1vdmVDaGlsZDpzbixhcHBlbmRDaGlsZDp1bixwYXJlbnROb2RlOmNuLG5leHRTaWJsaW5nOmxuLHRhZ05hbWU6Zm4sc2V0VGV4dENvbnRlbnQ6cG4sc2V0U3R5bGVTY29wZTpkbn0pLG9zPXtjcmVhdGU6ZnVuY3Rpb24oZSx0KXtobih0KX0sdXBkYXRlOmZ1bmN0aW9uKGUsdCl7ZS5kYXRhLnJlZiE9PXQuZGF0YS5yZWYmJihobihlLCEwKSxobih0KSl9LGRlc3Ryb3k6ZnVuY3Rpb24oZSl7aG4oZSwhMCl9fSxpcz1uZXcgVmkoIiIse30sW10pLGFzPVsiY3JlYXRlIiwiYWN0aXZhdGUiLCJ1cGRhdGUiLCJyZW1vdmUiLCJkZXN0cm95Il0sc3M9e2NyZWF0ZTpnbix1cGRhdGU6Z24sZGVzdHJveTpmdW5jdGlvbihlKXtnbihlLGlzKX19LHVzPU9iamVjdC5jcmVhdGUobnVsbCksY3M9W29zLHNzXSxscz17Y3JlYXRlOkNuLHVwZGF0ZTpDbn0sZnM9e2NyZWF0ZTpBbix1cGRhdGU6QW59LHBzPS9bXHcpLitcLV8kXF1dLyxkcz0iX19yIixocz0iX19jIix2cz17Y3JlYXRlOnRyLHVwZGF0ZTp0cn0sbXM9e2NyZWF0ZTpucix1cGRhdGU6bnJ9LHlzPXkoZnVuY3Rpb24oZSl7dmFyIHQ9e30sbj0vOyg/IVteKF0qXCkpL2cscj0vOiguKykvO3JldHVybiBlLnNwbGl0KG4pLmZvckVhY2goZnVuY3Rpb24oZSl7aWYoZSl7dmFyIG49ZS5zcGxpdChyKTtuLmxlbmd0aD4xJiYodFtuWzBdLnRyaW0oKV09blsxXS50cmltKCkpfX0pLHR9KSxncz0vXi0tLyxicz0vXHMqIWltcG9ydGFudCQvLHhzPWZ1bmN0aW9uKGUsdCxuKXtpZihncy50ZXN0KHQpKWUuc3R5bGUuc2V0UHJvcGVydHkodCxuKTtlbHNlIGlmKGJzLnRlc3QobikpZS5zdHlsZS5zZXRQcm9wZXJ0eSh0LG4ucmVwbGFjZShicywiIiksImltcG9ydGFudCIpO2Vsc2V7dmFyIHI9X3ModCk7aWYoQXJyYXkuaXNBcnJheShuKSlmb3IodmFyIG89MCxpPW4ubGVuZ3RoO288aTtvKyspZS5zdHlsZVtyXT1uW29dO2Vsc2UgZS5zdHlsZVtyXT1ufX0sd3M9WyJXZWJraXQiLCJNb3oiLCJtcyJdLF9zPXkoZnVuY3Rpb24oZSl7aWYoSGE9SGF8fGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlLCJmaWx0ZXIiIT09KGU9ZGkoZSkpJiZlIGluIEhhKXJldHVybiBlO2Zvcih2YXIgdD1lLmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpK2Uuc2xpY2UoMSksbj0wO248d3MubGVuZ3RoO24rKyl7dmFyIHI9d3Nbbl0rdDtpZihyIGluIEhhKXJldHVybiByfX0pLENzPXtjcmVhdGU6Y3IsdXBkYXRlOmNyfSxUcz15KGZ1bmN0aW9uKGUpe3JldHVybntlbnRlckNsYXNzOmUrIi1lbnRlciIsZW50ZXJUb0NsYXNzOmUrIi1lbnRlci10byIsZW50ZXJBY3RpdmVDbGFzczplKyItZW50ZXItYWN0aXZlIixsZWF2ZUNsYXNzOmUrIi1sZWF2ZSIsbGVhdmVUb0NsYXNzOmUrIi1sZWF2ZS10byIsbGVhdmVBY3RpdmVDbGFzczplKyItbGVhdmUtYWN0aXZlIn19KSxrcz1BaSYmIWppLEFzPSJ0cmFuc2l0aW9uIixTcz0iYW5pbWF0aW9uIiwkcz0idHJhbnNpdGlvbiIsRXM9InRyYW5zaXRpb25lbmQiLE9zPSJhbmltYXRpb24iLGpzPSJhbmltYXRpb25lbmQiO2tzJiYodm9pZCAwPT09d2luZG93Lm9udHJhbnNpdGlvbmVuZCYmdm9pZCAwIT09d2luZG93Lm9ud2Via2l0dHJhbnNpdGlvbmVuZCYmKCRzPSJXZWJraXRUcmFuc2l0aW9uIixFcz0id2Via2l0VHJhbnNpdGlvbkVuZCIpLHZvaWQgMD09PXdpbmRvdy5vbmFuaW1hdGlvbmVuZCYmdm9pZCAwIT09d2luZG93Lm9ud2Via2l0YW5pbWF0aW9uZW5kJiYoT3M9IldlYmtpdEFuaW1hdGlvbiIsanM9IndlYmtpdEFuaW1hdGlvbkVuZCIpKTt2YXIgTnM9QWk/d2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZT93aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lLmJpbmQod2luZG93KTpzZXRUaW1lb3V0OmZ1bmN0aW9uKGUpe3JldHVybiBlKCl9LExzPS9cYih0cmFuc2Zvcm18YWxsKSgsfCQpLyxEcz1BaT97Y3JlYXRlOlRyLGFjdGl2YXRlOlRyLHJlbW92ZTpmdW5jdGlvbihlLHQpeyEwIT09ZS5kYXRhLnNob3c/d3IoZSx0KTp0KCl9fTp7fSxJcz1bbHMsZnMsdnMsbXMsQ3MsRHNdLFJzPUlzLmNvbmNhdChjcyksUHM9ZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlKXtyZXR1cm4gbmV3IFZpKGoudGFnTmFtZShlKS50b0xvd2VyQ2FzZSgpLHt9LFtdLHZvaWQgMCxlKX1mdW5jdGlvbiBuKGUsdCl7ZnVuY3Rpb24gbigpezA9PS0tbi5saXN0ZW5lcnMmJmEoZSl9cmV0dXJuIG4ubGlzdGVuZXJzPXQsbn1mdW5jdGlvbiBhKGUpe3ZhciB0PWoucGFyZW50Tm9kZShlKTtvKHQpJiZqLnJlbW92ZUNoaWxkKHQsZSl9ZnVuY3Rpb24gdShlLHQsbixyLGEscyx1KXtpZihvKGUuZWxtKSYmbyhzKSYmKGU9c1t1XT1EKGUpKSxlLmlzUm9vdEluc2VydD0hYSwhYyhlLHQsbixyKSl7dmFyIGw9ZS5kYXRhLGY9ZS5jaGlsZHJlbixoPWUudGFnO28oaCk/KGUuZWxtPWUubnM/ai5jcmVhdGVFbGVtZW50TlMoZS5ucyxoKTpqLmNyZWF0ZUVsZW1lbnQoaCxlKSx5KGUpLGQoZSxmLHQpLG8obCkmJm0oZSx0KSxwKG4sZS5lbG0scikpOmkoZS5pc0NvbW1lbnQpPyhlLmVsbT1qLmNyZWF0ZUNvbW1lbnQoZS50ZXh0KSxwKG4sZS5lbG0scikpOihlLmVsbT1qLmNyZWF0ZVRleHROb2RlKGUudGV4dCkscChuLGUuZWxtLHIpKX19ZnVuY3Rpb24gYyhlLHQsbixyKXt2YXIgYT1lLmRhdGE7aWYobyhhKSl7dmFyIHM9byhlLmNvbXBvbmVudEluc3RhbmNlKSYmYS5rZWVwQWxpdmU7aWYobyhhPWEuaG9vaykmJm8oYT1hLmluaXQpJiZhKGUsITEsbixyKSxvKGUuY29tcG9uZW50SW5zdGFuY2UpKXJldHVybiBsKGUsdCksaShzKSYmZihlLHQsbixyKSwhMH19ZnVuY3Rpb24gbChlLHQpe28oZS5kYXRhLnBlbmRpbmdJbnNlcnQpJiYodC5wdXNoLmFwcGx5KHQsZS5kYXRhLnBlbmRpbmdJbnNlcnQpLGUuZGF0YS5wZW5kaW5nSW5zZXJ0PW51bGwpLGUuZWxtPWUuY29tcG9uZW50SW5zdGFuY2UuJGVsLHYoZSk/KG0oZSx0KSx5KGUpKTooaG4oZSksdC5wdXNoKGUpKX1mdW5jdGlvbiBmKGUsdCxuLHIpe2Zvcih2YXIgaSxhPWU7YS5jb21wb25lbnRJbnN0YW5jZTspaWYoYT1hLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZSxvKGk9YS5kYXRhKSYmbyhpPWkudHJhbnNpdGlvbikpe2ZvcihpPTA7aTxFLmFjdGl2YXRlLmxlbmd0aDsrK2kpRS5hY3RpdmF0ZVtpXShpcyxhKTt0LnB1c2goYSk7YnJlYWt9cChuLGUuZWxtLHIpfWZ1bmN0aW9uIHAoZSx0LG4pe28oZSkmJihvKG4pP24ucGFyZW50Tm9kZT09PWUmJmouaW5zZXJ0QmVmb3JlKGUsdCxuKTpqLmFwcGVuZENoaWxkKGUsdCkpfWZ1bmN0aW9uIGQoZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkodCkpZm9yKHZhciByPTA7cjx0Lmxlbmd0aDsrK3IpdSh0W3JdLG4sZS5lbG0sbnVsbCwhMCx0LHIpO2Vsc2UgcyhlLnRleHQpJiZqLmFwcGVuZENoaWxkKGUuZWxtLGouY3JlYXRlVGV4dE5vZGUoU3RyaW5nKGUudGV4dCkpKX1mdW5jdGlvbiB2KGUpe2Zvcig7ZS5jb21wb25lbnRJbnN0YW5jZTspZT1lLmNvbXBvbmVudEluc3RhbmNlLl92bm9kZTtyZXR1cm4gbyhlLnRhZyl9ZnVuY3Rpb24gbShlLHQpe2Zvcih2YXIgbj0wO248RS5jcmVhdGUubGVuZ3RoOysrbilFLmNyZWF0ZVtuXShpcyxlKTtTPWUuZGF0YS5ob29rLG8oUykmJihvKFMuY3JlYXRlKSYmUy5jcmVhdGUoaXMsZSksbyhTLmluc2VydCkmJnQucHVzaChlKSl9ZnVuY3Rpb24geShlKXt2YXIgdDtpZihvKHQ9ZS5mblNjb3BlSWQpKWouc2V0U3R5bGVTY29wZShlLmVsbSx0KTtlbHNlIGZvcih2YXIgbj1lO247KW8odD1uLmNvbnRleHQpJiZvKHQ9dC4kb3B0aW9ucy5fc2NvcGVJZCkmJmouc2V0U3R5bGVTY29wZShlLmVsbSx0KSxuPW4ucGFyZW50O28odD1kYSkmJnQhPT1lLmNvbnRleHQmJnQhPT1lLmZuQ29udGV4dCYmbyh0PXQuJG9wdGlvbnMuX3Njb3BlSWQpJiZqLnNldFN0eWxlU2NvcGUoZS5lbG0sdCl9ZnVuY3Rpb24gZyhlLHQsbixyLG8saSl7Zm9yKDtyPD1vOysrcil1KG5bcl0saSxlLHQsITEsbixyKX1mdW5jdGlvbiBiKGUpe3ZhciB0LG4scj1lLmRhdGE7aWYobyhyKSlmb3Iobyh0PXIuaG9vaykmJm8odD10LmRlc3Ryb3kpJiZ0KGUpLHQ9MDt0PEUuZGVzdHJveS5sZW5ndGg7Kyt0KUUuZGVzdHJveVt0XShlKTtpZihvKHQ9ZS5jaGlsZHJlbikpZm9yKG49MDtuPGUuY2hpbGRyZW4ubGVuZ3RoOysrbiliKGUuY2hpbGRyZW5bbl0pfWZ1bmN0aW9uIHgoZSx0LG4scil7Zm9yKDtuPD1yOysrbil7dmFyIGk9dFtuXTtvKGkpJiYobyhpLnRhZyk/KHcoaSksYihpKSk6YShpLmVsbSkpfX1mdW5jdGlvbiB3KGUsdCl7aWYobyh0KXx8byhlLmRhdGEpKXt2YXIgcixpPUUucmVtb3ZlLmxlbmd0aCsxO2ZvcihvKHQpP3QubGlzdGVuZXJzKz1pOnQ9bihlLmVsbSxpKSxvKHI9ZS5jb21wb25lbnRJbnN0YW5jZSkmJm8ocj1yLl92bm9kZSkmJm8oci5kYXRhKSYmdyhyLHQpLHI9MDtyPEUucmVtb3ZlLmxlbmd0aDsrK3IpRS5yZW1vdmVbcl0oZSx0KTtvKHI9ZS5kYXRhLmhvb2spJiZvKHI9ci5yZW1vdmUpP3IoZSx0KTp0KCl9ZWxzZSBhKGUuZWxtKX1mdW5jdGlvbiBfKGUsdCxuLGksYSl7Zm9yKHZhciBzLGMsbCxmLHA9MCxkPTAsaD10Lmxlbmd0aC0xLHY9dFswXSxtPXRbaF0seT1uLmxlbmd0aC0xLGI9blswXSx3PW5beV0sXz0hYTtwPD1oJiZkPD15OylyKHYpP3Y9dFsrK3BdOnIobSk/bT10Wy0taF06dm4odixiKT8oVCh2LGIsaSksdj10WysrcF0sYj1uWysrZF0pOnZuKG0sdyk/KFQobSx3LGkpLG09dFstLWhdLHc9blstLXldKTp2bih2LHcpPyhUKHYsdyxpKSxfJiZqLmluc2VydEJlZm9yZShlLHYuZWxtLGoubmV4dFNpYmxpbmcobS5lbG0pKSx2PXRbKytwXSx3PW5bLS15XSk6dm4obSxiKT8oVChtLGIsaSksXyYmai5pbnNlcnRCZWZvcmUoZSxtLmVsbSx2LmVsbSksbT10Wy0taF0sYj1uWysrZF0pOihyKHMpJiYocz15bih0LHAsaCkpLGM9byhiLmtleSk/c1tiLmtleV06QyhiLHQscCxoKSxyKGMpP3UoYixpLGUsdi5lbG0sITEsbixkKToobD10W2NdLHZuKGwsYik/KFQobCxiLGkpLHRbY109dm9pZCAwLF8mJmouaW5zZXJ0QmVmb3JlKGUsbC5lbG0sdi5lbG0pKTp1KGIsaSxlLHYuZWxtLCExLG4sZCkpLGI9blsrK2RdKTtwPmg/KGY9cihuW3krMV0pP251bGw6blt5KzFdLmVsbSxnKGUsZixuLGQseSxpKSk6ZD55JiZ4KGUsdCxwLGgpfWZ1bmN0aW9uIEMoZSx0LG4scil7Zm9yKHZhciBpPW47aTxyO2krKyl7dmFyIGE9dFtpXTtpZihvKGEpJiZ2bihlLGEpKXJldHVybiBpfX1mdW5jdGlvbiBUKGUsdCxuLGEpe2lmKGUhPT10KXt2YXIgcz10LmVsbT1lLmVsbTtpZihpKGUuaXNBc3luY1BsYWNlaG9sZGVyKSlyZXR1cm4gdm9pZChvKHQuYXN5bmNGYWN0b3J5LnJlc29sdmVkKT9BKGUuZWxtLHQsbik6dC5pc0FzeW5jUGxhY2Vob2xkZXI9ITApO2lmKGkodC5pc1N0YXRpYykmJmkoZS5pc1N0YXRpYykmJnQua2V5PT09ZS5rZXkmJihpKHQuaXNDbG9uZWQpfHxpKHQuaXNPbmNlKSkpcmV0dXJuIHZvaWQodC5jb21wb25lbnRJbnN0YW5jZT1lLmNvbXBvbmVudEluc3RhbmNlKTt2YXIgdSxjPXQuZGF0YTtvKGMpJiZvKHU9Yy5ob29rKSYmbyh1PXUucHJlcGF0Y2gpJiZ1KGUsdCk7dmFyIGw9ZS5jaGlsZHJlbixmPXQuY2hpbGRyZW47aWYobyhjKSYmdih0KSl7Zm9yKHU9MDt1PEUudXBkYXRlLmxlbmd0aDsrK3UpRS51cGRhdGVbdV0oZSx0KTtvKHU9Yy5ob29rKSYmbyh1PXUudXBkYXRlKSYmdShlLHQpfXIodC50ZXh0KT9vKGwpJiZvKGYpP2whPT1mJiZfKHMsbCxmLG4sYSk6byhmKT8obyhlLnRleHQpJiZqLnNldFRleHRDb250ZW50KHMsIiIpLGcocyxudWxsLGYsMCxmLmxlbmd0aC0xLG4pKTpvKGwpP3gocyxsLDAsbC5sZW5ndGgtMSk6byhlLnRleHQpJiZqLnNldFRleHRDb250ZW50KHMsIiIpOmUudGV4dCE9PXQudGV4dCYmai5zZXRUZXh0Q29udGVudChzLHQudGV4dCksbyhjKSYmbyh1PWMuaG9vaykmJm8odT11LnBvc3RwYXRjaCkmJnUoZSx0KX19ZnVuY3Rpb24gayhlLHQsbil7aWYoaShuKSYmbyhlLnBhcmVudCkpZS5wYXJlbnQuZGF0YS5wZW5kaW5nSW5zZXJ0PXQ7ZWxzZSBmb3IodmFyIHI9MDtyPHQubGVuZ3RoOysrcil0W3JdLmRhdGEuaG9vay5pbnNlcnQodFtyXSl9ZnVuY3Rpb24gQShlLHQsbixyKXt2YXIgYSxzPXQudGFnLHU9dC5kYXRhLGM9dC5jaGlsZHJlbjtpZihyPXJ8fHUmJnUucHJlLHQuZWxtPWUsaSh0LmlzQ29tbWVudCkmJm8odC5hc3luY0ZhY3RvcnkpKXJldHVybiB0LmlzQXN5bmNQbGFjZWhvbGRlcj0hMCwhMDtpZihvKHUpJiYobyhhPXUuaG9vaykmJm8oYT1hLmluaXQpJiZhKHQsITApLG8oYT10LmNvbXBvbmVudEluc3RhbmNlKSkpcmV0dXJuIGwodCxuKSwhMDtpZihvKHMpKXtpZihvKGMpKWlmKGUuaGFzQ2hpbGROb2RlcygpKWlmKG8oYT11KSYmbyhhPWEuZG9tUHJvcHMpJiZvKGE9YS5pbm5lckhUTUwpKXtpZihhIT09ZS5pbm5lckhUTUwpcmV0dXJuITF9ZWxzZXtmb3IodmFyIGY9ITAscD1lLmZpcnN0Q2hpbGQsaD0wO2g8Yy5sZW5ndGg7aCsrKXtpZighcHx8IUEocCxjW2hdLG4scikpe2Y9ITE7YnJlYWt9cD1wLm5leHRTaWJsaW5nfWlmKCFmfHxwKXJldHVybiExfWVsc2UgZCh0LGMsbik7aWYobyh1KSl7dmFyIHY9ITE7Zm9yKHZhciB5IGluIHUpaWYoIU4oeSkpe3Y9ITAsbSh0LG4pO2JyZWFrfSF2JiZ1LmNsYXNzJiZjZSh1LmNsYXNzKX19ZWxzZSBlLmRhdGEhPT10LnRleHQmJihlLmRhdGE9dC50ZXh0KTtyZXR1cm4hMH12YXIgUywkLEU9e30sTz1lLm1vZHVsZXMsaj1lLm5vZGVPcHM7Zm9yKFM9MDtTPGFzLmxlbmd0aDsrK1MpZm9yKEVbYXNbU11dPVtdLCQ9MDskPE8ubGVuZ3RoOysrJClvKE9bJF1bYXNbU11dKSYmRVthc1tTXV0ucHVzaChPWyRdW2FzW1NdXSk7dmFyIE49aCgiYXR0cnMsY2xhc3Msc3RhdGljQ2xhc3Msc3RhdGljU3R5bGUsa2V5Iik7cmV0dXJuIGZ1bmN0aW9uKGUsbixhLHMsYyxsKXtpZihyKG4pKXJldHVybiB2b2lkKG8oZSkmJmIoZSkpO3ZhciBmPSExLHA9W107aWYocihlKSlmPSEwLHUobixwLGMsbCk7ZWxzZXt2YXIgZD1vKGUubm9kZVR5cGUpO2lmKCFkJiZ2bihlLG4pKVQoZSxuLHAscyk7ZWxzZXtpZihkKXtpZigxPT09ZS5ub2RlVHlwZSYmZS5oYXNBdHRyaWJ1dGUoeGkpJiYoZS5yZW1vdmVBdHRyaWJ1dGUoeGkpLGE9ITApLGkoYSkmJkEoZSxuLHApKXJldHVybiBrKG4scCwhMCksZTtlPXQoZSl9dmFyIGg9ZS5lbG0sbT1qLnBhcmVudE5vZGUoaCk7aWYodShuLHAsaC5fbGVhdmVDYj9udWxsOm0sai5uZXh0U2libGluZyhoKSksbyhuLnBhcmVudCkpZm9yKHZhciB5PW4ucGFyZW50LGc9dihuKTt5Oyl7Zm9yKHZhciB3PTA7dzxFLmRlc3Ryb3kubGVuZ3RoOysrdylFLmRlc3Ryb3lbd10oeSk7aWYoeS5lbG09bi5lbG0sZyl7Zm9yKHZhciBfPTA7XzxFLmNyZWF0ZS5sZW5ndGg7KytfKUUuY3JlYXRlW19dKGlzLHkpO3ZhciBDPXkuZGF0YS5ob29rLmluc2VydDtpZihDLm1lcmdlZClmb3IodmFyIFM9MTtTPEMuZm5zLmxlbmd0aDtTKyspQy5mbnNbU10oKX1lbHNlIGhuKHkpO3k9eS5wYXJlbnR9byhtKT94KG0sW2VdLDAsMCk6byhlLnRhZykmJmIoZSl9fXJldHVybiBrKG4scCxmKSxuLmVsbX19KHtub2RlT3BzOnJzLG1vZHVsZXM6UnN9KTtqaSYmZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigic2VsZWN0aW9uY2hhbmdlIixmdW5jdGlvbigpe3ZhciBlPWRvY3VtZW50LmFjdGl2ZUVsZW1lbnQ7ZSYmZS52bW9kZWwmJmpyKGUsImlucHV0Iil9KTt2YXIgTXM9e2luc2VydGVkOmZ1bmN0aW9uKGUsdCxuLHIpeyJzZWxlY3QiPT09bi50YWc/KHIuZWxtJiYhci5lbG0uX3ZPcHRpb25zP2RlKG4sInBvc3RwYXRjaCIsZnVuY3Rpb24oKXtNcy5jb21wb25lbnRVcGRhdGVkKGUsdCxuKX0pOmtyKGUsdCxuLmNvbnRleHQpLGUuX3ZPcHRpb25zPVtdLm1hcC5jYWxsKGUub3B0aW9ucywkcikpOigidGV4dGFyZWEiPT09bi50YWd8fG5zKGUudHlwZSkpJiYoZS5fdk1vZGlmaWVycz10Lm1vZGlmaWVycyx0Lm1vZGlmaWVycy5sYXp5fHwoZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbnN0YXJ0IixFciksZS5hZGRFdmVudExpc3RlbmVyKCJjb21wb3NpdGlvbmVuZCIsT3IpLGUuYWRkRXZlbnRMaXN0ZW5lcigiY2hhbmdlIixPciksamkmJihlLnZtb2RlbD0hMCkpKX0sY29tcG9uZW50VXBkYXRlZDpmdW5jdGlvbihlLHQsbil7aWYoInNlbGVjdCI9PT1uLnRhZyl7a3IoZSx0LG4uY29udGV4dCk7dmFyIHI9ZS5fdk9wdGlvbnMsbz1lLl92T3B0aW9ucz1bXS5tYXAuY2FsbChlLm9wdGlvbnMsJHIpO2lmKG8uc29tZShmdW5jdGlvbihlLHQpe3JldHVybiFUKGUsclt0XSl9KSl7KGUubXVsdGlwbGU/dC52YWx1ZS5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiBTcihlLG8pfSk6dC52YWx1ZSE9PXQub2xkVmFsdWUmJlNyKHQudmFsdWUsbykpJiZqcihlLCJjaGFuZ2UiKX19fX0scXM9e2JpbmQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXQudmFsdWU7bj1OcihuKTt2YXIgbz1uLmRhdGEmJm4uZGF0YS50cmFuc2l0aW9uLGk9ZS5fX3ZPcmlnaW5hbERpc3BsYXk9Im5vbmUiPT09ZS5zdHlsZS5kaXNwbGF5PyIiOmUuc3R5bGUuZGlzcGxheTtyJiZvPyhuLmRhdGEuc2hvdz0hMCx4cihuLGZ1bmN0aW9uKCl7ZS5zdHlsZS5kaXNwbGF5PWl9KSk6ZS5zdHlsZS5kaXNwbGF5PXI/aToibm9uZSJ9LHVwZGF0ZTpmdW5jdGlvbihlLHQsbil7dmFyIHI9dC52YWx1ZTshciE9IXQub2xkVmFsdWUmJihuPU5yKG4pLG4uZGF0YSYmbi5kYXRhLnRyYW5zaXRpb24/KG4uZGF0YS5zaG93PSEwLHI/eHIobixmdW5jdGlvbigpe2Uuc3R5bGUuZGlzcGxheT1lLl9fdk9yaWdpbmFsRGlzcGxheX0pOndyKG4sZnVuY3Rpb24oKXtlLnN0eWxlLmRpc3BsYXk9Im5vbmUifSkpOmUuc3R5bGUuZGlzcGxheT1yP2UuX192T3JpZ2luYWxEaXNwbGF5OiJub25lIil9LHVuYmluZDpmdW5jdGlvbihlLHQsbixyLG8pe298fChlLnN0eWxlLmRpc3BsYXk9ZS5fX3ZPcmlnaW5hbERpc3BsYXkpfX0sSHM9e21vZGVsOk1zLHNob3c6cXN9LEZzPXtuYW1lOlN0cmluZyxhcHBlYXI6Qm9vbGVhbixjc3M6Qm9vbGVhbixtb2RlOlN0cmluZyx0eXBlOlN0cmluZyxlbnRlckNsYXNzOlN0cmluZyxsZWF2ZUNsYXNzOlN0cmluZyxlbnRlclRvQ2xhc3M6U3RyaW5nLGxlYXZlVG9DbGFzczpTdHJpbmcsZW50ZXJBY3RpdmVDbGFzczpTdHJpbmcsbGVhdmVBY3RpdmVDbGFzczpTdHJpbmcsYXBwZWFyQ2xhc3M6U3RyaW5nLGFwcGVhckFjdGl2ZUNsYXNzOlN0cmluZyxhcHBlYXJUb0NsYXNzOlN0cmluZyxkdXJhdGlvbjpbTnVtYmVyLFN0cmluZyxPYmplY3RdfSxCcz17bmFtZToidHJhbnNpdGlvbiIscHJvcHM6RnMsYWJzdHJhY3Q6ITAscmVuZGVyOmZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMsbj10aGlzLiRzbG90cy5kZWZhdWx0O2lmKG4mJihuPW4uZmlsdGVyKGZ1bmN0aW9uKGUpe3JldHVybiBlLnRhZ3x8Q2UoZSl9KSxuLmxlbmd0aCkpe3ZhciByPXRoaXMubW9kZSxvPW5bMF07aWYoUnIodGhpcy4kdm5vZGUpKXJldHVybiBvO3ZhciBpPUxyKG8pO2lmKCFpKXJldHVybiBvO2lmKHRoaXMuX2xlYXZpbmcpcmV0dXJuIElyKGUsbyk7dmFyIGE9Il9fdHJhbnNpdGlvbi0iK3RoaXMuX3VpZCsiLSI7aS5rZXk9bnVsbD09aS5rZXk/aS5pc0NvbW1lbnQ/YSsiY29tbWVudCI6YStpLnRhZzpzKGkua2V5KT8wPT09U3RyaW5nKGkua2V5KS5pbmRleE9mKGEpP2kua2V5OmEraS5rZXk6aS5rZXk7dmFyIHU9KGkuZGF0YXx8KGkuZGF0YT17fSkpLnRyYW5zaXRpb249RHIodGhpcyksYz10aGlzLl92bm9kZSxsPUxyKGMpO2lmKGkuZGF0YS5kaXJlY3RpdmVzJiZpLmRhdGEuZGlyZWN0aXZlcy5zb21lKGZ1bmN0aW9uKGUpe3JldHVybiJzaG93Ij09PWUubmFtZX0pJiYoaS5kYXRhLnNob3c9ITApLGwmJmwuZGF0YSYmIVByKGksbCkmJiFDZShsKSYmKCFsLmNvbXBvbmVudEluc3RhbmNlfHwhbC5jb21wb25lbnRJbnN0YW5jZS5fdm5vZGUuaXNDb21tZW50KSl7dmFyIGY9bC5kYXRhLnRyYW5zaXRpb249dyh7fSx1KTtpZigib3V0LWluIj09PXIpcmV0dXJuIHRoaXMuX2xlYXZpbmc9ITAsZGUoZiwiYWZ0ZXJMZWF2ZSIsZnVuY3Rpb24oKXt0Ll9sZWF2aW5nPSExLHQuJGZvcmNlVXBkYXRlKCl9KSxJcihlLG8pO2lmKCJpbi1vdXQiPT09cil7aWYoQ2UoaSkpcmV0dXJuIGM7dmFyIHAsZD1mdW5jdGlvbigpe3AoKX07ZGUodSwiYWZ0ZXJFbnRlciIsZCksZGUodSwiZW50ZXJDYW5jZWxsZWQiLGQpLGRlKGYsImRlbGF5TGVhdmUiLGZ1bmN0aW9uKGUpe3A9ZX0pfX1yZXR1cm4gb319fSxVcz13KHt0YWc6U3RyaW5nLG1vdmVDbGFzczpTdHJpbmd9LEZzKTtkZWxldGUgVXMubW9kZTt2YXIgV3M9e3Byb3BzOlVzLHJlbmRlcjpmdW5jdGlvbihlKXtmb3IodmFyIHQ9dGhpcy50YWd8fHRoaXMuJHZub2RlLmRhdGEudGFnfHwic3BhbiIsbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dGhpcy5wcmV2Q2hpbGRyZW49dGhpcy5jaGlsZHJlbixvPXRoaXMuJHNsb3RzLmRlZmF1bHR8fFtdLGk9dGhpcy5jaGlsZHJlbj1bXSxhPURyKHRoaXMpLHM9MDtzPG8ubGVuZ3RoO3MrKyl7dmFyIHU9b1tzXTtpZih1LnRhZylpZihudWxsIT11LmtleSYmMCE9PVN0cmluZyh1LmtleSkuaW5kZXhPZigiX192bGlzdCIpKWkucHVzaCh1KSxuW3Uua2V5XT11LCh1LmRhdGF8fCh1LmRhdGE9e30pKS50cmFuc2l0aW9uPWE7ZWxzZTt9aWYocil7Zm9yKHZhciBjPVtdLGw9W10sZj0wO2Y8ci5sZW5ndGg7ZisrKXt2YXIgcD1yW2ZdO3AuZGF0YS50cmFuc2l0aW9uPWEscC5kYXRhLnBvcz1wLmVsbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxuW3Aua2V5XT9jLnB1c2gocCk6bC5wdXNoKHApfXRoaXMua2VwdD1lKHQsbnVsbCxjKSx0aGlzLnJlbW92ZWQ9bH1yZXR1cm4gZSh0LG51bGwsaSl9LGJlZm9yZVVwZGF0ZTpmdW5jdGlvbigpe3RoaXMuX19wYXRjaF9fKHRoaXMuX3Zub2RlLHRoaXMua2VwdCwhMSwhMCksdGhpcy5fdm5vZGU9dGhpcy5rZXB0fSx1cGRhdGVkOmZ1bmN0aW9uKCl7dmFyIGU9dGhpcy5wcmV2Q2hpbGRyZW4sdD10aGlzLm1vdmVDbGFzc3x8KHRoaXMubmFtZXx8InYiKSsiLW1vdmUiO2UubGVuZ3RoJiZ0aGlzLmhhc01vdmUoZVswXS5lbG0sdCkmJihlLmZvckVhY2goTXIpLGUuZm9yRWFjaChxciksZS5mb3JFYWNoKEhyKSx0aGlzLl9yZWZsb3c9ZG9jdW1lbnQuYm9keS5vZmZzZXRIZWlnaHQsZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe2lmKGUuZGF0YS5tb3ZlZCl7dmFyIG49ZS5lbG0scj1uLnN0eWxlO2hyKG4sdCksci50cmFuc2Zvcm09ci5XZWJraXRUcmFuc2Zvcm09ci50cmFuc2l0aW9uRHVyYXRpb249IiIsbi5hZGRFdmVudExpc3RlbmVyKEVzLG4uX21vdmVDYj1mdW5jdGlvbiBlKHIpe3ImJiEvdHJhbnNmb3JtJC8udGVzdChyLnByb3BlcnR5TmFtZSl8fChuLnJlbW92ZUV2ZW50TGlzdGVuZXIoRXMsZSksbi5fbW92ZUNiPW51bGwsdnIobix0KSl9KX19KSl9LG1ldGhvZHM6e2hhc01vdmU6ZnVuY3Rpb24oZSx0KXtpZigha3MpcmV0dXJuITE7aWYodGhpcy5faGFzTW92ZSlyZXR1cm4gdGhpcy5faGFzTW92ZTt2YXIgbj1lLmNsb25lTm9kZSgpO2UuX3RyYW5zaXRpb25DbGFzc2VzJiZlLl90cmFuc2l0aW9uQ2xhc3Nlcy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2ZyKG4sZSl9KSxscihuLHQpLG4uc3R5bGUuZGlzcGxheT0ibm9uZSIsdGhpcy4kZWwuYXBwZW5kQ2hpbGQobik7dmFyIHI9eXIobik7cmV0dXJuIHRoaXMuJGVsLnJlbW92ZUNoaWxkKG4pLHRoaXMuX2hhc01vdmU9ci5oYXNUcmFuc2Zvcm19fX0senM9e1RyYW5zaXRpb246QnMsVHJhbnNpdGlvbkdyb3VwOldzfTtEdC5jb25maWcubXVzdFVzZVByb3A9VWEsRHQuY29uZmlnLmlzUmVzZXJ2ZWRUYWc9ZXMsRHQuY29uZmlnLmlzUmVzZXJ2ZWRBdHRyPUZhLER0LmNvbmZpZy5nZXRUYWdOYW1lc3BhY2U9UXQsRHQuY29uZmlnLmlzVW5rbm93bkVsZW1lbnQ9WnQsdyhEdC5vcHRpb25zLmRpcmVjdGl2ZXMsSHMpLHcoRHQub3B0aW9ucy5jb21wb25lbnRzLHpzKSxEdC5wcm90b3R5cGUuX19wYXRjaF9fPUFpP1BzOkMsRHQucHJvdG90eXBlLiRtb3VudD1mdW5jdGlvbihlLHQpe3JldHVybiBlPWUmJkFpP2VuKGUpOnZvaWQgMCxMZSh0aGlzLGUsdCl9LEFpJiZzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Q2kuZGV2dG9vbHMmJkhpJiZIaS5lbWl0KCJpbml0IixEdCl9LDApO3ZhciBWcyxYcz0vXHtceygoPzoufFxuKSs/KVx9XH0vZyxKcz0vWy0uKis/XiR7fSgpfFtcXVwvXFxdL2csS3M9eShmdW5jdGlvbihlKXt2YXIgdD1lWzBdLnJlcGxhY2UoSnMsIlxcJCYiKSxuPWVbMV0ucmVwbGFjZShKcywiXFwkJiIpO3JldHVybiBuZXcgUmVnRXhwKHQrIigoPzoufFxcbikrPykiK24sImciKX0pLEdzPXtzdGF0aWNLZXlzOlsic3RhdGljQ2xhc3MiXSx0cmFuc2Zvcm1Ob2RlOkJyLGdlbkRhdGE6VXJ9LFlzPXtzdGF0aWNLZXlzOlsic3RhdGljU3R5bGUiXSx0cmFuc2Zvcm1Ob2RlOldyLGdlbkRhdGE6enJ9LFFzPXtkZWNvZGU6ZnVuY3Rpb24oZSl7cmV0dXJuIFZzPVZzfHxkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKSxWcy5pbm5lckhUTUw9ZSxWcy50ZXh0Q29udGVudH19LFpzPWgoImFyZWEsYmFzZSxicixjb2wsZW1iZWQsZnJhbWUsaHIsaW1nLGlucHV0LGlzaW5kZXgsa2V5Z2VuLGxpbmssbWV0YSxwYXJhbSxzb3VyY2UsdHJhY2ssd2JyIiksZXU9aCgiY29sZ3JvdXAsZGQsZHQsbGksb3B0aW9ucyxwLHRkLHRmb290LHRoLHRoZWFkLHRyLHNvdXJjZSIpLHR1PWgoImFkZHJlc3MsYXJ0aWNsZSxhc2lkZSxiYXNlLGJsb2NrcXVvdGUsYm9keSxjYXB0aW9uLGNvbCxjb2xncm91cCxkZCxkZXRhaWxzLGRpYWxvZyxkaXYsZGwsZHQsZmllbGRzZXQsZmlnY2FwdGlvbixmaWd1cmUsZm9vdGVyLGZvcm0saDEsaDIsaDMsaDQsaDUsaDYsaGVhZCxoZWFkZXIsaGdyb3VwLGhyLGh0bWwsbGVnZW5kLGxpLG1lbnVpdGVtLG1ldGEsb3B0Z3JvdXAsb3B0aW9uLHBhcmFtLHJwLHJ0LHNvdXJjZSxzdHlsZSxzdW1tYXJ5LHRib2R5LHRkLHRmb290LHRoLHRoZWFkLHRpdGxlLHRyLHRyYWNrIiksbnU9L15ccyooW15ccyInPD5cLz1dKykoPzpccyooPSlccyooPzoiKFteIl0qKSIrfCcoW14nXSopJyt8KFteXHMiJz08PmBdKykpKT8vLHJ1PSJbYS16QS1aX11bXFx3XFwtXFwuXSoiLG91PSIoKD86IitydSsiXFw6KT8iK3J1KyIpIixpdT1uZXcgUmVnRXhwKCJePCIrb3UpLGF1PS9eXHMqKFwvPyk+LyxzdT1uZXcgUmVnRXhwKCJePFxcLyIrb3UrIltePl0qPiIpLHV1PS9ePCFET0NUWVBFIFtePl0rPi9pLGN1PS9ePCFcLS0vLGx1PS9ePCFcWy8sZnU9ITE7IngiLnJlcGxhY2UoL3goLik/L2csZnVuY3Rpb24oZSx0KXtmdT0iIj09PXR9KTt2YXIgcHUsZHUsaHUsdnUsbXUseXUsZ3UsYnUseHUsd3UsX3UsQ3U9aCgic2NyaXB0LHN0eWxlLHRleHRhcmVhIiwhMCksVHU9e30sa3U9eyImbHQ7IjoiPCIsIiZndDsiOiI+IiwiJnF1b3Q7IjonIicsIiZhbXA7IjoiJiIsIiYjMTA7IjoiXG4iLCImIzk7IjoiXHQifSxBdT0vJig/Omx0fGd0fHF1b3R8YW1wKTsvZyxTdT0vJig/Omx0fGd0fHF1b3R8YW1wfCMxMHwjOSk7L2csJHU9aCgicHJlLHRleHRhcmVhIiwhMCksRXU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZSYmJHUoZSkmJiJcbiI9PT10WzBdfSxPdT0vXkB8XnYtb246LyxqdT0vXnYtfF5AfF46LyxOdT0vKFteXSo/KVxzKyg/OmlufG9mKVxzKyhbXl0qKS8sTHU9LywoW14sXH1cXV0qKSg/OiwoW14sXH1cXV0qKSk/JC8sRHU9L15cKHxcKSQvZyxJdT0vOiguKikkLyxSdT0vXjp8XnYtYmluZDovLFB1PS9cLlteLl0rL2csTXU9eShRcy5kZWNvZGUpLHF1PS9eeG1sbnM6TlNcZCsvLEh1PS9eTlNcZCs6LyxGdT17cHJlVHJhbnNmb3JtTm9kZTpnb30sQnU9W0dzLFlzLEZ1XSxVdT17bW9kZWw6Vm4sdGV4dDp4byxodG1sOndvfSxXdT17ZXhwZWN0SFRNTDohMCxtb2R1bGVzOkJ1LGRpcmVjdGl2ZXM6VXUsaXNQcmVUYWc6WmEsaXNVbmFyeVRhZzpacyxtdXN0VXNlUHJvcDpVYSxjYW5CZUxlZnRPcGVuVGFnOmV1LGlzUmVzZXJ2ZWRUYWc6ZXMsZ2V0VGFnTmFtZXNwYWNlOlF0LHN0YXRpY0tleXM6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucmVkdWNlKGZ1bmN0aW9uKGUsdCl7cmV0dXJuIGUuY29uY2F0KHQuc3RhdGljS2V5c3x8W10pfSxbXSkuam9pbigiLCIpfShCdSl9LHp1PXkoQ28pLFZ1PS9eKFtcdyRfXSt8XChbXildKj9cKSlccyo9PnxeZnVuY3Rpb25ccypcKC8sWHU9L15bQS1aYS16XyRdW1x3JF0qKD86XC5bQS1aYS16XyRdW1x3JF0qfFxbJ1teJ10qPyddfFxbIlteIl0qPyJdfFxbXGQrXXxcW1tBLVphLXpfJF1bXHckXSpdKSokLyxKdT17ZXNjOjI3LHRhYjo5LGVudGVyOjEzLHNwYWNlOjMyLHVwOjM4LGxlZnQ6MzcscmlnaHQ6MzksZG93bjo0MCxkZWxldGU6WzgsNDZdfSxLdT17ZXNjOiJFc2NhcGUiLHRhYjoiVGFiIixlbnRlcjoiRW50ZXIiLHNwYWNlOiIgIix1cDpbIlVwIiwiQXJyb3dVcCJdLGxlZnQ6WyJMZWZ0IiwiQXJyb3dMZWZ0Il0scmlnaHQ6WyJSaWdodCIsIkFycm93UmlnaHQiXSxkb3duOlsiRG93biIsIkFycm93RG93biJdLGRlbGV0ZTpbIkJhY2tzcGFjZSIsIkRlbGV0ZSJdfSxHdT1mdW5jdGlvbihlKXtyZXR1cm4iaWYoIitlKyIpcmV0dXJuIG51bGw7In0sWXU9e3N0b3A6IiRldmVudC5zdG9wUHJvcGFnYXRpb24oKTsiLHByZXZlbnQ6IiRldmVudC5wcmV2ZW50RGVmYXVsdCgpOyIsc2VsZjpHdSgiJGV2ZW50LnRhcmdldCAhPT0gJGV2ZW50LmN1cnJlbnRUYXJnZXQiKSxjdHJsOkd1KCIhJGV2ZW50LmN0cmxLZXkiKSxzaGlmdDpHdSgiISRldmVudC5zaGlmdEtleSIpLGFsdDpHdSgiISRldmVudC5hbHRLZXkiKSxtZXRhOkd1KCIhJGV2ZW50Lm1ldGFLZXkiKSxsZWZ0Okd1KCInYnV0dG9uJyBpbiAkZXZlbnQgJiYgJGV2ZW50LmJ1dHRvbiAhPT0gMCIpLG1pZGRsZTpHdSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDEiKSxyaWdodDpHdSgiJ2J1dHRvbicgaW4gJGV2ZW50ICYmICRldmVudC5idXR0b24gIT09IDIiKX0sUXU9e29uOk5vLGJpbmQ6TG8sY2xvYWs6Q30sWnU9ZnVuY3Rpb24oZSl7dGhpcy5vcHRpb25zPWUsdGhpcy53YXJuPWUud2Fybnx8RW4sdGhpcy50cmFuc2Zvcm1zPU9uKGUubW9kdWxlcywidHJhbnNmb3JtQ29kZSIpLHRoaXMuZGF0YUdlbkZucz1PbihlLm1vZHVsZXMsImdlbkRhdGEiKSx0aGlzLmRpcmVjdGl2ZXM9dyh3KHt9LFF1KSxlLmRpcmVjdGl2ZXMpO3ZhciB0PWUuaXNSZXNlcnZlZFRhZ3x8Z2k7dGhpcy5tYXliZUNvbXBvbmVudD1mdW5jdGlvbihlKXtyZXR1cm4hdChlLnRhZyl9LHRoaXMub25jZUlkPTAsdGhpcy5zdGF0aWNSZW5kZXJGbnM9W119LGVjPShuZXcgUmVnRXhwKCJcXGIiKyJkbyxpZixmb3IsbGV0LG5ldyx0cnksdmFyLGNhc2UsZWxzZSx3aXRoLGF3YWl0LGJyZWFrLGNhdGNoLGNsYXNzLGNvbnN0LHN1cGVyLHRocm93LHdoaWxlLHlpZWxkLGRlbGV0ZSxleHBvcnQsaW1wb3J0LHJldHVybixzd2l0Y2gsZGVmYXVsdCxleHRlbmRzLGZpbmFsbHksY29udGludWUsZGVidWdnZXIsZnVuY3Rpb24sYXJndW1lbnRzIi5zcGxpdCgiLCIpLmpvaW4oIlxcYnxcXGIiKSsiXFxiIiksbmV3IFJlZ0V4cCgiXFxiIisiZGVsZXRlLHR5cGVvZix2b2lkIi5zcGxpdCgiLCIpLmpvaW4oIlxccypcXChbXlxcKV0qXFwpfFxcYiIpKyJcXHMqXFwoW15cXCldKlxcKSIpLGZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXtmdW5jdGlvbiBuKG4scil7dmFyIG89T2JqZWN0LmNyZWF0ZSh0KSxpPVtdLGE9W107aWYoby53YXJuPWZ1bmN0aW9uKGUsdCl7KHQ/YTppKS5wdXNoKGUpfSxyKXtyLm1vZHVsZXMmJihvLm1vZHVsZXM9KHQubW9kdWxlc3x8W10pLmNvbmNhdChyLm1vZHVsZXMpKSxyLmRpcmVjdGl2ZXMmJihvLmRpcmVjdGl2ZXM9dyhPYmplY3QuY3JlYXRlKHQuZGlyZWN0aXZlc3x8bnVsbCksci5kaXJlY3RpdmVzKSk7Zm9yKHZhciBzIGluIHIpIm1vZHVsZXMiIT09cyYmImRpcmVjdGl2ZXMiIT09cyYmKG9bc109cltzXSl9dmFyIHU9ZShuLG8pO3JldHVybiB1LmVycm9ycz1pLHUudGlwcz1hLHV9cmV0dXJue2NvbXBpbGU6bixjb21waWxlVG9GdW5jdGlvbnM6b2kobil9fX0oZnVuY3Rpb24oZSx0KXt2YXIgbj1LcihlLnRyaW0oKSx0KTshMSE9PXQub3B0aW1pemUmJl9vKG4sdCk7dmFyIHI9RG8obix0KTtyZXR1cm57YXN0Om4scmVuZGVyOnIucmVuZGVyLHN0YXRpY1JlbmRlckZuczpyLnN0YXRpY1JlbmRlckZuc319KSksdGM9ZWMoV3UpLG5jPXRjLmNvbXBpbGVUb0Z1bmN0aW9ucyxyYz0hIUFpJiZpaSghMSksb2M9ISFBaSYmaWkoITApLGljPXkoZnVuY3Rpb24oZSl7dmFyIHQ9ZW4oZSk7cmV0dXJuIHQmJnQuaW5uZXJIVE1MfSksYWM9RHQucHJvdG90eXBlLiRtb3VudDtEdC5wcm90b3R5cGUuJG1vdW50PWZ1bmN0aW9uKGUsdCl7aWYoKGU9ZSYmZW4oZSkpPT09ZG9jdW1lbnQuYm9keXx8ZT09PWRvY3VtZW50LmRvY3VtZW50RWxlbWVudClyZXR1cm4gdGhpczt2YXIgbj10aGlzLiRvcHRpb25zO2lmKCFuLnJlbmRlcil7dmFyIHI9bi50ZW1wbGF0ZTtpZihyKWlmKCJzdHJpbmciPT10eXBlb2YgcikiIyI9PT1yLmNoYXJBdCgwKSYmKHI9aWMocikpO2Vsc2V7aWYoIXIubm9kZVR5cGUpcmV0dXJuIHRoaXM7cj1yLmlubmVySFRNTH1lbHNlIGUmJihyPWFpKGUpKTtpZihyKXt2YXIgbz1uYyhyLHtzaG91bGREZWNvZGVOZXdsaW5lczpyYyxzaG91bGREZWNvZGVOZXdsaW5lc0ZvckhyZWY6b2MsZGVsaW1pdGVyczpuLmRlbGltaXRlcnMsY29tbWVudHM6bi5jb21tZW50c30sdGhpcyksaT1vLnJlbmRlcixhPW8uc3RhdGljUmVuZGVyRm5zO24ucmVuZGVyPWksbi5zdGF0aWNSZW5kZXJGbnM9YX19cmV0dXJuIGFjLmNhbGwodGhpcyxlLHQpfSxEdC5jb21waWxlPW5jLHQuYT1EdH0pLmNhbGwodCxuKDEwKSxuKDc2KS5zZXRJbW1lZGlhdGUpfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZih2b2lkIDA9PWUpdGhyb3cgVHlwZUVycm9yKCJDYW4ndCBjYWxsIG1ldGhvZCBvbiAgIitlKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXtlLmV4cG9ydHM9IW4oNCkoZnVuY3Rpb24oKXtyZXR1cm4gNyE9T2JqZWN0LmRlZmluZVByb3BlcnR5KHt9LCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/bnVsbCE9PWU6ImZ1bmN0aW9uIj09dHlwZW9mIGV9fSxmdW5jdGlvbihlLHQpe3ZhciBuO249ZnVuY3Rpb24oKXtyZXR1cm4gdGhpc30oKTt0cnl7bj1ufHxGdW5jdGlvbigicmV0dXJuIHRoaXMiKSgpfHwoMCxldmFsKSgidGhpcyIpfWNhdGNoKGUpeyJvYmplY3QiPT10eXBlb2Ygd2luZG93JiYobj13aW5kb3cpfWUuZXhwb3J0cz1ufSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPXtkZWZhdWx0Om4oNDEpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihlLHQpe3ZhciBuPXt9Lmhhc093blByb3BlcnR5O2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBuLmNhbGwoZSx0KX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQ1KTtlLmV4cG9ydHM9T2JqZWN0KCJ6IikucHJvcGVydHlJc0VudW1lcmFibGUoMCk/T2JqZWN0OmZ1bmN0aW9uKGUpe3JldHVybiJTdHJpbmciPT1yKGUpP2Uuc3BsaXQoIiIpOk9iamVjdChlKX19LGZ1bmN0aW9uKGUsdCl7ZS5leHBvcnRzPSJcdFxuXHZcZlxyIMKg4ZqA4aCO4oCA4oCB4oCC4oCD4oCE4oCF4oCG4oCH4oCI4oCJ4oCK4oCv4oGf44CAXHUyMDI4XHUyMDI5XHVmZWZmIn0sZnVuY3Rpb24oZSx0KXt2YXIgbj1NYXRoLmNlaWwscj1NYXRoLmZsb29yO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gaXNOYU4oZT0rZSk/MDooZT4wP3I6bikoZSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxMyksbz1uKDcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcihvKGUpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvOy8qIQotICogalF1ZXJ5IEphdmFTY3JpcHQgTGlicmFyeSB2My4zLjEKLSAqIGh0dHBzOi8vanF1ZXJ5LmNvbS8KLSAqCi0gKiBJbmNsdWRlcyBTaXp6bGUuanMKLSAqIGh0dHBzOi8vc2l6emxlanMuY29tLwotICoKLSAqIENvcHlyaWdodCBKUyBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQotICogaHR0cHM6Ly9qcXVlcnkub3JnL2xpY2Vuc2UKLSAqCi0gKiBEYXRlOiAyMDE4LTAxLTIwVDE3OjI0WgotICovCi0hZnVuY3Rpb24odCxuKXsidXNlIHN0cmljdCI7Im9iamVjdCI9PXR5cGVvZiBlJiYib2JqZWN0Ij09dHlwZW9mIGUuZXhwb3J0cz9lLmV4cG9ydHM9dC5kb2N1bWVudD9uKHQsITApOmZ1bmN0aW9uKGUpe2lmKCFlLmRvY3VtZW50KXRocm93IG5ldyBFcnJvcigialF1ZXJ5IHJlcXVpcmVzIGEgd2luZG93IHdpdGggYSBkb2N1bWVudCIpO3JldHVybiBuKGUpfTpuKHQpfSgidW5kZWZpbmVkIiE9dHlwZW9mIHdpbmRvdz93aW5kb3c6dGhpcyxmdW5jdGlvbihuLGkpeyJ1c2Ugc3RyaWN0IjtmdW5jdGlvbiBhKGUsdCxuKXt0PXR8fGxlO3ZhciByLG89dC5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtpZihvLnRleHQ9ZSxuKWZvcihyIGluIFRlKW5bcl0mJihvW3JdPW5bcl0pO3QuaGVhZC5hcHBlbmRDaGlsZChvKS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKG8pfWZ1bmN0aW9uIHMoZSl7cmV0dXJuIG51bGw9PWU/ZSsiIjoib2JqZWN0Ij09dHlwZW9mIGV8fCJmdW5jdGlvbiI9PXR5cGVvZiBlP21lW3llLmNhbGwoZSldfHwib2JqZWN0Ijp0eXBlb2YgZX1mdW5jdGlvbiB1KGUpe3ZhciB0PSEhZSYmImxlbmd0aCJpbiBlJiZlLmxlbmd0aCxuPXMoZSk7cmV0dXJuIV9lKGUpJiYhQ2UoZSkmJigiYXJyYXkiPT09bnx8MD09PXR8fCJudW1iZXIiPT10eXBlb2YgdCYmdD4wJiZ0LTEgaW4gZSl9ZnVuY3Rpb24gYyhlLHQpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10LnRvTG93ZXJDYXNlKCl9ZnVuY3Rpb24gbChlLHQsbil7cmV0dXJuIF9lKHQpP2tlLmdyZXAoZSxmdW5jdGlvbihlLHIpe3JldHVybiEhdC5jYWxsKGUscixlKSE9PW59KTp0Lm5vZGVUeXBlP2tlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gZT09PXQhPT1ufSk6InN0cmluZyIhPXR5cGVvZiB0P2tlLmdyZXAoZSxmdW5jdGlvbihlKXtyZXR1cm4gdmUuY2FsbCh0LGUpPi0xIT09bn0pOmtlLmZpbHRlcih0LGUsbil9ZnVuY3Rpb24gZihlLHQpe2Zvcig7KGU9ZVt0XSkmJjEhPT1lLm5vZGVUeXBlOyk7cmV0dXJuIGV9ZnVuY3Rpb24gcChlKXt2YXIgdD17fTtyZXR1cm4ga2UuZWFjaChlLm1hdGNoKFJlKXx8W10sZnVuY3Rpb24oZSxuKXt0W25dPSEwfSksdH1mdW5jdGlvbiBkKGUpe3JldHVybiBlfWZ1bmN0aW9uIGgoZSl7dGhyb3cgZX1mdW5jdGlvbiB2KGUsdCxuLHIpe3ZhciBvO3RyeXtlJiZfZShvPWUucHJvbWlzZSk/by5jYWxsKGUpLmRvbmUodCkuZmFpbChuKTplJiZfZShvPWUudGhlbik/by5jYWxsKGUsdCxuKTp0LmFwcGx5KHZvaWQgMCxbZV0uc2xpY2UocikpfWNhdGNoKGUpe24uYXBwbHkodm9pZCAwLFtlXSl9fWZ1bmN0aW9uIG0oKXtsZS5yZW1vdmVFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixtKSxuLnJlbW92ZUV2ZW50TGlzdGVuZXIoImxvYWQiLG0pLGtlLnJlYWR5KCl9ZnVuY3Rpb24geShlLHQpe3JldHVybiB0LnRvVXBwZXJDYXNlKCl9ZnVuY3Rpb24gZyhlKXtyZXR1cm4gZS5yZXBsYWNlKEhlLCJtcy0iKS5yZXBsYWNlKEZlLHkpfWZ1bmN0aW9uIGIoKXt0aGlzLmV4cGFuZG89a2UuZXhwYW5kbytiLnVpZCsrfWZ1bmN0aW9uIHgoZSl7cmV0dXJuInRydWUiPT09ZXx8ImZhbHNlIiE9PWUmJigibnVsbCI9PT1lP251bGw6ZT09PStlKyIiPytlOnplLnRlc3QoZSk/SlNPTi5wYXJzZShlKTplKX1mdW5jdGlvbiB3KGUsdCxuKXt2YXIgcjtpZih2b2lkIDA9PT1uJiYxPT09ZS5ub2RlVHlwZSlpZihyPSJkYXRhLSIrdC5yZXBsYWNlKFZlLCItJCYiKS50b0xvd2VyQ2FzZSgpLCJzdHJpbmciPT10eXBlb2Yobj1lLmdldEF0dHJpYnV0ZShyKSkpe3RyeXtuPXgobil9Y2F0Y2goZSl7fVdlLnNldChlLHQsbil9ZWxzZSBuPXZvaWQgMDtyZXR1cm4gbn1mdW5jdGlvbiBfKGUsdCxuLHIpe3ZhciBvLGksYT0yMCxzPXI/ZnVuY3Rpb24oKXtyZXR1cm4gci5jdXIoKX06ZnVuY3Rpb24oKXtyZXR1cm4ga2UuY3NzKGUsdCwiIil9LHU9cygpLGM9biYmblszXXx8KGtlLmNzc051bWJlclt0XT8iIjoicHgiKSxsPShrZS5jc3NOdW1iZXJbdF18fCJweCIhPT1jJiYrdSkmJkplLmV4ZWMoa2UuY3NzKGUsdCkpO2lmKGwmJmxbM10hPT1jKXtmb3IodS89MixjPWN8fGxbM10sbD0rdXx8MTthLS07KWtlLnN0eWxlKGUsdCxsK2MpLCgxLWkpKigxLShpPXMoKS91fHwuNSkpPD0wJiYoYT0wKSxsLz1pO2wqPTIsa2Uuc3R5bGUoZSx0LGwrYyksbj1ufHxbXX1yZXR1cm4gbiYmKGw9K2x8fCt1fHwwLG89blsxXT9sKyhuWzFdKzEpKm5bMl06K25bMl0sciYmKHIudW5pdD1jLHIuc3RhcnQ9bCxyLmVuZD1vKSksb31mdW5jdGlvbiBDKGUpe3ZhciB0LG49ZS5vd25lckRvY3VtZW50LHI9ZS5ub2RlTmFtZSxvPVFlW3JdO3JldHVybiBvfHwodD1uLmJvZHkuYXBwZW5kQ2hpbGQobi5jcmVhdGVFbGVtZW50KHIpKSxvPWtlLmNzcyh0LCJkaXNwbGF5IiksdC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHQpLCJub25lIj09PW8mJihvPSJibG9jayIpLFFlW3JdPW8sbyl9ZnVuY3Rpb24gVChlLHQpe2Zvcih2YXIgbixyLG89W10saT0wLGE9ZS5sZW5ndGg7aTxhO2krKylyPWVbaV0sci5zdHlsZSYmKG49ci5zdHlsZS5kaXNwbGF5LHQ/KCJub25lIj09PW4mJihvW2ldPVVlLmdldChyLCJkaXNwbGF5Iil8fG51bGwsb1tpXXx8KHIuc3R5bGUuZGlzcGxheT0iIikpLCIiPT09ci5zdHlsZS5kaXNwbGF5JiZHZShyKSYmKG9baV09QyhyKSkpOiJub25lIiE9PW4mJihvW2ldPSJub25lIixVZS5zZXQociwiZGlzcGxheSIsbikpKTtmb3IoaT0wO2k8YTtpKyspbnVsbCE9b1tpXSYmKGVbaV0uc3R5bGUuZGlzcGxheT1vW2ldKTtyZXR1cm4gZX1mdW5jdGlvbiBrKGUsdCl7dmFyIG47cmV0dXJuIG49dm9pZCAwIT09ZS5nZXRFbGVtZW50c0J5VGFnTmFtZT9lLmdldEVsZW1lbnRzQnlUYWdOYW1lKHR8fCIqIik6dm9pZCAwIT09ZS5xdWVyeVNlbGVjdG9yQWxsP2UucXVlcnlTZWxlY3RvckFsbCh0fHwiKiIpOltdLHZvaWQgMD09PXR8fHQmJmMoZSx0KT9rZS5tZXJnZShbZV0sbik6bn1mdW5jdGlvbiBBKGUsdCl7Zm9yKHZhciBuPTAscj1lLmxlbmd0aDtuPHI7bisrKVVlLnNldChlW25dLCJnbG9iYWxFdmFsIiwhdHx8VWUuZ2V0KHRbbl0sImdsb2JhbEV2YWwiKSl9ZnVuY3Rpb24gUyhlLHQsbixyLG8pe2Zvcih2YXIgaSxhLHUsYyxsLGYscD10LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxkPVtdLGg9MCx2PWUubGVuZ3RoO2g8djtoKyspaWYoKGk9ZVtoXSl8fDA9PT1pKWlmKCJvYmplY3QiPT09cyhpKSlrZS5tZXJnZShkLGkubm9kZVR5cGU/W2ldOmkpO2Vsc2UgaWYocnQudGVzdChpKSl7Zm9yKGE9YXx8cC5hcHBlbmRDaGlsZCh0LmNyZWF0ZUVsZW1lbnQoImRpdiIpKSx1PShldC5leGVjKGkpfHxbIiIsIiJdKVsxXS50b0xvd2VyQ2FzZSgpLGM9bnRbdV18fG50Ll9kZWZhdWx0LGEuaW5uZXJIVE1MPWNbMV0ra2UuaHRtbFByZWZpbHRlcihpKStjWzJdLGY9Y1swXTtmLS07KWE9YS5sYXN0Q2hpbGQ7a2UubWVyZ2UoZCxhLmNoaWxkTm9kZXMpLGE9cC5maXJzdENoaWxkLGEudGV4dENvbnRlbnQ9IiJ9ZWxzZSBkLnB1c2godC5jcmVhdGVUZXh0Tm9kZShpKSk7Zm9yKHAudGV4dENvbnRlbnQ9IiIsaD0wO2k9ZFtoKytdOylpZihyJiZrZS5pbkFycmF5KGkscik+LTEpbyYmby5wdXNoKGkpO2Vsc2UgaWYobD1rZS5jb250YWlucyhpLm93bmVyRG9jdW1lbnQsaSksYT1rKHAuYXBwZW5kQ2hpbGQoaSksInNjcmlwdCIpLGwmJkEoYSksbilmb3IoZj0wO2k9YVtmKytdOyl0dC50ZXN0KGkudHlwZXx8IiIpJiZuLnB1c2goaSk7cmV0dXJuIHB9ZnVuY3Rpb24gJCgpe3JldHVybiEwfWZ1bmN0aW9uIEUoKXtyZXR1cm4hMX1mdW5jdGlvbiBPKCl7dHJ5e3JldHVybiBsZS5hY3RpdmVFbGVtZW50fWNhdGNoKGUpe319ZnVuY3Rpb24gaihlLHQsbixyLG8saSl7dmFyIGEscztpZigib2JqZWN0Ij09dHlwZW9mIHQpeyJzdHJpbmciIT10eXBlb2YgbiYmKHI9cnx8bixuPXZvaWQgMCk7Zm9yKHMgaW4gdClqKGUscyxuLHIsdFtzXSxpKTtyZXR1cm4gZX1pZihudWxsPT1yJiZudWxsPT1vPyhvPW4scj1uPXZvaWQgMCk6bnVsbD09byYmKCJzdHJpbmciPT10eXBlb2Ygbj8obz1yLHI9dm9pZCAwKToobz1yLHI9bixuPXZvaWQgMCkpLCExPT09bylvPUU7ZWxzZSBpZighbylyZXR1cm4gZTtyZXR1cm4gMT09PWkmJihhPW8sbz1mdW5jdGlvbihlKXtyZXR1cm4ga2UoKS5vZmYoZSksYS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9LG8uZ3VpZD1hLmd1aWR8fChhLmd1aWQ9a2UuZ3VpZCsrKSksZS5lYWNoKGZ1bmN0aW9uKCl7a2UuZXZlbnQuYWRkKHRoaXMsdCxvLHIsbil9KX1mdW5jdGlvbiBOKGUsdCl7cmV0dXJuIGMoZSwidGFibGUiKSYmYygxMSE9PXQubm9kZVR5cGU/dDp0LmZpcnN0Q2hpbGQsInRyIik/a2UoZSkuY2hpbGRyZW4oInRib2R5IilbMF18fGU6ZX1mdW5jdGlvbiBMKGUpe3JldHVybiBlLnR5cGU9KG51bGwhPT1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKSsiLyIrZS50eXBlLGV9ZnVuY3Rpb24gRChlKXtyZXR1cm4idHJ1ZS8iPT09KGUudHlwZXx8IiIpLnNsaWNlKDAsNSk/ZS50eXBlPWUudHlwZS5zbGljZSg1KTplLnJlbW92ZUF0dHJpYnV0ZSgidHlwZSIpLGV9ZnVuY3Rpb24gSShlLHQpe3ZhciBuLHIsbyxpLGEscyx1LGM7aWYoMT09PXQubm9kZVR5cGUpe2lmKFVlLmhhc0RhdGEoZSkmJihpPVVlLmFjY2VzcyhlKSxhPVVlLnNldCh0LGkpLGM9aS5ldmVudHMpKXtkZWxldGUgYS5oYW5kbGUsYS5ldmVudHM9e307Zm9yKG8gaW4gYylmb3Iobj0wLHI9Y1tvXS5sZW5ndGg7bjxyO24rKylrZS5ldmVudC5hZGQodCxvLGNbb11bbl0pfVdlLmhhc0RhdGEoZSkmJihzPVdlLmFjY2VzcyhlKSx1PWtlLmV4dGVuZCh7fSxzKSxXZS5zZXQodCx1KSl9fWZ1bmN0aW9uIFIoZSx0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7ImlucHV0Ij09PW4mJlplLnRlc3QoZS50eXBlKT90LmNoZWNrZWQ9ZS5jaGVja2VkOiJpbnB1dCIhPT1uJiYidGV4dGFyZWEiIT09bnx8KHQuZGVmYXVsdFZhbHVlPWUuZGVmYXVsdFZhbHVlKX1mdW5jdGlvbiBQKGUsdCxuLHIpe3Q9ZGUuYXBwbHkoW10sdCk7dmFyIG8saSxzLHUsYyxsLGY9MCxwPWUubGVuZ3RoLGQ9cC0xLGg9dFswXSx2PV9lKGgpO2lmKHZ8fHA+MSYmInN0cmluZyI9PXR5cGVvZiBoJiYhd2UuY2hlY2tDbG9uZSYmbHQudGVzdChoKSlyZXR1cm4gZS5lYWNoKGZ1bmN0aW9uKG8pe3ZhciBpPWUuZXEobyk7diYmKHRbMF09aC5jYWxsKHRoaXMsbyxpLmh0bWwoKSkpLFAoaSx0LG4scil9KTtpZihwJiYobz1TKHQsZVswXS5vd25lckRvY3VtZW50LCExLGUsciksaT1vLmZpcnN0Q2hpbGQsMT09PW8uY2hpbGROb2Rlcy5sZW5ndGgmJihvPWkpLGl8fHIpKXtmb3Iocz1rZS5tYXAoayhvLCJzY3JpcHQiKSxMKSx1PXMubGVuZ3RoO2Y8cDtmKyspYz1vLGYhPT1kJiYoYz1rZS5jbG9uZShjLCEwLCEwKSx1JiZrZS5tZXJnZShzLGsoYywic2NyaXB0IikpKSxuLmNhbGwoZVtmXSxjLGYpO2lmKHUpZm9yKGw9c1tzLmxlbmd0aC0xXS5vd25lckRvY3VtZW50LGtlLm1hcChzLEQpLGY9MDtmPHU7ZisrKWM9c1tmXSx0dC50ZXN0KGMudHlwZXx8IiIpJiYhVWUuYWNjZXNzKGMsImdsb2JhbEV2YWwiKSYma2UuY29udGFpbnMobCxjKSYmKGMuc3JjJiYibW9kdWxlIiE9PShjLnR5cGV8fCIiKS50b0xvd2VyQ2FzZSgpP2tlLl9ldmFsVXJsJiZrZS5fZXZhbFVybChjLnNyYyk6YShjLnRleHRDb250ZW50LnJlcGxhY2UoZnQsIiIpLGwsYykpfXJldHVybiBlfWZ1bmN0aW9uIE0oZSx0LG4pe2Zvcih2YXIgcixvPXQ/a2UuZmlsdGVyKHQsZSk6ZSxpPTA7bnVsbCE9KHI9b1tpXSk7aSsrKW58fDEhPT1yLm5vZGVUeXBlfHxrZS5jbGVhbkRhdGEoayhyKSksci5wYXJlbnROb2RlJiYobiYma2UuY29udGFpbnMoci5vd25lckRvY3VtZW50LHIpJiZBKGsociwic2NyaXB0IikpLHIucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKSk7cmV0dXJuIGV9ZnVuY3Rpb24gcShlLHQsbil7dmFyIHIsbyxpLGEscz1lLnN0eWxlO3JldHVybiBuPW58fGR0KGUpLG4mJihhPW4uZ2V0UHJvcGVydHlWYWx1ZSh0KXx8blt0XSwiIiE9PWF8fGtlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKXx8KGE9a2Uuc3R5bGUoZSx0KSksIXdlLnBpeGVsQm94U3R5bGVzKCkmJnB0LnRlc3QoYSkmJmh0LnRlc3QodCkmJihyPXMud2lkdGgsbz1zLm1pbldpZHRoLGk9cy5tYXhXaWR0aCxzLm1pbldpZHRoPXMubWF4V2lkdGg9cy53aWR0aD1hLGE9bi53aWR0aCxzLndpZHRoPXIscy5taW5XaWR0aD1vLHMubWF4V2lkdGg9aSkpLHZvaWQgMCE9PWE/YSsiIjphfWZ1bmN0aW9uIEgoZSx0KXtyZXR1cm57Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKT92b2lkIGRlbGV0ZSB0aGlzLmdldDoodGhpcy5nZXQ9dCkuYXBwbHkodGhpcyxhcmd1bWVudHMpfX19ZnVuY3Rpb24gRihlKXtpZihlIGluIHh0KXJldHVybiBlO2Zvcih2YXIgdD1lWzBdLnRvVXBwZXJDYXNlKCkrZS5zbGljZSgxKSxuPWJ0Lmxlbmd0aDtuLS07KWlmKChlPWJ0W25dK3QpaW4geHQpcmV0dXJuIGV9ZnVuY3Rpb24gQihlKXt2YXIgdD1rZS5jc3NQcm9wc1tlXTtyZXR1cm4gdHx8KHQ9a2UuY3NzUHJvcHNbZV09RihlKXx8ZSksdH1mdW5jdGlvbiBVKGUsdCxuKXt2YXIgcj1KZS5leGVjKHQpO3JldHVybiByP01hdGgubWF4KDAsclsyXS0obnx8MCkpKyhyWzNdfHwicHgiKTp0fWZ1bmN0aW9uIFcoZSx0LG4scixvLGkpe3ZhciBhPSJ3aWR0aCI9PT10PzE6MCxzPTAsdT0wO2lmKG49PT0ocj8iYm9yZGVyIjoiY29udGVudCIpKXJldHVybiAwO2Zvcig7YTw0O2ErPTIpIm1hcmdpbiI9PT1uJiYodSs9a2UuY3NzKGUsbitLZVthXSwhMCxvKSkscj8oImNvbnRlbnQiPT09biYmKHUtPWtlLmNzcyhlLCJwYWRkaW5nIitLZVthXSwhMCxvKSksIm1hcmdpbiIhPT1uJiYodS09a2UuY3NzKGUsImJvcmRlciIrS2VbYV0rIldpZHRoIiwhMCxvKSkpOih1Kz1rZS5jc3MoZSwicGFkZGluZyIrS2VbYV0sITAsbyksInBhZGRpbmciIT09bj91Kz1rZS5jc3MoZSwiYm9yZGVyIitLZVthXSsiV2lkdGgiLCEwLG8pOnMrPWtlLmNzcyhlLCJib3JkZXIiK0tlW2FdKyJXaWR0aCIsITAsbykpO3JldHVybiFyJiZpPj0wJiYodSs9TWF0aC5tYXgoMCxNYXRoLmNlaWwoZVsib2Zmc2V0Iit0WzBdLnRvVXBwZXJDYXNlKCkrdC5zbGljZSgxKV0taS11LXMtLjUpKSksdX1mdW5jdGlvbiB6KGUsdCxuKXt2YXIgcj1kdChlKSxvPXEoZSx0LHIpLGk9ImJvcmRlci1ib3giPT09a2UuY3NzKGUsImJveFNpemluZyIsITEsciksYT1pO2lmKHB0LnRlc3Qobykpe2lmKCFuKXJldHVybiBvO289ImF1dG8ifXJldHVybiBhPWEmJih3ZS5ib3hTaXppbmdSZWxpYWJsZSgpfHxvPT09ZS5zdHlsZVt0XSksKCJhdXRvIj09PW98fCFwYXJzZUZsb2F0KG8pJiYiaW5saW5lIj09PWtlLmNzcyhlLCJkaXNwbGF5IiwhMSxyKSkmJihvPWVbIm9mZnNldCIrdFswXS50b1VwcGVyQ2FzZSgpK3Quc2xpY2UoMSldLGE9ITApLChvPXBhcnNlRmxvYXQobyl8fDApK1coZSx0LG58fChpPyJib3JkZXIiOiJjb250ZW50IiksYSxyLG8pKyJweCJ9ZnVuY3Rpb24gVihlLHQsbixyLG8pe3JldHVybiBuZXcgVi5wcm90b3R5cGUuaW5pdChlLHQsbixyLG8pfWZ1bmN0aW9uIFgoKXtfdCYmKCExPT09bGUuaGlkZGVuJiZuLnJlcXVlc3RBbmltYXRpb25GcmFtZT9uLnJlcXVlc3RBbmltYXRpb25GcmFtZShYKTpuLnNldFRpbWVvdXQoWCxrZS5meC5pbnRlcnZhbCksa2UuZngudGljaygpKX1mdW5jdGlvbiBKKCl7cmV0dXJuIG4uc2V0VGltZW91dChmdW5jdGlvbigpe3d0PXZvaWQgMH0pLHd0PURhdGUubm93KCl9ZnVuY3Rpb24gSyhlLHQpe3ZhciBuLHI9MCxvPXtoZWlnaHQ6ZX07Zm9yKHQ9dD8xOjA7cjw0O3IrPTItdCluPUtlW3JdLG9bIm1hcmdpbiIrbl09b1sicGFkZGluZyIrbl09ZTtyZXR1cm4gdCYmKG8ub3BhY2l0eT1vLndpZHRoPWUpLG99ZnVuY3Rpb24gRyhlLHQsbil7Zm9yKHZhciByLG89KFoudHdlZW5lcnNbdF18fFtdKS5jb25jYXQoWi50d2VlbmVyc1siKiJdKSxpPTAsYT1vLmxlbmd0aDtpPGE7aSsrKWlmKHI9b1tpXS5jYWxsKG4sdCxlKSlyZXR1cm4gcn1mdW5jdGlvbiBZKGUsdCxuKXt2YXIgcixvLGksYSxzLHUsYyxsLGY9IndpZHRoImluIHR8fCJoZWlnaHQiaW4gdCxwPXRoaXMsZD17fSxoPWUuc3R5bGUsdj1lLm5vZGVUeXBlJiZHZShlKSxtPVVlLmdldChlLCJmeHNob3ciKTtuLnF1ZXVlfHwoYT1rZS5fcXVldWVIb29rcyhlLCJmeCIpLG51bGw9PWEudW5xdWV1ZWQmJihhLnVucXVldWVkPTAscz1hLmVtcHR5LmZpcmUsYS5lbXB0eS5maXJlPWZ1bmN0aW9uKCl7YS51bnF1ZXVlZHx8cygpfSksYS51bnF1ZXVlZCsrLHAuYWx3YXlzKGZ1bmN0aW9uKCl7cC5hbHdheXMoZnVuY3Rpb24oKXthLnVucXVldWVkLS0sa2UucXVldWUoZSwiZngiKS5sZW5ndGh8fGEuZW1wdHkuZmlyZSgpfSl9KSk7Zm9yKHIgaW4gdClpZihvPXRbcl0sQ3QudGVzdChvKSl7aWYoZGVsZXRlIHRbcl0saT1pfHwidG9nZ2xlIj09PW8sbz09PSh2PyJoaWRlIjoic2hvdyIpKXtpZigic2hvdyIhPT1vfHwhbXx8dm9pZCAwPT09bVtyXSljb250aW51ZTt2PSEwfWRbcl09bSYmbVtyXXx8a2Uuc3R5bGUoZSxyKX1pZigodT0ha2UuaXNFbXB0eU9iamVjdCh0KSl8fCFrZS5pc0VtcHR5T2JqZWN0KGQpKXtmJiYxPT09ZS5ub2RlVHlwZSYmKG4ub3ZlcmZsb3c9W2gub3ZlcmZsb3csaC5vdmVyZmxvd1gsaC5vdmVyZmxvd1ldLGM9bSYmbS5kaXNwbGF5LG51bGw9PWMmJihjPVVlLmdldChlLCJkaXNwbGF5IikpLGw9a2UuY3NzKGUsImRpc3BsYXkiKSwibm9uZSI9PT1sJiYoYz9sPWM6KFQoW2VdLCEwKSxjPWUuc3R5bGUuZGlzcGxheXx8YyxsPWtlLmNzcyhlLCJkaXNwbGF5IiksVChbZV0pKSksKCJpbmxpbmUiPT09bHx8ImlubGluZS1ibG9jayI9PT1sJiZudWxsIT1jKSYmIm5vbmUiPT09a2UuY3NzKGUsImZsb2F0IikmJih1fHwocC5kb25lKGZ1bmN0aW9uKCl7aC5kaXNwbGF5PWN9KSxudWxsPT1jJiYobD1oLmRpc3BsYXksYz0ibm9uZSI9PT1sPyIiOmwpKSxoLmRpc3BsYXk9ImlubGluZS1ibG9jayIpKSxuLm92ZXJmbG93JiYoaC5vdmVyZmxvdz0iaGlkZGVuIixwLmFsd2F5cyhmdW5jdGlvbigpe2gub3ZlcmZsb3c9bi5vdmVyZmxvd1swXSxoLm92ZXJmbG93WD1uLm92ZXJmbG93WzFdLGgub3ZlcmZsb3dZPW4ub3ZlcmZsb3dbMl19KSksdT0hMTtmb3IociBpbiBkKXV8fChtPyJoaWRkZW4iaW4gbSYmKHY9bS5oaWRkZW4pOm09VWUuYWNjZXNzKGUsImZ4c2hvdyIse2Rpc3BsYXk6Y30pLGkmJihtLmhpZGRlbj0hdiksdiYmVChbZV0sITApLHAuZG9uZShmdW5jdGlvbigpe3Z8fFQoW2VdKSxVZS5yZW1vdmUoZSwiZnhzaG93Iik7Zm9yKHIgaW4gZClrZS5zdHlsZShlLHIsZFtyXSl9KSksdT1HKHY/bVtyXTowLHIscCksciBpbiBtfHwobVtyXT11LnN0YXJ0LHYmJih1LmVuZD11LnN0YXJ0LHUuc3RhcnQ9MCkpfX1mdW5jdGlvbiBRKGUsdCl7dmFyIG4scixvLGksYTtmb3IobiBpbiBlKWlmKHI9ZyhuKSxvPXRbcl0saT1lW25dLEFycmF5LmlzQXJyYXkoaSkmJihvPWlbMV0saT1lW25dPWlbMF0pLG4hPT1yJiYoZVtyXT1pLGRlbGV0ZSBlW25dKSwoYT1rZS5jc3NIb29rc1tyXSkmJiJleHBhbmQiaW4gYSl7aT1hLmV4cGFuZChpKSxkZWxldGUgZVtyXTtmb3IobiBpbiBpKW4gaW4gZXx8KGVbbl09aVtuXSx0W25dPW8pfWVsc2UgdFtyXT1vfWZ1bmN0aW9uIFooZSx0LG4pe3ZhciByLG8saT0wLGE9Wi5wcmVmaWx0ZXJzLmxlbmd0aCxzPWtlLkRlZmVycmVkKCkuYWx3YXlzKGZ1bmN0aW9uKCl7ZGVsZXRlIHUuZWxlbX0pLHU9ZnVuY3Rpb24oKXtpZihvKXJldHVybiExO2Zvcih2YXIgdD13dHx8SigpLG49TWF0aC5tYXgoMCxjLnN0YXJ0VGltZStjLmR1cmF0aW9uLXQpLHI9bi9jLmR1cmF0aW9ufHwwLGk9MS1yLGE9MCx1PWMudHdlZW5zLmxlbmd0aDthPHU7YSsrKWMudHdlZW5zW2FdLnJ1bihpKTtyZXR1cm4gcy5ub3RpZnlXaXRoKGUsW2MsaSxuXSksaTwxJiZ1P246KHV8fHMubm90aWZ5V2l0aChlLFtjLDEsMF0pLHMucmVzb2x2ZVdpdGgoZSxbY10pLCExKX0sYz1zLnByb21pc2Uoe2VsZW06ZSxwcm9wczprZS5leHRlbmQoe30sdCksb3B0czprZS5leHRlbmQoITAse3NwZWNpYWxFYXNpbmc6e30sZWFzaW5nOmtlLmVhc2luZy5fZGVmYXVsdH0sbiksb3JpZ2luYWxQcm9wZXJ0aWVzOnQsb3JpZ2luYWxPcHRpb25zOm4sc3RhcnRUaW1lOnd0fHxKKCksZHVyYXRpb246bi5kdXJhdGlvbix0d2VlbnM6W10sY3JlYXRlVHdlZW46ZnVuY3Rpb24odCxuKXt2YXIgcj1rZS5Ud2VlbihlLGMub3B0cyx0LG4sYy5vcHRzLnNwZWNpYWxFYXNpbmdbdF18fGMub3B0cy5lYXNpbmcpO3JldHVybiBjLnR3ZWVucy5wdXNoKHIpLHJ9LHN0b3A6ZnVuY3Rpb24odCl7dmFyIG49MCxyPXQ/Yy50d2VlbnMubGVuZ3RoOjA7aWYobylyZXR1cm4gdGhpcztmb3Iobz0hMDtuPHI7bisrKWMudHdlZW5zW25dLnJ1bigxKTtyZXR1cm4gdD8ocy5ub3RpZnlXaXRoKGUsW2MsMSwwXSkscy5yZXNvbHZlV2l0aChlLFtjLHRdKSk6cy5yZWplY3RXaXRoKGUsW2MsdF0pLHRoaXN9fSksbD1jLnByb3BzO2ZvcihRKGwsYy5vcHRzLnNwZWNpYWxFYXNpbmcpO2k8YTtpKyspaWYocj1aLnByZWZpbHRlcnNbaV0uY2FsbChjLGUsbCxjLm9wdHMpKXJldHVybiBfZShyLnN0b3ApJiYoa2UuX3F1ZXVlSG9va3MoYy5lbGVtLGMub3B0cy5xdWV1ZSkuc3RvcD1yLnN0b3AuYmluZChyKSkscjtyZXR1cm4ga2UubWFwKGwsRyxjKSxfZShjLm9wdHMuc3RhcnQpJiZjLm9wdHMuc3RhcnQuY2FsbChlLGMpLGMucHJvZ3Jlc3MoYy5vcHRzLnByb2dyZXNzKS5kb25lKGMub3B0cy5kb25lLGMub3B0cy5jb21wbGV0ZSkuZmFpbChjLm9wdHMuZmFpbCkuYWx3YXlzKGMub3B0cy5hbHdheXMpLGtlLmZ4LnRpbWVyKGtlLmV4dGVuZCh1LHtlbGVtOmUsYW5pbTpjLHF1ZXVlOmMub3B0cy5xdWV1ZX0pKSxjfWZ1bmN0aW9uIGVlKGUpe3JldHVybihlLm1hdGNoKFJlKXx8W10pLmpvaW4oIiAiKX1mdW5jdGlvbiB0ZShlKXtyZXR1cm4gZS5nZXRBdHRyaWJ1dGUmJmUuZ2V0QXR0cmlidXRlKCJjbGFzcyIpfHwiIn1mdW5jdGlvbiBuZShlKXtyZXR1cm4gQXJyYXkuaXNBcnJheShlKT9lOiJzdHJpbmciPT10eXBlb2YgZT9lLm1hdGNoKFJlKXx8W106W119ZnVuY3Rpb24gcmUoZSx0LG4scil7dmFyIG87aWYoQXJyYXkuaXNBcnJheSh0KSlrZS5lYWNoKHQsZnVuY3Rpb24odCxvKXtufHxJdC50ZXN0KGUpP3IoZSxvKTpyZShlKyJbIisoIm9iamVjdCI9PXR5cGVvZiBvJiZudWxsIT1vP3Q6IiIpKyJdIixvLG4scil9KTtlbHNlIGlmKG58fCJvYmplY3QiIT09cyh0KSlyKGUsdCk7ZWxzZSBmb3IobyBpbiB0KXJlKGUrIlsiK28rIl0iLHRbb10sbixyKX1mdW5jdGlvbiBvZShlKXtyZXR1cm4gZnVuY3Rpb24odCxuKXsic3RyaW5nIiE9dHlwZW9mIHQmJihuPXQsdD0iKiIpO3ZhciByLG89MCxpPXQudG9Mb3dlckNhc2UoKS5tYXRjaChSZSl8fFtdO2lmKF9lKG4pKWZvcig7cj1pW28rK107KSIrIj09PXJbMF0/KHI9ci5zbGljZSgxKXx8IioiLChlW3JdPWVbcl18fFtdKS51bnNoaWZ0KG4pKTooZVtyXT1lW3JdfHxbXSkucHVzaChuKX19ZnVuY3Rpb24gaWUoZSx0LG4scil7ZnVuY3Rpb24gbyhzKXt2YXIgdTtyZXR1cm4gaVtzXT0hMCxrZS5lYWNoKGVbc118fFtdLGZ1bmN0aW9uKGUscyl7dmFyIGM9cyh0LG4scik7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBjfHxhfHxpW2NdP2E/ISh1PWMpOnZvaWQgMDoodC5kYXRhVHlwZXMudW5zaGlmdChjKSxvKGMpLCExKX0pLHV9dmFyIGk9e30sYT1lPT09WHQ7cmV0dXJuIG8odC5kYXRhVHlwZXNbMF0pfHwhaVsiKiJdJiZvKCIqIil9ZnVuY3Rpb24gYWUoZSx0KXt2YXIgbixyLG89a2UuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zfHx7fTtmb3IobiBpbiB0KXZvaWQgMCE9PXRbbl0mJigob1tuXT9lOnJ8fChyPXt9KSlbbl09dFtuXSk7cmV0dXJuIHImJmtlLmV4dGVuZCghMCxlLHIpLGV9ZnVuY3Rpb24gc2UoZSx0LG4pe2Zvcih2YXIgcixvLGksYSxzPWUuY29udGVudHMsdT1lLmRhdGFUeXBlczsiKiI9PT11WzBdOyl1LnNoaWZ0KCksdm9pZCAwPT09ciYmKHI9ZS5taW1lVHlwZXx8dC5nZXRSZXNwb25zZUhlYWRlcigiQ29udGVudC1UeXBlIikpO2lmKHIpZm9yKG8gaW4gcylpZihzW29dJiZzW29dLnRlc3Qocikpe3UudW5zaGlmdChvKTticmVha31pZih1WzBdaW4gbilpPXVbMF07ZWxzZXtmb3IobyBpbiBuKXtpZighdVswXXx8ZS5jb252ZXJ0ZXJzW28rIiAiK3VbMF1dKXtpPW87YnJlYWt9YXx8KGE9byl9aT1pfHxhfWlmKGkpcmV0dXJuIGkhPT11WzBdJiZ1LnVuc2hpZnQoaSksbltpXX1mdW5jdGlvbiB1ZShlLHQsbixyKXt2YXIgbyxpLGEscyx1LGM9e30sbD1lLmRhdGFUeXBlcy5zbGljZSgpO2lmKGxbMV0pZm9yKGEgaW4gZS5jb252ZXJ0ZXJzKWNbYS50b0xvd2VyQ2FzZSgpXT1lLmNvbnZlcnRlcnNbYV07Zm9yKGk9bC5zaGlmdCgpO2k7KWlmKGUucmVzcG9uc2VGaWVsZHNbaV0mJihuW2UucmVzcG9uc2VGaWVsZHNbaV1dPXQpLCF1JiZyJiZlLmRhdGFGaWx0ZXImJih0PWUuZGF0YUZpbHRlcih0LGUuZGF0YVR5cGUpKSx1PWksaT1sLnNoaWZ0KCkpaWYoIioiPT09aSlpPXU7ZWxzZSBpZigiKiIhPT11JiZ1IT09aSl7aWYoIShhPWNbdSsiICIraV18fGNbIiogIitpXSkpZm9yKG8gaW4gYylpZihzPW8uc3BsaXQoIiAiKSxzWzFdPT09aSYmKGE9Y1t1KyIgIitzWzBdXXx8Y1siKiAiK3NbMF1dKSl7ITA9PT1hP2E9Y1tvXTohMCE9PWNbb10mJihpPXNbMF0sbC51bnNoaWZ0KHNbMV0pKTticmVha31pZighMCE9PWEpaWYoYSYmZS50aHJvd3MpdD1hKHQpO2Vsc2UgdHJ5e3Q9YSh0KX1jYXRjaChlKXtyZXR1cm57c3RhdGU6InBhcnNlcmVycm9yIixlcnJvcjphP2U6Ik5vIGNvbnZlcnNpb24gZnJvbSAiK3UrIiB0byAiK2l9fX1yZXR1cm57c3RhdGU6InN1Y2Nlc3MiLGRhdGE6dH19dmFyIGNlPVtdLGxlPW4uZG9jdW1lbnQsZmU9T2JqZWN0LmdldFByb3RvdHlwZU9mLHBlPWNlLnNsaWNlLGRlPWNlLmNvbmNhdCxoZT1jZS5wdXNoLHZlPWNlLmluZGV4T2YsbWU9e30seWU9bWUudG9TdHJpbmcsZ2U9bWUuaGFzT3duUHJvcGVydHksYmU9Z2UudG9TdHJpbmcseGU9YmUuY2FsbChPYmplY3QpLHdlPXt9LF9lPWZ1bmN0aW9uKGUpe3JldHVybiJmdW5jdGlvbiI9PXR5cGVvZiBlJiYibnVtYmVyIiE9dHlwZW9mIGUubm9kZVR5cGV9LENlPWZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lJiZlPT09ZS53aW5kb3d9LFRlPXt0eXBlOiEwLHNyYzohMCxub01vZHVsZTohMH0sa2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbmV3IGtlLmZuLmluaXQoZSx0KX0sQWU9L15bXHNcdUZFRkZceEEwXSt8W1xzXHVGRUZGXHhBMF0rJC9nO2tlLmZuPWtlLnByb3RvdHlwZT17anF1ZXJ5OiIzLjMuMSIsY29uc3RydWN0b3I6a2UsbGVuZ3RoOjAsdG9BcnJheTpmdW5jdGlvbigpe3JldHVybiBwZS5jYWxsKHRoaXMpfSxnZXQ6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/cGUuY2FsbCh0aGlzKTplPDA/dGhpc1tlK3RoaXMubGVuZ3RoXTp0aGlzW2VdfSxwdXNoU3RhY2s6ZnVuY3Rpb24oZSl7dmFyIHQ9a2UubWVyZ2UodGhpcy5jb25zdHJ1Y3RvcigpLGUpO3JldHVybiB0LnByZXZPYmplY3Q9dGhpcyx0fSxlYWNoOmZ1bmN0aW9uKGUpe3JldHVybiBrZS5lYWNoKHRoaXMsZSl9LG1hcDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2soa2UubWFwKHRoaXMsZnVuY3Rpb24odCxuKXtyZXR1cm4gZS5jYWxsKHQsbix0KX0pKX0sc2xpY2U6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2socGUuYXBwbHkodGhpcyxhcmd1bWVudHMpKX0sZmlyc3Q6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5lcSgwKX0sbGFzdDpmdW5jdGlvbigpe3JldHVybiB0aGlzLmVxKC0xKX0sZXE6ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcy5sZW5ndGgsbj0rZSsoZTwwP3Q6MCk7cmV0dXJuIHRoaXMucHVzaFN0YWNrKG4+PTAmJm48dD9bdGhpc1tuXV06W10pfSxlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcmV2T2JqZWN0fHx0aGlzLmNvbnN0cnVjdG9yKCl9LHB1c2g6aGUsc29ydDpjZS5zb3J0LHNwbGljZTpjZS5zcGxpY2V9LGtlLmV4dGVuZD1rZS5mbi5leHRlbmQ9ZnVuY3Rpb24oKXt2YXIgZSx0LG4scixvLGksYT1hcmd1bWVudHNbMF18fHt9LHM9MSx1PWFyZ3VtZW50cy5sZW5ndGgsYz0hMTtmb3IoImJvb2xlYW4iPT10eXBlb2YgYSYmKGM9YSxhPWFyZ3VtZW50c1tzXXx8e30scysrKSwib2JqZWN0Ij09dHlwZW9mIGF8fF9lKGEpfHwoYT17fSkscz09PXUmJihhPXRoaXMscy0tKTtzPHU7cysrKWlmKG51bGwhPShlPWFyZ3VtZW50c1tzXSkpZm9yKHQgaW4gZSluPWFbdF0scj1lW3RdLGEhPT1yJiYoYyYmciYmKGtlLmlzUGxhaW5PYmplY3Qocil8fChvPUFycmF5LmlzQXJyYXkocikpKT8obz8obz0hMSxpPW4mJkFycmF5LmlzQXJyYXkobik/bjpbXSk6aT1uJiZrZS5pc1BsYWluT2JqZWN0KG4pP246e30sYVt0XT1rZS5leHRlbmQoYyxpLHIpKTp2b2lkIDAhPT1yJiYoYVt0XT1yKSk7cmV0dXJuIGF9LGtlLmV4dGVuZCh7ZXhwYW5kbzoialF1ZXJ5IisoIjMuMy4xIitNYXRoLnJhbmRvbSgpKS5yZXBsYWNlKC9cRC9nLCIiKSxpc1JlYWR5OiEwLGVycm9yOmZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcihlKX0sbm9vcDpmdW5jdGlvbigpe30saXNQbGFpbk9iamVjdDpmdW5jdGlvbihlKXt2YXIgdCxuO3JldHVybiEoIWV8fCJbb2JqZWN0IE9iamVjdF0iIT09eWUuY2FsbChlKSkmJighKHQ9ZmUoZSkpfHwiZnVuY3Rpb24iPT10eXBlb2Yobj1nZS5jYWxsKHQsImNvbnN0cnVjdG9yIikmJnQuY29uc3RydWN0b3IpJiZiZS5jYWxsKG4pPT09eGUpfSxpc0VtcHR5T2JqZWN0OmZ1bmN0aW9uKGUpe3ZhciB0O2Zvcih0IGluIGUpcmV0dXJuITE7cmV0dXJuITB9LGdsb2JhbEV2YWw6ZnVuY3Rpb24oZSl7YShlKX0sZWFjaDpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MDtpZih1KGUpKWZvcihuPWUubGVuZ3RoO3I8biYmITEhPT10LmNhbGwoZVtyXSxyLGVbcl0pO3IrKyk7ZWxzZSBmb3IociBpbiBlKWlmKCExPT09dC5jYWxsKGVbcl0scixlW3JdKSlicmVhaztyZXR1cm4gZX0sdHJpbTpmdW5jdGlvbihlKXtyZXR1cm4gbnVsbD09ZT8iIjooZSsiIikucmVwbGFjZShBZSwiIil9LG1ha2VBcnJheTpmdW5jdGlvbihlLHQpe3ZhciBuPXR8fFtdO3JldHVybiBudWxsIT1lJiYodShPYmplY3QoZSkpP2tlLm1lcmdlKG4sInN0cmluZyI9PXR5cGVvZiBlP1tlXTplKTpoZS5jYWxsKG4sZSkpLG59LGluQXJyYXk6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiBudWxsPT10Py0xOnZlLmNhbGwodCxlLG4pfSxtZXJnZTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0rdC5sZW5ndGgscj0wLG89ZS5sZW5ndGg7cjxuO3IrKyllW28rK109dFtyXTtyZXR1cm4gZS5sZW5ndGg9byxlfSxncmVwOmZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9W10sbz0wLGk9ZS5sZW5ndGgsYT0hbjtvPGk7bysrKSF0KGVbb10sbykhPT1hJiZyLnB1c2goZVtvXSk7cmV0dXJuIHJ9LG1hcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPTAsYT1bXTtpZih1KGUpKWZvcihyPWUubGVuZ3RoO2k8cjtpKyspbnVsbCE9KG89dChlW2ldLGksbikpJiZhLnB1c2gobyk7ZWxzZSBmb3IoaSBpbiBlKW51bGwhPShvPXQoZVtpXSxpLG4pKSYmYS5wdXNoKG8pO3JldHVybiBkZS5hcHBseShbXSxhKX0sZ3VpZDoxLHN1cHBvcnQ6d2V9KSwiZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYoa2UuZm5bU3ltYm9sLml0ZXJhdG9yXT1jZVtTeW1ib2wuaXRlcmF0b3JdKSxrZS5lYWNoKCJCb29sZWFuIE51bWJlciBTdHJpbmcgRnVuY3Rpb24gQXJyYXkgRGF0ZSBSZWdFeHAgT2JqZWN0IEVycm9yIFN5bWJvbCIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe21lWyJbb2JqZWN0ICIrdCsiXSJdPXQudG9Mb3dlckNhc2UoKX0pO3ZhciBTZT0vKiEKLSAqIFNpenpsZSBDU1MgU2VsZWN0b3IgRW5naW5lIHYyLjMuMwotICogaHR0cHM6Ly9zaXp6bGVqcy5jb20vCi0gKgotICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnMKLSAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQotICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZQotICoKLSAqIERhdGU6IDIwMTYtMDgtMDgKLSAqLwotZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChlLHQsbixyKXt2YXIgbyxpLGEscyx1LGwscCxkPXQmJnQub3duZXJEb2N1bWVudCxoPXQ/dC5ub2RlVHlwZTo5O2lmKG49bnx8W10sInN0cmluZyIhPXR5cGVvZiBlfHwhZXx8MSE9PWgmJjkhPT1oJiYxMSE9PWgpcmV0dXJuIG47aWYoIXImJigodD90Lm93bmVyRG9jdW1lbnR8fHQ6cSkhPT1qJiZPKHQpLHQ9dHx8aixMKSl7aWYoMTEhPT1oJiYodT12ZS5leGVjKGUpKSlpZihvPXVbMV0pe2lmKDk9PT1oKXtpZighKGE9dC5nZXRFbGVtZW50QnlJZChvKSkpcmV0dXJuIG47aWYoYS5pZD09PW8pcmV0dXJuIG4ucHVzaChhKSxufWVsc2UgaWYoZCYmKGE9ZC5nZXRFbGVtZW50QnlJZChvKSkmJlAodCxhKSYmYS5pZD09PW8pcmV0dXJuIG4ucHVzaChhKSxufWVsc2V7aWYodVsyXSlyZXR1cm4gRy5hcHBseShuLHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSkpLG47aWYoKG89dVszXSkmJnguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKXJldHVybiBHLmFwcGx5KG4sdC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lKG8pKSxufWlmKHgucXNhJiYhV1tlKyIgIl0mJighRHx8IUQudGVzdChlKSkpe2lmKDEhPT1oKWQ9dCxwPWU7ZWxzZSBpZigib2JqZWN0IiE9PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl7Zm9yKChzPXQuZ2V0QXR0cmlidXRlKCJpZCIpKT9zPXMucmVwbGFjZShiZSx4ZSk6dC5zZXRBdHRyaWJ1dGUoImlkIixzPU0pLGw9VChlKSxpPWwubGVuZ3RoO2ktLTspbFtpXT0iIyIrcysiICIrZihsW2ldKTtwPWwuam9pbigiLCIpLGQ9bWUudGVzdChlKSYmYyh0LnBhcmVudE5vZGUpfHx0fWlmKHApdHJ5e3JldHVybiBHLmFwcGx5KG4sZC5xdWVyeVNlbGVjdG9yQWxsKHApKSxufWNhdGNoKGUpe31maW5hbGx5e3M9PT1NJiZ0LnJlbW92ZUF0dHJpYnV0ZSgiaWQiKX19fXJldHVybiBBKGUucmVwbGFjZShpZSwiJDEiKSx0LG4scil9ZnVuY3Rpb24gbigpe2Z1bmN0aW9uIGUobixyKXtyZXR1cm4gdC5wdXNoKG4rIiAiKT53LmNhY2hlTGVuZ3RoJiZkZWxldGUgZVt0LnNoaWZ0KCldLGVbbisiICJdPXJ9dmFyIHQ9W107cmV0dXJuIGV9ZnVuY3Rpb24gcihlKXtyZXR1cm4gZVtNXT0hMCxlfWZ1bmN0aW9uIG8oZSl7dmFyIHQ9ai5jcmVhdGVFbGVtZW50KCJmaWVsZHNldCIpO3RyeXtyZXR1cm4hIWUodCl9Y2F0Y2goZSl7cmV0dXJuITF9ZmluYWxseXt0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0KSx0PW51bGx9fWZ1bmN0aW9uIGkoZSx0KXtmb3IodmFyIG49ZS5zcGxpdCgifCIpLHI9bi5sZW5ndGg7ci0tOyl3LmF0dHJIYW5kbGVbbltyXV09dH1mdW5jdGlvbiBhKGUsdCl7dmFyIG49dCYmZSxyPW4mJjE9PT1lLm5vZGVUeXBlJiYxPT09dC5ub2RlVHlwZSYmZS5zb3VyY2VJbmRleC10LnNvdXJjZUluZGV4O2lmKHIpcmV0dXJuIHI7aWYobilmb3IoO249bi5uZXh0U2libGluZzspaWYobj09PXQpcmV0dXJuLTE7cmV0dXJuIGU/MTotMX1mdW5jdGlvbiBzKGUpe3JldHVybiBmdW5jdGlvbih0KXtyZXR1cm4iZm9ybSJpbiB0P3QucGFyZW50Tm9kZSYmITE9PT10LmRpc2FibGVkPyJsYWJlbCJpbiB0PyJsYWJlbCJpbiB0LnBhcmVudE5vZGU/dC5wYXJlbnROb2RlLmRpc2FibGVkPT09ZTp0LmRpc2FibGVkPT09ZTp0LmlzRGlzYWJsZWQ9PT1lfHx0LmlzRGlzYWJsZWQhPT0hZSYmX2UodCk9PT1lOnQuZGlzYWJsZWQ9PT1lOiJsYWJlbCJpbiB0JiZ0LmRpc2FibGVkPT09ZX19ZnVuY3Rpb24gdShlKXtyZXR1cm4gcihmdW5jdGlvbih0KXtyZXR1cm4gdD0rdCxyKGZ1bmN0aW9uKG4scil7Zm9yKHZhciBvLGk9ZShbXSxuLmxlbmd0aCx0KSxhPWkubGVuZ3RoO2EtLTspbltvPWlbYV1dJiYobltvXT0hKHJbb109bltvXSkpfSl9KX1mdW5jdGlvbiBjKGUpe3JldHVybiBlJiZ2b2lkIDAhPT1lLmdldEVsZW1lbnRzQnlUYWdOYW1lJiZlfWZ1bmN0aW9uIGwoKXt9ZnVuY3Rpb24gZihlKXtmb3IodmFyIHQ9MCxuPWUubGVuZ3RoLHI9IiI7dDxuO3QrKylyKz1lW3RdLnZhbHVlO3JldHVybiByfWZ1bmN0aW9uIHAoZSx0LG4pe3ZhciByPXQuZGlyLG89dC5uZXh0LGk9b3x8cixhPW4mJiJwYXJlbnROb2RlIj09PWkscz1GKys7cmV0dXJuIHQuZmlyc3Q/ZnVuY3Rpb24odCxuLG8pe2Zvcig7dD10W3JdOylpZigxPT09dC5ub2RlVHlwZXx8YSlyZXR1cm4gZSh0LG4sbyk7cmV0dXJuITF9OmZ1bmN0aW9uKHQsbix1KXt2YXIgYyxsLGYscD1bSCxzXTtpZih1KXtmb3IoO3Q9dFtyXTspaWYoKDE9PT10Lm5vZGVUeXBlfHxhKSYmZSh0LG4sdSkpcmV0dXJuITB9ZWxzZSBmb3IoO3Q9dFtyXTspaWYoMT09PXQubm9kZVR5cGV8fGEpaWYoZj10W01dfHwodFtNXT17fSksbD1mW3QudW5pcXVlSURdfHwoZlt0LnVuaXF1ZUlEXT17fSksbyYmbz09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSl0PXRbcl18fHQ7ZWxzZXtpZigoYz1sW2ldKSYmY1swXT09PUgmJmNbMV09PT1zKXJldHVybiBwWzJdPWNbMl07aWYobFtpXT1wLHBbMl09ZSh0LG4sdSkpcmV0dXJuITB9cmV0dXJuITF9fWZ1bmN0aW9uIGQoZSl7cmV0dXJuIGUubGVuZ3RoPjE/ZnVuY3Rpb24odCxuLHIpe2Zvcih2YXIgbz1lLmxlbmd0aDtvLS07KWlmKCFlW29dKHQsbixyKSlyZXR1cm4hMTtyZXR1cm4hMH06ZVswXX1mdW5jdGlvbiBoKGUsbixyKXtmb3IodmFyIG89MCxpPW4ubGVuZ3RoO288aTtvKyspdChlLG5bb10scik7cmV0dXJuIHJ9ZnVuY3Rpb24gdihlLHQsbixyLG8pe2Zvcih2YXIgaSxhPVtdLHM9MCx1PWUubGVuZ3RoLGM9bnVsbCE9dDtzPHU7cysrKShpPWVbc10pJiYobiYmIW4oaSxyLG8pfHwoYS5wdXNoKGkpLGMmJnQucHVzaChzKSkpO3JldHVybiBhfWZ1bmN0aW9uIG0oZSx0LG4sbyxpLGEpe3JldHVybiBvJiYhb1tNXSYmKG89bShvKSksaSYmIWlbTV0mJihpPW0oaSxhKSkscihmdW5jdGlvbihyLGEscyx1KXt2YXIgYyxsLGYscD1bXSxkPVtdLG09YS5sZW5ndGgseT1yfHxoKHR8fCIqIixzLm5vZGVUeXBlP1tzXTpzLFtdKSxnPSFlfHwhciYmdD95OnYoeSxwLGUscyx1KSxiPW4/aXx8KHI/ZTptfHxvKT9bXTphOmc7aWYobiYmbihnLGIscyx1KSxvKWZvcihjPXYoYixkKSxvKGMsW10scyx1KSxsPWMubGVuZ3RoO2wtLTspKGY9Y1tsXSkmJihiW2RbbF1dPSEoZ1tkW2xdXT1mKSk7aWYocil7aWYoaXx8ZSl7aWYoaSl7Zm9yKGM9W10sbD1iLmxlbmd0aDtsLS07KShmPWJbbF0pJiZjLnB1c2goZ1tsXT1mKTtpKG51bGwsYj1bXSxjLHUpfWZvcihsPWIubGVuZ3RoO2wtLTspKGY9YltsXSkmJihjPWk/UShyLGYpOnBbbF0pPi0xJiYocltjXT0hKGFbY109ZikpfX1lbHNlIGI9dihiPT09YT9iLnNwbGljZShtLGIubGVuZ3RoKTpiKSxpP2kobnVsbCxhLGIsdSk6Ry5hcHBseShhLGIpfSl9ZnVuY3Rpb24geShlKXtmb3IodmFyIHQsbixyLG89ZS5sZW5ndGgsaT13LnJlbGF0aXZlW2VbMF0udHlwZV0sYT1pfHx3LnJlbGF0aXZlWyIgIl0scz1pPzE6MCx1PXAoZnVuY3Rpb24oZSl7cmV0dXJuIGU9PT10fSxhLCEwKSxjPXAoZnVuY3Rpb24oZSl7cmV0dXJuIFEodCxlKT4tMX0sYSwhMCksbD1bZnVuY3Rpb24oZSxuLHIpe3ZhciBvPSFpJiYocnx8biE9PVMpfHwoKHQ9bikubm9kZVR5cGU/dShlLG4scik6YyhlLG4scikpO3JldHVybiB0PW51bGwsb31dO3M8bztzKyspaWYobj13LnJlbGF0aXZlW2Vbc10udHlwZV0pbD1bcChkKGwpLG4pXTtlbHNle2lmKG49dy5maWx0ZXJbZVtzXS50eXBlXS5hcHBseShudWxsLGVbc10ubWF0Y2hlcyksbltNXSl7Zm9yKHI9KytzO3I8byYmIXcucmVsYXRpdmVbZVtyXS50eXBlXTtyKyspO3JldHVybiBtKHM+MSYmZChsKSxzPjEmJmYoZS5zbGljZSgwLHMtMSkuY29uY2F0KHt2YWx1ZToiICI9PT1lW3MtMl0udHlwZT8iKiI6IiJ9KSkucmVwbGFjZShpZSwiJDEiKSxuLHM8ciYmeShlLnNsaWNlKHMscikpLHI8byYmeShlPWUuc2xpY2UocikpLHI8byYmZihlKSl9bC5wdXNoKG4pfXJldHVybiBkKGwpfWZ1bmN0aW9uIGcoZSxuKXt2YXIgbz1uLmxlbmd0aD4wLGk9ZS5sZW5ndGg+MCxhPWZ1bmN0aW9uKHIsYSxzLHUsYyl7dmFyIGwsZixwLGQ9MCxoPSIwIixtPXImJltdLHk9W10sZz1TLGI9cnx8aSYmdy5maW5kLlRBRygiKiIsYykseD1IKz1udWxsPT1nPzE6TWF0aC5yYW5kb20oKXx8LjEsXz1iLmxlbmd0aDtmb3IoYyYmKFM9YT09PWp8fGF8fGMpO2ghPT1fJiZudWxsIT0obD1iW2hdKTtoKyspe2lmKGkmJmwpe2ZvcihmPTAsYXx8bC5vd25lckRvY3VtZW50PT09anx8KE8obCkscz0hTCk7cD1lW2YrK107KWlmKHAobCxhfHxqLHMpKXt1LnB1c2gobCk7YnJlYWt9YyYmKEg9eCl9byYmKChsPSFwJiZsKSYmZC0tLHImJm0ucHVzaChsKSl9aWYoZCs9aCxvJiZoIT09ZCl7Zm9yKGY9MDtwPW5bZisrXTspcChtLHksYSxzKTtpZihyKXtpZihkPjApZm9yKDtoLS07KW1baF18fHlbaF18fCh5W2hdPUouY2FsbCh1KSk7eT12KHkpfUcuYXBwbHkodSx5KSxjJiYhciYmeS5sZW5ndGg+MCYmZCtuLmxlbmd0aD4xJiZ0LnVuaXF1ZVNvcnQodSl9cmV0dXJuIGMmJihIPXgsUz1nKSxtfTtyZXR1cm4gbz9yKGEpOmF9dmFyIGIseCx3LF8sQyxULGssQSxTLCQsRSxPLGosTixMLEQsSSxSLFAsTT0ic2l6emxlIisxKm5ldyBEYXRlLHE9ZS5kb2N1bWVudCxIPTAsRj0wLEI9bigpLFU9bigpLFc9bigpLHo9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT09PXQmJihFPSEwKSwwfSxWPXt9Lmhhc093blByb3BlcnR5LFg9W10sSj1YLnBvcCxLPVgucHVzaCxHPVgucHVzaCxZPVguc2xpY2UsUT1mdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0wLHI9ZS5sZW5ndGg7bjxyO24rKylpZihlW25dPT09dClyZXR1cm4gbjtyZXR1cm4tMX0sWj0iY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWQiLGVlPSJbXFx4MjBcXHRcXHJcXG5cXGZdIix0ZT0iKD86XFxcXC58W1xcdy1dfFteXDAtXFx4YTBdKSsiLG5lPSJcXFsiK2VlKyIqKCIrdGUrIikoPzoiK2VlKyIqKFsqXiR8IX5dPz0pIitlZSsiKig/OicoKD86XFxcXC58W15cXFxcJ10pKiknfFwiKCg/OlxcXFwufFteXFxcXFwiXSkqKVwifCgiK3RlKyIpKXwpIitlZSsiKlxcXSIscmU9IjooIit0ZSsiKSg/OlxcKCgoJygoPzpcXFxcLnxbXlxcXFwnXSkqKSd8XCIoKD86XFxcXC58W15cXFxcXCJdKSopXCIpfCgoPzpcXFxcLnxbXlxcXFwoKVtcXF1dfCIrbmUrIikqKXwuKilcXCl8KSIsb2U9bmV3IFJlZ0V4cChlZSsiKyIsImciKSxpZT1uZXcgUmVnRXhwKCJeIitlZSsiK3woKD86XnxbXlxcXFxdKSg/OlxcXFwuKSopIitlZSsiKyQiLCJnIiksYWU9bmV3IFJlZ0V4cCgiXiIrZWUrIiosIitlZSsiKiIpLHNlPW5ldyBSZWdFeHAoIl4iK2VlKyIqKFs+K35dfCIrZWUrIikiK2VlKyIqIiksdWU9bmV3IFJlZ0V4cCgiPSIrZWUrIiooW15cXF0nXCJdKj8pIitlZSsiKlxcXSIsImciKSxjZT1uZXcgUmVnRXhwKHJlKSxsZT1uZXcgUmVnRXhwKCJeIit0ZSsiJCIpLGZlPXtJRDpuZXcgUmVnRXhwKCJeIygiK3RlKyIpIiksQ0xBU1M6bmV3IFJlZ0V4cCgiXlxcLigiK3RlKyIpIiksVEFHOm5ldyBSZWdFeHAoIl4oIit0ZSsifFsqXSkiKSxBVFRSOm5ldyBSZWdFeHAoIl4iK25lKSxQU0VVRE86bmV3IFJlZ0V4cCgiXiIrcmUpLENISUxEOm5ldyBSZWdFeHAoIl46KG9ubHl8Zmlyc3R8bGFzdHxudGh8bnRoLWxhc3QpLShjaGlsZHxvZi10eXBlKSg/OlxcKCIrZWUrIiooZXZlbnxvZGR8KChbKy1dfCkoXFxkKilufCkiK2VlKyIqKD86KFsrLV18KSIrZWUrIiooXFxkKyl8KSkiK2VlKyIqXFwpfCkiLCJpIiksYm9vbDpuZXcgUmVnRXhwKCJeKD86IitaKyIpJCIsImkiKSxuZWVkc0NvbnRleHQ6bmV3IFJlZ0V4cCgiXiIrZWUrIipbPit+XXw6KGV2ZW58b2RkfGVxfGd0fGx0fG50aHxmaXJzdHxsYXN0KSg/OlxcKCIrZWUrIiooKD86LVxcZCk/XFxkKikiK2VlKyIqXFwpfCkoPz1bXi1dfCQpIiwiaSIpfSxwZT0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLGRlPS9eaFxkJC9pLGhlPS9eW157XStce1xzKlxbbmF0aXZlIFx3Lyx2ZT0vXig/OiMoW1x3LV0rKXwoXHcrKXxcLihbXHctXSspKSQvLG1lPS9bK35dLyx5ZT1uZXcgUmVnRXhwKCJcXFxcKFtcXGRhLWZdezEsNn0iK2VlKyI/fCgiK2VlKyIpfC4pIiwiaWciKSxnZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9IjB4Iit0LTY1NTM2O3JldHVybiByIT09cnx8bj90OnI8MD9TdHJpbmcuZnJvbUNoYXJDb2RlKHIrNjU1MzYpOlN0cmluZy5mcm9tQ2hhckNvZGUocj4+MTB8NTUyOTYsMTAyMyZyfDU2MzIwKX0sYmU9LyhbXDAtXHgxZlx4N2ZdfF4tP1xkKXxeLSR8W15cMC1ceDFmXHg3Zi1cdUZGRkZcdy1dL2cseGU9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD8iXDAiPT09ZT8i77+9IjplLnNsaWNlKDAsLTEpKyJcXCIrZS5jaGFyQ29kZUF0KGUubGVuZ3RoLTEpLnRvU3RyaW5nKDE2KSsiICI6IlxcIitlfSx3ZT1mdW5jdGlvbigpe08oKX0sX2U9cChmdW5jdGlvbihlKXtyZXR1cm4hMD09PWUuZGlzYWJsZWQmJigiZm9ybSJpbiBlfHwibGFiZWwiaW4gZSl9LHtkaXI6InBhcmVudE5vZGUiLG5leHQ6ImxlZ2VuZCJ9KTt0cnl7Ry5hcHBseShYPVkuY2FsbChxLmNoaWxkTm9kZXMpLHEuY2hpbGROb2RlcyksWFtxLmNoaWxkTm9kZXMubGVuZ3RoXS5ub2RlVHlwZX1jYXRjaChlKXtHPXthcHBseTpYLmxlbmd0aD9mdW5jdGlvbihlLHQpe0suYXBwbHkoZSxZLmNhbGwodCkpfTpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj1lLmxlbmd0aCxyPTA7ZVtuKytdPXRbcisrXTspO2UubGVuZ3RoPW4tMX19fXg9dC5zdXBwb3J0PXt9LEM9dC5pc1hNTD1mdW5jdGlvbihlKXt2YXIgdD1lJiYoZS5vd25lckRvY3VtZW50fHxlKS5kb2N1bWVudEVsZW1lbnQ7cmV0dXJuISF0JiYiSFRNTCIhPT10Lm5vZGVOYW1lfSxPPXQuc2V0RG9jdW1lbnQ9ZnVuY3Rpb24oZSl7dmFyIHQsbixyPWU/ZS5vd25lckRvY3VtZW50fHxlOnE7cmV0dXJuIHIhPT1qJiY5PT09ci5ub2RlVHlwZSYmci5kb2N1bWVudEVsZW1lbnQ/KGo9cixOPWouZG9jdW1lbnRFbGVtZW50LEw9IUMoaikscSE9PWomJihuPWouZGVmYXVsdFZpZXcpJiZuLnRvcCE9PW4mJihuLmFkZEV2ZW50TGlzdGVuZXI/bi5hZGRFdmVudExpc3RlbmVyKCJ1bmxvYWQiLHdlLCExKTpuLmF0dGFjaEV2ZW50JiZuLmF0dGFjaEV2ZW50KCJvbnVubG9hZCIsd2UpKSx4LmF0dHJpYnV0ZXM9byhmdW5jdGlvbihlKXtyZXR1cm4gZS5jbGFzc05hbWU9ImkiLCFlLmdldEF0dHJpYnV0ZSgiY2xhc3NOYW1lIil9KSx4LmdldEVsZW1lbnRzQnlUYWdOYW1lPW8oZnVuY3Rpb24oZSl7cmV0dXJuIGUuYXBwZW5kQ2hpbGQoai5jcmVhdGVDb21tZW50KCIiKSksIWUuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIioiKS5sZW5ndGh9KSx4LmdldEVsZW1lbnRzQnlDbGFzc05hbWU9aGUudGVzdChqLmdldEVsZW1lbnRzQnlDbGFzc05hbWUpLHguZ2V0QnlJZD1vKGZ1bmN0aW9uKGUpe3JldHVybiBOLmFwcGVuZENoaWxkKGUpLmlkPU0sIWouZ2V0RWxlbWVudHNCeU5hbWV8fCFqLmdldEVsZW1lbnRzQnlOYW1lKE0pLmxlbmd0aH0pLHguZ2V0QnlJZD8ody5maWx0ZXIuSUQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5yZXBsYWNlKHllLGdlKTtyZXR1cm4gZnVuY3Rpb24oZSl7cmV0dXJuIGUuZ2V0QXR0cmlidXRlKCJpZCIpPT09dH19LHcuZmluZC5JRD1mdW5jdGlvbihlLHQpe2lmKHZvaWQgMCE9PXQuZ2V0RWxlbWVudEJ5SWQmJkwpe3ZhciBuPXQuZ2V0RWxlbWVudEJ5SWQoZSk7cmV0dXJuIG4/W25dOltdfX0pOih3LmZpbHRlci5JRD1mdW5jdGlvbihlKXt2YXIgdD1lLnJlcGxhY2UoeWUsZ2UpO3JldHVybiBmdW5jdGlvbihlKXt2YXIgbj12b2lkIDAhPT1lLmdldEF0dHJpYnV0ZU5vZGUmJmUuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKTtyZXR1cm4gbiYmbi52YWx1ZT09PXR9fSx3LmZpbmQuSUQ9ZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10LmdldEVsZW1lbnRCeUlkJiZMKXt2YXIgbixyLG8saT10LmdldEVsZW1lbnRCeUlkKGUpO2lmKGkpe2lmKChuPWkuZ2V0QXR0cmlidXRlTm9kZSgiaWQiKSkmJm4udmFsdWU9PT1lKXJldHVybltpXTtmb3Iobz10LmdldEVsZW1lbnRzQnlOYW1lKGUpLHI9MDtpPW9bcisrXTspaWYoKG49aS5nZXRBdHRyaWJ1dGVOb2RlKCJpZCIpKSYmbi52YWx1ZT09PWUpcmV0dXJuW2ldfXJldHVybltdfX0pLHcuZmluZC5UQUc9eC5nZXRFbGVtZW50c0J5VGFnTmFtZT9mdW5jdGlvbihlLHQpe3JldHVybiB2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlUYWdOYW1lP3QuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk6eC5xc2E/dC5xdWVyeVNlbGVjdG9yQWxsKGUpOnZvaWQgMH06ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLG89MCxpPXQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoZSk7aWYoIioiPT09ZSl7Zm9yKDtuPWlbbysrXTspMT09PW4ubm9kZVR5cGUmJnIucHVzaChuKTtyZXR1cm4gcn1yZXR1cm4gaX0sdy5maW5kLkNMQVNTPXguZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSYmZnVuY3Rpb24oZSx0KXtpZih2b2lkIDAhPT10LmdldEVsZW1lbnRzQnlDbGFzc05hbWUmJkwpcmV0dXJuIHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShlKX0sST1bXSxEPVtdLCh4LnFzYT1oZS50ZXN0KGoucXVlcnlTZWxlY3RvckFsbCkpJiYobyhmdW5jdGlvbihlKXtOLmFwcGVuZENoaWxkKGUpLmlubmVySFRNTD0iPGEgaWQ9JyIrTSsiJz48L2E+PHNlbGVjdCBpZD0nIitNKyItXHJcXCcgbXNhbGxvd2NhcHR1cmU9Jyc+PG9wdGlvbiBzZWxlY3RlZD0nJz48L29wdGlvbj48L3NlbGVjdD4iLGUucXVlcnlTZWxlY3RvckFsbCgiW21zYWxsb3djYXB0dXJlXj0nJ10iKS5sZW5ndGgmJkQucHVzaCgiWypeJF09IitlZSsiKig/OicnfFwiXCIpIiksZS5xdWVyeVNlbGVjdG9yQWxsKCJbc2VsZWN0ZWRdIikubGVuZ3RofHxELnB1c2goIlxcWyIrZWUrIiooPzp2YWx1ZXwiK1orIikiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltpZH49IitNKyItXSIpLmxlbmd0aHx8RC5wdXNoKCJ+PSIpLGUucXVlcnlTZWxlY3RvckFsbCgiOmNoZWNrZWQiKS5sZW5ndGh8fEQucHVzaCgiOmNoZWNrZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoImEjIitNKyIrKiIpLmxlbmd0aHx8RC5wdXNoKCIuIy4rWyt+XSIpfSksbyhmdW5jdGlvbihlKXtlLmlubmVySFRNTD0iPGEgaHJlZj0nJyBkaXNhYmxlZD0nZGlzYWJsZWQnPjwvYT48c2VsZWN0IGRpc2FibGVkPSdkaXNhYmxlZCc+PG9wdGlvbi8+PC9zZWxlY3Q+Ijt2YXIgdD1qLmNyZWF0ZUVsZW1lbnQoImlucHV0Iik7dC5zZXRBdHRyaWJ1dGUoInR5cGUiLCJoaWRkZW4iKSxlLmFwcGVuZENoaWxkKHQpLnNldEF0dHJpYnV0ZSgibmFtZSIsIkQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIltuYW1lPWRdIikubGVuZ3RoJiZELnB1c2goIm5hbWUiK2VlKyIqWypeJHwhfl0/PSIpLDIhPT1lLnF1ZXJ5U2VsZWN0b3JBbGwoIjplbmFibGVkIikubGVuZ3RoJiZELnB1c2goIjplbmFibGVkIiwiOmRpc2FibGVkIiksTi5hcHBlbmRDaGlsZChlKS5kaXNhYmxlZD0hMCwyIT09ZS5xdWVyeVNlbGVjdG9yQWxsKCI6ZGlzYWJsZWQiKS5sZW5ndGgmJkQucHVzaCgiOmVuYWJsZWQiLCI6ZGlzYWJsZWQiKSxlLnF1ZXJ5U2VsZWN0b3JBbGwoIiosOngiKSxELnB1c2goIiwuKjoiKX0pKSwoeC5tYXRjaGVzU2VsZWN0b3I9aGUudGVzdChSPU4ubWF0Y2hlc3x8Ti53ZWJraXRNYXRjaGVzU2VsZWN0b3J8fE4ubW96TWF0Y2hlc1NlbGVjdG9yfHxOLm9NYXRjaGVzU2VsZWN0b3J8fE4ubXNNYXRjaGVzU2VsZWN0b3IpKSYmbyhmdW5jdGlvbihlKXt4LmRpc2Nvbm5lY3RlZE1hdGNoPVIuY2FsbChlLCIqIiksUi5jYWxsKGUsIltzIT0nJ106eCIpLEkucHVzaCgiIT0iLHJlKX0pLEQ9RC5sZW5ndGgmJm5ldyBSZWdFeHAoRC5qb2luKCJ8IikpLEk9SS5sZW5ndGgmJm5ldyBSZWdFeHAoSS5qb2luKCJ8IikpLHQ9aGUudGVzdChOLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKSxQPXR8fGhlLnRlc3QoTi5jb250YWlucyk/ZnVuY3Rpb24oZSx0KXt2YXIgbj05PT09ZS5ub2RlVHlwZT9lLmRvY3VtZW50RWxlbWVudDplLHI9dCYmdC5wYXJlbnROb2RlO3JldHVybiBlPT09cnx8ISghcnx8MSE9PXIubm9kZVR5cGV8fCEobi5jb250YWlucz9uLmNvbnRhaW5zKHIpOmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24mJjE2JmUuY29tcGFyZURvY3VtZW50UG9zaXRpb24ocikpKX06ZnVuY3Rpb24oZSx0KXtpZih0KWZvcig7dD10LnBhcmVudE5vZGU7KWlmKHQ9PT1lKXJldHVybiEwO3JldHVybiExfSx6PXQ/ZnVuY3Rpb24oZSx0KXtpZihlPT09dClyZXR1cm4gRT0hMCwwO3ZhciBuPSFlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uLSF0LmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uO3JldHVybiBufHwobj0oZS5vd25lckRvY3VtZW50fHxlKT09PSh0Lm93bmVyRG9jdW1lbnR8fHQpP2UuY29tcGFyZURvY3VtZW50UG9zaXRpb24odCk6MSwxJm58fCF4LnNvcnREZXRhY2hlZCYmdC5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbihlKT09PW4/ZT09PWp8fGUub3duZXJEb2N1bWVudD09PXEmJlAocSxlKT8tMTp0PT09anx8dC5vd25lckRvY3VtZW50PT09cSYmUChxLHQpPzE6JD9RKCQsZSktUSgkLHQpOjA6NCZuPy0xOjEpfTpmdW5jdGlvbihlLHQpe2lmKGU9PT10KXJldHVybiBFPSEwLDA7dmFyIG4scj0wLG89ZS5wYXJlbnROb2RlLGk9dC5wYXJlbnROb2RlLHM9W2VdLHU9W3RdO2lmKCFvfHwhaSlyZXR1cm4gZT09PWo/LTE6dD09PWo/MTpvPy0xOmk/MTokP1EoJCxlKS1RKCQsdCk6MDtpZihvPT09aSlyZXR1cm4gYShlLHQpO2ZvcihuPWU7bj1uLnBhcmVudE5vZGU7KXMudW5zaGlmdChuKTtmb3Iobj10O249bi5wYXJlbnROb2RlOyl1LnVuc2hpZnQobik7Zm9yKDtzW3JdPT09dVtyXTspcisrO3JldHVybiByP2Eoc1tyXSx1W3JdKTpzW3JdPT09cT8tMTp1W3JdPT09cT8xOjB9LGopOmp9LHQubWF0Y2hlcz1mdW5jdGlvbihlLG4pe3JldHVybiB0KGUsbnVsbCxudWxsLG4pfSx0Lm1hdGNoZXNTZWxlY3Rvcj1mdW5jdGlvbihlLG4pe2lmKChlLm93bmVyRG9jdW1lbnR8fGUpIT09aiYmTyhlKSxuPW4ucmVwbGFjZSh1ZSwiPSckMSddIikseC5tYXRjaGVzU2VsZWN0b3ImJkwmJiFXW24rIiAiXSYmKCFJfHwhSS50ZXN0KG4pKSYmKCFEfHwhRC50ZXN0KG4pKSl0cnl7dmFyIHI9Ui5jYWxsKGUsbik7aWYocnx8eC5kaXNjb25uZWN0ZWRNYXRjaHx8ZS5kb2N1bWVudCYmMTEhPT1lLmRvY3VtZW50Lm5vZGVUeXBlKXJldHVybiByfWNhdGNoKGUpe31yZXR1cm4gdChuLGosbnVsbCxbZV0pLmxlbmd0aD4wfSx0LmNvbnRhaW5zPWZ1bmN0aW9uKGUsdCl7cmV0dXJuKGUub3duZXJEb2N1bWVudHx8ZSkhPT1qJiZPKGUpLFAoZSx0KX0sdC5hdHRyPWZ1bmN0aW9uKGUsdCl7KGUub3duZXJEb2N1bWVudHx8ZSkhPT1qJiZPKGUpO3ZhciBuPXcuYXR0ckhhbmRsZVt0LnRvTG93ZXJDYXNlKCldLHI9biYmVi5jYWxsKHcuYXR0ckhhbmRsZSx0LnRvTG93ZXJDYXNlKCkpP24oZSx0LCFMKTp2b2lkIDA7cmV0dXJuIHZvaWQgMCE9PXI/cjp4LmF0dHJpYnV0ZXN8fCFMP2UuZ2V0QXR0cmlidXRlKHQpOihyPWUuZ2V0QXR0cmlidXRlTm9kZSh0KSkmJnIuc3BlY2lmaWVkP3IudmFsdWU6bnVsbH0sdC5lc2NhcGU9ZnVuY3Rpb24oZSl7cmV0dXJuKGUrIiIpLnJlcGxhY2UoYmUseGUpfSx0LmVycm9yPWZ1bmN0aW9uKGUpe3Rocm93IG5ldyBFcnJvcigiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogIitlKX0sdC51bmlxdWVTb3J0PWZ1bmN0aW9uKGUpe3ZhciB0LG49W10scj0wLG89MDtpZihFPSF4LmRldGVjdER1cGxpY2F0ZXMsJD0heC5zb3J0U3RhYmxlJiZlLnNsaWNlKDApLGUuc29ydCh6KSxFKXtmb3IoO3Q9ZVtvKytdOyl0PT09ZVtvXSYmKHI9bi5wdXNoKG8pKTtmb3IoO3ItLTspZS5zcGxpY2UobltyXSwxKX1yZXR1cm4gJD1udWxsLGV9LF89dC5nZXRUZXh0PWZ1bmN0aW9uKGUpe3ZhciB0LG49IiIscj0wLG89ZS5ub2RlVHlwZTtpZihvKXtpZigxPT09b3x8OT09PW98fDExPT09byl7aWYoInN0cmluZyI9PXR5cGVvZiBlLnRleHRDb250ZW50KXJldHVybiBlLnRleHRDb250ZW50O2ZvcihlPWUuZmlyc3RDaGlsZDtlO2U9ZS5uZXh0U2libGluZyluKz1fKGUpfWVsc2UgaWYoMz09PW98fDQ9PT1vKXJldHVybiBlLm5vZGVWYWx1ZX1lbHNlIGZvcig7dD1lW3IrK107KW4rPV8odCk7cmV0dXJuIG59LHc9dC5zZWxlY3RvcnM9e2NhY2hlTGVuZ3RoOjUwLGNyZWF0ZVBzZXVkbzpyLG1hdGNoOmZlLGF0dHJIYW5kbGU6e30sZmluZDp7fSxyZWxhdGl2ZTp7Ij4iOntkaXI6InBhcmVudE5vZGUiLGZpcnN0OiEwfSwiICI6e2RpcjoicGFyZW50Tm9kZSJ9LCIrIjp7ZGlyOiJwcmV2aW91c1NpYmxpbmciLGZpcnN0OiEwfSwifiI6e2RpcjoicHJldmlvdXNTaWJsaW5nIn19LHByZUZpbHRlcjp7QVRUUjpmdW5jdGlvbihlKXtyZXR1cm4gZVsxXT1lWzFdLnJlcGxhY2UoeWUsZ2UpLGVbM109KGVbM118fGVbNF18fGVbNV18fCIiKS5yZXBsYWNlKHllLGdlKSwifj0iPT09ZVsyXSYmKGVbM109IiAiK2VbM10rIiAiKSxlLnNsaWNlKDAsNCl9LENISUxEOmZ1bmN0aW9uKGUpe3JldHVybiBlWzFdPWVbMV0udG9Mb3dlckNhc2UoKSwibnRoIj09PWVbMV0uc2xpY2UoMCwzKT8oZVszXXx8dC5lcnJvcihlWzBdKSxlWzRdPSsoZVs0XT9lWzVdKyhlWzZdfHwxKToyKigiZXZlbiI9PT1lWzNdfHwib2RkIj09PWVbM10pKSxlWzVdPSsoZVs3XStlWzhdfHwib2RkIj09PWVbM10pKTplWzNdJiZ0LmVycm9yKGVbMF0pLGV9LFBTRVVETzpmdW5jdGlvbihlKXt2YXIgdCxuPSFlWzZdJiZlWzJdO3JldHVybiBmZS5DSElMRC50ZXN0KGVbMF0pP251bGw6KGVbM10/ZVsyXT1lWzRdfHxlWzVdfHwiIjpuJiZjZS50ZXN0KG4pJiYodD1UKG4sITApKSYmKHQ9bi5pbmRleE9mKCIpIixuLmxlbmd0aC10KS1uLmxlbmd0aCkmJihlWzBdPWVbMF0uc2xpY2UoMCx0KSxlWzJdPW4uc2xpY2UoMCx0KSksZS5zbGljZSgwLDMpKX19LGZpbHRlcjp7VEFHOmZ1bmN0aW9uKGUpe3ZhciB0PWUucmVwbGFjZSh5ZSxnZSkudG9Mb3dlckNhc2UoKTtyZXR1cm4iKiI9PT1lP2Z1bmN0aW9uKCl7cmV0dXJuITB9OmZ1bmN0aW9uKGUpe3JldHVybiBlLm5vZGVOYW1lJiZlLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT10fX0sQ0xBU1M6ZnVuY3Rpb24oZSl7dmFyIHQ9QltlKyIgIl07cmV0dXJuIHR8fCh0PW5ldyBSZWdFeHAoIihefCIrZWUrIikiK2UrIigiK2VlKyJ8JCkiKSkmJkIoZSxmdW5jdGlvbihlKXtyZXR1cm4gdC50ZXN0KCJzdHJpbmciPT10eXBlb2YgZS5jbGFzc05hbWUmJmUuY2xhc3NOYW1lfHx2b2lkIDAhPT1lLmdldEF0dHJpYnV0ZSYmZS5nZXRBdHRyaWJ1dGUoImNsYXNzIil8fCIiKX0pfSxBVFRSOmZ1bmN0aW9uKGUsbixyKXtyZXR1cm4gZnVuY3Rpb24obyl7dmFyIGk9dC5hdHRyKG8sZSk7cmV0dXJuIG51bGw9PWk/IiE9Ij09PW46IW58fChpKz0iIiwiPSI9PT1uP2k9PT1yOiIhPSI9PT1uP2khPT1yOiJePSI9PT1uP3ImJjA9PT1pLmluZGV4T2Yocik6Iio9Ij09PW4/ciYmaS5pbmRleE9mKHIpPi0xOiIkPSI9PT1uP3ImJmkuc2xpY2UoLXIubGVuZ3RoKT09PXI6In49Ij09PW4/KCIgIitpLnJlcGxhY2Uob2UsIiAiKSsiICIpLmluZGV4T2Yocik+LTE6Inw9Ij09PW4mJihpPT09cnx8aS5zbGljZSgwLHIubGVuZ3RoKzEpPT09cisiLSIpKX19LENISUxEOmZ1bmN0aW9uKGUsdCxuLHIsbyl7dmFyIGk9Im50aCIhPT1lLnNsaWNlKDAsMyksYT0ibGFzdCIhPT1lLnNsaWNlKC00KSxzPSJvZi10eXBlIj09PXQ7cmV0dXJuIDE9PT1yJiYwPT09bz9mdW5jdGlvbihlKXtyZXR1cm4hIWUucGFyZW50Tm9kZX06ZnVuY3Rpb24odCxuLHUpe3ZhciBjLGwsZixwLGQsaCx2PWkhPT1hPyJuZXh0U2libGluZyI6InByZXZpb3VzU2libGluZyIsbT10LnBhcmVudE5vZGUseT1zJiZ0Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksZz0hdSYmIXMsYj0hMTtpZihtKXtpZihpKXtmb3IoO3Y7KXtmb3IocD10O3A9cFt2XTspaWYocz9wLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk9PT15OjE9PT1wLm5vZGVUeXBlKXJldHVybiExO2g9dj0ib25seSI9PT1lJiYhaCYmIm5leHRTaWJsaW5nIn1yZXR1cm4hMH1pZihoPVthP20uZmlyc3RDaGlsZDptLmxhc3RDaGlsZF0sYSYmZyl7Zm9yKHA9bSxmPXBbTV18fChwW01dPXt9KSxsPWZbcC51bmlxdWVJRF18fChmW3AudW5pcXVlSURdPXt9KSxjPWxbZV18fFtdLGQ9Y1swXT09PUgmJmNbMV0sYj1kJiZjWzJdLHA9ZCYmbS5jaGlsZE5vZGVzW2RdO3A9KytkJiZwJiZwW3ZdfHwoYj1kPTApfHxoLnBvcCgpOylpZigxPT09cC5ub2RlVHlwZSYmKytiJiZwPT09dCl7bFtlXT1bSCxkLGJdO2JyZWFrfX1lbHNlIGlmKGcmJihwPXQsZj1wW01dfHwocFtNXT17fSksbD1mW3AudW5pcXVlSURdfHwoZltwLnVuaXF1ZUlEXT17fSksYz1sW2VdfHxbXSxkPWNbMF09PT1IJiZjWzFdLGI9ZCksITE9PT1iKWZvcig7KHA9KytkJiZwJiZwW3ZdfHwoYj1kPTApfHxoLnBvcCgpKSYmKChzP3Aubm9kZU5hbWUudG9Mb3dlckNhc2UoKSE9PXk6MSE9PXAubm9kZVR5cGUpfHwhKytifHwoZyYmKGY9cFtNXXx8KHBbTV09e30pLGw9ZltwLnVuaXF1ZUlEXXx8KGZbcC51bmlxdWVJRF09e30pLGxbZV09W0gsYl0pLHAhPT10KSk7KTtyZXR1cm4oYi09byk9PT1yfHxiJXI9PTAmJmIvcj49MH19fSxQU0VVRE86ZnVuY3Rpb24oZSxuKXt2YXIgbyxpPXcucHNldWRvc1tlXXx8dy5zZXRGaWx0ZXJzW2UudG9Mb3dlckNhc2UoKV18fHQuZXJyb3IoInVuc3VwcG9ydGVkIHBzZXVkbzogIitlKTtyZXR1cm4gaVtNXT9pKG4pOmkubGVuZ3RoPjE/KG89W2UsZSwiIixuXSx3LnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoZS50b0xvd2VyQ2FzZSgpKT9yKGZ1bmN0aW9uKGUsdCl7Zm9yKHZhciByLG89aShlLG4pLGE9by5sZW5ndGg7YS0tOylyPVEoZSxvW2FdKSxlW3JdPSEodFtyXT1vW2FdKX0pOmZ1bmN0aW9uKGUpe3JldHVybiBpKGUsMCxvKX0pOml9fSxwc2V1ZG9zOntub3Q6cihmdW5jdGlvbihlKXt2YXIgdD1bXSxuPVtdLG89ayhlLnJlcGxhY2UoaWUsIiQxIikpO3JldHVybiBvW01dP3IoZnVuY3Rpb24oZSx0LG4scil7Zm9yKHZhciBpLGE9byhlLG51bGwscixbXSkscz1lLmxlbmd0aDtzLS07KShpPWFbc10pJiYoZVtzXT0hKHRbc109aSkpfSk6ZnVuY3Rpb24oZSxyLGkpe3JldHVybiB0WzBdPWUsbyh0LG51bGwsaSxuKSx0WzBdPW51bGwsIW4ucG9wKCl9fSksaGFzOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGZ1bmN0aW9uKG4pe3JldHVybiB0KGUsbikubGVuZ3RoPjB9fSksY29udGFpbnM6cihmdW5jdGlvbihlKXtyZXR1cm4gZT1lLnJlcGxhY2UoeWUsZ2UpLGZ1bmN0aW9uKHQpe3JldHVybih0LnRleHRDb250ZW50fHx0LmlubmVyVGV4dHx8Xyh0KSkuaW5kZXhPZihlKT4tMX19KSxsYW5nOnIoZnVuY3Rpb24oZSl7cmV0dXJuIGxlLnRlc3QoZXx8IiIpfHx0LmVycm9yKCJ1bnN1cHBvcnRlZCBsYW5nOiAiK2UpLGU9ZS5yZXBsYWNlKHllLGdlKS50b0xvd2VyQ2FzZSgpLGZ1bmN0aW9uKHQpe3ZhciBuO2Rve2lmKG49TD90Lmxhbmc6dC5nZXRBdHRyaWJ1dGUoInhtbDpsYW5nIil8fHQuZ2V0QXR0cmlidXRlKCJsYW5nIikpcmV0dXJuKG49bi50b0xvd2VyQ2FzZSgpKT09PWV8fDA9PT1uLmluZGV4T2YoZSsiLSIpfXdoaWxlKCh0PXQucGFyZW50Tm9kZSkmJjE9PT10Lm5vZGVUeXBlKTtyZXR1cm4hMX19KSx0YXJnZXQ6ZnVuY3Rpb24odCl7dmFyIG49ZS5sb2NhdGlvbiYmZS5sb2NhdGlvbi5oYXNoO3JldHVybiBuJiZuLnNsaWNlKDEpPT09dC5pZH0scm9vdDpmdW5jdGlvbihlKXtyZXR1cm4gZT09PU59LGZvY3VzOmZ1bmN0aW9uKGUpe3JldHVybiBlPT09ai5hY3RpdmVFbGVtZW50JiYoIWouaGFzRm9jdXN8fGouaGFzRm9jdXMoKSkmJiEhKGUudHlwZXx8ZS5ocmVmfHx+ZS50YWJJbmRleCl9LGVuYWJsZWQ6cyghMSksZGlzYWJsZWQ6cyghMCksY2hlY2tlZDpmdW5jdGlvbihlKXt2YXIgdD1lLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuImlucHV0Ij09PXQmJiEhZS5jaGVja2VkfHwib3B0aW9uIj09PXQmJiEhZS5zZWxlY3RlZH0sc2VsZWN0ZWQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGUucGFyZW50Tm9kZSYmZS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXgsITA9PT1lLnNlbGVjdGVkfSxlbXB0eTpmdW5jdGlvbihlKXtmb3IoZT1lLmZpcnN0Q2hpbGQ7ZTtlPWUubmV4dFNpYmxpbmcpaWYoZS5ub2RlVHlwZTw2KXJldHVybiExO3JldHVybiEwfSxwYXJlbnQ6ZnVuY3Rpb24oZSl7cmV0dXJuIXcucHNldWRvcy5lbXB0eShlKX0saGVhZGVyOmZ1bmN0aW9uKGUpe3JldHVybiBkZS50ZXN0KGUubm9kZU5hbWUpfSxpbnB1dDpmdW5jdGlvbihlKXtyZXR1cm4gcGUudGVzdChlLm5vZGVOYW1lKX0sYnV0dG9uOmZ1bmN0aW9uKGUpe3ZhciB0PWUubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtyZXR1cm4iaW5wdXQiPT09dCYmImJ1dHRvbiI9PT1lLnR5cGV8fCJidXR0b24iPT09dH0sdGV4dDpmdW5jdGlvbihlKXt2YXIgdDtyZXR1cm4iaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpJiYidGV4dCI9PT1lLnR5cGUmJihudWxsPT0odD1lLmdldEF0dHJpYnV0ZSgidHlwZSIpKXx8InRleHQiPT09dC50b0xvd2VyQ2FzZSgpKX0sZmlyc3Q6dShmdW5jdGlvbigpe3JldHVyblswXX0pLGxhc3Q6dShmdW5jdGlvbihlLHQpe3JldHVyblt0LTFdfSksZXE6dShmdW5jdGlvbihlLHQsbil7cmV0dXJuW248MD9uK3Q6bl19KSxldmVuOnUoZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49MDtuPHQ7bis9MillLnB1c2gobik7cmV0dXJuIGV9KSxvZGQ6dShmdW5jdGlvbihlLHQpe2Zvcih2YXIgbj0xO248dDtuKz0yKWUucHVzaChuKTtyZXR1cm4gZX0pLGx0OnUoZnVuY3Rpb24oZSx0LG4pe2Zvcih2YXIgcj1uPDA/bit0Om47LS1yPj0wOyllLnB1c2gocik7cmV0dXJuIGV9KSxndDp1KGZ1bmN0aW9uKGUsdCxuKXtmb3IodmFyIHI9bjwwP24rdDpuOysrcjx0OyllLnB1c2gocik7cmV0dXJuIGV9KX19LHcucHNldWRvcy5udGg9dy5wc2V1ZG9zLmVxO2ZvcihiIGlue3JhZGlvOiEwLGNoZWNrYm94OiEwLGZpbGU6ITAscGFzc3dvcmQ6ITAsaW1hZ2U6ITB9KXcucHNldWRvc1tiXT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCl7cmV0dXJuImlucHV0Ij09PXQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSYmdC50eXBlPT09ZX19KGIpO2ZvcihiIGlue3N1Ym1pdDohMCxyZXNldDohMH0pdy5wc2V1ZG9zW2JdPWZ1bmN0aW9uKGUpe3JldHVybiBmdW5jdGlvbih0KXt2YXIgbj10Lm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7cmV0dXJuKCJpbnB1dCI9PT1ufHwiYnV0dG9uIj09PW4pJiZ0LnR5cGU9PT1lfX0oYik7cmV0dXJuIGwucHJvdG90eXBlPXcuZmlsdGVycz13LnBzZXVkb3Msdy5zZXRGaWx0ZXJzPW5ldyBsLFQ9dC50b2tlbml6ZT1mdW5jdGlvbihlLG4pe3ZhciByLG8saSxhLHMsdSxjLGw9VVtlKyIgIl07aWYobClyZXR1cm4gbj8wOmwuc2xpY2UoMCk7Zm9yKHM9ZSx1PVtdLGM9dy5wcmVGaWx0ZXI7czspe3ImJiEobz1hZS5leGVjKHMpKXx8KG8mJihzPXMuc2xpY2Uob1swXS5sZW5ndGgpfHxzKSx1LnB1c2goaT1bXSkpLHI9ITEsKG89c2UuZXhlYyhzKSkmJihyPW8uc2hpZnQoKSxpLnB1c2goe3ZhbHVlOnIsdHlwZTpvWzBdLnJlcGxhY2UoaWUsIiAiKX0pLHM9cy5zbGljZShyLmxlbmd0aCkpO2ZvcihhIGluIHcuZmlsdGVyKSEobz1mZVthXS5leGVjKHMpKXx8Y1thXSYmIShvPWNbYV0obykpfHwocj1vLnNoaWZ0KCksaS5wdXNoKHt2YWx1ZTpyLHR5cGU6YSxtYXRjaGVzOm99KSxzPXMuc2xpY2Uoci5sZW5ndGgpKTtpZighcilicmVha31yZXR1cm4gbj9zLmxlbmd0aDpzP3QuZXJyb3IoZSk6VShlLHUpLnNsaWNlKDApfSxrPXQuY29tcGlsZT1mdW5jdGlvbihlLHQpe3ZhciBuLHI9W10sbz1bXSxpPVdbZSsiICJdO2lmKCFpKXtmb3IodHx8KHQ9VChlKSksbj10Lmxlbmd0aDtuLS07KWk9eSh0W25dKSxpW01dP3IucHVzaChpKTpvLnB1c2goaSk7aT1XKGUsZyhvLHIpKSxpLnNlbGVjdG9yPWV9cmV0dXJuIGl9LEE9dC5zZWxlY3Q9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG8saSxhLHMsdSxsPSJmdW5jdGlvbiI9PXR5cGVvZiBlJiZlLHA9IXImJlQoZT1sLnNlbGVjdG9yfHxlKTtpZihuPW58fFtdLDE9PT1wLmxlbmd0aCl7aWYoaT1wWzBdPXBbMF0uc2xpY2UoMCksaS5sZW5ndGg+MiYmIklEIj09PShhPWlbMF0pLnR5cGUmJjk9PT10Lm5vZGVUeXBlJiZMJiZ3LnJlbGF0aXZlW2lbMV0udHlwZV0pe2lmKCEodD0ody5maW5kLklEKGEubWF0Y2hlc1swXS5yZXBsYWNlKHllLGdlKSx0KXx8W10pWzBdKSlyZXR1cm4gbjtsJiYodD10LnBhcmVudE5vZGUpLGU9ZS5zbGljZShpLnNoaWZ0KCkudmFsdWUubGVuZ3RoKX1mb3Iobz1mZS5uZWVkc0NvbnRleHQudGVzdChlKT8wOmkubGVuZ3RoO28tLSYmKGE9aVtvXSwhdy5yZWxhdGl2ZVtzPWEudHlwZV0pOylpZigodT13LmZpbmRbc10pJiYocj11KGEubWF0Y2hlc1swXS5yZXBsYWNlKHllLGdlKSxtZS50ZXN0KGlbMF0udHlwZSkmJmModC5wYXJlbnROb2RlKXx8dCkpKXtpZihpLnNwbGljZShvLDEpLCEoZT1yLmxlbmd0aCYmZihpKSkpcmV0dXJuIEcuYXBwbHkobixyKSxuO2JyZWFrfX1yZXR1cm4obHx8ayhlLHApKShyLHQsIUwsbiwhdHx8bWUudGVzdChlKSYmYyh0LnBhcmVudE5vZGUpfHx0KSxufSx4LnNvcnRTdGFibGU9TS5zcGxpdCgiIikuc29ydCh6KS5qb2luKCIiKT09PU0seC5kZXRlY3REdXBsaWNhdGVzPSEhRSxPKCkseC5zb3J0RGV0YWNoZWQ9byhmdW5jdGlvbihlKXtyZXR1cm4gMSZlLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKGouY3JlYXRlRWxlbWVudCgiZmllbGRzZXQiKSl9KSxvKGZ1bmN0aW9uKGUpe3JldHVybiBlLmlubmVySFRNTD0iPGEgaHJlZj0nIyc+PC9hPiIsIiMiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgiaHJlZiIpfSl8fGkoInR5cGV8aHJlZnxoZWlnaHR8d2lkdGgiLGZ1bmN0aW9uKGUsdCxuKXtpZighbilyZXR1cm4gZS5nZXRBdHRyaWJ1dGUodCwidHlwZSI9PT10LnRvTG93ZXJDYXNlKCk/MToyKX0pLHguYXR0cmlidXRlcyYmbyhmdW5jdGlvbihlKXtyZXR1cm4gZS5pbm5lckhUTUw9IjxpbnB1dC8+IixlLmZpcnN0Q2hpbGQuc2V0QXR0cmlidXRlKCJ2YWx1ZSIsIiIpLCIiPT09ZS5maXJzdENoaWxkLmdldEF0dHJpYnV0ZSgidmFsdWUiKX0pfHxpKCJ2YWx1ZSIsZnVuY3Rpb24oZSx0LG4pe2lmKCFuJiYiaW5wdXQiPT09ZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpKXJldHVybiBlLmRlZmF1bHRWYWx1ZX0pLG8oZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWUuZ2V0QXR0cmlidXRlKCJkaXNhYmxlZCIpfSl8fGkoWixmdW5jdGlvbihlLHQsbil7dmFyIHI7aWYoIW4pcmV0dXJuITA9PT1lW3RdP3QudG9Mb3dlckNhc2UoKToocj1lLmdldEF0dHJpYnV0ZU5vZGUodCkpJiZyLnNwZWNpZmllZD9yLnZhbHVlOm51bGx9KSx0fShuKTtrZS5maW5kPVNlLGtlLmV4cHI9U2Uuc2VsZWN0b3JzLGtlLmV4cHJbIjoiXT1rZS5leHByLnBzZXVkb3Msa2UudW5pcXVlU29ydD1rZS51bmlxdWU9U2UudW5pcXVlU29ydCxrZS50ZXh0PVNlLmdldFRleHQsa2UuaXNYTUxEb2M9U2UuaXNYTUwsa2UuY29udGFpbnM9U2UuY29udGFpbnMsa2UuZXNjYXBlU2VsZWN0b3I9U2UuZXNjYXBlO3ZhciAkZT1mdW5jdGlvbihlLHQsbil7Zm9yKHZhciByPVtdLG89dm9pZCAwIT09bjsoZT1lW3RdKSYmOSE9PWUubm9kZVR5cGU7KWlmKDE9PT1lLm5vZGVUeXBlKXtpZihvJiZrZShlKS5pcyhuKSlicmVhaztyLnB1c2goZSl9cmV0dXJuIHJ9LEVlPWZ1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPVtdO2U7ZT1lLm5leHRTaWJsaW5nKTE9PT1lLm5vZGVUeXBlJiZlIT09dCYmbi5wdXNoKGUpO3JldHVybiBufSxPZT1rZS5leHByLm1hdGNoLm5lZWRzQ29udGV4dCxqZT0vXjwoW2Etel1bXlwvXDA+Olx4MjBcdFxyXG5cZl0qKVtceDIwXHRcclxuXGZdKlwvPz4oPzo8XC9cMT58KSQvaTtrZS5maWx0ZXI9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRbMF07cmV0dXJuIG4mJihlPSI6bm90KCIrZSsiKSIpLDE9PT10Lmxlbmd0aCYmMT09PXIubm9kZVR5cGU/a2UuZmluZC5tYXRjaGVzU2VsZWN0b3IocixlKT9bcl06W106a2UuZmluZC5tYXRjaGVzKGUsa2UuZ3JlcCh0LGZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZX0pKX0sa2UuZm4uZXh0ZW5kKHtmaW5kOmZ1bmN0aW9uKGUpe3ZhciB0LG4scj10aGlzLmxlbmd0aCxvPXRoaXM7aWYoInN0cmluZyIhPXR5cGVvZiBlKXJldHVybiB0aGlzLnB1c2hTdGFjayhrZShlKS5maWx0ZXIoZnVuY3Rpb24oKXtmb3IodD0wO3Q8cjt0KyspaWYoa2UuY29udGFpbnMob1t0XSx0aGlzKSlyZXR1cm4hMH0pKTtmb3Iobj10aGlzLnB1c2hTdGFjayhbXSksdD0wO3Q8cjt0Kyspa2UuZmluZChlLG9bdF0sbik7cmV0dXJuIHI+MT9rZS51bmlxdWVTb3J0KG4pOm59LGZpbHRlcjpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobCh0aGlzLGV8fFtdLCExKSl9LG5vdDpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5wdXNoU3RhY2sobCh0aGlzLGV8fFtdLCEwKSl9LGlzOmZ1bmN0aW9uKGUpe3JldHVybiEhbCh0aGlzLCJzdHJpbmciPT10eXBlb2YgZSYmT2UudGVzdChlKT9rZShlKTplfHxbXSwhMSkubGVuZ3RofX0pO3ZhciBOZSxMZT0vXig/OlxzKig8W1x3XFddKz4pW14+XSp8IyhbXHctXSspKSQvOyhrZS5mbi5pbml0PWZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvO2lmKCFlKXJldHVybiB0aGlzO2lmKG49bnx8TmUsInN0cmluZyI9PXR5cGVvZiBlKXtpZighKHI9IjwiPT09ZVswXSYmIj4iPT09ZVtlLmxlbmd0aC0xXSYmZS5sZW5ndGg+PTM/W251bGwsZSxudWxsXTpMZS5leGVjKGUpKXx8IXJbMV0mJnQpcmV0dXJuIXR8fHQuanF1ZXJ5Pyh0fHxuKS5maW5kKGUpOnRoaXMuY29uc3RydWN0b3IodCkuZmluZChlKTtpZihyWzFdKXtpZih0PXQgaW5zdGFuY2VvZiBrZT90WzBdOnQsa2UubWVyZ2UodGhpcyxrZS5wYXJzZUhUTUwoclsxXSx0JiZ0Lm5vZGVUeXBlP3Qub3duZXJEb2N1bWVudHx8dDpsZSwhMCkpLGplLnRlc3QoclsxXSkmJmtlLmlzUGxhaW5PYmplY3QodCkpZm9yKHIgaW4gdClfZSh0aGlzW3JdKT90aGlzW3JdKHRbcl0pOnRoaXMuYXR0cihyLHRbcl0pO3JldHVybiB0aGlzfXJldHVybiBvPWxlLmdldEVsZW1lbnRCeUlkKHJbMl0pLG8mJih0aGlzWzBdPW8sdGhpcy5sZW5ndGg9MSksdGhpc31yZXR1cm4gZS5ub2RlVHlwZT8odGhpc1swXT1lLHRoaXMubGVuZ3RoPTEsdGhpcyk6X2UoZSk/dm9pZCAwIT09bi5yZWFkeT9uLnJlYWR5KGUpOmUoa2UpOmtlLm1ha2VBcnJheShlLHRoaXMpfSkucHJvdG90eXBlPWtlLmZuLE5lPWtlKGxlKTt2YXIgRGU9L14oPzpwYXJlbnRzfHByZXYoPzpVbnRpbHxBbGwpKS8sSWU9e2NoaWxkcmVuOiEwLGNvbnRlbnRzOiEwLG5leHQ6ITAscHJldjohMH07a2UuZm4uZXh0ZW5kKHtoYXM6ZnVuY3Rpb24oZSl7dmFyIHQ9a2UoZSx0aGlzKSxuPXQubGVuZ3RoO3JldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbigpe2Zvcih2YXIgZT0wO2U8bjtlKyspaWYoa2UuY29udGFpbnModGhpcyx0W2VdKSlyZXR1cm4hMH0pfSxjbG9zZXN0OmZ1bmN0aW9uKGUsdCl7dmFyIG4scj0wLG89dGhpcy5sZW5ndGgsaT1bXSxhPSJzdHJpbmciIT10eXBlb2YgZSYma2UoZSk7aWYoIU9lLnRlc3QoZSkpZm9yKDtyPG87cisrKWZvcihuPXRoaXNbcl07biYmbiE9PXQ7bj1uLnBhcmVudE5vZGUpaWYobi5ub2RlVHlwZTwxMSYmKGE/YS5pbmRleChuKT4tMToxPT09bi5ub2RlVHlwZSYma2UuZmluZC5tYXRjaGVzU2VsZWN0b3IobixlKSkpe2kucHVzaChuKTticmVha31yZXR1cm4gdGhpcy5wdXNoU3RhY2soaS5sZW5ndGg+MT9rZS51bmlxdWVTb3J0KGkpOmkpfSxpbmRleDpmdW5jdGlvbihlKXtyZXR1cm4gZT8ic3RyaW5nIj09dHlwZW9mIGU/dmUuY2FsbChrZShlKSx0aGlzWzBdKTp2ZS5jYWxsKHRoaXMsZS5qcXVlcnk/ZVswXTplKTp0aGlzWzBdJiZ0aGlzWzBdLnBhcmVudE5vZGU/dGhpcy5maXJzdCgpLnByZXZBbGwoKS5sZW5ndGg6LTF9LGFkZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLnB1c2hTdGFjayhrZS51bmlxdWVTb3J0KGtlLm1lcmdlKHRoaXMuZ2V0KCksa2UoZSx0KSkpKX0sYWRkQmFjazpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5hZGQobnVsbD09ZT90aGlzLnByZXZPYmplY3Q6dGhpcy5wcmV2T2JqZWN0LmZpbHRlcihlKSl9fSksa2UuZWFjaCh7cGFyZW50OmZ1bmN0aW9uKGUpe3ZhciB0PWUucGFyZW50Tm9kZTtyZXR1cm4gdCYmMTEhPT10Lm5vZGVUeXBlP3Q6bnVsbH0scGFyZW50czpmdW5jdGlvbihlKXtyZXR1cm4gJGUoZSwicGFyZW50Tm9kZSIpfSxwYXJlbnRzVW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAkZShlLCJwYXJlbnROb2RlIixuKX0sbmV4dDpmdW5jdGlvbihlKXtyZXR1cm4gZihlLCJuZXh0U2libGluZyIpfSxwcmV2OmZ1bmN0aW9uKGUpe3JldHVybiBmKGUsInByZXZpb3VzU2libGluZyIpfSxuZXh0QWxsOmZ1bmN0aW9uKGUpe3JldHVybiAkZShlLCJuZXh0U2libGluZyIpfSxwcmV2QWxsOmZ1bmN0aW9uKGUpe3JldHVybiAkZShlLCJwcmV2aW91c1NpYmxpbmciKX0sbmV4dFVudGlsOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gJGUoZSwibmV4dFNpYmxpbmciLG4pfSxwcmV2VW50aWw6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiAkZShlLCJwcmV2aW91c1NpYmxpbmciLG4pfSxzaWJsaW5nczpmdW5jdGlvbihlKXtyZXR1cm4gRWUoKGUucGFyZW50Tm9kZXx8e30pLmZpcnN0Q2hpbGQsZSl9LGNoaWxkcmVuOmZ1bmN0aW9uKGUpe3JldHVybiBFZShlLmZpcnN0Q2hpbGQpfSxjb250ZW50czpmdW5jdGlvbihlKXtyZXR1cm4gYyhlLCJpZnJhbWUiKT9lLmNvbnRlbnREb2N1bWVudDooYyhlLCJ0ZW1wbGF0ZSIpJiYoZT1lLmNvbnRlbnR8fGUpLGtlLm1lcmdlKFtdLGUuY2hpbGROb2RlcykpfX0sZnVuY3Rpb24oZSx0KXtrZS5mbltlXT1mdW5jdGlvbihuLHIpe3ZhciBvPWtlLm1hcCh0aGlzLHQsbik7cmV0dXJuIlVudGlsIiE9PWUuc2xpY2UoLTUpJiYocj1uKSxyJiYic3RyaW5nIj09dHlwZW9mIHImJihvPWtlLmZpbHRlcihyLG8pKSx0aGlzLmxlbmd0aD4xJiYoSWVbZV18fGtlLnVuaXF1ZVNvcnQobyksRGUudGVzdChlKSYmby5yZXZlcnNlKCkpLHRoaXMucHVzaFN0YWNrKG8pfX0pO3ZhciBSZT0vW15ceDIwXHRcclxuXGZdKy9nO2tlLkNhbGxiYWNrcz1mdW5jdGlvbihlKXtlPSJzdHJpbmciPT10eXBlb2YgZT9wKGUpOmtlLmV4dGVuZCh7fSxlKTt2YXIgdCxuLHIsbyxpPVtdLGE9W10sdT0tMSxjPWZ1bmN0aW9uKCl7Zm9yKG89b3x8ZS5vbmNlLHI9dD0hMDthLmxlbmd0aDt1PS0xKWZvcihuPWEuc2hpZnQoKTsrK3U8aS5sZW5ndGg7KSExPT09aVt1XS5hcHBseShuWzBdLG5bMV0pJiZlLnN0b3BPbkZhbHNlJiYodT1pLmxlbmd0aCxuPSExKTtlLm1lbW9yeXx8KG49ITEpLHQ9ITEsbyYmKGk9bj9bXToiIil9LGw9e2FkZDpmdW5jdGlvbigpe3JldHVybiBpJiYobiYmIXQmJih1PWkubGVuZ3RoLTEsYS5wdXNoKG4pKSxmdW5jdGlvbiB0KG4pe2tlLmVhY2gobixmdW5jdGlvbihuLHIpe19lKHIpP2UudW5pcXVlJiZsLmhhcyhyKXx8aS5wdXNoKHIpOnImJnIubGVuZ3RoJiYic3RyaW5nIiE9PXMocikmJnQocil9KX0oYXJndW1lbnRzKSxuJiYhdCYmYygpKSx0aGlzfSxyZW1vdmU6ZnVuY3Rpb24oKXtyZXR1cm4ga2UuZWFjaChhcmd1bWVudHMsZnVuY3Rpb24oZSx0KXtmb3IodmFyIG47KG49a2UuaW5BcnJheSh0LGksbikpPi0xOylpLnNwbGljZShuLDEpLG48PXUmJnUtLX0pLHRoaXN9LGhhczpmdW5jdGlvbihlKXtyZXR1cm4gZT9rZS5pbkFycmF5KGUsaSk+LTE6aS5sZW5ndGg+MH0sZW1wdHk6ZnVuY3Rpb24oKXtyZXR1cm4gaSYmKGk9W10pLHRoaXN9LGRpc2FibGU6ZnVuY3Rpb24oKXtyZXR1cm4gbz1hPVtdLGk9bj0iIix0aGlzfSxkaXNhYmxlZDpmdW5jdGlvbigpe3JldHVybiFpfSxsb2NrOmZ1bmN0aW9uKCl7cmV0dXJuIG89YT1bXSxufHx0fHwoaT1uPSIiKSx0aGlzfSxsb2NrZWQ6ZnVuY3Rpb24oKXtyZXR1cm4hIW99LGZpcmVXaXRoOmZ1bmN0aW9uKGUsbil7cmV0dXJuIG98fChuPW58fFtdLG49W2Usbi5zbGljZT9uLnNsaWNlKCk6bl0sYS5wdXNoKG4pLHR8fGMoKSksdGhpc30sZmlyZTpmdW5jdGlvbigpe3JldHVybiBsLmZpcmVXaXRoKHRoaXMsYXJndW1lbnRzKSx0aGlzfSxmaXJlZDpmdW5jdGlvbigpe3JldHVybiEhcn19O3JldHVybiBsfSxrZS5leHRlbmQoe0RlZmVycmVkOmZ1bmN0aW9uKGUpe3ZhciB0PVtbIm5vdGlmeSIsInByb2dyZXNzIixrZS5DYWxsYmFja3MoIm1lbW9yeSIpLGtlLkNhbGxiYWNrcygibWVtb3J5IiksMl0sWyJyZXNvbHZlIiwiZG9uZSIsa2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGtlLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwwLCJyZXNvbHZlZCJdLFsicmVqZWN0IiwiZmFpbCIsa2UuQ2FsbGJhY2tzKCJvbmNlIG1lbW9yeSIpLGtlLkNhbGxiYWNrcygib25jZSBtZW1vcnkiKSwxLCJyZWplY3RlZCJdXSxyPSJwZW5kaW5nIixvPXtzdGF0ZTpmdW5jdGlvbigpe3JldHVybiByfSxhbHdheXM6ZnVuY3Rpb24oKXtyZXR1cm4gaS5kb25lKGFyZ3VtZW50cykuZmFpbChhcmd1bWVudHMpLHRoaXN9LGNhdGNoOmZ1bmN0aW9uKGUpe3JldHVybiBvLnRoZW4obnVsbCxlKX0scGlwZTpmdW5jdGlvbigpe3ZhciBlPWFyZ3VtZW50cztyZXR1cm4ga2UuRGVmZXJyZWQoZnVuY3Rpb24obil7a2UuZWFjaCh0LGZ1bmN0aW9uKHQscil7dmFyIG89X2UoZVtyWzRdXSkmJmVbcls0XV07aVtyWzFdXShmdW5jdGlvbigpe3ZhciBlPW8mJm8uYXBwbHkodGhpcyxhcmd1bWVudHMpO2UmJl9lKGUucHJvbWlzZSk/ZS5wcm9taXNlKCkucHJvZ3Jlc3Mobi5ub3RpZnkpLmRvbmUobi5yZXNvbHZlKS5mYWlsKG4ucmVqZWN0KTpuW3JbMF0rIldpdGgiXSh0aGlzLG8/W2VdOmFyZ3VtZW50cyl9KX0pLGU9bnVsbH0pLnByb21pc2UoKX0sdGhlbjpmdW5jdGlvbihlLHIsbyl7ZnVuY3Rpb24gaShlLHQscixvKXtyZXR1cm4gZnVuY3Rpb24oKXt2YXIgcz10aGlzLHU9YXJndW1lbnRzLGM9ZnVuY3Rpb24oKXt2YXIgbixjO2lmKCEoZTxhKSl7aWYoKG49ci5hcHBseShzLHUpKT09PXQucHJvbWlzZSgpKXRocm93IG5ldyBUeXBlRXJyb3IoIlRoZW5hYmxlIHNlbGYtcmVzb2x1dGlvbiIpO2M9biYmKCJvYmplY3QiPT10eXBlb2Ygbnx8ImZ1bmN0aW9uIj09dHlwZW9mIG4pJiZuLnRoZW4sX2UoYyk/bz9jLmNhbGwobixpKGEsdCxkLG8pLGkoYSx0LGgsbykpOihhKyssYy5jYWxsKG4saShhLHQsZCxvKSxpKGEsdCxoLG8pLGkoYSx0LGQsdC5ub3RpZnlXaXRoKSkpOihyIT09ZCYmKHM9dm9pZCAwLHU9W25dKSwob3x8dC5yZXNvbHZlV2l0aCkocyx1KSl9fSxsPW8/YzpmdW5jdGlvbigpe3RyeXtjKCl9Y2F0Y2gobil7a2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayYma2UuRGVmZXJyZWQuZXhjZXB0aW9uSG9vayhuLGwuc3RhY2tUcmFjZSksZSsxPj1hJiYociE9PWgmJihzPXZvaWQgMCx1PVtuXSksdC5yZWplY3RXaXRoKHMsdSkpfX07ZT9sKCk6KGtlLkRlZmVycmVkLmdldFN0YWNrSG9vayYmKGwuc3RhY2tUcmFjZT1rZS5EZWZlcnJlZC5nZXRTdGFja0hvb2soKSksbi5zZXRUaW1lb3V0KGwpKX19dmFyIGE9MDtyZXR1cm4ga2UuRGVmZXJyZWQoZnVuY3Rpb24obil7dFswXVszXS5hZGQoaSgwLG4sX2Uobyk/bzpkLG4ubm90aWZ5V2l0aCkpLHRbMV1bM10uYWRkKGkoMCxuLF9lKGUpP2U6ZCkpLHRbMl1bM10uYWRkKGkoMCxuLF9lKHIpP3I6aCkpfSkucHJvbWlzZSgpfSxwcm9taXNlOmZ1bmN0aW9uKGUpe3JldHVybiBudWxsIT1lP2tlLmV4dGVuZChlLG8pOm99fSxpPXt9O3JldHVybiBrZS5lYWNoKHQsZnVuY3Rpb24oZSxuKXt2YXIgYT1uWzJdLHM9bls1XTtvW25bMV1dPWEuYWRkLHMmJmEuYWRkKGZ1bmN0aW9uKCl7cj1zfSx0WzMtZV1bMl0uZGlzYWJsZSx0WzMtZV1bM10uZGlzYWJsZSx0WzBdWzJdLmxvY2ssdFswXVszXS5sb2NrKSxhLmFkZChuWzNdLmZpcmUpLGlbblswXV09ZnVuY3Rpb24oKXtyZXR1cm4gaVtuWzBdKyJXaXRoIl0odGhpcz09PWk/dm9pZCAwOnRoaXMsYXJndW1lbnRzKSx0aGlzfSxpW25bMF0rIldpdGgiXT1hLmZpcmVXaXRofSksby5wcm9taXNlKGkpLGUmJmUuY2FsbChpLGkpLGl9LHdoZW46ZnVuY3Rpb24oZSl7dmFyIHQ9YXJndW1lbnRzLmxlbmd0aCxuPXQscj1BcnJheShuKSxvPXBlLmNhbGwoYXJndW1lbnRzKSxpPWtlLkRlZmVycmVkKCksYT1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24obil7cltlXT10aGlzLG9bZV09YXJndW1lbnRzLmxlbmd0aD4xP3BlLmNhbGwoYXJndW1lbnRzKTpuLC0tdHx8aS5yZXNvbHZlV2l0aChyLG8pfX07aWYodDw9MSYmKHYoZSxpLmRvbmUoYShuKSkucmVzb2x2ZSxpLnJlamVjdCwhdCksInBlbmRpbmciPT09aS5zdGF0ZSgpfHxfZShvW25dJiZvW25dLnRoZW4pKSlyZXR1cm4gaS50aGVuKCk7Zm9yKDtuLS07KXYob1tuXSxhKG4pLGkucmVqZWN0KTtyZXR1cm4gaS5wcm9taXNlKCl9fSk7dmFyIFBlPS9eKEV2YWx8SW50ZXJuYWx8UmFuZ2V8UmVmZXJlbmNlfFN5bnRheHxUeXBlfFVSSSlFcnJvciQvO2tlLkRlZmVycmVkLmV4Y2VwdGlvbkhvb2s9ZnVuY3Rpb24oZSx0KXtuLmNvbnNvbGUmJm4uY29uc29sZS53YXJuJiZlJiZQZS50ZXN0KGUubmFtZSkmJm4uY29uc29sZS53YXJuKCJqUXVlcnkuRGVmZXJyZWQgZXhjZXB0aW9uOiAiK2UubWVzc2FnZSxlLnN0YWNrLHQpfSxrZS5yZWFkeUV4Y2VwdGlvbj1mdW5jdGlvbihlKXtuLnNldFRpbWVvdXQoZnVuY3Rpb24oKXt0aHJvdyBlfSl9O3ZhciBNZT1rZS5EZWZlcnJlZCgpO2tlLmZuLnJlYWR5PWZ1bmN0aW9uKGUpe3JldHVybiBNZS50aGVuKGUpLmNhdGNoKGZ1bmN0aW9uKGUpe2tlLnJlYWR5RXhjZXB0aW9uKGUpfSksdGhpc30sa2UuZXh0ZW5kKHtpc1JlYWR5OiExLHJlYWR5V2FpdDoxLHJlYWR5OmZ1bmN0aW9uKGUpeyghMD09PWU/LS1rZS5yZWFkeVdhaXQ6a2UuaXNSZWFkeSl8fChrZS5pc1JlYWR5PSEwLCEwIT09ZSYmLS1rZS5yZWFkeVdhaXQ+MHx8TWUucmVzb2x2ZVdpdGgobGUsW2tlXSkpfX0pLGtlLnJlYWR5LnRoZW49TWUudGhlbiwiY29tcGxldGUiPT09bGUucmVhZHlTdGF0ZXx8ImxvYWRpbmciIT09bGUucmVhZHlTdGF0ZSYmIWxlLmRvY3VtZW50RWxlbWVudC5kb1Njcm9sbD9uLnNldFRpbWVvdXQoa2UucmVhZHkpOihsZS5hZGRFdmVudExpc3RlbmVyKCJET01Db250ZW50TG9hZGVkIixtKSxuLmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLG0pKTt2YXIgcWU9ZnVuY3Rpb24oZSx0LG4scixvLGksYSl7dmFyIHU9MCxjPWUubGVuZ3RoLGw9bnVsbD09bjtpZigib2JqZWN0Ij09PXMobikpe289ITA7Zm9yKHUgaW4gbilxZShlLHQsdSxuW3VdLCEwLGksYSl9ZWxzZSBpZih2b2lkIDAhPT1yJiYobz0hMCxfZShyKXx8KGE9ITApLGwmJihhPyh0LmNhbGwoZSxyKSx0PW51bGwpOihsPXQsdD1mdW5jdGlvbihlLHQsbil7cmV0dXJuIGwuY2FsbChrZShlKSxuKX0pKSx0KSlmb3IoO3U8Yzt1KyspdChlW3VdLG4sYT9yOnIuY2FsbChlW3VdLHUsdChlW3VdLG4pKSk7cmV0dXJuIG8/ZTpsP3QuY2FsbChlKTpjP3QoZVswXSxuKTppfSxIZT0vXi1tcy0vLEZlPS8tKFthLXpdKS9nLEJlPWZ1bmN0aW9uKGUpe3JldHVybiAxPT09ZS5ub2RlVHlwZXx8OT09PWUubm9kZVR5cGV8fCErZS5ub2RlVHlwZX07Yi51aWQ9MSxiLnByb3RvdHlwZT17Y2FjaGU6ZnVuY3Rpb24oZSl7dmFyIHQ9ZVt0aGlzLmV4cGFuZG9dO3JldHVybiB0fHwodD17fSxCZShlKSYmKGUubm9kZVR5cGU/ZVt0aGlzLmV4cGFuZG9dPXQ6T2JqZWN0LmRlZmluZVByb3BlcnR5KGUsdGhpcy5leHBhbmRvLHt2YWx1ZTp0LGNvbmZpZ3VyYWJsZTohMH0pKSksdH0sc2V0OmZ1bmN0aW9uKGUsdCxuKXt2YXIgcixvPXRoaXMuY2FjaGUoZSk7aWYoInN0cmluZyI9PXR5cGVvZiB0KW9bZyh0KV09bjtlbHNlIGZvcihyIGluIHQpb1tnKHIpXT10W3JdO3JldHVybiBvfSxnZXQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdm9pZCAwPT09dD90aGlzLmNhY2hlKGUpOmVbdGhpcy5leHBhbmRvXSYmZVt0aGlzLmV4cGFuZG9dW2codCldfSxhY2Nlc3M6ZnVuY3Rpb24oZSx0LG4pe3JldHVybiB2b2lkIDA9PT10fHx0JiYic3RyaW5nIj09dHlwZW9mIHQmJnZvaWQgMD09PW4/dGhpcy5nZXQoZSx0KToodGhpcy5zZXQoZSx0LG4pLHZvaWQgMCE9PW4/bjp0KX0scmVtb3ZlOmZ1bmN0aW9uKGUsdCl7dmFyIG4scj1lW3RoaXMuZXhwYW5kb107aWYodm9pZCAwIT09cil7aWYodm9pZCAwIT09dCl7QXJyYXkuaXNBcnJheSh0KT90PXQubWFwKGcpOih0PWcodCksdD10IGluIHI/W3RdOnQubWF0Y2goUmUpfHxbXSksbj10Lmxlbmd0aDtmb3IoO24tLTspZGVsZXRlIHJbdFtuXV19KHZvaWQgMD09PXR8fGtlLmlzRW1wdHlPYmplY3QocikpJiYoZS5ub2RlVHlwZT9lW3RoaXMuZXhwYW5kb109dm9pZCAwOmRlbGV0ZSBlW3RoaXMuZXhwYW5kb10pfX0saGFzRGF0YTpmdW5jdGlvbihlKXt2YXIgdD1lW3RoaXMuZXhwYW5kb107cmV0dXJuIHZvaWQgMCE9PXQmJiFrZS5pc0VtcHR5T2JqZWN0KHQpfX07dmFyIFVlPW5ldyBiLFdlPW5ldyBiLHplPS9eKD86XHtbXHdcV10qXH18XFtbXHdcV10qXF0pJC8sVmU9L1tBLVpdL2c7a2UuZXh0ZW5kKHtoYXNEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiBXZS5oYXNEYXRhKGUpfHxVZS5oYXNEYXRhKGUpfSxkYXRhOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gV2UuYWNjZXNzKGUsdCxuKX0scmVtb3ZlRGF0YTpmdW5jdGlvbihlLHQpe1dlLnJlbW92ZShlLHQpfSxfZGF0YTpmdW5jdGlvbihlLHQsbil7cmV0dXJuIFVlLmFjY2VzcyhlLHQsbil9LF9yZW1vdmVEYXRhOmZ1bmN0aW9uKGUsdCl7VWUucmVtb3ZlKGUsdCl9fSksa2UuZm4uZXh0ZW5kKHtkYXRhOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGk9dGhpc1swXSxhPWkmJmkuYXR0cmlidXRlcztpZih2b2lkIDA9PT1lKXtpZih0aGlzLmxlbmd0aCYmKG89V2UuZ2V0KGkpLDE9PT1pLm5vZGVUeXBlJiYhVWUuZ2V0KGksImhhc0RhdGFBdHRycyIpKSl7Zm9yKG49YS5sZW5ndGg7bi0tOylhW25dJiYocj1hW25dLm5hbWUsMD09PXIuaW5kZXhPZigiZGF0YS0iKSYmKHI9ZyhyLnNsaWNlKDUpKSx3KGkscixvW3JdKSkpO1VlLnNldChpLCJoYXNEYXRhQXR0cnMiLCEwKX1yZXR1cm4gb31yZXR1cm4ib2JqZWN0Ij09dHlwZW9mIGU/dGhpcy5lYWNoKGZ1bmN0aW9uKCl7V2Uuc2V0KHRoaXMsZSl9KTpxZSh0aGlzLGZ1bmN0aW9uKHQpe3ZhciBuO2lmKGkmJnZvaWQgMD09PXQpe2lmKHZvaWQgMCE9PShuPVdlLmdldChpLGUpKSlyZXR1cm4gbjtpZih2b2lkIDAhPT0obj13KGksZSkpKXJldHVybiBufWVsc2UgdGhpcy5lYWNoKGZ1bmN0aW9uKCl7V2Uuc2V0KHRoaXMsZSx0KX0pfSxudWxsLHQsYXJndW1lbnRzLmxlbmd0aD4xLG51bGwsITApfSxyZW1vdmVEYXRhOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtXZS5yZW1vdmUodGhpcyxlKX0pfX0pLGtlLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0LG4pe3ZhciByO2lmKGUpcmV0dXJuIHQ9KHR8fCJmeCIpKyJxdWV1ZSIscj1VZS5nZXQoZSx0KSxuJiYoIXJ8fEFycmF5LmlzQXJyYXkobik/cj1VZS5hY2Nlc3MoZSx0LGtlLm1ha2VBcnJheShuKSk6ci5wdXNoKG4pKSxyfHxbXX0sZGVxdWV1ZTpmdW5jdGlvbihlLHQpe3Q9dHx8ImZ4Ijt2YXIgbj1rZS5xdWV1ZShlLHQpLHI9bi5sZW5ndGgsbz1uLnNoaWZ0KCksaT1rZS5fcXVldWVIb29rcyhlLHQpLGE9ZnVuY3Rpb24oKXtrZS5kZXF1ZXVlKGUsdCl9OyJpbnByb2dyZXNzIj09PW8mJihvPW4uc2hpZnQoKSxyLS0pLG8mJigiZngiPT09dCYmbi51bnNoaWZ0KCJpbnByb2dyZXNzIiksZGVsZXRlIGkuc3RvcCxvLmNhbGwoZSxhLGkpKSwhciYmaSYmaS5lbXB0eS5maXJlKCl9LF9xdWV1ZUhvb2tzOmZ1bmN0aW9uKGUsdCl7dmFyIG49dCsicXVldWVIb29rcyI7cmV0dXJuIFVlLmdldChlLG4pfHxVZS5hY2Nlc3MoZSxuLHtlbXB0eTprZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IikuYWRkKGZ1bmN0aW9uKCl7VWUucmVtb3ZlKGUsW3QrInF1ZXVlIixuXSl9KX0pfX0pLGtlLmZuLmV4dGVuZCh7cXVldWU6ZnVuY3Rpb24oZSx0KXt2YXIgbj0yO3JldHVybiJzdHJpbmciIT10eXBlb2YgZSYmKHQ9ZSxlPSJmeCIsbi0tKSxhcmd1bWVudHMubGVuZ3RoPG4/a2UucXVldWUodGhpc1swXSxlKTp2b2lkIDA9PT10P3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIG49a2UucXVldWUodGhpcyxlLHQpO2tlLl9xdWV1ZUhvb2tzKHRoaXMsZSksImZ4Ij09PWUmJiJpbnByb2dyZXNzIiE9PW5bMF0mJmtlLmRlcXVldWUodGhpcyxlKX0pfSxkZXF1ZXVlOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtrZS5kZXF1ZXVlKHRoaXMsZSl9KX0sY2xlYXJRdWV1ZTpmdW5jdGlvbihlKXtyZXR1cm4gdGhpcy5xdWV1ZShlfHwiZngiLFtdKX0scHJvbWlzZTpmdW5jdGlvbihlLHQpe3ZhciBuLHI9MSxvPWtlLkRlZmVycmVkKCksaT10aGlzLGE9dGhpcy5sZW5ndGgscz1mdW5jdGlvbigpey0tcnx8by5yZXNvbHZlV2l0aChpLFtpXSl9O2Zvcigic3RyaW5nIiE9dHlwZW9mIGUmJih0PWUsZT12b2lkIDApLGU9ZXx8ImZ4IjthLS07KShuPVVlLmdldChpW2FdLGUrInF1ZXVlSG9va3MiKSkmJm4uZW1wdHkmJihyKyssbi5lbXB0eS5hZGQocykpO3JldHVybiBzKCksby5wcm9taXNlKHQpfX0pO3ZhciBYZT0vWystXT8oPzpcZCpcLnwpXGQrKD86W2VFXVsrLV0/XGQrfCkvLnNvdXJjZSxKZT1uZXcgUmVnRXhwKCJeKD86KFsrLV0pPXwpKCIrWGUrIikoW2EteiVdKikkIiwiaSIpLEtlPVsiVG9wIiwiUmlnaHQiLCJCb3R0b20iLCJMZWZ0Il0sR2U9ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT10fHxlLCJub25lIj09PWUuc3R5bGUuZGlzcGxheXx8IiI9PT1lLnN0eWxlLmRpc3BsYXkmJmtlLmNvbnRhaW5zKGUub3duZXJEb2N1bWVudCxlKSYmIm5vbmUiPT09a2UuY3NzKGUsImRpc3BsYXkiKX0sWWU9ZnVuY3Rpb24oZSx0LG4scil7dmFyIG8saSxhPXt9O2ZvcihpIGluIHQpYVtpXT1lLnN0eWxlW2ldLGUuc3R5bGVbaV09dFtpXTtvPW4uYXBwbHkoZSxyfHxbXSk7Zm9yKGkgaW4gdCllLnN0eWxlW2ldPWFbaV07cmV0dXJuIG99LFFlPXt9O2tlLmZuLmV4dGVuZCh7c2hvdzpmdW5jdGlvbigpe3JldHVybiBUKHRoaXMsITApfSxoaWRlOmZ1bmN0aW9uKCl7cmV0dXJuIFQodGhpcyl9LHRvZ2dsZTpmdW5jdGlvbihlKXtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiBlP2U/dGhpcy5zaG93KCk6dGhpcy5oaWRlKCk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7R2UodGhpcyk/a2UodGhpcykuc2hvdygpOmtlKHRoaXMpLmhpZGUoKX0pfX0pO3ZhciBaZT0vXig/OmNoZWNrYm94fHJhZGlvKSQvaSxldD0vPChbYS16XVteXC9cMD5ceDIwXHRcclxuXGZdKykvaSx0dD0vXiR8Xm1vZHVsZSR8XC8oPzpqYXZhfGVjbWEpc2NyaXB0L2ksbnQ9e29wdGlvbjpbMSwiPHNlbGVjdCBtdWx0aXBsZT0nbXVsdGlwbGUnPiIsIjwvc2VsZWN0PiJdLHRoZWFkOlsxLCI8dGFibGU+IiwiPC90YWJsZT4iXSxjb2w6WzIsIjx0YWJsZT48Y29sZ3JvdXA+IiwiPC9jb2xncm91cD48L3RhYmxlPiJdLHRyOlsyLCI8dGFibGU+PHRib2R5PiIsIjwvdGJvZHk+PC90YWJsZT4iXSx0ZDpbMywiPHRhYmxlPjx0Ym9keT48dHI+IiwiPC90cj48L3Rib2R5PjwvdGFibGU+Il0sX2RlZmF1bHQ6WzAsIiIsIiJdfTtudC5vcHRncm91cD1udC5vcHRpb24sbnQudGJvZHk9bnQudGZvb3Q9bnQuY29sZ3JvdXA9bnQuY2FwdGlvbj1udC50aGVhZCxudC50aD1udC50ZDt2YXIgcnQ9Lzx8JiM/XHcrOy87IWZ1bmN0aW9uKCl7dmFyIGU9bGUuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLHQ9ZS5hcHBlbmRDaGlsZChsZS5jcmVhdGVFbGVtZW50KCJkaXYiKSksbj1sZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpO24uc2V0QXR0cmlidXRlKCJ0eXBlIiwicmFkaW8iKSxuLnNldEF0dHJpYnV0ZSgiY2hlY2tlZCIsImNoZWNrZWQiKSxuLnNldEF0dHJpYnV0ZSgibmFtZSIsInQiKSx0LmFwcGVuZENoaWxkKG4pLHdlLmNoZWNrQ2xvbmU9dC5jbG9uZU5vZGUoITApLmNsb25lTm9kZSghMCkubGFzdENoaWxkLmNoZWNrZWQsdC5pbm5lckhUTUw9Ijx0ZXh0YXJlYT54PC90ZXh0YXJlYT4iLHdlLm5vQ2xvbmVDaGVja2VkPSEhdC5jbG9uZU5vZGUoITApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWV9KCk7dmFyIG90PWxlLmRvY3VtZW50RWxlbWVudCxpdD0vXmtleS8sYXQ9L14oPzptb3VzZXxwb2ludGVyfGNvbnRleHRtZW51fGRyYWd8ZHJvcCl8Y2xpY2svLHN0PS9eKFteLl0qKSg/OlwuKC4rKXwpLztrZS5ldmVudD17Z2xvYmFsOnt9LGFkZDpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsZCxoLHYsbT1VZS5nZXQoZSk7aWYobSlmb3Iobi5oYW5kbGVyJiYoaT1uLG49aS5oYW5kbGVyLG89aS5zZWxlY3RvciksbyYma2UuZmluZC5tYXRjaGVzU2VsZWN0b3Iob3Qsbyksbi5ndWlkfHwobi5ndWlkPWtlLmd1aWQrKyksKHU9bS5ldmVudHMpfHwodT1tLmV2ZW50cz17fSksKGE9bS5oYW5kbGUpfHwoYT1tLmhhbmRsZT1mdW5jdGlvbih0KXtyZXR1cm4gdm9pZCAwIT09a2UmJmtlLmV2ZW50LnRyaWdnZXJlZCE9PXQudHlwZT9rZS5ldmVudC5kaXNwYXRjaC5hcHBseShlLGFyZ3VtZW50cyk6dm9pZCAwfSksdD0odHx8IiIpLm1hdGNoKFJlKXx8WyIiXSxjPXQubGVuZ3RoO2MtLTspcz1zdC5leGVjKHRbY10pfHxbXSxkPXY9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCYmKGY9a2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0obz9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxmPWtlLmV2ZW50LnNwZWNpYWxbZF18fHt9LGw9a2UuZXh0ZW5kKHt0eXBlOmQsb3JpZ1R5cGU6dixkYXRhOnIsaGFuZGxlcjpuLGd1aWQ6bi5ndWlkLHNlbGVjdG9yOm8sbmVlZHNDb250ZXh0Om8mJmtlLmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QobyksbmFtZXNwYWNlOmguam9pbigiLiIpfSxpKSwocD11W2RdKXx8KHA9dVtkXT1bXSxwLmRlbGVnYXRlQ291bnQ9MCxmLnNldHVwJiYhMSE9PWYuc2V0dXAuY2FsbChlLHIsaCxhKXx8ZS5hZGRFdmVudExpc3RlbmVyJiZlLmFkZEV2ZW50TGlzdGVuZXIoZCxhKSksZi5hZGQmJihmLmFkZC5jYWxsKGUsbCksbC5oYW5kbGVyLmd1aWR8fChsLmhhbmRsZXIuZ3VpZD1uLmd1aWQpKSxvP3Auc3BsaWNlKHAuZGVsZWdhdGVDb3VudCsrLDAsbCk6cC5wdXNoKGwpLGtlLmV2ZW50Lmdsb2JhbFtkXT0hMCl9LHJlbW92ZTpmdW5jdGlvbihlLHQsbixyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsZCxoLHYsbT1VZS5oYXNEYXRhKGUpJiZVZS5nZXQoZSk7aWYobSYmKHU9bS5ldmVudHMpKXtmb3IodD0odHx8IiIpLm1hdGNoKFJlKXx8WyIiXSxjPXQubGVuZ3RoO2MtLTspaWYocz1zdC5leGVjKHRbY10pfHxbXSxkPXY9c1sxXSxoPShzWzJdfHwiIikuc3BsaXQoIi4iKS5zb3J0KCksZCl7Zm9yKGY9a2UuZXZlbnQuc3BlY2lhbFtkXXx8e30sZD0ocj9mLmRlbGVnYXRlVHlwZTpmLmJpbmRUeXBlKXx8ZCxwPXVbZF18fFtdLHM9c1syXSYmbmV3IFJlZ0V4cCgiKF58XFwuKSIraC5qb2luKCJcXC4oPzouKlxcLnwpIikrIihcXC58JCkiKSxhPWk9cC5sZW5ndGg7aS0tOylsPXBbaV0sIW8mJnYhPT1sLm9yaWdUeXBlfHxuJiZuLmd1aWQhPT1sLmd1aWR8fHMmJiFzLnRlc3QobC5uYW1lc3BhY2UpfHxyJiZyIT09bC5zZWxlY3RvciYmKCIqKiIhPT1yfHwhbC5zZWxlY3Rvcil8fChwLnNwbGljZShpLDEpLGwuc2VsZWN0b3ImJnAuZGVsZWdhdGVDb3VudC0tLGYucmVtb3ZlJiZmLnJlbW92ZS5jYWxsKGUsbCkpO2EmJiFwLmxlbmd0aCYmKGYudGVhcmRvd24mJiExIT09Zi50ZWFyZG93bi5jYWxsKGUsaCxtLmhhbmRsZSl8fGtlLnJlbW92ZUV2ZW50KGUsZCxtLmhhbmRsZSksZGVsZXRlIHVbZF0pfWVsc2UgZm9yKGQgaW4gdSlrZS5ldmVudC5yZW1vdmUoZSxkK3RbY10sbixyLCEwKTtrZS5pc0VtcHR5T2JqZWN0KHUpJiZVZS5yZW1vdmUoZSwiaGFuZGxlIGV2ZW50cyIpfX0sZGlzcGF0Y2g6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saSxhLHM9a2UuZXZlbnQuZml4KGUpLHU9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgpLGM9KFVlLmdldCh0aGlzLCJldmVudHMiKXx8e30pW3MudHlwZV18fFtdLGw9a2UuZXZlbnQuc3BlY2lhbFtzLnR5cGVdfHx7fTtmb3IodVswXT1zLHQ9MTt0PGFyZ3VtZW50cy5sZW5ndGg7dCsrKXVbdF09YXJndW1lbnRzW3RdO2lmKHMuZGVsZWdhdGVUYXJnZXQ9dGhpcywhbC5wcmVEaXNwYXRjaHx8ITEhPT1sLnByZURpc3BhdGNoLmNhbGwodGhpcyxzKSl7Zm9yKGE9a2UuZXZlbnQuaGFuZGxlcnMuY2FsbCh0aGlzLHMsYyksdD0wOyhvPWFbdCsrXSkmJiFzLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KWZvcihzLmN1cnJlbnRUYXJnZXQ9by5lbGVtLG49MDsoaT1vLmhhbmRsZXJzW24rK10pJiYhcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCgpOylzLnJuYW1lc3BhY2UmJiFzLnJuYW1lc3BhY2UudGVzdChpLm5hbWVzcGFjZSl8fChzLmhhbmRsZU9iaj1pLHMuZGF0YT1pLmRhdGEsdm9pZCAwIT09KHI9KChrZS5ldmVudC5zcGVjaWFsW2kub3JpZ1R5cGVdfHx7fSkuaGFuZGxlfHxpLmhhbmRsZXIpLmFwcGx5KG8uZWxlbSx1KSkmJiExPT09KHMucmVzdWx0PXIpJiYocy5wcmV2ZW50RGVmYXVsdCgpLHMuc3RvcFByb3BhZ2F0aW9uKCkpKTtyZXR1cm4gbC5wb3N0RGlzcGF0Y2gmJmwucG9zdERpc3BhdGNoLmNhbGwodGhpcyxzKSxzLnJlc3VsdH19LGhhbmRsZXJzOmZ1bmN0aW9uKGUsdCl7dmFyIG4scixvLGksYSxzPVtdLHU9dC5kZWxlZ2F0ZUNvdW50LGM9ZS50YXJnZXQ7aWYodSYmYy5ub2RlVHlwZSYmISgiY2xpY2siPT09ZS50eXBlJiZlLmJ1dHRvbj49MSkpZm9yKDtjIT09dGhpcztjPWMucGFyZW50Tm9kZXx8dGhpcylpZigxPT09Yy5ub2RlVHlwZSYmKCJjbGljayIhPT1lLnR5cGV8fCEwIT09Yy5kaXNhYmxlZCkpe2ZvcihpPVtdLGE9e30sbj0wO248dTtuKyspcj10W25dLG89ci5zZWxlY3RvcisiICIsdm9pZCAwPT09YVtvXSYmKGFbb109ci5uZWVkc0NvbnRleHQ/a2Uobyx0aGlzKS5pbmRleChjKT4tMTprZS5maW5kKG8sdGhpcyxudWxsLFtjXSkubGVuZ3RoKSxhW29dJiZpLnB1c2gocik7aS5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOml9KX1yZXR1cm4gYz10aGlzLHU8dC5sZW5ndGgmJnMucHVzaCh7ZWxlbTpjLGhhbmRsZXJzOnQuc2xpY2UodSl9KSxzfSxhZGRQcm9wOmZ1bmN0aW9uKGUsdCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KGtlLkV2ZW50LnByb3RvdHlwZSxlLHtlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMCxnZXQ6X2UodCk/ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHQodGhpcy5vcmlnaW5hbEV2ZW50KX06ZnVuY3Rpb24oKXtpZih0aGlzLm9yaWdpbmFsRXZlbnQpcmV0dXJuIHRoaXMub3JpZ2luYWxFdmVudFtlXX0sc2V0OmZ1bmN0aW9uKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOnR9KX19KX0sZml4OmZ1bmN0aW9uKGUpe3JldHVybiBlW2tlLmV4cGFuZG9dP2U6bmV3IGtlLkV2ZW50KGUpfSxzcGVjaWFsOntsb2FkOntub0J1YmJsZTohMH0sZm9jdXM6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzIT09TygpJiZ0aGlzLmZvY3VzKXJldHVybiB0aGlzLmZvY3VzKCksITF9LGRlbGVnYXRlVHlwZToiZm9jdXNpbiJ9LGJsdXI6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZih0aGlzPT09TygpJiZ0aGlzLmJsdXIpcmV0dXJuIHRoaXMuYmx1cigpLCExfSxkZWxlZ2F0ZVR5cGU6ImZvY3Vzb3V0In0sY2xpY2s6e3RyaWdnZXI6ZnVuY3Rpb24oKXtpZigiY2hlY2tib3giPT09dGhpcy50eXBlJiZ0aGlzLmNsaWNrJiZjKHRoaXMsImlucHV0IikpcmV0dXJuIHRoaXMuY2xpY2soKSwhMX0sX2RlZmF1bHQ6ZnVuY3Rpb24oZSl7cmV0dXJuIGMoZS50YXJnZXQsImEiKX19LGJlZm9yZXVubG9hZDp7cG9zdERpc3BhdGNoOmZ1bmN0aW9uKGUpe3ZvaWQgMCE9PWUucmVzdWx0JiZlLm9yaWdpbmFsRXZlbnQmJihlLm9yaWdpbmFsRXZlbnQucmV0dXJuVmFsdWU9ZS5yZXN1bHQpfX19fSxrZS5yZW1vdmVFdmVudD1mdW5jdGlvbihlLHQsbil7ZS5yZW1vdmVFdmVudExpc3RlbmVyJiZlLnJlbW92ZUV2ZW50TGlzdGVuZXIodCxuKX0sa2UuRXZlbnQ9ZnVuY3Rpb24oZSx0KXtpZighKHRoaXMgaW5zdGFuY2VvZiBrZS5FdmVudCkpcmV0dXJuIG5ldyBrZS5FdmVudChlLHQpO2UmJmUudHlwZT8odGhpcy5vcmlnaW5hbEV2ZW50PWUsdGhpcy50eXBlPWUudHlwZSx0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD1lLmRlZmF1bHRQcmV2ZW50ZWR8fHZvaWQgMD09PWUuZGVmYXVsdFByZXZlbnRlZCYmITE9PT1lLnJldHVyblZhbHVlPyQ6RSx0aGlzLnRhcmdldD1lLnRhcmdldCYmMz09PWUudGFyZ2V0Lm5vZGVUeXBlP2UudGFyZ2V0LnBhcmVudE5vZGU6ZS50YXJnZXQsdGhpcy5jdXJyZW50VGFyZ2V0PWUuY3VycmVudFRhcmdldCx0aGlzLnJlbGF0ZWRUYXJnZXQ9ZS5yZWxhdGVkVGFyZ2V0KTp0aGlzLnR5cGU9ZSx0JiZrZS5leHRlbmQodGhpcyx0KSx0aGlzLnRpbWVTdGFtcD1lJiZlLnRpbWVTdGFtcHx8RGF0ZS5ub3coKSx0aGlzW2tlLmV4cGFuZG9dPSEwfSxrZS5FdmVudC5wcm90b3R5cGU9e2NvbnN0cnVjdG9yOmtlLkV2ZW50LGlzRGVmYXVsdFByZXZlbnRlZDpFLGlzUHJvcGFnYXRpb25TdG9wcGVkOkUsaXNJbW1lZGlhdGVQcm9wYWdhdGlvblN0b3BwZWQ6RSxpc1NpbXVsYXRlZDohMSxwcmV2ZW50RGVmYXVsdDpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzRGVmYXVsdFByZXZlbnRlZD0kLGUmJiF0aGlzLmlzU2ltdWxhdGVkJiZlLnByZXZlbnREZWZhdWx0KCl9LHN0b3BQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkPSQsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcFByb3BhZ2F0aW9uKCl9LHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbjpmdW5jdGlvbigpe3ZhciBlPXRoaXMub3JpZ2luYWxFdmVudDt0aGlzLmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkPSQsZSYmIXRoaXMuaXNTaW11bGF0ZWQmJmUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCksdGhpcy5zdG9wUHJvcGFnYXRpb24oKX19LGtlLmVhY2goe2FsdEtleTohMCxidWJibGVzOiEwLGNhbmNlbGFibGU6ITAsY2hhbmdlZFRvdWNoZXM6ITAsY3RybEtleTohMCxkZXRhaWw6ITAsZXZlbnRQaGFzZTohMCxtZXRhS2V5OiEwLHBhZ2VYOiEwLHBhZ2VZOiEwLHNoaWZ0S2V5OiEwLHZpZXc6ITAsY2hhcjohMCxjaGFyQ29kZTohMCxrZXk6ITAsa2V5Q29kZTohMCxidXR0b246ITAsYnV0dG9uczohMCxjbGllbnRYOiEwLGNsaWVudFk6ITAsb2Zmc2V0WDohMCxvZmZzZXRZOiEwLHBvaW50ZXJJZDohMCxwb2ludGVyVHlwZTohMCxzY3JlZW5YOiEwLHNjcmVlblk6ITAsdGFyZ2V0VG91Y2hlczohMCx0b0VsZW1lbnQ6ITAsdG91Y2hlczohMCx3aGljaDpmdW5jdGlvbihlKXt2YXIgdD1lLmJ1dHRvbjtyZXR1cm4gbnVsbD09ZS53aGljaCYmaXQudGVzdChlLnR5cGUpP251bGwhPWUuY2hhckNvZGU/ZS5jaGFyQ29kZTplLmtleUNvZGU6IWUud2hpY2gmJnZvaWQgMCE9PXQmJmF0LnRlc3QoZS50eXBlKT8xJnQ/MToyJnQ/Mzo0JnQ/MjowOmUud2hpY2h9fSxrZS5ldmVudC5hZGRQcm9wKSxrZS5lYWNoKHttb3VzZWVudGVyOiJtb3VzZW92ZXIiLG1vdXNlbGVhdmU6Im1vdXNlb3V0Iixwb2ludGVyZW50ZXI6InBvaW50ZXJvdmVyIixwb2ludGVybGVhdmU6InBvaW50ZXJvdXQifSxmdW5jdGlvbihlLHQpe2tlLmV2ZW50LnNwZWNpYWxbZV09e2RlbGVnYXRlVHlwZTp0LGJpbmRUeXBlOnQsaGFuZGxlOmZ1bmN0aW9uKGUpe3ZhciBuLHI9dGhpcyxvPWUucmVsYXRlZFRhcmdldCxpPWUuaGFuZGxlT2JqO3JldHVybiBvJiYobz09PXJ8fGtlLmNvbnRhaW5zKHIsbykpfHwoZS50eXBlPWkub3JpZ1R5cGUsbj1pLmhhbmRsZXIuYXBwbHkodGhpcyxhcmd1bWVudHMpLGUudHlwZT10KSxufX19KSxrZS5mbi5leHRlbmQoe29uOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiBqKHRoaXMsZSx0LG4scil9LG9uZTpmdW5jdGlvbihlLHQsbixyKXtyZXR1cm4gaih0aGlzLGUsdCxuLHIsMSl9LG9mZjpmdW5jdGlvbihlLHQsbil7dmFyIHIsbztpZihlJiZlLnByZXZlbnREZWZhdWx0JiZlLmhhbmRsZU9iailyZXR1cm4gcj1lLmhhbmRsZU9iaixrZShlLmRlbGVnYXRlVGFyZ2V0KS5vZmYoci5uYW1lc3BhY2U/ci5vcmlnVHlwZSsiLiIrci5uYW1lc3BhY2U6ci5vcmlnVHlwZSxyLnNlbGVjdG9yLHIuaGFuZGxlciksdGhpcztpZigib2JqZWN0Ij09dHlwZW9mIGUpe2ZvcihvIGluIGUpdGhpcy5vZmYobyx0LGVbb10pO3JldHVybiB0aGlzfXJldHVybiExIT09dCYmImZ1bmN0aW9uIiE9dHlwZW9mIHR8fChuPXQsdD12b2lkIDApLCExPT09biYmKG49RSksdGhpcy5lYWNoKGZ1bmN0aW9uKCl7a2UuZXZlbnQucmVtb3ZlKHRoaXMsZSxuLHQpfSl9fSk7dmFyIHV0PS88KD8hYXJlYXxicnxjb2x8ZW1iZWR8aHJ8aW1nfGlucHV0fGxpbmt8bWV0YXxwYXJhbSkoKFthLXpdW15cL1wwPlx4MjBcdFxyXG5cZl0qKVtePl0qKVwvPi9naSxjdD0vPHNjcmlwdHw8c3R5bGV8PGxpbmsvaSxsdD0vY2hlY2tlZFxzKig/OltePV18PVxzKi5jaGVja2VkLikvaSxmdD0vXlxzKjwhKD86XFtDREFUQVxbfC0tKXwoPzpcXVxdfC0tKT5ccyokL2c7a2UuZXh0ZW5kKHtodG1sUHJlZmlsdGVyOmZ1bmN0aW9uKGUpe3JldHVybiBlLnJlcGxhY2UodXQsIjwkMT48LyQyPiIpfSxjbG9uZTpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLGEscz1lLmNsb25lTm9kZSghMCksdT1rZS5jb250YWlucyhlLm93bmVyRG9jdW1lbnQsZSk7aWYoISh3ZS5ub0Nsb25lQ2hlY2tlZHx8MSE9PWUubm9kZVR5cGUmJjExIT09ZS5ub2RlVHlwZXx8a2UuaXNYTUxEb2MoZSkpKWZvcihhPWsocyksaT1rKGUpLHI9MCxvPWkubGVuZ3RoO3I8bztyKyspUihpW3JdLGFbcl0pO2lmKHQpaWYobilmb3IoaT1pfHxrKGUpLGE9YXx8ayhzKSxyPTAsbz1pLmxlbmd0aDtyPG87cisrKUkoaVtyXSxhW3JdKTtlbHNlIEkoZSxzKTtyZXR1cm4gYT1rKHMsInNjcmlwdCIpLGEubGVuZ3RoPjAmJkEoYSwhdSYmayhlLCJzY3JpcHQiKSksc30sY2xlYW5EYXRhOmZ1bmN0aW9uKGUpe2Zvcih2YXIgdCxuLHIsbz1rZS5ldmVudC5zcGVjaWFsLGk9MDt2b2lkIDAhPT0obj1lW2ldKTtpKyspaWYoQmUobikpe2lmKHQ9bltVZS5leHBhbmRvXSl7aWYodC5ldmVudHMpZm9yKHIgaW4gdC5ldmVudHMpb1tyXT9rZS5ldmVudC5yZW1vdmUobixyKTprZS5yZW1vdmVFdmVudChuLHIsdC5oYW5kbGUpO25bVWUuZXhwYW5kb109dm9pZCAwfW5bV2UuZXhwYW5kb10mJihuW1dlLmV4cGFuZG9dPXZvaWQgMCl9fX0pLGtlLmZuLmV4dGVuZCh7ZGV0YWNoOmZ1bmN0aW9uKGUpe3JldHVybiBNKHRoaXMsZSwhMCl9LHJlbW92ZTpmdW5jdGlvbihlKXtyZXR1cm4gTSh0aGlzLGUpfSx0ZXh0OmZ1bmN0aW9uKGUpe3JldHVybiBxZSh0aGlzLGZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDA9PT1lP2tlLnRleHQodGhpcyk6dGhpcy5lbXB0eSgpLmVhY2goZnVuY3Rpb24oKXsxIT09dGhpcy5ub2RlVHlwZSYmMTEhPT10aGlzLm5vZGVUeXBlJiY5IT09dGhpcy5ub2RlVHlwZXx8KHRoaXMudGV4dENvbnRlbnQ9ZSl9KX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxhcHBlbmQ6ZnVuY3Rpb24oKXtyZXR1cm4gUCh0aGlzLGFyZ3VtZW50cyxmdW5jdGlvbihlKXtpZigxPT09dGhpcy5ub2RlVHlwZXx8MTE9PT10aGlzLm5vZGVUeXBlfHw5PT09dGhpcy5ub2RlVHlwZSl7Tih0aGlzLGUpLmFwcGVuZENoaWxkKGUpfX0pfSxwcmVwZW5kOmZ1bmN0aW9uKCl7cmV0dXJuIFAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7aWYoMT09PXRoaXMubm9kZVR5cGV8fDExPT09dGhpcy5ub2RlVHlwZXx8OT09PXRoaXMubm9kZVR5cGUpe3ZhciB0PU4odGhpcyxlKTt0Lmluc2VydEJlZm9yZShlLHQuZmlyc3RDaGlsZCl9fSl9LGJlZm9yZTpmdW5jdGlvbigpe3JldHVybiBQKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKGUpe3RoaXMucGFyZW50Tm9kZSYmdGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZShlLHRoaXMpfSl9LGFmdGVyOmZ1bmN0aW9uKCl7cmV0dXJuIFAodGhpcyxhcmd1bWVudHMsZnVuY3Rpb24oZSl7dGhpcy5wYXJlbnROb2RlJiZ0aGlzLnBhcmVudE5vZGUuaW5zZXJ0QmVmb3JlKGUsdGhpcy5uZXh0U2libGluZyl9KX0sZW1wdHk6ZnVuY3Rpb24oKXtmb3IodmFyIGUsdD0wO251bGwhPShlPXRoaXNbdF0pO3QrKykxPT09ZS5ub2RlVHlwZSYmKGtlLmNsZWFuRGF0YShrKGUsITEpKSxlLnRleHRDb250ZW50PSIiKTtyZXR1cm4gdGhpc30sY2xvbmU6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZT1udWxsIT1lJiZlLHQ9bnVsbD09dD9lOnQsdGhpcy5tYXAoZnVuY3Rpb24oKXtyZXR1cm4ga2UuY2xvbmUodGhpcyxlLHQpfSl9LGh0bWw6ZnVuY3Rpb24oZSl7cmV0dXJuIHFlKHRoaXMsZnVuY3Rpb24oZSl7dmFyIHQ9dGhpc1swXXx8e30sbj0wLHI9dGhpcy5sZW5ndGg7aWYodm9pZCAwPT09ZSYmMT09PXQubm9kZVR5cGUpcmV0dXJuIHQuaW5uZXJIVE1MO2lmKCJzdHJpbmciPT10eXBlb2YgZSYmIWN0LnRlc3QoZSkmJiFudFsoZXQuZXhlYyhlKXx8WyIiLCIiXSlbMV0udG9Mb3dlckNhc2UoKV0pe2U9a2UuaHRtbFByZWZpbHRlcihlKTt0cnl7Zm9yKDtuPHI7bisrKXQ9dGhpc1tuXXx8e30sMT09PXQubm9kZVR5cGUmJihrZS5jbGVhbkRhdGEoayh0LCExKSksdC5pbm5lckhUTUw9ZSk7dD0wfWNhdGNoKGUpe319dCYmdGhpcy5lbXB0eSgpLmFwcGVuZChlKX0sbnVsbCxlLGFyZ3VtZW50cy5sZW5ndGgpfSxyZXBsYWNlV2l0aDpmdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBQKHRoaXMsYXJndW1lbnRzLGZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMucGFyZW50Tm9kZTtrZS5pbkFycmF5KHRoaXMsZSk8MCYmKGtlLmNsZWFuRGF0YShrKHRoaXMpKSxuJiZuLnJlcGxhY2VDaGlsZCh0LHRoaXMpKX0sZSl9fSksa2UuZWFjaCh7YXBwZW5kVG86ImFwcGVuZCIscHJlcGVuZFRvOiJwcmVwZW5kIixpbnNlcnRCZWZvcmU6ImJlZm9yZSIsaW5zZXJ0QWZ0ZXI6ImFmdGVyIixyZXBsYWNlQWxsOiJyZXBsYWNlV2l0aCJ9LGZ1bmN0aW9uKGUsdCl7a2UuZm5bZV09ZnVuY3Rpb24oZSl7Zm9yKHZhciBuLHI9W10sbz1rZShlKSxpPW8ubGVuZ3RoLTEsYT0wO2E8PWk7YSsrKW49YT09PWk/dGhpczp0aGlzLmNsb25lKCEwKSxrZShvW2FdKVt0XShuKSxoZS5hcHBseShyLG4uZ2V0KCkpO3JldHVybiB0aGlzLnB1c2hTdGFjayhyKX19KTt2YXIgcHQ9bmV3IFJlZ0V4cCgiXigiK1hlKyIpKD8hcHgpW2EteiVdKyQiLCJpIiksZHQ9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3O3JldHVybiB0JiZ0Lm9wZW5lcnx8KHQ9biksdC5nZXRDb21wdXRlZFN0eWxlKGUpfSxodD1uZXcgUmVnRXhwKEtlLmpvaW4oInwiKSwiaSIpOyFmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXtpZihjKXt1LnN0eWxlLmNzc1RleHQ9InBvc2l0aW9uOmFic29sdXRlO2xlZnQ6LTExMTExcHg7d2lkdGg6NjBweDttYXJnaW4tdG9wOjFweDtwYWRkaW5nOjA7Ym9yZGVyOjAiLGMuc3R5bGUuY3NzVGV4dD0icG9zaXRpb246cmVsYXRpdmU7ZGlzcGxheTpibG9jaztib3gtc2l6aW5nOmJvcmRlci1ib3g7b3ZlcmZsb3c6c2Nyb2xsO21hcmdpbjphdXRvO2JvcmRlcjoxcHg7cGFkZGluZzoxcHg7d2lkdGg6NjAlO3RvcDoxJSIsb3QuYXBwZW5kQ2hpbGQodSkuYXBwZW5kQ2hpbGQoYyk7dmFyIGU9bi5nZXRDb21wdXRlZFN0eWxlKGMpO3I9IjElIiE9PWUudG9wLHM9MTI9PT10KGUubWFyZ2luTGVmdCksYy5zdHlsZS5yaWdodD0iNjAlIixhPTM2PT09dChlLnJpZ2h0KSxvPTM2PT09dChlLndpZHRoKSxjLnN0eWxlLnBvc2l0aW9uPSJhYnNvbHV0ZSIsaT0zNj09PWMub2Zmc2V0V2lkdGh8fCJhYnNvbHV0ZSIsb3QucmVtb3ZlQ2hpbGQodSksYz1udWxsfX1mdW5jdGlvbiB0KGUpe3JldHVybiBNYXRoLnJvdW5kKHBhcnNlRmxvYXQoZSkpfXZhciByLG8saSxhLHMsdT1sZS5jcmVhdGVFbGVtZW50KCJkaXYiKSxjPWxlLmNyZWF0ZUVsZW1lbnQoImRpdiIpO2Muc3R5bGUmJihjLnN0eWxlLmJhY2tncm91bmRDbGlwPSJjb250ZW50LWJveCIsYy5jbG9uZU5vZGUoITApLnN0eWxlLmJhY2tncm91bmRDbGlwPSIiLHdlLmNsZWFyQ2xvbmVTdHlsZT0iY29udGVudC1ib3giPT09Yy5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCxrZS5leHRlbmQod2Use2JveFNpemluZ1JlbGlhYmxlOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxvfSxwaXhlbEJveFN0eWxlczpmdW5jdGlvbigpe3JldHVybiBlKCksYX0scGl4ZWxQb3NpdGlvbjpmdW5jdGlvbigpe3JldHVybiBlKCkscn0scmVsaWFibGVNYXJnaW5MZWZ0OmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxzfSxzY3JvbGxib3hTaXplOmZ1bmN0aW9uKCl7cmV0dXJuIGUoKSxpfX0pKX0oKTt2YXIgdnQ9L14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLG10PS9eLS0vLHl0PXtwb3NpdGlvbjoiYWJzb2x1dGUiLHZpc2liaWxpdHk6ImhpZGRlbiIsZGlzcGxheToiYmxvY2sifSxndD17bGV0dGVyU3BhY2luZzoiMCIsZm9udFdlaWdodDoiNDAwIn0sYnQ9WyJXZWJraXQiLCJNb3oiLCJtcyJdLHh0PWxlLmNyZWF0ZUVsZW1lbnQoImRpdiIpLnN0eWxlO2tlLmV4dGVuZCh7Y3NzSG9va3M6e29wYWNpdHk6e2dldDpmdW5jdGlvbihlLHQpe2lmKHQpe3ZhciBuPXEoZSwib3BhY2l0eSIpO3JldHVybiIiPT09bj8iMSI6bn19fX0sY3NzTnVtYmVyOnthbmltYXRpb25JdGVyYXRpb25Db3VudDohMCxjb2x1bW5Db3VudDohMCxmaWxsT3BhY2l0eTohMCxmbGV4R3JvdzohMCxmbGV4U2hyaW5rOiEwLGZvbnRXZWlnaHQ6ITAsbGluZUhlaWdodDohMCxvcGFjaXR5OiEwLG9yZGVyOiEwLG9ycGhhbnM6ITAsd2lkb3dzOiEwLHpJbmRleDohMCx6b29tOiEwfSxjc3NQcm9wczp7fSxzdHlsZTpmdW5jdGlvbihlLHQsbixyKXtpZihlJiYzIT09ZS5ub2RlVHlwZSYmOCE9PWUubm9kZVR5cGUmJmUuc3R5bGUpe3ZhciBvLGksYSxzPWcodCksdT1tdC50ZXN0KHQpLGM9ZS5zdHlsZTtpZih1fHwodD1CKHMpKSxhPWtlLmNzc0hvb2tzW3RdfHxrZS5jc3NIb29rc1tzXSx2b2lkIDA9PT1uKXJldHVybiBhJiYiZ2V0ImluIGEmJnZvaWQgMCE9PShvPWEuZ2V0KGUsITEscikpP286Y1t0XTtpPXR5cGVvZiBuLCJzdHJpbmciPT09aSYmKG89SmUuZXhlYyhuKSkmJm9bMV0mJihuPV8oZSx0LG8pLGk9Im51bWJlciIpLG51bGwhPW4mJm49PT1uJiYoIm51bWJlciI9PT1pJiYobis9byYmb1szXXx8KGtlLmNzc051bWJlcltzXT8iIjoicHgiKSksd2UuY2xlYXJDbG9uZVN0eWxlfHwiIiE9PW58fDAhPT10LmluZGV4T2YoImJhY2tncm91bmQiKXx8KGNbdF09ImluaGVyaXQiKSxhJiYic2V0ImluIGEmJnZvaWQgMD09PShuPWEuc2V0KGUsbixyKSl8fCh1P2Muc2V0UHJvcGVydHkodCxuKTpjW3RdPW4pKX19LGNzczpmdW5jdGlvbihlLHQsbixyKXt2YXIgbyxpLGEscz1nKHQpO3JldHVybiBtdC50ZXN0KHQpfHwodD1CKHMpKSxhPWtlLmNzc0hvb2tzW3RdfHxrZS5jc3NIb29rc1tzXSxhJiYiZ2V0ImluIGEmJihvPWEuZ2V0KGUsITAsbikpLHZvaWQgMD09PW8mJihvPXEoZSx0LHIpKSwibm9ybWFsIj09PW8mJnQgaW4gZ3QmJihvPWd0W3RdKSwiIj09PW58fG4/KGk9cGFyc2VGbG9hdChvKSwhMD09PW58fGlzRmluaXRlKGkpP2l8fDA6byk6b319KSxrZS5lYWNoKFsiaGVpZ2h0Iiwid2lkdGgiXSxmdW5jdGlvbihlLHQpe2tlLmNzc0hvb2tzW3RdPXtnZXQ6ZnVuY3Rpb24oZSxuLHIpe2lmKG4pcmV0dXJuIXZ0LnRlc3Qoa2UuY3NzKGUsImRpc3BsYXkiKSl8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgmJmUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCkud2lkdGg/eihlLHQscik6WWUoZSx5dCxmdW5jdGlvbigpe3JldHVybiB6KGUsdCxyKX0pfSxzZXQ6ZnVuY3Rpb24oZSxuLHIpe3ZhciBvLGk9ZHQoZSksYT0iYm9yZGVyLWJveCI9PT1rZS5jc3MoZSwiYm94U2l6aW5nIiwhMSxpKSxzPXImJlcoZSx0LHIsYSxpKTtyZXR1cm4gYSYmd2Uuc2Nyb2xsYm94U2l6ZSgpPT09aS5wb3NpdGlvbiYmKHMtPU1hdGguY2VpbChlWyJvZmZzZXQiK3RbMF0udG9VcHBlckNhc2UoKSt0LnNsaWNlKDEpXS1wYXJzZUZsb2F0KGlbdF0pLVcoZSx0LCJib3JkZXIiLCExLGkpLS41KSkscyYmKG89SmUuZXhlYyhuKSkmJiJweCIhPT0ob1szXXx8InB4IikmJihlLnN0eWxlW3RdPW4sbj1rZS5jc3MoZSx0KSksVShlLG4scyl9fX0pLGtlLmNzc0hvb2tzLm1hcmdpbkxlZnQ9SCh3ZS5yZWxpYWJsZU1hcmdpbkxlZnQsZnVuY3Rpb24oZSx0KXtpZih0KXJldHVybihwYXJzZUZsb2F0KHEoZSwibWFyZ2luTGVmdCIpKXx8ZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0LVllKGUse21hcmdpbkxlZnQ6MH0sZnVuY3Rpb24oKXtyZXR1cm4gZS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0fSkpKyJweCJ9KSxrZS5lYWNoKHttYXJnaW46IiIscGFkZGluZzoiIixib3JkZXI6IldpZHRoIn0sZnVuY3Rpb24oZSx0KXtrZS5jc3NIb29rc1tlK3RdPXtleHBhbmQ6ZnVuY3Rpb24obil7Zm9yKHZhciByPTAsbz17fSxpPSJzdHJpbmciPT10eXBlb2Ygbj9uLnNwbGl0KCIgIik6W25dO3I8NDtyKyspb1tlK0tlW3JdK3RdPWlbcl18fGlbci0yXXx8aVswXTtyZXR1cm4gb319LCJtYXJnaW4iIT09ZSYmKGtlLmNzc0hvb2tzW2UrdF0uc2V0PVUpfSksa2UuZm4uZXh0ZW5kKHtjc3M6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcWUodGhpcyxmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPXt9LGE9MDtpZihBcnJheS5pc0FycmF5KHQpKXtmb3Iocj1kdChlKSxvPXQubGVuZ3RoO2E8bzthKyspaVt0W2FdXT1rZS5jc3MoZSx0W2FdLCExLHIpO3JldHVybiBpfXJldHVybiB2b2lkIDAhPT1uP2tlLnN0eWxlKGUsdCxuKTprZS5jc3MoZSx0KX0sZSx0LGFyZ3VtZW50cy5sZW5ndGg+MSl9fSksa2UuVHdlZW49VixWLnByb3RvdHlwZT17Y29uc3RydWN0b3I6Vixpbml0OmZ1bmN0aW9uKGUsdCxuLHIsbyxpKXt0aGlzLmVsZW09ZSx0aGlzLnByb3A9bix0aGlzLmVhc2luZz1vfHxrZS5lYXNpbmcuX2RlZmF1bHQsdGhpcy5vcHRpb25zPXQsdGhpcy5zdGFydD10aGlzLm5vdz10aGlzLmN1cigpLHRoaXMuZW5kPXIsdGhpcy51bml0PWl8fChrZS5jc3NOdW1iZXJbbl0/IiI6InB4Iil9LGN1cjpmdW5jdGlvbigpe3ZhciBlPVYucHJvcEhvb2tzW3RoaXMucHJvcF07cmV0dXJuIGUmJmUuZ2V0P2UuZ2V0KHRoaXMpOlYucHJvcEhvb2tzLl9kZWZhdWx0LmdldCh0aGlzKX0scnVuOmZ1bmN0aW9uKGUpe3ZhciB0LG49Vi5wcm9wSG9va3NbdGhpcy5wcm9wXTtyZXR1cm4gdGhpcy5vcHRpb25zLmR1cmF0aW9uP3RoaXMucG9zPXQ9a2UuZWFzaW5nW3RoaXMuZWFzaW5nXShlLHRoaXMub3B0aW9ucy5kdXJhdGlvbiplLDAsMSx0aGlzLm9wdGlvbnMuZHVyYXRpb24pOnRoaXMucG9zPXQ9ZSx0aGlzLm5vdz0odGhpcy5lbmQtdGhpcy5zdGFydCkqdCt0aGlzLnN0YXJ0LHRoaXMub3B0aW9ucy5zdGVwJiZ0aGlzLm9wdGlvbnMuc3RlcC5jYWxsKHRoaXMuZWxlbSx0aGlzLm5vdyx0aGlzKSxuJiZuLnNldD9uLnNldCh0aGlzKTpWLnByb3BIb29rcy5fZGVmYXVsdC5zZXQodGhpcyksdGhpc319LFYucHJvdG90eXBlLmluaXQucHJvdG90eXBlPVYucHJvdG90eXBlLFYucHJvcEhvb2tzPXtfZGVmYXVsdDp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiAxIT09ZS5lbGVtLm5vZGVUeXBlfHxudWxsIT1lLmVsZW1bZS5wcm9wXSYmbnVsbD09ZS5lbGVtLnN0eWxlW2UucHJvcF0/ZS5lbGVtW2UucHJvcF06KHQ9a2UuY3NzKGUuZWxlbSxlLnByb3AsIiIpLHQmJiJhdXRvIiE9PXQ/dDowKX0sc2V0OmZ1bmN0aW9uKGUpe2tlLmZ4LnN0ZXBbZS5wcm9wXT9rZS5meC5zdGVwW2UucHJvcF0oZSk6MSE9PWUuZWxlbS5ub2RlVHlwZXx8bnVsbD09ZS5lbGVtLnN0eWxlW2tlLmNzc1Byb3BzW2UucHJvcF1dJiYha2UuY3NzSG9va3NbZS5wcm9wXT9lLmVsZW1bZS5wcm9wXT1lLm5vdzprZS5zdHlsZShlLmVsZW0sZS5wcm9wLGUubm93K2UudW5pdCl9fX0sVi5wcm9wSG9va3Muc2Nyb2xsVG9wPVYucHJvcEhvb2tzLnNjcm9sbExlZnQ9e3NldDpmdW5jdGlvbihlKXtlLmVsZW0ubm9kZVR5cGUmJmUuZWxlbS5wYXJlbnROb2RlJiYoZS5lbGVtW2UucHJvcF09ZS5ub3cpfX0sa2UuZWFzaW5nPXtsaW5lYXI6ZnVuY3Rpb24oZSl7cmV0dXJuIGV9LHN3aW5nOmZ1bmN0aW9uKGUpe3JldHVybi41LU1hdGguY29zKGUqTWF0aC5QSSkvMn0sX2RlZmF1bHQ6InN3aW5nIn0sa2UuZng9Vi5wcm90b3R5cGUuaW5pdCxrZS5meC5zdGVwPXt9O3ZhciB3dCxfdCxDdD0vXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sVHQ9L3F1ZXVlSG9va3MkLztrZS5BbmltYXRpb249a2UuZXh0ZW5kKFose3R3ZWVuZXJzOnsiKiI6W2Z1bmN0aW9uKGUsdCl7dmFyIG49dGhpcy5jcmVhdGVUd2VlbihlLHQpO3JldHVybiBfKG4uZWxlbSxlLEplLmV4ZWModCksbiksbn1dfSx0d2VlbmVyOmZ1bmN0aW9uKGUsdCl7X2UoZSk/KHQ9ZSxlPVsiKiJdKTplPWUubWF0Y2goUmUpO2Zvcih2YXIgbixyPTAsbz1lLmxlbmd0aDtyPG87cisrKW49ZVtyXSxaLnR3ZWVuZXJzW25dPVoudHdlZW5lcnNbbl18fFtdLFoudHdlZW5lcnNbbl0udW5zaGlmdCh0KX0scHJlZmlsdGVyczpbWV0scHJlZmlsdGVyOmZ1bmN0aW9uKGUsdCl7dD9aLnByZWZpbHRlcnMudW5zaGlmdChlKTpaLnByZWZpbHRlcnMucHVzaChlKX19KSxrZS5zcGVlZD1mdW5jdGlvbihlLHQsbil7dmFyIHI9ZSYmIm9iamVjdCI9PXR5cGVvZiBlP2tlLmV4dGVuZCh7fSxlKTp7Y29tcGxldGU6bnx8IW4mJnR8fF9lKGUpJiZlLGR1cmF0aW9uOmUsZWFzaW5nOm4mJnR8fHQmJiFfZSh0KSYmdH07cmV0dXJuIGtlLmZ4Lm9mZj9yLmR1cmF0aW9uPTA6Im51bWJlciIhPXR5cGVvZiByLmR1cmF0aW9uJiYoci5kdXJhdGlvbiBpbiBrZS5meC5zcGVlZHM/ci5kdXJhdGlvbj1rZS5meC5zcGVlZHNbci5kdXJhdGlvbl06ci5kdXJhdGlvbj1rZS5meC5zcGVlZHMuX2RlZmF1bHQpLG51bGwhPXIucXVldWUmJiEwIT09ci5xdWV1ZXx8KHIucXVldWU9ImZ4Iiksci5vbGQ9ci5jb21wbGV0ZSxyLmNvbXBsZXRlPWZ1bmN0aW9uKCl7X2Uoci5vbGQpJiZyLm9sZC5jYWxsKHRoaXMpLHIucXVldWUmJmtlLmRlcXVldWUodGhpcyxyLnF1ZXVlKX0scn0sa2UuZm4uZXh0ZW5kKHtmYWRlVG86ZnVuY3Rpb24oZSx0LG4scil7cmV0dXJuIHRoaXMuZmlsdGVyKEdlKS5jc3MoIm9wYWNpdHkiLDApLnNob3coKS5lbmQoKS5hbmltYXRlKHtvcGFjaXR5OnR9LGUsbixyKX0sYW5pbWF0ZTpmdW5jdGlvbihlLHQsbixyKXt2YXIgbz1rZS5pc0VtcHR5T2JqZWN0KGUpLGk9a2Uuc3BlZWQodCxuLHIpLGE9ZnVuY3Rpb24oKXt2YXIgdD1aKHRoaXMsa2UuZXh0ZW5kKHt9LGUpLGkpOyhvfHxVZS5nZXQodGhpcywiZmluaXNoIikpJiZ0LnN0b3AoITApfTtyZXR1cm4gYS5maW5pc2g9YSxvfHwhMT09PWkucXVldWU/dGhpcy5lYWNoKGEpOnRoaXMucXVldWUoaS5xdWV1ZSxhKX0sc3RvcDpmdW5jdGlvbihlLHQsbil7dmFyIHI9ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5zdG9wO2RlbGV0ZSBlLnN0b3AsdChuKX07cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlJiYobj10LHQ9ZSxlPXZvaWQgMCksdCYmITEhPT1lJiZ0aGlzLnF1ZXVlKGV8fCJmeCIsW10pLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0PSEwLG89bnVsbCE9ZSYmZSsicXVldWVIb29rcyIsaT1rZS50aW1lcnMsYT1VZS5nZXQodGhpcyk7aWYobylhW29dJiZhW29dLnN0b3AmJnIoYVtvXSk7ZWxzZSBmb3IobyBpbiBhKWFbb10mJmFbb10uc3RvcCYmVHQudGVzdChvKSYmcihhW29dKTtmb3Iobz1pLmxlbmd0aDtvLS07KWlbb10uZWxlbSE9PXRoaXN8fG51bGwhPWUmJmlbb10ucXVldWUhPT1lfHwoaVtvXS5hbmltLnN0b3AobiksdD0hMSxpLnNwbGljZShvLDEpKTshdCYmbnx8a2UuZGVxdWV1ZSh0aGlzLGUpfSl9LGZpbmlzaDpmdW5jdGlvbihlKXtyZXR1cm4hMSE9PWUmJihlPWV8fCJmeCIpLHRoaXMuZWFjaChmdW5jdGlvbigpe3ZhciB0LG49VWUuZ2V0KHRoaXMpLHI9bltlKyJxdWV1ZSJdLG89bltlKyJxdWV1ZUhvb2tzIl0saT1rZS50aW1lcnMsYT1yP3IubGVuZ3RoOjA7Zm9yKG4uZmluaXNoPSEwLGtlLnF1ZXVlKHRoaXMsZSxbXSksbyYmby5zdG9wJiZvLnN0b3AuY2FsbCh0aGlzLCEwKSx0PWkubGVuZ3RoO3QtLTspaVt0XS5lbGVtPT09dGhpcyYmaVt0XS5xdWV1ZT09PWUmJihpW3RdLmFuaW0uc3RvcCghMCksaS5zcGxpY2UodCwxKSk7Zm9yKHQ9MDt0PGE7dCsrKXJbdF0mJnJbdF0uZmluaXNoJiZyW3RdLmZpbmlzaC5jYWxsKHRoaXMpO2RlbGV0ZSBuLmZpbmlzaH0pfX0pLGtlLmVhY2goWyJ0b2dnbGUiLCJzaG93IiwiaGlkZSJdLGZ1bmN0aW9uKGUsdCl7dmFyIG49a2UuZm5bdF07a2UuZm5bdF09ZnVuY3Rpb24oZSxyLG8pe3JldHVybiBudWxsPT1lfHwiYm9vbGVhbiI9PXR5cGVvZiBlP24uYXBwbHkodGhpcyxhcmd1bWVudHMpOnRoaXMuYW5pbWF0ZShLKHQsITApLGUscixvKX19KSxrZS5lYWNoKHtzbGlkZURvd246Sygic2hvdyIpLHNsaWRlVXA6SygiaGlkZSIpLHNsaWRlVG9nZ2xlOksoInRvZ2dsZSIpLGZhZGVJbjp7b3BhY2l0eToic2hvdyJ9LGZhZGVPdXQ6e29wYWNpdHk6ImhpZGUifSxmYWRlVG9nZ2xlOntvcGFjaXR5OiJ0b2dnbGUifX0sZnVuY3Rpb24oZSx0KXtrZS5mbltlXT1mdW5jdGlvbihlLG4scil7cmV0dXJuIHRoaXMuYW5pbWF0ZSh0LGUsbixyKX19KSxrZS50aW1lcnM9W10sa2UuZngudGljaz1mdW5jdGlvbigpe3ZhciBlLHQ9MCxuPWtlLnRpbWVycztmb3Iod3Q9RGF0ZS5ub3coKTt0PG4ubGVuZ3RoO3QrKykoZT1uW3RdKSgpfHxuW3RdIT09ZXx8bi5zcGxpY2UodC0tLDEpO24ubGVuZ3RofHxrZS5meC5zdG9wKCksd3Q9dm9pZCAwfSxrZS5meC50aW1lcj1mdW5jdGlvbihlKXtrZS50aW1lcnMucHVzaChlKSxrZS5meC5zdGFydCgpfSxrZS5meC5pbnRlcnZhbD0xMyxrZS5meC5zdGFydD1mdW5jdGlvbigpe190fHwoX3Q9ITAsWCgpKX0sa2UuZnguc3RvcD1mdW5jdGlvbigpe190PW51bGx9LGtlLmZ4LnNwZWVkcz17c2xvdzo2MDAsZmFzdDoyMDAsX2RlZmF1bHQ6NDAwfSxrZS5mbi5kZWxheT1mdW5jdGlvbihlLHQpe3JldHVybiBlPWtlLmZ4P2tlLmZ4LnNwZWVkc1tlXXx8ZTplLHQ9dHx8ImZ4Iix0aGlzLnF1ZXVlKHQsZnVuY3Rpb24odCxyKXt2YXIgbz1uLnNldFRpbWVvdXQodCxlKTtyLnN0b3A9ZnVuY3Rpb24oKXtuLmNsZWFyVGltZW91dChvKX19KX0sZnVuY3Rpb24oKXt2YXIgZT1sZS5jcmVhdGVFbGVtZW50KCJpbnB1dCIpLHQ9bGUuY3JlYXRlRWxlbWVudCgic2VsZWN0Iiksbj10LmFwcGVuZENoaWxkKGxlLmNyZWF0ZUVsZW1lbnQoIm9wdGlvbiIpKTtlLnR5cGU9ImNoZWNrYm94Iix3ZS5jaGVja09uPSIiIT09ZS52YWx1ZSx3ZS5vcHRTZWxlY3RlZD1uLnNlbGVjdGVkLGU9bGUuY3JlYXRlRWxlbWVudCgiaW5wdXQiKSxlLnZhbHVlPSJ0IixlLnR5cGU9InJhZGlvIix3ZS5yYWRpb1ZhbHVlPSJ0Ij09PWUudmFsdWV9KCk7dmFyIGt0LEF0PWtlLmV4cHIuYXR0ckhhbmRsZTtrZS5mbi5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcWUodGhpcyxrZS5hdHRyLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVBdHRyOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtrZS5yZW1vdmVBdHRyKHRoaXMsZSl9KX19KSxrZS5leHRlbmQoe2F0dHI6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saT1lLm5vZGVUeXBlO2lmKDMhPT1pJiY4IT09aSYmMiE9PWkpcmV0dXJuIHZvaWQgMD09PWUuZ2V0QXR0cmlidXRlP2tlLnByb3AoZSx0LG4pOigxPT09aSYma2UuaXNYTUxEb2MoZSl8fChvPWtlLmF0dHJIb29rc1t0LnRvTG93ZXJDYXNlKCldfHwoa2UuZXhwci5tYXRjaC5ib29sLnRlc3QodCk/a3Q6dm9pZCAwKSksdm9pZCAwIT09bj9udWxsPT09bj92b2lkIGtlLnJlbW92ZUF0dHIoZSx0KTpvJiYic2V0ImluIG8mJnZvaWQgMCE9PShyPW8uc2V0KGUsbix0KSk/cjooZS5zZXRBdHRyaWJ1dGUodCxuKyIiKSxuKTpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldChlLHQpKT9yOihyPWtlLmZpbmQuYXR0cihlLHQpLG51bGw9PXI/dm9pZCAwOnIpKX0sYXR0ckhvb2tzOnt0eXBlOntzZXQ6ZnVuY3Rpb24oZSx0KXtpZighd2UucmFkaW9WYWx1ZSYmInJhZGlvIj09PXQmJmMoZSwiaW5wdXQiKSl7dmFyIG49ZS52YWx1ZTtyZXR1cm4gZS5zZXRBdHRyaWJ1dGUoInR5cGUiLHQpLG4mJihlLnZhbHVlPW4pLHR9fX19LHJlbW92ZUF0dHI6ZnVuY3Rpb24oZSx0KXt2YXIgbixyPTAsbz10JiZ0Lm1hdGNoKFJlKTtpZihvJiYxPT09ZS5ub2RlVHlwZSlmb3IoO249b1tyKytdOyllLnJlbW92ZUF0dHJpYnV0ZShuKX19KSxrdD17c2V0OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4hMT09PXQ/a2UucmVtb3ZlQXR0cihlLG4pOmUuc2V0QXR0cmlidXRlKG4sbiksbn19LGtlLmVhY2goa2UuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCgvXHcrL2cpLGZ1bmN0aW9uKGUsdCl7dmFyIG49QXRbdF18fGtlLmZpbmQuYXR0cjtBdFt0XT1mdW5jdGlvbihlLHQscil7dmFyIG8saSxhPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gcnx8KGk9QXRbYV0sQXRbYV09byxvPW51bGwhPW4oZSx0LHIpP2E6bnVsbCxBdFthXT1pKSxvfX0pO3ZhciBTdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLCR0PS9eKD86YXxhcmVhKSQvaTtrZS5mbi5leHRlbmQoe3Byb3A6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gcWUodGhpcyxrZS5wcm9wLGUsdCxhcmd1bWVudHMubGVuZ3RoPjEpfSxyZW1vdmVQcm9wOmZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtkZWxldGUgdGhpc1trZS5wcm9wRml4W2VdfHxlXX0pfX0pLGtlLmV4dGVuZCh7cHJvcDpmdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpPWUubm9kZVR5cGU7aWYoMyE9PWkmJjghPT1pJiYyIT09aSlyZXR1cm4gMT09PWkmJmtlLmlzWE1MRG9jKGUpfHwodD1rZS5wcm9wRml4W3RdfHx0LG89a2UucHJvcEhvb2tzW3RdKSx2b2lkIDAhPT1uP28mJiJzZXQiaW4gbyYmdm9pZCAwIT09KHI9by5zZXQoZSxuLHQpKT9yOmVbdF09bjpvJiYiZ2V0ImluIG8mJm51bGwhPT0ocj1vLmdldChlLHQpKT9yOmVbdF19LHByb3BIb29rczp7dGFiSW5kZXg6e2dldDpmdW5jdGlvbihlKXt2YXIgdD1rZS5maW5kLmF0dHIoZSwidGFiaW5kZXgiKTtyZXR1cm4gdD9wYXJzZUludCh0LDEwKTpTdC50ZXN0KGUubm9kZU5hbWUpfHwkdC50ZXN0KGUubm9kZU5hbWUpJiZlLmhyZWY/MDotMX19fSxwcm9wRml4Ontmb3I6Imh0bWxGb3IiLGNsYXNzOiJjbGFzc05hbWUifX0pLHdlLm9wdFNlbGVjdGVkfHwoa2UucHJvcEhvb2tzLnNlbGVjdGVkPXtnZXQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZS5wYXJlbnROb2RlO3JldHVybiB0JiZ0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4LG51bGx9LHNldDpmdW5jdGlvbihlKXt2YXIgdD1lLnBhcmVudE5vZGU7dCYmKHQuc2VsZWN0ZWRJbmRleCx0LnBhcmVudE5vZGUmJnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4KX19KSxrZS5lYWNoKFsidGFiSW5kZXgiLCJyZWFkT25seSIsIm1heExlbmd0aCIsImNlbGxTcGFjaW5nIiwiY2VsbFBhZGRpbmciLCJyb3dTcGFuIiwiY29sU3BhbiIsInVzZU1hcCIsImZyYW1lQm9yZGVyIiwiY29udGVudEVkaXRhYmxlIl0sZnVuY3Rpb24oKXtrZS5wcm9wRml4W3RoaXMudG9Mb3dlckNhc2UoKV09dGhpc30pLGtlLmZuLmV4dGVuZCh7YWRkQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saSxhLHMsdT0wO2lmKF9lKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7a2UodGhpcykuYWRkQ2xhc3MoZS5jYWxsKHRoaXMsdCx0ZSh0aGlzKSkpfSk7aWYodD1uZShlKSx0Lmxlbmd0aClmb3IoO249dGhpc1t1KytdOylpZihvPXRlKG4pLHI9MT09PW4ubm9kZVR5cGUmJiIgIitlZShvKSsiICIpe2ZvcihhPTA7aT10W2ErK107KXIuaW5kZXhPZigiICIraSsiICIpPDAmJihyKz1pKyIgIik7cz1lZShyKSxvIT09cyYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30scmVtb3ZlQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyLG8saSxhLHMsdT0wO2lmKF9lKGUpKXJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24odCl7a2UodGhpcykucmVtb3ZlQ2xhc3MoZS5jYWxsKHRoaXMsdCx0ZSh0aGlzKSkpfSk7aWYoIWFyZ3VtZW50cy5sZW5ndGgpcmV0dXJuIHRoaXMuYXR0cigiY2xhc3MiLCIiKTtpZih0PW5lKGUpLHQubGVuZ3RoKWZvcig7bj10aGlzW3UrK107KWlmKG89dGUobikscj0xPT09bi5ub2RlVHlwZSYmIiAiK2VlKG8pKyIgIil7Zm9yKGE9MDtpPXRbYSsrXTspZm9yKDtyLmluZGV4T2YoIiAiK2krIiAiKT4tMTspcj1yLnJlcGxhY2UoIiAiK2krIiAiLCIgIik7cz1lZShyKSxvIT09cyYmbi5zZXRBdHRyaWJ1dGUoImNsYXNzIixzKX1yZXR1cm4gdGhpc30sdG9nZ2xlQ2xhc3M6ZnVuY3Rpb24oZSx0KXt2YXIgbj10eXBlb2YgZSxyPSJzdHJpbmciPT09bnx8QXJyYXkuaXNBcnJheShlKTtyZXR1cm4iYm9vbGVhbiI9PXR5cGVvZiB0JiZyP3Q/dGhpcy5hZGRDbGFzcyhlKTp0aGlzLnJlbW92ZUNsYXNzKGUpOl9lKGUpP3RoaXMuZWFjaChmdW5jdGlvbihuKXtrZSh0aGlzKS50b2dnbGVDbGFzcyhlLmNhbGwodGhpcyxuLHRlKHRoaXMpLHQpLHQpfSk6dGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIHQsbyxpLGE7aWYocilmb3Iobz0wLGk9a2UodGhpcyksYT1uZShlKTt0PWFbbysrXTspaS5oYXNDbGFzcyh0KT9pLnJlbW92ZUNsYXNzKHQpOmkuYWRkQ2xhc3ModCk7ZWxzZSB2b2lkIDAhPT1lJiYiYm9vbGVhbiIhPT1ufHwodD10ZSh0aGlzKSx0JiZVZS5zZXQodGhpcywiX19jbGFzc05hbWVfXyIsdCksdGhpcy5zZXRBdHRyaWJ1dGUmJnRoaXMuc2V0QXR0cmlidXRlKCJjbGFzcyIsdHx8ITE9PT1lPyIiOlVlLmdldCh0aGlzLCJfX2NsYXNzTmFtZV9fIil8fCIiKSl9KX0saGFzQ2xhc3M6ZnVuY3Rpb24oZSl7dmFyIHQsbixyPTA7Zm9yKHQ9IiAiK2UrIiAiO249dGhpc1tyKytdOylpZigxPT09bi5ub2RlVHlwZSYmKCIgIitlZSh0ZShuKSkrIiAiKS5pbmRleE9mKHQpPi0xKXJldHVybiEwO3JldHVybiExfX0pO3ZhciBFdD0vXHIvZztrZS5mbi5leHRlbmQoe3ZhbDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz10aGlzWzBdO3tpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiByPV9lKGUpLHRoaXMuZWFjaChmdW5jdGlvbihuKXt2YXIgbzsxPT09dGhpcy5ub2RlVHlwZSYmKG89cj9lLmNhbGwodGhpcyxuLGtlKHRoaXMpLnZhbCgpKTplLG51bGw9PW8/bz0iIjoibnVtYmVyIj09dHlwZW9mIG8/bys9IiI6QXJyYXkuaXNBcnJheShvKSYmKG89a2UubWFwKG8sZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWU/IiI6ZSsiIn0pKSwodD1rZS52YWxIb29rc1t0aGlzLnR5cGVdfHxrZS52YWxIb29rc1t0aGlzLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCldKSYmInNldCJpbiB0JiZ2b2lkIDAhPT10LnNldCh0aGlzLG8sInZhbHVlIil8fCh0aGlzLnZhbHVlPW8pKX0pO2lmKG8pcmV0dXJuKHQ9a2UudmFsSG9va3Nbby50eXBlXXx8a2UudmFsSG9va3Nbby5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpXSkmJiJnZXQiaW4gdCYmdm9pZCAwIT09KG49dC5nZXQobywidmFsdWUiKSk/bjoobj1vLnZhbHVlLCJzdHJpbmciPT10eXBlb2Ygbj9uLnJlcGxhY2UoRXQsIiIpOm51bGw9PW4/IiI6bil9fX0pLGtlLmV4dGVuZCh7dmFsSG9va3M6e29wdGlvbjp7Z2V0OmZ1bmN0aW9uKGUpe3ZhciB0PWtlLmZpbmQuYXR0cihlLCJ2YWx1ZSIpO3JldHVybiBudWxsIT10P3Q6ZWUoa2UudGV4dChlKSl9fSxzZWxlY3Q6e2dldDpmdW5jdGlvbihlKXt2YXIgdCxuLHIsbz1lLm9wdGlvbnMsaT1lLnNlbGVjdGVkSW5kZXgsYT0ic2VsZWN0LW9uZSI9PT1lLnR5cGUscz1hP251bGw6W10sdT1hP2krMTpvLmxlbmd0aDtmb3Iocj1pPDA/dTphP2k6MDtyPHU7cisrKWlmKG49b1tyXSwobi5zZWxlY3RlZHx8cj09PWkpJiYhbi5kaXNhYmxlZCYmKCFuLnBhcmVudE5vZGUuZGlzYWJsZWR8fCFjKG4ucGFyZW50Tm9kZSwib3B0Z3JvdXAiKSkpe2lmKHQ9a2UobikudmFsKCksYSlyZXR1cm4gdDtzLnB1c2godCl9cmV0dXJuIHN9LHNldDpmdW5jdGlvbihlLHQpe2Zvcih2YXIgbixyLG89ZS5vcHRpb25zLGk9a2UubWFrZUFycmF5KHQpLGE9by5sZW5ndGg7YS0tOylyPW9bYV0sKHIuc2VsZWN0ZWQ9a2UuaW5BcnJheShrZS52YWxIb29rcy5vcHRpb24uZ2V0KHIpLGkpPi0xKSYmKG49ITApO3JldHVybiBufHwoZS5zZWxlY3RlZEluZGV4PS0xKSxpfX19fSksa2UuZWFjaChbInJhZGlvIiwiY2hlY2tib3giXSxmdW5jdGlvbigpe2tlLnZhbEhvb2tzW3RoaXNdPXtzZXQ6ZnVuY3Rpb24oZSx0KXtpZihBcnJheS5pc0FycmF5KHQpKXJldHVybiBlLmNoZWNrZWQ9a2UuaW5BcnJheShrZShlKS52YWwoKSx0KT4tMX19LHdlLmNoZWNrT258fChrZS52YWxIb29rc1t0aGlzXS5nZXQ9ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PT1lLmdldEF0dHJpYnV0ZSgidmFsdWUiKT8ib24iOmUudmFsdWV9KX0pLHdlLmZvY3VzaW49Im9uZm9jdXNpbiJpbiBuO3ZhciBPdD0vXig/OmZvY3VzaW5mb2N1c3xmb2N1c291dGJsdXIpJC8sanQ9ZnVuY3Rpb24oZSl7ZS5zdG9wUHJvcGFnYXRpb24oKX07a2UuZXh0ZW5kKGtlLmV2ZW50LHt0cmlnZ2VyOmZ1bmN0aW9uKGUsdCxyLG8pe3ZhciBpLGEscyx1LGMsbCxmLHAsZD1bcnx8bGVdLGg9Z2UuY2FsbChlLCJ0eXBlIik/ZS50eXBlOmUsdj1nZS5jYWxsKGUsIm5hbWVzcGFjZSIpP2UubmFtZXNwYWNlLnNwbGl0KCIuIik6W107aWYoYT1wPXM9cj1yfHxsZSwzIT09ci5ub2RlVHlwZSYmOCE9PXIubm9kZVR5cGUmJiFPdC50ZXN0KGgra2UuZXZlbnQudHJpZ2dlcmVkKSYmKGguaW5kZXhPZigiLiIpPi0xJiYodj1oLnNwbGl0KCIuIiksaD12LnNoaWZ0KCksdi5zb3J0KCkpLGM9aC5pbmRleE9mKCI6Iik8MCYmIm9uIitoLGU9ZVtrZS5leHBhbmRvXT9lOm5ldyBrZS5FdmVudChoLCJvYmplY3QiPT10eXBlb2YgZSYmZSksZS5pc1RyaWdnZXI9bz8yOjMsZS5uYW1lc3BhY2U9di5qb2luKCIuIiksZS5ybmFtZXNwYWNlPWUubmFtZXNwYWNlP25ldyBSZWdFeHAoIihefFxcLikiK3Yuam9pbigiXFwuKD86LipcXC58KSIpKyIoXFwufCQpIik6bnVsbCxlLnJlc3VsdD12b2lkIDAsZS50YXJnZXR8fChlLnRhcmdldD1yKSx0PW51bGw9PXQ/W2VdOmtlLm1ha2VBcnJheSh0LFtlXSksZj1rZS5ldmVudC5zcGVjaWFsW2hdfHx7fSxvfHwhZi50cmlnZ2VyfHwhMSE9PWYudHJpZ2dlci5hcHBseShyLHQpKSl7aWYoIW8mJiFmLm5vQnViYmxlJiYhQ2Uocikpe2Zvcih1PWYuZGVsZWdhdGVUeXBlfHxoLE90LnRlc3QodStoKXx8KGE9YS5wYXJlbnROb2RlKTthO2E9YS5wYXJlbnROb2RlKWQucHVzaChhKSxzPWE7cz09PShyLm93bmVyRG9jdW1lbnR8fGxlKSYmZC5wdXNoKHMuZGVmYXVsdFZpZXd8fHMucGFyZW50V2luZG93fHxuKX1mb3IoaT0wOyhhPWRbaSsrXSkmJiFlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCk7KXA9YSxlLnR5cGU9aT4xP3U6Zi5iaW5kVHlwZXx8aCxsPShVZS5nZXQoYSwiZXZlbnRzIil8fHt9KVtlLnR5cGVdJiZVZS5nZXQoYSwiaGFuZGxlIiksbCYmbC5hcHBseShhLHQpLChsPWMmJmFbY10pJiZsLmFwcGx5JiZCZShhKSYmKGUucmVzdWx0PWwuYXBwbHkoYSx0KSwhMT09PWUucmVzdWx0JiZlLnByZXZlbnREZWZhdWx0KCkpO3JldHVybiBlLnR5cGU9aCxvfHxlLmlzRGVmYXVsdFByZXZlbnRlZCgpfHxmLl9kZWZhdWx0JiYhMSE9PWYuX2RlZmF1bHQuYXBwbHkoZC5wb3AoKSx0KXx8IUJlKHIpfHxjJiZfZShyW2hdKSYmIUNlKHIpJiYocz1yW2NdLHMmJihyW2NdPW51bGwpLGtlLmV2ZW50LnRyaWdnZXJlZD1oLGUuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSYmcC5hZGRFdmVudExpc3RlbmVyKGgsanQpLHJbaF0oKSxlLmlzUHJvcGFnYXRpb25TdG9wcGVkKCkmJnAucmVtb3ZlRXZlbnRMaXN0ZW5lcihoLGp0KSxrZS5ldmVudC50cmlnZ2VyZWQ9dm9pZCAwLHMmJihyW2NdPXMpKSxlLnJlc3VsdH19LHNpbXVsYXRlOmZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1rZS5leHRlbmQobmV3IGtlLkV2ZW50LG4se3R5cGU6ZSxpc1NpbXVsYXRlZDohMH0pO2tlLmV2ZW50LnRyaWdnZXIocixudWxsLHQpfX0pLGtlLmZuLmV4dGVuZCh7dHJpZ2dlcjpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXtrZS5ldmVudC50cmlnZ2VyKGUsdCx0aGlzKX0pfSx0cmlnZ2VySGFuZGxlcjpmdW5jdGlvbihlLHQpe3ZhciBuPXRoaXNbMF07aWYobilyZXR1cm4ga2UuZXZlbnQudHJpZ2dlcihlLHQsbiwhMCl9fSksd2UuZm9jdXNpbnx8a2UuZWFjaCh7Zm9jdXM6ImZvY3VzaW4iLGJsdXI6ImZvY3Vzb3V0In0sZnVuY3Rpb24oZSx0KXt2YXIgbj1mdW5jdGlvbihlKXtrZS5ldmVudC5zaW11bGF0ZSh0LGUudGFyZ2V0LGtlLmV2ZW50LmZpeChlKSl9O2tlLmV2ZW50LnNwZWNpYWxbdF09e3NldHVwOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89VWUuYWNjZXNzKHIsdCk7b3x8ci5hZGRFdmVudExpc3RlbmVyKGUsbiwhMCksVWUuYWNjZXNzKHIsdCwob3x8MCkrMSl9LHRlYXJkb3duOmZ1bmN0aW9uKCl7dmFyIHI9dGhpcy5vd25lckRvY3VtZW50fHx0aGlzLG89VWUuYWNjZXNzKHIsdCktMTtvP1VlLmFjY2VzcyhyLHQsbyk6KHIucmVtb3ZlRXZlbnRMaXN0ZW5lcihlLG4sITApLFVlLnJlbW92ZShyLHQpKX19fSk7dmFyIE50PW4ubG9jYXRpb24sTHQ9RGF0ZS5ub3coKSxEdD0vXD8vO2tlLnBhcnNlWE1MPWZ1bmN0aW9uKGUpe3ZhciB0O2lmKCFlfHwic3RyaW5nIiE9dHlwZW9mIGUpcmV0dXJuIG51bGw7dHJ5e3Q9KG5ldyBuLkRPTVBhcnNlcikucGFyc2VGcm9tU3RyaW5nKGUsInRleHQveG1sIil9Y2F0Y2goZSl7dD12b2lkIDB9cmV0dXJuIHQmJiF0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCJwYXJzZXJlcnJvciIpLmxlbmd0aHx8a2UuZXJyb3IoIkludmFsaWQgWE1MOiAiK2UpLHR9O3ZhciBJdD0vXFtcXSQvLFJ0PS9ccj9cbi9nLFB0PS9eKD86c3VibWl0fGJ1dHRvbnxpbWFnZXxyZXNldHxmaWxlKSQvaSxNdD0vXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7a2UucGFyYW09ZnVuY3Rpb24oZSx0KXt2YXIgbixyPVtdLG89ZnVuY3Rpb24oZSx0KXt2YXIgbj1fZSh0KT90KCk6dDtyW3IubGVuZ3RoXT1lbmNvZGVVUklDb21wb25lbnQoZSkrIj0iK2VuY29kZVVSSUNvbXBvbmVudChudWxsPT1uPyIiOm4pfTtpZihBcnJheS5pc0FycmF5KGUpfHxlLmpxdWVyeSYmIWtlLmlzUGxhaW5PYmplY3QoZSkpa2UuZWFjaChlLGZ1bmN0aW9uKCl7byh0aGlzLm5hbWUsdGhpcy52YWx1ZSl9KTtlbHNlIGZvcihuIGluIGUpcmUobixlW25dLHQsbyk7cmV0dXJuIHIuam9pbigiJiIpfSxrZS5mbi5leHRlbmQoe3NlcmlhbGl6ZTpmdW5jdGlvbigpe3JldHVybiBrZS5wYXJhbSh0aGlzLnNlcmlhbGl6ZUFycmF5KCkpfSxzZXJpYWxpemVBcnJheTpmdW5jdGlvbigpe3JldHVybiB0aGlzLm1hcChmdW5jdGlvbigpe3ZhciBlPWtlLnByb3AodGhpcywiZWxlbWVudHMiKTtyZXR1cm4gZT9rZS5tYWtlQXJyYXkoZSk6dGhpc30pLmZpbHRlcihmdW5jdGlvbigpe3ZhciBlPXRoaXMudHlwZTtyZXR1cm4gdGhpcy5uYW1lJiYha2UodGhpcykuaXMoIjpkaXNhYmxlZCIpJiZNdC50ZXN0KHRoaXMubm9kZU5hbWUpJiYhUHQudGVzdChlKSYmKHRoaXMuY2hlY2tlZHx8IVplLnRlc3QoZSkpfSkubWFwKGZ1bmN0aW9uKGUsdCl7dmFyIG49a2UodGhpcykudmFsKCk7cmV0dXJuIG51bGw9PW4/bnVsbDpBcnJheS5pc0FycmF5KG4pP2tlLm1hcChuLGZ1bmN0aW9uKGUpe3JldHVybntuYW1lOnQubmFtZSx2YWx1ZTplLnJlcGxhY2UoUnQsIlxyXG4iKX19KTp7bmFtZTp0Lm5hbWUsdmFsdWU6bi5yZXBsYWNlKFJ0LCJcclxuIil9fSkuZ2V0KCl9fSk7dmFyIHF0PS8lMjAvZyxIdD0vIy4qJC8sRnQ9LyhbPyZdKV89W14mXSovLEJ0PS9eKC4qPyk6WyBcdF0qKFteXHJcbl0qKSQvZ20sVXQ9L14oPzphYm91dHxhcHB8YXBwLXN0b3JhZ2V8ListZXh0ZW5zaW9ufGZpbGV8cmVzfHdpZGdldCk6JC8sV3Q9L14oPzpHRVR8SEVBRCkkLyx6dD0vXlwvXC8vLFZ0PXt9LFh0PXt9LEp0PSIqLyIuY29uY2F0KCIqIiksS3Q9bGUuY3JlYXRlRWxlbWVudCgiYSIpO0t0LmhyZWY9TnQuaHJlZixrZS5leHRlbmQoe2FjdGl2ZTowLGxhc3RNb2RpZmllZDp7fSxldGFnOnt9LGFqYXhTZXR0aW5nczp7dXJsOk50LmhyZWYsdHlwZToiR0VUIixpc0xvY2FsOlV0LnRlc3QoTnQucHJvdG9jb2wpLGdsb2JhbDohMCxwcm9jZXNzRGF0YTohMCxhc3luYzohMCxjb250ZW50VHlwZToiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04IixhY2NlcHRzOnsiKiI6SnQsdGV4dDoidGV4dC9wbGFpbiIsaHRtbDoidGV4dC9odG1sIix4bWw6ImFwcGxpY2F0aW9uL3htbCwgdGV4dC94bWwiLGpzb246ImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdCJ9LGNvbnRlbnRzOnt4bWw6L1xieG1sXGIvLGh0bWw6L1xiaHRtbC8sanNvbjovXGJqc29uXGIvfSxyZXNwb25zZUZpZWxkczp7eG1sOiJyZXNwb25zZVhNTCIsdGV4dDoicmVzcG9uc2VUZXh0Iixqc29uOiJyZXNwb25zZUpTT04ifSxjb252ZXJ0ZXJzOnsiKiB0ZXh0IjpTdHJpbmcsInRleHQgaHRtbCI6ITAsInRleHQganNvbiI6SlNPTi5wYXJzZSwidGV4dCB4bWwiOmtlLnBhcnNlWE1MfSxmbGF0T3B0aW9uczp7dXJsOiEwLGNvbnRleHQ6ITB9fSxhamF4U2V0dXA6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gdD9hZShhZShlLGtlLmFqYXhTZXR0aW5ncyksdCk6YWUoa2UuYWpheFNldHRpbmdzLGUpfSxhamF4UHJlZmlsdGVyOm9lKFZ0KSxhamF4VHJhbnNwb3J0Om9lKFh0KSxhamF4OmZ1bmN0aW9uKGUsdCl7ZnVuY3Rpb24gcihlLHQscixzKXt2YXIgYyxwLGQseCx3LF89dDtsfHwobD0hMCx1JiZuLmNsZWFyVGltZW91dCh1KSxvPXZvaWQgMCxhPXN8fCIiLEMucmVhZHlTdGF0ZT1lPjA/NDowLGM9ZT49MjAwJiZlPDMwMHx8MzA0PT09ZSxyJiYoeD1zZShoLEMscikpLHg9dWUoaCx4LEMsYyksYz8oaC5pZk1vZGlmaWVkJiYodz1DLmdldFJlc3BvbnNlSGVhZGVyKCJMYXN0LU1vZGlmaWVkIiksdyYmKGtlLmxhc3RNb2RpZmllZFtpXT13KSwodz1DLmdldFJlc3BvbnNlSGVhZGVyKCJldGFnIikpJiYoa2UuZXRhZ1tpXT13KSksMjA0PT09ZXx8IkhFQUQiPT09aC50eXBlP189Im5vY29udGVudCI6MzA0PT09ZT9fPSJub3Rtb2RpZmllZCI6KF89eC5zdGF0ZSxwPXguZGF0YSxkPXguZXJyb3IsYz0hZCkpOihkPV8sIWUmJl98fChfPSJlcnJvciIsZTwwJiYoZT0wKSkpLEMuc3RhdHVzPWUsQy5zdGF0dXNUZXh0PSh0fHxfKSsiIixjP3kucmVzb2x2ZVdpdGgodixbcCxfLENdKTp5LnJlamVjdFdpdGgodixbQyxfLGRdKSxDLnN0YXR1c0NvZGUoYiksYj12b2lkIDAsZiYmbS50cmlnZ2VyKGM/ImFqYXhTdWNjZXNzIjoiYWpheEVycm9yIixbQyxoLGM/cDpkXSksZy5maXJlV2l0aCh2LFtDLF9dKSxmJiYobS50cmlnZ2VyKCJhamF4Q29tcGxldGUiLFtDLGhdKSwtLWtlLmFjdGl2ZXx8a2UuZXZlbnQudHJpZ2dlcigiYWpheFN0b3AiKSkpfSJvYmplY3QiPT10eXBlb2YgZSYmKHQ9ZSxlPXZvaWQgMCksdD10fHx7fTt2YXIgbyxpLGEscyx1LGMsbCxmLHAsZCxoPWtlLmFqYXhTZXR1cCh7fSx0KSx2PWguY29udGV4dHx8aCxtPWguY29udGV4dCYmKHYubm9kZVR5cGV8fHYuanF1ZXJ5KT9rZSh2KTprZS5ldmVudCx5PWtlLkRlZmVycmVkKCksZz1rZS5DYWxsYmFja3MoIm9uY2UgbWVtb3J5IiksYj1oLnN0YXR1c0NvZGV8fHt9LHg9e30sdz17fSxfPSJjYW5jZWxlZCIsQz17cmVhZHlTdGF0ZTowLGdldFJlc3BvbnNlSGVhZGVyOmZ1bmN0aW9uKGUpe3ZhciB0O2lmKGwpe2lmKCFzKWZvcihzPXt9O3Q9QnQuZXhlYyhhKTspc1t0WzFdLnRvTG93ZXJDYXNlKCldPXRbMl07dD1zW2UudG9Mb3dlckNhc2UoKV19cmV0dXJuIG51bGw9PXQ/bnVsbDp0fSxnZXRBbGxSZXNwb25zZUhlYWRlcnM6ZnVuY3Rpb24oKXtyZXR1cm4gbD9hOm51bGx9LHNldFJlcXVlc3RIZWFkZXI6ZnVuY3Rpb24oZSx0KXtyZXR1cm4gbnVsbD09bCYmKGU9d1tlLnRvTG93ZXJDYXNlKCldPXdbZS50b0xvd2VyQ2FzZSgpXXx8ZSx4W2VdPXQpLHRoaXN9LG92ZXJyaWRlTWltZVR5cGU6ZnVuY3Rpb24oZSl7cmV0dXJuIG51bGw9PWwmJihoLm1pbWVUeXBlPWUpLHRoaXN9LHN0YXR1c0NvZGU6ZnVuY3Rpb24oZSl7dmFyIHQ7aWYoZSlpZihsKUMuYWx3YXlzKGVbQy5zdGF0dXNdKTtlbHNlIGZvcih0IGluIGUpYlt0XT1bYlt0XSxlW3RdXTtyZXR1cm4gdGhpc30sYWJvcnQ6ZnVuY3Rpb24oZSl7dmFyIHQ9ZXx8XztyZXR1cm4gbyYmby5hYm9ydCh0KSxyKDAsdCksdGhpc319O2lmKHkucHJvbWlzZShDKSxoLnVybD0oKGV8fGgudXJsfHxOdC5ocmVmKSsiIikucmVwbGFjZSh6dCxOdC5wcm90b2NvbCsiLy8iKSxoLnR5cGU9dC5tZXRob2R8fHQudHlwZXx8aC5tZXRob2R8fGgudHlwZSxoLmRhdGFUeXBlcz0oaC5kYXRhVHlwZXx8IioiKS50b0xvd2VyQ2FzZSgpLm1hdGNoKFJlKXx8WyIiXSxudWxsPT1oLmNyb3NzRG9tYWluKXtjPWxlLmNyZWF0ZUVsZW1lbnQoImEiKTt0cnl7Yy5ocmVmPWgudXJsLGMuaHJlZj1jLmhyZWYsaC5jcm9zc0RvbWFpbj1LdC5wcm90b2NvbCsiLy8iK0t0Lmhvc3QhPWMucHJvdG9jb2wrIi8vIitjLmhvc3R9Y2F0Y2goZSl7aC5jcm9zc0RvbWFpbj0hMH19aWYoaC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYic3RyaW5nIiE9dHlwZW9mIGguZGF0YSYmKGguZGF0YT1rZS5wYXJhbShoLmRhdGEsaC50cmFkaXRpb25hbCkpLGllKFZ0LGgsdCxDKSxsKXJldHVybiBDO2Y9a2UuZXZlbnQmJmguZ2xvYmFsLGYmJjA9PWtlLmFjdGl2ZSsrJiZrZS5ldmVudC50cmlnZ2VyKCJhamF4U3RhcnQiKSxoLnR5cGU9aC50eXBlLnRvVXBwZXJDYXNlKCksaC5oYXNDb250ZW50PSFXdC50ZXN0KGgudHlwZSksaT1oLnVybC5yZXBsYWNlKEh0LCIiKSxoLmhhc0NvbnRlbnQ/aC5kYXRhJiZoLnByb2Nlc3NEYXRhJiYwPT09KGguY29udGVudFR5cGV8fCIiKS5pbmRleE9mKCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWQiKSYmKGguZGF0YT1oLmRhdGEucmVwbGFjZShxdCwiKyIpKTooZD1oLnVybC5zbGljZShpLmxlbmd0aCksaC5kYXRhJiYoaC5wcm9jZXNzRGF0YXx8InN0cmluZyI9PXR5cGVvZiBoLmRhdGEpJiYoaSs9KER0LnRlc3QoaSk/IiYiOiI/IikraC5kYXRhLGRlbGV0ZSBoLmRhdGEpLCExPT09aC5jYWNoZSYmKGk9aS5yZXBsYWNlKEZ0LCIkMSIpLGQ9KER0LnRlc3QoaSk/IiYiOiI/IikrIl89IitMdCsrK2QpLGgudXJsPWkrZCksaC5pZk1vZGlmaWVkJiYoa2UubGFzdE1vZGlmaWVkW2ldJiZDLnNldFJlcXVlc3RIZWFkZXIoIklmLU1vZGlmaWVkLVNpbmNlIixrZS5sYXN0TW9kaWZpZWRbaV0pLGtlLmV0YWdbaV0mJkMuc2V0UmVxdWVzdEhlYWRlcigiSWYtTm9uZS1NYXRjaCIsa2UuZXRhZ1tpXSkpLChoLmRhdGEmJmguaGFzQ29udGVudCYmITEhPT1oLmNvbnRlbnRUeXBlfHx0LmNvbnRlbnRUeXBlKSYmQy5zZXRSZXF1ZXN0SGVhZGVyKCJDb250ZW50LVR5cGUiLGguY29udGVudFR5cGUpLEMuc2V0UmVxdWVzdEhlYWRlcigiQWNjZXB0IixoLmRhdGFUeXBlc1swXSYmaC5hY2NlcHRzW2guZGF0YVR5cGVzWzBdXT9oLmFjY2VwdHNbaC5kYXRhVHlwZXNbMF1dKygiKiIhPT1oLmRhdGFUeXBlc1swXT8iLCAiK0p0KyI7IHE9MC4wMSI6IiIpOmguYWNjZXB0c1siKiJdKTtmb3IocCBpbiBoLmhlYWRlcnMpQy5zZXRSZXF1ZXN0SGVhZGVyKHAsaC5oZWFkZXJzW3BdKTtpZihoLmJlZm9yZVNlbmQmJighMT09PWguYmVmb3JlU2VuZC5jYWxsKHYsQyxoKXx8bCkpcmV0dXJuIEMuYWJvcnQoKTtpZihfPSJhYm9ydCIsZy5hZGQoaC5jb21wbGV0ZSksQy5kb25lKGguc3VjY2VzcyksQy5mYWlsKGguZXJyb3IpLG89aWUoWHQsaCx0LEMpKXtpZihDLnJlYWR5U3RhdGU9MSxmJiZtLnRyaWdnZXIoImFqYXhTZW5kIixbQyxoXSksbClyZXR1cm4gQztoLmFzeW5jJiZoLnRpbWVvdXQ+MCYmKHU9bi5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7Qy5hYm9ydCgidGltZW91dCIpfSxoLnRpbWVvdXQpKTt0cnl7bD0hMSxvLnNlbmQoeCxyKX1jYXRjaChlKXtpZihsKXRocm93IGU7cigtMSxlKX19ZWxzZSByKC0xLCJObyBUcmFuc3BvcnQiKTtyZXR1cm4gQ30sZ2V0SlNPTjpmdW5jdGlvbihlLHQsbil7cmV0dXJuIGtlLmdldChlLHQsbiwianNvbiIpfSxnZXRTY3JpcHQ6ZnVuY3Rpb24oZSx0KXtyZXR1cm4ga2UuZ2V0KGUsdm9pZCAwLHQsInNjcmlwdCIpfX0pLGtlLmVhY2goWyJnZXQiLCJwb3N0Il0sZnVuY3Rpb24oZSx0KXtrZVt0XT1mdW5jdGlvbihlLG4scixvKXtyZXR1cm4gX2UobikmJihvPW98fHIscj1uLG49dm9pZCAwKSxrZS5hamF4KGtlLmV4dGVuZCh7dXJsOmUsdHlwZTp0LGRhdGFUeXBlOm8sZGF0YTpuLHN1Y2Nlc3M6cn0sa2UuaXNQbGFpbk9iamVjdChlKSYmZSkpfX0pLGtlLl9ldmFsVXJsPWZ1bmN0aW9uKGUpe3JldHVybiBrZS5hamF4KHt1cmw6ZSx0eXBlOiJHRVQiLGRhdGFUeXBlOiJzY3JpcHQiLGNhY2hlOiEwLGFzeW5jOiExLGdsb2JhbDohMSx0aHJvd3M6ITB9KX0sa2UuZm4uZXh0ZW5kKHt3cmFwQWxsOmZ1bmN0aW9uKGUpe3ZhciB0O3JldHVybiB0aGlzWzBdJiYoX2UoZSkmJihlPWUuY2FsbCh0aGlzWzBdKSksdD1rZShlLHRoaXNbMF0ub3duZXJEb2N1bWVudCkuZXEoMCkuY2xvbmUoITApLHRoaXNbMF0ucGFyZW50Tm9kZSYmdC5pbnNlcnRCZWZvcmUodGhpc1swXSksdC5tYXAoZnVuY3Rpb24oKXtmb3IodmFyIGU9dGhpcztlLmZpcnN0RWxlbWVudENoaWxkOyllPWUuZmlyc3RFbGVtZW50Q2hpbGQ7cmV0dXJuIGV9KS5hcHBlbmQodGhpcykpLHRoaXN9LHdyYXBJbm5lcjpmdW5jdGlvbihlKXtyZXR1cm4gX2UoZSk/dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2tlKHRoaXMpLndyYXBJbm5lcihlLmNhbGwodGhpcyx0KSl9KTp0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgdD1rZSh0aGlzKSxuPXQuY29udGVudHMoKTtuLmxlbmd0aD9uLndyYXBBbGwoZSk6dC5hcHBlbmQoZSl9KX0sd3JhcDpmdW5jdGlvbihlKXt2YXIgdD1fZShlKTtyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKG4pe2tlKHRoaXMpLndyYXBBbGwodD9lLmNhbGwodGhpcyxuKTplKX0pfSx1bndyYXA6ZnVuY3Rpb24oZSl7cmV0dXJuIHRoaXMucGFyZW50KGUpLm5vdCgiYm9keSIpLmVhY2goZnVuY3Rpb24oKXtrZSh0aGlzKS5yZXBsYWNlV2l0aCh0aGlzLmNoaWxkTm9kZXMpfSksdGhpc319KSxrZS5leHByLnBzZXVkb3MuaGlkZGVuPWZ1bmN0aW9uKGUpe3JldHVybiFrZS5leHByLnBzZXVkb3MudmlzaWJsZShlKX0sa2UuZXhwci5wc2V1ZG9zLnZpc2libGU9ZnVuY3Rpb24oZSl7cmV0dXJuISEoZS5vZmZzZXRXaWR0aHx8ZS5vZmZzZXRIZWlnaHR8fGUuZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGgpfSxrZS5hamF4U2V0dGluZ3MueGhyPWZ1bmN0aW9uKCl7dHJ5e3JldHVybiBuZXcgbi5YTUxIdHRwUmVxdWVzdH1jYXRjaChlKXt9fTt2YXIgR3Q9ezA6MjAwLDEyMjM6MjA0fSxZdD1rZS5hamF4U2V0dGluZ3MueGhyKCk7d2UuY29ycz0hIVl0JiYid2l0aENyZWRlbnRpYWxzImluIFl0LHdlLmFqYXg9WXQ9ISFZdCxrZS5hamF4VHJhbnNwb3J0KGZ1bmN0aW9uKGUpe3ZhciB0LHI7aWYod2UuY29yc3x8WXQmJiFlLmNyb3NzRG9tYWluKXJldHVybntzZW5kOmZ1bmN0aW9uKG8saSl7dmFyIGEscz1lLnhocigpO2lmKHMub3BlbihlLnR5cGUsZS51cmwsZS5hc3luYyxlLnVzZXJuYW1lLGUucGFzc3dvcmQpLGUueGhyRmllbGRzKWZvcihhIGluIGUueGhyRmllbGRzKXNbYV09ZS54aHJGaWVsZHNbYV07ZS5taW1lVHlwZSYmcy5vdmVycmlkZU1pbWVUeXBlJiZzLm92ZXJyaWRlTWltZVR5cGUoZS5taW1lVHlwZSksZS5jcm9zc0RvbWFpbnx8b1siWC1SZXF1ZXN0ZWQtV2l0aCJdfHwob1siWC1SZXF1ZXN0ZWQtV2l0aCJdPSJYTUxIdHRwUmVxdWVzdCIpO2ZvcihhIGluIG8pcy5zZXRSZXF1ZXN0SGVhZGVyKGEsb1thXSk7dD1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24oKXt0JiYodD1yPXMub25sb2FkPXMub25lcnJvcj1zLm9uYWJvcnQ9cy5vbnRpbWVvdXQ9cy5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCwiYWJvcnQiPT09ZT9zLmFib3J0KCk6ImVycm9yIj09PWU/Im51bWJlciIhPXR5cGVvZiBzLnN0YXR1cz9pKDAsImVycm9yIik6aShzLnN0YXR1cyxzLnN0YXR1c1RleHQpOmkoR3Rbcy5zdGF0dXNdfHxzLnN0YXR1cyxzLnN0YXR1c1RleHQsInRleHQiIT09KHMucmVzcG9uc2VUeXBlfHwidGV4dCIpfHwic3RyaW5nIiE9dHlwZW9mIHMucmVzcG9uc2VUZXh0P3tiaW5hcnk6cy5yZXNwb25zZX06e3RleHQ6cy5yZXNwb25zZVRleHR9LHMuZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCkpKX19LHMub25sb2FkPXQoKSxyPXMub25lcnJvcj1zLm9udGltZW91dD10KCJlcnJvciIpLHZvaWQgMCE9PXMub25hYm9ydD9zLm9uYWJvcnQ9cjpzLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpezQ9PT1zLnJlYWR5U3RhdGUmJm4uc2V0VGltZW91dChmdW5jdGlvbigpe3QmJnIoKX0pfSx0PXQoImFib3J0Iik7dHJ5e3Muc2VuZChlLmhhc0NvbnRlbnQmJmUuZGF0YXx8bnVsbCl9Y2F0Y2goZSl7aWYodCl0aHJvdyBlfX0sYWJvcnQ6ZnVuY3Rpb24oKXt0JiZ0KCl9fX0pLGtlLmFqYXhQcmVmaWx0ZXIoZnVuY3Rpb24oZSl7ZS5jcm9zc0RvbWFpbiYmKGUuY29udGVudHMuc2NyaXB0PSExKX0pLGtlLmFqYXhTZXR1cCh7YWNjZXB0czp7c2NyaXB0OiJ0ZXh0L2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2phdmFzY3JpcHQsIGFwcGxpY2F0aW9uL2VjbWFzY3JpcHQsIGFwcGxpY2F0aW9uL3gtZWNtYXNjcmlwdCJ9LGNvbnRlbnRzOntzY3JpcHQ6L1xiKD86amF2YXxlY21hKXNjcmlwdFxiL30sY29udmVydGVyczp7InRleHQgc2NyaXB0IjpmdW5jdGlvbihlKXtyZXR1cm4ga2UuZ2xvYmFsRXZhbChlKSxlfX19KSxrZS5hamF4UHJlZmlsdGVyKCJzY3JpcHQiLGZ1bmN0aW9uKGUpe3ZvaWQgMD09PWUuY2FjaGUmJihlLmNhY2hlPSExKSxlLmNyb3NzRG9tYWluJiYoZS50eXBlPSJHRVQiKX0pLGtlLmFqYXhUcmFuc3BvcnQoInNjcmlwdCIsZnVuY3Rpb24oZSl7aWYoZS5jcm9zc0RvbWFpbil7dmFyIHQsbjtyZXR1cm57c2VuZDpmdW5jdGlvbihyLG8pe3Q9a2UoIjxzY3JpcHQ+IikucHJvcCh7Y2hhcnNldDplLnNjcmlwdENoYXJzZXQsc3JjOmUudXJsfSkub24oImxvYWQgZXJyb3IiLG49ZnVuY3Rpb24oZSl7dC5yZW1vdmUoKSxuPW51bGwsZSYmbygiZXJyb3IiPT09ZS50eXBlPzQwNDoyMDAsZS50eXBlKX0pLGxlLmhlYWQuYXBwZW5kQ2hpbGQodFswXSl9LGFib3J0OmZ1bmN0aW9uKCl7biYmbigpfX19fSk7dmFyIFF0PVtdLFp0PS8oPSlcPyg/PSZ8JCl8XD9cPy87a2UuYWpheFNldHVwKHtqc29ucDoiY2FsbGJhY2siLGpzb25wQ2FsbGJhY2s6ZnVuY3Rpb24oKXt2YXIgZT1RdC5wb3AoKXx8a2UuZXhwYW5kbysiXyIrTHQrKztyZXR1cm4gdGhpc1tlXT0hMCxlfX0pLGtlLmFqYXhQcmVmaWx0ZXIoImpzb24ganNvbnAiLGZ1bmN0aW9uKGUsdCxyKXt2YXIgbyxpLGEscz0hMSE9PWUuanNvbnAmJihadC50ZXN0KGUudXJsKT8idXJsIjoic3RyaW5nIj09dHlwZW9mIGUuZGF0YSYmMD09PShlLmNvbnRlbnRUeXBlfHwiIikuaW5kZXhPZigiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkIikmJlp0LnRlc3QoZS5kYXRhKSYmImRhdGEiKTtpZihzfHwianNvbnAiPT09ZS5kYXRhVHlwZXNbMF0pcmV0dXJuIG89ZS5qc29ucENhbGxiYWNrPV9lKGUuanNvbnBDYWxsYmFjayk/ZS5qc29ucENhbGxiYWNrKCk6ZS5qc29ucENhbGxiYWNrLHM/ZVtzXT1lW3NdLnJlcGxhY2UoWnQsIiQxIitvKTohMSE9PWUuanNvbnAmJihlLnVybCs9KER0LnRlc3QoZS51cmwpPyImIjoiPyIpK2UuanNvbnArIj0iK28pLGUuY29udmVydGVyc1sic2NyaXB0IGpzb24iXT1mdW5jdGlvbigpe3JldHVybiBhfHxrZS5lcnJvcihvKyIgd2FzIG5vdCBjYWxsZWQiKSxhWzBdfSxlLmRhdGFUeXBlc1swXT0ianNvbiIsaT1uW29dLG5bb109ZnVuY3Rpb24oKXthPWFyZ3VtZW50c30sci5hbHdheXMoZnVuY3Rpb24oKXt2b2lkIDA9PT1pP2tlKG4pLnJlbW92ZVByb3Aobyk6bltvXT1pLGVbb10mJihlLmpzb25wQ2FsbGJhY2s9dC5qc29ucENhbGxiYWNrLFF0LnB1c2gobykpLGEmJl9lKGkpJiZpKGFbMF0pLGE9aT12b2lkIDB9KSwic2NyaXB0In0pLHdlLmNyZWF0ZUhUTUxEb2N1bWVudD1mdW5jdGlvbigpe3ZhciBlPWxlLmltcGxlbWVudGF0aW9uLmNyZWF0ZUhUTUxEb2N1bWVudCgiIikuYm9keTtyZXR1cm4gZS5pbm5lckhUTUw9Ijxmb3JtPjwvZm9ybT48Zm9ybT48L2Zvcm0+IiwyPT09ZS5jaGlsZE5vZGVzLmxlbmd0aH0oKSxrZS5wYXJzZUhUTUw9ZnVuY3Rpb24oZSx0LG4pe2lmKCJzdHJpbmciIT10eXBlb2YgZSlyZXR1cm5bXTsiYm9vbGVhbiI9PXR5cGVvZiB0JiYobj10LHQ9ITEpO3ZhciByLG8saTtyZXR1cm4gdHx8KHdlLmNyZWF0ZUhUTUxEb2N1bWVudD8odD1sZS5pbXBsZW1lbnRhdGlvbi5jcmVhdGVIVE1MRG9jdW1lbnQoIiIpLHI9dC5jcmVhdGVFbGVtZW50KCJiYXNlIiksci5ocmVmPWxlLmxvY2F0aW9uLmhyZWYsdC5oZWFkLmFwcGVuZENoaWxkKHIpKTp0PWxlKSxvPWplLmV4ZWMoZSksaT0hbiYmW10sbz9bdC5jcmVhdGVFbGVtZW50KG9bMV0pXToobz1TKFtlXSx0LGkpLGkmJmkubGVuZ3RoJiZrZShpKS5yZW1vdmUoKSxrZS5tZXJnZShbXSxvLmNoaWxkTm9kZXMpKX0sa2UuZm4ubG9hZD1mdW5jdGlvbihlLHQsbil7dmFyIHIsbyxpLGE9dGhpcyxzPWUuaW5kZXhPZigiICIpO3JldHVybiBzPi0xJiYocj1lZShlLnNsaWNlKHMpKSxlPWUuc2xpY2UoMCxzKSksX2UodCk/KG49dCx0PXZvaWQgMCk6dCYmIm9iamVjdCI9PXR5cGVvZiB0JiYobz0iUE9TVCIpLGEubGVuZ3RoPjAmJmtlLmFqYXgoe3VybDplLHR5cGU6b3x8IkdFVCIsZGF0YVR5cGU6Imh0bWwiLGRhdGE6dH0pLmRvbmUoZnVuY3Rpb24oZSl7aT1hcmd1bWVudHMsYS5odG1sKHI/a2UoIjxkaXY+IikuYXBwZW5kKGtlLnBhcnNlSFRNTChlKSkuZmluZChyKTplKX0pLmFsd2F5cyhuJiZmdW5jdGlvbihlLHQpe2EuZWFjaChmdW5jdGlvbigpe24uYXBwbHkodGhpcyxpfHxbZS5yZXNwb25zZVRleHQsdCxlXSl9KX0pLHRoaXN9LGtlLmVhY2goWyJhamF4U3RhcnQiLCJhamF4U3RvcCIsImFqYXhDb21wbGV0ZSIsImFqYXhFcnJvciIsImFqYXhTdWNjZXNzIiwiYWpheFNlbmQiXSxmdW5jdGlvbihlLHQpe2tlLmZuW3RdPWZ1bmN0aW9uKGUpe3JldHVybiB0aGlzLm9uKHQsZSl9fSksa2UuZXhwci5wc2V1ZG9zLmFuaW1hdGVkPWZ1bmN0aW9uKGUpe3JldHVybiBrZS5ncmVwKGtlLnRpbWVycyxmdW5jdGlvbih0KXtyZXR1cm4gZT09PXQuZWxlbX0pLmxlbmd0aH0sa2Uub2Zmc2V0PXtzZXRPZmZzZXQ6ZnVuY3Rpb24oZSx0LG4pe3ZhciByLG8saSxhLHMsdSxjLGw9a2UuY3NzKGUsInBvc2l0aW9uIiksZj1rZShlKSxwPXt9OyJzdGF0aWMiPT09bCYmKGUuc3R5bGUucG9zaXRpb249InJlbGF0aXZlIikscz1mLm9mZnNldCgpLGk9a2UuY3NzKGUsInRvcCIpLHU9a2UuY3NzKGUsImxlZnQiKSxjPSgiYWJzb2x1dGUiPT09bHx8ImZpeGVkIj09PWwpJiYoaSt1KS5pbmRleE9mKCJhdXRvIik+LTEsYz8ocj1mLnBvc2l0aW9uKCksYT1yLnRvcCxvPXIubGVmdCk6KGE9cGFyc2VGbG9hdChpKXx8MCxvPXBhcnNlRmxvYXQodSl8fDApLF9lKHQpJiYodD10LmNhbGwoZSxuLGtlLmV4dGVuZCh7fSxzKSkpLG51bGwhPXQudG9wJiYocC50b3A9dC50b3Atcy50b3ArYSksbnVsbCE9dC5sZWZ0JiYocC5sZWZ0PXQubGVmdC1zLmxlZnQrbyksInVzaW5nImluIHQ/dC51c2luZy5jYWxsKGUscCk6Zi5jc3MocCl9fSxrZS5mbi5leHRlbmQoe29mZnNldDpmdW5jdGlvbihlKXtpZihhcmd1bWVudHMubGVuZ3RoKXJldHVybiB2b2lkIDA9PT1lP3RoaXM6dGhpcy5lYWNoKGZ1bmN0aW9uKHQpe2tlLm9mZnNldC5zZXRPZmZzZXQodGhpcyxlLHQpfSk7dmFyIHQsbixyPXRoaXNbMF07aWYocilyZXR1cm4gci5nZXRDbGllbnRSZWN0cygpLmxlbmd0aD8odD1yLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLG49ci5vd25lckRvY3VtZW50LmRlZmF1bHRWaWV3LHt0b3A6dC50b3Arbi5wYWdlWU9mZnNldCxsZWZ0OnQubGVmdCtuLnBhZ2VYT2Zmc2V0fSk6e3RvcDowLGxlZnQ6MH19LHBvc2l0aW9uOmZ1bmN0aW9uKCl7aWYodGhpc1swXSl7dmFyIGUsdCxuLHI9dGhpc1swXSxvPXt0b3A6MCxsZWZ0OjB9O2lmKCJmaXhlZCI9PT1rZS5jc3MociwicG9zaXRpb24iKSl0PXIuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7ZWxzZXtmb3IodD10aGlzLm9mZnNldCgpLG49ci5vd25lckRvY3VtZW50LGU9ci5vZmZzZXRQYXJlbnR8fG4uZG9jdW1lbnRFbGVtZW50O2UmJihlPT09bi5ib2R5fHxlPT09bi5kb2N1bWVudEVsZW1lbnQpJiYic3RhdGljIj09PWtlLmNzcyhlLCJwb3NpdGlvbiIpOyllPWUucGFyZW50Tm9kZTtlJiZlIT09ciYmMT09PWUubm9kZVR5cGUmJihvPWtlKGUpLm9mZnNldCgpLG8udG9wKz1rZS5jc3MoZSwiYm9yZGVyVG9wV2lkdGgiLCEwKSxvLmxlZnQrPWtlLmNzcyhlLCJib3JkZXJMZWZ0V2lkdGgiLCEwKSl9cmV0dXJue3RvcDp0LnRvcC1vLnRvcC1rZS5jc3MociwibWFyZ2luVG9wIiwhMCksbGVmdDp0LmxlZnQtby5sZWZ0LWtlLmNzcyhyLCJtYXJnaW5MZWZ0IiwhMCl9fX0sb2Zmc2V0UGFyZW50OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMubWFwKGZ1bmN0aW9uKCl7Zm9yKHZhciBlPXRoaXMub2Zmc2V0UGFyZW50O2UmJiJzdGF0aWMiPT09a2UuY3NzKGUsInBvc2l0aW9uIik7KWU9ZS5vZmZzZXRQYXJlbnQ7cmV0dXJuIGV8fG90fSl9fSksa2UuZWFjaCh7c2Nyb2xsTGVmdDoicGFnZVhPZmZzZXQiLHNjcm9sbFRvcDoicGFnZVlPZmZzZXQifSxmdW5jdGlvbihlLHQpe3ZhciBuPSJwYWdlWU9mZnNldCI9PT10O2tlLmZuW2VdPWZ1bmN0aW9uKHIpe3JldHVybiBxZSh0aGlzLGZ1bmN0aW9uKGUscixvKXt2YXIgaTtpZihDZShlKT9pPWU6OT09PWUubm9kZVR5cGUmJihpPWUuZGVmYXVsdFZpZXcpLHZvaWQgMD09PW8pcmV0dXJuIGk/aVt0XTplW3JdO2k/aS5zY3JvbGxUbyhuP2kucGFnZVhPZmZzZXQ6byxuP286aS5wYWdlWU9mZnNldCk6ZVtyXT1vfSxlLHIsYXJndW1lbnRzLmxlbmd0aCl9fSksa2UuZWFjaChbInRvcCIsImxlZnQiXSxmdW5jdGlvbihlLHQpe2tlLmNzc0hvb2tzW3RdPUgod2UucGl4ZWxQb3NpdGlvbixmdW5jdGlvbihlLG4pe2lmKG4pcmV0dXJuIG49cShlLHQpLHB0LnRlc3Qobik/a2UoZSkucG9zaXRpb24oKVt0XSsicHgiOm59KX0pLGtlLmVhY2goe0hlaWdodDoiaGVpZ2h0IixXaWR0aDoid2lkdGgifSxmdW5jdGlvbihlLHQpe2tlLmVhY2goe3BhZGRpbmc6ImlubmVyIitlLGNvbnRlbnQ6dCwiIjoib3V0ZXIiK2V9LGZ1bmN0aW9uKG4scil7a2UuZm5bcl09ZnVuY3Rpb24obyxpKXt2YXIgYT1hcmd1bWVudHMubGVuZ3RoJiYobnx8ImJvb2xlYW4iIT10eXBlb2Ygbykscz1ufHwoITA9PT1vfHwhMD09PWk/Im1hcmdpbiI6ImJvcmRlciIpO3JldHVybiBxZSh0aGlzLGZ1bmN0aW9uKHQsbixvKXt2YXIgaTtyZXR1cm4gQ2UodCk/MD09PXIuaW5kZXhPZigib3V0ZXIiKT90WyJpbm5lciIrZV06dC5kb2N1bWVudC5kb2N1bWVudEVsZW1lbnRbImNsaWVudCIrZV06OT09PXQubm9kZVR5cGU/KGk9dC5kb2N1bWVudEVsZW1lbnQsTWF0aC5tYXgodC5ib2R5WyJzY3JvbGwiK2VdLGlbInNjcm9sbCIrZV0sdC5ib2R5WyJvZmZzZXQiK2VdLGlbIm9mZnNldCIrZV0saVsiY2xpZW50IitlXSkpOnZvaWQgMD09PW8/a2UuY3NzKHQsbixzKTprZS5zdHlsZSh0LG4sbyxzKX0sdCxhP286dm9pZCAwLGEpfX0pfSksa2UuZWFjaCgiYmx1ciBmb2N1cyBmb2N1c2luIGZvY3Vzb3V0IHJlc2l6ZSBzY3JvbGwgY2xpY2sgZGJsY2xpY2sgbW91c2Vkb3duIG1vdXNldXAgbW91c2Vtb3ZlIG1vdXNlb3ZlciBtb3VzZW91dCBtb3VzZWVudGVyIG1vdXNlbGVhdmUgY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBjb250ZXh0bWVudSIuc3BsaXQoIiAiKSxmdW5jdGlvbihlLHQpe2tlLmZuW3RdPWZ1bmN0aW9uKGUsbil7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg+MD90aGlzLm9uKHQsbnVsbCxlLG4pOnRoaXMudHJpZ2dlcih0KX19KSxrZS5mbi5leHRlbmQoe2hvdmVyOmZ1bmN0aW9uKGUsdCl7cmV0dXJuIHRoaXMubW91c2VlbnRlcihlKS5tb3VzZWxlYXZlKHR8fGUpfX0pLGtlLmZuLmV4dGVuZCh7YmluZDpmdW5jdGlvbihlLHQsbil7cmV0dXJuIHRoaXMub24oZSxudWxsLHQsbil9LHVuYmluZDpmdW5jdGlvbihlLHQpe3JldHVybiB0aGlzLm9mZihlLG51bGwsdCl9LGRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuLHIpe3JldHVybiB0aGlzLm9uKHQsZSxuLHIpfSx1bmRlbGVnYXRlOmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gMT09PWFyZ3VtZW50cy5sZW5ndGg/dGhpcy5vZmYoZSwiKioiKTp0aGlzLm9mZih0LGV8fCIqKiIsbil9fSksa2UucHJveHk9ZnVuY3Rpb24oZSx0KXt2YXIgbixyLG87aWYoInN0cmluZyI9PXR5cGVvZiB0JiYobj1lW3RdLHQ9ZSxlPW4pLF9lKGUpKXJldHVybiByPXBlLmNhbGwoYXJndW1lbnRzLDIpLG89ZnVuY3Rpb24oKXtyZXR1cm4gZS5hcHBseSh0fHx0aGlzLHIuY29uY2F0KHBlLmNhbGwoYXJndW1lbnRzKSkpfSxvLmd1aWQ9ZS5ndWlkPWUuZ3VpZHx8a2UuZ3VpZCsrLG99LGtlLmhvbGRSZWFkeT1mdW5jdGlvbihlKXtlP2tlLnJlYWR5V2FpdCsrOmtlLnJlYWR5KCEwKX0sa2UuaXNBcnJheT1BcnJheS5pc0FycmF5LGtlLnBhcnNlSlNPTj1KU09OLnBhcnNlLGtlLm5vZGVOYW1lPWMsa2UuaXNGdW5jdGlvbj1fZSxrZS5pc1dpbmRvdz1DZSxrZS5jYW1lbENhc2U9ZyxrZS50eXBlPXMsa2Uubm93PURhdGUubm93LGtlLmlzTnVtZXJpYz1mdW5jdGlvbihlKXt2YXIgdD1rZS50eXBlKGUpO3JldHVybigibnVtYmVyIj09PXR8fCJzdHJpbmciPT09dCkmJiFpc05hTihlLXBhcnNlRmxvYXQoZSkpfSxyPVtdLHZvaWQgMCE9PShvPWZ1bmN0aW9uKCl7cmV0dXJuIGtlfS5hcHBseSh0LHIpKSYmKGUuZXhwb3J0cz1vKTt2YXIgZW49bi5qUXVlcnksdG49bi4kO3JldHVybiBrZS5ub0NvbmZsaWN0PWZ1bmN0aW9uKGUpe3JldHVybiBuLiQ9PT1rZSYmKG4uJD10biksZSYmbi5qUXVlcnk9PT1rZSYmKG4ualF1ZXJ5PWVuKSxrZX0saXx8KG4ualF1ZXJ5PW4uJD1rZSksa2V9KX0sLCwsLCwsLCwsLCwsLCwsLCxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPXtkZWZhdWx0Om4oMzgpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPXtkZWZhdWx0Om4oMzkpLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPXtkZWZhdWx0Om4oNDApLF9fZXNNb2R1bGU6ITB9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxKSxvPXIuSlNPTnx8KHIuSlNPTj17c3RyaW5naWZ5OkpTT04uc3RyaW5naWZ5fSk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBvLnN0cmluZ2lmeS5hcHBseShvLGFyZ3VtZW50cyl9fSxmdW5jdGlvbihlLHQsbil7big2OCksZS5leHBvcnRzPW4oMSkuTnVtYmVyLmlzTmFOfSxmdW5jdGlvbihlLHQsbil7big2OSksZS5leHBvcnRzPW4oMSkuTnVtYmVyLnBhcnNlSW50fSxmdW5jdGlvbihlLHQsbil7big3MCksZS5leHBvcnRzPW4oMSkuT2JqZWN0LmFzc2lnbn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7aWYoImZ1bmN0aW9uIiE9dHlwZW9mIGUpdGhyb3cgVHlwZUVycm9yKGUrIiBpcyBub3QgYSBmdW5jdGlvbiEiKTtyZXR1cm4gZX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDkpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtpZighcihlKSl0aHJvdyBUeXBlRXJyb3IoZSsiIGlzIG5vdCBhbiBvYmplY3QhIik7cmV0dXJuIGV9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNiksbz1uKDY0KSxpPW4oNjMpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZnVuY3Rpb24odCxuLGEpe3ZhciBzLHU9cih0KSxjPW8odS5sZW5ndGgpLGw9aShhLGMpO2lmKGUmJm4hPW4pe2Zvcig7Yz5sOylpZigocz11W2wrK10pIT1zKXJldHVybiEwfWVsc2UgZm9yKDtjPmw7bCsrKWlmKChlfHxsIGluIHUpJiZ1W2xdPT09bilyZXR1cm4gZXx8bHx8MDtyZXR1cm4hZSYmLTF9fX0sZnVuY3Rpb24oZSx0KXt2YXIgbj17fS50b1N0cmluZztlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIG4uY2FsbChlKS5zbGljZSg4LC0xKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDQyKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0LG4pe2lmKHIoZSksdm9pZCAwPT09dClyZXR1cm4gZTtzd2l0Y2gobil7Y2FzZSAxOnJldHVybiBmdW5jdGlvbihuKXtyZXR1cm4gZS5jYWxsKHQsbil9O2Nhc2UgMjpyZXR1cm4gZnVuY3Rpb24obixyKXtyZXR1cm4gZS5jYWxsKHQsbixyKX07Y2FzZSAzOnJldHVybiBmdW5jdGlvbihuLHIsbyl7cmV0dXJuIGUuY2FsbCh0LG4scixvKX19cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGUuYXBwbHkodCxhcmd1bWVudHMpfX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDkpLG89big1KS5kb2N1bWVudCxpPXIobykmJnIoby5jcmVhdGVFbGVtZW50KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuIGk/by5jcmVhdGVFbGVtZW50KGUpOnt9fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ImNvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZiIuc3BsaXQoIiwiKX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTMpLG89big1OSk7ZS5leHBvcnRzPW4oOCk/ZnVuY3Rpb24oZSx0LG4pe3JldHVybiByLmYoZSx0LG8oMSxuKSl9OmZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gZVt0XT1uLGV9fSxmdW5jdGlvbihlLHQsbil7ZS5leHBvcnRzPSFuKDgpJiYhbig0KShmdW5jdGlvbigpe3JldHVybiA3IT1PYmplY3QuZGVmaW5lUHJvcGVydHkobig0NykoImRpdiIpLCJhIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIDd9fSkuYX0pfSxmdW5jdGlvbihlLHQpe2UuZXhwb3J0cz0hMH0sZnVuY3Rpb24oZSx0LG4peyJ1c2Ugc3RyaWN0Ijt2YXIgcj1uKDU2KSxvPW4oNTQpLGk9big1NyksYT1uKDY1KSxzPW4oMTMpLHU9T2JqZWN0LmFzc2lnbjtlLmV4cG9ydHM9IXV8fG4oNCkoZnVuY3Rpb24oKXt2YXIgZT17fSx0PXt9LG49U3ltYm9sKCkscj0iYWJjZGVmZ2hpamtsbW5vcHFyc3QiO3JldHVybiBlW25dPTcsci5zcGxpdCgiIikuZm9yRWFjaChmdW5jdGlvbihlKXt0W2VdPWV9KSw3IT11KHt9LGUpW25dfHxPYmplY3Qua2V5cyh1KHt9LHQpKS5qb2luKCIiKSE9cn0pP2Z1bmN0aW9uKGUsdCl7Zm9yKHZhciBuPWEoZSksdT1hcmd1bWVudHMubGVuZ3RoLGM9MSxsPW8uZixmPWkuZjt1PmM7KWZvcih2YXIgcCxkPXMoYXJndW1lbnRzW2MrK10pLGg9bD9yKGQpLmNvbmNhdChsKGQpKTpyKGQpLHY9aC5sZW5ndGgsbT0wO3Y+bTspZi5jYWxsKGQscD1oW20rK10pJiYobltwXT1kW3BdKTtyZXR1cm4gbn06dX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNDMpLG89big1MCksaT1uKDY2KSxhPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt0LmY9big4KT9PYmplY3QuZGVmaW5lUHJvcGVydHk6ZnVuY3Rpb24oZSx0LG4pe2lmKHIoZSksdD1pKHQsITApLHIobiksbyl0cnl7cmV0dXJuIGEoZSx0LG4pfWNhdGNoKGUpe31pZigiZ2V0ImluIG58fCJzZXQiaW4gbil0aHJvdyBUeXBlRXJyb3IoIkFjY2Vzc29ycyBub3Qgc3VwcG9ydGVkISIpO3JldHVybiJ2YWx1ZSJpbiBuJiYoZVt0XT1uLnZhbHVlKSxlfX0sZnVuY3Rpb24oZSx0KXt0LmY9T2JqZWN0LmdldE93blByb3BlcnR5U3ltYm9sc30sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMTIpLG89bigxNiksaT1uKDQ0KSghMSksYT1uKDYwKSgiSUVfUFJPVE8iKTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXt2YXIgbixzPW8oZSksdT0wLGM9W107Zm9yKG4gaW4gcyluIT1hJiZyKHMsbikmJmMucHVzaChuKTtmb3IoO3QubGVuZ3RoPnU7KXIocyxuPXRbdSsrXSkmJih+aShjLG4pfHxjLnB1c2gobikpO3JldHVybiBjfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNTUpLG89big0OCk7ZS5leHBvcnRzPU9iamVjdC5rZXlzfHxmdW5jdGlvbihlKXtyZXR1cm4gcihlLG8pfX0sZnVuY3Rpb24oZSx0KXt0LmY9e30ucHJvcGVydHlJc0VudW1lcmFibGV9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDUpLnBhcnNlSW50LG89big2MikudHJpbSxpPW4oMTQpLGE9L15bLStdPzBbeFhdLztlLmV4cG9ydHM9OCE9PXIoaSsiMDgiKXx8MjIhPT1yKGkrIjB4MTYiKT9mdW5jdGlvbihlLHQpe3ZhciBuPW8oU3RyaW5nKGUpLDMpO3JldHVybiByKG4sdD4+PjB8fChhLnRlc3Qobik/MTY6MTApKX06cn0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtyZXR1cm57ZW51bWVyYWJsZTohKDEmZSksY29uZmlndXJhYmxlOiEoMiZlKSx3cml0YWJsZTohKDQmZSksdmFsdWU6dH19fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big2MSkoImtleXMiKSxvPW4oNjcpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gcltlXXx8KHJbZV09byhlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxKSxvPW4oNSksaT1vWyJfX2NvcmUtanNfc2hhcmVkX18iXXx8KG9bIl9fY29yZS1qc19zaGFyZWRfXyJdPXt9KTsoZS5leHBvcnRzPWZ1bmN0aW9uKGUsdCl7cmV0dXJuIGlbZV18fChpW2VdPXZvaWQgMCE9PXQ/dDp7fSl9KSgidmVyc2lvbnMiLFtdKS5wdXNoKHt2ZXJzaW9uOnIudmVyc2lvbixtb2RlOm4oNTEpPyJwdXJlIjoiZ2xvYmFsIixjb3B5cmlnaHQ6IsKpIDIwMTggRGVuaXMgUHVzaGthcmV2ICh6bG9pcm9jay5ydSkifSl9LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDMpLG89big3KSxpPW4oNCksYT1uKDE0KSxzPSJbIithKyJdIix1PSLigIvChSIsYz1SZWdFeHAoIl4iK3MrcysiKiIpLGw9UmVnRXhwKHMrcysiKiQiKSxmPWZ1bmN0aW9uKGUsdCxuKXt2YXIgbz17fSxzPWkoZnVuY3Rpb24oKXtyZXR1cm4hIWFbZV0oKXx8dVtlXSgpIT11fSksYz1vW2VdPXM/dChwKTphW2VdO24mJihvW25dPWMpLHIoci5QK3IuRipzLCJTdHJpbmciLG8pfSxwPWYudHJpbT1mdW5jdGlvbihlLHQpe3JldHVybiBlPVN0cmluZyhvKGUpKSwxJnQmJihlPWUucmVwbGFjZShjLCIiKSksMiZ0JiYoZT1lLnJlcGxhY2UobCwiIikpLGV9O2UuZXhwb3J0cz1mfSxmdW5jdGlvbihlLHQsbil7dmFyIHI9bigxNSksbz1NYXRoLm1heCxpPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQpe3JldHVybiBlPXIoZSksZTwwP28oZSt0LDApOmkoZSx0KX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDE1KSxvPU1hdGgubWluO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4gZT4wP28ocihlKSw5MDA3MTk5MjU0NzQwOTkxKTowfX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oNyk7ZS5leHBvcnRzPWZ1bmN0aW9uKGUpe3JldHVybiBPYmplY3QocihlKSl9fSxmdW5jdGlvbihlLHQsbil7dmFyIHI9big5KTtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtpZighcihlKSlyZXR1cm4gZTt2YXIgbixvO2lmKHQmJiJmdW5jdGlvbiI9PXR5cGVvZihuPWUudG9TdHJpbmcpJiYhcihvPW4uY2FsbChlKSkpcmV0dXJuIG87aWYoImZ1bmN0aW9uIj09dHlwZW9mKG49ZS52YWx1ZU9mKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO2lmKCF0JiYiZnVuY3Rpb24iPT10eXBlb2Yobj1lLnRvU3RyaW5nKSYmIXIobz1uLmNhbGwoZSkpKXJldHVybiBvO3Rocm93IFR5cGVFcnJvcigiQ2FuJ3QgY29udmVydCBvYmplY3QgdG8gcHJpbWl0aXZlIHZhbHVlIil9fSxmdW5jdGlvbihlLHQpe3ZhciBuPTAscj1NYXRoLnJhbmRvbSgpO2UuZXhwb3J0cz1mdW5jdGlvbihlKXtyZXR1cm4iU3ltYm9sKCIuY29uY2F0KHZvaWQgMD09PWU/IiI6ZSwiKV8iLCgrK24rcikudG9TdHJpbmcoMzYpKX19LGZ1bmN0aW9uKGUsdCxuKXt2YXIgcj1uKDMpO3Ioci5TLCJOdW1iZXIiLHtpc05hTjpmdW5jdGlvbihlKXtyZXR1cm4gZSE9ZX19KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMyksbz1uKDU4KTtyKHIuUytyLkYqKE51bWJlci5wYXJzZUludCE9byksIk51bWJlciIse3BhcnNlSW50Om99KX0sZnVuY3Rpb24oZSx0LG4pe3ZhciByPW4oMyk7cihyLlMrci5GLCJPYmplY3QiLHthc3NpZ246big1Mil9KX0sLCwsZnVuY3Rpb24oZSx0KXtmdW5jdGlvbiBuKCl7dGhyb3cgbmV3IEVycm9yKCJzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gcigpe3Rocm93IG5ldyBFcnJvcigiY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkIil9ZnVuY3Rpb24gbyhlKXtpZihsPT09c2V0VGltZW91dClyZXR1cm4gc2V0VGltZW91dChlLDApO2lmKChsPT09bnx8IWwpJiZzZXRUaW1lb3V0KXJldHVybiBsPXNldFRpbWVvdXQsc2V0VGltZW91dChlLDApO3RyeXtyZXR1cm4gbChlLDApfWNhdGNoKHQpe3RyeXtyZXR1cm4gbC5jYWxsKG51bGwsZSwwKX1jYXRjaCh0KXtyZXR1cm4gbC5jYWxsKHRoaXMsZSwwKX19fWZ1bmN0aW9uIGkoZSl7aWYoZj09PWNsZWFyVGltZW91dClyZXR1cm4gY2xlYXJUaW1lb3V0KGUpO2lmKChmPT09cnx8IWYpJiZjbGVhclRpbWVvdXQpcmV0dXJuIGY9Y2xlYXJUaW1lb3V0LGNsZWFyVGltZW91dChlKTt0cnl7cmV0dXJuIGYoZSl9Y2F0Y2godCl7dHJ5e3JldHVybiBmLmNhbGwobnVsbCxlKX1jYXRjaCh0KXtyZXR1cm4gZi5jYWxsKHRoaXMsZSl9fX1mdW5jdGlvbiBhKCl7diYmZCYmKHY9ITEsZC5sZW5ndGg/aD1kLmNvbmNhdChoKTptPS0xLGgubGVuZ3RoJiZzKCkpfWZ1bmN0aW9uIHMoKXtpZighdil7dmFyIGU9byhhKTt2PSEwO2Zvcih2YXIgdD1oLmxlbmd0aDt0Oyl7Zm9yKGQ9aCxoPVtdOysrbTx0OylkJiZkW21dLnJ1bigpO209LTEsdD1oLmxlbmd0aH1kPW51bGwsdj0hMSxpKGUpfX1mdW5jdGlvbiB1KGUsdCl7dGhpcy5mdW49ZSx0aGlzLmFycmF5PXR9ZnVuY3Rpb24gYygpe312YXIgbCxmLHA9ZS5leHBvcnRzPXt9OyFmdW5jdGlvbigpe3RyeXtsPSJmdW5jdGlvbiI9PXR5cGVvZiBzZXRUaW1lb3V0P3NldFRpbWVvdXQ6bn1jYXRjaChlKXtsPW59dHJ5e2Y9ImZ1bmN0aW9uIj09dHlwZW9mIGNsZWFyVGltZW91dD9jbGVhclRpbWVvdXQ6cn1jYXRjaChlKXtmPXJ9fSgpO3ZhciBkLGg9W10sdj0hMSxtPS0xO3AubmV4dFRpY2s9ZnVuY3Rpb24oZSl7dmFyIHQ9bmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGgtMSk7aWYoYXJndW1lbnRzLmxlbmd0aD4xKWZvcih2YXIgbj0xO248YXJndW1lbnRzLmxlbmd0aDtuKyspdFtuLTFdPWFyZ3VtZW50c1tuXTtoLnB1c2gobmV3IHUoZSx0KSksMSE9PWgubGVuZ3RofHx2fHxvKHMpfSx1LnByb3RvdHlwZS5ydW49ZnVuY3Rpb24oKXt0aGlzLmZ1bi5hcHBseShudWxsLHRoaXMuYXJyYXkpfSxwLnRpdGxlPSJicm93c2VyIixwLmJyb3dzZXI9ITAscC5lbnY9e30scC5hcmd2PVtdLHAudmVyc2lvbj0iIixwLnZlcnNpb25zPXt9LHAub249YyxwLmFkZExpc3RlbmVyPWMscC5vbmNlPWMscC5vZmY9YyxwLnJlbW92ZUxpc3RlbmVyPWMscC5yZW1vdmVBbGxMaXN0ZW5lcnM9YyxwLmVtaXQ9YyxwLnByZXBlbmRMaXN0ZW5lcj1jLHAucHJlcGVuZE9uY2VMaXN0ZW5lcj1jLHAubGlzdGVuZXJzPWZ1bmN0aW9uKGUpe3JldHVybltdfSxwLmJpbmRpbmc9ZnVuY3Rpb24oZSl7dGhyb3cgbmV3IEVycm9yKCJwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCIpfSxwLmN3ZD1mdW5jdGlvbigpe3JldHVybiIvIn0scC5jaGRpcj1mdW5jdGlvbihlKXt0aHJvdyBuZXcgRXJyb3IoInByb2Nlc3MuY2hkaXIgaXMgbm90IHN1cHBvcnRlZCIpfSxwLnVtYXNrPWZ1bmN0aW9uKCl7cmV0dXJuIDB9fSxmdW5jdGlvbihlLHQsbil7KGZ1bmN0aW9uKGUsdCl7IWZ1bmN0aW9uKGUsbil7InVzZSBzdHJpY3QiO2Z1bmN0aW9uIHIoZSl7ImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPW5ldyBGdW5jdGlvbigiIitlKSk7Zm9yKHZhciB0PW5ldyBBcnJheShhcmd1bWVudHMubGVuZ3RoLTEpLG49MDtuPHQubGVuZ3RoO24rKyl0W25dPWFyZ3VtZW50c1tuKzFdO3ZhciByPXtjYWxsYmFjazplLGFyZ3M6dH07cmV0dXJuIGNbdV09cixzKHUpLHUrK31mdW5jdGlvbiBvKGUpe2RlbGV0ZSBjW2VdfWZ1bmN0aW9uIGkoZSl7dmFyIHQ9ZS5jYWxsYmFjayxyPWUuYXJncztzd2l0Y2goci5sZW5ndGgpe2Nhc2UgMDp0KCk7YnJlYWs7Y2FzZSAxOnQoclswXSk7YnJlYWs7Y2FzZSAyOnQoclswXSxyWzFdKTticmVhaztjYXNlIDM6dChyWzBdLHJbMV0sclsyXSk7YnJlYWs7ZGVmYXVsdDp0LmFwcGx5KG4scil9fWZ1bmN0aW9uIGEoZSl7aWYobClzZXRUaW1lb3V0KGEsMCxlKTtlbHNle3ZhciB0PWNbZV07aWYodCl7bD0hMDt0cnl7aSh0KX1maW5hbGx5e28oZSksbD0hMX19fX1pZighZS5zZXRJbW1lZGlhdGUpe3ZhciBzLHU9MSxjPXt9LGw9ITEsZj1lLmRvY3VtZW50LHA9T2JqZWN0LmdldFByb3RvdHlwZU9mJiZPYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cD1wJiZwLnNldFRpbWVvdXQ/cDplLCJbb2JqZWN0IHByb2Nlc3NdIj09PXt9LnRvU3RyaW5nLmNhbGwoZS5wcm9jZXNzKT9mdW5jdGlvbigpe3M9ZnVuY3Rpb24oZSl7dC5uZXh0VGljayhmdW5jdGlvbigpe2EoZSl9KX19KCk6ZnVuY3Rpb24oKXtpZihlLnBvc3RNZXNzYWdlJiYhZS5pbXBvcnRTY3JpcHRzKXt2YXIgdD0hMCxuPWUub25tZXNzYWdlO3JldHVybiBlLm9ubWVzc2FnZT1mdW5jdGlvbigpe3Q9ITF9LGUucG9zdE1lc3NhZ2UoIiIsIioiKSxlLm9ubWVzc2FnZT1uLHR9fSgpP2Z1bmN0aW9uKCl7dmFyIHQ9InNldEltbWVkaWF0ZSQiK01hdGgucmFuZG9tKCkrIiQiLG49ZnVuY3Rpb24obil7bi5zb3VyY2U9PT1lJiYic3RyaW5nIj09dHlwZW9mIG4uZGF0YSYmMD09PW4uZGF0YS5pbmRleE9mKHQpJiZhKCtuLmRhdGEuc2xpY2UodC5sZW5ndGgpKX07ZS5hZGRFdmVudExpc3RlbmVyP2UuYWRkRXZlbnRMaXN0ZW5lcigibWVzc2FnZSIsbiwhMSk6ZS5hdHRhY2hFdmVudCgib25tZXNzYWdlIixuKSxzPWZ1bmN0aW9uKG4pe2UucG9zdE1lc3NhZ2UodCtuLCIqIil9fSgpOmUuTWVzc2FnZUNoYW5uZWw/ZnVuY3Rpb24oKXt2YXIgZT1uZXcgTWVzc2FnZUNoYW5uZWw7ZS5wb3J0MS5vbm1lc3NhZ2U9ZnVuY3Rpb24oZSl7YShlLmRhdGEpfSxzPWZ1bmN0aW9uKHQpe2UucG9ydDIucG9zdE1lc3NhZ2UodCl9fSgpOmYmJiJvbnJlYWR5c3RhdGVjaGFuZ2UiaW4gZi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKT9mdW5jdGlvbigpe3ZhciBlPWYuZG9jdW1lbnRFbGVtZW50O3M9ZnVuY3Rpb24odCl7dmFyIG49Zi5jcmVhdGVFbGVtZW50KCJzY3JpcHQiKTtuLm9ucmVhZHlzdGF0ZWNoYW5nZT1mdW5jdGlvbigpe2EodCksbi5vbnJlYWR5c3RhdGVjaGFuZ2U9bnVsbCxlLnJlbW92ZUNoaWxkKG4pLG49bnVsbH0sZS5hcHBlbmRDaGlsZChuKX19KCk6ZnVuY3Rpb24oKXtzPWZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoYSwwLGUpfX0oKSxwLnNldEltbWVkaWF0ZT1yLHAuY2xlYXJJbW1lZGlhdGU9b319KCJ1bmRlZmluZWQiPT10eXBlb2Ygc2VsZj92b2lkIDA9PT1lP3RoaXM6ZTpzZWxmKX0pLmNhbGwodCxuKDEwKSxuKDc0KSl9LGZ1bmN0aW9uKGUsdCxuKXsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gcihlLHQpe3RoaXMuX2lkPWUsdGhpcy5fY2xlYXJGbj10fXZhciBvPXZvaWQgMCE9PWUmJmV8fCJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZnx8d2luZG93LGk9RnVuY3Rpb24ucHJvdG90eXBlLmFwcGx5O3Quc2V0VGltZW91dD1mdW5jdGlvbigpe3JldHVybiBuZXcgcihpLmNhbGwoc2V0VGltZW91dCxvLGFyZ3VtZW50cyksY2xlYXJUaW1lb3V0KX0sdC5zZXRJbnRlcnZhbD1mdW5jdGlvbigpe3JldHVybiBuZXcgcihpLmNhbGwoc2V0SW50ZXJ2YWwsbyxhcmd1bWVudHMpLGNsZWFySW50ZXJ2YWwpfSx0LmNsZWFyVGltZW91dD10LmNsZWFySW50ZXJ2YWw9ZnVuY3Rpb24oZSl7ZSYmZS5jbG9zZSgpfSxyLnByb3RvdHlwZS51bnJlZj1yLnByb3RvdHlwZS5yZWY9ZnVuY3Rpb24oKXt9LHIucHJvdG90eXBlLmNsb3NlPWZ1bmN0aW9uKCl7dGhpcy5fY2xlYXJGbi5jYWxsKG8sdGhpcy5faWQpfSx0LmVucm9sbD1mdW5jdGlvbihlLHQpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD10fSx0LnVuZW5yb2xsPWZ1bmN0aW9uKGUpe2NsZWFyVGltZW91dChlLl9pZGxlVGltZW91dElkKSxlLl9pZGxlVGltZW91dD0tMX0sdC5fdW5yZWZBY3RpdmU9dC5hY3RpdmU9ZnVuY3Rpb24oZSl7Y2xlYXJUaW1lb3V0KGUuX2lkbGVUaW1lb3V0SWQpO3ZhciB0PWUuX2lkbGVUaW1lb3V0O3Q+PTAmJihlLl9pZGxlVGltZW91dElkPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtlLl9vblRpbWVvdXQmJmUuX29uVGltZW91dCgpfSx0KSl9LG4oNzUpLHQuc2V0SW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5zZXRJbW1lZGlhdGV8fHZvaWQgMCE9PWUmJmUuc2V0SW1tZWRpYXRlfHx0aGlzJiZ0aGlzLnNldEltbWVkaWF0ZSx0LmNsZWFySW1tZWRpYXRlPSJ1bmRlZmluZWQiIT10eXBlb2Ygc2VsZiYmc2VsZi5jbGVhckltbWVkaWF0ZXx8dm9pZCAwIT09ZSYmZS5jbGVhckltbWVkaWF0ZXx8dGhpcyYmdGhpcy5jbGVhckltbWVkaWF0ZX0pLmNhbGwodCxuKDEwKSl9LCwsLCwsLCwsLGZ1bmN0aW9uKGUsdCxuKXsidXNlIHN0cmljdCI7ZnVuY3Rpb24gcihlLHQpe31mdW5jdGlvbiBvKGUpe3JldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSkuaW5kZXhPZigiRXJyb3IiKT4tMX1mdW5jdGlvbiBpKGUsdCl7c3dpdGNoKHR5cGVvZiB0KXtjYXNlInVuZGVmaW5lZCI6cmV0dXJuO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdDtjYXNlImZ1bmN0aW9uIjpyZXR1cm4gdChlKTtjYXNlImJvb2xlYW4iOnJldHVybiB0P2UucGFyYW1zOnZvaWQgMH19ZnVuY3Rpb24gYShlLHQpe2Zvcih2YXIgbiBpbiB0KWVbbl09dFtuXTtyZXR1cm4gZX1mdW5jdGlvbiBzKGUsdCxuKXt2b2lkIDA9PT10JiYodD17fSk7dmFyIHIsbz1ufHx1O3RyeXtyPW8oZXx8IiIpfWNhdGNoKGUpe3I9e319Zm9yKHZhciBpIGluIHQpcltpXT10W2ldO3JldHVybiByfWZ1bmN0aW9uIHUoZSl7dmFyIHQ9e307cmV0dXJuKGU9ZS50cmltKCkucmVwbGFjZSgvXihcP3wjfCYpLywiIikpPyhlLnNwbGl0KCImIikuZm9yRWFjaChmdW5jdGlvbihlKXt2YXIgbj1lLnJlcGxhY2UoL1wrL2csIiAiKS5zcGxpdCgiPSIpLHI9SGUobi5zaGlmdCgpKSxvPW4ubGVuZ3RoPjA/SGUobi5qb2luKCI9IikpOm51bGw7dm9pZCAwPT09dFtyXT90W3JdPW86QXJyYXkuaXNBcnJheSh0W3JdKT90W3JdLnB1c2gobyk6dFtyXT1bdFtyXSxvXX0pLHQpOnR9ZnVuY3Rpb24gYyhlKXt2YXIgdD1lP09iamVjdC5rZXlzKGUpLm1hcChmdW5jdGlvbih0KXt2YXIgbj1lW3RdO2lmKHZvaWQgMD09PW4pcmV0dXJuIiI7aWYobnVsbD09PW4pcmV0dXJuIHFlKHQpO2lmKEFycmF5LmlzQXJyYXkobikpe3ZhciByPVtdO3JldHVybiBuLmZvckVhY2goZnVuY3Rpb24oZSl7dm9pZCAwIT09ZSYmKG51bGw9PT1lP3IucHVzaChxZSh0KSk6ci5wdXNoKHFlKHQpKyI9IitxZShlKSkpfSksci5qb2luKCImIil9cmV0dXJuIHFlKHQpKyI9IitxZShuKX0pLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4gZS5sZW5ndGg+MH0pLmpvaW4oIiYiKTpudWxsO3JldHVybiB0PyI/Iit0OiIifWZ1bmN0aW9uIGwoZSx0LG4scil7dmFyIG89ciYmci5vcHRpb25zLnN0cmluZ2lmeVF1ZXJ5LGk9dC5xdWVyeXx8e307dHJ5e2k9ZihpKX1jYXRjaChlKXt9dmFyIGE9e25hbWU6dC5uYW1lfHxlJiZlLm5hbWUsbWV0YTplJiZlLm1ldGF8fHt9LHBhdGg6dC5wYXRofHwiLyIsaGFzaDp0Lmhhc2h8fCIiLHF1ZXJ5OmkscGFyYW1zOnQucGFyYW1zfHx7fSxmdWxsUGF0aDpkKHQsbyksbWF0Y2hlZDplP3AoZSk6W119O3JldHVybiBuJiYoYS5yZWRpcmVjdGVkRnJvbT1kKG4sbykpLE9iamVjdC5mcmVlemUoYSl9ZnVuY3Rpb24gZihlKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcChmKTtpZihlJiYib2JqZWN0Ij09dHlwZW9mIGUpe3ZhciB0PXt9O2Zvcih2YXIgbiBpbiBlKXRbbl09ZihlW25dKTtyZXR1cm4gdH1yZXR1cm4gZX1mdW5jdGlvbiBwKGUpe2Zvcih2YXIgdD1bXTtlOyl0LnVuc2hpZnQoZSksZT1lLnBhcmVudDtyZXR1cm4gdH1mdW5jdGlvbiBkKGUsdCl7dmFyIG49ZS5wYXRoLHI9ZS5xdWVyeTt2b2lkIDA9PT1yJiYocj17fSk7dmFyIG89ZS5oYXNoO3ZvaWQgMD09PW8mJihvPSIiKTt2YXIgaT10fHxjO3JldHVybihufHwiLyIpK2kocikrb31mdW5jdGlvbiBoKGUsdCl7cmV0dXJuIHQ9PT1CZT9lPT09dDohIXQmJihlLnBhdGgmJnQucGF0aD9lLnBhdGgucmVwbGFjZShGZSwiIik9PT10LnBhdGgucmVwbGFjZShGZSwiIikmJmUuaGFzaD09PXQuaGFzaCYmdihlLnF1ZXJ5LHQucXVlcnkpOiEoIWUubmFtZXx8IXQubmFtZSkmJihlLm5hbWU9PT10Lm5hbWUmJmUuaGFzaD09PXQuaGFzaCYmdihlLnF1ZXJ5LHQucXVlcnkpJiZ2KGUucGFyYW1zLHQucGFyYW1zKSkpfWZ1bmN0aW9uIHYoZSx0KXtpZih2b2lkIDA9PT1lJiYoZT17fSksdm9pZCAwPT09dCYmKHQ9e30pLCFlfHwhdClyZXR1cm4gZT09PXQ7dmFyIG49T2JqZWN0LmtleXMoZSkscj1PYmplY3Qua2V5cyh0KTtyZXR1cm4gbi5sZW5ndGg9PT1yLmxlbmd0aCYmbi5ldmVyeShmdW5jdGlvbihuKXt2YXIgcj1lW25dLG89dFtuXTtyZXR1cm4ib2JqZWN0Ij09dHlwZW9mIHImJiJvYmplY3QiPT10eXBlb2Ygbz92KHIsbyk6U3RyaW5nKHIpPT09U3RyaW5nKG8pfSl9ZnVuY3Rpb24gbShlLHQpe3JldHVybiAwPT09ZS5wYXRoLnJlcGxhY2UoRmUsIi8iKS5pbmRleE9mKHQucGF0aC5yZXBsYWNlKEZlLCIvIikpJiYoIXQuaGFzaHx8ZS5oYXNoPT09dC5oYXNoKSYmeShlLnF1ZXJ5LHQucXVlcnkpfWZ1bmN0aW9uIHkoZSx0KXtmb3IodmFyIG4gaW4gdClpZighKG4gaW4gZSkpcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gZyhlKXtpZighKGUubWV0YUtleXx8ZS5hbHRLZXl8fGUuY3RybEtleXx8ZS5zaGlmdEtleXx8ZS5kZWZhdWx0UHJldmVudGVkfHx2b2lkIDAhPT1lLmJ1dHRvbiYmMCE9PWUuYnV0dG9uKSl7aWYoZS5jdXJyZW50VGFyZ2V0JiZlLmN1cnJlbnRUYXJnZXQuZ2V0QXR0cmlidXRlKXtpZigvXGJfYmxhbmtcYi9pLnRlc3QoZS5jdXJyZW50VGFyZ2V0LmdldEF0dHJpYnV0ZSgidGFyZ2V0IikpKXJldHVybn1yZXR1cm4gZS5wcmV2ZW50RGVmYXVsdCYmZS5wcmV2ZW50RGVmYXVsdCgpLCEwfX1mdW5jdGlvbiBiKGUpe2lmKGUpZm9yKHZhciB0LG49MDtuPGUubGVuZ3RoO24rKyl7aWYodD1lW25dLCJhIj09PXQudGFnKXJldHVybiB0O2lmKHQuY2hpbGRyZW4mJih0PWIodC5jaGlsZHJlbikpKXJldHVybiB0fX1mdW5jdGlvbiB4KGUpe2lmKCF4Lmluc3RhbGxlZHx8RGUhPT1lKXt4Lmluc3RhbGxlZD0hMCxEZT1lO3ZhciB0PWZ1bmN0aW9uKGUpe3JldHVybiB2b2lkIDAhPT1lfSxuPWZ1bmN0aW9uKGUsbil7dmFyIHI9ZS4kb3B0aW9ucy5fcGFyZW50Vm5vZGU7dChyKSYmdChyPXIuZGF0YSkmJnQocj1yLnJlZ2lzdGVyUm91dGVJbnN0YW5jZSkmJnIoZSxuKX07ZS5taXhpbih7YmVmb3JlQ3JlYXRlOmZ1bmN0aW9uKCl7dCh0aGlzLiRvcHRpb25zLnJvdXRlcik/KHRoaXMuX3JvdXRlclJvb3Q9dGhpcyx0aGlzLl9yb3V0ZXI9dGhpcy4kb3B0aW9ucy5yb3V0ZXIsdGhpcy5fcm91dGVyLmluaXQodGhpcyksZS51dGlsLmRlZmluZVJlYWN0aXZlKHRoaXMsIl9yb3V0ZSIsdGhpcy5fcm91dGVyLmhpc3RvcnkuY3VycmVudCkpOnRoaXMuX3JvdXRlclJvb3Q9dGhpcy4kcGFyZW50JiZ0aGlzLiRwYXJlbnQuX3JvdXRlclJvb3R8fHRoaXMsbih0aGlzLHRoaXMpfSxkZXN0cm95ZWQ6ZnVuY3Rpb24oKXtuKHRoaXMpfX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiJHJvdXRlciIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLl9yb3V0ZXJSb290Ll9yb3V0ZXJ9fSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUucHJvdG90eXBlLCIkcm91dGUiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5fcm91dGVyUm9vdC5fcm91dGV9fSksZS5jb21wb25lbnQoInJvdXRlci12aWV3IixJZSksZS5jb21wb25lbnQoInJvdXRlci1saW5rIix6ZSk7dmFyIHI9ZS5jb25maWcub3B0aW9uTWVyZ2VTdHJhdGVnaWVzO3IuYmVmb3JlUm91dGVFbnRlcj1yLmJlZm9yZVJvdXRlTGVhdmU9ci5iZWZvcmVSb3V0ZVVwZGF0ZT1yLmNyZWF0ZWR9fWZ1bmN0aW9uIHcoZSx0LG4pe3ZhciByPWUuY2hhckF0KDApO2lmKCIvIj09PXIpcmV0dXJuIGU7aWYoIj8iPT09cnx8IiMiPT09cilyZXR1cm4gdCtlO3ZhciBvPXQuc3BsaXQoIi8iKTtuJiZvW28ubGVuZ3RoLTFdfHxvLnBvcCgpO2Zvcih2YXIgaT1lLnJlcGxhY2UoL15cLy8sIiIpLnNwbGl0KCIvIiksYT0wO2E8aS5sZW5ndGg7YSsrKXt2YXIgcz1pW2FdOyIuLiI9PT1zP28ucG9wKCk6Ii4iIT09cyYmby5wdXNoKHMpfXJldHVybiIiIT09b1swXSYmby51bnNoaWZ0KCIiKSxvLmpvaW4oIi8iKX1mdW5jdGlvbiBfKGUpe3ZhciB0PSIiLG49IiIscj1lLmluZGV4T2YoIiMiKTtyPj0wJiYodD1lLnNsaWNlKHIpLGU9ZS5zbGljZSgwLHIpKTt2YXIgbz1lLmluZGV4T2YoIj8iKTtyZXR1cm4gbz49MCYmKG49ZS5zbGljZShvKzEpLGU9ZS5zbGljZSgwLG8pKSx7cGF0aDplLHF1ZXJ5Om4saGFzaDp0fX1mdW5jdGlvbiBDKGUpe3JldHVybiBlLnJlcGxhY2UoL1wvXC8vZywiLyIpfWZ1bmN0aW9uIFQoZSx0KXtmb3IodmFyIG4scj1bXSxvPTAsaT0wLGE9IiIscz10JiZ0LmRlbGltaXRlcnx8Ii8iO251bGwhPShuPVplLmV4ZWMoZSkpOyl7dmFyIHU9blswXSxjPW5bMV0sbD1uLmluZGV4O2lmKGErPWUuc2xpY2UoaSxsKSxpPWwrdS5sZW5ndGgsYylhKz1jWzFdO2Vsc2V7dmFyIGY9ZVtpXSxwPW5bMl0sZD1uWzNdLGg9bls0XSx2PW5bNV0sbT1uWzZdLHk9bls3XTthJiYoci5wdXNoKGEpLGE9IiIpO3ZhciBnPW51bGwhPXAmJm51bGwhPWYmJmYhPT1wLGI9IisiPT09bXx8IioiPT09bSx4PSI/Ij09PW18fCIqIj09PW0sdz1uWzJdfHxzLF89aHx8djtyLnB1c2goe25hbWU6ZHx8bysrLHByZWZpeDpwfHwiIixkZWxpbWl0ZXI6dyxvcHRpb25hbDp4LHJlcGVhdDpiLHBhcnRpYWw6Zyxhc3RlcmlzazohIXkscGF0dGVybjpfP08oXyk6eT8iLioiOiJbXiIrRSh3KSsiXSs/In0pfX1yZXR1cm4gaTxlLmxlbmd0aCYmKGErPWUuc3Vic3RyKGkpKSxhJiZyLnB1c2goYSkscn1mdW5jdGlvbiBrKGUsdCl7cmV0dXJuICQoVChlLHQpKX1mdW5jdGlvbiBBKGUpe3JldHVybiBlbmNvZGVVUkkoZSkucmVwbGFjZSgvW1wvPyNdL2csZnVuY3Rpb24oZSl7cmV0dXJuIiUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uIFMoZSl7cmV0dXJuIGVuY29kZVVSSShlKS5yZXBsYWNlKC9bPyNdL2csZnVuY3Rpb24oZSl7cmV0dXJuIiUiK2UuY2hhckNvZGVBdCgwKS50b1N0cmluZygxNikudG9VcHBlckNhc2UoKX0pfWZ1bmN0aW9uICQoZSl7Zm9yKHZhciB0PW5ldyBBcnJheShlLmxlbmd0aCksbj0wO248ZS5sZW5ndGg7bisrKSJvYmplY3QiPT10eXBlb2YgZVtuXSYmKHRbbl09bmV3IFJlZ0V4cCgiXig/OiIrZVtuXS5wYXR0ZXJuKyIpJCIpKTtyZXR1cm4gZnVuY3Rpb24obixyKXtmb3IodmFyIG89IiIsaT1ufHx7fSxhPXJ8fHt9LHM9YS5wcmV0dHk/QTplbmNvZGVVUklDb21wb25lbnQsdT0wO3U8ZS5sZW5ndGg7dSsrKXt2YXIgYz1lW3VdO2lmKCJzdHJpbmciIT10eXBlb2YgYyl7dmFyIGwsZj1pW2MubmFtZV07aWYobnVsbD09Zil7aWYoYy5vcHRpb25hbCl7Yy5wYXJ0aWFsJiYobys9Yy5wcmVmaXgpO2NvbnRpbnVlfXRocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkICInK2MubmFtZSsnIiB0byBiZSBkZWZpbmVkJyl9aWYoWGUoZikpe2lmKCFjLnJlcGVhdCl0aHJvdyBuZXcgVHlwZUVycm9yKCdFeHBlY3RlZCAiJytjLm5hbWUrJyIgdG8gbm90IHJlcGVhdCwgYnV0IHJlY2VpdmVkIGAnK0pTT04uc3RyaW5naWZ5KGYpKyJgIik7aWYoMD09PWYubGVuZ3RoKXtpZihjLm9wdGlvbmFsKWNvbnRpbnVlO3Rocm93IG5ldyBUeXBlRXJyb3IoJ0V4cGVjdGVkICInK2MubmFtZSsnIiB0byBub3QgYmUgZW1wdHknKX1mb3IodmFyIHA9MDtwPGYubGVuZ3RoO3ArKyl7aWYobD1zKGZbcF0pLCF0W3VdLnRlc3QobCkpdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgYWxsICInK2MubmFtZSsnIiB0byBtYXRjaCAiJytjLnBhdHRlcm4rJyIsIGJ1dCByZWNlaXZlZCBgJytKU09OLnN0cmluZ2lmeShsKSsiYCIpO28rPSgwPT09cD9jLnByZWZpeDpjLmRlbGltaXRlcikrbH19ZWxzZXtpZihsPWMuYXN0ZXJpc2s/UyhmKTpzKGYpLCF0W3VdLnRlc3QobCkpdGhyb3cgbmV3IFR5cGVFcnJvcignRXhwZWN0ZWQgIicrYy5uYW1lKyciIHRvIG1hdGNoICInK2MucGF0dGVybisnIiwgYnV0IHJlY2VpdmVkICInK2wrJyInKTtvKz1jLnByZWZpeCtsfX1lbHNlIG8rPWN9cmV0dXJuIG99fWZ1bmN0aW9uIEUoZSl7cmV0dXJuIGUucmVwbGFjZSgvKFsuKyo/PV4hOiR7fSgpW1xdfFwvXFxdKS9nLCJcXCQxIil9ZnVuY3Rpb24gTyhlKXtyZXR1cm4gZS5yZXBsYWNlKC8oWz0hOiRcLygpXSkvZywiXFwkMSIpfWZ1bmN0aW9uIGooZSx0KXtyZXR1cm4gZS5rZXlzPXQsZX1mdW5jdGlvbiBOKGUpe3JldHVybiBlLnNlbnNpdGl2ZT8iIjoiaSJ9ZnVuY3Rpb24gTChlLHQpe3ZhciBuPWUuc291cmNlLm1hdGNoKC9cKCg/IVw/KS9nKTtpZihuKWZvcih2YXIgcj0wO3I8bi5sZW5ndGg7cisrKXQucHVzaCh7bmFtZTpyLHByZWZpeDpudWxsLGRlbGltaXRlcjpudWxsLG9wdGlvbmFsOiExLHJlcGVhdDohMSxwYXJ0aWFsOiExLGFzdGVyaXNrOiExLHBhdHRlcm46bnVsbH0pO3JldHVybiBqKGUsdCl9ZnVuY3Rpb24gRChlLHQsbil7Zm9yKHZhciByPVtdLG89MDtvPGUubGVuZ3RoO28rKylyLnB1c2goUChlW29dLHQsbikuc291cmNlKTtyZXR1cm4gaihuZXcgUmVnRXhwKCIoPzoiK3Iuam9pbigifCIpKyIpIixOKG4pKSx0KX1mdW5jdGlvbiBJKGUsdCxuKXtyZXR1cm4gUihUKGUsbiksdCxuKX1mdW5jdGlvbiBSKGUsdCxuKXtYZSh0KXx8KG49dHx8bix0PVtdKSxuPW58fHt9O2Zvcih2YXIgcj1uLnN0cmljdCxvPSExIT09bi5lbmQsaT0iIixhPTA7YTxlLmxlbmd0aDthKyspe3ZhciBzPWVbYV07aWYoInN0cmluZyI9PXR5cGVvZiBzKWkrPUUocyk7ZWxzZXt2YXIgdT1FKHMucHJlZml4KSxjPSIoPzoiK3MucGF0dGVybisiKSI7dC5wdXNoKHMpLHMucmVwZWF0JiYoYys9Iig/OiIrdStjKyIpKiIpLGM9cy5vcHRpb25hbD9zLnBhcnRpYWw/dSsiKCIrYysiKT8iOiIoPzoiK3UrIigiK2MrIikpPyI6dSsiKCIrYysiKSIsaSs9Y319dmFyIGw9RShuLmRlbGltaXRlcnx8Ii8iKSxmPWkuc2xpY2UoLWwubGVuZ3RoKT09PWw7cmV0dXJuIHJ8fChpPShmP2kuc2xpY2UoMCwtbC5sZW5ndGgpOmkpKyIoPzoiK2wrIig/PSQpKT8iKSxpKz1vPyIkIjpyJiZmPyIiOiIoPz0iK2wrInwkKSIsaihuZXcgUmVnRXhwKCJeIitpLE4obikpLHQpfWZ1bmN0aW9uIFAoZSx0LG4pe3JldHVybiBYZSh0KXx8KG49dHx8bix0PVtdKSxuPW58fHt9LGUgaW5zdGFuY2VvZiBSZWdFeHA/TChlLHQpOlhlKGUpP0QoZSx0LG4pOkkoZSx0LG4pfWZ1bmN0aW9uIE0oZSx0LG4pe3RyeXtyZXR1cm4oZXRbZV18fChldFtlXT1KZS5jb21waWxlKGUpKSkodHx8e30se3ByZXR0eTohMH0pfWNhdGNoKGUpe3JldHVybiIifX1mdW5jdGlvbiBxKGUsdCxuLHIpe3ZhciBvPXR8fFtdLGk9bnx8T2JqZWN0LmNyZWF0ZShudWxsKSxhPXJ8fE9iamVjdC5jcmVhdGUobnVsbCk7ZS5mb3JFYWNoKGZ1bmN0aW9uKGUpe0gobyxpLGEsZSl9KTtmb3IodmFyIHM9MCx1PW8ubGVuZ3RoO3M8dTtzKyspIioiPT09b1tzXSYmKG8ucHVzaChvLnNwbGljZShzLDEpWzBdKSx1LS0scy0tKTtyZXR1cm57cGF0aExpc3Q6byxwYXRoTWFwOmksbmFtZU1hcDphfX1mdW5jdGlvbiBIKGUsdCxuLHIsbyxpKXt2YXIgYT1yLnBhdGgscz1yLm5hbWUsdT1yLnBhdGhUb1JlZ2V4cE9wdGlvbnN8fHt9LGM9QihhLG8sdS5zdHJpY3QpOyJib29sZWFuIj09dHlwZW9mIHIuY2FzZVNlbnNpdGl2ZSYmKHUuc2Vuc2l0aXZlPXIuY2FzZVNlbnNpdGl2ZSk7dmFyIGw9e3BhdGg6YyxyZWdleDpGKGMsdSksY29tcG9uZW50czpyLmNvbXBvbmVudHN8fHtkZWZhdWx0OnIuY29tcG9uZW50fSxpbnN0YW5jZXM6e30sbmFtZTpzLHBhcmVudDpvLG1hdGNoQXM6aSxyZWRpcmVjdDpyLnJlZGlyZWN0LGJlZm9yZUVudGVyOnIuYmVmb3JlRW50ZXIsbWV0YTpyLm1ldGF8fHt9LHByb3BzOm51bGw9PXIucHJvcHM/e306ci5jb21wb25lbnRzP3IucHJvcHM6e2RlZmF1bHQ6ci5wcm9wc319O2lmKHIuY2hpbGRyZW4mJnIuY2hpbGRyZW4uZm9yRWFjaChmdW5jdGlvbihyKXt2YXIgbz1pP0MoaSsiLyIrci5wYXRoKTp2b2lkIDA7SChlLHQsbixyLGwsbyl9KSx2b2lkIDAhPT1yLmFsaWFzKXsoQXJyYXkuaXNBcnJheShyLmFsaWFzKT9yLmFsaWFzOltyLmFsaWFzXSkuZm9yRWFjaChmdW5jdGlvbihpKXt2YXIgYT17cGF0aDppLGNoaWxkcmVuOnIuY2hpbGRyZW59O0goZSx0LG4sYSxvLGwucGF0aHx8Ii8iKX0pfXRbbC5wYXRoXXx8KGUucHVzaChsLnBhdGgpLHRbbC5wYXRoXT1sKSxzJiYobltzXXx8KG5bc109bCkpfWZ1bmN0aW9uIEYoZSx0KXt2YXIgbj1KZShlLFtdLHQpO3JldHVybiBufWZ1bmN0aW9uIEIoZSx0LG4pe3JldHVybiBufHwoZT1lLnJlcGxhY2UoL1wvJC8sIiIpKSwiLyI9PT1lWzBdP2U6bnVsbD09dD9lOkModC5wYXRoKyIvIitlKX1mdW5jdGlvbiBVKGUsdCxuLHIpe3ZhciBvPSJzdHJpbmciPT10eXBlb2YgZT97cGF0aDplfTplO2lmKG8ubmFtZXx8by5fbm9ybWFsaXplZClyZXR1cm4gbztpZighby5wYXRoJiZvLnBhcmFtcyYmdCl7bz1XKHt9LG8pLG8uX25vcm1hbGl6ZWQ9ITA7dmFyIGk9VyhXKHt9LHQucGFyYW1zKSxvLnBhcmFtcyk7aWYodC5uYW1lKW8ubmFtZT10Lm5hbWUsby5wYXJhbXM9aTtlbHNlIGlmKHQubWF0Y2hlZC5sZW5ndGgpe3ZhciBhPXQubWF0Y2hlZFt0Lm1hdGNoZWQubGVuZ3RoLTFdLnBhdGg7by5wYXRoPU0oYSxpLCJwYXRoICIrdC5wYXRoKX1yZXR1cm4gb312YXIgdT1fKG8ucGF0aHx8IiIpLGM9dCYmdC5wYXRofHwiLyIsbD11LnBhdGg/dyh1LnBhdGgsYyxufHxvLmFwcGVuZCk6YyxmPXModS5xdWVyeSxvLnF1ZXJ5LHImJnIub3B0aW9ucy5wYXJzZVF1ZXJ5KSxwPW8uaGFzaHx8dS5oYXNoO3JldHVybiBwJiYiIyIhPT1wLmNoYXJBdCgwKSYmKHA9IiMiK3ApLHtfbm9ybWFsaXplZDohMCxwYXRoOmwscXVlcnk6ZixoYXNoOnB9fWZ1bmN0aW9uIFcoZSx0KXtmb3IodmFyIG4gaW4gdCllW25dPXRbbl07cmV0dXJuIGV9ZnVuY3Rpb24geihlLHQpe2Z1bmN0aW9uIG4oZSl7cShlLHUsYyxmKX1mdW5jdGlvbiByKGUsbixyKXt2YXIgbz1VKGUsbiwhMSx0KSxpPW8ubmFtZTtpZihpKXt2YXIgcz1mW2ldO2lmKCFzKXJldHVybiBhKG51bGwsbyk7dmFyIGw9cy5yZWdleC5rZXlzLmZpbHRlcihmdW5jdGlvbihlKXtyZXR1cm4hZS5vcHRpb25hbH0pLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gZS5uYW1lfSk7aWYoIm9iamVjdCIhPXR5cGVvZiBvLnBhcmFtcyYmKG8ucGFyYW1zPXt9KSxuJiYib2JqZWN0Ij09dHlwZW9mIG4ucGFyYW1zKWZvcih2YXIgcCBpbiBuLnBhcmFtcykhKHAgaW4gby5wYXJhbXMpJiZsLmluZGV4T2YocCk+LTEmJihvLnBhcmFtc1twXT1uLnBhcmFtc1twXSk7aWYocylyZXR1cm4gby5wYXRoPU0ocy5wYXRoLG8ucGFyYW1zLCduYW1lZCByb3V0ZSAiJytpKyciJyksYShzLG8scil9ZWxzZSBpZihvLnBhdGgpe28ucGFyYW1zPXt9O2Zvcih2YXIgZD0wO2Q8dS5sZW5ndGg7ZCsrKXt2YXIgaD11W2RdLHY9Y1toXTtpZihWKHYucmVnZXgsby5wYXRoLG8ucGFyYW1zKSlyZXR1cm4gYSh2LG8scil9fXJldHVybiBhKG51bGwsbyl9ZnVuY3Rpb24gbyhlLG4pe3ZhciBvPWUucmVkaXJlY3QsaT0iZnVuY3Rpb24iPT10eXBlb2Ygbz9vKGwoZSxuLG51bGwsdCkpOm87aWYoInN0cmluZyI9PXR5cGVvZiBpJiYoaT17cGF0aDppfSksIWl8fCJvYmplY3QiIT10eXBlb2YgaSlyZXR1cm4gYShudWxsLG4pO3ZhciBzPWksdT1zLm5hbWUsYz1zLnBhdGgscD1uLnF1ZXJ5LGQ9bi5oYXNoLGg9bi5wYXJhbXM7aWYocD1zLmhhc093blByb3BlcnR5KCJxdWVyeSIpP3MucXVlcnk6cCxkPXMuaGFzT3duUHJvcGVydHkoImhhc2giKT9zLmhhc2g6ZCxoPXMuaGFzT3duUHJvcGVydHkoInBhcmFtcyIpP3MucGFyYW1zOmgsdSl7Zlt1XTtyZXR1cm4gcih7X25vcm1hbGl6ZWQ6ITAsbmFtZTp1LHF1ZXJ5OnAsaGFzaDpkLHBhcmFtczpofSx2b2lkIDAsbil9aWYoYyl7dmFyIHY9WChjLGUpO3JldHVybiByKHtfbm9ybWFsaXplZDohMCxwYXRoOk0odixoLCdyZWRpcmVjdCByb3V0ZSB3aXRoIHBhdGggIicrdisnIicpLHF1ZXJ5OnAsaGFzaDpkfSx2b2lkIDAsbil9cmV0dXJuIGEobnVsbCxuKX1mdW5jdGlvbiBpKGUsdCxuKXt2YXIgbz1NKG4sdC5wYXJhbXMsJ2FsaWFzZWQgcm91dGUgd2l0aCBwYXRoICInK24rJyInKSxpPXIoe19ub3JtYWxpemVkOiEwLHBhdGg6b30pO2lmKGkpe3ZhciBzPWkubWF0Y2hlZCx1PXNbcy5sZW5ndGgtMV07cmV0dXJuIHQucGFyYW1zPWkucGFyYW1zLGEodSx0KX1yZXR1cm4gYShudWxsLHQpfWZ1bmN0aW9uIGEoZSxuLHIpe3JldHVybiBlJiZlLnJlZGlyZWN0P28oZSxyfHxuKTplJiZlLm1hdGNoQXM/aShlLG4sZS5tYXRjaEFzKTpsKGUsbixyLHQpfXZhciBzPXEoZSksdT1zLnBhdGhMaXN0LGM9cy5wYXRoTWFwLGY9cy5uYW1lTWFwO3JldHVybnttYXRjaDpyLGFkZFJvdXRlczpufX1mdW5jdGlvbiBWKGUsdCxuKXt2YXIgcj10Lm1hdGNoKGUpO2lmKCFyKXJldHVybiExO2lmKCFuKXJldHVybiEwO2Zvcih2YXIgbz0xLGk9ci5sZW5ndGg7bzxpOysrbyl7dmFyIGE9ZS5rZXlzW28tMV0scz0ic3RyaW5nIj09dHlwZW9mIHJbb10/ZGVjb2RlVVJJQ29tcG9uZW50KHJbb10pOnJbb107YSYmKG5bYS5uYW1lXT1zKX1yZXR1cm4hMH1mdW5jdGlvbiBYKGUsdCl7cmV0dXJuIHcoZSx0LnBhcmVudD90LnBhcmVudC5wYXRoOiIvIiwhMCl9ZnVuY3Rpb24gSigpe3dpbmRvdy5oaXN0b3J5LnJlcGxhY2VTdGF0ZSh7a2V5OmllKCl9LCIiKSx3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigicG9wc3RhdGUiLGZ1bmN0aW9uKGUpe0coKSxlLnN0YXRlJiZlLnN0YXRlLmtleSYmYWUoZS5zdGF0ZS5rZXkpfSl9ZnVuY3Rpb24gSyhlLHQsbixyKXtpZihlLmFwcCl7dmFyIG89ZS5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO28mJmUuYXBwLiRuZXh0VGljayhmdW5jdGlvbigpe3ZhciBlPVkoKSxpPW8odCxuLHI/ZTpudWxsKTtpJiYoImZ1bmN0aW9uIj09dHlwZW9mIGkudGhlbj9pLnRoZW4oZnVuY3Rpb24odCl7cmUodCxlKX0pLmNhdGNoKGZ1bmN0aW9uKGUpe30pOnJlKGksZSkpfSl9fWZ1bmN0aW9uIEcoKXt2YXIgZT1pZSgpO2UmJih0dFtlXT17eDp3aW5kb3cucGFnZVhPZmZzZXQseTp3aW5kb3cucGFnZVlPZmZzZXR9KX1mdW5jdGlvbiBZKCl7dmFyIGU9aWUoKTtpZihlKXJldHVybiB0dFtlXX1mdW5jdGlvbiBRKGUsdCl7dmFyIG49ZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LHI9bi5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxvPWUuZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7cmV0dXJue3g6by5sZWZ0LXIubGVmdC10LngseTpvLnRvcC1yLnRvcC10Lnl9fWZ1bmN0aW9uIFooZSl7cmV0dXJuIG5lKGUueCl8fG5lKGUueSl9ZnVuY3Rpb24gZWUoZSl7cmV0dXJue3g6bmUoZS54KT9lLng6d2luZG93LnBhZ2VYT2Zmc2V0LHk6bmUoZS55KT9lLnk6d2luZG93LnBhZ2VZT2Zmc2V0fX1mdW5jdGlvbiB0ZShlKXtyZXR1cm57eDpuZShlLngpP2UueDowLHk6bmUoZS55KT9lLnk6MH19ZnVuY3Rpb24gbmUoZSl7cmV0dXJuIm51bWJlciI9PXR5cGVvZiBlfWZ1bmN0aW9uIHJlKGUsdCl7dmFyIG49Im9iamVjdCI9PXR5cGVvZiBlO2lmKG4mJiJzdHJpbmciPT10eXBlb2YgZS5zZWxlY3Rvcil7dmFyIHI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvcihlLnNlbGVjdG9yKTtpZihyKXt2YXIgbz1lLm9mZnNldCYmIm9iamVjdCI9PXR5cGVvZiBlLm9mZnNldD9lLm9mZnNldDp7fTtvPXRlKG8pLHQ9UShyLG8pfWVsc2UgWihlKSYmKHQ9ZWUoZSkpfWVsc2UgbiYmWihlKSYmKHQ9ZWUoZSkpO3QmJndpbmRvdy5zY3JvbGxUbyh0LngsdC55KX1mdW5jdGlvbiBvZSgpe3JldHVybiBydC5ub3coKS50b0ZpeGVkKDMpfWZ1bmN0aW9uIGllKCl7cmV0dXJuIG90fWZ1bmN0aW9uIGFlKGUpe290PWV9ZnVuY3Rpb24gc2UoZSx0KXtHKCk7dmFyIG49d2luZG93Lmhpc3Rvcnk7dHJ5e3Q/bi5yZXBsYWNlU3RhdGUoe2tleTpvdH0sIiIsZSk6KG90PW9lKCksbi5wdXNoU3RhdGUoe2tleTpvdH0sIiIsZSkpfWNhdGNoKG4pe3dpbmRvdy5sb2NhdGlvblt0PyJyZXBsYWNlIjoiYXNzaWduIl0oZSl9fWZ1bmN0aW9uIHVlKGUpe3NlKGUsITApfWZ1bmN0aW9uIGNlKGUsdCxuKXt2YXIgcj1mdW5jdGlvbihvKXtvPj1lLmxlbmd0aD9uKCk6ZVtvXT90KGVbb10sZnVuY3Rpb24oKXtyKG8rMSl9KTpyKG8rMSl9O3IoMCl9ZnVuY3Rpb24gbGUoZSl7cmV0dXJuIGZ1bmN0aW9uKHQsbixyKXt2YXIgaT0hMSxhPTAscz1udWxsO2ZlKGUsZnVuY3Rpb24oZSx0LG4sdSl7aWYoImZ1bmN0aW9uIj09dHlwZW9mIGUmJnZvaWQgMD09PWUuY2lkKXtpPSEwLGErKzt2YXIgYyxsPWhlKGZ1bmN0aW9uKHQpe2RlKHQpJiYodD10LmRlZmF1bHQpLGUucmVzb2x2ZWQ9ImZ1bmN0aW9uIj09dHlwZW9mIHQ/dDpEZS5leHRlbmQodCksbi5jb21wb25lbnRzW3VdPXQsLS1hPD0wJiZyKCl9KSxmPWhlKGZ1bmN0aW9uKGUpe3ZhciB0PSJGYWlsZWQgdG8gcmVzb2x2ZSBhc3luYyBjb21wb25lbnQgIit1KyI6ICIrZTtzfHwocz1vKGUpP2U6bmV3IEVycm9yKHQpLHIocykpfSk7dHJ5e2M9ZShsLGYpfWNhdGNoKGUpe2YoZSl9aWYoYylpZigiZnVuY3Rpb24iPT10eXBlb2YgYy50aGVuKWMudGhlbihsLGYpO2Vsc2V7dmFyIHA9Yy5jb21wb25lbnQ7cCYmImZ1bmN0aW9uIj09dHlwZW9mIHAudGhlbiYmcC50aGVuKGwsZil9fX0pLGl8fHIoKX19ZnVuY3Rpb24gZmUoZSx0KXtyZXR1cm4gcGUoZS5tYXAoZnVuY3Rpb24oZSl7cmV0dXJuIE9iamVjdC5rZXlzKGUuY29tcG9uZW50cykubWFwKGZ1bmN0aW9uKG4pe3JldHVybiB0KGUuY29tcG9uZW50c1tuXSxlLmluc3RhbmNlc1tuXSxlLG4pfSl9KSl9ZnVuY3Rpb24gcGUoZSl7cmV0dXJuIEFycmF5LnByb3RvdHlwZS5jb25jYXQuYXBwbHkoW10sZSl9ZnVuY3Rpb24gZGUoZSl7cmV0dXJuIGUuX19lc01vZHVsZXx8aXQmJiJNb2R1bGUiPT09ZVtTeW1ib2wudG9TdHJpbmdUYWddfWZ1bmN0aW9uIGhlKGUpe3ZhciB0PSExO3JldHVybiBmdW5jdGlvbigpe2Zvcih2YXIgbj1bXSxyPWFyZ3VtZW50cy5sZW5ndGg7ci0tOyluW3JdPWFyZ3VtZW50c1tyXTtpZighdClyZXR1cm4gdD0hMCxlLmFwcGx5KHRoaXMsbil9fWZ1bmN0aW9uIHZlKGUpe2lmKCFlKWlmKFZlKXt2YXIgdD1kb2N1bWVudC5xdWVyeVNlbGVjdG9yKCJiYXNlIik7ZT10JiZ0LmdldEF0dHJpYnV0ZSgiaHJlZiIpfHwiLyIsZT1lLnJlcGxhY2UoL15odHRwcz86XC9cL1teXC9dKy8sIiIpfWVsc2UgZT0iLyI7cmV0dXJuIi8iIT09ZS5jaGFyQXQoMCkmJihlPSIvIitlKSxlLnJlcGxhY2UoL1wvJC8sIiIpfWZ1bmN0aW9uIG1lKGUsdCl7dmFyIG4scj1NYXRoLm1heChlLmxlbmd0aCx0Lmxlbmd0aCk7Zm9yKG49MDtuPHImJmVbbl09PT10W25dO24rKyk7cmV0dXJue3VwZGF0ZWQ6dC5zbGljZSgwLG4pLGFjdGl2YXRlZDp0LnNsaWNlKG4pLGRlYWN0aXZhdGVkOmUuc2xpY2Uobil9fWZ1bmN0aW9uIHllKGUsdCxuLHIpe3ZhciBvPWZlKGUsZnVuY3Rpb24oZSxyLG8saSl7dmFyIGE9Z2UoZSx0KTtpZihhKXJldHVybiBBcnJheS5pc0FycmF5KGEpP2EubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBuKGUscixvLGkpfSk6bihhLHIsbyxpKX0pO3JldHVybiBwZShyP28ucmV2ZXJzZSgpOm8pfWZ1bmN0aW9uIGdlKGUsdCl7cmV0dXJuImZ1bmN0aW9uIiE9dHlwZW9mIGUmJihlPURlLmV4dGVuZChlKSksZS5vcHRpb25zW3RdfWZ1bmN0aW9uIGJlKGUpe3JldHVybiB5ZShlLCJiZWZvcmVSb3V0ZUxlYXZlIix3ZSwhMCl9ZnVuY3Rpb24geGUoZSl7cmV0dXJuIHllKGUsImJlZm9yZVJvdXRlVXBkYXRlIix3ZSl9ZnVuY3Rpb24gd2UoZSx0KXtpZih0KXJldHVybiBmdW5jdGlvbigpe3JldHVybiBlLmFwcGx5KHQsYXJndW1lbnRzKX19ZnVuY3Rpb24gX2UoZSx0LG4pe3JldHVybiB5ZShlLCJiZWZvcmVSb3V0ZUVudGVyIixmdW5jdGlvbihlLHIsbyxpKXtyZXR1cm4gQ2UoZSxvLGksdCxuKX0pfWZ1bmN0aW9uIENlKGUsdCxuLHIsbyl7cmV0dXJuIGZ1bmN0aW9uKGksYSxzKXtyZXR1cm4gZShpLGEsZnVuY3Rpb24oZSl7cyhlKSwiZnVuY3Rpb24iPT10eXBlb2YgZSYmci5wdXNoKGZ1bmN0aW9uKCl7VGUoZSx0Lmluc3RhbmNlcyxuLG8pfSl9KX19ZnVuY3Rpb24gVGUoZSx0LG4scil7dFtuXT9lKHRbbl0pOnIoKSYmc2V0VGltZW91dChmdW5jdGlvbigpe1RlKGUsdCxuLHIpfSwxNil9ZnVuY3Rpb24ga2UoZSl7dmFyIHQ9d2luZG93LmxvY2F0aW9uLnBhdGhuYW1lO3JldHVybiBlJiYwPT09dC5pbmRleE9mKGUpJiYodD10LnNsaWNlKGUubGVuZ3RoKSksKHR8fCIvIikrd2luZG93LmxvY2F0aW9uLnNlYXJjaCt3aW5kb3cubG9jYXRpb24uaGFzaH1mdW5jdGlvbiBBZShlKXt2YXIgdD1rZShlKTtpZighL15cLyMvLnRlc3QodCkpcmV0dXJuIHdpbmRvdy5sb2NhdGlvbi5yZXBsYWNlKEMoZSsiLyMiK3QpKSwhMH1mdW5jdGlvbiBTZSgpe3ZhciBlPSRlKCk7cmV0dXJuIi8iPT09ZS5jaGFyQXQoMCl8fChqZSgiLyIrZSksITEpfWZ1bmN0aW9uICRlKCl7dmFyIGU9d2luZG93LmxvY2F0aW9uLmhyZWYsdD1lLmluZGV4T2YoIiMiKTtyZXR1cm4tMT09PXQ/IiI6ZS5zbGljZSh0KzEpfWZ1bmN0aW9uIEVlKGUpe3ZhciB0PXdpbmRvdy5sb2NhdGlvbi5ocmVmLG49dC5pbmRleE9mKCIjIik7cmV0dXJuKG4+PTA/dC5zbGljZSgwLG4pOnQpKyIjIitlfWZ1bmN0aW9uIE9lKGUpe250P3NlKEVlKGUpKTp3aW5kb3cubG9jYXRpb24uaGFzaD1lfWZ1bmN0aW9uIGplKGUpe250P3VlKEVlKGUpKTp3aW5kb3cubG9jYXRpb24ucmVwbGFjZShFZShlKSl9ZnVuY3Rpb24gTmUoZSx0KXtyZXR1cm4gZS5wdXNoKHQpLGZ1bmN0aW9uKCl7dmFyIG49ZS5pbmRleE9mKHQpO24+LTEmJmUuc3BsaWNlKG4sMSl9fWZ1bmN0aW9uIExlKGUsdCxuKXt2YXIgcj0iaGFzaCI9PT1uPyIjIit0OnQ7cmV0dXJuIGU/QyhlKyIvIityKTpyfXZhciBEZSxJZT17bmFtZToicm91dGVyLXZpZXciLGZ1bmN0aW9uYWw6ITAscHJvcHM6e25hbWU6e3R5cGU6U3RyaW5nLGRlZmF1bHQ6ImRlZmF1bHQifX0scmVuZGVyOmZ1bmN0aW9uKGUsdCl7dmFyIG49dC5wcm9wcyxyPXQuY2hpbGRyZW4sbz10LnBhcmVudCxzPXQuZGF0YTtzLnJvdXRlclZpZXc9ITA7Zm9yKHZhciB1PW8uJGNyZWF0ZUVsZW1lbnQsYz1uLm5hbWUsbD1vLiRyb3V0ZSxmPW8uX3JvdXRlclZpZXdDYWNoZXx8KG8uX3JvdXRlclZpZXdDYWNoZT17fSkscD0wLGQ9ITE7byYmby5fcm91dGVyUm9vdCE9PW87KW8uJHZub2RlJiZvLiR2bm9kZS5kYXRhLnJvdXRlclZpZXcmJnArKyxvLl9pbmFjdGl2ZSYmKGQ9ITApLG89by4kcGFyZW50O2lmKHMucm91dGVyVmlld0RlcHRoPXAsZClyZXR1cm4gdShmW2NdLHMscik7dmFyIGg9bC5tYXRjaGVkW3BdO2lmKCFoKXJldHVybiBmW2NdPW51bGwsdSgpO3ZhciB2PWZbY109aC5jb21wb25lbnRzW2NdO3MucmVnaXN0ZXJSb3V0ZUluc3RhbmNlPWZ1bmN0aW9uKGUsdCl7dmFyIG49aC5pbnN0YW5jZXNbY107KHQmJm4hPT1lfHwhdCYmbj09PWUpJiYoaC5pbnN0YW5jZXNbY109dCl9LChzLmhvb2t8fChzLmhvb2s9e30pKS5wcmVwYXRjaD1mdW5jdGlvbihlLHQpe2guaW5zdGFuY2VzW2NdPXQuY29tcG9uZW50SW5zdGFuY2V9O3ZhciBtPXMucHJvcHM9aShsLGgucHJvcHMmJmgucHJvcHNbY10pO2lmKG0pe209cy5wcm9wcz1hKHt9LG0pO3ZhciB5PXMuYXR0cnM9cy5hdHRyc3x8e307Zm9yKHZhciBnIGluIG0pdi5wcm9wcyYmZyBpbiB2LnByb3BzfHwoeVtnXT1tW2ddLGRlbGV0ZSBtW2ddKX1yZXR1cm4gdSh2LHMscil9fSxSZT0vWyEnKCkqXS9nLFBlPWZ1bmN0aW9uKGUpe3JldHVybiIlIitlLmNoYXJDb2RlQXQoMCkudG9TdHJpbmcoMTYpfSxNZT0vJTJDL2cscWU9ZnVuY3Rpb24oZSl7cmV0dXJuIGVuY29kZVVSSUNvbXBvbmVudChlKS5yZXBsYWNlKFJlLFBlKS5yZXBsYWNlKE1lLCIsIil9LEhlPWRlY29kZVVSSUNvbXBvbmVudCxGZT0vXC8/JC8sQmU9bChudWxsLHtwYXRoOiIvIn0pLFVlPVtTdHJpbmcsT2JqZWN0XSxXZT1bU3RyaW5nLEFycmF5XSx6ZT17bmFtZToicm91dGVyLWxpbmsiLHByb3BzOnt0bzp7dHlwZTpVZSxyZXF1aXJlZDohMH0sdGFnOnt0eXBlOlN0cmluZyxkZWZhdWx0OiJhIn0sZXhhY3Q6Qm9vbGVhbixhcHBlbmQ6Qm9vbGVhbixyZXBsYWNlOkJvb2xlYW4sYWN0aXZlQ2xhc3M6U3RyaW5nLGV4YWN0QWN0aXZlQ2xhc3M6U3RyaW5nLGV2ZW50Ont0eXBlOldlLGRlZmF1bHQ6ImNsaWNrIn19LHJlbmRlcjpmdW5jdGlvbihlKXt2YXIgdD10aGlzLG49dGhpcy4kcm91dGVyLHI9dGhpcy4kcm91dGUsbz1uLnJlc29sdmUodGhpcy50byxyLHRoaXMuYXBwZW5kKSxpPW8ubG9jYXRpb24sYT1vLnJvdXRlLHM9by5ocmVmLHU9e30sYz1uLm9wdGlvbnMubGlua0FjdGl2ZUNsYXNzLGY9bi5vcHRpb25zLmxpbmtFeGFjdEFjdGl2ZUNsYXNzLHA9bnVsbD09Yz8icm91dGVyLWxpbmstYWN0aXZlIjpjLGQ9bnVsbD09Zj8icm91dGVyLWxpbmstZXhhY3QtYWN0aXZlIjpmLHY9bnVsbD09dGhpcy5hY3RpdmVDbGFzcz9wOnRoaXMuYWN0aXZlQ2xhc3MseT1udWxsPT10aGlzLmV4YWN0QWN0aXZlQ2xhc3M/ZDp0aGlzLmV4YWN0QWN0aXZlQ2xhc3MseD1pLnBhdGg/bChudWxsLGksbnVsbCxuKTphO3VbeV09aChyLHgpLHVbdl09dGhpcy5leGFjdD91W3ldOm0ocix4KTt2YXIgdz1mdW5jdGlvbihlKXtnKGUpJiYodC5yZXBsYWNlP24ucmVwbGFjZShpKTpuLnB1c2goaSkpfSxfPXtjbGljazpnfTtBcnJheS5pc0FycmF5KHRoaXMuZXZlbnQpP3RoaXMuZXZlbnQuZm9yRWFjaChmdW5jdGlvbihlKXtfW2VdPXd9KTpfW3RoaXMuZXZlbnRdPXc7dmFyIEM9e2NsYXNzOnV9O2lmKCJhIj09PXRoaXMudGFnKUMub249XyxDLmF0dHJzPXtocmVmOnN9O2Vsc2V7dmFyIFQ9Yih0aGlzLiRzbG90cy5kZWZhdWx0KTtpZihUKXtULmlzU3RhdGljPSExO3ZhciBrPURlLnV0aWwuZXh0ZW5kOyhULmRhdGE9ayh7fSxULmRhdGEpKS5vbj1fOyhULmRhdGEuYXR0cnM9ayh7fSxULmRhdGEuYXR0cnMpKS5ocmVmPXN9ZWxzZSBDLm9uPV99cmV0dXJuIGUodGhpcy50YWcsQyx0aGlzLiRzbG90cy5kZWZhdWx0KX19LFZlPSJ1bmRlZmluZWQiIT10eXBlb2Ygd2luZG93LFhlPUFycmF5LmlzQXJyYXl8fGZ1bmN0aW9uKGUpe3JldHVybiJbb2JqZWN0IEFycmF5XSI9PU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKX0sSmU9UCxLZT1ULEdlPWssWWU9JCxRZT1SLFplPW5ldyBSZWdFeHAoWyIoXFxcXC4pIiwiKFtcXC8uXSk/KD86KD86XFw6KFxcdyspKD86XFwoKCg/OlxcXFwufFteXFxcXCgpXSkrKVxcKSk/fFxcKCgoPzpcXFxcLnxbXlxcXFwoKV0pKylcXCkpKFsrKj9dKT98KFxcKikpIl0uam9pbigifCIpLCJnIik7SmUucGFyc2U9S2UsSmUuY29tcGlsZT1HZSxKZS50b2tlbnNUb0Z1bmN0aW9uPVllLEplLnRva2Vuc1RvUmVnRXhwPVFlO3ZhciBldD1PYmplY3QuY3JlYXRlKG51bGwpLHR0PU9iamVjdC5jcmVhdGUobnVsbCksbnQ9VmUmJmZ1bmN0aW9uKCl7dmFyIGU9d2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQ7cmV0dXJuKC0xPT09ZS5pbmRleE9mKCJBbmRyb2lkIDIuIikmJi0xPT09ZS5pbmRleE9mKCJBbmRyb2lkIDQuMCIpfHwtMT09PWUuaW5kZXhPZigiTW9iaWxlIFNhZmFyaSIpfHwtMSE9PWUuaW5kZXhPZigiQ2hyb21lIil8fC0xIT09ZS5pbmRleE9mKCJXaW5kb3dzIFBob25lIikpJiYod2luZG93Lmhpc3RvcnkmJiJwdXNoU3RhdGUiaW4gd2luZG93Lmhpc3RvcnkpfSgpLHJ0PVZlJiZ3aW5kb3cucGVyZm9ybWFuY2UmJndpbmRvdy5wZXJmb3JtYW5jZS5ub3c/d2luZG93LnBlcmZvcm1hbmNlOkRhdGUsb3Q9b2UoKSxpdD0iZnVuY3Rpb24iPT10eXBlb2YgU3ltYm9sJiYic3ltYm9sIj09dHlwZW9mIFN5bWJvbC50b1N0cmluZ1RhZyxhdD1mdW5jdGlvbihlLHQpe3RoaXMucm91dGVyPWUsdGhpcy5iYXNlPXZlKHQpLHRoaXMuY3VycmVudD1CZSx0aGlzLnBlbmRpbmc9bnVsbCx0aGlzLnJlYWR5PSExLHRoaXMucmVhZHlDYnM9W10sdGhpcy5yZWFkeUVycm9yQ2JzPVtdLHRoaXMuZXJyb3JDYnM9W119O2F0LnByb3RvdHlwZS5saXN0ZW49ZnVuY3Rpb24oZSl7dGhpcy5jYj1lfSxhdC5wcm90b3R5cGUub25SZWFkeT1mdW5jdGlvbihlLHQpe3RoaXMucmVhZHk/ZSgpOih0aGlzLnJlYWR5Q2JzLnB1c2goZSksdCYmdGhpcy5yZWFkeUVycm9yQ2JzLnB1c2godCkpfSxhdC5wcm90b3R5cGUub25FcnJvcj1mdW5jdGlvbihlKXt0aGlzLmVycm9yQ2JzLnB1c2goZSl9LGF0LnByb3RvdHlwZS50cmFuc2l0aW9uVG89ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsbz10aGlzLnJvdXRlci5tYXRjaChlLHRoaXMuY3VycmVudCk7dGhpcy5jb25maXJtVHJhbnNpdGlvbihvLGZ1bmN0aW9uKCl7ci51cGRhdGVSb3V0ZShvKSx0JiZ0KG8pLHIuZW5zdXJlVVJMKCksci5yZWFkeXx8KHIucmVhZHk9ITAsci5yZWFkeUNicy5mb3JFYWNoKGZ1bmN0aW9uKGUpe2Uobyl9KSl9LGZ1bmN0aW9uKGUpe24mJm4oZSksZSYmIXIucmVhZHkmJihyLnJlYWR5PSEwLHIucmVhZHlFcnJvckNicy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QoZSl9KSl9KX0sYXQucHJvdG90eXBlLmNvbmZpcm1UcmFuc2l0aW9uPWZ1bmN0aW9uKGUsdCxuKXt2YXIgaT10aGlzLGE9dGhpcy5jdXJyZW50LHM9ZnVuY3Rpb24oZSl7byhlKSYmKGkuZXJyb3JDYnMubGVuZ3RoP2kuZXJyb3JDYnMuZm9yRWFjaChmdW5jdGlvbih0KXt0KGUpfSk6KHIoITEsInVuY2F1Z2h0IGVycm9yIGR1cmluZyByb3V0ZSBuYXZpZ2F0aW9uOiIpLGNvbnNvbGUuZXJyb3IoZSkpKSxuJiZuKGUpfTtpZihoKGUsYSkmJmUubWF0Y2hlZC5sZW5ndGg9PT1hLm1hdGNoZWQubGVuZ3RoKXJldHVybiB0aGlzLmVuc3VyZVVSTCgpLHMoKTt2YXIgdT1tZSh0aGlzLmN1cnJlbnQubWF0Y2hlZCxlLm1hdGNoZWQpLGM9dS51cGRhdGVkLGw9dS5kZWFjdGl2YXRlZCxmPXUuYWN0aXZhdGVkLHA9W10uY29uY2F0KGJlKGwpLHRoaXMucm91dGVyLmJlZm9yZUhvb2tzLHhlKGMpLGYubWFwKGZ1bmN0aW9uKGUpe3JldHVybiBlLmJlZm9yZUVudGVyfSksbGUoZikpO3RoaXMucGVuZGluZz1lO3ZhciBkPWZ1bmN0aW9uKHQsbil7aWYoaS5wZW5kaW5nIT09ZSlyZXR1cm4gcygpO3RyeXt0KGUsYSxmdW5jdGlvbihlKXshMT09PWV8fG8oZSk/KGkuZW5zdXJlVVJMKCEwKSxzKGUpKToic3RyaW5nIj09dHlwZW9mIGV8fCJvYmplY3QiPT10eXBlb2YgZSYmKCJzdHJpbmciPT10eXBlb2YgZS5wYXRofHwic3RyaW5nIj09dHlwZW9mIGUubmFtZSk/KHMoKSwib2JqZWN0Ij09dHlwZW9mIGUmJmUucmVwbGFjZT9pLnJlcGxhY2UoZSk6aS5wdXNoKGUpKTpuKGUpfSl9Y2F0Y2goZSl7cyhlKX19O2NlKHAsZCxmdW5jdGlvbigpe3ZhciBuPVtdO2NlKF9lKGYsbixmdW5jdGlvbigpe3JldHVybiBpLmN1cnJlbnQ9PT1lfSkuY29uY2F0KGkucm91dGVyLnJlc29sdmVIb29rcyksZCxmdW5jdGlvbigpe2lmKGkucGVuZGluZyE9PWUpcmV0dXJuIHMoKTtpLnBlbmRpbmc9bnVsbCx0KGUpLGkucm91dGVyLmFwcCYmaS5yb3V0ZXIuYXBwLiRuZXh0VGljayhmdW5jdGlvbigpe24uZm9yRWFjaChmdW5jdGlvbihlKXtlKCl9KX0pfSl9KX0sYXQucHJvdG90eXBlLnVwZGF0ZVJvdXRlPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3VycmVudDt0aGlzLmN1cnJlbnQ9ZSx0aGlzLmNiJiZ0aGlzLmNiKGUpLHRoaXMucm91dGVyLmFmdGVySG9va3MuZm9yRWFjaChmdW5jdGlvbihuKXtuJiZuKGUsdCl9KX07dmFyIHN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXt2YXIgcj10aGlzO2UuY2FsbCh0aGlzLHQsbik7dmFyIG89dC5vcHRpb25zLnNjcm9sbEJlaGF2aW9yO28mJkooKTt2YXIgaT1rZSh0aGlzLmJhc2UpO3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJwb3BzdGF0ZSIsZnVuY3Rpb24oZSl7dmFyIG49ci5jdXJyZW50LGE9a2Uoci5iYXNlKTtyLmN1cnJlbnQ9PT1CZSYmYT09PWl8fHIudHJhbnNpdGlvblRvKGEsZnVuY3Rpb24oZSl7byYmSyh0LGUsbiwhMCl9KX0pfXJldHVybiBlJiYodC5fX3Byb3RvX189ZSksdC5wcm90b3R5cGU9T2JqZWN0LmNyZWF0ZShlJiZlLnByb3RvdHlwZSksdC5wcm90b3R5cGUuY29uc3RydWN0b3I9dCx0LnByb3RvdHlwZS5nbz1mdW5jdGlvbihlKXt3aW5kb3cuaGlzdG9yeS5nbyhlKX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyxvPXRoaXMsaT1vLmN1cnJlbnQ7dGhpcy50cmFuc2l0aW9uVG8oZSxmdW5jdGlvbihlKXtzZShDKHIuYmFzZStlLmZ1bGxQYXRoKSksSyhyLnJvdXRlcixlLGksITEpLHQmJnQoZSl9LG4pfSx0LnByb3RvdHlwZS5yZXBsYWNlPWZ1bmN0aW9uKGUsdCxuKXt2YXIgcj10aGlzLG89dGhpcyxpPW8uY3VycmVudDt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3VlKEMoci5iYXNlK2UuZnVsbFBhdGgpKSxLKHIucm91dGVyLGUsaSwhMSksdCYmdChlKX0sbil9LHQucHJvdG90eXBlLmVuc3VyZVVSTD1mdW5jdGlvbihlKXtpZihrZSh0aGlzLmJhc2UpIT09dGhpcy5jdXJyZW50LmZ1bGxQYXRoKXt2YXIgdD1DKHRoaXMuYmFzZSt0aGlzLmN1cnJlbnQuZnVsbFBhdGgpO2U/c2UodCk6dWUodCl9fSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4ga2UodGhpcy5iYXNlKX0sdH0oYXQpLHV0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuLHIpe2UuY2FsbCh0aGlzLHQsbiksciYmQWUodGhpcy5iYXNlKXx8U2UoKX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUuc2V0dXBMaXN0ZW5lcnM9ZnVuY3Rpb24oKXt2YXIgZT10aGlzLHQ9dGhpcy5yb3V0ZXIsbj10Lm9wdGlvbnMuc2Nyb2xsQmVoYXZpb3Iscj1udCYmbjtyJiZKKCksd2luZG93LmFkZEV2ZW50TGlzdGVuZXIobnQ/InBvcHN0YXRlIjoiaGFzaGNoYW5nZSIsZnVuY3Rpb24oKXt2YXIgdD1lLmN1cnJlbnQ7U2UoKSYmZS50cmFuc2l0aW9uVG8oJGUoKSxmdW5jdGlvbihuKXtyJiZLKGUucm91dGVyLG4sdCwhMCksbnR8fGplKG4uZnVsbFBhdGgpfSl9KX0sdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpcyxvPXRoaXMsaT1vLmN1cnJlbnQ7dGhpcy50cmFuc2l0aW9uVG8oZSxmdW5jdGlvbihlKXtPZShlLmZ1bGxQYXRoKSxLKHIucm91dGVyLGUsaSwhMSksdCYmdChlKX0sbil9LHQucHJvdG90eXBlLnJlcGxhY2U9ZnVuY3Rpb24oZSx0LG4pe3ZhciByPXRoaXMsbz10aGlzLGk9by5jdXJyZW50O3RoaXMudHJhbnNpdGlvblRvKGUsZnVuY3Rpb24oZSl7amUoZS5mdWxsUGF0aCksSyhyLnJvdXRlcixlLGksITEpLHQmJnQoZSl9LG4pfSx0LnByb3RvdHlwZS5nbz1mdW5jdGlvbihlKXt3aW5kb3cuaGlzdG9yeS5nbyhlKX0sdC5wcm90b3R5cGUuZW5zdXJlVVJMPWZ1bmN0aW9uKGUpe3ZhciB0PXRoaXMuY3VycmVudC5mdWxsUGF0aDskZSgpIT09dCYmKGU/T2UodCk6amUodCkpfSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXtyZXR1cm4gJGUoKX0sdH0oYXQpLGN0PWZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQodCxuKXtlLmNhbGwodGhpcyx0LG4pLHRoaXMuc3RhY2s9W10sdGhpcy5pbmRleD0tMX1yZXR1cm4gZSYmKHQuX19wcm90b19fPWUpLHQucHJvdG90eXBlPU9iamVjdC5jcmVhdGUoZSYmZS5wcm90b3R5cGUpLHQucHJvdG90eXBlLmNvbnN0cnVjdG9yPXQsdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpczt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3Iuc3RhY2s9ci5zdGFjay5zbGljZSgwLHIuaW5kZXgrMSkuY29uY2F0KGUpLHIuaW5kZXgrKyx0JiZ0KGUpfSxuKX0sdC5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9dGhpczt0aGlzLnRyYW5zaXRpb25UbyhlLGZ1bmN0aW9uKGUpe3Iuc3RhY2s9ci5zdGFjay5zbGljZSgwLHIuaW5kZXgpLmNvbmNhdChlKSx0JiZ0KGUpfSxuKX0sdC5wcm90b3R5cGUuZ289ZnVuY3Rpb24oZSl7dmFyIHQ9dGhpcyxuPXRoaXMuaW5kZXgrZTtpZighKG48MHx8bj49dGhpcy5zdGFjay5sZW5ndGgpKXt2YXIgcj10aGlzLnN0YWNrW25dO3RoaXMuY29uZmlybVRyYW5zaXRpb24ocixmdW5jdGlvbigpe3QuaW5kZXg9bix0LnVwZGF0ZVJvdXRlKHIpfSl9fSx0LnByb3RvdHlwZS5nZXRDdXJyZW50TG9jYXRpb249ZnVuY3Rpb24oKXt2YXIgZT10aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdO3JldHVybiBlP2UuZnVsbFBhdGg6Ii8ifSx0LnByb3RvdHlwZS5lbnN1cmVVUkw9ZnVuY3Rpb24oKXt9LHR9KGF0KSxsdD1mdW5jdGlvbihlKXt2b2lkIDA9PT1lJiYoZT17fSksdGhpcy5hcHA9bnVsbCx0aGlzLmFwcHM9W10sdGhpcy5vcHRpb25zPWUsdGhpcy5iZWZvcmVIb29rcz1bXSx0aGlzLnJlc29sdmVIb29rcz1bXSx0aGlzLmFmdGVySG9va3M9W10sdGhpcy5tYXRjaGVyPXooZS5yb3V0ZXN8fFtdLHRoaXMpO3ZhciB0PWUubW9kZXx8Imhhc2giO3N3aXRjaCh0aGlzLmZhbGxiYWNrPSJoaXN0b3J5Ij09PXQmJiFudCYmITEhPT1lLmZhbGxiYWNrLHRoaXMuZmFsbGJhY2smJih0PSJoYXNoIiksVmV8fCh0PSJhYnN0cmFjdCIpLHRoaXMubW9kZT10LHQpe2Nhc2UiaGlzdG9yeSI6dGhpcy5oaXN0b3J5PW5ldyBzdCh0aGlzLGUuYmFzZSk7YnJlYWs7Y2FzZSJoYXNoIjp0aGlzLmhpc3Rvcnk9bmV3IHV0KHRoaXMsZS5iYXNlLHRoaXMuZmFsbGJhY2spO2JyZWFrO2Nhc2UiYWJzdHJhY3QiOnRoaXMuaGlzdG9yeT1uZXcgY3QodGhpcyxlLmJhc2UpfX0sZnQ9e2N1cnJlbnRSb3V0ZTp7Y29uZmlndXJhYmxlOiEwfX07bHQucHJvdG90eXBlLm1hdGNoPWZ1bmN0aW9uKGUsdCxuKXtyZXR1cm4gdGhpcy5tYXRjaGVyLm1hdGNoKGUsdCxuKX0sZnQuY3VycmVudFJvdXRlLmdldD1mdW5jdGlvbigpe3JldHVybiB0aGlzLmhpc3RvcnkmJnRoaXMuaGlzdG9yeS5jdXJyZW50fSxsdC5wcm90b3R5cGUuaW5pdD1mdW5jdGlvbihlKXt2YXIgdD10aGlzO2lmKHRoaXMuYXBwcy5wdXNoKGUpLCF0aGlzLmFwcCl7dGhpcy5hcHA9ZTt2YXIgbj10aGlzLmhpc3Rvcnk7aWYobiBpbnN0YW5jZW9mIHN0KW4udHJhbnNpdGlvblRvKG4uZ2V0Q3VycmVudExvY2F0aW9uKCkpO2Vsc2UgaWYobiBpbnN0YW5jZW9mIHV0KXt2YXIgcj1mdW5jdGlvbigpe24uc2V0dXBMaXN0ZW5lcnMoKX07bi50cmFuc2l0aW9uVG8obi5nZXRDdXJyZW50TG9jYXRpb24oKSxyLHIpfW4ubGlzdGVuKGZ1bmN0aW9uKGUpe3QuYXBwcy5mb3JFYWNoKGZ1bmN0aW9uKHQpe3QuX3JvdXRlPWV9KX0pfX0sbHQucHJvdG90eXBlLmJlZm9yZUVhY2g9ZnVuY3Rpb24oZSl7cmV0dXJuIE5lKHRoaXMuYmVmb3JlSG9va3MsZSl9LGx0LnByb3RvdHlwZS5iZWZvcmVSZXNvbHZlPWZ1bmN0aW9uKGUpe3JldHVybiBOZSh0aGlzLnJlc29sdmVIb29rcyxlKX0sbHQucHJvdG90eXBlLmFmdGVyRWFjaD1mdW5jdGlvbihlKXtyZXR1cm4gTmUodGhpcy5hZnRlckhvb2tzLGUpfSxsdC5wcm90b3R5cGUub25SZWFkeT1mdW5jdGlvbihlLHQpe3RoaXMuaGlzdG9yeS5vblJlYWR5KGUsdCl9LGx0LnByb3RvdHlwZS5vbkVycm9yPWZ1bmN0aW9uKGUpe3RoaXMuaGlzdG9yeS5vbkVycm9yKGUpfSxsdC5wcm90b3R5cGUucHVzaD1mdW5jdGlvbihlLHQsbil7dGhpcy5oaXN0b3J5LnB1c2goZSx0LG4pfSxsdC5wcm90b3R5cGUucmVwbGFjZT1mdW5jdGlvbihlLHQsbil7dGhpcy5oaXN0b3J5LnJlcGxhY2UoZSx0LG4pfSxsdC5wcm90b3R5cGUuZ289ZnVuY3Rpb24oZSl7dGhpcy5oaXN0b3J5LmdvKGUpfSxsdC5wcm90b3R5cGUuYmFjaz1mdW5jdGlvbigpe3RoaXMuZ28oLTEpfSxsdC5wcm90b3R5cGUuZm9yd2FyZD1mdW5jdGlvbigpe3RoaXMuZ28oMSl9LGx0LnByb3RvdHlwZS5nZXRNYXRjaGVkQ29tcG9uZW50cz1mdW5jdGlvbihlKXt2YXIgdD1lP2UubWF0Y2hlZD9lOnRoaXMucmVzb2x2ZShlKS5yb3V0ZTp0aGlzLmN1cnJlbnRSb3V0ZTtyZXR1cm4gdD9bXS5jb25jYXQuYXBwbHkoW10sdC5tYXRjaGVkLm1hcChmdW5jdGlvbihlKXtyZXR1cm4gT2JqZWN0LmtleXMoZS5jb21wb25lbnRzKS5tYXAoZnVuY3Rpb24odCl7cmV0dXJuIGUuY29tcG9uZW50c1t0XX0pfSkpOltdfSxsdC5wcm90b3R5cGUucmVzb2x2ZT1mdW5jdGlvbihlLHQsbil7dmFyIHI9VShlLHR8fHRoaXMuaGlzdG9yeS5jdXJyZW50LG4sdGhpcyksbz10aGlzLm1hdGNoKHIsdCksaT1vLnJlZGlyZWN0ZWRGcm9tfHxvLmZ1bGxQYXRoO3JldHVybntsb2NhdGlvbjpyLHJvdXRlOm8saHJlZjpMZSh0aGlzLmhpc3RvcnkuYmFzZSxpLHRoaXMubW9kZSksbm9ybWFsaXplZFRvOnIscmVzb2x2ZWQ6b319LGx0LnByb3RvdHlwZS5hZGRSb3V0ZXM9ZnVuY3Rpb24oZSl7dGhpcy5tYXRjaGVyLmFkZFJvdXRlcyhlKSx0aGlzLmhpc3RvcnkuY3VycmVudCE9PUJlJiZ0aGlzLmhpc3RvcnkudHJhbnNpdGlvblRvKHRoaXMuaGlzdG9yeS5nZXRDdXJyZW50TG9jYXRpb24oKSl9LE9iamVjdC5kZWZpbmVQcm9wZXJ0aWVzKGx0LnByb3RvdHlwZSxmdCksbHQuaW5zdGFsbD14LGx0LnZlcnNpb249IjIuOC4xIixWZSYmd2luZG93LlZ1ZSYmd2luZG93LlZ1ZS51c2UobHQpLHQuYT1sdH0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSx0KXtmb3IodmFyIG49W10scj17fSxvPTA7bzx0Lmxlbmd0aDtvKyspe3ZhciBpPXRbb10sYT1pWzBdLHM9aVsxXSx1PWlbMl0sYz1pWzNdLGw9e2lkOmUrIjoiK28sY3NzOnMsbWVkaWE6dSxzb3VyY2VNYXA6Y307clthXT9yW2FdLnBhcnRzLnB1c2gobCk6bi5wdXNoKHJbYV09e2lkOmEscGFydHM6W2xdfSl9cmV0dXJuIG59fSxmdW5jdGlvbihlLHQpe2Z1bmN0aW9uIG4oZSx0KXt2YXIgbj1lWzFdfHwiIixvPWVbM107aWYoIW8pcmV0dXJuIG47aWYodCYmImZ1bmN0aW9uIj09dHlwZW9mIGJ0b2Epe3ZhciBpPXIobyk7cmV0dXJuW25dLmNvbmNhdChvLnNvdXJjZXMubWFwKGZ1bmN0aW9uKGUpe3JldHVybiIvKiMgc291cmNlVVJMPSIrby5zb3VyY2VSb290K2UrIiAqLyJ9KSkuY29uY2F0KFtpXSkuam9pbigiXG4iKX1yZXR1cm5bbl0uam9pbigiXG4iKX1mdW5jdGlvbiByKGUpe3JldHVybiIvKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247Y2hhcnNldD11dGYtODtiYXNlNjQsIitidG9hKHVuZXNjYXBlKGVuY29kZVVSSUNvbXBvbmVudChKU09OLnN0cmluZ2lmeShlKSkpKSsiICovIn1lLmV4cG9ydHM9ZnVuY3Rpb24oZSl7dmFyIHQ9W107cmV0dXJuIHQudG9TdHJpbmc9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5tYXAoZnVuY3Rpb24odCl7dmFyIHI9bih0LGUpO3JldHVybiB0WzJdPyJAbWVkaWEgIit0WzJdKyJ7IityKyJ9IjpyfSkuam9pbigiIil9LHQuaT1mdW5jdGlvbihlLG4peyJzdHJpbmciPT10eXBlb2YgZSYmKGU9W1tudWxsLGUsIiJdXSk7Zm9yKHZhciByPXt9LG89MDtvPHRoaXMubGVuZ3RoO28rKyl7dmFyIGk9dGhpc1tvXVswXTsibnVtYmVyIj09dHlwZW9mIGkmJihyW2ldPSEwKX1mb3Iobz0wO288ZS5sZW5ndGg7bysrKXt2YXIgYT1lW29dOyJudW1iZXIiPT10eXBlb2YgYVswXSYmclthWzBdXXx8KG4mJiFhWzJdP2FbMl09bjpuJiYoYVsyXT0iKCIrYVsyXSsiKSBhbmQgKCIrbisiKSIpLHQucHVzaChhKSl9fSx0fX0sZnVuY3Rpb24oZSx0KXtlLmV4cG9ydHM9ZnVuY3Rpb24oZSl7cmV0dXJuInN0cmluZyIhPXR5cGVvZiBlP2U6KC9eWyciXS4qWyciXSQvLnRlc3QoZSkmJihlPWUuc2xpY2UoMSwtMSkpLC9bIicoKSBcdFxuXS8udGVzdChlKT8nIicrZS5yZXBsYWNlKC8iL2csJ1xcIicpLnJlcGxhY2UoL1xuL2csIlxcbiIpKyciJzplKX19LGZ1bmN0aW9uKGUsdCxuKXtmdW5jdGlvbiByKGUpe2Zvcih2YXIgdD0wO3Q8ZS5sZW5ndGg7dCsrKXt2YXIgbj1lW3RdLHI9bFtuLmlkXTtpZihyKXtyLnJlZnMrKztmb3IodmFyIG89MDtvPHIucGFydHMubGVuZ3RoO28rKylyLnBhcnRzW29dKG4ucGFydHNbb10pO2Zvcig7bzxuLnBhcnRzLmxlbmd0aDtvKyspci5wYXJ0cy5wdXNoKGkobi5wYXJ0c1tvXSkpO3IucGFydHMubGVuZ3RoPm4ucGFydHMubGVuZ3RoJiYoci5wYXJ0cy5sZW5ndGg9bi5wYXJ0cy5sZW5ndGgpfWVsc2V7Zm9yKHZhciBhPVtdLG89MDtvPG4ucGFydHMubGVuZ3RoO28rKylhLnB1c2goaShuLnBhcnRzW29dKSk7bFtuLmlkXT17aWQ6bi5pZCxyZWZzOjEscGFydHM6YX19fX1mdW5jdGlvbiBvKCl7dmFyIGU9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgic3R5bGUiKTtyZXR1cm4gZS50eXBlPSJ0ZXh0L2NzcyIsZi5hcHBlbmRDaGlsZChlKSxlfWZ1bmN0aW9uIGkoZSl7dmFyIHQsbixyPWRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoInN0eWxlWyIreSsnfj0iJytlLmlkKyciXScpO2lmKHIpe2lmKGgpcmV0dXJuIHY7ci5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKHIpfWlmKGcpe3ZhciBpPWQrKztyPXB8fChwPW8oKSksdD1hLmJpbmQobnVsbCxyLGksITEpLG49YS5iaW5kKG51bGwscixpLCEwKX1lbHNlIHI9bygpLHQ9cy5iaW5kKG51bGwsciksbj1mdW5jdGlvbigpe3IucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChyKX07cmV0dXJuIHQoZSksZnVuY3Rpb24ocil7aWYocil7aWYoci5jc3M9PT1lLmNzcyYmci5tZWRpYT09PWUubWVkaWEmJnIuc291cmNlTWFwPT09ZS5zb3VyY2VNYXApcmV0dXJuO3QoZT1yKX1lbHNlIG4oKX19ZnVuY3Rpb24gYShlLHQsbixyKXt2YXIgbz1uPyIiOnIuY3NzO2lmKGUuc3R5bGVTaGVldCllLnN0eWxlU2hlZXQuY3NzVGV4dD1iKHQsbyk7ZWxzZXt2YXIgaT1kb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShvKSxhPWUuY2hpbGROb2RlczthW3RdJiZlLnJlbW92ZUNoaWxkKGFbdF0pLGEubGVuZ3RoP2UuaW5zZXJ0QmVmb3JlKGksYVt0XSk6ZS5hcHBlbmRDaGlsZChpKX19ZnVuY3Rpb24gcyhlLHQpe3ZhciBuPXQuY3NzLHI9dC5tZWRpYSxvPXQuc291cmNlTWFwO2lmKHImJmUuc2V0QXR0cmlidXRlKCJtZWRpYSIsciksbS5zc3JJZCYmZS5zZXRBdHRyaWJ1dGUoeSx0LmlkKSxvJiYobis9IlxuLyojIHNvdXJjZVVSTD0iK28uc291cmNlc1swXSsiICovIixuKz0iXG4vKiMgc291cmNlTWFwcGluZ1VSTD1kYXRhOmFwcGxpY2F0aW9uL2pzb247YmFzZTY0LCIrYnRvYSh1bmVzY2FwZShlbmNvZGVVUklDb21wb25lbnQoSlNPTi5zdHJpbmdpZnkobykpKSkrIiAqLyIpLGUuc3R5bGVTaGVldCllLnN0eWxlU2hlZXQuY3NzVGV4dD1uO2Vsc2V7Zm9yKDtlLmZpcnN0Q2hpbGQ7KWUucmVtb3ZlQ2hpbGQoZS5maXJzdENoaWxkKTtlLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKG4pKX19dmFyIHU9InVuZGVmaW5lZCIhPXR5cGVvZiBkb2N1bWVudDtpZigidW5kZWZpbmVkIiE9dHlwZW9mIERFQlVHJiZERUJVRyYmIXUpdGhyb3cgbmV3IEVycm9yKCJ2dWUtc3R5bGUtbG9hZGVyIGNhbm5vdCBiZSB1c2VkIGluIGEgbm9uLWJyb3dzZXIgZW52aXJvbm1lbnQuIFVzZSB7IHRhcmdldDogJ25vZGUnIH0gaW4geW91ciBXZWJwYWNrIGNvbmZpZyB0byBpbmRpY2F0ZSBhIHNlcnZlci1yZW5kZXJpbmcgZW52aXJvbm1lbnQuIik7dmFyIGM9big4NyksbD17fSxmPXUmJihkb2N1bWVudC5oZWFkfHxkb2N1bWVudC5nZXRFbGVtZW50c0J5VGFnTmFtZSgiaGVhZCIpWzBdKSxwPW51bGwsZD0wLGg9ITEsdj1mdW5jdGlvbigpe30sbT1udWxsLHk9ImRhdGEtdnVlLXNzci1pZCIsZz0idW5kZWZpbmVkIiE9dHlwZW9mIG5hdmlnYXRvciYmL21zaWUgWzYtOV1cYi8udGVzdChuYXZpZ2F0b3IudXNlckFnZW50LnRvTG93ZXJDYXNlKCkpO2UuZXhwb3J0cz1mdW5jdGlvbihlLHQsbixvKXtoPW4sbT1vfHx7fTt2YXIgaT1jKGUsdCk7cmV0dXJuIHIoaSksZnVuY3Rpb24odCl7Zm9yKHZhciBuPVtdLG89MDtvPGkubGVuZ3RoO28rKyl7dmFyIGE9aVtvXSxzPWxbYS5pZF07cy5yZWZzLS0sbi5wdXNoKHMpfXQ/KGk9YyhlLHQpLHIoaSkpOmk9W107Zm9yKHZhciBvPTA7bzxuLmxlbmd0aDtvKyspe3ZhciBzPW5bb107aWYoMD09PXMucmVmcyl7Zm9yKHZhciB1PTA7dTxzLnBhcnRzLmxlbmd0aDt1Kyspcy5wYXJ0c1t1XSgpO2RlbGV0ZSBsW3MuaWRdfX19fTt2YXIgYj1mdW5jdGlvbigpe3ZhciBlPVtdO3JldHVybiBmdW5jdGlvbih0LG4pe3JldHVybiBlW3RdPW4sZS5maWx0ZXIoQm9vbGVhbikuam9pbigiXG4iKX19KCl9XSk7Ci0vLyMgc291cmNlTWFwcGluZ1VSTD12ZW5kb3IuNzk3MDMwYzkyMWNlZDc4NmJiMGEuanMubWFwClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiLWpzZjIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9qc2YyL3V0aWxzL1RhZ0VuY29kaW5nSGVscGVyLmphdmEgYi9lbXBpcmUtZGItanNmMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2pzZjIvdXRpbHMvVGFnRW5jb2RpbmdIZWxwZXIuamF2YQppbmRleCA0NWRjY2I1Li4wMjZiZTVlIDEwMDY0NAotLS0gYS9lbXBpcmUtZGItanNmMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2pzZjIvdXRpbHMvVGFnRW5jb2RpbmdIZWxwZXIuamF2YQorKysgYi9lbXBpcmUtZGItanNmMi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2pzZjIvdXRpbHMvVGFnRW5jb2RpbmdIZWxwZXIuamF2YQpAQCAtMjIsNiArMjIsNyBAQAogaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247DQogaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsNCiBpbXBvcnQgamF2YS51dGlsLkxvY2FsZTsNCitpbXBvcnQgamF2YS51dGlsLlNldDsNCiANCiBpbXBvcnQgamF2YXguZWwuVmFsdWVFeHByZXNzaW9uOw0KIGltcG9ydCBqYXZheC5mYWNlcy5GYWNlc1dyYXBwZXI7DQpAQCAtNDEsNiArNDIsNyBAQAogaW1wb3J0IG9yZy5hcGFjaGUuY29tbW9ucy5iZWFudXRpbHMuQmVhblV0aWxzQmVhbjsNCiBpbXBvcnQgb3JnLmFwYWNoZS5jb21tb25zLmJlYW51dGlscy5Qcm9wZXJ0eVV0aWxzOw0KIGltcG9ydCBvcmcuYXBhY2hlLmNvbW1vbnMuYmVhbnV0aWxzLlByb3BlcnR5VXRpbHNCZWFuOw0KK2ltcG9ydCBvcmcuYXBhY2hlLmVtcGlyZS5jb21tb25zLkF0dHJpYnV0ZXM7DQogaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuT2JqZWN0VXRpbHM7DQogaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuT3B0aW9uczsNCiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuY29tbW9ucy5TdHJpbmdVdGlsczsNCkBAIC0xMjksNiArMTMxLDEyIEBACiAgICAgICAgIHsNCiAgICAgICAgICAgICByZXR1cm4gZXhwci5nZXRBdHRyaWJ1dGUobmFtZSk7DQogICAgICAgICB9DQorICAgIA0KKyAgICAgICAgQE92ZXJyaWRlDQorICAgICAgICBwdWJsaWMgU2V0PEF0dHJpYnV0ZXMuQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkNCisgICAgICAgIHsNCisgICAgICAgICAgICByZXR1cm4gZXhwci5nZXRTb3VyY2VDb2x1bW4oKS5nZXRBdHRyaWJ1dGVzKCk7DQorICAgICAgICB9DQogDQogICAgICAgICBAT3ZlcnJpZGUNCiAgICAgICAgIHB1YmxpYyBPcHRpb25zIGdldE9wdGlvbnMoKQ0KZGlmZiAtLWdpdCBhL2VtcGlyZS1kYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2RhdGEvQ29sdW1uLmphdmEgYi9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYXRhL0NvbHVtbi5qYXZhCmluZGV4IDkyYjk2NzguLmM1ZTVjNWUgMTAwNjQ0Ci0tLSBhL2VtcGlyZS1kYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2RhdGEvQ29sdW1uLmphdmEKKysrIGIvZW1waXJlLWRiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvZGF0YS9Db2x1bW4uamF2YQpAQCAtMTgsNiArMTgsMTAgQEAKICAqLwogcGFja2FnZSBvcmcuYXBhY2hlLmVtcGlyZS5kYXRhOwogCitpbXBvcnQgamF2YS51dGlsLlNldDsKKworaW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuQXR0cmlidXRlczsKKwogLyoqCiAgKiBUaGUgY29sdW1uIGludGVyZmFjZSBwcm92aWRlcyBtZXRob2RzIGZvciBhY2Nlc3NpbmcgbWV0YWRhdGEgdGhhdCBpcyBvbmx5IHJlbGV2YW50IGZvciB1cGRhdGluZyByZWNvcmRzLgogICogPFA+CkBAIC04MSw2ICs4NSwxMiBAQAogICAgIGJvb2xlYW4gaXNSZWFkT25seSgpOwogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgbWV0YWRhdGEgYXR0cmlidXRlcy4KKyAgICAgKiBAcmV0dXJuIHNldCBvZiBtZXRhZGF0YSBhdHRyaWJ1dGVzCisgICAgICovCisgICAgU2V0PEF0dHJpYnV0ZXMuQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCk7CisKKyAgICAvKioKICAgICAgKiBDaGVja3MgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgY29sdW1uIAogICAgICAqIElmIG5vdCwgYW4gZXhjZXB0aW9uIGlzIHRocm93bgogICAgICAqIEByZXR1cm4gdGhlIHZhbHVlIHRoZSB2YWxpZGF0ZWQgYW5kIHBvc3NpYmx5IGNvbnZlcnRlZCB2YWx1ZQpkaWZmIC0tZ2l0IGEvZW1waXJlLWRiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvZGF0YS9Db2x1bW5FeHByLmphdmEgYi9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYXRhL0NvbHVtbkV4cHIuamF2YQppbmRleCBjZjZiZmFiLi4yOWVkODAwIDEwMDY0NAotLS0gYS9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYXRhL0NvbHVtbkV4cHIuamF2YQorKysgYi9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYXRhL0NvbHVtbkV4cHIuamF2YQpAQCAtNTMsOSArNTMsOSBAQAogICAgIFN0cmluZyBnZXRDb250cm9sVHlwZSgpOwogCiAgICAgLyoqCi0gICAgICogUmV0dXJucyBmdXRoZXIgbWV0YWRhdGEgYXR0cmlidXRlcy4KKyAgICAgKiBSZXR1cm5zIGEgbWV0YWRhdGEgYXR0cmlidXRlLgogICAgICAqIEBwYXJhbSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUKLSAgICAgKiBAcmV0dXJuIGZ1dGhlciBtZXRhZGF0YSBhdHRyaWJ1dGVzCisgICAgICogQHJldHVybiB0aGUgbWV0YWRhdGEgYXR0cmlidXRlCiAgICAgICovCiAgICAgT2JqZWN0IGdldEF0dHJpYnV0ZShTdHJpbmcgbmFtZSk7CiAKZGlmZiAtLWdpdCBhL2VtcGlyZS1kYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2RhdGEvYmVhbi9CZWFuUHJvcGVydHkuamF2YSBiL2VtcGlyZS1kYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2RhdGEvYmVhbi9CZWFuUHJvcGVydHkuamF2YQppbmRleCAwZGYzZGVjLi45YzY2NTc0IDEwMDY0NAotLS0gYS9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYXRhL2JlYW4vQmVhblByb3BlcnR5LmphdmEKKysrIGIvZW1waXJlLWRiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvZGF0YS9iZWFuL0JlYW5Qcm9wZXJ0eS5qYXZhCkBAIC0xOCw2ICsxOCw5IEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5lbXBpcmUuZGF0YS5iZWFuOwogCitpbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOworaW1wb3J0IGphdmEudXRpbC5TZXQ7CisKIGltcG9ydCBvcmcuYXBhY2hlLmVtcGlyZS5jb21tb25zLkF0dHJpYnV0ZXM7CiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuY29tbW9ucy5PYmplY3RVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmVtcGlyZS5jb21tb25zLk9wdGlvbnM7CkBAIC0xMjksNiArMTMyLDE4IEBACiAgICAgfQogCiAgICAgLyoqCisgICAgICogUmV0dXJucyBhbGwgbWV0YWRhdGEgYXR0cmlidXRlcy4KKyAgICAgKiBAcmV0dXJuIHNldCBvZiBtZXRhZGF0YSBhdHRyaWJ1dGVzCisgICAgICovCisgICAgQE92ZXJyaWRlCisgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCisgICAgcHVibGljIFNldDxBdHRyaWJ1dGVzLkF0dHJpYnV0ZT4gZ2V0QXR0cmlidXRlcygpCisgICAgeworICAgICAgICByZXR1cm4gKGF0dHJpYnV0ZXMhPW51bGwgPyBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVTZXQoYXR0cmlidXRlcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQ29sbGVjdGlvbnMuRU1QVFlfU0VUKTsKKyAgICB9CisKKyAgICAvKioKICAgICAgKiBSZXR1cm5zIHRoZSB0aXRsZSBhdHRyaWJ1dGUuCiAgICAgICogQHJldHVybiB0aGUgY29sdW1uIHRpdGxlCiAgICAgICovCmRpZmYgLS1naXQgYS9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYi9EQkNvbHVtbi5qYXZhIGIvZW1waXJlLWRiL3NyYy9tYWluL2phdmEvb3JnL2FwYWNoZS9lbXBpcmUvZGIvREJDb2x1bW4uamF2YQppbmRleCBmNzI1NGVkLi44NDlhNzY3IDEwMDY0NAotLS0gYS9lbXBpcmUtZGIvc3JjL21haW4vamF2YS9vcmcvYXBhY2hlL2VtcGlyZS9kYi9EQkNvbHVtbi5qYXZhCisrKyBiL2VtcGlyZS1kYi9zcmMvbWFpbi9qYXZhL29yZy9hcGFjaGUvZW1waXJlL2RiL0RCQ29sdW1uLmphdmEKQEAgLTE4LDggKzE4LDEwIEBACiAgKi8KIHBhY2thZ2Ugb3JnLmFwYWNoZS5lbXBpcmUuZGI7CiAKK2ltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7CiBpbXBvcnQgamF2YS51dGlsLlNldDsKIAoraW1wb3J0IG9yZy5hcGFjaGUuZW1waXJlLmNvbW1vbnMuQXR0cmlidXRlczsKIGltcG9ydCBvcmcuYXBhY2hlLmVtcGlyZS5jb21tb25zLk9wdGlvbnM7CiBpbXBvcnQgb3JnLmFwYWNoZS5lbXBpcmUuY29tbW9ucy5TdHJpbmdVdGlsczsKIGltcG9ydCBvcmcuYXBhY2hlLmVtcGlyZS5kYXRhLkNvbHVtbjsKQEAgLTM1MCw2ICszNTIsMTggQEAKICAgICB9CiAKICAgICAvKioKKyAgICAgKiBSZXR1cm5zIGFsbCBtZXRhZGF0YSBhdHRyaWJ1dGVzLgorICAgICAqIEByZXR1cm4gc2V0IG9mIG1ldGFkYXRhIGF0dHJpYnV0ZXMKKyAgICAgKi8KKyAgICBAT3ZlcnJpZGUKKyAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKKyAgICBwdWJsaWMgU2V0PEF0dHJpYnV0ZXMuQXR0cmlidXRlPiBnZXRBdHRyaWJ1dGVzKCkKKyAgICB7CisgICAgICAgIHJldHVybiAoYXR0cmlidXRlcyE9bnVsbCA/IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZVNldChhdHRyaWJ1dGVzKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBDb2xsZWN0aW9ucy5FTVBUWV9TRVQpOworICAgIH0KKworICAgIC8qKgogICAgICAqICBAc2VlIERCQ29sdW1uRXhwciNnZXRPcHRpb25zKCkKICAgICAgKi8KICAgICBAT3ZlcnJpZGUK