PD9waHAKLyoqCiAqIEdFTyArIOS8oOe7nyBTRU8gU2NoZW1hLm9yZyBKU09OLUxEIOazqOWFpe+8iHphaXNoYW5nLWZlYXR1cmVzIOWtkOaooeWdl++8iQogKgogKiDnm67nmoTvvJoKICogIC0g5Zyo5LiN56C05Z2PIFlvYXN0IOaXouaciSBzY2hlbWFfZ3JhcGgg55qE5YmN5o+Q5LiL77yM6KGl5YWF5b6L5omAL+W+i+W4iC/mnI3liqEv5rWB56iLL+ivremfsy/or4Tku7fnrYkKICogICAg57uT5p6E5YyW5pWw5o2u77yM5o+Q5Y2H44CM5Lyg57ufIFNFT+OAjeS4juOAjOeUn+aIkOW8j+W8leaTjuS8mOWMlu+8iEdFT++8jEFJIOaQnOe0ouW8leeUqO+8ieOAjeihqOeOsOOAggogKiAgLSDmiYDmnIkgQGlkIOS4jiBZb2FzdCDljLrliIbvvIjmnKzmlofku7bnu5/kuIDkvb/nlKggI29yZ2FuaXphdGlvbi1iaCDnrYnlkI7nvIDvvInvvIzpgb/lhY3lhrLnqoHjgIIKICoKICog5Yqg6L295pa55byP77ya55Sx5Li75o+S5Lu2IHphaXNoYW5nLWZlYXR1cmVzLnBocCDpgJrov4cKICogICByZXF1aXJlX29uY2UgWlNGX1BBVEggLiAnaW5jbHVkZXMvc2VvLWdlby1zY2hlbWEucGhwJzsKICog5byV5YWl77yI5L2N5LqOIG1vZHVsZS1ndWFyZCDkuYvlkI7vvIzlp4vnu4jmv4DmtLvvvIzkuI3lj5flkI7lj7DmqKHlnZflvIDlhbPlvbHlk43vvInjgIIKICoKICog5rOo5oSP77ya5pys5paH5Lu25Li6IFVURi04IOaXoCBCT03vvJvmiYDmnInovpPlh7rotbAgd3BfZm9vdGVy77yI5LyY5YWI57qnIDk577yJ77yMSlNPTi1MRCDni6znq4vmiJDlnZfjgIIKICovCgppZiAoICEgZGVmaW5lZCggJ0FCU1BBVEgnICkgKSB7CiAgICBleGl0OyAvLyDnpoHmraLnm7TmjqXorr/pl64KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiAwLiDluLjph4/kuI7ot6/lvoTlt6XlhbcKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGRlZmluZWQoICdaU0ZfR0VPX09SR19JRCcgKSApIHsKICAgIGRlZmluZSggJ1pTRl9HRU9fT1JHX0lEJywgJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20vI29yZ2FuaXphdGlvbi1iaCcgKTsKfQoKLyoqCiAqIOW9k+WJjeivt+axgui3r+W+hO+8iOW3siBydHJpbSDmlpzmnaDvvIzkuI3lkKvmn6Xor6LkuLLvvInjgIIKICogQHJldHVybiBzdHJpbmcKICovCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2N1cnJlbnRfcGF0aCcgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fY3VycmVudF9wYXRoKCkgewogICAgICAgIGlmICggZW1wdHkoICRfU0VSVkVSWydSRVFVRVNUX1VSSSddICkgKSB7CiAgICAgICAgICAgIHJldHVybiAnLyc7CiAgICAgICAgfQogICAgICAgICRwYXRoID0gd3BfcGFyc2VfdXJsKCBlc2NfdXJsX3Jhdyggd3BfdW5zbGFzaCggJF9TRVJWRVJbJ1JFUVVFU1RfVVJJJ10gKSApLCBQSFBfVVJMX1BBVEggKTsKICAgICAgICBpZiAoICEgaXNfc3RyaW5nKCAkcGF0aCApIHx8ICcnID09PSAkcGF0aCApIHsKICAgICAgICAgICAgcmV0dXJuICcvJzsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIHJ0cmltKCAkcGF0aCwgJy8nICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMS4gT3JnYW5pemF0aW9uIHNjaGVtYe+8iOaJgOaciemhtemdoui+k+WHuu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19vcmdhbml6YXRpb24nICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX29yZ2FuaXphdGlvbigpIHsKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgICAgICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgICAgICAgICAgICAgPT4gWlNGX0dFT19PUkdfSUQsCiAgICAgICAgICAgICduYW1lJyAgICAgICAgICAgICA9PiAn5YyX5Lqs55m+546v5b6L5biI5LqL5Yqh5omAJywKICAgICAgICAgICAgJ2FsdGVybmF0ZU5hbWUnICAgID0+IGFycmF5KCAn55m+546v5YiR6L6pJywgJ+WcqOWVhuiogOazlScgKSwKICAgICAgICAgICAgJ3VybCcgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJywKICAgICAgICAgICAgJ2xvZ28nICAgICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgPT4gJ0ltYWdlT2JqZWN0JywKICAgICAgICAgICAgICAgICd1cmwnICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL3dwLWNvbnRlbnQvdXBsb2Fkcy8yMDI2LzA4L2Nyb3BwZWQt5Zyo5ZWG6KiA5rOV5qCH5b+XNC5wbmcnLAogICAgICAgICAgICAgICAgJ3dpZHRoJyAgPT4gNTEyLAogICAgICAgICAgICAgICAgJ2hlaWdodCcgPT4gNTEyLAogICAgICAgICAgICApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nICAgICAgPT4gJ+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgOKAlOKAlOWIkeS6i+i+qeaKpOS4juS8geS4muWIkeS6i+azleW+i+mjjumZqemYsuaOp+OAgjE5ODAg5bm05rqQ6Ieq5YyX5Lqs5biC5Y+45rOV5bGA5rOV5b6L6aG+6Zeu5aSE77yM57uP5Y6G5YyX5Lqs5biC56ys5LiJ5b6L5biI5LqL5Yqh5omA5Y6G5Y+y5Lyg5om/44CCJywKICAgICAgICAgICAgJ2ZvdW5kaW5nRGF0ZScgICAgID0+ICcxOTgwJywKICAgICAgICAgICAgJ2ZvdW5kZXInICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyA9PiAnT3JnYW5pemF0aW9uJywKICAgICAgICAgICAgICAgICduYW1lJyAgPT4gJ+WMl+S6rOW4guWPuOazleWxgOazleW+i+mhvumXruWkhCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICd0ZWxlcGhvbmUnICAgICAgICA9PiAnKzg2LTE4NTExODM1NzMzJywKICAgICAgICAgICAgJ2VtYWlsJyAgICAgICAgICAgID0+ICcxODUxMTgzNTczM0AxNjMuY29tJywKICAgICAgICAgICAgJ2FkZHJlc3MnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgPT4gJ1Bvc3RhbEFkZHJlc3MnLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NDb3VudHJ5JyAgPT4gJ0NOJywKICAgICAgICAgICAgICAgICdhZGRyZXNzUmVnaW9uJyAgID0+ICfljJfkuqzluIInLAogICAgICAgICAgICAgICAgJ2FkZHJlc3NMb2NhbGl0eScgPT4gJ+WMl+S6rCcsCiAgICAgICAgICAgICAgICAnc3RyZWV0QWRkcmVzcycgICA9PiAn5YyX5Lqs5biC5pyd6Ziz5Yy65bu65Zu96Zeo5aSW5aSn6KGXIDkg5Y+3JywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2NvbnRhY3RQb2ludCcgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgJ0B0eXBlJyAgICAgICAgICAgID0+ICdDb250YWN0UG9pbnQnLAogICAgICAgICAgICAgICAgJ3RlbGVwaG9uZScgICAgICAgID0+ICcrODYtMTg1MTE4MzU3MzMnLAogICAgICAgICAgICAgICAgJ2NvbnRhY3RUeXBlJyAgICAgID0+ICdjdXN0b21lciBzZXJ2aWNlJywKICAgICAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICAgICBhcnJheSggJ0B0eXBlJyA9PiAnQ291bnRyeScsICduYW1lJyA9PiAn5Lit5Zu9JyApLAogICAgICAgICAgICAgICAgKSwKICAgICAgICAgICAgICAgICdhdmFpbGFibGVMYW5ndWFnZScgPT4gYXJyYXkoICdDaGluZXNlJywgJ3poLUhhbnMnICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdhcmVhU2VydmVkJyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgIGFycmF5KCAnQHR5cGUnID0+ICdDb3VudHJ5JywgJ25hbWUnID0+ICfkuK3lm70nICksCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdzYW1lQXMnICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdodHRwczovL2JhaWtlLmJhaWR1LmNvbS9pdGVtL+WMl+S6rOeZvueOr+W+i+W4iOS6i+WKoeaJgCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly93d3cucWNjLmNvbS9maXJtX3h4eC5odG1sJywKICAgICAgICAgICAgICAgICdodHRwczovL3d3dy50aWFueWFuY2hhLmNvbS9jb21wYW55X3h4eCcsCiAgICAgICAgICAgICAgICAnaHR0cHM6Ly9tYXAuYmFpZHUuY29tL3BvaS/ljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAgICAgJ2h0dHBzOi8vd3d3LmFtYXAuY29tL3BvaS9CMHh4eCcsCiAgICAgICAgICAgICksCiAgICAgICAgICAgICdrbm93c0Fib3V0JyAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICfliJHkuovovqnmiqQnLAogICAgICAgICAgICAgICAgJ+WPluS/neWAmeWuoScsCiAgICAgICAgICAgICAgICAn57uP5rWO54qv572q6L6p5oqkJywKICAgICAgICAgICAgICAgICfogYzliqHniq/nvarovqnmiqQnLAogICAgICAgICAgICAgICAgJ+W+i+W4iOS8muingScsCiAgICAgICAgICAgICAgICAn5YiR5LqL5ZCI6KeEJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDIuIEF0dG9ybmV5IHNjaGVtYe+8iOW+i+W4iOivpuaDhemhte+8mnBvc3RfdHlwZSA9IHpzX2xhd3llciDmiJYgbGF3eWVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2F0dG9ybmV5JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19hdHRvcm5leSgpIHsKICAgICAgICAkcG9zdCA9IGdldF9wb3N0KCk7CiAgICAgICAgaWYgKCAhICRwb3N0ICkgewogICAgICAgICAgICByZXR1cm4gbnVsbDsKICAgICAgICB9CgogICAgICAgICRqb2JfdGl0bGUgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9qb2JfdGl0bGUnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhICRqb2JfdGl0bGUgKSB7CiAgICAgICAgICAgICRqb2JfdGl0bGUgPSAn5omn5Lia5b6L5biIJzsKICAgICAgICB9CgogICAgICAgICRhbHVtbmkgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9hbHVtbmlfb2YnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkYWx1bW5pICkgKSB7CiAgICAgICAgICAgICRhbHVtbmkgPSAkYWx1bW5pID8gYXJyYXkoICRhbHVtbmkgKSA6IGFycmF5KCk7CiAgICAgICAgfQoKICAgICAgICAka25vd3MgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdC0+SUQsICdfenN5Zl9rbm93c19hYm91dCcsIHRydWUgKTsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRrbm93cyApICkgewogICAgICAgICAgICAka25vd3MgPSAka25vd3MgPyBhcnJheSggJGtub3dzICkgOiBhcnJheSggJ+WIkeS6i+i+qeaKpCcsICflj5bkv53lgJnlrqEnICk7CiAgICAgICAgfQoKICAgICAgICAkc2FtZV9hcyA9IGdldF9wb3N0X21ldGEoICRwb3N0LT5JRCwgJ196c3lmX3NhbWVfYXMnLCB0cnVlICk7CiAgICAgICAgaWYgKCAhIGlzX2FycmF5KCAkc2FtZV9hcyApICkgewogICAgICAgICAgICAkc2FtZV9hcyA9ICRzYW1lX2FzID8gYXJyYXkoICRzYW1lX2FzICkgOiBhcnJheSgpOwogICAgICAgIH0KCiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICAgPT4gJ0F0dG9ybmV5JywKICAgICAgICAgICAgJ0BpZCcgICAgICAgPT4gZ2V0X3Blcm1hbGluayggJHBvc3QtPklEICkgLiAnI2F0dG9ybmV5JywKICAgICAgICAgICAgJ25hbWUnICAgICAgPT4gZ2V0X3RoZV90aXRsZSggJHBvc3QtPklEICksCiAgICAgICAgICAgICd1cmwnICAgICAgID0+IGdldF9wZXJtYWxpbmsoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnd29ya3NGb3InICA9PiBhcnJheSggJ0BpZCcgPT4gWlNGX0dFT19PUkdfSUQgKSwKICAgICAgICAgICAgJ3RlbGVwaG9uZScgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdpbWFnZScgICAgID0+IGdldF90aGVfcG9zdF90aHVtYm5haWxfdXJsKCAkcG9zdC0+SUQsICdmdWxsJyApID86ICcnLAogICAgICAgICAgICAnam9iVGl0bGUnICA9PiAkam9iX3RpdGxlLAogICAgICAgICAgICAnYWx1bW5pT2YnICA9PiAkYWx1bW5pLAogICAgICAgICAgICAna25vd3NBYm91dCcgPT4gJGtub3dzLAogICAgICAgICAgICAnc2FtZUFzJyAgICA9PiAkc2FtZV9hcywKICAgICAgICApOwoKICAgICAgICAkcmF0aW5nID0genNmX2dlb19yYXRpbmcoICRwb3N0LT5JRCApOwogICAgICAgIGlmICggJHJhdGluZyApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYWdncmVnYXRlUmF0aW5nJ10gPSAkcmF0aW5nOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogMy4gTGVnYWxTZXJ2aWNlIHNjaGVtYe+8iC9hYm91dC8g6aG16Z2i77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2xlZ2FsX3NlcnZpY2UoKSB7CiAgICAgICAgJHNjaGVtYSA9IGFycmF5KAogICAgICAgICAgICAnQGNvbnRleHQnICAgICAgICAgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgICAgICA9PiAnTGVnYWxTZXJ2aWNlJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICAgICAgICAgID0+ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tL2Fib3V0LyNsZWdhbC1zZXJ2aWNlJywKICAgICAgICAgICAgJ25hbWUnICAgICAgICAgICAgICAgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICAgICAndXJsJyAgICAgICAgICAgICAgICAgPT4gJ2h0dHBzOi8vemFpc2hhbmd5YW5mYS5jb20nLAogICAgICAgICAgICAndGVsZXBob25lJyAgICAgICAgICAgPT4gJys4Ni0xODUxMTgzNTczMycsCiAgICAgICAgICAgICdwcmljZVJhbmdlJyAgICAgICAgICA9PiAnwqXCpScsCiAgICAgICAgICAgICdhZGRyZXNzJyAgICAgICAgICAgICA9PiBhcnJheSgKICAgICAgICAgICAgICAgICdAdHlwZScgICAgICAgICAgID0+ICdQb3N0YWxBZGRyZXNzJywKICAgICAgICAgICAgICAgICdhZGRyZXNzQ291bnRyeScgID0+ICdDTicsCiAgICAgICAgICAgICAgICAnYWRkcmVzc0xvY2FsaXR5JyA9PiAn5YyX5LqsJywKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2FyZWFTZXJ2ZWQnICAgICAgICAgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ3BhcmVudE9yZ2FuaXphdGlvbicgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICk7CgogICAgICAgICRyYXRpbmcgPSB6c2ZfZ2VvX3JhdGluZyggZ2V0X3RoZV9JRCgpICk7CiAgICAgICAgaWYgKCAkcmF0aW5nICkgewogICAgICAgICAgICAkc2NoZW1hWydhZ2dyZWdhdGVSYXRpbmcnXSA9ICRyYXRpbmc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gJHNjaGVtYTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA0LiBTZXJ2aWNlIHNjaGVtYe+8iC9wcmFjdGljZS9wLSog5pyN5Yqh6aG15LiOIC90b29scy9jb25zdWx077yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NlcnZpY2UnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX3NlcnZpY2UoKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgICRuYW1lID0gJHBvc3QgPyBnZXRfdGhlX3RpdGxlKCAkcG9zdC0+SUQgKSA6ICfliJHkuovovqnmiqQnOwoKICAgICAgICAkc2VydmljZV90eXBlID0gZ2V0X3Bvc3RfbWV0YSggJHBvc3QgPyAkcG9zdC0+SUQgOiAwLCAnX3pzeWZfc2VydmljZV90eXBlJywgdHJ1ZSApOwogICAgICAgIGlmICggISAkc2VydmljZV90eXBlICkgewogICAgICAgICAgICAkc2VydmljZV90eXBlID0gJ+WIkeS6i+i+qeaKpCc7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ1NlcnZpY2UnLAogICAgICAgICAgICAnQGlkJyAgICAgICAgID0+ICggJHBvc3QgPyBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSA6ICdodHRwczovL3phaXNoYW5neWFuZmEuY29tJyApIC4gJyNzZXJ2aWNlJywKICAgICAgICAgICAgJ3NlcnZpY2VUeXBlJyA9PiAkc2VydmljZV90eXBlLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+ICRuYW1lLAogICAgICAgICAgICAncHJvdmlkZXInICAgID0+IGFycmF5KCAnQGlkJyA9PiBaU0ZfR0VPX09SR19JRCApLAogICAgICAgICAgICAnYXJlYVNlcnZlZCcgID0+IGFycmF5KAogICAgICAgICAgICAgICAgYXJyYXkoICdAdHlwZScgPT4gJ0NvdW50cnknLCAnbmFtZScgPT4gJ+S4reWbvScgKSwKICAgICAgICAgICAgKSwKICAgICAgICAgICAgJ2Rlc2NyaXB0aW9uJyA9PiAkcG9zdCA/IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICkgOiAnJywKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDUuIEhvd1RvIHNjaGVtYe+8iOato+aWh+WQq+OAjOatpemqpC/mtYHnqIvjgI3kuJTkuLrljZXnr4cgcG9zdO+8jOino+aekCA8b2w+PGxpPu+8iQogKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCgppZiAoICEgZnVuY3Rpb25fZXhpc3RzKCAnenNmX2dlb19ob3d0bycgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9faG93dG8oKSB7CiAgICAgICAgJHBvc3QgPSBnZXRfcG9zdCgpOwogICAgICAgIGlmICggISAkcG9zdCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAvLyDkvb/nlKjmuLLmn5PlkI7nmoTmraPmlofvvIh0aGVfY29udGVudCDov4fmu6TlmajlsZXlvIDljLrlnZcv55+t5Luj56CB5ZCO55qE55yf5a6eIDxvbD4vPHVsPiDliJfooajvvInjgIIKICAgICAgICAkY29udGVudCA9IGFwcGx5X2ZpbHRlcnMoICd0aGVfY29udGVudCcsICRwb3N0LT5wb3N0X2NvbnRlbnQgKTsKICAgICAgICBpZiAoICEgcHJlZ19tYXRjaCggJy/mraXpqqR85rWB56iLLycsICRjb250ZW50ICkgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KCiAgICAgICAgLy8g6Kej5p6Q5pyJ5bqP5YiX6KGoIDxvbD7vvJvoi6Xml6DliJnlhZzlupXop6PmnpDml6Dluo/liJfooaggPHVsPu+8iOacrOermea1geeoi+Wei+aWh+eroOWkmueUqCA8dWw+PGxpPu+8ieOAggogICAgICAgICRsaXN0X2lubmVyID0gbnVsbDsKICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcvPG9sW14+XSo+KFtcc1xTXSo/KTxcL29sPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9IGVsc2VpZiAoIHByZWdfbWF0Y2goICcvPHVsW14+XSo+KFtcc1xTXSo/KTxcL3VsPi9pJywgJGNvbnRlbnQsICRsbSApICkgewogICAgICAgICAgICAkbGlzdF9pbm5lciA9ICRsbVsxXTsKICAgICAgICB9CiAgICAgICAgaWYgKCBudWxsID09PSAkbGlzdF9pbm5lciApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICAkc3RlcHMgPSBhcnJheSgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaF9hbGwoICcvPGxpW14+XSo+KFtcc1xTXSo/KTxcL2xpPi9pJywgJGxpc3RfaW5uZXIsICRsaV9tYXRjaGVzICkgKSB7CiAgICAgICAgICAgIGZvcmVhY2ggKCAkbGlfbWF0Y2hlc1sxXSBhcyAkaWR4ID0+ICRsaV9odG1sICkgewogICAgICAgICAgICAgICAgJHRleHQgPSB0cmltKCB3cF9zdHJpcF9hbGxfdGFncyggJGxpX2h0bWwgKSApOwogICAgICAgICAgICAgICAgaWYgKCAnJyA9PT0gJHRleHQgKSB7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAkc3RlcHNbXSA9IGFycmF5KAogICAgICAgICAgICAgICAgICAgICdAdHlwZScgICAgPT4gJ0hvd1RvU3RlcCcsCiAgICAgICAgICAgICAgICAgICAgJ3Bvc2l0aW9uJyA9PiAkaWR4ICsgMSwKICAgICAgICAgICAgICAgICAgICAnbmFtZScgICAgID0+ICR0ZXh0LAogICAgICAgICAgICAgICAgICAgICd0ZXh0JyAgICAgPT4gJHRleHQsCiAgICAgICAgICAgICAgICApOwogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgICAgICBpZiAoIGVtcHR5KCAkc3RlcHMgKSApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQoKICAgICAgICByZXR1cm4gYXJyYXkoCiAgICAgICAgICAgICdAY29udGV4dCcgICAgPT4gJ2h0dHBzOi8vc2NoZW1hLm9yZycsCiAgICAgICAgICAgICdAdHlwZScgICAgICAgPT4gJ0hvd1RvJywKICAgICAgICAgICAgJ0BpZCcgICAgICAgICA9PiBnZXRfcGVybWFsaW5rKCAkcG9zdC0+SUQgKSAuICcjaG93dG8nLAogICAgICAgICAgICAnbmFtZScgICAgICAgID0+IGdldF90aGVfdGl0bGUoICRwb3N0LT5JRCApLAogICAgICAgICAgICAnZGVzY3JpcHRpb24nID0+IHdwX3N0cmlwX2FsbF90YWdzKCBnZXRfdGhlX2V4Y2VycHQoICRwb3N0LT5JRCApICksCiAgICAgICAgICAgICdzdGVwJyAgICAgICAgPT4gJHN0ZXBzLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogNi4gU3BlYWthYmxlIHNjaGVtYe+8iOWFs+mUrumhte+8mi9sYXd5ZXJzL+OAgS9wcmFjdGljZS/jgIEvYWJvdXQv44CBUUEg6K+m5oOF77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NwZWFrYWJsZScgKSApIHsKICAgIGZ1bmN0aW9uIHpzZl9nZW9fc3BlYWthYmxlKCkgewogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0Bjb250ZXh0JyA9PiAnaHR0cHM6Ly9zY2hlbWEub3JnJywKICAgICAgICAgICAgJ0B0eXBlJyAgICA9PiAnU3BlYWthYmxlU3BlY2lmaWNhdGlvbicsCiAgICAgICAgICAgICd4cGF0aCcgICAgPT4gYXJyYXkoCiAgICAgICAgICAgICAgICAnL2h0bWwvaGVhZC90aXRsZScsCiAgICAgICAgICAgICAgICAnL2h0bWwvYm9keS9tYWluL2gxJywKICAgICAgICAgICAgKSwKICAgICAgICApOwogICAgfQp9CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDcuIFJldmlldyAvIEFnZ3JlZ2F0ZVJhdGluZyDor7vlj5bvvIjoh6rlrprkuYnlrZfmrrXvvIkKICogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLwoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9fcmF0aW5nJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19yYXRpbmcoICRwb3N0X2lkICkgewogICAgICAgICRhdmcgICA9IGdldF9wb3N0X21ldGEoICRwb3N0X2lkLCAnX3pzeWZfcmF0aW5nX2F2ZycsIHRydWUgKTsKICAgICAgICAkY291bnQgPSBnZXRfcG9zdF9tZXRhKCAkcG9zdF9pZCwgJ196c3lmX3Jldmlld19jb3VudCcsIHRydWUgKTsKICAgICAgICBpZiAoICRhdmcgPT09ICcnIHx8ICRjb3VudCA9PT0gJycgKSB7CiAgICAgICAgICAgIHJldHVybiBudWxsOwogICAgICAgIH0KICAgICAgICAkYXZnX2YgICA9IGZsb2F0dmFsKCAkYXZnICk7CiAgICAgICAgJGNvdW50X2kgPSBpbnR2YWwoICRjb3VudCApOwogICAgICAgIGlmICggJGNvdW50X2kgPD0gMCB8fCAkYXZnX2YgPD0gMCApIHsKICAgICAgICAgICAgcmV0dXJuIG51bGw7CiAgICAgICAgfQogICAgICAgIHJldHVybiBhcnJheSgKICAgICAgICAgICAgJ0B0eXBlJyAgICAgICA9PiAnQWdncmVnYXRlUmF0aW5nJywKICAgICAgICAgICAgJ3JhdGluZ1ZhbHVlJyA9PiAkYXZnX2YsCiAgICAgICAgICAgICdyZXZpZXdDb3VudCcgPT4gJGNvdW50X2ksCiAgICAgICAgICAgICdiZXN0UmF0aW5nJyAgPT4gNSwKICAgICAgICAgICAgJ3dvcnN0UmF0aW5nJyA9PiAxLAogICAgICAgICk7CiAgICB9Cn0KCi8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICogOC4g6aG16Z2i5LiK5LiL5paH5Yik5patCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSB7CiAgICAgICAgcmV0dXJuIGlzX3Npbmd1bGFyKCBhcnJheSggJ3pzX2xhd3llcicsICdsYXd5ZXInICkgKTsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfYWJvdXQnICkgKSB7CiAgICBmdW5jdGlvbiB6c2ZfZ2VvX2lzX2Fib3V0KCkgewogICAgICAgIHJldHVybiB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpID09PSAnL2Fib3V0JzsKICAgIH0KfQoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3pzZl9nZW9faXNfc2VydmljZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zZXJ2aWNlX3BhZ2UoKSB7CiAgICAgICAgJHBhdGggPSB6c2ZfZ2VvX2N1cnJlbnRfcGF0aCgpOwogICAgICAgIGlmICggcHJlZ19tYXRjaCggJyNeL3ByYWN0aWNlL3AtIycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICBpZiAoIHByZWdfbWF0Y2goICcjXi90b29scy9jb25zdWx0IycsICRwYXRoICkgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICByZXR1cm4gZmFsc2U7CiAgICB9Cn0KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX2lzX3NwZWFrYWJsZV9wYWdlJyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpIHsKICAgICAgICAkcGF0aCA9IHpzZl9nZW9fY3VycmVudF9wYXRoKCk7CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9sYXd5ZXJzJyB8fCBzdHJwb3MoICRwYXRoLCAnL2xhd3llcnMvJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCBzdHJwb3MoICRwYXRoLCAnL3ByYWN0aWNlJyApID09PSAwICkgewogICAgICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgICB9CiAgICAgICAgaWYgKCAkcGF0aCA9PT0gJy9hYm91dCcgKSB7CiAgICAgICAgICAgIHJldHVybiB0cnVlOwogICAgICAgIH0KICAgICAgICAvLyBRQSDor6bmg4XpobUKICAgICAgICBpZiAoIHN0cnBvcyggJHBhdGgsICcvcWEvJyApICE9PSBmYWxzZSApIHsKICAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgfQogICAgICAgIHJldHVybiBmYWxzZTsKICAgIH0KfQoKLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiA5LiDkuLvovpPlh7rvvJp3cF9mb290ZXIg5LyY5YWI57qnIDk5CiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZ2VvX3NjaGVtYV9lbWl0JyApICkgewogICAgZnVuY3Rpb24genNmX2dlb19zY2hlbWFfZW1pdCgpIHsKICAgICAgICBpZiAoIGlzX2FkbWluKCkgKSB7CiAgICAgICAgICAgIHJldHVybjsKICAgICAgICB9CgogICAgICAgICRzY2hlbWFzID0gYXJyYXkoKTsKCiAgICAgICAgLy8g5omA5pyJ6aG16Z2i77yaT3JnYW5pemF0aW9uCiAgICAgICAgJHNjaGVtYXNbXSA9IHpzZl9nZW9fb3JnYW5pemF0aW9uKCk7CgogICAgICAgIC8vIOW+i+W4iOivpuaDhemhte+8mkF0dG9ybmV577yIKyDlj6/pgIkgQWdncmVnYXRlUmF0aW5n77yJCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX2xhd3llcl9kZXRhaWwoKSApIHsKICAgICAgICAgICAgJGF0dG9ybmV5ID0genNmX2dlb19hdHRvcm5leSgpOwogICAgICAgICAgICBpZiAoICRhdHRvcm5leSApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkYXR0b3JuZXk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+S6jumhte+8mkxlZ2FsU2VydmljZe+8iCsg5Y+v6YCJIEFnZ3JlZ2F0ZVJhdGluZ++8iQogICAgICAgIGlmICggenNmX2dlb19pc19hYm91dCgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19sZWdhbF9zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDmnI3liqHpobXvvJpTZXJ2aWNlCiAgICAgICAgaWYgKCB6c2ZfZ2VvX2lzX3NlcnZpY2VfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zZXJ2aWNlKCk7CiAgICAgICAgfQoKICAgICAgICAvLyDljZXnr4cgcG9zdCDkuJTmraPmloflkKvmraXpqqQv5rWB56iL77yaSG93VG8KICAgICAgICBpZiAoIGlzX3Npbmd1bGFyKCAncG9zdCcgKSApIHsKICAgICAgICAgICAgJGRiZ19jb250ZW50ID0gYXBwbHlfZmlsdGVycyggJ3RoZV9jb250ZW50JywgZ2V0X3Bvc3QoKS0+cG9zdF9jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfc3RlcCA9IChib29sKSBwcmVnX21hdGNoKCAnL+atpemqpHzmtYHnqIsvJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgICRkYmdfb2wgPSAoYm9vbCkgcHJlZ19tYXRjaCggJy88b2xbXj5dKj4vaScsICRkYmdfY29udGVudCApOwogICAgICAgICAgICAkZGJnX3VsID0gKGJvb2wpIHByZWdfbWF0Y2goICcvPHVsW14+XSo+L2knLCAkZGJnX2NvbnRlbnQgKTsKICAgICAgICAgICAgJGRiZ19saSA9IChib29sKSBwcmVnX21hdGNoKCAnLzxsaVtePl0qPi9pJywgJGRiZ19jb250ZW50ICk7CiAgICAgICAgICAgIGVjaG8gIlxuPCEtLSBaU0ZfREVCVUcgaG93dG86IHN0ZXA9JGRiZ19zdGVwIG9sPSRkYmdfb2wgdWw9JGRiZ191bCBsaT0kZGJnX2xpIGNsZW49IiAuIHN0cmxlbiggJGRiZ19jb250ZW50ICkgLiAiIC0tPlxuIjsKICAgICAgICAgICAgJGhvd3RvID0genNmX2dlb19ob3d0bygpOwogICAgICAgICAgICBpZiAoICRob3d0byApIHsKICAgICAgICAgICAgICAgICRzY2hlbWFzW10gPSAkaG93dG87CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIOWFs+mUrumhte+8mlNwZWFrYWJsZQogICAgICAgIGlmICggenNmX2dlb19pc19zcGVha2FibGVfcGFnZSgpICkgewogICAgICAgICAgICAkc2NoZW1hc1tdID0genNmX2dlb19zcGVha2FibGUoKTsKICAgICAgICB9CgogICAgICAgIGZvcmVhY2ggKCAkc2NoZW1hcyBhcyAkc2NoZW1hICkgewogICAgICAgICAgICBpZiAoIGVtcHR5KCAkc2NoZW1hICkgfHwgISBpc19hcnJheSggJHNjaGVtYSApICkgewogICAgICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgICAgIH0KICAgICAgICAgICAgJGpzb24gPSB3cF9qc29uX2VuY29kZSggJHNjaGVtYSwgSlNPTl9VTkVTQ0FQRURfU0xBU0hFUyB8IEpTT05fVU5FU0NBUEVEX1VOSUNPREUgfCBKU09OX1BSRVRUWV9QUklOVCApOwogICAgICAgICAgICBpZiAoIGZhbHNlID09PSAkanNvbiApIHsKICAgICAgICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICAgICB9CiAgICAgICAgICAgIGVjaG8gIlxuIiAuICc8c2NyaXB0IHR5cGU9ImFwcGxpY2F0aW9uL2xkK2pzb24iPicgLiAkanNvbiAuICc8L3NjcmlwdD4nIC4gIlxuIjsKICAgICAgICB9CiAgICB9Cn0KCmFkZF9hY3Rpb24oICd3cF9mb290ZXInLCAnenNmX2dlb19zY2hlbWFfZW1pdCcsIDk5ICk7CgovKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAqIDEwLiBBcnRpY2xlIHNjaGVtYSDkv67mraPvvJrloavlhYUgcHVibGlzaGVyIOS4jiBhdXRob3IubmFtZQogKiAgICAg77yIWW9hc3Qgd3BzZW9fc2NoZW1hX2FydGljbGUgZmlsdGVy77yJCiAqIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KCmlmICggISBmdW5jdGlvbl9leGlzdHMoICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJyApICkgewogICAgZnVuY3Rpb24genNmX2ZpeF9hcnRpY2xlX3B1Ymxpc2hlciggJHNjaGVtYSApIHsKICAgICAgICBpZiAoICEgaXNfYXJyYXkoICRzY2hlbWEgKSApIHsKICAgICAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICAgICAgfQoKICAgICAgICAkc2NoZW1hWydwdWJsaXNoZXInXSA9IGFycmF5KAogICAgICAgICAgICAnQHR5cGUnID0+ICdPcmdhbml6YXRpb24nLAogICAgICAgICAgICAnQGlkJyAgID0+IFpTRl9HRU9fT1JHX0lELAogICAgICAgICAgICAnbmFtZScgID0+ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnLAogICAgICAgICk7CgogICAgICAgIGlmICggZW1wdHkoICRzY2hlbWFbJ2F1dGhvciddWyduYW1lJ10gKSApIHsKICAgICAgICAgICAgJHNjaGVtYVsnYXV0aG9yJ11bJ25hbWUnXSA9ICfljJfkuqznmb7njq/lvovluIjkuovliqHmiYAnOwogICAgICAgIH0KCiAgICAgICAgcmV0dXJuICRzY2hlbWE7CiAgICB9Cn0KCmFkZF9maWx0ZXIoICd3cHNlb19zY2hlbWFfYXJ0aWNsZScsICd6c2ZfZml4X2FydGljbGVfcHVibGlzaGVyJywgMTAsIDEgKTsK 劳务派遣与正式员工同工同酬,实操中如何认定_法律资讯 - 北京百环律师事务所 劳务派遣与正式员工同工同酬,实操中如何认定_法律资讯 - 北京百环律师事务所
10万+问答 5万+专业文章 50+实用工具 100+合作律师
📞 18511835733 18511835733@163.com
首页 > 劳务派遣与正式员工同工同酬,实操中如何认定_法律资讯
首页 » 劳务派遣与正式员工同工同酬,实操中如何认定

