Find this useful? Enter your email to receive occasional updates for securing PHP code.

Signing you up...

Thank you for signing up!

PHP Decode

PD9QSFANCg0KLyoNCiMgSXQncyB0b3JyISB2MjAyNDAxMDkNCg0K6rO16rCcIO2GoOugjO2KuCDsgqzsnbTtirjsnZ..

Decoded Output download

<?  PD9QSFANCg0KLyoNCiMgSXQncyB0b3JyISB2MjAyNDAxMDkNCg0K6rO16rCcIO2GoOugjO2KuCDsgqzsnbTtirjsnZgg6rKM7Iuc66y87J2EIFJTUyDtmJXtg5zroZwg67OA7ZmYDQotIO2VtOuLuSBJdCdzIHRvcnIg64qUIGdyb2xsY2FrZS10b3Jy64uY7J2YIHRvcnIg66W8IOq4sOuwmOycvOuhnCDsoJzsnpHsnYQg7ZWY7JiA7Iq164uI64ukLg0KIA0KICBncm9sbGNha2UtdG9yciDri5jsnZgg67aA7J6s66GcIO2VtOuLuSB0b3Jy6rCAIOyXheuNsOydtO2KuOqwgCA16rCc7JuU7J20IOuEmOuPhOuhnSDsl4XrjbDsnbTtirjqsIAg66+47Z2h7ZWY7JesIOyImOygle2bhCDsoJzsnpHsnYQg7ZWY7JiA7Jy866mwLA0KIA0KICDrs7gg7ZSE66Gc7KCd7Yq464qUIOusuOygnOqwgCDrsJzsg53tlaAg7IucIOyekOynhCDsgq3soJztlaAg7JiI7KCV7J6F64uI64ukLg0KDQojIyMg7KCB7JqpIOuwqeuylQ0KDQp0b3JyLnBocOulvCDsm7nshJzruYTsiqQg66Oo7Yq47JeQIHRvcnIg65SU66CJ7Yag66as66W8IOunjOuTpOqzoCDrs7XsgqztlZzri6QuICANCg0K7Iuc64aA66Gc7KeA64qUIOybueyEnOu5hOyKpOulvCDtmZzshLHtmZTtlZjqs6Agd2ViL3RvcnIvdG9yci5waHDroZwg67O17IKs7ZWc64ukLg0KDQojIyMg7IKs7JqpIOuwqeuylQ0KDQrsmIgpIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms964aA66m0IOutkO2VmOuLiA0KDQogLSBiOiDqsoDsg4ntlaAg6rKM7Iuc7YyQ7Jy866Gc7I2oIOuvuOumrCDsoJXsnZjrkJwg6rKD66eMIOyCrOyaqSDqsIDriqXtlZjri6QuIOqyjOyLnO2MkOydhCDsp4DsoJXtlZjsp4Ag7JWK7Jy866m0IOyYiOuKpSwg65Oc652866eILCDri6TtgZDsl5DshJwg7Ya17ZWpIOqygOyDie2VnOuLpC4g7KeA7JuQ7ZWY64qUIOqyjOyLnO2MkOydgCDsmIjriqUoZW50KSwg65Oc652866eIKGRyYW1hKSwg64uk7YGQKGRvY3UpLCDrr7jrk5wobWlkKSwg6riw7YOAKGV0YynsnbTri6QuDQotIGs6IOqygOyDieyWtCjsmIgsIOuGgOuptCDrrZDtlZjri4gp7J2064ukLiDsg53rnrUg7IucIO2VtOuLuSDqsozsi5ztjJAg7LKrIO2OmOydtOyngOydmCDrqqnroZ3snYQg6rCA7KC47Jio64ukLg0KDQojIyMg7JeF642w7J207Yq4DQoNCi0gdG9yci5waHDripQg7J6Q64+ZIOyXheuNsOydtO2KuOulvCDsp4Dsm5DtlZzri6QuIA0KDQotIOyXheuNsOydtO2KuCDsi5wgdG9yci5waHAg7J6Q7LK06rCAIOuzgOqyveuQmOuvgOuhnCDsnKDsp4DtlbTslbwg7ZWgIOyEpOygleydtCDsnojripQg6rK97JqwIFVzZXJDb25maWcucGhwIO2MjOydvOyXkCDsoJXsnZjtlZjrqbQg65Cc64ukLg0KICDslYTrnpjripQgc2V0IOygleuztOulvCBVc2VyQ29uZmlnLnBocOyXkCDsoJXsnZjtlZwg7JiI7Iuc7J2064ukLg0KDQogIGBgYHBocA0KICA8P1BIUA0KICANCiAgIyDqsoDsg4nslrQgU2V0OiDshLjtirjroZwg65Ox66Gd65CcIOydtOumhOydhCDqsoDsg4ntgqTsm4zrk5zroZwg7IKs7Jqp7ZWY66m0IO2VnOuyiOyXkCDri6TspJEg6rKA7IOJ7J2EIOyLpOyLnO2VnOuLpC4NCiAgJEtFWVdPUkRTID0gYXJyYXkoDQogICAgICAic2V0MDEiID0+IGFycmF5KCLrnbzrlJTsmKTsiqTtg4AiLCAi64aA66m0IOutkO2VmOuLiCA3MjBwLU5FWFQiLCAi64KYIO2YvOyekCDsgrDri6QgNzIwcC1ORVhUIiksDQogICAgICAic2V0MDIiID0+IGFycmF5KCLrsJTtgLTri6zrprAg7KeRIDcyMHAtTkVYVCIsICLsnKAg7YC07KaIIOyYqCDrjZQg67iU65+tIDcyMHAtTkVYVCIpLA0KICAgICAgInNldDAzIiA9PiBhcnJheSgi64aA66m0IOutkO2VmOuLiCIsICLrgpgg7Zi87J6QIOyCsOuLpCIsICLrnbzrlJTsmKTsiqTtg4AiLCAi7Jes7J6Q65Ok7J2YIOydgOuwgO2VnCDtjIzti7AiKQ0KICApOw0KICBgYGANCg0KLSBU7IKs7J207Yq46rCAIOyjveyWtOuyhOumsCDtm4Qg66mw7LmgIOq4sOuLpOumrOuLpCDrs7TrqbQg7J6R64+Z7ZWgIOuQoCDsiJjrj4Qg7J6I64ukLg0KDQotIOy1nOyLoCDrsoTsoIQg7LK07YGs64qUIO2VmOujqOyXkCDtlZzrsogg7ZWc64ukLg0KDQotIOyekOuPmSDsl4XrjbDsnbTtirjrpbwg7KSR7KeA7ZWY66Ck66m0IGRlZmluZSgnQVVUT19VUERBVEUnLCBmYWxzZSk766GcIOuzgOqyve2VnOuLpC4NCg0KIyMjIOqzoOq4iSDtmZzsmqkNCg0KLSDqsoDsg4nslrTripQg7IiY7KeB67CUKHwp66GcIOq1rOu2hO2VmOyXrCDsl6zrn6zqsJzrpbwg7J6F66Cl7ZWgIOyImCDsnojri6QuIA0KICDsmIgpIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms964aA66m0IOutkO2VmOuLiHzrnbzrlJTsmKQg7Iqk7YOAfOuCmCDtmLzsnpAg7IKw64ukDQotIOqygOyDieyWtOuKlCDrr7jrpqwg7KCV7J2Y7ZWcIOyEuO2KuOuqheydhCDsnbTsmqntlaAg7IiY64+EIOyeiOuLpC4gDQogIOyYiCkgIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms9c2V0MDENCi0g7J6R64+Z7J20IOygnOuMgOuhnCDrkJjsp4Ag7JWK7Jy866m0ICRsb2dnZXItPnNldExldmVsKCdERUJVRycpO+uhnCDrs4Dqsr3tlZjqs6Ag66Gc6re4IO2MjOydvCh0b3JyLmxvZynsnYQg7IK07Y6067O464ukLg0KLSDsoJXrs7Trpbwg7IiY7KeR7ZWgIOyCrOydtO2KuOqwgCDrsJTrgIzrqbQgJENPTkZJR+ulvCDsiJjsoJXtlZzri6QuDQoNCiMjIyDrs4Dqsr0g7J2066ClDQoNCiAqICAgMjAyNDA1MjggLSDthqDroIztirgg7IKs7J207Yq4IA0KICogICAyMDI0MDEwOSAtIO2GoOugjO2KuCDsgqzsnbTtirggDQogKiAgIDIwMjMxMTIyIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAzMjcgLSDsnpDrj5nsl4XrjbDsnbTtirgg7Jik66WYIOyImOyglSwg7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAyMjUgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIzMDIxMiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjMwMjA3IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAyMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIzMDExNiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjMwMTA1IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAxMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTIyMyAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMjE1IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEyMTEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTIwNyAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMTI2IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjExMjAgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTExMSAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMTA2IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEwMjQgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTAxNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMDExIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEwMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMDkyNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIwNTAyIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTEwMTcgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIxMTAxNiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjEwOTE5IC0g7J6Q64+Z7JeF642w7J207Yq4IOyYpOulmCDsiJjsoJUNCiAqICAgMjAyMTA5MTYgLSDsnpDrj5nsl4XrjbDsnbTtirgg7Jik66WYIOyImOyglQ0KICogICAyMDIxMDkxNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjEwOTEzIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTA4MDYgLSDrj4TrqZTsnbgg7J6Q64+ZIOuzgOqyvSDsmKTrpZgg7IiY7KCVDQogKiAgIDIwMjEwODA1IC0g64+E66mU7J24IOyekOuPmSDrs4Dqsr0g6riw64qlIOy2lOqwgCwg7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTAyMTEgLSDsgqzsnbTtirgg7KO87IaMIOuzgOqyvQ0KICogICAyMDIwMDgxNyAtIOyjveyXiOuNmCB0b3Jy7J2YIOu2gO2ZnA0KICogICAyMDE3MDQxNiAtIOyCrOydtO2KuCDsoJXrs7Qg7J6Q64+ZIOyXheuNsOydtO2KuCDquLDriqUg7LaU6rCADQogKiAgIDIwMTcwNDI1IC0g7J6Q64+ZIOyXheuNsOydtO2KuCDsmKTrpZgg7IiY7KCVIOuwjyDssqvtjpjsnbTsp4Dsl5DshJwg66eI6re464S3IOunge2BrCDqsoDsg4kg6riw64qlIOy2lOqwgA0KICogICAyMDE3MDUxNSAtIOuniOq3uOuEtyDrp4HtgazqsIAg64uk66W4IO2OmOydtOyngOyXkCDsobTsnqztlZjripQg6rK97Jqw7JeQ64+EIOyymOumrO2VmOuPhOuhnSDquLDriqUg7LaU6rCADQogKiAgIDIwMTcwNjEzIC0g7IKs7J207Yq4IOygleuztCDsl4XrjbDsnbTtirgg7YOc6re4KGNvZGUgPiBwcmUpIOuzgOqyvS4gaHRtbOydmCDshKDsspjrpqwg7LaU6rCALg0KIA0KICovDQoNCi8qDQogIGdpdGh1YiDrsLDtj6wg7KCEIGJhc2U2NCDsnbjsvZTrlKnqsJLsnYQg7ZmV7J247ZWY66Ck66m0IOyVhOuemCDrqoXroLnslrTrpbwg7Iuk7ZaJ7ZWc64ukLg0KICBwaHAgdG9yci5waHAgYmFzZTY0DQoqLw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyDthqDroIztirgg7IKs7J207Yq4IOygleuztA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQokQ09ORklHID0gYXJyYXkoDQogICAgImVudCIgPT4gYXJyYXkoICAgICAjIFRW7JiI64qlDQogICAgICAgICJodHRwczovL2t0eHRvcnJlbnQxMjIuY29tL2Jicy9ib2FyZC5waHA/Ym9fdGFibGU9ZW50ZXJ0YWluJnNjYT0mc2ZsPXdyX3N1YmplY3Qmc29wPWFuZCZzdHg9e2t9Ig0KICAgICksDQogICAgImRyYW1hIiA9PiBhcnJheSggICAjIFRW65Oc652866eIDQogICAgICAgICJodHRwczovL2t0eHRvcnJlbnQxMjIuY29tL2Jicy9ib2FyZC5waHA/Ym9fdGFibGU9ZHJhbWEmc2NhPSZzZmw9d3Jfc3ViamVjdCZzb3A9YW5kJnN0eD17a30iLA0KICAgICksDQogICAgImRvY3UiID0+IGFycmF5KCAgICAjIFRW64uk7YGQL+yLnOyCrA0KICAgICAgICAiaHR0cHM6Ly9rdHh0b3JyZW50MTIyLmNvbS9iYnMvYm9hcmQucGhwP2JvX3RhYmxlPXR2JnNjYT0mc2ZsPXdyX3N1YmplY3Qmc29wPWFuZCZzdHg9e2t9Ig0KICAgICksDQogICAgImFuaSIgPT4gYXJyYXkoICAgICAjIOyZuOq1reuTnOudvOuniA0KICAgICAgICAiaHR0cHM6Ly9rdHh0b3JyZW50MTIyLmNvbS9iYnMvYm9hcmQucGhwP2JvX3RhYmxlPWFuaSZzY2E9JnNmbD13cl9zdWJqZWN0JnNvcD1hbmQmc3R4PXtrfSINCiAgICApLA0KICAgICJldGMiID0+IGFycmF5KCAgICAgIyDsiqTtj6zsuKAsIOyVoOuLiCDrk7ENCiAgICAgICAgLy/qs7XrnoANCiAgICApLCANCg0KICAgICMg6rKM7Iuc7YyQ7J2EIOyngOygle2VmOyngCDslYrsnYAg6rK97JqwIOqygOyDie2VoCDqsozsi5ztjJAg66qp66GdDQogICAgImFsbCIgPT4gYXJyYXkoImVudCIsICJkcmFtYSIsICJkb2N1IiwgImFuaSIpLA0KDQogICAgIyDquIDrqqnroZ0sIOuLpOyatOuhnOuTnCDrp4Htgawg6rKA7IOJ7J2EIOychO2VnCDsoJXqt5zsi50g7Yyo7YS0LiAo67OA6rK97J6QOiBzLeuLqOydvCDrnbzsnbjsnLzroZwg7LKY66asLCBtLeyXrOufrCDrnbzsnbjsnLzroZwg7LKY66asLCBpLeuMgOyGjOusuOyekCDrrLTsi5wpDQogICAgIl9wYWdlX2xpbmtfcHJlcHJvY2VzcyIgPT4gYXJyYXkoKSwNCiAgICAiX3BhZ2VfbGluayIgPT4gJyE8ZGl2IGNsYXNzPSJ3ci1zdWJqZWN0Ij4uKj88YSBocmVmPSIoP1A8bGluaz4uKz8pIi4qPz4oP1A8dGl0bGU+Lis/KTwvYT4hc2knLA0KDQogICAgIyDrp4jqt7jrhLfrp4Htgawo7Yag66CM7Yq47YyM7J28KeqwgCDsnojripQg7Y6Y7J207KeA7J2YIGh0bWzsnYQg67Cb7J2AIO2bhCDrr7jrpqwg67OA6rK97ZWgIOuCtOyaqeuTpDog7JiIKSBhcnJheSgiL21hZ25ldF9saW5rXCgnL2kiLCAiaHJlZj0nbWFnbmV0Oj94dD11cm46YnRpaDoiKSwNCiAgICAiX2Rvd25fbGlua19wcmVwcm9jZXNzIiA9PiBhcnJheSgpLA0KDQogICAgIyDrp4jqt7jrhLcg7ZiV7Iud7J2EIOywvuuKlOuLpC4NCiAgICAiX2Rvd25fbGluayIgPT4gJ21hZ25ldCcsDQoNCiAgICAjIO2OmOydtOyngCDrgrTsl5Ag66eI6re464S3IOunge2BrOulvCDrhbjstpztlZjsp4Ag7JWK6rOgIO2KueyglSBVUkzroZwg7JqU7LKt7ZWY66m0IOyjvOuKlCDqsr3smrDqsIAg7J6I64ukLg0KICAgICMg7J2065+wIOycoO2YleydmCDsmpTssq0gVVJM7J2EIOywvuq4sCDsnITtlZwg7Yyo7YS07J2EIOuvuOumrCDsoJXsnZjtlbTslbwg7ZWc64ukLiANCiAgICAiX21hZ25ldF9mb2xsb3dfbGluayIgPT4gJycNCik7DQoNCg0KIyDqsoDsg4nslrQgU2V0OiDshLjtirjroZwg65Ox66Gd65CcIOydtOumhOydhCDqsoDsg4ntgqTsm4zrk5zroZwg7IKs7Jqp7ZWY66m0IO2VnOuyiOyXkCDri6TspJEg6rKA7IOJ7J2EIOyLpOyLnO2VnOuLpC4NCiRLRVlXT1JEUyA9IGFycmF5KA0KICAgICJzZXQwMSIgPT4gYXJyYXkoIuudvOuUlOyYpOyKpO2DgCA3MjBwLU5FWFQiLCAi64aA66m0IOutkO2VmOuLiCA3MjBwLU5FWFQiLCAi64KYIO2YvOyekCDsgrDri6QgNzIwcC1ORVhUIiksDQogICAgInNldDAyIiA9PiBhcnJheSgi7JygIO2AtOymiCDsmKgg642UIOu4lOufrSA3MjBwLU5FWFQiKQ0KKTsNCg0KIyBjdXJsIOyalOyyrSDsi5wg7IKs7Jqp7ZWgIHByb3h5IOyjvOyGjC4gaXA6cG9ydA0KJFBST1hZID0gJyc7DQoNCmRlZmluZSgnVkVSU0lPTicsICd2MjAyNDA1MjgnKTsgICMgYXBwIHZlcnNpb24NCmRlZmluZSgnQVVUT19VUERBVEUnLCB0cnVlKTsgICMg7J6Q64+ZIOyXheuNsOydtO2KuCDquLDriqUg7IKs7JqpDQpkZWZpbmUoJ01BR05FVF9DQUNIRV9DT05TRVJWRV9EQVlTJywgNDUwKTsgICAjIOuniOq3uOuEtyDsupDsi5wg67O07KG07J287IiYDQpkZWZpbmUoJ1VQREFURV9VUkwnLCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JqdG93ZXIvdG9yci9tYXN0ZXIvdG9yci5lbmNvZGVkJyk7ICAjIHRvcnIg7J6Q64+ZIOyXheuNsOydtO2KuCB1cmwNCg0KJGxvZ2dlciA9IG5ldyBNeWxvZ2dlcigpOw0KJGxvZ2dlci0+c2V0TGV2ZWwoJ0RFQlVHJyk7ICAjIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUuulvCDsgqzsmqntlaAg7IiYIOyeiOuLpC4NCg0KIyDsgqzsmqnsnpAg7ISk7KCVIO2MjOydvOydhCDsnb3slrTshJwg6riw67O4IOyEpOygleydhCDqsLHsi6DtlZzri6QuDQojIOyKpO2BrOumve2KuCDtjIzsnbzsnYAg7J6Q64+ZIOyXheuNsOydtO2KuOqwgCDrkJjquLAg65WM66y47JeQIOuztOyhtOydtCDtlYTsmpTtlZwg7ISk7KCV7J2AIFVzZXJDb25maWcucGhw7JeQIOygleydmO2VnOuLpC4NCmlmIChmaWxlX2V4aXN0cygnVXNlckNvbmZpZy5waHAnKSkgaW5jbHVkZSAnVXNlckNvbmZpZy5waHAnOw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQ29tbW9uIHV0aWwgZnVuY3Rpb25zDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KY2xhc3MgTXlMb2dnZXINCnsNCiAgICBwcml2YXRlICRsb2dmID0gbnVsbDsNCiAgICBwcml2YXRlICRsZXZlbCA9ICdJTkZPJzsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCdBc2lhL1Nlb3VsJyk7DQogICAgICAgICR0aGlzLT5sb2dmID0gYmFzZW5hbWUoX19GSUxFX18sICcucGhwJykgLiAnLmxvZyc7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIHNldExldmVsKCRsZXZlbCkNCiAgICB7DQogICAgICAgICR0aGlzLT5sZXZlbCA9ICRsZXZlbDsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1zZykNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+bGV2ZWwgPT0gJ0RFQlVHJykgew0KICAgICAgICAgICAgJHRoaXMtPl9sb2coJ0QnLCAkbXNnKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtc2cpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPmxldmVsID09ICdJTkZPJyB8fCAkdGhpcy0+bGV2ZWwgPT0gJ0RFQlVHJykgew0KICAgICAgICAgICAgJHRoaXMtPl9sb2coJ0knLCAkbXNnKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKCRtc2cpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPmxldmVsID09ICdXQVJOJyB8fCAkdGhpcy0+bGV2ZWwgPT0gJ0lORk8nIHx8ICR0aGlzLT5sZXZlbCA9PSAnREVCVUcnKSB7DQogICAgICAgICAgICAkdGhpcy0+X2xvZygnVycsICRtc2cpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtc2cpDQogICAgew0KICAgICAgICAkdGhpcy0+X2xvZygnRScsICRtc2cpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gX2xvZygkbGV2ZWwsICRtc2cpDQogICAgew0KICAgICAgICAkdCA9IG1pY3JvdGltZSh0cnVlKTsNCiAgICAgICAgJG1pbGxpID0gc3ByaW50ZigiJTAzZCIsICgkdCAtIGZsb29yKCR0KSkgKiAxMDAwKTsNCiAgICAgICAgJGR0ID0gc3ByaW50ZigiJXMuJXMiLCBkYXRlKCdZLW0tZCBIOmk6cycpLCAkbWlsbGkpOw0KICAgICAgICAkYnQgPSBkZWJ1Z19iYWNrdHJhY2UoKTsNCiAgICAgICAgJGZ1bmMgPSBpc3NldCgkYnRbMl0pID8gJGJ0WzJdWydmdW5jdGlvbiddIDogJ19fbWFpbl9fJzsNCiAgICAgICAgJGNhbGxlciA9ICRidFsxXTsNCiAgICAgICAgJGZpbGUgPSBiYXNlbmFtZSgkY2FsbGVyWydmaWxlJ10pOw0KICAgICAgICAkb3V0cHV0ID0gc3ByaW50ZigiJXMgJXMgPCVzOiVzOiVkPiAlc1xuIiwgJGR0LCAkbGV2ZWwsICRmaWxlLCAkZnVuYywgJGNhbGxlclsnbGluZSddLCBwcmludF9yKCRtc2csIHRydWUpKTsNCiAgICAgICAgZXJyb3JfbG9nKCRvdXRwdXQsIDMsICR0aGlzLT5sb2dmKTsNCiAgICB9DQp9DQoNCg0KIyBVc2VyLUFnZW507JmAIHJlZmVyZXLrpbwg7Jyg7KeA7ZWY64qUIOybuSDtg5Dsg4nquLANCmZ1bmN0aW9uIGN1cmxfZmV0Y2goJHVybCwgJGluaXQgPSBmYWxzZSkNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCiAgICBnbG9iYWwgJFBST1hZOw0KICAgIHN0YXRpYyAkY2ggPSBudWxsOw0KICAgIHN0YXRpYyAkY250ID0gMDsNCg0KICAgICgrKyRjbnQpICUgMTAgPT0gMCAmJiBzbGVlcCgyKTsgICMg64uo7Iuc6rCEIOuCtOyXkCDrhIjrrLQg66eO7J20IOyhsO2ajO2VmOuptCDssKjri6jri7ntlaAg7IiY64+EIOyeiOuLpA0KDQogICAgJGNvb2tpZV9ubSA9ICcuL2Nvb2tpZS50eHQnOw0KDQogICAgaWYgKCRjaCA9PSBudWxsIHx8ICRpbml0ID09IHRydWUpIHsNCiAgICAgICAgJGNoICE9IG51bGwgJiYgY3VybF9jbG9zZSgkY2gpOw0KDQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KDQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTAwLjAuNDg5Ni4xMjcgU2FmYXJpLzUzNy4zNicpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0FVVE9SRUZFUkVSLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRVNFU1NJT04sIHRydWUpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCAkY29va2llX25tKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIGZhbHNlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7DQoNCiAgICAgICAgaWYgKCRQUk9YWSkgew0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BST1hZVFlQRSwgQ1VSTFBST1hZX0hUVFApOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCwgMSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BST1hZLCAkUFJPWFkpOw0KDQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJQcm94eSBzZXR0aW5nIGFwcGxpZWQuIFByb3h5IGluZm86ICRQUk9YWSIpOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsNCiAgICAkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAkaHR0cF9jb2RlID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsNCiAgICBsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJHJlc3BvbnNlLCAyKTsNCg0KICAgICRzaXplID0gc3RybGVuKCRib2R5KTsNCg0KICAgICRsb2dnZXItPmRlYnVnKCJjVVJMIGZldGNoIGh0dHBfY29kZTpbJGh0dHBfY29kZV0gdXJsOlskdXJsXSAgc2l6ZTpbJHNpemVdIik7DQogICAgLy8gJGxvZ2dlci0+ZGVidWcoJGhlYWRlcik7DQogICAgLy8gJGxvZ2dlci0+ZGVidWcoJGJvZHkpOw0KDQogICAgcmV0dXJuIGFycmF5KCRodHRwX2NvZGUsICRoZWFkZXIsICRib2R5KTsNCn0NCg0KDQojIOyDgeuMgOyjvOyGjOulvCAkYmFzZSDquLDrsJjsnZgg7KCI64yA7KO87IaM66GcIOuwmO2ZmO2VnOuLpC4NCmZ1bmN0aW9uIHVybF9qb2luKCRiYXNlLCAkcmVsYXRpdmVfdXJsKQ0Kew0KICAgIC8qIHJldHVybiBpZiBhbHJlYWR5IGFic29sdXRlIFVSTCAqLw0KICAgIGlmIChwYXJzZV91cmwoJHJlbGF0aXZlX3VybCwgUEhQX1VSTF9TQ0hFTUUpICE9ICcnKSByZXR1cm4gJHJlbGF0aXZlX3VybDsNCg0KICAgIC8qIHF1ZXJpZXMgYW5kIGFuY2hvcnMgKi8NCiAgICBpZiAoJHJlbGF0aXZlX3VybFswXSA9PSAnIycgfHwgJHJlbGF0aXZlX3VybFswXSA9PSAnPycpIHJldHVybiAkYmFzZSAuICRyZWxhdGl2ZV91cmw7DQoNCiAgICAvKiBwYXJzZSBiYXNlIFVSTCBhbmQgY29udmVydCB0byBsb2NhbCB2YXJpYWJsZXM6ICRzY2hlbWUsICRob3N0LCAkcGF0aCAqLw0KICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJGJhc2UpOw0KICAgICRzY2hlbWUgPSAkcGFyc2VkWydzY2hlbWUnXTsNCiAgICAkaG9zdCA9ICRwYXJzZWRbJ2hvc3QnXTsNCiAgICAkcGF0aCA9IGlzc2V0KCRwYXJzZWRbJ3BhdGgnXSkgPyAkcGFyc2VkWydwYXRoJ10gOiAnJzsNCg0KICAgIC8qIHJlbW92ZSBub24tZGlyZWN0b3J5IGVsZW1lbnQgZnJvbSBwYXRoICovDQogICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvW14vXSokIycsICcnLCAkcGF0aCk7DQoNCiAgICAvKiBkZXN0cm95IHBhdGggaWYgcmVsYXRpdmUgdXJsIHBvaW50cyB0byByb290ICovDQogICAgaWYgKCRyZWxhdGl2ZV91cmxbMF0gPT0gJy8nKSAkcGF0aCA9ICcnOw0KDQogICAgLyogZGlydHkgYWJzb2x1dGUgVVJMICovDQogICAgJGFicyA9ICIkaG9zdCRwYXRoLyRyZWxhdGl2ZV91cmwiOw0KDQogICAgLyogcmVwbGFjZSAnLy8nIG9yICcvLi8nIG9yICcvZm9vLy4uLycgd2l0aCAnLycgKi8NCiAgICAkcmUgPSBhcnJheSgnIygvXC4/LykjJywgJyMvKD8hXC5cLilbXi9dKy9cLlwuLyMnKTsNCiAgICBmb3IgKCRuID0gMTsgJG4gPiAwOyAkYWJzID0gcHJlZ19yZXBsYWNlKCRyZSwgJy8nLCAkYWJzLCAtMSwgJG4pKSB7DQogICAgfQ0KDQogICAgLyogYWJzb2x1dGUgVVJMIGlzIHJlYWR5ISAqLw0KICAgIHJldHVybiAkc2NoZW1lIC4gJzovLycgLiAkYWJzOw0KfQ0KDQoNCiMg64uk7JaR7ZWcIOyGjOyKpOyXkOyEnCBtYWduZXQgbGlua+ulvCDssL7ripTri6QuDQojICjsi5zrj4QxKSAkc291cmNl6rCAIHVybChodHRw66GcIOyLnOyekSnsnbgg6rK97JqwIGhlYWRlcuyZgCBodG1s7J2EIOuwm+uKlOuLpC4NCiMgKOyLnOuPhDIpIOyWtOuWpCDsgqzsnbTtirjripQgbWFnbmV07J2EIOyngeygkSDrhbjstpztlZjsp4Ag7JWK6rOgIO2KueyglSB1cmzroZwg7KCR6re87ZaI7J2EIOuVjCAzMDIg7J2R64u16rO8IO2VqOq7mCBoZWFkZXLsnZggTG9jYXRpb27sl5Ag64u07JWE7IScIOuCtOugpOuztOuCtOq4sOuPhCDtlZzri6QuDQojICAgICAgICAg65Sw65287IScIGhlYWRlcuyXkOyEnCBMb2NhdGlvbiDtla3rqqnsl5AgbWFnbmV0IOunge2BrOqwgCDsnojripTsp4DrtoDthLAg7ZmV7J247ZWY64ukLg0KIyAo7Iuc64+EMykgJHNvdXJjZeqwgCB1cmzsnbQg7JWE64uI6rGw64KYIOyLnOuPhDLsl5DshJwg67Cb7J2AIGh0bWzsnbQg7J6I64qUIOqyveyasCBtYWduZXQgbGluayBwYXR0ZXJu7Jy866GcIOywvuuKlOuLpC4NCmZ1bmN0aW9uIGZpbmRfbWFnbmV0KCRzb3VyY2UpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgJGh0bWwgPSBudWxsOw0KICAgICRtYWduZXQgPSBudWxsOw0KDQogICAgaWYgKHByZWdfbWF0Y2goJy9eaHR0cC9zaScsICRzb3VyY2UsICRtYXRjaCkpIHsNCiAgICAgICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCRzb3VyY2UpOw0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15Mb2NhdGlvbjogKG1hZ25ldDouKykkL21pJywgJGhlYWRlciwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJG1hZ25ldCA9ICRtYXRjaFsxXTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCJMb2NhdGlvbiDtl6TrjZTsl5DshJwgbWFnbmV0IOunge2BrOulvCDssL7slZjsirXri4jri6Q6ICIgLiAkbWFnbmV0KTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgICRodG1sID0gJHNvdXJjZTsNCiAgICB9DQoNCiAgICBpZiAocHJlZ19tYXRjaCgnL2hyZWY9W1wnIl0/KG1hZ25ldDouKz8pW1xzXCciPl0vc2knLCAkaHRtbCwgJG1hdGNoKSkgew0KICAgICAgICAkbWFnbmV0ID0gJG1hdGNoWzFdOw0KICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygiSFRNTCDtjpjsnbTsp4Dsl5DshJwgbWFnbmV0IOunge2BrOulvCDssL7slZjsirXri4jri6Q6ICIgLiAkbWFnbmV0KTsNCiAgICB9DQoNCiAgICByZXR1cm4gJG1hZ25ldDsNCn0NCg0KDQojIHVybCDsl6zrtoAg7YyQ64uoDQpmdW5jdGlvbiBpc191cmwoJHVybCkNCnsNCiAgICByZXR1cm4gaXNzZXQocGFyc2VfdXJsKCR1cmwpWydob3N0J10pOw0KfQ0KDQoNCiMg7KCV6rec7Iud7J2EIOydtOyaqe2VnCDrs4Dqsr0g7LKY66asDQpmdW5jdGlvbiBwcmVwcm9jZXNzKCR0ZXh0LCAkcGF0dGVybnMpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgJHRleHRfYmYgPSAkdGV4dDsNCiAgICAkdGV4dF9hZiA9ICR0ZXh0Ow0KDQogICAgJGNvdW50ID0gMDsNCiAgICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkcGF0dGVybnMpOyAkaSArPSAyKSB7DQogICAgICAgICR0ZXh0X2FmID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuc1skaV0sICRwYXR0ZXJuc1skaSArIDFdLCAkdGV4dF9iZiwgLTEsICRjb3VudCk7DQogICAgICAgIGlmICgkY291bnQgPT0gMCkgew0KICAgICAgICAgICAgJGxvZ2dlci0+d2FybigncHJlZ19yZXBsYWNlIHBhdHRlcm4gaXMgbm90IGZvdW5kOiAnIC4gJHBhdHRlcm5zWyRpXSk7DQogICAgICAgICAgICAkdGV4dF9hZiA9ICR0ZXh0X2JmOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGJmX2xlbiA9IHN0cmxlbigkdGV4dF9iZik7DQogICAgICAgICAgICAkYWZfbGVuID0gc3RybGVuKCR0ZXh0X2FmKTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCJ0ZXh0IGNoYW5nZWQgZm9yICRjb3VudCB0aW1lcy4gTGVuZ3RoIG9mIEJlZm9yZSB0ZXh0IGlzICRiZl9sZW4gYW5kIGFmdGVyIHRleHQgaXMgJGFmX2xlbiIpOw0KICAgICAgICAgICAgJHRleHRfYmYgPSAkdGV4dF9hZjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICMgREVWX01PREUgJiYgJGxvZ2dlci0+ZGVidWcoKCdBRlRFUiBQQUdFIFByZXByb2Nlc3MnKTsNCiAgICAjIERFVl9NT0RFICYmICRsb2dnZXItPmRlYnVnKCgkdGV4dCk7DQoNCiAgICByZXR1cm4gJHRleHRfYWY7DQp9DQoNCg0KIyB1cmwg7KCV6rec7ZmUOiAmYW1wO+ulvCAm66GcIOuzgOqyve2VmOyXrCDrsJjtmZjtlZzri6QuDQpmdW5jdGlvbiB1cmxfbm9ybWFsaXplKCR1cmwpDQp7DQogICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHVybCk7DQp9DQoNCg0KIyDsoJXqt5zsi53snYQg7J6F66Cl67Cb7JWEIO2MjOydvOydmCDrgrTsmqnsnYQg67OA6rK97ZWc64ukLg0KZnVuY3Rpb24gZmlsZV9yZWdleF91cGRhdGUoJGZpbGVuYW1lLCAkcmVnZXhfZnIsICRyZWdleF90bykNCnsNCiAgICAkb3JpZ2luID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsNCiAgICAkdXBkYXRlZCA9IHByZWdfcmVwbGFjZSgkcmVnZXhfZnIsICRyZWdleF90bywgJG9yaWdpbik7DQogICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGVuYW1lLCAkdXBkYXRlZCk7DQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQnVzaW5lc3MgZnVuY3Rpb25zDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyB0b3JyLnBocCDtjIzsnbwg7J6Q64+Z7JeF642w7J207Yq4DQojICAtIOyekOuPmSDsl4XrjbDsnbTtirgg7ZuEIO2MjOydvOyCrOydtOymiOqwgCAw67CU7J207Yq46rCAIOuQmOuKlCDsmKTrpZjqsIAg7KKF7KKFIOuwnOyDne2VqCAtPiDri6TsmrTroZzrk5wg67Cb7J2AIO2BrOq4sOulvCDtmZXsnbgg7ZuEIOqwseyLoO2GoOuhnSDtlagNCmZ1bmN0aW9uIHNlbGZfdXBkYXRlKCkNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCg0KICAgICMg7JeF642w7J207Yq4IOyLpO2WiSDsl6zrtoAg7ZmV7J24DQogICAgaWYgKCFBVVRPX1VQREFURSkgcmV0dXJuOw0KDQogICAgIyDtlZjro6jsl5Ag7ZWc67KI66eMIOyXheuNsOydtO2KuCDssrTtgazrpbwg7ZW067O07J6QDQogICAgJHVwZGF0ZV9jaGVja19maWxlID0gc3lzX2dldF90ZW1wX2RpcigpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0b3JyLnVwZGF0ZWNoZWNrJzsNCiAgICBpZiAoQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cGRhdGVfY2hlY2tfZmlsZSkgPT0gZGF0ZSgnWW1kJykpIHJldHVybjsNCiAgICBmaWxlX3B1dF9jb250ZW50cygkdXBkYXRlX2NoZWNrX2ZpbGUsIGRhdGUoJ1ltZCcpKTsNCg0KICAgICMg7JuQ6rKpIOyggOyepeyGjOyXkOyEnCDthqDroIztirgg7IKs7J207Yq4IOygleuztCDrsJvslYTsmKTquLAgKOy9lOuTnCDrs7TslYjsnYQg7JyE7ZW0IGJhc2U2NOuhnCDsnbjsvZTrlKnrkJwg64K07Jqp7Jy866GcIOuwm+uKlOuLpCkNCiAgICBsaXN0KCRodHRwX2NvZGUsICRoZWFkZXIsICRyZW1vdGVfYmFzZTY0KSA9IGN1cmxfZmV0Y2goVVBEQVRFX1VSTCk7DQoNCiAgICBpZiAoJGh0dHBfY29kZSAhPSAyMDApIHsNCiAgICAgICAgJGxvZ2dlci0+d2Fybigi7JeF642w7J207Yq4IO2MjOydvCDri6TsmrTroZzrk5wg7Jik66WY7J6F64uI64ukLiDsnZHri7XsvZTrk5w6ICRodHRwX2NvZGUiKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgICMg7ZiE7J6sIO2MjOydvOqzvCDruYTqtZDtlZjquLANCiAgICAkbG9jYWxfYmFzZTY0ID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXykpOw0KDQogICAgaWYgKCRsb2NhbF9iYXNlNjQgIT0gJHJlbW90ZV9iYXNlNjQpIHsNCiAgICAgICAgJGxvZ2dlci0+aW5mbygidG9ycuqwgCDrs4Dqsr3rkJjslrQg7JeF642w7J207Yq466W8IOyLnOyeke2VqeuLiOuLpC4iKTsNCg0KICAgICAgICAjIO2YhOyerCDsiqTtgazrpr3tirgg7YyM7J28IOuwseyXhe2VmOq4sA0KICAgICAgICAhZmlsZV9leGlzdHMoJ2JhY2t1cCcpICYmIG1rZGlyKCdiYWNrdXAnKTsNCiAgICAgICAgJGJhY2t1cGYgPSBzcHJpbnRmKCJiYWNrdXAvJXMuJXMucGhwIiwgYmFzZW5hbWUoX19GSUxFX18sICcucGhwJyksIFZFUlNJT04pOw0KICAgICAgICBjb3B5KF9fRklMRV9fLCAkYmFja3VwZik7DQogICAgICAgICRsb2dnZXItPmluZm8oc3ByaW50Zigi7JeF642w7J207Yq4IOyghOyXkCDtmITsnqwgdG9ycuulvCDrsLHsl4XtlojsirXri4jri6Q6ICVzIC0+ICVzIiwgYmFzZW5hbWUoX19GSUxFX18pLCAkYmFja3VwZikpOw0KDQogICAgICAgICMgYmFzZTY066GcIOyduOy9lOuUqSDrkJwg7KCV67O0IO2VtOyEne2VmOq4sA0KICAgICAgICAkZGVjb2RlZF9zb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRyZW1vdGVfYmFzZTY0KTsNCg0KICAgICAgICAjIO2YhOyerCDsiqTtgazrpr3tirgg7JeF642w7J207Yq4IQ0KICAgICAgICBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJGRlY29kZWRfc291cmNlKTsgICAjIOuzgOqyveuQnCDrgrTsmqkg6riw66GdDQoNCiAgICAgICAgJGxvZ2dlci0+aW5mbygidG9ycuulvCDsl4XrjbDsnbTtirjtlojsirXri4jri6QuIOuLpOydjOuyiCDsmpTssq0g7IucIOuwmOyYgeuQqeuLiOuLpC4iKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkbG9nZ2VyLT5pbmZvKCLtmITsnqwgdG9ycuqwgCDstZzsi6Ag67KE7KCE7J6F64uI64ukLiDrgrTsnbwg64uk7IucIO2ZleyduO2VqeuLiOuLpC4iKTsNCiAgICB9DQp9DQoNCg0KIyDtjIzrnbzrr7jthLDrpbwg67aE7ISd7ZWY7JesIO2DkOyDie2VoCDqsozsi5ztjJAg7KO87IaMIOuqqeuhneydhCDsg53shLHtlZzri6QuDQpmdW5jdGlvbiBwYXJzZV9wYXJhbSgpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbG9nZ2VyLT5pbmZvKHNwcmludGYoIlBhcmFtOiBiPVslc10gaz1bJXNdIiwgaXNzZXQoJF9HRVRbJ2InXSkgPyAkX0dFVFsnYiddIDogbnVsbCwgaXNzZXQoJF9HRVRbJ2snXSkgPyAkX0dFVFsnayddIDogbnVsbCkpOw0KDQogICAgJGNvbmYgPSAkR0xPQkFMU1snQ09ORklHJ107DQogICAgJGtleXcgPSAkR0xPQkFMU1snS0VZV09SRFMnXTsNCg0KICAgICRiID0gaXNzZXQoJF9HRVRbJ2InXSkgPyB0cmltKCRfR0VUWydiJ10pIDogJ2FsbCc7DQogICAgaWYgKCFpc3NldCgkY29uZlskYl0pKSB7DQogICAgICAgICRsb2dnZXItPmVycm9yKCRfR0VUWydiJ10gLiAi64qUIOycoO2aqO2VmOyngCDslYrsnYAg6rKM7Iuc7YyQ7J6F64uI64ukLiIpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgJGJvYXJkcyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGNvbmZbJGJdIGFzICRpdGVtKSB7DQogICAgICAgIGlmIChpc191cmwoJGl0ZW0pKSB7DQogICAgICAgICAgICAkYm9hcmRzW10gPSBhcnJheSgnY2F0ZWdvcnknID0+ICRiLCAndXJsJyA9PiAkaXRlbSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3JlYWNoICgkY29uZlskaXRlbV0gYXMgJGl0ZW0yKSB7DQogICAgICAgICAgICAgICAgJGJvYXJkc1tdID0gYXJyYXkoJ2NhdGVnb3J5JyA9PiAkaXRlbSwgJ3VybCcgPT4gJGl0ZW0yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICRrID0gaXNzZXQoJF9HRVRbJ2snXSkgPyB0cmltKCRfR0VUWydrJ10pIDogJyc7DQogICAgJGtleXdvcmRzID0gaXNzZXQoJGtleXdbJGtdKSA/ICRrZXl3WyRrXSA6IGV4cGxvZGUoJ3wnLCAkayk7DQogICAgJGtleXdvcmRzID0gc3RyX3JlcGxhY2UoJyAnLCAnJTIwJywgJGtleXdvcmRzKTsNCg0KICAgIGlmIChjb3VudCgka2V5d29yZHMpID4gMSkgew0KICAgICAgICAkbG9nZ2VyLT5pbmZvKHNwcmludGYoIuuLpOykkeqygOyDiSDtgqTsm4zrk5w6ICVk6rCcICglcykiLCBjb3VudCgka2V5d29yZHMpLCBqb2luKCIsICIsICRrZXl3b3JkcykpKTsNCiAgICB9DQoNCiAgICAkZmV0Y2hfdXJscyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGJvYXJkcyBhcyAkYm9hcmQpIHsNCiAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7DQogICAgICAgICAgICAkZmV0Y2hfdXJsc1tdID0gYXJyYXkoJ2NhdGVnb3J5JyA9PiAkYm9hcmRbJ2NhdGVnb3J5J10sICd1cmwnID0+IHN0cl9yZXBsYWNlKCd7a30nLCAka2V5d29yZCwgJGJvYXJkWyd1cmwnXSkpOyAgIyDqsoDsg4nslrQo7YKk7JuM65OcKSDsobDtlakNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICRsb2dnZXItPmRlYnVnKCRmZXRjaF91cmxzKTsNCg0KICAgIHJldHVybiAkZmV0Y2hfdXJsczsNCn0NCg0KDQojIO2GoOugjO2KuCDsgqzsnbTtirgg64+E66mU7J247J2AIOyjvOq4sOyggeycvOuhnCDrs4Dqsr3rkJjquLAg65WM66y47JeQIOygkeyGjeydtCDrtojqsIDtlZwg6rK97Jqw7JeUIOuLpOydjCDrj4TrqZTsnbjsnYQg7LC+7JWE67O464ukLg0KIyDsnpHrj5kg7JuQ66asDQojICAgLSDslYTsp4Eg64+E66mU7J247J20IOyCtOyVhOyeiOyngOunjCDqs6cg67OA6rK965CgIOyYiOygleyduCDqsr3smrAg7J2R64u17Zek642U7J2YIExvY2F0aW9u7JeQIOuzgOqyveuQoCDrj4TrqZTsnbjsnYQg7J2R64u17ZWY64qUIOqyveyasOqwgCDsnojsnYwNCiMgICAtIOuPhOuplOyduOyXkCDsnbzroKjrsojtmLjqsIAg7J6I64qUIOqyveyasCDrsojtmLjrpbwg7Kad6rCA7Iuc7YKk66m07IScIOuLpOydjOuyiCDrj4TrqZTsnbjsnYQg7LC+7JWE67O464ukLiAg7JiIKSB3d3cudG9ycmVudGRpYTIuY29tID4gd3d3LnRvcnJlbnRkaWEzLmNvbQ0KIyAgIC0g67OA6rK965CcIOuPhOuplOyduOydgCBVc2VyQ29uZmlnLnBocOyXkCDquLDroZ3tlbTrkZDqs6Ag64uk7J2M67aA7YSw64qUIO2VtOuLuSDsoJXrs7Trpbwg7IKs7JqpDQojIOuzgOqyvSDsiJzshJwNCiMgICAxKSBVc2VyQ29uZmlnLnBocOyXkCDrs4Dqsr3soITtm4Qg64+E66mU7J24IOygleuztOqwgCDsnojri6TrqbQg7ZW064u5IOuPhOuplOyduCDsgqzsmqkNCiMgICAyLTEpIOuPhOuplOyduOydtCDsnKDtmqjtlZzsp4Ag7Iuk7KCc66GcIOygkeyGjeydhCDsi5zrj4TtlZjsl6wg7KCQ6rKAIO2bhCBMb2NhdGlvbiDtl6TrjZTqsIAg7J6I64uk66m0IOuPhOuplOyduCDrs4Dqsr0NCiMgICAyLTIpIGh0dHAg7J2R64u17L2U65Oc6rCAIOygleyDgSgyMDAp7J20IOyVhOuLiOudvOuptCDrj4TrqZTsnbjsl5Ag7Y+s7ZWo65CcIOydvOugqOuyiO2YuOulvCDspp3qsIDsi5ztgqTrqbTshJwg64uk7J2MIOuPhOuplOyduCDqsoDsg4kNCiMgICAzKSDrs4Dqsr0g7KCV67O066W8IFVzZXJDb25maWcucGhw7JeQIOq4sOuhnQ0KIyANCmZ1bmN0aW9uIHVwZGF0ZV9kb21haW4oJGJvYXJkX3VybHMpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgZ2xvYmFsICRPTERfRE9NQUlOLCAkTkVXX0RPTUFJTjsNCg0KICAgICMgMS4g7LKr67KI7Ke4IHVybOyXkOyEnCDrj4TrqZTsnbgg7KCV67O0IOy2lOy2nA0KICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJGJvYXJkX3VybHNbMF1bJ3VybCddKTsNCiAgICAkY3VycmVudF9kb21haW4gPSAkcGFyc2VkWydob3N0J107ICAgIyAkQ09ORklH7JeQIOq4sOuhneuQnCDrj4TrqZTsnbgNCiAgICAkY2hhbmdlZF9kb21haW4gPSAkY3VycmVudF9kb21haW47ICAgIyDstZzsooUg67OA6rK965CcIOuPhOuplOyduA0KDQogICAgJGxvZ2dlci0+ZGVidWcoIlwkY3VycmVudF9kb21haW4gPSAkY3VycmVudF9kb21haW4iKTsNCg0KICAgICMgMi4gVXNlckNvbmZpZy5waHDsl5Ag6riw66Gd65CcIOuzgOqyveyghOuPhOuplOyduCgkT0xEX0RPTUFJTinqs7wg7J287LmY7ZWc64uk66m0IOuPhOuplOyduCDrs4Dqsr0g7LKY66asDQogICAgaWYgKGlzc2V0KCRPTERfRE9NQUlOKSAmJiAkT0xEX0RPTUFJTiA9PSAkY3VycmVudF9kb21haW4pIHsNCiAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gJE5FV19ET01BSU47DQogICAgICAgICRsb2dnZXItPmRlYnVnKCJVc2VyQ29uZmlnLnBocCDtjIzsnbzsnZggTkVXX0RPTUFJTiDsoJXrs7Trpbwg7IKs7Jqp7ZWoOiAkTkVXX0RPTUFJTiIpOw0KICAgIH0NCg0KICAgICMgMy4g7Iuk7KCcIGZldGNo7ZWY7JesIOuPhOuplOyduOydtCDrs4Dqsr3rkJDripTsp4Ag7ZmV7J24DQogICAgJGNoZWNrX3VybCA9ICRwYXJzZWRbInNjaGVtZSJdIC4gJzovLycgLiAkY2hhbmdlZF9kb21haW47DQogICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCRjaGVja191cmwpOw0KDQogICAgIyBMb2NhdGlvbiDtl6TrjZTqsIAg7J6I64uk64qUIOqyg+ydgCDrj4TrqZTsnbjsnbQg67OA6rK965CQ64uk64qUIOucuw0KICAgIGlmIChwcmVnX21hdGNoKCcvXkxvY2F0aW9uOiAoLispJC9taScsICRoZWFkZXIsICRtYXRjaCkpIHsNCiAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gcGFyc2VfdXJsKCRtYXRjaFsxXSlbJ2hvc3QnXTsNCiAgICAgICAgJGxvZ2dlci0+aW5mbygiTG9jYXRpb24g7Zek642U7JeQ7IScIOyLoOq3nCDrj4TrqZTsnbjsnYQg7LC+7JWY7Iq164uI64ukOiAiIC4gJGNoYW5nZWRfZG9tYWluKTsNCiAgICB9DQoNCiAgICAjIOq3uCDsmbgg7KCV7IOBIOydkeuLteydhCDrqrvrsJvsnYAg6rK97Jqw7JeUIOuPhOuplOyduOyXkCDsnojripQg7J2866Co67KI7Zi466W8IOywvuyVhCDtlZjrgpjslKkg7Kad6rCA7ZWY66m07IScIOuPhOuplOyduOydhCDssL7slYTrs7jri6QuDQogICAgIyDsmIgpIGh0dHBzOi8vdG9ycmVudHZpZXczOC5jb20vID0+IDM47J2EIDM5LCA0MCDrk7HsnLzroZwg67OA6rK97ZWY66m07IScIOyDiOuhnOyatCDrj4TrqZTsnbjsnYQg7LC+64qU64ukLg0KICAgIGVsc2UgaWYgKCRodHRwX2NvZGUgIT0gMjAwKSB7DQogICAgICAgICRuZXdfZG9tYWluX2ZvdW5kZWQgPSBmYWxzZTsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eKC4rPykoW1xkXXsxLDN9KShcLi4rKSQvJywgJGNoYW5nZWRfZG9tYWluLCAkbWF0Y2gpKSB7DQogICAgICAgICAgICAkZG9tYWluXzAxID0gJG1hdGNoWzFdOw0KICAgICAgICAgICAgJGRvbWFpbl8wMiA9IGludHZhbCgkbWF0Y2hbMl0pOw0KICAgICAgICAgICAgJGRvbWFpbl8wMyA9ICRtYXRjaFszXTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yKCRpPTA7ICRpPDEwOyAkaSsrKSB7DQogICAgICAgICAgICAgICAgJGRvbWFpbl8wMisrOw0KICAgICAgICAgICAgICAgICR0cnlfZG9tYWluID0gICRkb21haW5fMDEgLiAkZG9tYWluXzAyIC4gJGRvbWFpbl8wMzsNCiAgICAgICAgICAgICAgICAkdHJ5X3VybCA9ICRwYXJzZWRbInNjaGVtZSJdIC4gJzovLycgLiAkdHJ5X2RvbWFpbjsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBsaXN0KCRodHRwX2NvZGUyLCAkaGVhZGVyMiwgJGh0bWwyKSA9IGN1cmxfZmV0Y2goJHRyeV9kb21haW4pOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlRyaWVkIHRvIGNoZWNrIGlmICR0cnlfdXJsIGlzIGFsaXZlLiBhbmQgaHR0cF9jb2RlIGlzICRodHRwX2NvZGUyIik7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRodHRwX2NvZGUyID09IDIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkbmV3X2RvbWFpbl9mb3VuZGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gJHRyeV9kb21haW47DQogICAgICAgICAgICAgICAgICAgICRsb2dnZXItPmluZm8oIuuzgOqyveuQnCDrj4TrqZTsnbjsnYQg7LC+7JWY7Iq164uI64ukOiAiIC4gJGNoYW5nZWRfZG9tYWluKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkbmV3X2RvbWFpbl9mb3VuZGVkKSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcigidG9ycmVudCDsgqzsnbTtirggWyRjdXJyZW50X2RvbWFpbl0g6rCAKOydtCkg7KO97J2AIOuTryDtlanri4jri6QuIOyiheujjO2VqeuLiOuLpC4iKTsNCiAgICAgICAgICAgIGVycm9yX3Jlc3BvbnNlKCJ0b3JyZW50IOyCrOydtO2KuCBbJGN1cnJlbnRfZG9tYWluXSDqsIAo7J20KSDso73snYAg65OvIO2VqeuLiOuLpC4g7KKF66OM7ZWp64uI64ukLiIpOw0KICAgICAgICAgICAgc2VsZl91cGRhdGUoKTsNCiAgICAgICAgICAgIGV4aXQoMCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIDQuIHVybCDrqqnroZ3sl5DshJwg64+E66mU7J24IOuzgOqyvQ0KICAgIGlmICgkY3VycmVudF9kb21haW4gIT0gJGNoYW5nZWRfZG9tYWluKSB7DQogICAgICAgIGZvcmVhY2ggKCRib2FyZF91cmxzIGFzICYkYnVybCkgew0KICAgICAgICAgICAgJGJ1cmxbJ3VybCddID0gc3RyX3JlcGxhY2UoJGN1cnJlbnRfZG9tYWluLCAkY2hhbmdlZF9kb21haW4sICRidXJsWyd1cmwnXSk7DQogICAgICAgIH0NCg0KICAgICAgICAkbG9nZ2VyLT5pbmZvKCLrj4TrqZTsnbjsnYQg67OA6rK97ZWp64uI64ukOiAiIC4gJGN1cnJlbnRfZG9tYWluIC4gIiAgPiAgIiAuICRjaGFuZ2VkX2RvbWFpbik7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCRib2FyZF91cmxzKTsNCiAgICB9DQoNCiAgICAjIDUuIFVzZXJDb25maWfsl5Ag67OA6rK965CcIOuPhOuplOyduCDsoJXrs7Qg6riw66GdDQogICAgaWYgKCRjdXJyZW50X2RvbWFpbiAhPSAkY2hhbmdlZF9kb21haW4pIHsNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygnVXNlckNvbmZpZy5waHAnKSkgew0KICAgICAgICAgICAgJGNvbnRlbnRzID0gIjw/UEhQXG5cblwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nO1xuXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbic7XG4iOw0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgJGNvbnRlbnRzKTsNCiAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlVzZXJDb25maWcucGhw7JeQIOuzgOqyveuQnCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqCIpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICBpZiAoIWlzc2V0KCRPTERfRE9NQUlOKSkgew0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgIlxuXCRPTERfRE9NQUlOID0gJyRjdXJyZW50X2RvbWFpbic7XG4iLCBGSUxFX0FQUEVORCk7DQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJVc2VyQ29uZmlnLnBocOyXkCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqDogXCRPTERfRE9NQUlOID0gJyRjdXJyZW50X2RvbWFpbiciKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICgkT0xEX0RPTUFJTiAhPSAkY3VycmVudF9kb21haW4pIHsNCiAgICAgICAgICAgIGZpbGVfcmVnZXhfdXBkYXRlKCdVc2VyQ29uZmlnLnBocCcsICcvXlwkT0xEX0RPTUFJTiA9IC4rL2ltJywgIlwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nOyIpOw0KICAgICAgICAgICAgJGxvZ2dlci0+aW5mbygiVXNlckNvbmZpZy5waHDsl5Ag64+E66mU7J24IOygleuztOulvCDqsLHsi6Dtlag6IFwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nIik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWlzc2V0KCRORVdfRE9NQUlOKSkgew0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgIlxuXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbic7XG4iLCBGSUxFX0FQUEVORCk7DQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJVc2VyQ29uZmlnLnBocOyXkCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqDogXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbiciKTsNCiAgICAgICAgfSANCiAgICAgICAgZWxzZSBpZiAoJE5FV19ET01BSU4gIT0gJGNoYW5nZWRfZG9tYWluKSB7DQogICAgICAgICAgICBmaWxlX3JlZ2V4X3VwZGF0ZSgnVXNlckNvbmZpZy5waHAnLCAnL15cJE5FV19ET01BSU4gPSAuKy9pbScsICJcJE5FV19ET01BSU4gPSAnJGNoYW5nZWRfZG9tYWluJzsiKTsNCiAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlVzZXJDb25maWcucGhw7JeQIOuPhOuplOyduCDsoJXrs7Trpbwg6rCx7Iug7ZWoOiBcJE5FV19ET01BSU4gPSAnJGNoYW5nZWRfZG9tYWluJyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuICRib2FyZF91cmxzOw0KfQ0KDQoNCiMg7Yag66CM7Yq4IOqyjOyLnO2MkOuTpOyXkOyEnCDslYTsnbTthZwo7KCc66qpLCDtjpjsnbTsp4Drp4Htgawp66W8IOy2lOy2nO2VnOuLpC4NCmZ1bmN0aW9uIGdldF9pdGVtcygkYm9hcmRfdXJscykNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCg0KICAgICRzZWxmID0gJ2h0dHAnIC4gKGlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSA/ICdzJyA6ICcnKSAuICc6Ly8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gcGFyc2VfdXJsKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKVsncGF0aCddOw0KICAgICRwYXR0ZXJuID0gJEdMT0JBTFNbJ0NPTkZJRyddWydfcGFnZV9saW5rJ107DQogICAgJHJlcGxhY2VfcGF0dGVybnMgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19wYWdlX2xpbmtfcHJlcHJvY2VzcyddOw0KICAgICRpc19tYWduZXQgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19kb3duX2xpbmsnXSA9PSAnbWFnbmV0JzsNCiAgICAkaXRlbXMgPSBhcnJheSgpOw0KDQogICAgJGJjbnQgPSAwOw0KDQogICAgZm9yZWFjaCAoJGJvYXJkX3VybHMgYXMgJGJ1cmwpIHsNCiAgICAgICAgJGJjbnQrKzsNCiAgICAgICAgJHVybCA9ICRidXJsWyd1cmwnXTsNCiAgICAgICAgJGNhdGVnb3J5ID0gJGJ1cmxbJ2NhdGVnb3J5J107DQoNCiAgICAgICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCR1cmwpOw0KDQogICAgICAgIGlmICgkaHR0cF9jb2RlICE9IDIwMCkgew0KICAgICAgICAgICAgJGxvZ2dlci0+ZXJyb3IoIkVycm9yLiBGZXRjaCBmcm9tICR1cmwgcmV0dXJuZWQgaHR0cF9jb2RlICRodHRwX2NvZGUiKTsNCiAgICAgICAgICAgICRsb2dnZXItPmVycm9yKCRoZWFkZXIpOw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCg0KICAgICAgICAjIGh0bWwg64K07Jqp7J2YIOydvOu2gOulvCDrr7jrpqwg67OA6rK9DQogICAgICAgIGlmICgkcmVwbGFjZV9wYXR0ZXJucykgew0KICAgICAgICAgICAgJGh0bWwgPSBwcmVwcm9jZXNzKCRodG1sLCAkcmVwbGFjZV9wYXR0ZXJucyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygnSFRNTOydhCDsoITsspjrpqwg67OA6rK97ZWY7KeAIOyViuyKteuLiOuLpC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkaHRtbCwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKTsNCg0KICAgICAgICAkY250ID0gMDsNCg0KICAgICAgICBmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsNCg0KICAgICAgICAgICAgJGNudCsrOw0KDQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygkbWF0Y2gpOw0KDQogICAgICAgICAgICAjIOygnOuqqeyXkCDtj6ztlajrkJwgaHRtbCDtg5zqt7jsmYAg7JWe65KkIOqzteuwseydhCDsoJzqsbDtlZzri6QuDQogICAgICAgICAgICAkdGl0bGUgPSB0cmltKGh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKCRtYXRjaFsndGl0bGUnXSkpLCAiIFx0XG5cclwwXHgwQlx4QzJceEEwIik7ICAgICMgJm5ic3A764qUIFx4QzJceEEw66GcIOuzgO2ZmOuQnOuLpC4NCg0KICAgICAgICAgICAgIyBVUkwg67O07KCVOiDsoIjrjIAg7KO87IaM66GcIOuzgOqyvSDtm4Qg7L+866as66y47J6Q7Je07JeQICcmYW1wOyfripQgJyYn66GcIOuzgOqyve2VnOuLpC4NCiAgICAgICAgICAgICRwYWdlID0gdXJsX2pvaW4oJHVybCwgdXJsX25vcm1hbGl6ZSgkbWF0Y2hbJ2xpbmsnXSkpOw0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIk5vcm1hbGl6ZWQgdXJsIGlzICRwYWdlIik7DQoNCiAgICAgICAgICAgIGlmICgkaXNfbWFnbmV0KSB7DQogICAgICAgICAgICAgICAgIyDrp4jqt7jrhLcg66eB7YGs6rmM7KeAIOyImOynke2WiOuLpOuptCDqt7jqsbgg7IKs7Jqp7ZWY6rOgIOq3uOugh+yngCDslYrsnLzrqbQg6rCc67OEIO2OmOydtOyngOuhnCDrk6TslrTqsIDshJwg66eI6re464S3IOunge2BrOulvCDssL7ripTri6QuDQogICAgICAgICAgICAgICAgJGxpbmsgPSBpc3NldCgkbWF0Y2hbJ21hZ25ldCddKSA/ICRtYXRjaFsnbWFnbmV0J10gOiBnZXRfbWFnbmV0X2xpbmsoJHBhZ2UpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkbGluayA9ICRzZWxmIC4gJz9kPScgLiBiYXNlNjRfZW5jb2RlKCRwYWdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRpdGVtc1tdID0gYXJyYXkoJ3RpdGxlJyA9PiAkdGl0bGUsICdsaW5rJyA9PiAkbGluaywgJ3BhZ2UnID0+ICRwYWdlLCAnY2F0ZWdvcnknID0+ICRjYXRlZ29yeSk7DQoNCiAgICAgICAgICAgICMgaWYgKCRjbnQgPj0gMykgYnJlYWs7ICAjIFRvZG8g6rCc67CcIOyZhOujjCDtm4Qg7KO87ISd7LKY66as7ZW07JW8IO2VqA0KICAgICAgICB9DQoNCiAgICAgICAgJGxvZ2dlci0+aW5mbyhzcHJpbnRmKCJbJWQvJWRdICVk6rG07J2YIOqysOqzvOulvCDssL7slZjsirXri4jri6QuIOqygOyDiVVSTDogJXMiLCAkYmNudCwgY291bnQoJGJvYXJkX3VybHMpLCAkY250LCAkdXJsKSk7DQogICAgfQ0KDQogICAgJGxvZ2dlci0+ZGVidWcoJGl0ZW1zKTsNCg0KICAgIHJldHVybiAkaXRlbXM7DQp9DQoNCg0KIyDsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slYTrs7Tqs6Ag7JeG7Jy866m0IHVybOyXkOyEnCDssL7slYQg67CY7ZmY7ZWc64ukLg0KZnVuY3Rpb24gZ2V0X21hZ25ldF9saW5rKCR1cmwpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbWFnbmV0ID0gbnVsbDsNCiAgICAkcmVwbGFjZV9wYXR0ZXJucyA9ICRHTE9CQUxTWydDT05GSUcnXVsnX2Rvd25fbGlua19wcmVwcm9jZXNzJ107DQoNCiAgICAjIOuniOq3uOuEtyDsupDsi5zsl5DshJwg66eB7YGs66W8IOywvuyVhOuzuOuLpC4NCiAgICBpZiAoJG1hZ25ldCA9IG1hZ25ldF9jYWNoZV9jb250cm9sKCdRdWVyeScsICR1cmwpKSB7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCLsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slZjsirXri4jri6QuIik7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCLsmpTssq1VUkw6ICR1cmwiKTsNCiAgICAgICAgJGxvZ2dlci0+ZGVidWcoIk1hZ25ldDogJG1hZ25ldCIpOw0KICAgICAgICByZXR1cm4gJG1hZ25ldDsNCiAgICB9DQoNCiAgICAjIOybue2OmOydtOyngOyXkOyEnCDrp4jqt7jrhLcg66eB7YGs66W8IOywvuuKlOuLpC4NCiAgICBsaXN0KCRodHRwX2NvZGUsICRoZWFkZXIsICRodG1sKSA9IGN1cmxfZmV0Y2goJHVybCk7DQogICAgaWYgKCRodHRwX2NvZGUgIT0gMjAwKSB7DQogICAgICAgICRsb2dnZXItPmVycm9yKCJFcnJvci4gRmV0Y2hpbmcgcGFnZSBmcm9tICR1cmwgcmV0dXJuZWQgaHR0cF9jb2RlICRodHRwX2NvZGUiKTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgIyBodG1sIOuCtOyaqeydmCDsnbzrtoDrpbwg66+466asIOuzgOqyvQ0KICAgIGlmICgkcmVwbGFjZV9wYXR0ZXJucykgew0KICAgICAgICAkaHRtbCA9IHByZXByb2Nlc3MoJGh0bWwsICRyZXBsYWNlX3BhdHRlcm5zKTsgDQogICAgfQ0KDQogICAgJG1hZ25ldCA9IGZpbmRfbWFnbmV0KCRodG1sKTsNCg0KICAgIGlmICghJG1hZ25ldCAmJiAkR0xPQkFMU1snQ09ORklHJ11bJ19tYWduZXRfZm9sbG93X2xpbmsnXSkgew0KDQogICAgICAgIC8vICRsb2dnZXItPmRlYnVnKCRodG1sKTsNCg0KICAgICAgICAkcGF0dGVybiA9ICRHTE9CQUxTWydDT05GSUcnXVsnX21hZ25ldF9mb2xsb3dfbGluayddOw0KICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygiX21hZ25ldF9mb2xsb3dfbGlua+ulvCDssL7slYTrtIXri4jri6Q6ICRwYXR0ZXJuIik7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCRwYXR0ZXJuLCAkaHRtbCwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIl9tYWduZXRfZm9sbG93X2xpbmvrpbwg7LC+7JWY7Iq164uI64ukOiAiIC4gJG1hdGNoWyd1cmwnXSk7DQoNCiAgICAgICAgICAgICRmb2xsb3dfdXJsID0gdXJsX2pvaW4oJHVybCwgJG1hdGNoWyd1cmwnXSk7DQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1Zygn66eI6re464S3IOunge2BrOulvCDssL7quLDsnITtlbQg64uk7J2MIO2OmOydtOyngOuhnCDsnbTrj5ntlanri4jri6QuICcgLiAkZm9sbG93X3VybCk7DQoNCiAgICAgICAgICAgICRtYWduZXQgPSBmaW5kX21hZ25ldCgkZm9sbG93X3VybCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcign7Jik66WYISBfbWFnbmV0X2ZvbGxvd19saW5rIO2MqO2EtOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC4nKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICMg66eI6re464S3IOy6kOyLnOyXkCDrp4Htgazrpbwg7JeF642w7J207Yq47ZWc64ukLg0KICAgICRtYWduZXQgJiYgbWFnbmV0X2NhY2hlX2NvbnRyb2woJ1VwZGF0ZScsICR1cmwsICRtYWduZXQpOw0KDQogICAgIyDrp4jqt7jrhLcg66eB7YGs66W8IOuwmO2ZmO2VnOuLpC4NCiAgICByZXR1cm4gJG1hZ25ldDsNCn0NCg0KDQojIOuniOq3uOuEtyDrp4HtgazsnZgg7LqQ7Iuc66W8IOq0gOumrO2VnOuLpC4gKOyhsO2ajCwg7LaU6rCALCDsoIDsnqUsIOyYpOuemOuQnCDrjbDsnbTtg4Ag7IKt7KCcKQ0KZnVuY3Rpb24gbWFnbmV0X2NhY2hlX2NvbnRyb2woJGFjdGlvbiwgJHVybCA9IG51bGwsICRtYWduZXQgPSBudWxsKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgc3RhdGljICRtYWduZXRfY2FjaGUgPSAnTi9BJywgJGNhY2hlX2ZpbGUgPSBudWxsLCAkY2FjaGVfdXBkYXRlZCA9IGZhbHNlOw0KICAgICRrZXkgPSBudWxsOw0KDQogICAgIyB1cmzsl5DshJwg6rKM7Iuc66y8IOqzoOycoOuyiO2YuCjsiKvsnpAgNOyekOumrCDsnbTsg4Ep7JmAIOy6kOyLnO2MjOydvOuqheydhCDssL7ripTri6QuDQogICAgaWYgKCR1cmwpIHsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9cZFxkXGRcZCsvJywgJHVybCwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJGtleSA9ICRtYXRjaFswXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNhY2hlX2ZpbGUgPT0gbnVsbCkgew0KICAgICAgICAgICAgJGhvc3QgPSBwYXJzZV91cmwoJHVybClbJ2hvc3QnXTsNCiAgICAgICAgICAgICRjYWNoZV9maWxlID0gc3lzX2dldF90ZW1wX2RpcigpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0b3JyLicgLiAkaG9zdCAuICcuY2FjaGUnOw0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIuy6kOyLnO2MjOydvOydgCAkY2FjaGVfZmlsZSDsnoXri4jri6QuIik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIOy6kOyLnOyXkOyEnCDrp4jqt7jrhLcg66eB7YGsIOyhsO2ajA0KICAgIGlmICgkYWN0aW9uID09ICdRdWVyeScpIHsNCiAgICAgICAgIyDrp4jqt7jrhLcg7LqQ7Iuc6rCAIOuEkOydtOuptCDtjIzsnbzsl5DshJwg7J297Ja065Ok7J2464ukLg0KICAgICAgICBpZiAoJG1hZ25ldF9jYWNoZSA9PSAnTi9BJykgew0KICAgICAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJGNhY2hlX2ZpbGUpOw0KICAgICAgICAgICAgaWYgKCRjb250ZW50ICE9IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgJG1hZ25ldF9jYWNoZSA9IHVuc2VyaWFsaXplKCRjb250ZW50KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJG1hZ25ldF9jYWNoZSA9IGFycmF5KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zsl5DshJwga2V5IOyhsO2ajA0KICAgICAgICBpZiAoaXNzZXQoJG1hZ25ldF9jYWNoZVska2V5XSkpIHsNCiAgICAgICAgICAgICRtYWduZXQgPSAkbWFnbmV0X2NhY2hlWyRrZXldWydtYWduZXQnXTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCLsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slZjsirXri4jri6QuIGtleT1bJGtleV0gbWFnbmV0PVskbWFnbmV0XSIpOw0KICAgICAgICAgICAgcmV0dXJuICRtYWduZXQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIOy6kOyLnOyXkCDrp4jqt7jrhLcg66eB7YGsIOy2lOqwgA0KICAgIGVsc2VpZiAoJGFjdGlvbiA9PSAnVXBkYXRlJykgew0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zqsIAg64SQ7J2066m0IOyYpOulmCDsspjrpqztlZzri6QuDQogICAgICAgIGlmICgkbWFnbmV0X2NhY2hlID09ICdOL0EnKSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcigiRXJyb3IuIOuniOq3uOuEtyDsupDsi5zqsIAg7IOd7ISx65CY7KeAIOyViuyVhCBVcGRhdGUg7LKY66as66W8IO2VoCDsiJgg7JeG7Iq164uI64ukLiIpOw0KICAgICAgICAgICAgc2VsZl91cGRhdGUoKTsNCiAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgIH0NCg0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zsl5Aga2V5LCBtYWduZXQg7LaU6rCADQogICAgICAgICRtYWduZXRfY2FjaGVbJGtleV0gPSBhcnJheSgnbWFnbmV0JyA9PiAkbWFnbmV0LCAnaW5zZXJ0ZWQnID0+IHRpbWUoKSk7DQogICAgICAgICRjYWNoZV91cGRhdGVkID0gdHJ1ZTsNCiAgICB9DQoNCiAgICAjIOy6kOyLnOulvCDtjIzsnbzroZwg7KCA7J6lDQogICAgZWxzZWlmICgkYWN0aW9uID09ICdXcml0ZScpIHsNCiAgICAgICAgaWYgKCRjYWNoZV91cGRhdGVkKSB7DQogICAgICAgICAgICAjIOqyveufiSDsupDsi5wg7Jyg7KeA66W8IOychO2VtCDsnbzsoJXsnbwg7J207IOBIOqyveqzvO2VnCDrjbDsnbTtg4DripQg7IKt7KCc7ZWc64ukLg0KICAgICAgICAgICAgJGRlbGV0ZWQgPSAwOw0KICAgICAgICAgICAgZm9yZWFjaCAoJG1hZ25ldF9jYWNoZSBhcyAka2V5ID0+ICRpdGVtKSB7DQogICAgICAgICAgICAgICAgaWYgKCRpdGVtWydpbnNlcnRlZCddICsgKE1BR05FVF9DQUNIRV9DT05TRVJWRV9EQVlTICogNjAgKiA2MCAqIDI0KSA8IHRpbWUoKSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkbWFnbmV0X2NhY2hlWyRrZXldKTsNCiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZGVsZXRlZCA+IDAgJiYgJGxvZ2dlci0+ZGVidWcoIkRlbGV0ZWQgJGRlbGV0ZWQgY2FjaGUgaXRlbXMuIik7DQoNCiAgICAgICAgICAgICMg7LqQ7IucIOyggOyepQ0KICAgICAgICAgICAgJGNvbnRlbnQgPSBzZXJpYWxpemUoJG1hZ25ldF9jYWNoZSk7DQogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkY2FjaGVfZmlsZSwgJGNvbnRlbnQpOw0KICAgICAgICAgICAgJGNhY2hlX3VwZGF0ZWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQojIO2GoOugjO2KuCDslYTsnbTthZwo7KCc66qpLCDtjpjsnbTsp4Drp4Htgawp7Jy866GcIHJzc+ulvCDsg53shLHtlZzri6QuDQpmdW5jdGlvbiBidWlsZF9yc3MoJGl0ZW1zKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgJHNlbGYgPSAnaHR0cCcgLiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pID8gJ3MnIDogJycpIC4gJzovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCg0KICAgICRiID0gaXNzZXQoJF9HRVRbJ2InXSkgPyB0cmltKCRfR0VUWydiJ10pIDogJyc7DQogICAgJGsgPSBpc3NldCgkX0dFVFsnayddKSA/IHRyaW0oJF9HRVRbJ2snXSkgOiAnJzsNCiAgICBpZiAoJGIgPT0gJycgJiYgJGsgPT0gJycpIHsNCiAgICAgICAgJHRpdGxlID0gIkl0J3MgdG9yciEiOw0KICAgIH0gZWxzZSB7DQogICAgICAgICR0aXRsZSA9ICJJdCdzIHRvcnIhICgiIC4gKCRiID8gJGIgLiAiOiAiIDogIiIpIC4gKCRrID8gJGsgOiAiQWxsIikgLiAiKSI7DQogICAgfQ0KDQogICAgJHJzcyAgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuPHJzcyB2ZXJzaW9uPVwiMi4wXCI+XG4iOw0KICAgICRyc3MgLj0gIjxjaGFubmVsPjx0aXRsZT4kdGl0bGU8L3RpdGxlPjxsaW5rPiIgLiBodG1sZW50aXRpZXMoJHNlbGYpIC4gIjwvbGluaz48ZGVzY3JpcHRpb24+QSBzaW1wbGUgdG9ycmVudCBmZWVkIGJ5IHRvcnIuPC9kZXNjcmlwdGlvbj5cbiI7DQogICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7DQogICAgICAgIGlmICgkaXRlbVsnbGluayddKSB7DQogICAgICAgICAgICAkcnNzIC49ICI8aXRlbT48dGl0bGU+PCFbQ0RBVEFbIiAuICRpdGVtWyd0aXRsZSddIC4gIl1dPjwvdGl0bGU+PGxpbms+IiAuIGh0bWxlbnRpdGllcygkaXRlbVsnbGluayddKSAuICI8L2xpbms+IjsNCiAgICAgICAgICAgICRyc3MgLj0gIjxjb21tZW50cz48IVtDREFUQVsiIC4gaHRtbGVudGl0aWVzKCRpdGVtWydwYWdlJ10pIC4gIl1dPjwvY29tbWVudHM+PGNhdGVnb3J5PjwhW0NEQVRBWyIgLiAkaXRlbVsnY2F0ZWdvcnknXSAuICJdXT48L2NhdGVnb3J5PjwvaXRlbT5cbiI7DQogICAgICAgIH0NCiAgICB9DQogICAgJHJzcyAuPSAiPC9jaGFubmVsPlxuPC9yc3M+IjsNCg0KICAgICRsb2dnZXItPmluZm8oIlJTU+ulvCDsg53shLHtlojsirXri4jri6QuIOqxtOyImDogIiAuIGNvdW50KCRpdGVtcykpOw0KICAgICRsb2dnZXItPmRlYnVnKCRyc3MpOw0KDQogICAgcmV0dXJuICRyc3M7DQp9DQoNCg0KIyDtgbTrnbzsnbTslrjtirjroZwgcnNz66W8IOyghOyGoe2VnOuLpC4NCmZ1bmN0aW9uIHJlc3BvbnNlKCRkYXRhKQ0Kew0KICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yc3MreG1sOyBjaGFyc2V0PXV0Zi04Jyk7DQogICAgZWNobyAkZGF0YTsNCn0NCg0KIyDtgbTrnbzsnbTslrjtirjroZwg7Jik66WYIOuplOyLnOyngOulvCDsoITshqHtlZzri6QuDQpmdW5jdGlvbiBlcnJvcl9yZXNwb25zZSgkZGF0YSkNCnsNCiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcpOw0KICAgIGVjaG8gJGRhdGE7DQp9DQoNCg0KIyDthqDroIztirggcnNzIOyalOyyreydhCDsspjrpqztlZzri6QuDQpmdW5jdGlvbiBtYWtlX3JzcygpDQp7DQogICAgJGJvYXJkX3VybHMgPSBwYXJzZV9wYXJhbSgpOw0KDQogICAgJGNvbmZpcm1lZF91cmxzID0gdXBkYXRlX2RvbWFpbigkYm9hcmRfdXJscyk7ICAjIOuPhOuplOyduCDrs4Dqsr0g7LKY66asDQoNCiAgICAkdG9ycmVudF9pdGVtcyA9IGdldF9pdGVtcygkY29uZmlybWVkX3VybHMpOw0KDQogICAgJHJzcyA9IGJ1aWxkX3JzcygkdG9ycmVudF9pdGVtcyk7DQoNCiAgICBtYWduZXRfY2FjaGVfY29udHJvbCgnV3JpdGUnKTsgICMg66eI6re464S3IOy6kOyLnCDrlJTsiqTtgawg6riw66GdDQoNCiAgICByZXNwb25zZSgkcnNzKTsNCn0NCg0KDQojIO2GoOugjO2KuCDtjIzsnbwoLnRvcnJlbnQp7J2EIOuLpOyatOuhnOuTnO2VnOuLpC4NCmZ1bmN0aW9uIGRvd25sb2FkX3RvcnJlbnQoJGxpbmspDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbG9nZ2VyLT5kZWJ1ZygiRG93bmxvYWRpbmcgdG9ycmVudCBmaWxlIGZyb20gJGxpbmsiKTsNCg0KICAgIGxpc3QoJGh0dHBfY29kZSwgJGhlYWRlciwgJGJvZHkpID0gY3VybF9mZXRjaCgkbGluayk7DQoNCiAgICBpZiAoJGh0dHBfY29kZSAhPSAyMDApIHsNCiAgICAgICAgJGxvZ2dlci0+ZXJyb3IoIkVycm9yLiBEb3dubG9hZCB0b3JyZW50IGZpbGUgZnJvbSAkbGluayByZXR1cm5lZCBodHRwX2NvZGUgJGh0dHBfY29kZSIpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKHByZWdfbWF0Y2goJy9eQ29udGVudC1EaXNwb3NpdGlvbjouKyQvbWknLCAkaGVhZGVyLCAkbWF0Y2gpKSB7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQiKTsNCiAgICAgICAgaGVhZGVyKHRyaW0oJG1hdGNoWzBdKSk7DQogICAgICAgIGVjaG8gJGJvZHk7DQogICAgfQ0KfQ0KDQoNCiMg7Ju57Y6Y7J207KeA7JeQ7IScIO2GoOugjO2KuCDtjIzsnbwg66eB7YGs66W8IOywvuyVhCDri6TsmrTroZzrk5ztlZzri6QuDQpmdW5jdGlvbiBkb19kb3dubG9hZCgkdXJsKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgJHJlcGxhY2VfcGF0dGVybnMgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19kb3duX2xpbmtfcHJlcHJvY2VzcyddOw0KICAgIGxpc3QoJGh0dHBfY29kZSwgJGhlYWRlciwgJGh0bWwpID0gY3VybF9mZXRjaCgkdXJsKTsNCg0KICAgIGlmICgkaHR0cF9jb2RlICE9IDIwMCkgew0KICAgICAgICAkbG9nZ2VyLT5lcnJvcigiRXJyb3IuIEZldGNoIGZyb20gJHVybCByZXR1cm5lZCBodHRwX2NvZGUgJGh0dHBfY29kZSIpOw0KICAgICAgICAkbG9nZ2VyLT5lcnJvcigkaGVhZGVyKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgICRodG1sID0gcHJlcHJvY2VzcygkaHRtbCwgJHJlcGxhY2VfcGF0dGVybnMpOyAgIyBodG1sIOuCtOyaqeydmCDsnbzrtoDrpbwg66+466asIOuzgOqyvQ0KICAgICRwYXR0ZXJuID0gJEdMT0JBTFNbJ0NPTkZJRyddWydfZG93bl9saW5rJ107DQoNCiAgICBpZiAocHJlZ19tYXRjaCgkcGF0dGVybiwgJGh0bWwsICRtYXRjaCkpIHsNCiAgICAgICAgJGxvZ2dlci0+ZGVidWcoJG1hdGNoKTsNCiAgICAgICAgJGxpbmsgPSB1cmxfam9pbigkdXJsLCAkbWF0Y2hbMV0pOw0KICAgICAgICBkb3dubG9hZF90b3JyZW50KCRsaW5rKTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gbWFpbigpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAjIOyalOyyrSDsoJXrs7Qg7Lac66ClDQogICAgJGxvZ2dlci0+aW5mbygidG9yciDrsoTsoIQ6ICIgLiBWRVJTSU9OKTsNCiAgICAkbG9nZ2VyLT5pbmZvKCLsg4jroZzsmrQg7JqU7LKt7J20IOuTpOyWtOyZlOyKteuLiOuLpC4gSVA9IiAuICAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQogICAgJGxvZ2dlci0+aW5mbygiUkVRVUVTVF9VUkk6ICIgLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7DQogICAgJGxvZ2dlci0+ZGVidWcoJF9TRVJWRVIpOw0KDQogICAgaWYgKGlzc2V0KCRfR0VUWydkJ10pKSB7DQogICAgICAgIGRvX2Rvd25sb2FkKGJhc2U2NF9kZWNvZGUoJF9HRVRbJ2QnXSkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIG1ha2VfcnNzKCk7DQogICAgICAgIHNlbGZfdXBkYXRlKCk7DQogICAgfQ0KfQ0KDQoNCmZ1bmN0aW9uIGdlbl9iYXNlNjQoKSB7DQogICAgJGxvY2FsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pKTsNCiAgICBwcmludCgkbG9jYWxfYmFzZTY0KTsNCn0NCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgTWFpbigpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KaWYgKGlzc2V0KCRhcmdjKSAmJiAkYXJnYyA+IDEgJiYgJGFyZ3ZbMV0gPT0gJ2Jhc2U2NCcpIHsNCiAgICBnZW5fYmFzZTY0KCk7DQp9IGVsc2Ugew0KICAgIG1haW4oKTsNCn0NCg0K ?>

