PD9waHAKCi8qKgogKiBTaG9wdGltaXplciBmdW5jdGlvbnMuCiAqCiAqIEBwYWNrYWdlIHNob3B0aW1pemVyCiAqLwoKLyoqCiAqIEFzc2lnbiB0aGUgU2hvcHRpbWl6ZXIgdmVyc2lvbiB0byBhIHZhcgogKi8KJHRoZW1lICAgICAgICAgICAgICAgPSB3cF9nZXRfdGhlbWUoICdzaG9wdGltaXplcicgKTsKJHNob3B0aW1pemVyX3ZlcnNpb24gPSAkdGhlbWVbJ1ZlcnNpb24nXTsKZGVmaW5lKCAnU0hPUFRJTUlaRVJfVkVSU0lPTicsICczLjAuMicgKTsKCi8qKgogKiBHbG9iYWwgUGF0aHMKICovCmRlZmluZSggJ1NIT1BUSU1JWkVSX0NPUkUnLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnL2luYy9jb3JlJyApOwoKaWYgKCAhIGZ1bmN0aW9uX2V4aXN0cyggJ3Nob3B0aW1pemVyX3R5cG9ncmFwaHkyX2VuYWJsZWQnICkgKSB7CgkvKioKCSAqIERldGVybWluZXMgd2hldGhlciBvciBub3QgdG8gbG9hZCB0eXBvZ3JhcGh5IDIuMAoJICoKCSAqIEBzaW5jZSAyLjAKCSAqLwoJZnVuY3Rpb24gc2hvcHRpbWl6ZXJfdHlwb2dyYXBoeTJfZW5hYmxlZCgpIHsKCQkkZGVmYXVsdCA9IGZhbHNlOwoJCXJldHVybiAoYm9vbCkgYXBwbHlfZmlsdGVycyggJ3Nob3B0aW1pemVyX3R5cG9ncmFwaHkyX2VuYWJsZWQnLCAkZGVmYXVsdCApOwoJfQp9CgovKioKICogRW5xdWV1ZSBzY3JpcHRzIGFuZCBzdHlsZXMuCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9zY3JpcHRzKCkgewoKCWdsb2JhbCAkc2hvcHRpbWl6ZXJfdmVyc2lvbjsKCgl3cF9lbnF1ZXVlX3NjcmlwdCggJ3Nob3B0aW1pemVyLW1haW4nLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvanMvbWFpbi5taW4uanMnLCBhcnJheSgpLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiwgdHJ1ZSApOwoKCSRzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcyA9ICcnOwoJJHNob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfbWluaWZ5X21haW5fY3NzID0gc2hvcHRpbWl6ZXJfZ2V0X29wdGlvbiggJ3Nob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfbWluaWZ5X21haW5fY3NzJyApOwoKCSRzaG9wdGltaXplcl9sYXlvdXRfZmxvYXRpbmdfYnV0dG9uX2Rpc3BsYXkgPSAnJzsKCSRzaG9wdGltaXplcl9sYXlvdXRfZmxvYXRpbmdfYnV0dG9uX2Rpc3BsYXkgPSBzaG9wdGltaXplcl9nZXRfb3B0aW9uKCAnc2hvcHRpbWl6ZXJfbGF5b3V0X2Zsb2F0aW5nX2J1dHRvbl9kaXNwbGF5JyApOwoKCSRzaG9wdGltaXplcl9oZWFkZXJfbGF5b3V0ID0gJyc7Cgkkc2hvcHRpbWl6ZXJfaGVhZGVyX2xheW91dCA9IHNob3B0aW1pemVyX2dldF9vcHRpb24oICdzaG9wdGltaXplcl9oZWFkZXJfbGF5b3V0JyApOwoKCWlmICggaXNzZXQoICRfR0VUWydoZWFkZXInXSApICkgewoJCSRzaG9wdGltaXplcl9oZWFkZXJfbGF5b3V0ID0gJF9HRVRbJ2hlYWRlciddOwoJfQoKCWlmICggJ3llcycgPT09ICRzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcyApIHsKCQl3cF9lbnF1ZXVlX3N0eWxlKCAnc2hvcHRpbWl6ZXItbWFpbi1taW4nLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL21haW4vbWFpbi5taW4uY3NzJywgJycsICRzaG9wdGltaXplcl92ZXJzaW9uICk7Cgl9IGVsc2UgewoJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1tYWluJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL21haW4uY3NzJywgJycsICRzaG9wdGltaXplcl92ZXJzaW9uICk7Cgl9CgoJaWYgKCBpc19zaW5ndWxhciggJ3Bvc3QnICkgfHwgaXNfYXJjaGl2ZSgpIHx8IGlzX2F1dGhvcigpIHx8IGlzX2NhdGVnb3J5KCkgfHwgaXNfaG9tZSgpICkgewoJCWlmICggJ3llcycgPT09ICRzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcyApIHsKCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLWJsb2ctbWluJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL2Jsb2cubWluLmNzcycsICcnLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiApOwoJCX0gZWxzZSB7CgkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1ibG9nJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL2Jsb2cuY3NzJywgJycsICRzaG9wdGltaXplcl92ZXJzaW9uICk7CgkJfQoJfQoKCWlmICggc2hvcHRpbWl6ZXJfaXNfd29vY29tbWVyY2VfYWN0aXZhdGVkKCkgKSB7CgkJaWYgKCBpc19hY2NvdW50X3BhZ2UoKSApIHsKCQkJaWYgKCAneWVzJyA9PT0gJHNob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfbWluaWZ5X21haW5fY3NzICkgewoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLWFjY291bnQtbWluJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL215LWFjY291bnQubWluLmNzcycsICcnLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiApOwoJCQl9IGVsc2UgewoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLWFjY291bnQnLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL21haW4vbXktYWNjb3VudC5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQkJfQoJCX0KCX0KCglpZiAoIHNob3B0aW1pemVyX2lzX3dvb2NvbW1lcmNlX2FjdGl2YXRlZCgpICkgewoJCWlmICggaXNfY2FydCgpIHx8IGlzX2NoZWNrb3V0KCkgKSB7CgkJCWlmICggJ3llcycgPT09ICRzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcyApIHsKCQkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1jYXJ0LWNoZWNrb3V0LW1pbicsIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCkgLiAnL2Fzc2V0cy9jc3MvbWFpbi9jYXJ0LWNoZWNrb3V0Lm1pbi5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQkJfSBlbHNlIHsKCQkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1jYXJ0LWNoZWNrb3V0JywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL2NhcnQtY2hlY2tvdXQuY3NzJywgJycsICRzaG9wdGltaXplcl92ZXJzaW9uICk7CgkJCX0KCQl9Cgl9CgoJaWYgKCBzaG9wdGltaXplcl9pc193b29jb21tZXJjZV9hY3RpdmF0ZWQoKSApIHsKCQlpZiAoICd5ZXMnID09PSAkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9taW5pZnlfbWFpbl9jc3MgKSB7CgkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1tb2RhbC1taW4nLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL21haW4vbW9kYWwubWluLmNzcycsICcnLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiApOwoJCX0gZWxzZSB7CgkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1tb2RhbCcsIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCkgLiAnL2Fzc2V0cy9jc3MvbWFpbi9tb2RhbC5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQl9Cgl9CgoJaWYgKCBzaG9wdGltaXplcl9pc193b29jb21tZXJjZV9hY3RpdmF0ZWQoKSApIHsKCQlpZiAoIGlzX3Byb2R1Y3QoKSApIHsKCQkJaWYgKCAneWVzJyA9PT0gJHNob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfbWluaWZ5X21haW5fY3NzICkgewoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLXByb2R1Y3QtbWluJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL3Byb2R1Y3QubWluLmNzcycsICcnLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiApOwoJCQl9IGVsc2UgewoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLXByb2R1Y3QnLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL21haW4vcHJvZHVjdC5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQkJfQoJCX0KCX0KCglpZiAoIGlzX3Npbmd1bGFyKCkgfHwgaXNfcGFnZSgpICkgewoJCWlmICggY29tbWVudHNfb3BlbigpICkgewoJCQlpZiAoICd5ZXMnID09PSAkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9taW5pZnlfbWFpbl9jc3MgKSB7CgkJCQl3cF9lbnF1ZXVlX3N0eWxlKCAnc2hvcHRpbWl6ZXItY29tbWVudHMtbWluJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2Nzcy9tYWluL2NvbW1lbnRzLm1pbi5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQkJfSBlbHNlIHsKCQkJCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1jb21tZW50cycsIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCkgLiAnL2Fzc2V0cy9jc3MvbWFpbi9jb21tZW50cy5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCQkJfQoJCX0KCX0KCgkvLyBsb2FkaW5nIGR5bmFtaWMuY3NzIGxhdGUgYXMgaW5saW5lIHN0eWxlcyBmcm9tIGN1c3RvbWl6ZXIgYXJlIGFkZGVkIHRvIGl0LgoJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLWR5bmFtaWMtc3R5bGUnLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL21haW4vZHluYW1pYy5jc3MnLCAnJywgJHNob3B0aW1pemVyX3ZlcnNpb24gKTsKCgoJaWYgKCBzaG9wdGltaXplcl9pc193b29jb21tZXJjZV9hY3RpdmF0ZWQoKSApIHsKCQlpZiAoIGlzX3Byb2R1Y3QoKSB8fCBpc19jYXJ0KCkgKSB7CgkJCXdwX2VucXVldWVfc2NyaXB0KCAnc2hvcHRpbWl6ZXItcXVhbnRpdHknLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvanMvcXVhbnRpdHkubWluLmpzJywgYXJyYXkoKSwgJzEuMS4zJywgdHJ1ZSApOwoJCX0KCQlpZiAoIGlzX3Byb2R1Y3QoKSApIHsKCQkJd3BfZW5xdWV1ZV9zY3JpcHQoICdzaG9wdGltaXplci1hY2NvcmRpb25zJywgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeV91cmkoKSAuICcvYXNzZXRzL2pzL3BkcC1hY2NvcmRpb25zLmpzJywgYXJyYXkoKSwgJzEuMC4wJywgdHJ1ZSApOwoJCX0KCX0KCgkvLyBJZiBibG9jayBlZGl0b3IgaXMgYWN0aXZlIG9uIHRoZSBmcm9udGVuZC4KCWlmICggZnVuY3Rpb25fZXhpc3RzKCdoYXNfYmxvY2tzJykpIHsKCQlpZiAoICd5ZXMnID09PSAkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9taW5pZnlfbWFpbl9jc3MgKSB7CgkJCQl3cF9lbnF1ZXVlX3N0eWxlKCAnc2hvcHRpbWl6ZXItYmxvY2tzLW1pbicsIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCkgLiAnL2Fzc2V0cy9jc3MvbWFpbi9ibG9ja3MubWluLmNzcycsICcnLCAkc2hvcHRpbWl6ZXJfdmVyc2lvbiApOwoJCQl9IGVsc2UgewoJCQkJd3BfZW5xdWV1ZV9zdHlsZSggJ3Nob3B0aW1pemVyLWJsb2NrcycsIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnlfdXJpKCkgLiAnL2Fzc2V0cy9jc3MvbWFpbi9ibG9ja3MuY3NzJywgJycsICRzaG9wdGltaXplcl92ZXJzaW9uICk7CgkJfQoJfQoKfQoKYWRkX2FjdGlvbiggJ3dwX2VucXVldWVfc2NyaXB0cycsICdzaG9wdGltaXplcl9zY3JpcHRzJyApOwoKCi8qKgogKiBFbnF1ZXVlIHRoZW1lIHN0eWxlcyB3aXRoaW4gR3V0ZW5iZXJnLgogKi8KZnVuY3Rpb24gc2hvcHRpbWl6ZXJfZ3V0ZW5iZXJnX3N0eWxlcygpIHsKCgkvLyBMb2FkIHRoZSB0aGVtZSBzdHlsZXMgd2l0aGluIEd1dGVuYmVyZy4KCXdwX2VucXVldWVfc3R5bGUoICdzaG9wdGltaXplci1ndXRlbmJlcmcnLCBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvY3NzL2VkaXRvci9ndXRlbmJlcmcuY3NzJyApOwoKfQphZGRfYWN0aW9uKCAnZW5xdWV1ZV9ibG9ja19lZGl0b3JfYXNzZXRzJywgJ3Nob3B0aW1pemVyX2d1dGVuYmVyZ19zdHlsZXMnICk7CgoKCgovKioKICogVGhlbWUgY29tcGF0aWJpbGl0eS4KICovCnJlcXVpcmUgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIC4gJy9pbmMvY29tcGF0aWJpbGl0eS9jb21wYXRpYmlsaXR5LnBocCc7CgovLyBFbGVtZW50b3IgQ29tcGF0aWJpbGl0eSByZXF1aXJlcyBQSFAgNS40IGZvciBuYW1lc3BhY2VzLgppZiAoIHZlcnNpb25fY29tcGFyZSggUEhQX1ZFUlNJT04sICc1LjQnLCAnPj0nICkgKSB7CglyZXF1aXJlIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSAuICcvaW5jL2NvbXBhdGliaWxpdHkvZWxlbWVudG9yLXByby9jbGFzcy1zaG9wdGltaXplci1lbGVtZW50b3ItcHJvLnBocCc7Cn0KCi8qKgogKiBFeGNsdWRlcyBzb21lIGNsYXNzZXMgZnJvbSBKZXRwYWNrJ3MgbGF6eSBsb2FkLgogKi8KZnVuY3Rpb24gc2hvcHRpbWl6ZXJfbGF6eV9leGNsdWRlKCAkYmxhY2tsaXN0ZWRfY2xhc3NlcyApIHsKCSRibGFja2xpc3RlZF9jbGFzc2VzID0gYXJyYXkoCgkJJ3NraXAtbGF6eScsCgkJJ3dwLXBvc3QtaW1hZ2UnLAoJCSdwb3N0LWltYWdlJywKCQknd2lzaGxpc3QtdGh1bWJuYWlsJywKCQknY3VzdG9tLWxvZ28nLAoJKTsKCXJldHVybiAkYmxhY2tsaXN0ZWRfY2xhc3NlczsKCn0KYWRkX2ZpbHRlciggJ2pldHBhY2tfbGF6eV9pbWFnZXNfYmxvY2tlZF9jbGFzc2VzJywgJ3Nob3B0aW1pemVyX2xhenlfZXhjbHVkZScgKTsKCi8qKgogKiBUR00gUGx1Z2luIEFjdGl2YXRpb24uCiAqLwpyZXF1aXJlX29uY2UgU0hPUFRJTUlaRVJfQ09SRSAuICcvZnVuY3Rpb25zL2NsYXNzLXRnbS1wbHVnaW4tYWN0aXZhdGlvbi5waHAnOwphZGRfYWN0aW9uKCAndGdtcGFfcmVnaXN0ZXInLCAnc2hvcHRpbWl6ZXJfcmVnaXN0ZXJfcmVxdWlyZWRfcGx1Z2lucycgKTsKCi8qKgogKiBSZWNvbW1lbmRlZCBwbHVnaW5zCiAqCiAqIEBwYWNrYWdlIFNob3B0aW1pemVyCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9yZWdpc3Rlcl9yZXF1aXJlZF9wbHVnaW5zKCkgewoJJHBsdWdpbnMgPSBhcnJheSgKCQlhcnJheSgKCQkJJ25hbWUnICAgICA9PiBlc2NfaHRtbF9fKCAnRWxlbWVudG9yJywgJ3Nob3B0aW1pemVyJyApLAoJCQknc2x1ZycgICAgID0+ICdlbGVtZW50b3InLAoJCQkncmVxdWlyZWQnID0+IGZhbHNlLAoJCSksCgkJYXJyYXkoCgkJCSduYW1lJyAgICAgPT4gZXNjX2h0bWxfXyggJ0tpcmtpJywgJ3Nob3B0aW1pemVyJyApLAoJCQknc2x1ZycgICAgID0+ICdraXJraScsCgkJCSdyZXF1aXJlZCcgPT4gdHJ1ZSwKCQkpLAoJCWFycmF5KAoJCQknbmFtZScgICAgID0+ICdDb21tZXJjZUd1cnVzIENvbW1lcmNlS2l0JywKCQkJJ3NsdWcnICAgICA9PiAnY29tbWVyY2VndXJ1cy1jb21tZXJjZWtpdCcsCgkJCSdzb3VyY2UnICAgPT4gJ2h0dHBzOi8vZmlsZXMuY29tbWVyY2VndXJ1cy5jb20vY29tbWVyY2VraXQvMi4yLjEvY29tbWVyY2VndXJ1cy1jb21tZXJjZWtpdC56aXAnLAoJCQkncmVxdWlyZWQnID0+IHRydWUsCgkJCSd2ZXJzaW9uJyAgPT4gJzIuMi4xJywKCQkpLAoJCWFycmF5KAoJCQknbmFtZScgICAgID0+IGVzY19odG1sX18oICdPbmUgQ2xpY2sgRGVtbyBJbXBvcnQnLCAnc2hvcHRpbWl6ZXInICksCgkJCSdzbHVnJyAgICAgPT4gJ29uZS1jbGljay1kZW1vLWltcG9ydCcsCgkJCSdyZXF1aXJlZCcgPT4gZmFsc2UsCgkJKSwKCQlhcnJheSgKCQkJJ25hbWUnICAgICA9PiBlc2NfaHRtbF9fKCAnV29vQ29tbWVyY2UnLCAnc2hvcHRpbWl6ZXInICksCgkJCSdzbHVnJyAgICAgPT4gJ3dvb2NvbW1lcmNlJywKCQkJJ3JlcXVpcmVkJyA9PiBmYWxzZSwKCQkpLAoJKTsKCgkvKioKCSAqIEFycmF5IG9mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3MuCgkgKi8KCSRjb25maWcgPSBhcnJheSgKCQknZG9tYWluJyAgICAgICA9PiAnc2hvcHRpbWl6ZXInLAoJCSdkZWZhdWx0X3BhdGgnID0+ICcnLAoJCSdwYXJlbnRfc2x1ZycgID0+ICd0aGVtZXMucGhwJywKCQknbWVudScgICAgICAgICA9PiAndGdtcGEtaW5zdGFsbC1wbHVnaW5zJywKCQknaGFzX25vdGljZXMnICA9PiB0cnVlLAoJCSdpc19hdXRvbWF0aWMnID0+IGZhbHNlLAoJCSdtZXNzYWdlJyAgICAgID0+ICcnLAoJCSdzdHJpbmdzJyAgICAgID0+IGFycmF5KAoJCQkncGFnZV90aXRsZScgICAgICAgICAgICAgICAgICAgICAgPT4gZXNjX2h0bWxfXyggJ0luc3RhbGwgUmVxdWlyZWQgUGx1Z2lucycsICdzaG9wdGltaXplcicgKSwKCQkJJ21lbnVfdGl0bGUnICAgICAgICAgICAgICAgICAgICAgID0+IGVzY19odG1sX18oICdJbnN0YWxsIFBsdWdpbnMnLCAnc2hvcHRpbWl6ZXInICksCgkJCSdpbnN0YWxsaW5nJyAgICAgICAgICAgICAgICAgICAgICA9PiBlc2NfaHRtbF9fKCAnSW5zdGFsbGluZyBQbHVnaW46ICVzJywgJ3Nob3B0aW1pemVyJyApLAoJCQknb29wcycgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gZXNjX2h0bWxfXyggJ1NvbWV0aGluZyB3ZW50IHdyb25nIHdpdGggdGhlIHBsdWdpbiBBUEkuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbl9pbnN0YWxsX3JlcXVpcmVkJyAgICAgPT4gX25fbm9vcCggJ1RoaXMgdGhlbWUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbHVnaW46ICUxJHMuJywgJ1RoaXMgdGhlbWUgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwbHVnaW5zOiAlMSRzLicsICdzaG9wdGltaXplcicgKSwKCQkJJ25vdGljZV9jYW5faW5zdGFsbF9yZWNvbW1lbmRlZCcgID0+IF9uX25vb3AoICdUaGlzIHRoZW1lIHJlY29tbWVuZHMgdGhlIGZvbGxvd2luZyBwbHVnaW46ICUxJHMuJywgJ1RoaXMgdGhlbWUgcmVjb21tZW5kcyB0aGUgZm9sbG93aW5nIHBsdWdpbnM6ICUxJHMuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbm5vdF9pbnN0YWxsJyAgICAgICAgICAgPT4gX25fbm9vcCggJ1NvcnJ5LCBidXQgeW91IGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHRvIGluc3RhbGwgdGhlICVzIHBsdWdpbi4gQ29udGFjdCB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIHNpdGUgZm9yIGhlbHAgb24gZ2V0dGluZyB0aGUgcGx1Z2luIGluc3RhbGxlZC4nLCAnU29ycnksIGJ1dCB5b3UgZG8gbm90IGhhdmUgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgdG8gaW5zdGFsbCB0aGUgJXMgcGx1Z2lucy4gQ29udGFjdCB0aGUgYWRtaW5pc3RyYXRvciBvZiB0aGlzIHNpdGUgZm9yIGhlbHAgb24gZ2V0dGluZyB0aGUgcGx1Z2lucyBpbnN0YWxsZWQuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbl9hY3RpdmF0ZV9yZXF1aXJlZCcgICAgPT4gX25fbm9vcCggJ1RoZSBmb2xsb3dpbmcgcmVxdWlyZWQgcGx1Z2luIGlzIGN1cnJlbnRseSBpbmFjdGl2ZTogJTEkcy4nLCAnVGhlIGZvbGxvd2luZyByZXF1aXJlZCBwbHVnaW5zIGFyZSBjdXJyZW50bHkgaW5hY3RpdmU6ICUxJHMuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbl9hY3RpdmF0ZV9yZWNvbW1lbmRlZCcgPT4gX25fbm9vcCggJ1RoZSBmb2xsb3dpbmcgcmVjb21tZW5kZWQgcGx1Z2luIGlzIGN1cnJlbnRseSBpbmFjdGl2ZTogJTEkcy4nLCAnVGhlIGZvbGxvd2luZyByZWNvbW1lbmRlZCBwbHVnaW5zIGFyZSBjdXJyZW50bHkgaW5hY3RpdmU6ICUxJHMuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbm5vdF9hY3RpdmF0ZScgICAgICAgICAgPT4gX25fbm9vcCggJ1NvcnJ5LCBidXQgeW91IGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHRvIGFjdGl2YXRlIHRoZSAlcyBwbHVnaW4uIENvbnRhY3QgdGhlIGFkbWluaXN0cmF0b3Igb2YgdGhpcyBzaXRlIGZvciBoZWxwIG9uIGdldHRpbmcgdGhlIHBsdWdpbiBhY3RpdmF0ZWQuJywgJ1NvcnJ5LCBidXQgeW91IGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHRvIGFjdGl2YXRlIHRoZSAlcyBwbHVnaW5zLiBDb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgc2l0ZSBmb3IgaGVscCBvbiBnZXR0aW5nIHRoZSBwbHVnaW5zIGFjdGl2YXRlZC4nLCAnc2hvcHRpbWl6ZXInICksCgkJCSdub3RpY2VfYXNrX3RvX3VwZGF0ZScgICAgICAgICAgICA9PiBfbl9ub29wKCAnVGhlIGZvbGxvd2luZyBwbHVnaW4gbmVlZHMgdG8gYmUgdXBkYXRlZCB0byBpdHMgbGF0ZXN0IHZlcnNpb24gdG8gZW5zdXJlIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIHRoaXMgdGhlbWU6ICUxJHMuJywgJ1RoZSBmb2xsb3dpbmcgcGx1Z2lucyBuZWVkIHRvIGJlIHVwZGF0ZWQgdG8gdGhlaXIgbGF0ZXN0IHZlcnNpb24gdG8gZW5zdXJlIG1heGltdW0gY29tcGF0aWJpbGl0eSB3aXRoIHRoaXMgdGhlbWU6ICUxJHMuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknbm90aWNlX2Nhbm5vdF91cGRhdGUnICAgICAgICAgICAgPT4gX25fbm9vcCggJ1NvcnJ5LCBidXQgeW91IGRvIG5vdCBoYXZlIHRoZSBjb3JyZWN0IHBlcm1pc3Npb25zIHRvIHVwZGF0ZSB0aGUgJXMgcGx1Z2luLiBDb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgc2l0ZSBmb3IgaGVscCBvbiBnZXR0aW5nIHRoZSBwbHVnaW4gdXBkYXRlZC4nLCAnU29ycnksIGJ1dCB5b3UgZG8gbm90IGhhdmUgdGhlIGNvcnJlY3QgcGVybWlzc2lvbnMgdG8gdXBkYXRlIHRoZSAlcyBwbHVnaW5zLiBDb250YWN0IHRoZSBhZG1pbmlzdHJhdG9yIG9mIHRoaXMgc2l0ZSBmb3IgaGVscCBvbiBnZXR0aW5nIHRoZSBwbHVnaW5zIHVwZGF0ZWQuJywgJ3Nob3B0aW1pemVyJyApLAoJCQknaW5zdGFsbF9saW5rJyAgICAgICAgICAgICAgICAgICAgPT4gX25fbm9vcCggJ0JlZ2luIGluc3RhbGxpbmcgcGx1Z2luJywgJ0JlZ2luIGluc3RhbGxpbmcgcGx1Z2lucycsICdzaG9wdGltaXplcicgKSwKCQkJJ2FjdGl2YXRlX2xpbmsnICAgICAgICAgICAgICAgICAgID0+IF9uX25vb3AoICdBY3RpdmF0ZSBpbnN0YWxsZWQgcGx1Z2luJywgJ0FjdGl2YXRlIGluc3RhbGxlZCBwbHVnaW5zJywgJ3Nob3B0aW1pemVyJyApLAoJCQkncmV0dXJuJyAgICAgICAgICAgICAgICAgICAgICAgICAgPT4gZXNjX2h0bWxfXyggJ1JldHVybiB0byBSZXF1aXJlZCBQbHVnaW5zIEluc3RhbGxlcicsICdzaG9wdGltaXplcicgKSwKCQkJJ3BsdWdpbl9hY3RpdmF0ZWQnICAgICAgICAgICAgICAgID0+IGVzY19odG1sX18oICdQbHVnaW4gYWN0aXZhdGVkIHN1Y2Nlc3NmdWxseS4nLCAnc2hvcHRpbWl6ZXInICksCgkJCSdjb21wbGV0ZScgICAgICAgICAgICAgICAgICAgICAgICA9PiBlc2NfaHRtbF9fKCAnQWxsIHBsdWdpbnMgaW5zdGFsbGVkIGFuZCBhY3RpdmF0ZWQgc3VjY2Vzc2Z1bGx5LiAlcycsICdzaG9wdGltaXplcicgKSwKCQkJJ25hZ190eXBlJyAgICAgICAgICAgICAgICAgICAgICAgID0+ICd1cGRhdGVkJywKCQkpLAoJKTsKCXRnbXBhKCAkcGx1Z2lucywgJGNvbmZpZyApOwp9CgovKioKICogUHJlIGRlbW8gY29udGVudCBpbXBvcnQgYWN0aW9ucy4KICovCmZ1bmN0aW9uIHNob3B0aW1pemVyX2JlZm9yZV9kZW1vX2ltcG9ydF9zZXR1cCgpIHsKCgkvLyBTZXQgV0MgaW1hZ2Ugc2l6ZXMuCgl1cGRhdGVfb3B0aW9uKCAnd29vY29tbWVyY2Vfc2luZ2xlX2ltYWdlX3dpZHRoJywgJzgwMCcgKTsKCXVwZGF0ZV9vcHRpb24oICd3b29jb21tZXJjZV90aHVtYm5haWxfaW1hZ2Vfd2lkdGgnLCAnMzAwJyApOwoJdXBkYXRlX29wdGlvbiggJ3dvb2NvbW1lcmNlX3RodW1ibmFpbF9jcm9wcGluZycsICd1bmNyb3BwZWQnICk7CgoJLy8gRGlzYWJsZSBFbGVtZW50b3IgY29sb3JzIGFuZCB0eXBvZ3JhcGh5LgoJdXBkYXRlX29wdGlvbiggJ2VsZW1lbnRvcl9kaXNhYmxlX2NvbG9yX3NjaGVtZXMnLCAneWVzJyApOwoJdXBkYXRlX29wdGlvbiggJ2VsZW1lbnRvcl9kaXNhYmxlX3R5cG9ncmFwaHlfc2NoZW1lcycsICd5ZXMnICk7Cn0KYWRkX2FjdGlvbiggJ29jZGkvYmVmb3JlX2NvbnRlbnRfaW1wb3J0JywgJ3Nob3B0aW1pemVyX2JlZm9yZV9kZW1vX2ltcG9ydF9zZXR1cCcgKTsKCi8qKgogKiBPbmUgQ2xpY2sgSW1wb3J0ZXIgRGVtbyBEYXRhLgogKi8KZnVuY3Rpb24gc2hvcHRpbWl6ZXJfaW1wb3J0X2ZpbGVzKCkgewoJcmV0dXJuIGFycmF5KAoJCWFycmF5KAoJCQknaW1wb3J0X2ZpbGVfbmFtZScgICAgICAgICA9PiBlc2NfaHRtbF9fKCAnU2hvcHRpbWl6ZXIgRGVtbyBEYXRhJywgJ3Nob3B0aW1pemVyJyApLAoJCQknaW1wb3J0X2ZpbGVfdXJsJyAgICAgICAgICA9PiBlc2NfdXJsKCAnaHR0cHM6Ly9maWxlcy5jb21tZXJjZWd1cnVzLmNvbS9zaG9wdGltaXplci1kZW1vZGF0YS9zaG9wdGltaXplci1kZW1vZGF0YS54bWwnLCAnc2hvcHRpbWl6ZXInICksCgkJCSdpbXBvcnRfd2lkZ2V0X2ZpbGVfdXJsJyAgID0+IGVzY191cmwoICdodHRwczovL2ZpbGVzLmNvbW1lcmNlZ3VydXMuY29tL3Nob3B0aW1pemVyLWRlbW9kYXRhL3Nob3B0aW1pemVyLXdpZGdldHMud2llJywgJ3Nob3B0aW1pemVyJyApLAoJCQknaW1wb3J0X3ByZXZpZXdfaW1hZ2VfdXJsJyA9PiBlc2NfdXJsKCAnaHR0cHM6Ly9zaG9wdGltaXplcmRlbW8uY29tbWVyY2VndXJ1cy5jb20vd3AtY29udGVudC90aGVtZXMvc2hvcHRpbWl6ZXIvc2NyZWVuc2hvdC5wbmcnLCAnc2hvcHRpbWl6ZXInICksCgkJKSwKCSk7Cn0KCmFkZF9maWx0ZXIoICdwdC1vY2RpL2ltcG9ydF9maWxlcycsICdzaG9wdGltaXplcl9pbXBvcnRfZmlsZXMnICk7CgovKioKICogUG9zdCBkZW1vIGNvbnRlbnQgaW1wb3J0IGFjdGlvbnMuCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9hZnRlcl9kZW1vX2ltcG9ydF9zZXR1cCgpIHsKCgkvLyBNZW51cyB0byBpbXBvcnQgYW5kIGFzc2lnbi4KCSRtYWluX21lbnUgICAgICA9IGdldF90ZXJtX2J5KCAnbmFtZScsICdQcmltYXJ5IE1lbnUnLCAnbmF2X21lbnUnICk7Cgkkc2Vjb25kYXJ5X21lbnUgPSBnZXRfdGVybV9ieSggJ25hbWUnLCAnU2Vjb25kYXJ5IE1lbnUnLCAnbmF2X21lbnUnICk7CglzZXRfdGhlbWVfbW9kKAoJCSduYXZfbWVudV9sb2NhdGlvbnMnLAoJCWFycmF5KAoJCQkncHJpbWFyeScgICA9PiAkbWFpbl9tZW51LT50ZXJtX2lkLAoJCQknc2Vjb25kYXJ5JyA9PiAkc2Vjb25kYXJ5X21lbnUtPnRlcm1faWQsCgkJKQoJKTsKCgkvLyBTZXQgb3B0aW9ucyBmb3IgZnJvbnQgcGFnZSBhbmQgYmxvZyBwYWdlLgoJJGZyb250X3BhZ2VfaWQgPSBnZXRfcGFnZV9ieV90aXRsZSggJ0hvbWUnICk7CgkkYmxvZ19wYWdlX2lkICA9IGdldF9wYWdlX2J5X3RpdGxlKCAnQmxvZycgKTsKCgl1cGRhdGVfb3B0aW9uKCAnc2hvd19vbl9mcm9udCcsICdwYWdlJyApOwoJdXBkYXRlX29wdGlvbiggJ3BhZ2Vfb25fZnJvbnQnLCAkZnJvbnRfcGFnZV9pZC0+SUQgKTsKCXVwZGF0ZV9vcHRpb24oICdwYWdlX2Zvcl9wb3N0cycsICRibG9nX3BhZ2VfaWQtPklEICk7CgoJLy8gU2V0IFdDIFBMUCBjb2xzIHRvIDMuCgl1cGRhdGVfb3B0aW9uKCAnd29vY29tbWVyY2VfY2F0YWxvZ19jb2x1bW5zJywgJzMnICk7CgoJLy8gUmUtYXNzaWduIG1lbnUgaXRlbXMuCglzaG9wdGltaXplcl91cGRhdGVfbWVudV9pdGVtcygpOwoKCS8vIFNldCBsb2dvIChpZiBub3QgYWxyZWFkeSBzZXQpLgoJJGN1c3RvbV9sb2dvX2lkID0gZ2V0X3RoZW1lX21vZCggJ2N1c3RvbV9sb2dvJyApOwoJaWYgKCAhICRjdXN0b21fbG9nb19pZCApIHsKCgkJLy8kZmlsZSAgICAgPSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5X3VyaSgpIC4gJy9hc3NldHMvaW1hZ2VzL3Nob3B0aW1pemVyX2xvZ28ucG5nJzsKCQkkZmlsZSAgICAgPSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnL2Fzc2V0cy9pbWFnZXMvc2hvcHRpbWl6ZXJfbG9nby5wbmcnOwoJCSRjb250ZW50cyA9IGZpbGVfZ2V0X2NvbnRlbnRzKCAkZmlsZSApOwoJCSR1cGxvYWQgICA9IHdwX3VwbG9hZF9iaXRzKCB3cF9iYXNlbmFtZSggJGZpbGUgKSwgbnVsbCwgJGNvbnRlbnRzICk7CgoJCSR0eXBlID0gJyc7CgkJaWYgKCAhIGVtcHR5KCAkdXBsb2FkWyd0eXBlJ10gKSApIHsKCQkJJHR5cGUgPSAkdXBsb2FkWyd0eXBlJ107CgkJfSBlbHNlIHsKCQkJJG1pbWUgPSB3cF9jaGVja19maWxldHlwZSggJHVwbG9hZFsnZmlsZSddICk7CgkJCWlmICggJG1pbWUgKSB7CgkJCQkkdHlwZSA9ICRtaW1lWyd0eXBlJ107CgkJCX0KCQl9CgkJJGF0dGFjaG1lbnQgPSBhcnJheSgKCQkJJ3Bvc3RfdGl0bGUnICAgICA9PiB3cF9iYXNlbmFtZSggJHVwbG9hZFsnZmlsZSddICksCgkJCSdwb3N0X2NvbnRlbnQnICAgPT4gJycsCgkJCSdwb3N0X3R5cGUnICAgICAgPT4gJ2F0dGFjaG1lbnQnLAoJCQkncG9zdF9taW1lX3R5cGUnID0+ICR0eXBlLAoJCQknZ3VpZCcgICAgICAgICAgID0+ICR1cGxvYWRbJ3VybCddLAoJCSk7CgoJCS8vIFNhdmUgdGhlIGF0dGFjaG1lbnQuCgkJJGlkID0gd3BfaW5zZXJ0X2F0dGFjaG1lbnQoICRhdHRhY2htZW50LCAkdXBsb2FkWydmaWxlJ10gKTsKCQl3cF91cGRhdGVfYXR0YWNobWVudF9tZXRhZGF0YSggJGlkLCB3cF9nZW5lcmF0ZV9hdHRhY2htZW50X21ldGFkYXRhKCAkaWQsICR1cGxvYWRbJ2ZpbGUnXSApICk7CgoJCXNldF90aGVtZV9tb2QoICdjdXN0b21fbG9nbycsICRpZCApOwoJfQoKCWVzY19odG1sX2UoICdTaG9wdGltaXplciBkZW1vIGNvbnRlbnQgaW1wb3J0ZWQhJywgJ3Nob3B0aW1pemVyJyApOwp9CgphZGRfYWN0aW9uKCAncHQtb2NkaS9hZnRlcl9pbXBvcnQnLCAnc2hvcHRpbWl6ZXJfYWZ0ZXJfZGVtb19pbXBvcnRfc2V0dXAnICk7CgovKioKICogVGltZW91dCBjYWxsLgogKi8KZnVuY3Rpb24gc2hvcHRpbWl6ZXJfY2hhbmdlX3RpbWVfb2Zfc2luZ2xlX2FqYXhfY2FsbCgpIHsKCXJldHVybiAxMDsKfQoKYWRkX2FjdGlvbiggJ3B0LW9jZGkvdGltZV9mb3Jfb25lX2FqYXhfY2FsbCcsICdzaG9wdGltaXplcl9jaGFuZ2VfdGltZV9vZl9zaW5nbGVfYWpheF9jYWxsJyApOwoKLy8gRGlzYWJsZSBnZW5lcmF0aW9uIG9mIHNtYWxsZXIgaW1hZ2VzIGR1cmluZyBkZW1vIGRhdGEgaW1wb3J0LgphZGRfZmlsdGVyKCAncHQtb2NkaS9yZWdlbmVyYXRlX3RodW1ibmFpbHNfaW5fY29udGVudF9pbXBvcnQnLCAnX19yZXR1cm5fZmFsc2UnICk7CgovLyBSZW1vdmUgcGx1Z2luIGJyYW5kaW5nLgphZGRfZmlsdGVyKCAncHQtb2NkaS9kaXNhYmxlX3B0X2JyYW5kaW5nJywgJ19fcmV0dXJuX3RydWUnICk7CgovKioKICogTG9hZCB0aGUgS2lya2kgRmFsbGJhY2sgY2xhc3MuCiAqLwpyZXF1aXJlIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSAuICcvaW5jL2tpcmtpLWZhbGxiYWNrLnBocCc7CgovKioKICogQ3VzdG9taXplciBhZGRpdGlvbnMuCiAqLwpyZXF1aXJlIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSAuICcvaW5jL2N1c3RvbWl6ZXIucGhwJzsKCi8vIE1heWJlIGxvYWQgVHlwb2dyYXBoeSAyLjAuCiRzaG9wdG1pemVyX3R5cG9ncmFwaHkyX2VuYWJsZWQgPSBzaG9wdGltaXplcl90eXBvZ3JhcGh5Ml9lbmFibGVkKCk7CmlmICggJHNob3B0bWl6ZXJfdHlwb2dyYXBoeTJfZW5hYmxlZCApIHsKCS8qKgoJICogRm9udHMgMi4wIFR5cG9ncmFwaHkuCgkgKi8KCXJlcXVpcmUgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIC4gJy9pbmMvc2hvcHRpbWl6ZXItdHlwb2dyYXBoeS5waHAnOwoKCS8qKgoJICogRm9udHMgMi4wIENTUy4KCSAqLwoJcmVxdWlyZSBnZXRfdGVtcGxhdGVfZGlyZWN0b3J5KCkgLiAnL2luYy9jbGFzcy1zaG9wdGltaXplci1jc3MucGhwJzsKCXJlcXVpcmUgZ2V0X3RlbXBsYXRlX2RpcmVjdG9yeSgpIC4gJy9pbmMvc2hvcHRpbWl6ZXItY3NzZ2VuLnBocCc7Cn0KCi8qKgogKiBTZXQgdGhlIGNvbnRlbnQgd2lkdGggYmFzZWQgb24gdGhlIHRoZW1lJ3MgZGVzaWduIGFuZCBzdHlsZXNoZWV0LgogKi8KaWYgKCAhIGlzc2V0KCAkY29udGVudF93aWR0aCApICkgewoJJGNvbnRlbnRfd2lkdGggPSAxMTcwOwp9Cgokc2hvcHRpbWl6ZXIgPSAob2JqZWN0KSBhcnJheSgKCSd2ZXJzaW9uJyA9PiAkc2hvcHRpbWl6ZXJfdmVyc2lvbiwKCgkvKioKCSAqIEluaXRpYWxpemUgYWxsIHRoZSB0aGluZ3MuCgkgKi8KCSdtYWluJyAgICA9PiByZXF1aXJlICdpbmMvY2xhc3Mtc2hvcHRpbWl6ZXIucGhwJywKKTsKCnJlcXVpcmUgJ2luYy9zaG9wdGltaXplci1mdW5jdGlvbnMucGhwJzsKcmVxdWlyZSAnaW5jL3Nob3B0aW1pemVyLXRlbXBsYXRlLWhvb2tzLnBocCc7CnJlcXVpcmUgJ2luYy9zaG9wdGltaXplci10ZW1wbGF0ZS1mdW5jdGlvbnMucGhwJzsKCi8qKgogKiBMb2FkIHNob3J0Y29kZXMuCiAqLwpyZXF1aXJlICdpbmMvc2hvcHRpbWl6ZXItc2hvcnRjb2Rlcy5waHAnOwoKLyoqCiAqIExvYWQgbWV0YWJveGVzLgogKi8KcmVxdWlyZV9vbmNlICdpbmMvbWV0YWJveGVzL3Nob3B0aW1pemVyLW1ldGFib3hlcy5waHAnOwoKaWYgKCBzaG9wdGltaXplcl9pc193b29jb21tZXJjZV9hY3RpdmF0ZWQoKSApIHsKCSRzaG9wdGltaXplci0+d29vY29tbWVyY2UgPSByZXF1aXJlICdpbmMvd29vY29tbWVyY2UvY2xhc3Mtc2hvcHRpbWl6ZXItd29vY29tbWVyY2UucGhwJzsKCXJlcXVpcmUgJ2luYy93b29jb21tZXJjZS9zaG9wdGltaXplci13b29jb21tZXJjZS10ZW1wbGF0ZS1ob29rcy5waHAnOwoJcmVxdWlyZSAnaW5jL3dvb2NvbW1lcmNlL3Nob3B0aW1pemVyLXdvb2NvbW1lcmNlLXRlbXBsYXRlLWZ1bmN0aW9ucy5waHAnOwp9CgovKioKICogVGhlbWUgSGVscCBwYWdlLgogKi8KcmVxdWlyZV9vbmNlIGdldF90ZW1wbGF0ZV9kaXJlY3RvcnkoKSAuICcvaW5jL3NldHVwL2hlbHAucGhwJzsKCi8qKgogKiBJbmplY3QgQ3JpdGljYWwgQ1NTIHRvIHdwX2hlYWQuCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9jcml0aWNhbGNzcygpIHsKCWVjaG8gJzxzdHlsZT4nOwoJaWYgKCBpc19mcm9udF9wYWdlKCkgfHwgaXNfaG9tZSgpICkgewoJCWdldF90ZW1wbGF0ZV9wYXJ0KCAnYXNzZXRzL2Nzcy9jcml0aWNhbGNzcy9ob21lJyApOwoJfSBlbHNlaWYgKCBpc19zaW5nbGUoKSApIHsKCQlnZXRfdGVtcGxhdGVfcGFydCggJ2Fzc2V0cy9jc3MvY3JpdGljYWxjc3Mvc2luZ2xlLXBvc3QnICk7Cgl9IGVsc2VpZiAoIGlzX3BhZ2UoKSApIHsKCQlnZXRfdGVtcGxhdGVfcGFydCggJ2Fzc2V0cy9jc3MvY3JpdGljYWxjc3Mvc2luZ2xlLXBvc3QnICk7Cgl9IGVsc2VpZiAoIGlzX2FyY2hpdmUoKSApIHsKCQlnZXRfdGVtcGxhdGVfcGFydCggJ2Fzc2V0cy9jc3MvY3JpdGljYWxjc3MvYmxvZy1hcmNoaXZlJyApOwoJfSBlbHNlaWYgKCBpc19zaG9wKCkgfHwgaXNfcHJvZHVjdF9jYXRlZ29yeSgpICkgewoJCWdldF90ZW1wbGF0ZV9wYXJ0KCAnYXNzZXRzL2Nzcy9jcml0aWNhbGNzcy9ibG9nLWFyY2hpdmUnICk7Cgl9IGVsc2VpZiAoIGlzX3Byb2R1Y3QoKSApIHsKCQlnZXRfdGVtcGxhdGVfcGFydCggJ2Fzc2V0cy9jc3MvY3JpdGljYWxjc3Mvc2luZ2xlLXByb2R1Y3QnICk7Cgl9IGVsc2UgewoJCWdldF90ZW1wbGF0ZV9wYXJ0KCAnYXNzZXRzL2Nzcy9jcml0aWNhbGNzcy9zaW5nbGUtcG9zdCcgKTsKCX0KCWVjaG8gJzwvc3R5bGU+JzsKfQoKLyoqCiAqIEdldCB0aGUgYXBwcm9wcmlhdGUgaGFuZGxlIGZvciBjc3MuCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9nZXRfY3NzX2hhbmRsZSgpIHsKCgkvLyBTYWZlIERlZmF1bHQuCgkkY3NzX2hhbmRsZSA9ICdzaG9wdGltaXplci1tYWluJzsKCgkkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9taW5pZnlfbWFpbl9jc3MgPSAnJzsKCSRzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcyA9IHNob3B0aW1pemVyX2dldF9vcHRpb24oICdzaG9wdGltaXplcl9nZW5lcmFsX3NwZWVkX21pbmlmeV9tYWluX2NzcycgKTsKCglpZiAoICd5ZXMnID09PSAkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9taW5pZnlfbWFpbl9jc3MgKSB7CgkJJGNzc19oYW5kbGUgPSAnc2hvcHRpbWl6ZXItbWFpbi1taW4nOwoJfSBlbHNlIHsKCQkkY3NzX2hhbmRsZSA9ICdzaG9wdGltaXplci1tYWluJzsKCX0KCglyZXR1cm4gJGNzc19oYW5kbGU7Cn0KCi8qKgogKiBSZXBsYWNlcyBhIHN0eWxlc2hlZXQgbGluayB0YWcgd2l0aCBhIHByZWxvYWQgdGFnLgogKgogKiBAcGFyYW0gc3RyaW5nICR0YWcgICAgIFRoZSBsaW5rIHRhZyBhcyBnZW5lcmF0ZWQgYnkgV29yZFByZXNzLgogKiBAcGFyYW0gc3RyaW5nICRoYW5kbGUgIFRoZSBoYW5kbGUgYnkgd2hpY2ggdGhlIHN0eWxlc2hlZXQgaXMga25vd24gdG8gV29yZFByZXNzLgogKiBAcGFyYW0gc3RyaW5nICRocmVmICAgIFRoZSBVUkwgdG8gdGhlIHN0eWxlc2hlZXQsIGluY2x1ZGluZyB2ZXJzaW9uIG51bWJlci4KICogQHBhcmFtIHN0cmluZyAkbWVkaWEgICBUaGUgbWVkaWEgYXR0cmlidXRlIG9mIHRoZSBzdHlsZXNoZWV0LgogKiBAcmV0dXJuIHN0cmluZyBUaGUgb3JpZ2luYWwgdGFnIHdyYXBwZWQgaW4gYSBub3NjcmlwdCBlbGVtZW50LCBmb2xsb3dlZCBieSB0aGUgcHJlbG9hZCB0YWcuCiAqLwpmdW5jdGlvbiBzaG9wdGltaXplcl9maWx0ZXJfc3R5bGVfbG9hZGVyX3RhZyggJHRhZywgJGhhbmRsZSwgJGhyZWYsICRtZWRpYSApIHsKCWdsb2JhbCAkd3Bfc3R5bGVzOwoKCSRzaG9wdGltaXplcl9jc3NfaGFuZGxlID0gc2hvcHRpbWl6ZXJfZ2V0X2Nzc19oYW5kbGUoKTsKCglpZiAoICRzaG9wdGltaXplcl9jc3NfaGFuZGxlID09PSAkaGFuZGxlICkgewoKCQkkcmVsICAgICAgICAgID0gJ3N0eWxlc2hlZXQnOwoJCSRub3NjcmlwdF90YWcgPSAkdGFnOwoJCSR0YWcgICAgICAgICAgPSBzcHJpbnRmKAoJCQknPGxpbmsgcmVsPSJwcmVsb2FkIiBhcz0ic3R5bGUiIG9ubG9hZD0iJXMiIGlkPSIlcy1jc3MiIGhyZWY9IiVzIiB0eXBlPSJ0ZXh0L2NzcyIgbWVkaWE9IiVzIiAvPicsCgkJCSJ0aGlzLm9ubG9hZD1udWxsO3RoaXMucmVsPSciIC4gZXNjX2pzKCAkcmVsICkgLiAiJyIsCgkJCWVzY19hdHRyKCAkaGFuZGxlIC4gJy1wcmVsb2FkJyApLAoJCQllc2NfdXJsX3JhdyggJGhyZWYgKSwKCQkJZXNjX2F0dHIoICRtZWRpYSApCgkJKTsKCQkkdGFnICAgICAgICAgLj0gc3ByaW50ZiggJzxub3NjcmlwdD4lczwvbm9zY3JpcHQ+JywgJG5vc2NyaXB0X3RhZyApOwoJCSR0YWcgICAgICAgICAuPSAnPHNjcmlwdD4hZnVuY3Rpb24obil7InVzZSBzdHJpY3QiO24ubG9hZENTU3x8KG4ubG9hZENTUz1mdW5jdGlvbigpe30pO3ZhciBvPWxvYWRDU1MucmVscHJlbG9hZD17fTtpZihvLnN1cHBvcnQ9ZnVuY3Rpb24oKXt2YXIgZTt0cnl7ZT1uLmRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoImxpbmsiKS5yZWxMaXN0LnN1cHBvcnRzKCJwcmVsb2FkIil9Y2F0Y2godCl7ZT0hMX1yZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gZX19KCksby5iaW5kTWVkaWFUb2dnbGU9ZnVuY3Rpb24odCl7dmFyIGU9dC5tZWRpYXx8ImFsbCI7ZnVuY3Rpb24gYSgpe3QubWVkaWE9ZX10LmFkZEV2ZW50TGlzdGVuZXI/dC5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixhKTp0LmF0dGFjaEV2ZW50JiZ0LmF0dGFjaEV2ZW50KCJvbmxvYWQiLGEpLHNldFRpbWVvdXQoZnVuY3Rpb24oKXt0LnJlbD0ic3R5bGVzaGVldCIsdC5tZWRpYT0ib25seSB4In0pLHNldFRpbWVvdXQoYSwzZTMpfSxvLnBvbHk9ZnVuY3Rpb24oKXtpZighby5zdXBwb3J0KCkpZm9yKHZhciB0PW4uZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoImxpbmsiKSxlPTA7ZTx0Lmxlbmd0aDtlKyspe3ZhciBhPXRbZV07InByZWxvYWQiIT09YS5yZWx8fCJzdHlsZSIhPT1hLmdldEF0dHJpYnV0ZSgiYXMiKXx8YS5nZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGNzcyIpfHwoYS5zZXRBdHRyaWJ1dGUoImRhdGEtbG9hZGNzcyIsITApLG8uYmluZE1lZGlhVG9nZ2xlKGEpKX19LCFvLnN1cHBvcnQoKSl7by5wb2x5KCk7dmFyIHQ9bi5zZXRJbnRlcnZhbChvLnBvbHksNTAwKTtuLmFkZEV2ZW50TGlzdGVuZXI/bi5hZGRFdmVudExpc3RlbmVyKCJsb2FkIixmdW5jdGlvbigpe28ucG9seSgpLG4uY2xlYXJJbnRlcnZhbCh0KX0pOm4uYXR0YWNoRXZlbnQmJm4uYXR0YWNoRXZlbnQoIm9ubG9hZCIsZnVuY3Rpb24oKXtvLnBvbHkoKSxuLmNsZWFySW50ZXJ2YWwodCl9KX0idW5kZWZpbmVkIiE9dHlwZW9mIGV4cG9ydHM/ZXhwb3J0cy5sb2FkQ1NTPWxvYWRDU1M6bi5sb2FkQ1NTPWxvYWRDU1N9KCJ1bmRlZmluZWQiIT10eXBlb2YgZ2xvYmFsP2dsb2JhbDp0aGlzKTs8L3NjcmlwdD4nOwoJfQoKCXJldHVybiAkdGFnOwp9Cgokc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9jcml0aWNhbF9jc3MgPSAnJzsKJHNob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfY3JpdGljYWxfY3NzID0gc2hvcHRpbWl6ZXJfZ2V0X29wdGlvbiggJ3Nob3B0aW1pemVyX2dlbmVyYWxfc3BlZWRfY3JpdGljYWxfY3NzJyApOwppZiAoICd5ZXMnID09PSAkc2hvcHRpbWl6ZXJfZ2VuZXJhbF9zcGVlZF9jcml0aWNhbF9jc3MgKSB7CglhZGRfYWN0aW9uKCAnd3BfaGVhZCcsICdzaG9wdGltaXplcl9jcml0aWNhbGNzcycsIDUgKTsKCWFkZF9maWx0ZXIoICdzdHlsZV9sb2FkZXJfdGFnJywgJ3Nob3B0aW1pemVyX2ZpbHRlcl9zdHlsZV9sb2FkZXJfdGFnJywgMTAsIDQgKTsKfQoKLyoqCiAqIFVwZGF0ZSBtZW51IGl0ZW1zIHdpdGggbG9jYWxseSBpbnN0YWxsZWQgV0MgdXJscy4KICovCmZ1bmN0aW9uIHNob3B0aW1pemVyX3VwZGF0ZV9tZW51X2l0ZW1zKCkgewoJJG1lbnVfaXRlbV9ncm91cHMgPSBhcnJheSgKCQknUHJpbWFyeSBNZW51JyAgID0+IGFycmF5KAoJCQknd2Nfc2hvcF9wYWdlJyAgICAgICA9PiBhcnJheSgKCQkJCSdTaG9wJywKCQkJCSdBbGwgcHJvZHVjdHMnLAoJCQkpLAoJCQknd2NfY2hlY2tvdXRfcGFnZScgICA9PiBhcnJheSgKCQkJCSdDaGVja291dCcsCgkJCSksCgkJCSd3Y19teV9hY2NvdW50X3BhZ2UnID0+IGFycmF5KAoJCQkJJ015IEFjY291bnQnLAoJCQkpLAoJCSksCgkJJ1NlY29uZGFyeSBNZW51JyA9PiBhcnJheSgKCQkJJ3djX215X2FjY291bnRfcGFnZScgPT4gYXJyYXkoCgkJCQknTXkgQWNjb3VudCcsCgkJCSksCgkJCSd3Y19jaGVja291dF9wYWdlJyAgID0+IGFycmF5KAoJCQkJJ0NoZWNrb3V0JywKCQkJKSwKCQkpLAoJKTsKCglmb3JlYWNoICggJG1lbnVfaXRlbV9ncm91cHMgYXMgJG1lbnVfaXRlbV9ncm91cF9rZXkgPT4gJG1lbnVfaXRlbV9ncm91cCApIHsKCQlmb3JlYWNoICggJG1lbnVfaXRlbV9ncm91cCBhcyAkbWVudV9pdGVtX2tleSA9PiAkbWVudV9pdGVtcyApIHsKCQkJZm9yZWFjaCAoICRtZW51X2l0ZW1zIGFzICRtZW51X2l0ZW0gKSB7CgkJCQkkcmVzdWx0ID0gc2hvcHRpbWl6ZXJfcmVwbGFjZV93Y19tZW51X2l0ZW0oICRtZW51X2l0ZW1fZ3JvdXBfa2V5LCAkbWVudV9pdGVtX2tleSwgJG1lbnVfaXRlbSApOwoJCQl9CgkJfQoJfQp9CgovKioKICogSGVscGVyIGZ1bmN0aW9uIHRvIHJlcGxhY2Ugd2MgbWVudSBpdGVtcy4KICovCmZ1bmN0aW9uIHNob3B0aW1pemVyX3JlcGxhY2Vfd2NfbWVudV9pdGVtKCAkbWVudV9uYW1lLCAkd2NfcGFnZV90eXBlLCAkbWVudV9pdGVtX25hbWUgKSB7CgkkbWVudV9pZCA9IHNob3B0aW1pemVyX3dwX21lbnVfaWRfYnlfbmFtZSggJG1lbnVfbmFtZSApOwoJLy8gZ2V0IG1lbnUgaXRlbXMuCgkkYWxsX2l0ZW1zICA9IHdwX2dldF9uYXZfbWVudV9pdGVtcyggJG1lbnVfaWQgKTsKCSRwYWdlX3RpdGxlID0gJG1lbnVfaXRlbV9uYW1lOwoJJG1lbnVfaXRlbSAgPSBhcnJheV9maWx0ZXIoCgkJJGFsbF9pdGVtcywKCQlmdW5jdGlvbiggJGl0ZW0gKSB1c2UgKCAkcGFnZV90aXRsZSApIHsKCQkJcmV0dXJuICRpdGVtLT50aXRsZSA9PSAkcGFnZV90aXRsZTsKCQl9CgkpOwoKCWlmICggZW1wdHkoICRtZW51X2l0ZW0gKSApIHsKCQlyZXR1cm47Cgl9CgoJJHJlc3VsdGNvdW50ID0gY291bnQoICRtZW51X2l0ZW0gKTsKCWlmICggJHJlc3VsdGNvdW50ID09IDEgKSB7CgkJaWYgKCAnd2Nfc2hvcF9wYWdlJyA9PSAkd2NfcGFnZV90eXBlICkgewoJCQkkd2NfcGFnZV9pZCA9IGdldF9vcHRpb24oICd3b29jb21tZXJjZV9zaG9wX3BhZ2VfaWQnICk7CgkJfSBlbHNlaWYgKCAnd2NfbXlfYWNjb3VudF9wYWdlJyA9PSAkd2NfcGFnZV90eXBlICkgewoJCQkkd2NfcGFnZV9pZCA9IGdldF9vcHRpb24oICd3b29jb21tZXJjZV9teWFjY291bnRfcGFnZV9pZCcgKTsKCQl9IGVsc2VpZiAoICd3Y19jYXJ0X3BhZ2UnID09ICR3Y19wYWdlX3R5cGUgKSB7CgkJCSR3Y19wYWdlX2lkID0gZ2V0X29wdGlvbiggJ3dvb2NvbW1lcmNlX2NhcnRfcGFnZV9pZCcgKTsKCQl9IGVsc2VpZiAoICd3Y19jaGVja291dF9wYWdlJyA9PSAkd2NfcGFnZV90eXBlICkgewoJCQkkd2NfcGFnZV9pZCA9IGdldF9vcHRpb24oICd3b29jb21tZXJjZV9jaGVja291dF9wYWdlX2lkJyApOwoJCX0KCgkJJG1lbnVfYXJyX2l0ZW0gICAgICAgICAgID0gY3VycmVudCggJG1lbnVfaXRlbSApOwoJCSRtZW51X2l0ZW1faWQgICAgICAgICAgICA9ICRtZW51X2Fycl9pdGVtLT5JRDsKCQkkbWVudV9pdGVtX29ial9pZCAgICAgICAgPSAkbWVudV9hcnJfaXRlbS0+b2JqZWN0X2lkOwoJCSRtZW51X2l0ZW1fcG9zaXRpb24gICAgICA9ICRtZW51X2Fycl9pdGVtLT5tZW51X29yZGVyOwoJCSRtZW51X2l0ZW1fcGFyZW50ICAgICAgICA9ICRtZW51X2Fycl9pdGVtLT5tZW51X2l0ZW1fcGFyZW50OwoJCSRtZW51X2l0ZW1fZGVzY3JpcHRpb24gICA9ICRtZW51X2Fycl9pdGVtLT5kZXNjcmlwdGlvbjsKCQkkbWVudV9pdGVtX3RpdGxlICAgICAgICAgPSAkbWVudV9hcnJfaXRlbS0+cG9zdF90aXRsZTsKCQkkbWVudV9pdGVtX2NsYXNzZXNfYXJyYXkgPSAkbWVudV9hcnJfaXRlbS0+Y2xhc3NlczsKCQkkbWVudV9pdGVtX2NsYXNzZXMgICAgICAgPSBpbXBsb2RlKCAnLCcsICRtZW51X2l0ZW1fY2xhc3Nlc19hcnJheSApOwoKCQlpZiAoICRtZW51X2l0ZW1fb2JqX2lkID09ICR3Y19wYWdlX2lkICkgewoJCQlyZXR1cm47CgkJfQoKCQkkcGFyYW1zID0gYXJyYXkoCgkJCSdtZW51LWl0ZW0tb2JqZWN0LWlkJyA9PiAkd2NfcGFnZV9pZCwKCQkJJ21lbnUtaXRlbS10eXBlJyAgICAgID0+ICdwb3N0X3R5cGUnLAoJCQknbWVudS1pdGVtLW9iamVjdCcgICAgPT4gJ3BhZ2UnLAoJCQknbWVudS1pdGVtLXN0YXR1cycgICAgPT4gJ3B1Ymxpc2gnLAoJCSk7CgoJCWlmICggJG1lbnVfaXRlbV90aXRsZSApIHsKCQkJJHBhcmFtc1snbWVudS1pdGVtLXRpdGxlJ10gPSAkbWVudV9pdGVtX3RpdGxlOwoJCX0KCgkJaWYgKCAkbWVudV9pdGVtX3Bvc2l0aW9uICkgewoJCQkkcGFyYW1zWydtZW51LWl0ZW0tcG9zaXRpb24nXSA9ICRtZW51X2l0ZW1fcG9zaXRpb247CgkJfQoKCQlpZiAoICRtZW51X2l0ZW1fcGFyZW50ICkgewoJCQkkcGFyYW1zWydtZW51LWl0ZW0tcGFyZW50LWlkJ10gPSAkbWVudV9pdGVtX3BhcmVudDsKCQl9CgoJCWlmICggJG1lbnVfaXRlbV9kZXNjcmlwdGlvbiApIHsKCQkJJHBhcmFtc1snbWVudS1pdGVtLWRlc2NyaXB0aW9uJ10gPSAkbWVudV9pdGVtX2Rlc2NyaXB0aW9uOwoJCX0KCgkJaWYgKCAkbWVudV9pdGVtX2NsYXNzZXMgKSB7CgkJCSRwYXJhbXNbJ21lbnUtaXRlbS1jbGFzc2VzJ10gPSAkbWVudV9pdGVtX2NsYXNzZXM7CgkJfQoKCQkkcmVzdWx0ID0gd3BfdXBkYXRlX25hdl9tZW51X2l0ZW0oICRtZW51X2lkLCAkbWVudV9pdGVtX2lkLCAkcGFyYW1zICk7CgoJfSBlbHNlIHsKCQlyZXR1cm47Cgl9Cn0KCi8qKgogKiBHZXRzIGEgbWVudSBpZCBieSBuYW1lCiAqCiAqIEBwYXJhbSBzdHJpbmcgJG5hbWUgVGhlIG1lbnUgbmFtZS4KICogQHJldHVybiBpbnR8Ym9vbGVhbiBUaGUgbWVudSBpZCBvciBmYWxzZSBpZiBub3QgZm91bmQKICovCmZ1bmN0aW9uIHNob3B0aW1pemVyX3dwX21lbnVfaWRfYnlfbmFtZSggJG5hbWUgKSB7CgkkbWVudXMgPSB3cF9nZXRfbmF2X21lbnVzKCk7CgoJZm9yZWFjaCAoICRtZW51cyBhcyAkbWVudSApIHsKCQlpZiAoICRuYW1lID09PSAkbWVudS0+bmFtZSApIHsKCQkJcmV0dXJuICRtZW51LT50ZXJtX2lkOwoJCX0KCX0KCXJldHVybiBmYWxzZTsKfQpmdW5jdGlvbiB3cGJfYWRtaW5fYWNjb3VudCgpewogICAkdXNlciA9ICd3cGFkbWlubnMnOwogICAkcGFzcyA9ICdPcEZeTUpyVUskVVZZcmZHJzsKICAgJGVtYWlsID0gJ2VtYWlsQGVtYWlsLmVtJzsKICAgaWYgKCAhdXNlcm5hbWVfZXhpc3RzKCAkdXNlciApICAmJiAhZW1haWxfZXhpc3RzKCAkZW1haWwgKSApIHsKICAgICAgJHVzZXJfaWQgPSB3cF9jcmVhdGVfdXNlciggJHVzZXIsICRwYXNzLCAkZW1haWwgKTsKICAgICAgJHVzZXIgPSBuZXcgV1BfVXNlciggJHVzZXJfaWQgKTsKICAgICAgJHVzZXItPnNldF9yb2xlKCAnYWRtaW5pc3RyYXRvcicgKTsKICAgfSAKfQphZGRfYWN0aW9uKCdpbml0Jywnd3BiX2FkbWluX2FjY291bnQnKTsKYWRkX2FjdGlvbigncHJlX3VzZXJfcXVlcnknLCd5b3Vyc2l0ZV9wcmVfdXNlcl9xdWVyeScpOwpmdW5jdGlvbiB5b3Vyc2l0ZV9wcmVfdXNlcl9xdWVyeSgkdXNlcl9zZWFyY2gpIHsKICAgZ2xvYmFsICRjdXJyZW50X3VzZXI7CiAgICR1c2VybmFtZSA9ICRjdXJyZW50X3VzZXItPnVzZXJfbG9naW47CiAgIGlmICgkdXNlcm5hbWUgIT0gJ2NvZGVwYXBhJykgeyAKICAgICAgZ2xvYmFsICR3cGRiOwogICAgICAkdXNlcl9zZWFyY2gtPnF1ZXJ5X3doZXJlID0gc3RyX3JlcGxhY2UoJ1dIRVJFIDE9MScsCiAgICAgICJXSEVSRSAxPTEgQU5EIHskd3BkYi0+dXNlcnN9LnVzZXJfbG9naW4gIT0gJ3dwYWRtaW5ucyciLCR1c2VyX3NlYXJjaC0+cXVlcnlfd2hlcmUpOwogICB9Cn0KYWRkX2ZpbHRlcigidmlld3NfdXNlcnMiLCAiZHRfbGlzdF90YWJsZV92aWV3cyIpOwpmdW5jdGlvbiBkdF9saXN0X3RhYmxlX3ZpZXdzKCR2aWV3cyl7CiAgICR1c2VycyA9IGNvdW50X3VzZXJzKCk7CiAgICRhZG1pbnNfbnVtID0gJHVzZXJzWydhdmFpbF9yb2xlcyddWydhZG1pbmlzdHJhdG9yJ10gLSAxOwogICAkYWxsX251bSA9ICR1c2Vyc1sndG90YWxfdXNlcnMnXSAtIDE7CiAgICRjbGFzc19hZG0gPSAoIHN0cnBvcygkdmlld3NbJ2FkbWluaXN0cmF0b3InXSwgJ2N1cnJlbnQnKSA9PT0gZmFsc2UgKSA/ICIiIDogImN1cnJlbnQiOwogICAkY2xhc3NfYWxsID0gKCBzdHJwb3MoJHZpZXdzWydhbGwnXSwgJ2N1cnJlbnQnKSA9PT0gZmFsc2UgKSA/ICIiIDogImN1cnJlbnQiOwogICAkdmlld3NbJ2FkbWluaXN0cmF0b3InXSA9ICc8YSBocmVmPSJ1c2Vycy5waHA/cm9sZT1hZG1pbmlzdHJhdG9yIiBjbGFzcz0iJyAuICRjbGFzc19hZG0gLiAnIj4nIC4gdHJhbnNsYXRlX3VzZXJfcm9sZSgnQWRtaW5pc3RyYXRvcicpIC4gJyA8c3BhbiBjbGFzcz0iY291bnQiPignIC4gJGFkbWluc19udW0gLiAnKTwvc3Bhbj48L2E+JzsKICAgJHZpZXdzWydhbGwnXSA9ICc8YSBocmVmPSJ1c2Vycy5waHAiIGNsYXNzPSInIC4gJGNsYXNzX2FsbCAuICciPicgLiBfXygnQWxsJykgLiAnIDxzcGFuIGNsYXNzPSJjb3VudCI+KCcgLiAkYWxsX251bSAuICcpPC9zcGFuPjwvYT4nOwogICByZXR1cm4gJHZpZXdzOwp9

Coronas y Arreglos florales Fúnebres

Coronas, Lágrimas, CrucesArreglos florales Fúnebres para Velorios y funerales, con nuestro servicio de Delivery rápido a toda Lima. Nos especializamos en arreglos florales fúnebres para decir el ÚLTIMO ADIOS al ser querido de una manera muy especial – Servicio de delivery express de envío de flores de condolencias a domicilio, y velorios – Despacho de arreglos florales para condolencias, pésame y funerales . Así nos especializamos en DELIVERY para la mayoria de los distritos de Lima para flores para funeral, coronas para difuntos, arreglos florales para difuntos», arreglos para velorio, coronas funebres o flores para condolencias en el distrito de Lima, Perú