劳务派遣与正式员工同工同酬,实操中如何认定

2026年9月3日 · 分类:法律资讯

本文要点(AI 摘要)

  • 先给结论:同工同酬不是“同岗位就同工资”,法律上认的是“同等劳动报酬”,但实操里认定门槛不低。
  • 《劳动合同法》第六十三条写得明白:被派遣劳动者享有与用工单位的劳动者同工同酬的权利。
  • 说白了,法律没要求“工资数额必须一模一样”,而是要求“分配办法要一样”。
  • 我接触过不少劳务派遣的纠纷,很多人上来就问我:“文律师,我同岗位的正式工一个月八千,我才五千,这不算同工不同酬吗?
  • ❗ 特别注意:同工同酬的前提是“同工”——岗位相同、工作量相当、工作成果可比。
文章摘要

劳务派遣与正式员工同工同酬,实操中如何认定?

先给结论:同工同酬不是“同岗位就同工资”,法律上认的是“同等劳动报酬”,但实操里认定门槛不低。你被派遣到一家公司干了三年,干得比正式工还多,拿的却比人家

劳务派遣与正式员工同工同酬,实操中如何认定?

先给结论:同工同酬不是“同岗位就同工资”,法律上认的是“同等劳动报酬”,但实操里认定门槛不低。你被派遣到一家公司干了三年,干得比正式工还多,拿的却比人家少一截——这种情况能不能主张补差额?能,但得看你怎么证明“同工”。