Did this file decode correctly?

Original Code

PD9QSFANCg0KLyoNCiMgSXQncyB0b3JyISB2MjAyNDAxMDkNCg0K6rO16rCcIO2GoOugjO2KuCDsgqzsnbTtirjsnZgg6rKM7Iuc66y87J2EIFJTUyDtmJXtg5zroZwg67OA7ZmYDQotIO2VtOuLuSBJdCdzIHRvcnIg64qUIGdyb2xsY2FrZS10b3Jy64uY7J2YIHRvcnIg66W8IOq4sOuwmOycvOuhnCDsoJzsnpHsnYQg7ZWY7JiA7Iq164uI64ukLg0KIA0KICBncm9sbGNha2UtdG9yciDri5jsnZgg67aA7J6s66GcIO2VtOuLuSB0b3Jy6rCAIOyXheuNsOydtO2KuOqwgCA16rCc7JuU7J20IOuEmOuPhOuhnSDsl4XrjbDsnbTtirjqsIAg66+47Z2h7ZWY7JesIOyImOygle2bhCDsoJzsnpHsnYQg7ZWY7JiA7Jy866mwLA0KIA0KICDrs7gg7ZSE66Gc7KCd7Yq464qUIOusuOygnOqwgCDrsJzsg53tlaAg7IucIOyekOynhCDsgq3soJztlaAg7JiI7KCV7J6F64uI64ukLg0KDQojIyMg7KCB7JqpIOuwqeuylQ0KDQp0b3JyLnBocOulvCDsm7nshJzruYTsiqQg66Oo7Yq47JeQIHRvcnIg65SU66CJ7Yag66as66W8IOunjOuTpOqzoCDrs7XsgqztlZzri6QuICANCg0K7Iuc64aA66Gc7KeA64qUIOybueyEnOu5hOyKpOulvCDtmZzshLHtmZTtlZjqs6Agd2ViL3RvcnIvdG9yci5waHDroZwg67O17IKs7ZWc64ukLg0KDQojIyMg7IKs7JqpIOuwqeuylQ0KDQrsmIgpIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms964aA66m0IOutkO2VmOuLiA0KDQogLSBiOiDqsoDsg4ntlaAg6rKM7Iuc7YyQ7Jy866Gc7I2oIOuvuOumrCDsoJXsnZjrkJwg6rKD66eMIOyCrOyaqSDqsIDriqXtlZjri6QuIOqyjOyLnO2MkOydhCDsp4DsoJXtlZjsp4Ag7JWK7Jy866m0IOyYiOuKpSwg65Oc652866eILCDri6TtgZDsl5DshJwg7Ya17ZWpIOqygOyDie2VnOuLpC4g7KeA7JuQ7ZWY64qUIOqyjOyLnO2MkOydgCDsmIjriqUoZW50KSwg65Oc652866eIKGRyYW1hKSwg64uk7YGQKGRvY3UpLCDrr7jrk5wobWlkKSwg6riw7YOAKGV0YynsnbTri6QuDQotIGs6IOqygOyDieyWtCjsmIgsIOuGgOuptCDrrZDtlZjri4gp7J2064ukLiDsg53rnrUg7IucIO2VtOuLuSDqsozsi5ztjJAg7LKrIO2OmOydtOyngOydmCDrqqnroZ3snYQg6rCA7KC47Jio64ukLg0KDQojIyMg7JeF642w7J207Yq4DQoNCi0gdG9yci5waHDripQg7J6Q64+ZIOyXheuNsOydtO2KuOulvCDsp4Dsm5DtlZzri6QuIA0KDQotIOyXheuNsOydtO2KuCDsi5wgdG9yci5waHAg7J6Q7LK06rCAIOuzgOqyveuQmOuvgOuhnCDsnKDsp4DtlbTslbwg7ZWgIOyEpOygleydtCDsnojripQg6rK97JqwIFVzZXJDb25maWcucGhwIO2MjOydvOyXkCDsoJXsnZjtlZjrqbQg65Cc64ukLg0KICDslYTrnpjripQgc2V0IOygleuztOulvCBVc2VyQ29uZmlnLnBocOyXkCDsoJXsnZjtlZwg7JiI7Iuc7J2064ukLg0KDQogIGBgYHBocA0KICA8P1BIUA0KICANCiAgIyDqsoDsg4nslrQgU2V0OiDshLjtirjroZwg65Ox66Gd65CcIOydtOumhOydhCDqsoDsg4ntgqTsm4zrk5zroZwg7IKs7Jqp7ZWY66m0IO2VnOuyiOyXkCDri6TspJEg6rKA7IOJ7J2EIOyLpOyLnO2VnOuLpC4NCiAgJEtFWVdPUkRTID0gYXJyYXkoDQogICAgICAic2V0MDEiID0+IGFycmF5KCLrnbzrlJTsmKTsiqTtg4AiLCAi64aA66m0IOutkO2VmOuLiCA3MjBwLU5FWFQiLCAi64KYIO2YvOyekCDsgrDri6QgNzIwcC1ORVhUIiksDQogICAgICAic2V0MDIiID0+IGFycmF5KCLrsJTtgLTri6zrprAg7KeRIDcyMHAtTkVYVCIsICLsnKAg7YC07KaIIOyYqCDrjZQg67iU65+tIDcyMHAtTkVYVCIpLA0KICAgICAgInNldDAzIiA9PiBhcnJheSgi64aA66m0IOutkO2VmOuLiCIsICLrgpgg7Zi87J6QIOyCsOuLpCIsICLrnbzrlJTsmKTsiqTtg4AiLCAi7Jes7J6Q65Ok7J2YIOydgOuwgO2VnCDtjIzti7AiKQ0KICApOw0KICBgYGANCg0KLSBU7IKs7J207Yq46rCAIOyjveyWtOuyhOumsCDtm4Qg66mw7LmgIOq4sOuLpOumrOuLpCDrs7TrqbQg7J6R64+Z7ZWgIOuQoCDsiJjrj4Qg7J6I64ukLg0KDQotIOy1nOyLoCDrsoTsoIQg7LK07YGs64qUIO2VmOujqOyXkCDtlZzrsogg7ZWc64ukLg0KDQotIOyekOuPmSDsl4XrjbDsnbTtirjrpbwg7KSR7KeA7ZWY66Ck66m0IGRlZmluZSgnQVVUT19VUERBVEUnLCBmYWxzZSk766GcIOuzgOqyve2VnOuLpC4NCg0KIyMjIOqzoOq4iSDtmZzsmqkNCg0KLSDqsoDsg4nslrTripQg7IiY7KeB67CUKHwp66GcIOq1rOu2hO2VmOyXrCDsl6zrn6zqsJzrpbwg7J6F66Cl7ZWgIOyImCDsnojri6QuIA0KICDsmIgpIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms964aA66m0IOutkO2VmOuLiHzrnbzrlJTsmKQg7Iqk7YOAfOuCmCDtmLzsnpAg7IKw64ukDQotIOqygOyDieyWtOuKlCDrr7jrpqwg7KCV7J2Y7ZWcIOyEuO2KuOuqheydhCDsnbTsmqntlaAg7IiY64+EIOyeiOuLpC4gDQogIOyYiCkgIGh0dHA6Ly95b3VyLXNlcnZlci1pcC90b3JyL3RvcnIucGhwP2I9ZW50Jms9c2V0MDENCi0g7J6R64+Z7J20IOygnOuMgOuhnCDrkJjsp4Ag7JWK7Jy866m0ICRsb2dnZXItPnNldExldmVsKCdERUJVRycpO+uhnCDrs4Dqsr3tlZjqs6Ag66Gc6re4IO2MjOydvCh0b3JyLmxvZynsnYQg7IK07Y6067O464ukLg0KLSDsoJXrs7Trpbwg7IiY7KeR7ZWgIOyCrOydtO2KuOqwgCDrsJTrgIzrqbQgJENPTkZJR+ulvCDsiJjsoJXtlZzri6QuDQoNCiMjIyDrs4Dqsr0g7J2066ClDQoNCiAqICAgMjAyNDA1MjggLSDthqDroIztirgg7IKs7J207Yq4IA0KICogICAyMDI0MDEwOSAtIO2GoOugjO2KuCDsgqzsnbTtirggDQogKiAgIDIwMjMxMTIyIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAzMjcgLSDsnpDrj5nsl4XrjbDsnbTtirgg7Jik66WYIOyImOyglSwg7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAyMjUgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIzMDIxMiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjMwMjA3IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAyMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIzMDExNiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjMwMTA1IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMzAxMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTIyMyAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMjE1IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEyMTEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTIwNyAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMTI2IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjExMjAgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTExMSAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMTA2IC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEwMjQgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMTAxNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIxMDExIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMjEwMDEgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIyMDkyNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjIwNTAyIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTEwMTcgLSDthqDroIztirgg7IKs7J207Yq4IOuzgOqyvQ0KICogICAyMDIxMTAxNiAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjEwOTE5IC0g7J6Q64+Z7JeF642w7J207Yq4IOyYpOulmCDsiJjsoJUNCiAqICAgMjAyMTA5MTYgLSDsnpDrj5nsl4XrjbDsnbTtirgg7Jik66WYIOyImOyglQ0KICogICAyMDIxMDkxNCAtIO2GoOugjO2KuCDsgqzsnbTtirgg67OA6rK9DQogKiAgIDIwMjEwOTEzIC0g7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTA4MDYgLSDrj4TrqZTsnbgg7J6Q64+ZIOuzgOqyvSDsmKTrpZgg7IiY7KCVDQogKiAgIDIwMjEwODA1IC0g64+E66mU7J24IOyekOuPmSDrs4Dqsr0g6riw64qlIOy2lOqwgCwg7Yag66CM7Yq4IOyCrOydtO2KuCDrs4Dqsr0NCiAqICAgMjAyMTAyMTEgLSDsgqzsnbTtirgg7KO87IaMIOuzgOqyvQ0KICogICAyMDIwMDgxNyAtIOyjveyXiOuNmCB0b3Jy7J2YIOu2gO2ZnA0KICogICAyMDE3MDQxNiAtIOyCrOydtO2KuCDsoJXrs7Qg7J6Q64+ZIOyXheuNsOydtO2KuCDquLDriqUg7LaU6rCADQogKiAgIDIwMTcwNDI1IC0g7J6Q64+ZIOyXheuNsOydtO2KuCDsmKTrpZgg7IiY7KCVIOuwjyDssqvtjpjsnbTsp4Dsl5DshJwg66eI6re464S3IOunge2BrCDqsoDsg4kg6riw64qlIOy2lOqwgA0KICogICAyMDE3MDUxNSAtIOuniOq3uOuEtyDrp4HtgazqsIAg64uk66W4IO2OmOydtOyngOyXkCDsobTsnqztlZjripQg6rK97Jqw7JeQ64+EIOyymOumrO2VmOuPhOuhnSDquLDriqUg7LaU6rCADQogKiAgIDIwMTcwNjEzIC0g7IKs7J207Yq4IOygleuztCDsl4XrjbDsnbTtirgg7YOc6re4KGNvZGUgPiBwcmUpIOuzgOqyvS4gaHRtbOydmCDshKDsspjrpqwg7LaU6rCALg0KIA0KICovDQoNCi8qDQogIGdpdGh1YiDrsLDtj6wg7KCEIGJhc2U2NCDsnbjsvZTrlKnqsJLsnYQg7ZmV7J247ZWY66Ck66m0IOyVhOuemCDrqoXroLnslrTrpbwg7Iuk7ZaJ7ZWc64ukLg0KICBwaHAgdG9yci5waHAgYmFzZTY0DQoqLw0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQojIyDthqDroIztirgg7IKs7J207Yq4IOygleuztA0KIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjDQokQ09ORklHID0gYXJyYXkoDQogICAgImVudCIgPT4gYXJyYXkoICAgICAjIFRW7JiI64qlDQogICAgICAgICJodHRwczovL2t0eHRvcnJlbnQxMjIuY29tL2Jicy9ib2FyZC5waHA/Ym9fdGFibGU9ZW50ZXJ0YWluJnNjYT0mc2ZsPXdyX3N1YmplY3Qmc29wPWFuZCZzdHg9e2t9Ig0KICAgICksDQogICAgImRyYW1hIiA9PiBhcnJheSggICAjIFRW65Oc652866eIDQogICAgICAgICJodHRwczovL2t0eHRvcnJlbnQxMjIuY29tL2Jicy9ib2FyZC5waHA/Ym9fdGFibGU9ZHJhbWEmc2NhPSZzZmw9d3Jfc3ViamVjdCZzb3A9YW5kJnN0eD17a30iLA0KICAgICksDQogICAgImRvY3UiID0+IGFycmF5KCAgICAjIFRW64uk7YGQL+yLnOyCrA0KICAgICAgICAiaHR0cHM6Ly9rdHh0b3JyZW50MTIyLmNvbS9iYnMvYm9hcmQucGhwP2JvX3RhYmxlPXR2JnNjYT0mc2ZsPXdyX3N1YmplY3Qmc29wPWFuZCZzdHg9e2t9Ig0KICAgICksDQogICAgImFuaSIgPT4gYXJyYXkoICAgICAjIOyZuOq1reuTnOudvOuniA0KICAgICAgICAiaHR0cHM6Ly9rdHh0b3JyZW50MTIyLmNvbS9iYnMvYm9hcmQucGhwP2JvX3RhYmxlPWFuaSZzY2E9JnNmbD13cl9zdWJqZWN0JnNvcD1hbmQmc3R4PXtrfSINCiAgICApLA0KICAgICJldGMiID0+IGFycmF5KCAgICAgIyDsiqTtj6zsuKAsIOyVoOuLiCDrk7ENCiAgICAgICAgLy/qs7XrnoANCiAgICApLCANCg0KICAgICMg6rKM7Iuc7YyQ7J2EIOyngOygle2VmOyngCDslYrsnYAg6rK97JqwIOqygOyDie2VoCDqsozsi5ztjJAg66qp66GdDQogICAgImFsbCIgPT4gYXJyYXkoImVudCIsICJkcmFtYSIsICJkb2N1IiwgImFuaSIpLA0KDQogICAgIyDquIDrqqnroZ0sIOuLpOyatOuhnOuTnCDrp4Htgawg6rKA7IOJ7J2EIOychO2VnCDsoJXqt5zsi50g7Yyo7YS0LiAo67OA6rK97J6QOiBzLeuLqOydvCDrnbzsnbjsnLzroZwg7LKY66asLCBtLeyXrOufrCDrnbzsnbjsnLzroZwg7LKY66asLCBpLeuMgOyGjOusuOyekCDrrLTsi5wpDQogICAgIl9wYWdlX2xpbmtfcHJlcHJvY2VzcyIgPT4gYXJyYXkoKSwNCiAgICAiX3BhZ2VfbGluayIgPT4gJyE8ZGl2IGNsYXNzPSJ3ci1zdWJqZWN0Ij4uKj88YSBocmVmPSIoP1A8bGluaz4uKz8pIi4qPz4oP1A8dGl0bGU+Lis/KTwvYT4hc2knLA0KDQogICAgIyDrp4jqt7jrhLfrp4Htgawo7Yag66CM7Yq47YyM7J28KeqwgCDsnojripQg7Y6Y7J207KeA7J2YIGh0bWzsnYQg67Cb7J2AIO2bhCDrr7jrpqwg67OA6rK97ZWgIOuCtOyaqeuTpDog7JiIKSBhcnJheSgiL21hZ25ldF9saW5rXCgnL2kiLCAiaHJlZj0nbWFnbmV0Oj94dD11cm46YnRpaDoiKSwNCiAgICAiX2Rvd25fbGlua19wcmVwcm9jZXNzIiA9PiBhcnJheSgpLA0KDQogICAgIyDrp4jqt7jrhLcg7ZiV7Iud7J2EIOywvuuKlOuLpC4NCiAgICAiX2Rvd25fbGluayIgPT4gJ21hZ25ldCcsDQoNCiAgICAjIO2OmOydtOyngCDrgrTsl5Ag66eI6re464S3IOunge2BrOulvCDrhbjstpztlZjsp4Ag7JWK6rOgIO2KueyglSBVUkzroZwg7JqU7LKt7ZWY66m0IOyjvOuKlCDqsr3smrDqsIAg7J6I64ukLg0KICAgICMg7J2065+wIOycoO2YleydmCDsmpTssq0gVVJM7J2EIOywvuq4sCDsnITtlZwg7Yyo7YS07J2EIOuvuOumrCDsoJXsnZjtlbTslbwg7ZWc64ukLiANCiAgICAiX21hZ25ldF9mb2xsb3dfbGluayIgPT4gJycNCik7DQoNCg0KIyDqsoDsg4nslrQgU2V0OiDshLjtirjroZwg65Ox66Gd65CcIOydtOumhOydhCDqsoDsg4ntgqTsm4zrk5zroZwg7IKs7Jqp7ZWY66m0IO2VnOuyiOyXkCDri6TspJEg6rKA7IOJ7J2EIOyLpOyLnO2VnOuLpC4NCiRLRVlXT1JEUyA9IGFycmF5KA0KICAgICJzZXQwMSIgPT4gYXJyYXkoIuudvOuUlOyYpOyKpO2DgCA3MjBwLU5FWFQiLCAi64aA66m0IOutkO2VmOuLiCA3MjBwLU5FWFQiLCAi64KYIO2YvOyekCDsgrDri6QgNzIwcC1ORVhUIiksDQogICAgInNldDAyIiA9PiBhcnJheSgi7JygIO2AtOymiCDsmKgg642UIOu4lOufrSA3MjBwLU5FWFQiKQ0KKTsNCg0KIyBjdXJsIOyalOyyrSDsi5wg7IKs7Jqp7ZWgIHByb3h5IOyjvOyGjC4gaXA6cG9ydA0KJFBST1hZID0gJyc7DQoNCmRlZmluZSgnVkVSU0lPTicsICd2MjAyNDA1MjgnKTsgICMgYXBwIHZlcnNpb24NCmRlZmluZSgnQVVUT19VUERBVEUnLCB0cnVlKTsgICMg7J6Q64+ZIOyXheuNsOydtO2KuCDquLDriqUg7IKs7JqpDQpkZWZpbmUoJ01BR05FVF9DQUNIRV9DT05TRVJWRV9EQVlTJywgNDUwKTsgICAjIOuniOq3uOuEtyDsupDsi5wg67O07KG07J287IiYDQpkZWZpbmUoJ1VQREFURV9VUkwnLCAnaHR0cHM6Ly9yYXcuZ2l0aHVidXNlcmNvbnRlbnQuY29tL2JqdG93ZXIvdG9yci9tYXN0ZXIvdG9yci5lbmNvZGVkJyk7ICAjIHRvcnIg7J6Q64+ZIOyXheuNsOydtO2KuCB1cmwNCg0KJGxvZ2dlciA9IG5ldyBNeWxvZ2dlcigpOw0KJGxvZ2dlci0+c2V0TGV2ZWwoJ0RFQlVHJyk7ICAjIERFQlVHLCBJTkZPLCBXQVJOLCBFUlJPUuulvCDsgqzsmqntlaAg7IiYIOyeiOuLpC4NCg0KIyDsgqzsmqnsnpAg7ISk7KCVIO2MjOydvOydhCDsnb3slrTshJwg6riw67O4IOyEpOygleydhCDqsLHsi6DtlZzri6QuDQojIOyKpO2BrOumve2KuCDtjIzsnbzsnYAg7J6Q64+ZIOyXheuNsOydtO2KuOqwgCDrkJjquLAg65WM66y47JeQIOuztOyhtOydtCDtlYTsmpTtlZwg7ISk7KCV7J2AIFVzZXJDb25maWcucGhw7JeQIOygleydmO2VnOuLpC4NCmlmIChmaWxlX2V4aXN0cygnVXNlckNvbmZpZy5waHAnKSkgaW5jbHVkZSAnVXNlckNvbmZpZy5waHAnOw0KDQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQ29tbW9uIHV0aWwgZnVuY3Rpb25zDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KY2xhc3MgTXlMb2dnZXINCnsNCiAgICBwcml2YXRlICRsb2dmID0gbnVsbDsNCiAgICBwcml2YXRlICRsZXZlbCA9ICdJTkZPJzsNCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBfX2NvbnN0cnVjdCgpDQogICAgew0KICAgICAgICBkYXRlX2RlZmF1bHRfdGltZXpvbmVfc2V0KCdBc2lhL1Nlb3VsJyk7DQogICAgICAgICR0aGlzLT5sb2dmID0gYmFzZW5hbWUoX19GSUxFX18sICcucGhwJykgLiAnLmxvZyc7DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIHNldExldmVsKCRsZXZlbCkNCiAgICB7DQogICAgICAgICR0aGlzLT5sZXZlbCA9ICRsZXZlbDsNCiAgICB9DQoNCiAgICBwdWJsaWMgZnVuY3Rpb24gZGVidWcoJG1zZykNCiAgICB7DQogICAgICAgIGlmICgkdGhpcy0+bGV2ZWwgPT0gJ0RFQlVHJykgew0KICAgICAgICAgICAgJHRoaXMtPl9sb2coJ0QnLCAkbXNnKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiBpbmZvKCRtc2cpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPmxldmVsID09ICdJTkZPJyB8fCAkdGhpcy0+bGV2ZWwgPT0gJ0RFQlVHJykgew0KICAgICAgICAgICAgJHRoaXMtPl9sb2coJ0knLCAkbXNnKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIHB1YmxpYyBmdW5jdGlvbiB3YXJuKCRtc2cpDQogICAgew0KICAgICAgICBpZiAoJHRoaXMtPmxldmVsID09ICdXQVJOJyB8fCAkdGhpcy0+bGV2ZWwgPT0gJ0lORk8nIHx8ICR0aGlzLT5sZXZlbCA9PSAnREVCVUcnKSB7DQogICAgICAgICAgICAkdGhpcy0+X2xvZygnVycsICRtc2cpOw0KICAgICAgICB9DQogICAgfQ0KDQogICAgcHVibGljIGZ1bmN0aW9uIGVycm9yKCRtc2cpDQogICAgew0KICAgICAgICAkdGhpcy0+X2xvZygnRScsICRtc2cpOw0KICAgIH0NCg0KICAgIHByaXZhdGUgZnVuY3Rpb24gX2xvZygkbGV2ZWwsICRtc2cpDQogICAgew0KICAgICAgICAkdCA9IG1pY3JvdGltZSh0cnVlKTsNCiAgICAgICAgJG1pbGxpID0gc3ByaW50ZigiJTAzZCIsICgkdCAtIGZsb29yKCR0KSkgKiAxMDAwKTsNCiAgICAgICAgJGR0ID0gc3ByaW50ZigiJXMuJXMiLCBkYXRlKCdZLW0tZCBIOmk6cycpLCAkbWlsbGkpOw0KICAgICAgICAkYnQgPSBkZWJ1Z19iYWNrdHJhY2UoKTsNCiAgICAgICAgJGZ1bmMgPSBpc3NldCgkYnRbMl0pID8gJGJ0WzJdWydmdW5jdGlvbiddIDogJ19fbWFpbl9fJzsNCiAgICAgICAgJGNhbGxlciA9ICRidFsxXTsNCiAgICAgICAgJGZpbGUgPSBiYXNlbmFtZSgkY2FsbGVyWydmaWxlJ10pOw0KICAgICAgICAkb3V0cHV0ID0gc3ByaW50ZigiJXMgJXMgPCVzOiVzOiVkPiAlc1xuIiwgJGR0LCAkbGV2ZWwsICRmaWxlLCAkZnVuYywgJGNhbGxlclsnbGluZSddLCBwcmludF9yKCRtc2csIHRydWUpKTsNCiAgICAgICAgZXJyb3JfbG9nKCRvdXRwdXQsIDMsICR0aGlzLT5sb2dmKTsNCiAgICB9DQp9DQoNCg0KIyBVc2VyLUFnZW507JmAIHJlZmVyZXLrpbwg7Jyg7KeA7ZWY64qUIOybuSDtg5Dsg4nquLANCmZ1bmN0aW9uIGN1cmxfZmV0Y2goJHVybCwgJGluaXQgPSBmYWxzZSkNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCiAgICBnbG9iYWwgJFBST1hZOw0KICAgIHN0YXRpYyAkY2ggPSBudWxsOw0KICAgIHN0YXRpYyAkY250ID0gMDsNCg0KICAgICgrKyRjbnQpICUgMTAgPT0gMCAmJiBzbGVlcCgyKTsgICMg64uo7Iuc6rCEIOuCtOyXkCDrhIjrrLQg66eO7J20IOyhsO2ajO2VmOuptCDssKjri6jri7ntlaAg7IiY64+EIOyeiOuLpA0KDQogICAgJGNvb2tpZV9ubSA9ICcuL2Nvb2tpZS50eHQnOw0KDQogICAgaWYgKCRjaCA9PSBudWxsIHx8ICRpbml0ID09IHRydWUpIHsNCiAgICAgICAgJGNoICE9IG51bGwgJiYgY3VybF9jbG9zZSgkY2gpOw0KDQogICAgICAgICRjaCA9IGN1cmxfaW5pdCgpOw0KDQogICAgICAgIGN1cmxfc2V0b3B0KCRjaCwgQ1VSTE9QVF9VU0VSQUdFTlQsICdNb3ppbGxhLzUuMCAoV2luZG93cyBOVCAxMC4wOyBXaW42NDsgeDY0KSBBcHBsZVdlYktpdC81MzcuMzYgKEtIVE1MLCBsaWtlIEdlY2tvKSBDaHJvbWUvMTAwLjAuNDg5Ni4xMjcgU2FmYXJpLzUzNy4zNicpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIGZhbHNlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0FVVE9SRUZFUkVSLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1JFVFVSTlRSQU5TRkVSLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0NPT0tJRVNFU1NJT04sIHRydWUpOw0KICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfQ09PS0lFSkFSLCAkY29va2llX25tKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0ZPTExPV0xPQ0FUSU9OLCB0cnVlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1ZFUkJPU0UsIGZhbHNlKTsNCiAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hFQURFUiwgdHJ1ZSk7DQoNCiAgICAgICAgaWYgKCRQUk9YWSkgew0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BST1hZVFlQRSwgQ1VSTFBST1hZX0hUVFApOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX0hUVFBQUk9YWVRVTk5FTCwgMSk7DQogICAgICAgICAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfU1NMX1ZFUklGWVBFRVIsIDApOw0KICAgICAgICAgICAgY3VybF9zZXRvcHQoJGNoLCBDVVJMT1BUX1BST1hZLCAkUFJPWFkpOw0KDQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJQcm94eSBzZXR0aW5nIGFwcGxpZWQuIFByb3h5IGluZm86ICRQUk9YWSIpOw0KICAgICAgICB9DQoNCiAgICB9DQoNCiAgICBjdXJsX3NldG9wdCgkY2gsIENVUkxPUFRfVVJMLCAkdXJsKTsNCiAgICAkcmVzcG9uc2UgPSBjdXJsX2V4ZWMoJGNoKTsNCiAgICAkaHR0cF9jb2RlID0gY3VybF9nZXRpbmZvKCRjaCwgQ1VSTElORk9fSFRUUF9DT0RFKTsNCiAgICBsaXN0KCRoZWFkZXIsICRib2R5KSA9IGV4cGxvZGUoIlxyXG5cclxuIiwgJHJlc3BvbnNlLCAyKTsNCg0KICAgICRzaXplID0gc3RybGVuKCRib2R5KTsNCg0KICAgICRsb2dnZXItPmRlYnVnKCJjVVJMIGZldGNoIGh0dHBfY29kZTpbJGh0dHBfY29kZV0gdXJsOlskdXJsXSAgc2l6ZTpbJHNpemVdIik7DQogICAgLy8gJGxvZ2dlci0+ZGVidWcoJGhlYWRlcik7DQogICAgLy8gJGxvZ2dlci0+ZGVidWcoJGJvZHkpOw0KDQogICAgcmV0dXJuIGFycmF5KCRodHRwX2NvZGUsICRoZWFkZXIsICRib2R5KTsNCn0NCg0KDQojIOyDgeuMgOyjvOyGjOulvCAkYmFzZSDquLDrsJjsnZgg7KCI64yA7KO87IaM66GcIOuwmO2ZmO2VnOuLpC4NCmZ1bmN0aW9uIHVybF9qb2luKCRiYXNlLCAkcmVsYXRpdmVfdXJsKQ0Kew0KICAgIC8qIHJldHVybiBpZiBhbHJlYWR5IGFic29sdXRlIFVSTCAqLw0KICAgIGlmIChwYXJzZV91cmwoJHJlbGF0aXZlX3VybCwgUEhQX1VSTF9TQ0hFTUUpICE9ICcnKSByZXR1cm4gJHJlbGF0aXZlX3VybDsNCg0KICAgIC8qIHF1ZXJpZXMgYW5kIGFuY2hvcnMgKi8NCiAgICBpZiAoJHJlbGF0aXZlX3VybFswXSA9PSAnIycgfHwgJHJlbGF0aXZlX3VybFswXSA9PSAnPycpIHJldHVybiAkYmFzZSAuICRyZWxhdGl2ZV91cmw7DQoNCiAgICAvKiBwYXJzZSBiYXNlIFVSTCBhbmQgY29udmVydCB0byBsb2NhbCB2YXJpYWJsZXM6ICRzY2hlbWUsICRob3N0LCAkcGF0aCAqLw0KICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJGJhc2UpOw0KICAgICRzY2hlbWUgPSAkcGFyc2VkWydzY2hlbWUnXTsNCiAgICAkaG9zdCA9ICRwYXJzZWRbJ2hvc3QnXTsNCiAgICAkcGF0aCA9IGlzc2V0KCRwYXJzZWRbJ3BhdGgnXSkgPyAkcGFyc2VkWydwYXRoJ10gOiAnJzsNCg0KICAgIC8qIHJlbW92ZSBub24tZGlyZWN0b3J5IGVsZW1lbnQgZnJvbSBwYXRoICovDQogICAgJHBhdGggPSBwcmVnX3JlcGxhY2UoJyMvW14vXSokIycsICcnLCAkcGF0aCk7DQoNCiAgICAvKiBkZXN0cm95IHBhdGggaWYgcmVsYXRpdmUgdXJsIHBvaW50cyB0byByb290ICovDQogICAgaWYgKCRyZWxhdGl2ZV91cmxbMF0gPT0gJy8nKSAkcGF0aCA9ICcnOw0KDQogICAgLyogZGlydHkgYWJzb2x1dGUgVVJMICovDQogICAgJGFicyA9ICIkaG9zdCRwYXRoLyRyZWxhdGl2ZV91cmwiOw0KDQogICAgLyogcmVwbGFjZSAnLy8nIG9yICcvLi8nIG9yICcvZm9vLy4uLycgd2l0aCAnLycgKi8NCiAgICAkcmUgPSBhcnJheSgnIygvXC4/LykjJywgJyMvKD8hXC5cLilbXi9dKy9cLlwuLyMnKTsNCiAgICBmb3IgKCRuID0gMTsgJG4gPiAwOyAkYWJzID0gcHJlZ19yZXBsYWNlKCRyZSwgJy8nLCAkYWJzLCAtMSwgJG4pKSB7DQogICAgfQ0KDQogICAgLyogYWJzb2x1dGUgVVJMIGlzIHJlYWR5ISAqLw0KICAgIHJldHVybiAkc2NoZW1lIC4gJzovLycgLiAkYWJzOw0KfQ0KDQoNCiMg64uk7JaR7ZWcIOyGjOyKpOyXkOyEnCBtYWduZXQgbGlua+ulvCDssL7ripTri6QuDQojICjsi5zrj4QxKSAkc291cmNl6rCAIHVybChodHRw66GcIOyLnOyekSnsnbgg6rK97JqwIGhlYWRlcuyZgCBodG1s7J2EIOuwm+uKlOuLpC4NCiMgKOyLnOuPhDIpIOyWtOuWpCDsgqzsnbTtirjripQgbWFnbmV07J2EIOyngeygkSDrhbjstpztlZjsp4Ag7JWK6rOgIO2KueyglSB1cmzroZwg7KCR6re87ZaI7J2EIOuVjCAzMDIg7J2R64u16rO8IO2VqOq7mCBoZWFkZXLsnZggTG9jYXRpb27sl5Ag64u07JWE7IScIOuCtOugpOuztOuCtOq4sOuPhCDtlZzri6QuDQojICAgICAgICAg65Sw65287IScIGhlYWRlcuyXkOyEnCBMb2NhdGlvbiDtla3rqqnsl5AgbWFnbmV0IOunge2BrOqwgCDsnojripTsp4DrtoDthLAg7ZmV7J247ZWY64ukLg0KIyAo7Iuc64+EMykgJHNvdXJjZeqwgCB1cmzsnbQg7JWE64uI6rGw64KYIOyLnOuPhDLsl5DshJwg67Cb7J2AIGh0bWzsnbQg7J6I64qUIOqyveyasCBtYWduZXQgbGluayBwYXR0ZXJu7Jy866GcIOywvuuKlOuLpC4NCmZ1bmN0aW9uIGZpbmRfbWFnbmV0KCRzb3VyY2UpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgJGh0bWwgPSBudWxsOw0KICAgICRtYWduZXQgPSBudWxsOw0KDQogICAgaWYgKHByZWdfbWF0Y2goJy9eaHR0cC9zaScsICRzb3VyY2UsICRtYXRjaCkpIHsNCiAgICAgICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCRzb3VyY2UpOw0KICAgICAgICBpZiAocHJlZ19tYXRjaCgnL15Mb2NhdGlvbjogKG1hZ25ldDouKykkL21pJywgJGhlYWRlciwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJG1hZ25ldCA9ICRtYXRjaFsxXTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCJMb2NhdGlvbiDtl6TrjZTsl5DshJwgbWFnbmV0IOunge2BrOulvCDssL7slZjsirXri4jri6Q6ICIgLiAkbWFnbmV0KTsNCiAgICAgICAgfQ0KICAgIH0gZWxzZSB7DQogICAgICAgICRodG1sID0gJHNvdXJjZTsNCiAgICB9DQoNCiAgICBpZiAocHJlZ19tYXRjaCgnL2hyZWY9W1wnIl0/KG1hZ25ldDouKz8pW1xzXCciPl0vc2knLCAkaHRtbCwgJG1hdGNoKSkgew0KICAgICAgICAkbWFnbmV0ID0gJG1hdGNoWzFdOw0KICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygiSFRNTCDtjpjsnbTsp4Dsl5DshJwgbWFnbmV0IOunge2BrOulvCDssL7slZjsirXri4jri6Q6ICIgLiAkbWFnbmV0KTsNCiAgICB9DQoNCiAgICByZXR1cm4gJG1hZ25ldDsNCn0NCg0KDQojIHVybCDsl6zrtoAg7YyQ64uoDQpmdW5jdGlvbiBpc191cmwoJHVybCkNCnsNCiAgICByZXR1cm4gaXNzZXQocGFyc2VfdXJsKCR1cmwpWydob3N0J10pOw0KfQ0KDQoNCiMg7KCV6rec7Iud7J2EIOydtOyaqe2VnCDrs4Dqsr0g7LKY66asDQpmdW5jdGlvbiBwcmVwcm9jZXNzKCR0ZXh0LCAkcGF0dGVybnMpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgJHRleHRfYmYgPSAkdGV4dDsNCiAgICAkdGV4dF9hZiA9ICR0ZXh0Ow0KDQogICAgJGNvdW50ID0gMDsNCiAgICBmb3IgKCRpID0gMDsgJGkgPCBjb3VudCgkcGF0dGVybnMpOyAkaSArPSAyKSB7DQogICAgICAgICR0ZXh0X2FmID0gcHJlZ19yZXBsYWNlKCRwYXR0ZXJuc1skaV0sICRwYXR0ZXJuc1skaSArIDFdLCAkdGV4dF9iZiwgLTEsICRjb3VudCk7DQogICAgICAgIGlmICgkY291bnQgPT0gMCkgew0KICAgICAgICAgICAgJGxvZ2dlci0+d2FybigncHJlZ19yZXBsYWNlIHBhdHRlcm4gaXMgbm90IGZvdW5kOiAnIC4gJHBhdHRlcm5zWyRpXSk7DQogICAgICAgICAgICAkdGV4dF9hZiA9ICR0ZXh0X2JmOw0KICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgJGJmX2xlbiA9IHN0cmxlbigkdGV4dF9iZik7DQogICAgICAgICAgICAkYWZfbGVuID0gc3RybGVuKCR0ZXh0X2FmKTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCJ0ZXh0IGNoYW5nZWQgZm9yICRjb3VudCB0aW1lcy4gTGVuZ3RoIG9mIEJlZm9yZSB0ZXh0IGlzICRiZl9sZW4gYW5kIGFmdGVyIHRleHQgaXMgJGFmX2xlbiIpOw0KICAgICAgICAgICAgJHRleHRfYmYgPSAkdGV4dF9hZjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICMgREVWX01PREUgJiYgJGxvZ2dlci0+ZGVidWcoKCdBRlRFUiBQQUdFIFByZXByb2Nlc3MnKTsNCiAgICAjIERFVl9NT0RFICYmICRsb2dnZXItPmRlYnVnKCgkdGV4dCk7DQoNCiAgICByZXR1cm4gJHRleHRfYWY7DQp9DQoNCg0KIyB1cmwg7KCV6rec7ZmUOiAmYW1wO+ulvCAm66GcIOuzgOqyve2VmOyXrCDrsJjtmZjtlZzri6QuDQpmdW5jdGlvbiB1cmxfbm9ybWFsaXplKCR1cmwpDQp7DQogICAgcmV0dXJuIHN0cl9yZXBsYWNlKCcmYW1wOycsICcmJywgJHVybCk7DQp9DQoNCg0KIyDsoJXqt5zsi53snYQg7J6F66Cl67Cb7JWEIO2MjOydvOydmCDrgrTsmqnsnYQg67OA6rK97ZWc64ukLg0KZnVuY3Rpb24gZmlsZV9yZWdleF91cGRhdGUoJGZpbGVuYW1lLCAkcmVnZXhfZnIsICRyZWdleF90bykNCnsNCiAgICAkb3JpZ2luID0gZmlsZV9nZXRfY29udGVudHMoJGZpbGVuYW1lKTsNCiAgICAkdXBkYXRlZCA9IHByZWdfcmVwbGFjZSgkcmVnZXhfZnIsICRyZWdleF90bywgJG9yaWdpbik7DQogICAgZmlsZV9wdXRfY29udGVudHMoJGZpbGVuYW1lLCAkdXBkYXRlZCk7DQp9DQoNCiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgQnVzaW5lc3MgZnVuY3Rpb25zDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMNCg0KIyB0b3JyLnBocCDtjIzsnbwg7J6Q64+Z7JeF642w7J207Yq4DQojICAtIOyekOuPmSDsl4XrjbDsnbTtirgg7ZuEIO2MjOydvOyCrOydtOymiOqwgCAw67CU7J207Yq46rCAIOuQmOuKlCDsmKTrpZjqsIAg7KKF7KKFIOuwnOyDne2VqCAtPiDri6TsmrTroZzrk5wg67Cb7J2AIO2BrOq4sOulvCDtmZXsnbgg7ZuEIOqwseyLoO2GoOuhnSDtlagNCmZ1bmN0aW9uIHNlbGZfdXBkYXRlKCkNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCg0KICAgICMg7JeF642w7J207Yq4IOyLpO2WiSDsl6zrtoAg7ZmV7J24DQogICAgaWYgKCFBVVRPX1VQREFURSkgcmV0dXJuOw0KDQogICAgIyDtlZjro6jsl5Ag7ZWc67KI66eMIOyXheuNsOydtO2KuCDssrTtgazrpbwg7ZW067O07J6QDQogICAgJHVwZGF0ZV9jaGVja19maWxlID0gc3lzX2dldF90ZW1wX2RpcigpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0b3JyLnVwZGF0ZWNoZWNrJzsNCiAgICBpZiAoQGZpbGVfZ2V0X2NvbnRlbnRzKCR1cGRhdGVfY2hlY2tfZmlsZSkgPT0gZGF0ZSgnWW1kJykpIHJldHVybjsNCiAgICBmaWxlX3B1dF9jb250ZW50cygkdXBkYXRlX2NoZWNrX2ZpbGUsIGRhdGUoJ1ltZCcpKTsNCg0KICAgICMg7JuQ6rKpIOyggOyepeyGjOyXkOyEnCDthqDroIztirgg7IKs7J207Yq4IOygleuztCDrsJvslYTsmKTquLAgKOy9lOuTnCDrs7TslYjsnYQg7JyE7ZW0IGJhc2U2NOuhnCDsnbjsvZTrlKnrkJwg64K07Jqp7Jy866GcIOuwm+uKlOuLpCkNCiAgICBsaXN0KCRodHRwX2NvZGUsICRoZWFkZXIsICRyZW1vdGVfYmFzZTY0KSA9IGN1cmxfZmV0Y2goVVBEQVRFX1VSTCk7DQoNCiAgICBpZiAoJGh0dHBfY29kZSAhPSAyMDApIHsNCiAgICAgICAgJGxvZ2dlci0+d2Fybigi7JeF642w7J207Yq4IO2MjOydvCDri6TsmrTroZzrk5wg7Jik66WY7J6F64uI64ukLiDsnZHri7XsvZTrk5w6ICRodHRwX2NvZGUiKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgICMg7ZiE7J6sIO2MjOydvOqzvCDruYTqtZDtlZjquLANCiAgICAkbG9jYWxfYmFzZTY0ID0gYmFzZTY0X2VuY29kZShmaWxlX2dldF9jb250ZW50cyhfX0ZJTEVfXykpOw0KDQogICAgaWYgKCRsb2NhbF9iYXNlNjQgIT0gJHJlbW90ZV9iYXNlNjQpIHsNCiAgICAgICAgJGxvZ2dlci0+aW5mbygidG9ycuqwgCDrs4Dqsr3rkJjslrQg7JeF642w7J207Yq466W8IOyLnOyeke2VqeuLiOuLpC4iKTsNCg0KICAgICAgICAjIO2YhOyerCDsiqTtgazrpr3tirgg7YyM7J28IOuwseyXhe2VmOq4sA0KICAgICAgICAhZmlsZV9leGlzdHMoJ2JhY2t1cCcpICYmIG1rZGlyKCdiYWNrdXAnKTsNCiAgICAgICAgJGJhY2t1cGYgPSBzcHJpbnRmKCJiYWNrdXAvJXMuJXMucGhwIiwgYmFzZW5hbWUoX19GSUxFX18sICcucGhwJyksIFZFUlNJT04pOw0KICAgICAgICBjb3B5KF9fRklMRV9fLCAkYmFja3VwZik7DQogICAgICAgICRsb2dnZXItPmluZm8oc3ByaW50Zigi7JeF642w7J207Yq4IOyghOyXkCDtmITsnqwgdG9ycuulvCDrsLHsl4XtlojsirXri4jri6Q6ICVzIC0+ICVzIiwgYmFzZW5hbWUoX19GSUxFX18pLCAkYmFja3VwZikpOw0KDQogICAgICAgICMgYmFzZTY066GcIOyduOy9lOuUqSDrkJwg7KCV67O0IO2VtOyEne2VmOq4sA0KICAgICAgICAkZGVjb2RlZF9zb3VyY2UgPSBiYXNlNjRfZGVjb2RlKCRyZW1vdGVfYmFzZTY0KTsNCg0KICAgICAgICAjIO2YhOyerCDsiqTtgazrpr3tirgg7JeF642w7J207Yq4IQ0KICAgICAgICBmaWxlX3B1dF9jb250ZW50cyhfX0ZJTEVfXywgJGRlY29kZWRfc291cmNlKTsgICAjIOuzgOqyveuQnCDrgrTsmqkg6riw66GdDQoNCiAgICAgICAgJGxvZ2dlci0+aW5mbygidG9ycuulvCDsl4XrjbDsnbTtirjtlojsirXri4jri6QuIOuLpOydjOuyiCDsmpTssq0g7IucIOuwmOyYgeuQqeuLiOuLpC4iKTsNCiAgICB9IGVsc2Ugew0KICAgICAgICAkbG9nZ2VyLT5pbmZvKCLtmITsnqwgdG9ycuqwgCDstZzsi6Ag67KE7KCE7J6F64uI64ukLiDrgrTsnbwg64uk7IucIO2ZleyduO2VqeuLiOuLpC4iKTsNCiAgICB9DQp9DQoNCg0KIyDtjIzrnbzrr7jthLDrpbwg67aE7ISd7ZWY7JesIO2DkOyDie2VoCDqsozsi5ztjJAg7KO87IaMIOuqqeuhneydhCDsg53shLHtlZzri6QuDQpmdW5jdGlvbiBwYXJzZV9wYXJhbSgpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbG9nZ2VyLT5pbmZvKHNwcmludGYoIlBhcmFtOiBiPVslc10gaz1bJXNdIiwgaXNzZXQoJF9HRVRbJ2InXSkgPyAkX0dFVFsnYiddIDogbnVsbCwgaXNzZXQoJF9HRVRbJ2snXSkgPyAkX0dFVFsnayddIDogbnVsbCkpOw0KDQogICAgJGNvbmYgPSAkR0xPQkFMU1snQ09ORklHJ107DQogICAgJGtleXcgPSAkR0xPQkFMU1snS0VZV09SRFMnXTsNCg0KICAgICRiID0gaXNzZXQoJF9HRVRbJ2InXSkgPyB0cmltKCRfR0VUWydiJ10pIDogJ2FsbCc7DQogICAgaWYgKCFpc3NldCgkY29uZlskYl0pKSB7DQogICAgICAgICRsb2dnZXItPmVycm9yKCRfR0VUWydiJ10gLiAi64qUIOycoO2aqO2VmOyngCDslYrsnYAg6rKM7Iuc7YyQ7J6F64uI64ukLiIpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgJGJvYXJkcyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGNvbmZbJGJdIGFzICRpdGVtKSB7DQogICAgICAgIGlmIChpc191cmwoJGl0ZW0pKSB7DQogICAgICAgICAgICAkYm9hcmRzW10gPSBhcnJheSgnY2F0ZWdvcnknID0+ICRiLCAndXJsJyA9PiAkaXRlbSk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICBmb3JlYWNoICgkY29uZlskaXRlbV0gYXMgJGl0ZW0yKSB7DQogICAgICAgICAgICAgICAgJGJvYXJkc1tdID0gYXJyYXkoJ2NhdGVnb3J5JyA9PiAkaXRlbSwgJ3VybCcgPT4gJGl0ZW0yKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICRrID0gaXNzZXQoJF9HRVRbJ2snXSkgPyB0cmltKCRfR0VUWydrJ10pIDogJyc7DQogICAgJGtleXdvcmRzID0gaXNzZXQoJGtleXdbJGtdKSA/ICRrZXl3WyRrXSA6IGV4cGxvZGUoJ3wnLCAkayk7DQogICAgJGtleXdvcmRzID0gc3RyX3JlcGxhY2UoJyAnLCAnJTIwJywgJGtleXdvcmRzKTsNCg0KICAgIGlmIChjb3VudCgka2V5d29yZHMpID4gMSkgew0KICAgICAgICAkbG9nZ2VyLT5pbmZvKHNwcmludGYoIuuLpOykkeqygOyDiSDtgqTsm4zrk5w6ICVk6rCcICglcykiLCBjb3VudCgka2V5d29yZHMpLCBqb2luKCIsICIsICRrZXl3b3JkcykpKTsNCiAgICB9DQoNCiAgICAkZmV0Y2hfdXJscyA9IGFycmF5KCk7DQogICAgZm9yZWFjaCAoJGJvYXJkcyBhcyAkYm9hcmQpIHsNCiAgICAgICAgZm9yZWFjaCAoJGtleXdvcmRzIGFzICRrZXl3b3JkKSB7DQogICAgICAgICAgICAkZmV0Y2hfdXJsc1tdID0gYXJyYXkoJ2NhdGVnb3J5JyA9PiAkYm9hcmRbJ2NhdGVnb3J5J10sICd1cmwnID0+IHN0cl9yZXBsYWNlKCd7a30nLCAka2V5d29yZCwgJGJvYXJkWyd1cmwnXSkpOyAgIyDqsoDsg4nslrQo7YKk7JuM65OcKSDsobDtlakNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICRsb2dnZXItPmRlYnVnKCRmZXRjaF91cmxzKTsNCg0KICAgIHJldHVybiAkZmV0Y2hfdXJsczsNCn0NCg0KDQojIO2GoOugjO2KuCDsgqzsnbTtirgg64+E66mU7J247J2AIOyjvOq4sOyggeycvOuhnCDrs4Dqsr3rkJjquLAg65WM66y47JeQIOygkeyGjeydtCDrtojqsIDtlZwg6rK97Jqw7JeUIOuLpOydjCDrj4TrqZTsnbjsnYQg7LC+7JWE67O464ukLg0KIyDsnpHrj5kg7JuQ66asDQojICAgLSDslYTsp4Eg64+E66mU7J247J20IOyCtOyVhOyeiOyngOunjCDqs6cg67OA6rK965CgIOyYiOygleyduCDqsr3smrAg7J2R64u17Zek642U7J2YIExvY2F0aW9u7JeQIOuzgOqyveuQoCDrj4TrqZTsnbjsnYQg7J2R64u17ZWY64qUIOqyveyasOqwgCDsnojsnYwNCiMgICAtIOuPhOuplOyduOyXkCDsnbzroKjrsojtmLjqsIAg7J6I64qUIOqyveyasCDrsojtmLjrpbwg7Kad6rCA7Iuc7YKk66m07IScIOuLpOydjOuyiCDrj4TrqZTsnbjsnYQg7LC+7JWE67O464ukLiAg7JiIKSB3d3cudG9ycmVudGRpYTIuY29tID4gd3d3LnRvcnJlbnRkaWEzLmNvbQ0KIyAgIC0g67OA6rK965CcIOuPhOuplOyduOydgCBVc2VyQ29uZmlnLnBocOyXkCDquLDroZ3tlbTrkZDqs6Ag64uk7J2M67aA7YSw64qUIO2VtOuLuSDsoJXrs7Trpbwg7IKs7JqpDQojIOuzgOqyvSDsiJzshJwNCiMgICAxKSBVc2VyQ29uZmlnLnBocOyXkCDrs4Dqsr3soITtm4Qg64+E66mU7J24IOygleuztOqwgCDsnojri6TrqbQg7ZW064u5IOuPhOuplOyduCDsgqzsmqkNCiMgICAyLTEpIOuPhOuplOyduOydtCDsnKDtmqjtlZzsp4Ag7Iuk7KCc66GcIOygkeyGjeydhCDsi5zrj4TtlZjsl6wg7KCQ6rKAIO2bhCBMb2NhdGlvbiDtl6TrjZTqsIAg7J6I64uk66m0IOuPhOuplOyduCDrs4Dqsr0NCiMgICAyLTIpIGh0dHAg7J2R64u17L2U65Oc6rCAIOygleyDgSgyMDAp7J20IOyVhOuLiOudvOuptCDrj4TrqZTsnbjsl5Ag7Y+s7ZWo65CcIOydvOugqOuyiO2YuOulvCDspp3qsIDsi5ztgqTrqbTshJwg64uk7J2MIOuPhOuplOyduCDqsoDsg4kNCiMgICAzKSDrs4Dqsr0g7KCV67O066W8IFVzZXJDb25maWcucGhw7JeQIOq4sOuhnQ0KIyANCmZ1bmN0aW9uIHVwZGF0ZV9kb21haW4oJGJvYXJkX3VybHMpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQogICAgZ2xvYmFsICRPTERfRE9NQUlOLCAkTkVXX0RPTUFJTjsNCg0KICAgICMgMS4g7LKr67KI7Ke4IHVybOyXkOyEnCDrj4TrqZTsnbgg7KCV67O0IOy2lOy2nA0KICAgICRwYXJzZWQgPSBwYXJzZV91cmwoJGJvYXJkX3VybHNbMF1bJ3VybCddKTsNCiAgICAkY3VycmVudF9kb21haW4gPSAkcGFyc2VkWydob3N0J107ICAgIyAkQ09ORklH7JeQIOq4sOuhneuQnCDrj4TrqZTsnbgNCiAgICAkY2hhbmdlZF9kb21haW4gPSAkY3VycmVudF9kb21haW47ICAgIyDstZzsooUg67OA6rK965CcIOuPhOuplOyduA0KDQogICAgJGxvZ2dlci0+ZGVidWcoIlwkY3VycmVudF9kb21haW4gPSAkY3VycmVudF9kb21haW4iKTsNCg0KICAgICMgMi4gVXNlckNvbmZpZy5waHDsl5Ag6riw66Gd65CcIOuzgOqyveyghOuPhOuplOyduCgkT0xEX0RPTUFJTinqs7wg7J287LmY7ZWc64uk66m0IOuPhOuplOyduCDrs4Dqsr0g7LKY66asDQogICAgaWYgKGlzc2V0KCRPTERfRE9NQUlOKSAmJiAkT0xEX0RPTUFJTiA9PSAkY3VycmVudF9kb21haW4pIHsNCiAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gJE5FV19ET01BSU47DQogICAgICAgICRsb2dnZXItPmRlYnVnKCJVc2VyQ29uZmlnLnBocCDtjIzsnbzsnZggTkVXX0RPTUFJTiDsoJXrs7Trpbwg7IKs7Jqp7ZWoOiAkTkVXX0RPTUFJTiIpOw0KICAgIH0NCg0KICAgICMgMy4g7Iuk7KCcIGZldGNo7ZWY7JesIOuPhOuplOyduOydtCDrs4Dqsr3rkJDripTsp4Ag7ZmV7J24DQogICAgJGNoZWNrX3VybCA9ICRwYXJzZWRbInNjaGVtZSJdIC4gJzovLycgLiAkY2hhbmdlZF9kb21haW47DQogICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCRjaGVja191cmwpOw0KDQogICAgIyBMb2NhdGlvbiDtl6TrjZTqsIAg7J6I64uk64qUIOqyg+ydgCDrj4TrqZTsnbjsnbQg67OA6rK965CQ64uk64qUIOucuw0KICAgIGlmIChwcmVnX21hdGNoKCcvXkxvY2F0aW9uOiAoLispJC9taScsICRoZWFkZXIsICRtYXRjaCkpIHsNCiAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gcGFyc2VfdXJsKCRtYXRjaFsxXSlbJ2hvc3QnXTsNCiAgICAgICAgJGxvZ2dlci0+aW5mbygiTG9jYXRpb24g7Zek642U7JeQ7IScIOyLoOq3nCDrj4TrqZTsnbjsnYQg7LC+7JWY7Iq164uI64ukOiAiIC4gJGNoYW5nZWRfZG9tYWluKTsNCiAgICB9DQoNCiAgICAjIOq3uCDsmbgg7KCV7IOBIOydkeuLteydhCDrqrvrsJvsnYAg6rK97Jqw7JeUIOuPhOuplOyduOyXkCDsnojripQg7J2866Co67KI7Zi466W8IOywvuyVhCDtlZjrgpjslKkg7Kad6rCA7ZWY66m07IScIOuPhOuplOyduOydhCDssL7slYTrs7jri6QuDQogICAgIyDsmIgpIGh0dHBzOi8vdG9ycmVudHZpZXczOC5jb20vID0+IDM47J2EIDM5LCA0MCDrk7HsnLzroZwg67OA6rK97ZWY66m07IScIOyDiOuhnOyatCDrj4TrqZTsnbjsnYQg7LC+64qU64ukLg0KICAgIGVsc2UgaWYgKCRodHRwX2NvZGUgIT0gMjAwKSB7DQogICAgICAgICRuZXdfZG9tYWluX2ZvdW5kZWQgPSBmYWxzZTsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9eKC4rPykoW1xkXXsxLDN9KShcLi4rKSQvJywgJGNoYW5nZWRfZG9tYWluLCAkbWF0Y2gpKSB7DQogICAgICAgICAgICAkZG9tYWluXzAxID0gJG1hdGNoWzFdOw0KICAgICAgICAgICAgJGRvbWFpbl8wMiA9IGludHZhbCgkbWF0Y2hbMl0pOw0KICAgICAgICAgICAgJGRvbWFpbl8wMyA9ICRtYXRjaFszXTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgZm9yKCRpPTA7ICRpPDEwOyAkaSsrKSB7DQogICAgICAgICAgICAgICAgJGRvbWFpbl8wMisrOw0KICAgICAgICAgICAgICAgICR0cnlfZG9tYWluID0gICRkb21haW5fMDEgLiAkZG9tYWluXzAyIC4gJGRvbWFpbl8wMzsNCiAgICAgICAgICAgICAgICAkdHJ5X3VybCA9ICRwYXJzZWRbInNjaGVtZSJdIC4gJzovLycgLiAkdHJ5X2RvbWFpbjsNCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICBsaXN0KCRodHRwX2NvZGUyLCAkaGVhZGVyMiwgJGh0bWwyKSA9IGN1cmxfZmV0Y2goJHRyeV9kb21haW4pOw0KICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlRyaWVkIHRvIGNoZWNrIGlmICR0cnlfdXJsIGlzIGFsaXZlLiBhbmQgaHR0cF9jb2RlIGlzICRodHRwX2NvZGUyIik7DQogICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgaWYgKCRodHRwX2NvZGUyID09IDIwMCkgew0KICAgICAgICAgICAgICAgICAgICAkbmV3X2RvbWFpbl9mb3VuZGVkID0gdHJ1ZTsNCiAgICAgICAgICAgICAgICAgICAgJGNoYW5nZWRfZG9tYWluID0gJHRyeV9kb21haW47DQogICAgICAgICAgICAgICAgICAgICRsb2dnZXItPmluZm8oIuuzgOqyveuQnCDrj4TrqZTsnbjsnYQg7LC+7JWY7Iq164uI64ukOiAiIC4gJGNoYW5nZWRfZG9tYWluKTsNCiAgICAgICAgICAgICAgICAgICAgYnJlYWs7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQoNCiAgICAgICAgaWYgKCEkbmV3X2RvbWFpbl9mb3VuZGVkKSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcigidG9ycmVudCDsgqzsnbTtirggWyRjdXJyZW50X2RvbWFpbl0g6rCAKOydtCkg7KO97J2AIOuTryDtlanri4jri6QuIOyiheujjO2VqeuLiOuLpC4iKTsNCiAgICAgICAgICAgIGVycm9yX3Jlc3BvbnNlKCJ0b3JyZW50IOyCrOydtO2KuCBbJGN1cnJlbnRfZG9tYWluXSDqsIAo7J20KSDso73snYAg65OvIO2VqeuLiOuLpC4g7KKF66OM7ZWp64uI64ukLiIpOw0KICAgICAgICAgICAgc2VsZl91cGRhdGUoKTsNCiAgICAgICAgICAgIGV4aXQoMCk7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIDQuIHVybCDrqqnroZ3sl5DshJwg64+E66mU7J24IOuzgOqyvQ0KICAgIGlmICgkY3VycmVudF9kb21haW4gIT0gJGNoYW5nZWRfZG9tYWluKSB7DQogICAgICAgIGZvcmVhY2ggKCRib2FyZF91cmxzIGFzICYkYnVybCkgew0KICAgICAgICAgICAgJGJ1cmxbJ3VybCddID0gc3RyX3JlcGxhY2UoJGN1cnJlbnRfZG9tYWluLCAkY2hhbmdlZF9kb21haW4sICRidXJsWyd1cmwnXSk7DQogICAgICAgIH0NCg0KICAgICAgICAkbG9nZ2VyLT5pbmZvKCLrj4TrqZTsnbjsnYQg67OA6rK97ZWp64uI64ukOiAiIC4gJGN1cnJlbnRfZG9tYWluIC4gIiAgPiAgIiAuICRjaGFuZ2VkX2RvbWFpbik7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCRib2FyZF91cmxzKTsNCiAgICB9DQoNCiAgICAjIDUuIFVzZXJDb25maWfsl5Ag67OA6rK965CcIOuPhOuplOyduCDsoJXrs7Qg6riw66GdDQogICAgaWYgKCRjdXJyZW50X2RvbWFpbiAhPSAkY2hhbmdlZF9kb21haW4pIHsNCiAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygnVXNlckNvbmZpZy5waHAnKSkgew0KICAgICAgICAgICAgJGNvbnRlbnRzID0gIjw/UEhQXG5cblwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nO1xuXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbic7XG4iOw0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgJGNvbnRlbnRzKTsNCiAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlVzZXJDb25maWcucGhw7JeQIOuzgOqyveuQnCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqCIpOw0KICAgICAgICB9DQogICAgICAgIGVsc2Ugew0KICAgICAgICBpZiAoIWlzc2V0KCRPTERfRE9NQUlOKSkgew0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgIlxuXCRPTERfRE9NQUlOID0gJyRjdXJyZW50X2RvbWFpbic7XG4iLCBGSUxFX0FQUEVORCk7DQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJVc2VyQ29uZmlnLnBocOyXkCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqDogXCRPTERfRE9NQUlOID0gJyRjdXJyZW50X2RvbWFpbiciKTsNCiAgICAgICAgfQ0KICAgICAgICBlbHNlIGlmICgkT0xEX0RPTUFJTiAhPSAkY3VycmVudF9kb21haW4pIHsNCiAgICAgICAgICAgIGZpbGVfcmVnZXhfdXBkYXRlKCdVc2VyQ29uZmlnLnBocCcsICcvXlwkT0xEX0RPTUFJTiA9IC4rL2ltJywgIlwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nOyIpOw0KICAgICAgICAgICAgJGxvZ2dlci0+aW5mbygiVXNlckNvbmZpZy5waHDsl5Ag64+E66mU7J24IOygleuztOulvCDqsLHsi6Dtlag6IFwkT0xEX0RPTUFJTiA9ICckY3VycmVudF9kb21haW4nIik7DQogICAgICAgIH0NCg0KICAgICAgICBpZiAoIWlzc2V0KCRORVdfRE9NQUlOKSkgew0KICAgICAgICAgICAgZmlsZV9wdXRfY29udGVudHMoJ1VzZXJDb25maWcucGhwJywgIlxuXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbic7XG4iLCBGSUxFX0FQUEVORCk7DQogICAgICAgICAgICAkbG9nZ2VyLT5pbmZvKCJVc2VyQ29uZmlnLnBocOyXkCDrj4TrqZTsnbgg7KCV67O066W8IOy2lOqwgO2VqDogXCRORVdfRE9NQUlOID0gJyRjaGFuZ2VkX2RvbWFpbiciKTsNCiAgICAgICAgfSANCiAgICAgICAgZWxzZSBpZiAoJE5FV19ET01BSU4gIT0gJGNoYW5nZWRfZG9tYWluKSB7DQogICAgICAgICAgICBmaWxlX3JlZ2V4X3VwZGF0ZSgnVXNlckNvbmZpZy5waHAnLCAnL15cJE5FV19ET01BSU4gPSAuKy9pbScsICJcJE5FV19ET01BSU4gPSAnJGNoYW5nZWRfZG9tYWluJzsiKTsNCiAgICAgICAgICAgICRsb2dnZXItPmluZm8oIlVzZXJDb25maWcucGhw7JeQIOuPhOuplOyduCDsoJXrs7Trpbwg6rCx7Iug7ZWoOiBcJE5FV19ET01BSU4gPSAnJGNoYW5nZWRfZG9tYWluJyIpOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgcmV0dXJuICRib2FyZF91cmxzOw0KfQ0KDQoNCiMg7Yag66CM7Yq4IOqyjOyLnO2MkOuTpOyXkOyEnCDslYTsnbTthZwo7KCc66qpLCDtjpjsnbTsp4Drp4Htgawp66W8IOy2lOy2nO2VnOuLpC4NCmZ1bmN0aW9uIGdldF9pdGVtcygkYm9hcmRfdXJscykNCnsNCiAgICBnbG9iYWwgJGxvZ2dlcjsNCg0KICAgICRzZWxmID0gJ2h0dHAnIC4gKGlzc2V0KCRfU0VSVkVSWydIVFRQUyddKSA/ICdzJyA6ICcnKSAuICc6Ly8nIC4gJF9TRVJWRVJbJ0hUVFBfSE9TVCddIC4gcGFyc2VfdXJsKCRfU0VSVkVSWydSRVFVRVNUX1VSSSddKVsncGF0aCddOw0KICAgICRwYXR0ZXJuID0gJEdMT0JBTFNbJ0NPTkZJRyddWydfcGFnZV9saW5rJ107DQogICAgJHJlcGxhY2VfcGF0dGVybnMgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19wYWdlX2xpbmtfcHJlcHJvY2VzcyddOw0KICAgICRpc19tYWduZXQgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19kb3duX2xpbmsnXSA9PSAnbWFnbmV0JzsNCiAgICAkaXRlbXMgPSBhcnJheSgpOw0KDQogICAgJGJjbnQgPSAwOw0KDQogICAgZm9yZWFjaCAoJGJvYXJkX3VybHMgYXMgJGJ1cmwpIHsNCiAgICAgICAgJGJjbnQrKzsNCiAgICAgICAgJHVybCA9ICRidXJsWyd1cmwnXTsNCiAgICAgICAgJGNhdGVnb3J5ID0gJGJ1cmxbJ2NhdGVnb3J5J107DQoNCiAgICAgICAgbGlzdCgkaHR0cF9jb2RlLCAkaGVhZGVyLCAkaHRtbCkgPSBjdXJsX2ZldGNoKCR1cmwpOw0KDQogICAgICAgIGlmICgkaHR0cF9jb2RlICE9IDIwMCkgew0KICAgICAgICAgICAgJGxvZ2dlci0+ZXJyb3IoIkVycm9yLiBGZXRjaCBmcm9tICR1cmwgcmV0dXJuZWQgaHR0cF9jb2RlICRodHRwX2NvZGUiKTsNCiAgICAgICAgICAgICRsb2dnZXItPmVycm9yKCRoZWFkZXIpOw0KICAgICAgICAgICAgY29udGludWU7DQogICAgICAgIH0NCg0KICAgICAgICAjIGh0bWwg64K07Jqp7J2YIOydvOu2gOulvCDrr7jrpqwg67OA6rK9DQogICAgICAgIGlmICgkcmVwbGFjZV9wYXR0ZXJucykgew0KICAgICAgICAgICAgJGh0bWwgPSBwcmVwcm9jZXNzKCRodG1sLCAkcmVwbGFjZV9wYXR0ZXJucyk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygnSFRNTOydhCDsoITsspjrpqwg67OA6rK97ZWY7KeAIOyViuyKteuLiOuLpC4nKTsNCiAgICAgICAgfQ0KDQogICAgICAgIHByZWdfbWF0Y2hfYWxsKCRwYXR0ZXJuLCAkaHRtbCwgJG1hdGNoZXMsIFBSRUdfU0VUX09SREVSKTsNCg0KICAgICAgICAkY250ID0gMDsNCg0KICAgICAgICBmb3JlYWNoICgkbWF0Y2hlcyBhcyAkbWF0Y2gpIHsNCg0KICAgICAgICAgICAgJGNudCsrOw0KDQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygkbWF0Y2gpOw0KDQogICAgICAgICAgICAjIOygnOuqqeyXkCDtj6ztlajrkJwgaHRtbCDtg5zqt7jsmYAg7JWe65KkIOqzteuwseydhCDsoJzqsbDtlZzri6QuDQogICAgICAgICAgICAkdGl0bGUgPSB0cmltKGh0bWxfZW50aXR5X2RlY29kZShzdHJpcF90YWdzKCRtYXRjaFsndGl0bGUnXSkpLCAiIFx0XG5cclwwXHgwQlx4QzJceEEwIik7ICAgICMgJm5ic3A764qUIFx4QzJceEEw66GcIOuzgO2ZmOuQnOuLpC4NCg0KICAgICAgICAgICAgIyBVUkwg67O07KCVOiDsoIjrjIAg7KO87IaM66GcIOuzgOqyvSDtm4Qg7L+866as66y47J6Q7Je07JeQICcmYW1wOyfripQgJyYn66GcIOuzgOqyve2VnOuLpC4NCiAgICAgICAgICAgICRwYWdlID0gdXJsX2pvaW4oJHVybCwgdXJsX25vcm1hbGl6ZSgkbWF0Y2hbJ2xpbmsnXSkpOw0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIk5vcm1hbGl6ZWQgdXJsIGlzICRwYWdlIik7DQoNCiAgICAgICAgICAgIGlmICgkaXNfbWFnbmV0KSB7DQogICAgICAgICAgICAgICAgIyDrp4jqt7jrhLcg66eB7YGs6rmM7KeAIOyImOynke2WiOuLpOuptCDqt7jqsbgg7IKs7Jqp7ZWY6rOgIOq3uOugh+yngCDslYrsnLzrqbQg6rCc67OEIO2OmOydtOyngOuhnCDrk6TslrTqsIDshJwg66eI6re464S3IOunge2BrOulvCDssL7ripTri6QuDQogICAgICAgICAgICAgICAgJGxpbmsgPSBpc3NldCgkbWF0Y2hbJ21hZ25ldCddKSA/ICRtYXRjaFsnbWFnbmV0J10gOiBnZXRfbWFnbmV0X2xpbmsoJHBhZ2UpOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkbGluayA9ICRzZWxmIC4gJz9kPScgLiBiYXNlNjRfZW5jb2RlKCRwYWdlKTsNCiAgICAgICAgICAgIH0NCiAgICAgICAgICAgICRpdGVtc1tdID0gYXJyYXkoJ3RpdGxlJyA9PiAkdGl0bGUsICdsaW5rJyA9PiAkbGluaywgJ3BhZ2UnID0+ICRwYWdlLCAnY2F0ZWdvcnknID0+ICRjYXRlZ29yeSk7DQoNCiAgICAgICAgICAgICMgaWYgKCRjbnQgPj0gMykgYnJlYWs7ICAjIFRvZG8g6rCc67CcIOyZhOujjCDtm4Qg7KO87ISd7LKY66as7ZW07JW8IO2VqA0KICAgICAgICB9DQoNCiAgICAgICAgJGxvZ2dlci0+aW5mbyhzcHJpbnRmKCJbJWQvJWRdICVk6rG07J2YIOqysOqzvOulvCDssL7slZjsirXri4jri6QuIOqygOyDiVVSTDogJXMiLCAkYmNudCwgY291bnQoJGJvYXJkX3VybHMpLCAkY250LCAkdXJsKSk7DQogICAgfQ0KDQogICAgJGxvZ2dlci0+ZGVidWcoJGl0ZW1zKTsNCg0KICAgIHJldHVybiAkaXRlbXM7DQp9DQoNCg0KIyDsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slYTrs7Tqs6Ag7JeG7Jy866m0IHVybOyXkOyEnCDssL7slYQg67CY7ZmY7ZWc64ukLg0KZnVuY3Rpb24gZ2V0X21hZ25ldF9saW5rKCR1cmwpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbWFnbmV0ID0gbnVsbDsNCiAgICAkcmVwbGFjZV9wYXR0ZXJucyA9ICRHTE9CQUxTWydDT05GSUcnXVsnX2Rvd25fbGlua19wcmVwcm9jZXNzJ107DQoNCiAgICAjIOuniOq3uOuEtyDsupDsi5zsl5DshJwg66eB7YGs66W8IOywvuyVhOuzuOuLpC4NCiAgICBpZiAoJG1hZ25ldCA9IG1hZ25ldF9jYWNoZV9jb250cm9sKCdRdWVyeScsICR1cmwpKSB7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCLsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slZjsirXri4jri6QuIik7DQogICAgICAgICRsb2dnZXItPmRlYnVnKCLsmpTssq1VUkw6ICR1cmwiKTsNCiAgICAgICAgJGxvZ2dlci0+ZGVidWcoIk1hZ25ldDogJG1hZ25ldCIpOw0KICAgICAgICByZXR1cm4gJG1hZ25ldDsNCiAgICB9DQoNCiAgICAjIOybue2OmOydtOyngOyXkOyEnCDrp4jqt7jrhLcg66eB7YGs66W8IOywvuuKlOuLpC4NCiAgICBsaXN0KCRodHRwX2NvZGUsICRoZWFkZXIsICRodG1sKSA9IGN1cmxfZmV0Y2goJHVybCk7DQogICAgaWYgKCRodHRwX2NvZGUgIT0gMjAwKSB7DQogICAgICAgICRsb2dnZXItPmVycm9yKCJFcnJvci4gRmV0Y2hpbmcgcGFnZSBmcm9tICR1cmwgcmV0dXJuZWQgaHR0cF9jb2RlICRodHRwX2NvZGUiKTsNCiAgICAgICAgcmV0dXJuIG51bGw7DQogICAgfQ0KDQogICAgIyBodG1sIOuCtOyaqeydmCDsnbzrtoDrpbwg66+466asIOuzgOqyvQ0KICAgIGlmICgkcmVwbGFjZV9wYXR0ZXJucykgew0KICAgICAgICAkaHRtbCA9IHByZXByb2Nlc3MoJGh0bWwsICRyZXBsYWNlX3BhdHRlcm5zKTsgDQogICAgfQ0KDQogICAgJG1hZ25ldCA9IGZpbmRfbWFnbmV0KCRodG1sKTsNCg0KICAgIGlmICghJG1hZ25ldCAmJiAkR0xPQkFMU1snQ09ORklHJ11bJ19tYWduZXRfZm9sbG93X2xpbmsnXSkgew0KDQogICAgICAgIC8vICRsb2dnZXItPmRlYnVnKCRodG1sKTsNCg0KICAgICAgICAkcGF0dGVybiA9ICRHTE9CQUxTWydDT05GSUcnXVsnX21hZ25ldF9mb2xsb3dfbGluayddOw0KICAgICAgICAkbG9nZ2VyLT5kZWJ1ZygiX21hZ25ldF9mb2xsb3dfbGlua+ulvCDssL7slYTrtIXri4jri6Q6ICRwYXR0ZXJuIik7DQogICAgICAgIGlmIChwcmVnX21hdGNoKCRwYXR0ZXJuLCAkaHRtbCwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIl9tYWduZXRfZm9sbG93X2xpbmvrpbwg7LC+7JWY7Iq164uI64ukOiAiIC4gJG1hdGNoWyd1cmwnXSk7DQoNCiAgICAgICAgICAgICRmb2xsb3dfdXJsID0gdXJsX2pvaW4oJHVybCwgJG1hdGNoWyd1cmwnXSk7DQogICAgICAgICAgICAkbG9nZ2VyLT5kZWJ1Zygn66eI6re464S3IOunge2BrOulvCDssL7quLDsnITtlbQg64uk7J2MIO2OmOydtOyngOuhnCDsnbTrj5ntlanri4jri6QuICcgLiAkZm9sbG93X3VybCk7DQoNCiAgICAgICAgICAgICRtYWduZXQgPSBmaW5kX21hZ25ldCgkZm9sbG93X3VybCk7DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcign7Jik66WYISBfbWFnbmV0X2ZvbGxvd19saW5rIO2MqO2EtOydhCDssL7snYQg7IiYIOyXhuyKteuLiOuLpC4nKTsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgICMg66eI6re464S3IOy6kOyLnOyXkCDrp4Htgazrpbwg7JeF642w7J207Yq47ZWc64ukLg0KICAgICRtYWduZXQgJiYgbWFnbmV0X2NhY2hlX2NvbnRyb2woJ1VwZGF0ZScsICR1cmwsICRtYWduZXQpOw0KDQogICAgIyDrp4jqt7jrhLcg66eB7YGs66W8IOuwmO2ZmO2VnOuLpC4NCiAgICByZXR1cm4gJG1hZ25ldDsNCn0NCg0KDQojIOuniOq3uOuEtyDrp4HtgazsnZgg7LqQ7Iuc66W8IOq0gOumrO2VnOuLpC4gKOyhsO2ajCwg7LaU6rCALCDsoIDsnqUsIOyYpOuemOuQnCDrjbDsnbTtg4Ag7IKt7KCcKQ0KZnVuY3Rpb24gbWFnbmV0X2NhY2hlX2NvbnRyb2woJGFjdGlvbiwgJHVybCA9IG51bGwsICRtYWduZXQgPSBudWxsKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgc3RhdGljICRtYWduZXRfY2FjaGUgPSAnTi9BJywgJGNhY2hlX2ZpbGUgPSBudWxsLCAkY2FjaGVfdXBkYXRlZCA9IGZhbHNlOw0KICAgICRrZXkgPSBudWxsOw0KDQogICAgIyB1cmzsl5DshJwg6rKM7Iuc66y8IOqzoOycoOuyiO2YuCjsiKvsnpAgNOyekOumrCDsnbTsg4Ep7JmAIOy6kOyLnO2MjOydvOuqheydhCDssL7ripTri6QuDQogICAgaWYgKCR1cmwpIHsNCiAgICAgICAgaWYgKHByZWdfbWF0Y2goJy9cZFxkXGRcZCsvJywgJHVybCwgJG1hdGNoKSkgew0KICAgICAgICAgICAgJGtleSA9ICRtYXRjaFswXTsNCiAgICAgICAgfQ0KICAgICAgICBpZiAoJGNhY2hlX2ZpbGUgPT0gbnVsbCkgew0KICAgICAgICAgICAgJGhvc3QgPSBwYXJzZV91cmwoJHVybClbJ2hvc3QnXTsNCiAgICAgICAgICAgICRjYWNoZV9maWxlID0gc3lzX2dldF90ZW1wX2RpcigpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICd0b3JyLicgLiAkaG9zdCAuICcuY2FjaGUnOw0KICAgICAgICAgICAgJGxvZ2dlci0+ZGVidWcoIuy6kOyLnO2MjOydvOydgCAkY2FjaGVfZmlsZSDsnoXri4jri6QuIik7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIOy6kOyLnOyXkOyEnCDrp4jqt7jrhLcg66eB7YGsIOyhsO2ajA0KICAgIGlmICgkYWN0aW9uID09ICdRdWVyeScpIHsNCiAgICAgICAgIyDrp4jqt7jrhLcg7LqQ7Iuc6rCAIOuEkOydtOuptCDtjIzsnbzsl5DshJwg7J297Ja065Ok7J2464ukLg0KICAgICAgICBpZiAoJG1hZ25ldF9jYWNoZSA9PSAnTi9BJykgew0KICAgICAgICAgICAgJGNvbnRlbnQgPSBAZmlsZV9nZXRfY29udGVudHMoJGNhY2hlX2ZpbGUpOw0KICAgICAgICAgICAgaWYgKCRjb250ZW50ICE9IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgJG1hZ25ldF9jYWNoZSA9IHVuc2VyaWFsaXplKCRjb250ZW50KTsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJG1hZ25ldF9jYWNoZSA9IGFycmF5KCk7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCg0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zsl5DshJwga2V5IOyhsO2ajA0KICAgICAgICBpZiAoaXNzZXQoJG1hZ25ldF9jYWNoZVska2V5XSkpIHsNCiAgICAgICAgICAgICRtYWduZXQgPSAkbWFnbmV0X2NhY2hlWyRrZXldWydtYWduZXQnXTsNCiAgICAgICAgICAgICRsb2dnZXItPmRlYnVnKCLsupDsi5zsl5DshJwg66eI6re464S3IOunge2BrOulvCDssL7slZjsirXri4jri6QuIGtleT1bJGtleV0gbWFnbmV0PVskbWFnbmV0XSIpOw0KICAgICAgICAgICAgcmV0dXJuICRtYWduZXQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAjIOy6kOyLnOyXkCDrp4jqt7jrhLcg66eB7YGsIOy2lOqwgA0KICAgIGVsc2VpZiAoJGFjdGlvbiA9PSAnVXBkYXRlJykgew0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zqsIAg64SQ7J2066m0IOyYpOulmCDsspjrpqztlZzri6QuDQogICAgICAgIGlmICgkbWFnbmV0X2NhY2hlID09ICdOL0EnKSB7DQogICAgICAgICAgICAkbG9nZ2VyLT5lcnJvcigiRXJyb3IuIOuniOq3uOuEtyDsupDsi5zqsIAg7IOd7ISx65CY7KeAIOyViuyVhCBVcGRhdGUg7LKY66as66W8IO2VoCDsiJgg7JeG7Iq164uI64ukLiIpOw0KICAgICAgICAgICAgc2VsZl91cGRhdGUoKTsNCiAgICAgICAgICAgIGV4aXQoMSk7DQogICAgICAgIH0NCg0KICAgICAgICAjIOuniOq3uOuEtyDsupDsi5zsl5Aga2V5LCBtYWduZXQg7LaU6rCADQogICAgICAgICRtYWduZXRfY2FjaGVbJGtleV0gPSBhcnJheSgnbWFnbmV0JyA9PiAkbWFnbmV0LCAnaW5zZXJ0ZWQnID0+IHRpbWUoKSk7DQogICAgICAgICRjYWNoZV91cGRhdGVkID0gdHJ1ZTsNCiAgICB9DQoNCiAgICAjIOy6kOyLnOulvCDtjIzsnbzroZwg7KCA7J6lDQogICAgZWxzZWlmICgkYWN0aW9uID09ICdXcml0ZScpIHsNCiAgICAgICAgaWYgKCRjYWNoZV91cGRhdGVkKSB7DQogICAgICAgICAgICAjIOqyveufiSDsupDsi5wg7Jyg7KeA66W8IOychO2VtCDsnbzsoJXsnbwg7J207IOBIOqyveqzvO2VnCDrjbDsnbTtg4DripQg7IKt7KCc7ZWc64ukLg0KICAgICAgICAgICAgJGRlbGV0ZWQgPSAwOw0KICAgICAgICAgICAgZm9yZWFjaCAoJG1hZ25ldF9jYWNoZSBhcyAka2V5ID0+ICRpdGVtKSB7DQogICAgICAgICAgICAgICAgaWYgKCRpdGVtWydpbnNlcnRlZCddICsgKE1BR05FVF9DQUNIRV9DT05TRVJWRV9EQVlTICogNjAgKiA2MCAqIDI0KSA8IHRpbWUoKSkgew0KICAgICAgICAgICAgICAgICAgICB1bnNldCgkbWFnbmV0X2NhY2hlWyRrZXldKTsNCiAgICAgICAgICAgICAgICAgICAgJGRlbGV0ZWQrKzsNCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgICAgICAkZGVsZXRlZCA+IDAgJiYgJGxvZ2dlci0+ZGVidWcoIkRlbGV0ZWQgJGRlbGV0ZWQgY2FjaGUgaXRlbXMuIik7DQoNCiAgICAgICAgICAgICMg7LqQ7IucIOyggOyepQ0KICAgICAgICAgICAgJGNvbnRlbnQgPSBzZXJpYWxpemUoJG1hZ25ldF9jYWNoZSk7DQogICAgICAgICAgICBmaWxlX3B1dF9jb250ZW50cygkY2FjaGVfZmlsZSwgJGNvbnRlbnQpOw0KICAgICAgICAgICAgJGNhY2hlX3VwZGF0ZWQgPSBmYWxzZTsNCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQojIO2GoOugjO2KuCDslYTsnbTthZwo7KCc66qpLCDtjpjsnbTsp4Drp4Htgawp7Jy866GcIHJzc+ulvCDsg53shLHtlZzri6QuDQpmdW5jdGlvbiBidWlsZF9yc3MoJGl0ZW1zKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgJHNlbGYgPSAnaHR0cCcgLiAoaXNzZXQoJF9TRVJWRVJbJ0hUVFBTJ10pID8gJ3MnIDogJycpIC4gJzovLycgLiAkX1NFUlZFUlsnSFRUUF9IT1NUJ10gLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXTsNCg0KICAgICRiID0gaXNzZXQoJF9HRVRbJ2InXSkgPyB0cmltKCRfR0VUWydiJ10pIDogJyc7DQogICAgJGsgPSBpc3NldCgkX0dFVFsnayddKSA/IHRyaW0oJF9HRVRbJ2snXSkgOiAnJzsNCiAgICBpZiAoJGIgPT0gJycgJiYgJGsgPT0gJycpIHsNCiAgICAgICAgJHRpdGxlID0gIkl0J3MgdG9yciEiOw0KICAgIH0gZWxzZSB7DQogICAgICAgICR0aXRsZSA9ICJJdCdzIHRvcnIhICgiIC4gKCRiID8gJGIgLiAiOiAiIDogIiIpIC4gKCRrID8gJGsgOiAiQWxsIikgLiAiKSI7DQogICAgfQ0KDQogICAgJHJzcyAgPSAiPD94bWwgdmVyc2lvbj1cIjEuMFwiIGVuY29kaW5nPVwiVVRGLThcIiA/PlxuPHJzcyB2ZXJzaW9uPVwiMi4wXCI+XG4iOw0KICAgICRyc3MgLj0gIjxjaGFubmVsPjx0aXRsZT4kdGl0bGU8L3RpdGxlPjxsaW5rPiIgLiBodG1sZW50aXRpZXMoJHNlbGYpIC4gIjwvbGluaz48ZGVzY3JpcHRpb24+QSBzaW1wbGUgdG9ycmVudCBmZWVkIGJ5IHRvcnIuPC9kZXNjcmlwdGlvbj5cbiI7DQogICAgZm9yZWFjaCAoJGl0ZW1zIGFzICRpdGVtKSB7DQogICAgICAgIGlmICgkaXRlbVsnbGluayddKSB7DQogICAgICAgICAgICAkcnNzIC49ICI8aXRlbT48dGl0bGU+PCFbQ0RBVEFbIiAuICRpdGVtWyd0aXRsZSddIC4gIl1dPjwvdGl0bGU+PGxpbms+IiAuIGh0bWxlbnRpdGllcygkaXRlbVsnbGluayddKSAuICI8L2xpbms+IjsNCiAgICAgICAgICAgICRyc3MgLj0gIjxjb21tZW50cz48IVtDREFUQVsiIC4gaHRtbGVudGl0aWVzKCRpdGVtWydwYWdlJ10pIC4gIl1dPjwvY29tbWVudHM+PGNhdGVnb3J5PjwhW0NEQVRBWyIgLiAkaXRlbVsnY2F0ZWdvcnknXSAuICJdXT48L2NhdGVnb3J5PjwvaXRlbT5cbiI7DQogICAgICAgIH0NCiAgICB9DQogICAgJHJzcyAuPSAiPC9jaGFubmVsPlxuPC9yc3M+IjsNCg0KICAgICRsb2dnZXItPmluZm8oIlJTU+ulvCDsg53shLHtlojsirXri4jri6QuIOqxtOyImDogIiAuIGNvdW50KCRpdGVtcykpOw0KICAgICRsb2dnZXItPmRlYnVnKCRyc3MpOw0KDQogICAgcmV0dXJuICRyc3M7DQp9DQoNCg0KIyDtgbTrnbzsnbTslrjtirjroZwgcnNz66W8IOyghOyGoe2VnOuLpC4NCmZ1bmN0aW9uIHJlc3BvbnNlKCRkYXRhKQ0Kew0KICAgIGhlYWRlcignQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi9yc3MreG1sOyBjaGFyc2V0PXV0Zi04Jyk7DQogICAgZWNobyAkZGF0YTsNCn0NCg0KIyDtgbTrnbzsnbTslrjtirjroZwg7Jik66WYIOuplOyLnOyngOulvCDsoITshqHtlZzri6QuDQpmdW5jdGlvbiBlcnJvcl9yZXNwb25zZSgkZGF0YSkNCnsNCiAgICBoZWFkZXIoJ0NvbnRlbnQtVHlwZTogdGV4dC9wbGFpbjsgY2hhcnNldD11dGYtOCcpOw0KICAgIGVjaG8gJGRhdGE7DQp9DQoNCg0KIyDthqDroIztirggcnNzIOyalOyyreydhCDsspjrpqztlZzri6QuDQpmdW5jdGlvbiBtYWtlX3JzcygpDQp7DQogICAgJGJvYXJkX3VybHMgPSBwYXJzZV9wYXJhbSgpOw0KDQogICAgJGNvbmZpcm1lZF91cmxzID0gdXBkYXRlX2RvbWFpbigkYm9hcmRfdXJscyk7ICAjIOuPhOuplOyduCDrs4Dqsr0g7LKY66asDQoNCiAgICAkdG9ycmVudF9pdGVtcyA9IGdldF9pdGVtcygkY29uZmlybWVkX3VybHMpOw0KDQogICAgJHJzcyA9IGJ1aWxkX3JzcygkdG9ycmVudF9pdGVtcyk7DQoNCiAgICBtYWduZXRfY2FjaGVfY29udHJvbCgnV3JpdGUnKTsgICMg66eI6re464S3IOy6kOyLnCDrlJTsiqTtgawg6riw66GdDQoNCiAgICByZXNwb25zZSgkcnNzKTsNCn0NCg0KDQojIO2GoOugjO2KuCDtjIzsnbwoLnRvcnJlbnQp7J2EIOuLpOyatOuhnOuTnO2VnOuLpC4NCmZ1bmN0aW9uIGRvd25sb2FkX3RvcnJlbnQoJGxpbmspDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAkbG9nZ2VyLT5kZWJ1ZygiRG93bmxvYWRpbmcgdG9ycmVudCBmaWxlIGZyb20gJGxpbmsiKTsNCg0KICAgIGxpc3QoJGh0dHBfY29kZSwgJGhlYWRlciwgJGJvZHkpID0gY3VybF9mZXRjaCgkbGluayk7DQoNCiAgICBpZiAoJGh0dHBfY29kZSAhPSAyMDApIHsNCiAgICAgICAgJGxvZ2dlci0+ZXJyb3IoIkVycm9yLiBEb3dubG9hZCB0b3JyZW50IGZpbGUgZnJvbSAkbGluayByZXR1cm5lZCBodHRwX2NvZGUgJGh0dHBfY29kZSIpOw0KICAgICAgICByZXR1cm47DQogICAgfQ0KDQogICAgaWYgKHByZWdfbWF0Y2goJy9eQ29udGVudC1EaXNwb3NpdGlvbjouKyQvbWknLCAkaGVhZGVyLCAkbWF0Y2gpKSB7DQogICAgICAgIGhlYWRlcigiQ29udGVudC1UeXBlOiBhcHBsaWNhdGlvbi94LWJpdHRvcnJlbnQiKTsNCiAgICAgICAgaGVhZGVyKHRyaW0oJG1hdGNoWzBdKSk7DQogICAgICAgIGVjaG8gJGJvZHk7DQogICAgfQ0KfQ0KDQoNCiMg7Ju57Y6Y7J207KeA7JeQ7IScIO2GoOugjO2KuCDtjIzsnbwg66eB7YGs66W8IOywvuyVhCDri6TsmrTroZzrk5ztlZzri6QuDQpmdW5jdGlvbiBkb19kb3dubG9hZCgkdXJsKQ0Kew0KICAgIGdsb2JhbCAkbG9nZ2VyOw0KDQogICAgJHJlcGxhY2VfcGF0dGVybnMgPSAkR0xPQkFMU1snQ09ORklHJ11bJ19kb3duX2xpbmtfcHJlcHJvY2VzcyddOw0KICAgIGxpc3QoJGh0dHBfY29kZSwgJGhlYWRlciwgJGh0bWwpID0gY3VybF9mZXRjaCgkdXJsKTsNCg0KICAgIGlmICgkaHR0cF9jb2RlICE9IDIwMCkgew0KICAgICAgICAkbG9nZ2VyLT5lcnJvcigiRXJyb3IuIEZldGNoIGZyb20gJHVybCByZXR1cm5lZCBodHRwX2NvZGUgJGh0dHBfY29kZSIpOw0KICAgICAgICAkbG9nZ2VyLT5lcnJvcigkaGVhZGVyKTsNCiAgICAgICAgcmV0dXJuOw0KICAgIH0NCg0KICAgICRodG1sID0gcHJlcHJvY2VzcygkaHRtbCwgJHJlcGxhY2VfcGF0dGVybnMpOyAgIyBodG1sIOuCtOyaqeydmCDsnbzrtoDrpbwg66+466asIOuzgOqyvQ0KICAgICRwYXR0ZXJuID0gJEdMT0JBTFNbJ0NPTkZJRyddWydfZG93bl9saW5rJ107DQoNCiAgICBpZiAocHJlZ19tYXRjaCgkcGF0dGVybiwgJGh0bWwsICRtYXRjaCkpIHsNCiAgICAgICAgJGxvZ2dlci0+ZGVidWcoJG1hdGNoKTsNCiAgICAgICAgJGxpbmsgPSB1cmxfam9pbigkdXJsLCAkbWF0Y2hbMV0pOw0KICAgICAgICBkb3dubG9hZF90b3JyZW50KCRsaW5rKTsNCiAgICB9DQp9DQoNCg0KZnVuY3Rpb24gbWFpbigpDQp7DQogICAgZ2xvYmFsICRsb2dnZXI7DQoNCiAgICAjIOyalOyyrSDsoJXrs7Qg7Lac66ClDQogICAgJGxvZ2dlci0+aW5mbygidG9yciDrsoTsoIQ6ICIgLiBWRVJTSU9OKTsNCiAgICAkbG9nZ2VyLT5pbmZvKCLsg4jroZzsmrQg7JqU7LKt7J20IOuTpOyWtOyZlOyKteuLiOuLpC4gSVA9IiAuICAkX1NFUlZFUlsnUkVNT1RFX0FERFInXSk7DQogICAgJGxvZ2dlci0+aW5mbygiUkVRVUVTVF9VUkk6ICIgLiAkX1NFUlZFUlsnUkVRVUVTVF9VUkknXSk7DQogICAgJGxvZ2dlci0+ZGVidWcoJF9TRVJWRVIpOw0KDQogICAgaWYgKGlzc2V0KCRfR0VUWydkJ10pKSB7DQogICAgICAgIGRvX2Rvd25sb2FkKGJhc2U2NF9kZWNvZGUoJF9HRVRbJ2QnXSkpOw0KICAgIH0gZWxzZSB7DQogICAgICAgIG1ha2VfcnNzKCk7DQogICAgICAgIHNlbGZfdXBkYXRlKCk7DQogICAgfQ0KfQ0KDQoNCmZ1bmN0aW9uIGdlbl9iYXNlNjQoKSB7DQogICAgJGxvY2FsX2Jhc2U2NCA9IGJhc2U2NF9lbmNvZGUoZmlsZV9nZXRfY29udGVudHMoX19GSUxFX18pKTsNCiAgICBwcmludCgkbG9jYWxfYmFzZTY0KTsNCn0NCg0KDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KIyMgTWFpbigpDQojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIw0KaWYgKGlzc2V0KCRhcmdjKSAmJiAkYXJnYyA+IDEgJiYgJGFyZ3ZbMV0gPT0gJ2Jhc2U2NCcpIHsNCiAgICBnZW5fYmFzZTY0KCk7DQp9IGVsc2Ugew0KICAgIG1haW4oKTsNCn0NCg0K

Function Calls

None

Variables

None

Stats

MD5 7773f8ddfcd30ee24e0f93957c50bb23
Eval Count 0
Decode Time 333 ms