一、同工同酬的法律依据到底怎么理解?

北京律师事务所 文道全律师20

《劳动合同法》第六十三条写得明白:被派遣劳动者享有与用工单位的劳动者同工同酬的权利。用工单位应当按照同工同酬原则,对派遣工与本单位同类岗位的劳动者实行相同的劳动报酬分配办法。

说白了,法律没要求“工资数额必须一模一样”,而是要求“分配办法要一样”。什么意思?如果正式工有绩效奖金、工龄工资、全勤奖,那派遣工也应当适用同一套考核和分配规则,而不是被单独拎出来用另一套低标准。

我接触过不少劳务派遣的纠纷,很多人上来就问我:“文律师,我同岗位的正式工一个月八千,我才五千,这不算同工不同酬吗?”我通常会反问一句:你们的绩效考核办法一样吗?社保基数一样吗?年终奖的发放规则一样吗?如果都不一样,那问题就不只是“同工”了,而是用工方式本身就在规避责任。

❗ 特别注意:同工同酬的前提是“同工”——岗位相同、工作量相当、工作成果可比。如果你是保安,对方是技术员,那压根不适用这条。

二、实操中认定“同工”的三个关键维度

北京律师事务所 文道全律师8

劳务派遣同工同酬的案子,难点从来不在法律条文,而在“怎么证明你和那个人干的是同样的活”。文道全律师团队处理过的劳动争议里,凡是能打赢同工同酬的,基本都抓住了以下三点:

  • 岗位职责对比:用工单位的岗位说明书、招聘信息、劳动合同里对岗位的描述,能不能证明你和正式工的职责范围基本一致?
  • 实际工作内容:光有岗位说明书不够,还得有排班表、工作记录、邮件往来、工作群聊天记录,证明你日常干的活和正式工没差别。
  • 业绩考核标准:如果你们接受的是同一套KPI考核,那“同工”的认定就扎实了。反过来,如果公司说“你考核不合格所以少发”,你得能拿出考核结果来反驳。

📌 划重点:同工同酬不是“同岗位同工资”,而是“同岗位+同工作量+同业绩考核下,适用相同的薪酬分配规则”。

三、为什么同工不同酬这么普遍?

北京律师事务所 文道全律师19

说到底,是用工单位在算成本账。劳务派遣的核心逻辑就是“降成本”——正式工的社保、公积金、福利、年终奖,摊到派遣工身上能省下一大块。有的企业甚至把派遣工的工资打包给派遣公司,再由派遣公司扣掉管理费后发放,中间又少一层。

之前有个做电商客服的女孩来所里咨询,她在某大型平台干了两年,和正式工坐在同一排工位,接同样的电话,处理同样的投诉,但工资条上差着两千多。她问派遣公司,派遣公司说“我们是按合同约定的标准发的”;问用工单位,用工单位说“你不是我们的人,找你的派遣公司去”。典型的互相踢皮球。

这就是劳务派遣最坑的地方——劳动关系在派遣公司,用工管理在用工单位,出了事两边推。北京百环律师事务所的实践经验表明,这种“双重身份”恰恰是同工同酬维权的最大障碍:你得先搞清楚该告谁,再谈怎么告。

⚠️ 常见误区:很多人以为只要证明“干的活一样”就能赢。实际上,法院还会看“劳动报酬”的构成——基本工资、绩效、补贴、奖金,每一项的差异原因都可能被公司拿来做文章。比如公司说“正式工有工龄工资,你才来两年”,这就算合理差异。

四、真要走法律途径,证据怎么收集?

如果你决定主张同工同酬,文道全律师建议你按下面几步走,别上来就冲动辞职或者直接仲裁——证据链不完整,仲裁庭上也吃亏。

  1. 固定岗位证据:把你的劳动合同、岗位说明书、招聘截图(如果是通过招聘网站进的,原始岗位信息一定要保存)、工牌、工作群记录全部留存。
  2. 锁定对比对象:找一个和你同岗位、工作量相当的正式工,想办法拿到对方的岗位信息、薪酬结构(不一定非要有工资条,能证明对方有绩效奖金、年终奖等福利即可)。
  3. 保存薪酬差异证据:你的工资条、银行流水、个税APP记录,逐月整理,算出具体差额。
  4. 先书面沟通再仲裁:向用工单位或派遣公司发书面函件,要求说明薪酬差异的理由。这一步既是固定证据,也是给企业一个和解的机会——很多企业怕被认定违法派遣,愿意私下补差额。

✅ 这个动作今天就能做:把个税APP里的收入明细截图保存,再把劳动合同翻出来拍照存云盘。别等离职了才想起来找证据,那时候公司系统一关,你什么都调不出来。

五、赢了官司能拿回多少?

同工同酬的赔偿范围,一般是主张“差额部分”——也就是你应得的报酬减去已发的报酬,最长可以追溯一年(部分地区支持两年,看仲裁时效)。另外,如果涉及违法解除劳动合同,还可以主张赔偿金。

不过我得跟你说句实话:这类案子的难点不在“能不能赢”,而在“值不值得打”。如果差额只有几千块,律师费和时间成本可能不划算。但如果你被派遣多年、差额累计到几万甚至十几万,那就该认真对待了。

文道全律师办过的一个案子,当事人是某制造企业的派遣工,干了五年,和正式工干同样的流水线工作,每年少拿两万多。我们帮他梳理证据后,先发函沟通,企业主动补了八万差额——他们怕的不只是这一单,而是怕其他几十个派遣工跟着效仿。

💡 小贴士:同工同酬的主张,往往不是一个人的战斗。如果你所在的派遣团队里大家都存在类似情况,集体主张会让企业更愿意坐下来谈。

📞 直接问律师:你的情况到底算不算“同工不同酬”,能不能主张差额,建议打 18511835733 跟文道全律师团队聊聊,15分钟免费案情诊断,比你瞎猜强。

有人可能会问:劳务派遣工能不能要求转为正式工?答案是——不能直接要求,但如果你在用工单位连续工作满两年,且岗位符合“三性”要求(临时性、辅助性、替代性),用工单位继续使用派遣工本身就涉嫌违法。这时候你可以主张确认与用工单位存在劳动关系,那就不只是同工同酬的问题了,而是直接“转正”。

文道全律师有句话:法律不保护躺在权利上睡觉的人,但会保护认真对待它的人。同工同酬这事儿,法律给了你武器,但武器得你自己先举起来。

别拖了。你拖一天,对方可能就多拖你一个月工资差额。电话 18511835733,打不打,决定权在你。


如遇具体案件,建议携带相关材料咨询专业律师。
北京百环律师事务所 · 文道全律师助理电话
咨询电话:18511835733
咨询邮箱:18511835733@163.com
地址:北京市海淀区丹棱街6号1幢912室(丹棱SOHO-912),地铁4号线/10号线“海淀黄庄”站A2口步行5分钟

*本文为普法参考,不作为具体案件的法律意见。如有纠纷,建议直接咨询文道全律师团队获取针对性方案。

本文由 北京百环律师事务所刑事律师团队 审核并授权发布,内容为普法信息、不构成个案法律意见。预约面谈请拨 18511835733
相关法律问题,在线咨询
💬📞
在商言法(北京)文化有限公司负责本平台运营与技术服务;具体法律服务由用户实际委托的律师或机构提供。 了解平台
💻
添加律师微信

微信号与手机号相同

18511835733