ZGlmZiAtLWdpdCBhL01hYy9EZW1vL1BJQ1Ricm93c2UvSUNPTmJyb3dzZS5weSBiL01hYy9EZW1vL1BJQ1Ricm93c2UvSUNPTmJyb3dzZS5weQppbmRleCAxMTk0YjdlLi43MDFlZjdmIDEwMDY0NAotLS0gYS9NYWMvRGVtby9QSUNUYnJvd3NlL0lDT05icm93c2UucHkKKysrIGIvTWFjL0RlbW8vUElDVGJyb3dzZS9JQ09OYnJvd3NlLnB5CkBAIC0yNywxMzcgKzI3LDEzNyBAQAogTUFYSEVJR0hUPTMyMAogCiBkZWYgbWFpbigpOgotCW1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKLQlJQ09OYnJvd3NlKCkKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIlBJQ1Ricm93c2UucnNyYyIpCisgICAgSUNPTmJyb3dzZSgpCiAKIGNsYXNzIElDT05icm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCi0JCXNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQotCQkjIE5vdyBvcGVuIHRoZSBkaWFsb2cKLQkJY29udGVudHMgPSBzZWxmLmZpbmRJQ09OcmVzb3VyY2VzKCkKLQkJc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQotCQkjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKLQkJc2VsZi5tYWlubG9vcCgpCi0JCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgc2hvd0lDT04oc2VsZiwgcmVzaWQpOgotCQl3ID0gSUNPTndpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocmVzaWQpCi0JCSNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IElDT04gJXInICUgKHJlc2lkLCkpCi0JCQotCWRlZiBmaW5kSUNPTnJlc291cmNlcyhzZWxmKToKLQkJbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdJQ09OJykKLQkJcnYgPSBbXQotCQlmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6Ci0JCQlSZXMuU2V0UmVzTG9hZCgwKQotCQkJdHJ5OgotCQkJCXIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ0lDT04nLCBpKQotCQkJZmluYWxseToKLQkJCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQotCQkJcnYuYXBwZW5kKChpZCwgbmFtZSkpCi0JCXJldHVybiBydgotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQorICAgICAgICAjIE5vdyBvcGVuIHRoZSBkaWFsb2cKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmZpbmRJQ09OcmVzb3VyY2VzKCkKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQorICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBzaG93SUNPTihzZWxmLCByZXNpZCk6CisgICAgICAgIHcgPSBJQ09Od2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihyZXNpZCkKKyAgICAgICAgI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgSUNPTiAlcicgJSAocmVzaWQsKSkKKworICAgIGRlZiBmaW5kSUNPTnJlc291cmNlcyhzZWxmKToKKyAgICAgICAgbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdJQ09OJykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ0lDT04nLCBpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQorICAgICAgICAgICAgcnYuYXBwZW5kKChpZCwgbmFtZSkpCisgICAgICAgIHJldHVybiBydgorCiBjbGFzcyBJQ09Od2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgotCQlpZiBub3QgcmVzbmFtZToKLQkJCXJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCi0JCXNlbGYucmVzaWQgPSByZXNpZAotCQlzZWxmLnBpY3R1cmUgPSBJY24uR2V0SWNvbihzZWxmLnJlc2lkKQotCQlsLCB0LCByLCBiID0gMCwgMCwgMzIsIDMyCi0JCXNlbGYucGljdHJlY3QgPSAobCwgdCwgciwgYikKLQkJd2lkdGggPSByLWwKLQkJaGVpZ2h0ID0gYi10Ci0JCWlmIHdpZHRoIDwgTUlOV0lEVEg6IHdpZHRoID0gTUlOV0lEVEgKLQkJZWxpZiB3aWR0aCA+IE1BWFdJRFRIOiB3aWR0aCA9IE1BWFdJRFRICi0JCWlmIGhlaWdodCA8IE1JTkhFSUdIVDogaGVpZ2h0ID0gTUlOSEVJR0hUCi0JCWVsaWYgaGVpZ2h0ID4gTUFYSEVJR0hUOiBoZWlnaHQgPSBNQVhIRUlHSFQKLQkJYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKLQkJCi0JCXNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJCi0JZGVmIGRvX3VwZGF0ZShzZWxmLCAqYXJncyk6Ci0JCWN1cnJlY3QgPSBzZWxmLmZpdHJlY3QoKQotCQlJY24uUGxvdEljb24oY3VycmVjdCwgc2VsZi5waWN0dXJlKQotCQkKLQlkZWYgZml0cmVjdChzZWxmKToKLQkJIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKLQkJZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQotCQlzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKLQkJcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQotCQlwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQotCQlpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgotCQkJZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCWlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgotCQkJZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKLQkJCXBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKLQkJCXBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgotCQlyZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKLQkJCQlzY3JlZW5yZWN0WzFdK2ludChwaWNoZWlnaHQpKQotCQkKKyAgICBkZWYgb3BlbihzZWxmLCAocmVzaWQsIHJlc25hbWUpKToKKyAgICAgICAgaWYgbm90IHJlc25hbWU6CisgICAgICAgICAgICByZXNuYW1lID0gJyMlcicgJSAocmVzaWQsKQorICAgICAgICBzZWxmLnJlc2lkID0gcmVzaWQKKyAgICAgICAgc2VsZi5waWN0dXJlID0gSWNuLkdldEljb24oc2VsZi5yZXNpZCkKKyAgICAgICAgbCwgdCwgciwgYiA9IDAsIDAsIDMyLCAzMgorICAgICAgICBzZWxmLnBpY3RyZWN0ID0gKGwsIHQsIHIsIGIpCisgICAgICAgIHdpZHRoID0gci1sCisgICAgICAgIGhlaWdodCA9IGItdAorICAgICAgICBpZiB3aWR0aCA8IE1JTldJRFRIOiB3aWR0aCA9IE1JTldJRFRICisgICAgICAgIGVsaWYgd2lkdGggPiBNQVhXSURUSDogd2lkdGggPSBNQVhXSURUSAorICAgICAgICBpZiBoZWlnaHQgPCBNSU5IRUlHSFQ6IGhlaWdodCA9IE1JTkhFSUdIVAorICAgICAgICBlbGlmIGhlaWdodCA+IE1BWEhFSUdIVDogaGVpZ2h0ID0gTUFYSEVJR0hUCisgICAgICAgIGJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCisKKyAgICAgICAgc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGN1cnJlY3QgPSBzZWxmLmZpdHJlY3QoKQorICAgICAgICBJY24uUGxvdEljb24oY3VycmVjdCwgc2VsZi5waWN0dXJlKQorCisgICAgZGVmIGZpdHJlY3Qoc2VsZik6CisgICAgICAgICIiIlJldHVybiBzZWxmLnBpY3RyZWN0IHNjYWxlZCB0byBmaXQgaW4gd2luZG93IiIiCisgICAgICAgIGdyYWYgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkKKyAgICAgICAgc2NyZWVucmVjdCA9IGdyYWYuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHBpY3dpZHRoID0gc2VsZi5waWN0cmVjdFsyXSAtIHNlbGYucGljdHJlY3RbMF0KKyAgICAgICAgcGljaGVpZ2h0ID0gc2VsZi5waWN0cmVjdFszXSAtIHNlbGYucGljdHJlY3RbMV0KKyAgICAgICAgaWYgcGljd2lkdGggPiBzY3JlZW5yZWN0WzJdIC0gc2NyZWVucmVjdFswXToKKyAgICAgICAgICAgIGZhY3RvciA9IGZsb2F0KHBpY3dpZHRoKSAvIGZsb2F0KHNjcmVlbnJlY3RbMl0tc2NyZWVucmVjdFswXSkKKyAgICAgICAgICAgIHBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKKyAgICAgICAgICAgIHBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgorICAgICAgICBpZiBwaWNoZWlnaHQgPiBzY3JlZW5yZWN0WzNdIC0gc2NyZWVucmVjdFsxXToKKyAgICAgICAgICAgIGZhY3RvciA9IGZsb2F0KHBpY2hlaWdodCkgLyBmbG9hdChzY3JlZW5yZWN0WzNdLXNjcmVlbnJlY3RbMV0pCisgICAgICAgICAgICBwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCisgICAgICAgICAgICBwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKKyAgICAgICAgcmV0dXJuIChzY3JlZW5yZWN0WzBdLCBzY3JlZW5yZWN0WzFdLCBzY3JlZW5yZWN0WzBdK2ludChwaWN3aWR0aCksCisgICAgICAgICAgICAgICAgICAgICAgICBzY3JlZW5yZWN0WzFdK2ludChwaWNoZWlnaHQpKQorCiBjbGFzcyBNeURpYWxvZyhGcmFtZVdvcmsuRGlhbG9nV2luZG93KToKLQkiTWFpbiBkaWFsb2cgd2luZG93IGZvciBJQ09OYnJvd3NlIgorICAgICJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIElDT05icm93c2UiCiAKLQlkZWYgb3BlbihzZWxmLCBpZCwgY29udGVudHMpOgotCQlzZWxmLmlkID0gaWQKLQkJRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01BSU4pCi0JCXNlbGYuZGxnLlNldERpYWxvZ0RlZmF1bHRJdGVtKE1BSU5fU0hPVykKLQkJc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCi0JCXNlbGYuY3RsID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChNQUlOX0xJU1QpCi0JCWggPSBzZWxmLmN0bC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94UGFydCwgCi0JCQkJQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKLQkJc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCi0JCXNlbGYuc2V0bGlzdCgpCisgICAgZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKKyAgICAgICAgc2VsZi5pZCA9IGlkCisgICAgICAgIEZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQorICAgICAgICBzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCisgICAgICAgIHNlbGYuY29udGVudHMgPSBjb250ZW50cworICAgICAgICBzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQorICAgICAgICBoID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9scy5rQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnKQorICAgICAgICBzZWxmLmxpc3QgPSBMaXN0LmFzX0xpc3QoaCkKKyAgICAgICAgc2VsZi5zZXRsaXN0KCkKIAotCWRlZiBzZXRsaXN0KHNlbGYpOgotCQlzZWxmLmxpc3QuTERlbFJvdygwLCAwKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCi0JCWlmIHNlbGYuY29udGVudHM6Ci0JCQlzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgotCQkJCXYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCi0JCQkJaWYgc2VsZi5jb250ZW50c1tpXVsxXToKLQkJCQkJdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCi0JCQkJc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQotCQlzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQkKLQlkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotCQlpdGVtcyA9IFtdCi0JCXBvaW50ID0gKDAsMCkKLQkJd2hpbGUgMToKLQkJCW9rLCBwb2ludCA9IHNlbGYubGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXZhbHVlcyA9IFtdCi0JCWZvciBpIGluIGl0ZW1zOgotCQkJdmFsdWVzLmFwcGVuZChzZWxmLmNvbnRlbnRzW2ldKQotCQlyZXR1cm4gdmFsdWVzCi0JCQotCWRlZiBkb19zaG93KHNlbGYsICphcmdzKToKLQkJc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgotCQkJc2VsZi5wYXJlbnQuc2hvd0lDT04ocmVzaWQpCi0JCQotCWRlZiBkb19jbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSA9PSBNQUlOX1NIT1c6Ci0JCQlzZWxmLmRvX3Nob3coKQorICAgIGRlZiBzZXRsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmxpc3QuTERlbFJvdygwLCAwKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIGlmIHNlbGYuY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgorICAgICAgICAgICAgICAgIHYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50c1tpXVsxXToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCisgICAgICAgICAgICAgICAgc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICBzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHBvaW50WzFdKQorICAgICAgICAgICAgcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciByZXNpZCBpbiBzZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnBhcmVudC5zaG93SUNPTihyZXNpZCkKKworICAgIGRlZiBkb19jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6CisgICAgICAgIGlmIGl0ZW0gPT0gTUFJTl9TSE9XOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKIAogbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UucHkgYi9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UucHkKaW5kZXggZWFjZTg2OS4uMGFkZmM4MyAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vUElDVGJyb3dzZS9QSUNUYnJvd3NlLnB5CisrKyBiL01hYy9EZW1vL1BJQ1Ricm93c2UvUElDVGJyb3dzZS5weQpAQCAtMjIsMTIwICsyMiwxMjAgQEAKIFRPUD02NAogCiBkZWYgbWFpbigpOgotCW1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKLQlQSUNUYnJvd3NlKCkKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIlBJQ1Ricm93c2UucnNyYyIpCisgICAgUElDVGJyb3dzZSgpCiAKIGNsYXNzIFBJQ1Ricm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCi0JCXNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQotCQkjIE5vdyBvcGVuIHRoZSBkaWFsb2cKLQkJY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKLQkJc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQotCQkjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKLQkJc2VsZi5tYWlubG9vcCgpCi0JCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgc2hvd1BJQ1Qoc2VsZiwgcmVzaWQpOgotCQl3ID0gUElDVHdpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocmVzaWQpCi0JCSNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IFBJQ1QgJXInICUgKHJlc2lkLCkpCi0JCQotCWRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKLQkJbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKLQkJcnYgPSBbXQotCQlmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6Ci0JCQlSZXMuU2V0UmVzTG9hZCgwKQotCQkJdHJ5OgotCQkJCXIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQotCQkJZmluYWxseToKLQkJCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQotCQkJcnYuYXBwZW5kKChpZCwgbmFtZSkpCi0JCXJldHVybiBydgotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQorICAgICAgICAjIE5vdyBvcGVuIHRoZSBkaWFsb2cKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQorICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBzaG93UElDVChzZWxmLCByZXNpZCk6CisgICAgICAgIHcgPSBQSUNUd2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihyZXNpZCkKKyAgICAgICAgI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgUElDVCAlcicgJSAocmVzaWQsKSkKKworICAgIGRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKKyAgICAgICAgbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQorICAgICAgICAgICAgcnYuYXBwZW5kKChpZCwgbmFtZSkpCisgICAgICAgIHJldHVybiBydgorCiBjbGFzcyBQSUNUd2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgotCQlpZiBub3QgcmVzbmFtZToKLQkJCXJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCi0JCXNlbGYucmVzaWQgPSByZXNpZAotCQlwaWN0dXJlID0gUWQuR2V0UGljdHVyZShzZWxmLnJlc2lkKQotCQkjIEdldCByZWN0IGZvciBwaWN0dXJlCi0JCXByaW50IHJlcHIocGljdHVyZS5kYXRhWzoxNl0pCi0JCXN6LCB0LCBsLCBiLCByID0gc3RydWN0LnVucGFjaygnaGhoaGgnLCBwaWN0dXJlLmRhdGFbOjEwXSkKLQkJcHJpbnQgJ3BpY3Q6JywgdCwgbCwgYiwgcgotCQl3aWR0aCA9IHItbAotCQloZWlnaHQgPSBiLXQKLQkJaWYgd2lkdGggPCA2NDogd2lkdGggPSA2NAotCQllbGlmIHdpZHRoID4gNDgwOiB3aWR0aCA9IDQ4MAotCQlpZiBoZWlnaHQgPCA2NDogaGVpZ2h0ID0gNjQKLQkJZWxpZiBoZWlnaHQgPiAzMjA6IGhlaWdodCA9IDMyMAotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQlwcmludCAnYm91bmRzOicsIGJvdW5kcwotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkLlNldFdpbmRvd1BpYyhwaWN0dXJlKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJCisgICAgZGVmIG9wZW4oc2VsZiwgKHJlc2lkLCByZXNuYW1lKSk6CisgICAgICAgIGlmIG5vdCByZXNuYW1lOgorICAgICAgICAgICAgcmVzbmFtZSA9ICcjJXInICUgKHJlc2lkLCkKKyAgICAgICAgc2VsZi5yZXNpZCA9IHJlc2lkCisgICAgICAgIHBpY3R1cmUgPSBRZC5HZXRQaWN0dXJlKHNlbGYucmVzaWQpCisgICAgICAgICMgR2V0IHJlY3QgZm9yIHBpY3R1cmUKKyAgICAgICAgcHJpbnQgcmVwcihwaWN0dXJlLmRhdGFbOjE2XSkKKyAgICAgICAgc3osIHQsIGwsIGIsIHIgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoaCcsIHBpY3R1cmUuZGF0YVs6MTBdKQorICAgICAgICBwcmludCAncGljdDonLCB0LCBsLCBiLCByCisgICAgICAgIHdpZHRoID0gci1sCisgICAgICAgIGhlaWdodCA9IGItdAorICAgICAgICBpZiB3aWR0aCA8IDY0OiB3aWR0aCA9IDY0CisgICAgICAgIGVsaWYgd2lkdGggPiA0ODA6IHdpZHRoID0gNDgwCisgICAgICAgIGlmIGhlaWdodCA8IDY0OiBoZWlnaHQgPSA2NAorICAgICAgICBlbGlmIGhlaWdodCA+IDMyMDogaGVpZ2h0ID0gMzIwCisgICAgICAgIGJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCisgICAgICAgIHByaW50ICdib3VuZHM6JywgYm91bmRzCisKKyAgICAgICAgc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkLlNldFdpbmRvd1BpYyhwaWN0dXJlKQorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKwogY2xhc3MgTXlEaWFsb2coRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdyk6Ci0JIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgUElDVGJyb3dzZSIKKyAgICAiTWFpbiBkaWFsb2cgd2luZG93IGZvciBQSUNUYnJvd3NlIgogCi0JZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKLQkJc2VsZi5pZCA9IGlkCi0JCUZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQotCQlzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCi0JCXNlbGYuY29udGVudHMgPSBjb250ZW50cwotCQlzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQotCQloID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsIAotCQkJCUNvbnRyb2xzLmtDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcpCi0JCXNlbGYubGlzdCA9IExpc3QuYXNfTGlzdChoKQotCQlzZWxmLnNldGxpc3QoKQorICAgIGRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKKyAgICAgICAgc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQorICAgICAgICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5jdGwgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtQXNDb250cm9sKE1BSU5fTElTVCkKKyAgICAgICAgaCA9IHNlbGYuY3RsLkdldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbExpc3RCb3hQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKKyAgICAgICAgc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCisgICAgICAgIHNlbGYuc2V0bGlzdCgpCiAKLQlkZWYgc2V0bGlzdChzZWxmKToKLQkJc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlpZiBzZWxmLmNvbnRlbnRzOgotCQkJc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKLQkJCQl2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQotCQkJCWlmIHNlbGYuY29udGVudHNbaV1bMV06Ci0JCQkJCXYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJwotCQkJCXNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJaXRlbXMgPSBbXQotCQlwb2ludCA9ICgwLDApCi0JCXdoaWxlIDE6Ci0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJCWlmIG5vdCBvazoKLQkJCQlicmVhawotCQkJaXRlbXMuYXBwZW5kKHBvaW50WzFdKQotCQkJcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQotCQl2YWx1ZXMgPSBbXQotCQlmb3IgaSBpbiBpdGVtczoKLQkJCXZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKLQkJcmV0dXJuIHZhbHVlcwotCQkKLQlkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6Ci0JCXNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKLQkJCXNlbGYucGFyZW50LnNob3dQSUNUKHJlc2lkKQotCQkKLQlkZWYgZG9fY2xvc2Uoc2VsZik6Ci0JCXNlbGYuY2xvc2UoKQotCQkKLQlkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6Ci0JCWlmIGl0ZW0gPT0gTUFJTl9TSE9XOgotCQkJc2VsZi5kb19zaG93KCkKKyAgICBkZWYgc2V0bGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQorICAgICAgICBpZiBzZWxmLmNvbnRlbnRzOgorICAgICAgICAgICAgc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKKyAgICAgICAgICAgICAgICB2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29udGVudHNbaV1bMV06CisgICAgICAgICAgICAgICAgICAgIHYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJworICAgICAgICAgICAgICAgIHNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKKyAgICAgICAgc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKworICAgIGRlZiBnZXRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgcG9pbnQgPSAoMCwwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChwb2ludFsxXSkKKyAgICAgICAgICAgIHBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCisgICAgICAgIHJldHVybiB2YWx1ZXMKKworICAgIGRlZiBkb19zaG93KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuc2hvd1BJQ1QocmVzaWQpCisKKyAgICBkZWYgZG9fY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgorICAgICAgICBpZiBpdGVtID09IE1BSU5fU0hPVzoKKyAgICAgICAgICAgIHNlbGYuZG9fc2hvdygpCiAKIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vUElDVGJyb3dzZS9QSUNUYnJvd3NlMi5weSBiL01hYy9EZW1vL1BJQ1Ricm93c2UvUElDVGJyb3dzZTIucHkKaW5kZXggODc1Yzk5Yi4uODRjZjhiOCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vUElDVGJyb3dzZS9QSUNUYnJvd3NlMi5weQorKysgYi9NYWMvRGVtby9QSUNUYnJvd3NlL1BJQ1Ricm93c2UyLnB5CkBAIC0yNiwxMzggKzI2LDEzOCBAQAogTUFYSEVJR0hUPTMyMAogCiBkZWYgbWFpbigpOgotCW1hY3Jlc291cmNlLm5lZWQoJ0RMT0cnLCBJRF9NQUlOLCAiUElDVGJyb3dzZS5yc3JjIikKLQlQSUNUYnJvd3NlKCkKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIlBJQ1Ricm93c2UucnNyYyIpCisgICAgUElDVGJyb3dzZSgpCiAKIGNsYXNzIFBJQ1Ricm93c2UoRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCSMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCi0JCXNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQotCQkjIE5vdyBvcGVuIHRoZSBkaWFsb2cKLQkJY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKLQkJc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQotCQkjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKLQkJc2VsZi5tYWlubG9vcCgpCi0JCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgc2hvd1BJQ1Qoc2VsZiwgcmVzaWQpOgotCQl3ID0gUElDVHdpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocmVzaWQpCi0JCSNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IFBJQ1QgJXInICUgKHJlc2lkLCkpCi0JCQotCWRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKLQkJbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKLQkJcnYgPSBbXQotCQlmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6Ci0JCQlSZXMuU2V0UmVzTG9hZCgwKQotCQkJdHJ5OgotCQkJCXIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQotCQkJZmluYWxseToKLQkJCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQotCQkJcnYuYXBwZW5kKChpZCwgbmFtZSkpCi0JCXJldHVybiBydgotCQkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgICMgRmlyc3QgaW5pdCBtZW51cywgZXRjLgorICAgICAgICBGcmFtZVdvcmsuQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgIyBOZXh0IGNyZWF0ZSBvdXIgZGlhbG9nCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cgPSBNeURpYWxvZyhzZWxmKQorICAgICAgICAjIE5vdyBvcGVuIHRoZSBkaWFsb2cKKyAgICAgICAgY29udGVudHMgPSBzZWxmLmZpbmRQSUNUcmVzb3VyY2VzKCkKKyAgICAgICAgc2VsZi5tYWluX2RpYWxvZy5vcGVuKElEX01BSU4sIGNvbnRlbnRzKQorICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBzaG93UElDVChzZWxmLCByZXNpZCk6CisgICAgICAgIHcgPSBQSUNUd2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihyZXNpZCkKKyAgICAgICAgI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgUElDVCAlcicgJSAocmVzaWQsKSkKKworICAgIGRlZiBmaW5kUElDVHJlc291cmNlcyhzZWxmKToKKyAgICAgICAgbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdQSUNUJykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ1BJQ1QnLCBpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQorICAgICAgICAgICAgcnYuYXBwZW5kKChpZCwgbmFtZSkpCisgICAgICAgIHJldHVybiBydgorCiBjbGFzcyBQSUNUd2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgotCQlpZiBub3QgcmVzbmFtZToKLQkJCXJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCi0JCXNlbGYucmVzaWQgPSByZXNpZAotCQlzZWxmLnBpY3R1cmUgPSBRZC5HZXRQaWN0dXJlKHNlbGYucmVzaWQpCi0JCSMgR2V0IHJlY3QgZm9yIHBpY3R1cmUKLQkJc3osIHQsIGwsIGIsIHIgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoaCcsIHNlbGYucGljdHVyZS5kYXRhWzoxMF0pCi0JCXNlbGYucGljdHJlY3QgPSAobCwgdCwgciwgYikKLQkJd2lkdGggPSByLWwKLQkJaGVpZ2h0ID0gYi10Ci0JCWlmIHdpZHRoIDwgTUlOV0lEVEg6IHdpZHRoID0gTUlOV0lEVEgKLQkJZWxpZiB3aWR0aCA+IE1BWFdJRFRIOiB3aWR0aCA9IE1BWFdJRFRICi0JCWlmIGhlaWdodCA8IE1JTkhFSUdIVDogaGVpZ2h0ID0gTUlOSEVJR0hUCi0JCWVsaWYgaGVpZ2h0ID4gTUFYSEVJR0hUOiBoZWlnaHQgPSBNQVhIRUlHSFQKLQkJYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKLQkJCi0JCXNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJCi0JZGVmIGRvX3VwZGF0ZShzZWxmLCAqYXJncyk6Ci0JCWN1cnJlY3QgPSBzZWxmLmZpdHJlY3QoKQotCQlRZC5EcmF3UGljdHVyZShzZWxmLnBpY3R1cmUsIGN1cnJlY3QpCi0JCQotCWRlZiBmaXRyZWN0KHNlbGYpOgotCQkiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgotCQlncmFmID0gc2VsZi5kbGcuR2V0V2luZG93UG9ydCgpCi0JCXNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQotCQlwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCi0JCXBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCi0JCWlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCi0JCQlwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCi0JCQlwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKLQkJaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06Ci0JCQlmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCXJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAotCQkJCXNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCi0JCQorICAgIGRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgorICAgICAgICBpZiBub3QgcmVzbmFtZToKKyAgICAgICAgICAgIHJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCisgICAgICAgIHNlbGYucmVzaWQgPSByZXNpZAorICAgICAgICBzZWxmLnBpY3R1cmUgPSBRZC5HZXRQaWN0dXJlKHNlbGYucmVzaWQpCisgICAgICAgICMgR2V0IHJlY3QgZm9yIHBpY3R1cmUKKyAgICAgICAgc3osIHQsIGwsIGIsIHIgPSBzdHJ1Y3QudW5wYWNrKCdoaGhoaCcsIHNlbGYucGljdHVyZS5kYXRhWzoxMF0pCisgICAgICAgIHNlbGYucGljdHJlY3QgPSAobCwgdCwgciwgYikKKyAgICAgICAgd2lkdGggPSByLWwKKyAgICAgICAgaGVpZ2h0ID0gYi10CisgICAgICAgIGlmIHdpZHRoIDwgTUlOV0lEVEg6IHdpZHRoID0gTUlOV0lEVEgKKyAgICAgICAgZWxpZiB3aWR0aCA+IE1BWFdJRFRIOiB3aWR0aCA9IE1BWFdJRFRICisgICAgICAgIGlmIGhlaWdodCA8IE1JTkhFSUdIVDogaGVpZ2h0ID0gTUlOSEVJR0hUCisgICAgICAgIGVsaWYgaGVpZ2h0ID4gTUFYSEVJR0hUOiBoZWlnaHQgPSBNQVhIRUlHSFQKKyAgICAgICAgYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKKworICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdXaW5kb3coYm91bmRzLCByZXNuYW1lLCAxLCAwLCAtMSwgMSwgMCkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKKyAgICAgICAgY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCisgICAgICAgIFFkLkRyYXdQaWN0dXJlKHNlbGYucGljdHVyZSwgY3VycmVjdCkKKworICAgIGRlZiBmaXRyZWN0KHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gc2VsZi5waWN0cmVjdCBzY2FsZWQgdG8gZml0IGluIHdpbmRvdyIiIgorICAgICAgICBncmFmID0gc2VsZi5kbGcuR2V0V2luZG93UG9ydCgpCisgICAgICAgIHNjcmVlbnJlY3QgPSBncmFmLkdldFBvcnRCb3VuZHMoKQorICAgICAgICBwaWN3aWR0aCA9IHNlbGYucGljdHJlY3RbMl0gLSBzZWxmLnBpY3RyZWN0WzBdCisgICAgICAgIHBpY2hlaWdodCA9IHNlbGYucGljdHJlY3RbM10gLSBzZWxmLnBpY3RyZWN0WzFdCisgICAgICAgIGlmIHBpY3dpZHRoID4gc2NyZWVucmVjdFsyXSAtIHNjcmVlbnJlY3RbMF06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWN3aWR0aCkgLyBmbG9hdChzY3JlZW5yZWN0WzJdLXNjcmVlbnJlY3RbMF0pCisgICAgICAgICAgICBwaWN3aWR0aCA9IHBpY3dpZHRoIC8gZmFjdG9yCisgICAgICAgICAgICBwaWNoZWlnaHQgPSBwaWNoZWlnaHQgLyBmYWN0b3IKKyAgICAgICAgaWYgcGljaGVpZ2h0ID4gc2NyZWVucmVjdFszXSAtIHNjcmVlbnJlY3RbMV06CisgICAgICAgICAgICBmYWN0b3IgPSBmbG9hdChwaWNoZWlnaHQpIC8gZmxvYXQoc2NyZWVucmVjdFszXS1zY3JlZW5yZWN0WzFdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIHJldHVybiAoc2NyZWVucmVjdFswXSwgc2NyZWVucmVjdFsxXSwgc2NyZWVucmVjdFswXStpbnQocGljd2lkdGgpLAorICAgICAgICAgICAgICAgICAgICAgICAgc2NyZWVucmVjdFsxXStpbnQocGljaGVpZ2h0KSkKKwogY2xhc3MgTXlEaWFsb2coRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdyk6Ci0JIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgUElDVGJyb3dzZSIKKyAgICAiTWFpbiBkaWFsb2cgd2luZG93IGZvciBQSUNUYnJvd3NlIgogCi0JZGVmIG9wZW4oc2VsZiwgaWQsIGNvbnRlbnRzKToKLQkJc2VsZi5pZCA9IGlkCi0JCUZyYW1lV29yay5EaWFsb2dXaW5kb3cub3BlbihzZWxmLCBJRF9NQUlOKQotCQlzZWxmLmRsZy5TZXREaWFsb2dEZWZhdWx0SXRlbShNQUlOX1NIT1cpCi0JCXNlbGYuY29udGVudHMgPSBjb250ZW50cwotCQlzZWxmLmN0bCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW1Bc0NvbnRyb2woTUFJTl9MSVNUKQotCQloID0gc2VsZi5jdGwuR2V0Q29udHJvbERhdGFfSGFuZGxlKENvbnRyb2xzLmtDb250cm9sTGlzdEJveFBhcnQsIAotCQkJCUNvbnRyb2xzLmtDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcpCi0JCXNlbGYubGlzdCA9IExpc3QuYXNfTGlzdChoKQotCQlzZWxmLnNldGxpc3QoKQorICAgIGRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKKyAgICAgICAgc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQorICAgICAgICBzZWxmLmNvbnRlbnRzID0gY29udGVudHMKKyAgICAgICAgc2VsZi5jdGwgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtQXNDb250cm9sKE1BSU5fTElTVCkKKyAgICAgICAgaCA9IHNlbGYuY3RsLkdldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbExpc3RCb3hQYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94TGlzdEhhbmRsZVRhZykKKyAgICAgICAgc2VsZi5saXN0ID0gTGlzdC5hc19MaXN0KGgpCisgICAgICAgIHNlbGYuc2V0bGlzdCgpCiAKLQlkZWYgc2V0bGlzdChzZWxmKToKLQkJc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlpZiBzZWxmLmNvbnRlbnRzOgotCQkJc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKLQkJCQl2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQotCQkJCWlmIHNlbGYuY29udGVudHNbaV1bMV06Ci0JCQkJCXYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJwotCQkJCXNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGdldHNlbGVjdGlvbihzZWxmKToKLQkJaXRlbXMgPSBbXQotCQlwb2ludCA9ICgwLDApCi0JCXdoaWxlIDE6Ci0JCQlvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKLQkJCWlmIG5vdCBvazoKLQkJCQlicmVhawotCQkJaXRlbXMuYXBwZW5kKHBvaW50WzFdKQotCQkJcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQotCQl2YWx1ZXMgPSBbXQotCQlmb3IgaSBpbiBpdGVtczoKLQkJCXZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKLQkJcmV0dXJuIHZhbHVlcwotCQkKLQlkZWYgZG9fc2hvdyhzZWxmLCAqYXJncyk6Ci0JCXNlbGVjdGlvbiA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIHJlc2lkIGluIHNlbGVjdGlvbjoKLQkJCXNlbGYucGFyZW50LnNob3dQSUNUKHJlc2lkKQotCQkKLQlkZWYgZG9fY2xvc2Uoc2VsZik6Ci0JCXNlbGYuY2xvc2UoKQotCQkKLQlkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6Ci0JCWlmIGl0ZW0gPT0gTUFJTl9TSE9XOgotCQkJc2VsZi5kb19zaG93KCkKKyAgICBkZWYgc2V0bGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQorICAgICAgICBpZiBzZWxmLmNvbnRlbnRzOgorICAgICAgICAgICAgc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKKyAgICAgICAgICAgICAgICB2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuY29udGVudHNbaV1bMV06CisgICAgICAgICAgICAgICAgICAgIHYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJworICAgICAgICAgICAgICAgIHNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKKyAgICAgICAgc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKworICAgIGRlZiBnZXRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgcG9pbnQgPSAoMCwwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChwb2ludFsxXSkKKyAgICAgICAgICAgIHBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCisgICAgICAgIHJldHVybiB2YWx1ZXMKKworICAgIGRlZiBkb19zaG93KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuc2hvd1BJQ1QocmVzaWQpCisKKyAgICBkZWYgZG9fY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgorICAgICAgICBpZiBpdGVtID09IE1BSU5fU0hPVzoKKyAgICAgICAgICAgIHNlbGYuZG9fc2hvdygpCiAKIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vUElDVGJyb3dzZS9jaWNuYnJvd3NlLnB5IGIvTWFjL0RlbW8vUElDVGJyb3dzZS9jaWNuYnJvd3NlLnB5CmluZGV4IGUzZDc5NzIuLmQ5NWU3YzggMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL1BJQ1Ricm93c2UvY2ljbmJyb3dzZS5weQorKysgYi9NYWMvRGVtby9QSUNUYnJvd3NlL2NpY25icm93c2UucHkKQEAgLTI3LDEzNyArMjcsMTM3IEBACiBNQVhIRUlHSFQ9MzIwCiAKIGRlZiBtYWluKCk6Ci0JbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU4sICJQSUNUYnJvd3NlLnJzcmMiKQotCUNJY29uYnJvd3NlKCkKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIlBJQ1Ricm93c2UucnNyYyIpCisgICAgQ0ljb25icm93c2UoKQogCiBjbGFzcyBDSWNvbmJyb3dzZShGcmFtZVdvcmsuQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCi0JCUZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQkjIE5leHQgY3JlYXRlIG91ciBkaWFsb2cKLQkJc2VsZi5tYWluX2RpYWxvZyA9IE15RGlhbG9nKHNlbGYpCi0JCSMgTm93IG9wZW4gdGhlIGRpYWxvZwotCQljb250ZW50cyA9IHNlbGYuZmluZGNpY25yZXNvdXJjZXMoKQotCQlzZWxmLm1haW5fZGlhbG9nLm9wZW4oSURfTUFJTiwgY29udGVudHMpCi0JCSMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAotCQlzZWxmLm1haW5sb29wKCkKLQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJc2VsZi5fcXVpdCgpCi0JCQotCWRlZiBzaG93Q0ljb24oc2VsZiwgcmVzaWQpOgotCQl3ID0gQ0ljb253aW5kb3coc2VsZikKLQkJdy5vcGVuKHJlc2lkKQotCQkjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBjaWNuICVyJyAlIChyZXNpZCwpKQotCQkKLQlkZWYgZmluZGNpY25yZXNvdXJjZXMoc2VsZik6Ci0JCW51bSA9IFJlcy5Db3VudFJlc291cmNlcygnY2ljbicpCi0JCXJ2ID0gW10KLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbnVtKzEpOgotCQkJUmVzLlNldFJlc0xvYWQoMCkKLQkJCXRyeToKLQkJCQlyID0gUmVzLkdldEluZFJlc291cmNlKCdjaWNuJywgaSkKLQkJCWZpbmFsbHk6Ci0JCQkJUmVzLlNldFJlc0xvYWQoMSkKLQkJCWlkLCB0eXBlLCBuYW1lID0gci5HZXRSZXNJbmZvKCkKLQkJCXJ2LmFwcGVuZCgoaWQsIG5hbWUpKQotCQlyZXR1cm4gcnYKLQkJCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KKyAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgICMgTmV4dCBjcmVhdGUgb3VyIGRpYWxvZworICAgICAgICBzZWxmLm1haW5fZGlhbG9nID0gTXlEaWFsb2coc2VsZikKKyAgICAgICAgIyBOb3cgb3BlbiB0aGUgZGlhbG9nCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5maW5kY2ljbnJlc291cmNlcygpCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cub3BlbihJRF9NQUlOLCBjb250ZW50cykKKyAgICAgICAgIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCisgICAgICAgIHNlbGYubWFpbmxvb3AoKQorCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgc2hvd0NJY29uKHNlbGYsIHJlc2lkKToKKyAgICAgICAgdyA9IENJY29ud2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihyZXNpZCkKKyAgICAgICAgI0Vhc3lEaWFsb2dzLk1lc3NhZ2UoJ1Nob3cgY2ljbiAlcicgJSAocmVzaWQsKSkKKworICAgIGRlZiBmaW5kY2ljbnJlc291cmNlcyhzZWxmKToKKyAgICAgICAgbnVtID0gUmVzLkNvdW50UmVzb3VyY2VzKCdjaWNuJykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBudW0rMSk6CisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgwKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ2NpY24nLCBpKQorICAgICAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByLkdldFJlc0luZm8oKQorICAgICAgICAgICAgcnYuYXBwZW5kKChpZCwgbmFtZSkpCisgICAgICAgIHJldHVybiBydgorCiBjbGFzcyBDSWNvbndpbmRvdyhGcmFtZVdvcmsuV2luZG93KToKLQlkZWYgb3BlbihzZWxmLCAocmVzaWQsIHJlc25hbWUpKToKLQkJaWYgbm90IHJlc25hbWU6Ci0JCQlyZXNuYW1lID0gJyMlcicgJSAocmVzaWQsKQotCQlzZWxmLnJlc2lkID0gcmVzaWQKLQkJc2VsZi5waWN0dXJlID0gSWNuLkdldENJY29uKHNlbGYucmVzaWQpCi0JCWwsIHQsIHIsIGIgPSAwLCAwLCAzMiwgMzIKLQkJc2VsZi5waWN0cmVjdCA9IChsLCB0LCByLCBiKQotCQl3aWR0aCA9IHItbAotCQloZWlnaHQgPSBiLXQKLQkJaWYgd2lkdGggPCBNSU5XSURUSDogd2lkdGggPSBNSU5XSURUSAotCQllbGlmIHdpZHRoID4gTUFYV0lEVEg6IHdpZHRoID0gTUFYV0lEVEgKLQkJaWYgaGVpZ2h0IDwgTUlOSEVJR0hUOiBoZWlnaHQgPSBNSU5IRUlHSFQKLQkJZWxpZiBoZWlnaHQgPiBNQVhIRUlHSFQ6IGhlaWdodCA9IE1BWEhFSUdIVAotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3V2luZG93KGJvdW5kcywgcmVzbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKLQkJY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCi0JCUljbi5QbG90Q0ljb24oY3VycmVjdCwgc2VsZi5waWN0dXJlKQotCQkKLQlkZWYgZml0cmVjdChzZWxmKToKLQkJIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKLQkJZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQotCQlzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKLQkJcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQotCQlwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQotCQlpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgotCQkJZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCWlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgotCQkJZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKLQkJCXBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKLQkJCXBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgotCQlyZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKLQkJCQlzY3JlZW5yZWN0WzFdK2ludChwaWNoZWlnaHQpKQotCQkKKyAgICBkZWYgb3BlbihzZWxmLCAocmVzaWQsIHJlc25hbWUpKToKKyAgICAgICAgaWYgbm90IHJlc25hbWU6CisgICAgICAgICAgICByZXNuYW1lID0gJyMlcicgJSAocmVzaWQsKQorICAgICAgICBzZWxmLnJlc2lkID0gcmVzaWQKKyAgICAgICAgc2VsZi5waWN0dXJlID0gSWNuLkdldENJY29uKHNlbGYucmVzaWQpCisgICAgICAgIGwsIHQsIHIsIGIgPSAwLCAwLCAzMiwgMzIKKyAgICAgICAgc2VsZi5waWN0cmVjdCA9IChsLCB0LCByLCBiKQorICAgICAgICB3aWR0aCA9IHItbAorICAgICAgICBoZWlnaHQgPSBiLXQKKyAgICAgICAgaWYgd2lkdGggPCBNSU5XSURUSDogd2lkdGggPSBNSU5XSURUSAorICAgICAgICBlbGlmIHdpZHRoID4gTUFYV0lEVEg6IHdpZHRoID0gTUFYV0lEVEgKKyAgICAgICAgaWYgaGVpZ2h0IDwgTUlOSEVJR0hUOiBoZWlnaHQgPSBNSU5IRUlHSFQKKyAgICAgICAgZWxpZiBoZWlnaHQgPiBNQVhIRUlHSFQ6IGhlaWdodCA9IE1BWEhFSUdIVAorICAgICAgICBib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQorCisgICAgICAgIHNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBjdXJyZWN0ID0gc2VsZi5maXRyZWN0KCkKKyAgICAgICAgSWNuLlBsb3RDSWNvbihjdXJyZWN0LCBzZWxmLnBpY3R1cmUpCisKKyAgICBkZWYgZml0cmVjdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKKyAgICAgICAgZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQorICAgICAgICBzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKKyAgICAgICAgcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQorICAgICAgICBwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQorICAgICAgICBpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIGlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKKyAgICAgICAgICAgIHBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKKyAgICAgICAgICAgIHBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgorICAgICAgICByZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCisKIGNsYXNzIE15RGlhbG9nKEZyYW1lV29yay5EaWFsb2dXaW5kb3cpOgotCSJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIGNpY25icm93c2UiCisgICAgIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgY2ljbmJyb3dzZSIKIAotCWRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6Ci0JCXNlbGYuaWQgPSBpZAotCQlGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKLQkJc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQotCQlzZWxmLmNvbnRlbnRzID0gY29udGVudHMKLQkJc2VsZi5jdGwgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtQXNDb250cm9sKE1BSU5fTElTVCkKLQkJaCA9IHNlbGYuY3RsLkdldENvbnRyb2xEYXRhX0hhbmRsZShDb250cm9scy5rQ29udHJvbExpc3RCb3hQYXJ0LCAKLQkJCQlDb250cm9scy5rQ29udHJvbExpc3RCb3hMaXN0SGFuZGxlVGFnKQotCQlzZWxmLmxpc3QgPSBMaXN0LmFzX0xpc3QoaCkKLQkJc2VsZi5zZXRsaXN0KCkKKyAgICBkZWYgb3BlbihzZWxmLCBpZCwgY29udGVudHMpOgorICAgICAgICBzZWxmLmlkID0gaWQKKyAgICAgICAgRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdy5vcGVuKHNlbGYsIElEX01BSU4pCisgICAgICAgIHNlbGYuZGxnLlNldERpYWxvZ0RlZmF1bHRJdGVtKE1BSU5fU0hPVykKKyAgICAgICAgc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuY3RsID0gc2VsZi5kbGcuR2V0RGlhbG9nSXRlbUFzQ29udHJvbChNQUlOX0xJU1QpCisgICAgICAgIGggPSBzZWxmLmN0bC5HZXRDb250cm9sRGF0YV9IYW5kbGUoQ29udHJvbHMua0NvbnRyb2xMaXN0Qm94UGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sTGlzdEJveExpc3RIYW5kbGVUYWcpCisgICAgICAgIHNlbGYubGlzdCA9IExpc3QuYXNfTGlzdChoKQorICAgICAgICBzZWxmLnNldGxpc3QoKQogCi0JZGVmIHNldGxpc3Qoc2VsZik6Ci0JCXNlbGYubGlzdC5MRGVsUm93KDAsIDApCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKLQkJaWYgc2VsZi5jb250ZW50czoKLQkJCXNlbGYubGlzdC5MQWRkUm93KGxlbihzZWxmLmNvbnRlbnRzKSwgMCkKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNvbnRlbnRzKSk6Ci0JCQkJdiA9IHJlcHIoc2VsZi5jb250ZW50c1tpXVswXSkKLQkJCQlpZiBzZWxmLmNvbnRlbnRzW2ldWzFdOgotCQkJCQl2ID0gdiArICciJyArIHNlbGYuY29udGVudHNbaV1bMV0gKyAnIicKLQkJCQlzZWxmLmxpc3QuTFNldENlbGwodiwgKDAsIGkpKQotCQlzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDEpCi0JCXNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCQlpZiBub3Qgb2s6Ci0JCQkJYnJlYWsKLQkJCWl0ZW1zLmFwcGVuZChwb2ludFsxXSkKLQkJCXBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKLQkJdmFsdWVzID0gW10KLQkJZm9yIGkgaW4gaXRlbXM6Ci0JCQl2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCi0JCXJldHVybiB2YWx1ZXMKLQkJCi0JZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgotCQlzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWZvciByZXNpZCBpbiBzZWxlY3Rpb246Ci0JCQlzZWxmLnBhcmVudC5zaG93Q0ljb24ocmVzaWQpCi0JCQotCWRlZiBkb19jbG9zZShzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCQotCWRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKLQkJaWYgaXRlbSA9PSBNQUlOX1NIT1c6Ci0JCQlzZWxmLmRvX3Nob3coKQorICAgIGRlZiBzZXRsaXN0KHNlbGYpOgorICAgICAgICBzZWxmLmxpc3QuTERlbFJvdygwLCAwKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIGlmIHNlbGYuY29udGVudHM6CisgICAgICAgICAgICBzZWxmLmxpc3QuTEFkZFJvdyhsZW4oc2VsZi5jb250ZW50cyksIDApCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5jb250ZW50cykpOgorICAgICAgICAgICAgICAgIHYgPSByZXByKHNlbGYuY29udGVudHNbaV1bMF0pCisgICAgICAgICAgICAgICAgaWYgc2VsZi5jb250ZW50c1tpXVsxXToKKyAgICAgICAgICAgICAgICAgICAgdiA9IHYgKyAnIicgKyBzZWxmLmNvbnRlbnRzW2ldWzFdICsgJyInCisgICAgICAgICAgICAgICAgc2VsZi5saXN0LkxTZXRDZWxsKHYsICgwLCBpKSkKKyAgICAgICAgc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICBzZWxmLmxpc3QuTFVwZGF0ZShzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLmxpc3QuTEdldFNlbGVjdCgxLCBwb2ludCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgaXRlbXMuYXBwZW5kKHBvaW50WzFdKQorICAgICAgICAgICAgcG9pbnQgPSBwb2ludFswXSwgcG9pbnRbMV0rMQorICAgICAgICB2YWx1ZXMgPSBbXQorICAgICAgICBmb3IgaSBpbiBpdGVtczoKKyAgICAgICAgICAgIHZhbHVlcy5hcHBlbmQoc2VsZi5jb250ZW50c1tpXSkKKyAgICAgICAgcmV0dXJuIHZhbHVlcworCisgICAgZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIGZvciByZXNpZCBpbiBzZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnBhcmVudC5zaG93Q0ljb24ocmVzaWQpCisKKyAgICBkZWYgZG9fY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGRvX2l0ZW1oaXQoc2VsZiwgaXRlbSwgZXZlbnQpOgorICAgICAgICBpZiBpdGVtID09IE1BSU5fU0hPVzoKKyAgICAgICAgICAgIHNlbGYuZG9fc2hvdygpCiAKIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vUElDVGJyb3dzZS9vbGRQSUNUYnJvd3NlLnB5IGIvTWFjL0RlbW8vUElDVGJyb3dzZS9vbGRQSUNUYnJvd3NlLnB5CmluZGV4IDVmNTg5M2MuLjg2MDBiYjIgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL1BJQ1Ricm93c2Uvb2xkUElDVGJyb3dzZS5weQorKysgYi9NYWMvRGVtby9QSUNUYnJvd3NlL29sZFBJQ1Ricm93c2UucHkKQEAgLTIxLDEzOSArMjEsMTM5IEBACiBUT1A9NjQKIAogZGVmIG1haW4oKToKLQltYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTiwgIm9sZFBJQ1Ricm93c2UucnNyYyIpCi0JUElDVGJyb3dzZSgpCisgICAgbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU4sICJvbGRQSUNUYnJvd3NlLnJzcmMiKQorICAgIFBJQ1Ricm93c2UoKQogCiBjbGFzcyBQSUNUYnJvd3NlKEZyYW1lV29yay5BcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQkjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KLQkJRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCSMgTmV4dCBjcmVhdGUgb3VyIGRpYWxvZwotCQlzZWxmLm1haW5fZGlhbG9nID0gTXlEaWFsb2coc2VsZikKLQkJIyBOb3cgb3BlbiB0aGUgZGlhbG9nCi0JCWNvbnRlbnRzID0gc2VsZi5maW5kUElDVHJlc291cmNlcygpCi0JCXNlbGYubWFpbl9kaWFsb2cub3BlbihJRF9NQUlOLCBjb250ZW50cykKLQkJIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCi0JCXNlbGYubWFpbmxvb3AoKQotCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLnF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0JCi0JZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JZGVmIHNob3dQSUNUKHNlbGYsIHJlc2lkKToKLQkJdyA9IFBJQ1R3aW5kb3coc2VsZikKLQkJdy5vcGVuKHJlc2lkKQotCQkjRWFzeURpYWxvZ3MuTWVzc2FnZSgnU2hvdyBQSUNUICVyJyAlIChyZXNpZCwpKQotCQkKLQlkZWYgZmluZFBJQ1RyZXNvdXJjZXMoc2VsZik6Ci0JCW51bSA9IFJlcy5Db3VudFJlc291cmNlcygnUElDVCcpCi0JCXJ2ID0gW10KLQkJZm9yIGkgaW4gcmFuZ2UoMSwgbnVtKzEpOgotCQkJUmVzLlNldFJlc0xvYWQoMCkKLQkJCXRyeToKLQkJCQlyID0gUmVzLkdldEluZFJlc291cmNlKCdQSUNUJywgaSkKLQkJCWZpbmFsbHk6Ci0JCQkJUmVzLlNldFJlc0xvYWQoMSkKLQkJCWlkLCB0eXBlLCBuYW1lID0gci5HZXRSZXNJbmZvKCkKLQkJCXJ2LmFwcGVuZCgoaWQsIG5hbWUpKQotCQlyZXR1cm4gcnYKLQkJCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICAjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KKyAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgICMgTmV4dCBjcmVhdGUgb3VyIGRpYWxvZworICAgICAgICBzZWxmLm1haW5fZGlhbG9nID0gTXlEaWFsb2coc2VsZikKKyAgICAgICAgIyBOb3cgb3BlbiB0aGUgZGlhbG9nCisgICAgICAgIGNvbnRlbnRzID0gc2VsZi5maW5kUElDVHJlc291cmNlcygpCisgICAgICAgIHNlbGYubWFpbl9kaWFsb2cub3BlbihJRF9NQUlOLCBjb250ZW50cykKKyAgICAgICAgIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCisgICAgICAgIHNlbGYubWFpbmxvb3AoKQorCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgc2hvd1BJQ1Qoc2VsZiwgcmVzaWQpOgorICAgICAgICB3ID0gUElDVHdpbmRvdyhzZWxmKQorICAgICAgICB3Lm9wZW4ocmVzaWQpCisgICAgICAgICNFYXN5RGlhbG9ncy5NZXNzYWdlKCdTaG93IFBJQ1QgJXInICUgKHJlc2lkLCkpCisKKyAgICBkZWYgZmluZFBJQ1RyZXNvdXJjZXMoc2VsZik6CisgICAgICAgIG51bSA9IFJlcy5Db3VudFJlc291cmNlcygnUElDVCcpCisgICAgICAgIHJ2ID0gW10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbnVtKzEpOgorICAgICAgICAgICAgUmVzLlNldFJlc0xvYWQoMCkKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICByID0gUmVzLkdldEluZFJlc291cmNlKCdQSUNUJywgaSkKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgUmVzLlNldFJlc0xvYWQoMSkKKyAgICAgICAgICAgIGlkLCB0eXBlLCBuYW1lID0gci5HZXRSZXNJbmZvKCkKKyAgICAgICAgICAgIHJ2LmFwcGVuZCgoaWQsIG5hbWUpKQorICAgICAgICByZXR1cm4gcnYKKwogY2xhc3MgUElDVHdpbmRvdyhGcmFtZVdvcmsuV2luZG93KToKLQlkZWYgb3BlbihzZWxmLCAocmVzaWQsIHJlc25hbWUpKToKLQkJaWYgbm90IHJlc25hbWU6Ci0JCQlyZXNuYW1lID0gJyMlcicgJSAocmVzaWQsKQotCQlzZWxmLnJlc2lkID0gcmVzaWQKLQkJcGljdHVyZSA9IFFkLkdldFBpY3R1cmUoc2VsZi5yZXNpZCkKLQkJIyBHZXQgcmVjdCBmb3IgcGljdHVyZQotCQlwcmludCByZXByKHBpY3R1cmUuZGF0YVs6MTZdKQotCQlzeiwgdCwgbCwgYiwgciA9IHN0cnVjdC51bnBhY2soJ2hoaGhoJywgcGljdHVyZS5kYXRhWzoxMF0pCi0JCXByaW50ICdwaWN0OicsIHQsIGwsIGIsIHIKLQkJd2lkdGggPSByLWwKLQkJaGVpZ2h0ID0gYi10Ci0JCWlmIHdpZHRoIDwgNjQ6IHdpZHRoID0gNjQKLQkJZWxpZiB3aWR0aCA+IDQ4MDogd2lkdGggPSA0ODAKLQkJaWYgaGVpZ2h0IDwgNjQ6IGhlaWdodCA9IDY0Ci0JCWVsaWYgaGVpZ2h0ID4gMzIwOiBoZWlnaHQgPSAzMjAKLQkJYm91bmRzID0gKExFRlQsIFRPUCwgTEVGVCt3aWR0aCwgVE9QK2hlaWdodCkKLQkJcHJpbnQgJ2JvdW5kczonLCBib3VuZHMKLQkJCi0JCXNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQotCQlzZWxmLndpZC5TZXRXaW5kb3dQaWMocGljdHVyZSkKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCQorICAgIGRlZiBvcGVuKHNlbGYsIChyZXNpZCwgcmVzbmFtZSkpOgorICAgICAgICBpZiBub3QgcmVzbmFtZToKKyAgICAgICAgICAgIHJlc25hbWUgPSAnIyVyJyAlIChyZXNpZCwpCisgICAgICAgIHNlbGYucmVzaWQgPSByZXNpZAorICAgICAgICBwaWN0dXJlID0gUWQuR2V0UGljdHVyZShzZWxmLnJlc2lkKQorICAgICAgICAjIEdldCByZWN0IGZvciBwaWN0dXJlCisgICAgICAgIHByaW50IHJlcHIocGljdHVyZS5kYXRhWzoxNl0pCisgICAgICAgIHN6LCB0LCBsLCBiLCByID0gc3RydWN0LnVucGFjaygnaGhoaGgnLCBwaWN0dXJlLmRhdGFbOjEwXSkKKyAgICAgICAgcHJpbnQgJ3BpY3Q6JywgdCwgbCwgYiwgcgorICAgICAgICB3aWR0aCA9IHItbAorICAgICAgICBoZWlnaHQgPSBiLXQKKyAgICAgICAgaWYgd2lkdGggPCA2NDogd2lkdGggPSA2NAorICAgICAgICBlbGlmIHdpZHRoID4gNDgwOiB3aWR0aCA9IDQ4MAorICAgICAgICBpZiBoZWlnaHQgPCA2NDogaGVpZ2h0ID0gNjQKKyAgICAgICAgZWxpZiBoZWlnaHQgPiAzMjA6IGhlaWdodCA9IDMyMAorICAgICAgICBib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQorICAgICAgICBwcmludCAnYm91bmRzOicsIGJvdW5kcworCisgICAgICAgIHNlbGYud2lkID0gV2luLk5ld1dpbmRvdyhib3VuZHMsIHJlc25hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLndpZC5TZXRXaW5kb3dQaWMocGljdHVyZSkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKIGNsYXNzIE15RGlhbG9nKEZyYW1lV29yay5EaWFsb2dXaW5kb3cpOgotCSJNYWluIGRpYWxvZyB3aW5kb3cgZm9yIFBJQ1Ricm93c2UiCisgICAgIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgUElDVGJyb3dzZSIKIAotCWRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6Ci0JCXNlbGYuaWQgPSBpZAotCQlGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKLQkJc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQotCQl0cCwgaCwgcmVjdCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW0oTUFJTl9MSVNUKQotCQlyZWN0MiA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE3LCByZWN0WzNdLTE3CSMgU2Nyb2xsIGJhciBzcGFjZQotCQlzZWxmLmxpc3QgPSBMaXN0LkxOZXcocmVjdDIsICgwLCAwLCAxLCBsZW4oY29udGVudHMpKSwgKDAsMCksIDAsIHNlbGYud2lkLAotCQkJCTAsIDEsIDEsIDEpCi0JCXNlbGYuY29udGVudHMgPSBjb250ZW50cwotCQlzZWxmLnNldGxpc3QoKQorICAgIGRlZiBvcGVuKHNlbGYsIGlkLCBjb250ZW50cyk6CisgICAgICAgIHNlbGYuaWQgPSBpZAorICAgICAgICBGcmFtZVdvcmsuRGlhbG9nV2luZG93Lm9wZW4oc2VsZiwgSURfTUFJTikKKyAgICAgICAgc2VsZi5kbGcuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oTUFJTl9TSE9XKQorICAgICAgICB0cCwgaCwgcmVjdCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW0oTUFJTl9MSVNUKQorICAgICAgICByZWN0MiA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE3LCByZWN0WzNdLTE3ICAgICMgU2Nyb2xsIGJhciBzcGFjZQorICAgICAgICBzZWxmLmxpc3QgPSBMaXN0LkxOZXcocmVjdDIsICgwLCAwLCAxLCBsZW4oY29udGVudHMpKSwgKDAsMCksIDAsIHNlbGYud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMSwgMSkKKyAgICAgICAgc2VsZi5jb250ZW50cyA9IGNvbnRlbnRzCisgICAgICAgIHNlbGYuc2V0bGlzdCgpCiAKLQlkZWYgc2V0bGlzdChzZWxmKToKLQkJc2VsZi5saXN0LkxEZWxSb3coMCwgMCkKLQkJc2VsZi5saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlpZiBzZWxmLmNvbnRlbnRzOgotCQkJc2VsZi5saXN0LkxBZGRSb3cobGVuKHNlbGYuY29udGVudHMpLCAwKQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuY29udGVudHMpKToKLQkJCQl2ID0gcmVwcihzZWxmLmNvbnRlbnRzW2ldWzBdKQotCQkJCWlmIHNlbGYuY29udGVudHNbaV1bMV06Ci0JCQkJCXYgPSB2ICsgJyInICsgc2VsZi5jb250ZW50c1tpXVsxXSArICciJwotCQkJCXNlbGYubGlzdC5MU2V0Q2VsbCh2LCAoMCwgaSkpCi0JCXNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJCi0JZGVmIGRvX2xpc3RoaXQoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQl3aGVyZSA9IFFkLkdsb2JhbFRvTG9jYWwod2hlcmUpCi0JCXByaW50ICdMSVNUSElUJywgd2hlcmUKLQkJaWYgc2VsZi5saXN0LkxDbGljayh3aGVyZSwgbW9kaWZpZXJzKToKLQkJCXNlbGYuZG9fc2hvdygpCi0JCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCi0JCQlpZiBub3Qgb2s6Ci0JCQkJYnJlYWsKLQkJCWl0ZW1zLmFwcGVuZChwb2ludFsxXSkKLQkJCXBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKLQkJdmFsdWVzID0gW10KLQkJZm9yIGkgaW4gaXRlbXM6Ci0JCQl2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCi0JCXJldHVybiB2YWx1ZXMKLQkJCi0JZGVmIGRvX3Nob3coc2VsZiwgKmFyZ3MpOgotCQlzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWZvciByZXNpZCBpbiBzZWxlY3Rpb246Ci0JCQlzZWxmLnBhcmVudC5zaG93UElDVChyZXNpZCkKLQkJCi0JZGVmIGRvX3Jhd3VwZGF0ZShzZWxmLCB3aW5kb3csIGV2ZW50KToKLQkJdHAsIGgsIHJlY3QgPSBzZWxmLmRsZy5HZXREaWFsb2dJdGVtKE1BSU5fTElTVCkKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJUWQuRnJhbWVSZWN0KHJlY3QpCi0JCXNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBhY3RpdmF0ZSwgZXZlbnQpOgotCQlzZWxmLmxpc3QuTEFjdGl2YXRlKGFjdGl2YXRlKQotCQkKLQlkZWYgZG9fY2xvc2Uoc2VsZik6Ci0JCXNlbGYuY2xvc2UoKQotCQkKLQlkZWYgZG9faXRlbWhpdChzZWxmLCBpdGVtLCBldmVudCk6Ci0JCWlmIGl0ZW0gPT0gTUFJTl9MSVNUOgotCQkJc2VsZi5kb19saXN0aGl0KGV2ZW50KQotCQlpZiBpdGVtID09IE1BSU5fU0hPVzoKLQkJCXNlbGYuZG9fc2hvdygpCisgICAgZGVmIHNldGxpc3Qoc2VsZik6CisgICAgICAgIHNlbGYubGlzdC5MRGVsUm93KDAsIDApCisgICAgICAgIHNlbGYubGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKKyAgICAgICAgaWYgc2VsZi5jb250ZW50czoKKyAgICAgICAgICAgIHNlbGYubGlzdC5MQWRkUm93KGxlbihzZWxmLmNvbnRlbnRzKSwgMCkKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmNvbnRlbnRzKSk6CisgICAgICAgICAgICAgICAgdiA9IHJlcHIoc2VsZi5jb250ZW50c1tpXVswXSkKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmNvbnRlbnRzW2ldWzFdOgorICAgICAgICAgICAgICAgICAgICB2ID0gdiArICciJyArIHNlbGYuY29udGVudHNbaV1bMV0gKyAnIicKKyAgICAgICAgICAgICAgICBzZWxmLmxpc3QuTFNldENlbGwodiwgKDAsIGkpKQorICAgICAgICBzZWxmLmxpc3QuTFNldERyYXdpbmdNb2RlKDEpCisgICAgICAgIHNlbGYubGlzdC5MVXBkYXRlKHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisKKyAgICBkZWYgZG9fbGlzdGhpdChzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIFFkLlNldFBvcnQoc2VsZi53aWQpCisgICAgICAgIHdoZXJlID0gUWQuR2xvYmFsVG9Mb2NhbCh3aGVyZSkKKyAgICAgICAgcHJpbnQgJ0xJU1RISVQnLCB3aGVyZQorICAgICAgICBpZiBzZWxmLmxpc3QuTENsaWNrKHdoZXJlLCBtb2RpZmllcnMpOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKKworICAgIGRlZiBnZXRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgcG9pbnQgPSAoMCwwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgb2ssIHBvaW50ID0gc2VsZi5saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChwb2ludFsxXSkKKyAgICAgICAgICAgIHBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKKyAgICAgICAgdmFsdWVzID0gW10KKyAgICAgICAgZm9yIGkgaW4gaXRlbXM6CisgICAgICAgICAgICB2YWx1ZXMuYXBwZW5kKHNlbGYuY29udGVudHNbaV0pCisgICAgICAgIHJldHVybiB2YWx1ZXMKKworICAgIGRlZiBkb19zaG93KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBmb3IgcmVzaWQgaW4gc2VsZWN0aW9uOgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuc2hvd1BJQ1QocmVzaWQpCisKKyAgICBkZWYgZG9fcmF3dXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB0cCwgaCwgcmVjdCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW0oTUFJTl9MSVNUKQorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBRZC5GcmFtZVJlY3QocmVjdCkKKyAgICAgICAgc2VsZi5saXN0LkxVcGRhdGUoc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKworICAgIGRlZiBkb19hY3RpdmF0ZShzZWxmLCBhY3RpdmF0ZSwgZXZlbnQpOgorICAgICAgICBzZWxmLmxpc3QuTEFjdGl2YXRlKGFjdGl2YXRlKQorCisgICAgZGVmIGRvX2Nsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKKyAgICAgICAgaWYgaXRlbSA9PSBNQUlOX0xJU1Q6CisgICAgICAgICAgICBzZWxmLmRvX2xpc3RoaXQoZXZlbnQpCisgICAgICAgIGlmIGl0ZW0gPT0gTUFJTl9TSE9XOgorICAgICAgICAgICAgc2VsZi5kb19zaG93KCkKIAogbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvU3BlY2lhbF9FdmVudHMucHkgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvU3BlY2lhbF9FdmVudHMucHkKaW5kZXggYTk4ZWI4YS4uYTJiMDkxMCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1NwZWNpYWxfRXZlbnRzLnB5CisrKyBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TcGVjaWFsX0V2ZW50cy5weQpAQCAtMTIsMzg1ICsxMiwzODUgQEAKIAogY2xhc3MgU3BlY2lhbF9FdmVudHNfRXZlbnRzOgogCi0JX2FyZ21hcF9tb3VudCA9IHsKLQkJJ2FjY2Vzc19tb2RlJyA6ICdBY3NzJywKLQkJJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiAnVkNoaycsCi0JCSdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKLQkJJ1JBTV9jYWNoaW5nJyA6ICdDYWNoJywKLQl9CisgICAgX2FyZ21hcF9tb3VudCA9IHsKKyAgICAgICAgICAgICdhY2Nlc3NfbW9kZScgOiAnQWNzcycsCisgICAgICAgICAgICAnY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKKyAgICAgICAgICAgICdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKKyAgICAgICAgICAgICdSQU1fY2FjaGluZycgOiAnQ2FjaCcsCisgICAgfQogCi0JZGVmIG1vdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJtb3VudDogTW91bnRzIGFuIERpc2sgQ29weSBpbWFnZSBhcyBhIGRpc2sgdm9sdW1lCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiBhIHJlZmVyZW5jZSB0byB0aGUgZGlzayBpbWFnZSB0byBiZSBtb3VudGVkCi0JCUtleXdvcmQgYXJndW1lbnQgYWNjZXNzX21vZGU6IHRoZSBhY2Nlc3MgbW9kZSBmb3IgbW91bnRlZCB2b2x1bWUgKGRlZmF1bHQgaXMgImFueSIsIGkuZS4gYmVzdCBwb3NzaWJsZSkKLQkJS2V5d29yZCBhcmd1bWVudCBjaGVja3N1bV92ZXJpZmljYXRpb246IFZlcmlmeSB0aGUgY2hlY2tzdW0gYmVmb3JlIG1vdW50aW5nPwotCQlLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFZlcmlmeSB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBiZWZvcmUgbW91bnRpbmc/Ci0JCUtleXdvcmQgYXJndW1lbnQgUkFNX2NhY2hpbmc6IENhY2hlIHRoZSBkaXNrIGltYWdlIGluIFJBTT8gKGlmIG9taXR0ZWQsIGRvbid0IGNhY2hlKQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIG1vdW50ZWQgZGlzawotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnTW91bicKKyAgICBkZWYgbW91bnQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiIm1vdW50OiBNb3VudHMgYW4gRGlzayBDb3B5IGltYWdlIGFzIGEgZGlzayB2b2x1bWUKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IGEgcmVmZXJlbmNlIHRvIHRoZSBkaXNrIGltYWdlIHRvIGJlIG1vdW50ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBhY2Nlc3NfbW9kZTogdGhlIGFjY2VzcyBtb2RlIGZvciBtb3VudGVkIHZvbHVtZSAoZGVmYXVsdCBpcyAiYW55IiwgaS5lLiBiZXN0IHBvc3NpYmxlKQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogVmVyaWZ5IHRoZSBjaGVja3N1bSBiZWZvcmUgbW91bnRpbmc/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogVmVyaWZ5IHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGJlZm9yZSBtb3VudGluZz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBSQU1fY2FjaGluZzogQ2FjaGUgdGhlIGRpc2sgaW1hZ2UgaW4gUkFNPyAoaWYgb21pdHRlZCwgZG9uJ3QgY2FjaGUpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWZlcmVuY2UgdG8gbW91bnRlZCBkaXNrCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdNb3VuJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX21vdW50KQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX21vdW50KQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0Fjc3MnLCBfRW51bV9BY3NzKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ0NhY2gnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQWNzcycsIF9FbnVtX0Fjc3MpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWQ2hrJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZTaWcnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQ2FjaCcsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfZXhlY3V0ZV9EaXNrU2NyaXB0ID0gewotCQknY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKLQkJJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAotCX0KKyAgICBfYXJnbWFwX2V4ZWN1dGVfRGlza1NjcmlwdCA9IHsKKyAgICAgICAgICAgICdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogJ1ZDaGsnLAorICAgICAgICAgICAgJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAorICAgIH0KIAotCWRlZiBleGVjdXRlX0Rpc2tTY3JpcHQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImV4ZWN1dGUgRGlza1NjcmlwdDogRXhlY3V0ZXMgYSBEaXNrIENvcHktc3BlY2lmaWMgRGlza1NjcmlwdAotCQlSZXF1aXJlZCBhcmd1bWVudDogYSByZWZlcmVuY2UgdG8gdGhlIERpc2tTY3JpcHQgdG8gZXhlY3V0ZQotCQlLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIGNoZWNrc3VtcyBiZSB2ZXJpZmllZCB3aGVuIG1vdW50aW5nIGltYWdlcyByZWZlcmVuY2VkIGluIHRoZSBEaXNrU2NyaXB0PwotCQlLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBvZiB0aGUgRGlza1NjcmlwdCBhbmQgdGhlIGltYWdlcyBpdCByZWZlcmVuY2VzIGJlIHZlcmlmaWVkPwotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdYRVFkJworICAgIGRlZiBleGVjdXRlX0Rpc2tTY3JpcHQoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImV4ZWN1dGUgRGlza1NjcmlwdDogRXhlY3V0ZXMgYSBEaXNrIENvcHktc3BlY2lmaWMgRGlza1NjcmlwdAorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYSByZWZlcmVuY2UgdG8gdGhlIERpc2tTY3JpcHQgdG8gZXhlY3V0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIGNoZWNrc3VtcyBiZSB2ZXJpZmllZCB3aGVuIG1vdW50aW5nIGltYWdlcyByZWZlcmVuY2VkIGluIHRoZSBEaXNrU2NyaXB0PworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBvZiB0aGUgRGlza1NjcmlwdCBhbmQgdGhlIGltYWdlcyBpdCByZWZlcmVuY2VzIGJlIHZlcmlmaWVkPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdYRVFkJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2V4ZWN1dGVfRGlza1NjcmlwdCkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9leGVjdXRlX0Rpc2tTY3JpcHQpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZDaGsnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCWRlZiB1bm1vdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJ1bm1vdW50OiBVbm1vdW50IGFuZCBlamVjdCAoaWYgbmVjZXNzYXJ5KSBhIHZvbHVtZQotCQlSZXF1aXJlZCBhcmd1bWVudDogYSByZWZlcmVuY2UgdG8gZGlzayB0byBiZSB1bm1vdW50ZWQgKGFuZCBlamVjdGVkKQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdVbW50JworICAgIGRlZiB1bm1vdW50KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJ1bm1vdW50OiBVbm1vdW50IGFuZCBlamVjdCAoaWYgbmVjZXNzYXJ5KSBhIHZvbHVtZQorICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogYSByZWZlcmVuY2UgdG8gZGlzayB0byBiZSB1bm1vdW50ZWQgKGFuZCBlamVjdGVkKQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdVbW50JwogCi0JCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfY3JlYXRlID0gewotCQknc2F2aW5nX2FzJyA6ICdTdkFzJywKLQkJJ2xvZ2ljYWxfYmxvY2tzJyA6ICdCbGtzJywKLQkJJ3plcm9pbmcnIDogJ1plcm8nLAotCQknbGVhdmVfaW1hZ2VfbW91bnRlZCcgOiAnTW91bicsCi0JCSdmaWxlc3lzdGVtJyA6ICdGc3lzJywKLQl9CisgICAgX2FyZ21hcF9jcmVhdGUgPSB7CisgICAgICAgICAgICAnc2F2aW5nX2FzJyA6ICdTdkFzJywKKyAgICAgICAgICAgICdsb2dpY2FsX2Jsb2NrcycgOiAnQmxrcycsCisgICAgICAgICAgICAnemVyb2luZycgOiAnWmVybycsCisgICAgICAgICAgICAnbGVhdmVfaW1hZ2VfbW91bnRlZCcgOiAnTW91bicsCisgICAgICAgICAgICAnZmlsZXN5c3RlbScgOiAnRnN5cycsCisgICAgfQogCi0JZGVmIGNyZWF0ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIiY3JlYXRlOiBDcmVhdGUgYSBuZXcgRGlzayBDb3B5IGRvY3VtZW50Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgbmFtZSBvZiB0aGUgdm9sdW1lIHRvIGNyZWF0ZQotCQlLZXl3b3JkIGFyZ3VtZW50IHNhdmluZ19hczogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgY3JlYXRlZAotCQlLZXl3b3JkIGFyZ3VtZW50IGxvZ2ljYWxfYmxvY2tzOiB0aGUgbnVtYmVyIG9mIGxvZ2ljYWwgYmxvY2tzCi0JCUtleXdvcmQgYXJndW1lbnQgemVyb2luZzogU2hvdWxkIGFsbCBibG9ja3Mgb24gdGhlIGRpc2sgYmUgc2V0IHRvIHplcm8/Ci0JCUtleXdvcmQgYXJndW1lbnQgbGVhdmVfaW1hZ2VfbW91bnRlZDogU2hvdWxkIHRoZSBpbWFnZSBiZSBtb3VudGVkIGFmdGVyIGl0IGlzIGNyZWF0ZWQ/Ci0JCUtleXdvcmQgYXJndW1lbnQgZmlsZXN5c3RlbTogZmlsZSBzeXN0ZW0gdG8gdXNlIChNYWMgT1MgU3RhbmRhcmQvY29tcGF0aWJsZSwgTWFjIE9TIEVuaGFuY2VkKQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIG5ld2x5IGNyZWF0ZWQgZGlzayBpbWFnZSAob3IgbmV3bHkgbW91bnRlZCBkaXNrKQotCQkiIiIKLQkJX2NvZGUgPSAnZGRzaycKLQkJX3N1YmNvZGUgPSAnQ3JlYScKKyAgICBkZWYgY3JlYXRlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjcmVhdGU6IENyZWF0ZSBhIG5ldyBEaXNrIENvcHkgZG9jdW1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBuYW1lIG9mIHRoZSB2b2x1bWUgdG8gY3JlYXRlCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2F2aW5nX2FzOiB0aGUgZGlzayBpbWFnZSB0byBiZSBjcmVhdGVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbG9naWNhbF9ibG9ja3M6IHRoZSBudW1iZXIgb2YgbG9naWNhbCBibG9ja3MKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB6ZXJvaW5nOiBTaG91bGQgYWxsIGJsb2NrcyBvbiB0aGUgZGlzayBiZSBzZXQgdG8gemVybz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBsZWF2ZV9pbWFnZV9tb3VudGVkOiBTaG91bGQgdGhlIGltYWdlIGJlIG1vdW50ZWQgYWZ0ZXIgaXQgaXMgY3JlYXRlZD8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBmaWxlc3lzdGVtOiBmaWxlIHN5c3RlbSB0byB1c2UgKE1hYyBPUyBTdGFuZGFyZC9jb21wYXRpYmxlLCBNYWMgT1MgRW5oYW5jZWQpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWZlcmVuY2UgdG8gbmV3bHkgY3JlYXRlZCBkaXNrIGltYWdlIChvciBuZXdseSBtb3VudGVkIGRpc2spCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdDcmVhJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NyZWF0ZSkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jcmVhdGUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU3ZBcycsIF9FbnVtX2Zzc18pCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdCbGtzJywgX0VudW1fbG9uZykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1plcm8nLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnTW91bicsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdGc3lzJywgX0VudW1fRnN5cykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1N2QXMnLCBfRW51bV9mc3NfKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQmxrcycsIF9FbnVtX2xvbmcpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdaZXJvJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ01vdW4nLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnRnN5cycsIF9FbnVtX0ZzeXMpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCWRlZiB2ZXJpZnlfY2hlY2tzdW0oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInZlcmlmeSBjaGVja3N1bTogVmVyaWZ5IHRoZSBjaGVja3N1bSBvZiBhIERpc2sgQ29weSA0LjIgb3IgYSBEaXNrIENvcHkgNi4wIHJlYWQtb25seSBkb2N1bWVudAotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgdmVyaWZpZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiB0aGUgcmVzdWx0IG9mIHRoZSBjaGVja3N1bSB2ZXJpZmljYXRpb24KLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ1ZjcmMnCisgICAgZGVmIHZlcmlmeV9jaGVja3N1bShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIidmVyaWZ5IGNoZWNrc3VtOiBWZXJpZnkgdGhlIGNoZWNrc3VtIG9mIGEgRGlzayBDb3B5IDQuMiBvciBhIERpc2sgQ29weSA2LjAgcmVhZC1vbmx5IGRvY3VtZW50CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSB2ZXJpZmllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IHRoZSByZXN1bHQgb2YgdGhlIGNoZWNrc3VtIHZlcmlmaWNhdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZGRzaycKKyAgICAgICAgX3N1YmNvZGUgPSAnVmNyYycKIAotCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJwotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlkZWYgdmVyaWZ5X3NpZ25hdHVyZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIidmVyaWZ5IHNpZ25hdHVyZTogVmVyaWZ5IHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIGZvciBhIERpc2sgQ29weSBkb2N1bWVudAotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgdmVyaWZpZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBJcyB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSB2YWxpZD8KLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ1ZzaWcnCisgICAgZGVmIHZlcmlmeV9zaWduYXR1cmUoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInZlcmlmeSBzaWduYXR1cmU6IFZlcmlmeSB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBmb3IgYSBEaXNrIENvcHkgZG9jdW1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIGJlIHZlcmlmaWVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogSXMgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgdmFsaWQ/CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdWc2lnJwogCi0JCWlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgaWYgX2FyZ3VtZW50czogcmFpc2UgVHlwZUVycm9yLCAnTm8gb3B0aW9uYWwgYXJncyBleHBlY3RlZCcKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfc2lnbl9pbWFnZSA9IHsKLQkJJ3VzaW5nX3NpZ25lcicgOiAnU2lucicsCi0JfQorICAgIF9hcmdtYXBfc2lnbl9pbWFnZSA9IHsKKyAgICAgICAgICAgICd1c2luZ19zaWduZXInIDogJ1NpbnInLAorICAgIH0KIAotCWRlZiBzaWduX2ltYWdlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJzaWduIGltYWdlOiBBZGQgYSBEaWdpU2lnbo4gc2lnbmF0dXJlIHRvIGEgRGlzayBDb3B5IGRvY3VtZW50Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSBzaWduZWQKLQkJS2V5d29yZCBhcmd1bWVudCB1c2luZ19zaWduZXI6IGEgcmVmZXJlbmNlIHRvIHNpZ25lciBmaWxlIHRvIHVzZQotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdBc2lnJworICAgIGRlZiBzaWduX2ltYWdlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzaWduIGltYWdlOiBBZGQgYSBEaWdpU2lnbo4gc2lnbmF0dXJlIHRvIGEgRGlzayBDb3B5IGRvY3VtZW50CisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSBzaWduZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB1c2luZ19zaWduZXI6IGEgcmVmZXJlbmNlIHRvIHNpZ25lciBmaWxlIHRvIHVzZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdkZHNrJworICAgICAgICBfc3ViY29kZSA9ICdBc2lnJwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NpZ25faW1hZ2UpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2lnbl9pbWFnZSkKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTaW5yJywgX0VudW1fYWxpcykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NpbnInLCBfRW51bV9hbGlzKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX2NyZWF0ZV9hX2Zsb3BweV9mcm9tID0gewotCQknc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicgOiAnVlNpZycsCi0JCSdlcmFzZV9jb25maXJtYXRpb24nIDogJ0Nmcm0nLAotCQknbWFrZV9tdWx0aXBsZV9mbG9wcGllcycgOiAnTXVsdCcsCi0JfQorICAgIF9hcmdtYXBfY3JlYXRlX2FfZmxvcHB5X2Zyb20gPSB7CisgICAgICAgICAgICAnc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbicgOiAnVlNpZycsCisgICAgICAgICAgICAnZXJhc2VfY29uZmlybWF0aW9uJyA6ICdDZnJtJywKKyAgICAgICAgICAgICdtYWtlX211bHRpcGxlX2Zsb3BwaWVzJyA6ICdNdWx0JywKKyAgICB9CiAKLQlkZWYgY3JlYXRlX2FfZmxvcHB5X2Zyb20oc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImNyZWF0ZSBhIGZsb3BweSBmcm9tOiBjcmVhdGUgYSBmbG9wcHkgZGlzayBmcm9tIGEgRGlzayBDb3B5IGRvY3VtZW50Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBtYWtlIGEgZmxvcHB5IGZyb20KLQkJS2V5d29yZCBhcmd1bWVudCBzaWduYXR1cmVfdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgYmUgdmVyaWZpZWQgYmVmb3JlIGNyZWF0aW5nIGEgZmxvcHB5IGRpc2s/Ci0JCUtleXdvcmQgYXJndW1lbnQgZXJhc2VfY29uZmlybWF0aW9uOiBTaG91bGQgdGhlIHVzZXIgYmUgYXNrZWQgdG8gY29uZmlybSB0aGUgZXJhc3VyZSBvZiB0aGUgcHJldmlvdXMgY29udGVudHMgb2YgZmxvcHB5IGRpc2tzPwotCQlLZXl3b3JkIGFyZ3VtZW50IG1ha2VfbXVsdGlwbGVfZmxvcHBpZXM6IFNob3VsZCB0aGUgdXNlciBiZSBwcm9tcHRlZCB0byBjcmVhdGUgbXVsdGlwbGUgZmxvcHB5IGRpc2tzPwotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCSIiIgotCQlfY29kZSA9ICdkZHNrJwotCQlfc3ViY29kZSA9ICdCZnB5JworICAgIGRlZiBjcmVhdGVfYV9mbG9wcHlfZnJvbShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIiY3JlYXRlIGEgZmxvcHB5IGZyb206IGNyZWF0ZSBhIGZsb3BweSBkaXNrIGZyb20gYSBEaXNrIENvcHkgZG9jdW1lbnQKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBkaXNrIGltYWdlIHRvIG1ha2UgYSBmbG9wcHkgZnJvbQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBiZSB2ZXJpZmllZCBiZWZvcmUgY3JlYXRpbmcgYSBmbG9wcHkgZGlzaz8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBlcmFzZV9jb25maXJtYXRpb246IFNob3VsZCB0aGUgdXNlciBiZSBhc2tlZCB0byBjb25maXJtIHRoZSBlcmFzdXJlIG9mIHRoZSBwcmV2aW91cyBjb250ZW50cyBvZiBmbG9wcHkgZGlza3M/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbWFrZV9tdWx0aXBsZV9mbG9wcGllczogU2hvdWxkIHRoZSB1c2VyIGJlIHByb21wdGVkIHRvIGNyZWF0ZSBtdWx0aXBsZSBmbG9wcHkgZGlza3M/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ0JmcHknCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY3JlYXRlX2FfZmxvcHB5X2Zyb20pCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY3JlYXRlX2FfZmxvcHB5X2Zyb20pCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDZnJtJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ011bHQnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDZnJtJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ011bHQnLCBfRW51bV9ib29sKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlfYXJnbWFwX2NoZWNrX2ltYWdlID0gewotCQknZGV0YWlscycgOiAnQ2hEZScsCi0JfQorICAgIF9hcmdtYXBfY2hlY2tfaW1hZ2UgPSB7CisgICAgICAgICAgICAnZGV0YWlscycgOiAnQ2hEZScsCisgICAgfQogCi0JZGVmIGNoZWNrX2ltYWdlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJjaGVjayBpbWFnZTogQ2hlY2sgdGhlIGRpc2sgaW1hZ2XVcyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yIGFueSBpbmNvbnNpc3RlbmNpZXMuICBXb3JrcyBvbiBORElGLCBEaXNrIENvcHkgNC4yLCBEQVJUjiwgb3IgRGlza1NldCBpbWFnZXMuCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSB2ZXJpZmllZAotCQlLZXl3b3JkIGFyZ3VtZW50IGRldGFpbHM6IFNob3VsZCB0aGUgZGlzayBpbWFnZSBkZXRhaWxzIGJlIGRpc3BsYXllZD8KLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlY29yZCBjb250YWluaW5nIGEgYm9vbGVhbiAodHJ1ZS9mYWxzZSkgdmFsdWUgaWYgdGhlIGltYWdlIHBhc3NlcyBjb25zaXN0ZW5jeSB0ZXN0cywgYW5kIHRoZSBudW1iZXJzIG9mIHdhcm5pbmdzIGFuZCBlcnJvcnMKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ0NoZWsnCisgICAgZGVmIGNoZWNrX2ltYWdlKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJjaGVjayBpbWFnZTogQ2hlY2sgdGhlIGRpc2sgaW1hZ2XVcyBpbnRlcm5hbCBkYXRhIHN0cnVjdHVyZXMgZm9yIGFueSBpbmNvbnNpc3RlbmNpZXMuICBXb3JrcyBvbiBORElGLCBEaXNrIENvcHkgNC4yLCBEQVJUjiwgb3IgRGlza1NldCBpbWFnZXMuCisgICAgICAgIFJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgZGlzayBpbWFnZSB0byBiZSB2ZXJpZmllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGRldGFpbHM6IFNob3VsZCB0aGUgZGlzayBpbWFnZSBkZXRhaWxzIGJlIGRpc3BsYXllZD8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlY29yZCBjb250YWluaW5nIGEgYm9vbGVhbiAodHJ1ZS9mYWxzZSkgdmFsdWUgaWYgdGhlIGltYWdlIHBhc3NlcyBjb25zaXN0ZW5jeSB0ZXN0cywgYW5kIHRoZSBudW1iZXJzIG9mIHdhcm5pbmdzIGFuZCBlcnJvcnMKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ0NoZWsnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2hlY2tfaW1hZ2UpCi0JCV9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfY2hlY2tfaW1hZ2UpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnQ2hEZScsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdDaERlJywgX0VudW1fYm9vbCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWdtZW50X2ltYWdlID0gewotCQknc2VnbWVudF9jb3VudCcgOiAnU0dDVCcsCi0JCSdzZWdtZW50X3NpemUnIDogJ1NHU1onLAotCQknc2VnbWVudF9uYW1lJyA6ICdTR05NJywKLQkJJ2ltYWdlX0lEJyA6ICdTR0lEJywKLQl9CisgICAgX2FyZ21hcF9zZWdtZW50X2ltYWdlID0geworICAgICAgICAgICAgJ3NlZ21lbnRfY291bnQnIDogJ1NHQ1QnLAorICAgICAgICAgICAgJ3NlZ21lbnRfc2l6ZScgOiAnU0dTWicsCisgICAgICAgICAgICAnc2VnbWVudF9uYW1lJyA6ICdTR05NJywKKyAgICAgICAgICAgICdpbWFnZV9JRCcgOiAnU0dJRCcsCisgICAgfQogCi0JZGVmIHNlZ21lbnRfaW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlZ21lbnQgaW1hZ2U6IFNlZ21lbnQgYSBORElGIFIvVyBvciBSL08gaW1hZ2UgaW50byBzbWFsbGVyIHBpZWNlcwotCQlSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgc2VnbWVudGVkCi0JCUtleXdvcmQgYXJndW1lbnQgc2VnbWVudF9jb3VudDogdGhlIG51bWJlciBvZiBpbWFnZSBzZWdtZW50cyB0byBjcmVhdGUKLQkJS2V5d29yZCBhcmd1bWVudCBzZWdtZW50X3NpemU6IHRoZSBzaXplIG9mIGltYWdlIHNlZ21lbnRzIChpbiBibG9ja3MpIHRvIGNyZWF0ZQotCQlLZXl3b3JkIGFyZ3VtZW50IHNlZ21lbnRfbmFtZTogdGhlIHJvb3QgbmFtZSBmb3IgZWFjaCBpbWFnZSBzZWdtZW50IGZpbGUKLQkJS2V5d29yZCBhcmd1bWVudCBpbWFnZV9JRDogc3RyaW5nIHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaW1hZ2UgSUQgdG8gZ3JvdXAgdGhlIHNlZ21lbnRzCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIGltYWdlIHNlZ21lbnRzIGNyZWF0ZWQKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ1NHTVQnCisgICAgZGVmIHNlZ21lbnRfaW1hZ2Uoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlZ21lbnQgaW1hZ2U6IFNlZ21lbnQgYSBORElGIFIvVyBvciBSL08gaW1hZ2UgaW50byBzbWFsbGVyIHBpZWNlcworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIGRpc2sgaW1hZ2UgdG8gYmUgc2VnbWVudGVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgc2VnbWVudF9jb3VudDogdGhlIG51bWJlciBvZiBpbWFnZSBzZWdtZW50cyB0byBjcmVhdGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzZWdtZW50X3NpemU6IHRoZSBzaXplIG9mIGltYWdlIHNlZ21lbnRzIChpbiBibG9ja3MpIHRvIGNyZWF0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNlZ21lbnRfbmFtZTogdGhlIHJvb3QgbmFtZSBmb3IgZWFjaCBpbWFnZSBzZWdtZW50IGZpbGUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBpbWFnZV9JRDogc3RyaW5nIHVzZWQgdG8gZ2VuZXJhdGUgYSB1bmlxdWUgaW1hZ2UgSUQgdG8gZ3JvdXAgdGhlIHNlZ21lbnRzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gdGhlIGltYWdlIHNlZ21lbnRzIGNyZWF0ZWQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ2Rkc2snCisgICAgICAgIF9zdWJjb2RlID0gJ1NHTVQnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VnbWVudF9pbWFnZSkKLQkJX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAorICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWdtZW50X2ltYWdlKQorICAgICAgICBfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CiAKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9jcmVhdGVfU01JID0gewotCQknc291cmNlX2ltYWdlcycgOiAnU01JMScsCi0JCSdsYXVuY2hpbmdfYXBwbGljYXRpb24nIDogJ1NNSTInLAotCQknbGF1bmNoaW5nX2RvY3VtZW50JyA6ICdTTUkzJywKLQkJJ3ZlcnNpb25fc3RyaW5nJyA6ICdTTUk0JywKLQkJJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiAnVkNoaycsCi0JCSdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKLQkJJ2ltYWdlX3NpZ25pbmcnIDogJ1NJbWcnLAotCX0KKyAgICBfYXJnbWFwX2NyZWF0ZV9TTUkgPSB7CisgICAgICAgICAgICAnc291cmNlX2ltYWdlcycgOiAnU01JMScsCisgICAgICAgICAgICAnbGF1bmNoaW5nX2FwcGxpY2F0aW9uJyA6ICdTTUkyJywKKyAgICAgICAgICAgICdsYXVuY2hpbmdfZG9jdW1lbnQnIDogJ1NNSTMnLAorICAgICAgICAgICAgJ3ZlcnNpb25fc3RyaW5nJyA6ICdTTUk0JywKKyAgICAgICAgICAgICdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogJ1ZDaGsnLAorICAgICAgICAgICAgJ3NpZ25hdHVyZV92ZXJpZmljYXRpb24nIDogJ1ZTaWcnLAorICAgICAgICAgICAgJ2ltYWdlX3NpZ25pbmcnIDogJ1NJbWcnLAorICAgIH0KIAotCWRlZiBjcmVhdGVfU01JKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJjcmVhdGUgU01JOiBDcmVhdGVzIGEgc2VsZi1tb3VudGluZyBpbWFnZSAoU01JKSBmcm9tIGEgbGlzdCBvZiBORElGIGRpc2sgaW1hZ2VzCi0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgc2VsZi1tb3VudGluZyBpbWFnZSB0byBjcmVhdGUKLQkJS2V5d29yZCBhcmd1bWVudCBzb3VyY2VfaW1hZ2VzOiBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBzb3VyY2VzIGltYWdlcwotCQlLZXl3b3JkIGFyZ3VtZW50IGxhdW5jaGluZ19hcHBsaWNhdGlvbjogdGhlIHBhdGggdG8gYW4gYXBwbGljYXRpb24gdG8gbGF1bmNoCi0JCUtleXdvcmQgYXJndW1lbnQgbGF1bmNoaW5nX2RvY3VtZW50OiB0aGUgcGF0aCB0byBhIGRvY3VtZW50IHRvIG9wZW4KLQkJS2V5d29yZCBhcmd1bWVudCB2ZXJzaW9uX3N0cmluZzogc2V0cyB0aGUgJ3ZlcnMnIDEgcmVzb3VyY2Ugb2YgdGhlIHNlbGYtbW91bnRpbmcgaW1hZ2UKLQkJS2V5d29yZCBhcmd1bWVudCBjaGVja3N1bV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgY2hlY2tzdW0gb2YgdGhlIHNvdXJjZSBpbWFnZXMgYmUgdmVyaWZpZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBTTUk/Ci0JCUtleXdvcmQgYXJndW1lbnQgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBEaWdpU2lnbo4gc2lnbmF0dXJlIG9mIHRoZSBzb3VyY2UgaW1hZ2VzIGJlIHZlcmlmaWVkIGJlZm9yZSBjcmVhdGluZyB0aGUgU01JPwotCQlLZXl3b3JkIGFyZ3VtZW50IGltYWdlX3NpZ25pbmc6IFNob3VsZCB0aGUgU01JIGJlIGdpdmVuIGEgZGlnaXRhbCBzaWduYXR1cmUgd2hlbiBpdCBpcyBjcmVhdGVkPwotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIHRoZSBzZWxmLW1vdW50aW5nIGltYWdlIGNyZWF0ZWQKLQkJIiIiCi0JCV9jb2RlID0gJ2Rkc2snCi0JCV9zdWJjb2RlID0gJ01TTUknCisgICAgZGVmIGNyZWF0ZV9TTUkoc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiImNyZWF0ZSBTTUk6IENyZWF0ZXMgYSBzZWxmLW1vdW50aW5nIGltYWdlIChTTUkpIGZyb20gYSBsaXN0IG9mIE5ESUYgZGlzayBpbWFnZXMKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzZWxmLW1vdW50aW5nIGltYWdlIHRvIGNyZWF0ZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNvdXJjZV9pbWFnZXM6IGEgbGlzdCBvZiByZWZlcmVuY2VzIHRvIHNvdXJjZXMgaW1hZ2VzCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgbGF1bmNoaW5nX2FwcGxpY2F0aW9uOiB0aGUgcGF0aCB0byBhbiBhcHBsaWNhdGlvbiB0byBsYXVuY2gKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBsYXVuY2hpbmdfZG9jdW1lbnQ6IHRoZSBwYXRoIHRvIGEgZG9jdW1lbnQgdG8gb3BlbgorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHZlcnNpb25fc3RyaW5nOiBzZXRzIHRoZSAndmVycycgMSByZXNvdXJjZSBvZiB0aGUgc2VsZi1tb3VudGluZyBpbWFnZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBjaGVja3N1bSBvZiB0aGUgc291cmNlIGltYWdlcyBiZSB2ZXJpZmllZCBiZWZvcmUgY3JlYXRpbmcgdGhlIFNNST8KKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBzaWduYXR1cmVfdmVyaWZpY2F0aW9uOiBTaG91bGQgdGhlIERpZ2lTaWdujiBzaWduYXR1cmUgb2YgdGhlIHNvdXJjZSBpbWFnZXMgYmUgdmVyaWZpZWQgYmVmb3JlIGNyZWF0aW5nIHRoZSBTTUk/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgaW1hZ2Vfc2lnbmluZzogU2hvdWxkIHRoZSBTTUkgYmUgZ2l2ZW4gYSBkaWdpdGFsIHNpZ25hdHVyZSB3aGVuIGl0IGlzIGNyZWF0ZWQ/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIHNlbGYtbW91bnRpbmcgaW1hZ2UgY3JlYXRlZAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnZGRzaycKKyAgICAgICAgX3N1YmNvZGUgPSAnTVNNSScKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9jcmVhdGVfU01JKQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2NyZWF0ZV9TTUkpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NJbWcnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVkNoaycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdWU2lnJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NJbWcnLCBfRW51bV9ib29sKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKIAogY2xhc3MgVmVyaWZ5X0NoZWNrc3VtX3JlcGx5X3JlY29yZChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgotCSIiIlZlcmlmeSBDaGVja3N1bSByZXBseSByZWNvcmQgLSAgIiIiCi0Jd2FudCA9ICdSY3JjJworICAgICIiIlZlcmlmeSBDaGVja3N1bSByZXBseSByZWNvcmQgLSAgIiIiCisgICAgd2FudCA9ICdSY3JjJwogY2xhc3MgdmFsaWRpdHkoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInZhbGlkaXR5IC0gdHJ1ZSBpZiBjaGVja3N1bSBpcyB2YWxpZCAiIiIKLQl3aGljaCA9ICdWbGlkJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJ2YWxpZGl0eSAtIHRydWUgaWYgY2hlY2tzdW0gaXMgdmFsaWQgIiIiCisgICAgd2hpY2ggPSAnVmxpZCcKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBleHBlY3RlZF9jaGVja3N1bShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZXhwZWN0ZWQgY2hlY2tzdW0gLSBjaGVja3N1bSB2YWx1ZSBzdG9yZWQgaW4gdGhlIGltYWdlIGhlYWRlciAoaW4gaGV4YWRlY2ltYWwpICIiIgotCXdoaWNoID0gJ2NyY0UnCi0Jd2FudCA9ICdURVhUJworICAgICIiImV4cGVjdGVkIGNoZWNrc3VtIC0gY2hlY2tzdW0gdmFsdWUgc3RvcmVkIGluIHRoZSBpbWFnZSBoZWFkZXIgKGluIGhleGFkZWNpbWFsKSAiIiIKKyAgICB3aGljaCA9ICdjcmNFJworICAgIHdhbnQgPSAnVEVYVCcKIGNsYXNzIGNhbGN1bGF0ZWRfY2hlY2tzdW0oYWV0b29scy5OUHJvcGVydHkpOgotCSIiImNhbGN1bGF0ZWQgY2hlY2tzdW0gLSBjaGVja3N1bSB2YWx1ZSBhY3R1YWxseSBjYWxjdWxhdGVkIChpbiBoZXhhZGVjaW1hbCkgIiIiCi0Jd2hpY2ggPSAnY3JjQScKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiY2FsY3VsYXRlZCBjaGVja3N1bSAtIGNoZWNrc3VtIHZhbHVlIGFjdHVhbGx5IGNhbGN1bGF0ZWQgKGluIGhleGFkZWNpbWFsKSAiIiIKKyAgICB3aGljaCA9ICdjcmNBJworICAgIHdhbnQgPSAnVEVYVCcKIAogY2xhc3MgQ2hlY2tfSW1hZ2VfcmVwbHlfcmVjb3JkKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiQ2hlY2sgSW1hZ2UgcmVwbHkgcmVjb3JkIC0gICIiIgotCXdhbnQgPSAnUmNoaycKKyAgICAiIiJDaGVjayBJbWFnZSByZXBseSByZWNvcmQgLSAgIiIiCisgICAgd2FudCA9ICdSY2hrJwogY2xhc3MgY29uc2lzdGVuY3koYWV0b29scy5OUHJvcGVydHkpOgotCSIiImNvbnNpc3RlbmN5IC0gRG9lcyB0aGUgaW1hZ2UgcGFzcyBjb25zaXN0ZW5jeSBjaGVja3M/ICIiIgotCXdoaWNoID0gJ1JjaDEnCi0Jd2FudCA9ICdib29sJworICAgICIiImNvbnNpc3RlbmN5IC0gRG9lcyB0aGUgaW1hZ2UgcGFzcyBjb25zaXN0ZW5jeSBjaGVja3M/ICIiIgorICAgIHdoaWNoID0gJ1JjaDEnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgZXJyb3JfY291bnQoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImVycm9yIGNvdW50IC0gdGhlIG51bWJlciBvZiBlcnJvcnMgcmVjb3JkZWQgIiIiCi0Jd2hpY2ggPSAnUmNoMicKLQl3YW50ID0gJ2xvbmcnCisgICAgIiIiZXJyb3IgY291bnQgLSB0aGUgbnVtYmVyIG9mIGVycm9ycyByZWNvcmRlZCAiIiIKKyAgICB3aGljaCA9ICdSY2gyJworICAgIHdhbnQgPSAnbG9uZycKIGNsYXNzIHdhcm5pbmdfY291bnQoYWV0b29scy5OUHJvcGVydHkpOgotCSIiIndhcm5pbmcgY291bnQgLSB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIHJlY29yZGVkICIiIgotCXdoaWNoID0gJ1JjaDMnCi0Jd2FudCA9ICdsb25nJworICAgICIiIndhcm5pbmcgY291bnQgLSB0aGUgbnVtYmVyIG9mIHdhcm5pbmdzIHJlY29yZGVkICIiIgorICAgIHdoaWNoID0gJ1JjaDMnCisgICAgd2FudCA9ICdsb25nJwogVmVyaWZ5X0NoZWNrc3VtX3JlcGx5X3JlY29yZC5fcHJvcGRpY3QgPSB7Ci0JJ3ZhbGlkaXR5JyA6IHZhbGlkaXR5LAotCSdleHBlY3RlZF9jaGVja3N1bScgOiBleHBlY3RlZF9jaGVja3N1bSwKLQknY2FsY3VsYXRlZF9jaGVja3N1bScgOiBjYWxjdWxhdGVkX2NoZWNrc3VtLAorICAgICAgICAndmFsaWRpdHknIDogdmFsaWRpdHksCisgICAgICAgICdleHBlY3RlZF9jaGVja3N1bScgOiBleHBlY3RlZF9jaGVja3N1bSwKKyAgICAgICAgJ2NhbGN1bGF0ZWRfY2hlY2tzdW0nIDogY2FsY3VsYXRlZF9jaGVja3N1bSwKIH0KIFZlcmlmeV9DaGVja3N1bV9yZXBseV9yZWNvcmQuX2VsZW1kaWN0ID0gewogfQogQ2hlY2tfSW1hZ2VfcmVwbHlfcmVjb3JkLl9wcm9wZGljdCA9IHsKLQknY29uc2lzdGVuY3knIDogY29uc2lzdGVuY3ksCi0JJ2Vycm9yX2NvdW50JyA6IGVycm9yX2NvdW50LAotCSd3YXJuaW5nX2NvdW50JyA6IHdhcm5pbmdfY291bnQsCisgICAgICAgICdjb25zaXN0ZW5jeScgOiBjb25zaXN0ZW5jeSwKKyAgICAgICAgJ2Vycm9yX2NvdW50JyA6IGVycm9yX2NvdW50LAorICAgICAgICAnd2FybmluZ19jb3VudCcgOiB3YXJuaW5nX2NvdW50LAogfQogQ2hlY2tfSW1hZ2VfcmVwbHlfcmVjb3JkLl9lbGVtZGljdCA9IHsKIH0KIF9FbnVtX0Fjc3MgPSB7Ci0JJ3JlYWRfYW5kX3dyaXRlJyA6ICdSZFdyJywJIyByZWFkL3dyaXRlIGFjY2VzcwotCSdyZWFkX29ubHknIDogJ1JkeHgnLAkjIHJlYWQtb25seSBhY2Nlc3MKLQknYW55JyA6ICdBbnl4JywJIyBiZXN0IHBvc3NpYmxlIGFjY2VzcworICAgICAgICAncmVhZF9hbmRfd3JpdGUnIDogJ1JkV3InLCAgICAgICMgcmVhZC93cml0ZSBhY2Nlc3MKKyAgICAgICAgJ3JlYWRfb25seScgOiAnUmR4eCcsICAgIyByZWFkLW9ubHkgYWNjZXNzCisgICAgICAgICdhbnknIDogJ0FueXgnLCAjIGJlc3QgcG9zc2libGUgYWNjZXNzCiB9CiAKIF9FbnVtX0ZzeXMgPSB7Ci0JJ01hY19PU19TdGFuZGFyZCcgOiAnRmhmcycsCSMgY2xhc3NpYyBIRlMgZmlsZSBzeXN0ZW0KLQknY29tcGF0aWJsZV9NYWNfT1NfRXh0ZW5kZWQnIDogJ0ZoZisnLAkjIG5ldyBIRlMrIGZpbGUgc3lzdGVtCisgICAgICAgICdNYWNfT1NfU3RhbmRhcmQnIDogJ0ZoZnMnLCAgICAgIyBjbGFzc2ljIEhGUyBmaWxlIHN5c3RlbQorICAgICAgICAnY29tcGF0aWJsZV9NYWNfT1NfRXh0ZW5kZWQnIDogJ0ZoZisnLCAgIyBuZXcgSEZTKyBmaWxlIHN5c3RlbQogfQogCiBfRW51bV9hbGlzID0gTm9uZSAjIFhYWFggZW51bSBhbGlzIG5vdCBmb3VuZCEhCkBAIC00MDIsMjMgKzQwMiwyMyBAQAogIyBJbmRpY2VzIG9mIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgbW9kdWxlCiAjCiBfY2xhc3NkZWNsYXJhdGlvbnMgPSB7Ci0JJ1JjaGsnIDogQ2hlY2tfSW1hZ2VfcmVwbHlfcmVjb3JkLAotCSdSY3JjJyA6IFZlcmlmeV9DaGVja3N1bV9yZXBseV9yZWNvcmQsCisgICAgICAgICdSY2hrJyA6IENoZWNrX0ltYWdlX3JlcGx5X3JlY29yZCwKKyAgICAgICAgJ1JjcmMnIDogVmVyaWZ5X0NoZWNrc3VtX3JlcGx5X3JlY29yZCwKIH0KIAogX3Byb3BkZWNsYXJhdGlvbnMgPSB7Ci0JJ2NyY0UnIDogZXhwZWN0ZWRfY2hlY2tzdW0sCi0JJ1JjaDInIDogZXJyb3JfY291bnQsCi0JJ2NyY0EnIDogY2FsY3VsYXRlZF9jaGVja3N1bSwKLQknUmNoMycgOiB3YXJuaW5nX2NvdW50LAotCSdWbGlkJyA6IHZhbGlkaXR5LAotCSdSY2gxJyA6IGNvbnNpc3RlbmN5LAorICAgICAgICAnY3JjRScgOiBleHBlY3RlZF9jaGVja3N1bSwKKyAgICAgICAgJ1JjaDInIDogZXJyb3JfY291bnQsCisgICAgICAgICdjcmNBJyA6IGNhbGN1bGF0ZWRfY2hlY2tzdW0sCisgICAgICAgICdSY2gzJyA6IHdhcm5pbmdfY291bnQsCisgICAgICAgICdWbGlkJyA6IHZhbGlkaXR5LAorICAgICAgICAnUmNoMScgOiBjb25zaXN0ZW5jeSwKIH0KIAogX2NvbXBkZWNsYXJhdGlvbnMgPSB7CiB9CiAKIF9lbnVtZGVjbGFyYXRpb25zID0gewotCSdBY3NzJyA6IF9FbnVtX0Fjc3MsCi0JJ0ZzeXMnIDogX0VudW1fRnN5cywKKyAgICAgICAgJ0Fjc3MnIDogX0VudW1fQWNzcywKKyAgICAgICAgJ0ZzeXMnIDogX0VudW1fRnN5cywKIH0KZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TdGFuZGFyZF9TdWl0ZS5weSBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9TdGFuZGFyZF9TdWl0ZS5weQppbmRleCA5MzEyNDZlLi40NTVlNzhkIDEwMDY0NAotLS0gYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvU3RhbmRhcmRfU3VpdGUucHkKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1N0YW5kYXJkX1N1aXRlLnB5CkBAIC0xMiwyMjUgKzEyLDIyNSBAQAogCiBjbGFzcyBTdGFuZGFyZF9TdWl0ZV9FdmVudHM6CiAKLQlfYXJnbWFwX3NhdmUgPSB7Ci0JCSdfaW4nIDogJ2tmaWwnLAotCQkndXNpbmdfZm9ybWF0JyA6ICdTdkFzJywKLQkJJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiAnVkNoaycsCi0JCSdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKLQkJJ2ltYWdlX3NpZ25pbmcnIDogJ1NJbWcnLAotCQknbGVhdmVfaW1hZ2VfbW91bnRlZCcgOiAnTW91bicsCi0JCSdwZXJjZW50X2ZyZWVfc3BhY2UnIDogJ1Nsb3AnLAotCQknbG9naWNhbF9ibG9ja3MnIDogJ0Jsa3MnLAotCQknemVyb2luZycgOiAnWmVybycsCi0JfQorICAgIF9hcmdtYXBfc2F2ZSA9IHsKKyAgICAgICAgICAgICdfaW4nIDogJ2tmaWwnLAorICAgICAgICAgICAgJ3VzaW5nX2Zvcm1hdCcgOiAnU3ZBcycsCisgICAgICAgICAgICAnY2hlY2tzdW1fdmVyaWZpY2F0aW9uJyA6ICdWQ2hrJywKKyAgICAgICAgICAgICdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6ICdWU2lnJywKKyAgICAgICAgICAgICdpbWFnZV9zaWduaW5nJyA6ICdTSW1nJywKKyAgICAgICAgICAgICdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6ICdNb3VuJywKKyAgICAgICAgICAgICdwZXJjZW50X2ZyZWVfc3BhY2UnIDogJ1Nsb3AnLAorICAgICAgICAgICAgJ2xvZ2ljYWxfYmxvY2tzJyA6ICdCbGtzJywKKyAgICAgICAgICAgICd6ZXJvaW5nJyA6ICdaZXJvJywKKyAgICB9CiAKLQlkZWYgc2F2ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKLQkJIiIic2F2ZTogU2F2ZSBhbiBvYmplY3QKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzb3VyY2Ugb2JqZWN0Ci0JCUtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgdGFyZ2V0IG9iamVjdAotCQlLZXl3b3JkIGFyZ3VtZW50IHVzaW5nX2Zvcm1hdDogdGhlIGZvcm1hdCBmb3IgdGhlIHRhcmdldAotCQlLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBjaGVja3N1bSBiZSB2ZXJpZmllZCBiZWZvcmUgc2F2aW5nPwotCQlLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBiZSB2ZXJpZmllZCBiZWZvcmUgc2F2aW5nPwotCQlLZXl3b3JkIGFyZ3VtZW50IGltYWdlX3NpZ25pbmc6IFNob3VsZCB0aGUgaW1hZ2UgYmUgc2lnbmVkPwotCQlLZXl3b3JkIGFyZ3VtZW50IGxlYXZlX2ltYWdlX21vdW50ZWQ6IFNob3VsZCB0aGUgaW1hZ2UgYmUgbW91bnRlZCBhZnRlciBzYXZpbmc/Ci0JCUtleXdvcmQgYXJndW1lbnQgcGVyY2VudF9mcmVlX3NwYWNlOiBwZXJjZW50IGZyZWUgc3BhY2UgdG8gcmVzZXJ2ZSAoZm9yIGltYWdlIGZvbGRlciBvcGVyYXRpb24sIDAtMjU1JSkKLQkJS2V5d29yZCBhcmd1bWVudCBsb2dpY2FsX2Jsb2NrczogbnVtYmVyIG9mIGxvZ2ljYWwgYmxvY2tzIGluIHRoZSBpbWFnZSAoZm9yIGltYWdlIGZvbGRlciBvcGVyYXRpb24pCi0JCUtleXdvcmQgYXJndW1lbnQgemVyb2luZzogU2hvdWxkIGFsbCB0aGUgYmxvY2tzIGluIHRoZSBpbWFnZSBiZSBzZXQgdG8gemVyb3M/IChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbikKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiB0aGUgcmVzdWx0IG9mIHRoZSBzYXZlIG9wZXJhdGlvbgotCQkiIiIKLQkJX2NvZGUgPSAnY29yZScKLQkJX3N1YmNvZGUgPSAnc2F2ZScKKyAgICBkZWYgc2F2ZShzZWxmLCBfb2JqZWN0LCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2F2ZTogU2F2ZSBhbiBvYmplY3QKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzb3VyY2Ugb2JqZWN0CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2luOiB0aGUgdGFyZ2V0IG9iamVjdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHVzaW5nX2Zvcm1hdDogdGhlIGZvcm1hdCBmb3IgdGhlIHRhcmdldAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGNoZWNrc3VtX3ZlcmlmaWNhdGlvbjogU2hvdWxkIHRoZSBjaGVja3N1bSBiZSB2ZXJpZmllZCBiZWZvcmUgc2F2aW5nPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHNpZ25hdHVyZV92ZXJpZmljYXRpb246IFNob3VsZCB0aGUgRGlnaVNpZ26OIHNpZ25hdHVyZSBiZSB2ZXJpZmllZCBiZWZvcmUgc2F2aW5nPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGltYWdlX3NpZ25pbmc6IFNob3VsZCB0aGUgaW1hZ2UgYmUgc2lnbmVkPworICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IGxlYXZlX2ltYWdlX21vdW50ZWQ6IFNob3VsZCB0aGUgaW1hZ2UgYmUgbW91bnRlZCBhZnRlciBzYXZpbmc/CisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgcGVyY2VudF9mcmVlX3NwYWNlOiBwZXJjZW50IGZyZWUgc3BhY2UgdG8gcmVzZXJ2ZSAoZm9yIGltYWdlIGZvbGRlciBvcGVyYXRpb24sIDAtMjU1JSkKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBsb2dpY2FsX2Jsb2NrczogbnVtYmVyIG9mIGxvZ2ljYWwgYmxvY2tzIGluIHRoZSBpbWFnZSAoZm9yIGltYWdlIGZvbGRlciBvcGVyYXRpb24pCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgemVyb2luZzogU2hvdWxkIGFsbCB0aGUgYmxvY2tzIGluIHRoZSBpbWFnZSBiZSBzZXQgdG8gemVyb3M/IChmb3IgaW1hZ2UgZm9sZGVyIG9wZXJhdGlvbikKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiB0aGUgcmVzdWx0IG9mIHRoZSBzYXZlIG9wZXJhdGlvbgorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnc2F2ZScKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zYXZlKQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NhdmUpCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAna2ZpbCcsIF9FbnVtX29ial8pCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTdkFzJywgX0VudW1fU3ZBcykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZDaGsnLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTSW1nJywgX0VudW1fYm9vbCkKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ01vdW4nLCBfRW51bV9ib29sKQotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU2xvcCcsIF9FbnVtX2xvbmcpCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdCbGtzJywgX0VudW1fbG9uZykKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1plcm8nLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAna2ZpbCcsIF9FbnVtX29ial8pCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTdkFzJywgX0VudW1fU3ZBcykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1ZDaGsnLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnVlNpZycsIF9FbnVtX2Jvb2wpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTSW1nJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ01vdW4nLCBfRW51bV9ib29sKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU2xvcCcsIF9FbnVtX2xvbmcpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdCbGtzJywgX0VudW1fbG9uZykKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1plcm8nLCBfRW51bV9ib29sKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKLQlkZWYgZG9fc2NyaXB0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgotCQkiIiJkbyBzY3JpcHQ6IEV4ZWN1dGUgYW4gYXR0YWNoZWQgc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGZvbGRlciAiU2NyaXB0cyIKLQkJUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQkiIiIKLQkJX2NvZGUgPSAnY29yZScKLQkJX3N1YmNvZGUgPSAnZG9zYycKKyAgICBkZWYgZG9fc2NyaXB0KHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJkbyBzY3JpcHQ6IEV4ZWN1dGUgYW4gYXR0YWNoZWQgc2NyaXB0IGxvY2F0ZWQgaW4gdGhlIGZvbGRlciAiU2NyaXB0cyIKKyAgICAgICAgUmVxdWlyZWQgYXJndW1lbnQ6IHRoZSBzY3JpcHQgdG8gYmUgZXhlY3V0ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnY29yZScKKyAgICAgICAgX3N1YmNvZGUgPSAnZG9zYycKIAotCQlpZiBfYXJndW1lbnRzOiByYWlzZSBUeXBlRXJyb3IsICdObyBvcHRpb25hbCBhcmdzIGV4cGVjdGVkJwotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGlmIF9hcmd1bWVudHM6IHJhaXNlIFR5cGVFcnJvciwgJ05vIG9wdGlvbmFsIGFyZ3MgZXhwZWN0ZWQnCisgICAgICAgIF9hcmd1bWVudHNbJy0tLS0nXSA9IF9vYmplY3QKIAogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKIAogY2xhc3MgYXBwbGljYXRpb24oYWV0b29scy5Db21wb25lbnRJdGVtKToKLQkiIiJhcHBsaWNhdGlvbiAtIFRoZSBEaXNrIENvcHkgYXBwbGljYXRpb24gIiIiCi0Jd2FudCA9ICdjYXBwJworICAgICIiImFwcGxpY2F0aW9uIC0gVGhlIERpc2sgQ29weSBhcHBsaWNhdGlvbiAiIiIKKyAgICB3YW50ID0gJ2NhcHAnCiBjbGFzcyB2ZXJzaW9uKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJ2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbiAiIiIKLQl3aGljaCA9ICd2ZXJzJwotCXdhbnQgPSAndmVycycKKyAgICAiIiJ2ZXJzaW9uIC0gdGhlIHZlcnNpb24gb2YgdGhpcyBhcHBsaWNhdGlvbiAiIiIKKyAgICB3aGljaCA9ICd2ZXJzJworICAgIHdhbnQgPSAndmVycycKIGNsYXNzIG5hbWUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uICIiIgotCXdoaWNoID0gJ3BuYW0nCi0Jd2FudCA9ICdURVhUJworICAgICIiIm5hbWUgLSB0aGUgbmFtZSBvZiB0aGlzIGFwcGxpY2F0aW9uICIiIgorICAgIHdoaWNoID0gJ3BuYW0nCisgICAgd2FudCA9ICdURVhUJwogY2xhc3MgY29tbWVudChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY29tbWVudCAtIHRoZSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gIiIiCi0Jd2hpY2ggPSAnY29tdCcKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiY29tbWVudCAtIHRoZSBjb21tZW50IGFzc29jaWF0ZWQgd2l0aCB0aGUgYXBwbGljYXRpb24gIiIiCisgICAgd2hpY2ggPSAnY29tdCcKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBkcml2ZXJfdmVyc2lvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZHJpdmVyIHZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGUgZGlzayBpbWFnZSBkcml2ZXIgIiIiCi0Jd2hpY2ggPSAnZFZlcicKLQl3YW50ID0gJ3ZlcnMnCisgICAgIiIiZHJpdmVyIHZlcnNpb24gLSB0aGUgdmVyc2lvbiBvZiB0aGUgZGlzayBpbWFnZSBkcml2ZXIgIiIiCisgICAgd2hpY2ggPSAnZFZlcicKKyAgICB3YW50ID0gJ3ZlcnMnCiBjbGFzcyBub25lamVjdGFibGVfbW9kZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIibm9uZWplY3RhYmxlIG1vZGUgLSBTaG91bGQgbW91bnRlZCBpbWFnZXMgYmUgbm9uLWVqZWN0YWJsZT8gIiIiCi0Jd2hpY2ggPSAnb3R0bycKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIibm9uZWplY3RhYmxlIG1vZGUgLSBTaG91bGQgbW91bnRlZCBpbWFnZXMgYmUgbm9uLWVqZWN0YWJsZT8gIiIiCisgICAgd2hpY2ggPSAnb3R0bycKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBzYXZlX2xvZ19maWxlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJzYXZlIGxvZyBmaWxlIC0gU2hvdWxkIHRoZSBsb2cgZmlsZSBiZSBzYXZlZCBvbiBkaXNrPyAiIiIKLQl3aGljaCA9ICdQU2FMJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJzYXZlIGxvZyBmaWxlIC0gU2hvdWxkIHRoZSBsb2cgZmlsZSBiZSBzYXZlZCBvbiBkaXNrPyAiIiIKKyAgICB3aGljaCA9ICdQU2FMJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIHVzZV9zcGVlY2goYWV0b29scy5OUHJvcGVydHkpOgotCSIiInVzZSBzcGVlY2ggLSBTaG91bGQgRGlzayBDb3B5IHVzZSBzcG9rZW4gZmVlZGJhY2s/ICIiIgotCXdoaWNoID0gJ1BUbGsnCi0Jd2FudCA9ICdib29sJworICAgICIiInVzZSBzcGVlY2ggLSBTaG91bGQgRGlzayBDb3B5IHVzZSBzcG9rZW4gZmVlZGJhY2s/ICIiIgorICAgIHdoaWNoID0gJ1BUbGsnCisgICAgd2FudCA9ICdib29sJwogY2xhc3Mgc21hcnRfU2F2ZV9BcyhhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIic21hcnQgU2F2ZSBBcyAtIFNob3VsZCB0aGUgU2F2ZSBBcy4uLiBkaWFsb2cgYm94IGF1dG9tYXRpY2FsbHkgZ28gdG8gdGhlIHJpZ2h0IGZvbGRlcj8gIiIiCi0Jd2hpY2ggPSAnUFNTUCcKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIic21hcnQgU2F2ZSBBcyAtIFNob3VsZCB0aGUgU2F2ZSBBcy4uLiBkaWFsb2cgYm94IGF1dG9tYXRpY2FsbHkgZ28gdG8gdGhlIHJpZ2h0IGZvbGRlcj8gIiIiCisgICAgd2hpY2ggPSAnUFNTUCcKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBjaGVja3N1bV92ZXJpZmljYXRpb24oYWV0b29scy5OUHJvcGVydHkpOgotCSIiImNoZWNrc3VtIHZlcmlmaWNhdGlvbiAtIFNob3VsZCBpbWFnZSBjaGVja3N1bXMgYmUgdmVyaWZpZWQ/ICIiIgotCXdoaWNoID0gJ1BWZUMnCi0Jd2FudCA9ICdib29sJworICAgICIiImNoZWNrc3VtIHZlcmlmaWNhdGlvbiAtIFNob3VsZCBpbWFnZSBjaGVja3N1bXMgYmUgdmVyaWZpZWQ/ICIiIgorICAgIHdoaWNoID0gJ1BWZUMnCisgICAgd2FudCA9ICdib29sJwogY2xhc3Mgc2lnbmF0dXJlX3ZlcmlmaWNhdGlvbihhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIic2lnbmF0dXJlIHZlcmlmaWNhdGlvbiAtIFNob3VsZCBkaWdpdGFsIHNpZ25hdHVyZXMgYmUgdmVyaWZpZWQ/ICIiIgotCXdoaWNoID0gJ1BWZVMnCi0Jd2FudCA9ICdib29sJworICAgICIiInNpZ25hdHVyZSB2ZXJpZmljYXRpb24gLSBTaG91bGQgZGlnaXRhbCBzaWduYXR1cmVzIGJlIHZlcmlmaWVkPyAiIiIKKyAgICB3aGljaCA9ICdQVmVTJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGV4Y2x1ZGVfRGlza1NjcmlwdHMoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImV4Y2x1ZGUgRGlza1NjcmlwdHMgLSBTaG91bGQgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gRGlza1NjcmlwdHMvRGlza1NldHMgYmUgZXhjbHVkZWQgZnJvbSB2ZXJpZmljYXRpb24/ICIiIgotCXdoaWNoID0gJ1BFeEQnCi0Jd2FudCA9ICdib29sJworICAgICIiImV4Y2x1ZGUgRGlza1NjcmlwdHMgLSBTaG91bGQgaW1hZ2VzIHJlZmVyZW5jZWQgaW4gRGlza1NjcmlwdHMvRGlza1NldHMgYmUgZXhjbHVkZWQgZnJvbSB2ZXJpZmljYXRpb24/ICIiIgorICAgIHdoaWNoID0gJ1BFeEQnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgZXhjbHVkZV9yZW1vdGVfaW1hZ2VzKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJleGNsdWRlIHJlbW90ZSBpbWFnZXMgLSBTaG91bGQgaW1hZ2VzIHRoYXQgYXJlIGxvY2F0ZWQgb24gbmV0d29yayB2b2x1bWVzIGJlIGV4Y2x1ZGVkIGZyb20gdmVyaWZpY2F0aW9uPyAiIiIKLQl3aGljaCA9ICdQRXhSJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJleGNsdWRlIHJlbW90ZSBpbWFnZXMgLSBTaG91bGQgaW1hZ2VzIHRoYXQgYXJlIGxvY2F0ZWQgb24gbmV0d29yayB2b2x1bWVzIGJlIGV4Y2x1ZGVkIGZyb20gdmVyaWZpY2F0aW9uPyAiIiIKKyAgICB3aGljaCA9ICdQRXhSJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGltYWdlX3NpZ25pbmcoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImltYWdlIHNpZ25pbmcgLSBTaG91bGQgaW1hZ2VzIGJlIHNpZ25lZCB3aXRoIGEgZGlnaXRhbCBzaWduYXR1cmU/ICIiIgotCXdoaWNoID0gJ1BTaUknCi0Jd2FudCA9ICdib29sJworICAgICIiImltYWdlIHNpZ25pbmcgLSBTaG91bGQgaW1hZ2VzIGJlIHNpZ25lZCB3aXRoIGEgZGlnaXRhbCBzaWduYXR1cmU/ICIiIgorICAgIHdoaWNoID0gJ1BTaUknCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgbGVhdmVfaW1hZ2VfbW91bnRlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIibGVhdmUgaW1hZ2UgbW91bnRlZCAtIFNob3VsZCBpbWFnZXMgYmUgbW91bnRlZCBhZnRlciB0aGV5IGFyZSBjcmVhdGVkPyAiIiIKLQl3aGljaCA9ICdQTW9BJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJsZWF2ZSBpbWFnZSBtb3VudGVkIC0gU2hvdWxkIGltYWdlcyBiZSBtb3VudGVkIGFmdGVyIHRoZXkgYXJlIGNyZWF0ZWQ/ICIiIgorICAgIHdoaWNoID0gJ1BNb0EnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgZXJhc2VfY29uZmlybWF0aW9uKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJlcmFzZSBjb25maXJtYXRpb24gLSBTaG91bGQgdGhlIHVzZXIgYmUgcmVxdWlyZWQgdG8gY29uZmlybSBjb21tYW5kcyB0aGF0IGVyYXNlIGRpc2tzPyAiIiIKLQl3aGljaCA9ICdQQ29FJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJlcmFzZSBjb25maXJtYXRpb24gLSBTaG91bGQgdGhlIHVzZXIgYmUgcmVxdWlyZWQgdG8gY29uZmlybSBjb21tYW5kcyB0aGF0IGVyYXNlIGRpc2tzPyAiIiIKKyAgICB3aGljaCA9ICdQQ29FJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIHplcm9pbmcoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInplcm9pbmcgLSBTaG91bGQgYWxsIGJsb2NrcyBvZiBhIG5ldyBpbWFnZSBiZSBzZXQgdG8gemVybz8gIiIiCi0Jd2hpY2ggPSAnUFplQicKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiemVyb2luZyAtIFNob3VsZCBhbGwgYmxvY2tzIG9mIGEgbmV3IGltYWdlIGJlIHNldCB0byB6ZXJvPyAiIiIKKyAgICB3aGljaCA9ICdQWmVCJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIGRlZmF1bHRfY3JlYXRlX3NpemUoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImRlZmF1bHQgY3JlYXRlIHNpemUgLSB0aGUgZGVmYXVsdCBzaXplIGZvciBhIG5ldyBpbWFnZSwgaW4gYmxvY2tzICg1MTIgYnl0ZXMgcGVyIGJsb2NrKSAiIiIKLQl3aGljaCA9ICdQRGVTJwotCXdhbnQgPSAnbG9uZycKKyAgICAiIiJkZWZhdWx0IGNyZWF0ZSBzaXplIC0gdGhlIGRlZmF1bHQgc2l6ZSBmb3IgYSBuZXcgaW1hZ2UsIGluIGJsb2NrcyAoNTEyIGJ5dGVzIHBlciBibG9jaykgIiIiCisgICAgd2hpY2ggPSAnUERlUycKKyAgICB3YW50ID0gJ2xvbmcnCiBjbGFzcyBkZWZhdWx0X2NyZWF0ZV9uYW1lKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkZWZhdWx0IGNyZWF0ZSBuYW1lIC0gdGhlIGRlZmF1bHQgdm9sdW1lIG5hbWUgZm9yIGEgbmV3IGltYWdlICIiIgotCXdoaWNoID0gJ1BEZU4nCi0Jd2FudCA9ICdURVhUJworICAgICIiImRlZmF1bHQgY3JlYXRlIG5hbWUgLSB0aGUgZGVmYXVsdCB2b2x1bWUgbmFtZSBmb3IgYSBuZXcgaW1hZ2UgIiIiCisgICAgd2hpY2ggPSAnUERlTicKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBtYWtlX211bHRpcGxlX2Zsb3BwaWVzKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJtYWtlIG11bHRpcGxlIGZsb3BwaWVzIC0gU2hvdWxkIHRoZSB1c2VyIGJlIHByb21wdGVkIHRvIG1ha2UgbXVsdGlwbGUgZmxvcHB5IGRpc2sgaW1hZ2VzIGF0IGEgdGltZT8gIiIiCi0Jd2hpY2ggPSAnUEJ1TScKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIibWFrZSBtdWx0aXBsZSBmbG9wcGllcyAtIFNob3VsZCB0aGUgdXNlciBiZSBwcm9tcHRlZCB0byBtYWtlIG11bHRpcGxlIGZsb3BweSBkaXNrIGltYWdlcyBhdCBhIHRpbWU/ICIiIgorICAgIHdoaWNoID0gJ1BCdU0nCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgYXV0b19pbWFnZV91cG9uX2luc2VydChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiYXV0byBpbWFnZSB1cG9uIGluc2VydCAtIFNob3VsZCBhIG5ld2x5LWluc2VydGVkIGRpc2sgYXV0b21hdGljYWxseSBiZSBwcm9jZXNzZWQgaW50byBhbiBpbWFnZT8gIiIiCi0Jd2hpY2ggPSAnUGFpbScKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiYXV0byBpbWFnZSB1cG9uIGluc2VydCAtIFNob3VsZCBhIG5ld2x5LWluc2VydGVkIGRpc2sgYXV0b21hdGljYWxseSBiZSBwcm9jZXNzZWQgaW50byBhbiBpbWFnZT8gIiIiCisgICAgd2hpY2ggPSAnUGFpbScKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyBlamVjdF9hZnRlcl9hdXRvX2ltYWdlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJlamVjdCBhZnRlciBhdXRvIGltYWdlIC0gU2hvdWxkIGF1dG8taW1hZ2VkIGRpc2tzIGJlIGVqZWN0ZWQgYWZ0ZXJ3YXJkcz8gIiIiCi0Jd2hpY2ggPSAnUGVqYycKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiZWplY3QgYWZ0ZXIgYXV0byBpbWFnZSAtIFNob3VsZCBhdXRvLWltYWdlZCBkaXNrcyBiZSBlamVjdGVkIGFmdGVyd2FyZHM/ICIiIgorICAgIHdoaWNoID0gJ1BlamMnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiYXV0byBjb3B5IHVwb24gZmxvcHB5IGluc2VydCAtIEluc3RlYWQgb2YgYXV0by1pbWFnaW5nLCBzaG91bGQgbmV3bHktaW5zZXJ0ZWQgZmxvcHB5IGRpc2tzIGJlIGNvcGllZD8gIiIiCi0Jd2hpY2ggPSAnUGNwZicKLQl3YW50ID0gJ2Jvb2wnCisgICAgIiIiYXV0byBjb3B5IHVwb24gZmxvcHB5IGluc2VydCAtIEluc3RlYWQgb2YgYXV0by1pbWFnaW5nLCBzaG91bGQgbmV3bHktaW5zZXJ0ZWQgZmxvcHB5IGRpc2tzIGJlIGNvcGllZD8gIiIiCisgICAgd2hpY2ggPSAnUGNwZicKKyAgICB3YW50ID0gJ2Jvb2wnCiBjbGFzcyB2b2x1bWVfc3VmZml4KGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJ2b2x1bWUgc3VmZml4IC0gdGhlIGRlZmF1bHQgdm9sdW1lIG5hbWUgc3VmZml4ICIiIgotCXdoaWNoID0gJ1BEaUUnCi0Jd2FudCA9ICdURVhUJworICAgICIiInZvbHVtZSBzdWZmaXggLSB0aGUgZGVmYXVsdCB2b2x1bWUgbmFtZSBzdWZmaXggIiIiCisgICAgd2hpY2ggPSAnUERpRScKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBpbWFnZV9zdWZmaXgoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImltYWdlIHN1ZmZpeCAtIHRoZSBkZWZhdWx0IGltYWdlIG5hbWUgc3VmZml4ICIiIgotCXdoaWNoID0gJ1BJbUUnCi0Jd2FudCA9ICdURVhUJworICAgICIiImltYWdlIHN1ZmZpeCAtIHRoZSBkZWZhdWx0IGltYWdlIG5hbWUgc3VmZml4ICIiIgorICAgIHdoaWNoID0gJ1BJbUUnCisgICAgd2FudCA9ICdURVhUJwogY2xhc3MgZGVmYXVsdF9maWxlX3N5c3RlbShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZGVmYXVsdCBmaWxlIHN5c3RlbSAtIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIHR5cGUgZm9yIG5ldyBibGFuayBpbWFnZXMgIiIiCi0Jd2hpY2ggPSAnUGZzeScKLQl3YW50ID0gJ0ZzeXMnCisgICAgIiIiZGVmYXVsdCBmaWxlIHN5c3RlbSAtIHRoZSBkZWZhdWx0IGZpbGUgc3lzdGVtIHR5cGUgZm9yIG5ldyBibGFuayBpbWFnZXMgIiIiCisgICAgd2hpY2ggPSAnUGZzeScKKyAgICB3YW50ID0gJ0ZzeXMnCiBjbGFzcyBkZWZhdWx0X2ltYWdlX2Zvcm1hdChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZGVmYXVsdCBpbWFnZSBmb3JtYXQgLSB0aGUgZGVmYXVsdCBpbWFnZSBmaWxlIGZvcm1hdCAiIiIKLQl3aGljaCA9ICdQZGZtJwotCXdhbnQgPSAnU3ZBcycKKyAgICAiIiJkZWZhdWx0IGltYWdlIGZvcm1hdCAtIHRoZSBkZWZhdWx0IGltYWdlIGZpbGUgZm9ybWF0ICIiIgorICAgIHdoaWNoID0gJ1BkZm0nCisgICAgd2FudCA9ICdTdkFzJwogCiBjbGFzcyBkaXNrKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiZGlzayAtIEEgbW91bnRlZCB2b2x1bWUgIiIiCi0Jd2FudCA9ICdEaXNrJworICAgICIiImRpc2sgLSBBIG1vdW50ZWQgdm9sdW1lICIiIgorICAgIHdhbnQgPSAnRGlzaycKIAogbmFtZSA9IG5hbWUKIAogY29tbWVudCA9IGNvbW1lbnQKIGNsYXNzIGxvY2tlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIibG9ja2VkIC0gSXMgdGhlIGRpc2sgbG9ja2VkPyAiIiIKLQl3aGljaCA9ICdpc2xrJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJsb2NrZWQgLSBJcyB0aGUgZGlzayBsb2NrZWQ/ICIiIgorICAgIHdoaWNoID0gJ2lzbGsnCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgY3JlYXRpb25fZGF0ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY3JlYXRpb24gZGF0ZSAtIHRoZSBjcmVhdGlvbiBkYXRlIG9mIGRpc2sgIiIiCi0Jd2hpY2ggPSAnYXNjZCcKLQl3YW50ID0gJ2xkdCAnCisgICAgIiIiY3JlYXRpb24gZGF0ZSAtIHRoZSBjcmVhdGlvbiBkYXRlIG9mIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnYXNjZCcKKyAgICB3YW50ID0gJ2xkdCAnCiBjbGFzcyBtb2RpZmljYXRpb25fZGF0ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIibW9kaWZpY2F0aW9uIGRhdGUgLSB0aGUgbW9kaWZpY2F0aW9uIGRhdGUgb2YgZGlzayAiIiIKLQl3aGljaCA9ICdhc21vJwotCXdhbnQgPSAnbGR0ICcKKyAgICAiIiJtb2RpZmljYXRpb24gZGF0ZSAtIHRoZSBtb2RpZmljYXRpb24gZGF0ZSBvZiBkaXNrICIiIgorICAgIHdoaWNoID0gJ2FzbW8nCisgICAgd2FudCA9ICdsZHQgJwogY2xhc3MgY3JjMzJfY2hlY2tzdW0oYWV0b29scy5OUHJvcGVydHkpOgotCSIiImNyYzMyIGNoZWNrc3VtIC0gdGhlIGNyYy0zMiBjaGVja3N1bSBvZiB0aGUgZGlzayAiIiIKLQl3aGljaCA9ICdYY3JjJwotCXdhbnQgPSAnVEVYVCcKKyAgICAiIiJjcmMzMiBjaGVja3N1bSAtIHRoZSBjcmMtMzIgY2hlY2tzdW0gb2YgdGhlIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnWGNyYycKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkaXNrIGNvcHkgNC4yIGNoZWNrc3VtIC0gdGhlIERpc2sgQ29weSA0LjIgY2hlY2tzdW0gb2YgdGhlIGRpc2sgIiIiCi0Jd2hpY2ggPSAnWGM0MicKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZGlzayBjb3B5IDQuMiBjaGVja3N1bSAtIHRoZSBEaXNrIENvcHkgNC4yIGNoZWNrc3VtIG9mIHRoZSBkaXNrICIiIgorICAgIHdoaWNoID0gJ1hjNDInCisgICAgd2FudCA9ICdURVhUJwogY2xhc3MgYmxvY2tfY291bnQoYWV0b29scy5OUHJvcGVydHkpOgotCSIiImJsb2NrIGNvdW50IC0gdGhlIG51bWJlciBvZiBibG9ja3Mgb24gZGlzayAiIiIKLQl3aGljaCA9ICdYYmxrJwotCXdhbnQgPSAnbG9uZycKKyAgICAiIiJibG9jayBjb3VudCAtIHRoZSBudW1iZXIgb2YgYmxvY2tzIG9uIGRpc2sgIiIiCisgICAgd2hpY2ggPSAnWGJsaycKKyAgICB3YW50ID0gJ2xvbmcnCiBjbGFzcyBmaWxlX3N5c3RlbShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZmlsZSBzeXN0ZW0gLSB0aGUgZmlsZSBzeXN0ZW0gdXNlZCBvbiBkaXNrICIiIgotCXdoaWNoID0gJ1hmc2knCi0Jd2FudCA9ICdURVhUJworICAgICIiImZpbGUgc3lzdGVtIC0gdGhlIGZpbGUgc3lzdGVtIHVzZWQgb24gZGlzayAiIiIKKyAgICB3aGljaCA9ICdYZnNpJworICAgIHdhbnQgPSAnVEVYVCcKIAogY2xhc3MgZm9sZGVyKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiZm9sZGVyIC0gQSBmb2xkZXIgb3IgZGlyZWN0b3J5IG9uIGEgZGlzayAiIiIKLQl3YW50ID0gJ0ZvbGQnCisgICAgIiIiZm9sZGVyIC0gQSBmb2xkZXIgb3IgZGlyZWN0b3J5IG9uIGEgZGlzayAiIiIKKyAgICB3YW50ID0gJ0ZvbGQnCiAKIG5hbWUgPSBuYW1lCiAKQEAgLTI0MSw4ICsyNDEsOCBAQAogbW9kaWZpY2F0aW9uX2RhdGUgPSBtb2RpZmljYXRpb25fZGF0ZQogCiBjbGFzcyBkaXNrX2ltYWdlKGFldG9vbHMuQ29tcG9uZW50SXRlbSk6Ci0JIiIiZGlzayBpbWFnZSAtIEEgZGlzayBpbWFnZSBmaWxlICIiIgotCXdhbnQgPSAnREltZycKKyAgICAiIiJkaXNrIGltYWdlIC0gQSBkaXNrIGltYWdlIGZpbGUgIiIiCisgICAgd2FudCA9ICdESW1nJwogCiBuYW1lID0gbmFtZQogCkBAIC0yNTQsMjkgKzI1NCwyOSBAQAogCiBtb2RpZmljYXRpb25fZGF0ZSA9IG1vZGlmaWNhdGlvbl9kYXRlCiBjbGFzcyBmaWxlX2Zvcm1hdChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZmlsZSBmb3JtYXQgLSB0aGUgZm9ybWF0IG9mIHRoZSBkaXNrIGltYWdlIGZpbGUgIiIiCi0Jd2hpY2ggPSAnSWZtdCcKLQl3YW50ID0gJ1RFWFQnCisgICAgIiIiZmlsZSBmb3JtYXQgLSB0aGUgZm9ybWF0IG9mIHRoZSBkaXNrIGltYWdlIGZpbGUgIiIiCisgICAgd2hpY2ggPSAnSWZtdCcKKyAgICB3YW50ID0gJ1RFWFQnCiBjbGFzcyBzaWduZWQoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInNpZ25lZCAtIERvZXMgdGhlIGRpc2sgaW1hZ2UgaGF2ZSBhIERpZ2lTaWdujiBzaWduYXR1cmU/ICIiIgotCXdoaWNoID0gJ0lzaW4nCi0Jd2FudCA9ICdib29sJworICAgICIiInNpZ25lZCAtIERvZXMgdGhlIGRpc2sgaW1hZ2UgaGF2ZSBhIERpZ2lTaWdujiBzaWduYXR1cmU/ICIiIgorICAgIHdoaWNoID0gJ0lzaW4nCisgICAgd2FudCA9ICdib29sJwogY2xhc3MgY29tcHJlc3NlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiY29tcHJlc3NlZCAtIElzIHRoZSBkaXNrIGltYWdlIGNvbXByZXNzZWQ/ICIiIgotCXdoaWNoID0gJ0ljb20nCi0Jd2FudCA9ICdib29sJworICAgICIiImNvbXByZXNzZWQgLSBJcyB0aGUgZGlzayBpbWFnZSBjb21wcmVzc2VkPyAiIiIKKyAgICB3aGljaCA9ICdJY29tJworICAgIHdhbnQgPSAnYm9vbCcKIGNsYXNzIHNlZ21lbnRlZChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIic2VnbWVudGVkIC0gSXMgdGhlIGRpc2sgaW1hZ2Ugc2VnbWVudGVkPyAiIiIKLQl3aGljaCA9ICdJc2VnJwotCXdhbnQgPSAnYm9vbCcKKyAgICAiIiJzZWdtZW50ZWQgLSBJcyB0aGUgZGlzayBpbWFnZSBzZWdtZW50ZWQ/ICIiIgorICAgIHdoaWNoID0gJ0lzZWcnCisgICAgd2FudCA9ICdib29sJwogY2xhc3Mgc2VnbWVudHMoYWV0b29scy5OUHJvcGVydHkpOgotCSIiInNlZ21lbnRzIC0gYSBsaXN0IG9mIHJlZmVyZW5jZXMgdG8gb3RoZXIgc2VnbWVudHMgdGhhdCBtYWtlIHVwIGEgY29tcGxldGUgaW1hZ2UgIiIiCi0Jd2hpY2ggPSAnSXNnIycKLQl3YW50ID0gJ2ZzcyAnCisgICAgIiIic2VnbWVudHMgLSBhIGxpc3Qgb2YgcmVmZXJlbmNlcyB0byBvdGhlciBzZWdtZW50cyB0aGF0IG1ha2UgdXAgYSBjb21wbGV0ZSBpbWFnZSAiIiIKKyAgICB3aGljaCA9ICdJc2cjJworICAgIHdhbnQgPSAnZnNzICcKIGNsYXNzIGRpc2tfbmFtZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIiZGlzayBuYW1lIC0gdGhlIG5hbWUgb2YgdGhlIGRpc2sgdGhpcyBpbWFnZSByZXByZXNlbnRzICIiIgotCXdoaWNoID0gJ0lkbm0nCi0Jd2FudCA9ICdURVhUJworICAgICIiImRpc2sgbmFtZSAtIHRoZSBuYW1lIG9mIHRoZSBkaXNrIHRoaXMgaW1hZ2UgcmVwcmVzZW50cyAiIiIKKyAgICB3aGljaCA9ICdJZG5tJworICAgIHdhbnQgPSAnVEVYVCcKIAogY3JjMzJfY2hlY2tzdW0gPSBjcmMzMl9jaGVja3N1bQogCkBAIC0yODYsMTI0ICsyODYsMTI0IEBACiAKIGZpbGVfc3lzdGVtID0gZmlsZV9zeXN0ZW0KIGNsYXNzIGRhdGFfZm9ya19zaXplKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJkYXRhIGZvcmsgc2l6ZSAtIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGRhdGEgZm9yayBvZiB0aGUgZGlzayBpbWFnZSAiIiIKLQl3aGljaCA9ICdJZGZrJwotCXdhbnQgPSAnbG9uZycKKyAgICAiIiJkYXRhIGZvcmsgc2l6ZSAtIHRoZSBzaXplIChpbiBieXRlcykgb2YgdGhlIGRhdGEgZm9yayBvZiB0aGUgZGlzayBpbWFnZSAiIiIKKyAgICB3aGljaCA9ICdJZGZrJworICAgIHdhbnQgPSAnbG9uZycKIGNsYXNzIHJlc291cmNlX2Zvcmtfc2l6ZShhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIicmVzb3VyY2UgZm9yayBzaXplIC0gdGhlIHNpemUgKGluIGJ5dGVzKSBvZiB0aGUgcmVzb3VyY2UgZm9yayBvZiB0aGUgZGlzayBpbWFnZSAiIiIKLQl3aGljaCA9ICdJcmZrJwotCXdhbnQgPSAnbG9uZycKKyAgICAiIiJyZXNvdXJjZSBmb3JrIHNpemUgLSB0aGUgc2l6ZSAoaW4gYnl0ZXMpIG9mIHRoZSByZXNvdXJjZSBmb3JrIG9mIHRoZSBkaXNrIGltYWdlICIiIgorICAgIHdoaWNoID0gJ0lyZmsnCisgICAgd2FudCA9ICdsb25nJwogCiBjbGFzcyBTYXZlX3JlcGx5X3JlY29yZChhZXRvb2xzLkNvbXBvbmVudEl0ZW0pOgotCSIiIlNhdmUgcmVwbHkgcmVjb3JkIC0gUmVzdWx0IGZyb20gdGhlIHNhdmUgb3BlcmF0aW9uICIiIgotCXdhbnQgPSAnY3B5UicKKyAgICAiIiJTYXZlIHJlcGx5IHJlY29yZCAtIFJlc3VsdCBmcm9tIHRoZSBzYXZlIG9wZXJhdGlvbiAiIiIKKyAgICB3YW50ID0gJ2NweVInCiBjbGFzcyByZXN1bHRpbmdfdGFyZ2V0X29iamVjdChhZXRvb2xzLk5Qcm9wZXJ0eSk6Ci0JIiIicmVzdWx0aW5nIHRhcmdldCBvYmplY3QgLSBhIHJlZmVyZW5jZSB0byB0aGUgdGFyZ2V0IG9iamVjdCBhZnRlciBpdCBoYXMgYmVlbiBzYXZlZCAiIiIKLQl3aGljaCA9ICdyY3BPJwotCXdhbnQgPSAnb2JqICcKKyAgICAiIiJyZXN1bHRpbmcgdGFyZ2V0IG9iamVjdCAtIGEgcmVmZXJlbmNlIHRvIHRoZSB0YXJnZXQgb2JqZWN0IGFmdGVyIGl0IGhhcyBiZWVuIHNhdmVkICIiIgorICAgIHdoaWNoID0gJ3JjcE8nCisgICAgd2FudCA9ICdvYmogJwogY2xhc3MgY29weV90eXBlKGFldG9vbHMuTlByb3BlcnR5KToKLQkiIiJjb3B5IHR5cGUgLSB0aGUgd2F5IGluIHdoaWNoIHRoZSB0YXJnZXQgb2JqZWN0IHdhcyBzYXZlZCAiIiIKLQl3aGljaCA9ICdyY3BUJwotCXdhbnQgPSAncmNwVCcKKyAgICAiIiJjb3B5IHR5cGUgLSB0aGUgd2F5IGluIHdoaWNoIHRoZSB0YXJnZXQgb2JqZWN0IHdhcyBzYXZlZCAiIiIKKyAgICB3aGljaCA9ICdyY3BUJworICAgIHdhbnQgPSAncmNwVCcKIGFwcGxpY2F0aW9uLl9wcm9wZGljdCA9IHsKLQkndmVyc2lvbicgOiB2ZXJzaW9uLAotCSduYW1lJyA6IG5hbWUsCi0JJ2NvbW1lbnQnIDogY29tbWVudCwKLQknZHJpdmVyX3ZlcnNpb24nIDogZHJpdmVyX3ZlcnNpb24sCi0JJ25vbmVqZWN0YWJsZV9tb2RlJyA6IG5vbmVqZWN0YWJsZV9tb2RlLAotCSdzYXZlX2xvZ19maWxlJyA6IHNhdmVfbG9nX2ZpbGUsCi0JJ3VzZV9zcGVlY2gnIDogdXNlX3NwZWVjaCwKLQknc21hcnRfU2F2ZV9BcycgOiBzbWFydF9TYXZlX0FzLAotCSdjaGVja3N1bV92ZXJpZmljYXRpb24nIDogY2hlY2tzdW1fdmVyaWZpY2F0aW9uLAotCSdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6IHNpZ25hdHVyZV92ZXJpZmljYXRpb24sCi0JJ2V4Y2x1ZGVfRGlza1NjcmlwdHMnIDogZXhjbHVkZV9EaXNrU2NyaXB0cywKLQknZXhjbHVkZV9yZW1vdGVfaW1hZ2VzJyA6IGV4Y2x1ZGVfcmVtb3RlX2ltYWdlcywKLQknaW1hZ2Vfc2lnbmluZycgOiBpbWFnZV9zaWduaW5nLAotCSdsZWF2ZV9pbWFnZV9tb3VudGVkJyA6IGxlYXZlX2ltYWdlX21vdW50ZWQsCi0JJ2VyYXNlX2NvbmZpcm1hdGlvbicgOiBlcmFzZV9jb25maXJtYXRpb24sCi0JJ3plcm9pbmcnIDogemVyb2luZywKLQknZGVmYXVsdF9jcmVhdGVfc2l6ZScgOiBkZWZhdWx0X2NyZWF0ZV9zaXplLAotCSdkZWZhdWx0X2NyZWF0ZV9uYW1lJyA6IGRlZmF1bHRfY3JlYXRlX25hbWUsCi0JJ21ha2VfbXVsdGlwbGVfZmxvcHBpZXMnIDogbWFrZV9tdWx0aXBsZV9mbG9wcGllcywKLQknYXV0b19pbWFnZV91cG9uX2luc2VydCcgOiBhdXRvX2ltYWdlX3Vwb25faW5zZXJ0LAotCSdlamVjdF9hZnRlcl9hdXRvX2ltYWdlJyA6IGVqZWN0X2FmdGVyX2F1dG9faW1hZ2UsCi0JJ2F1dG9fY29weV91cG9uX2Zsb3BweV9pbnNlcnQnIDogYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydCwKLQkndm9sdW1lX3N1ZmZpeCcgOiB2b2x1bWVfc3VmZml4LAotCSdpbWFnZV9zdWZmaXgnIDogaW1hZ2Vfc3VmZml4LAotCSdkZWZhdWx0X2ZpbGVfc3lzdGVtJyA6IGRlZmF1bHRfZmlsZV9zeXN0ZW0sCi0JJ2RlZmF1bHRfaW1hZ2VfZm9ybWF0JyA6IGRlZmF1bHRfaW1hZ2VfZm9ybWF0LAorICAgICAgICAndmVyc2lvbicgOiB2ZXJzaW9uLAorICAgICAgICAnbmFtZScgOiBuYW1lLAorICAgICAgICAnY29tbWVudCcgOiBjb21tZW50LAorICAgICAgICAnZHJpdmVyX3ZlcnNpb24nIDogZHJpdmVyX3ZlcnNpb24sCisgICAgICAgICdub25lamVjdGFibGVfbW9kZScgOiBub25lamVjdGFibGVfbW9kZSwKKyAgICAgICAgJ3NhdmVfbG9nX2ZpbGUnIDogc2F2ZV9sb2dfZmlsZSwKKyAgICAgICAgJ3VzZV9zcGVlY2gnIDogdXNlX3NwZWVjaCwKKyAgICAgICAgJ3NtYXJ0X1NhdmVfQXMnIDogc21hcnRfU2F2ZV9BcywKKyAgICAgICAgJ2NoZWNrc3VtX3ZlcmlmaWNhdGlvbicgOiBjaGVja3N1bV92ZXJpZmljYXRpb24sCisgICAgICAgICdzaWduYXR1cmVfdmVyaWZpY2F0aW9uJyA6IHNpZ25hdHVyZV92ZXJpZmljYXRpb24sCisgICAgICAgICdleGNsdWRlX0Rpc2tTY3JpcHRzJyA6IGV4Y2x1ZGVfRGlza1NjcmlwdHMsCisgICAgICAgICdleGNsdWRlX3JlbW90ZV9pbWFnZXMnIDogZXhjbHVkZV9yZW1vdGVfaW1hZ2VzLAorICAgICAgICAnaW1hZ2Vfc2lnbmluZycgOiBpbWFnZV9zaWduaW5nLAorICAgICAgICAnbGVhdmVfaW1hZ2VfbW91bnRlZCcgOiBsZWF2ZV9pbWFnZV9tb3VudGVkLAorICAgICAgICAnZXJhc2VfY29uZmlybWF0aW9uJyA6IGVyYXNlX2NvbmZpcm1hdGlvbiwKKyAgICAgICAgJ3plcm9pbmcnIDogemVyb2luZywKKyAgICAgICAgJ2RlZmF1bHRfY3JlYXRlX3NpemUnIDogZGVmYXVsdF9jcmVhdGVfc2l6ZSwKKyAgICAgICAgJ2RlZmF1bHRfY3JlYXRlX25hbWUnIDogZGVmYXVsdF9jcmVhdGVfbmFtZSwKKyAgICAgICAgJ21ha2VfbXVsdGlwbGVfZmxvcHBpZXMnIDogbWFrZV9tdWx0aXBsZV9mbG9wcGllcywKKyAgICAgICAgJ2F1dG9faW1hZ2VfdXBvbl9pbnNlcnQnIDogYXV0b19pbWFnZV91cG9uX2luc2VydCwKKyAgICAgICAgJ2VqZWN0X2FmdGVyX2F1dG9faW1hZ2UnIDogZWplY3RfYWZ0ZXJfYXV0b19pbWFnZSwKKyAgICAgICAgJ2F1dG9fY29weV91cG9uX2Zsb3BweV9pbnNlcnQnIDogYXV0b19jb3B5X3Vwb25fZmxvcHB5X2luc2VydCwKKyAgICAgICAgJ3ZvbHVtZV9zdWZmaXgnIDogdm9sdW1lX3N1ZmZpeCwKKyAgICAgICAgJ2ltYWdlX3N1ZmZpeCcgOiBpbWFnZV9zdWZmaXgsCisgICAgICAgICdkZWZhdWx0X2ZpbGVfc3lzdGVtJyA6IGRlZmF1bHRfZmlsZV9zeXN0ZW0sCisgICAgICAgICdkZWZhdWx0X2ltYWdlX2Zvcm1hdCcgOiBkZWZhdWx0X2ltYWdlX2Zvcm1hdCwKIH0KIGFwcGxpY2F0aW9uLl9lbGVtZGljdCA9IHsKIH0KIGRpc2suX3Byb3BkaWN0ID0gewotCSduYW1lJyA6IG5hbWUsCi0JJ2NvbW1lbnQnIDogY29tbWVudCwKLQknbG9ja2VkJyA6IGxvY2tlZCwKLQknY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAotCSdtb2RpZmljYXRpb25fZGF0ZScgOiBtb2RpZmljYXRpb25fZGF0ZSwKLQknY3JjMzJfY2hlY2tzdW0nIDogY3JjMzJfY2hlY2tzdW0sCi0JJ2Rpc2tfY29weV80XzJlXzJfY2hlY2tzdW0nIDogZGlza19jb3B5XzRfMmVfMl9jaGVja3N1bSwKLQknYmxvY2tfY291bnQnIDogYmxvY2tfY291bnQsCi0JJ2ZpbGVfc3lzdGVtJyA6IGZpbGVfc3lzdGVtLAorICAgICAgICAnbmFtZScgOiBuYW1lLAorICAgICAgICAnY29tbWVudCcgOiBjb21tZW50LAorICAgICAgICAnbG9ja2VkJyA6IGxvY2tlZCwKKyAgICAgICAgJ2NyZWF0aW9uX2RhdGUnIDogY3JlYXRpb25fZGF0ZSwKKyAgICAgICAgJ21vZGlmaWNhdGlvbl9kYXRlJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAorICAgICAgICAnY3JjMzJfY2hlY2tzdW0nIDogY3JjMzJfY2hlY2tzdW0sCisgICAgICAgICdkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtJyA6IGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0sCisgICAgICAgICdibG9ja19jb3VudCcgOiBibG9ja19jb3VudCwKKyAgICAgICAgJ2ZpbGVfc3lzdGVtJyA6IGZpbGVfc3lzdGVtLAogfQogZGlzay5fZWxlbWRpY3QgPSB7CiB9CiBmb2xkZXIuX3Byb3BkaWN0ID0gewotCSduYW1lJyA6IG5hbWUsCi0JJ2NvbW1lbnQnIDogY29tbWVudCwKLQknY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAotCSdtb2RpZmljYXRpb25fZGF0ZScgOiBtb2RpZmljYXRpb25fZGF0ZSwKKyAgICAgICAgJ25hbWUnIDogbmFtZSwKKyAgICAgICAgJ2NvbW1lbnQnIDogY29tbWVudCwKKyAgICAgICAgJ2NyZWF0aW9uX2RhdGUnIDogY3JlYXRpb25fZGF0ZSwKKyAgICAgICAgJ21vZGlmaWNhdGlvbl9kYXRlJyA6IG1vZGlmaWNhdGlvbl9kYXRlLAogfQogZm9sZGVyLl9lbGVtZGljdCA9IHsKIH0KIGRpc2tfaW1hZ2UuX3Byb3BkaWN0ID0gewotCSduYW1lJyA6IG5hbWUsCi0JJ2NvbW1lbnQnIDogY29tbWVudCwKLQknbG9ja2VkJyA6IGxvY2tlZCwKLQknY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAotCSdtb2RpZmljYXRpb25fZGF0ZScgOiBtb2RpZmljYXRpb25fZGF0ZSwKLQknZmlsZV9mb3JtYXQnIDogZmlsZV9mb3JtYXQsCi0JJ3NpZ25lZCcgOiBzaWduZWQsCi0JJ2NvbXByZXNzZWQnIDogY29tcHJlc3NlZCwKLQknc2VnbWVudGVkJyA6IHNlZ21lbnRlZCwKLQknc2VnbWVudHMnIDogc2VnbWVudHMsCi0JJ2Rpc2tfbmFtZScgOiBkaXNrX25hbWUsCi0JJ2NyYzMyX2NoZWNrc3VtJyA6IGNyYzMyX2NoZWNrc3VtLAotCSdkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtJyA6IGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0sCi0JJ2Jsb2NrX2NvdW50JyA6IGJsb2NrX2NvdW50LAotCSdmaWxlX3N5c3RlbScgOiBmaWxlX3N5c3RlbSwKLQknZGF0YV9mb3JrX3NpemUnIDogZGF0YV9mb3JrX3NpemUsCi0JJ3Jlc291cmNlX2Zvcmtfc2l6ZScgOiByZXNvdXJjZV9mb3JrX3NpemUsCisgICAgICAgICduYW1lJyA6IG5hbWUsCisgICAgICAgICdjb21tZW50JyA6IGNvbW1lbnQsCisgICAgICAgICdsb2NrZWQnIDogbG9ja2VkLAorICAgICAgICAnY3JlYXRpb25fZGF0ZScgOiBjcmVhdGlvbl9kYXRlLAorICAgICAgICAnbW9kaWZpY2F0aW9uX2RhdGUnIDogbW9kaWZpY2F0aW9uX2RhdGUsCisgICAgICAgICdmaWxlX2Zvcm1hdCcgOiBmaWxlX2Zvcm1hdCwKKyAgICAgICAgJ3NpZ25lZCcgOiBzaWduZWQsCisgICAgICAgICdjb21wcmVzc2VkJyA6IGNvbXByZXNzZWQsCisgICAgICAgICdzZWdtZW50ZWQnIDogc2VnbWVudGVkLAorICAgICAgICAnc2VnbWVudHMnIDogc2VnbWVudHMsCisgICAgICAgICdkaXNrX25hbWUnIDogZGlza19uYW1lLAorICAgICAgICAnY3JjMzJfY2hlY2tzdW0nIDogY3JjMzJfY2hlY2tzdW0sCisgICAgICAgICdkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtJyA6IGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0sCisgICAgICAgICdibG9ja19jb3VudCcgOiBibG9ja19jb3VudCwKKyAgICAgICAgJ2ZpbGVfc3lzdGVtJyA6IGZpbGVfc3lzdGVtLAorICAgICAgICAnZGF0YV9mb3JrX3NpemUnIDogZGF0YV9mb3JrX3NpemUsCisgICAgICAgICdyZXNvdXJjZV9mb3JrX3NpemUnIDogcmVzb3VyY2VfZm9ya19zaXplLAogfQogZGlza19pbWFnZS5fZWxlbWRpY3QgPSB7CiB9CiBTYXZlX3JlcGx5X3JlY29yZC5fcHJvcGRpY3QgPSB7Ci0JJ3Jlc3VsdGluZ190YXJnZXRfb2JqZWN0JyA6IHJlc3VsdGluZ190YXJnZXRfb2JqZWN0LAotCSdjb3B5X3R5cGUnIDogY29weV90eXBlLAorICAgICAgICAncmVzdWx0aW5nX3RhcmdldF9vYmplY3QnIDogcmVzdWx0aW5nX3RhcmdldF9vYmplY3QsCisgICAgICAgICdjb3B5X3R5cGUnIDogY29weV90eXBlLAogfQogU2F2ZV9yZXBseV9yZWNvcmQuX2VsZW1kaWN0ID0gewogfQogX0VudW1fVUlBYyA9IHsKLQknbmV2ZXJfaW50ZXJhY3QnIDogJ2VOdnInLAkjIERvbtV0IGFsbG93IGFueSBpbnRlcmFjdGlvbiBhdCBhbGwKLQknaW50ZXJhY3Rfd2l0aF9zZWxmJyA6ICdlSW5TJywJIyBPbmx5IGFsbG93IGludGVyYWN0aW9uIGZyb20gaW50ZXJuYWwgZXZlbnRzCi0JJ2ludGVyYWN0X3dpdGhfbG9jYWwnIDogJ2VJbkwnLAkjIEFsbG93IGludGVyYWN0aW9uIGZyb20gYW55IGV2ZW50IG9yaWdpbmF0aW5nIG9uIHRoaXMgbWFjaGluZQotCSdpbnRlcmFjdF93aXRoX2FsbCcgOiAnZUluQScsCSMgQWxsb3cgaW50ZXJhY3Rpb24gZnJvbSBuZXR3b3JrIGV2ZW50cworICAgICAgICAnbmV2ZXJfaW50ZXJhY3QnIDogJ2VOdnInLCAgICAgICMgRG9u1XQgYWxsb3cgYW55IGludGVyYWN0aW9uIGF0IGFsbAorICAgICAgICAnaW50ZXJhY3Rfd2l0aF9zZWxmJyA6ICdlSW5TJywgICMgT25seSBhbGxvdyBpbnRlcmFjdGlvbiBmcm9tIGludGVybmFsIGV2ZW50cworICAgICAgICAnaW50ZXJhY3Rfd2l0aF9sb2NhbCcgOiAnZUluTCcsICMgQWxsb3cgaW50ZXJhY3Rpb24gZnJvbSBhbnkgZXZlbnQgb3JpZ2luYXRpbmcgb24gdGhpcyBtYWNoaW5lCisgICAgICAgICdpbnRlcmFjdF93aXRoX2FsbCcgOiAnZUluQScsICAgIyBBbGxvdyBpbnRlcmFjdGlvbiBmcm9tIG5ldHdvcmsgZXZlbnRzCiB9CiAKIF9FbnVtX1N2QXMgPSB7Ci0JJ05ESUZfUlcnIDogJ1JkV3InLAkjIHJlYWQvd3JpdGUgTkRJRiBkaXNrIGltYWdlCi0JJ05ESUZfUk8nIDogJ1JkeHgnLAkjIHJlYWQtb25seSBORElGIGRpc2sgaW1hZ2UKLQknTkRJRl9Db21wcmVzc2VkJyA6ICdST0NvJywJIyBjb21wcmVzc2VkIE5ESUYgZGlzayBpbWFnZQotCSdEaXNrX0NvcHlfNF8yZV8yJyA6ICdEQzQyJywJIyBEaXNrIENvcHkgNC4yIGRpc2sgaW1hZ2UKKyAgICAgICAgJ05ESUZfUlcnIDogJ1JkV3InLCAgICAgIyByZWFkL3dyaXRlIE5ESUYgZGlzayBpbWFnZQorICAgICAgICAnTkRJRl9STycgOiAnUmR4eCcsICAgICAjIHJlYWQtb25seSBORElGIGRpc2sgaW1hZ2UKKyAgICAgICAgJ05ESUZfQ29tcHJlc3NlZCcgOiAnUk9DbycsICAgICAjIGNvbXByZXNzZWQgTkRJRiBkaXNrIGltYWdlCisgICAgICAgICdEaXNrX0NvcHlfNF8yZV8yJyA6ICdEQzQyJywgICAgIyBEaXNrIENvcHkgNC4yIGRpc2sgaW1hZ2UKIH0KIAogX0VudW1fcmNwVCA9IHsKLQknYmxvY2tfZGlza19jb3B5JyA6ICdjcEJsJywJIyBibG9jay1ieS1ibG9jayBkaXNrLWxldmVsIGNvcHkKLQknZmlsZXNfYW5kX2ZpbGVfSURfY29weScgOiAnY3BJRCcsCSMgYWxsIGZpbGVzIGluY2x1ZGluZyBkZXNrdG9wIGRhdGFiYXNlcyBhbmQgZmlsZSBJRNVzCi0JJ2ZpbGVzX2FuZF9kZXNrdG9wX2luZm8nIDogJ2NwRFQnLAkjIGFsbCBmaWxlcyBhbmQgbW9zdCBkZXNrdG9wIGluZm9ybWF0aW9uCi0JJ2ZpbGVzX29ubHknIDogJ2NwRkknLAkjIGFsbCBmaWxlcyBidXQgbm8gZGVza3RvcCBpbmZvcm1hdGlvbgotCSdkaXNrX2ltYWdlX2NvbnZlcnNpb24nIDogJ2NwQ1YnLAkjIGRpc2sgaW1hZ2UgZm9ybWF0IGNvbnZlcnNpb24KLQknZGlza19pbWFnZV9jcmVhdGlvbicgOiAnY3BDUicsCSMgZGlzayBpbWFnZSBjcmVhdGlvbgorICAgICAgICAnYmxvY2tfZGlza19jb3B5JyA6ICdjcEJsJywgICAgICMgYmxvY2stYnktYmxvY2sgZGlzay1sZXZlbCBjb3B5CisgICAgICAgICdmaWxlc19hbmRfZmlsZV9JRF9jb3B5JyA6ICdjcElEJywgICAgICAjIGFsbCBmaWxlcyBpbmNsdWRpbmcgZGVza3RvcCBkYXRhYmFzZXMgYW5kIGZpbGUgSUTVcworICAgICAgICAnZmlsZXNfYW5kX2Rlc2t0b3BfaW5mbycgOiAnY3BEVCcsICAgICAgIyBhbGwgZmlsZXMgYW5kIG1vc3QgZGVza3RvcCBpbmZvcm1hdGlvbgorICAgICAgICAnZmlsZXNfb25seScgOiAnY3BGSScsICAjIGFsbCBmaWxlcyBidXQgbm8gZGVza3RvcCBpbmZvcm1hdGlvbgorICAgICAgICAnZGlza19pbWFnZV9jb252ZXJzaW9uJyA6ICdjcENWJywgICAgICAgIyBkaXNrIGltYWdlIGZvcm1hdCBjb252ZXJzaW9uCisgICAgICAgICdkaXNrX2ltYWdlX2NyZWF0aW9uJyA6ICdjcENSJywgIyBkaXNrIGltYWdlIGNyZWF0aW9uCiB9CiAKIF9FbnVtX2xvbmcgPSBOb25lICMgWFhYWCBlbnVtIGxvbmcgbm90IGZvdW5kISEKQEAgLTQxNCw2NCArNDE0LDY0IEBACiAjIEluZGljZXMgb2YgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBtb2R1bGUKICMKIF9jbGFzc2RlY2xhcmF0aW9ucyA9IHsKLQknREltZycgOiBkaXNrX2ltYWdlLAotCSdjYXBwJyA6IGFwcGxpY2F0aW9uLAotCSdEaXNrJyA6IGRpc2ssCi0JJ0ZvbGQnIDogZm9sZGVyLAotCSdjcHlSJyA6IFNhdmVfcmVwbHlfcmVjb3JkLAorICAgICAgICAnREltZycgOiBkaXNrX2ltYWdlLAorICAgICAgICAnY2FwcCcgOiBhcHBsaWNhdGlvbiwKKyAgICAgICAgJ0Rpc2snIDogZGlzaywKKyAgICAgICAgJ0ZvbGQnIDogZm9sZGVyLAorICAgICAgICAnY3B5UicgOiBTYXZlX3JlcGx5X3JlY29yZCwKIH0KIAogX3Byb3BkZWNsYXJhdGlvbnMgPSB7Ci0JJ1hjcmMnIDogY3JjMzJfY2hlY2tzdW0sCi0JJ1BEZVMnIDogZGVmYXVsdF9jcmVhdGVfc2l6ZSwKLQknSWRubScgOiBkaXNrX25hbWUsCi0JJ1BTU1AnIDogc21hcnRfU2F2ZV9BcywKLQknUGNwZicgOiBhdXRvX2NvcHlfdXBvbl9mbG9wcHlfaW5zZXJ0LAotCSdwbmFtJyA6IG5hbWUsCi0JJ0lzaW4nIDogc2lnbmVkLAotCSdvdHRvJyA6IG5vbmVqZWN0YWJsZV9tb2RlLAotCSdQRXhEJyA6IGV4Y2x1ZGVfRGlza1NjcmlwdHMsCi0JJ0lzZWcnIDogc2VnbWVudGVkLAotCSdpc2xrJyA6IGxvY2tlZCwKLQknYXNtbycgOiBtb2RpZmljYXRpb25fZGF0ZSwKLQknUFRsaycgOiB1c2Vfc3BlZWNoLAotCSdQZnN5JyA6IGRlZmF1bHRfZmlsZV9zeXN0ZW0sCi0JJ1BWZUMnIDogY2hlY2tzdW1fdmVyaWZpY2F0aW9uLAotCSdYYzQyJyA6IGRpc2tfY29weV80XzJlXzJfY2hlY2tzdW0sCi0JJ3JjcE8nIDogcmVzdWx0aW5nX3RhcmdldF9vYmplY3QsCi0JJ1BhaW0nIDogYXV0b19pbWFnZV91cG9uX2luc2VydCwKLQknY29tdCcgOiBjb21tZW50LAotCSdQQ29FJyA6IGVyYXNlX2NvbmZpcm1hdGlvbiwKLQknZFZlcicgOiBkcml2ZXJfdmVyc2lvbiwKLQknUERlTicgOiBkZWZhdWx0X2NyZWF0ZV9uYW1lLAotCSdQQnVNJyA6IG1ha2VfbXVsdGlwbGVfZmxvcHBpZXMsCi0JJ3JjcFQnIDogY29weV90eXBlLAotCSdQRGlFJyA6IHZvbHVtZV9zdWZmaXgsCi0JJ0lmbXQnIDogZmlsZV9mb3JtYXQsCi0JJ1BkZm0nIDogZGVmYXVsdF9pbWFnZV9mb3JtYXQsCi0JJ2FzY2QnIDogY3JlYXRpb25fZGF0ZSwKLQknUGVqYycgOiBlamVjdF9hZnRlcl9hdXRvX2ltYWdlLAotCSdQWmVCJyA6IHplcm9pbmcsCi0JJ1BFeFInIDogZXhjbHVkZV9yZW1vdGVfaW1hZ2VzLAotCSdQSW1FJyA6IGltYWdlX3N1ZmZpeCwKLQknUFZlUycgOiBzaWduYXR1cmVfdmVyaWZpY2F0aW9uLAotCSdQU2FMJyA6IHNhdmVfbG9nX2ZpbGUsCi0JJ1hibGsnIDogYmxvY2tfY291bnQsCi0JJ1BNb0EnIDogbGVhdmVfaW1hZ2VfbW91bnRlZCwKLQknSXNnIycgOiBzZWdtZW50cywKLQknSXJmaycgOiByZXNvdXJjZV9mb3JrX3NpemUsCi0JJ0ljb20nIDogY29tcHJlc3NlZCwKLQknWGZzaScgOiBmaWxlX3N5c3RlbSwKLQknSWRmaycgOiBkYXRhX2Zvcmtfc2l6ZSwKLQkndmVycycgOiB2ZXJzaW9uLAotCSdQU2lJJyA6IGltYWdlX3NpZ25pbmcsCisgICAgICAgICdYY3JjJyA6IGNyYzMyX2NoZWNrc3VtLAorICAgICAgICAnUERlUycgOiBkZWZhdWx0X2NyZWF0ZV9zaXplLAorICAgICAgICAnSWRubScgOiBkaXNrX25hbWUsCisgICAgICAgICdQU1NQJyA6IHNtYXJ0X1NhdmVfQXMsCisgICAgICAgICdQY3BmJyA6IGF1dG9fY29weV91cG9uX2Zsb3BweV9pbnNlcnQsCisgICAgICAgICdwbmFtJyA6IG5hbWUsCisgICAgICAgICdJc2luJyA6IHNpZ25lZCwKKyAgICAgICAgJ290dG8nIDogbm9uZWplY3RhYmxlX21vZGUsCisgICAgICAgICdQRXhEJyA6IGV4Y2x1ZGVfRGlza1NjcmlwdHMsCisgICAgICAgICdJc2VnJyA6IHNlZ21lbnRlZCwKKyAgICAgICAgJ2lzbGsnIDogbG9ja2VkLAorICAgICAgICAnYXNtbycgOiBtb2RpZmljYXRpb25fZGF0ZSwKKyAgICAgICAgJ1BUbGsnIDogdXNlX3NwZWVjaCwKKyAgICAgICAgJ1Bmc3knIDogZGVmYXVsdF9maWxlX3N5c3RlbSwKKyAgICAgICAgJ1BWZUMnIDogY2hlY2tzdW1fdmVyaWZpY2F0aW9uLAorICAgICAgICAnWGM0MicgOiBkaXNrX2NvcHlfNF8yZV8yX2NoZWNrc3VtLAorICAgICAgICAncmNwTycgOiByZXN1bHRpbmdfdGFyZ2V0X29iamVjdCwKKyAgICAgICAgJ1BhaW0nIDogYXV0b19pbWFnZV91cG9uX2luc2VydCwKKyAgICAgICAgJ2NvbXQnIDogY29tbWVudCwKKyAgICAgICAgJ1BDb0UnIDogZXJhc2VfY29uZmlybWF0aW9uLAorICAgICAgICAnZFZlcicgOiBkcml2ZXJfdmVyc2lvbiwKKyAgICAgICAgJ1BEZU4nIDogZGVmYXVsdF9jcmVhdGVfbmFtZSwKKyAgICAgICAgJ1BCdU0nIDogbWFrZV9tdWx0aXBsZV9mbG9wcGllcywKKyAgICAgICAgJ3JjcFQnIDogY29weV90eXBlLAorICAgICAgICAnUERpRScgOiB2b2x1bWVfc3VmZml4LAorICAgICAgICAnSWZtdCcgOiBmaWxlX2Zvcm1hdCwKKyAgICAgICAgJ1BkZm0nIDogZGVmYXVsdF9pbWFnZV9mb3JtYXQsCisgICAgICAgICdhc2NkJyA6IGNyZWF0aW9uX2RhdGUsCisgICAgICAgICdQZWpjJyA6IGVqZWN0X2FmdGVyX2F1dG9faW1hZ2UsCisgICAgICAgICdQWmVCJyA6IHplcm9pbmcsCisgICAgICAgICdQRXhSJyA6IGV4Y2x1ZGVfcmVtb3RlX2ltYWdlcywKKyAgICAgICAgJ1BJbUUnIDogaW1hZ2Vfc3VmZml4LAorICAgICAgICAnUFZlUycgOiBzaWduYXR1cmVfdmVyaWZpY2F0aW9uLAorICAgICAgICAnUFNhTCcgOiBzYXZlX2xvZ19maWxlLAorICAgICAgICAnWGJsaycgOiBibG9ja19jb3VudCwKKyAgICAgICAgJ1BNb0EnIDogbGVhdmVfaW1hZ2VfbW91bnRlZCwKKyAgICAgICAgJ0lzZyMnIDogc2VnbWVudHMsCisgICAgICAgICdJcmZrJyA6IHJlc291cmNlX2Zvcmtfc2l6ZSwKKyAgICAgICAgJ0ljb20nIDogY29tcHJlc3NlZCwKKyAgICAgICAgJ1hmc2knIDogZmlsZV9zeXN0ZW0sCisgICAgICAgICdJZGZrJyA6IGRhdGFfZm9ya19zaXplLAorICAgICAgICAndmVycycgOiB2ZXJzaW9uLAorICAgICAgICAnUFNpSScgOiBpbWFnZV9zaWduaW5nLAogfQogCiBfY29tcGRlY2xhcmF0aW9ucyA9IHsKIH0KIAogX2VudW1kZWNsYXJhdGlvbnMgPSB7Ci0JJ1N2QXMnIDogX0VudW1fU3ZBcywKLQknVUlBYycgOiBfRW51bV9VSUFjLAotCSdyY3BUJyA6IF9FbnVtX3JjcFQsCisgICAgICAgICdTdkFzJyA6IF9FbnVtX1N2QXMsCisgICAgICAgICdVSUFjJyA6IF9FbnVtX1VJQWMsCisgICAgICAgICdyY3BUJyA6IF9FbnVtX3JjcFQsCiB9CmRpZmYgLS1naXQgYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvVXRpbGl0eV9FdmVudHMucHkgYi9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvVXRpbGl0eV9FdmVudHMucHkKaW5kZXggZWRhYzhmNC4uMTcyYjQwOCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L1V0aWxpdHlfRXZlbnRzLnB5CisrKyBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9VdGlsaXR5X0V2ZW50cy5weQpAQCAtMTIsMTg3ICsxMiwxODcgQEAKIAogY2xhc3MgVXRpbGl0eV9FdmVudHNfRXZlbnRzOgogCi0JX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZSA9IHsKLQkJJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKLQl9CisgICAgX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZSA9IHsKKyAgICAgICAgICAgICd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCisgICAgfQogCi0JZGVmIHNlbGVjdF9kaXNrX2ltYWdlKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBkaXNrIGltYWdlOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlzayBpbWFnZQotCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBhIGRpc2sgaW1hZ2UKLQkJIiIiCi0JCV9jb2RlID0gJ1VUSUwnCi0JCV9zdWJjb2RlID0gJ1NFTDEnCisgICAgZGVmIHNlbGVjdF9kaXNrX2ltYWdlKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlbGVjdCBkaXNrIGltYWdlOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlzayBpbWFnZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBhIGRpc2sgaW1hZ2UKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ1NFTDEnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Rpc2tfaW1hZ2UpCi0JCWlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Rpc2tfaW1hZ2UpCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWxlY3RfRGlza1NjcmlwdCA9IHsKLQkJJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKLQl9CisgICAgX2FyZ21hcF9zZWxlY3RfRGlza1NjcmlwdCA9IHsKKyAgICAgICAgICAgICd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCisgICAgfQogCi0JZGVmIHNlbGVjdF9EaXNrU2NyaXB0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBEaXNrU2NyaXB0OiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgRGlza1NjcmlwdAotCQlLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQlSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBhIERpc2tTY3JpcHQKLQkJIiIiCi0JCV9jb2RlID0gJ1VUSUwnCi0JCV9zdWJjb2RlID0gJ1NFTDInCisgICAgZGVmIHNlbGVjdF9EaXNrU2NyaXB0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlbGVjdCBEaXNrU2NyaXB0OiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgRGlza1NjcmlwdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBhIERpc2tTY3JpcHQKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ1NFTDInCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X0Rpc2tTY3JpcHQpCi0JCWlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X0Rpc2tTY3JpcHQpCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZV9vcl9EaXNrU2NyaXB0ID0gewotCQknd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAotCX0KKyAgICBfYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQgPSB7CisgICAgICAgICAgICAnd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAorICAgIH0KIAotCWRlZiBzZWxlY3RfZGlza19pbWFnZV9vcl9EaXNrU2NyaXB0KHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBkaXNrIGltYWdlIG9yIERpc2tTY3JpcHQ6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBkaXNrIGltYWdlIG9yIERpc2tTY3JpcHQKLQkJS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gZGlzayBpbWFnZSBvciBhIERpc2tTY3JpcHQKLQkJIiIiCi0JCV9jb2RlID0gJ1VUSUwnCi0JCV9zdWJjb2RlID0gJ1NFTDMnCisgICAgZGVmIHNlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQoc2VsZiwgX25vX29iamVjdD1Ob25lLCBfYXR0cmlidXRlcz17fSwgKipfYXJndW1lbnRzKToKKyAgICAgICAgIiIic2VsZWN0IGRpc2sgaW1hZ2Ugb3IgRGlza1NjcmlwdDogUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGRpc2sgaW1hZ2Ugb3IgRGlza1NjcmlwdAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBkaXNrIGltYWdlIG9yIGEgRGlza1NjcmlwdAorICAgICAgICAiIiIKKyAgICAgICAgX2NvZGUgPSAnVVRJTCcKKyAgICAgICAgX3N1YmNvZGUgPSAnU0VMMycKIAotCQlhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZGlza19pbWFnZV9vcl9EaXNrU2NyaXB0KQotCQlpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdF9kaXNrX2ltYWdlX29yX0Rpc2tTY3JpcHQpCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWxlY3RfZmxvcHB5X2Rpc2tfaW1hZ2UgPSB7Ci0JCSd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCi0JfQorICAgIF9hcmdtYXBfc2VsZWN0X2Zsb3BweV9kaXNrX2ltYWdlID0geworICAgICAgICAgICAgJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKKyAgICB9CiAKLQlkZWYgc2VsZWN0X2Zsb3BweV9kaXNrX2ltYWdlKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBmbG9wcHkgZGlzayBpbWFnZTogUHJvbXB0IHRoZSB1c2VyIHRvIHNlbGVjdCBhIGZsb3BweSBkaXNrIGltYWdlCi0JCUtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAotCQlLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5Ci0JCVJldHVybnM6IGEgcmVmZXJlbmNlIHRvIGEgZmxvcHB5IGRpc2sgaW1hZ2UKLQkJIiIiCi0JCV9jb2RlID0gJ1VUSUwnCi0JCV9zdWJjb2RlID0gJ1NFTDQnCisgICAgZGVmIHNlbGVjdF9mbG9wcHlfZGlza19pbWFnZShzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3QgZmxvcHB5IGRpc2sgaW1hZ2U6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmbG9wcHkgZGlzayBpbWFnZQorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IHdpdGhfcHJvbXB0OiB0aGUgcHJvbXB0IHN0cmluZyB0byBiZSBkaXNwbGF5ZWQKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQorICAgICAgICBSZXR1cm5zOiBhIHJlZmVyZW5jZSB0byBhIGZsb3BweSBkaXNrIGltYWdlCisgICAgICAgICIiIgorICAgICAgICBfY29kZSA9ICdVVElMJworICAgICAgICBfc3ViY29kZSA9ICdTRUw0JwogCi0JCWFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX3NlbGVjdF9mbG9wcHlfZGlza19pbWFnZSkKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZmxvcHB5X2Rpc2tfaW1hZ2UpCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWxlY3RfZGlzayA9IHsKLQkJJ3dpdGhfcHJvbXB0JyA6ICdTRUxwJywKLQl9CisgICAgX2FyZ21hcF9zZWxlY3RfZGlzayA9IHsKKyAgICAgICAgICAgICd3aXRoX3Byb21wdCcgOiAnU0VMcCcsCisgICAgfQogCi0JZGVmIHNlbGVjdF9kaXNrKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBkaXNrOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlzayB2b2x1bWUKLQkJS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIGRpc2sKLQkJIiIiCi0JCV9jb2RlID0gJ1VUSUwnCi0JCV9zdWJjb2RlID0gJ1NFTDUnCisgICAgZGVmIHNlbGVjdF9kaXNrKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6CisgICAgICAgICIiInNlbGVjdCBkaXNrOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZGlzayB2b2x1bWUKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIGRpc2sKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ1NFTDUnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Rpc2spCi0JCWlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKKyAgICAgICAgYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2Rpc2spCisgICAgICAgIGlmIF9ub19vYmplY3QgIT0gTm9uZTogcmFpc2UgVHlwZUVycm9yLCAnTm8gZGlyZWN0IGFyZyBleHBlY3RlZCcKIAotCQlhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCisgICAgICAgIGFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdTRUxwJywgX0VudW1fVEVYVCkKIAotCQlfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKLQkJCQlfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6Ci0JCQlyYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCi0JCSMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKLQkJaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6Ci0JCQlyZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCisgICAgICAgIF9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgorICAgICAgICAgICAgcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQorICAgICAgICAjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0CisgICAgICAgIGlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgorICAgICAgICAgICAgcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQogCi0JX2FyZ21hcF9zZWxlY3RfZm9sZGVyID0gewotCQknd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAotCX0KKyAgICBfYXJnbWFwX3NlbGVjdF9mb2xkZXIgPSB7CisgICAgICAgICAgICAnd2l0aF9wcm9tcHQnIDogJ1NFTHAnLAorICAgIH0KIAotCWRlZiBzZWxlY3RfZm9sZGVyKHNlbGYsIF9ub19vYmplY3Q9Tm9uZSwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiInNlbGVjdCBmb2xkZXI6IFByb21wdCB0aGUgdXNlciB0byBzZWxlY3QgYSBmb2xkZXIKLQkJS2V5d29yZCBhcmd1bWVudCB3aXRoX3Byb21wdDogdGhlIHByb21wdCBzdHJpbmcgdG8gYmUgZGlzcGxheWVkCi0JCUtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKLQkJUmV0dXJuczogYSByZWZlcmVuY2UgdG8gdGhlIGZvbGRlcgotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnU0VMNicKKyAgICBkZWYgc2VsZWN0X2ZvbGRlcihzZWxmLCBfbm9fb2JqZWN0PU5vbmUsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJzZWxlY3QgZm9sZGVyOiBQcm9tcHQgdGhlIHVzZXIgdG8gc2VsZWN0IGEgZm9sZGVyCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgd2l0aF9wcm9tcHQ6IHRoZSBwcm9tcHQgc3RyaW5nIHRvIGJlIGRpc3BsYXllZAorICAgICAgICBLZXl3b3JkIGFyZ3VtZW50IF9hdHRyaWJ1dGVzOiBBcHBsZUV2ZW50IGF0dHJpYnV0ZSBkaWN0aW9uYXJ5CisgICAgICAgIFJldHVybnM6IGEgcmVmZXJlbmNlIHRvIHRoZSBmb2xkZXIKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ1NFTDYnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfc2VsZWN0X2ZvbGRlcikKLQkJaWYgX25vX29iamVjdCAhPSBOb25lOiByYWlzZSBUeXBlRXJyb3IsICdObyBkaXJlY3QgYXJnIGV4cGVjdGVkJworICAgICAgICBhZXRvb2xzLmtleXN1YnN0KF9hcmd1bWVudHMsIHNlbGYuX2FyZ21hcF9zZWxlY3RfZm9sZGVyKQorICAgICAgICBpZiBfbm9fb2JqZWN0ICE9IE5vbmU6IHJhaXNlIFR5cGVFcnJvciwgJ05vIGRpcmVjdCBhcmcgZXhwZWN0ZWQnCiAKLQkJYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1NFTHAnLCBfRW51bV9URVhUKQorICAgICAgICBhZXRvb2xzLmVudW1zdWJzdChfYXJndW1lbnRzLCAnU0VMcCcsIF9FbnVtX1RFWFQpCiAKLQkJX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCi0JCQkJX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMpCi0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnZXJybicpOgotCQkJcmFpc2UgYWV0b29scy5FcnJvciwgYWV0b29scy5kZWNvZGVlcnJvcihfYXJndW1lbnRzKQotCQkjIFhYWFggT3B0aW9uYWxseSBkZWNvZGUgcmVzdWx0Ci0JCWlmIF9hcmd1bWVudHMuaGFzX2tleSgnLS0tLScpOgotCQkJcmV0dXJuIF9hcmd1bWVudHNbJy0tLS0nXQorICAgICAgICBfcmVwbHksIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzID0gc2VsZi5zZW5kKF9jb2RlLCBfc3ViY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKKyAgICAgICAgICAgIHJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKKyAgICAgICAgIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAorICAgICAgICBpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKKyAgICAgICAgICAgIHJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KIAotCV9hcmdtYXBfbG9nID0gewotCQkndGltZV9zdGFtcCcgOiAnVFNNUCcsCi0JfQorICAgIF9hcmdtYXBfbG9nID0geworICAgICAgICAgICAgJ3RpbWVfc3RhbXAnIDogJ1RTTVAnLAorICAgIH0KIAotCWRlZiBsb2coc2VsZiwgX29iamVjdCwgX2F0dHJpYnV0ZXM9e30sICoqX2FyZ3VtZW50cyk6Ci0JCSIiImxvZzogQWRkIGEgc3RyaW5nIHRvIHRoZSBsb2cgd2luZG93Ci0JCVJlcXVpcmVkIGFyZ3VtZW50OiB0aGUgc3RyaW5nIHRvIGFkZCB0byB0aGUgbG9nIHdpbmRvdwotCQlLZXl3b3JkIGFyZ3VtZW50IHRpbWVfc3RhbXA6IFNob3VsZCB0aGUgbG9nIGVudHJ5IGJlIHRpbWUtc3RhbXBlZD8gKGZhbHNlIGlmIG5vdCBzdXBwbGllZCkKLQkJS2V5d29yZCBhcmd1bWVudCBfYXR0cmlidXRlczogQXBwbGVFdmVudCBhdHRyaWJ1dGUgZGljdGlvbmFyeQotCQkiIiIKLQkJX2NvZGUgPSAnVVRJTCcKLQkJX3N1YmNvZGUgPSAnTE9HICcKKyAgICBkZWYgbG9nKHNlbGYsIF9vYmplY3QsIF9hdHRyaWJ1dGVzPXt9LCAqKl9hcmd1bWVudHMpOgorICAgICAgICAiIiJsb2c6IEFkZCBhIHN0cmluZyB0byB0aGUgbG9nIHdpbmRvdworICAgICAgICBSZXF1aXJlZCBhcmd1bWVudDogdGhlIHN0cmluZyB0byBhZGQgdG8gdGhlIGxvZyB3aW5kb3cKKyAgICAgICAgS2V5d29yZCBhcmd1bWVudCB0aW1lX3N0YW1wOiBTaG91bGQgdGhlIGxvZyBlbnRyeSBiZSB0aW1lLXN0YW1wZWQ/IChmYWxzZSBpZiBub3Qgc3VwcGxpZWQpCisgICAgICAgIEtleXdvcmQgYXJndW1lbnQgX2F0dHJpYnV0ZXM6IEFwcGxlRXZlbnQgYXR0cmlidXRlIGRpY3Rpb25hcnkKKyAgICAgICAgIiIiCisgICAgICAgIF9jb2RlID0gJ1VUSUwnCisgICAgICAgIF9zdWJjb2RlID0gJ0xPRyAnCiAKLQkJYWV0b29scy5rZXlzdWJzdChfYXJndW1lbnRzLCBzZWxmLl9hcmdtYXBfbG9nKQotCQlfYXJndW1lbnRzWyctLS0tJ10gPSBfb2JqZWN0CisgICAgICAgIGFldG9vbHMua2V5c3Vic3QoX2FyZ3VtZW50cywgc2VsZi5fYXJnbWFwX2xvZykKKyAgICAgICAgX2FyZ3VtZW50c1snLS0tLSddID0gX29iamVjdAogCi0JCWFldG9vbHMuZW51bXN1YnN0KF9hcmd1bWVudHMsICdUU01QJywgX0VudW1fYm9vbCkKKyAgICAgICAgYWV0b29scy5lbnVtc3Vic3QoX2FyZ3VtZW50cywgJ1RTTVAnLCBfRW51bV9ib29sKQogCi0JCV9yZXBseSwgX2FyZ3VtZW50cywgX2F0dHJpYnV0ZXMgPSBzZWxmLnNlbmQoX2NvZGUsIF9zdWJjb2RlLAotCQkJCV9hcmd1bWVudHMsIF9hdHRyaWJ1dGVzKQotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJ2Vycm4nKToKLQkJCXJhaXNlIGFldG9vbHMuRXJyb3IsIGFldG9vbHMuZGVjb2RlZXJyb3IoX2FyZ3VtZW50cykKLQkJIyBYWFhYIE9wdGlvbmFsbHkgZGVjb2RlIHJlc3VsdAotCQlpZiBfYXJndW1lbnRzLmhhc19rZXkoJy0tLS0nKToKLQkJCXJldHVybiBfYXJndW1lbnRzWyctLS0tJ10KKyAgICAgICAgX3JlcGx5LCBfYXJndW1lbnRzLCBfYXR0cmlidXRlcyA9IHNlbGYuc2VuZChfY29kZSwgX3N1YmNvZGUsCisgICAgICAgICAgICAgICAgICAgICAgICBfYXJndW1lbnRzLCBfYXR0cmlidXRlcykKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCdlcnJuJyk6CisgICAgICAgICAgICByYWlzZSBhZXRvb2xzLkVycm9yLCBhZXRvb2xzLmRlY29kZWVycm9yKF9hcmd1bWVudHMpCisgICAgICAgICMgWFhYWCBPcHRpb25hbGx5IGRlY29kZSByZXN1bHQKKyAgICAgICAgaWYgX2FyZ3VtZW50cy5oYXNfa2V5KCctLS0tJyk6CisgICAgICAgICAgICByZXR1cm4gX2FyZ3VtZW50c1snLS0tLSddCiAKIF9FbnVtX1RFWFQgPSBOb25lICMgWFhYWCBlbnVtIFRFWFQgbm90IGZvdW5kISEKIF9FbnVtX2Jvb2wgPSBOb25lICMgWFhYWCBlbnVtIGJvb2wgbm90IGZvdW5kISEKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9fX2luaXRfXy5weSBiL01hYy9EZW1vL2FwcGxlc2NyaXB0L0Rpc2tfQ29weS9fX2luaXRfXy5weQppbmRleCBiODE0MDU2Li5hYzUwNTYxIDEwMDY0NAotLS0gYS9NYWMvRGVtby9hcHBsZXNjcmlwdC9EaXNrX0NvcHkvX19pbml0X18ucHkKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvRGlza19Db3B5L19faW5pdF9fLnB5CkBAIC0xLDYgKzEsNiBAQAogIiIiCiBQYWNrYWdlIGdlbmVyYXRlZCBmcm9tIE1hY2ludG9zaCBIRDpIdWxwcHJvZ3JhbW1hJ3M6RGlzayBDb3B5Ci1SZXNvdXJjZSBhZXRlIHJlc2lkIDAgCitSZXNvdXJjZSBhZXRlIHJlc2lkIDAKICIiIgogaW1wb3J0IGFldG9vbHMKIEVycm9yID0gYWV0b29scy5FcnJvcgpAQCAtMTAsMTcgKzEwLDE3IEBACiAKIAogX2NvZGVfdG9fbW9kdWxlID0gewotCSdDb3JlJyA6IFN0YW5kYXJkX1N1aXRlLAotCSdkZHNrJyA6IFNwZWNpYWxfRXZlbnRzLAotCSdkZHNrJyA6IFV0aWxpdHlfRXZlbnRzLAorICAgICAgICAnQ29yZScgOiBTdGFuZGFyZF9TdWl0ZSwKKyAgICAgICAgJ2Rkc2snIDogU3BlY2lhbF9FdmVudHMsCisgICAgICAgICdkZHNrJyA6IFV0aWxpdHlfRXZlbnRzLAogfQogCiAKIAogX2NvZGVfdG9fZnVsbG5hbWUgPSB7Ci0JJ0NvcmUnIDogKCdEaXNrX0NvcHkuU3RhbmRhcmRfU3VpdGUnLCAnU3RhbmRhcmRfU3VpdGUnKSwKLQknZGRzaycgOiAoJ0Rpc2tfQ29weS5TcGVjaWFsX0V2ZW50cycsICdTcGVjaWFsX0V2ZW50cycpLAotCSdkZHNrJyA6ICgnRGlza19Db3B5LlV0aWxpdHlfRXZlbnRzJywgJ1V0aWxpdHlfRXZlbnRzJyksCisgICAgICAgICdDb3JlJyA6ICgnRGlza19Db3B5LlN0YW5kYXJkX1N1aXRlJywgJ1N0YW5kYXJkX1N1aXRlJyksCisgICAgICAgICdkZHNrJyA6ICgnRGlza19Db3B5LlNwZWNpYWxfRXZlbnRzJywgJ1NwZWNpYWxfRXZlbnRzJyksCisgICAgICAgICdkZHNrJyA6ICgnRGlza19Db3B5LlV0aWxpdHlfRXZlbnRzJywgJ1V0aWxpdHlfRXZlbnRzJyksCiB9CiAKIGZyb20gU3RhbmRhcmRfU3VpdGUgaW1wb3J0ICoKQEAgLTI5LDggKzI5LDcgQEAKIAogCiBjbGFzcyBEaXNrX0NvcHkoU3RhbmRhcmRfU3VpdGVfRXZlbnRzLAotCQlTcGVjaWFsX0V2ZW50c19FdmVudHMsCi0JCVV0aWxpdHlfRXZlbnRzX0V2ZW50cywKLQkJYWV0b29scy5UYWxrVG8pOgotCV9zaWduYXR1cmUgPSAnZGRzaycKLQorICAgICAgICAgICAgICAgIFNwZWNpYWxfRXZlbnRzX0V2ZW50cywKKyAgICAgICAgICAgICAgICBVdGlsaXR5X0V2ZW50c19FdmVudHMsCisgICAgICAgICAgICAgICAgYWV0b29scy5UYWxrVG8pOgorICAgIF9zaWduYXR1cmUgPSAnZGRzaycKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2FwcGxlc2NyaXB0L21ha2VkaXNrLnB5IGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvbWFrZWRpc2sucHkKaW5kZXggMzAxNjk2NC4uOTEyMTBlZSAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vYXBwbGVzY3JpcHQvbWFrZWRpc2sucHkKKysrIGIvTWFjL0RlbW8vYXBwbGVzY3JpcHQvbWFrZWRpc2sucHkKQEAgLTYsMTAgKzYsMTAgQEAKIHRhbGtlci5hY3RpdmF0ZSgpCiBmaWxlc3BlYyA9IG1hY2ZzLkZTU3BlYygnbXkgZGlzayBpbWFnZS5pbWcnKQogdHJ5OgotCW9ianJlZiA9IHRhbGtlci5jcmVhdGUoJ215IGRpc2sgaW1hZ2UnLCBzYXZpbmdfYXM9ZmlsZXNwZWMsIGxlYXZlX2ltYWdlX21vdW50ZWQ9MSkKKyAgICBvYmpyZWYgPSB0YWxrZXIuY3JlYXRlKCdteSBkaXNrIGltYWdlJywgc2F2aW5nX2FzPWZpbGVzcGVjLCBsZWF2ZV9pbWFnZV9tb3VudGVkPTEpCiBleGNlcHQgRGlza19Db3B5LkVycm9yLCBhcmc6Ci0JcHJpbnQgIkVSUk9SOiBteSBkaXNrIGltYWdlOiIsIGFyZworICAgIHByaW50ICJFUlJPUjogbXkgZGlzayBpbWFnZToiLCBhcmcKIGVsc2U6Ci0JcHJpbnQgJ29ianJlZj0nLCBvYmpyZWYKKyAgICBwcmludCAnb2JqcmVmPScsIG9ianJlZgogcHJpbnQgJ1R5cGUgcmV0dXJuIHRvIGV4aXQtJwogc3lzLnN0ZGluLnJlYWRsaW5lKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkgYi9NYWMvRGVtby9jYWxsZGxsL3Rlc3RjYWxsZGxsLnB5CmluZGV4IGQ0YTQ4NTMuLmUwZjY5NjQgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2NhbGxkbGwvdGVzdGNhbGxkbGwucHkKKysrIGIvTWFjL0RlbW8vY2FsbGRsbC90ZXN0Y2FsbGRsbC5weQpAQCAtOCwxNiArOCwxNiBAQAogCiBsaWIgPSBjYWxsZGxsLmdldGRpc2tmcmFnbWVudChmc3MsICdjYWxsZGxsLnBwYy5zbGInKQogCi1jZGxsX2JfYmJiYmJiYmIgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfYl9iYmJiYmJiYiwgJ0J5dGUnLCAnSW5CeXRlJywgJ0luQnl0ZScsIAotCQkJCSdJbkJ5dGUnLCAnSW5CeXRlJywnSW5CeXRlJywgJ0luQnl0ZScsJ0luQnl0ZScsICdJbkJ5dGUnKQotY2RsbF9oX2hoaGhoaGhoID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2hfaGhoaGhoaGgsICdTaG9ydCcsICdJblNob3J0JywgJ0luU2hvcnQnLCAKLQkJCQknSW5TaG9ydCcsICdJblNob3J0JywnSW5TaG9ydCcsICdJblNob3J0JywnSW5TaG9ydCcsICdJblNob3J0JykKLWNkbGxfbF9sbGxsbGxsbCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9sX2xsbGxsbGxsLCAnTG9uZycsICdJbkxvbmcnLCAnSW5Mb25nJywgCi0JCQkJJ0luTG9uZycsICdJbkxvbmcnLCdJbkxvbmcnLCAnSW5Mb25nJywnSW5Mb25nJywgJ0luTG9uZycpCi0JCQkJCitjZGxsX2JfYmJiYmJiYmIgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfYl9iYmJiYmJiYiwgJ0J5dGUnLCAnSW5CeXRlJywgJ0luQnl0ZScsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdJbkJ5dGUnLCAnSW5CeXRlJywnSW5CeXRlJywgJ0luQnl0ZScsJ0luQnl0ZScsICdJbkJ5dGUnKQorY2RsbF9oX2hoaGhoaGhoID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX2hfaGhoaGhoaGgsICdTaG9ydCcsICdJblNob3J0JywgJ0luU2hvcnQnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnSW5TaG9ydCcsICdJblNob3J0JywnSW5TaG9ydCcsICdJblNob3J0JywnSW5TaG9ydCcsICdJblNob3J0JykKK2NkbGxfbF9sbGxsbGxsbCA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9sX2xsbGxsbGxsLCAnTG9uZycsICdJbkxvbmcnLCAnSW5Mb25nJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luTG9uZycsICdJbkxvbmcnLCdJbkxvbmcnLCAnSW5Mb25nJywnSW5Mb25nJywgJ0luTG9uZycpCisKIGNkbGxfTl9zc3Nzc3NzcyA9IGNhbGxkbGwubmV3Y2FsbChsaWIuY2RsbF9OX3Nzc3Nzc3NzLCAnTm9uZScsICdJblN0cmluZycsICdJblN0cmluZycsCi0JCQkJJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJykKLQkJCQkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJywgJ0luU3RyaW5nJykKKwogY2RsbF9vX2wgPSBjYWxsZGxsLm5ld2NhbGwobGliLmNkbGxfb19sLCAnT1NFcnInLCAnSW5Mb25nJykKIAogY2RsbF9OX3BwID0gY2FsbGRsbC5uZXdjYWxsKGxpYi5jZGxsX05fcHAsICdOb25lJywgJ0luUHN0cmluZycsICdPdXRQc3RyaW5nJykKQEAgLTMwLDEwMyArMzAsMTAzIEBACiBwcmludCAnVGVzdCBjZGxsX2JfYmJiYmJiYmInCiBydiA9IGNkbGxfYl9iYmJiYmJiYigxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQogaWYgcnYgPT0gMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX2JfYmJiYmJiYmIgbmVnYXRpdmUnCiBydiA9IGNkbGxfYl9iYmJiYmJiYigtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCiBpZiBydiA9PSAtMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgogCiBwcmludCAnVGVzdCBjZGxsX2hfaGhoaGhoaGgnCiBydiA9IGNkbGxfaF9oaGhoaGhoaCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQogaWYgcnYgPT0gMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX2hfaGhoaGhoaGggbmVnYXRpdmUnCiBydiA9IGNkbGxfaF9oaGhoaGhoaCgtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCiBpZiBydiA9PSAtMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgogCiBwcmludCAnVGVzdCBjZGxsX2xfbGxsbGxsbGwnCiBydiA9IGNkbGxfbF9sbGxsbGxsbCgxLCAyLCAzLCA0LCA1LCA2LCA3LCA4KQogaWYgcnYgPT0gMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX2xfbGxsbGxsbGwgbmVnYXRpdmUnCiBydiA9IGNkbGxfbF9sbGxsbGxsbCgtMSwgLTIsIC0zLCAtNCwgLTUsIC02LCAtNywgLTgpCiBpZiBydiA9PSAtMzY6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX05fc3Nzc3Nzc3MnCiBwcmludCAnU2hvdWxkIHByaW50IG9uZSB0d28gdGhyZWUgZm91ciBmaXZlIHNpeCBzZXZlbiBlaWdodCcKIHJ2ID0gY2RsbF9OX3Nzc3Nzc3NzKCdvbmUnLCAndHdvJywgJ3RocmVlJywgJ2ZvdXInLCAnZml2ZScsICdzaXgnLCAnc2V2ZW4nLCAnZWlnaHQnKQogaWYgcnYgPT0gTm9uZToKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfb19sKDApJwogcnYgPSBjZGxsX29fbCgwKQogaWYgcnYgPT0gTm9uZToKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdFcnJvciwgcmV0dXJuZWQnLCBydgotCQorICAgIHByaW50ICdFcnJvciwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX29fbCgtMTAwKScKIHRyeToKLQlydiA9IGNkbGxfb19sKC0xMDApCi0JcHJpbnQgJ0Vycm9yLCBkaWQgbm90IHJhaXNlIGV4Y2VwdGlvbiwgcmV0dXJuZWQnLCBydgorICAgIHJ2ID0gY2RsbF9vX2woLTEwMCkKKyAgICBwcmludCAnRXJyb3IsIGRpZCBub3QgcmFpc2UgZXhjZXB0aW9uLCByZXR1cm5lZCcsIHJ2CiBleGNlcHQgTWFjT1MuRXJyb3IsIGFyZzoKLQlpZiBhcmdbMF0gPT0gLTEwMDoKLQkJcHJpbnQgJ29rLicKLQllbHNlOgotCQlwcmludCAnRXJyb3IsIHJldHVybmVkIGluY29ycmVjdCBleGNlcHRpb24gYXJnOicsIGFyZ1swXQotCQorICAgIGlmIGFyZ1swXSA9PSAtMTAwOgorICAgICAgICBwcmludCAnb2suJworICAgIGVsc2U6CisgICAgICAgIHByaW50ICdFcnJvciwgcmV0dXJuZWQgaW5jb3JyZWN0IGV4Y2VwdGlvbiBhcmc6JywgYXJnWzBdCisKIHByaW50ICdUZXN0IGNkbGxfTl9wcCcKIHJ2ID0gY2RsbF9OX3BwKCdwYXNjYWwgc3RyaW5nJykKIGlmIHJ2ID09ICdXYXM6IHBhc2NhbCBzdHJpbmcnOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCByZXByKHJ2KQotCQorICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcmVwcihydikKKwogcHJpbnQgJ1Rlc3QgY2RsbF9OX2JiJwogcnYgPSBjZGxsX05fYmIoLTEwMCkKIGlmIHJ2ID09IC0xMDA6Ci0JcHJpbnQgJ29rLicKKyAgICBwcmludCAnb2suJwogZWxzZToKLQlwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2Ci0JCisgICAgcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorCiBwcmludCAnVGVzdCBjZGxsX05faGgnCiBydiA9IGNkbGxfTl9oaCgtMTAwKQogaWYgcnYgPT0gLTEwMDoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKLQkKKyAgICBwcmludCAnRmFpbGVkLCByZXR1cm5lZCcsIHJ2CisKIHByaW50ICdUZXN0IGNkbGxfTl9sbCcKIHJ2ID0gY2RsbF9OX2xsKC0xMDApCiBpZiBydiA9PSAtMTAwOgotCXByaW50ICdvay4nCisgICAgcHJpbnQgJ29rLicKIGVsc2U6Ci0JcHJpbnQgJ0ZhaWxlZCwgcmV0dXJuZWQnLCBydgorICAgIHByaW50ICdGYWlsZWQsIHJldHVybmVkJywgcnYKIAogcHJpbnQgJ1Rlc3QgY2RsbF9OX3NIJwogaCA9IFJlcy5SZXNvdXJjZSgneHl6JykKIHJ2ID0gY2RsbF9OX3NIKCduZXcgZGF0YScsIGgpCiBpZiBydiA9PSBOb25lIGFuZCBoLmRhdGEgPT0gJ25ldyBkYXRhJzoKLQlwcmludCAnb2suJworICAgIHByaW50ICdvay4nCiBlbHNlOgotCXByaW50ICdGYWlsZWQsIHJ2IGlzJywgcnYsICdhbmQgaGFuZGxlIGRhdGEgaXMnLCByZXByKHJ2LmRhdGEpCisgICAgcHJpbnQgJ0ZhaWxlZCwgcnYgaXMnLCBydiwgJ2FuZCBoYW5kbGUgZGF0YSBpcycsIHJlcHIocnYuZGF0YSkKIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9leGFtcGxlMC9jaGVja3RleHQucHkgYi9NYWMvRGVtby9leGFtcGxlMC9jaGVja3RleHQucHkKaW5kZXggYTU5NDNhNi4uMjVmNzFlNCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vZXhhbXBsZTAvY2hlY2t0ZXh0LnB5CisrKyBiL01hYy9EZW1vL2V4YW1wbGUwL2NoZWNrdGV4dC5weQpAQCAtNSwzMyArNSwzMSBAQAogaW1wb3J0IHN0cmluZwogCiBkZWYgbWFpbigpOgotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nRmlsZSB0byBjaGVjayBlbmQtb2YtbGluZXMgaW46JykKLQlpZiBub3QgcGF0aG5hbWU6Ci0JCXN5cy5leGl0KDApCi0JZnAgPSBvcGVuKHBhdGhuYW1lLCAncmInKQotCXRyeToKLQkJZGF0YSA9IGZwLnJlYWQoKQotCWV4Y2VwdCBNZW1vcnlFcnJvcjoKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgnU29ycnksIGZpbGUgaXMgdG9vIGJpZy4nKQotCQlzeXMuZXhpdCgwKQotCWlmIGxlbihkYXRhKSA9PSAwOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGlzIGVtcHR5LicpCi0JCXN5cy5leGl0KDApCi0JbnVtYmVyX2NyID0gc3RyaW5nLmNvdW50KGRhdGEsICdccicpCi0JbnVtYmVyX2xmID0gc3RyaW5nLmNvdW50KGRhdGEsICdcbicpCi0JaWYgbnVtYmVyX2NyID09IG51bWJlcl9sZiA9PSAwOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGNvbnRhaW5zIG5vIGxpbmVzLicpCi0JaWYgbnVtYmVyX2NyID09IDA6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgaGFzIHVuaXgtc3R5bGUgbGluZSBlbmRpbmdzJykKLQllbGlmIG51bWJlcl9sZiA9PSAwOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGhhcyBtYWMtc3R5bGUgbGluZSBlbmRpbmdzJykKLQllbGlmIG51bWJlcl9jciA9PSBudW1iZXJfbGY6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgcHJvYmFibHkgaGFzIE1TRE9TLXN0eWxlIGxpbmUgZW5kaW5ncycpCi0JZWxzZToKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBoYXMgbm8gcmVjb2duaXphYmxlIGxpbmUgZW5kaW5ncyAoYmluYXJ5IGZpbGU/KScpCi0Jc3lzLmV4aXQoMCkKLQkKKyAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9J0ZpbGUgdG8gY2hlY2sgZW5kLW9mLWxpbmVzIGluOicpCisgICAgaWYgbm90IHBhdGhuYW1lOgorICAgICAgICBzeXMuZXhpdCgwKQorICAgIGZwID0gb3BlbihwYXRobmFtZSwgJ3JiJykKKyAgICB0cnk6CisgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICBleGNlcHQgTWVtb3J5RXJyb3I6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoJ1NvcnJ5LCBmaWxlIGlzIHRvbyBiaWcuJykKKyAgICAgICAgc3lzLmV4aXQoMCkKKyAgICBpZiBsZW4oZGF0YSkgPT0gMDoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBpcyBlbXB0eS4nKQorICAgICAgICBzeXMuZXhpdCgwKQorICAgIG51bWJlcl9jciA9IHN0cmluZy5jb3VudChkYXRhLCAnXHInKQorICAgIG51bWJlcl9sZiA9IHN0cmluZy5jb3VudChkYXRhLCAnXG4nKQorICAgIGlmIG51bWJlcl9jciA9PSBudW1iZXJfbGYgPT0gMDoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBjb250YWlucyBubyBsaW5lcy4nKQorICAgIGlmIG51bWJlcl9jciA9PSAwOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIGhhcyB1bml4LXN0eWxlIGxpbmUgZW5kaW5ncycpCisgICAgZWxpZiBudW1iZXJfbGYgPT0gMDoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgnRmlsZSBoYXMgbWFjLXN0eWxlIGxpbmUgZW5kaW5ncycpCisgICAgZWxpZiBudW1iZXJfY3IgPT0gbnVtYmVyX2xmOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCdGaWxlIHByb2JhYmx5IGhhcyBNU0RPUy1zdHlsZSBsaW5lIGVuZGluZ3MnKQorICAgIGVsc2U6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoJ0ZpbGUgaGFzIG5vIHJlY29nbml6YWJsZSBsaW5lIGVuZGluZ3MgKGJpbmFyeSBmaWxlPyknKQorICAgIHN5cy5leGl0KDApCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9leGFtcGxlMS9kbnNsb29rdXAtMS5weSBiL01hYy9EZW1vL2V4YW1wbGUxL2Ruc2xvb2t1cC0xLnB5CmluZGV4IDJhYTdjODguLjJmYjhkYzQgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2V4YW1wbGUxL2Ruc2xvb2t1cC0xLnB5CisrKyBiL01hYy9EZW1vL2V4YW1wbGUxL2Ruc2xvb2t1cC0xLnB5CkBAIC0zMiw3ICszMiw3IEBACiAgICAgICAgICAgICB0eHQgPSBEbGcuR2V0RGlhbG9nSXRlbVRleHQoaCkKIAogICAgICAgICAgICAgdHAsIGgsIHJlY3QgPSBteV9kbGcuR2V0RGlhbG9nSXRlbShJVEVNX1JFU1VMVCkKLSAgICAgICAgICAgIERsZy5TZXREaWFsb2dJdGVtVGV4dChoLCBkbnNsb29rdXAodHh0KSkgICAgICAgIAorICAgICAgICAgICAgRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGRuc2xvb2t1cCh0eHQpKQogICAgICAgICBlbGlmIG4gPT0gSVRFTV9RVUlUX0JVVFRPTjoKICAgICAgICAgICAgIGJyZWFrCiAKQEAgLTU0LDQgKzU0LDMgQEAKICAgICByZXR1cm4gdmFsdWUKIAogbWFpbigpCi0KZGlmZiAtLWdpdCBhL01hYy9EZW1vL2V4YW1wbGUyL2Ruc2xvb2t1cC0yLnB5IGIvTWFjL0RlbW8vZXhhbXBsZTIvZG5zbG9va3VwLTIucHkKaW5kZXggOTc0N2M0YS4uOTJjZDE4MSAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vZXhhbXBsZTIvZG5zbG9va3VwLTIucHkKKysrIGIvTWFjL0RlbW8vZXhhbXBsZTIvZG5zbG9va3VwLTIucHkKQEAgLTE4LDEwICsxOCwxMCBAQAogZGVmIG1haW4oKToKICAgICBtYWNyZXNvdXJjZS5uZWVkKCJETE9HIiwgSURfTUFJTiwgImRuc2xvb2t1cC0yLnJzcmMiKQogICAgIEROU0xvb2t1cCgpCi0gICAgCisKIGNsYXNzIEROU0xvb2t1cChGcmFtZVdvcmsuQXBwbGljYXRpb24pOgogICAgICJBcHBsaWNhdGlvbiBjbGFzcyBmb3IgRE5TIExvb2t1cCIKLSAgICAKKwogICAgIGRlZiBfX2luaXRfXyhzZWxmKToKICAgICAgICAgIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCiAgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQpAQCAtMzEsMjcgKzMxLDI3IEBACiAgICAgICAgIHNlbGYubWFpbl9kaWFsb2cub3BlbihJRF9NQUlOKQogICAgICAgICAjIEZpbmFsbHksIGdvIGludG8gdGhlIGV2ZW50IGxvb3AKICAgICAgICAgc2VsZi5tYWlubG9vcCgpCi0gICAgCisKICAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKICAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKICAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotICAgIAorCiAgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgogICAgICAgICBzZWxmLl9xdWl0KCkKLSAgICAgICAgCisKICAgICBkZWYgZG9fYWJvdXQoc2VsZiwgKmFyZ3MpOgogICAgICAgICBmID0gRGxnLkdldE5ld0RpYWxvZyhJRF9BQk9VVCwgLTEpCiAgICAgICAgIHdoaWxlIDE6CiAgICAgICAgICAgICBuID0gRGxnLk1vZGFsRGlhbG9nKE5vbmUpCiAgICAgICAgICAgICBpZiBuID09IDE6CiAgICAgICAgICAgICAgICAgcmV0dXJuCi0gICAgICAgICAgICAgICAgICAgICAgICAKKwogY2xhc3MgTXlEaWFsb2coRnJhbWVXb3JrLkRpYWxvZ1dpbmRvdyk6CiAgICAgIk1haW4gZGlhbG9nIHdpbmRvdyBmb3IgRE5TTG9va3VwIgogICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnQpOgogICAgICAgICBGcmFtZVdvcmsuRGlhbG9nV2luZG93Ll9faW5pdF9fKHNlbGYsIHBhcmVudCkKICAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKLSAgICAKKwogICAgIGRlZiBkb19pdGVtaGl0KHNlbGYsIGl0ZW0sIGV2ZW50KToKICAgICAgICAgaWYgaXRlbSA9PSBJVEVNX0xPT0tVUF9CVVRUT046CiAgICAgICAgICAgICBzZWxmLmRvbG9va3VwKCkKQEAgLTY0LDcgKzY0LDcgQEAKIAogICAgICAgICB0cCwgaCwgcmVjdCA9IHNlbGYuZGxnLkdldERpYWxvZ0l0ZW0oSVRFTV9SRVNVTFQpCiAgICAgICAgIERsZy5TZXREaWFsb2dJdGVtVGV4dChoLCBzZWxmLmRuc2xvb2t1cCh0eHQpKQotICAgICAgICAKKwogICAgIGRlZiBkbnNsb29rdXAoc2VsZiwgc3RyKToKICAgICAgICAgIiIiIFBlcmZvcm0gRE5TIGxvb2t1cCBvbiBzdHIuICBJZiBmaXJzdCBjaGFyYWN0ZXIgb2YgZGlnaXQgaXMgbnVtZXJpYywKICAgICAgICAgICAgIGFzc3VtZSB0aGF0IHN0ciBjb250YWlucyBhbiBJUCBhZGRyZXNzLiAgT3RoZXJ3aXNlLCBhc3N1bWUgdGhhdCBzdHIKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2ltZ2Jyb3dzZS9pbWdicm93c2UucHkgYi9NYWMvRGVtby9pbWdicm93c2UvaW1nYnJvd3NlLnB5CmluZGV4IDI2MmM2NTAuLjI4ZGZmZDMgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2ltZ2Jyb3dzZS9pbWdicm93c2UucHkKKysrIGIvTWFjL0RlbW8vaW1nYnJvd3NlL2ltZ2Jyb3dzZS5weQpAQCAtMjUsOTMgKzI1LDkzIEBACiAKIAogZGVmIG1haW4oKToKLQlwcmludCAnaGVsbG8gd29ybGQnCi0JaW1nYnJvd3NlKCkKKyAgICBwcmludCAnaGVsbG8gd29ybGQnCisgICAgaW1nYnJvd3NlKCkKIAogY2xhc3MgaW1nYnJvd3NlKEZyYW1lV29yay5BcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQkjIEZpcnN0IGluaXQgbWVudXMsIGV0Yy4KLQkJRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYubGFzdHdpbiA9IE5vbmUKLQkJIyBGaW5hbGx5LCBnbyBpbnRvIHRoZSBldmVudCBsb29wCi0JCXNlbGYubWFpbmxvb3AoKQotCQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5vcGVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZG9jKQotCQlzZWxmLmluZm9pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJJbmZvIiwgIkkiLCBzZWxmLmluZm8pCi0JCXNlbGYucXVpdGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgb3BlbmRvYyhzZWxmLCAqYXJncyk6Ci0JCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4oKSAjIEFueSBmaWxlIHR5cGUKLQkJaWYgbm90IHBhdGhuYW1lOgotCQkJcmV0dXJuCi0JCWJhciA9IEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyKCdSZWFkaW5nIGFuZCBjb252ZXJ0aW5nLi4uJykKLQkJdHJ5OgotCQkJcmRyID0gaW1nLnJlYWRlcihpbWdmb3JtYXQubWFjcmdiMTYsIHBhdGhuYW1lKQotCQlleGNlcHQgaW1nLmVycm9yLCBhcmc6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKHJlcHIoYXJnKSkKLQkJCXJldHVybgotCQl3LCBoID0gcmRyLndpZHRoLCByZHIuaGVpZ2h0Ci0JCWJhci5zZXQoMTApCi0JCWRhdGEgPSByZHIucmVhZCgpCi0JCWRlbCBiYXIKLQkJcGl4bWFwID0gbWFjX2ltYWdlLm1rcGl4bWFwKHcsIGgsIGltZ2Zvcm1hdC5tYWNyZ2IxNiwgZGF0YSkKLQkJc2VsZi5zaG93aW1nKHcsIGgsIHBpeG1hcCwgZGF0YSkKLQkJCQotCWRlZiBzaG93aW1nKHNlbGYsIHcsIGgsIHBpeG1hcCwgZGF0YSk6Ci0JCXdpbiA9IGltZ3dpbmRvdyhzZWxmKQotCQl3aW4ub3Blbih3LCBoLCBwaXhtYXAsIGRhdGEpCi0JCXNlbGYubGFzdHdpbiA9IHdpbgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgIyBGaXJzdCBpbml0IG1lbnVzLCBldGMuCisgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmxhc3R3aW4gPSBOb25lCisgICAgICAgICMgRmluYWxseSwgZ28gaW50byB0aGUgZXZlbnQgbG9vcAorICAgICAgICBzZWxmLm1haW5sb29wKCkKIAotCWRlZiBpbmZvKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5sYXN0d2luOgotCQkJc2VsZi5sYXN0d2luLmluZm8oKQkJCi0JCQorICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLm9wZW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5kb2MpCisgICAgICAgIHNlbGYuaW5mb2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkluZm8iLCAiSSIsIHNlbGYuaW5mbykKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQorCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgIGRlZiBvcGVuZG9jKHNlbGYsICphcmdzKToKKyAgICAgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigpICMgQW55IGZpbGUgdHlwZQorICAgICAgICBpZiBub3QgcGF0aG5hbWU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgYmFyID0gRWFzeURpYWxvZ3MuUHJvZ3Jlc3NCYXIoJ1JlYWRpbmcgYW5kIGNvbnZlcnRpbmcuLi4nKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZHIgPSBpbWcucmVhZGVyKGltZ2Zvcm1hdC5tYWNyZ2IxNiwgcGF0aG5hbWUpCisgICAgICAgIGV4Y2VwdCBpbWcuZXJyb3IsIGFyZzoKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UocmVwcihhcmcpKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHcsIGggPSByZHIud2lkdGgsIHJkci5oZWlnaHQKKyAgICAgICAgYmFyLnNldCgxMCkKKyAgICAgICAgZGF0YSA9IHJkci5yZWFkKCkKKyAgICAgICAgZGVsIGJhcgorICAgICAgICBwaXhtYXAgPSBtYWNfaW1hZ2UubWtwaXhtYXAodywgaCwgaW1nZm9ybWF0Lm1hY3JnYjE2LCBkYXRhKQorICAgICAgICBzZWxmLnNob3dpbWcodywgaCwgcGl4bWFwLCBkYXRhKQorCisgICAgZGVmIHNob3dpbWcoc2VsZiwgdywgaCwgcGl4bWFwLCBkYXRhKToKKyAgICAgICAgd2luID0gaW1nd2luZG93KHNlbGYpCisgICAgICAgIHdpbi5vcGVuKHcsIGgsIHBpeG1hcCwgZGF0YSkKKyAgICAgICAgc2VsZi5sYXN0d2luID0gd2luCisKKyAgICBkZWYgaW5mbyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYubGFzdHdpbjoKKyAgICAgICAgICAgIHNlbGYubGFzdHdpbi5pbmZvKCkKKwogY2xhc3MgaW1nd2luZG93KEZyYW1lV29yay5XaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHBpeG1hcCwgZGF0YSk6Ci0JCXNlbGYucGl4bWFwID0gcGl4bWFwCi0JCXNlbGYuZGF0YSA9IGRhdGEKLQkJc2VsZi5waWN0cmVjdCA9ICgwLCAwLCB3aWR0aCwgaGVpZ2h0KQotCQlib3VuZHMgPSAoTEVGVCwgVE9QLCBMRUZUK3dpZHRoLCBUT1AraGVpZ2h0KQotCQkKLQkJc2VsZi53aWQgPSBXaW4uTmV3Q1dpbmRvdyhib3VuZHMsICJQaWN0dXJlIiwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsICphcmdzKToKLQkJcGFzcwotCQljdXJyZWN0ID0gc2VsZi5maXRyZWN0KCkKLQkJcHJpbnQgJ1BJQ1Q6Jywgc2VsZi5waWN0cmVjdAotCQlwcmludCAnV0lORDonLCBjdXJyZWN0Ci0JCXByaW50ICdBUkdTOicsIChzZWxmLnBpeG1hcCwgc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpLCBzZWxmLnBpY3RyZWN0LAotCQkJCWN1cnJlY3QsIFF1aWNrRHJhdy5zcmNDb3B5LCBOb25lKQotCQlzZWxmLmluZm8oKQotCQlRZC5Db3B5Qml0cyhzZWxmLnBpeG1hcCwgc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpLCBzZWxmLnBpY3RyZWN0LAotCQkJCWN1cnJlY3QsIFF1aWNrRHJhdy5zcmNDb3B5LCBOb25lKQotCQkKLQlkZWYgZml0cmVjdChzZWxmKToKLQkJIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKLQkJZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQotCQlzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKLQkJcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQotCQlwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQotCQlpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgotCQkJZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQotCQkJcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgotCQkJcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCi0JCWlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgotCQkJZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKLQkJCXBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKLQkJCXBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgotCQlyZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKLQkJCQlzY3JlZW5yZWN0WzFdK2ludChwaWNoZWlnaHQpKQotCQkJCQotCWRlZiBpbmZvKHNlbGYpOgotCQlncmFmID0gc2VsZi53aWQuR2V0V2luZG93UG9ydCgpCi0JCWJpdHMgPSBncmFmLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpCi0JCW1hY19pbWFnZS5kdW1wcGl4bWFwKGJpdHMucGl4bWFwX2RhdGEpCisgICAgZGVmIG9wZW4oc2VsZiwgd2lkdGgsIGhlaWdodCwgcGl4bWFwLCBkYXRhKToKKyAgICAgICAgc2VsZi5waXhtYXAgPSBwaXhtYXAKKyAgICAgICAgc2VsZi5kYXRhID0gZGF0YQorICAgICAgICBzZWxmLnBpY3RyZWN0ID0gKDAsIDAsIHdpZHRoLCBoZWlnaHQpCisgICAgICAgIGJvdW5kcyA9IChMRUZULCBUT1AsIExFRlQrd2lkdGgsIFRPUCtoZWlnaHQpCisKKyAgICAgICAgc2VsZi53aWQgPSBXaW4uTmV3Q1dpbmRvdyhib3VuZHMsICJQaWN0dXJlIiwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorCisgICAgZGVmIGRvX3VwZGF0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIHBhc3MKKyAgICAgICAgY3VycmVjdCA9IHNlbGYuZml0cmVjdCgpCisgICAgICAgIHByaW50ICdQSUNUOicsIHNlbGYucGljdHJlY3QKKyAgICAgICAgcHJpbnQgJ1dJTkQ6JywgY3VycmVjdAorICAgICAgICBwcmludCAnQVJHUzonLCAoc2VsZi5waXhtYXAsIHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoKSwgc2VsZi5waWN0cmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlY3QsIFF1aWNrRHJhdy5zcmNDb3B5LCBOb25lKQorICAgICAgICBzZWxmLmluZm8oKQorICAgICAgICBRZC5Db3B5Qml0cyhzZWxmLnBpeG1hcCwgc2VsZi53aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCaXRNYXBGb3JDb3B5Qml0cygpLCBzZWxmLnBpY3RyZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVjdCwgUXVpY2tEcmF3LnNyY0NvcHksIE5vbmUpCisKKyAgICBkZWYgZml0cmVjdChzZWxmKToKKyAgICAgICAgIiIiUmV0dXJuIHNlbGYucGljdHJlY3Qgc2NhbGVkIHRvIGZpdCBpbiB3aW5kb3ciIiIKKyAgICAgICAgZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQorICAgICAgICBzY3JlZW5yZWN0ID0gZ3JhZi5HZXRQb3J0Qm91bmRzKCkKKyAgICAgICAgcGljd2lkdGggPSBzZWxmLnBpY3RyZWN0WzJdIC0gc2VsZi5waWN0cmVjdFswXQorICAgICAgICBwaWNoZWlnaHQgPSBzZWxmLnBpY3RyZWN0WzNdIC0gc2VsZi5waWN0cmVjdFsxXQorICAgICAgICBpZiBwaWN3aWR0aCA+IHNjcmVlbnJlY3RbMl0gLSBzY3JlZW5yZWN0WzBdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljd2lkdGgpIC8gZmxvYXQoc2NyZWVucmVjdFsyXS1zY3JlZW5yZWN0WzBdKQorICAgICAgICAgICAgcGljd2lkdGggPSBwaWN3aWR0aCAvIGZhY3RvcgorICAgICAgICAgICAgcGljaGVpZ2h0ID0gcGljaGVpZ2h0IC8gZmFjdG9yCisgICAgICAgIGlmIHBpY2hlaWdodCA+IHNjcmVlbnJlY3RbM10gLSBzY3JlZW5yZWN0WzFdOgorICAgICAgICAgICAgZmFjdG9yID0gZmxvYXQocGljaGVpZ2h0KSAvIGZsb2F0KHNjcmVlbnJlY3RbM10tc2NyZWVucmVjdFsxXSkKKyAgICAgICAgICAgIHBpY3dpZHRoID0gcGljd2lkdGggLyBmYWN0b3IKKyAgICAgICAgICAgIHBpY2hlaWdodCA9IHBpY2hlaWdodCAvIGZhY3RvcgorICAgICAgICByZXR1cm4gKHNjcmVlbnJlY3RbMF0sIHNjcmVlbnJlY3RbMV0sIHNjcmVlbnJlY3RbMF0raW50KHBpY3dpZHRoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNjcmVlbnJlY3RbMV0raW50KHBpY2hlaWdodCkpCisKKyAgICBkZWYgaW5mbyhzZWxmKToKKyAgICAgICAgZ3JhZiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKQorICAgICAgICBiaXRzID0gZ3JhZi5HZXRQb3J0Qml0TWFwRm9yQ29weUJpdHMoKQorICAgICAgICBtYWNfaW1hZ2UuZHVtcHBpeG1hcChiaXRzLnBpeG1hcF9kYXRhKQogCiBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL2ltZ2Jyb3dzZS9tYWNfaW1hZ2UucHkgYi9NYWMvRGVtby9pbWdicm93c2UvbWFjX2ltYWdlLnB5CmluZGV4IDA5NGM1OGUuLjljOWVlYjcgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL2ltZ2Jyb3dzZS9tYWNfaW1hZ2UucHkKKysrIGIvTWFjL0RlbW8vaW1nYnJvd3NlL21hY19pbWFnZS5weQpAQCAtNiw1MSArNiw1MSBAQAogaW1wb3J0IE1hY09TCiAKIF9mbXRfdG9fbWFjID0gewotCWltZ2Zvcm1hdC5tYWNyZ2IxNiA6ICgxNiwgMTYsIDMsIDUpLAorICAgICAgICBpbWdmb3JtYXQubWFjcmdiMTYgOiAoMTYsIDE2LCAzLCA1KSwKIH0KIAogZGVmIG1rcGl4bWFwKHcsIGgsIGZtdCwgZGF0YSk6Ci0JIiIia2x1ZGdlIGEgcGl4bWFwIHRvZ2V0aGVyIiIiCi0JZm10aW5mbyA9IF9mbXRfdG9fbWFjW2ZtdF0KLQkKLQlydiA9IHN0cnVjdC5wYWNrKCJsSGhoaGhoaGxsbGhoaGhsbGwiLAotCQlpZChkYXRhKStNYWNPUy5zdHJpbmdfaWRfdG9fYnVmZmVyLCAjIEhBQ0sgSEFDSyEhCi0JCXcqMiArIDB4ODAwMCwKLQkJMCwgMCwgaCwgdywKLQkJMCwKLQkJMCwgMCwgIyBYWFhYPwotCQk3Mjw8MTYsIDcyPDwxNiwKLQkJZm10aW5mb1swXSwgZm10aW5mb1sxXSwKLQkJZm10aW5mb1syXSwgZm10aW5mb1szXSwKLQkJMCwgMCwgMCkKLSMjCXByaW50ICdPdXIgcGl4bWFwLCBzaXplICVkOiclbGVuKHJ2KQotIyMJZHVtcHBpeG1hcChydikKLQlyZXR1cm4gUWQuUmF3Qml0TWFwKHJ2KQorICAgICIiImtsdWRnZSBhIHBpeG1hcCB0b2dldGhlciIiIgorICAgIGZtdGluZm8gPSBfZm10X3RvX21hY1tmbXRdCisKKyAgICBydiA9IHN0cnVjdC5wYWNrKCJsSGhoaGhoaGxsbGhoaGhsbGwiLAorICAgICAgICAgICAgaWQoZGF0YSkrTWFjT1Muc3RyaW5nX2lkX3RvX2J1ZmZlciwgIyBIQUNLIEhBQ0shIQorICAgICAgICAgICAgdyoyICsgMHg4MDAwLAorICAgICAgICAgICAgMCwgMCwgaCwgdywKKyAgICAgICAgICAgIDAsCisgICAgICAgICAgICAwLCAwLCAjIFhYWFg/CisgICAgICAgICAgICA3Mjw8MTYsIDcyPDwxNiwKKyAgICAgICAgICAgIGZtdGluZm9bMF0sIGZtdGluZm9bMV0sCisgICAgICAgICAgICBmbXRpbmZvWzJdLCBmbXRpbmZvWzNdLAorICAgICAgICAgICAgMCwgMCwgMCkKKyMjICAgICAgcHJpbnQgJ091ciBwaXhtYXAsIHNpemUgJWQ6JyVsZW4ocnYpCisjIyAgICAgIGR1bXBwaXhtYXAocnYpCisgICAgcmV0dXJuIFFkLlJhd0JpdE1hcChydikKIAogZGVmIGR1bXBwaXhtYXAoZGF0YSk6Ci0JYmFzZUFkZHIsIFwKLQkJcm93Qnl0ZXMsIFwKLQkJdCwgbCwgYiwgciwgXAotCQlwbVZlcnNpb24sIFwKLQkJcGFja1R5cGUsIHBhY2tTaXplLCBcCi0JCWhSZXMsIHZSZXMsIFwKLQkJcGl4ZWxUeXBlLCBwaXhlbFNpemUsIFwKLQkJY21wQ291bnQsIGNtcFNpemUsIFwKLQkJcGxhbmVCeXRlcywgcG1UYWJsZSwgcG1SZXNlcnZlZCBcCi0JCQk9IHN0cnVjdC51bnBhY2soImxoaGhoaGhobGxsaGhoaGxsbCIsIGRhdGEpCi0JcHJpbnQgJ0Jhc2U6ICAgICAgIDB4JXgnJWJhc2VBZGRyCi0JcHJpbnQgJ3Jvd0J5dGVzOiAgICVkICgweCV4KSclKHJvd0J5dGVzJjB4M2ZmZiwgcm93Qnl0ZXMpCi0JcHJpbnQgJ3JlY3Q6ICAgICAgICVkLCAlZCwgJWQsICVkJyUodCwgbCwgYiwgcikKLQlwcmludCAncG1WZXJzaW9uOiAgMHgleCclcG1WZXJzaW9uCi0JcHJpbnQgJ3BhY2tpbmc6ICAgICVkICVkJyUocGFja1R5cGUsIHBhY2tTaXplKQotCXByaW50ICdyZXNvbHV0aW9uOiAlZiB4ICVmJyUoZmxvYXQoaFJlcykvMHgxMDAwMCwgZmxvYXQodlJlcykvMHgxMDAwMCkKLQlwcmludCAncGl4ZWx0eXBlOiAgJWQsIHNpemUgJWQnJShwaXhlbFR5cGUsIHBpeGVsU2l6ZSkKLQlwcmludCAnY29tcG9uZW50czogJWQsIHNpemUgJWQnJShjbXBDb3VudCwgY21wU2l6ZSkKLQlwcmludCAncGxhbmVCeXRlczogJWQgKDB4JXgpJyUocGxhbmVCeXRlcywgcGxhbmVCeXRlcykKLQlwcmludCAncG1UYWJsZTogICAgMHgleCclcG1UYWJsZQotCXByaW50ICdwbVJlc2VydmVkOiAweCV4JyVwbVJlc2VydmVkCi0JZm9yIGkgaW4gcmFuZ2UoMCwgbGVuKGRhdGEpLCAxNik6Ci0JCWZvciBqIGluIHJhbmdlKDE2KToKLQkJCWlmIGkgKyBqIDwgbGVuKGRhdGEpOgotCQkJCXByaW50ICclMDIuMngnJW9yZChkYXRhW2kral0pLAotCQlwcmludAorICAgIGJhc2VBZGRyLCBcCisgICAgICAgICAgICByb3dCeXRlcywgXAorICAgICAgICAgICAgdCwgbCwgYiwgciwgXAorICAgICAgICAgICAgcG1WZXJzaW9uLCBcCisgICAgICAgICAgICBwYWNrVHlwZSwgcGFja1NpemUsIFwKKyAgICAgICAgICAgIGhSZXMsIHZSZXMsIFwKKyAgICAgICAgICAgIHBpeGVsVHlwZSwgcGl4ZWxTaXplLCBcCisgICAgICAgICAgICBjbXBDb3VudCwgY21wU2l6ZSwgXAorICAgICAgICAgICAgcGxhbmVCeXRlcywgcG1UYWJsZSwgcG1SZXNlcnZlZCBcCisgICAgICAgICAgICAgICAgICAgID0gc3RydWN0LnVucGFjaygibGhoaGhoaGhsbGxoaGhobGxsIiwgZGF0YSkKKyAgICBwcmludCAnQmFzZTogICAgICAgMHgleCclYmFzZUFkZHIKKyAgICBwcmludCAncm93Qnl0ZXM6ICAgJWQgKDB4JXgpJyUocm93Qnl0ZXMmMHgzZmZmLCByb3dCeXRlcykKKyAgICBwcmludCAncmVjdDogICAgICAgJWQsICVkLCAlZCwgJWQnJSh0LCBsLCBiLCByKQorICAgIHByaW50ICdwbVZlcnNpb246ICAweCV4JyVwbVZlcnNpb24KKyAgICBwcmludCAncGFja2luZzogICAgJWQgJWQnJShwYWNrVHlwZSwgcGFja1NpemUpCisgICAgcHJpbnQgJ3Jlc29sdXRpb246ICVmIHggJWYnJShmbG9hdChoUmVzKS8weDEwMDAwLCBmbG9hdCh2UmVzKS8weDEwMDAwKQorICAgIHByaW50ICdwaXhlbHR5cGU6ICAlZCwgc2l6ZSAlZCclKHBpeGVsVHlwZSwgcGl4ZWxTaXplKQorICAgIHByaW50ICdjb21wb25lbnRzOiAlZCwgc2l6ZSAlZCclKGNtcENvdW50LCBjbXBTaXplKQorICAgIHByaW50ICdwbGFuZUJ5dGVzOiAlZCAoMHgleCknJShwbGFuZUJ5dGVzLCBwbGFuZUJ5dGVzKQorICAgIHByaW50ICdwbVRhYmxlOiAgICAweCV4JyVwbVRhYmxlCisgICAgcHJpbnQgJ3BtUmVzZXJ2ZWQ6IDB4JXgnJXBtUmVzZXJ2ZWQKKyAgICBmb3IgaSBpbiByYW5nZSgwLCBsZW4oZGF0YSksIDE2KToKKyAgICAgICAgZm9yIGogaW4gcmFuZ2UoMTYpOgorICAgICAgICAgICAgaWYgaSArIGogPCBsZW4oZGF0YSk6CisgICAgICAgICAgICAgICAgcHJpbnQgJyUwMi4yeCclb3JkKGRhdGFbaStqXSksCisgICAgICAgIHByaW50CmRpZmYgLS1naXQgYS9NYWMvRGVtby9tbHRlL21sdGVkLnB5IGIvTWFjL0RlbW8vbWx0ZS9tbHRlZC5weQppbmRleCAzODEzNDVhLi4zMjNlYTYyIDEwMDY0NAotLS0gYS9NYWMvRGVtby9tbHRlL21sdGVkLnB5CisrKyBiL01hYy9EZW1vL21sdGUvbWx0ZWQucHkKQEAgLTE1LDM2MSArMTUsMzYwIEBACiBmcm9tIENhcmJvbiBpbXBvcnQgTWx0ZQogCiBVTkRPTEFCRUxTID0gWyAjIEluZGV4ZWQgYnkgTUxURUNhblVuZG8oKSB2YWx1ZQotCSJUeXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkZvbnQgQ2hhbmdlIiwgIkNvbG9yIENoYW5nZSIsICJTaXplIENoYW5nZSIsCi0JIlN0eWxlIENoYW5nZSIsICJBbGlnbiBMZWZ0IiwgIkFsaWduIENlbnRlciIsICJBbGlnbiBSaWdodCIsICJEcm9wIiwgIk1vdmUiXQotCQorICAgICAgICAiVHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJGb250IENoYW5nZSIsICJDb2xvciBDaGFuZ2UiLCAiU2l6ZSBDaGFuZ2UiLAorICAgICAgICAiU3R5bGUgQ2hhbmdlIiwgIkFsaWduIExlZnQiLCAiQWxpZ24gQ2VudGVyIiwgIkFsaWduIFJpZ2h0IiwgIkRyb3AiLCAiTW92ZSJdCisKIGNsYXNzIE1sdGVXaW5kb3coV2luZG93KToKLQlkZWYgb3BlbihzZWxmLCBwYXRoLCBuYW1lLCBkYXRhKToKLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBuYW1lCi0JCXIgPSB3aW5kb3dib3VuZHMoNDAwLCA0MDApCi0JCXcgPSBXaW4uTmV3V2luZG93KHIsIG5hbWUsIDEsIDAsIC0xLCAxLCAwKQotCQlzZWxmLndpZCA9IHcKLQkJZmxhZ3MgPSBNYWNUZXh0RWRpdG9yLmtUWE5EcmF3R3Jvd0ljb25NYXNrfE1hY1RleHRFZGl0b3Iua1RYTldhbnRIU2Nyb2xsQmFyTWFza3wgXAotCQkJCU1hY1RleHRFZGl0b3Iua1RYTldhbnRWU2Nyb2xsQmFyTWFzawotCQlzZWxmLnRlZCwgc2VsZi5mcmFtZWlkID0gTWx0ZS5UWE5OZXdPYmplY3QoTm9uZSwgdywgTm9uZSwgZmxhZ3MsIE1hY1RleHRFZGl0b3Iua1RYTlRleHRFZGl0U3R5bGVGcmFtZVR5cGUsCi0JCQkJTWFjVGV4dEVkaXRvci5rVFhOVGV4dEZpbGUsIE1hY1RleHRFZGl0b3Iua1RYTk1hY09TRW5jb2RpbmcpCi0JCXNlbGYudGVkLlRYTlNldERhdGEoTWFjVGV4dEVkaXRvci5rVFhOVGV4dERhdGEsIGRhdGEsIDAsIDB4N2ZmZmZmZmYpCi0JCXNlbGYuY2hhbmdlZCA9IDAKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCXNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKLQkJCi0JZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgotCQlzZWxmLnRlZC5UWE5JZGxlKCkJCi0JCXNlbGYudGVkLlRYTkFkanVzdEN1cnNvcihOb25lKQotCQkKKyAgICBkZWYgb3BlbihzZWxmLCBwYXRoLCBuYW1lLCBkYXRhKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHIgPSB3aW5kb3dib3VuZHMoNDAwLCA0MDApCisgICAgICAgIHcgPSBXaW4uTmV3V2luZG93KHIsIG5hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLndpZCA9IHcKKyAgICAgICAgZmxhZ3MgPSBNYWNUZXh0RWRpdG9yLmtUWE5EcmF3R3Jvd0ljb25NYXNrfE1hY1RleHRFZGl0b3Iua1RYTldhbnRIU2Nyb2xsQmFyTWFza3wgXAorICAgICAgICAgICAgICAgICAgICAgICAgTWFjVGV4dEVkaXRvci5rVFhOV2FudFZTY3JvbGxCYXJNYXNrCisgICAgICAgIHNlbGYudGVkLCBzZWxmLmZyYW1laWQgPSBNbHRlLlRYTk5ld09iamVjdChOb25lLCB3LCBOb25lLCBmbGFncywgTWFjVGV4dEVkaXRvci5rVFhOVGV4dEVkaXRTdHlsZUZyYW1lVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY1RleHRFZGl0b3Iua1RYTlRleHRGaWxlLCBNYWNUZXh0RWRpdG9yLmtUWE5NYWNPU0VuY29kaW5nKQorICAgICAgICBzZWxmLnRlZC5UWE5TZXREYXRhKE1hY1RleHRFZGl0b3Iua1RYTlRleHREYXRhLCBkYXRhLCAwLCAweDdmZmZmZmZmKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorICAgICAgICBzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCiAKLQkJCi0JZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgotCQlpZiBvbm9mZjoKLSMjCQkJc2VsZi50ZWQuVFhOQWN0aXZhdGUoc2VsZi5mcmFtZWlkLCAwKQotCQkJc2VsZi50ZWQuVFhORm9jdXMoMSkKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKLQkJZWxzZToKLQkJCXNlbGYudGVkLlRYTkZvY3VzKDApCi0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgIGRlZiBkb19pZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZWQuVFhOSWRsZSgpCisgICAgICAgIHNlbGYudGVkLlRYTkFkanVzdEN1cnNvcihOb25lKQogCi0JZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKLQkJc2VsZi50ZWQuVFhORHJhdyhOb25lKQotCQkKLQlkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgotCQlzZWxmLnRlZC5UWE5SZXNpemVGcmFtZSh3aWR0aCwgaGVpZ2h0LCBzZWxmLmZyYW1laWQpCi0JCQotCWRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKLQkJc2VsZi50ZWQuVFhOQ2xpY2soZXZ0KQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKLQkJc2VsZi50ZWQuVFhOS2V5RG93bihldmVudCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5jaGFuZ2VkOgotCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJc2VsZi5tZW51X3NhdmUoKQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6Ci0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYudGVkLlRYTkRlbGV0ZU9iamVjdCgpCi0JCWRlbCBzZWxmLnRlZAotIyMJCWRlbCBzZWxmLnRlZHRleHRoYW5kbGUKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQkKLQlkZWYgbWVudV9zYXZlKHNlbGYpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJc2VsZi5tZW51X3NhdmVfYXMoKQotCQkJcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5Ci0JCWRoYW5kbGUgPSBzZWxmLnRlZC5UWE5HZXREYXRhKDAsIDB4N2ZmZmZmZmYpCi0JCWRhdGEgPSBkaGFuZGxlLmRhdGEKLQkJZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCi0JCWZwLndyaXRlKGRhdGEpCi0JCWlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCi0JCWZwLmNsb3NlKCkKLQkJc2VsZi5jaGFuZ2VkID0gMAotCQkKLQlkZWYgbWVudV9zYXZlX2FzKHNlbGYpOgotCQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonKQotCQlpZiBub3QgcGF0aDogcmV0dXJuCi0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnBhdGgpWy0xXQotCQlzZWxmLndpZC5TZXRXVGl0bGUoc2VsZi5uYW1lKQotCQlzZWxmLm1lbnVfc2F2ZSgpCi0JCQotCWRlZiBtZW51X2N1dChzZWxmKToKLSMjCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5UWE5DdXQoKQotIyMjCQlNbHRlLkNvbnZlcnRUb1B1YmxpY1NjcmFwKCkKLSMjCQlTY3JhcC5aZXJvU2NyYXAoKQotIyMJCXNlbGYudGVkLldFQ3V0KCkKLSMjCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQkKLQlkZWYgbWVudV9jb3B5KHNlbGYpOgotIyMJCVNjcmFwLlplcm9TY3JhcCgpCi0JCXNlbGYudGVkLlRYTkNvcHkoKQotIyMjCQlNbHRlLkNvbnZlcnRUb1B1YmxpY1NjcmFwKCkKLSMjCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfcGFzdGUoc2VsZik6Ci0jIyMJCU1sdGUuQ29udmVydEZyb21QdWJsaWNTY3JhcCgpCi0JCXNlbGYudGVkLlRYTlBhc3RlKCkKLSMjCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQkKLQlkZWYgbWVudV9jbGVhcihzZWxmKToKLSMjCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5UWE5DbGVhcigpCi0jIwkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKIAotCWRlZiBtZW51X3VuZG8oc2VsZik6Ci0JCXNlbGYudGVkLlRYTlVuZG8oKQotIyMJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkJCQotCWRlZiBtZW51X3JlZG8oc2VsZik6Ci0JCXNlbGYudGVkLlRYTlJlZG8oKQotIyMJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkJCQotCWRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKLQkJc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5UWE5HZXRTZWxlY3Rpb24oKQotCQlyZXR1cm4gc3RhcnQgPCBzdG9wCi0JCQotCWRlZiBjYW5fcGFzdGUoc2VsZik6Ci0JCXJldHVybiBNbHRlLlRYTklzU2NyYXBQYXN0YWJsZSgpCi0JCQotCWRlZiBjYW5fdW5kbyhzZWxmKToKLQkJY2FuLCB3aGljaCA9IHNlbGYudGVkLlRYTkNhblVuZG8oKQotCQlpZiBub3QgY2FuOgotCQkJcmV0dXJuIE5vbmUKLQkJaWYgd2hpY2ggPj0gbGVuKFVORE9MQUJFTFMpOgotCQkJIyBVbnNwZWNpZmllZCB1bmRvCi0JCQlyZXR1cm4gIlVuZG8iCi0JCXdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KLQkJCi0JCXJldHVybiAiVW5kbyAiK3doaWNoCiAKLQlkZWYgY2FuX3JlZG8oc2VsZik6Ci0JCWNhbiwgd2hpY2ggPSBzZWxmLnRlZC5UWE5DYW5SZWRvKCkKLQkJaWYgbm90IGNhbjoKLQkJCXJldHVybiBOb25lCi0JCWlmIHdoaWNoID49IGxlbihVTkRPTEFCRUxTKToKLQkJCSMgVW5zcGVjaWZpZWQgdW5kbwotCQkJcmV0dXJuICJSZWRvIgotCQl3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCi0JCQotCQlyZXR1cm4gIlJlZG8gIit3aGljaAorICAgIGRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKKyAgICAgICAgaWYgb25vZmY6CisjIyAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5UWE5BY3RpdmF0ZShzZWxmLmZyYW1laWQsIDApCisgICAgICAgICAgICBzZWxmLnRlZC5UWE5Gb2N1cygxKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZWQuVFhORm9jdXMoMCkKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgorICAgICAgICBzZWxmLnRlZC5UWE5EcmF3KE5vbmUpCisKKyAgICBkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgorICAgICAgICBzZWxmLnRlZC5UWE5SZXNpemVGcmFtZSh3aWR0aCwgaGVpZ2h0LCBzZWxmLmZyYW1laWQpCisKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6CisgICAgICAgIHNlbGYudGVkLlRYTkNsaWNrKGV2dCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgorICAgICAgICBzZWxmLnRlZC5UWE5LZXlEb3duKGV2ZW50KQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGFuZ2VkOgorICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQorICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYudGVkLlRYTkRlbGV0ZU9iamVjdCgpCisgICAgICAgIGRlbCBzZWxmLnRlZAorIyMgICAgICAgICAgICAgIGRlbCBzZWxmLnRlZHRleHRoYW5kbGUKKyAgICAgICAgc2VsZi5kb19wb3N0Y2xvc2UoKQorCisgICAgZGVmIG1lbnVfc2F2ZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aDoKKyAgICAgICAgICAgIHNlbGYubWVudV9zYXZlX2FzKCkKKyAgICAgICAgICAgIHJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQorICAgICAgICBkaGFuZGxlID0gc2VsZi50ZWQuVFhOR2V0RGF0YSgwLCAweDdmZmZmZmZmKQorICAgICAgICBkYXRhID0gZGhhbmRsZS5kYXRhCisgICAgICAgIGZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQorICAgICAgICBmcC53cml0ZShkYXRhKQorICAgICAgICBpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDAKKworICAgIGRlZiBtZW51X3NhdmVfYXMoc2VsZik6CisgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCisgICAgICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCisgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCisgICAgICAgIHNlbGYubWVudV9zYXZlKCkKKworICAgIGRlZiBtZW51X2N1dChzZWxmKToKKyMjICAgICAgICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5UWE5DdXQoKQorIyMjICAgICAgICAgICAgIE1sdGUuQ29udmVydFRvUHVibGljU2NyYXAoKQorIyMgICAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisjIyAgICAgICAgICAgICAgc2VsZi50ZWQuV0VDdXQoKQorIyMgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgbWVudV9jb3B5KHNlbGYpOgorIyMgICAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIHNlbGYudGVkLlRYTkNvcHkoKQorIyMjICAgICAgICAgICAgIE1sdGUuQ29udmVydFRvUHVibGljU2NyYXAoKQorIyMgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcGFzdGUoc2VsZik6CisjIyMgICAgICAgICAgICAgTWx0ZS5Db252ZXJ0RnJvbVB1YmxpY1NjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuVFhOUGFzdGUoKQorIyMgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgbWVudV9jbGVhcihzZWxmKToKKyMjICAgICAgICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5UWE5DbGVhcigpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X3VuZG8oc2VsZik6CisgICAgICAgIHNlbGYudGVkLlRYTlVuZG8oKQorIyMgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcmVkbyhzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVFhOUmVkbygpCisjIyAgICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgaGF2ZV9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi50ZWQuVFhOR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgcmV0dXJuIHN0YXJ0IDwgc3RvcAorCisgICAgZGVmIGNhbl9wYXN0ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIE1sdGUuVFhOSXNTY3JhcFBhc3RhYmxlKCkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmKToKKyAgICAgICAgY2FuLCB3aGljaCA9IHNlbGYudGVkLlRYTkNhblVuZG8oKQorICAgICAgICBpZiBub3QgY2FuOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgd2hpY2ggPj0gbGVuKFVORE9MQUJFTFMpOgorICAgICAgICAgICAgIyBVbnNwZWNpZmllZCB1bmRvCisgICAgICAgICAgICByZXR1cm4gIlVuZG8iCisgICAgICAgIHdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KKworICAgICAgICByZXR1cm4gIlVuZG8gIit3aGljaAorCisgICAgZGVmIGNhbl9yZWRvKHNlbGYpOgorICAgICAgICBjYW4sIHdoaWNoID0gc2VsZi50ZWQuVFhOQ2FuUmVkbygpCisgICAgICAgIGlmIG5vdCBjYW46CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiB3aGljaCA+PSBsZW4oVU5ET0xBQkVMUyk6CisgICAgICAgICAgICAjIFVuc3BlY2lmaWVkIHVuZG8KKyAgICAgICAgICAgIHJldHVybiAiUmVkbyIKKyAgICAgICAgd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQorCisgICAgICAgIHJldHVybiAiUmVkbyAiK3doaWNoCiAKIGNsYXNzIE1sdGVkKEFwcGxpY2F0aW9uKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCUFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYubnVtID0gMAotCQlzZWxmLmFjdGl2ZSA9IE5vbmUKLQkJc2VsZi51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKLQkJc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQotCQlzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKLQkJc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCi0JCQotCQlzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCi0JCXNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQotCQlzZWxmLnJlZG9pdGVtID0gTWVudUl0ZW0obSwgIlJlZG8iLCBOb25lLCBzZWxmLnJlZG8pCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCi0JCXNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQotCQlzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKLQkJc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKLQkJCi0JCSMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6Ci0JCXNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KLQkJc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCi0JCXNlbGYud2luZG93Z3JvdXBfb24gPSAtMQotCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQotCQlzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQotCQlzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCi0JCXNlbGYucmVkb19sYWJlbCA9ICJuZXZlciIKLQkJCi0JZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6Ci0JCWNoYW5nZWQgPSAwCi0JCW9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCi0JCWlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246Ci0JCQlmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgotCQkJCW0uZW5hYmxlKG9uKQotCQkJc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCi0JCQljaGFuZ2VkID0gMQotCQlpZiBvbjoKLQkJCSMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQotCQkJb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCi0JCQlpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246Ci0JCQkJZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgotCQkJCQltLmVuYWJsZShvbikKLQkJCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCi0JCQlpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246Ci0JCQkJc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQotCQkJCXNlbGYucGFzdGVncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQotCQkJaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgotCQkJCWlmIG9uOgotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCi0JCQkJCXNlbGYudW5kb19sYWJlbCA9IG9uCi0JCQkJZWxzZToKLQkJCQkJc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl9yZWRvKCkKLQkJCWlmIG9uIDw+IHNlbGYucmVkb19sYWJlbDoKLQkJCQlpZiBvbjoKLQkJCQkJc2VsZi5yZWRvaXRlbS5lbmFibGUoMSkKLQkJCQkJc2VsZi5yZWRvaXRlbS5zZXR0ZXh0KG9uKQotCQkJCQlzZWxmLnJlZG9fbGFiZWwgPSBvbgotCQkJCWVsc2U6Ci0JCQkJCXNlbGYucmVkb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byByZWRvIikKLQkJCQkJc2VsZi5yZWRvaXRlbS5lbmFibGUoMCkKLQkJCQljaGFuZ2VkID0gMQotCQlpZiBjaGFuZ2VkOgotCQkJRHJhd01lbnVCYXIoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5udW0gPSAwCisgICAgICAgIHNlbGYuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnVwZGF0ZW1lbnViYXIoKQogCi0JIwotCSMgQXBwbGUgbWVudQotCSMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBNYWNUZXh0RWRpdG9yIikKLQkJCQotCSMKLQkjIEZpbGUgbWVudQotCSMKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQorICAgICAgICBzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCisgICAgICAgIHNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQorICAgICAgICBzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKIAotCWRlZiBvcGVuKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigwKQotCQkKLQlkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDEpCisgICAgICAgIHNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKKyAgICAgICAgc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCisgICAgICAgIHNlbGYucmVkb2l0ZW0gPSBNZW51SXRlbShtLCAiUmVkbyIsIE5vbmUsIHNlbGYucmVkbykKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKKyAgICAgICAgc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCisgICAgICAgIHNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQorICAgICAgICBzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQogCi0JZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgotCQlpZiBhc2tmaWxlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCi0JCQl0cnk6Ci0JCQkJZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJZnAuY2xvc2UoKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlwYXRoID0gTm9uZQotCQkJbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KLQkJCWRhdGEgPSAnJwotCQl3ID0gTWx0ZVdpbmRvdyhzZWxmKQotCQl3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKLQkJc2VsZi5udW0gPSBzZWxmLm51bSArIDEKLQkJCi0JZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5jbG9zZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkJCi0JCQotCWRlZiBxdWl0KHNlbGYsICphcmdzKToKLQkJZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKLQkJCXcuY2xvc2UoKQotCQlpZiBzZWxmLl93aW5kb3dzOgotCQkJcmV0dXJuCi0JCXNlbGYuX3F1aXQoKQotCQkKLQkjCi0JIyBFZGl0IG1lbnUKLQkjCi0JCi0JZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiByZWRvKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3JlZG8oKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY3V0KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjb3B5KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICAjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgorICAgICAgICBzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sIHNlbGYuZWRpdG1lbnVdCisgICAgICAgIHNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQorICAgICAgICBzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi51bmRvX2xhYmVsID0gIm5ldmVyIgorICAgICAgICBzZWxmLnJlZG9fbGFiZWwgPSAibmV2ZXIiCiAKLQlkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQkjCi0JIyBPdGhlciBzdHVmZgotCSMJCisgICAgZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6CisgICAgICAgIGNoYW5nZWQgPSAwCisgICAgICAgIG9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCisgICAgICAgIGlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246CisgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgorICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCisgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246CisgICAgICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgorICAgICAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246CisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgorICAgICAgICAgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb19sYWJlbCA9IG9uCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl9yZWRvKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYucmVkb19sYWJlbDoKKyAgICAgICAgICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWRvaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWRvaXRlbS5zZXR0ZXh0KG9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnJlZG9fbGFiZWwgPSBvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYucmVkb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byByZWRvIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5yZWRvaXRlbS5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgRHJhd01lbnVCYXIoKQogCi0JZGVmIGlkbGUoc2VsZiwgZXZlbnQpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmRvX2lkbGUoZXZlbnQpCi0JCWVsc2U6Ci0JCQlRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKKyAgICAjCisgICAgIyBBcHBsZSBtZW51CisgICAgIworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiQSBzaW1wbGUgc2luZ2xlLWZvbnQgdGV4dCBlZGl0b3IgYmFzZWQgb24gTWFjVGV4dEVkaXRvciIpCisKKyAgICAjCisgICAgIyBGaWxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgb3BlbihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMCkKKworICAgIGRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMSkKKworICAgIGRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKKyAgICAgICAgaWYgYXNrZmlsZToKKyAgICAgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCisgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCisgICAgICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgdyA9IE1sdGVXaW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCisgICAgICAgIHNlbGYubnVtID0gc2VsZi5udW0gKyAxCisKKyAgICBkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmNsb3NlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworCisgICAgZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgorICAgICAgICAgICAgdy5jbG9zZSgpCisgICAgICAgIGlmIHNlbGYuX3dpbmRvd3M6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICAjCisgICAgIyBFZGl0IG1lbnUKKyAgICAjCisKKyAgICBkZWYgdW5kbyhzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV91bmRvKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiByZWRvKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3JlZG8oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGN1dChzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jdXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNsZWFyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgICMKKyAgICAjIE90aGVyIHN0dWZmCisgICAgIworCisgICAgZGVmIGlkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmRvX2lkbGUoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKIAogZGVmIG1haW4oKToKLQlNbHRlLlRYTkluaXRUZXh0ZW5zaW9uKDApCi0JdHJ5OgotCQlBcHAgPSBNbHRlZCgpCi0JCUFwcC5tYWlubG9vcCgpCi0JZmluYWxseToKLQkJTWx0ZS5UWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCkKLQkKKyAgICBNbHRlLlRYTkluaXRUZXh0ZW5zaW9uKDApCisgICAgdHJ5OgorICAgICAgICBBcHAgPSBNbHRlZCgpCisgICAgICAgIEFwcC5tYWlubG9vcCgpCisgICAgZmluYWxseToKKyAgICAgICAgTWx0ZS5UWE5UZXJtaW5hdGVUZXh0ZW5zaW9uKCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3F1aWNrdGltZS9Nb3ZpZUluV2luZG93LnB5IGIvTWFjL0RlbW8vcXVpY2t0aW1lL01vdmllSW5XaW5kb3cucHkKaW5kZXggZWM0YmVhZS4uMDBmNTk2ZSAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vcXVpY2t0aW1lL01vdmllSW5XaW5kb3cucHkKKysrIGIvTWFjL0RlbW8vcXVpY2t0aW1lL01vdmllSW5XaW5kb3cucHkKQEAgLTE4LDU0ICsxOCw1MyBAQAogCiAKIGRlZiBtYWluKCk6Ci0JIyBza2lwIHRoZSB0b29sYm94IGluaXRpYWxpemF0aW9ucywgYWxyZWFkeSBkb25lCi0JIyBYWFhYIFNob3VsZCB1c2UgZ2VzdGFsdCBoZXJlIHRvIGNoZWNrIGZvciBxdWlja3RpbWUgdmVyc2lvbgotCVF0LkVudGVyTW92aWVzKCkKLQkKLQkjIEdldCB0aGUgbW92aWUgZmlsZQotCWlmIGxlbihzeXMuYXJndikgPiAxOgotCQlmaWxlbmFtZSA9IHN5cy5hcmd2WzFdCi0JZWxzZToKLQkJZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbigpICMgV2FzOiBRdWlja1RpbWUuTW92aWVGaWxlVHlwZQotCWlmIG5vdCBmaWxlbmFtZToKLQkJc3lzLmV4aXQoMCkKLQkJCi0JIyBPcGVuIHRoZSB3aW5kb3cKLQlib3VuZHMgPSAoMTc1LCA3NSwgMTc1KzE2MCwgNzUrMTIwKQotCXRoZVdpbmRvdyA9IFdpbi5OZXdDV2luZG93KGJvdW5kcywgb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sIDEsIDAsIC0xLCAwLCAwKQotCVFkLlNldFBvcnQodGhlV2luZG93KQotCSMgWFhYWCBOZWVkZWQ/IFNldEdXb3JsZCgoQ0dyYWZQdHIpdGhlV2luZG93LCBuaWwpCi0JCi0JcGxheU1vdmllSW5XaW5kb3codGhlV2luZG93LCBmaWxlbmFtZSwgdGhlV2luZG93LkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCi0JCisgICAgIyBza2lwIHRoZSB0b29sYm94IGluaXRpYWxpemF0aW9ucywgYWxyZWFkeSBkb25lCisgICAgIyBYWFhYIFNob3VsZCB1c2UgZ2VzdGFsdCBoZXJlIHRvIGNoZWNrIGZvciBxdWlja3RpbWUgdmVyc2lvbgorICAgIFF0LkVudGVyTW92aWVzKCkKKworICAgICMgR2V0IHRoZSBtb3ZpZSBmaWxlCisgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDE6CisgICAgICAgIGZpbGVuYW1lID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKCkgIyBXYXM6IFF1aWNrVGltZS5Nb3ZpZUZpbGVUeXBlCisgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgIyBPcGVuIHRoZSB3aW5kb3cKKyAgICBib3VuZHMgPSAoMTc1LCA3NSwgMTc1KzE2MCwgNzUrMTIwKQorICAgIHRoZVdpbmRvdyA9IFdpbi5OZXdDV2luZG93KGJvdW5kcywgb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0sIDEsIDAsIC0xLCAwLCAwKQorICAgIFFkLlNldFBvcnQodGhlV2luZG93KQorICAgICMgWFhYWCBOZWVkZWQ/IFNldEdXb3JsZCgoQ0dyYWZQdHIpdGhlV2luZG93LCBuaWwpCisKKyAgICBwbGF5TW92aWVJbldpbmRvdyh0aGVXaW5kb3csIGZpbGVuYW1lLCB0aGVXaW5kb3cuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKKwogZGVmIHBsYXlNb3ZpZUluV2luZG93KHRoZVdpbmRvdywgdGhlRmlsZSwgbW92aWVCb3gpOgotCSIiIlBsYXkgYSBtb3ZpZSBpbiBhIHdpbmRvdyIiIgotCSMgWFhYWCBOZWVkZWQ/IAlTZXRHV29ybGQoKENHcmFmUHRyKXRoZVdpbmRvdywgbmlsKTsKLQkKLQkjIEdldCB0aGUgbW92aWUKLQl0aGVNb3ZpZSA9IGxvYWRNb3ZpZSh0aGVGaWxlKQotCQotCSMgU2V0IHdoZXJlIHdlIHdhbnQgaXQKLQl0aGVNb3ZpZS5TZXRNb3ZpZUJveChtb3ZpZUJveCkKLQkKLQkjIFN0YXJ0IGF0IHRoZSBiZWdpbm5pbmcKLQl0aGVNb3ZpZS5Hb1RvQmVnaW5uaW5nT2ZNb3ZpZSgpCi0JCi0JIyBHaXZlIGEgbGl0dGxlIHRpbWUgdG8gcHJlcm9sbAotCXRoZU1vdmllLk1vdmllc1Rhc2soMCkKLQkKLQkjIFN0YXJ0IHBsYXlpbmcKLQl0aGVNb3ZpZS5TdGFydE1vdmllKCkKLQkKLQl3aGlsZSBub3QgdGhlTW92aWUuSXNNb3ZpZURvbmUoKSBhbmQgbm90IEV2dC5CdXR0b24oKToKLQkJdGhlTW92aWUuTW92aWVzVGFzaygwKQotCQkJCisgICAgIiIiUGxheSBhIG1vdmllIGluIGEgd2luZG93IiIiCisgICAgIyBYWFhYIE5lZWRlZD8gIFNldEdXb3JsZCgoQ0dyYWZQdHIpdGhlV2luZG93LCBuaWwpOworCisgICAgIyBHZXQgdGhlIG1vdmllCisgICAgdGhlTW92aWUgPSBsb2FkTW92aWUodGhlRmlsZSkKKworICAgICMgU2V0IHdoZXJlIHdlIHdhbnQgaXQKKyAgICB0aGVNb3ZpZS5TZXRNb3ZpZUJveChtb3ZpZUJveCkKKworICAgICMgU3RhcnQgYXQgdGhlIGJlZ2lubmluZworICAgIHRoZU1vdmllLkdvVG9CZWdpbm5pbmdPZk1vdmllKCkKKworICAgICMgR2l2ZSBhIGxpdHRsZSB0aW1lIHRvIHByZXJvbGwKKyAgICB0aGVNb3ZpZS5Nb3ZpZXNUYXNrKDApCisKKyAgICAjIFN0YXJ0IHBsYXlpbmcKKyAgICB0aGVNb3ZpZS5TdGFydE1vdmllKCkKKworICAgIHdoaWxlIG5vdCB0aGVNb3ZpZS5Jc01vdmllRG9uZSgpIGFuZCBub3QgRXZ0LkJ1dHRvbigpOgorICAgICAgICB0aGVNb3ZpZS5Nb3ZpZXNUYXNrKDApCisKIGRlZiBsb2FkTW92aWUodGhlRmlsZSk6Ci0JIiIiTG9hZCBhIG1vdmllIGdpdmVuIGFuIGZzc3BlYy4gUmV0dXJuIHRoZSBtb3ZpZSBvYmplY3QiIiIKLQltb3ZpZVJlc1JlZiA9IFF0Lk9wZW5Nb3ZpZUZpbGUodGhlRmlsZSwgMSkKLQltb3ZpZSwgZDEsIGQyID0gUXQuTmV3TW92aWVGcm9tRmlsZShtb3ZpZVJlc1JlZiwgMCwgUXVpY2tUaW1lLm5ld01vdmllQWN0aXZlKQotCXJldHVybiBtb3ZpZQotCQorICAgICIiIkxvYWQgYSBtb3ZpZSBnaXZlbiBhbiBmc3NwZWMuIFJldHVybiB0aGUgbW92aWUgb2JqZWN0IiIiCisgICAgbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHRoZUZpbGUsIDEpCisgICAgbW92aWUsIGQxLCBkMiA9IFF0Lk5ld01vdmllRnJvbUZpbGUobW92aWVSZXNSZWYsIDAsIFF1aWNrVGltZS5uZXdNb3ZpZUFjdGl2ZSkKKyAgICByZXR1cm4gbW92aWUKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3F1aWNrdGltZS9WZXJ5U2ltcGxlUGxheWVyLnB5IGIvTWFjL0RlbW8vcXVpY2t0aW1lL1ZlcnlTaW1wbGVQbGF5ZXIucHkKaW5kZXggZGU2NGUzZi4uMjkzMGVhYyAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vcXVpY2t0aW1lL1ZlcnlTaW1wbGVQbGF5ZXIucHkKKysrIGIvTWFjL0RlbW8vcXVpY2t0aW1lL1ZlcnlTaW1wbGVQbGF5ZXIucHkKQEAgLTE4LDc2ICsxOCw3NSBAQAogIyBYWFhYIG1heGJvdW5kcyA9ICg0MCwgNDAsIDEwMDAsIDEwMDApCiAKIGRlZiBtYWluKCk6Ci0JcHJpbnQgJ2hlbGxvIHdvcmxkJyAjIFhYWFgKLQkjIHNraXAgdGhlIHRvb2xib3ggaW5pdGlhbGl6YXRpb25zLCBhbHJlYWR5IGRvbmUKLQkjIFhYWFggU2hvdWxkIHVzZSBnZXN0YWx0IGhlcmUgdG8gY2hlY2sgZm9yIHF1aWNrdGltZSB2ZXJzaW9uCi0JUXQuRW50ZXJNb3ZpZXMoKQotCQotCSMgR2V0IHRoZSBtb3ZpZSBmaWxlCi0JZnNzID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4od2FudGVkPUZpbGUuRlNTcGVjKSAjIFdhczogUXVpY2tUaW1lLk1vdmllRmlsZVR5cGUKLQlpZiBub3QgZnNzOgotCQlzeXMuZXhpdCgwKQotCQkKLQkjIE9wZW4gdGhlIHdpbmRvdwotCWJvdW5kcyA9ICgxNzUsIDc1LCAxNzUrMTYwLCA3NSsxMjApCi0JdGhlV2luZG93ID0gV2luLk5ld0NXaW5kb3coYm91bmRzLCBmc3MuYXNfdHVwbGUoKVsyXSwgMCwgMCwgLTEsIDEsIDApCi0JIyBYWFhYIE5lZWRlZD8gU2V0R1dvcmxkKChDR3JhZlB0cil0aGVXaW5kb3csIG5pbCkKLQlRZC5TZXRQb3J0KHRoZVdpbmRvdykKLQkKLQkjIEdldCB0aGUgbW92aWUKLQl0aGVNb3ZpZSA9IGxvYWRNb3ZpZShmc3MpCi0JCi0JIyBSZWxvY2F0ZSB0byAoMCwgMCkKLQlib3VuZHMgPSB0aGVNb3ZpZS5HZXRNb3ZpZUJveCgpCi0JYm91bmRzID0gMCwgMCwgYm91bmRzWzJdLWJvdW5kc1swXSwgYm91bmRzWzNdLWJvdW5kc1sxXQotCXRoZU1vdmllLlNldE1vdmllQm94KGJvdW5kcykKLQkKLQkjIENyZWF0ZSBhIGNvbnRyb2xsZXIKLQl0aGVDb250cm9sbGVyID0gdGhlTW92aWUuTmV3TW92aWVDb250cm9sbGVyKGJvdW5kcywgUXVpY2tUaW1lLm1jVG9wTGVmdE1vdmllKQotCQotCSMgR2V0IG1vdmllIHNpemUgYW5kIHVwZGF0ZSB3aW5kb3cgcGFyYW1ldGVycwotCXJ2LCBib3VuZHMgPSB0aGVDb250cm9sbGVyLk1DR2V0Q29udHJvbGxlckJvdW5kc1JlY3QoKQotCXRoZVdpbmRvdy5TaXplV2luZG93KGJvdW5kc1syXSwgYm91bmRzWzNdLCAwKSAgICMgWFhYWCBvciBbM10gWzJdPwotCVF0LkFsaWduV2luZG93KHRoZVdpbmRvdywgMCkKLQl0aGVXaW5kb3cuU2hvd1dpbmRvdygpCi0JCi0JIyBYWFhYIE1DRG9BY3Rpb24odGhlQ29udHJvbGxlciwgbWNBY3Rpb25TZXRHcm93Qm94Qm91bmRzLCAmbWF4Qm91bmRzKQotCXRoZUNvbnRyb2xsZXIuTUNEb0FjdGlvbihRdWlja1RpbWUubWNBY3Rpb25TZXRLZXlzRW5hYmxlZCwgJzEnKQotCQotCSMgWFhYWCBNQ1NldEFjdGlvbkZpbHRlcldpdGhSZWZDb24odGhlQ29udHJvbGxlciwgbW92aWVDb250cm9sbGVyRXZlbnRGaWx0ZXIsIChsb25nKXRoZVdpbmRvdykKLQkKLQlkb25lID0gMAotCXdoaWxlIG5vdCBkb25lOgotCQlnb3RvbmUsIGV2dCA9IEV2dC5XYWl0TmV4dEV2ZW50KDB4ZmZmZiwgMCkKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZ0Ci0jIwkJcHJpbnQgd2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycyAjIFhYWFgKLQkJCi0JCWlmIHRoZUNvbnRyb2xsZXIuTUNJc1BsYXllckV2ZW50KGV2dCk6Ci0JCQljb250aW51ZQotCQkJCi0JCWlmIHdoYXQgPT0gRXZlbnRzLm1vdXNlRG93bjoKLQkJCXBhcnQsIHdoaWNoV2luZG93ID0gV2luLkZpbmRXaW5kb3cod2hlcmUpCi0JCQlpZiBwYXJ0ID09IFdpbmRvd3MuaW5Hb0F3YXk6Ci0JCQkJZG9uZSA9IHdoaWNoV2luZG93LlRyYWNrR29Bd2F5KHdoZXJlKQotCQkJZWxpZiBwYXJ0ID09IFdpbmRvd3MuaW5EcmFnOgotCQkJCVF0LkRyYWdBbGlnbmVkV2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgKDAsIDAsIDQwMDAsIDQwMDApKQotCQllbGlmIHdoYXQgPT0gRXZlbnRzLnVwZGF0ZUV2dDoKLQkJCXdoaWNoV2luZG93ID0gV2luLldoaWNoV2luZG93KG1lc3NhZ2UpCi0JCQlpZiBub3Qgd2hpY2hXaW5kb3c6Ci0JCQkJIyBQcm9iYWJseSB0aGUgY29uc29sZSB3aW5kb3cuIFByaW50IHNvbWV0aGluZywgaG9wZSBpdCBoZWxwcy4KLQkJCQlwcmludCAndXBkYXRlJwotCQkJZWxzZToKLQkJCQlRZC5TZXRQb3J0KHdoaWNoV2luZG93KQotCQkJCXdoaWNoV2luZG93LkJlZ2luVXBkYXRlKCkKLQkJCQlRZC5FcmFzZVJlY3Qod2hpY2hXaW5kb3cuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKLQkJCQl3aGljaFdpbmRvdy5FbmRVcGRhdGUoKQotCQkJCisgICAgcHJpbnQgJ2hlbGxvIHdvcmxkJyAjIFhYWFgKKyAgICAjIHNraXAgdGhlIHRvb2xib3ggaW5pdGlhbGl6YXRpb25zLCBhbHJlYWR5IGRvbmUKKyAgICAjIFhYWFggU2hvdWxkIHVzZSBnZXN0YWx0IGhlcmUgdG8gY2hlY2sgZm9yIHF1aWNrdGltZSB2ZXJzaW9uCisgICAgUXQuRW50ZXJNb3ZpZXMoKQorCisgICAgIyBHZXQgdGhlIG1vdmllIGZpbGUKKyAgICBmc3MgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih3YW50ZWQ9RmlsZS5GU1NwZWMpICMgV2FzOiBRdWlja1RpbWUuTW92aWVGaWxlVHlwZQorICAgIGlmIG5vdCBmc3M6CisgICAgICAgIHN5cy5leGl0KDApCisKKyAgICAjIE9wZW4gdGhlIHdpbmRvdworICAgIGJvdW5kcyA9ICgxNzUsIDc1LCAxNzUrMTYwLCA3NSsxMjApCisgICAgdGhlV2luZG93ID0gV2luLk5ld0NXaW5kb3coYm91bmRzLCBmc3MuYXNfdHVwbGUoKVsyXSwgMCwgMCwgLTEsIDEsIDApCisgICAgIyBYWFhYIE5lZWRlZD8gU2V0R1dvcmxkKChDR3JhZlB0cil0aGVXaW5kb3csIG5pbCkKKyAgICBRZC5TZXRQb3J0KHRoZVdpbmRvdykKKworICAgICMgR2V0IHRoZSBtb3ZpZQorICAgIHRoZU1vdmllID0gbG9hZE1vdmllKGZzcykKKworICAgICMgUmVsb2NhdGUgdG8gKDAsIDApCisgICAgYm91bmRzID0gdGhlTW92aWUuR2V0TW92aWVCb3goKQorICAgIGJvdW5kcyA9IDAsIDAsIGJvdW5kc1syXS1ib3VuZHNbMF0sIGJvdW5kc1szXS1ib3VuZHNbMV0KKyAgICB0aGVNb3ZpZS5TZXRNb3ZpZUJveChib3VuZHMpCisKKyAgICAjIENyZWF0ZSBhIGNvbnRyb2xsZXIKKyAgICB0aGVDb250cm9sbGVyID0gdGhlTW92aWUuTmV3TW92aWVDb250cm9sbGVyKGJvdW5kcywgUXVpY2tUaW1lLm1jVG9wTGVmdE1vdmllKQorCisgICAgIyBHZXQgbW92aWUgc2l6ZSBhbmQgdXBkYXRlIHdpbmRvdyBwYXJhbWV0ZXJzCisgICAgcnYsIGJvdW5kcyA9IHRoZUNvbnRyb2xsZXIuTUNHZXRDb250cm9sbGVyQm91bmRzUmVjdCgpCisgICAgdGhlV2luZG93LlNpemVXaW5kb3coYm91bmRzWzJdLCBib3VuZHNbM10sIDApICAgIyBYWFhYIG9yIFszXSBbMl0/CisgICAgUXQuQWxpZ25XaW5kb3codGhlV2luZG93LCAwKQorICAgIHRoZVdpbmRvdy5TaG93V2luZG93KCkKKworICAgICMgWFhYWCBNQ0RvQWN0aW9uKHRoZUNvbnRyb2xsZXIsIG1jQWN0aW9uU2V0R3Jvd0JveEJvdW5kcywgJm1heEJvdW5kcykKKyAgICB0aGVDb250cm9sbGVyLk1DRG9BY3Rpb24oUXVpY2tUaW1lLm1jQWN0aW9uU2V0S2V5c0VuYWJsZWQsICcxJykKKworICAgICMgWFhYWCBNQ1NldEFjdGlvbkZpbHRlcldpdGhSZWZDb24odGhlQ29udHJvbGxlciwgbW92aWVDb250cm9sbGVyRXZlbnRGaWx0ZXIsIChsb25nKXRoZVdpbmRvdykKKworICAgIGRvbmUgPSAwCisgICAgd2hpbGUgbm90IGRvbmU6CisgICAgICAgIGdvdG9uZSwgZXZ0ID0gRXZ0LldhaXROZXh0RXZlbnQoMHhmZmZmLCAwKQorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldnQKKyMjICAgICAgICAgICAgICBwcmludCB3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzICMgWFhYWAorCisgICAgICAgIGlmIHRoZUNvbnRyb2xsZXIuTUNJc1BsYXllckV2ZW50KGV2dCk6CisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIGlmIHdoYXQgPT0gRXZlbnRzLm1vdXNlRG93bjoKKyAgICAgICAgICAgIHBhcnQsIHdoaWNoV2luZG93ID0gV2luLkZpbmRXaW5kb3cod2hlcmUpCisgICAgICAgICAgICBpZiBwYXJ0ID09IFdpbmRvd3MuaW5Hb0F3YXk6CisgICAgICAgICAgICAgICAgZG9uZSA9IHdoaWNoV2luZG93LlRyYWNrR29Bd2F5KHdoZXJlKQorICAgICAgICAgICAgZWxpZiBwYXJ0ID09IFdpbmRvd3MuaW5EcmFnOgorICAgICAgICAgICAgICAgIFF0LkRyYWdBbGlnbmVkV2luZG93KHdoaWNoV2luZG93LCB3aGVyZSwgKDAsIDAsIDQwMDAsIDQwMDApKQorICAgICAgICBlbGlmIHdoYXQgPT0gRXZlbnRzLnVwZGF0ZUV2dDoKKyAgICAgICAgICAgIHdoaWNoV2luZG93ID0gV2luLldoaWNoV2luZG93KG1lc3NhZ2UpCisgICAgICAgICAgICBpZiBub3Qgd2hpY2hXaW5kb3c6CisgICAgICAgICAgICAgICAgIyBQcm9iYWJseSB0aGUgY29uc29sZSB3aW5kb3cuIFByaW50IHNvbWV0aGluZywgaG9wZSBpdCBoZWxwcy4KKyAgICAgICAgICAgICAgICBwcmludCAndXBkYXRlJworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZC5TZXRQb3J0KHdoaWNoV2luZG93KQorICAgICAgICAgICAgICAgIHdoaWNoV2luZG93LkJlZ2luVXBkYXRlKCkKKyAgICAgICAgICAgICAgICBRZC5FcmFzZVJlY3Qod2hpY2hXaW5kb3cuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKKyAgICAgICAgICAgICAgICB3aGljaFdpbmRvdy5FbmRVcGRhdGUoKQorCiBkZWYgbG9hZE1vdmllKHRoZUZpbGUpOgotCSIiIkxvYWQgYSBtb3ZpZSBnaXZlbiBhbiBmc3NwZWMuIFJldHVybiB0aGUgbW92aWUgb2JqZWN0IiIiCi0JbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHRoZUZpbGUsIDEpCi0JbW92aWUsIGQxLCBkMiA9IFF0Lk5ld01vdmllRnJvbUZpbGUobW92aWVSZXNSZWYsIDAsIFF1aWNrVGltZS5uZXdNb3ZpZUFjdGl2ZSkKLQlyZXR1cm4gbW92aWUKLQkKKyAgICAiIiJMb2FkIGEgbW92aWUgZ2l2ZW4gYW4gZnNzcGVjLiBSZXR1cm4gdGhlIG1vdmllIG9iamVjdCIiIgorICAgIG1vdmllUmVzUmVmID0gUXQuT3Blbk1vdmllRmlsZSh0aGVGaWxlLCAxKQorICAgIG1vdmllLCBkMSwgZDIgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCisgICAgcmV0dXJuIG1vdmllCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9yZXNvdXJjZXMvY29weXJlcy5weSBiL01hYy9EZW1vL3Jlc291cmNlcy9jb3B5cmVzLnB5CmluZGV4IGFlNjI3ZWYuLjUyOGZmMTYgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3Jlc291cmNlcy9jb3B5cmVzLnB5CisrKyBiL01hYy9EZW1vL3Jlc291cmNlcy9jb3B5cmVzLnB5CkBAIC03LDUxICs3LDUxIEBACiBzbUFsbFNjcmlwdHMgPSAtMwogCiBkZWYgY29weXJlcyhzcmMsIGRzdCk6Ci0JIiIiQ29weSByZXNvdXJjZSBmcm9tIHNyYyBmaWxlIHRvIGRzdCBmaWxlLiIiIgotCQotCWN1ciA9IEN1clJlc0ZpbGUoKQotCWN0b3IsIHR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShzcmMpCi0JaW5wdXQgPSBGU3BPcGVuUmVzRmlsZShzcmMsIFJFQUQpCi0JdHJ5OgotCQlGU3BDcmVhdGVSZXNGaWxlKGRzdCwgY3RvciwgdHlwZSwgc21BbGxTY3JpcHRzKQotCWV4Y2VwdDoKLQkJcmF3X2lucHV0KCIlcyBhbHJlYWR5IGV4aXN0cy4uLiAgQ1IgdG8gd3JpdGUgYW55d2F5ISAiICUgZHN0KQotCW91dHB1dCA9IEZTcE9wZW5SZXNGaWxlKGRzdCwgV1JJVEUpCi0JVXNlUmVzRmlsZShpbnB1dCkKLQludHlwZXMgPSBDb3VudDFUeXBlcygpCi0JZm9yIGl0eXBlIGluIHJhbmdlKDEsIDErbnR5cGVzKToKLQkJdHlwZSA9IEdldDFJbmRUeXBlKGl0eXBlKQotCQlucmVzb3VyY2VzID0gQ291bnQxUmVzb3VyY2VzKHR5cGUpCi0JCWZvciBpcmVzIGluIHJhbmdlKDEsIDErbnJlc291cmNlcyk6Ci0JCQlyZXMgPSBHZXQxSW5kUmVzb3VyY2UodHlwZSwgaXJlcykKLQkJCXJlcy5Mb2FkUmVzb3VyY2UoKQotCQkJaWQsIHR5cGUsIG5hbWUgPSByZXMuR2V0UmVzSW5mbygpCi0JCQlzaXplID0gcmVzLlNpemVSZXNvdXJjZSgpCi0JCQlhdHRycyA9IHJlcy5HZXRSZXNBdHRycygpCi0JCQlwcmludCBpZCwgdHlwZSwgbmFtZSwgc2l6ZSwgaGV4KGF0dHJzKQotCQkJcmVzLkRldGFjaFJlc291cmNlKCkKLQkJCVVzZVJlc0ZpbGUob3V0cHV0KQotCQkJdHJ5OgotCQkJCXJlczIgPSBHZXQxUmVzb3VyY2UodHlwZSwgaWQpCi0JCQlleGNlcHQgKFJ1bnRpbWVFcnJvciwgUmVzLkVycm9yKSwgbXNnOgotCQkJCXJlczIgPSBOb25lCi0JCQlpZiByZXMyOgotCQkJCXByaW50ICJEdXBsaWNhdGUgdHlwZStpZCwgbm90IGNvcGllZCIKLQkJCQlwcmludCAocmVzMi5zaXplLCByZXMyLmRhdGEpCi0JCQkJcHJpbnQgcmVzMi5HZXRSZXNJbmZvKCkKLQkJCQlpZiByZXMyLkhvbWVSZXNGaWxlKCkgPT0gb3V0cHV0OgotCQkJCQknT0snCi0JCQkJZWxpZiByZXMyLkhvbWVSZXNGaWxlKCkgPT0gaW5wdXQ6Ci0JCQkJCSdCQUQhJwotCQkJCWVsc2U6Ci0JCQkJCXByaW50ICdIb21lOicsIHJlczIuSG9tZVJlc0ZpbGUoKQotCQkJZWxzZToKLQkJCQlyZXMuQWRkUmVzb3VyY2UodHlwZSwgaWQsIG5hbWUpCi0JCQkJI3Jlcy5TZXRSZXNBdHRycyhhdHRycykKLQkJCQlyZXMuV3JpdGVSZXNvdXJjZSgpCi0JCQlVc2VSZXNGaWxlKGlucHV0KQotCVVzZVJlc0ZpbGUoY3VyKQotCUNsb3NlUmVzRmlsZShvdXRwdXQpCi0JQ2xvc2VSZXNGaWxlKGlucHV0KQorICAgICIiIkNvcHkgcmVzb3VyY2UgZnJvbSBzcmMgZmlsZSB0byBkc3QgZmlsZS4iIiIKKworICAgIGN1ciA9IEN1clJlc0ZpbGUoKQorICAgIGN0b3IsIHR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShzcmMpCisgICAgaW5wdXQgPSBGU3BPcGVuUmVzRmlsZShzcmMsIFJFQUQpCisgICAgdHJ5OgorICAgICAgICBGU3BDcmVhdGVSZXNGaWxlKGRzdCwgY3RvciwgdHlwZSwgc21BbGxTY3JpcHRzKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcmF3X2lucHV0KCIlcyBhbHJlYWR5IGV4aXN0cy4uLiAgQ1IgdG8gd3JpdGUgYW55d2F5ISAiICUgZHN0KQorICAgIG91dHB1dCA9IEZTcE9wZW5SZXNGaWxlKGRzdCwgV1JJVEUpCisgICAgVXNlUmVzRmlsZShpbnB1dCkKKyAgICBudHlwZXMgPSBDb3VudDFUeXBlcygpCisgICAgZm9yIGl0eXBlIGluIHJhbmdlKDEsIDErbnR5cGVzKToKKyAgICAgICAgdHlwZSA9IEdldDFJbmRUeXBlKGl0eXBlKQorICAgICAgICBucmVzb3VyY2VzID0gQ291bnQxUmVzb3VyY2VzKHR5cGUpCisgICAgICAgIGZvciBpcmVzIGluIHJhbmdlKDEsIDErbnJlc291cmNlcyk6CisgICAgICAgICAgICByZXMgPSBHZXQxSW5kUmVzb3VyY2UodHlwZSwgaXJlcykKKyAgICAgICAgICAgIHJlcy5Mb2FkUmVzb3VyY2UoKQorICAgICAgICAgICAgaWQsIHR5cGUsIG5hbWUgPSByZXMuR2V0UmVzSW5mbygpCisgICAgICAgICAgICBzaXplID0gcmVzLlNpemVSZXNvdXJjZSgpCisgICAgICAgICAgICBhdHRycyA9IHJlcy5HZXRSZXNBdHRycygpCisgICAgICAgICAgICBwcmludCBpZCwgdHlwZSwgbmFtZSwgc2l6ZSwgaGV4KGF0dHJzKQorICAgICAgICAgICAgcmVzLkRldGFjaFJlc291cmNlKCkKKyAgICAgICAgICAgIFVzZVJlc0ZpbGUob3V0cHV0KQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHJlczIgPSBHZXQxUmVzb3VyY2UodHlwZSwgaWQpCisgICAgICAgICAgICBleGNlcHQgKFJ1bnRpbWVFcnJvciwgUmVzLkVycm9yKSwgbXNnOgorICAgICAgICAgICAgICAgIHJlczIgPSBOb25lCisgICAgICAgICAgICBpZiByZXMyOgorICAgICAgICAgICAgICAgIHByaW50ICJEdXBsaWNhdGUgdHlwZStpZCwgbm90IGNvcGllZCIKKyAgICAgICAgICAgICAgICBwcmludCAocmVzMi5zaXplLCByZXMyLmRhdGEpCisgICAgICAgICAgICAgICAgcHJpbnQgcmVzMi5HZXRSZXNJbmZvKCkKKyAgICAgICAgICAgICAgICBpZiByZXMyLkhvbWVSZXNGaWxlKCkgPT0gb3V0cHV0OgorICAgICAgICAgICAgICAgICAgICAnT0snCisgICAgICAgICAgICAgICAgZWxpZiByZXMyLkhvbWVSZXNGaWxlKCkgPT0gaW5wdXQ6CisgICAgICAgICAgICAgICAgICAgICdCQUQhJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICdIb21lOicsIHJlczIuSG9tZVJlc0ZpbGUoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXMuQWRkUmVzb3VyY2UodHlwZSwgaWQsIG5hbWUpCisgICAgICAgICAgICAgICAgI3Jlcy5TZXRSZXNBdHRycyhhdHRycykKKyAgICAgICAgICAgICAgICByZXMuV3JpdGVSZXNvdXJjZSgpCisgICAgICAgICAgICBVc2VSZXNGaWxlKGlucHV0KQorICAgIFVzZVJlc0ZpbGUoY3VyKQorICAgIENsb3NlUmVzRmlsZShvdXRwdXQpCisgICAgQ2xvc2VSZXNGaWxlKGlucHV0KQogCiBjb3B5cmVzKCc6OnB5dGhvbi65LnJzcmMnLCAnOjpmb28ucnNyYycpCmRpZmYgLS1naXQgYS9NYWMvRGVtby9yZXNvdXJjZXMvbGlzdHJlcy5weSBiL01hYy9EZW1vL3Jlc291cmNlcy9saXN0cmVzLnB5CmluZGV4IGVhY2YyYjcuLjZjZTU3NzkgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3Jlc291cmNlcy9saXN0cmVzLnB5CisrKyBiL01hYy9EZW1vL3Jlc291cmNlcy9saXN0cmVzLnB5CkBAIC00LDU3ICs0LDU3IEBACiBmcm9tIENhcmJvbi5SZXNvdXJjZXMgaW1wb3J0ICoKIAogZGVmIGxpc3QxcmVzb3VyY2VzKCk6Ci0JbnR5cGVzID0gUmVzLkNvdW50MVR5cGVzKCkKLQlmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgotCQl0eXBlID0gUmVzLkdldDFJbmRUeXBlKGl0eXBlKQotCQlwcmludCAiVHlwZToiLCByZXByKHR5cGUpCi0JCW5yZXNvdXJjZXMgPSBSZXMuQ291bnQxUmVzb3VyY2VzKHR5cGUpCi0JCWZvciBpIGluIHJhbmdlKDEsIDEgKyBucmVzb3VyY2VzKToKLQkJCVJlcy5TZXRSZXNMb2FkKDApCi0JCQlyZXMgPSBSZXMuR2V0MUluZFJlc291cmNlKHR5cGUsIGkpCi0JCQlSZXMuU2V0UmVzTG9hZCgxKQotCQkJaW5mbyhyZXMpCisgICAgbnR5cGVzID0gUmVzLkNvdW50MVR5cGVzKCkKKyAgICBmb3IgaXR5cGUgaW4gcmFuZ2UoMSwgMStudHlwZXMpOgorICAgICAgICB0eXBlID0gUmVzLkdldDFJbmRUeXBlKGl0eXBlKQorICAgICAgICBwcmludCAiVHlwZToiLCByZXByKHR5cGUpCisgICAgICAgIG5yZXNvdXJjZXMgPSBSZXMuQ291bnQxUmVzb3VyY2VzKHR5cGUpCisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIDEgKyBucmVzb3VyY2VzKToKKyAgICAgICAgICAgIFJlcy5TZXRSZXNMb2FkKDApCisgICAgICAgICAgICByZXMgPSBSZXMuR2V0MUluZFJlc291cmNlKHR5cGUsIGkpCisgICAgICAgICAgICBSZXMuU2V0UmVzTG9hZCgxKQorICAgICAgICAgICAgaW5mbyhyZXMpCiAKIGRlZiBsaXN0cmVzb3VyY2VzKCk6Ci0JbnR5cGVzID0gUmVzLkNvdW50VHlwZXMoKQotCWZvciBpdHlwZSBpbiByYW5nZSgxLCAxK250eXBlcyk6Ci0JCXR5cGUgPSBSZXMuR2V0SW5kVHlwZShpdHlwZSkKLQkJcHJpbnQgIlR5cGU6IiwgcmVwcih0eXBlKQotCQlucmVzb3VyY2VzID0gUmVzLkNvdW50UmVzb3VyY2VzKHR5cGUpCi0JCWZvciBpIGluIHJhbmdlKDEsIDEgKyBucmVzb3VyY2VzKToKLQkJCVJlcy5TZXRSZXNMb2FkKDApCi0JCQlyZXMgPSBSZXMuR2V0SW5kUmVzb3VyY2UodHlwZSwgaSkKLQkJCVJlcy5TZXRSZXNMb2FkKDEpCi0JCQlpbmZvKHJlcykKKyAgICBudHlwZXMgPSBSZXMuQ291bnRUeXBlcygpCisgICAgZm9yIGl0eXBlIGluIHJhbmdlKDEsIDErbnR5cGVzKToKKyAgICAgICAgdHlwZSA9IFJlcy5HZXRJbmRUeXBlKGl0eXBlKQorICAgICAgICBwcmludCAiVHlwZToiLCByZXByKHR5cGUpCisgICAgICAgIG5yZXNvdXJjZXMgPSBSZXMuQ291bnRSZXNvdXJjZXModHlwZSkKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgMSArIG5yZXNvdXJjZXMpOgorICAgICAgICAgICAgUmVzLlNldFJlc0xvYWQoMCkKKyAgICAgICAgICAgIHJlcyA9IFJlcy5HZXRJbmRSZXNvdXJjZSh0eXBlLCBpKQorICAgICAgICAgICAgUmVzLlNldFJlc0xvYWQoMSkKKyAgICAgICAgICAgIGluZm8ocmVzKQogCiBkZWYgaW5mbyhyZXMpOgotCXByaW50IHJlcy5HZXRSZXNJbmZvKCksIHJlcy5TaXplUmVzb3VyY2UoKSwgZGVjb2RlYXR0cnMocmVzLkdldFJlc0F0dHJzKCkpCisgICAgcHJpbnQgcmVzLkdldFJlc0luZm8oKSwgcmVzLlNpemVSZXNvdXJjZSgpLCBkZWNvZGVhdHRycyhyZXMuR2V0UmVzQXR0cnMoKSkKIAogYXR0cm5hbWVzID0gewotCXJlc0NoYW5nZWQ6CSdDaGFuZ2VkJywKLQlyZXNQcmVsb2FkOgknUHJlbG9hZCcsCi0JcmVzUHJvdGVjdGVkOgknUHJvdGVjdGVkJywKLQlyZXNMb2NrZWQ6CSdMb2NrZWQnLAotCXJlc1B1cmdlYWJsZToJJ1B1cmdlYWJsZScsCi0JcmVzU3lzSGVhcDoJJ1N5c0hlYXAnLAorICAgICAgICByZXNDaGFuZ2VkOiAgICAgJ0NoYW5nZWQnLAorICAgICAgICByZXNQcmVsb2FkOiAgICAgJ1ByZWxvYWQnLAorICAgICAgICByZXNQcm90ZWN0ZWQ6ICAgJ1Byb3RlY3RlZCcsCisgICAgICAgIHJlc0xvY2tlZDogICAgICAnTG9ja2VkJywKKyAgICAgICAgcmVzUHVyZ2VhYmxlOiAgICdQdXJnZWFibGUnLAorICAgICAgICByZXNTeXNIZWFwOiAgICAgJ1N5c0hlYXAnLAogfQogCiBkZWYgZGVjb2RlYXR0cnMoYXR0cnMpOgotCW5hbWVzID0gW10KLQlmb3IgYml0IGluIHJhbmdlKDE2KToKLQkJbWFzayA9IDE8PGJpdAotCQlpZiBhdHRycyAmIG1hc2s6Ci0JCQlpZiBhdHRybmFtZXMuaGFzX2tleShtYXNrKToKLQkJCQluYW1lcy5hcHBlbmQoYXR0cm5hbWVzW21hc2tdKQotCQkJZWxzZToKLQkJCQluYW1lcy5hcHBlbmQoaGV4KG1hc2spKQotCXJldHVybiBuYW1lcworICAgIG5hbWVzID0gW10KKyAgICBmb3IgYml0IGluIHJhbmdlKDE2KToKKyAgICAgICAgbWFzayA9IDE8PGJpdAorICAgICAgICBpZiBhdHRycyAmIG1hc2s6CisgICAgICAgICAgICBpZiBhdHRybmFtZXMuaGFzX2tleShtYXNrKToKKyAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoYXR0cm5hbWVzW21hc2tdKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBuYW1lcy5hcHBlbmQoaGV4KG1hc2spKQorICAgIHJldHVybiBuYW1lcwogCiBkZWYgdGVzdCgpOgotCXByaW50ICI9PT0gTG9jYWwgcmVzb3VyY2VzcyA9PT0iCi0JbGlzdDFyZXNvdXJjZXMoKQotCXByaW50ICI9PT0gQWxsIHJlc291cmNlcyA9PT0iCi0JbGlzdHJlc291cmNlcygpCisgICAgcHJpbnQgIj09PSBMb2NhbCByZXNvdXJjZXNzID09PSIKKyAgICBsaXN0MXJlc291cmNlcygpCisgICAgcHJpbnQgIj09PSBBbGwgcmVzb3VyY2VzID09PSIKKyAgICBsaXN0cmVzb3VyY2VzKCkKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0ZXN0KCkKKyAgICB0ZXN0KCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3NvdW5kL21vcnNlLnB5IGIvTWFjL0RlbW8vc291bmQvbW9yc2UucHkKaW5kZXggYmY1ZmE1Zi4uYjI2ZDU1NCAxMDA2NDQKLS0tIGEvTWFjL0RlbW8vc291bmQvbW9yc2UucHkKKysrIGIvTWFjL0RlbW8vc291bmQvbW9yc2UucHkKQEAgLTIsNjEgKzIsNjEgQEAKIAogRE9UID0gMzAKIERBSCA9IDgwCi1PQ1RBVkUgPSAyCQkJCSMgMSA9PSA0NDEgSHosIDIgPT0gODgyIEh6LCAuLi4KK09DVEFWRSA9IDIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIDEgPT0gNDQxIEh6LCAyID09IDg4MiBIeiwgLi4uCiBTQU1QV0lEVEggPSAyCiBGUkFNRVJBVEUgPSA0NDEwMAogQkFTRUZSRVEgPSA0NDEKIFFTSVpFID0gMjAwMDAKIAogbW9yc2V0YWIgPSB7Ci0JJ0EnOiAnLi0nLAkJJ2EnOiAnLi0nLAotCSdCJzogJy0uLi4nLAkJJ2InOiAnLS4uLicsCi0JJ0MnOiAnLS4tLicsCQknYyc6ICctLi0uJywKLQknRCc6ICctLi4nLAkJJ2QnOiAnLS4uJywKLQknRSc6ICcuJywJCSdlJzogJy4nLAotCSdGJzogJy4uLS4nLAkJJ2YnOiAnLi4tLicsCi0JJ0cnOiAnLS0uJywJCSdnJzogJy0tLicsCi0JJ0gnOiAnLi4uLicsCQknaCc6ICcuLi4uJywKLQknSSc6ICcuLicsCQknaSc6ICcuLicsCi0JJ0onOiAnLi0tLScsCQknaic6ICcuLS0tJywKLQknSyc6ICctLi0nLAkJJ2snOiAnLS4tJywKLQknTCc6ICcuLS4uJywJCSdsJzogJy4tLi4nLAotCSdNJzogJy0tJywJCSdtJzogJy0tJywKLQknTic6ICctLicsCQknbic6ICctLicsCi0JJ08nOiAnLS0tJywJCSdvJzogJy0tLScsCi0JJ1AnOiAnLi0tLicsCQkncCc6ICcuLS0uJywKLQknUSc6ICctLS4tJywJCSdxJzogJy0tLi0nLAotCSdSJzogJy4tLicsCQkncic6ICcuLS4nLAotCSdTJzogJy4uLicsCQkncyc6ICcuLi4nLAotCSdUJzogJy0nLAkJJ3QnOiAnLScsCi0JJ1UnOiAnLi4tJywJCSd1JzogJy4uLScsCi0JJ1YnOiAnLi4uLScsCQkndic6ICcuLi4tJywKLQknVyc6ICcuLS0nLAkJJ3cnOiAnLi0tJywKLQknWCc6ICctLi4tJywJCSd4JzogJy0uLi0nLAotCSdZJzogJy0uLS0nLAkJJ3knOiAnLS4tLScsCi0JJ1onOiAnLS0uLicsCQkneic6ICctLS4uJywKLQknMCc6ICctLS0tLScsCi0JJzEnOiAnLi0tLS0nLAotCScyJzogJy4uLS0tJywKLQknMyc6ICcuLi4tLScsCi0JJzQnOiAnLi4uLi0nLAotCSc1JzogJy4uLi4uJywKLQknNic6ICctLi4uLicsCi0JJzcnOiAnLS0uLi4nLAotCSc4JzogJy0tLS4uJywKLQknOSc6ICctLS0tLicsCi0JJywnOiAnLS0uLi0tJywKLQknLic6ICcuLS4tLi0nLAotCSc/JzogJy4uLS0uLicsCi0JJzsnOiAnLS4tLi0uJywKLQknOic6ICctLS0uLi4nLAotCSInIjogJy4tLS0tLicsCi0JJy0nOiAnLS4uLi4tJywKLQknLyc6ICctLi4tLicsCi0JJygnOiAnLS4tLS4tJywKLQknKSc6ICctLi0tLi0nLAotCSdfJzogJy4uLS0uLScsCi0JJyAnOiAnICcKKyAgICAgICAgJ0EnOiAnLi0nLCAgICAgICAgICAgICAgJ2EnOiAnLi0nLAorICAgICAgICAnQic6ICctLi4uJywgICAgICAgICAgICAnYic6ICctLi4uJywKKyAgICAgICAgJ0MnOiAnLS4tLicsICAgICAgICAgICAgJ2MnOiAnLS4tLicsCisgICAgICAgICdEJzogJy0uLicsICAgICAgICAgICAgICdkJzogJy0uLicsCisgICAgICAgICdFJzogJy4nLCAgICAgICAgICAgICAgICdlJzogJy4nLAorICAgICAgICAnRic6ICcuLi0uJywgICAgICAgICAgICAnZic6ICcuLi0uJywKKyAgICAgICAgJ0cnOiAnLS0uJywgICAgICAgICAgICAgJ2cnOiAnLS0uJywKKyAgICAgICAgJ0gnOiAnLi4uLicsICAgICAgICAgICAgJ2gnOiAnLi4uLicsCisgICAgICAgICdJJzogJy4uJywgICAgICAgICAgICAgICdpJzogJy4uJywKKyAgICAgICAgJ0onOiAnLi0tLScsICAgICAgICAgICAgJ2onOiAnLi0tLScsCisgICAgICAgICdLJzogJy0uLScsICAgICAgICAgICAgICdrJzogJy0uLScsCisgICAgICAgICdMJzogJy4tLi4nLCAgICAgICAgICAgICdsJzogJy4tLi4nLAorICAgICAgICAnTSc6ICctLScsICAgICAgICAgICAgICAnbSc6ICctLScsCisgICAgICAgICdOJzogJy0uJywgICAgICAgICAgICAgICduJzogJy0uJywKKyAgICAgICAgJ08nOiAnLS0tJywgICAgICAgICAgICAgJ28nOiAnLS0tJywKKyAgICAgICAgJ1AnOiAnLi0tLicsICAgICAgICAgICAgJ3AnOiAnLi0tLicsCisgICAgICAgICdRJzogJy0tLi0nLCAgICAgICAgICAgICdxJzogJy0tLi0nLAorICAgICAgICAnUic6ICcuLS4nLCAgICAgICAgICAgICAncic6ICcuLS4nLAorICAgICAgICAnUyc6ICcuLi4nLCAgICAgICAgICAgICAncyc6ICcuLi4nLAorICAgICAgICAnVCc6ICctJywgICAgICAgICAgICAgICAndCc6ICctJywKKyAgICAgICAgJ1UnOiAnLi4tJywgICAgICAgICAgICAgJ3UnOiAnLi4tJywKKyAgICAgICAgJ1YnOiAnLi4uLScsICAgICAgICAgICAgJ3YnOiAnLi4uLScsCisgICAgICAgICdXJzogJy4tLScsICAgICAgICAgICAgICd3JzogJy4tLScsCisgICAgICAgICdYJzogJy0uLi0nLCAgICAgICAgICAgICd4JzogJy0uLi0nLAorICAgICAgICAnWSc6ICctLi0tJywgICAgICAgICAgICAneSc6ICctLi0tJywKKyAgICAgICAgJ1onOiAnLS0uLicsICAgICAgICAgICAgJ3onOiAnLS0uLicsCisgICAgICAgICcwJzogJy0tLS0tJywKKyAgICAgICAgJzEnOiAnLi0tLS0nLAorICAgICAgICAnMic6ICcuLi0tLScsCisgICAgICAgICczJzogJy4uLi0tJywKKyAgICAgICAgJzQnOiAnLi4uLi0nLAorICAgICAgICAnNSc6ICcuLi4uLicsCisgICAgICAgICc2JzogJy0uLi4uJywKKyAgICAgICAgJzcnOiAnLS0uLi4nLAorICAgICAgICAnOCc6ICctLS0uLicsCisgICAgICAgICc5JzogJy0tLS0uJywKKyAgICAgICAgJywnOiAnLS0uLi0tJywKKyAgICAgICAgJy4nOiAnLi0uLS4tJywKKyAgICAgICAgJz8nOiAnLi4tLS4uJywKKyAgICAgICAgJzsnOiAnLS4tLi0uJywKKyAgICAgICAgJzonOiAnLS0tLi4uJywKKyAgICAgICAgIiciOiAnLi0tLS0uJywKKyAgICAgICAgJy0nOiAnLS4uLi4tJywKKyAgICAgICAgJy8nOiAnLS4uLS4nLAorICAgICAgICAnKCc6ICctLi0tLi0nLAorICAgICAgICAnKSc6ICctLi0tLi0nLAorICAgICAgICAnXyc6ICcuLi0tLi0nLAorICAgICAgICAnICc6ICcgJwogfQogCiAjIElmIHdlIHBsYXkgYXQgNDQuMSBrSHogKHdoaWNoIHdlIGRvKSwgdGhlbiBpZiB3ZSBwcm9kdWNlIG9uZSBzaW5lCkBAIC02NCwxMTcgKzY0LDExNyBAQAogIyBzaW5lIHdhdmVzIGluIHRoZXNlIDEwMCBzYW1wbGVzLCB3ZSBnZXQgYSB0b25lIG9mIDg4MiBIei4gIDg4MiBIegogIyBhcHBlYXJzIHRvIGJlIGEgbmljZSBvbmUgZm9yIHBsYXlpbmcgbW9yc2UgY29kZS4KIGRlZiBta3dhdmUob2N0YXZlKToKLQlnbG9iYWwgc2luZXdhdmUsIG5vd2F2ZQotCXNpbmV3YXZlID0gJycKLQluID0gaW50KEZSQU1FUkFURSAvIEJBU0VGUkVRKQotCWZvciBpIGluIHJhbmdlKG4pOgotCQl2YWwgPSBpbnQobWF0aC5zaW4oMiAqIG1hdGgucGkgKiBpICogb2N0YXZlIC8gbikgKiAweDdmZmYpCi0JCXNhbXBsZSA9IGNocigodmFsID4+IDgpICYgMjU1KSArIGNocih2YWwgJiAyNTUpCi0JCXNpbmV3YXZlID0gc2luZXdhdmUgKyBzYW1wbGVbOlNBTVBXSURUSF0KLQlub3dhdmUgPSAnXDAnICogKG4qU0FNUFdJRFRIKQorICAgIGdsb2JhbCBzaW5ld2F2ZSwgbm93YXZlCisgICAgc2luZXdhdmUgPSAnJworICAgIG4gPSBpbnQoRlJBTUVSQVRFIC8gQkFTRUZSRVEpCisgICAgZm9yIGkgaW4gcmFuZ2Uobik6CisgICAgICAgIHZhbCA9IGludChtYXRoLnNpbigyICogbWF0aC5waSAqIGkgKiBvY3RhdmUgLyBuKSAqIDB4N2ZmZikKKyAgICAgICAgc2FtcGxlID0gY2hyKCh2YWwgPj4gOCkgJiAyNTUpICsgY2hyKHZhbCAmIDI1NSkKKyAgICAgICAgc2luZXdhdmUgPSBzaW5ld2F2ZSArIHNhbXBsZVs6U0FNUFdJRFRIXQorICAgIG5vd2F2ZSA9ICdcMCcgKiAobipTQU1QV0lEVEgpCiAKIG1rd2F2ZShPQ1RBVkUpCiAKIGNsYXNzIEJ1ZmZlcmVkQXVkaW9EZXY6Ci0JZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IGF1ZGlvZGV2Ci0JCXNlbGYuX2Jhc2UgPSBhcHBseShhdWRpb2Rldi5BdWRpb0RldiwgYXJncykKLQkJc2VsZi5fYnVmZmVyID0gW10KLQkJc2VsZi5fZmlsbGVkID0gMAotCQlzZWxmLl9hZGRtZXRob2RzKHNlbGYuX2Jhc2UsIHNlbGYuX2Jhc2UuX19jbGFzc19fKQotCWRlZiBfYWRkbWV0aG9kcyhzZWxmLCBpbnN0LCBjbHMpOgotCQlmb3IgbmFtZSBpbiBjbHMuX19kaWN0X18ua2V5cygpOgotCQkJaWYgbm90IGhhc2F0dHIoc2VsZiwgbmFtZSk6Ci0JCQkJdHJ5OgotCQkJCQlzZXRhdHRyKHNlbGYsIG5hbWUsIGdldGF0dHIoaW5zdCwgbmFtZSkpCi0JCQkJZXhjZXB0OgotCQkJCQlwYXNzCi0JCWZvciBiYXNlY2xzIGluIGNscy5fX2Jhc2VzX186Ci0JCQlzZWxmLl9hZGRtZXRob2RzKHNlbGYsIGluc3QsIGJhc2VjbHMpCi0JZGVmIHdyaXRlZnJhbWVzcmF3KHNlbGYsIGZyYW1lcyk6Ci0JCXNlbGYuX2J1ZmZlci5hcHBlbmQoZnJhbWVzKQotCQlzZWxmLl9maWxsZWQgPSBzZWxmLl9maWxsZWQgKyBsZW4oZnJhbWVzKQotCQlpZiBzZWxmLl9maWxsZWQgPj0gUVNJWkU6Ci0JCQlzZWxmLmZsdXNoKCkKLQlkZWYgd2FpdChzZWxmKToKLQkJc2VsZi5mbHVzaCgpCi0JCXNlbGYuX2Jhc2Uud2FpdCgpCi0JZGVmIGZsdXNoKHNlbGYpOgotCQlwcmludCAnZmx1c2g6ICVkIGJsb2NrcywgJWQgYnl0ZXMnICUgKGxlbihzZWxmLl9idWZmZXIpLCBzZWxmLl9maWxsZWQpCi0JCWlmIHNlbGYuX2J1ZmZlcjoKLQkJCWltcG9ydCBzdHJpbmcKLQkJCXNlbGYuX2Jhc2Uud3JpdGVmcmFtZXMoc3RyaW5nLmpvaW5maWVsZHMoc2VsZi5fYnVmZmVyLCAnJykpCi0JCQlzZWxmLl9idWZmZXIgPSBbXQotCQkJc2VsZi5fZmlsbGVkID0gMAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBhdWRpb2RldgorICAgICAgICBzZWxmLl9iYXNlID0gYXBwbHkoYXVkaW9kZXYuQXVkaW9EZXYsIGFyZ3MpCisgICAgICAgIHNlbGYuX2J1ZmZlciA9IFtdCisgICAgICAgIHNlbGYuX2ZpbGxlZCA9IDAKKyAgICAgICAgc2VsZi5fYWRkbWV0aG9kcyhzZWxmLl9iYXNlLCBzZWxmLl9iYXNlLl9fY2xhc3NfXykKKyAgICBkZWYgX2FkZG1ldGhvZHMoc2VsZiwgaW5zdCwgY2xzKToKKyAgICAgICAgZm9yIG5hbWUgaW4gY2xzLl9fZGljdF9fLmtleXMoKToKKyAgICAgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYsIG5hbWUpOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2V0YXR0cihzZWxmLCBuYW1lLCBnZXRhdHRyKGluc3QsIG5hbWUpKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICBmb3IgYmFzZWNscyBpbiBjbHMuX19iYXNlc19fOgorICAgICAgICAgICAgc2VsZi5fYWRkbWV0aG9kcyhzZWxmLCBpbnN0LCBiYXNlY2xzKQorICAgIGRlZiB3cml0ZWZyYW1lc3JhdyhzZWxmLCBmcmFtZXMpOgorICAgICAgICBzZWxmLl9idWZmZXIuYXBwZW5kKGZyYW1lcykKKyAgICAgICAgc2VsZi5fZmlsbGVkID0gc2VsZi5fZmlsbGVkICsgbGVuKGZyYW1lcykKKyAgICAgICAgaWYgc2VsZi5fZmlsbGVkID49IFFTSVpFOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisgICAgZGVmIHdhaXQoc2VsZik6CisgICAgICAgIHNlbGYuZmx1c2goKQorICAgICAgICBzZWxmLl9iYXNlLndhaXQoKQorICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgcHJpbnQgJ2ZsdXNoOiAlZCBibG9ja3MsICVkIGJ5dGVzJyAlIChsZW4oc2VsZi5fYnVmZmVyKSwgc2VsZi5fZmlsbGVkKQorICAgICAgICBpZiBzZWxmLl9idWZmZXI6CisgICAgICAgICAgICBpbXBvcnQgc3RyaW5nCisgICAgICAgICAgICBzZWxmLl9iYXNlLndyaXRlZnJhbWVzKHN0cmluZy5qb2luZmllbGRzKHNlbGYuX2J1ZmZlciwgJycpKQorICAgICAgICAgICAgc2VsZi5fYnVmZmVyID0gW10KKyAgICAgICAgICAgIHNlbGYuX2ZpbGxlZCA9IDAKIAogZGVmIG1haW4oYXJncyA9IHN5cy5hcmd2WzE6XSk6Ci0JaW1wb3J0IGdldG9wdCwgc3RyaW5nCi0JdHJ5OgotCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChhcmdzLCAnbzpwOicpCi0JZXhjZXB0IGdldG9wdC5lcnJvcjoKLQkJc3lzLnN0ZGVyci53cml0ZSgnVXNhZ2UgJyArIHN5cy5hcmd2WzBdICsKLQkJCQkgJyBbIC1vIG91dGZpbGUgXSBbIGFyZ3MgXSAuLi5cbicpCi0JCXN5cy5leGl0KDEpCi0JZGV2ID0gTm9uZQotCWZvciBvLCBhIGluIG9wdHM6Ci0JCWlmIG8gPT0gJy1vJzoKLQkJCWltcG9ydCBhaWZjCi0JCQlkZXYgPSBhaWZjLm9wZW4oYSwgJ3cnKQotCQkJZGV2LnNldGZyYW1lcmF0ZShGUkFNRVJBVEUpCi0JCQlkZXYuc2V0c2FtcHdpZHRoKFNBTVBXSURUSCkKLQkJCWRldi5zZXRuY2hhbm5lbHMoMSkKLQkJaWYgbyA9PSAnLXAnOgotCQkJbWt3YXZlKHN0cmluZy5hdG9pKGEpKQotCWlmIG5vdCBkZXY6Ci0JCWRldiA9IEJ1ZmZlcmVkQXVkaW9EZXYoKQotCQlkZXYuc2V0b3V0cmF0ZShGUkFNRVJBVEUpCi0JCWRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQotCQlkZXYuc2V0bmNoYW5uZWxzKDEpCi0JCWRldi5jbG9zZSA9IGRldi5zdG9wCi0JaWYgYXJnczoKLQkJbGluZSA9IHN0cmluZy5qb2luKGFyZ3MpCi0JZWxzZToKLQkJbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCi0Jd2hpbGUgbGluZToKLQkJcHJpbnQgbGluZQotCQltbGluZSA9IG1vcnNlKGxpbmUpCi0JCXByaW50IG1saW5lCi0JCXBsYXkobWxpbmUsIGRldikKLQkJaWYgaGFzYXR0cihkZXYsICd3YWl0Jyk6Ci0JCQlkZXYud2FpdCgpCi0JCWlmIG5vdCBhcmdzOgotCQkJbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCi0JCWVsc2U6Ci0JCQlsaW5lID0gJycKLQlkZXYuY2xvc2UoKQorICAgIGltcG9ydCBnZXRvcHQsIHN0cmluZworICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoYXJncywgJ286cDonKQorICAgIGV4Y2VwdCBnZXRvcHQuZXJyb3I6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoJ1VzYWdlICcgKyBzeXMuYXJndlswXSArCisgICAgICAgICAgICAgICAgICAgICAgICAgJyBbIC1vIG91dGZpbGUgXSBbIGFyZ3MgXSAuLi5cbicpCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgZGV2ID0gTm9uZQorICAgIGZvciBvLCBhIGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy1vJzoKKyAgICAgICAgICAgIGltcG9ydCBhaWZjCisgICAgICAgICAgICBkZXYgPSBhaWZjLm9wZW4oYSwgJ3cnKQorICAgICAgICAgICAgZGV2LnNldGZyYW1lcmF0ZShGUkFNRVJBVEUpCisgICAgICAgICAgICBkZXYuc2V0c2FtcHdpZHRoKFNBTVBXSURUSCkKKyAgICAgICAgICAgIGRldi5zZXRuY2hhbm5lbHMoMSkKKyAgICAgICAgaWYgbyA9PSAnLXAnOgorICAgICAgICAgICAgbWt3YXZlKHN0cmluZy5hdG9pKGEpKQorICAgIGlmIG5vdCBkZXY6CisgICAgICAgIGRldiA9IEJ1ZmZlcmVkQXVkaW9EZXYoKQorICAgICAgICBkZXYuc2V0b3V0cmF0ZShGUkFNRVJBVEUpCisgICAgICAgIGRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQorICAgICAgICBkZXYuc2V0bmNoYW5uZWxzKDEpCisgICAgICAgIGRldi5jbG9zZSA9IGRldi5zdG9wCisgICAgaWYgYXJnczoKKyAgICAgICAgbGluZSA9IHN0cmluZy5qb2luKGFyZ3MpCisgICAgZWxzZToKKyAgICAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisgICAgd2hpbGUgbGluZToKKyAgICAgICAgcHJpbnQgbGluZQorICAgICAgICBtbGluZSA9IG1vcnNlKGxpbmUpCisgICAgICAgIHByaW50IG1saW5lCisgICAgICAgIHBsYXkobWxpbmUsIGRldikKKyAgICAgICAgaWYgaGFzYXR0cihkZXYsICd3YWl0Jyk6CisgICAgICAgICAgICBkZXYud2FpdCgpCisgICAgICAgIGlmIG5vdCBhcmdzOgorICAgICAgICAgICAgbGluZSA9IHN5cy5zdGRpbi5yZWFkbGluZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsaW5lID0gJycKKyAgICBkZXYuY2xvc2UoKQogCiAjIENvbnZlcnQgYSBzdHJpbmcgdG8gbW9yc2UgY29kZSB3aXRoIFwwMDEgYmV0d2VlbiB0aGUgY2hhcmFjdGVycyBpbgogIyB0aGUgc3RyaW5nLgogZGVmIG1vcnNlKGxpbmUpOgotCXJlcyA9ICcnCi0JZm9yIGMgaW4gbGluZToKLQkJdHJ5OgotCQkJcmVzID0gcmVzICsgbW9yc2V0YWJbY10gKyAnXDAwMScKLQkJZXhjZXB0IEtleUVycm9yOgotCQkJcGFzcwotCXJldHVybiByZXMKKyAgICByZXMgPSAnJworICAgIGZvciBjIGluIGxpbmU6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlcyA9IHJlcyArIG1vcnNldGFiW2NdICsgJ1wwMDEnCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICByZXR1cm4gcmVzCiAKICMgUGxheSBhIGxpbmUgb2YgbW9yc2UgY29kZS4KIGRlZiBwbGF5KGxpbmUsIGRldik6Ci0JZm9yIGMgaW4gbGluZToKLQkJaWYgYyA9PSAnLic6Ci0JCQlzaW5lKGRldiwgRE9UKQotCQllbGlmIGMgPT0gJy0nOgotCQkJc2luZShkZXYsIERBSCkKLQkJZWxzZToKLQkJCXBhdXNlKGRldiwgREFIKQotCQlwYXVzZShkZXYsIERPVCkKKyAgICBmb3IgYyBpbiBsaW5lOgorICAgICAgICBpZiBjID09ICcuJzoKKyAgICAgICAgICAgIHNpbmUoZGV2LCBET1QpCisgICAgICAgIGVsaWYgYyA9PSAnLSc6CisgICAgICAgICAgICBzaW5lKGRldiwgREFIKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF1c2UoZGV2LCBEQUgpCisgICAgICAgIHBhdXNlKGRldiwgRE9UKQogCiBkZWYgc2luZShkZXYsIGxlbmd0aCk6Ci0JZGV2LndyaXRlZnJhbWVzcmF3KHNpbmV3YXZlKmxlbmd0aCkKKyAgICBkZXYud3JpdGVmcmFtZXNyYXcoc2luZXdhdmUqbGVuZ3RoKQogCiBkZWYgcGF1c2UoZGV2LCBsZW5ndGgpOgotCWRldi53cml0ZWZyYW1lc3Jhdyhub3dhdmUqbGVuZ3RoKQorICAgIGRldi53cml0ZWZyYW1lc3Jhdyhub3dhdmUqbGVuZ3RoKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nIG9yIHN5cy5hcmd2WzBdID09IF9fbmFtZV9fOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vc291bmQvbW9yc2VsaWIucHkgYi9NYWMvRGVtby9zb3VuZC9tb3JzZWxpYi5weQppbmRleCA2ZjhlZWQ2Li45OGUyNTkwIDEwMDY0NAotLS0gYS9NYWMvRGVtby9zb3VuZC9tb3JzZWxpYi5weQorKysgYi9NYWMvRGVtby9zb3VuZC9tb3JzZWxpYi5weQpAQCAtMTAsMTc5ICsxMCwxNzkgQEAKIERBSCA9IDgwCiAKIG1vcnNldGFiID0gewotCSdhJzogJy4tJywKLQknYic6ICctLi4uJywKLQknYyc6ICctLi0uJywKLQknZCc6ICctLi4nLAotCSdlJzogJy4nLAotCSdmJzogJy4uLS4nLAotCSdnJzogJy0tLicsCi0JJ2gnOiAnLi4uLicsCi0JJ2knOiAnLi4nLAotCSdqJzogJy4tLS0nLAotCSdrJzogJy0uLScsCi0JJ2wnOiAnLi0uLicsCi0JJ20nOiAnLS0nLAotCSduJzogJy0uJywKLQknbyc6ICctLS0nLAotCSdwJzogJy4tLS4nLAotCSdxJzogJy0tLi0nLAotCSdyJzogJy4tLicsCi0JJ3MnOiAnLi4uJywKLQkndCc6ICctJywKLQkndSc6ICcuLi0nLAotCSd2JzogJy4uLi0nLAotCSd3JzogJy4tLScsCi0JJ3gnOiAnLS4uLScsCi0JJ3knOiAnLS4tLScsCi0JJ3onOiAnLS0uLicsCi0JJzAnOiAnLS0tLS0nLAotCScxJzogJy4tLS0tJywKLQknMic6ICcuLi0tLScsCi0JJzMnOiAnLi4uLS0nLAotCSc0JzogJy4uLi4tJywKLQknNSc6ICcuLi4uLicsCi0JJzYnOiAnLS4uLi4nLAotCSc3JzogJy0tLi4uJywKLQknOCc6ICctLS0uLicsCi0JJzknOiAnLS0tLS4nLAotCScsJzogJy0tLi4tLScsCi0JJy4nOiAnLi0uLS4tJywKLQknPyc6ICcuLi0tLi4nLAotCSc7JzogJy0uLS4tLicsCi0JJzonOiAnLS0tLi4uJywKLQkiJyI6ICcuLS0tLS4nLAotCSctJzogJy0uLi4uLScsCi0JJy8nOiAnLS4uLS4nLAotCScoJzogJy0uLS0uLScsCi0JJyknOiAnLS4tLS4tJywgIyBYWFggc2FtZSBhcyBjb2RlIGZvciAnKCcgPz8/Ci0JJ18nOiAnLi4tLS4tJywKLQknICc6ICcgJworICAgICAgICAnYSc6ICcuLScsCisgICAgICAgICdiJzogJy0uLi4nLAorICAgICAgICAnYyc6ICctLi0uJywKKyAgICAgICAgJ2QnOiAnLS4uJywKKyAgICAgICAgJ2UnOiAnLicsCisgICAgICAgICdmJzogJy4uLS4nLAorICAgICAgICAnZyc6ICctLS4nLAorICAgICAgICAnaCc6ICcuLi4uJywKKyAgICAgICAgJ2knOiAnLi4nLAorICAgICAgICAnaic6ICcuLS0tJywKKyAgICAgICAgJ2snOiAnLS4tJywKKyAgICAgICAgJ2wnOiAnLi0uLicsCisgICAgICAgICdtJzogJy0tJywKKyAgICAgICAgJ24nOiAnLS4nLAorICAgICAgICAnbyc6ICctLS0nLAorICAgICAgICAncCc6ICcuLS0uJywKKyAgICAgICAgJ3EnOiAnLS0uLScsCisgICAgICAgICdyJzogJy4tLicsCisgICAgICAgICdzJzogJy4uLicsCisgICAgICAgICd0JzogJy0nLAorICAgICAgICAndSc6ICcuLi0nLAorICAgICAgICAndic6ICcuLi4tJywKKyAgICAgICAgJ3cnOiAnLi0tJywKKyAgICAgICAgJ3gnOiAnLS4uLScsCisgICAgICAgICd5JzogJy0uLS0nLAorICAgICAgICAneic6ICctLS4uJywKKyAgICAgICAgJzAnOiAnLS0tLS0nLAorICAgICAgICAnMSc6ICcuLS0tLScsCisgICAgICAgICcyJzogJy4uLS0tJywKKyAgICAgICAgJzMnOiAnLi4uLS0nLAorICAgICAgICAnNCc6ICcuLi4uLScsCisgICAgICAgICc1JzogJy4uLi4uJywKKyAgICAgICAgJzYnOiAnLS4uLi4nLAorICAgICAgICAnNyc6ICctLS4uLicsCisgICAgICAgICc4JzogJy0tLS4uJywKKyAgICAgICAgJzknOiAnLS0tLS4nLAorICAgICAgICAnLCc6ICctLS4uLS0nLAorICAgICAgICAnLic6ICcuLS4tLi0nLAorICAgICAgICAnPyc6ICcuLi0tLi4nLAorICAgICAgICAnOyc6ICctLi0uLS4nLAorICAgICAgICAnOic6ICctLS0uLi4nLAorICAgICAgICAiJyI6ICcuLS0tLS4nLAorICAgICAgICAnLSc6ICctLi4uLi0nLAorICAgICAgICAnLyc6ICctLi4tLicsCisgICAgICAgICcoJzogJy0uLS0uLScsCisgICAgICAgICcpJzogJy0uLS0uLScsICMgWFhYIHNhbWUgYXMgY29kZSBmb3IgJygnID8/PworICAgICAgICAnXyc6ICcuLi0tLi0nLAorICAgICAgICAnICc6ICcgJwogfQogCiBkZWYgbW9yc2Vjb2RlKHMpOgotCWZyb20gc3RyaW5nIGltcG9ydCBsb3dlcgotCW0gPSAnJwotCWZvciBjIGluIHM6Ci0JCWMgPSBsb3dlcihjKQotCQlpZiBtb3JzZXRhYi5oYXNfa2V5KGMpOgotCQkJYyA9IG1vcnNldGFiW2NdICsgJyAnCi0JCWVsc2U6Ci0JCQljID0gJz8gJwotCQltID0gbSArIGMKLQlyZXR1cm4gbQorICAgIGZyb20gc3RyaW5nIGltcG9ydCBsb3dlcgorICAgIG0gPSAnJworICAgIGZvciBjIGluIHM6CisgICAgICAgIGMgPSBsb3dlcihjKQorICAgICAgICBpZiBtb3JzZXRhYi5oYXNfa2V5KGMpOgorICAgICAgICAgICAgYyA9IG1vcnNldGFiW2NdICsgJyAnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBjID0gJz8gJworICAgICAgICBtID0gbSArIGMKKyAgICByZXR1cm4gbQogCiAKIGNsYXNzIEJhc2VNb3JzZToKLQkiYmFzZSBjbGFzcyBmb3IgbW9yc2UgdHJhbnNtaXNzaW9ucyIgCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQkiY29uc3RydWN0b3IiCi0JCXNlbGYuZG90cyA9IERPVAotCQlzZWxmLmRhaHMgPSBEQUgKLQkKLQlkZWYgbm9pc2Uoc2VsZiwgZHVyYXRpb24pOgotCQkiYmVlcCBmb3IgZ2l2ZW4gZHVyYXRpb24iCi0JCXBhc3MKLQkKLQlkZWYgcGF1c2Uoc2VsZiwgZHVyYXRpb24pOgotCQkicGF1c2UgZm9yIGdpdmVuIGR1cmF0aW9uIgotCQlwYXNzCi0JCi0JZGVmIGRvdChzZWxmKToKLQkJInNob3J0IGJlZXAiCi0JCXNlbGYubm9pc2Uoc2VsZi5kb3RzKQotCQotCWRlZiBkYWgoc2VsZik6Ci0JCSJsb25nIGJlZXAiCi0JCXNlbGYubm9pc2Uoc2VsZi5kYWhzKQotCQotCWRlZiBwZG90KHNlbGYpOgotCQkicGF1c2UgYXMgbG9uZyBhcyBhIGRvdCIKLQkJc2VsZi5wYXVzZShzZWxmLmRvdHMpCi0JCi0JZGVmIHBkYWgoc2VsZik6Ci0JCSJwYXVzZSBhcyBsb25nIGFzIGEgZGFoIgotCQlzZWxmLnBhdXNlKHNlbGYuZGFocykKLQkKLQlkZWYgc2VuZG1vcnNlKHNlbGYsIHMpOgotCQlmb3IgYyBpbiBzOgotCQkJaWYgYyA9PSAnLic6IHNlbGYuZG90KCkKLQkJCWVsaWYgYyA9PSAnLSc6IHNlbGYuZGFoKCkKLQkJCWVsc2U6IHNlbGYucGRhaCgpCi0JCQlzZWxmLnBkb3QoKQotCQotCWRlZiBzZW5kYXNjaWkoc2VsZiwgcyk6Ci0JCXNlbGYuc2VuZG1vcnNlKG1vcnNlY29kZShzKSkKLQkKLQlkZWYgc2VuZChzZWxmLCBzKToKLQkJc2VsZi5zZW5kYXNjaWkocykKKyAgICAiYmFzZSBjbGFzcyBmb3IgbW9yc2UgdHJhbnNtaXNzaW9ucyIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgImNvbnN0cnVjdG9yIgorICAgICAgICBzZWxmLmRvdHMgPSBET1QKKyAgICAgICAgc2VsZi5kYWhzID0gREFICisKKyAgICBkZWYgbm9pc2Uoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICAiYmVlcCBmb3IgZ2l2ZW4gZHVyYXRpb24iCisgICAgICAgIHBhc3MKKworICAgIGRlZiBwYXVzZShzZWxmLCBkdXJhdGlvbik6CisgICAgICAgICJwYXVzZSBmb3IgZ2l2ZW4gZHVyYXRpb24iCisgICAgICAgIHBhc3MKKworICAgIGRlZiBkb3Qoc2VsZik6CisgICAgICAgICJzaG9ydCBiZWVwIgorICAgICAgICBzZWxmLm5vaXNlKHNlbGYuZG90cykKKworICAgIGRlZiBkYWgoc2VsZik6CisgICAgICAgICJsb25nIGJlZXAiCisgICAgICAgIHNlbGYubm9pc2Uoc2VsZi5kYWhzKQorCisgICAgZGVmIHBkb3Qoc2VsZik6CisgICAgICAgICJwYXVzZSBhcyBsb25nIGFzIGEgZG90IgorICAgICAgICBzZWxmLnBhdXNlKHNlbGYuZG90cykKKworICAgIGRlZiBwZGFoKHNlbGYpOgorICAgICAgICAicGF1c2UgYXMgbG9uZyBhcyBhIGRhaCIKKyAgICAgICAgc2VsZi5wYXVzZShzZWxmLmRhaHMpCisKKyAgICBkZWYgc2VuZG1vcnNlKHNlbGYsIHMpOgorICAgICAgICBmb3IgYyBpbiBzOgorICAgICAgICAgICAgaWYgYyA9PSAnLic6IHNlbGYuZG90KCkKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnLSc6IHNlbGYuZGFoKCkKKyAgICAgICAgICAgIGVsc2U6IHNlbGYucGRhaCgpCisgICAgICAgICAgICBzZWxmLnBkb3QoKQorCisgICAgZGVmIHNlbmRhc2NpaShzZWxmLCBzKToKKyAgICAgICAgc2VsZi5zZW5kbW9yc2UobW9yc2Vjb2RlKHMpKQorCisgICAgZGVmIHNlbmQoc2VsZiwgcyk6CisgICAgICAgIHNlbGYuc2VuZGFzY2lpKHMpCiAKIAogaW1wb3J0IEF1ZGlvX21hYwogY2xhc3MgTXlBdWRpbyhBdWRpb19tYWMuUGxheV9BdWRpb19tYWMpOgotCWRlZiBfY2FsbGJhY2soc2VsZiwgKmFyZ3MpOgotCQlpZiBoYXNhdHRyKHNlbGYsICd1c2VyY2FsbGJhY2snKTogc2VsZi51c2VyY2FsbGJhY2soKQotCQlhcHBseShBdWRpb19tYWMuUGxheV9BdWRpb19tYWMuX2NhbGxiYWNrLCAoc2VsZiwpICsgYXJncykKKyAgICBkZWYgX2NhbGxiYWNrKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgaGFzYXR0cihzZWxmLCAndXNlcmNhbGxiYWNrJyk6IHNlbGYudXNlcmNhbGxiYWNrKCkKKyAgICAgICAgYXBwbHkoQXVkaW9fbWFjLlBsYXlfQXVkaW9fbWFjLl9jYWxsYmFjaywgKHNlbGYsKSArIGFyZ3MpCiAKIAogY2xhc3MgTWFjTW9yc2UoQmFzZU1vcnNlKToKLQkiTWFjIHNwZWNpZmljIGNsYXNzIHRvIHBsYXkgTW9yc2UgY29kZSIKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCUJhc2VNb3JzZS5fX2luaXRfXyhzZWxmKQotCQlzZWxmLmRldiA9IE15QXVkaW8oKQotCQlzZWxmLmRldi5zZXRvdXRyYXRlKEZSQU1FUkFURSkKLQkJc2VsZi5kZXYuc2V0c2FtcHdpZHRoKFNBTVBXSURUSCkKLQkJc2VsZi5kZXYuc2V0bmNoYW5uZWxzKDEpCi0JCXNlbGYuZGV2LnVzZXJjYWxsYmFjayA9IHNlbGYudXNlcmNhbGxiYWNrCi0JCXNpbmV3YXZlID0gJycKLQkJbiA9IGludChGUkFNRVJBVEUgLyBCQVNFRlJFUSkKLQkJb2N0YXZlID0gT0NUQVZFCi0JCWZyb20gbWF0aCBpbXBvcnQgc2luLCBwaQotCQlmb3IgaSBpbiByYW5nZShuKToKLQkJCXZhbCA9IGludChzaW4oMiAqIHBpICogaSAqIG9jdGF2ZSAvIG4pICogMHg3ZmZmKQotCQkJc2FtcGxlID0gY2hyKCh2YWwgPj4gOCkgJiAyNTUpICsgY2hyKHZhbCAmIDI1NSkKLQkJCXNpbmV3YXZlID0gc2luZXdhdmUgKyBzYW1wbGVbOlNBTVBXSURUSF0KLQkJc2VsZi5zaW5ld2F2ZSA9IHNpbmV3YXZlCi0JCXNlbGYuc2lsZW5jZSA9ICdcMCcgKiAobipTQU1QV0lEVEgpCi0JCXNlbGYubW9yc2VxdWV1ZSA9ICcnCi0JCi0JZGVmIF9fZGVsX18oc2VsZik6Ci0JCXNlbGYuY2xvc2UoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5kZXYgPSBOb25lCi0JCi0JZGVmIHBhdXNlKHNlbGYsIGR1cmF0aW9uKToKLQkJc2VsZi5kZXYud3JpdGVmcmFtZXMoc2VsZi5zaWxlbmNlICogZHVyYXRpb24pCi0JCi0JZGVmIG5vaXNlKHNlbGYsIGR1cmF0aW9uKToKLQkJc2VsZi5kZXYud3JpdGVmcmFtZXMoc2VsZi5zaW5ld2F2ZSAqIGR1cmF0aW9uKQotCQotCWRlZiBzZW5kbW9yc2Uoc2VsZiwgcyk6Ci0JCXNlbGYubW9yc2VxdWV1ZSA9IHNlbGYubW9yc2VxdWV1ZSArIHMKLQkJc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKLQkJc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKLQkJc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKLQkKLQlkZWYgdXNlcmNhbGxiYWNrKHNlbGYpOgotCQlpZiBzZWxmLm1vcnNlcXVldWU6Ci0JCQljLCBzZWxmLm1vcnNlcXVldWUgPSBzZWxmLm1vcnNlcXVldWVbMF0sIHNlbGYubW9yc2VxdWV1ZVsxOl0KLQkJCWlmIGMgPT0gJy4nOiBzZWxmLmRvdCgpCi0JCQllbGlmIGMgPT0gJy0nOiBzZWxmLmRhaCgpCi0JCQllbHNlOiBzZWxmLnBkYWgoKQotCQkJc2VsZi5wZG90KCkKKyAgICAiTWFjIHNwZWNpZmljIGNsYXNzIHRvIHBsYXkgTW9yc2UgY29kZSIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQmFzZU1vcnNlLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuZGV2ID0gTXlBdWRpbygpCisgICAgICAgIHNlbGYuZGV2LnNldG91dHJhdGUoRlJBTUVSQVRFKQorICAgICAgICBzZWxmLmRldi5zZXRzYW1wd2lkdGgoU0FNUFdJRFRIKQorICAgICAgICBzZWxmLmRldi5zZXRuY2hhbm5lbHMoMSkKKyAgICAgICAgc2VsZi5kZXYudXNlcmNhbGxiYWNrID0gc2VsZi51c2VyY2FsbGJhY2sKKyAgICAgICAgc2luZXdhdmUgPSAnJworICAgICAgICBuID0gaW50KEZSQU1FUkFURSAvIEJBU0VGUkVRKQorICAgICAgICBvY3RhdmUgPSBPQ1RBVkUKKyAgICAgICAgZnJvbSBtYXRoIGltcG9ydCBzaW4sIHBpCisgICAgICAgIGZvciBpIGluIHJhbmdlKG4pOgorICAgICAgICAgICAgdmFsID0gaW50KHNpbigyICogcGkgKiBpICogb2N0YXZlIC8gbikgKiAweDdmZmYpCisgICAgICAgICAgICBzYW1wbGUgPSBjaHIoKHZhbCA+PiA4KSAmIDI1NSkgKyBjaHIodmFsICYgMjU1KQorICAgICAgICAgICAgc2luZXdhdmUgPSBzaW5ld2F2ZSArIHNhbXBsZVs6U0FNUFdJRFRIXQorICAgICAgICBzZWxmLnNpbmV3YXZlID0gc2luZXdhdmUKKyAgICAgICAgc2VsZi5zaWxlbmNlID0gJ1wwJyAqIChuKlNBTVBXSURUSCkKKyAgICAgICAgc2VsZi5tb3JzZXF1ZXVlID0gJycKKworICAgIGRlZiBfX2RlbF9fKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5kZXYgPSBOb25lCisKKyAgICBkZWYgcGF1c2Uoc2VsZiwgZHVyYXRpb24pOgorICAgICAgICBzZWxmLmRldi53cml0ZWZyYW1lcyhzZWxmLnNpbGVuY2UgKiBkdXJhdGlvbikKKworICAgIGRlZiBub2lzZShzZWxmLCBkdXJhdGlvbik6CisgICAgICAgIHNlbGYuZGV2LndyaXRlZnJhbWVzKHNlbGYuc2luZXdhdmUgKiBkdXJhdGlvbikKKworICAgIGRlZiBzZW5kbW9yc2Uoc2VsZiwgcyk6CisgICAgICAgIHNlbGYubW9yc2VxdWV1ZSA9IHNlbGYubW9yc2VxdWV1ZSArIHMKKyAgICAgICAgc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKKyAgICAgICAgc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKKyAgICAgICAgc2VsZi5kZXYudXNlcmNhbGxiYWNrKCkKKworICAgIGRlZiB1c2VyY2FsbGJhY2soc2VsZik6CisgICAgICAgIGlmIHNlbGYubW9yc2VxdWV1ZToKKyAgICAgICAgICAgIGMsIHNlbGYubW9yc2VxdWV1ZSA9IHNlbGYubW9yc2VxdWV1ZVswXSwgc2VsZi5tb3JzZXF1ZXVlWzE6XQorICAgICAgICAgICAgaWYgYyA9PSAnLic6IHNlbGYuZG90KCkKKyAgICAgICAgICAgIGVsaWYgYyA9PSAnLSc6IHNlbGYuZGFoKCkKKyAgICAgICAgICAgIGVsc2U6IHNlbGYucGRhaCgpCisgICAgICAgICAgICBzZWxmLnBkb3QoKQogCiAKIGRlZiB0ZXN0KCk6Ci0JbSA9IE1hY01vcnNlKCkKLQl3aGlsZSAxOgotCQl0cnk6Ci0JCQlsaW5lID0gcmF3X2lucHV0KCdNb3JzZSBsaW5lOiAnKQotCQlleGNlcHQgKEVPRkVycm9yLCBLZXlib2FyZEludGVycnVwdCk6Ci0JCQlicmVhawotCQltLnNlbmQobGluZSkKLQkJd2hpbGUgbS5tb3JzZXF1ZXVlOiBwYXNzCisgICAgbSA9IE1hY01vcnNlKCkKKyAgICB3aGlsZSAxOgorICAgICAgICB0cnk6CisgICAgICAgICAgICBsaW5lID0gcmF3X2lucHV0KCdNb3JzZSBsaW5lOiAnKQorICAgICAgICBleGNlcHQgKEVPRkVycm9yLCBLZXlib2FyZEludGVycnVwdCk6CisgICAgICAgICAgICBicmVhaworICAgICAgICBtLnNlbmQobGluZSkKKyAgICAgICAgd2hpbGUgbS5tb3JzZXF1ZXVlOiBwYXNzCiAKIHRlc3QoKQpkaWZmIC0tZ2l0IGEvTWFjL0RlbW8vdGV4dGVkaXQvcGVkLnB5IGIvTWFjL0RlbW8vdGV4dGVkaXQvcGVkLnB5CmluZGV4IGVlZTg0OGIuLjNlOTFiMzIgMTAwNjQ0Ci0tLSBhL01hYy9EZW1vL3RleHRlZGl0L3BlZC5weQorKysgYi9NYWMvRGVtby90ZXh0ZWRpdC9wZWQucHkKQEAgLTE1LDM0NiArMTUsMzQ1IEBACiBpbXBvcnQgbWFjZnMKIAogY2xhc3MgVEVXaW5kb3coU2Nyb2xsZWRXaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG5hbWUKLQkJciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKLQkJdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkID0gdwotCQl4MCwgeTAsIHgxLCB5MSA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkKLQkJeDAgPSB4MCArIDQKLQkJeTAgPSB5MCArIDQKLQkJeDEgPSB4MSAtIDIwCi0JCXkxID0geTEgLSAyMAotCQl2ciA9IGRyID0geDAsIHkwLCB4MSwgeTEKLQkJIyN2ciA9IDQsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1Ci0JCSMjZHIgPSAoMCwgMCwgdnJbMl0sIDApCi0JCVFkLlNldFBvcnQodykKLQkJUWQuVGV4dEZvbnQoNCkKLQkJUWQuVGV4dFNpemUoOSkKLQkJc2VsZi50ZWQgPSBURS5URU5ldyhkciwgdnIpCi0JCXNlbGYudGVkLlRFQXV0b1ZpZXcoMSkKLQkJc2VsZi50ZWQuVEVTZXRUZXh0KGRhdGEpCi0JCXcuRHJhd0dyb3dJY29uKCkKLQkJc2VsZi5zY3JvbGxiYXJzKCkKLQkJc2VsZi5jaGFuZ2VkID0gMAotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQotCQkKLQlkZWYgZG9faWRsZShzZWxmKToKLQkJc2VsZi50ZWQuVEVJZGxlKCkKLQkJCi0JZGVmIGdldHNjcm9sbGJhcnZhbHVlcyhzZWxmKToKLQkJZHIgPSBzZWxmLnRlZC5kZXN0UmVjdAotCQl2ciA9IHNlbGYudGVkLnZpZXdSZWN0Ci0JCWhlaWdodCA9IHNlbGYudGVkLm5MaW5lcyAqIHNlbGYudGVkLmxpbmVIZWlnaHQKLQkJdnggPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMF0sIGRyWzJdLWRyWzBdLCB2clswXSwgdnJbMl0pCi0JCXZ5ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzFdLCBkclsxXStoZWlnaHQsIHZyWzFdLCB2clszXSkKLQkJcHJpbnQgZHIsIHZyLCBoZWlnaHQsIHZ4LCB2eQotCQlyZXR1cm4gTm9uZSwgdnkKLQkJCi0JZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgotCQlpZiB3aGljaCA9PSAneSc6Ci0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCWhlaWdodCA9IHNlbGYudGVkLm5MaW5lcyAqIHNlbGYudGVkLmxpbmVIZWlnaHQKLQkJCQljdXIgPSBzZWxmLmdldHNjcm9sbGJhcnZhbHVlcygpWzFdCi0JCQkJZGVsdGEgPSAoY3VyLXZhbHVlKSpoZWlnaHQvMzI3NjcKLQkJCWlmIHdoYXQgPT0gJy0nOgotCQkJCWRlbHRhID0gc2VsZi50ZWQubGluZUhlaWdodAotCQkJZWxpZiB3aGF0ID09ICctLSc6Ci0JCQkJZGVsdGEgPSAoc2VsZi50ZWQudmlld1JlY3RbM10tc2VsZi50ZWQubGluZUhlaWdodCkKLQkJCQlpZiBkZWx0YSA8PSAwOgotCQkJCQlkZWx0YSA9IHNlbGYudGVkLmxpbmVIZWlnaHQKLQkJCWVsaWYgd2hhdCA9PSAnKyc6Ci0JCQkJZGVsdGEgPSAtc2VsZi50ZWQubGluZUhlaWdodAotCQkJZWxpZiB3aGF0ID09ICcrKyc6Ci0JCQkJZGVsdGEgPSAtKHNlbGYudGVkLnZpZXdSZWN0WzNdLXNlbGYudGVkLmxpbmVIZWlnaHQpCi0JCQkJaWYgZGVsdGEgPj0gMDoKLQkJCQkJZGVsdGEgPSAtc2VsZi50ZWQubGluZUhlaWdodAotCQkJc2VsZi50ZWQuVEVQaW5TY3JvbGwoMCwgZGVsdGEpCi0JCQlwcmludCAnU0NST0xMIFknLCBkZWx0YQotCQllbHNlOgotCQkJcGFzcyAjIE5vIGhvcml6b250YWwgc2Nyb2xsaW5nCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKLQkJcHJpbnQgIkFDVElWQVRFIiwgb25vZmYKLQkJU2Nyb2xsZWRXaW5kb3cuZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCkKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLnRlZC5URUFjdGl2YXRlKCkKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKLQkJCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQllbHNlOgotCQkJc2VsZi50ZWQuVEVEZWFjdGl2YXRlKCkKKyAgICBkZWYgb3BlbihzZWxmLCBwYXRoLCBuYW1lLCBkYXRhKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHIgPSB3aW5kb3dib3VuZHMoNDAwLCA0MDApCisgICAgICAgIHcgPSBXaW4uTmV3V2luZG93KHIsIG5hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLndpZCA9IHcKKyAgICAgICAgeDAsIHkwLCB4MSwgeTEgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHgwID0geDAgKyA0CisgICAgICAgIHkwID0geTAgKyA0CisgICAgICAgIHgxID0geDEgLSAyMAorICAgICAgICB5MSA9IHkxIC0gMjAKKyAgICAgICAgdnIgPSBkciA9IHgwLCB5MCwgeDEsIHkxCisgICAgICAgICMjdnIgPSA0LCAwLCByWzJdLXJbMF0tMTUsIHJbM10tclsxXS0xNQorICAgICAgICAjI2RyID0gKDAsIDAsIHZyWzJdLCAwKQorICAgICAgICBRZC5TZXRQb3J0KHcpCisgICAgICAgIFFkLlRleHRGb250KDQpCisgICAgICAgIFFkLlRleHRTaXplKDkpCisgICAgICAgIHNlbGYudGVkID0gVEUuVEVOZXcoZHIsIHZyKQorICAgICAgICBzZWxmLnRlZC5URUF1dG9WaWV3KDEpCisgICAgICAgIHNlbGYudGVkLlRFU2V0VGV4dChkYXRhKQorICAgICAgICB3LkRyYXdHcm93SWNvbigpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisgICAgICAgIHNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKIAotCWRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6Ci0JCVFkLkVyYXNlUmVjdCh3aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKLQkJc2VsZi50ZWQuVEVVcGRhdGUod2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCQotCWRlZiBkb19jb250ZW50Y2xpY2soc2VsZiwgbG9jYWwsIG1vZGlmaWVycywgZXZ0KToKLQkJc2hpZnRlZCA9IChtb2RpZmllcnMgJiAweDIwMCkKLQkJc2VsZi50ZWQuVEVDbGljayhsb2NhbCwgc2hpZnRlZCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgZGVmIGRvX2lkbGUoc2VsZik6CisgICAgICAgIHNlbGYudGVkLlRFSWRsZSgpCiAKLQlkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgotCQlzZWxmLnRlZC5URVNlbFZpZXcoKQotCQlzZWxmLnRlZC5URUtleShvcmQoY2gpKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYuY2hhbmdlZDoKLQkJCXNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSB3aW5kb3cgIiVzIiBiZWZvcmUgY2xvc2luZz8nJXNlbGYubmFtZSwgMSkKLQkJCWlmIHNhdmUgPiAwOgotCQkJCXNlbGYubWVudV9zYXZlKCkKLQkJCWVsaWYgc2F2ZSA8IDA6Ci0JCQkJcmV0dXJuCi0JCWlmIHNlbGYucGFyZW50LmFjdGl2ZSA9PSBzZWxmOgotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gTm9uZQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJZGVsIHNlbGYudGVkCi0JCXNlbGYuZG9fcG9zdGNsb3NlKCkKLQkJCi0JZGVmIG1lbnVfc2F2ZShzZWxmKToKLQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCXNlbGYubWVudV9zYXZlX2FzKCkKLQkJCXJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQotCQlwcmludCAnU2F2aW5nIHRvICcsIHNlbGYucGF0aAotCQlkaGFuZGxlID0gc2VsZi50ZWQuVEVHZXRUZXh0KCkKLQkJZGF0YSA9IGRoYW5kbGUuZGF0YQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKLQkJZnAud3JpdGUoZGF0YSkKLQkJaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKLQkJZnAuY2xvc2UoKQotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCQotCWRlZiBtZW51X3NhdmVfYXMoc2VsZik6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCi0JCWlmIG5vdCBwYXRoOiByZXR1cm4KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCi0JCXNlbGYubWVudV9zYXZlKCkKLQkJCi0JZGVmIG1lbnVfY3V0KHNlbGYpOgotCQlzZWxmLnRlZC5URVNlbFZpZXcoKQotCQlzZWxmLnRlZC5URUN1dCgpCi0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCVRFLlRFVG9TY3JhcCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQotCWRlZiBtZW51X2NvcHkoc2VsZik6Ci0JCXNlbGYudGVkLlRFQ29weSgpCi0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCVRFLlRFVG9TY3JhcCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9wYXN0ZShzZWxmKToKLQkJVEUuVEVGcm9tU2NyYXAoKQotCQlzZWxmLnRlZC5URVNlbFZpZXcoKQotCQlzZWxmLnRlZC5URVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJCi0JZGVmIG1lbnVfY2xlYXIoc2VsZik6Ci0JCXNlbGYudGVkLlRFU2VsVmlldygpCi0JCXNlbGYudGVkLlRFRGVsZXRlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJCi0JZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgotCQlyZXR1cm4gKHNlbGYudGVkLnNlbFN0YXJ0IDwgc2VsZi50ZWQuc2VsRW5kKQorICAgIGRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGRyID0gc2VsZi50ZWQuZGVzdFJlY3QKKyAgICAgICAgdnIgPSBzZWxmLnRlZC52aWV3UmVjdAorICAgICAgICBoZWlnaHQgPSBzZWxmLnRlZC5uTGluZXMgKiBzZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgIHZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXS1kclswXSwgdnJbMF0sIHZyWzJdKQorICAgICAgICB2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbMV0raGVpZ2h0LCB2clsxXSwgdnJbM10pCisgICAgICAgIHByaW50IGRyLCB2ciwgaGVpZ2h0LCB2eCwgdnkKKyAgICAgICAgcmV0dXJuIE5vbmUsIHZ5CisKKyAgICBkZWYgc2Nyb2xsYmFyX2NhbGxiYWNrKHNlbGYsIHdoaWNoLCB3aGF0LCB2YWx1ZSk6CisgICAgICAgIGlmIHdoaWNoID09ICd5JzoKKyAgICAgICAgICAgIGlmIHdoYXQgPT0gJ3NldCc6CisgICAgICAgICAgICAgICAgaGVpZ2h0ID0gc2VsZi50ZWQubkxpbmVzICogc2VsZi50ZWQubGluZUhlaWdodAorICAgICAgICAgICAgICAgIGN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KKyAgICAgICAgICAgICAgICBkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NworICAgICAgICAgICAgaWYgd2hhdCA9PSAnLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSBzZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IChzZWxmLnRlZC52aWV3UmVjdFszXS1zZWxmLnRlZC5saW5lSGVpZ2h0KQorICAgICAgICAgICAgICAgIGlmIGRlbHRhIDw9IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gc2VsZi50ZWQubGluZUhlaWdodAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC1zZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC0oc2VsZi50ZWQudmlld1JlY3RbM10tc2VsZi50ZWQubGluZUhlaWdodCkKKyAgICAgICAgICAgICAgICBpZiBkZWx0YSA+PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IC1zZWxmLnRlZC5saW5lSGVpZ2h0CisgICAgICAgICAgICBzZWxmLnRlZC5URVBpblNjcm9sbCgwLCBkZWx0YSkKKyAgICAgICAgICAgIHByaW50ICdTQ1JPTEwgWScsIGRlbHRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXNzICMgTm8gaG9yaXpvbnRhbCBzY3JvbGxpbmcKKworICAgIGRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKKyAgICAgICAgcHJpbnQgIkFDVElWQVRFIiwgb25vZmYKKyAgICAgICAgU2Nyb2xsZWRXaW5kb3cuZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCkKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLnRlZC5URUFjdGl2YXRlKCkKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKKyAgICAgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZWQuVEVEZWFjdGl2YXRlKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6CisgICAgICAgIFFkLkVyYXNlUmVjdCh3aWQuR2V0V2luZG93UG9ydCgpLkdldFBvcnRCb3VuZHMoKSkKKyAgICAgICAgc2VsZi50ZWQuVEVVcGRhdGUod2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6CisgICAgICAgIHNoaWZ0ZWQgPSAobW9kaWZpZXJzICYgMHgyMDApCisgICAgICAgIHNlbGYudGVkLlRFQ2xpY2sobG9jYWwsIHNoaWZ0ZWQpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZWQuVEVTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuVEVLZXkob3JkKGNoKSkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGFuZ2VkOgorICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQorICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBkZWwgc2VsZi50ZWQKKyAgICAgICAgc2VsZi5kb19wb3N0Y2xvc2UoKQorCisgICAgZGVmIG1lbnVfc2F2ZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aDoKKyAgICAgICAgICAgIHNlbGYubWVudV9zYXZlX2FzKCkKKyAgICAgICAgICAgIHJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQorICAgICAgICBwcmludCAnU2F2aW5nIHRvICcsIHNlbGYucGF0aAorICAgICAgICBkaGFuZGxlID0gc2VsZi50ZWQuVEVHZXRUZXh0KCkKKyAgICAgICAgZGF0YSA9IGRoYW5kbGUuZGF0YQorICAgICAgICBmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKKyAgICAgICAgZnAud3JpdGUoZGF0YSkKKyAgICAgICAgaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKKyAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisKKyAgICBkZWYgbWVudV9zYXZlX2FzKHNlbGYpOgorICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonKQorICAgICAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnBhdGgpWy0xXQorICAgICAgICBzZWxmLndpZC5TZXRXVGl0bGUoc2VsZi5uYW1lKQorICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisKKyAgICBkZWYgbWVudV9jdXQoc2VsZik6CisgICAgICAgIHNlbGYudGVkLlRFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLlRFQ3V0KCkKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgorICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgVEUuVEVUb1NjcmFwKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NvcHkoc2VsZik6CisgICAgICAgIHNlbGYudGVkLlRFQ29weSgpCisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIFRFLlRFVG9TY3JhcCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcGFzdGUoc2VsZik6CisgICAgICAgIFRFLlRFRnJvbVNjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuVEVTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuVEVQYXN0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgbWVudV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuVEVTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuVEVEZWxldGUoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICByZXR1cm4gKHNlbGYudGVkLnNlbFN0YXJ0IDwgc2VsZi50ZWQuc2VsRW5kKQogCiBjbGFzcyBQZWQoQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5udW0gPSAwCi0JCXNlbGYuYWN0aXZlID0gTm9uZQotCQlzZWxmLnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKLQkJc2VsZi5maWxlbWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQotCQlzZWxmLm5ld2l0ZW0gPSBNZW51SXRlbShtLCAiTmV3IHdpbmRvdyIsICJOIiwgc2VsZi5vcGVuKQotCQlzZWxmLm9wZW5pdGVtID0gTWVudUl0ZW0obSwgIk9wZW4uLi4iLCAiTyIsIHNlbGYub3BlbmZpbGUpCi0JCXNlbGYuY2xvc2VpdGVtID0gTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCBzZWxmLmNsb3Nld2luKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuc2F2ZWl0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgc2VsZi5zYXZlKQotCQlzZWxmLnNhdmVhc2l0ZW0gPSBNZW51SXRlbShtLCAiU2F2ZSBhcy4uLiIsICIiLCBzZWxmLnNhdmVhcykKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkJCi0JCXNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKLQkJc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCi0JCXNlbGYuY3V0aXRlbSA9IE1lbnVJdGVtKG0sICJDdXQiLCAiWCIsIHNlbGYuY3V0KQotCQlzZWxmLmNvcHlpdGVtID0gTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsIHNlbGYuY29weSkKLQkJc2VsZi5wYXN0ZWl0ZW0gPSBNZW51SXRlbShtLCAiUGFzdGUiLCAiViIsIHNlbGYucGFzdGUpCi0JCXNlbGYuY2xlYXJpdGVtID0gTWVudUl0ZW0obSwgIkNsZWFyIiwgIiIsIHNlbGYuY2xlYXIpCi0JCQotCQkjIE5vdCB5ZXQgaW1wbGVtZW50ZWQ6Ci0JCXNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCi0JCQotCQkjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgotCQlzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sIHNlbGYuZWRpdG1lbnVdCi0JCXNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQotCQlzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKLQkJc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKLQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKLQkJCi0JZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6Ci0JCWNoYW5nZWQgPSAwCi0JCW9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCi0JCWlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246Ci0JCQlmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgotCQkJCW0uZW5hYmxlKG9uKQotCQkJc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCi0JCQljaGFuZ2VkID0gMQotCQlpZiBvbjoKLQkJCSMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQotCQkJb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCi0JCQlpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246Ci0JCQkJZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgotCQkJCQltLmVuYWJsZShvbikKLQkJCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlpZiBoYXNhdHRyKFNjcmFwLCAnSW5mb1NjcmFwJyk6Ci0JCQkJb24gPSAoU2NyYXAuSW5mb1NjcmFwKClbMF0gPD4gMCkKLQkJCWVsc2U6Ci0JCQkJZmxhdm9ycyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpLkdldFNjcmFwRmxhdm9ySW5mb0xpc3QoKQotCQkJCWZvciB0cCwgaW5mbyBpbiBmbGF2b3JzOgotCQkJCQlpZiB0cCA9PSAnVEVYVCc6Ci0JCQkJCQlvbiA9IDEKLQkJCQkJCWJyZWFrCi0JCQkJZWxzZToKLQkJCQkJb24gPSAwCi0JCQlpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246Ci0JCQkJc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQotCQkJCXNlbGYucGFzdGVncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJaWYgY2hhbmdlZDoKLQkJCURyYXdNZW51QmFyKCkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubnVtID0gMAorICAgICAgICBzZWxmLmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi51cGRhdGVtZW51YmFyKCkKIAotCSMKLQkjIEFwcGxlIG1lbnUKLQkjCi0JCi0JZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiQSBzaW1wbGUgc2luZ2xlLWZvbnQgdGV4dCBlZGl0b3IiKQotCQkJCi0JIwotCSMgRmlsZSBtZW51Ci0JIworICAgIGRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgorICAgICAgICBzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCisgICAgICAgIHNlbGYubmV3aXRlbSA9IE1lbnVJdGVtKG0sICJOZXcgd2luZG93IiwgIk4iLCBzZWxmLm9wZW4pCisgICAgICAgIHNlbGYub3Blbml0ZW0gPSBNZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZmlsZSkKKyAgICAgICAgc2VsZi5jbG9zZWl0ZW0gPSBNZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsIHNlbGYuY2xvc2V3aW4pCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCisgICAgICAgIHNlbGYuc2F2ZWFzaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIGFzLi4uIiwgIiIsIHNlbGYuc2F2ZWFzKQorICAgICAgICBtLmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQogCi0JZGVmIG9wZW4oc2VsZiwgKmFyZ3MpOgotCQlzZWxmLl9vcGVuKDApCi0JCQotCWRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMSkKKyAgICAgICAgc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICBzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKKyAgICAgICAgc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCisgICAgICAgIHNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQorICAgICAgICBzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKKyAgICAgICAgc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKIAotCWRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKLQkJaWYgYXNrZmlsZToKLQkJCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCi0JCQlpZiBub3QgcGF0aDoKLQkJCQlyZXR1cm4KLQkJCW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQotCQkJdHJ5OgotCQkJCWZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCi0JCQkJZGF0YSA9IGZwLnJlYWQoKQotCQkJCWZwLmNsb3NlKCkKLQkJCWV4Y2VwdCBJT0Vycm9yLCBhcmc6Ci0JCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQotCQkJCXJldHVybgotCQllbHNlOgotCQkJcGF0aCA9IE5vbmUKLQkJCW5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCi0JCQlkYXRhID0gJycKLQkJdyA9IFRFV2luZG93KHNlbGYpCi0JCXcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQotCQlzZWxmLm51bSA9IHNlbGYubnVtICsgMQotCQkKLQlkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmNsb3NlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQkKLQkJCi0JZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgotCQlmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgotCQkJdy5jbG9zZSgpCi0JCWlmIHNlbGYuX3dpbmRvd3M6Ci0JCQlyZXR1cm4KLQkJc2VsZi5fcXVpdCgpCi0JCQotCSMKLQkjIEVkaXQgbWVudQotCSMKLQkKLQlkZWYgdW5kbyhzZWxmLCAqYXJncyk6Ci0JCXBhc3MKLQkJCi0JZGVmIGN1dChzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jdXQoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY29weShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHBhc3RlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3Bhc3RlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICAgICAgIyBOb3QgeWV0IGltcGxlbWVudGVkOgorICAgICAgICBzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQogCi0JZGVmIGNsZWFyKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JIwotCSMgT3RoZXIgc3R1ZmYKLQkjCQorICAgICAgICAjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgorICAgICAgICBzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sIHNlbGYuZWRpdG1lbnVdCisgICAgICAgIHNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQorICAgICAgICBzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKIAotCWRlZiBpZGxlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5kb19pZGxlKCkKLQkJZWxzZToKLQkJCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQorICAgIGRlZiB1cGRhdGVtZW51YmFyKHNlbGYpOgorICAgICAgICBjaGFuZ2VkID0gMAorICAgICAgICBvbiA9IChzZWxmLmFjdGl2ZSA8PiBOb25lKQorICAgICAgICBpZiBvbiA8PiBzZWxmLndpbmRvd2dyb3VwX29uOgorICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi53aW5kb3dncm91cDoKKyAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSBvbgorICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgb246CisgICAgICAgICAgICAjIG9ubHkgaWYgd2UgaGF2ZSBhbiBlZGl0IG1lbnUKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuaGF2ZV9zZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5mb2N1c2dyb3VwX29uOgorICAgICAgICAgICAgICAgIGZvciBtIGluIHNlbGYuZm9jdXNncm91cDoKKyAgICAgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ0luZm9TY3JhcCcpOgorICAgICAgICAgICAgICAgIG9uID0gKFNjcmFwLkluZm9TY3JhcCgpWzBdIDw+IDApCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZsYXZvcnMgPSBTY3JhcC5HZXRDdXJyZW50U2NyYXAoKS5HZXRTY3JhcEZsYXZvckluZm9MaXN0KCkKKyAgICAgICAgICAgICAgICBmb3IgdHAsIGluZm8gaW4gZmxhdm9yczoKKyAgICAgICAgICAgICAgICAgICAgaWYgdHAgPT0gJ1RFWFQnOgorICAgICAgICAgICAgICAgICAgICAgICAgb24gPSAxCisgICAgICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG9uID0gMAorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5wYXN0ZWdyb3VwX29uOgorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVpdGVtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIGNoYW5nZWQ6CisgICAgICAgICAgICBEcmF3TWVudUJhcigpCisKKyAgICAjCisgICAgIyBBcHBsZSBtZW51CisgICAgIworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiQSBzaW1wbGUgc2luZ2xlLWZvbnQgdGV4dCBlZGl0b3IiKQorCisgICAgIworICAgICMgRmlsZSBtZW51CisgICAgIworCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDApCisKKyAgICBkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDEpCisKKyAgICBkZWYgX29wZW4oc2VsZiwgYXNrZmlsZSk6CisgICAgICAgIGlmIGFza2ZpbGU6CisgICAgICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQorICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQorICAgICAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnOgorICAgICAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICBuYW1lID0gIlVudGl0bGVkICVkIiVzZWxmLm51bQorICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHcgPSBURVdpbmRvdyhzZWxmKQorICAgICAgICB3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKKyAgICAgICAgc2VsZi5udW0gPSBzZWxmLm51bSArIDEKKworICAgIGRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fd2luZG93czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgICMKKyAgICAjIEVkaXQgbWVudQorICAgICMKKworICAgIGRlZiB1bmRvKHNlbGYsICphcmdzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGN1dChzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jdXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNsZWFyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgICMKKyAgICAjIE90aGVyIHN0dWZmCisgICAgIworCisgICAgZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmRvX2lkbGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCiAKIGRlZiBtYWluKCk6Ci0JQXBwID0gUGVkKCkKLQlBcHAubWFpbmxvb3AoKQotCQorICAgIEFwcCA9IFBlZCgpCisgICAgQXBwLm1haW5sb29wKCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3dhc3RlL2h0bWxlZC5weSBiL01hYy9EZW1vL3dhc3RlL2h0bWxlZC5weQppbmRleCA4NzEwNzY2Li5kOGNlYTFiIDEwMDY0NAotLS0gYS9NYWMvRGVtby93YXN0ZS9odG1sZWQucHkKKysrIGIvTWFjL0RlbW8vd2FzdGUvaHRtbGVkLnB5CkBAIC0yMyw4MDkgKzIzLDgwOCBAQAogTEVGVE1BUkdJTj0wCiAKIFVORE9MQUJFTFMgPSBbICMgSW5kZXhlZCBieSBXRUdldFVuZG9JbmZvKCkgdmFsdWUKLQlOb25lLCAiIiwgInR5cGluZyIsICJDdXQiLCAiUGFzdGUiLCAiQ2xlYXIiLCAiRHJhZyIsICJTdHlsZSJdCi0JCisgICAgICAgIE5vbmUsICIiLCAidHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJEcmFnIiwgIlN0eWxlIl0KKwogIyBTdHlsZSBhbmQgc2l6ZSBtZW51LiBOb3RlIHRoYXQgc3R5bGUgb3JkZXIgaXMgaW1wb3J0YW50ICh0aWVkIHRvIGJpdCB2YWx1ZXMpCiBTVFlMRVMgPSBbCi0JKCJCb2xkIiwgIkIiKSwgKCJJdGFsaWMiLCAiSSIpLCAoIlVuZGVybGluZSIsICJVIiksICgiT3V0bGluZSIsICJPIiksCi0JKCJTaGFkb3ciLCAiIiksICgiQ29uZGVuc2VkIiwgIiIpLCAoIkV4dGVuZGVkIiwgIiIpCi0JXQorICAgICAgICAoIkJvbGQiLCAiQiIpLCAoIkl0YWxpYyIsICJJIiksICgiVW5kZXJsaW5lIiwgIlUiKSwgKCJPdXRsaW5lIiwgIk8iKSwKKyAgICAgICAgKCJTaGFkb3ciLCAiIiksICgiQ29uZGVuc2VkIiwgIiIpLCAoIkV4dGVuZGVkIiwgIiIpCisgICAgICAgIF0KIFNJWkVTID0gWyA5LCAxMCwgMTIsIDE0LCAxOCwgMjRdCiAKICMgU2l6ZXMgZm9yIEhUTUwgdGFnIHR5cGVzCiBIVE1MX1NJWkU9ewotCSdoMSc6IDE4LAotCSdoMic6IDE0CisgICAgICAgICdoMSc6IDE4LAorICAgICAgICAnaDInOiAxNAogfQotCQorCiBCSUdSRUdJT049UWQuTmV3UmduKCkKIFFkLlNldFJlY3RSZ24oQklHUkVHSU9OLCAtMTYwMDAsIC0xNjAwMCwgMTYwMDAsIDE2MDAwKQogCiBjbGFzcyBXYXN0ZVdpbmRvdyhTY3JvbGxlZFdpbmRvdyk6Ci0JZGVmIG9wZW4oc2VsZiwgcGF0aCwgbmFtZSwgZGF0YSk6Ci0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gbmFtZQotCQlyID0gd2luZG93Ym91bmRzKDQwMCwgNDAwKQotCQl3ID0gV2luLk5ld1dpbmRvdyhyLCBuYW1lLCAxLCAwLCAtMSwgMSwgMCkKLQkJc2VsZi53aWQgPSB3Ci0JCXZyID0gTEVGVE1BUkdJTiwgMCwgclsyXS1yWzBdLTE1LCByWzNdLXJbMV0tMTUKLQkJZHIgPSAoMCwgMCwgdnJbMl0sIDApCi0JCVFkLlNldFBvcnQodykKLQkJUWQuVGV4dEZvbnQoNCkKLQkJUWQuVGV4dFNpemUoOSkKLQkJZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZSB8IFwKLQkJCVdBU1RFY29uc3Qud2VEb01vbm9TdHlsZWQgfCBXQVNURWNvbnN0LndlRG9VbmRvCi0JCXNlbGYudGVkID0gd2FzdGUuV0VOZXcoZHIsIHZyLCBmbGFncykKLQkJc2VsZi50ZWQuV0VJbnN0YWxsVGFiSG9va3MoKQotCQlzdHlsZSwgc291cCA9IHNlbGYuZ2V0c3R5bGVzb3VwKHNlbGYucGF0aCkKLQkJc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgc3R5bGUsIHNvdXApCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKDAsMCkKLQkJc2VsZi50ZWQuV0VDYWxUZXh0KCkKLQkJc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKLQkJdy5EcmF3R3Jvd0ljb24oKQotCQlzZWxmLnNjcm9sbGJhcnMoKQotCQlzZWxmLmRvX3Bvc3RvcGVuKCkKLQkJc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQotCQkKLQlkZWYgZ2V0c3R5bGVzb3VwKHNlbGYsIHBhdGhuYW1lKToKLQkJaWYgbm90IHBhdGhuYW1lOgotCQkJcmV0dXJuIE5vbmUsIE5vbmUKLQkJb2xkcmYgPSBSZXMuQ3VyUmVzRmlsZSgpCi0JCXRyeToKLQkJCXJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMSkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCXJldHVybiBOb25lLCBOb25lCi0JCXRyeToKLQkJCWhzdHlsZSA9IFJlcy5HZXQxUmVzb3VyY2UoJ3N0eWwnLCAxMjgpCi0JCQloc3R5bGUuRGV0YWNoUmVzb3VyY2UoKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJaHN0eWxlID0gTm9uZQotCQl0cnk6Ci0JCQloc291cCA9IFJlcy5HZXQxUmVzb3VyY2UoJ1NPVVAnLCAxMjgpCi0JCQloc291cC5EZXRhY2hSZXNvdXJjZSgpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQloc291cCA9IE5vbmUKLQkJUmVzLkNsb3NlUmVzRmlsZShyZikKLQkJUmVzLlVzZVJlc0ZpbGUob2xkcmYpCi0JCXJldHVybiBoc3R5bGUsIGhzb3VwCi0JCQkJCi0JZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlzZWxmLnRlZC5XRUlkbGUoKQkKLQkJaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6Ci0JCQlyZXR1cm4KLQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCi0JCQotCWRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6Ci0JCWRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQotCQl2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKLQkJcmV0dXJuIHZ4LCB2eQotCQkKLQlkZWYgc2Nyb2xsYmFyX2NhbGxiYWNrKHNlbGYsIHdoaWNoLCB3aGF0LCB2YWx1ZSk6Ci0JCWlmIHdoaWNoID09ICd5JzoKLQkJCSMKLQkJCSMgImxpbmUiIHNpemUgaXMgbWluaW11bSBvZiB0b3AgYW5kIGJvdHRvbSBsaW5lIHNpemUKLQkJCSMKLQkJCXRvcGxpbmVfb2ZmLGR1bW15ID0gc2VsZi50ZWQuV0VHZXRPZmZzZXQoKDEsMSkpCi0JCQl0b3BsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHRvcGxpbmVfb2ZmKQotCQkJdG9wbGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KHRvcGxpbmVfbnVtLCB0b3BsaW5lX251bSsxKQorICAgIGRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKKyAgICAgICAgdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkID0gdworICAgICAgICB2ciA9IExFRlRNQVJHSU4sIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1CisgICAgICAgIGRyID0gKDAsIDAsIHZyWzJdLCAwKQorICAgICAgICBRZC5TZXRQb3J0KHcpCisgICAgICAgIFFkLlRleHRGb250KDQpCisgICAgICAgIFFkLlRleHRTaXplKDkpCisgICAgICAgIGZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUgfCBcCisgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZCB8IFdBU1RFY29uc3Qud2VEb1VuZG8KKyAgICAgICAgc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkciwgdnIsIGZsYWdzKQorICAgICAgICBzZWxmLnRlZC5XRUluc3RhbGxUYWJIb29rcygpCisgICAgICAgIHN0eWxlLCBzb3VwID0gc2VsZi5nZXRzdHlsZXNvdXAoc2VsZi5wYXRoKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBzdHlsZSwgc291cCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwwKQorICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICBzZWxmLnRlZC5XRVJlc2V0TW9kQ291bnQoKQorICAgICAgICB3LkRyYXdHcm93SWNvbigpCisgICAgICAgIHNlbGYuc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuZG9fcG9zdG9wZW4oKQorICAgICAgICBzZWxmLmRvX2FjdGl2YXRlKDEsIE5vbmUpCiAKLQkJCWJvdGxpbmVwb3MgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10JCQkKLQkJCWJvdGxpbmVfb2ZmLCBkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLCBib3RsaW5lcG9zLTEpKQotCQkJYm90bGluZV9udW0gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShib3RsaW5lX29mZikKLQkJCWJvdGxpbmVoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodChib3RsaW5lX251bSwgYm90bGluZV9udW0rMSkKLQkJCQotCQkJaWYgYm90bGluZWhlaWdodCA9PSAwOgotCQkJCWJvdGxpbmVoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodChib3RsaW5lX251bS0xLCBib3RsaW5lX251bSkKLQkJCWlmIGJvdGxpbmVoZWlnaHQgPCB0b3BsaW5laGVpZ2h0OgotCQkJCWxpbmVoZWlnaHQgPSBib3RsaW5laGVpZ2h0Ci0JCQllbHNlOgotCQkJCWxpbmVoZWlnaHQgPSB0b3BsaW5laGVpZ2h0Ci0JCQlpZiBsaW5laGVpZ2h0IDw9IDA6Ci0JCQkJbGluZWhlaWdodCA9IDEKLQkJCSMKLQkJCSMgTm93IGRvIHRoZSBjb21tYW5kLgotCQkJIwotCQkJaWYgd2hhdCA9PSAnc2V0JzoKLQkJCQloZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodCgwLCAweDNmZmZmZmZmKQotCQkJCWN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KLQkJCQlkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NwotCQkJaWYgd2hhdCA9PSAnLSc6Ci0JCQkJZGVsdGEgPSBsaW5laGVpZ2h0Ci0JCQllbGlmIHdoYXQgPT0gJy0tJzoKLQkJCQlkZWx0YSA9IChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tbGluZWhlaWdodCkKLQkJCQlpZiBkZWx0YSA8PSAwOgotCQkJCQlkZWx0YSA9IGxpbmVoZWlnaHQKLQkJCWVsaWYgd2hhdCA9PSAnKyc6Ci0JCQkJZGVsdGEgPSAtbGluZWhlaWdodAotCQkJZWxpZiB3aGF0ID09ICcrKyc6Ci0JCQkJZGVsdGEgPSAtKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS1saW5laGVpZ2h0KQotCQkJCWlmIGRlbHRhID49IDA6Ci0JCQkJCWRlbHRhID0gLWxpbmVoZWlnaHQKLQkJCXNlbGYudGVkLldFU2Nyb2xsKDAsIGRlbHRhKQotCQllbHNlOgotCQkJaWYgd2hhdCA9PSAnc2V0JzoKLQkJCQlyZXR1cm4gIyBYWFhYCi0JCQl2ciA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQkJd2lud2lkdGggPSB2clsyXS12clswXQotCQkJaWYgd2hhdCA9PSAnLSc6Ci0JCQkJZGVsdGEgPSB3aW53aWR0aC8xMAotCQkJZWxpZiB3aGF0ID09ICctLSc6Ci0JCQkJZGVsdGEgPSB3aW53aWR0aC8yCi0JCQllbGlmIHdoYXQgPT0gJysnOgotCQkJCWRlbHRhID0gLXdpbndpZHRoLzEwCi0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC13aW53aWR0aC8yCi0JCQlzZWxmLnRlZC5XRVNjcm9sbChkZWx0YSwgMCkKLQkJIyBQaW4gdGhlIHNjcm9sbAotCQlsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCWlmIHQgPiAwIG9yIGwgPiAwOgotCQkJZHggPSBkeSA9IDAKLQkJCWlmIHQgPiAwOiBkeSA9IC10Ci0JCQlpZiBsID4gMDogZHggPSAtbAotCQkJc2VsZi50ZWQuV0VTY3JvbGwoZHgsIGR5KQotCQllbGlmIGIgPCB2YjoKLQkJCXNlbGYudGVkLldFU2Nyb2xsKDAsIHZiLWIpCisgICAgZGVmIGdldHN0eWxlc291cChzZWxmLCBwYXRobmFtZSk6CisgICAgICAgIGlmIG5vdCBwYXRobmFtZToKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIG9sZHJmID0gUmVzLkN1clJlc0ZpbGUoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICByZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDEpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gTm9uZSwgTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBoc3R5bGUgPSBSZXMuR2V0MVJlc291cmNlKCdzdHlsJywgMTI4KQorICAgICAgICAgICAgaHN0eWxlLkRldGFjaFJlc291cmNlKCkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIGhzdHlsZSA9IE5vbmUKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaHNvdXAgPSBSZXMuR2V0MVJlc291cmNlKCdTT1VQJywgMTI4KQorICAgICAgICAgICAgaHNvdXAuRGV0YWNoUmVzb3VyY2UoKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgaHNvdXAgPSBOb25lCisgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmYpCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG9sZHJmKQorICAgICAgICByZXR1cm4gaHN0eWxlLCBoc291cAogCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJU2Nyb2xsZWRXaW5kb3cuZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCkKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLnRlZC5XRUFjdGl2YXRlKCkKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKLQkJCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICBkZWYgZG9faWRsZShzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIFFkLlNldFBvcnQoc2VsZi53aWQpCisgICAgICAgIHNlbGYudGVkLldFSWRsZSgpCisgICAgICAgIGlmIHNlbGYudGVkLldFQWRqdXN0Q3Vyc29yKHdoZXJlLCBCSUdSRUdJT04pOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQogCi0JZGVmIGRvX3VwZGF0ZShzZWxmLCB3aWQsIGV2ZW50KToKLQkJcmVnaW9uID0gd2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJaWYgUWQuRW1wdHlSZ24ocmVnaW9uKToKLQkJCXJldHVybgotCQlRZC5FcmFzZVJnbihyZWdpb24pCi0JCXNlbGYudGVkLldFVXBkYXRlKHJlZ2lvbikKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJCi0JZGVmIGRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KToKLQkJbCwgdCwgciwgYiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQl2ciA9IChsLCB0LCBsK3dpZHRoLTE1LCB0K2hlaWdodC0xNSkKLQkJc2VsZi50ZWQuV0VTZXRWaWV3UmVjdCh2cikKLQkJc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHZyKQotCQlTY3JvbGxlZFdpbmRvdy5kb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdykKLQkJCi0JZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBsb2NhbCwgbW9kaWZpZXJzLCBldnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldnQKLQkJc2VsZi50ZWQuV0VDbGljayhsb2NhbCwgbW9kaWZpZXJzLCB3aGVuKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICBkZWYgZ2V0c2Nyb2xsYmFydmFsdWVzKHNlbGYpOgorICAgICAgICBkciA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICB2ciA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICB2eCA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclswXSwgZHJbMl0sIHZyWzBdLCB2clsyXSkKKyAgICAgICAgdnkgPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMV0sIGRyWzNdLCB2clsxXSwgdnJbM10pCisgICAgICAgIHJldHVybiB2eCwgdnkKIAotCWRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCXNlbGYudGVkLldFS2V5KG9yZChjaCksIG1vZGlmaWVycykKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi50ZWQuV0VHZXRNb2RDb3VudCgpOgotCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJc2VsZi5tZW51X3NhdmUoKQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6Ci0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlkZWwgc2VsZi50ZWQKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQkKLQlkZWYgbWVudV9zYXZlKHNlbGYpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJc2VsZi5tZW51X3NhdmVfYXMoKQotCQkJcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5Ci0JCSMKLQkJIyBGaXJzdCBzYXZlIGRhdGEKLQkJIwotCQlkaGFuZGxlID0gc2VsZi50ZWQuV0VHZXRUZXh0KCkKLQkJZGF0YSA9IGRoYW5kbGUuZGF0YQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKLQkJZnAud3JpdGUoZGF0YSkKLQkJaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKLQkJZnAuY2xvc2UoKQotCQkjCi0JCSMgTm93IHNhdmUgc3R5bGUgYW5kIHNvdXAKLQkJIwotCQlvbGRyZXNmaWxlID0gUmVzLkN1clJlc0ZpbGUoKQotCQl0cnk6Ci0JCQlyZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlSZXMuRlNwQ3JlYXRlUmVzRmlsZShzZWxmLnBhdGgsICc/Pz8/JywgJ1RFWFQnLCBtYWNmcy5zbUFsbFNjcmlwdHMpCi0JCQlyZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCXN0eWxlcyA9IFJlcy5SZXNvdXJjZSgnJykKLQkJc291cCA9IFJlcy5SZXNvdXJjZSgnJykKLQkJc2VsZi50ZWQuV0VDb3B5UmFuZ2UoMCwgMHgzZmZmZmZmZiwgTm9uZSwgc3R5bGVzLCBzb3VwKQotCQlzdHlsZXMuQWRkUmVzb3VyY2UoJ3N0eWwnLCAxMjgsICcnKQotCQlzb3VwLkFkZFJlc291cmNlKCdTT1VQJywgMTI4LCAnJykKLQkJUmVzLkNsb3NlUmVzRmlsZShyZikKLQkJUmVzLlVzZVJlc0ZpbGUob2xkcmVzZmlsZSkKLQkJCi0JCXNlbGYudGVkLldFUmVzZXRNb2RDb3VudCgpCi0JCQotCWRlZiBtZW51X3NhdmVfYXMoc2VsZik6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCi0JCWlmIG5vdCBwYXRoOiByZXR1cm4KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCi0JCXNlbGYubWVudV9zYXZlKCkKLQkJCi0JZGVmIG1lbnVfaW5zZXJ0KHNlbGYsIGZwKToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJZGF0YSA9IGZwLnJlYWQoKQotCQlzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfaW5zZXJ0X2h0bWwoc2VsZiwgZnApOgotCQlpbXBvcnQgaHRtbGxpYgotCQlpbXBvcnQgZm9ybWF0dGVyCi0JCWYgPSBmb3JtYXR0ZXIuQWJzdHJhY3RGb3JtYXR0ZXIoc2VsZikKLQkJCi0JCSMgUmVtZW1iZXIgd2hlcmUgd2UgYXJlLCBhbmQgZG9uJ3QgdXBkYXRlCi0JCVFkLlNldEN1cnNvcihXQVRDSCkKLQkJc3RhcnQsIGR1bW15ID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGSW5oaWJpdFJlY2FsLCAxKQorICAgIGRlZiBzY3JvbGxiYXJfY2FsbGJhY2soc2VsZiwgd2hpY2gsIHdoYXQsIHZhbHVlKToKKyAgICAgICAgaWYgd2hpY2ggPT0gJ3knOgorICAgICAgICAgICAgIworICAgICAgICAgICAgIyAibGluZSIgc2l6ZSBpcyBtaW5pbXVtIG9mIHRvcCBhbmQgYm90dG9tIGxpbmUgc2l6ZQorICAgICAgICAgICAgIworICAgICAgICAgICAgdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKKyAgICAgICAgICAgIHRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCisgICAgICAgICAgICB0b3BsaW5laGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCiAKLQkJc2VsZi5odG1sX2luaXQoKQotCQlwID0gTXlIVE1MUGFyc2VyKGYpCi0JCXAuZmVlZChmcC5yZWFkKCkpCi0JCQotCQkjIFJlc3RvcmUgdXBkYXRpbmcsIHJlY2FsYywgc2V0IGZvY3VzCi0JCWR1bW15LCBlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpCi0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDApCi0JCXNlbGYud2lkLkludmFsV2luZG93UmVjdChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkpCisgICAgICAgICAgICBib3RsaW5lcG9zID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdCisgICAgICAgICAgICBib3RsaW5lX29mZiwgZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwgYm90bGluZXBvcy0xKSkKKyAgICAgICAgICAgIGJvdGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUoYm90bGluZV9vZmYpCisgICAgICAgICAgICBib3RsaW5laGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQoYm90bGluZV9udW0sIGJvdGxpbmVfbnVtKzEpCiAKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X2N1dChzZWxmKToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJc2VsZi50ZWQuV0VDdXQoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfY29weShzZWxmKToKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJc2VsZi50ZWQuV0VDb3B5KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X3Bhc3RlKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X2NsZWFyKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRURlbGV0ZSgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICAgICAgaWYgYm90bGluZWhlaWdodCA9PSAwOgorICAgICAgICAgICAgICAgIGJvdGxpbmVoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodChib3RsaW5lX251bS0xLCBib3RsaW5lX251bSkKKyAgICAgICAgICAgIGlmIGJvdGxpbmVoZWlnaHQgPCB0b3BsaW5laGVpZ2h0OgorICAgICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSBib3RsaW5laGVpZ2h0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmVoZWlnaHQgPSB0b3BsaW5laGVpZ2h0CisgICAgICAgICAgICBpZiBsaW5laGVpZ2h0IDw9IDA6CisgICAgICAgICAgICAgICAgbGluZWhlaWdodCA9IDEKKyAgICAgICAgICAgICMKKyAgICAgICAgICAgICMgTm93IGRvIHRoZSBjb21tYW5kLgorICAgICAgICAgICAgIworICAgICAgICAgICAgaWYgd2hhdCA9PSAnc2V0JzoKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodCgwLCAweDNmZmZmZmZmKQorICAgICAgICAgICAgICAgIGN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KKyAgICAgICAgICAgICAgICBkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NworICAgICAgICAgICAgaWYgd2hhdCA9PSAnLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSBsaW5laGVpZ2h0CisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tbGluZWhlaWdodCkKKyAgICAgICAgICAgICAgICBpZiBkZWx0YSA8PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IGxpbmVoZWlnaHQKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtbGluZWhlaWdodAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS1saW5laGVpZ2h0KQorICAgICAgICAgICAgICAgIGlmIGRlbHRhID49IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLWxpbmVoZWlnaHQKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKDAsIGRlbHRhKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgd2hhdCA9PSAnc2V0JzoKKyAgICAgICAgICAgICAgICByZXR1cm4gIyBYWFhYCisgICAgICAgICAgICB2ciA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICAgICAgd2lud2lkdGggPSB2clsyXS12clswXQorICAgICAgICAgICAgaWYgd2hhdCA9PSAnLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSB3aW53aWR0aC8xMAorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICctLSc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSB3aW53aWR0aC8yCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLXdpbndpZHRoLzEwCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC13aW53aWR0aC8yCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbChkZWx0YSwgMCkKKyAgICAgICAgIyBQaW4gdGhlIHNjcm9sbAorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIGlmIHQgPiAwIG9yIGwgPiAwOgorICAgICAgICAgICAgZHggPSBkeSA9IDAKKyAgICAgICAgICAgIGlmIHQgPiAwOiBkeSA9IC10CisgICAgICAgICAgICBpZiBsID4gMDogZHggPSAtbAorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoZHgsIGR5KQorICAgICAgICBlbGlmIGIgPCB2YjoKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKDAsIHZiLWIpCiAKLQlkZWYgbWVudV91bmRvKHNlbGYpOgotCQlzZWxmLnRlZC5XRVVuZG8oKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfc2V0Zm9udChzZWxmLCBmb250KToKLQkJZm9udCA9IEZtLkdldEZOdW0oZm9udCkKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZvbnQsIChmb250LCAwLCAwLCAoMCwwLDApKSkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCi0JZGVmIG1lbnVfbW9kZmFjZShzZWxmLCBmYWNlKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvVG9nZ2xlRmFjZSwgCi0JCQkoMCwgZmFjZSwgMCwgKDAsMCwwKSkpCiAKLQlkZWYgbWVudV9zZXRmYWNlKHNlbGYsIGZhY2UpOgotCQlzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZXxXQVNURWNvbnN0LndlRG9SZXBsYWNlRmFjZSwgCi0JCQkoMCwgZmFjZSwgMCwgKDAsMCwwKSkpCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYudGVkLldFQWN0aXZhdGUoKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgorICAgICAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQogCi0JZGVmIG1lbnVfc2V0c2l6ZShzZWxmLCBzaXplKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb1NpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKLQkJCQkJCQkJCi0JZGVmIG1lbnVfaW5jc2l6ZShzZWxmLCBzaXplKToKLQkJc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0FkZFNpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKKyAgICBkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgorICAgICAgICByZWdpb24gPSB3aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgorICAgICAgICBpZiBRZC5FbXB0eVJnbihyZWdpb24pOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIFFkLkVyYXNlUmduKHJlZ2lvbikKKyAgICAgICAgc2VsZi50ZWQuV0VVcGRhdGUocmVnaW9uKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQogCi0JZGVmIG15c2V0c3R5bGUoc2VsZiwgd2hpY2gsIGhvdyk6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFU2V0U3R5bGUod2hpY2gsIGhvdykKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCQkJCQotCWRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKLQkJc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXJldHVybiBzdGFydCA8IHN0b3AKLQkJCi0JZGVmIGNhbl9wYXN0ZShzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFQ2FuUGFzdGUoKQotCQkKLQlkZWYgY2FuX3VuZG8oc2VsZik6Ci0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCXdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KLQkJaWYgd2hpY2ggPT0gTm9uZTogcmV0dXJuIE5vbmUKLQkJaWYgcmVkbzoKLQkJCXJldHVybiAiUmVkbyAiK3doaWNoCi0JCWVsc2U6Ci0JCQlyZXR1cm4gIlVuZG8gIit3aGljaAotCQkJCi0JZGVmIGdldHJ1bmluZm8oc2VsZik6Ci0JCWFsbCA9IChXQVNURWNvbnN0LndlRG9Gb250IHwgV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb1NpemUpCi0JCWR1bW15LCBtb2RlLCAoZm9udCwgZmFjZSwgc2l6ZSwgY29sb3IpID0gc2VsZi50ZWQuV0VDb250aW51b3VzU3R5bGUoYWxsKQotCQlpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9Gb250KToKLQkJCWZvbnQgPSBOb25lCi0JCWVsc2U6Ci0JCQlmb250ID0gRm0uR2V0Rm9udE5hbWUoZm9udCkKLQkJaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvRmFjZSk6IGZhY3QgPSBOb25lCi0JCWlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb1NpemUpOiBzaXplID0gTm9uZQotCQlyZXR1cm4gZm9udCwgZmFjZSwgc2l6ZQotCQkKLQkjCi0JIyBNZXRob2RzIGZvciB3cml0ZXIgY2xhc3MgZm9yIGh0bWwgZm9ybWF0dGVyCi0JIwotCQotCWRlZiBodG1sX2luaXQoc2VsZik6Ci0JCXNlbGYuaHRtbF9mb250ID0gWzEyLCAwLCAwLCAwXQotCQlzZWxmLmh0bWxfc3R5bGUgPSAwCi0JCXNlbGYuaHRtbF9jb2xvciA9ICgwLDAsMCkKLQkJc2VsZi5uZXdfZm9udChzZWxmLmh0bWxfZm9udCkKLQkKLQlkZWYgbmV3X2ZvbnQoc2VsZiwgZm9udCk6Ci0JCWlmIGZvbnQgPT0gTm9uZToKLQkJCWZvbnQgPSAoMTIsIDAsIDAsIDApCi0JCWZvbnQgPSBtYXAobGFtYmRhIHg6eCwgZm9udCkKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGZvbnQpKToKLQkJCWlmIGZvbnRbaV0gPT0gTm9uZToKLQkJCQlmb250W2ldID0gc2VsZi5odG1sX2ZvbnRbaV0KLQkJW3NpemUsIGl0YWxpYywgYm9sZCwgdHRdID0gZm9udAotCQlzZWxmLmh0bWxfZm9udCA9IGZvbnRbOl0KLQkJaWYgdHQ6Ci0JCQlmb250ID0gRm0uR2V0Rk51bSgnQ291cmllcicpCi0JCWVsc2U6Ci0JCQlmb250ID0gRm0uR2V0Rk51bSgnVGltZXMnKQotCQlpZiBIVE1MX1NJWkUuaGFzX2tleShzaXplKToKLQkJCXNpemUgPSBIVE1MX1NJWkVbc2l6ZV0KLQkJZWxzZToKLQkJCXNpemUgPSAxMgotCQlmYWNlID0gMAotCQlpZiBib2xkOiBmYWNlID0gZmFjZSB8IDEKLQkJaWYgaXRhbGljOiBmYWNlID0gZmFjZSB8IDIKLQkJZmFjZSA9IGZhY2UgfCBzZWxmLmh0bWxfc3R5bGUKLQkJc2VsZi50ZWQuV0VTZXRTdHlsZShXQVNURWNvbnN0LndlRG9Gb250IHwgV0FTVEVjb25zdC53ZURvRmFjZSB8IAotCQkJCVdBU1RFY29uc3Qud2VEb1NpemUgfCBXQVNURWNvbnN0LndlRG9Db2xvciwKLQkJCQkoZm9udCwgZmFjZSwgc2l6ZSwgc2VsZi5odG1sX2NvbG9yKSkKLQkJCi0JZGVmIG5ld19tYXJnaW4oc2VsZiwgbWFyZ2luLCBsZXZlbCk6Ci0JCXNlbGYudGVkLldFSW5zZXJ0KCdbTWFyZ2luICVzICVzXSclKG1hcmdpbiwgbGV2ZWwpLCBOb25lLCBOb25lKQotCQkKLQlkZWYgbmV3X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6Ci0JCXNlbGYudGVkLldFSW5zZXJ0KCdbc3BhY2luZyAlc10nJXNwYWNpbmcsIE5vbmUsIE5vbmUpCi0JCQkKLQlkZWYgbmV3X3N0eWxlcyhzZWxmLCBzdHlsZXMpOgotCQlzZWxmLmh0bWxfc3R5bGUgPSAwCi0JCXNlbGYuaHRtbF9jb2xvciA9ICgwLDAsMCkKLQkJaWYgJ2FuY2hvcicgaW4gc3R5bGVzOgotCQkJc2VsZi5odG1sX3N0eWxlID0gc2VsZi5odG1sX3N0eWxlIHwgNAotCQkJc2VsZi5odG1sX2NvbG9yID0gKDB4ZmZmZiwgMCwgMCkKLQkJc2VsZi5uZXdfZm9udChzZWxmLmh0bWxfZm9udCkKKyAgICBkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQorICAgICAgICBzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQorICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCisgICAgICAgIFNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQogCi0JZGVmIHNlbmRfcGFyYWdyYXBoKHNlbGYsIGJsYW5rbGluZSk6Ci0JCXNlbGYudGVkLldFSW5zZXJ0KCdccicqKGJsYW5rbGluZSsxKSwgTm9uZSwgTm9uZSkKLQkJCi0JZGVmIHNlbmRfbGluZV9icmVhayhzZWxmKToKLQkJc2VsZi50ZWQuV0VJbnNlcnQoJ1xyJywgTm9uZSwgTm9uZSkKLQkJCi0JZGVmIHNlbmRfaG9yX3J1bGUoc2VsZiwgKmFyZ3MsICoqa3cpOgotCQkjIElnbm9yZSBydWxlciBvcHRpb25zLCBmb3Igbm93Ci0JCWR1bW15ZGF0YSA9IFJlcy5SZXNvdXJjZSgnJykKLQkJc2VsZi50ZWQuV0VJbnNlcnRPYmplY3QoJ3J1bHInLCBkdW1teWRhdGEsICgwLDApKQotCQkKLQlkZWYgc2VuZF9sYWJlbF9kYXRhKHNlbGYsIGRhdGEpOgotCQlzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQotCQkKLQlkZWYgc2VuZF9mbG93aW5nX2RhdGEoc2VsZiwgZGF0YSk6Ci0JCXNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIE5vbmUsIE5vbmUpCi0JCQotCWRlZiBzZW5kX2xpdGVyYWxfZGF0YShzZWxmLCBkYXRhKToKLQkJZGF0YSA9IHN0cmluZy5yZXBsYWNlKGRhdGEsICdcbicsICdccicpCi0JCWRhdGEgPSBzdHJpbmcuZXhwYW5kdGFicyhkYXRhKQotCQlzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQotCQkKKyAgICBkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAorICAgICAgICBzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2gsIGV2ZW50KToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKGNoKSwgbW9kaWZpZXJzKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VHZXRNb2RDb3VudCgpOgorICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQorICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBkZWwgc2VsZi50ZWQKKyAgICAgICAgc2VsZi5kb19wb3N0Y2xvc2UoKQorCisgICAgZGVmIG1lbnVfc2F2ZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYucGF0aDoKKyAgICAgICAgICAgIHNlbGYubWVudV9zYXZlX2FzKCkKKyAgICAgICAgICAgIHJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQorICAgICAgICAjCisgICAgICAgICMgRmlyc3Qgc2F2ZSBkYXRhCisgICAgICAgICMKKyAgICAgICAgZGhhbmRsZSA9IHNlbGYudGVkLldFR2V0VGV4dCgpCisgICAgICAgIGRhdGEgPSBkaGFuZGxlLmRhdGEKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCisgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgIGlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgIworICAgICAgICAjIE5vdyBzYXZlIHN0eWxlIGFuZCBzb3VwCisgICAgICAgICMKKyAgICAgICAgb2xkcmVzZmlsZSA9IFJlcy5DdXJSZXNGaWxlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgUmVzLkZTcENyZWF0ZVJlc0ZpbGUoc2VsZi5wYXRoLCAnPz8/PycsICdURVhUJywgbWFjZnMuc21BbGxTY3JpcHRzKQorICAgICAgICAgICAgcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQorICAgICAgICBzdHlsZXMgPSBSZXMuUmVzb3VyY2UoJycpCisgICAgICAgIHNvdXAgPSBSZXMuUmVzb3VyY2UoJycpCisgICAgICAgIHNlbGYudGVkLldFQ29weVJhbmdlKDAsIDB4M2ZmZmZmZmYsIE5vbmUsIHN0eWxlcywgc291cCkKKyAgICAgICAgc3R5bGVzLkFkZFJlc291cmNlKCdzdHlsJywgMTI4LCAnJykKKyAgICAgICAgc291cC5BZGRSZXNvdXJjZSgnU09VUCcsIDEyOCwgJycpCisgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmYpCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG9sZHJlc2ZpbGUpCisKKyAgICAgICAgc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKKworICAgIGRlZiBtZW51X3NhdmVfYXMoc2VsZik6CisgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCisgICAgICAgIGlmIG5vdCBwYXRoOiByZXR1cm4KKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCisgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCisgICAgICAgIHNlbGYubWVudV9zYXZlKCkKKworICAgIGRlZiBtZW51X2luc2VydChzZWxmLCBmcCk6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgTm9uZSwgTm9uZSkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9pbnNlcnRfaHRtbChzZWxmLCBmcCk6CisgICAgICAgIGltcG9ydCBodG1sbGliCisgICAgICAgIGltcG9ydCBmb3JtYXR0ZXIKKyAgICAgICAgZiA9IGZvcm1hdHRlci5BYnN0cmFjdEZvcm1hdHRlcihzZWxmKQorCisgICAgICAgICMgUmVtZW1iZXIgd2hlcmUgd2UgYXJlLCBhbmQgZG9uJ3QgdXBkYXRlCisgICAgICAgIFFkLlNldEN1cnNvcihXQVRDSCkKKyAgICAgICAgc3RhcnQsIGR1bW15ID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGSW5oaWJpdFJlY2FsLCAxKQorCisgICAgICAgIHNlbGYuaHRtbF9pbml0KCkKKyAgICAgICAgcCA9IE15SFRNTFBhcnNlcihmKQorICAgICAgICBwLmZlZWQoZnAucmVhZCgpKQorCisgICAgICAgICMgUmVzdG9yZSB1cGRhdGluZywgcmVjYWxjLCBzZXQgZm9jdXMKKyAgICAgICAgZHVtbXksIGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc3RhcnQsIGVuZCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkluaGliaXRSZWNhbCwgMCkKKyAgICAgICAgc2VsZi53aWQuSW52YWxXaW5kb3dSZWN0KHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKSkKKworICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2N1dChzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgorICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgc2VsZi50ZWQuV0VDdXQoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2NvcHkoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ29weSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfcGFzdGUoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFUGFzdGUoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRURlbGV0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfdW5kbyhzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VVbmRvKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9zZXRmb250KHNlbGYsIGZvbnQpOgorICAgICAgICBmb250ID0gRm0uR2V0Rk51bShmb250KQorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRm9udCwgKGZvbnQsIDAsIDAsICgwLDAsMCkpKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X21vZGZhY2Uoc2VsZiwgZmFjZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1RvZ2dsZUZhY2UsCisgICAgICAgICAgICAgICAgKDAsIGZhY2UsIDAsICgwLDAsMCkpKQorCisgICAgZGVmIG1lbnVfc2V0ZmFjZShzZWxmLCBmYWNlKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2V8V0FTVEVjb25zdC53ZURvUmVwbGFjZUZhY2UsCisgICAgICAgICAgICAgICAgKDAsIGZhY2UsIDAsICgwLDAsMCkpKQorCisgICAgZGVmIG1lbnVfc2V0c2l6ZShzZWxmLCBzaXplKToKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb1NpemUsICgwLCAwLCBzaXplLCAoMCwwLDApKSkKKworICAgIGRlZiBtZW51X2luY3NpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9BZGRTaXplLCAoMCwgMCwgc2l6ZSwgKDAsMCwwKSkpCisKKyAgICBkZWYgbXlzZXRzdHlsZShzZWxmLCB3aGljaCwgaG93KToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTdHlsZSh3aGljaCwgaG93KQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHJldHVybiBzdGFydCA8IHN0b3AKKworICAgIGRlZiBjYW5fcGFzdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlZC5XRUNhblBhc3RlKCkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmKToKKyAgICAgICAgd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKKyAgICAgICAgd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQorICAgICAgICBpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQorICAgICAgICBpZiByZWRvOgorICAgICAgICAgICAgcmV0dXJuICJSZWRvICIrd2hpY2gKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiVW5kbyAiK3doaWNoCisKKyAgICBkZWYgZ2V0cnVuaW5mbyhzZWxmKToKKyAgICAgICAgYWxsID0gKFdBU1RFY29uc3Qud2VEb0ZvbnQgfCBXQVNURWNvbnN0LndlRG9GYWNlIHwgV0FTVEVjb25zdC53ZURvU2l6ZSkKKyAgICAgICAgZHVtbXksIG1vZGUsIChmb250LCBmYWNlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUNvbnRpbnVvdXNTdHlsZShhbGwpCisgICAgICAgIGlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb0ZvbnQpOgorICAgICAgICAgICAgZm9udCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQorICAgICAgICBpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9GYWNlKTogZmFjdCA9IE5vbmUKKyAgICAgICAgaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvU2l6ZSk6IHNpemUgPSBOb25lCisgICAgICAgIHJldHVybiBmb250LCBmYWNlLCBzaXplCisKKyAgICAjCisgICAgIyBNZXRob2RzIGZvciB3cml0ZXIgY2xhc3MgZm9yIGh0bWwgZm9ybWF0dGVyCisgICAgIworCisgICAgZGVmIGh0bWxfaW5pdChzZWxmKToKKyAgICAgICAgc2VsZi5odG1sX2ZvbnQgPSBbMTIsIDAsIDAsIDBdCisgICAgICAgIHNlbGYuaHRtbF9zdHlsZSA9IDAKKyAgICAgICAgc2VsZi5odG1sX2NvbG9yID0gKDAsMCwwKQorICAgICAgICBzZWxmLm5ld19mb250KHNlbGYuaHRtbF9mb250KQorCisgICAgZGVmIG5ld19mb250KHNlbGYsIGZvbnQpOgorICAgICAgICBpZiBmb250ID09IE5vbmU6CisgICAgICAgICAgICBmb250ID0gKDEyLCAwLCAwLCAwKQorICAgICAgICBmb250ID0gbWFwKGxhbWJkYSB4OngsIGZvbnQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihmb250KSk6CisgICAgICAgICAgICBpZiBmb250W2ldID09IE5vbmU6CisgICAgICAgICAgICAgICAgZm9udFtpXSA9IHNlbGYuaHRtbF9mb250W2ldCisgICAgICAgIFtzaXplLCBpdGFsaWMsIGJvbGQsIHR0XSA9IGZvbnQKKyAgICAgICAgc2VsZi5odG1sX2ZvbnQgPSBmb250WzpdCisgICAgICAgIGlmIHR0OgorICAgICAgICAgICAgZm9udCA9IEZtLkdldEZOdW0oJ0NvdXJpZXInKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9udCA9IEZtLkdldEZOdW0oJ1RpbWVzJykKKyAgICAgICAgaWYgSFRNTF9TSVpFLmhhc19rZXkoc2l6ZSk6CisgICAgICAgICAgICBzaXplID0gSFRNTF9TSVpFW3NpemVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzaXplID0gMTIKKyAgICAgICAgZmFjZSA9IDAKKyAgICAgICAgaWYgYm9sZDogZmFjZSA9IGZhY2UgfCAxCisgICAgICAgIGlmIGl0YWxpYzogZmFjZSA9IGZhY2UgfCAyCisgICAgICAgIGZhY2UgPSBmYWNlIHwgc2VsZi5odG1sX3N0eWxlCisgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRm9udCB8IFdBU1RFY29uc3Qud2VEb0ZhY2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvU2l6ZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKGZvbnQsIGZhY2UsIHNpemUsIHNlbGYuaHRtbF9jb2xvcikpCisKKyAgICBkZWYgbmV3X21hcmdpbihzZWxmLCBtYXJnaW4sIGxldmVsKToKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoJ1tNYXJnaW4gJXMgJXNdJyUobWFyZ2luLCBsZXZlbCksIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgbmV3X3NwYWNpbmcoc2VsZiwgc3BhY2luZyk6CisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KCdbc3BhY2luZyAlc10nJXNwYWNpbmcsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgbmV3X3N0eWxlcyhzZWxmLCBzdHlsZXMpOgorICAgICAgICBzZWxmLmh0bWxfc3R5bGUgPSAwCisgICAgICAgIHNlbGYuaHRtbF9jb2xvciA9ICgwLDAsMCkKKyAgICAgICAgaWYgJ2FuY2hvcicgaW4gc3R5bGVzOgorICAgICAgICAgICAgc2VsZi5odG1sX3N0eWxlID0gc2VsZi5odG1sX3N0eWxlIHwgNAorICAgICAgICAgICAgc2VsZi5odG1sX2NvbG9yID0gKDB4ZmZmZiwgMCwgMCkKKyAgICAgICAgc2VsZi5uZXdfZm9udChzZWxmLmh0bWxfZm9udCkKKworICAgIGRlZiBzZW5kX3BhcmFncmFwaChzZWxmLCBibGFua2xpbmUpOgorICAgICAgICBzZWxmLnRlZC5XRUluc2VydCgnXHInKihibGFua2xpbmUrMSksIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgc2VuZF9saW5lX2JyZWFrKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRUluc2VydCgnXHInLCBOb25lLCBOb25lKQorCisgICAgZGVmIHNlbmRfaG9yX3J1bGUoc2VsZiwgKmFyZ3MsICoqa3cpOgorICAgICAgICAjIElnbm9yZSBydWxlciBvcHRpb25zLCBmb3Igbm93CisgICAgICAgIGR1bW15ZGF0YSA9IFJlcy5SZXNvdXJjZSgnJykKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnRPYmplY3QoJ3J1bHInLCBkdW1teWRhdGEsICgwLDApKQorCisgICAgZGVmIHNlbmRfbGFiZWxfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBzZW5kX2Zsb3dpbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgTm9uZSwgTm9uZSkKKworICAgIGRlZiBzZW5kX2xpdGVyYWxfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgZGF0YSA9IHN0cmluZy5yZXBsYWNlKGRhdGEsICdcbicsICdccicpCisgICAgICAgIGRhdGEgPSBzdHJpbmcuZXhwYW5kdGFicyhkYXRhKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydChkYXRhLCBOb25lLCBOb25lKQorCiBjbGFzcyBXZWQoQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5udW0gPSAwCi0JCXNlbGYuYWN0aXZlID0gTm9uZQotCQlzZWxmLnVwZGF0ZW1lbnViYXIoKQotCQl3YXN0ZS5TVERPYmplY3RIYW5kbGVycygpCi0JCSMgSGFuZGxlciBmb3IgaG9yaXpvbnRhbCBydWxlcgotCQl3YXN0ZS5XRUluc3RhbGxPYmplY3RIYW5kbGVyKCdydWxyJywgJ25ldyAnLCBzZWxmLm5ld1J1bGVyKQotCQl3YXN0ZS5XRUluc3RhbGxPYmplY3RIYW5kbGVyKCdydWxyJywgJ2RyYXcnLCBzZWxmLmRyYXdSdWxlcikKLQkJCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCXNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKLQkJc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQotCQlzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKLQkJc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5pbnNlcnRpdGVtID0gTWVudUl0ZW0obSwgIkluc2VydCBwbGFpbnRleHQuLi4iLCAiIiwgc2VsZi5pbnNlcnRmaWxlKQotCQlzZWxmLmh0bWxpdGVtID0gTWVudUl0ZW0obSwgIkluc2VydCBIVE1MLi4uIiwgIiIsIHNlbGYuaW5zZXJ0aHRtbCkKLQkJbS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKLQkJCi0JCXNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKLQkJc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCi0JCXNlbGYuY3V0aXRlbSA9IE1lbnVJdGVtKG0sICJDdXQiLCAiWCIsIHNlbGYuY3V0KQotCQlzZWxmLmNvcHlpdGVtID0gTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsIHNlbGYuY29weSkKLQkJc2VsZi5wYXN0ZWl0ZW0gPSBNZW51SXRlbShtLCAiUGFzdGUiLCAiViIsIHNlbGYucGFzdGUpCi0JCXNlbGYuY2xlYXJpdGVtID0gTWVudUl0ZW0obSwgIkNsZWFyIiwgIiIsIHNlbGYuY2xlYXIpCi0JCQotCQlzZWxmLm1ha2Vmb250bWVudSgpCi0JCQotCQkjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgotCQlzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sCi0JCQlzZWxmLmVkaXRtZW51LCBzZWxmLmZvbnRtZW51LCBzZWxmLmZhY2VtZW51LCBzZWxmLnNpemVtZW51LAotCQkJc2VsZi5pbnNlcnRpdGVtXQotCQlzZWxmLmZvY3VzZ3JvdXAgPSBbc2VsZi5jdXRpdGVtLCBzZWxmLmNvcHlpdGVtLCBzZWxmLmNsZWFyaXRlbV0KLQkJc2VsZi53aW5kb3dncm91cF9vbiA9IC0xCi0JCXNlbGYuZm9jdXNncm91cF9vbiA9IC0xCi0JCXNlbGYucGFzdGVncm91cF9vbiA9IC0xCi0JCXNlbGYudW5kb19sYWJlbCA9ICJuZXZlciIKLQkJc2VsZi5mZnNfdmFsdWVzID0gKCkKLQkJCi0JZGVmIG1ha2Vmb250bWVudShzZWxmKToKLQkJc2VsZi5mb250bWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRm9udCIpCi0JCXNlbGYuZm9udG5hbWVzID0gZ2V0Zm9udG5hbWVzKCkKLQkJc2VsZi5mb250aXRlbXMgPSBbXQotCQlmb3IgbiBpbiBzZWxmLmZvbnRuYW1lczoKLQkJCW0gPSBNZW51SXRlbShzZWxmLmZvbnRtZW51LCBuLCAiIiwgc2VsZi5zZWxmb250KQotCQkJc2VsZi5mb250aXRlbXMuYXBwZW5kKG0pCi0JCXNlbGYuZmFjZW1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIlN0eWxlIikKLQkJc2VsZi5mYWNlaXRlbXMgPSBbXQotCQlmb3Igbiwgc2hvcnRjdXQgaW4gU1RZTEVTOgotCQkJbSA9IE1lbnVJdGVtKHNlbGYuZmFjZW1lbnUsIG4sIHNob3J0Y3V0LCBzZWxmLnNlbGZhY2UpCi0JCQlzZWxmLmZhY2VpdGVtcy5hcHBlbmQobSkKLQkJc2VsZi5mYWNlbWVudS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLmZhY2VpdGVtX25vcm1hbCA9IE1lbnVJdGVtKHNlbGYuZmFjZW1lbnUsICJOb3JtYWwiLCAiTiIsIAotCQkJc2VsZi5zZWxmYWNlbm9ybWFsKQotCQlzZWxmLnNpemVtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJTaXplIikKLQkJc2VsZi5zaXplaXRlbXMgPSBbXQotCQlmb3IgbiBpbiBTSVpFUzoKLQkJCW0gPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCByZXByKG4pLCAiIiwgc2VsZi5zZWxzaXplKQotCQkJc2VsZi5zaXplaXRlbXMuYXBwZW5kKG0pCi0JCXNlbGYuc2l6ZW1lbnUuYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5zaXplaXRlbV9iaWdnZXIgPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCAiQmlnZ2VyIiwgIisiLCAKLQkJCXNlbGYuc2Vsc2l6ZWJpZ2dlcikKLQkJc2VsZi5zaXplaXRlbV9zbWFsbGVyID0gTWVudUl0ZW0oc2VsZi5zaXplbWVudSwgIlNtYWxsZXIiLCAiLSIsIAotCQkJc2VsZi5zZWxzaXplc21hbGxlcikKLQkJCQkJCi0JZGVmIHNlbGZvbnQoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlmb250ID0gc2VsZi5mb250bmFtZXNbaXRlbS0xXQotCQkJc2VsZi5hY3RpdmUubWVudV9zZXRmb250KGZvbnQpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLm51bSA9IDAKKyAgICAgICAgc2VsZi5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYudXBkYXRlbWVudWJhcigpCisgICAgICAgIHdhc3RlLlNURE9iamVjdEhhbmRsZXJzKCkKKyAgICAgICAgIyBIYW5kbGVyIGZvciBob3Jpem9udGFsIHJ1bGVyCisgICAgICAgIHdhc3RlLldFSW5zdGFsbE9iamVjdEhhbmRsZXIoJ3J1bHInLCAnbmV3ICcsIHNlbGYubmV3UnVsZXIpCisgICAgICAgIHdhc3RlLldFSW5zdGFsbE9iamVjdEhhbmRsZXIoJ3J1bHInLCAnZHJhdycsIHNlbGYuZHJhd1J1bGVyKQogCi0JZGVmIHNlbGZhY2Uoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlmYWNlID0gKDE8PChpdGVtLTEpKQotCQkJc2VsZi5hY3RpdmUubWVudV9tb2RmYWNlKGZhY2UpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKKyAgICAgICAgc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQorICAgICAgICBzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKKyAgICAgICAgc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5pbnNlcnRpdGVtID0gTWVudUl0ZW0obSwgIkluc2VydCBwbGFpbnRleHQuLi4iLCAiIiwgc2VsZi5pbnNlcnRmaWxlKQorICAgICAgICBzZWxmLmh0bWxpdGVtID0gTWVudUl0ZW0obSwgIkluc2VydCBIVE1MLi4uIiwgIiIsIHNlbGYuaW5zZXJ0aHRtbCkKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnF1aXRpdGVtID0gTWVudUl0ZW0obSwgIlF1aXQiLCAiUSIsIHNlbGYucXVpdCkKIAotCWRlZiBzZWxmYWNlbm9ybWFsKHNlbGYsICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3NldGZhY2UoMCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICAgICAgc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICBzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKKyAgICAgICAgc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCisgICAgICAgIHNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQorICAgICAgICBzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKKyAgICAgICAgc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKIAotCWRlZiBzZWxzaXplKHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2l6ZSA9IFNJWkVTW2l0ZW0tMV0KLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2V0c2l6ZShzaXplKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICBzZWxmLm1ha2Vmb250bWVudSgpCiAKLQlkZWYgc2Vsc2l6ZWJpZ2dlcihzZWxmLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKDIpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgICMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6CisgICAgICAgIHNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwKKyAgICAgICAgICAgICAgICBzZWxmLmVkaXRtZW51LCBzZWxmLmZvbnRtZW51LCBzZWxmLmZhY2VtZW51LCBzZWxmLnNpemVtZW51LAorICAgICAgICAgICAgICAgIHNlbGYuaW5zZXJ0aXRlbV0KKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCisgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCisgICAgICAgIHNlbGYuZmZzX3ZhbHVlcyA9ICgpCiAKLQlkZWYgc2Vsc2l6ZXNtYWxsZXIoc2VsZiwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfaW5jc2l6ZSgtMikKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgbWFrZWZvbnRtZW51KHNlbGYpOgorICAgICAgICBzZWxmLmZvbnRtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJGb250IikKKyAgICAgICAgc2VsZi5mb250bmFtZXMgPSBnZXRmb250bmFtZXMoKQorICAgICAgICBzZWxmLmZvbnRpdGVtcyA9IFtdCisgICAgICAgIGZvciBuIGluIHNlbGYuZm9udG5hbWVzOgorICAgICAgICAgICAgbSA9IE1lbnVJdGVtKHNlbGYuZm9udG1lbnUsIG4sICIiLCBzZWxmLnNlbGZvbnQpCisgICAgICAgICAgICBzZWxmLmZvbnRpdGVtcy5hcHBlbmQobSkKKyAgICAgICAgc2VsZi5mYWNlbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU3R5bGUiKQorICAgICAgICBzZWxmLmZhY2VpdGVtcyA9IFtdCisgICAgICAgIGZvciBuLCBzaG9ydGN1dCBpbiBTVFlMRVM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgbiwgc2hvcnRjdXQsIHNlbGYuc2VsZmFjZSkKKyAgICAgICAgICAgIHNlbGYuZmFjZWl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLmZhY2VtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuZmFjZWl0ZW1fbm9ybWFsID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgIk5vcm1hbCIsICJOIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGZhY2Vub3JtYWwpCisgICAgICAgIHNlbGYuc2l6ZW1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIlNpemUiKQorICAgICAgICBzZWxmLnNpemVpdGVtcyA9IFtdCisgICAgICAgIGZvciBuIGluIFNJWkVTOgorICAgICAgICAgICAgbSA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsIHJlcHIobiksICIiLCBzZWxmLnNlbHNpemUpCisgICAgICAgICAgICBzZWxmLnNpemVpdGVtcy5hcHBlbmQobSkKKyAgICAgICAgc2VsZi5zaXplbWVudS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNpemVpdGVtX2JpZ2dlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJCaWdnZXIiLCAiKyIsCisgICAgICAgICAgICAgICAgc2VsZi5zZWxzaXplYmlnZ2VyKQorICAgICAgICBzZWxmLnNpemVpdGVtX3NtYWxsZXIgPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCAiU21hbGxlciIsICItIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbHNpemVzbWFsbGVyKQogCi0JZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6Ci0JCWNoYW5nZWQgPSAwCi0JCW9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCi0JCWlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246Ci0JCQlmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgotCQkJCW0uZW5hYmxlKG9uKQotCQkJc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCi0JCQljaGFuZ2VkID0gMQotCQlpZiBvbjoKLQkJCSMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQotCQkJb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCi0JCQlpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246Ci0JCQkJZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgotCQkJCQltLmVuYWJsZShvbikKLQkJCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCi0JCQlpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246Ci0JCQkJc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQotCQkJCXNlbGYucGFzdGVncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQotCQkJaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgotCQkJCWlmIG9uOgotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCi0JCQkJCXNlbGYudW5kb19sYWJlbCA9IG9uCi0JCQkJZWxzZToKLQkJCQkJc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQotCQkJCWNoYW5nZWQgPSAxCi0JCQlpZiBzZWxmLnVwZGF0ZWZvbnRtZW51cygpOgotCQkJCWNoYW5nZWQgPSAxCi0JCWlmIGNoYW5nZWQ6Ci0JCQlEcmF3TWVudUJhcigpCi0JCQkKLQlkZWYgdXBkYXRlZm9udG1lbnVzKHNlbGYpOgotCQlpbmZvID0gc2VsZi5hY3RpdmUuZ2V0cnVuaW5mbygpCi0JCWlmIGluZm8gPT0gc2VsZi5mZnNfdmFsdWVzOgotCQkJcmV0dXJuIDAKLQkJIyBSZW1vdmUgb2xkIGNoZWNrbWFya3MKLQkJaWYgc2VsZi5mZnNfdmFsdWVzID09ICgpOgotCQkJc2VsZi5mZnNfdmFsdWVzID0gKE5vbmUsIE5vbmUsIE5vbmUpCi0JCWZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKLQkJaWYgZm9udCA8PiBOb25lOgotCQkJZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygwKQotCQlpZiBmYWNlIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKLQkJCQlpZiBmYWNlICYgKDE8PGkpOgotCQkJCQlzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygwKQotCQlpZiBzaXplIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKLQkJCQlpZiBTSVpFU1tpXSA9PSBzaXplOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygwKQotCQkJCQotCQlzZWxmLmZmc192YWx1ZXMgPSBpbmZvCi0JCSMgU2V0IG5ldyBjaGVja21hcmtzCi0JCWZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKLQkJaWYgZm9udCA8PiBOb25lOgotCQkJZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygxKQotCQlpZiBmYWNlIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKLQkJCQlpZiBmYWNlICYgKDE8PGkpOgotCQkJCQlzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygxKQotCQlpZiBzaXplIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKLQkJCQlpZiBTSVpFU1tpXSA9PSBzaXplOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygxKQotCQkjIFNldCBvdXRsaW5lL25vcm1hbCBmb3Igc2l6ZXMKLQkJaWYgZm9udDoKLQkJCWV4aXN0cyA9IGdldGZvbnRzaXplcyhmb250LCBTSVpFUykKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIGV4aXN0c1tpXToKLQkJCQkJc2VsZi5zaXplaXRlbXNbaV0uc2V0c3R5bGUoMCkKLQkJCQllbHNlOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSg4KQorICAgIGRlZiBzZWxmb250KHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgZm9udCA9IHNlbGYuZm9udG5hbWVzW2l0ZW0tMV0KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0Zm9udChmb250KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JIwotCSMgQXBwbGUgbWVudQotCSMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBXQVNURSIpCi0JCQkKLQkjCi0JIyBGaWxlIG1lbnUKLQkjCisgICAgZGVmIHNlbGZhY2Uoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBmYWNlID0gKDE8PChpdGVtLTEpKQorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9tb2RmYWNlKGZhY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQlkZWYgb3BlbihzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMCkKLQkJCi0JZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigxKQorICAgIGRlZiBzZWxmYWNlbm9ybWFsKHNlbGYsICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NldGZhY2UoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKLQkJaWYgYXNrZmlsZToKLQkJCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCi0JCQlpZiBub3QgcGF0aDoKLQkJCQlyZXR1cm4KLQkJCW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQotCQkJdHJ5OgotCQkJCWZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCi0JCQkJZGF0YSA9IGZwLnJlYWQoKQotCQkJCWZwLmNsb3NlKCkKLQkJCWV4Y2VwdCBJT0Vycm9yLCBhcmc6Ci0JCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQotCQkJCXJldHVybgotCQllbHNlOgotCQkJcGF0aCA9IE5vbmUKLQkJCW5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCi0JCQlkYXRhID0gJycKLQkJdyA9IFdhc3RlV2luZG93KHNlbGYpCi0JCXcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQotCQlzZWxmLm51bSA9IHNlbGYubnVtICsgMQorICAgIGRlZiBzZWxzaXplKHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2l6ZSA9IFNJWkVTW2l0ZW0tMV0KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0c2l6ZShzaXplKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JZGVmIGluc2VydGZpbGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCi0JCQlpZiBub3QgcGF0aDoKLQkJCQlyZXR1cm4KLQkJCXRyeToKLQkJCQlmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJncywpKQotCQkJCXJldHVybgotCQkJc2VsZi5hY3RpdmUubWVudV9pbnNlcnQoZnApCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIHNlbHNpemViaWdnZXIoc2VsZiwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfaW5jc2l6ZSgyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JZGVmIGluc2VydGh0bWwoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCi0JCQlpZiBub3QgcGF0aDoKLQkJCQlyZXR1cm4KLQkJCXRyeToKLQkJCQlmcCA9IG9wZW4ocGF0aCwgJ3InKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCQlzZWxmLmFjdGl2ZS5tZW51X2luc2VydF9odG1sKGZwKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiBzZWxzaXplc21hbGxlcihzZWxmLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKC0yKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JCQotCWRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuY2xvc2UoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCQotCQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCWZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl3LmNsb3NlKCkKLQkJaWYgc2VsZi5fd2luZG93czoKLQkJCXJldHVybgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JIwotCSMgRWRpdCBtZW51Ci0JIwotCQotCWRlZiB1bmRvKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3VuZG8oKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY3V0KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjb3B5KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgIGRlZiB1cGRhdGVtZW51YmFyKHNlbGYpOgorICAgICAgICBjaGFuZ2VkID0gMAorICAgICAgICBvbiA9IChzZWxmLmFjdGl2ZSA8PiBOb25lKQorICAgICAgICBpZiBvbiA8PiBzZWxmLndpbmRvd2dyb3VwX29uOgorICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi53aW5kb3dncm91cDoKKyAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSBvbgorICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgb246CisgICAgICAgICAgICAjIG9ubHkgaWYgd2UgaGF2ZSBhbiBlZGl0IG1lbnUKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuaGF2ZV9zZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5mb2N1c2dyb3VwX29uOgorICAgICAgICAgICAgICAgIGZvciBtIGluIHNlbGYuZm9jdXNncm91cDoKKyAgICAgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5jYW5fcGFzdGUoKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5wYXN0ZWdyb3VwX29uOgorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVpdGVtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl91bmRvKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYudW5kb19sYWJlbDoKKyAgICAgICAgICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KG9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSBvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byB1bmRvIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgaWYgc2VsZi51cGRhdGVmb250bWVudXMoKToKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgRHJhd01lbnVCYXIoKQogCi0JZGVmIGNsZWFyKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JIwotCSMgT3RoZXIgc3R1ZmYKLQkjCQorICAgIGRlZiB1cGRhdGVmb250bWVudXMoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLmFjdGl2ZS5nZXRydW5pbmZvKCkKKyAgICAgICAgaWYgaW5mbyA9PSBzZWxmLmZmc192YWx1ZXM6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAjIFJlbW92ZSBvbGQgY2hlY2ttYXJrcworICAgICAgICBpZiBzZWxmLmZmc192YWx1ZXMgPT0gKCk6CisgICAgICAgICAgICBzZWxmLmZmc192YWx1ZXMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcworICAgICAgICBpZiBmb250IDw+IE5vbmU6CisgICAgICAgICAgICBmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKKyAgICAgICAgICAgIHNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDApCisgICAgICAgIGlmIGZhY2UgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIGZhY2UgJiAoMTw8aSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDApCisgICAgICAgIGlmIHNpemUgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIFNJWkVTW2ldID09IHNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDApCiAKLQlkZWYgaWRsZShzZWxmLCBldmVudCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKLQkJZWxzZToKLQkJCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQotCQkJCi0JZGVmIG5ld1J1bGVyKHNlbGYsIG9iaik6Ci0JCSIiIkluc2VydCBhIG5ldyBydWxlci4gTWFrZSBpdCBhcyB3aWRlIGFzIHRoZSB3aW5kb3cgbWludXMgMiBweGxzIiIiCi0JCXRlZCA9IG9iai5XRUdldE9iamVjdE93bmVyKCkKLQkJbCwgdCwgciwgYiA9IHRlZC5XRUdldERlc3RSZWN0KCkKLQkJcmV0dXJuIHItbCwgNAotCQkKLQlkZWYgZHJhd1J1bGVyKHNlbGYsIChsLCB0LCByLCBiKSwgb2JqKToKLQkJeSA9ICh0K2IpLzIKLQkJUWQuTW92ZVRvKGwrMiwgeSkKLQkJUWQuTGluZVRvKHItMiwgeSkKLQkJcmV0dXJuIDAKLQkJCQorICAgICAgICBzZWxmLmZmc192YWx1ZXMgPSBpbmZvCisgICAgICAgICMgU2V0IG5ldyBjaGVja21hcmtzCisgICAgICAgIGZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKKyAgICAgICAgaWYgZm9udCA8PiBOb25lOgorICAgICAgICAgICAgZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCisgICAgICAgICAgICBzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygxKQorICAgICAgICBpZiBmYWNlIDw+IE5vbmU6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKKyAgICAgICAgICAgICAgICBpZiBmYWNlICYgKDE8PGkpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygxKQorICAgICAgICBpZiBzaXplIDw+IE5vbmU6CisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKKyAgICAgICAgICAgICAgICBpZiBTSVpFU1tpXSA9PSBzaXplOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygxKQorICAgICAgICAjIFNldCBvdXRsaW5lL25vcm1hbCBmb3Igc2l6ZXMKKyAgICAgICAgaWYgZm9udDoKKyAgICAgICAgICAgIGV4aXN0cyA9IGdldGZvbnRzaXplcyhmb250LCBTSVpFUykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIGV4aXN0c1tpXToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uc2V0c3R5bGUoMCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSg4KQorCisgICAgIworICAgICMgQXBwbGUgbWVudQorICAgICMKKworICAgIGRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIkEgc2ltcGxlIHNpbmdsZS1mb250IHRleHQgZWRpdG9yIGJhc2VkIG9uIFdBU1RFIikKKworICAgICMKKyAgICAjIEZpbGUgbWVudQorICAgICMKKworICAgIGRlZiBvcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigwKQorCisgICAgZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5fb3BlbigxKQorCisgICAgZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgorICAgICAgICBpZiBhc2tmaWxlOgorICAgICAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKKyAgICAgICAgICAgICAgICBkYXRhID0gZnAucmVhZCgpCisgICAgICAgICAgICAgICAgZnAuY2xvc2UoKQorICAgICAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwYXRoID0gTm9uZQorICAgICAgICAgICAgbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KKyAgICAgICAgICAgIGRhdGEgPSAnJworICAgICAgICB3ID0gV2FzdGVXaW5kb3coc2VsZikKKyAgICAgICAgdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCisgICAgICAgIHNlbGYubnVtID0gc2VsZi5udW0gKyAxCisKKyAgICBkZWYgaW5zZXJ0ZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKKyAgICAgICAgICAgIGlmIG5vdCBwYXRoOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnOgorICAgICAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmdzLCkpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2luc2VydChmcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBpbnNlcnRodG1sKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQorICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnAgPSBvcGVuKHBhdGgsICdyJykKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9pbnNlcnRfaHRtbChmcCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworCisgICAgZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHcuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgIworICAgICMgRWRpdCBtZW51CisgICAgIworCisgICAgZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY29weShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBwYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgIworICAgICMgT3RoZXIgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgaWRsZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQorCisgICAgZGVmIG5ld1J1bGVyKHNlbGYsIG9iaik6CisgICAgICAgICIiIkluc2VydCBhIG5ldyBydWxlci4gTWFrZSBpdCBhcyB3aWRlIGFzIHRoZSB3aW5kb3cgbWludXMgMiBweGxzIiIiCisgICAgICAgIHRlZCA9IG9iai5XRUdldE9iamVjdE93bmVyKCkKKyAgICAgICAgbCwgdCwgciwgYiA9IHRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgcmV0dXJuIHItbCwgNAorCisgICAgZGVmIGRyYXdSdWxlcihzZWxmLCAobCwgdCwgciwgYiksIG9iaik6CisgICAgICAgIHkgPSAodCtiKS8yCisgICAgICAgIFFkLk1vdmVUbyhsKzIsIHkpCisgICAgICAgIFFkLkxpbmVUbyhyLTIsIHkpCisgICAgICAgIHJldHVybiAwCisKIGNsYXNzIE15SFRNTFBhcnNlcihodG1sbGliLkhUTUxQYXJzZXIpOgotCQorCiAgICAgZGVmIGFuY2hvcl9iZ24oc2VsZiwgaHJlZiwgbmFtZSwgdHlwZSk6Ci0JICAgIHNlbGYuYW5jaG9yID0gaHJlZgotCSAgICBpZiBzZWxmLmFuY2hvcjoKLQkJICAgIHNlbGYuYW5jaG9ybGlzdC5hcHBlbmQoaHJlZikKLQkJICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfc3R5bGUoJ2FuY2hvcicpCisgICAgICAgIHNlbGYuYW5jaG9yID0gaHJlZgorICAgICAgICBpZiBzZWxmLmFuY2hvcjoKKyAgICAgICAgICAgIHNlbGYuYW5jaG9ybGlzdC5hcHBlbmQoaHJlZikKKyAgICAgICAgICAgIHNlbGYuZm9ybWF0dGVyLnB1c2hfc3R5bGUoJ2FuY2hvcicpCiAKICAgICBkZWYgYW5jaG9yX2VuZChzZWxmKToKLQkgICAgaWYgc2VsZi5hbmNob3I6Ci0JCSAgICBzZWxmLmFuY2hvciA9IE5vbmUKLQkJICAgIHNlbGYuZm9ybWF0dGVyLnBvcF9zdHlsZSgpCisgICAgICAgIGlmIHNlbGYuYW5jaG9yOgorICAgICAgICAgICAgc2VsZi5hbmNob3IgPSBOb25lCisgICAgICAgICAgICBzZWxmLmZvcm1hdHRlci5wb3Bfc3R5bGUoKQogCi0JCQkKKwogZGVmIGdldGZvbnRuYW1lcygpOgotCW5hbWVzID0gW10KLQlmb3IgaSBpbiByYW5nZSgyNTYpOgotCQluID0gRm0uR2V0Rm9udE5hbWUoaSkKLQkJaWYgbjogbmFtZXMuYXBwZW5kKG4pCi0JcmV0dXJuIG5hbWVzCi0JCisgICAgbmFtZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDI1Nik6CisgICAgICAgIG4gPSBGbS5HZXRGb250TmFtZShpKQorICAgICAgICBpZiBuOiBuYW1lcy5hcHBlbmQobikKKyAgICByZXR1cm4gbmFtZXMKKwogZGVmIGdldGZvbnRzaXplcyhuYW1lLCBzaXplcyk6Ci0JZXhpc3QgPSBbXQotCW51bSA9IEZtLkdldEZOdW0obmFtZSkKLQlmb3Igc3ogaW4gc2l6ZXM6Ci0JCWlmIEZtLlJlYWxGb250KG51bSwgc3opOgotCQkJZXhpc3QuYXBwZW5kKDEpCi0JCWVsc2U6Ci0JCQlleGlzdC5hcHBlbmQoMCkKLQlyZXR1cm4gZXhpc3QKKyAgICBleGlzdCA9IFtdCisgICAgbnVtID0gRm0uR2V0Rk51bShuYW1lKQorICAgIGZvciBzeiBpbiBzaXplczoKKyAgICAgICAgaWYgRm0uUmVhbEZvbnQobnVtLCBzeik6CisgICAgICAgICAgICBleGlzdC5hcHBlbmQoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGV4aXN0LmFwcGVuZCgwKQorICAgIHJldHVybiBleGlzdAogCiBkZWYgbWFpbigpOgotCUFwcCA9IFdlZCgpCi0JQXBwLm1haW5sb29wKCkKLQkKKyAgICBBcHAgPSBXZWQoKQorICAgIEFwcC5tYWlubG9vcCgpCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvRGVtby93YXN0ZS9zd2VkLnB5IGIvTWFjL0RlbW8vd2FzdGUvc3dlZC5weQppbmRleCBjYTc3MjkzLi4yMDc4Y2NlIDEwMDY0NAotLS0gYS9NYWMvRGVtby93YXN0ZS9zd2VkLnB5CisrKyBiL01hYy9EZW1vL3dhc3RlL3N3ZWQucHkKQEAgLTE2LDYyMCArMTYsNjE5IEBACiBpbXBvcnQgbWFjZnMKIAogVU5ET0xBQkVMUyA9IFsgIyBJbmRleGVkIGJ5IFdFR2V0VW5kb0luZm8oKSB2YWx1ZQotCU5vbmUsICIiLCAidHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJEcmFnIiwgIlN0eWxlIl0KLQkKKyAgICAgICAgTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiXQorCiAjIFN0eWxlIGFuZCBzaXplIG1lbnUuIE5vdGUgdGhhdCBzdHlsZSBvcmRlciBpcyBpbXBvcnRhbnQgKHRpZWQgdG8gYml0IHZhbHVlcykKIFNUWUxFUyA9IFsKLQkoIkJvbGQiLCAiQiIpLCAoIkl0YWxpYyIsICJJIiksICgiVW5kZXJsaW5lIiwgIlUiKSwgKCJPdXRsaW5lIiwgIk8iKSwKLQkoIlNoYWRvdyIsICIiKSwgKCJDb25kZW5zZWQiLCAiIiksICgiRXh0ZW5kZWQiLCAiIikKLQldCisgICAgICAgICgiQm9sZCIsICJCIiksICgiSXRhbGljIiwgIkkiKSwgKCJVbmRlcmxpbmUiLCAiVSIpLCAoIk91dGxpbmUiLCAiTyIpLAorICAgICAgICAoIlNoYWRvdyIsICIiKSwgKCJDb25kZW5zZWQiLCAiIiksICgiRXh0ZW5kZWQiLCAiIikKKyAgICAgICAgXQogU0laRVMgPSBbIDksIDEwLCAxMiwgMTQsIDE4LCAyNF0KLQkKKwogQklHUkVHSU9OPVFkLk5ld1JnbigpCiBRZC5TZXRSZWN0UmduKEJJR1JFR0lPTiwgLTE2MDAwLCAtMTYwMDAsIDE2MDAwLCAxNjAwMCkKIAogY2xhc3MgV2FzdGVXaW5kb3coU2Nyb2xsZWRXaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG5hbWUKLQkJciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKLQkJdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkID0gdwotCQl2ciA9IDAsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1Ci0JCWRyID0gKDAsIDAsIDEwMjQwLCAwKQotCQlRZC5TZXRQb3J0KHcpCi0JCVFkLlRleHRGb250KDQpCi0JCVFkLlRleHRTaXplKDkpCi0JCWZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUgfCBcCi0JCQkJV0FTVEVjb25zdC53ZURvVW5kbwotCQlzZWxmLnRlZCA9IHdhc3RlLldFTmV3KGRyLCB2ciwgZmxhZ3MpCi0JCXNlbGYudGVkLldFSW5zdGFsbFRhYkhvb2tzKCkKLQkJc3R5bGUsIHNvdXAgPSBzZWxmLmdldHN0eWxlc291cCgpCi0JCXNlbGYudGVkLldFSW5zZXJ0KGRhdGEsIHN0eWxlLCBzb3VwKQotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbigwLDApCi0JCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCXNlbGYudGVkLldFUmVzZXRNb2RDb3VudCgpCi0JCXcuRHJhd0dyb3dJY29uKCkKLQkJc2VsZi5zY3JvbGxiYXJzKCkKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCXNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKLQkJCi0JZGVmIGdldHN0eWxlc291cChzZWxmKToKLQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCXJldHVybiBOb25lLCBOb25lCi0JCW9sZHJmID0gUmVzLkN1clJlc0ZpbGUoKQotCQl0cnk6Ci0JCQlyZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDEpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlyZXR1cm4gTm9uZSwgTm9uZQotCQl0cnk6Ci0JCQloc3R5bGUgPSBSZXMuR2V0MVJlc291cmNlKCdzdHlsJywgMTI4KQotCQkJaHN0eWxlLkRldGFjaFJlc291cmNlKCkKLQkJZXhjZXB0IFJlcy5FcnJvcjoKLQkJCWhzdHlsZSA9IE5vbmUKLQkJdHJ5OgotCQkJaHNvdXAgPSBSZXMuR2V0MVJlc291cmNlKCdTT1VQJywgMTI4KQotCQkJaHNvdXAuRGV0YWNoUmVzb3VyY2UoKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJaHNvdXAgPSBOb25lCi0JCVJlcy5DbG9zZVJlc0ZpbGUocmYpCi0JCVJlcy5Vc2VSZXNGaWxlKG9sZHJmKQotCQlyZXR1cm4gaHN0eWxlLCBoc291cAotCQkJCQotCWRlZiBkb19pZGxlKHNlbGYsIGV2ZW50KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJc2VsZi50ZWQuV0VJZGxlKCkJCi0JCWlmIHNlbGYudGVkLldFQWRqdXN0Q3Vyc29yKHdoZXJlLCBCSUdSRUdJT04pOgotCQkJcmV0dXJuCi0JCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQotCQkKLQlkZWYgZ2V0c2Nyb2xsYmFydmFsdWVzKHNlbGYpOgotCQlkciA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQl2ciA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQl2eCA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclswXSwgZHJbMl0sIHZyWzBdLCB2clsyXSkKLQkJdnkgPSBzZWxmLnNjYWxlYmFydmFsdWUoZHJbMV0sIGRyWzNdLCB2clsxXSwgdnJbM10pCi0JCXJldHVybiB2eCwgdnkKLQkJCi0JZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgotCQlpZiB3aGljaCA9PSAneSc6Ci0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCi0JCQkJY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQotCQkJCWRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3Ci0JCQlpZiB3aGF0ID09ICctJzoKLQkJCQl0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQotCQkJCXRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCi0JCQkJZGVsdGEgPSBzZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKLQkJCWVsaWYgd2hhdCA9PSAnLS0nOgotCQkJCWRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKLQkJCQlpZiBkZWx0YSA8PSAwOgotCQkJCQlkZWx0YSA9IDEwICMgUmFuZG9tIHZhbHVlCi0JCQllbGlmIHdoYXQgPT0gJysnOgotCQkJCSMgWFhYWCBXcm9uZzogc2hvdWxkIGJlIGJvdHRvbSBsaW5lIHNpemUKLQkJCQl0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQotCQkJCXRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCi0JCQkJZGVsdGEgPSAtc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCi0JCQllbGlmIHdoYXQgPT0gJysrJzoKLQkJCQlkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQotCQkJCWlmIGRlbHRhID49IDA6Ci0JCQkJCWRlbHRhID0gLTEwCi0JCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKLQkJZWxzZToKLQkJCWlmIHdoYXQgPT0gJ3NldCc6Ci0JCQkJcmV0dXJuICMgWFhYWAotCQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJCXdpbndpZHRoID0gdnJbMl0tdnJbMF0KLQkJCWlmIHdoYXQgPT0gJy0nOgotCQkJCWRlbHRhID0gd2lud2lkdGgvMTAKLQkJCWVsaWYgd2hhdCA9PSAnLS0nOgotCQkJCWRlbHRhID0gd2lud2lkdGgvMgotCQkJZWxpZiB3aGF0ID09ICcrJzoKLQkJCQlkZWx0YSA9IC13aW53aWR0aC8xMAotCQkJZWxpZiB3aGF0ID09ICcrKyc6Ci0JCQkJZGVsdGEgPSAtd2lud2lkdGgvMgotCQkJc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCi0JCSMgUGluIHRoZSBzY3JvbGwKLQkJbCwgdCwgciwgYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQl2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQotCQlpZiB0ID4gMCBvciBsID4gMDoKLQkJCWR4ID0gZHkgPSAwCi0JCQlpZiB0ID4gMDogZHkgPSAtdAotCQkJaWYgbCA+IDA6IGR4ID0gLWwKLQkJCXNlbGYudGVkLldFU2Nyb2xsKGR4LCBkeSkKLQkJZWxpZiBiIDwgdmI6Ci0JCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBiLXZiKQorICAgIGRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG5hbWUKKyAgICAgICAgciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKKyAgICAgICAgdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCisgICAgICAgIHNlbGYud2lkID0gdworICAgICAgICB2ciA9IDAsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1CisgICAgICAgIGRyID0gKDAsIDAsIDEwMjQwLCAwKQorICAgICAgICBRZC5TZXRQb3J0KHcpCisgICAgICAgIFFkLlRleHRGb250KDQpCisgICAgICAgIFFkLlRleHRTaXplKDkpCisgICAgICAgIGZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUgfCBcCisgICAgICAgICAgICAgICAgICAgICAgICBXQVNURWNvbnN0LndlRG9VbmRvCisgICAgICAgIHNlbGYudGVkID0gd2FzdGUuV0VOZXcoZHIsIHZyLCBmbGFncykKKyAgICAgICAgc2VsZi50ZWQuV0VJbnN0YWxsVGFiSG9va3MoKQorICAgICAgICBzdHlsZSwgc291cCA9IHNlbGYuZ2V0c3R5bGVzb3VwKCkKKyAgICAgICAgc2VsZi50ZWQuV0VJbnNlcnQoZGF0YSwgc3R5bGUsIHNvdXApCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKDAsMCkKKyAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgc2VsZi50ZWQuV0VSZXNldE1vZENvdW50KCkKKyAgICAgICAgdy5EcmF3R3Jvd0ljb24oKQorICAgICAgICBzZWxmLnNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKyAgICAgICAgc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQogCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKLQkJUWQuU2V0UG9ydChzZWxmLndpZCkKLQkJU2Nyb2xsZWRXaW5kb3cuZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCkKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLnRlZC5XRUFjdGl2YXRlKCkKLQkJCXNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKLQkJCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICBkZWYgZ2V0c3R5bGVzb3VwKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKyAgICAgICAgb2xkcmYgPSBSZXMuQ3VyUmVzRmlsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMSkKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIHJldHVybiBOb25lLCBOb25lCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGhzdHlsZSA9IFJlcy5HZXQxUmVzb3VyY2UoJ3N0eWwnLCAxMjgpCisgICAgICAgICAgICBoc3R5bGUuRGV0YWNoUmVzb3VyY2UoKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgaHN0eWxlID0gTm9uZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBoc291cCA9IFJlcy5HZXQxUmVzb3VyY2UoJ1NPVVAnLCAxMjgpCisgICAgICAgICAgICBoc291cC5EZXRhY2hSZXNvdXJjZSgpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBoc291cCA9IE5vbmUKKyAgICAgICAgUmVzLkNsb3NlUmVzRmlsZShyZikKKyAgICAgICAgUmVzLlVzZVJlc0ZpbGUob2xkcmYpCisgICAgICAgIHJldHVybiBoc3R5bGUsIGhzb3VwCiAKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgotCQlyZWdpb24gPSB3aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgotCQlpZiBRZC5FbXB0eVJnbihyZWdpb24pOgotCQkJcmV0dXJuCi0JCVFkLkVyYXNlUmduKHJlZ2lvbikKLQkJc2VsZi50ZWQuV0VVcGRhdGUocmVnaW9uKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkKLQlkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgotCQlsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQotCQlzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQotCQlzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCi0JCVNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQotCQkKLQlkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAotCQlzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgIGRlZiBkb19pZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgUWQuU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgc2VsZi50ZWQuV0VJZGxlKCkKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCiAKLQlkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlzZWxmLnRlZC5XRUtleShvcmQoY2gpLCBtb2RpZmllcnMpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYudGVkLldFR2V0TW9kQ291bnQoKToKLQkJCXNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSB3aW5kb3cgIiVzIiBiZWZvcmUgY2xvc2luZz8nJXNlbGYubmFtZSwgMSkKLQkJCWlmIHNhdmUgPiAwOgotCQkJCXNlbGYubWVudV9zYXZlKCkKLQkJCWVsaWYgc2F2ZSA8IDA6Ci0JCQkJcmV0dXJuCi0JCWlmIHNlbGYucGFyZW50LmFjdGl2ZSA9PSBzZWxmOgotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gTm9uZQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJZGVsIHNlbGYudGVkCi0JCXNlbGYuZG9fcG9zdGNsb3NlKCkKLQkJCi0JZGVmIG1lbnVfc2F2ZShzZWxmKToKLQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCXNlbGYubWVudV9zYXZlX2FzKCkKLQkJCXJldHVybiAjIFdpbGwgY2FsbCB1cyByZWN1cnNpdmVseQotCQkjCi0JCSMgRmlyc3Qgc2F2ZSBkYXRhCi0JCSMKLQkJZGhhbmRsZSA9IHNlbGYudGVkLldFR2V0VGV4dCgpCi0JCWRhdGEgPSBkaGFuZGxlLmRhdGEKLQkJZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCi0JCWZwLndyaXRlKGRhdGEpCi0JCWlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCi0JCWZwLmNsb3NlKCkKLQkJIwotCQkjIE5vdyBzYXZlIHN0eWxlIGFuZCBzb3VwCi0JCSMKLQkJb2xkcmVzZmlsZSA9IFJlcy5DdXJSZXNGaWxlKCkKLQkJdHJ5OgotCQkJcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJUmVzLkZTcENyZWF0ZVJlc0ZpbGUoc2VsZi5wYXRoLCAnPz8/PycsICdURVhUJywgbWFjZnMuc21BbGxTY3JpcHRzKQotCQkJcmYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQotCQlzdHlsZXMgPSBSZXMuUmVzb3VyY2UoJycpCi0JCXNvdXAgPSBSZXMuUmVzb3VyY2UoJycpCi0JCXNlbGYudGVkLldFQ29weVJhbmdlKDAsIDB4M2ZmZmZmZmYsIE5vbmUsIHN0eWxlcywgc291cCkKLQkJc3R5bGVzLkFkZFJlc291cmNlKCdzdHlsJywgMTI4LCAnJykKLQkJc291cC5BZGRSZXNvdXJjZSgnU09VUCcsIDEyOCwgJycpCi0JCVJlcy5DbG9zZVJlc0ZpbGUocmYpCi0JCVJlcy5Vc2VSZXNGaWxlKG9sZHJlc2ZpbGUpCi0JCQotCQlzZWxmLnRlZC5XRVJlc2V0TW9kQ291bnQoKQotCQkKLQlkZWYgbWVudV9zYXZlX2FzKHNlbGYpOgotCQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonKQotCQlpZiBub3QgcGF0aDogcmV0dXJuCi0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnBhdGgpWy0xXQotCQlzZWxmLndpZC5TZXRXVGl0bGUoc2VsZi5uYW1lKQotCQlzZWxmLm1lbnVfc2F2ZSgpCi0JCQotCWRlZiBtZW51X2N1dChzZWxmKToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJc2VsZi50ZWQuV0VDdXQoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKLQkJCi0JZGVmIG1lbnVfY29weShzZWxmKToKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1plcm9TY3JhcCcpOgotCQkJU2NyYXAuWmVyb1NjcmFwKCkKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJc2VsZi50ZWQuV0VDb3B5KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X3Bhc3RlKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X2NsZWFyKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRURlbGV0ZSgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgIGRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQorICAgICAgICB2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKKyAgICAgICAgcmV0dXJuIHZ4LCB2eQogCi0JZGVmIG1lbnVfdW5kbyhzZWxmKToKLQkJc2VsZi50ZWQuV0VVbmRvKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtZW51X3NldGZvbnQoc2VsZiwgZm9udCk6Ci0JCWZvbnQgPSBGbS5HZXRGTnVtKGZvbnQpCi0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9Gb250LCAoZm9udCwgMCwgMCwgKDAsMCwwKSkpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkJCQotCWRlZiBtZW51X21vZGZhY2Uoc2VsZiwgZmFjZSk6Ci0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1RvZ2dsZUZhY2UsIAotCQkJKDAsIGZhY2UsIDAsICgwLDAsMCkpKQorICAgIGRlZiBzY3JvbGxiYXJfY2FsbGJhY2soc2VsZiwgd2hpY2gsIHdoYXQsIHZhbHVlKToKKyAgICAgICAgaWYgd2hpY2ggPT0gJ3knOgorICAgICAgICAgICAgaWYgd2hhdCA9PSAnc2V0JzoKKyAgICAgICAgICAgICAgICBoZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodCgwLCAweDNmZmZmZmZmKQorICAgICAgICAgICAgICAgIGN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KKyAgICAgICAgICAgICAgICBkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NworICAgICAgICAgICAgaWYgd2hhdCA9PSAnLSc6CisgICAgICAgICAgICAgICAgdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKKyAgICAgICAgICAgICAgICB0b3BsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHRvcGxpbmVfb2ZmKQorICAgICAgICAgICAgICAgIGRlbHRhID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tMTApCisgICAgICAgICAgICAgICAgaWYgZGVsdGEgPD0gMDoKKyAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSAxMCAjIFJhbmRvbSB2YWx1ZQorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrJzoKKyAgICAgICAgICAgICAgICAjIFhYWFggV3Jvbmc6IHNob3VsZCBiZSBib3R0b20gbGluZSBzaXplCisgICAgICAgICAgICAgICAgdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKKyAgICAgICAgICAgICAgICB0b3BsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHRvcGxpbmVfb2ZmKQorICAgICAgICAgICAgICAgIGRlbHRhID0gLXNlbGYudGVkLldFR2V0SGVpZ2h0KHRvcGxpbmVfbnVtLCB0b3BsaW5lX251bSsxKQorICAgICAgICAgICAgZWxpZiB3aGF0ID09ICcrKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKKyAgICAgICAgICAgICAgICBpZiBkZWx0YSA+PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IC0xMAorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoMCwgZGVsdGEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIHJldHVybiAjIFhYWFgKKyAgICAgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgICAgICB3aW53aWR0aCA9IHZyWzJdLXZyWzBdCisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzEwCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzIKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtd2lud2lkdGgvMTAKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLXdpbndpZHRoLzIKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKGRlbHRhLCAwKQorICAgICAgICAjIFBpbiB0aGUgc2Nyb2xsCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgaWYgdCA+IDAgb3IgbCA+IDA6CisgICAgICAgICAgICBkeCA9IGR5ID0gMAorICAgICAgICAgICAgaWYgdCA+IDA6IGR5ID0gLXQKKyAgICAgICAgICAgIGlmIGwgPiAwOiBkeCA9IC1sCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbChkeCwgZHkpCisgICAgICAgIGVsaWYgYiA8IHZiOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoMCwgYi12YikKIAotCWRlZiBtZW51X3NldGZhY2Uoc2VsZiwgZmFjZSk6Ci0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1JlcGxhY2VGYWNlLCAKLQkJCSgwLCBmYWNlLCAwLCAoMCwwLDApKSkKIAotCWRlZiBtZW51X3NldHNpemUoc2VsZiwgc2l6ZSk6Ci0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9TaXplLCAoMCwgMCwgc2l6ZSwgKDAsMCwwKSkpCi0JCQkJCQkJCQotCWRlZiBtZW51X2luY3NpemUoc2VsZiwgc2l6ZSk6Ci0JCXNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9BZGRTaXplLCAoMCwgMCwgc2l6ZSwgKDAsMCwwKSkpCisgICAgZGVmIGRvX2FjdGl2YXRlKHNlbGYsIG9ub2ZmLCBldnQpOgorICAgICAgICBRZC5TZXRQb3J0KHNlbGYud2lkKQorICAgICAgICBTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYudGVkLldFQWN0aXZhdGUoKQorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgorICAgICAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQogCi0JZGVmIG15c2V0c3R5bGUoc2VsZiwgd2hpY2gsIGhvdyk6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCXNlbGYudGVkLldFU2V0U3R5bGUod2hpY2gsIGhvdykKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCQkJCQotCWRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKLQkJc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXJldHVybiBzdGFydCA8IHN0b3AKLQkJCi0JZGVmIGNhbl9wYXN0ZShzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFQ2FuUGFzdGUoKQotCQkKLQlkZWYgY2FuX3VuZG8oc2VsZik6Ci0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCXdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KLQkJaWYgd2hpY2ggPT0gTm9uZTogcmV0dXJuIE5vbmUKLQkJaWYgcmVkbzoKLQkJCXJldHVybiAiUmVkbyAiK3doaWNoCi0JCWVsc2U6Ci0JCQlyZXR1cm4gIlVuZG8gIit3aGljaAotCQkJCi0JZGVmIGdldHJ1bmluZm8oc2VsZik6Ci0JCWFsbCA9IChXQVNURWNvbnN0LndlRG9Gb250IHwgV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb1NpemUpCi0JCWR1bW15LCBtb2RlLCAoZm9udCwgZmFjZSwgc2l6ZSwgY29sb3IpID0gc2VsZi50ZWQuV0VDb250aW51b3VzU3R5bGUoYWxsKQotCQlpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9Gb250KToKLQkJCWZvbnQgPSBOb25lCi0JCWVsc2U6Ci0JCQlmb250ID0gRm0uR2V0Rm9udE5hbWUoZm9udCkKLQkJaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvRmFjZSk6IGZhY3QgPSBOb25lCi0JCWlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb1NpemUpOiBzaXplID0gTm9uZQotCQlyZXR1cm4gZm9udCwgZmFjZSwgc2l6ZQorICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6CisgICAgICAgIHJlZ2lvbiA9IHdpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCisgICAgICAgIGlmIFFkLkVtcHR5UmduKHJlZ2lvbik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuRXJhc2VSZ24ocmVnaW9uKQorICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShyZWdpb24pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQorICAgICAgICBzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQorICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCisgICAgICAgIFNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQorCisgICAgZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBsb2NhbCwgbW9kaWZpZXJzLCBldnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldnQKKyAgICAgICAgc2VsZi50ZWQuV0VDbGljayhsb2NhbCwgbW9kaWZpZXJzLCB3aGVuKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHNlbGYudGVkLldFS2V5KG9yZChjaCksIG1vZGlmaWVycykKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYudGVkLldFR2V0TW9kQ291bnQoKToKKyAgICAgICAgICAgIHNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSB3aW5kb3cgIiVzIiBiZWZvcmUgY2xvc2luZz8nJXNlbGYubmFtZSwgMSkKKyAgICAgICAgICAgIGlmIHNhdmUgPiAwOgorICAgICAgICAgICAgICAgIHNlbGYubWVudV9zYXZlKCkKKyAgICAgICAgICAgIGVsaWYgc2F2ZSA8IDA6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYucGFyZW50LmFjdGl2ZSA9PSBzZWxmOgorICAgICAgICAgICAgc2VsZi5wYXJlbnQuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgZGVsIHNlbGYudGVkCisgICAgICAgIHNlbGYuZG9fcG9zdGNsb3NlKCkKKworICAgIGRlZiBtZW51X3NhdmUoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICBzZWxmLm1lbnVfc2F2ZV9hcygpCisgICAgICAgICAgICByZXR1cm4gIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKKyAgICAgICAgIworICAgICAgICAjIEZpcnN0IHNhdmUgZGF0YQorICAgICAgICAjCisgICAgICAgIGRoYW5kbGUgPSBzZWxmLnRlZC5XRUdldFRleHQoKQorICAgICAgICBkYXRhID0gZGhhbmRsZS5kYXRhCisgICAgICAgIGZwID0gb3BlbihzZWxmLnBhdGgsICd3YicpICAjIE5PVEU6IHdiLCBiZWNhdXNlIGRhdGEgaGFzIENSIGZvciBlbmQtb2YtbGluZQorICAgICAgICBmcC53cml0ZShkYXRhKQorICAgICAgICBpZiBkYXRhWy0xXSA8PiAnXHInOiBmcC53cml0ZSgnXHInKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICMKKyAgICAgICAgIyBOb3cgc2F2ZSBzdHlsZSBhbmQgc291cAorICAgICAgICAjCisgICAgICAgIG9sZHJlc2ZpbGUgPSBSZXMuQ3VyUmVzRmlsZSgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgIFJlcy5GU3BDcmVhdGVSZXNGaWxlKHNlbGYucGF0aCwgJz8/Pz8nLCAnVEVYVCcsIG1hY2ZzLnNtQWxsU2NyaXB0cykKKyAgICAgICAgICAgIHJmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKKyAgICAgICAgc3R5bGVzID0gUmVzLlJlc291cmNlKCcnKQorICAgICAgICBzb3VwID0gUmVzLlJlc291cmNlKCcnKQorICAgICAgICBzZWxmLnRlZC5XRUNvcHlSYW5nZSgwLCAweDNmZmZmZmZmLCBOb25lLCBzdHlsZXMsIHNvdXApCisgICAgICAgIHN0eWxlcy5BZGRSZXNvdXJjZSgnc3R5bCcsIDEyOCwgJycpCisgICAgICAgIHNvdXAuQWRkUmVzb3VyY2UoJ1NPVVAnLCAxMjgsICcnKQorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKHJmKQorICAgICAgICBSZXMuVXNlUmVzRmlsZShvbGRyZXNmaWxlKQorCisgICAgICAgIHNlbGYudGVkLldFUmVzZXRNb2RDb3VudCgpCisKKyAgICBkZWYgbWVudV9zYXZlX2FzKHNlbGYpOgorICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonKQorICAgICAgICBpZiBub3QgcGF0aDogcmV0dXJuCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5uYW1lID0gb3MucGF0aC5zcGxpdChzZWxmLnBhdGgpWy0xXQorICAgICAgICBzZWxmLndpZC5TZXRXVGl0bGUoc2VsZi5uYW1lKQorICAgICAgICBzZWxmLm1lbnVfc2F2ZSgpCisKKyAgICBkZWYgbWVudV9jdXQoc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ3V0KCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9jb3B5KHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUNvcHkoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X3Bhc3RlKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRVBhc3RlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9jbGVhcihzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZWxWaWV3KCkKKyAgICAgICAgc2VsZi50ZWQuV0VEZWxldGUoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X3VuZG8oc2VsZik6CisgICAgICAgIHNlbGYudGVkLldFVW5kbygpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorCisgICAgZGVmIG1lbnVfc2V0Zm9udChzZWxmLCBmb250KToKKyAgICAgICAgZm9udCA9IEZtLkdldEZOdW0oZm9udCkKKyAgICAgICAgc2VsZi5teXNldHN0eWxlKFdBU1RFY29uc3Qud2VEb0ZvbnQsIChmb250LCAwLCAwLCAoMCwwLDApKSkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgbWVudV9tb2RmYWNlKHNlbGYsIGZhY2UpOgorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZXxXQVNURWNvbnN0LndlRG9Ub2dnbGVGYWNlLAorICAgICAgICAgICAgICAgICgwLCBmYWNlLCAwLCAoMCwwLDApKSkKKworICAgIGRlZiBtZW51X3NldGZhY2Uoc2VsZiwgZmFjZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9GYWNlfFdBU1RFY29uc3Qud2VEb1JlcGxhY2VGYWNlLAorICAgICAgICAgICAgICAgICgwLCBmYWNlLCAwLCAoMCwwLDApKSkKKworICAgIGRlZiBtZW51X3NldHNpemUoc2VsZiwgc2l6ZSk6CisgICAgICAgIHNlbGYubXlzZXRzdHlsZShXQVNURWNvbnN0LndlRG9TaXplLCAoMCwgMCwgc2l6ZSwgKDAsMCwwKSkpCisKKyAgICBkZWYgbWVudV9pbmNzaXplKHNlbGYsIHNpemUpOgorICAgICAgICBzZWxmLm15c2V0c3R5bGUoV0FTVEVjb25zdC53ZURvQWRkU2l6ZSwgKDAsIDAsIHNpemUsICgwLDAsMCkpKQorCisgICAgZGVmIG15c2V0c3R5bGUoc2VsZiwgd2hpY2gsIGhvdyk6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUod2hpY2gsIGhvdykKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisKKyAgICBkZWYgaGF2ZV9zZWxlY3Rpb24oc2VsZik6CisgICAgICAgIHN0YXJ0LCBzdG9wID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICByZXR1cm4gc3RhcnQgPCBzdG9wCisKKyAgICBkZWYgY2FuX3Bhc3RlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VDYW5QYXN0ZSgpCisKKyAgICBkZWYgY2FuX3VuZG8oc2VsZik6CisgICAgICAgIHdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCisgICAgICAgIHdoaWNoID0gVU5ET0xBQkVMU1t3aGljaF0KKyAgICAgICAgaWYgd2hpY2ggPT0gTm9uZTogcmV0dXJuIE5vbmUKKyAgICAgICAgaWYgcmVkbzoKKyAgICAgICAgICAgIHJldHVybiAiUmVkbyAiK3doaWNoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gIlVuZG8gIit3aGljaAorCisgICAgZGVmIGdldHJ1bmluZm8oc2VsZik6CisgICAgICAgIGFsbCA9IChXQVNURWNvbnN0LndlRG9Gb250IHwgV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb1NpemUpCisgICAgICAgIGR1bW15LCBtb2RlLCAoZm9udCwgZmFjZSwgc2l6ZSwgY29sb3IpID0gc2VsZi50ZWQuV0VDb250aW51b3VzU3R5bGUoYWxsKQorICAgICAgICBpZiBub3QgKG1vZGUgJiBXQVNURWNvbnN0LndlRG9Gb250KToKKyAgICAgICAgICAgIGZvbnQgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb250ID0gRm0uR2V0Rm9udE5hbWUoZm9udCkKKyAgICAgICAgaWYgbm90IChtb2RlICYgV0FTVEVjb25zdC53ZURvRmFjZSk6IGZhY3QgPSBOb25lCisgICAgICAgIGlmIG5vdCAobW9kZSAmIFdBU1RFY29uc3Qud2VEb1NpemUpOiBzaXplID0gTm9uZQorICAgICAgICByZXR1cm4gZm9udCwgZmFjZSwgc2l6ZQogCiBjbGFzcyBXZWQoQXBwbGljYXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKLQkJc2VsZi5udW0gPSAwCi0JCXNlbGYuYWN0aXZlID0gTm9uZQotCQlzZWxmLnVwZGF0ZW1lbnViYXIoKQotCQl3YXN0ZS5TVERPYmplY3RIYW5kbGVycygpCi0JCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYubmV3aXRlbSA9IE1lbnVJdGVtKG0sICJOZXcgd2luZG93IiwgIk4iLCBzZWxmLm9wZW4pCi0JCXNlbGYub3Blbml0ZW0gPSBNZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZmlsZSkKLQkJc2VsZi5jbG9zZWl0ZW0gPSBNZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsIHNlbGYuY2xvc2V3aW4pCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCi0JCXNlbGYuc2F2ZWFzaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIGFzLi4uIiwgIiIsIHNlbGYuc2F2ZWFzKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQkKLQkJc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQlzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKLQkJc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCi0JCXNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQotCQlzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKLQkJc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKLQkJCi0JCXNlbGYubWFrZWZvbnRtZW51KCkKLQkJCi0JCSMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6Ci0JCXNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwKLQkJCXNlbGYuZWRpdG1lbnUsIHNlbGYuZm9udG1lbnUsIHNlbGYuZmFjZW1lbnUsIHNlbGYuc2l6ZW1lbnVdCi0JCXNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQotCQlzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKLQkJc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKLQkJc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKLQkJc2VsZi51bmRvX2xhYmVsID0gIm5ldmVyIgotCQlzZWxmLmZmc192YWx1ZXMgPSAoKQotCQkKLQlkZWYgbWFrZWZvbnRtZW51KHNlbGYpOgotCQlzZWxmLmZvbnRtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJGb250IikKLQkJc2VsZi5mb250bmFtZXMgPSBnZXRmb250bmFtZXMoKQotCQlzZWxmLmZvbnRpdGVtcyA9IFtdCi0JCWZvciBuIGluIHNlbGYuZm9udG5hbWVzOgotCQkJbSA9IE1lbnVJdGVtKHNlbGYuZm9udG1lbnUsIG4sICIiLCBzZWxmLnNlbGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtcy5hcHBlbmQobSkKLQkJc2VsZi5mYWNlbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU3R5bGUiKQotCQlzZWxmLmZhY2VpdGVtcyA9IFtdCi0JCWZvciBuLCBzaG9ydGN1dCBpbiBTVFlMRVM6Ci0JCQltID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgbiwgc2hvcnRjdXQsIHNlbGYuc2VsZmFjZSkKLQkJCXNlbGYuZmFjZWl0ZW1zLmFwcGVuZChtKQotCQlzZWxmLmZhY2VtZW51LmFkZHNlcGFyYXRvcigpCi0JCXNlbGYuZmFjZWl0ZW1fbm9ybWFsID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgIk5vcm1hbCIsICJOIiwgCi0JCQlzZWxmLnNlbGZhY2Vub3JtYWwpCi0JCXNlbGYuc2l6ZW1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIlNpemUiKQotCQlzZWxmLnNpemVpdGVtcyA9IFtdCi0JCWZvciBuIGluIFNJWkVTOgotCQkJbSA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsIHJlcHIobiksICIiLCBzZWxmLnNlbHNpemUpCi0JCQlzZWxmLnNpemVpdGVtcy5hcHBlbmQobSkKLQkJc2VsZi5zaXplbWVudS5hZGRzZXBhcmF0b3IoKQotCQlzZWxmLnNpemVpdGVtX2JpZ2dlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJCaWdnZXIiLCAiKyIsIAotCQkJc2VsZi5zZWxzaXplYmlnZ2VyKQotCQlzZWxmLnNpemVpdGVtX3NtYWxsZXIgPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCAiU21hbGxlciIsICItIiwgCi0JCQlzZWxmLnNlbHNpemVzbWFsbGVyKQotCQkJCQkKLQlkZWYgc2VsZm9udChzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCWZvbnQgPSBzZWxmLmZvbnRuYW1lc1tpdGVtLTFdCi0JCQlzZWxmLmFjdGl2ZS5tZW51X3NldGZvbnQoZm9udCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIEFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYubnVtID0gMAorICAgICAgICBzZWxmLmFjdGl2ZSA9IE5vbmUKKyAgICAgICAgc2VsZi51cGRhdGVtZW51YmFyKCkKKyAgICAgICAgd2FzdGUuU1RET2JqZWN0SGFuZGxlcnMoKQogCi0JZGVmIHNlbGZhY2Uoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlmYWNlID0gKDE8PChpdGVtLTEpKQotCQkJc2VsZi5hY3RpdmUubWVudV9tb2RmYWNlKGZhY2UpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKKyAgICAgICAgc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQorICAgICAgICBzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKKyAgICAgICAgc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCiAKLQlkZWYgc2VsZmFjZW5vcm1hbChzZWxmLCAqcmVzdCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zZXRmYWNlKDApCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisgICAgICAgIHNlbGYuZWRpdG1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJFZGl0IikKKyAgICAgICAgc2VsZi51bmRvaXRlbSA9IE1lbnVJdGVtKG0sICJVbmRvIiwgIloiLCBzZWxmLnVuZG8pCisgICAgICAgIHNlbGYuY3V0aXRlbSA9IE1lbnVJdGVtKG0sICJDdXQiLCAiWCIsIHNlbGYuY3V0KQorICAgICAgICBzZWxmLmNvcHlpdGVtID0gTWVudUl0ZW0obSwgIkNvcHkiLCAiQyIsIHNlbGYuY29weSkKKyAgICAgICAgc2VsZi5wYXN0ZWl0ZW0gPSBNZW51SXRlbShtLCAiUGFzdGUiLCAiViIsIHNlbGYucGFzdGUpCisgICAgICAgIHNlbGYuY2xlYXJpdGVtID0gTWVudUl0ZW0obSwgIkNsZWFyIiwgIiIsIHNlbGYuY2xlYXIpCiAKLQlkZWYgc2Vsc2l6ZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNpemUgPSBTSVpFU1tpdGVtLTFdCi0JCQlzZWxmLmFjdGl2ZS5tZW51X3NldHNpemUoc2l6ZSkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICAgICAgc2VsZi5tYWtlZm9udG1lbnUoKQogCi0JZGVmIHNlbHNpemViaWdnZXIoc2VsZiwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfaW5jc2l6ZSgyKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICAjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgorICAgICAgICBzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sCisgICAgICAgICAgICAgICAgc2VsZi5lZGl0bWVudSwgc2VsZi5mb250bWVudSwgc2VsZi5mYWNlbWVudSwgc2VsZi5zaXplbWVudV0KKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCisgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQorICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCisgICAgICAgIHNlbGYuZmZzX3ZhbHVlcyA9ICgpCiAKLQlkZWYgc2Vsc2l6ZXNtYWxsZXIoc2VsZiwgKnJlc3QpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfaW5jc2l6ZSgtMikKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgbWFrZWZvbnRtZW51KHNlbGYpOgorICAgICAgICBzZWxmLmZvbnRtZW51ID0gTWVudShzZWxmLm1lbnViYXIsICJGb250IikKKyAgICAgICAgc2VsZi5mb250bmFtZXMgPSBnZXRmb250bmFtZXMoKQorICAgICAgICBzZWxmLmZvbnRpdGVtcyA9IFtdCisgICAgICAgIGZvciBuIGluIHNlbGYuZm9udG5hbWVzOgorICAgICAgICAgICAgbSA9IE1lbnVJdGVtKHNlbGYuZm9udG1lbnUsIG4sICIiLCBzZWxmLnNlbGZvbnQpCisgICAgICAgICAgICBzZWxmLmZvbnRpdGVtcy5hcHBlbmQobSkKKyAgICAgICAgc2VsZi5mYWNlbWVudSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiU3R5bGUiKQorICAgICAgICBzZWxmLmZhY2VpdGVtcyA9IFtdCisgICAgICAgIGZvciBuLCBzaG9ydGN1dCBpbiBTVFlMRVM6CisgICAgICAgICAgICBtID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgbiwgc2hvcnRjdXQsIHNlbGYuc2VsZmFjZSkKKyAgICAgICAgICAgIHNlbGYuZmFjZWl0ZW1zLmFwcGVuZChtKQorICAgICAgICBzZWxmLmZhY2VtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgIHNlbGYuZmFjZWl0ZW1fbm9ybWFsID0gTWVudUl0ZW0oc2VsZi5mYWNlbWVudSwgIk5vcm1hbCIsICJOIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGZhY2Vub3JtYWwpCisgICAgICAgIHNlbGYuc2l6ZW1lbnUgPSBNZW51KHNlbGYubWVudWJhciwgIlNpemUiKQorICAgICAgICBzZWxmLnNpemVpdGVtcyA9IFtdCisgICAgICAgIGZvciBuIGluIFNJWkVTOgorICAgICAgICAgICAgbSA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsIHJlcHIobiksICIiLCBzZWxmLnNlbHNpemUpCisgICAgICAgICAgICBzZWxmLnNpemVpdGVtcy5hcHBlbmQobSkKKyAgICAgICAgc2VsZi5zaXplbWVudS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNpemVpdGVtX2JpZ2dlciA9IE1lbnVJdGVtKHNlbGYuc2l6ZW1lbnUsICJCaWdnZXIiLCAiKyIsCisgICAgICAgICAgICAgICAgc2VsZi5zZWxzaXplYmlnZ2VyKQorICAgICAgICBzZWxmLnNpemVpdGVtX3NtYWxsZXIgPSBNZW51SXRlbShzZWxmLnNpemVtZW51LCAiU21hbGxlciIsICItIiwKKyAgICAgICAgICAgICAgICBzZWxmLnNlbHNpemVzbWFsbGVyKQogCi0JZGVmIHVwZGF0ZW1lbnViYXIoc2VsZik6Ci0JCWNoYW5nZWQgPSAwCi0JCW9uID0gKHNlbGYuYWN0aXZlIDw+IE5vbmUpCi0JCWlmIG9uIDw+IHNlbGYud2luZG93Z3JvdXBfb246Ci0JCQlmb3IgbSBpbiBzZWxmLndpbmRvd2dyb3VwOgotCQkJCW0uZW5hYmxlKG9uKQotCQkJc2VsZi53aW5kb3dncm91cF9vbiA9IG9uCi0JCQljaGFuZ2VkID0gMQotCQlpZiBvbjoKLQkJCSMgb25seSBpZiB3ZSBoYXZlIGFuIGVkaXQgbWVudQotCQkJb24gPSBzZWxmLmFjdGl2ZS5oYXZlX3NlbGVjdGlvbigpCi0JCQlpZiBvbiA8PiBzZWxmLmZvY3VzZ3JvdXBfb246Ci0JCQkJZm9yIG0gaW4gc2VsZi5mb2N1c2dyb3VwOgotCQkJCQltLmVuYWJsZShvbikKLQkJCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl9wYXN0ZSgpCi0JCQlpZiBvbiA8PiBzZWxmLnBhc3RlZ3JvdXBfb246Ci0JCQkJc2VsZi5wYXN0ZWl0ZW0uZW5hYmxlKG9uKQotCQkJCXNlbGYucGFzdGVncm91cF9vbiA9IG9uCi0JCQkJY2hhbmdlZCA9IDEKLQkJCW9uID0gc2VsZi5hY3RpdmUuY2FuX3VuZG8oKQotCQkJaWYgb24gPD4gc2VsZi51bmRvX2xhYmVsOgotCQkJCWlmIG9uOgotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgxKQotCQkJCQlzZWxmLnVuZG9pdGVtLnNldHRleHQob24pCi0JCQkJCXNlbGYudW5kb19sYWJlbCA9IG9uCi0JCQkJZWxzZToKLQkJCQkJc2VsZi51bmRvaXRlbS5zZXR0ZXh0KCJOb3RoaW5nIHRvIHVuZG8iKQotCQkJCQlzZWxmLnVuZG9pdGVtLmVuYWJsZSgwKQotCQkJCWNoYW5nZWQgPSAxCi0JCQlpZiBzZWxmLnVwZGF0ZWZvbnRtZW51cygpOgotCQkJCWNoYW5nZWQgPSAxCi0JCWlmIGNoYW5nZWQ6Ci0JCQlEcmF3TWVudUJhcigpCi0JCQkKLQlkZWYgdXBkYXRlZm9udG1lbnVzKHNlbGYpOgotCQlpbmZvID0gc2VsZi5hY3RpdmUuZ2V0cnVuaW5mbygpCi0JCWlmIGluZm8gPT0gc2VsZi5mZnNfdmFsdWVzOgotCQkJcmV0dXJuIDAKLQkJIyBSZW1vdmUgb2xkIGNoZWNrbWFya3MKLQkJaWYgc2VsZi5mZnNfdmFsdWVzID09ICgpOgotCQkJc2VsZi5mZnNfdmFsdWVzID0gKE5vbmUsIE5vbmUsIE5vbmUpCi0JCWZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKLQkJaWYgZm9udCA8PiBOb25lOgotCQkJZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygwKQotCQlpZiBmYWNlIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKLQkJCQlpZiBmYWNlICYgKDE8PGkpOgotCQkJCQlzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygwKQotCQlpZiBzaXplIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKLQkJCQlpZiBTSVpFU1tpXSA9PSBzaXplOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygwKQotCQkJCQotCQlzZWxmLmZmc192YWx1ZXMgPSBpbmZvCi0JCSMgU2V0IG5ldyBjaGVja21hcmtzCi0JCWZvbnQsIGZhY2UsIHNpemUgPSBzZWxmLmZmc192YWx1ZXMKLQkJaWYgZm9udCA8PiBOb25lOgotCQkJZm51bSA9IHNlbGYuZm9udG5hbWVzLmluZGV4KGZvbnQpCi0JCQlzZWxmLmZvbnRpdGVtc1tmbnVtXS5jaGVjaygxKQotCQlpZiBmYWNlIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5mYWNlaXRlbXMpKToKLQkJCQlpZiBmYWNlICYgKDE8PGkpOgotCQkJCQlzZWxmLmZhY2VpdGVtc1tpXS5jaGVjaygxKQotCQlpZiBzaXplIDw+IE5vbmU6Ci0JCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKLQkJCQlpZiBTSVpFU1tpXSA9PSBzaXplOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5jaGVjaygxKQotCQkjIFNldCBvdXRsaW5lL25vcm1hbCBmb3Igc2l6ZXMKLQkJaWYgZm9udDoKLQkJCWV4aXN0cyA9IGdldGZvbnRzaXplcyhmb250LCBTSVpFUykKLQkJCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgotCQkJCWlmIGV4aXN0c1tpXToKLQkJCQkJc2VsZi5zaXplaXRlbXNbaV0uc2V0c3R5bGUoMCkKLQkJCQllbHNlOgotCQkJCQlzZWxmLnNpemVpdGVtc1tpXS5zZXRzdHlsZSg4KQorICAgIGRlZiBzZWxmb250KHNlbGYsIGlkLCBpdGVtLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgZm9udCA9IHNlbGYuZm9udG5hbWVzW2l0ZW0tMV0KKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2V0Zm9udChmb250KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQogCi0JIwotCSMgQXBwbGUgbWVudQotCSMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBXQVNURSIpCi0JCQkKLQkjCi0JIyBGaWxlIG1lbnUKLQkjCisgICAgZGVmIHNlbGZhY2Uoc2VsZiwgaWQsIGl0ZW0sICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBmYWNlID0gKDE8PChpdGVtLTEpKQorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9tb2RmYWNlKGZhY2UpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQlkZWYgb3BlbihzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMCkKLQkJCi0JZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigxKQorICAgIGRlZiBzZWxmYWNlbm9ybWFsKHNlbGYsICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NldGZhY2UoMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKLQkJaWYgYXNrZmlsZToKLQkJCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCi0JCQlpZiBub3QgcGF0aDoKLQkJCQlyZXR1cm4KLQkJCW5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQotCQkJdHJ5OgotCQkJCWZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCi0JCQkJZGF0YSA9IGZwLnJlYWQoKQotCQkJCWZwLmNsb3NlKCkKLQkJCWV4Y2VwdCBJT0Vycm9yLCBhcmc6Ci0JCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQotCQkJCXJldHVybgotCQllbHNlOgotCQkJcGF0aCA9IE5vbmUKLQkJCW5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCi0JCQlkYXRhID0gJycKLQkJdyA9IFdhc3RlV2luZG93KHNlbGYpCi0JCXcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQotCQlzZWxmLm51bSA9IHNlbGYubnVtICsgMQotCQkKLQlkZWYgY2xvc2V3aW4oc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmNsb3NlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQkKLQkJCi0JZGVmIHF1aXQoc2VsZiwgKmFyZ3MpOgotCQlmb3IgdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgotCQkJdy5jbG9zZSgpCi0JCWlmIHNlbGYuX3dpbmRvd3M6Ci0JCQlyZXR1cm4KLQkJc2VsZi5fcXVpdCgpCi0JCQotCSMKLQkjIEVkaXQgbWVudQotCSMKLQkKLQlkZWYgdW5kbyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV91bmRvKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIGN1dChzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jdXQoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY29weShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHBhc3RlKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3Bhc3RlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKyAgICBkZWYgc2Vsc2l6ZShzZWxmLCBpZCwgaXRlbSwgKnJlc3QpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNpemUgPSBTSVpFU1tpdGVtLTFdCisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NldHNpemUoc2l6ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKIAotCWRlZiBjbGVhcihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9jbGVhcigpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCSMKLQkjIE90aGVyIHN0dWZmCi0JIwkKKyAgICBkZWYgc2Vsc2l6ZWJpZ2dlcihzZWxmLCAqcmVzdCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9pbmNzaXplKDIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCiAKLQlkZWYgaWRsZShzZWxmLCBldmVudCk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKLQkJZWxzZToKLQkJCVFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQotCQkJCisgICAgZGVmIHNlbHNpemVzbWFsbGVyKHNlbGYsICpyZXN0KToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2luY3NpemUoLTIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgdXBkYXRlbWVudWJhcihzZWxmKToKKyAgICAgICAgY2hhbmdlZCA9IDAKKyAgICAgICAgb24gPSAoc2VsZi5hY3RpdmUgPD4gTm9uZSkKKyAgICAgICAgaWYgb24gPD4gc2VsZi53aW5kb3dncm91cF9vbjoKKyAgICAgICAgICAgIGZvciBtIGluIHNlbGYud2luZG93Z3JvdXA6CisgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICBzZWxmLndpbmRvd2dyb3VwX29uID0gb24KKyAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgIGlmIG9uOgorICAgICAgICAgICAgIyBvbmx5IGlmIHdlIGhhdmUgYW4gZWRpdCBtZW51CisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmhhdmVfc2VsZWN0aW9uKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYuZm9jdXNncm91cF9vbjoKKyAgICAgICAgICAgICAgICBmb3IgbSBpbiBzZWxmLmZvY3VzZ3JvdXA6CisgICAgICAgICAgICAgICAgICAgIG0uZW5hYmxlKG9uKQorICAgICAgICAgICAgICAgIHNlbGYuZm9jdXNncm91cF9vbiA9IG9uCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuY2FuX3Bhc3RlKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYucGFzdGVncm91cF9vbjoKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlaXRlbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5wYXN0ZWdyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5jYW5fdW5kbygpCisgICAgICAgICAgICBpZiBvbiA8PiBzZWxmLnVuZG9fbGFiZWw6CisgICAgICAgICAgICAgICAgaWYgb246CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uc2V0dGV4dChvbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvX2xhYmVsID0gb24KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9pdGVtLnNldHRleHQoIk5vdGhpbmcgdG8gdW5kbyIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uZW5hYmxlKDApCisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIGlmIHNlbGYudXBkYXRlZm9udG1lbnVzKCk6CisgICAgICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgY2hhbmdlZDoKKyAgICAgICAgICAgIERyYXdNZW51QmFyKCkKKworICAgIGRlZiB1cGRhdGVmb250bWVudXMoc2VsZik6CisgICAgICAgIGluZm8gPSBzZWxmLmFjdGl2ZS5nZXRydW5pbmZvKCkKKyAgICAgICAgaWYgaW5mbyA9PSBzZWxmLmZmc192YWx1ZXM6CisgICAgICAgICAgICByZXR1cm4gMAorICAgICAgICAjIFJlbW92ZSBvbGQgY2hlY2ttYXJrcworICAgICAgICBpZiBzZWxmLmZmc192YWx1ZXMgPT0gKCk6CisgICAgICAgICAgICBzZWxmLmZmc192YWx1ZXMgPSAoTm9uZSwgTm9uZSwgTm9uZSkKKyAgICAgICAgZm9udCwgZmFjZSwgc2l6ZSA9IHNlbGYuZmZzX3ZhbHVlcworICAgICAgICBpZiBmb250IDw+IE5vbmU6CisgICAgICAgICAgICBmbnVtID0gc2VsZi5mb250bmFtZXMuaW5kZXgoZm9udCkKKyAgICAgICAgICAgIHNlbGYuZm9udGl0ZW1zW2ZudW1dLmNoZWNrKDApCisgICAgICAgIGlmIGZhY2UgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmZhY2VpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIGZhY2UgJiAoMTw8aSk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZmFjZWl0ZW1zW2ldLmNoZWNrKDApCisgICAgICAgIGlmIHNpemUgPD4gTm9uZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLnNpemVpdGVtcykpOgorICAgICAgICAgICAgICAgIGlmIFNJWkVTW2ldID09IHNpemU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zW2ldLmNoZWNrKDApCisKKyAgICAgICAgc2VsZi5mZnNfdmFsdWVzID0gaW5mbworICAgICAgICAjIFNldCBuZXcgY2hlY2ttYXJrcworICAgICAgICBmb250LCBmYWNlLCBzaXplID0gc2VsZi5mZnNfdmFsdWVzCisgICAgICAgIGlmIGZvbnQgPD4gTm9uZToKKyAgICAgICAgICAgIGZudW0gPSBzZWxmLmZvbnRuYW1lcy5pbmRleChmb250KQorICAgICAgICAgICAgc2VsZi5mb250aXRlbXNbZm51bV0uY2hlY2soMSkKKyAgICAgICAgaWYgZmFjZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuZmFjZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgZmFjZSAmICgxPDxpKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWNlaXRlbXNbaV0uY2hlY2soMSkKKyAgICAgICAgaWYgc2l6ZSA8PiBOb25lOgorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuc2l6ZWl0ZW1zKSk6CisgICAgICAgICAgICAgICAgaWYgU0laRVNbaV0gPT0gc2l6ZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uY2hlY2soMSkKKyAgICAgICAgIyBTZXQgb3V0bGluZS9ub3JtYWwgZm9yIHNpemVzCisgICAgICAgIGlmIGZvbnQ6CisgICAgICAgICAgICBleGlzdHMgPSBnZXRmb250c2l6ZXMoZm9udCwgU0laRVMpCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5zaXplaXRlbXMpKToKKyAgICAgICAgICAgICAgICBpZiBleGlzdHNbaV06CisgICAgICAgICAgICAgICAgICAgIHNlbGYuc2l6ZWl0ZW1zW2ldLnNldHN0eWxlKDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zaXplaXRlbXNbaV0uc2V0c3R5bGUoOCkKKworICAgICMKKyAgICAjIEFwcGxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBXQVNURSIpCisKKyAgICAjCisgICAgIyBGaWxlIG1lbnUKKyAgICAjCisKKyAgICBkZWYgb3BlbihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMCkKKworICAgIGRlZiBvcGVuZmlsZShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX29wZW4oMSkKKworICAgIGRlZiBfb3BlbihzZWxmLCBhc2tmaWxlKToKKyAgICAgICAgaWYgYXNrZmlsZToKKyAgICAgICAgICAgIHBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oJ1RFWFQnLCkpCisgICAgICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpWy0xXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZwID0gb3BlbihwYXRoLCAncmInKSAjIE5PVEUgYmluYXJ5LCB3ZSBuZWVkIGNyIGFzIGVuZC1vZi1saW5lCisgICAgICAgICAgICAgICAgZGF0YSA9IGZwLnJlYWQoKQorICAgICAgICAgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yLCBhcmc6CisgICAgICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiSU9FUlJPUjogJXIiICUgKGFyZywpKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcGF0aCA9IE5vbmUKKyAgICAgICAgICAgIG5hbWUgPSAiVW50aXRsZWQgJWQiJXNlbGYubnVtCisgICAgICAgICAgICBkYXRhID0gJycKKyAgICAgICAgdyA9IFdhc3RlV2luZG93KHNlbGYpCisgICAgICAgIHcub3BlbihwYXRoLCBuYW1lLCBkYXRhKQorICAgICAgICBzZWxmLm51bSA9IHNlbGYubnVtICsgMQorCisgICAgZGVmIGNsb3Nld2luKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5jbG9zZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBzYXZlYXMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZV9hcygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKworICAgIGRlZiBxdWl0KHNlbGYsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHcuY2xvc2UoKQorICAgICAgICBpZiBzZWxmLl93aW5kb3dzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgIworICAgICMgRWRpdCBtZW51CisgICAgIworCisgICAgZGVmIHVuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfdW5kbygpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY3V0KHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY29weShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jb3B5KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgIGRlZiBwYXN0ZShzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9wYXN0ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY2xlYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgIworICAgICMgT3RoZXIgc3R1ZmYKKyAgICAjCisKKyAgICBkZWYgaWRsZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuZG9faWRsZShldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFFkLlNldEN1cnNvcihRZC5HZXRRREdsb2JhbHNBcnJvdygpKQorCiBkZWYgZ2V0Zm9udG5hbWVzKCk6Ci0JbmFtZXMgPSBbXQotCWZvciBpIGluIHJhbmdlKDI1Nik6Ci0JCW4gPSBGbS5HZXRGb250TmFtZShpKQotCQlpZiBuOiBuYW1lcy5hcHBlbmQobikKLQlyZXR1cm4gbmFtZXMKLQkKKyAgICBuYW1lcyA9IFtdCisgICAgZm9yIGkgaW4gcmFuZ2UoMjU2KToKKyAgICAgICAgbiA9IEZtLkdldEZvbnROYW1lKGkpCisgICAgICAgIGlmIG46IG5hbWVzLmFwcGVuZChuKQorICAgIHJldHVybiBuYW1lcworCiBkZWYgZ2V0Zm9udHNpemVzKG5hbWUsIHNpemVzKToKLQlleGlzdCA9IFtdCi0JbnVtID0gRm0uR2V0Rk51bShuYW1lKQotCWZvciBzeiBpbiBzaXplczoKLQkJaWYgRm0uUmVhbEZvbnQobnVtLCBzeik6Ci0JCQlleGlzdC5hcHBlbmQoMSkKLQkJZWxzZToKLQkJCWV4aXN0LmFwcGVuZCgwKQotCXJldHVybiBleGlzdAorICAgIGV4aXN0ID0gW10KKyAgICBudW0gPSBGbS5HZXRGTnVtKG5hbWUpCisgICAgZm9yIHN6IGluIHNpemVzOgorICAgICAgICBpZiBGbS5SZWFsRm9udChudW0sIHN6KToKKyAgICAgICAgICAgIGV4aXN0LmFwcGVuZCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZXhpc3QuYXBwZW5kKDApCisgICAgcmV0dXJuIGV4aXN0CiAKIGRlZiBtYWluKCk6Ci0JQXBwID0gV2VkKCkKLQlBcHAubWFpbmxvb3AoKQotCQorICAgIEFwcCA9IFdlZCgpCisgICAgQXBwLm1haW5sb29wKCkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKLQkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9EZW1vL3dhc3RlL3dlZC5weSBiL01hYy9EZW1vL3dhc3RlL3dlZC5weQppbmRleCA1ZDg0YjQwLi4yOGVlOTM4IDEwMDY0NAotLS0gYS9NYWMvRGVtby93YXN0ZS93ZWQucHkKKysrIGIvTWFjL0RlbW8vd2FzdGUvd2VkLnB5CkBAIC0xNSw0MTMgKzE1LDQxMiBAQAogaW1wb3J0IEVhc3lEaWFsb2dzCiAKIFVORE9MQUJFTFMgPSBbICMgSW5kZXhlZCBieSBXRUdldFVuZG9JbmZvKCkgdmFsdWUKLQlOb25lLCAiIiwgInR5cGluZyIsICJDdXQiLCAiUGFzdGUiLCAiQ2xlYXIiLCAiRHJhZyIsICJTdHlsZSJdCi0JCisgICAgICAgIE5vbmUsICIiLCAidHlwaW5nIiwgIkN1dCIsICJQYXN0ZSIsICJDbGVhciIsICJEcmFnIiwgIlN0eWxlIl0KKwogQklHUkVHSU9OPVFkLk5ld1JnbigpCiBRZC5TZXRSZWN0UmduKEJJR1JFR0lPTiwgLTE2MDAwLCAtMTYwMDAsIDE2MDAwLCAxNjAwMCkKIAogY2xhc3MgV2FzdGVXaW5kb3coU2Nyb2xsZWRXaW5kb3cpOgotCWRlZiBvcGVuKHNlbGYsIHBhdGgsIG5hbWUsIGRhdGEpOgotCQlzZWxmLnBhdGggPSBwYXRoCi0JCXNlbGYubmFtZSA9IG5hbWUKLQkJciA9IHdpbmRvd2JvdW5kcyg0MDAsIDQwMCkKLQkJdyA9IFdpbi5OZXdXaW5kb3cociwgbmFtZSwgMSwgMCwgLTEsIDEsIDApCi0JCXNlbGYud2lkID0gdwotCQl2ciA9IDAsIDAsIHJbMl0tclswXS0xNSwgclszXS1yWzFdLTE1Ci0JCWRyID0gKDAsIDAsIDEwMjQwLCAwKQotCQlRZC5TZXRQb3J0KHcpCi0JCVFkLlRleHRGb250KDQpCi0JCVFkLlRleHRTaXplKDkpCi0JCWZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUgfCBcCi0JCQlXQVNURWNvbnN0LndlRG9Nb25vU3R5bGVkIHwgV0FTVEVjb25zdC53ZURvVW5kbwotCQlzZWxmLnRlZCA9IHdhc3RlLldFTmV3KGRyLCB2ciwgZmxhZ3MpCi0JCXNlbGYudGVkdGV4dGhhbmRsZSA9IFJlcy5SZXNvdXJjZShkYXRhKQotCQlzZWxmLnRlZC5XRVVzZVRleHQoc2VsZi50ZWR0ZXh0aGFuZGxlKQotCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQl3LkRyYXdHcm93SWNvbigpCi0JCXNlbGYuc2Nyb2xsYmFycygpCi0JCXNlbGYuY2hhbmdlZCA9IDAKLQkJc2VsZi5kb19wb3N0b3BlbigpCi0JCXNlbGYuZG9fYWN0aXZhdGUoMSwgTm9uZSkKLQkJCi0JZGVmIGRvX2lkbGUoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlzZWxmLnRlZC5XRUlkbGUoKQkKLQkJaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6Ci0JCQlyZXR1cm4KLQkJUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCi0JCQotCWRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6Ci0JCWRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQotCQl2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKLSMjCQlwcmludCBkciwgdnIsIHZ4LCB2eQotCQlyZXR1cm4gdngsIHZ5Ci0JCQotCWRlZiBzY3JvbGxiYXJfY2FsbGJhY2soc2VsZiwgd2hpY2gsIHdoYXQsIHZhbHVlKToKLQkJaWYgd2hpY2ggPT0gJ3knOgotCQkJaWYgd2hhdCA9PSAnc2V0JzoKLQkJCQloZWlnaHQgPSBzZWxmLnRlZC5XRUdldEhlaWdodCgwLCAweDNmZmZmZmZmKQotCQkJCWN1ciA9IHNlbGYuZ2V0c2Nyb2xsYmFydmFsdWVzKClbMV0KLQkJCQlkZWx0YSA9IChjdXItdmFsdWUpKmhlaWdodC8zMjc2NwotCQkJaWYgd2hhdCA9PSAnLSc6Ci0JCQkJdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKLQkJCQl0b3BsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHRvcGxpbmVfb2ZmKQotCQkJCWRlbHRhID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCi0JCQllbGlmIHdoYXQgPT0gJy0tJzoKLQkJCQlkZWx0YSA9IChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KClbM10tMTApCi0JCQkJaWYgZGVsdGEgPD0gMDoKLQkJCQkJZGVsdGEgPSAxMCAjIFJhbmRvbSB2YWx1ZQotCQkJZWxpZiB3aGF0ID09ICcrJzoKLQkJCQkjIFhYWFggV3Jvbmc6IHNob3VsZCBiZSBib3R0b20gbGluZSBzaXplCi0JCQkJdG9wbGluZV9vZmYsZHVtbXkgPSBzZWxmLnRlZC5XRUdldE9mZnNldCgoMSwxKSkKLQkJCQl0b3BsaW5lX251bSA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHRvcGxpbmVfb2ZmKQotCQkJCWRlbHRhID0gLXNlbGYudGVkLldFR2V0SGVpZ2h0KHRvcGxpbmVfbnVtLCB0b3BsaW5lX251bSsxKQotCQkJZWxpZiB3aGF0ID09ICcrKyc6Ci0JCQkJZGVsdGEgPSAtKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKLQkJCQlpZiBkZWx0YSA+PSAwOgotCQkJCQlkZWx0YSA9IC0xMAotCQkJc2VsZi50ZWQuV0VTY3JvbGwoMCwgZGVsdGEpCi0jIwkJCXByaW50ICdTQ1JPTEwgWScsIGRlbHRhCi0JCWVsc2U6Ci0JCQlpZiB3aGF0ID09ICdzZXQnOgotCQkJCXJldHVybiAjIFhYWFgKLQkJCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQl3aW53aWR0aCA9IHZyWzJdLXZyWzBdCi0JCQlpZiB3aGF0ID09ICctJzoKLQkJCQlkZWx0YSA9IHdpbndpZHRoLzEwCi0JCQllbGlmIHdoYXQgPT0gJy0tJzoKLQkJCQlkZWx0YSA9IHdpbndpZHRoLzIKLQkJCWVsaWYgd2hhdCA9PSAnKyc6Ci0JCQkJZGVsdGEgPSAtd2lud2lkdGgvMTAKLQkJCWVsaWYgd2hhdCA9PSAnKysnOgotCQkJCWRlbHRhID0gLXdpbndpZHRoLzIKLQkJCXNlbGYudGVkLldFU2Nyb2xsKGRlbHRhLCAwKQotCQkjIFBpbiB0aGUgc2Nyb2xsCi0JCWwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJaWYgdCA+IDAgb3IgbCA+IDA6Ci0JCQlkeCA9IGR5ID0gMAotCQkJaWYgdCA+IDA6IGR5ID0gLXQKLQkJCWlmIGwgPiAwOiBkeCA9IC1sCi0jIwkJCXByaW50ICdFeHRyYSBzY3JvbGwnLCBkeCwgZHkKLQkJCXNlbGYudGVkLldFU2Nyb2xsKGR4LCBkeSkKLQkJZWxpZiBiIDwgdmI6Ci0jIwkJCXByaW50ICdFeHRyYSBkb3duc2Nyb2xsJywgYi12YgotCQkJc2VsZi50ZWQuV0VTY3JvbGwoMCwgYi12YikKKyAgICBkZWYgb3BlbihzZWxmLCBwYXRoLCBuYW1lLCBkYXRhKToKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorICAgICAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgICAgIHIgPSB3aW5kb3dib3VuZHMoNDAwLCA0MDApCisgICAgICAgIHcgPSBXaW4uTmV3V2luZG93KHIsIG5hbWUsIDEsIDAsIC0xLCAxLCAwKQorICAgICAgICBzZWxmLndpZCA9IHcKKyAgICAgICAgdnIgPSAwLCAwLCByWzJdLXJbMF0tMTUsIHJbM10tclsxXS0xNQorICAgICAgICBkciA9ICgwLCAwLCAxMDI0MCwgMCkKKyAgICAgICAgUWQuU2V0UG9ydCh3KQorICAgICAgICBRZC5UZXh0Rm9udCg0KQorICAgICAgICBRZC5UZXh0U2l6ZSg5KQorICAgICAgICBmbGFncyA9IFdBU1RFY29uc3Qud2VEb0F1dG9TY3JvbGwgfCBXQVNURWNvbnN0LndlRG9PdXRsaW5lSGlsaXRlIHwgXAorICAgICAgICAgICAgICAgIFdBU1RFY29uc3Qud2VEb01vbm9TdHlsZWQgfCBXQVNURWNvbnN0LndlRG9VbmRvCisgICAgICAgIHNlbGYudGVkID0gd2FzdGUuV0VOZXcoZHIsIHZyLCBmbGFncykKKyAgICAgICAgc2VsZi50ZWR0ZXh0aGFuZGxlID0gUmVzLlJlc291cmNlKGRhdGEpCisgICAgICAgIHNlbGYudGVkLldFVXNlVGV4dChzZWxmLnRlZHRleHRoYW5kbGUpCisgICAgICAgIHNlbGYudGVkLldFQ2FsVGV4dCgpCisgICAgICAgIHcuRHJhd0dyb3dJY29uKCkKKyAgICAgICAgc2VsZi5zY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMAorICAgICAgICBzZWxmLmRvX3Bvc3RvcGVuKCkKKyAgICAgICAgc2VsZi5kb19hY3RpdmF0ZSgxLCBOb25lKQogCi0JCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KToKLSMjCQlwcmludCAiQUNUSVZBVEUiLCBvbm9mZgotCQlRZC5TZXRQb3J0KHNlbGYud2lkKQotCQlTY3JvbGxlZFdpbmRvdy5kb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZ0KQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLldFQWN0aXZhdGUoKQotCQkJc2VsZi5wYXJlbnQuYWN0aXZlID0gc2VsZgotCQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCWVsc2U6Ci0JCQlzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgIGRlZiBkb19pZGxlKHNlbGYsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgUWQuU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgc2VsZi50ZWQuV0VJZGxlKCkKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VBZGp1c3RDdXJzb3Iod2hlcmUsIEJJR1JFR0lPTik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuU2V0Q3Vyc29yKFFkLkdldFFER2xvYmFsc0Fycm93KCkpCiAKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpZCwgZXZlbnQpOgotCQlyZWdpb24gPSB3aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgotCQlpZiBRZC5FbXB0eVJnbihyZWdpb24pOgotCQkJcmV0dXJuCi0JCVFkLkVyYXNlUmduKHJlZ2lvbikKLQkJc2VsZi50ZWQuV0VVcGRhdGUocmVnaW9uKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkKLQlkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgotCQlsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCXZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQotCQlzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQotCQlzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCi0JCVNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQotCQkKLQlkZWYgZG9fY29udGVudGNsaWNrKHNlbGYsIGxvY2FsLCBtb2RpZmllcnMsIGV2dCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2dAotCQlzZWxmLnRlZC5XRUNsaWNrKGxvY2FsLCBtb2RpZmllcnMsIHdoZW4pCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgIGRlZiBnZXRzY3JvbGxiYXJ2YWx1ZXMoc2VsZik6CisgICAgICAgIGRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZ4ID0gc2VsZi5zY2FsZWJhcnZhbHVlKGRyWzBdLCBkclsyXSwgdnJbMF0sIHZyWzJdKQorICAgICAgICB2eSA9IHNlbGYuc2NhbGViYXJ2YWx1ZShkclsxXSwgZHJbM10sIHZyWzFdLCB2clszXSkKKyMjICAgICAgICAgICAgICBwcmludCBkciwgdnIsIHZ4LCB2eQorICAgICAgICByZXR1cm4gdngsIHZ5CiAKLQlkZWYgZG9fY2hhcihzZWxmLCBjaCwgZXZlbnQpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlzZWxmLnRlZC5XRUtleShvcmQoY2gpLCBtb2RpZmllcnMpCi0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5jaGFuZ2VkOgotCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJc2VsZi5tZW51X3NhdmUoKQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6Ci0JCQlzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlkZWwgc2VsZi50ZWQKLQkJZGVsIHNlbGYudGVkdGV4dGhhbmRsZQotCQlzZWxmLmRvX3Bvc3RjbG9zZSgpCi0JCQotCWRlZiBtZW51X3NhdmUoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnBhdGg6Ci0JCQlzZWxmLm1lbnVfc2F2ZV9hcygpCi0JCQlyZXR1cm4gIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKLSMjCQlwcmludCAnU2F2aW5nIHRvICcsIHNlbGYucGF0aAotCQlkaGFuZGxlID0gc2VsZi50ZWQuV0VHZXRUZXh0KCkKLQkJZGF0YSA9IGRoYW5kbGUuZGF0YQotCQlmcCA9IG9wZW4oc2VsZi5wYXRoLCAnd2InKSAgIyBOT1RFOiB3YiwgYmVjYXVzZSBkYXRhIGhhcyBDUiBmb3IgZW5kLW9mLWxpbmUKLQkJZnAud3JpdGUoZGF0YSkKLQkJaWYgZGF0YVstMV0gPD4gJ1xyJzogZnAud3JpdGUoJ1xyJykKLQkJZnAuY2xvc2UoKQotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCQotCWRlZiBtZW51X3NhdmVfYXMoc2VsZik6Ci0JCXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzOicpCi0JCWlmIG5vdCBwYXRoOiByZXR1cm4KLQkJc2VsZi5wYXRoID0gcGF0aAotCQlzZWxmLm5hbWUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLm5hbWUpCi0JCXNlbGYubWVudV9zYXZlKCkKLQkJCi0JZGVmIG1lbnVfY3V0KHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUN1dCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQotCWRlZiBtZW51X2NvcHkoc2VsZik6Ci0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCXNlbGYudGVkLldFQ29weSgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQkKLQlkZWYgbWVudV9wYXN0ZShzZWxmKToKLQkJc2VsZi50ZWQuV0VTZWxWaWV3KCkKLQkJc2VsZi50ZWQuV0VQYXN0ZSgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQotCWRlZiBtZW51X2NsZWFyKHNlbGYpOgotCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQlzZWxmLnRlZC5XRURlbGV0ZSgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQotCQlzZWxmLmNoYW5nZWQgPSAxCisgICAgZGVmIHNjcm9sbGJhcl9jYWxsYmFjayhzZWxmLCB3aGljaCwgd2hhdCwgdmFsdWUpOgorICAgICAgICBpZiB3aGljaCA9PSAneSc6CisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIGhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDB4M2ZmZmZmZmYpCisgICAgICAgICAgICAgICAgY3VyID0gc2VsZi5nZXRzY3JvbGxiYXJ2YWx1ZXMoKVsxXQorICAgICAgICAgICAgICAgIGRlbHRhID0gKGN1ci12YWx1ZSkqaGVpZ2h0LzMyNzY3CisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICB0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQorICAgICAgICAgICAgICAgIHRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCisgICAgICAgICAgICAgICAgZGVsdGEgPSBzZWxmLnRlZC5XRUdldEhlaWdodCh0b3BsaW5lX251bSwgdG9wbGluZV9udW0rMSkKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnLS0nOgorICAgICAgICAgICAgICAgIGRlbHRhID0gKHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKVszXS0xMCkKKyAgICAgICAgICAgICAgICBpZiBkZWx0YSA8PSAwOgorICAgICAgICAgICAgICAgICAgICBkZWx0YSA9IDEwICMgUmFuZG9tIHZhbHVlCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysnOgorICAgICAgICAgICAgICAgICMgWFhYWCBXcm9uZzogc2hvdWxkIGJlIGJvdHRvbSBsaW5lIHNpemUKKyAgICAgICAgICAgICAgICB0b3BsaW5lX29mZixkdW1teSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KCgxLDEpKQorICAgICAgICAgICAgICAgIHRvcGxpbmVfbnVtID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUodG9wbGluZV9vZmYpCisgICAgICAgICAgICAgICAgZGVsdGEgPSAtc2VsZi50ZWQuV0VHZXRIZWlnaHQodG9wbGluZV9udW0sIHRvcGxpbmVfbnVtKzEpCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJysrJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IC0oc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpWzNdLTEwKQorICAgICAgICAgICAgICAgIGlmIGRlbHRhID49IDA6CisgICAgICAgICAgICAgICAgICAgIGRlbHRhID0gLTEwCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKKyMjICAgICAgICAgICAgICAgICAgICAgIHByaW50ICdTQ1JPTEwgWScsIGRlbHRhCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiB3aGF0ID09ICdzZXQnOgorICAgICAgICAgICAgICAgIHJldHVybiAjIFhYWFgKKyAgICAgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgICAgICB3aW53aWR0aCA9IHZyWzJdLXZyWzBdCisgICAgICAgICAgICBpZiB3aGF0ID09ICctJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzEwCisgICAgICAgICAgICBlbGlmIHdoYXQgPT0gJy0tJzoKKyAgICAgICAgICAgICAgICBkZWx0YSA9IHdpbndpZHRoLzIKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKyc6CisgICAgICAgICAgICAgICAgZGVsdGEgPSAtd2lud2lkdGgvMTAKKyAgICAgICAgICAgIGVsaWYgd2hhdCA9PSAnKysnOgorICAgICAgICAgICAgICAgIGRlbHRhID0gLXdpbndpZHRoLzIKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2Nyb2xsKGRlbHRhLCAwKQorICAgICAgICAjIFBpbiB0aGUgc2Nyb2xsCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgaWYgdCA+IDAgb3IgbCA+IDA6CisgICAgICAgICAgICBkeCA9IGR5ID0gMAorICAgICAgICAgICAgaWYgdCA+IDA6IGR5ID0gLXQKKyAgICAgICAgICAgIGlmIGwgPiAwOiBkeCA9IC1sCisjIyAgICAgICAgICAgICAgICAgICAgICBwcmludCAnRXh0cmEgc2Nyb2xsJywgZHgsIGR5CisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbChkeCwgZHkpCisgICAgICAgIGVsaWYgYiA8IHZiOgorIyMgICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ0V4dHJhIGRvd25zY3JvbGwnLCBiLXZiCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBiLXZiKQogCi0JZGVmIG1lbnVfdW5kbyhzZWxmKToKLQkJc2VsZi50ZWQuV0VVbmRvKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCi0JCQkJCi0JZGVmIGhhdmVfc2VsZWN0aW9uKHNlbGYpOgotCQlzdGFydCwgc3RvcCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJcmV0dXJuIHN0YXJ0IDwgc3RvcAotCQkKLQlkZWYgY2FuX3Bhc3RlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50ZWQuV0VDYW5QYXN0ZSgpCi0JCQotCWRlZiBjYW5fdW5kbyhzZWxmKToKLQkJd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKLQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQlpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQotCQlpZiByZWRvOgotCQkJcmV0dXJuICJSZWRvICIrd2hpY2gKLQkJZWxzZToKLQkJCXJldHVybiAiVW5kbyAiK3doaWNoCisKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCk6CisjIyAgICAgICAgICAgICAgcHJpbnQgIkFDVElWQVRFIiwgb25vZmYKKyAgICAgICAgUWQuU2V0UG9ydChzZWxmLndpZCkKKyAgICAgICAgU2Nyb2xsZWRXaW5kb3cuZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2dCkKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUFjdGl2YXRlKCkKKyAgICAgICAgICAgIHNlbGYucGFyZW50LmFjdGl2ZSA9IHNlbGYKKyAgICAgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2lkLCBldmVudCk6CisgICAgICAgIHJlZ2lvbiA9IHdpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCisgICAgICAgIGlmIFFkLkVtcHR5UmduKHJlZ2lvbik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgUWQuRXJhc2VSZ24ocmVnaW9uKQorICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShyZWdpb24pCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9fcG9zdHJlc2l6ZShzZWxmLCB3aWR0aCwgaGVpZ2h0LCB3aW5kb3cpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZyID0gKGwsIHQsIGwrd2lkdGgtMTUsIHQraGVpZ2h0LTE1KQorICAgICAgICBzZWxmLnRlZC5XRVNldFZpZXdSZWN0KHZyKQorICAgICAgICBzZWxmLndpZC5JbnZhbFdpbmRvd1JlY3QodnIpCisgICAgICAgIFNjcm9sbGVkV2luZG93LmRvX3Bvc3RyZXNpemUoc2VsZiwgd2lkdGgsIGhlaWdodCwgd2luZG93KQorCisgICAgZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBsb2NhbCwgbW9kaWZpZXJzLCBldnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldnQKKyAgICAgICAgc2VsZi50ZWQuV0VDbGljayhsb2NhbCwgbW9kaWZpZXJzLCB3aGVuKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBkb19jaGFyKHNlbGYsIGNoLCBldmVudCk6CisgICAgICAgIHNlbGYudGVkLldFU2VsVmlldygpCisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHNlbGYudGVkLldFS2V5KG9yZChjaCksIG1vZGlmaWVycykKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jaGFuZ2VkOgorICAgICAgICAgICAgc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlIHdpbmRvdyAiJXMiIGJlZm9yZSBjbG9zaW5nPyclc2VsZi5uYW1lLCAxKQorICAgICAgICAgICAgaWYgc2F2ZSA+IDA6CisgICAgICAgICAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXJlbnQuYWN0aXZlID09IHNlbGY6CisgICAgICAgICAgICBzZWxmLnBhcmVudC5hY3RpdmUgPSBOb25lCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBkZWwgc2VsZi50ZWQKKyAgICAgICAgZGVsIHNlbGYudGVkdGV4dGhhbmRsZQorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgbWVudV9zYXZlKHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgc2VsZi5tZW51X3NhdmVfYXMoKQorICAgICAgICAgICAgcmV0dXJuICMgV2lsbCBjYWxsIHVzIHJlY3Vyc2l2ZWx5CisjIyAgICAgICAgICAgICAgcHJpbnQgJ1NhdmluZyB0byAnLCBzZWxmLnBhdGgKKyAgICAgICAgZGhhbmRsZSA9IHNlbGYudGVkLldFR2V0VGV4dCgpCisgICAgICAgIGRhdGEgPSBkaGFuZGxlLmRhdGEKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgTk9URTogd2IsIGJlY2F1c2UgZGF0YSBoYXMgQ1IgZm9yIGVuZC1vZi1saW5lCisgICAgICAgIGZwLndyaXRlKGRhdGEpCisgICAgICAgIGlmIGRhdGFbLTFdIDw+ICdccic6IGZwLndyaXRlKCdccicpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMAorCisgICAgZGVmIG1lbnVfc2F2ZV9hcyhzZWxmKToKKyAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6JykKKyAgICAgICAgaWYgbm90IHBhdGg6IHJldHVybgorICAgICAgICBzZWxmLnBhdGggPSBwYXRoCisgICAgICAgIHNlbGYubmFtZSA9IG9zLnBhdGguc3BsaXQoc2VsZi5wYXRoKVstMV0KKyAgICAgICAgc2VsZi53aWQuU2V0V1RpdGxlKHNlbGYubmFtZSkKKyAgICAgICAgc2VsZi5tZW51X3NhdmUoKQorCisgICAgZGVmIG1lbnVfY3V0KHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUN1dCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgbWVudV9jb3B5KHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUNvcHkoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBtZW51X3Bhc3RlKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRVBhc3RlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5wYXJlbnQudXBkYXRlbWVudWJhcigpCisgICAgICAgIHNlbGYuY2hhbmdlZCA9IDEKKworICAgIGRlZiBtZW51X2NsZWFyKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRURlbGV0ZSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYucGFyZW50LnVwZGF0ZW1lbnViYXIoKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisKKyAgICBkZWYgbWVudV91bmRvKHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVVuZG8oKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICBzZWxmLnBhcmVudC51cGRhdGVtZW51YmFyKCkKKworICAgIGRlZiBoYXZlX3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc3RhcnQsIHN0b3AgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHJldHVybiBzdGFydCA8IHN0b3AKKworICAgIGRlZiBjYW5fcGFzdGUoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlZC5XRUNhblBhc3RlKCkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmKToKKyAgICAgICAgd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKKyAgICAgICAgd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQorICAgICAgICBpZiB3aGljaCA9PSBOb25lOiByZXR1cm4gTm9uZQorICAgICAgICBpZiByZWRvOgorICAgICAgICAgICAgcmV0dXJuICJSZWRvICIrd2hpY2gKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAiVW5kbyAiK3doaWNoCiAKIGNsYXNzIFdlZChBcHBsaWNhdGlvbik6Ci0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlBcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmKQotCQlzZWxmLm51bSA9IDAKLQkJc2VsZi5hY3RpdmUgPSBOb25lCi0JCXNlbGYudXBkYXRlbWVudWJhcigpCi0JCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQlzZWxmLmZpbGVtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCXNlbGYubmV3aXRlbSA9IE1lbnVJdGVtKG0sICJOZXcgd2luZG93IiwgIk4iLCBzZWxmLm9wZW4pCi0JCXNlbGYub3Blbml0ZW0gPSBNZW51SXRlbShtLCAiT3Blbi4uLiIsICJPIiwgc2VsZi5vcGVuZmlsZSkKLQkJc2VsZi5jbG9zZWl0ZW0gPSBNZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsIHNlbGYuY2xvc2V3aW4pCi0JCW0uYWRkc2VwYXJhdG9yKCkKLQkJc2VsZi5zYXZlaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIiwgIlMiLCBzZWxmLnNhdmUpCi0JCXNlbGYuc2F2ZWFzaXRlbSA9IE1lbnVJdGVtKG0sICJTYXZlIGFzLi4uIiwgIiIsIHNlbGYuc2F2ZWFzKQotCQltLmFkZHNlcGFyYXRvcigpCi0JCXNlbGYucXVpdGl0ZW0gPSBNZW51SXRlbShtLCAiUXVpdCIsICJRIiwgc2VsZi5xdWl0KQotCQkKLQkJc2VsZi5lZGl0bWVudSA9IG0gPSBNZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQlzZWxmLnVuZG9pdGVtID0gTWVudUl0ZW0obSwgIlVuZG8iLCAiWiIsIHNlbGYudW5kbykKLQkJc2VsZi5jdXRpdGVtID0gTWVudUl0ZW0obSwgIkN1dCIsICJYIiwgc2VsZi5jdXQpCi0JCXNlbGYuY29weWl0ZW0gPSBNZW51SXRlbShtLCAiQ29weSIsICJDIiwgc2VsZi5jb3B5KQotCQlzZWxmLnBhc3RlaXRlbSA9IE1lbnVJdGVtKG0sICJQYXN0ZSIsICJWIiwgc2VsZi5wYXN0ZSkKLQkJc2VsZi5jbGVhcml0ZW0gPSBNZW51SXRlbShtLCAiQ2xlYXIiLCAiIiwgc2VsZi5jbGVhcikKLQkJCi0JCSMgR3JvdXBzIG9mIGl0ZW1zIGVuYWJsZWQgdG9nZXRoZXI6Ci0JCXNlbGYud2luZG93Z3JvdXAgPSBbc2VsZi5jbG9zZWl0ZW0sIHNlbGYuc2F2ZWl0ZW0sIHNlbGYuc2F2ZWFzaXRlbSwgc2VsZi5lZGl0bWVudV0KLQkJc2VsZi5mb2N1c2dyb3VwID0gW3NlbGYuY3V0aXRlbSwgc2VsZi5jb3B5aXRlbSwgc2VsZi5jbGVhcml0ZW1dCi0JCXNlbGYud2luZG93Z3JvdXBfb24gPSAtMQotCQlzZWxmLmZvY3VzZ3JvdXBfb24gPSAtMQotCQlzZWxmLnBhc3RlZ3JvdXBfb24gPSAtMQotCQlzZWxmLnVuZG9fbGFiZWwgPSAibmV2ZXIiCi0JCQotCWRlZiB1cGRhdGVtZW51YmFyKHNlbGYpOgotCQljaGFuZ2VkID0gMAotCQlvbiA9IChzZWxmLmFjdGl2ZSA8PiBOb25lKQotCQlpZiBvbiA8PiBzZWxmLndpbmRvd2dyb3VwX29uOgotCQkJZm9yIG0gaW4gc2VsZi53aW5kb3dncm91cDoKLQkJCQltLmVuYWJsZShvbikKLQkJCXNlbGYud2luZG93Z3JvdXBfb24gPSBvbgotCQkJY2hhbmdlZCA9IDEKLQkJaWYgb246Ci0JCQkjIG9ubHkgaWYgd2UgaGF2ZSBhbiBlZGl0IG1lbnUKLQkJCW9uID0gc2VsZi5hY3RpdmUuaGF2ZV9zZWxlY3Rpb24oKQotCQkJaWYgb24gPD4gc2VsZi5mb2N1c2dyb3VwX29uOgotCQkJCWZvciBtIGluIHNlbGYuZm9jdXNncm91cDoKLQkJCQkJbS5lbmFibGUob24pCi0JCQkJc2VsZi5mb2N1c2dyb3VwX29uID0gb24KLQkJCQljaGFuZ2VkID0gMQotCQkJb24gPSBzZWxmLmFjdGl2ZS5jYW5fcGFzdGUoKQotCQkJaWYgb24gPD4gc2VsZi5wYXN0ZWdyb3VwX29uOgotCQkJCXNlbGYucGFzdGVpdGVtLmVuYWJsZShvbikKLQkJCQlzZWxmLnBhc3RlZ3JvdXBfb24gPSBvbgotCQkJCWNoYW5nZWQgPSAxCi0JCQlvbiA9IHNlbGYuYWN0aXZlLmNhbl91bmRvKCkKLQkJCWlmIG9uIDw+IHNlbGYudW5kb19sYWJlbDoKLQkJCQlpZiBvbjoKLQkJCQkJc2VsZi51bmRvaXRlbS5lbmFibGUoMSkKLQkJCQkJc2VsZi51bmRvaXRlbS5zZXR0ZXh0KG9uKQotCQkJCQlzZWxmLnVuZG9fbGFiZWwgPSBvbgotCQkJCWVsc2U6Ci0JCQkJCXNlbGYudW5kb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byB1bmRvIikKLQkJCQkJc2VsZi51bmRvaXRlbS5lbmFibGUoMCkKLQkJCQljaGFuZ2VkID0gMQotCQlpZiBjaGFuZ2VkOgotCQkJRHJhd01lbnVCYXIoKQorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgQXBwbGljYXRpb24uX19pbml0X18oc2VsZikKKyAgICAgICAgc2VsZi5udW0gPSAwCisgICAgICAgIHNlbGYuYWN0aXZlID0gTm9uZQorICAgICAgICBzZWxmLnVwZGF0ZW1lbnViYXIoKQogCi0JIwotCSMgQXBwbGUgbWVudQotCSMKLQkKLQlkZWYgZG9fYWJvdXQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJBIHNpbXBsZSBzaW5nbGUtZm9udCB0ZXh0IGVkaXRvciBiYXNlZCBvbiBXQVNURSIpCi0JCQkKLQkjCi0JIyBGaWxlIG1lbnUKLQkjCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZW1lbnUgPSBtID0gTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgc2VsZi5uZXdpdGVtID0gTWVudUl0ZW0obSwgIk5ldyB3aW5kb3ciLCAiTiIsIHNlbGYub3BlbikKKyAgICAgICAgc2VsZi5vcGVuaXRlbSA9IE1lbnVJdGVtKG0sICJPcGVuLi4uIiwgIk8iLCBzZWxmLm9wZW5maWxlKQorICAgICAgICBzZWxmLmNsb3NlaXRlbSA9IE1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgc2VsZi5jbG9zZXdpbikKKyAgICAgICAgbS5hZGRzZXBhcmF0b3IoKQorICAgICAgICBzZWxmLnNhdmVpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsIHNlbGYuc2F2ZSkKKyAgICAgICAgc2VsZi5zYXZlYXNpdGVtID0gTWVudUl0ZW0obSwgIlNhdmUgYXMuLi4iLCAiIiwgc2VsZi5zYXZlYXMpCisgICAgICAgIG0uYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgc2VsZi5xdWl0aXRlbSA9IE1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCBzZWxmLnF1aXQpCiAKLQlkZWYgb3BlbihzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX29wZW4oMCkKLQkJCi0JZGVmIG9wZW5maWxlKHNlbGYsICphcmdzKToKLQkJc2VsZi5fb3BlbigxKQorICAgICAgICBzZWxmLmVkaXRtZW51ID0gbSA9IE1lbnUoc2VsZi5tZW51YmFyLCAiRWRpdCIpCisgICAgICAgIHNlbGYudW5kb2l0ZW0gPSBNZW51SXRlbShtLCAiVW5kbyIsICJaIiwgc2VsZi51bmRvKQorICAgICAgICBzZWxmLmN1dGl0ZW0gPSBNZW51SXRlbShtLCAiQ3V0IiwgIlgiLCBzZWxmLmN1dCkKKyAgICAgICAgc2VsZi5jb3B5aXRlbSA9IE1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCBzZWxmLmNvcHkpCisgICAgICAgIHNlbGYucGFzdGVpdGVtID0gTWVudUl0ZW0obSwgIlBhc3RlIiwgIlYiLCBzZWxmLnBhc3RlKQorICAgICAgICBzZWxmLmNsZWFyaXRlbSA9IE1lbnVJdGVtKG0sICJDbGVhciIsICIiLCBzZWxmLmNsZWFyKQogCi0JZGVmIF9vcGVuKHNlbGYsIGFza2ZpbGUpOgotCQlpZiBhc2tmaWxlOgotCQkJcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgnVEVYVCcsKSkKLQkJCWlmIG5vdCBwYXRoOgotCQkJCXJldHVybgotCQkJbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aClbLTFdCi0JCQl0cnk6Ci0JCQkJZnAgPSBvcGVuKHBhdGgsICdyYicpICMgTk9URSBiaW5hcnksIHdlIG5lZWQgY3IgYXMgZW5kLW9mLWxpbmUKLQkJCQlkYXRhID0gZnAucmVhZCgpCi0JCQkJZnAuY2xvc2UoKQotCQkJZXhjZXB0IElPRXJyb3IsIGFyZzoKLQkJCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJJT0VSUk9SOiAlciIgJSAoYXJnLCkpCi0JCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQlwYXRoID0gTm9uZQotCQkJbmFtZSA9ICJVbnRpdGxlZCAlZCIlc2VsZi5udW0KLQkJCWRhdGEgPSAnJwotCQl3ID0gV2FzdGVXaW5kb3coc2VsZikKLQkJdy5vcGVuKHBhdGgsIG5hbWUsIGRhdGEpCi0JCXNlbGYubnVtID0gc2VsZi5udW0gKyAxCi0JCQotCWRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUuY2xvc2UoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgc2F2ZShzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JZGVmIHNhdmVhcyhzZWxmLCAqYXJncyk6Ci0JCWlmIHNlbGYuYWN0aXZlOgotCQkJc2VsZi5hY3RpdmUubWVudV9zYXZlX2FzKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCQotCQkKLQlkZWYgcXVpdChzZWxmLCAqYXJncyk6Ci0JCWZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl3LmNsb3NlKCkKLQkJaWYgc2VsZi5fd2luZG93czoKLQkJCXJldHVybgotCQlzZWxmLl9xdWl0KCkKLQkJCi0JIwotCSMgRWRpdCBtZW51Ci0JIwotCQotCWRlZiB1bmRvKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X3VuZG8oKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgY3V0KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2N1dCgpCi0JCWVsc2U6Ci0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCi0JCQotCWRlZiBjb3B5KHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NvcHkoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQotCQkKLQlkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQotCQllbHNlOgotCQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorICAgICAgICAjIEdyb3VwcyBvZiBpdGVtcyBlbmFibGVkIHRvZ2V0aGVyOgorICAgICAgICBzZWxmLndpbmRvd2dyb3VwID0gW3NlbGYuY2xvc2VpdGVtLCBzZWxmLnNhdmVpdGVtLCBzZWxmLnNhdmVhc2l0ZW0sIHNlbGYuZWRpdG1lbnVdCisgICAgICAgIHNlbGYuZm9jdXNncm91cCA9IFtzZWxmLmN1dGl0ZW0sIHNlbGYuY29weWl0ZW0sIHNlbGYuY2xlYXJpdGVtXQorICAgICAgICBzZWxmLndpbmRvd2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi5wYXN0ZWdyb3VwX29uID0gLTEKKyAgICAgICAgc2VsZi51bmRvX2xhYmVsID0gIm5ldmVyIgogCi0JZGVmIGNsZWFyKHNlbGYsICphcmdzKToKLQkJaWYgc2VsZi5hY3RpdmU6Ci0JCQlzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKLQkJZWxzZToKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKLQkJCi0JIwotCSMgT3RoZXIgc3R1ZmYKLQkjCQorICAgIGRlZiB1cGRhdGVtZW51YmFyKHNlbGYpOgorICAgICAgICBjaGFuZ2VkID0gMAorICAgICAgICBvbiA9IChzZWxmLmFjdGl2ZSA8PiBOb25lKQorICAgICAgICBpZiBvbiA8PiBzZWxmLndpbmRvd2dyb3VwX29uOgorICAgICAgICAgICAgZm9yIG0gaW4gc2VsZi53aW5kb3dncm91cDoKKyAgICAgICAgICAgICAgICBtLmVuYWJsZShvbikKKyAgICAgICAgICAgIHNlbGYud2luZG93Z3JvdXBfb24gPSBvbgorICAgICAgICAgICAgY2hhbmdlZCA9IDEKKyAgICAgICAgaWYgb246CisgICAgICAgICAgICAjIG9ubHkgaWYgd2UgaGF2ZSBhbiBlZGl0IG1lbnUKKyAgICAgICAgICAgIG9uID0gc2VsZi5hY3RpdmUuaGF2ZV9zZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5mb2N1c2dyb3VwX29uOgorICAgICAgICAgICAgICAgIGZvciBtIGluIHNlbGYuZm9jdXNncm91cDoKKyAgICAgICAgICAgICAgICAgICAgbS5lbmFibGUob24pCisgICAgICAgICAgICAgICAgc2VsZi5mb2N1c2dyb3VwX29uID0gb24KKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICAgICAgb24gPSBzZWxmLmFjdGl2ZS5jYW5fcGFzdGUoKQorICAgICAgICAgICAgaWYgb24gPD4gc2VsZi5wYXN0ZWdyb3VwX29uOgorICAgICAgICAgICAgICAgIHNlbGYucGFzdGVpdGVtLmVuYWJsZShvbikKKyAgICAgICAgICAgICAgICBzZWxmLnBhc3RlZ3JvdXBfb24gPSBvbgorICAgICAgICAgICAgICAgIGNoYW5nZWQgPSAxCisgICAgICAgICAgICBvbiA9IHNlbGYuYWN0aXZlLmNhbl91bmRvKCkKKyAgICAgICAgICAgIGlmIG9uIDw+IHNlbGYudW5kb19sYWJlbDoKKyAgICAgICAgICAgICAgICBpZiBvbjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5zZXR0ZXh0KG9uKQorICAgICAgICAgICAgICAgICAgICBzZWxmLnVuZG9fbGFiZWwgPSBvbgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudW5kb2l0ZW0uc2V0dGV4dCgiTm90aGluZyB0byB1bmRvIikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi51bmRvaXRlbS5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBjaGFuZ2VkID0gMQorICAgICAgICBpZiBjaGFuZ2VkOgorICAgICAgICAgICAgRHJhd01lbnVCYXIoKQogCi0JZGVmIGlkbGUoc2VsZiwgZXZlbnQpOgotCQlpZiBzZWxmLmFjdGl2ZToKLQkJCXNlbGYuYWN0aXZlLmRvX2lkbGUoZXZlbnQpCi0JCWVsc2U6Ci0JCQlRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKKyAgICAjCisgICAgIyBBcHBsZSBtZW51CisgICAgIworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiQSBzaW1wbGUgc2luZ2xlLWZvbnQgdGV4dCBlZGl0b3IgYmFzZWQgb24gV0FTVEUiKQorCisgICAgIworICAgICMgRmlsZSBtZW51CisgICAgIworCisgICAgZGVmIG9wZW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDApCisKKyAgICBkZWYgb3BlbmZpbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLl9vcGVuKDEpCisKKyAgICBkZWYgX29wZW4oc2VsZiwgYXNrZmlsZSk6CisgICAgICAgIGlmIGFza2ZpbGU6CisgICAgICAgICAgICBwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCdURVhUJywpKQorICAgICAgICAgICAgaWYgbm90IHBhdGg6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBuYW1lID0gb3MucGF0aC5zcGxpdChwYXRoKVstMV0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmcCA9IG9wZW4ocGF0aCwgJ3JiJykgIyBOT1RFIGJpbmFyeSwgd2UgbmVlZCBjciBhcyBlbmQtb2YtbGluZQorICAgICAgICAgICAgICAgIGRhdGEgPSBmcC5yZWFkKCkKKyAgICAgICAgICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgICAgICBleGNlcHQgSU9FcnJvciwgYXJnOgorICAgICAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklPRVJST1I6ICVyIiAlIChhcmcsKSkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhdGggPSBOb25lCisgICAgICAgICAgICBuYW1lID0gIlVudGl0bGVkICVkIiVzZWxmLm51bQorICAgICAgICAgICAgZGF0YSA9ICcnCisgICAgICAgIHcgPSBXYXN0ZVdpbmRvdyhzZWxmKQorICAgICAgICB3Lm9wZW4ocGF0aCwgbmFtZSwgZGF0YSkKKyAgICAgICAgc2VsZi5udW0gPSBzZWxmLm51bSArIDEKKworICAgIGRlZiBjbG9zZXdpbihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUuY2xvc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIHNhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfc2F2ZSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgc2F2ZWFzKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3NhdmVfYXMoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisKKyAgICBkZWYgcXVpdChzZWxmLCAqYXJncyk6CisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICB3LmNsb3NlKCkKKyAgICAgICAgaWYgc2VsZi5fd2luZG93czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9xdWl0KCkKKworICAgICMKKyAgICAjIEVkaXQgbWVudQorICAgICMKKworICAgIGRlZiB1bmRvKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X3VuZG8oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGN1dChzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHNlbGYuYWN0aXZlOgorICAgICAgICAgICAgc2VsZi5hY3RpdmUubWVudV9jdXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfY29weSgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJObyBhY3RpdmUgd2luZG93PyIpCisKKyAgICBkZWYgcGFzdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLm1lbnVfcGFzdGUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiTm8gYWN0aXZlIHdpbmRvdz8iKQorCisgICAgZGVmIGNsZWFyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5hY3RpdmU6CisgICAgICAgICAgICBzZWxmLmFjdGl2ZS5tZW51X2NsZWFyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIk5vIGFjdGl2ZSB3aW5kb3c/IikKKworICAgICMKKyAgICAjIE90aGVyIHN0dWZmCisgICAgIworCisgICAgZGVmIGlkbGUoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBzZWxmLmFjdGl2ZToKKyAgICAgICAgICAgIHNlbGYuYWN0aXZlLmRvX2lkbGUoZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBRZC5TZXRDdXJzb3IoUWQuR2V0UURHbG9iYWxzQXJyb3coKSkKIAogZGVmIG1haW4oKToKLQlBcHAgPSBXZWQoKQotCUFwcC5tYWlubG9vcCgpCi0JCisgICAgQXBwID0gV2VkKCkKKyAgICBBcHAubWFpbmxvb3AoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9BY3RpdmF0ZVdpbmRvd0RlbW8ucHkgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0FjdGl2YXRlV2luZG93RGVtby5weQppbmRleCAzY2Q4MzJiLi5kOGZjOTQ2IDEwMDY0NAotLS0gYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0FjdGl2YXRlV2luZG93RGVtby5weQorKysgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0FjdGl2YXRlV2luZG93RGVtby5weQpAQCAtNCwxOCArNCwxOCBAQAogIyBldmIgMjIgNCA5OQogCiBjbGFzcyBBY3RpdmF0ZURlbW86Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlzZWxmLncgPSBXLldpbmRvdygoMjAwLCAyMDApLCAnQWN0aXZhdGUgZGVtbycpCi0JCXNlbGYudy5iaW5kKCI8YWN0aXZhdGU+Iiwgc2VsZi5teV9hY3RpdmF0ZV9jYWxsYmFjaykKLQkJc2VsZi53Lm9wZW4oKQotCQotCWRlZiBteV9hY3RpdmF0ZV9jYWxsYmFjayhzZWxmLCBvbm9mZik6Ci0JCScnJ3RoZSBjYWxsYmFjayBnZXRzIDEgcGFyYW1ldGVyIHdoaWNoIGluZGljYXRlcyB3aGV0aGVyIHRoZSB3aW5kb3cKLQkJaGFzIGJlZW4gYWN0aXZhdGVkICgxKSBvciBjbGlja2VkIHRvIHRoZSBiYWNrICgwKScnJwotCQlpZiBvbm9mZiA9PSAxOgotCQkJcHJpbnQgIkknbSBpbiB0aGUgZnJvbnQgbm93ISIKLQkJZWxzZToKLQkJCXByaW50ICJJJ3ZlIGJlZW4gY2xpY2tlZCBhd2F5LCBPaCBObyEiCisKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIHNlbGYudyA9IFcuV2luZG93KCgyMDAsIDIwMCksICdBY3RpdmF0ZSBkZW1vJykKKyAgICAgICAgc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLm15X2FjdGl2YXRlX2NhbGxiYWNrKQorICAgICAgICBzZWxmLncub3BlbigpCisKKyAgICBkZWYgbXlfYWN0aXZhdGVfY2FsbGJhY2soc2VsZiwgb25vZmYpOgorICAgICAgICAnJyd0aGUgY2FsbGJhY2sgZ2V0cyAxIHBhcmFtZXRlciB3aGljaCBpbmRpY2F0ZXMgd2hldGhlciB0aGUgd2luZG93CisgICAgICAgIGhhcyBiZWVuIGFjdGl2YXRlZCAoMSkgb3IgY2xpY2tlZCB0byB0aGUgYmFjayAoMCknJycKKyAgICAgICAgaWYgb25vZmYgPT0gMToKKyAgICAgICAgICAgIHByaW50ICJJJ20gaW4gdGhlIGZyb250IG5vdyEiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAiSSd2ZSBiZWVuIGNsaWNrZWQgYXdheSwgT2ggTm8hIgogCiBhZCA9IEFjdGl2YXRlRGVtbygpCmRpZmYgLS1naXQgYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0tleVRlc3Rlci5weSBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvS2V5VGVzdGVyLnB5CmluZGV4IGE5ZjMxNDAuLmFlNDc1NTAgMTAwNjQ0Ci0tLSBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvS2V5VGVzdGVyLnB5CisrKyBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvS2V5VGVzdGVyLnB5CkBAIC00LDEyICs0LDEyIEBACiAKICMga2V5IGNhbGxiYWNrIGZ1bmN0aW9uCiBkZWYgdGVzdGVyKGNoYXIsIGV2ZW50KToKLQl0ZXh0ID0gIiVyXHIlZFxyJXNcciVzIiAlIChjaGFyLCBvcmQoY2hhciksIGhleChvcmQoY2hhcnQpKSwgb2N0KG9yZChjaGFyKSkpCi0Jd2luZG93LmtleXMuc2V0KHRleHQpCisgICAgdGV4dCA9ICIlclxyJWRcciVzXHIlcyIgJSAoY2hhciwgb3JkKGNoYXIpLCBoZXgob3JkKGNoYXJ0KSksIG9jdChvcmQoY2hhcikpKQorICAgIHdpbmRvdy5rZXlzLnNldCh0ZXh0KQogCiAjIGNsb3NlIGNhbGxiYWNrCiBkZWYgY2xvc2UoKToKLQl3aW5kb3cuY2xvc2UoKQorICAgIHdpbmRvdy5jbG9zZSgpCiAKICMgbmV3IHdpbmRvdwogd2luZG93ID0gVy5EaWFsb2coKDE4MCwgMTAwKSwgIlR5cGUgYSBjaGFyYWN0ZXIiKQpkaWZmIC0tZ2l0IGEvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9MaXN0V2luZG93LnB5IGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9MaXN0V2luZG93LnB5CmluZGV4IGVmMDY2YjkuLmY3OGI0YjggMTAwNjQ0Ci0tLSBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvTGlzdFdpbmRvdy5weQorKysgYi9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL0xpc3RXaW5kb3cucHkKQEAgLTEsMTAgKzEsMTAgQEAKIGltcG9ydCBXCiAKIGRlZiBsaXN0aGl0KGlzZGJsKToKLQlpZiBpc2RibDoKLQkJcHJpbnQgImRvdWJsZS1jbGljayBpbiBsaXN0ISIKLQllbHNlOgotCQlwcmludCAiY2xpY2sgaW4gbGlzdC4iCisgICAgaWYgaXNkYmw6CisgICAgICAgIHByaW50ICJkb3VibGUtY2xpY2sgaW4gbGlzdCEiCisgICAgZWxzZToKKyAgICAgICAgcHJpbnQgImNsaWNrIGluIGxpc3QuIgogCiB3aW5kb3cgPSBXLldpbmRvdygoMjAwLCA0MDApLCAiV2luZG93IHdpdGggTGlzdCIsIG1pbnNpemUgPSAoMTUwLCAyMDApKQogCmRpZmYgLS1naXQgYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL1R3b0xpc3RzLnB5IGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9Ud29MaXN0cy5weQppbmRleCBlZTUyYzg5Li5mMWI1OGYyIDEwMDY0NAotLS0gYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL1R3b0xpc3RzLnB5CisrKyBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvVHdvTGlzdHMucHkKQEAgLTEsMTYgKzEsMTYgQEAKIGltcG9ydCBXCiAKIGRlZiB0d290aGlyZCh3aWR0aCwgaGVpZ2h0KToKLQlyZXR1cm4gKDgsIDgsIHdpZHRoIC0gOCwgMipoZWlnaHQvMyAtIDQpCisgICAgcmV0dXJuICg4LCA4LCB3aWR0aCAtIDgsIDIqaGVpZ2h0LzMgLSA0KQogCiBkZWYgb25ldGhpcmQod2lkdGgsIGhlaWdodCk6Ci0JcmV0dXJuICg4LCAyKmhlaWdodC8zICsgNCwgd2lkdGggLSA4LCBoZWlnaHQgLSAyMikKKyAgICByZXR1cm4gKDgsIDIqaGVpZ2h0LzMgKyA0LCB3aWR0aCAtIDgsIGhlaWdodCAtIDIyKQogCiBkZWYgaGFsZmJvdW5kczEod2lkdGgsIGhlaWdodCk6Ci0JcmV0dXJuICgwLCAwLCB3aWR0aC8yIC0gNCwgaGVpZ2h0KQorICAgIHJldHVybiAoMCwgMCwgd2lkdGgvMiAtIDQsIGhlaWdodCkKIAogZGVmIGhhbGZib3VuZHMyKHdpZHRoLCBoZWlnaHQpOgotCXJldHVybiAod2lkdGgvMiArIDQsIDAsIHdpZHRoLCBoZWlnaHQpCisgICAgcmV0dXJuICh3aWR0aC8yICsgNCwgMCwgd2lkdGgsIGhlaWdodCkKIAogd2luZG93ID0gVy5XaW5kb3coKDQwMCwgNDAwKSwgIlNpemFibGUgd2luZG93IHdpdGggdHdvIGxpc3RzIiwgbWluc2l6ZSA9ICgyMDAsIDIwMCkpCiAKZGlmZiAtLWdpdCBhL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvV2lkZ2V0VGVzdC5weSBiL01hYy9JREUgc2NyaXB0cy9XaWRnZXQgZGVtb3MvV2lkZ2V0VGVzdC5weQppbmRleCA0MjRlNzBkLi5hMmU4ZDA4IDEwMDY0NAotLS0gYS9NYWMvSURFIHNjcmlwdHMvV2lkZ2V0IGRlbW9zL1dpZGdldFRlc3QucHkKKysrIGIvTWFjL0lERSBzY3JpcHRzL1dpZGdldCBkZW1vcy9XaWRnZXRUZXN0LnB5CkBAIC0yLDM0ICsyLDM0IEBACiAKICMgZGVmaW5lIHNvbWUgY2FsbGJhY2tzCiBkZWYgY2FsbGJhY2soKToKLQl3aW5kb3cuY2xvc2UoKQorICAgIHdpbmRvdy5jbG9zZSgpCiAKIGRlZiBjaGVja2NhbGxiYWNrKHZhbHVlKToKLQlwcmludCAiaGl0IHRoZSBjaGVja2JveCIsIHZhbHVlCisgICAgcHJpbnQgImhpdCB0aGUgY2hlY2tib3giLCB2YWx1ZQogCiBkZWYgcmFkaW9jYWxsYmFjayh2YWx1ZSk6Ci0JcHJpbnQgImhpdCByYWRpb2J1dHRvbiAjMyIsIHZhbHVlCisgICAgcHJpbnQgImhpdCByYWRpb2J1dHRvbiAjMyIsIHZhbHVlCiAKIGRlZiBzY3JvbGxjYWxsYmFjayh2YWx1ZSk6Ci0Jd2lkZ2V0ID0gd2luZG93LmhiYXIKLQlpZiB2YWx1ZSA9PSAiKyI6Ci0JCXdpZGdldC5zZXQod2lkZ2V0LmdldCgpIC0gMSkKLQllbGlmIHZhbHVlID09ICItIjoKLQkJd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgKyAxKQotCWVsaWYgdmFsdWUgPT0gIisrIjoKLQkJd2lkZ2V0LnNldCh3aWRnZXQuZ2V0KCkgLSAxMCkKLQllbGlmIHZhbHVlID09ICItLSI6Ci0JCXdpZGdldC5zZXQod2lkZ2V0LmdldCgpICsgMTApCi0JZWxzZTogICAjIGluIHRodW1iCi0JCXdpZGdldC5zZXQodmFsdWUpCi0JcHJpbnQgInNjcm9sbC4uLiIsIHdpZGdldC5nZXQoKQorICAgIHdpZGdldCA9IHdpbmRvdy5oYmFyCisgICAgaWYgdmFsdWUgPT0gIisiOgorICAgICAgICB3aWRnZXQuc2V0KHdpZGdldC5nZXQoKSAtIDEpCisgICAgZWxpZiB2YWx1ZSA9PSAiLSI6CisgICAgICAgIHdpZGdldC5zZXQod2lkZ2V0LmdldCgpICsgMSkKKyAgICBlbGlmIHZhbHVlID09ICIrKyI6CisgICAgICAgIHdpZGdldC5zZXQod2lkZ2V0LmdldCgpIC0gMTApCisgICAgZWxpZiB2YWx1ZSA9PSAiLS0iOgorICAgICAgICB3aWRnZXQuc2V0KHdpZGdldC5nZXQoKSArIDEwKQorICAgIGVsc2U6ICAgIyBpbiB0aHVtYgorICAgICAgICB3aWRnZXQuc2V0KHZhbHVlKQorICAgIHByaW50ICJzY3JvbGwuLi4iLCB3aWRnZXQuZ2V0KCkKIAogZGVmIHRleHRjYWxsYmFjaygpOgotCXdpbmRvdy5ldDMuc2V0KHdpbmRvdy5ldDEuZ2V0KCkpCisgICAgd2luZG93LmV0My5zZXQod2luZG93LmV0MS5nZXQoKSkKIAogZGVmIGNhbmNlbCgpOgotCWltcG9ydCBFYXN5RGlhbG9ncwotCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkNhbmNlbCEiKQorICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIkNhbmNlbCEiKQogCiAjIG1ha2UgYSBub24tc2l6YWJsZSB3aW5kb3cKICN3aW5kb3cgPSBXLldpbmRvdygoMjAwLCAzMDApLCAiRml4ZWQgU2l6ZSIpCkBAIC03Nyw5ICs3Nyw5IEBACiB3aW5kb3cub3BlbigpCiAKIGlmIDA6Ci0JaW1wb3J0IHRpbWUKLQlmb3IgaSBpbiByYW5nZSgyMCk6Ci0JCXdpbmRvdy5ldDIuc2V0KHJlcHIoaSkpCi0JCSN3aW5kb3cuZXQyLlNldFBvcnQoKQotCQkjd2luZG93LmV0Mi5kcmF3KCkKLQkJdGltZS5zbGVlcCgwLjEpCisgICAgaW1wb3J0IHRpbWUKKyAgICBmb3IgaSBpbiByYW5nZSgyMCk6CisgICAgICAgIHdpbmRvdy5ldDIuc2V0KHJlcHIoaSkpCisgICAgICAgICN3aW5kb3cuZXQyLlNldFBvcnQoKQorICAgICAgICAjd2luZG93LmV0Mi5kcmF3KCkKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9hZS9hZXNjYW4ucHkgYi9NYWMvTW9kdWxlcy9hZS9hZXNjYW4ucHkKaW5kZXggODBjMTk4Yy4uMTI4M2MxZCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWUvYWVzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2FlL2Flc2Nhbi5weQpAQCAtMTMsODcgKzEzLDg3IEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcgogCiBkZWYgbWFpbigpOgotCXByaW50ICI9PT0gU2Nhbm5pbmcgQUVEYXRhTW9kZWwuaCwgQXBwbGVFdmVudHMuaCwgQUVSZWdpc3RyeS5oLCBBRU9iamVjdHMuaCA9PT0iCi0JaW5wdXQgPSBbIkFFRGF0YU1vZGVsLmgiLCAiQUVJbnRlcmFjdGlvbi5oIiwgIkFwcGxlRXZlbnRzLmgiLCAiQUVSZWdpc3RyeS5oIiwgIkFFT2JqZWN0cy5oIl0KLQlvdXRwdXQgPSAiYWVnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiQXBwbGVFdmVudHMucHkiCi0Jc2Nhbm5lciA9IEFwcGxlRXZlbnRzU2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIFNjYW5uaW5nIGFuZCBHZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCBhZXN1cHBvcnQnID09PSIKLQlpbXBvcnQgYWVzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lICdpbXBvcnQgYWVzdXBwb3J0Jy4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgQUVtb2R1bGUuYyA9PT0iCisgICAgcHJpbnQgIj09PSBTY2FubmluZyBBRURhdGFNb2RlbC5oLCBBcHBsZUV2ZW50cy5oLCBBRVJlZ2lzdHJ5LmgsIEFFT2JqZWN0cy5oID09PSIKKyAgICBpbnB1dCA9IFsiQUVEYXRhTW9kZWwuaCIsICJBRUludGVyYWN0aW9uLmgiLCAiQXBwbGVFdmVudHMuaCIsICJBRVJlZ2lzdHJ5LmgiLCAiQUVPYmplY3RzLmgiXQorICAgIG91dHB1dCA9ICJhZWdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJBcHBsZUV2ZW50cy5weSIKKyAgICBzY2FubmVyID0gQXBwbGVFdmVudHNTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgU2Nhbm5pbmcgYW5kIEdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IGFlc3VwcG9ydCcgPT09IgorICAgIGltcG9ydCBhZXN1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUgJ2ltcG9ydCBhZXN1cHBvcnQnLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBBRW1vZHVsZS5jID09PSIKIAogY2xhc3MgQXBwbGVFdmVudHNTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiQUVGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHRbLTQ6XSA9PSAiX3B0ciIgYW5kIG0gPT0gIkluTW9kZSIgYW5kIFwKLQkJCSAgIHRbOi00XSBpbiAoIkFFRGVzYyIsICJBRUFkZHJlc3NEZXNjIiwgIkFFRGVzY0xpc3QiLAotCQkJICAgICAgICAgIkFFUmVjb3JkIiwgIkFwcGxlRXZlbnQiKToKLQkJCQljbGFzc25hbWUgPSAiQUVNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiYWVkZXNjbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJBRUZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdFstNDpdID09ICJfcHRyIiBhbmQgbSA9PSAiSW5Nb2RlIiBhbmQgXAorICAgICAgICAgICAgICAgdFs6LTRdIGluICgiQUVEZXNjIiwgIkFFQWRkcmVzc0Rlc2MiLCAiQUVEZXNjTGlzdCIsCisgICAgICAgICAgICAgICAgICAgICAiQUVSZWNvcmQiLCAiQXBwbGVFdmVudCIpOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJBRU1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJhZWRlc2NtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJBRURpc3Bvc2VEZXNjIiwKLSMJCQkiQUVHZXRFdmVudEhhbmRsZXIiLAotCQkJIkFFR2V0RGVzY0RhdGEiLCAjIFVzZSBvYmplY3QuZGF0YQotCQkJIkFFR2V0U3BlY2lhbEhhbmRsZXIiLAotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJImtBRURvbnREaXNwb3NlT25SZXN1bWUiLAotCQkJImtBRVVzZVN0YW5kYXJkRGlzcGF0Y2giLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkFFRGlzcG9zZURlc2MiLAorIyAgICAgICAgICAgICAgICAgICAgICAgIkFFR2V0RXZlbnRIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAiQUVHZXREZXNjRGF0YSIsICMgVXNlIG9iamVjdC5kYXRhCisgICAgICAgICAgICAgICAgIkFFR2V0U3BlY2lhbEhhbmRsZXIiLAorICAgICAgICAgICAgICAgICMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAia0FFRG9udERpc3Bvc2VPblJlc3VtZSIsCisgICAgICAgICAgICAgICAgImtBRVVzZVN0YW5kYXJkRGlzcGF0Y2giLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiUHJvY1B0ciIsCi0JCQkiQUVBcnJheVR5cGUiLAotCQkJIkFFQ29lcmNpb25IYW5kbGVyVVBQIiwKLQkJCSJVbml2ZXJzYWxQcm9jUHRyIiwKLQkJCSJPU0xDb21wYXJlVVBQIiwKLQkJCSJPU0xBY2Nlc3NvclVQUCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiUHJvY1B0ciIsCisgICAgICAgICAgICAgICAgIkFFQXJyYXlUeXBlIiwKKyAgICAgICAgICAgICAgICAiQUVDb2VyY2lvbkhhbmRsZXJVUFAiLAorICAgICAgICAgICAgICAgICJVbml2ZXJzYWxQcm9jUHRyIiwKKyAgICAgICAgICAgICAgICAiT1NMQ29tcGFyZVVQUCIsCisgICAgICAgICAgICAgICAgIk9TTEFjY2Vzc29yVVBQIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJCb29sZWFuIiwgImlzU3lzSGFuZGxlciIsICJJbk1vZGUiKV0sCi0JCQkgWygiQWx3YXlzRmFsc2UiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiU2l6ZSIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygiRXZlbnRIYW5kbGVyUHJvY1B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJFdmVudEhhbmRsZXJQcm9jUHRyIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkV2ZW50SGFuZGxlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygiQUVFdmVudEhhbmRsZXJVUFAiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkV2ZW50SGFuZGxlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygiQUVFdmVudEhhbmRsZXJVUFAiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoIlNpemUiLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIlNpemUiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkoWygiQXBwbGVFdmVudCIsICJ0aGVBcHBsZUV2ZW50IiwgIk91dE1vZGUiKV0sCi0JCQkgWygiQXBwbGVFdmVudF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJIAotCQkJKFsoIkFFRGVzY0xpc3QiLCAidGhlQUVEZXNjTGlzdCIsICJPdXRNb2RlIildLAotCQkJIFsoIkFFRGVzY0xpc3RfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiQm9vbGVhbiIsICJpc1N5c0hhbmRsZXIiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJBbHdheXNGYWxzZSIsICIqIiwgIioiKV0pLAogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiU2l6ZSIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJFdmVudEhhbmRsZXJQcm9jUHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiRXZlbnRIYW5kbGVyUHJvY1B0ciIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiQUVFdmVudEhhbmRsZXJVUFAiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFdmVudEhhbmRsZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJBRUV2ZW50SGFuZGxlclVQUCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXZlbnRIYW5kbGVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJTaXplIiwgIioiLCAiSW5Nb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiU2l6ZSIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiQXBwbGVFdmVudCIsICJ0aGVBcHBsZUV2ZW50IiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkFwcGxlRXZlbnRfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJBRURlc2NMaXN0IiwgInRoZUFFRGVzY0xpc3QiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQUVEZXNjTGlzdF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYWUvYWVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvYWUvYWVzdXBwb3J0LnB5CmluZGV4IDE3MTg0ZGIuLjkxYzViODIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2FlL2Flc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9hZS9hZXN1cHBvcnQucHkKQEAgLTM5LDI5ICszOSwyOSBAQAogCiAKIGNsYXNzIEVIVHlwZShUeXBlKToKLQlkZWYgX19pbml0X18oc2VsZiwgbmFtZSA9ICdFdmVudEhhbmRsZXInLCBmb3JtYXQgPSAnJyk6Ci0JCVR5cGUuX19pbml0X18oc2VsZiwgbmFtZSwgZm9ybWF0KQotCWRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIkFFRXZlbnRIYW5kbGVyVVBQICVzX19wcm9jX18gPSB1cHBfR2VuZXJpY0V2ZW50SGFuZGxlcjsiLCBuYW1lKQotCQlPdXRwdXQoIlB5T2JqZWN0IColczsiLCBuYW1lKQotCWRlZiBnZXRhcmdzRm9ybWF0KHNlbGYpOgotCQlyZXR1cm4gIk8iCi0JZGVmIGdldGFyZ3NBcmdzKHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiYlcyIgJSBuYW1lCi0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICIlc19fcHJvY19fLCAobG9uZyklcyIgJSAobmFtZSwgbmFtZSkKLQlkZWYgcGFzc091dHB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICImJXNfX3Byb2NfXywgKGxvbmcgKikmJXMiICUgKG5hbWUsIG5hbWUpCi0JZGVmIG1rdmFsdWVGb3JtYXQoc2VsZik6Ci0JCXJldHVybiAiTyIKLQlkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiBuYW1lCi0JZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiUHlfSU5DUkVGKCVzKTsgLyogWFhYIGxlYWssIGJ1dCBuZWVkZWQgKi8iLCBuYW1lKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lID0gJ0V2ZW50SGFuZGxlcicsIGZvcm1hdCA9ICcnKToKKyAgICAgICAgVHlwZS5fX2luaXRfXyhzZWxmLCBuYW1lLCBmb3JtYXQpCisgICAgZGVmIGRlY2xhcmUoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiQUVFdmVudEhhbmRsZXJVUFAgJXNfX3Byb2NfXyA9IHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyOyIsIG5hbWUpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKiVzOyIsIG5hbWUpCisgICAgZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6CisgICAgICAgIHJldHVybiAiTyIKKyAgICBkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJiVzIiAlIG5hbWUKKyAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiVzX19wcm9jX18sIChsb25nKSVzIiAlIChuYW1lLCBuYW1lKQorICAgIGRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiYlc19fcHJvY19fLCAobG9uZyAqKSYlcyIgJSAobmFtZSwgbmFtZSkKKyAgICBkZWYgbWt2YWx1ZUZvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuICJPIgorICAgIGRlZiBta3ZhbHVlQXJncyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuIG5hbWUKKyAgICBkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJQeV9JTkNSRUYoJXMpOyAvKiBYWFggbGVhaywgYnV0IG5lZWRlZCAqLyIsIG5hbWUpCiAKIGNsYXNzIEVITm9SZWZDb25UeXBlKEVIVHlwZSk6Ci0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICJ1cHBfR2VuZXJpY0V2ZW50SGFuZGxlciIKKyAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gInVwcF9HZW5lcmljRXZlbnRIYW5kbGVyIgogCiBFdmVudEhhbmRsZXIgPSBFSFR5cGUoKQogRXZlbnRIYW5kbGVyTm9SZWZDb24gPSBFSE5vUmVmQ29uVHlwZSgpCkBAIC0xMDEsOSArMTAxLDkgQEAKIAogc3RhdGljIHBhc2NhbCBCb29sZWFuIEFFSWRsZVByb2MoRXZlbnRSZWNvcmQgKnRoZUV2ZW50LCBsb25nICpzbGVlcFRpbWUsIFJnbkhhbmRsZSAqbW91c2VSZ24pCiB7Ci0JaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQotCQlyZXR1cm4gMTsKLQlyZXR1cm4gMDsKKyAgICAgICAgaWYgKCBQeU9TX0ludGVycnVwdE9jY3VycmVkKCkgKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gMDsKIH0KIAogQUVJZGxlVVBQIHVwcF9BRUlkbGVQcm9jOwpAQCAtMTEzLDk5ICsxMTMsOTkgQEAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIEdlbmVyaWNFdmVudEhhbmRsZXIoY29uc3QgQXBwbGVFdmVudCAqcmVxdWVzdCwgQXBwbGVFdmVudCAqcmVwbHksIHJlZmNvbnR5cGUgcmVmY29uKQogewotCVB5T2JqZWN0ICpoYW5kbGVyID0gKFB5T2JqZWN0ICopcmVmY29uOwotCUFFRGVzY09iamVjdCAqcmVxdWVzdE9iamVjdCwgKnJlcGx5T2JqZWN0OwotCVB5T2JqZWN0ICphcmdzLCAqcmVzOwotCWlmICgocmVxdWVzdE9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KChBcHBsZUV2ZW50ICopcmVxdWVzdCkpID09IE5VTEwpIHsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKHJlcGx5T2JqZWN0ID0gKEFFRGVzY09iamVjdCAqKUFFRGVzY19OZXcocmVwbHkpKSA9PSBOVUxMKSB7Ci0JCVB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpZiAoKGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPTyIsIHJlcXVlc3RPYmplY3QsIHJlcGx5T2JqZWN0KSkgPT0gTlVMTCkgewotCQlQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7Ci0JCVB5X0RFQ1JFRihyZXBseU9iamVjdCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoaGFuZGxlciwgYXJncyk7Ci0JcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlID0gJ251bGwnOwotCXJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kYXRhSGFuZGxlID0gTlVMTDsKLQlyZXBseU9iamVjdC0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlID0gJ251bGwnOwotCXJlcGx5T2JqZWN0LT5vYl9pdHNlbGYuZGF0YUhhbmRsZSA9IE5VTEw7Ci0JUHlfREVDUkVGKGFyZ3MpOwotCWlmIChyZXMgPT0gTlVMTCkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiRXhjZXB0aW9uIGluIEFFIGV2ZW50IGhhbmRsZXIgZnVuY3Rpb25cXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gbm9FcnI7CisgICAgICAgIFB5T2JqZWN0ICpoYW5kbGVyID0gKFB5T2JqZWN0ICopcmVmY29uOworICAgICAgICBBRURlc2NPYmplY3QgKnJlcXVlc3RPYmplY3QsICpyZXBseU9iamVjdDsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgICAgIGlmICgocmVxdWVzdE9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KChBcHBsZUV2ZW50ICopcmVxdWVzdCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChyZXBseU9iamVjdCA9IChBRURlc2NPYmplY3QgKilBRURlc2NfTmV3KHJlcGx5KSkgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXF1ZXN0T2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChhcmdzID0gUHlfQnVpbGRWYWx1ZSgiT08iLCByZXF1ZXN0T2JqZWN0LCByZXBseU9iamVjdCkpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocmVxdWVzdE9iamVjdCk7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJlcGx5T2JqZWN0KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgcmVzID0gUHlFdmFsX0NhbGxPYmplY3QoaGFuZGxlciwgYXJncyk7CisgICAgICAgIHJlcXVlc3RPYmplY3QtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSA9ICdudWxsJzsKKyAgICAgICAgcmVxdWVzdE9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICByZXBseU9iamVjdC0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlID0gJ251bGwnOworICAgICAgICByZXBseU9iamVjdC0+b2JfaXRzZWxmLmRhdGFIYW5kbGUgPSBOVUxMOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmIChyZXMgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gQUUgZXZlbnQgaGFuZGxlciBmdW5jdGlvblxcbiIpOworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gbm9FcnI7CiB9CiAKIFB5T2JqZWN0ICpBRURlc2NfTmV3Qm9ycm93ZWQoQUVEZXNjICppdHNlbGYpCiB7Ci0JUHlPYmplY3QgKml0OwotCQotCWl0ID0gQUVEZXNjX05ldyhpdHNlbGYpOwotCWlmIChpdCkKLQkJKChBRURlc2NPYmplY3QgKilpdCktPm9iX293bmVkID0gMDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgICAgIFB5T2JqZWN0ICppdDsKKworICAgICAgICBpdCA9IEFFRGVzY19OZXcoaXRzZWxmKTsKKyAgICAgICAgaWYgKGl0KQorICAgICAgICAgICAgICAgICgoQUVEZXNjT2JqZWN0ICopaXQpLT5vYl9vd25lZCA9IDA7CisgICAgICAgIHJldHVybiAoUHlPYmplY3QgKilpdDsKIH0KIAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCXVwcF9BRUlkbGVQcm9jID0gTmV3QUVJZGxlVVBQKEFFSWRsZVByb2MpOwotCXVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3Qm9ycm93ZWQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKKyAgICAgICAgdXBwX0FFSWRsZVByb2MgPSBOZXdBRUlkbGVVUFAoQUVJZGxlUHJvYyk7CisgICAgICAgIHVwcF9HZW5lcmljRXZlbnRIYW5kbGVyID0gTmV3QUVFdmVudEhhbmRsZXJVUFAoR2VuZXJpY0V2ZW50SGFuZGxlcik7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEFFRGVzYyAqLCBBRURlc2NfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQUVEZXNjICosIEFFRGVzY19OZXdCb3Jyb3dlZCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChBRURlc2MsIEFFRGVzY19Db252ZXJ0KTsKICIiIgogCiBtb2R1bGUgPSBNYWNNb2R1bGUoJ19BRScsICdBRScsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQogCiBjbGFzcyBBRURlc2NEZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWygKLQkJJ3R5cGUnLAotCQkncmV0dXJuIFB5TWFjX0J1aWxkT1NUeXBlKHNlbGYtPm9iX2l0c2VsZi5kZXNjcmlwdG9yVHlwZSk7JywKLQkJTm9uZSwKLQkJJ1R5cGUgb2YgdGhpcyBBRURlc2MnCi0JCSksICgKLQkJJ2RhdGEnLAotCQkiIiIKLQkJUHlPYmplY3QgKnJlczsKLQkJU2l6ZSBzaXplOwotCQljaGFyICpwdHI7Ci0JCU9TRXJyIGVycjsKLQkJCi0JCXNpemUgPSBBRUdldERlc2NEYXRhU2l6ZSgmc2VsZi0+b2JfaXRzZWxmKTsKLQkJaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICggKHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykpID09IE5VTEwgKQotCQkJcmV0dXJuIE5VTEw7Ci0JCWlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCi0JCQlyZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsJCi0JCXJldHVybiByZXM7Ci0JCSIiIiwKLQkJTm9uZSwKLQkJJ1RoZSByYXcgZGF0YSBpbiB0aGlzIEFFRGVzYycKLQkJKV0KKyAgICBnZXRzZXRsaXN0ID0gWygKKyAgICAgICAgICAgICd0eXBlJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlNYWNfQnVpbGRPU1R5cGUoc2VsZi0+b2JfaXRzZWxmLmRlc2NyaXB0b3JUeXBlKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdUeXBlIG9mIHRoaXMgQUVEZXNjJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2RhdGEnLAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBQeU9iamVjdCAqcmVzOworICAgICAgICAgICAgU2l6ZSBzaXplOworICAgICAgICAgICAgY2hhciAqcHRyOworICAgICAgICAgICAgT1NFcnIgZXJyOwogCi0JZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCA9IE5vbmUsIGl0c2VsZnR5cGUgPSBOb25lKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXggb3IgbmFtZSwgaXRzZWxmdHlwZSBvciBuYW1lKQotCQlzZWxmLmFyZ3JlZiA9ICIqIgorICAgICAgICAgICAgc2l6ZSA9IEFFR2V0RGVzY0RhdGFTaXplKCZzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgaWYgKCAocmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoTlVMTCwgc2l6ZSkpID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmICggKHB0ciA9IFB5U3RyaW5nX0FzU3RyaW5nKHJlcykpID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIGlmICggKGVycj1BRUdldERlc2NEYXRhKCZzZWxmLT5vYl9pdHNlbGYsIHB0ciwgc2l6ZSkpIDwgMCApCisgICAgICAgICAgICAgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgcmV0dXJuIHJlczsKKyAgICAgICAgICAgICIiIiwKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnVGhlIHJhdyBkYXRhIGluIHRoaXMgQUVEZXNjJworICAgICAgICAgICAgKV0KIAotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpbnQgb2Jfb3duZWQ7IikKLQkJCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiaXQtPm9iX293bmVkID0gMTsiKQotCQkKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaWYgKHNlbGYtPm9iX293bmVkKSBBRURpc3Bvc2VEZXNjKCZzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCA9IE5vbmUsIGl0c2VsZnR5cGUgPSBOb25lKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXggb3IgbmFtZSwgaXRzZWxmdHlwZSBvciBuYW1lKQorICAgICAgICBzZWxmLmFyZ3JlZiA9ICIqIgorCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoImludCBvYl9vd25lZDsiKQorCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX293bmVkID0gMTsiKQorCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5vYl9vd25lZCkgQUVEaXNwb3NlRGVzYygmc2VsZi0+b2JfaXRzZWxmKTsiKQogCiBhZWRlc2NvYmplY3QgPSBBRURlc2NEZWZpbml0aW9uKCdBRURlc2MnKQogbW9kdWxlLmFkZG9iamVjdChhZWRlc2NvYmplY3QpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9haC9haHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9haC9haHNjYW4ucHkKaW5kZXggY2NlZDE5Zi4uMGI3ZmUwOCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYWgvYWhzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2FoL2Foc2Nhbi5weQpAQCAtMTEsNDIgKzExLDQyIEBACiBPQkpFQ1QgPSAiTk9UVVNFRCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FoL2Foc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2FoL2Foc3VwcG9ydC5weQppbmRleCBjOTFjMjk4Li5jNWYyNGJlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9haC9haHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvYWgvYWhzdXBwb3J0LnB5CkBAIC02LDEzICs2LDEzIEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnQXBwbGVIZWxwLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfQUgnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTUFDSEVBREVSRklMRSA9ICdBcHBsZUhlbHAuaCcgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19BSCcgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdBaCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitNT0RQUkVGSVggPSAnQWgnICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNDMsNCArNDMsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvYXBwL2FwcHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9hcHAvYXBwc2Nhbi5weQppbmRleCA4MjI2NTFkLi4xYjA0ODU5IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9hcHAvYXBwc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9hcHAvYXBwc2Nhbi5weQpAQCAtMTEsNzEgKzExLDcxIEBACiBPQkpFQ1QgPSAiVGhlbWVEcmF3aW5nU3RhdGUiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gTE9ORyArICIuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkdldFRoZW1lRm9udCIsCQkjIEZ1bm55IHN0cmluZ2J1ZmZlciBpbi9vdXQgcGFyYW1ldGVyLCBJIHRoaW5rLi4uCi0JCQkjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCi0JCQkiYXBwZWFyYW5jZUJhZEJydXNoSW5kZXhFcnIiLAotCQkJImFwcGVhcmFuY2VQcm9jZXNzUmVnaXN0ZXJlZEVyciIsCi0JCQkiYXBwZWFyYW5jZVByb2Nlc3NOb3RSZWdpc3RlcmVkRXJyIiwKLQkJCSJhcHBlYXJhbmNlQmFkVGV4dENvbG9ySW5kZXhFcnIiLAotCQkJImFwcGVhcmFuY2VUaGVtZUhhc05vQWNjZW50cyIsCi0JCQkiYXBwZWFyYW5jZUJhZEN1cnNvckluZGV4RXJyIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJHZXRUaGVtZUZvbnQiLCAgICAgICAgICMgRnVubnkgc3RyaW5nYnVmZmVyIGluL291dCBwYXJhbWV0ZXIsIEkgdGhpbmsuLi4KKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgImFwcGVhcmFuY2VCYWRCcnVzaEluZGV4RXJyIiwKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZVByb2Nlc3NSZWdpc3RlcmVkRXJyIiwKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZVByb2Nlc3NOb3RSZWdpc3RlcmVkRXJyIiwKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZUJhZFRleHRDb2xvckluZGV4RXJyIiwKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZVRoZW1lSGFzTm9BY2NlbnRzIiwKKyAgICAgICAgICAgICAgICAiYXBwZWFyYW5jZUJhZEN1cnNvckluZGV4RXJyIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIk1lbnVUaXRsZURyYXdpbmdVUFAiLAotCQkJIk1lbnVJdGVtRHJhd2luZ1VQUCIsCi0JCQkiVGhlbWVJdGVyYXRvclVQUCIsCi0JCQkiVGhlbWVUYWJUaXRsZURyYXdVUFAiLAotIwkJCSJUaGVtZUVyYXNlVVBQIiwKLSMJCQkiVGhlbWVCdXR0b25EcmF3VVBQIiwKLQkJCSJXaW5kb3dUaXRsZURyYXdpbmdVUFAiLAotCQkJIlByb2Nlc3NTZXJpYWxOdW1iZXJfcHRyIiwJCSMgVG9vIG11Y2ggd29yayBmb3Igbm93LgotCQkJIlRoZW1lVHJhY2tEcmF3SW5mb19wdHIiLCAJIyBUb28gbXVjaCB3b3JrCi0jCQkJIlRoZW1lQnV0dG9uRHJhd0luZm9fcHRyIiwJIyBkaXR0bwotCQkJIlRoZW1lV2luZG93TWV0cmljc19wdHIiLAkjIGRpdHRvCi0jCQkJIlRoZW1lRHJhd2luZ1N0YXRlIiwJIyBUaGlzIGlzIGFuIG9wYXF1ZSBwb2ludGVyLCBzbyBpdCBzaG91bGQgYmUgc2ltcGxlLiBMYXRlci4KLQkJCSJDb2xsZWN0aW9uIiwJCSMgTm8gaW50ZXJmYWNlIHRvIGNvbGxlY3Rpb24gbWdyIHlldC4KLQkJCSJCeXRlUHRyIiwJCSMgTm90IHlldC4KLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJNZW51VGl0bGVEcmF3aW5nVVBQIiwKKyAgICAgICAgICAgICAgICAiTWVudUl0ZW1EcmF3aW5nVVBQIiwKKyAgICAgICAgICAgICAgICAiVGhlbWVJdGVyYXRvclVQUCIsCisgICAgICAgICAgICAgICAgIlRoZW1lVGFiVGl0bGVEcmF3VVBQIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJUaGVtZUVyYXNlVVBQIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJUaGVtZUJ1dHRvbkRyYXdVUFAiLAorICAgICAgICAgICAgICAgICJXaW5kb3dUaXRsZURyYXdpbmdVUFAiLAorICAgICAgICAgICAgICAgICJQcm9jZXNzU2VyaWFsTnVtYmVyX3B0ciIsICAgICAgICAgICAgICAjIFRvbyBtdWNoIHdvcmsgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICAiVGhlbWVUcmFja0RyYXdJbmZvX3B0ciIsICAgICAgICMgVG9vIG11Y2ggd29yaworIyAgICAgICAgICAgICAgICAgICAgICAgIlRoZW1lQnV0dG9uRHJhd0luZm9fcHRyIiwgICAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIlRoZW1lV2luZG93TWV0cmljc19wdHIiLCAgICAgICAjIGRpdHRvCisjICAgICAgICAgICAgICAgICAgICAgICAiVGhlbWVEcmF3aW5nU3RhdGUiLCAgICAjIFRoaXMgaXMgYW4gb3BhcXVlIHBvaW50ZXIsIHNvIGl0IHNob3VsZCBiZSBzaW1wbGUuIExhdGVyLgorICAgICAgICAgICAgICAgICJDb2xsZWN0aW9uIiwgICAgICAgICAgICMgTm8gaW50ZXJmYWNlIHRvIGNvbGxlY3Rpb24gbWdyIHlldC4KKyAgICAgICAgICAgICAgICAiQnl0ZVB0ciIsICAgICAgICAgICAgICAjIE5vdCB5ZXQuCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygidm9pZCIsICdpbkNvbnRleHQnLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJOVUxMIiwgJ2luQ29udGV4dCcsICJJbk1vZGUiKV0pLAotCQkJKFsoIlBvaW50IiwgJ2lvQm91bmRzJywgIk91dE1vZGUiKV0sCi0JCQkgWygiUG9pbnQiLCAnaW9Cb3VuZHMnLCAiSW5PdXRNb2RlIildKSwKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgJ2luQ29udGV4dCcsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJOVUxMIiwgJ2luQ29udGV4dCcsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIChbKCJQb2ludCIsICdpb0JvdW5kcycsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJQb2ludCIsICdpb0JvdW5kcycsICJJbk91dE1vZGUiKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2FwcC9hcHBzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvYXBwL2FwcHN1cHBvcnQucHkKaW5kZXggYTlkODc2OC4uMTc3ZGZkNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvYXBwL2FwcHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvYXBwL2FwcHN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdBcHBlYXJhbmNlLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfQXBwJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnVGhlbWVEcmF3aW5nU3RhdGUnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKLUtJTkQgPSAnJwkJCQkjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKK01BQ0hFQURFUkZJTEUgPSAnQXBwZWFyYW5jZS5oJyAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfQXBwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ1RoZW1lRHJhd2luZ1N0YXRlJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdBcHAnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyBLSU5ECQkjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQotT0JKRUNUUFJFRklYID0gT0JKRUNUTkFNRSArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdBcHAnICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE9CSkVDVE5BTUUgKyAnT2JqJyAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC04NCwyNCArODQsMjQgQEAKIAogaW50IFRoZW1lQnV0dG9uRHJhd0luZm9fQ29udmVydChQeU9iamVjdCAqdiwgVGhlbWVCdXR0b25EcmF3SW5mbyAqcF9pdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaUhIKSIsICZwX2l0c2VsZi0+c3RhdGUsICZwX2l0c2VsZi0+dmFsdWUsICZwX2l0c2VsZi0+YWRvcm5tZW50KTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaUhIKSIsICZwX2l0c2VsZi0+c3RhdGUsICZwX2l0c2VsZi0+dmFsdWUsICZwX2l0c2VsZi0+YWRvcm5tZW50KTsKIH0KIAogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JcGFzcwotIyMgCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLSMjIAkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLSMjIAlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotIyMgCQlPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKLSMjIAkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFdpbmRvd09iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKLSMjIAkJT3V0cHV0KCJyZXR1cm4gMTsiKQotIyMgCQlPdXRSYnJhY2UoKQotIyMgCQlPdXQoIiIiCi0jIyAJCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLSMjIAkJaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQotIyMgCQkiIiIpCisgICAgcGFzcworIyMgICAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisjIyAgICAgICAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyMjICAgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyMjICAgICAgICAgICAgICBPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKKyMjICAgICAgICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQorIyMgICAgICAgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyMjICAgICAgICAgICAgICBPdXRSYnJhY2UoKQorIyMgICAgICAgICAgICAgIE91dCgiIiIKKyMjICAgICAgICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisjIyAgICAgICAgICAgICAgaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQorIyMgICAgICAgICAgICAgICIiIikKIAogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCkBAIC0xMzEsNCArMTMxLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9DYXJib25FdnRzY2FuLnB5IGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHNjYW4ucHkKaW5kZXggYzZiZjkzZi4uZTNjNzJhZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHNjYW4ucHkKQEAgLTEyLDEwNiArMTIsMTA2IEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lciwgU2Nhbm5lcl9PU1gKIAogZGVmIG1haW4oKToKLQlwcmludCAiLS0tU2Nhbm5pbmcgQ2FyYm9uRXZlbnRzLmgtLS0iCi0JaW5wdXQgPSBbIkNhcmJvbkV2ZW50cy5oIl0KLQlvdXRwdXQgPSAiQ2FyYm9uRXZlbnRzZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIkNhcmJvbkV2ZW50cy5weSIKLQlzY2FubmVyID0gQ2FyYm9uRXZlbnRzX1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICItLWRvbmUgc2Nhbm5pbmcsIGltcG9ydGluZy0tIgotCWltcG9ydCBDYXJib25FdnRzdXBwb3J0Ci0JcHJpbnQgImRvbmUiCisgICAgcHJpbnQgIi0tLVNjYW5uaW5nIENhcmJvbkV2ZW50cy5oLS0tIgorICAgIGlucHV0ID0gWyJDYXJib25FdmVudHMuaCJdCisgICAgb3V0cHV0ID0gIkNhcmJvbkV2ZW50c2dlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJDYXJib25FdmVudHMucHkiCisgICAgc2Nhbm5lciA9IENhcmJvbkV2ZW50c19TY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiLS1kb25lIHNjYW5uaW5nLCBpbXBvcnRpbmctLSIKKyAgICBpbXBvcnQgQ2FyYm9uRXZ0c3VwcG9ydAorICAgIHByaW50ICJkb25lIgogCi1SZWZPYmplY3RUeXBlcyA9IFsiRXZlbnRSZWYiLCAKLQkJCQkiRXZlbnRRdWV1ZVJlZiIsIAotCQkJCSJFdmVudExvb3BSZWYiLAotCQkJCSJFdmVudExvb3BUaW1lclJlZiIsCi0JCQkJIkV2ZW50SGFuZGxlclJlZiIsCi0JCQkJIkV2ZW50SGFuZGxlckNhbGxSZWYiLAotCQkJCSJFdmVudFRhcmdldFJlZiIsCi0JCQkJIkV2ZW50SG90S2V5UmVmIiwKLQkJCQldCitSZWZPYmplY3RUeXBlcyA9IFsiRXZlbnRSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRRdWV1ZVJlZiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudExvb3BSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRMb29wVGltZXJSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRIYW5kbGVyUmVmIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50SGFuZGxlckNhbGxSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRUYXJnZXRSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRIb3RLZXlSZWYiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCiAKIGNsYXNzIENhcmJvbkV2ZW50c19TY2FubmVyKFNjYW5uZXJfT1NYKToKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJDYXJib25FdmVudHNGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gUmVmT2JqZWN0VHlwZXMgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJaWYgdCA9PSAiRXZlbnRIYW5kbGVyUmVmIjoKLQkJCQkJY2xhc3NuYW1lID0gIkV2ZW50SGFuZGxlclJlZk1ldGhvZCIKLQkJCQllbHNlOgotCQkJCQljbGFzc25hbWUgPSAiQ2FyYm9uRXZlbnRzTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gdCArICJtZXRob2RzIgotCQkJI2Vsc2U6Ci0JCQkjCXByaW50ICJub3QgbWV0aG9kIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkNhcmJvbkV2ZW50c0Z1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiBSZWZPYmplY3RUeXBlcyBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBpZiB0ID09ICJFdmVudEhhbmRsZXJSZWYiOgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiRXZlbnRIYW5kbGVyUmVmTWV0aG9kIgorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJDYXJib25FdmVudHNNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSB0ICsgIm1ldGhvZHMiCisgICAgICAgICAgICAjZWxzZToKKyAgICAgICAgICAgICMgICAgICAgcHJpbnQgIm5vdCBtZXRob2QiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSAwXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gMVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia2V5QUVFdmVudENsYXNzID0gRk9VUl9DSEFSX0NPREUoJ2V2Y2wnKVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia2V5QUVFdmVudElEID0gRk9VUl9DSEFSX0NPREUoJ2V2dGknKVxuIikKLQkKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJInNIYW5kbGVyIiwKLQkJCSJNYWNDcmVhdGVFdmVudCIsCi0jCQkJIlRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zIiwKLSMJCQkiVHJhY2tNb3VzZUxvY2F0aW9uIiwKLSMJCQkiVHJhY2tNb3VzZVJlZ2lvbiIsCi0JCQkiUmVnaXN0ZXJUb29sYm94T2JqZWN0Q2xhc3MiLAotCQkJIlVucmVnaXN0ZXJUb29sYm94T2JqZWN0Q2xhc3MiLAotCQkJIlByb2Nlc3NISUNvbW1hbmQiLAotCQkJIkdldENGUnVuTG9vcEZyb21FdmVudExvb3AiLAotCQkJCi0JCQkiSW52b2tlRXZlbnRIYW5kbGVyVVBQIiwKLQkJCSJJbnZva2VFdmVudENvbXBhcmF0b3JVUFAiLAotCQkJIkludm9rZUV2ZW50TG9vcFRpbWVyVVBQIiwKLQkJCSJOZXdFdmVudENvbXBhcmF0b3JVUFAiLAotCQkJIk5ld0V2ZW50TG9vcFRpbWVyVVBQIiwKLQkJCSJOZXdFdmVudEhhbmRsZXJVUFAiLAotCQkJIkRpc3Bvc2VFdmVudENvbXBhcmF0b3JVUFAiLAotCQkJIkRpc3Bvc2VFdmVudExvb3BUaW1lclVQUCIsCi0JCQkiRGlzcG9zZUV2ZW50SGFuZGxlclVQUCIsCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gMFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IDFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtleUFFRXZlbnRDbGFzcyA9IEZPVVJfQ0hBUl9DT0RFKCdldmNsJylcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtleUFFRXZlbnRJRCA9IEZPVVJfQ0hBUl9DT0RFKCdldnRpJylcbiIpCiAKLQkJCSMgV3JvdGUgYnkgaGFuZAotCQkJIkluc3RhbGxFdmVudEhhbmRsZXIiLAotCQkJIlJlbW92ZUV2ZW50SGFuZGxlciIsCi0JCQkJCQkKLQkJCSMgV3JpdGUgYnkgaGFuZD8KLQkJCSJHZXRFdmVudFBhcmFtZXRlciIsCi0JCQkiRmx1c2hTcGVjaWZpY0V2ZW50c0Zyb21RdWV1ZSIsCi0JCQkiRmluZFNwZWNpZmljRXZlbnRJblF1ZXVlIiwKLQkJCSJJbnN0YWxsRXZlbnRMb29wVGltZXIiLAorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgInNIYW5kbGVyIiwKKyAgICAgICAgICAgICAgICAiTWFjQ3JlYXRlRXZlbnQiLAorIyAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrTW91c2VMb2NhdGlvbldpdGhPcHRpb25zIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICJUcmFja01vdXNlTG9jYXRpb24iLAorIyAgICAgICAgICAgICAgICAgICAgICAgIlRyYWNrTW91c2VSZWdpb24iLAorICAgICAgICAgICAgICAgICJSZWdpc3RlclRvb2xib3hPYmplY3RDbGFzcyIsCisgICAgICAgICAgICAgICAgIlVucmVnaXN0ZXJUb29sYm94T2JqZWN0Q2xhc3MiLAorICAgICAgICAgICAgICAgICJQcm9jZXNzSElDb21tYW5kIiwKKyAgICAgICAgICAgICAgICAiR2V0Q0ZSdW5Mb29wRnJvbUV2ZW50TG9vcCIsCiAKLQkJCSMgRG9uJ3QgZG8gdGhlc2UgYmVjYXVzZSB0aGV5IHJlcXVpcmUgYSBDRlJlbGVhc2UKLQkJCSJDcmVhdGVUeXBlU3RyaW5nV2l0aE9TVHlwZSIsCi0JCQkiQ29weUV2ZW50IiwKLQkJCV0KKyAgICAgICAgICAgICAgICAiSW52b2tlRXZlbnRIYW5kbGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiSW52b2tlRXZlbnRDb21wYXJhdG9yVVBQIiwKKyAgICAgICAgICAgICAgICAiSW52b2tlRXZlbnRMb29wVGltZXJVUFAiLAorICAgICAgICAgICAgICAgICJOZXdFdmVudENvbXBhcmF0b3JVUFAiLAorICAgICAgICAgICAgICAgICJOZXdFdmVudExvb3BUaW1lclVQUCIsCisgICAgICAgICAgICAgICAgIk5ld0V2ZW50SGFuZGxlclVQUCIsCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VFdmVudENvbXBhcmF0b3JVUFAiLAorICAgICAgICAgICAgICAgICJEaXNwb3NlRXZlbnRMb29wVGltZXJVUFAiLAorICAgICAgICAgICAgICAgICJEaXNwb3NlRXZlbnRIYW5kbGVyVVBQIiwKIAotIwlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotIwkJcmV0dXJuIFsiRXZlbnRDb21wYXJhdG9yVVBQIiwKLSMJCQkJIkV2ZW50TG9vcFRpbWVyVVBQIiwKLSMJCQkJIyJFdmVudEhhbmRsZXJVUFAiLAotIwkJCQkiRXZlbnRDb21wYXJhdG9yUHJvY1B0ciIsCi0jCQkJCSJFdmVudExvb3BUaW1lclByb2NQdHIiLAotIwkJCQkiRXZlbnRIYW5kbGVyUHJvY1B0ciIsCi0jCQkJCV0KKyAgICAgICAgICAgICAgICAjIFdyb3RlIGJ5IGhhbmQKKyAgICAgICAgICAgICAgICAiSW5zdGFsbEV2ZW50SGFuZGxlciIsCisgICAgICAgICAgICAgICAgIlJlbW92ZUV2ZW50SGFuZGxlciIsCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJVSW50MzIiLCAnaW5TaXplJywgIkluTW9kZSIpLCAoInZvaWRfcHRyIiwgJ2luRGF0YVB0cicsICJJbk1vZGUiKV0sCi0JCQkgWygiTXlJbkJ1ZmZlciIsICdpbkRhdGFQdHInLCAiSW5Nb2RlIildKSwKLQkJCShbKCJCb29sZWFuIiwgJ2lvV2FzSW5SZ24nLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJCb29sZWFuIiwgJ2lvV2FzSW5SZ24nLCAiSW5PdXRNb2RlIildKSwKLQkJXQorICAgICAgICAgICAgICAgICMgV3JpdGUgYnkgaGFuZD8KKyAgICAgICAgICAgICAgICAiR2V0RXZlbnRQYXJhbWV0ZXIiLAorICAgICAgICAgICAgICAgICJGbHVzaFNwZWNpZmljRXZlbnRzRnJvbVF1ZXVlIiwKKyAgICAgICAgICAgICAgICAiRmluZFNwZWNpZmljRXZlbnRJblF1ZXVlIiwKKyAgICAgICAgICAgICAgICAiSW5zdGFsbEV2ZW50TG9vcFRpbWVyIiwKKworICAgICAgICAgICAgICAgICMgRG9uJ3QgZG8gdGhlc2UgYmVjYXVzZSB0aGV5IHJlcXVpcmUgYSBDRlJlbGVhc2UKKyAgICAgICAgICAgICAgICAiQ3JlYXRlVHlwZVN0cmluZ1dpdGhPU1R5cGUiLAorICAgICAgICAgICAgICAgICJDb3B5RXZlbnQiLAorICAgICAgICAgICAgICAgIF0KKworIyAgICAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorIyAgICAgICAgICAgICAgIHJldHVybiBbIkV2ZW50Q29tcGFyYXRvclVQUCIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudExvb3BUaW1lclVQUCIsCisjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMiRXZlbnRIYW5kbGVyVVBQIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50Q29tcGFyYXRvclByb2NQdHIiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRXZlbnRMb29wVGltZXJQcm9jUHRyIiwKKyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkV2ZW50SGFuZGxlclByb2NQdHIiLAorIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiVUludDMyIiwgJ2luU2l6ZScsICJJbk1vZGUiKSwgKCJ2b2lkX3B0ciIsICdpbkRhdGFQdHInLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJNeUluQnVmZmVyIiwgJ2luRGF0YVB0cicsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIChbKCJCb29sZWFuIiwgJ2lvV2FzSW5SZ24nLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQm9vbGVhbiIsICdpb1dhc0luUmduJywgIkluT3V0TW9kZSIpXSksCisgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NhcmJvbmV2dC9DYXJib25FdnRzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHN1cHBvcnQucHkKaW5kZXggM2NjMTY3Mi4uNzdkMTJiNiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvY2FyYm9uZXZ0L0NhcmJvbkV2dHN1cHBvcnQucHkKQEAgLTgsMjMgKzgsMjMgQEAKIENGU3RyaW5nUmVmID0gT3BhcXVlQnlWYWx1ZVR5cGUoJ0NGU3RyaW5nUmVmJykKIAogZm9yIHR5cCBpbiBSZWZPYmplY3RUeXBlczoKLQlleGVjc3RyID0gIiUobmFtZSlzID0gT3BhcXVlQnlWYWx1ZVR5cGUoJyUobmFtZSlzJykiICUgeyJuYW1lIjogdHlwfQotCWV4ZWMgZXhlY3N0cgorICAgIGV4ZWNzdHIgPSAiJShuYW1lKXMgPSBPcGFxdWVCeVZhbHVlVHlwZSgnJShuYW1lKXMnKSIgJSB7Im5hbWUiOiB0eXB9CisgICAgZXhlYyBleGVjc3RyCiAKIAogaWYgMDoKLQkjIHRoZXNlIHR5cGVzIHdpbGwgaGF2ZSBubyBtZXRob2RzIGFuZCB3aWxsIG1lcmVseSBiZSBvcGFxdWUgYmxvYnMKLQkjIHNob3VsZCB3cml0ZSBnZXRhdHRyIGFuZCBzZXRhdHRyIGZvciB0aGVtPworICAgICMgdGhlc2UgdHlwZXMgd2lsbCBoYXZlIG5vIG1ldGhvZHMgYW5kIHdpbGwgbWVyZWx5IGJlIG9wYXF1ZSBibG9icworICAgICMgc2hvdWxkIHdyaXRlIGdldGF0dHIgYW5kIHNldGF0dHIgZm9yIHRoZW0/CiAKLQlTdHJ1Y3RPYmplY3RUeXBlcyA9IFsiRXZlbnRUeXBlU3BlYyIsCi0JCQkJCQkiSElQb2ludCIsCi0JCQkJCQkiSElDb21tYW5kIiwKLQkJCQkJCSJFdmVudEhvdEtleUlEIiwKLQkJCQkJCV0KKyAgICBTdHJ1Y3RPYmplY3RUeXBlcyA9IFsiRXZlbnRUeXBlU3BlYyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJISVBvaW50IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkhJQ29tbWFuZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFdmVudEhvdEtleUlEIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXQogCi0JZm9yIHR5cCBpbiBTdHJ1Y3RPYmplY3RUeXBlczoKLQkJZXhlY3N0ciA9ICIlKG5hbWUpcyA9IE9wYXF1ZVR5cGUoJyUobmFtZSlzJykiICUgeyJuYW1lIjogdHlwfQotCQlleGVjIGV4ZWNzdHIKKyAgICBmb3IgdHlwIGluIFN0cnVjdE9iamVjdFR5cGVzOgorICAgICAgICBleGVjc3RyID0gIiUobmFtZSlzID0gT3BhcXVlVHlwZSgnJShuYW1lKXMnKSIgJSB7Im5hbWUiOiB0eXB9CisgICAgICAgIGV4ZWMgZXhlY3N0cgogCiBFdmVudEhvdEtleUlEID0gT3BhcXVlQnlWYWx1ZVR5cGUoIkV2ZW50SG90S2V5SUQiLCAiRXZlbnRIb3RLZXlJRCIpCiBFdmVudFR5cGVTcGVjX3B0ciA9IE9wYXF1ZVR5cGUoIkV2ZW50VHlwZVNwZWMiLCAiRXZlbnRUeXBlU3BlYyIpCkBAIC0zNSwxMCArMzUsMTAgQEAKICMgaGVyZSBhcmUgc29tZSB0eXBlcyB0aGF0IGFyZSByZWFsbHkgb3RoZXIgdHlwZXMKIAogY2xhc3MgTXlWYXJJbnB1dEJ1ZmZlclR5cGUoVmFySW5wdXRCdWZmZXJUeXBlKToKLQlkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19sZW5fXywgJXNfX2luX18iICUgKG5hbWUsIG5hbWUpCisgICAgZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlc19fbGVuX18sICVzX19pbl9fIiAlIChuYW1lLCBuYW1lKQogCi1NeUluQnVmZmVyID0gTXlWYXJJbnB1dEJ1ZmZlclR5cGUoJ2NoYXInLCAnbG9uZycsICdsJykJCSMgKGJ1ZiwgbGVuKQorTXlJbkJ1ZmZlciA9IE15VmFySW5wdXRCdWZmZXJUeXBlKCdjaGFyJywgJ2xvbmcnLCAnbCcpICAgICAgICAgICMgKGJ1ZiwgbGVuKQogCiBFdmVudFRpbWUgPSBkb3VibGUKIEV2ZW50VGltZW91dCA9IEV2ZW50VGltZQpAQCAtNjEsMTEgKzYxLDExIEBACiBDYXJib25FdmVudHNNZXRob2QgPSBPU0Vyck1ldGhvZEdlbmVyYXRvcgogCiBjbGFzcyBFdmVudEhhbmRsZXJSZWZNZXRob2QoT1NFcnJNZXRob2RHZW5lcmF0b3IpOgotCWRlZiBwcmVjaGVjayhzZWxmKToKLQkJT3V0TGJyYWNlKCdpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKScpCi0JCU91dHB1dCgnUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOycpCi0JCU91dHB1dCgncmV0dXJuIE5VTEw7JykKLQkJT3V0UmJyYWNlKCkKKyAgICBkZWYgcHJlY2hlY2soc2VsZik6CisgICAgICAgIE91dExicmFjZSgnaWYgKF9zZWxmLT5vYl9pdHNlbGYgPT0gTlVMTCknKQorICAgICAgICBPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhDYXJib25FdmVudHNfRXJyb3IsICJIYW5kbGVyIGhhcyBiZWVuIHJlbW92ZWQiKTsnKQorICAgICAgICBPdXRwdXQoJ3JldHVybiBOVUxMOycpCisgICAgICAgIE91dFJicmFjZSgpCiAKIAogUmduSGFuZGxlID0gT3BhcXVlQnlWYWx1ZVR5cGUoIlJnbkhhbmRsZSIsICJSZXNPYmoiKQpAQCAtODksMTcgKzg5LDE3IEBACiBzdGF0aWMgUHlPYmplY3QqCiBFdmVudFR5cGVTcGVjX05ldyhFdmVudFR5cGVTcGVjICppbikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBpbi0+ZXZlbnRDbGFzcywgaW4tPmV2ZW50S2luZCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIGluLT5ldmVudENsYXNzLCBpbi0+ZXZlbnRLaW5kKTsKIH0KIAogc3RhdGljIGludAogRXZlbnRUeXBlU3BlY19Db252ZXJ0KFB5T2JqZWN0ICp2LCBFdmVudFR5cGVTcGVjICpvdXQpCiB7Ci0JaWYgKFB5QXJnX1BhcnNlKHYsICIoTyZsKSIsCi0JICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJihvdXQtPmV2ZW50Q2xhc3MpLAotCSAgICAgICAgICAgICAgICAmKG91dC0+ZXZlbnRLaW5kKSkpCi0JCXJldHVybiAxOwotCXJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlBcmdfUGFyc2UodiwgIihPJmwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJihvdXQtPmV2ZW50Q2xhc3MpLAorICAgICAgICAgICAgICAgICAgICAgICAgJihvdXQtPmV2ZW50S2luZCkpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50VHlwZVNwZWMgKioqKioqKi8KQEAgLTExMCwxNSArMTEwLDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBISVBvaW50X05ldyhISVBvaW50ICppbikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZmYiLCBpbi0+eCwgaW4tPnkpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiZmYiLCBpbi0+eCwgaW4tPnkpOwogfQogCiBzdGF0aWMgaW50CiBISVBvaW50X0NvbnZlcnQoUHlPYmplY3QgKnYsIEhJUG9pbnQgKm91dCkKIHsKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiZmYiLCAmKG91dC0+eCksICYob3V0LT55KSkpCi0JCXJldHVybiAxOwotCXJldHVybiBOVUxMOworICAgICAgICBpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAiZmYiLCAmKG91dC0+eCksICYob3V0LT55KSkpCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogI2VuZGlmCiAKQEAgLTEyOSwxNSArMTI5LDE1IEBACiBzdGF0aWMgUHlPYmplY3QqCiBFdmVudEhvdEtleUlEX05ldyhFdmVudEhvdEtleUlEICppbikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBpbi0+c2lnbmF0dXJlLCBpbi0+aWQpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCBpbi0+c2lnbmF0dXJlLCBpbi0+aWQpOwogfQogCiBzdGF0aWMgaW50CiBFdmVudEhvdEtleUlEX0NvbnZlcnQoUHlPYmplY3QgKnYsIEV2ZW50SG90S2V5SUQgKm91dCkKIHsKLQlpZiAoUHlBcmdfUGFyc2VUdXBsZSh2LCAibGwiLCAmb3V0LT5zaWduYXR1cmUsICZvdXQtPmlkKSkKLQkJcmV0dXJuIDE7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIGlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJsbCIsICZvdXQtPnNpZ25hdHVyZSwgJm91dC0+aWQpKQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIAogLyoqKioqKioqKiogZW5kIEV2ZW50SG90S2V5SUQgKioqKioqKi8KQEAgLTE0OCwyNyArMTQ4LDI3IEBACiAKIHN0YXRpYyBwYXNjYWwgT1NTdGF0dXMKIG15RXZlbnRIYW5kbGVyKEV2ZW50SGFuZGxlckNhbGxSZWYgaGFuZGxlclJlZiwgRXZlbnRSZWYgZXZlbnQsIHZvaWQgKm91dFB5T2JqZWN0KSB7Ci0JUHlPYmplY3QgKnJldFZhbHVlOwotCWludCBzdGF0dXM7CisgICAgICAgIFB5T2JqZWN0ICpyZXRWYWx1ZTsKKyAgICAgICAgaW50IHN0YXR1czsKIAotCXJldFZhbHVlID0gUHlPYmplY3RfQ2FsbEZ1bmN0aW9uKChQeU9iamVjdCAqKW91dFB5T2JqZWN0LCAiTyZPJiIsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcsIGhhbmRsZXJSZWYsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRSZWZfTmV3LCBldmVudCk7Ci0JaWYgKHJldFZhbHVlID09IE5VTEwpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkVycm9yIGluIGV2ZW50IGhhbmRsZXIgY2FsbGJhY2s6XG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsgIC8qIHRoaXMgYWxzbyBjbGVhcnMgdGhlIGVycm9yICovCi0JCXN0YXR1cyA9IG5vRXJyOyAvKiBjb21wbGFpbj8gaG93PyAqLwotCX0gZWxzZSB7Ci0JCWlmIChyZXRWYWx1ZSA9PSBQeV9Ob25lKQotCQkJc3RhdHVzID0gbm9FcnI7Ci0JCWVsc2UgaWYgKFB5SW50X0NoZWNrKHJldFZhbHVlKSkgewotCQkJc3RhdHVzID0gUHlJbnRfQXNMb25nKHJldFZhbHVlKTsKLQkJfSBlbHNlCi0JCQlzdGF0dXMgPSBub0VycjsgLyogd3Jvbmcgb2JqZWN0IHR5cGUsIGNvbXBsYWluPyAqLwotCQlQeV9ERUNSRUYocmV0VmFsdWUpOwotCX0KKyAgICAgICAgcmV0VmFsdWUgPSBQeU9iamVjdF9DYWxsRnVuY3Rpb24oKFB5T2JqZWN0ICopb3V0UHlPYmplY3QsICJPJk8mIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRIYW5kbGVyQ2FsbFJlZl9OZXcsIGhhbmRsZXJSZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50UmVmX05ldywgZXZlbnQpOworICAgICAgICBpZiAocmV0VmFsdWUgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFcnJvciBpbiBldmVudCBoYW5kbGVyIGNhbGxiYWNrOlxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsgIC8qIHRoaXMgYWxzbyBjbGVhcnMgdGhlIGVycm9yICovCisgICAgICAgICAgICAgICAgc3RhdHVzID0gbm9FcnI7IC8qIGNvbXBsYWluPyBob3c/ICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYgKHJldFZhbHVlID09IFB5X05vbmUpCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsKKyAgICAgICAgICAgICAgICBlbHNlIGlmIChQeUludF9DaGVjayhyZXRWYWx1ZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IFB5SW50X0FzTG9uZyhyZXRWYWx1ZSk7CisgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSBub0VycjsgLyogd3Jvbmcgb2JqZWN0IHR5cGUsIGNvbXBsYWluPyAqLworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihyZXRWYWx1ZSk7CisgICAgICAgIH0KIAotCXJldHVybiBzdGF0dXM7CisgICAgICAgIHJldHVybiBzdGF0dXM7CiB9CiAKIC8qKioqKioqKiBlbmQgbXlFdmVudEhhbmRsZXIgKioqKioqKioqKiovCkBAIC0xODQsNTYgKzE4NCw1NiBAQAogCiAKIGNsYXNzIEV2ZW50SGFuZGxlclJlZk9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIiVzIG9iX2l0c2VsZjsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgiUHlPYmplY3QgKm9iX2NhbGxiYWNrOyIpCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPdXRwdXQoIml0LT5vYl9pdHNlbGYgPSAlc2l0c2VsZjsiLCBzZWxmLmFyZ3JlZikKLQkJT3V0cHV0KCJpdC0+b2JfY2FsbGJhY2sgPSBOVUxMOyIpCi0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBuYW1lKToKLQkJT3V0TGJyYWNlKCJpZiAoc2VsZi0+b2JfaXRzZWxmICE9IE5VTEwpIikKLQkJT3V0cHV0KCJSZW1vdmVFdmVudEhhbmRsZXIoc2VsZi0+b2JfaXRzZWxmKTsiKQotCQlPdXRwdXQoIlB5X0RFQ1JFRihzZWxmLT5vYl9jYWxsYmFjayk7IikKLQkJT3V0UmJyYWNlKCkKLQkJCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiJXMgb2JfaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2s7IikKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiaXQtPm9iX2l0c2VsZiA9ICVzaXRzZWxmOyIsIHNlbGYuYXJncmVmKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9jYWxsYmFjayA9IE5VTEw7IikKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRMYnJhY2UoImlmIChzZWxmLT5vYl9pdHNlbGYgIT0gTlVMTCkiKQorICAgICAgICBPdXRwdXQoIlJlbW92ZUV2ZW50SGFuZGxlcihzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgICAgIE91dHB1dCgiUHlfREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCiBjbGFzcyBNeUdsb2JhbE9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCXBhc3MKKyAgICBwYXNzCiAKIGZvciB0eXAgaW4gUmVmT2JqZWN0VHlwZXM6Ci0JaWYgdHlwID09ICdFdmVudEhhbmRsZXJSZWYnOgotCQlFdmVudEhhbmRsZXJSZWZvYmplY3QgPSBFdmVudEhhbmRsZXJSZWZPYmplY3REZWZpbml0aW9uKCdFdmVudEhhbmRsZXJSZWYnKQotCWVsc2U6Ci0JCWV4ZWNzdHIgPSB0eXAgKyAnb2JqZWN0ID0gTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKHR5cCknCi0JCWV4ZWMgZXhlY3N0cgotCW1vZHVsZS5hZGRvYmplY3QoZXZhbCh0eXAgKyAnb2JqZWN0JykpCisgICAgaWYgdHlwID09ICdFdmVudEhhbmRsZXJSZWYnOgorICAgICAgICBFdmVudEhhbmRsZXJSZWZvYmplY3QgPSBFdmVudEhhbmRsZXJSZWZPYmplY3REZWZpbml0aW9uKCdFdmVudEhhbmRsZXJSZWYnKQorICAgIGVsc2U6CisgICAgICAgIGV4ZWNzdHIgPSB0eXAgKyAnb2JqZWN0ID0gTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKHR5cCknCisgICAgICAgIGV4ZWMgZXhlY3N0cgorICAgIG1vZHVsZS5hZGRvYmplY3QoZXZhbCh0eXAgKyAnb2JqZWN0JykpCiAKIAogZnVuY3Rpb25zID0gW10KIGZvciB0eXAgaW4gUmVmT2JqZWN0VHlwZXM6ICMjIGdvIHRocnUgYWxsIE9iamVjdFR5cGVzIGFzIGRlZmluZWQgaW4gQ2FyYm9uRXZlbnRzc2Nhbi5weQotCSMgaW5pdGlhbGl6ZSB0aGUgbGlzdHMgZm9yIGNhcmJvbmdlbiB0byBmaWxsCi0JZXhlY3N0ciA9IHR5cCArICdtZXRob2RzID0gW10nCi0JZXhlYyBleGVjc3RyCisgICAgIyBpbml0aWFsaXplIHRoZSBsaXN0cyBmb3IgY2FyYm9uZ2VuIHRvIGZpbGwKKyAgICBleGVjc3RyID0gdHlwICsgJ21ldGhvZHMgPSBbXScKKyAgICBleGVjIGV4ZWNzdHIKIAogZXhlY2ZpbGUoJ0NhcmJvbkV2ZW50c2dlbi5weScpCiAKIAogCi1mb3IgZiBpbiBmdW5jdGlvbnM6IG1vZHVsZS5hZGQoZikJIyBhZGQgYWxsIHRoZSBmdW5jdGlvbnMgY2FyYm9uZXZlbnRzZ2VuIHB1dCBpbiB0aGUgbGlzdAorZm9yIGYgaW4gZnVuY3Rpb25zOiBtb2R1bGUuYWRkKGYpICAgICAgICMgYWRkIGFsbCB0aGUgZnVuY3Rpb25zIGNhcmJvbmV2ZW50c2dlbiBwdXQgaW4gdGhlIGxpc3QKIAotZm9yIHR5cCBpbiBSZWZPYmplY3RUeXBlczoJCQkJICMjIGdvIHRocnUgYWxsIE9iamVjdFR5cGVzIGFzIGRlZmluZWQgaW4gQ2FyYm9uRXZlbnRzc2Nhbi5weQotCW1ldGhvZHMgPSBldmFsKHR5cCArICdtZXRob2RzJykgICMjIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWV0aG9kIGxpc3QgZnJvbSB0aGUgbWFpbiBuYW1lc3BhY2UKLQlvYmogPSBldmFsKHR5cCArICdvYmplY3QnKQkJICAjIyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdAotCWZvciBtIGluIG1ldGhvZHM6IG9iai5hZGQobSkJIyMgYWRkIGVhY2ggbWV0aG9kIGluIHRoZSBsaXN0IHRvIHRoZSBvYmplY3QKK2ZvciB0eXAgaW4gUmVmT2JqZWN0VHlwZXM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMjIGdvIHRocnUgYWxsIE9iamVjdFR5cGVzIGFzIGRlZmluZWQgaW4gQ2FyYm9uRXZlbnRzc2Nhbi5weQorICAgIG1ldGhvZHMgPSBldmFsKHR5cCArICdtZXRob2RzJykgICMjIGdldCBhIHJlZmVyZW5jZSB0byB0aGUgbWV0aG9kIGxpc3QgZnJvbSB0aGUgbWFpbiBuYW1lc3BhY2UKKyAgICBvYmogPSBldmFsKHR5cCArICdvYmplY3QnKSAgICAgICAgICAgICAgICAjIyBnZXQgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdAorICAgIGZvciBtIGluIG1ldGhvZHM6IG9iai5hZGQobSkgICAgIyMgYWRkIGVhY2ggbWV0aG9kIGluIHRoZSBsaXN0IHRvIHRoZSBvYmplY3QKIAogCiByZW1vdmVldmVudGhhbmRsZXIgPSAiIiIKIE9TU3RhdHVzIF9lcnI7CiBpZiAoX3NlbGYtPm9iX2l0c2VsZiA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKENhcmJvbkV2ZW50c19FcnJvciwgIkhhbmRsZXIgaGFzIGJlZW4gcmVtb3ZlZCIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ2FyYm9uRXZlbnRzX0Vycm9yLCAiSGFuZGxlciBoYXMgYmVlbiByZW1vdmVkIik7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX2VyciA9IFJlbW92ZUV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmKTsKIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfc2VsZi0+b2JfaXRzZWxmID0gTlVMTDsKQEAgLTI1NSwxNSArMjU1LDE1IEBACiBPU1N0YXR1cyBfZXJyOwogCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJk8iLCBFdmVudFR5cGVTcGVjX0NvbnZlcnQsICZpblNwZWMsICZjYWxsYmFjaykpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiBfZXJyID0gSW5zdGFsbEV2ZW50SGFuZGxlcihfc2VsZi0+b2JfaXRzZWxmLCBteUV2ZW50SGFuZGxlclVQUCwgMSwgJmluU3BlYywgKHZvaWQgKiljYWxsYmFjaywgJm91dFJlZik7CiBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogCiBfcmVzID0gRXZlbnRIYW5kbGVyUmVmX05ldyhvdXRSZWYpOwogaWYgKF9yZXMgIT0gTlVMTCkgewotCSgoRXZlbnRIYW5kbGVyUmVmT2JqZWN0KilfcmVzKS0+b2JfY2FsbGJhY2sgPSBjYWxsYmFjazsKLQlQeV9JTkNSRUYoY2FsbGJhY2spOworICAgICAgICAoKEV2ZW50SGFuZGxlclJlZk9iamVjdCopX3JlcyktPm9iX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7CiB9CiByZXR1cm4gX3JlczsiIiIKIApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2YvY2ZzY2FuLnB5IGIvTWFjL01vZHVsZXMvY2YvY2ZzY2FuLnB5CmluZGV4IGFhMGVhM2QuLmQyZGU5MmUgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL2Nmc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9jZi9jZnNjYW4ucHkKQEAgLTgsMTM1ICs4LDEzNSBAQAogCiBMT05HID0gIkNvcmVGb3VuZGF0aW9uIgogU0hPUlQgPSAiY2YiCi1PQkpFQ1RTID0gKCJDRlR5cGVSZWYiLCAKLQkJIkNGQXJyYXlSZWYiLCAiQ0ZNdXRhYmxlQXJyYXlSZWYiLAotCQkiQ0ZEYXRhUmVmIiwgIkNGTXV0YWJsZURhdGFSZWYiLAotCQkiQ0ZEaWN0aW9uYXJ5UmVmIiwgIkNGTXV0YWJsZURpY3Rpb25hcnlSZWYiLAotCQkiQ0ZTdHJpbmdSZWYiLCAiQ0ZNdXRhYmxlU3RyaW5nUmVmIiwKLQkJIkNGVVJMUmVmIiwKLSMjCQkiQ0ZQcm9wZXJ0eUxpc3RSZWYiLAotCQkpCitPQkpFQ1RTID0gKCJDRlR5cGVSZWYiLAorICAgICAgICAgICAgICAgICJDRkFycmF5UmVmIiwgIkNGTXV0YWJsZUFycmF5UmVmIiwKKyAgICAgICAgICAgICAgICAiQ0ZEYXRhUmVmIiwgIkNGTXV0YWJsZURhdGFSZWYiLAorICAgICAgICAgICAgICAgICJDRkRpY3Rpb25hcnlSZWYiLCAiQ0ZNdXRhYmxlRGljdGlvbmFyeVJlZiIsCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nUmVmIiwgIkNGTXV0YWJsZVN0cmluZ1JlZiIsCisgICAgICAgICAgICAgICAgIkNGVVJMUmVmIiwKKyMjICAgICAgICAgICAgICAiQ0ZQcm9wZXJ0eUxpc3RSZWYiLAorICAgICAgICAgICAgICAgICkKICMgQUREIG9iamVjdCB0eXBlbmFtZXMgaGVyZQogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gWwotCQkiQ0ZCYXNlLmgiLAotCQkiQ0ZBcnJheS5oIiwKLSMjCQkiQ0ZCYWcuaCIsCi0jIwkJIkNGQnVuZGxlLmgiLAotIyMJCSJDRkNoYXJhY3RlclNldC5oIiwKLQkJIkNGRGF0YS5oIiwKLSMjCQkiQ0ZEYXRlLmgiLAotCQkiQ0ZEaWN0aW9uYXJ5LmgiLAotIyMJCSJDRk51bWJlci5oIiwKLSMjCQkiQ0ZQbHVnSW4uaCIsCi0JCSJDRlByZWZlcmVuY2VzLmgiLAotCQkiQ0ZQcm9wZXJ0eUxpc3QuaCIsCi0jIwkJIkNGU2V0LmgiLAotCQkiQ0ZTdHJpbmcuaCIsCi0jIwkJIkNGU3RyaW5nRW5jb2RpbmdFeHQuaCIsCi0jIwkJIkNGVGltZVpvbmUuaCIsCi0JCSJDRlVSTC5oIiwKLQkJXQotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IFsKKyAgICAgICAgICAgICJDRkJhc2UuaCIsCisgICAgICAgICAgICAiQ0ZBcnJheS5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZCYWcuaCIsCisjIyAgICAgICAgICAgICAgIkNGQnVuZGxlLmgiLAorIyMgICAgICAgICAgICAgICJDRkNoYXJhY3RlclNldC5oIiwKKyAgICAgICAgICAgICJDRkRhdGEuaCIsCisjIyAgICAgICAgICAgICAgIkNGRGF0ZS5oIiwKKyAgICAgICAgICAgICJDRkRpY3Rpb25hcnkuaCIsCisjIyAgICAgICAgICAgICAgIkNGTnVtYmVyLmgiLAorIyMgICAgICAgICAgICAgICJDRlBsdWdJbi5oIiwKKyAgICAgICAgICAgICJDRlByZWZlcmVuY2VzLmgiLAorICAgICAgICAgICAgIkNGUHJvcGVydHlMaXN0LmgiLAorIyMgICAgICAgICAgICAgICJDRlNldC5oIiwKKyAgICAgICAgICAgICJDRlN0cmluZy5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZTdHJpbmdFbmNvZGluZ0V4dC5oIiwKKyMjICAgICAgICAgICAgICAiQ0ZUaW1lWm9uZS5oIiwKKyAgICAgICAgICAgICJDRlVSTC5oIiwKKyAgICAgICAgICAgIF0KKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyX09TWCk6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0IGFuZCBuYW1lWzoxM10gIT0gJ0NGUHJlZmVyZW5jZXMnOgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKLQkJCSMgU3BlY2lhbCBjYXNlIGZvciB0aGUgc2lsbHkgZmlyc3QgQWxsb2NhdG9yUmVmIGFyZ3VtZW50Ci0JCQlpZiB0ID09ICdDRkFsbG9jYXRvclJlZicgYW5kIG0gPT0gJ0luTW9kZScgYW5kIGxlbihhcmdsaXN0KSA+IDE6Ci0JCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMV0KLQkJCQlpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJCWNsYXNzbmFtZSA9ICJNZXRob2RTa2lwQXJnMSIKLQkJCQkJbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3QgYW5kIG5hbWVbOjEzXSAhPSAnQ0ZQcmVmZXJlbmNlcyc6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgorICAgICAgICAgICAgIyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzaWxseSBmaXJzdCBBbGxvY2F0b3JSZWYgYXJndW1lbnQKKyAgICAgICAgICAgIGlmIHQgPT0gJ0NGQWxsb2NhdG9yUmVmJyBhbmQgbSA9PSAnSW5Nb2RlJyBhbmQgbGVuKGFyZ2xpc3QpID4gMToKKyAgICAgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFsxXQorICAgICAgICAgICAgICAgIGlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZFNraXBBcmcxIgorICAgICAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIE1lbW9yeSBhbGxvY2F0b3IgZnVuY3Rpb25zCi0JCQkiQ0ZBbGxvY2F0b3JHZXREZWZhdWx0IiwKLQkJCSJDRkFsbG9jYXRvclNldERlZmF1bHQiLAotCQkJIkNGQWxsb2NhdG9yQWxsb2NhdGUiLAotCQkJIkNGQWxsb2NhdG9yUmVhbGxvY2F0ZSIsCi0JCQkiQ0ZBbGxvY2F0b3JEZWFsbG9jYXRlIiwKLQkJCSJDRkdldEFsbG9jYXRvciIsCi0JCQkjIEFycmF5IGZ1bmN0aW9ucyB3ZSBza2lwIGZvciBub3cuCi0JCQkiQ0ZBcnJheUdldFZhbHVlQXRJbmRleCIsCi0JCQkjIERhdGEgcG9pbnRlciBmdW5jdGlvbnMuIFNraXAgZm9yIG5vdy4KLQkJCSJDRkRhdGFHZXRCeXRlUHRyIiwKLQkJCSJDRkRhdGFHZXRNdXRhYmxlQnl0ZVB0ciIsCi0JCQkiQ0ZEYXRhR2V0Qnl0ZXMiLCAgICMgWFhYWCBTaG91bGQgc3VwcG9ydCB0aGlzIG9uZQotCQkJIyBTdHJpbmcgZnVuY3Rpb25zCi0JCQkiQ0ZTdHJpbmdHZXRQYXNjYWxTdHJpbmciLCAjIFVzZSB0aGUgQy1zdHJpbmcgbWV0aG9kcy4KLQkJCSJDRlN0cmluZ0dldFBhc2NhbFN0cmluZ1B0ciIsICMgVEJEIGF1dG9tYXRpY2FsbHkKLQkJCSJDRlN0cmluZ0dldENTdHJpbmdQdHIiLCAKLQkJCSJDRlN0cmluZ0dldENoYXJhY3RlcnNQdHIiLAotCQkJIkNGU3RyaW5nR2V0Q1N0cmluZyIsIAotCQkJIkNGU3RyaW5nR2V0Q2hhcmFjdGVycyIsCi0JCQkiQ0ZVUkxDcmVhdGVTdHJpbmdXaXRoRmlsZVN5c3RlbVBhdGgiLCAjIEdvbmUgaW4gbGF0ZXIgcmVsZWFzZXMKLQkJCSJDRlN0cmluZ0NyZWF0ZU11dGFibGVXaXRoRXh0ZXJuYWxDaGFyYWN0ZXJzTm9Db3B5IiwgIyBOb3QgYSBjbHVlLi4uCi0JCQkiQ0ZTdHJpbmdTZXRFeHRlcm5hbENoYXJhY3RlcnNOb0NvcHkiLAotCQkJIkNGU3RyaW5nR2V0Q2hhcmFjdGVyQXRJbmRleCIsICMgTm8gZm9ybWF0IGZvciBzaW5nbGUgdW5pY2hhcnMgeWV0LgotCQkJImtDRlN0cmluZ0VuY29kaW5nSW52YWxpZElkIiwgIyBpbmNvbXBhdGlibGUgY29uc3RhbnQgZGVjbGFyYXRpb24KLQkJCSJDRlByb3BlcnR5TGlzdENyZWF0ZUZyb21YTUxEYXRhIiwgIyBNYW51YWxseSBnZW5lcmF0ZWQKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICMgTWVtb3J5IGFsbG9jYXRvciBmdW5jdGlvbnMKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JHZXREZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JTZXREZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JBbGxvY2F0ZSIsCisgICAgICAgICAgICAgICAgIkNGQWxsb2NhdG9yUmVhbGxvY2F0ZSIsCisgICAgICAgICAgICAgICAgIkNGQWxsb2NhdG9yRGVhbGxvY2F0ZSIsCisgICAgICAgICAgICAgICAgIkNGR2V0QWxsb2NhdG9yIiwKKyAgICAgICAgICAgICAgICAjIEFycmF5IGZ1bmN0aW9ucyB3ZSBza2lwIGZvciBub3cuCisgICAgICAgICAgICAgICAgIkNGQXJyYXlHZXRWYWx1ZUF0SW5kZXgiLAorICAgICAgICAgICAgICAgICMgRGF0YSBwb2ludGVyIGZ1bmN0aW9ucy4gU2tpcCBmb3Igbm93LgorICAgICAgICAgICAgICAgICJDRkRhdGFHZXRCeXRlUHRyIiwKKyAgICAgICAgICAgICAgICAiQ0ZEYXRhR2V0TXV0YWJsZUJ5dGVQdHIiLAorICAgICAgICAgICAgICAgICJDRkRhdGFHZXRCeXRlcyIsICAgIyBYWFhYIFNob3VsZCBzdXBwb3J0IHRoaXMgb25lCisgICAgICAgICAgICAgICAgIyBTdHJpbmcgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0UGFzY2FsU3RyaW5nIiwgIyBVc2UgdGhlIEMtc3RyaW5nIG1ldGhvZHMuCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nR2V0UGFzY2FsU3RyaW5nUHRyIiwgIyBUQkQgYXV0b21hdGljYWxseQorICAgICAgICAgICAgICAgICJDRlN0cmluZ0dldENTdHJpbmdQdHIiLAorICAgICAgICAgICAgICAgICJDRlN0cmluZ0dldENoYXJhY3RlcnNQdHIiLAorICAgICAgICAgICAgICAgICJDRlN0cmluZ0dldENTdHJpbmciLAorICAgICAgICAgICAgICAgICJDRlN0cmluZ0dldENoYXJhY3RlcnMiLAorICAgICAgICAgICAgICAgICJDRlVSTENyZWF0ZVN0cmluZ1dpdGhGaWxlU3lzdGVtUGF0aCIsICMgR29uZSBpbiBsYXRlciByZWxlYXNlcworICAgICAgICAgICAgICAgICJDRlN0cmluZ0NyZWF0ZU11dGFibGVXaXRoRXh0ZXJuYWxDaGFyYWN0ZXJzTm9Db3B5IiwgIyBOb3QgYSBjbHVlLi4uCisgICAgICAgICAgICAgICAgIkNGU3RyaW5nU2V0RXh0ZXJuYWxDaGFyYWN0ZXJzTm9Db3B5IiwKKyAgICAgICAgICAgICAgICAiQ0ZTdHJpbmdHZXRDaGFyYWN0ZXJBdEluZGV4IiwgIyBObyBmb3JtYXQgZm9yIHNpbmdsZSB1bmljaGFycyB5ZXQuCisgICAgICAgICAgICAgICAgImtDRlN0cmluZ0VuY29kaW5nSW52YWxpZElkIiwgIyBpbmNvbXBhdGlibGUgY29uc3RhbnQgZGVjbGFyYXRpb24KKyAgICAgICAgICAgICAgICAiQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSIsICMgTWFudWFsbHkgZ2VuZXJhdGVkCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VncmV5bGlzdChzZWxmKToKLQkJcmV0dXJuIFtdCisgICAgZGVmIG1ha2VncmV5bGlzdChzZWxmKToKKyAgICAgICAgcmV0dXJuIFtdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkNGQ29tcGFyYXRvckZ1bmN0aW9uIiwgIyBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCi0JCQkiQ0ZBbGxvY2F0b3JDb250ZXh0IiwgIyBOb3QgaW50ZXJlc3RlZCBpbiBwcm92aWRpbmcgb3VyIG93biBhbGxvY2F0b3IKLQkJCSJ2b2lkX3B0cl9wdHIiLCAgIyBUcmlja3kuIFRoaXMgaXMgdGhlIGluaXRpYWxpemVyIGZvciBhcnJheXMuLi4KLQkJCSJ2b2lkX3B0ciIsICMgRGl0dG8gZm9yIHZhcmlvdXMgYXJyYXkgbG9va3VwIG1ldGhvZHMKLQkJCSJDRkFycmF5QXBwbGllckZ1bmN0aW9uIiwgIyBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCi0JCQkiQ0ZEaWN0aW9uYXJ5QXBwbGllckZ1bmN0aW9uIiwgIyBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCi0JCQkidmFfbGlzdCIsICMgRm9yIHByaW50Zi10by1hLWNmc3RyaW5nLiBVc2UgUHl0aG9uLgotCQkJImNvbnN0X0NGU3RyaW5nRW5jb2RpbmdfcHRyIiwgIyBUbyBiZSBkb25lLCBJIGd1ZXNzCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiQ0ZDb21wYXJhdG9yRnVuY3Rpb24iLCAjIENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICAgICAgICAgICAgICAiQ0ZBbGxvY2F0b3JDb250ZXh0IiwgIyBOb3QgaW50ZXJlc3RlZCBpbiBwcm92aWRpbmcgb3VyIG93biBhbGxvY2F0b3IKKyAgICAgICAgICAgICAgICAidm9pZF9wdHJfcHRyIiwgICMgVHJpY2t5LiBUaGlzIGlzIHRoZSBpbml0aWFsaXplciBmb3IgYXJyYXlzLi4uCisgICAgICAgICAgICAgICAgInZvaWRfcHRyIiwgIyBEaXR0byBmb3IgdmFyaW91cyBhcnJheSBsb29rdXAgbWV0aG9kcworICAgICAgICAgICAgICAgICJDRkFycmF5QXBwbGllckZ1bmN0aW9uIiwgIyBDYWxsYmFjayBmdW5jdGlvbiBwb2ludGVyCisgICAgICAgICAgICAgICAgIkNGRGljdGlvbmFyeUFwcGxpZXJGdW5jdGlvbiIsICMgQ2FsbGJhY2sgZnVuY3Rpb24gcG9pbnRlcgorICAgICAgICAgICAgICAgICJ2YV9saXN0IiwgIyBGb3IgcHJpbnRmLXRvLWEtY2ZzdHJpbmcuIFVzZSBQeXRob24uCisgICAgICAgICAgICAgICAgImNvbnN0X0NGU3RyaW5nRW5jb2RpbmdfcHRyIiwgIyBUbyBiZSBkb25lLCBJIGd1ZXNzCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIEJ1ZmZlcnMgaW4gQ0Ygc2VlbSB0byBiZSBwYXNzZWQgYXMgVUludDggKiBub3JtYWxseS4KLQkJCShbKCJVSW50OF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJDRkluZGV4IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIlVjaGFySW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCShbKCJVbmlDaGFyX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIkNGSW5kZXgiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiVW5pY29kZUluQnVmZmVyIiwgIioiLCAiKiIpXSksCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIyBCdWZmZXJzIGluIENGIHNlZW0gdG8gYmUgcGFzc2VkIGFzIFVJbnQ4ICogbm9ybWFsbHkuCisgICAgICAgICAgICAgICAgKFsoIlVJbnQ4X3B0ciIsICIqIiwgIkluTW9kZSIpLCAoIkNGSW5kZXgiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlVjaGFySW5CdWZmZXIiLCAiKiIsICIqIildKSwKIAotCQkJIyBTb21lIGZ1bmN0aW9ucyByZXR1cm4gYSBjb25zdCBjaGFyICouIERvbid0IHdvcnJ5LCB3ZSB3b24ndCBtb2RpZnkgaXQuCi0JCQkoWygiY29uc3RfY2hhcl9wdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLAotCQkJIFsoInJldHVybl9zdHJpbmdwdHIiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgYmFzZSBVUkxzIGFyZSBvcHRpb25hbCAocGFzcyBOb25lIGZvciBOVUxMKQotCQkJKFsoIkNGVVJMUmVmIiwgImJhc2VVUkwiLCAiSW5Nb2RlIildLAotCQkJIFsoIk9wdGlvbmFsQ0ZVUkxSZWYiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgV2UgaGFuZGxlIENGUHJvcGVydHlMaXN0UmVmIG9iamVjdHMgYXMgcGxhaW4gQ0ZUeXBlUmVmCi0JCQkoWygiQ0ZQcm9wZXJ0eUxpc3RSZWYiLCAiKiIsICIqIildLAotCQkJIFsoIkNGVHlwZVJlZiIsICIqIiwgIioiKV0pLAotCQkJXQotCQkJCisgICAgICAgICAgICAgICAgKFsoIlVuaUNoYXJfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiQ0ZJbmRleCIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVW5pY29kZUluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIFNvbWUgZnVuY3Rpb25zIHJldHVybiBhIGNvbnN0IGNoYXIgKi4gRG9uJ3Qgd29ycnksIHdlIHdvbid0IG1vZGlmeSBpdC4KKyAgICAgICAgICAgICAgICAoWygiY29uc3RfY2hhcl9wdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJyZXR1cm5fc3RyaW5ncHRyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIGJhc2UgVVJMcyBhcmUgb3B0aW9uYWwgKHBhc3MgTm9uZSBmb3IgTlVMTCkKKyAgICAgICAgICAgICAgICAoWygiQ0ZVUkxSZWYiLCAiYmFzZVVSTCIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdGlvbmFsQ0ZVUkxSZWYiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgV2UgaGFuZGxlIENGUHJvcGVydHlMaXN0UmVmIG9iamVjdHMgYXMgcGxhaW4gQ0ZUeXBlUmVmCisgICAgICAgICAgICAgICAgKFsoIkNGUHJvcGVydHlMaXN0UmVmIiwgIioiLCAiKiIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ0ZUeXBlUmVmIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY2YvY2ZzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvY2YvY2ZzdXBwb3J0LnB5CmluZGV4IDk1YWVhYTcuLjg3YjlhNmYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NmL2Nmc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9jZi9jZnN1cHBvcnQucHkKQEAgLTgsMzUgKzgsMzUgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTU9ETkFNRSA9ICdfQ0YnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTU9ETkFNRSA9ICdfQ0YnICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnQ0YnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ0NGJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKICMgU3BlY2lhbCBjYXNlIGdlbmVyYXRvciBmb3IgdGhlIGZ1bmN0aW9ucyB0aGF0IGhhdmUgYW4gQWxsb2NhdG9yUmVmIGZpcnN0IGFyZ3VtZW50LAogIyB3aGljaCB3ZSBza2lwIGFueXdheSwgYW5kIHRoZSBvYmplY3QgYXMgdGhlIHNlY29uZCBhcmcuCiBjbGFzcyBNZXRob2RTa2lwQXJnMShNZXRob2RHZW5lcmF0b3IpOgotCSIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgorICAgICIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgbGFzdCBhcmd1bWVudCIiIgogCi0JZGVmIHBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpOgotCQlpZiBsZW4oYXJncykgPCAyOgotCQkJcmFpc2UgVmFsdWVFcnJvciwgIk1ldGhvZFNraXBBcmcxIGV4cGVjdHMgYXQgbGVhc3QgMiBhcmdzIgotCQlhMCwgYTEsIGFyZ3MgPSBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzI6XQotCQl0MCwgbjAsIG0wID0gYTAKLQkJaWYgdDAgIT0gIkNGQWxsb2NhdG9yUmVmIiBhbmQgbTAgIT0gSW5Nb2RlOgotCQkJcmFpc2UgVmFsdWVFcnJvciwgIk1ldGhvZFNraXBBcmcxIHNob3VsZCBoYXZlIGR1bW15IEFsbG9jYXRvclJlZiBmaXJzdCBhcmciCi0JCXQxLCBuMSwgbTEgPSBhMQotCQlpZiBtMSAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCi0JCWR1bW15ID0gVmFyaWFibGUodDAsIG4wLCBtMCkKLQkJc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKGR1bW15KQotCQlzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQxLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQotCQlzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCisgICAgZGVmIHBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpOgorICAgICAgICBpZiBsZW4oYXJncykgPCAyOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk1ldGhvZFNraXBBcmcxIGV4cGVjdHMgYXQgbGVhc3QgMiBhcmdzIgorICAgICAgICBhMCwgYTEsIGFyZ3MgPSBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzI6XQorICAgICAgICB0MCwgbjAsIG0wID0gYTAKKyAgICAgICAgaWYgdDAgIT0gIkNGQWxsb2NhdG9yUmVmIiBhbmQgbTAgIT0gSW5Nb2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIk1ldGhvZFNraXBBcmcxIHNob3VsZCBoYXZlIGR1bW15IEFsbG9jYXRvclJlZiBmaXJzdCBhcmciCisgICAgICAgIHQxLCBuMSwgbTEgPSBhMQorICAgICAgICBpZiBtMSAhPSBJbk1vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCisgICAgICAgIGR1bW15ID0gVmFyaWFibGUodDAsIG4wLCBtMCkKKyAgICAgICAgc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKGR1bW15KQorICAgICAgICBzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQxLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQorICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCisgICAgICAgIEZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCiAKIAogIyBDcmVhdGUgdGhlIHR5cGUgb2JqZWN0cwpAQCAtMTExLDE5ICsxMTEsMTkgQEAKIFB5T2JqZWN0ICpDRlJhbmdlX05ldyhDRlJhbmdlICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGwiLCAobG9uZylpdHNlbGYtPmxvY2F0aW9uLCAobG9uZylpdHNlbGYtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJsbCIsIChsb25nKWl0c2VsZi0+bG9jYXRpb24sIChsb25nKWl0c2VsZi0+bGVuZ3RoKTsKIH0KIAogaW50CiBDRlJhbmdlX0NvbnZlcnQoUHlPYmplY3QgKnYsIENGUmFuZ2UgKnBfaXRzZWxmKQogewotCWxvbmcgbG9jYXRpb24sIGxlbmd0aDsKLQkKLQlpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCi0JCXJldHVybiAwOwotCXBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOwotCXBfaXRzZWxmLT5sZW5ndGggPSAoQ0ZJbmRleClsZW5ndGg7Ci0JcmV0dXJuIDE7CisgICAgICAgIGxvbmcgbG9jYXRpb24sIGxlbmd0aDsKKworICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgImxsIiwgJmxvY2F0aW9uLCAmbGVuZ3RoKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHBfaXRzZWxmLT5sb2NhdGlvbiA9IChDRkluZGV4KWxvY2F0aW9uOworICAgICAgICBwX2l0c2VsZi0+bGVuZ3RoID0gKENGSW5kZXgpbGVuZ3RoOworICAgICAgICByZXR1cm4gMTsKIH0KIAogLyogT3B0aW9uYWwgQ0ZVUkwgYXJndW1lbnQgb3IgTm9uZSAocGFzc2VkIGFzIE5VTEwpICovCkBAIC0xMzEsOCArMTMxLDggQEAKIE9wdGlvbmFsQ0ZVUkxSZWZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZVUkxSZWYgKnBfaXRzZWxmKQogewogICAgIGlmICggdiA9PSBQeV9Ob25lICkgewotICAgIAlwX2l0c2VsZiA9IE5VTEw7Ci0gICAgCXJldHVybiAxOworICAgICAgICBwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgIHJldHVybiAxOwogICAgIH0KICAgICByZXR1cm4gQ0ZVUkxSZWZPYmpfQ29udmVydCh2LCBwX2l0c2VsZik7CiB9CkBAIC0xNDMsNDIgKzE0Myw0MiBAQAogLyogUm91dGluZXMgdG8gY29udmVydCBhbnkgQ0YgdHlwZSB0by9mcm9tIHRoZSBjb3JyZXNwb25kaW5nIENGeHh4T2JqICovCiBQeU9iamVjdCAqQ0ZPYmpfTmV3KENGVHlwZVJlZiBpdHNlbGYpCiB7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKQotCXsKLQkJUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCWlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGQXJyYXlHZXRUeXBlSUQoKSkgcmV0dXJuIENGQXJyYXlSZWZPYmpfTmV3KChDRkFycmF5UmVmKWl0c2VsZik7Ci0JaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZEaWN0aW9uYXJ5R2V0VHlwZUlEKCkpIHJldHVybiBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3KChDRkRpY3Rpb25hcnlSZWYpaXRzZWxmKTsKLQlpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRhdGFHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGF0YVJlZk9ial9OZXcoKENGRGF0YVJlZilpdHNlbGYpOwotCWlmIChDRkdldFR5cGVJRChpdHNlbGYpID09IENGU3RyaW5nR2V0VHlwZUlEKCkpIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoKENGU3RyaW5nUmVmKWl0c2VsZik7Ci0JaWYgKENGR2V0VHlwZUlEKGl0c2VsZikgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkgcmV0dXJuIENGVVJMUmVmT2JqX05ldygoQ0ZVUkxSZWYpaXRzZWxmKTsKLQkvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9DRjJQeXRob24gaGVyZT8/ICovCi0JcmV0dXJuIENGVHlwZVJlZk9ial9OZXcoaXRzZWxmKTsKKyAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkFycmF5R2V0VHlwZUlEKCkpIHJldHVybiBDRkFycmF5UmVmT2JqX05ldygoQ0ZBcnJheVJlZilpdHNlbGYpOworICAgICAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGljdGlvbmFyeVJlZk9ial9OZXcoKENGRGljdGlvbmFyeVJlZilpdHNlbGYpOworICAgICAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRkRhdGFHZXRUeXBlSUQoKSkgcmV0dXJuIENGRGF0YVJlZk9ial9OZXcoKENGRGF0YVJlZilpdHNlbGYpOworICAgICAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlN0cmluZ0dldFR5cGVJRCgpKSByZXR1cm4gQ0ZTdHJpbmdSZWZPYmpfTmV3KChDRlN0cmluZ1JlZilpdHNlbGYpOworICAgICAgICBpZiAoQ0ZHZXRUeXBlSUQoaXRzZWxmKSA9PSBDRlVSTEdldFR5cGVJRCgpKSByZXR1cm4gQ0ZVUkxSZWZPYmpfTmV3KChDRlVSTFJlZilpdHNlbGYpOworICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgUHlDRl9DRjJQeXRob24gaGVyZT8/ICovCisgICAgICAgIHJldHVybiBDRlR5cGVSZWZPYmpfTmV3KGl0c2VsZik7CiB9CiBpbnQgQ0ZPYmpfQ29udmVydChQeU9iamVjdCAqdiwgQ0ZUeXBlUmVmICpwX2l0c2VsZikKIHsKIAotCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLwogCi0JaWYgKCFDRlR5cGVSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGTXV0YWJsZUFycmF5UmVmT2JqX0NoZWNrKHYpICYmCi0JCSFDRkRpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGRGF0YVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZNdXRhYmxlRGF0YVJlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKLQkJIUNGTXV0YWJsZVN0cmluZ1JlZk9ial9DaGVjayh2KSAmJgotCQkhQ0ZVUkxSZWZPYmpfQ2hlY2sodikgKQotCXsKLQkJLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIFB5Q0ZfUHl0aG9uMkNGIGhlcmU/PyAqLwotCQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7Ci0JCXJldHVybiAwOwotCX0KLQkqcF9pdHNlbGYgPSAoKENGVHlwZVJlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmICghQ0ZUeXBlUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICAgICAgICAgIUNGQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlQXJyYXlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZEaWN0aW9uYXJ5UmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICAgICAgICAgIUNGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZEYXRhUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICAgICAgICAgIUNGTXV0YWJsZURhdGFSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZTdHJpbmdSZWZPYmpfQ2hlY2sodikgJiYKKyAgICAgICAgICAgICAgICAhQ0ZNdXRhYmxlU3RyaW5nUmVmT2JqX0NoZWNrKHYpICYmCisgICAgICAgICAgICAgICAgIUNGVVJMUmVmT2JqX0NoZWNrKHYpICkKKyAgICAgICAgeworICAgICAgICAgICAgICAgIC8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBQeUNGX1B5dGhvbjJDRiBoZXJlPz8gKi8KKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiQ0Ygb2JqZWN0IHJlcXVpcmVkIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKyAgICAgICAgKnBfaXRzZWxmID0gKChDRlR5cGVSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICByZXR1cm4gMTsKIH0KICIiIgogCkBAIC0yMjUsNyArMjI1LDcgQEAKIENGVVJMUGF0aFN0eWxlID0gVHlwZSgiQ0ZVUkxQYXRoU3R5bGUiLCAibCIpICMgIGEgYml0IGRhbmdlcm91cywgaXQncyBhbiBlbnVtCiAKIGNoYXJfcHRyID0gc3RyaW5ncHRyCi1yZXR1cm5fc3RyaW5ncHRyID0gVHlwZSgiY2hhciAqIiwgInMiKQkjIE9OTFkgRk9SIFJFVFVSTiBWQUxVRVMhIQorcmV0dXJuX3N0cmluZ3B0ciA9IFR5cGUoImNoYXIgKiIsICJzIikgICMgT05MWSBGT1IgUkVUVVJOIFZBTFVFUyEhCiAKIENGQWxsb2NhdG9yUmVmID0gRmFrZVR5cGUoIihDRkFsbG9jYXRvclJlZilOVUxMIikKIENGQXJyYXlDYWxsQmFja3NfcHRyID0gRmFrZVR5cGUoIiZrQ0ZUeXBlQXJyYXlDYWxsQmFja3MiKQpAQCAtMjUxLDIzMyArMjUxLDIzMyBAQAogIyBPdXIgKG9wYXF1ZSkgb2JqZWN0cwogCiBjbGFzcyBNeUdsb2JhbE9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCdpZiAoaXRzZWxmID09IE5VTEwpJykKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCdQeUVycl9TZXRTdHJpbmcoUHlFeGNfUnVudGltZUVycm9yLCAiY2Fubm90IHdyYXAgTlVMTCIpOycpCi0JCU91dHB1dCgncmV0dXJuIE5VTEw7JykKLQkJT3V0UmJyYWNlKCkKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoQ0ZUeXBlUmVmIHB0cik7IikKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLSMjCQlPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsiKQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dCgiIiIKLQkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCQkvKiBDaGVjayBmb3Igb3RoZXIgQ0Ygb2JqZWN0cyBoZXJlICovCi0JCSIiIikKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoKENGVHlwZVJlZilzZWxmLT5vYl9pdHNlbGYpOyIpCi0JCU91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQotCQlPdXRSYnJhY2UoKQotCQkKLQlkZWYgb3V0cHV0Q29tcGFyZShzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgaW50ICVzX2NvbXBhcmUoJXMgKnNlbGYsICVzICpvdGhlcikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiLyogWFhYWCBPciBzaG91bGQgd2UgdXNlIENGRXF1YWw/PyAqLyIpCi0JCU91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7IikKLQkJT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7IikKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQkKLQlkZWYgb3V0cHV0SGFzaChzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgaW50ICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCIvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8iKQotCQlPdXRwdXQoInJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsiKQotCQlPdXRSYnJhY2UoKQotCQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZUeXBlUmVmIHR5cGUtJSVkIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKGludClDRkdldFR5cGVJRChzZWxmLT5vYl9pdHNlbGYpLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgnaWYgKGl0c2VsZiA9PSBOVUxMKScpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgnUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgImNhbm5vdCB3cmFwIE5VTEwiKTsnKQorICAgICAgICBPdXRwdXQoJ3JldHVybiBOVUxMOycpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoInZvaWQgKCpvYl9mcmVlaXQpKENGVHlwZVJlZiBwdHIpOyIpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisjIyAgICAgICAgICAgICAgT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBDRlJlbGVhc2U7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICBPdXQoIiIiCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAgICAgLyogQ2hlY2sgZm9yIG90aGVyIENGIG9iamVjdHMgaGVyZSAqLworICAgICAgICAiIiIpCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChzZWxmLT5vYl9mcmVlaXQgJiYgc2VsZi0+b2JfaXRzZWxmKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfZnJlZWl0KChDRlR5cGVSZWYpc2VsZi0+b2JfaXRzZWxmKTsiKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAotCWRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKLQkJT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKQotCQlPdXRwdXQKLQkJT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKLQkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfZnJlZWl0ID0gQ0ZSZWxlYXNlOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQotCQkKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoIiVzIGl0c2VsZjsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgiY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCAwfTsiKQotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJPJlwiLCBrdywgJXNfQ29udmVydCwgJml0c2VsZikpIiwKLQkJCXNlbGYucHJlZml4KQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlpZiBzZWxmLnByZWZpeCAhPSAnQ0ZUeXBlUmVmT2JqJzoKLQkJCU91dHB1dCgpCi0JCQlPdXRwdXQoIi8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLyIpCi0JCQlPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJPJlwiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSIpCi0JCQlPdXRMYnJhY2UoKQotCQkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQorICAgIGRlZiBvdXRwdXRDb21wYXJlKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBpbnQgJXNfY29tcGFyZSglcyAqc2VsZiwgJXMgKm90aGVyKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZFcXVhbD8/ICovIikKKyAgICAgICAgT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsiKQorICAgICAgICBPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0SGFzaChzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgaW50ICVzX2hhc2goJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIvKiBYWFhYIE9yIHNob3VsZCB3ZSB1c2UgQ0ZIYXNoPz8gKi8iKQorICAgICAgICBPdXRwdXQoInJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGVHlwZVJlZiB0eXBlLSUlZCBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsIChpbnQpQ0ZHZXRUeXBlSUQoc2VsZi0+b2JfaXRzZWxmKSwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbGY7IikKKyAgICAgICAgT3V0cHV0CisgICAgICAgIE91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBOVUxMOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2ZyZWVpdCA9IENGUmVsZWFzZTsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIHNlbGY7IikKKworICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiJXMgaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIDB9OyIpCisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcIk8mXCIsIGt3LCAlc19Db252ZXJ0LCAmaXRzZWxmKSkiLAorICAgICAgICAgICAgICAgIHNlbGYucHJlZml4KQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBpZiBzZWxmLnByZWZpeCAhPSAnQ0ZUeXBlUmVmT2JqJzoKKyAgICAgICAgICAgIE91dHB1dCgpCisgICAgICAgICAgICBPdXRwdXQoIi8qIEFueSBDRlR5cGVSZWYgZGVzY2VuZGVudCBpcyBhbGxvd2VkIGFzIGluaXRpYWxpemVyIHRvbyAqLyIpCisgICAgICAgICAgICBPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJPJlwiLCBrdywgQ0ZUeXBlUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYpKSIpCisgICAgICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQogCiBjbGFzcyBDRlR5cGVSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JcGFzcwotCQotY2xhc3MgQ0ZBcnJheVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKLQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZBcnJheVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQotY2xhc3MgQ0ZNdXRhYmxlQXJyYXlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZBcnJheVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQotY2xhc3MgQ0ZEaWN0aW9uYXJ5UmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRkRpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKLQkKLWNsYXNzIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZURpY3Rpb25hcnlSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKLQkKLWNsYXNzIENGRGF0YVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKLQkKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXQoIiIiCi0JCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkJaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7Ci0JCSAgICBjaGFyICpjU3RyOwotCQkgICAgaW50IGNMZW47Ci0JCSAgICBpZiggUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHYsICZjU3RyLCAmY0xlbikgPCAwICkgcmV0dXJuIDA7Ci0JCSAgICAqcF9pdHNlbGYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsICh1bnNpZ25lZCBjaGFyICopY1N0ciwgY0xlbik7Ci0JCSAgICByZXR1cm4gMTsKLQkJfQotCQkiIiIpCisgICAgcGFzcwogCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGRGF0YVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQotCQorY2xhc3MgQ0ZBcnJheVJlZk9iamVjdERlZmluaXRpb24oTXlHbG9iYWxPYmplY3REZWZpbml0aW9uKToKKyAgICBiYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRkFycmF5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKK2NsYXNzIENGTXV0YWJsZUFycmF5UmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgorICAgIGJhc2V0eXBlID0gIkNGQXJyYXlSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVBcnJheVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCitjbGFzcyBDRkRpY3Rpb25hcnlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6CisgICAgYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZEaWN0aW9uYXJ5UmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKK2NsYXNzIENGTXV0YWJsZURpY3Rpb25hcnlSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6CisgICAgYmFzZXR5cGUgPSAiQ0ZEaWN0aW9uYXJ5UmVmX1R5cGUiCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlRGljdGlvbmFyeVJlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCitjbGFzcyBDRkRhdGFSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6CisgICAgYmFzZXR5cGUgPSAiQ0ZUeXBlUmVmX1R5cGUiCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICBPdXQoIiIiCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KKyAgICAgICAgaWYgKFB5U3RyaW5nX0NoZWNrKHYpKSB7CisgICAgICAgICAgICBjaGFyICpjU3RyOworICAgICAgICAgICAgaW50IGNMZW47CisgICAgICAgICAgICBpZiggUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKHYsICZjU3RyLCAmY0xlbikgPCAwICkgcmV0dXJuIDA7CisgICAgICAgICAgICAqcF9pdHNlbGYgPSBDRkRhdGFDcmVhdGUoKENGQWxsb2NhdG9yUmVmKU5VTEwsICh1bnNpZ25lZCBjaGFyICopY1N0ciwgY0xlbik7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAiIiIpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZEYXRhUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKIGNsYXNzIENGTXV0YWJsZURhdGFSZWZPYmplY3REZWZpbml0aW9uKE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JYmFzZXR5cGUgPSAiQ0ZEYXRhUmVmX1R5cGUiCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZURhdGFSZWYgb2JqZWN0IGF0IDB4JSU4Ljh4IGZvciAweCUlOC44eD4iLCAodW5zaWduZWQpc2VsZiwgKHVuc2lnbmVkKXNlbGYtPm9iX2l0c2VsZik7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKKyAgICBiYXNldHlwZSA9ICJDRkRhdGFSZWZfVHlwZSIKKworICAgIGRlZiBvdXRwdXRSZXByKHNlbGYpOgorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCisgICAgICAgIE91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRk11dGFibGVEYXRhUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCiAKIGNsYXNzIENGU3RyaW5nUmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCU91dCgiIiIKLQkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotCQlpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKLQkJICAgIGNoYXIgKmNTdHI7Ci0JCSAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJlcyIsICJhc2NpaSIsICZjU3RyKSkKLQkJICAgIAlyZXR1cm4gTlVMTDsKLQkJCSpwX2l0c2VsZiA9IENGU3RyaW5nQ3JlYXRlV2l0aENTdHJpbmcoKENGQWxsb2NhdG9yUmVmKU5VTEwsIGNTdHIsIGtDRlN0cmluZ0VuY29kaW5nQVNDSUkpOwotCQkJcmV0dXJuIDE7Ci0JCX0KLQkJaWYgKFB5VW5pY29kZV9DaGVjayh2KSkgewotCQkJLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KLQkJCUNGSW5kZXggc2l6ZSA9IFB5VW5pY29kZV9HZXRTaXplKHYpOwotCQkJVW5pQ2hhciAqdW5pY2hhcnMgPSBQeVVuaWNvZGVfQXNVbmljb2RlKHYpOwotCQkJaWYgKCF1bmljaGFycykgcmV0dXJuIDA7Ci0JCQkqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDaGFyYWN0ZXJzKChDRkFsbG9jYXRvclJlZilOVUxMLCB1bmljaGFycywgc2l6ZSk7Ci0JCQlyZXR1cm4gMTsKLQkJfQotCQkJCi0JCSIiIikKKyAgICBiYXNldHlwZSA9ICJDRlR5cGVSZWZfVHlwZSIKIAotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRlN0cmluZ1JlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dCgiIiIKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICBpZiAoUHlTdHJpbmdfQ2hlY2sodikpIHsKKyAgICAgICAgICAgIGNoYXIgKmNTdHI7CisgICAgICAgICAgICBpZiAoIVB5QXJnX1BhcnNlKHYsICJlcyIsICJhc2NpaSIsICZjU3RyKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKChDRkFsbG9jYXRvclJlZilOVUxMLCBjU3RyLCBrQ0ZTdHJpbmdFbmNvZGluZ0FTQ0lJKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgLyogV2UgdXNlIHRoZSBDRiB0eXBlcyBoZXJlLCBpZiBQeXRob24gd2FzIGNvbmZpZ3VyZWQgZGlmZmVyZW50bHkgdGhhdCB3aWxsIGdpdmUgYW4gZXJyb3IgKi8KKyAgICAgICAgICAgICAgICBDRkluZGV4IHNpemUgPSBQeVVuaWNvZGVfR2V0U2l6ZSh2KTsKKyAgICAgICAgICAgICAgICBVbmlDaGFyICp1bmljaGFycyA9IFB5VW5pY29kZV9Bc1VuaWNvZGUodik7CisgICAgICAgICAgICAgICAgaWYgKCF1bmljaGFycykgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gQ0ZTdHJpbmdDcmVhdGVXaXRoQ2hhcmFjdGVycygoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwgdW5pY2hhcnMsIHNpemUpOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisKKyAgICAgICAgIiIiKQorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGU3RyaW5nUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCiAKIGNsYXNzIENGTXV0YWJsZVN0cmluZ1JlZk9iamVjdERlZmluaXRpb24oQ0ZTdHJpbmdSZWZPYmplY3REZWZpbml0aW9uKToKLQliYXNldHlwZSA9ICJDRlN0cmluZ1JlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCSMgTXV0YWJsZSwgZG9uJ3QgYWxsb3cgUHl0aG9uIHN0cmluZ3MKLQkJcmV0dXJuIE15R2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZikKLQkJCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKLQkJT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGTXV0YWJsZVN0cmluZ1JlZiBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQorICAgIGJhc2V0eXBlID0gIkNGU3RyaW5nUmVmX1R5cGUiCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICAjIE11dGFibGUsIGRvbid0IGFsbG93IFB5dGhvbiBzdHJpbmdzCisgICAgICAgIHJldHVybiBNeUdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8Q0ZNdXRhYmxlU3RyaW5nUmVmIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCiAKIGNsYXNzIENGVVJMUmVmT2JqZWN0RGVmaW5pdGlvbihNeUdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgotCQotCWRlZiBvdXRwdXRSZXByKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBQeU9iamVjdCAqICVzX3JlcHIoJXMgKnNlbGYpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJjaGFyIGJ1ZlsxMDBdOyIpCi0JCU91dHB1dCgiIiJzcHJpbnRmKGJ1ZiwgIjxDRlVSTCBvYmplY3QgYXQgMHglJTguOHggZm9yIDB4JSU4Ljh4PiIsICh1bnNpZ25lZClzZWxmLCAodW5zaWduZWQpc2VsZi0+b2JfaXRzZWxmKTsiIiIpCi0JCU91dHB1dCgicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoYnVmKTsiKQotCQlPdXRSYnJhY2UoKQorICAgIGJhc2V0eXBlID0gIkNGVHlwZVJlZl9UeXBlIgorCisgICAgZGVmIG91dHB1dFJlcHIoc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImNoYXIgYnVmWzEwMF07IikKKyAgICAgICAgT3V0cHV0KCIiInNwcmludGYoYnVmLCAiPENGVVJMIG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCiAKIAogIyBBREQgb2JqZWN0IGNsYXNzIGhlcmUKQEAgLTU1NCwxMCArNTU0LDEwIEBACiAKIGlmKCBkYXRhID09IE5VTEwgKSByZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKIGlmICggQ0ZTdHJpbmdHZXRDU3RyaW5nKF9zZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUsIDApICkgewotCV9yZXMgPSAoUHlPYmplY3QgKilQeVN0cmluZ19Gcm9tU3RyaW5nKGRhdGEpOworICAgICAgICBfcmVzID0gKFB5T2JqZWN0ICopUHlTdHJpbmdfRnJvbVN0cmluZyhkYXRhKTsKIH0gZWxzZSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkNGU3RyaW5nR2V0Q1N0cmluZyBjb3VsZCBub3QgZml0IHRoZSBzdHJpbmciKTsKLQlfcmVzID0gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIkNGU3RyaW5nR2V0Q1N0cmluZyBjb3VsZCBub3QgZml0IHRoZSBzdHJpbmciKTsKKyAgICAgICAgX3JlcyA9IE5VTEw7CiB9CiBmcmVlKGRhdGEpOwogcmV0dXJuIF9yZXM7CkBAIC02MDUsMTYgKzYwNSwxNiBAQAogQ0ZTdHJpbmdSZWYgZXJyb3JTdHJpbmc7CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwKICAgICAgICAgICAgICAgICAgICAgICAmbXV0YWJpbGl0eU9wdGlvbikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX3J2ID0gQ0ZQcm9wZXJ0eUxpc3RDcmVhdGVGcm9tWE1MRGF0YSgoQ0ZBbGxvY2F0b3JSZWYpTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX3NlbGYtPm9iX2l0c2VsZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJpbGl0eU9wdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yU3RyaW5nKTsKIGlmIChlcnJvclN0cmluZykKLQlDRlJlbGVhc2UoZXJyb3JTdHJpbmcpOworICAgICAgICBDRlJlbGVhc2UoZXJyb3JTdHJpbmcpOwogaWYgKF9ydiA9PSBOVUxMKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1J1bnRpbWVFcnJvciwgIlBhcnNlIGVycm9yIGluIFhNTCBkYXRhIik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19SdW50aW1lRXJyb3IsICJQYXJzZSBlcnJvciBpbiBYTUwgZGF0YSIpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsCiAgICAgICAgICAgICAgICAgICAgICBDRlR5cGVSZWZPYmpfTmV3LCBfcnYpOwpAQCAtNjM5LDE3ICs2MzksMTcgQEAKIENGVHlwZUlEIHR5cGVpZDsKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyYiLCBQeUNGX1B5dGhvbjJDRiwgJnJ2KSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB0eXBlaWQgPSBDRkdldFR5cGVJRChydik7CiAKIGlmICh0eXBlaWQgPT0gQ0ZTdHJpbmdHZXRUeXBlSUQoKSkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlN0cmluZ1JlZk9ial9OZXcsIHJ2KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZTdHJpbmdSZWZPYmpfTmV3LCBydik7CiBpZiAodHlwZWlkID09IENGQXJyYXlHZXRUeXBlSUQoKSkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkFycmF5UmVmT2JqX05ldywgcnYpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkFycmF5UmVmT2JqX05ldywgcnYpOwogaWYgKHR5cGVpZCA9PSBDRkRpY3Rpb25hcnlHZXRUeXBlSUQoKSkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRkRpY3Rpb25hcnlSZWZPYmpfTmV3LCBydik7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIENGRGljdGlvbmFyeVJlZk9ial9OZXcsIHJ2KTsKIGlmICh0eXBlaWQgPT0gQ0ZVUkxHZXRUeXBlSUQoKSkKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBDRlVSTFJlZk9ial9OZXcsIHJ2KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0ZVUkxSZWZPYmpfTmV3LCBydik7CiAKIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIENGVHlwZVJlZk9ial9OZXcsIHJ2KTsKIHJldHVybiBfcmVzOwpAQCAtNjYzLDQgKzY2MywzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jZy9jZ3NjYW4ucHkgYi9NYWMvTW9kdWxlcy9jZy9jZ3NjYW4ucHkKaW5kZXggNWQ4NDUwMC4uYjJlNzk0NiAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvY2cvY2dzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2NnL2Nnc2Nhbi5weQpAQCAtOCw3NyArOCw3NyBAQAogCiBMT05HID0gIkNvcmVHcmFwaGljcyIKIFNIT1JUID0gImNnIgotT0JKRUNUUyA9ICgiQ0dDb250ZXh0UmVmIiwgCi0JCSkKK09CSkVDVFMgPSAoIkNHQ29udGV4dFJlZiIsCisgICAgICAgICAgICAgICAgKQogIyBBREQgb2JqZWN0IHR5cGVuYW1lcyBoZXJlCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBbCi0JCSJDR0NvbnRleHQuaCIsCi0JXQotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IFsKKyAgICAgICAgICAgICJDR0NvbnRleHQuaCIsCisgICAgXQorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXJfT1NYKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgotCQkJIyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzaWxseSBmaXJzdCBBbGxvY2F0b3JSZWYgYXJndW1lbnQKLQkJCWlmIHQgPT0gJ0NGQWxsb2NhdG9yUmVmJyBhbmQgbSA9PSAnSW5Nb2RlJyBhbmQgbGVuKGFyZ2xpc3QpID4gMToKLQkJCQl0LCBuLCBtID0gYXJnbGlzdFsxXQotCQkJCWlmIHQgaW4gT0JKRUNUUyBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQkJY2xhc3NuYW1lID0gIk1ldGhvZFNraXBBcmcxIgotCQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisgICAgICAgICAgICAjIFNwZWNpYWwgY2FzZSBmb3IgdGhlIHNpbGx5IGZpcnN0IEFsbG9jYXRvclJlZiBhcmd1bWVudAorICAgICAgICAgICAgaWYgdCA9PSAnQ0ZBbGxvY2F0b3JSZWYnIGFuZCBtID09ICdJbk1vZGUnIGFuZCBsZW4oYXJnbGlzdCkgPiAxOgorICAgICAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzFdCisgICAgICAgICAgICAgICAgaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kU2tpcEFyZzEiCisgICAgICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gdCArICJfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJDR0NvbnRleHRSZXRhaW4iLAotCQkJIkNHQ29udGV4dFJlbGVhc2UiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkNHQ29udGV4dFJldGFpbiIsCisgICAgICAgICAgICAgICAgIkNHQ29udGV4dFJlbGVhc2UiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlZ3JleWxpc3Qoc2VsZik6Ci0JCXJldHVybiBbXQorICAgIGRlZiBtYWtlZ3JleWxpc3Qoc2VsZik6CisgICAgICAgIHJldHVybiBbXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJmbG9hdF9wdHIiLAotCQkJIkNHUmVjdF9wdHIiLAotCQkJIkNHUG9pbnRfcHRyIiwKLQkJCSJDR0NvbG9yU3BhY2VSZWYiLAotCQkJIkNHQ29sb3JSZW5kZXJpbmdJbnRlbnQiLAotCQkJIkNHRm9udFJlZiIsCi0jCQkJImNoYXJfcHRyIiwKLQkJCSJDR0dseXBoX3B0ciIsCi0JCQkiQ0dJbWFnZVJlZiIsCi0JCQkiQ0dQREZEb2N1bWVudFJlZiIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiZmxvYXRfcHRyIiwKKyAgICAgICAgICAgICAgICAiQ0dSZWN0X3B0ciIsCisgICAgICAgICAgICAgICAgIkNHUG9pbnRfcHRyIiwKKyAgICAgICAgICAgICAgICAiQ0dDb2xvclNwYWNlUmVmIiwKKyAgICAgICAgICAgICAgICAiQ0dDb2xvclJlbmRlcmluZ0ludGVudCIsCisgICAgICAgICAgICAgICAgIkNHRm9udFJlZiIsCisjICAgICAgICAgICAgICAgICAgICAgICAiY2hhcl9wdHIiLAorICAgICAgICAgICAgICAgICJDR0dseXBoX3B0ciIsCisgICAgICAgICAgICAgICAgIkNHSW1hZ2VSZWYiLAorICAgICAgICAgICAgICAgICJDR1BERkRvY3VtZW50UmVmIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJjaGFyX3B0ciIsICJjc3RyaW5nIiwgIkluTW9kZSIpLCAoInNpemVfdCIsICJsZW5ndGgiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0jCQkJKFsoImNoYXJfcHRyIiwgIm5hbWUiLCAiSW5Nb2RlIiksXSwKLSMJCQkgWygiQ0NDQ0MiLCAiKiIsICIqIildKSwKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCJjaGFyX3B0ciIsICJjc3RyaW5nIiwgIkluTW9kZSIpLCAoInNpemVfdCIsICJsZW5ndGgiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorIyAgICAgICAgICAgICAgICAgICAgICAgKFsoImNoYXJfcHRyIiwgIm5hbWUiLCAiSW5Nb2RlIiksXSwKKyMgICAgICAgICAgICAgICAgICAgICAgICBbKCJDQ0NDQyIsICIqIiwgIioiKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2NnL2Nnc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2NnL2Nnc3VwcG9ydC5weQppbmRleCA3ZGMyZDU0Li42ZWVkZmJlIDEwMDc1NQotLS0gYS9NYWMvTW9kdWxlcy9jZy9jZ3N1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvY2cvY2dzdXBwb3J0LnB5CkBAIC04LDEyICs4LDEyIEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1PRE5BTUUgPSAnX0NHJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK01PRE5BTUUgPSAnX0NHJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0NHJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK01PRFBSRUZJWCA9ICdDRycgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC0zNCw3NCArMzQsNzQgQEAKIFB5T2JqZWN0ICpDR1BvaW50X05ldyhDR1BvaW50ICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCi0JCQlpdHNlbGYtPngsCi0JCQlpdHNlbGYtPnkpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPngsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnkpOwogfQogCiBpbnQKIENHUG9pbnRfQ29udmVydChQeU9iamVjdCAqdiwgQ0dQb2ludCAqcF9pdHNlbGYpCiB7Ci0JaWYoICFQeUFyZ19QYXJzZSh2LCAiKGZmKSIsCi0JCQkmcF9pdHNlbGYtPngsCi0JCQkmcF9pdHNlbGYtPnkpICkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZikiLAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT54LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT55KSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIHJldHVybiAxOwogfQogCiBQeU9iamVjdCAqQ0dSZWN0X05ldyhDR1JlY3QgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZikiLAotCQkJaXRzZWxmLT5vcmlnaW4ueCwKLQkJCWl0c2VsZi0+b3JpZ2luLnksCi0JCQlpdHNlbGYtPnNpemUud2lkdGgsCi0JCQlpdHNlbGYtPnNpemUuaGVpZ2h0KTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT5vcmlnaW4ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0c2VsZi0+c2l6ZS5oZWlnaHQpOwogfQogCiBpbnQKIENHUmVjdF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDR1JlY3QgKnBfaXRzZWxmKQogewotCWlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmKSIsCi0JCQkmcF9pdHNlbGYtPm9yaWdpbi54LAotCQkJJnBfaXRzZWxmLT5vcmlnaW4ueSwKLQkJCSZwX2l0c2VsZi0+c2l6ZS53aWR0aCwKLQkJCSZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKLQkJcmV0dXJuIDA7Ci0JcmV0dXJuIDE7CisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPm9yaWdpbi54LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT5vcmlnaW4ueSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS53aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+c2l6ZS5oZWlnaHQpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIFB5T2JqZWN0ICpDR0FmZmluZVRyYW5zZm9ybV9OZXcoQ0dBZmZpbmVUcmFuc2Zvcm0gKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCi0JCQlpdHNlbGYtPmEsCi0JCQlpdHNlbGYtPmIsCi0JCQlpdHNlbGYtPmMsCi0JCQlpdHNlbGYtPmQsCi0JCQlpdHNlbGYtPnR4LAotCQkJaXRzZWxmLT50eSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmEsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmIsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPmQsCisgICAgICAgICAgICAgICAgICAgICAgICBpdHNlbGYtPnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT50eSk7CiB9CiAKIGludAogQ0dBZmZpbmVUcmFuc2Zvcm1fQ29udmVydChQeU9iamVjdCAqdiwgQ0dBZmZpbmVUcmFuc2Zvcm0gKnBfaXRzZWxmKQogewotCWlmKCAhUHlBcmdfUGFyc2UodiwgIihmZmZmZmYpIiwKLQkJCSZwX2l0c2VsZi0+YSwKLQkJCSZwX2l0c2VsZi0+YiwKLQkJCSZwX2l0c2VsZi0+YywKLQkJCSZwX2l0c2VsZi0+ZCwKLQkJCSZwX2l0c2VsZi0+dHgsCi0JCQkmcF9pdHNlbGYtPnR5KSApCi0JCXJldHVybiAwOwotCXJldHVybiAxOworICAgICAgICBpZiggIVB5QXJnX1BhcnNlKHYsICIoZmZmZmZmKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmEsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmIsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmMsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPmQsCisgICAgICAgICAgICAgICAgICAgICAgICAmcF9pdHNlbGYtPnR4LAorICAgICAgICAgICAgICAgICAgICAgICAgJnBfaXRzZWxmLT50eSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKIH0KICIiIgogCiBjbGFzcyBNeU9wYXF1ZUJ5VmFsdWVUeXBlKE9wYXF1ZUJ5VmFsdWVUeXBlKToKLQkiIiJTb3J0IG9mIGEgbWl4IGJldHdlZW4gT3BhcXVlQnlWYWx1ZVR5cGUgYW5kIE9wYXF1ZVR5cGUuIiIiCi0JZGVmIG1rdmFsdWVBcmdzKHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzLCAmJXMiICUgKHNlbGYubmV3LCBuYW1lKQorICAgICIiIlNvcnQgb2YgYSBtaXggYmV0d2VlbiBPcGFxdWVCeVZhbHVlVHlwZSBhbmQgT3BhcXVlVHlwZS4iIiIKKyAgICBkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXMsICYlcyIgJSAoc2VsZi5uZXcsIG5hbWUpCiAKIENHUG9pbnQgPSBNeU9wYXF1ZUJ5VmFsdWVUeXBlKCdDR1BvaW50JywgJ0NHUG9pbnQnKQogQ0dSZWN0ID0gTXlPcGFxdWVCeVZhbHVlVHlwZSgnQ0dSZWN0JywgJ0NHUmVjdCcpCkBAIC0xMjEsMTAgKzEyMSwxMCBAQAogCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJDR0NvbnRleHRSZWxlYXNlKHNlbGYtPm9iX2l0c2VsZik7IikKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPdXRwdXQoIkNHQ29udGV4dFJlbGVhc2Uoc2VsZi0+b2JfaXRzZWxmKTsiKQogCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KQEAgLTE2OSwxMSArMTY5LDExIEBACiBPU1N0YXR1cyBfZXJyOwogCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIEdyYWZPYmpfQ29udmVydCwgJnBvcnQpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogX2VyciA9IENyZWF0ZUNHQ29udGV4dEZvclBvcnQocG9ydCwgJmN0eCk7CiBpZiAoX2VyciAhPSBub0VycikKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgQ0dDb250ZXh0UmVmT2JqX05ldywgY3R4KTsKIHJldHVybiBfcmVzOwogIiIiCkBAIC0xODUsOSArMTg1LDggQEAKIAogIyBBREQgYWRkIGZvcmxvb3AgaGVyZQogZm9yIGYgaW4gQ0dDb250ZXh0UmVmX21ldGhvZHM6Ci0JQ0dDb250ZXh0UmVmX29iamVjdC5hZGQoZikKKyAgICBDR0NvbnRleHRSZWZfb2JqZWN0LmFkZChmKQogCiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9jbS9jbXNjYW4ucHkgYi9NYWMvTW9kdWxlcy9jbS9jbXNjYW4ucHkKaW5kZXggNmU1NmNiMi4uMDg3ZjIzOSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY20vY21zY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2NtL2Ntc2Nhbi5weQpAQCAtMTAsODAgKzEwLDgwIEBACiBTSE9SVCA9ICJjbSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJDb21wb25lbnRzLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSAiQ29tcG9uZW50cy5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMKLQkJCSMgRmluZE5leHRDb21wb25lbnQgaXMgYSBzcGVjaWFsIGNhc2UsIHNpbmNlIGl0IGNhbGwgYWxzbyBiZSBjYWxsZWQKLQkJCSMgd2l0aCBOb25lIGFzIHRoZSBhcmd1bWVudC4gSGVuY2UsIHdlIG1ha2UgaXQgYSBmdW5jdGlvbgotCQkJIwotCQkJaWYgdCA9PSAiQ29tcG9uZW50IiBhbmQgbSA9PSAiSW5Nb2RlIiBhbmQgbmFtZSAhPSAiRmluZE5leHRDb21wb25lbnQiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiY19tZXRob2RzIgotCQkJZWxpZiB0ID09ICJDb21wb25lbnRJbnN0YW5jZSIgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJjaV9tZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIworICAgICAgICAgICAgIyBGaW5kTmV4dENvbXBvbmVudCBpcyBhIHNwZWNpYWwgY2FzZSwgc2luY2UgaXQgY2FsbCBhbHNvIGJlIGNhbGxlZAorICAgICAgICAgICAgIyB3aXRoIE5vbmUgYXMgdGhlIGFyZ3VtZW50LiBIZW5jZSwgd2UgbWFrZSBpdCBhIGZ1bmN0aW9uCisgICAgICAgICAgICAjCisgICAgICAgICAgICBpZiB0ID09ICJDb21wb25lbnQiIGFuZCBtID09ICJJbk1vZGUiIGFuZCBuYW1lICE9ICJGaW5kTmV4dENvbXBvbmVudCI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJjX21ldGhvZHMiCisgICAgICAgICAgICBlbGlmIHQgPT0gIkNvbXBvbmVudEluc3RhbmNlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gImNpX21ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiT3BlbkFEZWZhdWx0Q29tcG9uZW50IiwKLQkJCSJHZXRDb21wb25lbnRUeXBlTW9kU2VlZCIsCi0JCQkiT3BlbkFDb21wb25lbnRSZXNGaWxlIiwKLQkJCSJDYWxsQ29tcG9uZW50VW5yZWdpc3RlciIsCi0JCQkiQ2FsbENvbXBvbmVudFRhcmdldCIsCi0JCQkiQ2FsbENvbXBvbmVudFJlZ2lzdGVyIiwKLQkJCSJDYWxsQ29tcG9uZW50VmVyc2lvbiIsCi0JCQkiQ2FsbENvbXBvbmVudENhbkRvIiwKLQkJCSJDYWxsQ29tcG9uZW50Q2xvc2UiLAotCQkJIkNhbGxDb21wb25lbnRPcGVuIiwKLQkJCSJPcGVuQUNvbXBvbmVudCIsCi0JCQkiR2V0Q29tcG9uZW50UHVibGljUmVzb3VyY2UiLCAjIE1pc3NpbmcgaW4gQ1cgUHJvIDYKLQkJCSJDYWxsQ29tcG9uZW50R2V0UHVibGljUmVzb3VyY2UiLCAjIE1pc3NpbmcgaW4gQ1cgUHJvIDYKLQkJCSdTZXRDb21wb25lbnRJbnN0YW5jZUE1JywKLQkJCSdHZXRDb21wb25lbnRJbnN0YW5jZUE1JywKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJPcGVuQURlZmF1bHRDb21wb25lbnQiLAorICAgICAgICAgICAgICAgICJHZXRDb21wb25lbnRUeXBlTW9kU2VlZCIsCisgICAgICAgICAgICAgICAgIk9wZW5BQ29tcG9uZW50UmVzRmlsZSIsCisgICAgICAgICAgICAgICAgIkNhbGxDb21wb25lbnRVbnJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudFRhcmdldCIsCisgICAgICAgICAgICAgICAgIkNhbGxDb21wb25lbnRSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgIkNhbGxDb21wb25lbnRWZXJzaW9uIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudENhbkRvIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudENsb3NlIiwKKyAgICAgICAgICAgICAgICAiQ2FsbENvbXBvbmVudE9wZW4iLAorICAgICAgICAgICAgICAgICJPcGVuQUNvbXBvbmVudCIsCisgICAgICAgICAgICAgICAgIkdldENvbXBvbmVudFB1YmxpY1Jlc291cmNlIiwgIyBNaXNzaW5nIGluIENXIFBybyA2CisgICAgICAgICAgICAgICAgIkNhbGxDb21wb25lbnRHZXRQdWJsaWNSZXNvdXJjZSIsICMgTWlzc2luZyBpbiBDVyBQcm8gNgorICAgICAgICAgICAgICAgICdTZXRDb21wb25lbnRJbnN0YW5jZUE1JywKKyAgICAgICAgICAgICAgICAnR2V0Q29tcG9uZW50SW5zdGFuY2VBNScsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJSZXNvdXJjZVNwZWMiLAotCQkJIkNvbXBvbmVudFJlc291cmNlIiwKLQkJCSJDb21wb25lbnRQbGF0Zm9ybUluZm8iLAotCQkJIkNvbXBvbmVudFJlc291cmNlRXh0ZW5zaW9uIiwKLQkJCSJDb21wb25lbnRQbGF0Zm9ybUluZm9BcnJheSIsCi0JCQkiRXh0Q29tcG9uZW50UmVzb3VyY2UiLAotCQkJIkNvbXBvbmVudFBhcmFtZXRlcnMiLAotCQkJCi0JCQkiQ29tcG9uZW50Um91dGluZVVQUCIsCi0JCQkiQ29tcG9uZW50TVBXb3JrRnVuY3Rpb25VUFAiLAotCQkJIkNvbXBvbmVudEZ1bmN0aW9uVVBQIiwKLQkJCSJHZXRNaXNzaW5nQ29tcG9uZW50UmVzb3VyY2VVUFAiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlJlc291cmNlU3BlYyIsCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50UGxhdGZvcm1JbmZvIiwKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50UmVzb3VyY2VFeHRlbnNpb24iLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRQbGF0Zm9ybUluZm9BcnJheSIsCisgICAgICAgICAgICAgICAgIkV4dENvbXBvbmVudFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAiQ29tcG9uZW50UGFyYW1ldGVycyIsCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCdDb21wb25lbnREZXNjcmlwdGlvbicsICdsb29raW5nJywgJ091dE1vZGUnKV0sCi0JCQkgWygnQ29tcG9uZW50RGVzY3JpcHRpb24nLCAnKicsICdJbk1vZGUnKV0pLAotCQkJXQotCQkJCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudFJvdXRpbmVVUFAiLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRNUFdvcmtGdW5jdGlvblVQUCIsCisgICAgICAgICAgICAgICAgIkNvbXBvbmVudEZ1bmN0aW9uVVBQIiwKKyAgICAgICAgICAgICAgICAiR2V0TWlzc2luZ0NvbXBvbmVudFJlc291cmNlVVBQIiwKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygnQ29tcG9uZW50RGVzY3JpcHRpb24nLCAnbG9va2luZycsICdPdXRNb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdDb21wb25lbnREZXNjcmlwdGlvbicsICcqJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY20vY21zdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvY20vY21zdXBwb3J0LnB5CmluZGV4IDk4MDE4YzQuLjQxMDlkYmEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2NtL2Ntc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9jbS9jbXN1cHBvcnQucHkKQEAgLTYsMTUgKzYsMTUgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdDb21wb25lbnRzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfQ20nCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorTUFDSEVBREVSRklMRSA9ICdDb21wb25lbnRzLmgnICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19DbScgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdDbScJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1DX09CSkVDVFBSRUZJWCA9ICdDbXBPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdDbScgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitDX09CSkVDVFBSRUZJWCA9ICdDbXBPYmonICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIENJX09CSkVDVFBSRUZJWCA9ICdDbXBJbnN0T2JqJwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNDIsMzAgKzQyLDMwIEBACiBDbXBEZXNjX05ldyhDb21wb25lbnREZXNjcmlwdGlvbiAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mTyZPJmxsIiwgCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCi0JCVB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudE1hbnVmYWN0dXJlciwKLQkJaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZPJk8mbGwiLAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPmNvbXBvbmVudFR5cGUsCisgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKKyAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCisgICAgICAgICAgICAgICAgaXRzZWxmLT5jb21wb25lbnRGbGFncywgaXRzZWxmLT5jb21wb25lbnRGbGFnc01hc2spOwogfQogCiBzdGF0aWMgaW50CiBDbXBEZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbXBvbmVudERlc2NyaXB0aW9uICpwX2l0c2VsZikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2VUdXBsZSh2LCAiTyZPJk8mbGwiLAotCQlQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKLQkJUHlNYWNfR2V0T1NUeXBlLCAmcF9pdHNlbGYtPmNvbXBvbmVudFN1YlR5cGUsCi0JCVB5TWFjX0dldE9TVHlwZSwgJnBfaXRzZWxmLT5jb21wb25lbnRNYW51ZmFjdHVyZXIsCi0JCSZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIk8mTyZPJmxsIiwKKyAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50VHlwZSwKKyAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50U3ViVHlwZSwKKyAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZwX2l0c2VsZi0+Y29tcG9uZW50TWFudWZhY3R1cmVyLAorICAgICAgICAgICAgICAgICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3MsICZwX2l0c2VsZi0+Y29tcG9uZW50RmxhZ3NNYXNrKTsKIH0KIAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudCwgQ21wT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudCwgQ21wT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnQsIENtcE9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoQ29tcG9uZW50LCBDbXBPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKENvbXBvbmVudEluc3RhbmNlLCBDbXBJbnN0T2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgQ21wSW5zdE9ial9Db252ZXJ0KTsKICIiIgogCiBDb21wb25lbnREZXNjcmlwdGlvbiA9IE9wYXF1ZVR5cGUoJ0NvbXBvbmVudERlc2NyaXB0aW9uJywgJ0NtcERlc2MnKQpAQCAtNzYsMzAgKzc2LDMwIEBACiBDb21wb25lbnRSZXNvdXJjZUhhbmRsZSA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJDb21wb25lbnRSZXNvdXJjZUhhbmRsZSIsICJSZXNPYmoiKQogCiBjbGFzcyBNeUNJT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTlVMTCBDb21wb25lbnRJbnN0YW5jZSIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ21fRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQogCiBjbGFzcyBNeUNPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJCQkJLyogWFhYWCBPciBzaG91bGQgd2UgcmV0dXJuIE5vbmU/ICovCi0JCQkJCVB5RXJyX1NldFN0cmluZyhDbV9FcnJvciwiTm8gc3VjaCBjb21wb25lbnQiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIikKLQkJCQkKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKCB2ID09IFB5X05vbmUgKSB7Ci0JCQkJCSpwX2l0c2VsZiA9IDA7Ci0JCQkJCXJldHVybiAxOwotCQl9IiIiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBYWFhYIE9yIHNob3VsZCB3ZSByZXR1cm4gTm9uZT8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKENtX0Vycm9yLCJObyBzdWNoIGNvbXBvbmVudCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0iIiIpCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKCB2ID09IFB5X05vbmUgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IiIiKQogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKIGNpX29iamVjdCA9IE15Q0lPYmplY3REZWZpbml0aW9uKCdDb21wb25lbnRJbnN0YW5jZScsIENJX09CSkVDVFBSRUZJWCwKLQkJJ0NvbXBvbmVudEluc3RhbmNlJykKKyAgICAgICAgICAgICAgICAnQ29tcG9uZW50SW5zdGFuY2UnKQogY19vYmplY3QgPSBNeUNPYmplY3REZWZpbml0aW9uKCdDb21wb25lbnQnLCBDX09CSkVDVFBSRUZJWCwgJ0NvbXBvbmVudCcpCiBtb2R1bGUuYWRkb2JqZWN0KGNpX29iamVjdCkKIG1vZHVsZS5hZGRvYmplY3QoY19vYmplY3QpCkBAIC0xMjMsNCArMTIzLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2N0bC9jdGxlZGl0LnB5IGIvTWFjL01vZHVsZXMvY3RsL2N0bGVkaXQucHkKaW5kZXggNmJhMDI0Yi4uZmRkOTcxMiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY3RsL2N0bGVkaXQucHkKKysrIGIvTWFjL01vZHVsZXMvY3RsL2N0bGVkaXQucHkKQEAgLTgsNyArOCw3IEBACiBmdW5jdGlvbnMuYXBwZW5kKGYpCiAKIGYgPSBGdW5jdGlvbihDb250cm9sSGFuZGxlLCAnYXNfQ29udHJvbCcsCi0JKEhhbmRsZSwgJ2gnLCBJbk1vZGUpKQorICAgICAgICAoSGFuZGxlLCAnaCcsIEluTW9kZSkpCiBmdW5jdGlvbnMuYXBwZW5kKGYpCiAKIGYgPSBNZXRob2QoSGFuZGxlLCAnYXNfUmVzb3VyY2UnLCAoQ29udHJvbEhhbmRsZSwgJ2N0bCcsIEluTW9kZSkpCkBAIC0xOCwxNiArMTgsMTYgQEAKIG1ldGhvZHMuYXBwZW5kKGYpCiAKIERpc3Bvc2VDb250cm9sX2JvZHkgPSAiIiIKLQlpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCBfc2VsZi0+b2JfaXRzZWxmICkgewotCQlTZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLwotCQlEaXNwb3NlQ29udHJvbChfc2VsZi0+b2JfaXRzZWxmKTsKLQkJX3NlbGYtPm9iX2l0c2VsZiA9IE5VTEw7Ci0JfQotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICggX3NlbGYtPm9iX2l0c2VsZiApIHsKKyAgICAgICAgICAgICAgICBTZXRDb250cm9sUmVmZXJlbmNlKF9zZWxmLT5vYl9pdHNlbGYsIChsb25nKTApOyAvKiBNYWtlIGl0IGZvcmdldCBhYm91dCB1cyAqLworICAgICAgICAgICAgICAgIERpc3Bvc2VDb250cm9sKF9zZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgICAgIF9zZWxmLT5vYl9pdHNlbGYgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiAKIGYgPSBNYW51YWxHZW5lcmF0b3IoIkRpc3Bvc2VDb250cm9sIiwgRGlzcG9zZUNvbnRyb2xfYm9keSkKQEAgLTM5LDcgKzM5LDcgQEAKICMgcGFyYW1ldGVyOyB0aGVzZSBzaG91bGQgaG93ZXZlciBiZSBtYW5hZ2VkIGJ5IHVzICh3ZSdyZSBjcmVhdGluZyB0aGVtCiAjIGFmdGVyIGFsbCksIHNvIHNldCB0aGUgdHlwZSB0byBDb250cm9sUmVmLgogZm9yIGYgaW4gZnVuY3Rpb25zOgotCWlmIGYubmFtZS5zdGFydHN3aXRoKCJDcmVhdGUiKToKLQkJdiA9IGYuYXJndW1lbnRMaXN0Wy0xXQotCQlpZiB2LnR5cGUgPT0gRXhpc3RpbmdDb250cm9sSGFuZGxlOgotCQkJdi50eXBlID0gQ29udHJvbFJlZgorICAgIGlmIGYubmFtZS5zdGFydHN3aXRoKCJDcmVhdGUiKToKKyAgICAgICAgdiA9IGYuYXJndW1lbnRMaXN0Wy0xXQorICAgICAgICBpZiB2LnR5cGUgPT0gRXhpc3RpbmdDb250cm9sSGFuZGxlOgorICAgICAgICAgICAgdi50eXBlID0gQ29udHJvbFJlZgpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvY3RsL2N0bHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9jdGwvY3Rsc2Nhbi5weQppbmRleCA4MTg1NDFlLi4yNTMzM2YxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9jdGwvY3Rsc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9jdGwvY3Rsc2Nhbi5weQpAQCAtNywxNjYgKzcsMTY2IEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcgogCiBkZWYgbWFpbigpOgotIwlpbnB1dCA9ICJDb250cm9scy5oIiAjIFVuaXZlcnNhbCBIZWFkZXJzIDwgMy4zCi0JaW5wdXQgPSBbIkNvbnRyb2xzLmgiLCAiQ29udHJvbERlZmluaXRpb25zLmgiXSAjIFVuaXZlcnNhbCBIZWFkZXJzID49IDMuMwotCW91dHB1dCA9ICJjdGxnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiQ29udHJvbHMucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCBjdGxzdXBwb3J0JyA9PT0iCi0JaW1wb3J0IGN0bHN1cHBvcnQKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIEN0bG1vZHVsZS5jID09PSIKKyMgICAgICAgaW5wdXQgPSAiQ29udHJvbHMuaCIgIyBVbml2ZXJzYWwgSGVhZGVycyA8IDMuMworICAgIGlucHV0ID0gWyJDb250cm9scy5oIiwgIkNvbnRyb2xEZWZpbml0aW9ucy5oIl0gIyBVbml2ZXJzYWwgSGVhZGVycyA+PSAzLjMKKyAgICBvdXRwdXQgPSAiY3RsZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIkNvbnRyb2xzLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgY3Rsc3VwcG9ydCcgPT09IgorICAgIGltcG9ydCBjdGxzdXBwb3J0CisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBDdGxtb2R1bGUuYyA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiAoIkNvbnRyb2xIYW5kbGUiLCAiQ29udHJvbFJlZiIpIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gKCJDb250cm9sSGFuZGxlIiwgIkNvbnRyb2xSZWYiKSBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uVGV4dEVkaXQgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLlF1aWNrRHJhdyBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uRHJhZ2NvbnN0IGltcG9ydCAqXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5DYXJib25FdmVudHMgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkFwcGVhcmFuY2UgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZSA9IC0xXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZyA9IC0xXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzTWFzayA9IDB4RkYwMDAwMDBcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoIlxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uVGV4dEVkaXQgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLlF1aWNrRHJhdyBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uRHJhZ2NvbnN0IGltcG9ydCAqXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5DYXJib25FdmVudHMgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkFwcGVhcmFuY2UgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZSA9IC0xXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrQ29udHJvbEJldmVsQnV0dG9uQ2VudGVyUG9wdXBHbHlwaFRhZyA9IC0xXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzTWFzayA9IDB4RkYwMDAwMDBcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoIlxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQknRmluZENvbnRyb2xVbmRlck1vdXNlJywgIyBHZW5lcmF0ZWQgbWFudWFsbHksIHJldHVybnMgYW4gZXhpc3RpbmcgY29udHJvbCwgbm90IGEgbmV3IG9uZS4KLQkJCSdEaXNwb3NlQ29udHJvbCcsICMgR2VuZXJhdGVkIG1hbnVhbGx5Ci0JCQknS2lsbENvbnRyb2xzJywgIyBJbXBsaWVkIGJ5IGNsb3NlIG9mIGRpYWxvZwotCQkJJ1NldEN0bEFjdGlvbicsCi0JCQknVHJhY2tDb250cm9sJywJIyBHZW5lcmF0ZWQgbWFudWFsbHkKLQkJCSdIYW5kbGVDb250cm9sQ2xpY2snLAkjIEdlbmVyYXRlZCBtYW51YWxseQotCQkJJ1NldENvbnRyb2xEYXRhJywJIyBHZW5lcmF0ZWQgbWFudWFsbHkKLQkJCSdHZXRDb250cm9sRGF0YScsCSMgR2VuZXJhdGVkIG1hbnVhbGx5Ci0JCQkna0NvbnRyb2xCZXZlbEJ1dHRvbkNlbnRlclBvcHVwR2x5cGhUYWcnLCAjIENvbnN0YW50IHdpdGggZnVubnkgZGVmaW5pdGlvbgotCQkJJ2tEYXRhQnJvd3NlckNsaWVudFByb3BlcnR5RmxhZ3NNYXNrJywgICMgZGl0dG8KLQkJCSdrRGF0YUJyb3dzZXJJdGVtQW55U3RhdGUnLCAgICMgYW5kIGRpdHRvCi0JCQkjIFRoZSBmb2xsb3dpbmcgYXJlIHVuYXZhaWxhYmxlIGZvciBzdGF0aWMgNjhrIChhcHBlYXJhbmNlIG1hbmFnZXIpCi0jIwkJCSdHZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZScsCi0jIwkJCSdTZXRCZXZlbEJ1dHRvbk1lbnVWYWx1ZScsCi0jIwkJCSdHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUnLAotIyMJCQknU2V0QmV2ZWxCdXR0b25UcmFuc2Zvcm0nLAotCQkJJ1NldEJldmVsQnV0dG9uR3JhcGhpY0FsaWdubWVudCcsCi0JCQknU2V0QmV2ZWxCdXR0b25UZXh0QWxpZ25tZW50JywKLQkJCSdTZXRCZXZlbEJ1dHRvblRleHRQbGFjZW1lbnQnLAotIyMJCQknU2V0SW1hZ2VXZWxsVHJhbnNmb3JtJywKLSMjCQkJJ0dldFRhYkNvbnRlbnRSZWN0JywKLSMjCQkJJ1NldFRhYkVuYWJsZWQnLAotIyMJCQknU2V0RGlzY2xvc3VyZVRyaWFuZ2xlTGFzdFZhbHVlJywKLSMjIAkJCSMgVW5hdmFpbGFibGUgaW4gQ1cgUHJvIDMgbGlicmFyaWVzCi0jIyAJCQknU2V0VXBDb250cm9sVGV4dENvbG9yJywKLSMjIAkJCSMgVW5hdmFpbGFibGUgaW4gSmFjaydzIENXIFBybyA1LjEgbGlicmFyaWVzCi0jIyAJCQknR2V0Q29udHJvbFJlZ2lvbicsCi0jIyAJCQknUmVtb3ZlQ29udHJvbFByb3BlcnR5JywKLSMjIAkJCSdJc1ZhbGlkQ29udHJvbEhhbmRsZScsCi0jIyAJCQknU2V0Q29udHJvbDMyQml0TWluaW11bScsCi0jIyAJCQknR2V0Q29udHJvbDMyQml0TWluaW11bScsCi0jIyAJCQknU2V0Q29udHJvbDMyQml0TWF4aW11bScsCi0jIyAJCQknR2V0Q29udHJvbDMyQml0TWF4aW11bScsCi0jIyAJCQknU2V0Q29udHJvbDMyQml0VmFsdWUnLAotIyMgCQkJJ0dldENvbnRyb2wzMkJpdFZhbHVlJywKLSMjIAkJCSdTZXRDb250cm9sVmlld1NpemUnLAotIyMgCQkJJ0dldENvbnRyb2xWaWV3U2l6ZScsCi0JCQkjIEdlbmVyYWxseSBCYWQgTmV3cwotCQkJJ0dldENvbnRyb2xQcm9wZXJ0eScsCi0JCQknU2V0Q29udHJvbFByb3BlcnR5JywKLQkJCSdHZXRDb250cm9sUHJvcGVydHlTaXplJywKLQkJCSdTZW5kQ29udHJvbE1lc3NhZ2UnLCAjIFBhcmFtZXRlciBjaGFuZ2VkIGZyb20gbG9uZyB0byB2b2lkKiBmcm9tIFVIMy4zIHRvIFVIMy40Ci0JCQknQ3JlYXRlVGFic0NvbnRyb2wnLCAgIyB3cm90ZSBtYW51YWxseQotCQkJJ0dldENvbnRyb2xBY3Rpb24nLCAgIyB0b28gbXVjaCBlZmZvcnQgZm9yIHRvbyBsaXR0bGUgdXNlZnVsbmVzcwotCQkJCi0JCQkjIHRvbyBsYXp5IGZvciBub3cKLQkJCSdHZXRJbWFnZVdlbGxDb250ZW50SW5mbycsCi0JCQknR2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbycsCi0JCQkjIE9TOCBvbmx5Ci0JCQknR2V0QXV4aWxpYXJ5Q29udHJvbFJlY29yZCcsCi0JCQknU2V0Q29udHJvbENvbG9yJywKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdGaW5kQ29udHJvbFVuZGVyTW91c2UnLCAjIEdlbmVyYXRlZCBtYW51YWxseSwgcmV0dXJucyBhbiBleGlzdGluZyBjb250cm9sLCBub3QgYSBuZXcgb25lLgorICAgICAgICAgICAgICAgICdEaXNwb3NlQ29udHJvbCcsICMgR2VuZXJhdGVkIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgJ0tpbGxDb250cm9scycsICMgSW1wbGllZCBieSBjbG9zZSBvZiBkaWFsb2cKKyAgICAgICAgICAgICAgICAnU2V0Q3RsQWN0aW9uJywKKyAgICAgICAgICAgICAgICAnVHJhY2tDb250cm9sJywgIyBHZW5lcmF0ZWQgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAnSGFuZGxlQ29udHJvbENsaWNrJywgICAjIEdlbmVyYXRlZCBtYW51YWxseQorICAgICAgICAgICAgICAgICdTZXRDb250cm9sRGF0YScsICAgICAgICMgR2VuZXJhdGVkIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgJ0dldENvbnRyb2xEYXRhJywgICAgICAgIyBHZW5lcmF0ZWQgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAna0NvbnRyb2xCZXZlbEJ1dHRvbkNlbnRlclBvcHVwR2x5cGhUYWcnLCAjIENvbnN0YW50IHdpdGggZnVubnkgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgICdrRGF0YUJyb3dzZXJDbGllbnRQcm9wZXJ0eUZsYWdzTWFzaycsICAjIGRpdHRvCisgICAgICAgICAgICAgICAgJ2tEYXRhQnJvd3Nlckl0ZW1BbnlTdGF0ZScsICAgIyBhbmQgZGl0dG8KKyAgICAgICAgICAgICAgICAjIFRoZSBmb2xsb3dpbmcgYXJlIHVuYXZhaWxhYmxlIGZvciBzdGF0aWMgNjhrIChhcHBlYXJhbmNlIG1hbmFnZXIpCisjIyAgICAgICAgICAgICAgICAgICAgICAnR2V0QmV2ZWxCdXR0b25NZW51VmFsdWUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldEJldmVsQnV0dG9uTWVudVZhbHVlJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRCZXZlbEJ1dHRvbk1lbnVIYW5kbGUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldEJldmVsQnV0dG9uVHJhbnNmb3JtJywKKyAgICAgICAgICAgICAgICAnU2V0QmV2ZWxCdXR0b25HcmFwaGljQWxpZ25tZW50JywKKyAgICAgICAgICAgICAgICAnU2V0QmV2ZWxCdXR0b25UZXh0QWxpZ25tZW50JywKKyAgICAgICAgICAgICAgICAnU2V0QmV2ZWxCdXR0b25UZXh0UGxhY2VtZW50JywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRJbWFnZVdlbGxUcmFuc2Zvcm0nLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0dldFRhYkNvbnRlbnRSZWN0JywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRUYWJFbmFibGVkJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXREaXNjbG9zdXJlVHJpYW5nbGVMYXN0VmFsdWUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgIyBVbmF2YWlsYWJsZSBpbiBDVyBQcm8gMyBsaWJyYXJpZXMKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRVcENvbnRyb2xUZXh0Q29sb3InLAorIyMgICAgICAgICAgICAgICAgICAgICAgIyBVbmF2YWlsYWJsZSBpbiBKYWNrJ3MgQ1cgUHJvIDUuMSBsaWJyYXJpZXMKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRDb250cm9sUmVnaW9uJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdSZW1vdmVDb250cm9sUHJvcGVydHknLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0lzVmFsaWRDb250cm9sSGFuZGxlJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRDb250cm9sMzJCaXRNaW5pbXVtJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRDb250cm9sMzJCaXRNaW5pbXVtJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRDb250cm9sMzJCaXRNYXhpbXVtJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdHZXRDb250cm9sMzJCaXRNYXhpbXVtJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdTZXRDb250cm9sMzJCaXRWYWx1ZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnR2V0Q29udHJvbDMyQml0VmFsdWUnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ1NldENvbnRyb2xWaWV3U2l6ZScsCisjIyAgICAgICAgICAgICAgICAgICAgICAnR2V0Q29udHJvbFZpZXdTaXplJywKKyAgICAgICAgICAgICAgICAjIEdlbmVyYWxseSBCYWQgTmV3cworICAgICAgICAgICAgICAgICdHZXRDb250cm9sUHJvcGVydHknLAorICAgICAgICAgICAgICAgICdTZXRDb250cm9sUHJvcGVydHknLAorICAgICAgICAgICAgICAgICdHZXRDb250cm9sUHJvcGVydHlTaXplJywKKyAgICAgICAgICAgICAgICAnU2VuZENvbnRyb2xNZXNzYWdlJywgIyBQYXJhbWV0ZXIgY2hhbmdlZCBmcm9tIGxvbmcgdG8gdm9pZCogZnJvbSBVSDMuMyB0byBVSDMuNAorICAgICAgICAgICAgICAgICdDcmVhdGVUYWJzQ29udHJvbCcsICAjIHdyb3RlIG1hbnVhbGx5CisgICAgICAgICAgICAgICAgJ0dldENvbnRyb2xBY3Rpb24nLCAgIyB0b28gbXVjaCBlZmZvcnQgZm9yIHRvbyBsaXR0bGUgdXNlZnVsbmVzcwogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdQcm9jUHRyJywKLSMJCQknQ29udHJvbEFjdGlvblVQUCcsCi0JCQknUHRyJywKLQkJCSdDb250cm9sRGVmU3BlYycsICMgRG9uJ3Qga25vdyBob3cgdG8gZG8gdGhpcyB5ZXQKLQkJCSdDb250cm9sRGVmU3BlY19wdHInLCAjIGRpdHRvCi0JCQknQ29sbGVjdGlvbicsICMgRGl0dG8KLQkJCSMgbm90LXlldC1zdXBwb3J0ZWQgc3R1ZmYgaW4gVW5pdmVyc2FsIEhlYWRlcnMgMy40OgotCQkJJ0NvbnRyb2xDb2xvclVQUCcsCi0JCQknQ29udHJvbEtpbmQnLCAgIyBYWFggZWFzeTogMi10dXBsZSBjb250YWluaW5nIDIgT1NUeXBlJ3MKLSMJCQknQ29udHJvbFRhYkVudHJ5X3B0cicsICMgWFhYIG5lZWRlZCBmb3IgdGFicwotIwkJCSdDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHInLAotIwkJCSdDb250cm9sQnV0dG9uQ29udGVudEluZm8nLCAgIyBYWFggdWdoOiBhIHVuaW9uCi0jCQkJJ0NvbnRyb2xCdXR0b25Db250ZW50SW5mb19wdHInLCAgIyBYWFggdWdoOiBhIHVuaW9uCi0JCQknTGlzdERlZlNwZWNfcHRyJywgICMgWFhYIHNlZSBfTGlzdG1vZHVsZS5jLCB0cmlja3kgYnV0IHBvc3NpYmxlCi0JCQknRGF0YUJyb3dzZXJJdGVtSURfcHRyJywgICMgWFhYIGFycmF5IG9mIFVJbnQzMiwgZm9yIEJyb3dzZXJWaWV3Ci0JCQknRGF0YUJyb3dzZXJJdGVtVVBQJywKLQkJCSdEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmJywgIyBYWFggdm9pZCAqCi0JCQknRGF0YUJyb3dzZXJDYWxsYmFja3MnLCAjIGRpZmZpY3VsdCBzdHJ1Y3QKLQkJCSdEYXRhQnJvd3NlckNhbGxiYWNrc19wdHInLAotCQkJJ0RhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzJywKLQkJCSdEYXRhQnJvd3NlckN1c3RvbUNhbGxiYWNrc19wdHInLAotIyMJCQknRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjJywKLSMjCQkJJ0RhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjJywKLQkJCSdDRkRhdGFSZWYnLAotCQkJJ0RhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjJywgIyBkaWZmaWN1bHQgc3RydWN0Ci0JCQldCisgICAgICAgICAgICAgICAgIyB0b28gbGF6eSBmb3Igbm93CisgICAgICAgICAgICAgICAgJ0dldEltYWdlV2VsbENvbnRlbnRJbmZvJywKKyAgICAgICAgICAgICAgICAnR2V0QmV2ZWxCdXR0b25Db250ZW50SW5mbycsCisgICAgICAgICAgICAgICAgIyBPUzggb25seQorICAgICAgICAgICAgICAgICdHZXRBdXhpbGlhcnlDb250cm9sUmVjb3JkJywKKyAgICAgICAgICAgICAgICAnU2V0Q29udHJvbENvbG9yJywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdQcm9jUHRyJywKKyMgICAgICAgICAgICAgICAgICAgICAgICdDb250cm9sQWN0aW9uVVBQJywKKyAgICAgICAgICAgICAgICAnUHRyJywKKyAgICAgICAgICAgICAgICAnQ29udHJvbERlZlNwZWMnLCAjIERvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgeWV0CisgICAgICAgICAgICAgICAgJ0NvbnRyb2xEZWZTcGVjX3B0cicsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAnQ29sbGVjdGlvbicsICMgRGl0dG8KKyAgICAgICAgICAgICAgICAjIG5vdC15ZXQtc3VwcG9ydGVkIHN0dWZmIGluIFVuaXZlcnNhbCBIZWFkZXJzIDMuNDoKKyAgICAgICAgICAgICAgICAnQ29udHJvbENvbG9yVVBQJywKKyAgICAgICAgICAgICAgICAnQ29udHJvbEtpbmQnLCAgIyBYWFggZWFzeTogMi10dXBsZSBjb250YWluaW5nIDIgT1NUeXBlJ3MKKyMgICAgICAgICAgICAgICAgICAgICAgICdDb250cm9sVGFiRW50cnlfcHRyJywgIyBYWFggbmVlZGVkIGZvciB0YWJzCisjICAgICAgICAgICAgICAgICAgICAgICAnQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvUHRyJywKKyMgICAgICAgICAgICAgICAgICAgICAgICdDb250cm9sQnV0dG9uQ29udGVudEluZm8nLCAgIyBYWFggdWdoOiBhIHVuaW9uCisjICAgICAgICAgICAgICAgICAgICAgICAnQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX3B0cicsICAjIFhYWCB1Z2g6IGEgdW5pb24KKyAgICAgICAgICAgICAgICAnTGlzdERlZlNwZWNfcHRyJywgICMgWFhYIHNlZSBfTGlzdG1vZHVsZS5jLCB0cmlja3kgYnV0IHBvc3NpYmxlCisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VySXRlbUlEX3B0cicsICAjIFhYWCBhcnJheSBvZiBVSW50MzIsIGZvciBCcm93c2VyVmlldworICAgICAgICAgICAgICAgICdEYXRhQnJvd3Nlckl0ZW1VUFAnLAorICAgICAgICAgICAgICAgICdEYXRhQnJvd3Nlckl0ZW1EYXRhUmVmJywgIyBYWFggdm9pZCAqCisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VyQ2FsbGJhY2tzJywgIyBkaWZmaWN1bHQgc3RydWN0CisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VyQ2FsbGJhY2tzX3B0cicsCisgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VyQ3VzdG9tQ2FsbGJhY2tzJywKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJDdXN0b21DYWxsYmFja3NfcHRyJywKKyMjICAgICAgICAgICAgICAgICAgICAgICdEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2MnLAorIyMgICAgICAgICAgICAgICAgICAgICAgJ0RhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjJywKKyAgICAgICAgICAgICAgICAnQ0ZEYXRhUmVmJywKKyAgICAgICAgICAgICAgICAnRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2MnLCAjIGRpZmZpY3VsdCBzdHJ1Y3QKKyAgICAgICAgICAgICAgICBdCiAKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKIAotIyMJCQkjIEZvciBUcmFja0NvbnRyb2wKLSMjCQkJKFsoIlByb2NQdHIiLCAiYWN0aW9uUHJvYyIsICJJbk1vZGUiKV0sCi0jIwkJCSBbKCJGYWtlVHlwZSgnKENvbnRyb2xBY3Rpb25VUFApMCcpIiwgIioiLCAiKiIpXSksCi0jIwkJCShbKCJDb250cm9sQWN0aW9uVVBQIiwgImFjdGlvblByb2MiLCAiSW5Nb2RlIildLAotIyMJCQkgWygiRmFrZVR5cGUoJyhDb250cm9sQWN0aW9uVVBQKTAnKSIsICIqIiwgIioiKV0pLAorICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKIAotCQkJIyBGb3IgR2V0Q29udHJvbFRpdGxlCi0JCQkoWygnU3RyMjU1JywgJ3RpdGxlJywgJ0luTW9kZScpXSwKLQkJCSBbKCdTdHIyNTUnLCAndGl0bGUnLCAnT3V0TW9kZScpXSksCisjIyAgICAgICAgICAgICAgICAgICAgICAjIEZvciBUcmFja0NvbnRyb2wKKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCJQcm9jUHRyIiwgImFjdGlvblByb2MiLCAiSW5Nb2RlIildLAorIyMgICAgICAgICAgICAgICAgICAgICAgIFsoIkZha2VUeXBlKCcoQ29udHJvbEFjdGlvblVQUCkwJykiLCAiKiIsICIqIildKSwKKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCJDb250cm9sQWN0aW9uVVBQIiwgImFjdGlvblByb2MiLCAiSW5Nb2RlIildLAorIyMgICAgICAgICAgICAgICAgICAgICAgIFsoIkZha2VUeXBlKCcoQ29udHJvbEFjdGlvblVQUCkwJykiLCAiKiIsICIqIildKSwKIAotCQkJKFsoIkNvbnRyb2xIYW5kbGUiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkV4aXN0aW5nQ29udHJvbEhhbmRsZSIsICIqIiwgIioiKV0pLAotCQkJKFsoIkNvbnRyb2xSZWYiLCAiKiIsICJPdXRNb2RlIildLAkjIERpdHRvLCBmb3IgVW5pdmVyc2FsIEhlYWRlcnMKLQkJCSBbKCJFeGlzdGluZ0NvbnRyb2xIYW5kbGUiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCShbKCJSZWN0X3B0ciIsICIqIiwgIlJldHVybk1vZGUiKV0sICMgR2V0Q29udHJvbEJvdW5kcwotCQkJIFsoInZvaWQiLCAiKiIsICJSZXR1cm5Nb2RlIildKSwKKyAgICAgICAgICAgICAgICAjIEZvciBHZXRDb250cm9sVGl0bGUKKyAgICAgICAgICAgICAgICAoWygnU3RyMjU1JywgJ3RpdGxlJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnU3RyMjU1JywgJ3RpdGxlJywgJ091dE1vZGUnKV0pLAogCi0JCQkoWygiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkRhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCSAKLQkJCShbKCJDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIiLCAnb3V0Q29udGVudCcsICJJbk1vZGUiKV0sCi0JCQkgWygiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvUHRyIiwgJyonLCAiT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkoWygiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIiwgJyonLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJDb250cm9sQnV0dG9uQ29udGVudEluZm8iLCAnKicsICJJbk1vZGUiKV0pLAotCQkJCi0JCQkoWygiQ29udHJvbEFjdGlvblVQUCIsICdsaXZlVHJhY2tpbmdQcm9jJywgIkluTW9kZSIpXSwKLQkJCSBbKCJDb250cm9sQWN0aW9uVVBQTmV3Q29udHJvbCIsICdsaXZlVHJhY2tpbmdQcm9jJywgIkluTW9kZSIpXSksCi0JCQldCisgICAgICAgICAgICAgICAgKFsoIkNvbnRyb2xIYW5kbGUiLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFeGlzdGluZ0NvbnRyb2xIYW5kbGUiLCAiKiIsICIqIildKSwKKyAgICAgICAgICAgICAgICAoWygiQ29udHJvbFJlZiIsICIqIiwgIk91dE1vZGUiKV0sICAgICAgIyBEaXR0bywgZm9yIFVuaXZlcnNhbCBIZWFkZXJzCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nQ29udHJvbEhhbmRsZSIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIlJlY3RfcHRyIiwgIioiLCAiUmV0dXJuTW9kZSIpXSwgIyBHZXRDb250cm9sQm91bmRzCisgICAgICAgICAgICAgICAgIFsoInZvaWQiLCAiKiIsICJSZXR1cm5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkRhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIiLCAnb3V0Q29udGVudCcsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mb1B0ciIsICcqJywgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mbyIsICcqJywgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkNvbnRyb2xCdXR0b25Db250ZW50SW5mbyIsICcqJywgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiQ29udHJvbEFjdGlvblVQUCIsICdsaXZlVHJhY2tpbmdQcm9jJywgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ29udHJvbEFjdGlvblVQUE5ld0NvbnRyb2wiLCAnbGl2ZVRyYWNraW5nUHJvYycsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2N0bC9jdGxzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvY3RsL2N0bHN1cHBvcnQucHkKaW5kZXggYjJkOWFkNS4uZDM1NGQ5NCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvY3RsL2N0bHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvY3RsL2N0bHN1cHBvcnQucHkKQEAgLTYsMTYgKzYsMTYgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdDb250cm9scy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX0N0bCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ0NvbnRyb2wnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnQ29udHJvbHMuaCcgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfQ3RsJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ0NvbnRyb2wnICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0N0bCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdIYW5kbGUnCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnQ3RsJyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnSGFuZGxlJyAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNzksMTEgKzc5LDExIEBACiBDb250cm9sRGlzY2xvc3VyZVRyaWFuZ2xlT3JpZW50YXRpb24gPSBVSW50MTYKIAogRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjID0gT3BhcXVlVHlwZSgiRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjIiwKLQkJIkRhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzYyIpCisgICAgICAgICAgICAgICAgIkRhdGFCcm93c2VyVGFibGVWaWV3Q29sdW1uRGVzYyIpCiBEYXRhQnJvd3Nlckxpc3RWaWV3Q29sdW1uRGVzYyA9IE9wYXF1ZVR5cGUoIkRhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIiwKLQkJIkRhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjIikKKyAgICAgICAgICAgICAgICAiRGF0YUJyb3dzZXJMaXN0Vmlld0NvbHVtbkRlc2MiKQogQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvID0gT3BhcXVlVHlwZSgiQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvIiwKLQkJIkNvbnRyb2xCdXR0b25Db250ZW50SW5mbyIpCisgICAgICAgICAgICAgICAgIkNvbnRyb2xCdXR0b25Db250ZW50SW5mbyIpCiBDb250cm9sQnV0dG9uQ29udGVudEluZm9QdHIgPSBDb250cm9sQnV0dG9uQ29udGVudEluZm9fcHRyID0gQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvCiAKIENvbnRyb2xUYWJFbnRyeV9wdHIgPSBPcGFxdWVUeXBlKCJDb250cm9sVGFiRW50cnkiLCAiQ29udHJvbFRhYkVudHJ5IikKQEAgLTk1LDE3ICs5NSwxNyBAQAogQ29udHJvbFB1c2hCdXR0b25JY29uQWxpZ25tZW50ID0gVUludDE2CiAKIGNsYXNzIENvbnRyb2xBY3Rpb25EZWZpbml0aW9uKFR5cGUpOgotCWRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIiVzICVzOyIsIHNlbGYudHlwZU5hbWUsIG5hbWUpCi0JCU91dHB1dCgiVW5pdmVyc2FsUHJvY1B0ciBjX2NhbGxiYWNrOyIpCi0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICJteWFjdGlvbnByb2NfdXBwIgotCWRlZiBjbGVhbnVwKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoInNldGNhbGxiYWNrKChQeU9iamVjdCopX3NlbGYsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBhY3Rpb25Qcm9jLCAmY19jYWxsYmFjayk7IikKKyAgICBkZWYgZGVjbGFyZShzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCIlcyAlczsiLCBzZWxmLnR5cGVOYW1lLCBuYW1lKQorICAgICAgICBPdXRwdXQoIlVuaXZlcnNhbFByb2NQdHIgY19jYWxsYmFjazsiKQorICAgIGRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAibXlhY3Rpb25wcm9jX3VwcCIKKyAgICBkZWYgY2xlYW51cChzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJzZXRjYWxsYmFjaygoUHlPYmplY3QqKV9zZWxmLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYWN0aW9uUHJvYywgJmNfY2FsbGJhY2spOyIpCiAKIGNsYXNzIENvbnRyb2xBY3Rpb25EZWZpbml0aW9uTmV3Q29udHJvbChDb250cm9sQWN0aW9uRGVmaW5pdGlvbik6Ci0JZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgic2V0Y2FsbGJhY2soX3Jlcywga015Q29udHJvbEFjdGlvblByb2NUYWcsIGxpdmVUcmFja2luZ1Byb2MsICZjX2NhbGxiYWNrKTsiKQorICAgIGRlZiBjbGVhbnVwKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoInNldGNhbGxiYWNrKF9yZXMsIGtNeUNvbnRyb2xBY3Rpb25Qcm9jVGFnLCBsaXZlVHJhY2tpbmdQcm9jLCAmY19jYWxsYmFjayk7IikKIAogQ29udHJvbEFjdGlvblVQUCA9IENvbnRyb2xBY3Rpb25EZWZpbml0aW9uKCJQeU9iamVjdCoiLCAiTyIpCiBDb250cm9sQWN0aW9uVVBQTmV3Q29udHJvbCA9IENvbnRyb2xBY3Rpb25EZWZpbml0aW9uTmV3Q29udHJvbCgiUHlPYmplY3QqIiwgIk8iKQpAQCAtMTM4LDE5ICsxMzgsMTkgQEAKIENvbnRyb2xGb250U3R5bGVfTmV3KENvbnRyb2xGb250U3R5bGVSZWMgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJoaGhoaGhPJk8mIiwgaXRzZWxmLT5mbGFncywgaXRzZWxmLT5mb250LAotCQlpdHNlbGYtPnNpemUsIGl0c2VsZi0+c3R5bGUsIGl0c2VsZi0+bW9kZSwgaXRzZWxmLT5qdXN0LAotCQlRZFJHQl9OZXcsICZpdHNlbGYtPmZvcmVDb2xvciwgUWRSR0JfTmV3LCAmaXRzZWxmLT5iYWNrQ29sb3IpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaGhoTyZPJiIsIGl0c2VsZi0+ZmxhZ3MsIGl0c2VsZi0+Zm9udCwKKyAgICAgICAgICAgICAgICBpdHNlbGYtPnNpemUsIGl0c2VsZi0+c3R5bGUsIGl0c2VsZi0+bW9kZSwgaXRzZWxmLT5qdXN0LAorICAgICAgICAgICAgICAgIFFkUkdCX05ldywgJml0c2VsZi0+Zm9yZUNvbG9yLCBRZFJHQl9OZXcsICZpdHNlbGYtPmJhY2tDb2xvcik7CiB9CiAjZW5kaWYKIAogc3RhdGljIGludAogQ29udHJvbEZvbnRTdHlsZV9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDb250cm9sRm9udFN0eWxlUmVjICppdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKLQkJJml0c2VsZi0+Zm9udCwgJml0c2VsZi0+c2l6ZSwgJml0c2VsZi0+c3R5bGUsICZpdHNlbGYtPm1vZGUsCi0JCSZpdHNlbGYtPmp1c3QsIFFkUkdCX0NvbnZlcnQsICZpdHNlbGYtPmZvcmVDb2xvciwKLQkJUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaGhoaGhoTyZPJikiLCAmaXRzZWxmLT5mbGFncywKKyAgICAgICAgICAgICAgICAmaXRzZWxmLT5mb250LCAmaXRzZWxmLT5zaXplLCAmaXRzZWxmLT5zdHlsZSwgJml0c2VsZi0+bW9kZSwKKyAgICAgICAgICAgICAgICAmaXRzZWxmLT5qdXN0LCBRZFJHQl9Db252ZXJ0LCAmaXRzZWxmLT5mb3JlQ29sb3IsCisgICAgICAgICAgICAgICAgUWRSR0JfQ29udmVydCwgJml0c2VsZi0+YmFja0NvbG9yKTsKIH0KIAogLyoKQEAgLTE2MCwxMyArMTYwLDEzIEBACiBQeUNvbnRyb2xJRF9OZXcoQ29udHJvbElEICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0c2VsZi0+c2lnbmF0dXJlLCBpdHNlbGYtPmlkKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdHNlbGYtPnNpZ25hdHVyZSwgaXRzZWxmLT5pZCk7CiB9CiAKIHN0YXRpYyBpbnQKIFB5Q29udHJvbElEX0NvbnZlcnQoUHlPYmplY3QgKnYsIENvbnRyb2xJRCAqaXRzZWxmKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKE8mbCkiLCBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnNpZ25hdHVyZSwgJml0c2VsZi0+aWQpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihPJmwpIiwgUHlNYWNfR2V0T1NUeXBlLCAmaXRzZWxmLT5zaWduYXR1cmUsICZpdHNlbGYtPmlkKTsKIH0KIAogLyoKQEAgLTE3NSw0MCArMTc1LDQwIEBACiBzdGF0aWMgaW50CiBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjICppdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIobE8mbCkiLAotCSAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5wcm9wZXJ0eUlELAotCSAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnByb3BlcnR5VHlwZSwKLQkgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+cHJvcGVydHlGbGFncyk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGxPJmwpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnByb3BlcnR5SUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRPU1R5cGUsICZpdHNlbGYtPnByb3BlcnR5VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnByb3BlcnR5RmxhZ3MpOwogfQogCiBzdGF0aWMgaW50CiBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydChQeU9iamVjdCAqdiwgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvICppdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoaE8mKSIsCi0JICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAotCSAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+dS5pY29uU3VpdGUpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihoTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPmNvbnRlbnRUeXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT3B0UmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPnUuaWNvblN1aXRlKTsKIH0KIAogc3RhdGljIGludAogRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2NfQ29udmVydChQeU9iamVjdCAqdiwgRGF0YUJyb3dzZXJMaXN0Vmlld0hlYWRlckRlc2MgKml0c2VsZikKIHsKLQlpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSEhoTyZITyZPJikiLAotCSAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5taW5pbXVtV2lkdGgsCi0JICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKLQkgICAgICAgICAgICAgICAgICAgJml0c2VsZi0+dGl0bGVPZmZzZXQsCi0JICAgICAgICAgICAgICAgICAgIENGU3RyaW5nUmVmT2JqX0NvbnZlcnQsICZpdHNlbGYtPnRpdGxlU3RyaW5nLAotCSAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCi0JICAgICAgICAgICAgICAgICAgIENvbnRyb2xGb250U3R5bGVfQ29udmVydCwgJml0c2VsZi0+YnRuRm9udFN0eWxlLAotCSAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJml0c2VsZi0+YnRuQ29udGVudEluZm8pOworICAgICAgICBpdHNlbGYtPnZlcnNpb24gPSBrRGF0YUJyb3dzZXJMaXN0Vmlld0xhdGVzdEhlYWRlckRlc2M7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKEhIaE8mSE8mTyYpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1pbmltdW1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPm1heGltdW1XaWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZpdHNlbGYtPnRpdGxlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJml0c2VsZi0+dGl0bGVTdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT5pbml0aWFsT3JkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sRm9udFN0eWxlX0NvbnZlcnQsICZpdHNlbGYtPmJ0bkZvbnRTdHlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xCdXR0b25Db250ZW50SW5mb19Db252ZXJ0LCAmaXRzZWxmLT5idG5Db250ZW50SW5mbyk7CiB9CiAKIHN0YXRpYyBpbnQKIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjX0NvbnZlcnQoUHlPYmplY3QgKnYsIERhdGFCcm93c2VyTGlzdFZpZXdDb2x1bW5EZXNjICppdHNlbGYpCiB7Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAotCSAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3NlclRhYmxlVmlld0NvbHVtbkRlc2NfQ29udmVydCwgJml0c2VsZi0+cHJvcGVydHlEZXNjLAotCSAgICAgICAgICAgICAgICAgICBEYXRhQnJvd3Nlckxpc3RWaWV3SGVhZGVyRGVzY19Db252ZXJ0LCAmaXRzZWxmLT5oZWFkZXJCdG5EZXNjKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoTyZPJikiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGF0YUJyb3dzZXJUYWJsZVZpZXdDb2x1bW5EZXNjX0NvbnZlcnQsICZpdHNlbGYtPnByb3BlcnR5RGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERhdGFCcm93c2VyTGlzdFZpZXdIZWFkZXJEZXNjX0NvbnZlcnQsICZpdHNlbGYtPmhlYWRlckJ0bkRlc2MpOwogfQogCiAvKiBUcmFja0NvbnRyb2wgYW5kIEhhbmRsZUNvbnRyb2xDbGljayBjYWxsYmFjayBzdXBwb3J0ICovCkBAIC0yMjMsOCArMjIzLDggQEAKIHN0YXRpYyBDb250cm9sVXNlclBhbmVIaXRUZXN0VVBQIG15aGl0dGVzdHByb2NfdXBwOwogc3RhdGljIENvbnRyb2xVc2VyUGFuZVRyYWNraW5nVVBQIG15dHJhY2tpbmdwcm9jX3VwcDsKIAotc3RhdGljIGludCBzZXR0cmFja2Z1bmMoUHlPYmplY3QgKik7IAkvKiBmb3J3YXJkICovCi1zdGF0aWMgdm9pZCBjbHJ0cmFja2Z1bmModm9pZCk7CS8qIGZvcndhcmQgKi8KK3N0YXRpYyBpbnQgc2V0dHJhY2tmdW5jKFB5T2JqZWN0ICopOyAgICAvKiBmb3J3YXJkICovCitzdGF0aWMgdm9pZCBjbHJ0cmFja2Z1bmModm9pZCk7IC8qIGZvcndhcmQgKi8KIHN0YXRpYyBpbnQgc2V0Y2FsbGJhY2soUHlPYmplY3QgKiwgT1NUeXBlLCBQeU9iamVjdCAqLCBVbml2ZXJzYWxQcm9jUHRyICopOwogIiIiCiAKQEAgLTIzMiwyMzkgKzIzMiwyMzkgQEAKIHN0YXRpYyBQeU9iamVjdCAqCiBDdGxPYmpfTmV3VW5tYW5hZ2VkKENvbnRyb2xIYW5kbGUgaXRzZWxmKQogewotCUNvbnRyb2xPYmplY3QgKml0OwotCWlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsKLQlpdCA9IFB5T2JqZWN0X05FVyhDb250cm9sT2JqZWN0LCAmQ29udHJvbF9UeXBlKTsKLQlpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0JaXQtPm9iX2l0c2VsZiA9IGl0c2VsZjsKLQlpdC0+b2JfY2FsbGJhY2tkaWN0ID0gTlVMTDsKLQlyZXR1cm4gKFB5T2JqZWN0ICopaXQ7CisgICAgICAgIENvbnRyb2xPYmplY3QgKml0OworICAgICAgICBpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7CisgICAgICAgIGl0ID0gUHlPYmplY3RfTkVXKENvbnRyb2xPYmplY3QsICZDb250cm9sX1R5cGUpOworICAgICAgICBpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7CisgICAgICAgIGl0LT5vYl9pdHNlbGYgPSBpdHNlbGY7CisgICAgICAgIGl0LT5vYl9jYWxsYmFja2RpY3QgPSBOVUxMOworICAgICAgICByZXR1cm4gKFB5T2JqZWN0ICopaXQ7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBDdGxPYmpfV2hpY2hDb250cm9sKENvbnRyb2xIYW5kbGUgYykKIHsKLQlQeU9iamVjdCAqaXQ7CisgICAgICAgIFB5T2JqZWN0ICppdDsKIAotCWlmIChjID09IE5VTEwpCi0JCWl0ID0gUHlfTm9uZTsKLQllbHNlIHsKLQkJaXQgPSAoUHlPYmplY3QgKikgR2V0Q29udHJvbFJlZmVyZW5jZShjKTsKLQkJLyoKLQkJKiogSWYgdGhlIHJlZmNvbiBpcyB6ZXJvIG9yIGRvZXNuJ3QgcG9pbnQgYmFjayB0byB0aGUgUHl0aG9uIG9iamVjdAotCQkqKiB0aGUgY29udHJvbCBpcyBub3Qgb3Vycy4gUmV0dXJuIGEgdGVtcG9yYXJ5IG9iamVjdC4KLQkJKi8KLQkJaWYgKGl0ID09IE5VTEwgfHwgKChDb250cm9sT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gYykKLQkJCXJldHVybiBDdGxPYmpfTmV3VW5tYW5hZ2VkKGMpOwotCX0KLQlQeV9JTkNSRUYoaXQpOwotCXJldHVybiBpdDsKKyAgICAgICAgaWYgKGMgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldENvbnRyb2xSZWZlcmVuY2UoYyk7CisgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAqKiBJZiB0aGUgcmVmY29uIGlzIHplcm8gb3IgZG9lc24ndCBwb2ludCBiYWNrIHRvIHRoZSBQeXRob24gb2JqZWN0CisgICAgICAgICAgICAgICAgKiogdGhlIGNvbnRyb2wgaXMgbm90IG91cnMuIFJldHVybiBhIHRlbXBvcmFyeSBvYmplY3QuCisgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBpZiAoaXQgPT0gTlVMTCB8fCAoKENvbnRyb2xPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSBjKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEN0bE9ial9OZXdVbm1hbmFnZWQoYyk7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIGl0OwogfQogCiBzdGF0aWMgaW50CiBzZXR0cmFja2Z1bmMoUHlPYmplY3QgKm9iaikKIHsKLQlpZiAodHJhY2tlcikgewotCQlQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiVHJhY2tlciBmdW5jdGlvbiBpbiB1c2UiKTsKLQkJcmV0dXJuIDA7Ci0JfQotCXRyYWNrZXIgPSBvYmo7Ci0JUHlfSU5DUkVGKHRyYWNrZXIpOwotCXJldHVybiAxOworICAgICAgICBpZiAodHJhY2tlcikgeworICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJUcmFja2VyIGZ1bmN0aW9uIGluIHVzZSIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHRyYWNrZXIgPSBvYmo7CisgICAgICAgIFB5X0lOQ1JFRih0cmFja2VyKTsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIHN0YXRpYyB2b2lkCiBjbHJ0cmFja2Z1bmModm9pZCkKIHsKLQlQeV9YREVDUkVGKHRyYWNrZXIpOwotCXRyYWNrZXIgPSAwOworICAgICAgICBQeV9YREVDUkVGKHRyYWNrZXIpOworICAgICAgICB0cmFja2VyID0gMDsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteXRyYWNrZXIoQ29udHJvbEhhbmRsZSBjdGwsIHNob3J0IHBhcnQpCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICpydj0wOworICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2PTA7CiAKLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7Ci0JaWYgKGFyZ3MgJiYgdHJhY2tlcikgewotCQlydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmIChydikKLQkJUHlfREVDUkVGKHJ2KTsKLQllbHNlIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfQorICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8maSkiLCBDdGxPYmpfV2hpY2hDb250cm9sLCBjdGwsIChpbnQpcGFydCk7CisgICAgICAgIGlmIChhcmdzICYmIHRyYWNrZXIpIHsKKyAgICAgICAgICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KHRyYWNrZXIsIGFyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYpCisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIlRyYWNrQ29udHJvbCBvciBIYW5kbGVDb250cm9sQ2xpY2s6IGV4Y2VwdGlvbiBpbiB0cmFja2VyIGZ1bmN0aW9uXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfQogfQogCiBzdGF0aWMgaW50CiBzZXRjYWxsYmFjayhQeU9iamVjdCAqbXlzZWxmLCBPU1R5cGUgd2hpY2gsIFB5T2JqZWN0ICpjYWxsYmFjaywgVW5pdmVyc2FsUHJvY1B0ciAqdXBwcCkKIHsKLQlDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7Ci0JY2hhciBrZXlidWZbOV07Ci0JCi0JaWYgKCB3aGljaCA9PSBrTXlDb250cm9sQWN0aW9uUHJvY1RhZyApCi0JCSp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlhY3Rpb25wcm9jX3VwcDsKLQllbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnICkKLQkJKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWtleWRvd25wcm9jX3VwcDsKLQllbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZyApCi0JCSp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlmb2N1c3Byb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcgKQotCQkqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15ZHJhd3Byb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcgKQotCQkqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15aWRsZXByb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lSGl0VGVzdFByb2NUYWcgKQotCQkqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15aGl0dGVzdHByb2NfdXBwOwotCWVsc2UgaWYgKCB3aGljaCA9PSBrQ29udHJvbFVzZXJQYW5lVHJhY2tpbmdQcm9jVGFnICkKLQkJKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteXRyYWNraW5ncHJvY191cHA7Ci0JZWxzZQotCQlyZXR1cm4gLTE7Ci0JLyogT25seSBub3cgZG8gd2UgdGVzdCBmb3IgY2xlYXJpbmcgb2YgdGhlIGNhbGxiYWNrOiAqLwotCWlmICggY2FsbGJhY2sgPT0gUHlfTm9uZSApCi0JCSp1cHBwID0gTlVMTDsKLQkvKiBDcmVhdGUgdGhlIGRpY3QgaWYgaXQgZG9lc24ndCBleGlzdCB5ZXQgKHNvIHdlIGRvbid0IGdldCBzdWNoIGEgZGljdCBmb3IgZXZlcnkgY29udHJvbCkgKi8KLQlpZiAoIHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9PSBOVUxMICkKLQkJaWYgKCAoc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID0gUHlEaWN0X05ldygpKSA9PSBOVUxMICkKLQkJCXJldHVybiAtMTsKLQkvKiBBbmQgc3RvcmUgdGhlIFB5dGhvbiBjYWxsYmFjayAqLwotCXNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotCWlmIChQeURpY3RfU2V0SXRlbVN0cmluZyhzZWxmLT5vYl9jYWxsYmFja2RpY3QsIGtleWJ1ZiwgY2FsbGJhY2spIDwgMCkKLQkJcmV0dXJuIC0xOwotCXJldHVybiAwOworICAgICAgICBDb250cm9sT2JqZWN0ICpzZWxmID0gKENvbnRyb2xPYmplY3QgKilteXNlbGY7CisgICAgICAgIGNoYXIga2V5YnVmWzldOworCisgICAgICAgIGlmICggd2hpY2ggPT0ga015Q29udHJvbEFjdGlvblByb2NUYWcgKQorICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlhY3Rpb25wcm9jX3VwcDsKKyAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVLZXlEb3duUHJvY1RhZyApCisgICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteWtleWRvd25wcm9jX3VwcDsKKyAgICAgICAgZWxzZSBpZiAoIHdoaWNoID09IGtDb250cm9sVXNlclBhbmVGb2N1c1Byb2NUYWcgKQorICAgICAgICAgICAgICAgICp1cHBwID0gKFVuaXZlcnNhbFByb2NQdHIpbXlmb2N1c3Byb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15ZHJhd3Byb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUlkbGVQcm9jVGFnICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15aWRsZXByb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IChVbml2ZXJzYWxQcm9jUHRyKW15aGl0dGVzdHByb2NfdXBwOworICAgICAgICBlbHNlIGlmICggd2hpY2ggPT0ga0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZyApCisgICAgICAgICAgICAgICAgKnVwcHAgPSAoVW5pdmVyc2FsUHJvY1B0cilteXRyYWNraW5ncHJvY191cHA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIC8qIE9ubHkgbm93IGRvIHdlIHRlc3QgZm9yIGNsZWFyaW5nIG9mIHRoZSBjYWxsYmFjazogKi8KKyAgICAgICAgaWYgKCBjYWxsYmFjayA9PSBQeV9Ob25lICkKKyAgICAgICAgICAgICAgICAqdXBwcCA9IE5VTEw7CisgICAgICAgIC8qIENyZWF0ZSB0aGUgZGljdCBpZiBpdCBkb2Vzbid0IGV4aXN0IHlldCAoc28gd2UgZG9uJ3QgZ2V0IHN1Y2ggYSBkaWN0IGZvciBldmVyeSBjb250cm9sKSAqLworICAgICAgICBpZiAoIHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICBpZiAoIChzZWxmLT5vYl9jYWxsYmFja2RpY3QgPSBQeURpY3RfTmV3KCkpID09IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAvKiBBbmQgc3RvcmUgdGhlIFB5dGhvbiBjYWxsYmFjayAqLworICAgICAgICBzcHJpbnRmKGtleWJ1ZiwgIiV4IiwgKHVuc2lnbmVkKXdoaWNoKTsKKyAgICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmLCBjYWxsYmFjaykgPCAwKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBjYWxsY2FsbGJhY2soQ29udHJvbE9iamVjdCAqc2VsZiwgT1NUeXBlIHdoaWNoLCBQeU9iamVjdCAqYXJnbGlzdCkKIHsKLQljaGFyIGtleWJ1Zls5XTsKLQlQeU9iamVjdCAqZnVuYywgKnJ2OwotCQotCXNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOwotCWlmICggc2VsZi0+b2JfY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwKLQkJCShmdW5jID0gUHlEaWN0X0dldEl0ZW1TdHJpbmcoc2VsZi0+b2JfY2FsbGJhY2tkaWN0LCBrZXlidWYpKSA9PSBOVUxMICkgewotCQlQeVN5c19Xcml0ZVN0ZGVycigiQ29udHJvbCBjYWxsYmFjayAleCB3aXRob3V0IGNhbGxiYWNrIG9iamVjdFxcbiIsICh1bnNpZ25lZCl3aGljaCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlydiA9IFB5RXZhbF9DYWxsT2JqZWN0KGZ1bmMsIGFyZ2xpc3QpOwotCWlmICggcnYgPT0gTlVMTCApIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBjb250cm9sIGNhbGxiYWNrICV4IGhhbmRsZXJcXG4iLCAodW5zaWduZWQpd2hpY2gpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQlyZXR1cm4gcnY7CisgICAgICAgIGNoYXIga2V5YnVmWzldOworICAgICAgICBQeU9iamVjdCAqZnVuYywgKnJ2OworCisgICAgICAgIHNwcmludGYoa2V5YnVmLCAiJXgiLCAodW5zaWduZWQpd2hpY2gpOworICAgICAgICBpZiAoIHNlbGYtPm9iX2NhbGxiYWNrZGljdCA9PSBOVUxMIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAoZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKHNlbGYtPm9iX2NhbGxiYWNrZGljdCwga2V5YnVmKSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiQ29udHJvbCBjYWxsYmFjayAleCB3aXRob3V0IGNhbGxiYWNrIG9iamVjdFxcbiIsICh1bnNpZ25lZCl3aGljaCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdsaXN0KTsKKyAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJFeGNlcHRpb24gaW4gY29udHJvbCBjYWxsYmFjayAleCBoYW5kbGVyXFxuIiwgKHVuc2lnbmVkKXdoaWNoKTsKKyAgICAgICAgICAgICAgICBQeUVycl9QcmludCgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBydjsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWFjdGlvbnByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBTSW50MTYgcGFydCkKIHsKLQlDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotCVB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0JCi0JY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLQlhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKLQlydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrTXlDb250cm9sQWN0aW9uUHJvY1RhZywgYXJnbGlzdCk7Ci0JUHlfWERFQ1JFRihhcmdsaXN0KTsKLQlQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKworICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT2giLCBjdGxfb2JqLCBwYXJ0KTsKKyAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga015Q29udHJvbEFjdGlvblByb2NUYWcsIGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15a2V5ZG93bnByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBTSW50MTYga2V5Q29kZSwgU0ludDE2IGNoYXJDb2RlLCBTSW50MTYgbW9kaWZpZXJzKQogewotCUNvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0JUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLQlzaG9ydCBjX3J2ID0gMDsKLQkKLQljdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotCWFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaGhoIiwgY3RsX29iaiwga2V5Q29kZSwgY2hhckNvZGUsIG1vZGlmaWVycyk7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCWlmICggcnYgKQotCQlpZiAoIVB5QXJnX1BhcnNlKHJ2LCAiaCIsICZjX3J2KSkKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JUHlfWERFQ1JFRihydik7Ci0JcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKyAgICAgICAgc2hvcnQgY19ydiA9IDA7CisKKyAgICAgICAgY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKKyAgICAgICAgYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oaGgiLCBjdGxfb2JqLCBrZXlDb2RlLCBjaGFyQ29kZSwgbW9kaWZpZXJzKTsKKyAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUtleURvd25Qcm9jVGFnLCBhcmdsaXN0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICAgICAgaWYgKCBydiApCisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15Zm9jdXNwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgQ29udHJvbFBhcnRDb2RlIHBhcnQpCiB7Ci0JQ29udHJvbE9iamVjdCAqY3RsX29iajsKLQlQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotCXNob3J0IGNfcnYgPSBrQ29udHJvbEZvY3VzTm9QYXJ0OwotCQotCWN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0JYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUZvY3VzUHJvY1RhZywgYXJnbGlzdCk7Ci0JUHlfWERFQ1JFRihhcmdsaXN0KTsKLQlpZiAoIHJ2ICkKLQkJaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0JCQlQeUVycl9DbGVhcigpOwotCVB5X1hERUNSRUYocnYpOwotCXJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgICAgIHNob3J0IGNfcnYgPSBrQ29udHJvbEZvY3VzTm9QYXJ0OworCisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRm9jdXNQcm9jVGFnLCBhcmdsaXN0KTsKKyAgICAgICAgUHlfWERFQ1JFRihhcmdsaXN0KTsKKyAgICAgICAgaWYgKCBydiApCisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWRyYXdwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgU0ludDE2IHBhcnQpCiB7Ci0JQ29udHJvbE9iamVjdCAqY3RsX29iajsKLQlQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OwotCQotCWN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0JYXJnbGlzdCA9IFB5X0J1aWxkVmFsdWUoIk9oIiwgY3RsX29iaiwgcGFydCk7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZURyYXdQcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCVB5X1hERUNSRUYocnYpOworICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworCisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPaCIsIGN0bF9vYmosIHBhcnQpOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lRHJhd1Byb2NUYWcsIGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCB2b2lkCiBteWlkbGVwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCkKIHsKLQlDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotCVB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0JCi0JY3RsX29iaiA9IChDb250cm9sT2JqZWN0ICopQ3RsT2JqX1doaWNoQ29udHJvbChjb250cm9sKTsKLQlhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiTyIsIGN0bF9vYmopOwotCXJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVJZGxlUHJvY1RhZywgYXJnbGlzdCk7Ci0JUHlfWERFQ1JFRihhcmdsaXN0KTsKLQlQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgQ29udHJvbE9iamVjdCAqY3RsX29iajsKKyAgICAgICAgUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKKworICAgICAgICBjdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOworICAgICAgICBhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiTyIsIGN0bF9vYmopOworICAgICAgICBydiA9IGNhbGxjYWxsYmFjayhjdGxfb2JqLCBrQ29udHJvbFVzZXJQYW5lSWRsZVByb2NUYWcsIGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKGFyZ2xpc3QpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15aGl0dGVzdHByb2MoQ29udHJvbEhhbmRsZSBjb250cm9sLCBQb2ludCB3aGVyZSkKIHsKLQlDb250cm9sT2JqZWN0ICpjdGxfb2JqOwotCVB5T2JqZWN0ICphcmdsaXN0LCAqcnY7Ci0Jc2hvcnQgY19ydiA9IC0xOworICAgICAgICBDb250cm9sT2JqZWN0ICpjdGxfb2JqOworICAgICAgICBQeU9iamVjdCAqYXJnbGlzdCwgKnJ2OworICAgICAgICBzaG9ydCBjX3J2ID0gLTE7CiAKLQljdGxfb2JqID0gKENvbnRyb2xPYmplY3QgKilDdGxPYmpfV2hpY2hDb250cm9sKGNvbnRyb2wpOwotCWFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZUhpdFRlc3RQcm9jVGFnLCBhcmdsaXN0KTsKLQlQeV9YREVDUkVGKGFyZ2xpc3QpOwotCS8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KLQlpZiAoIHJ2ICkKLQkJaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0JCQlQeUVycl9DbGVhcigpOwotCVB5X1hERUNSRUYocnYpOwotCXJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCB3aGVyZSk7CisgICAgICAgIHJ2ID0gY2FsbGNhbGxiYWNrKGN0bF9vYmosIGtDb250cm9sVXNlclBhbmVIaXRUZXN0UHJvY1RhZywgYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgICAgIC8qIElnbm9yZSBlcnJvcnMsIG5vdGhpbmcgd2UgY2FuIGRvIGFib3V0IHRoZW0gKi8KKyAgICAgICAgaWYgKCBydiApCisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCisgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeV9YREVDUkVGKHJ2KTsKKyAgICAgICAgcmV0dXJuIChDb250cm9sUGFydENvZGUpY19ydjsKIH0KIAogc3RhdGljIHBhc2NhbCBDb250cm9sUGFydENvZGUKIG15dHJhY2tpbmdwcm9jKENvbnRyb2xIYW5kbGUgY29udHJvbCwgUG9pbnQgc3RhcnRQdCwgQ29udHJvbEFjdGlvblVQUCBhY3Rpb25Qcm9jKQogewotCUNvbnRyb2xPYmplY3QgKmN0bF9vYmo7Ci0JUHlPYmplY3QgKmFyZ2xpc3QsICpydjsKLQlzaG9ydCBjX3J2ID0gLTE7CisgICAgICAgIENvbnRyb2xPYmplY3QgKmN0bF9vYmo7CisgICAgICAgIFB5T2JqZWN0ICphcmdsaXN0LCAqcnY7CisgICAgICAgIHNob3J0IGNfcnYgPSAtMTsKIAotCWN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7Ci0JLyogV2UgY2Fubm90IHBhc3MgdGhlIGFjdGlvblByb2Mgd2l0aG91dCBsb3RzIG9mIHdvcmsgKi8KLQlhcmdsaXN0ID0gUHlfQnVpbGRWYWx1ZSgiT08mIiwgY3RsX29iaiwgUHlNYWNfQnVpbGRQb2ludCwgc3RhcnRQdCk7Ci0JcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZywgYXJnbGlzdCk7Ci0JUHlfWERFQ1JFRihhcmdsaXN0KTsKLQlpZiAoIHJ2ICkKLQkJaWYgKCFQeUFyZ19QYXJzZShydiwgImgiLCAmY19ydikpCi0JCQlQeUVycl9DbGVhcigpOwotCVB5X1hERUNSRUYocnYpOwotCXJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CisgICAgICAgIGN0bF9vYmogPSAoQ29udHJvbE9iamVjdCAqKUN0bE9ial9XaGljaENvbnRyb2woY29udHJvbCk7CisgICAgICAgIC8qIFdlIGNhbm5vdCBwYXNzIHRoZSBhY3Rpb25Qcm9jIHdpdGhvdXQgbG90cyBvZiB3b3JrICovCisgICAgICAgIGFyZ2xpc3QgPSBQeV9CdWlsZFZhbHVlKCJPTyYiLCBjdGxfb2JqLCBQeU1hY19CdWlsZFBvaW50LCBzdGFydFB0KTsKKyAgICAgICAgcnYgPSBjYWxsY2FsbGJhY2soY3RsX29iaiwga0NvbnRyb2xVc2VyUGFuZVRyYWNraW5nUHJvY1RhZywgYXJnbGlzdCk7CisgICAgICAgIFB5X1hERUNSRUYoYXJnbGlzdCk7CisgICAgICAgIGlmICggcnYgKQorICAgICAgICAgICAgICAgIGlmICghUHlBcmdfUGFyc2UocnYsICJoIiwgJmNfcnYpKQorICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKKyAgICAgICAgUHlfWERFQ1JFRihydik7CisgICAgICAgIHJldHVybiAoQ29udHJvbFBhcnRDb2RlKWNfcnY7CiB9CiAiIiIKIApAQCAtNDgyLDE4ICs0ODIsMTggQEAKICIiIgogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIE9iamVjdElkZW50aXR5TWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2tkaWN0OyIpCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIlNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7IikKLQkJT3V0cHV0KCJpdC0+b2JfY2FsbGJhY2tkaWN0ID0gTlVMTDsiKQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrZGljdCk7IikKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2JfaXRzZWxmKVNldENvbnRyb2xSZWZlcmVuY2Uoc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8iKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2tkaWN0OyIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIlNldENvbnRyb2xSZWZlcmVuY2UoaXRzZWxmLCAobG9uZylpdCk7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfY2FsbGJhY2tkaWN0ID0gTlVMTDsiKQorICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2NhbGxiYWNrZGljdCk7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+b2JfaXRzZWxmKVNldENvbnRyb2xSZWZlcmVuY2Uoc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsgLyogTWFrZSBpdCBmb3JnZXQgYWJvdXQgdXMgKi8iKQogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKQEAgLTUyMywxNCArNTIzLDE0IEBACiAKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mfE8iLAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldFBvaW50LCAmc3RhcnRQb2ludCwgJmNhbGxiYWNrKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBpZiAoY2FsbGJhY2sgJiYgY2FsbGJhY2sgIT0gUHlfTm9uZSkgewotCWlmIChQeUludF9DaGVjayhjYWxsYmFjaykgJiYgUHlJbnRfQVNfTE9ORyhjYWxsYmFjaykgPT0gLTEpCi0JCXVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOwotCWVsc2UgewotCQlzZXR0cmFja2Z1bmMoY2FsbGJhY2spOwotCQl1cHAgPSBteXRyYWNrZXJfdXBwOwotCX0KKyAgICAgICAgaWYgKFB5SW50X0NoZWNrKGNhbGxiYWNrKSAmJiBQeUludF9BU19MT05HKGNhbGxiYWNrKSA9PSAtMSkKKyAgICAgICAgICAgICAgICB1cHAgPSAoQ29udHJvbEFjdGlvblVQUCktMTsKKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgc2V0dHJhY2tmdW5jKGNhbGxiYWNrKTsKKyAgICAgICAgICAgICAgICB1cHAgPSBteXRyYWNrZXJfdXBwOworICAgICAgICB9CiB9CiBfcnYgPSBUcmFja0NvbnRyb2woX3NlbGYtPm9iX2l0c2VsZiwKICAgICAgICAgICAgICAgICAgICBzdGFydFBvaW50LApAQCAtNTU4LDE0ICs1NTgsMTQgQEAKICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19HZXRQb2ludCwgJnN0YXJ0UG9pbnQsCiAgICAgICAgICAgICAgICAgICAgICAgJm1vZGlmaWVycywKICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmIChjYWxsYmFjayAmJiBjYWxsYmFjayAhPSBQeV9Ob25lKSB7Ci0JaWYgKFB5SW50X0NoZWNrKGNhbGxiYWNrKSAmJiBQeUludF9BU19MT05HKGNhbGxiYWNrKSA9PSAtMSkKLQkJdXBwID0gKENvbnRyb2xBY3Rpb25VUFApLTE7Ci0JZWxzZSB7Ci0JCXNldHRyYWNrZnVuYyhjYWxsYmFjayk7Ci0JCXVwcCA9IG15dHJhY2tlcl91cHA7Ci0JfQorICAgICAgICBpZiAoUHlJbnRfQ2hlY2soY2FsbGJhY2spICYmIFB5SW50X0FTX0xPTkcoY2FsbGJhY2spID09IC0xKQorICAgICAgICAgICAgICAgIHVwcCA9IChDb250cm9sQWN0aW9uVVBQKS0xOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBzZXR0cmFja2Z1bmMoY2FsbGJhY2spOworICAgICAgICAgICAgICAgIHVwcCA9IG15dHJhY2tlcl91cHA7CisgICAgICAgIH0KIH0KIF9ydiA9IEhhbmRsZUNvbnRyb2xDbGljayhfc2VsZi0+b2JfaXRzZWxmLAogICAgICAgICAgICAgICAgICAgIHN0YXJ0UG9pbnQsCkBAIC01OTMsMTYgKzU5MywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICZpblBhcnQsCiAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmaW5UYWdOYW1lLAogICAgICAgICAgICAgICAgICAgICAgICZidWZmZXIsICZidWZmZXJTaXplKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAKIF9lcnIgPSBTZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgYnVmZmVyU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKIAogaWYgKF9lcnIgIT0gbm9FcnIpCi0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfcmVzID0gUHlfTm9uZTsKIHJldHVybiBfcmVzOwogIiIiCkBAIC02MjMsMjkgKzYyMywyOSBAQAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAvKiBhbGxvY2F0ZSBhIGJ1ZmZlciBmb3IgdGhlIGRhdGEgKi8KIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwogaWYgKF9lcnIgIT0gbm9FcnIpCi0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBidWZmZXIgPSBQeU1lbV9ORVcoY2hhciwgYnVmZmVyU2l6ZSk7CiBpZiAoYnVmZmVyID09IE5VTEwpCi0JcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgIHJldHVybiBQeUVycl9Ob01lbW9yeSgpOwogCiBfZXJyID0gR2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgIGJ1ZmZlclNpemUsCisgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplLAogICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAmb3V0U2l6ZSk7CiAKIGlmIChfZXJyICE9IG5vRXJyKSB7Ci0JUHlNZW1fREVMKGJ1ZmZlcik7Ci0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeU1lbV9ERUwoYnVmZmVyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogfQogX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMjIiwgYnVmZmVyLCBvdXRTaXplKTsKIFB5TWVtX0RFTChidWZmZXIpOwpAQCAtNjY3LDE2ICs2NjcsMTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICBPcHRSZXNPYmpfQ29udmVydCwgJmJ1ZmZlcikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiBfZXJyID0gU2V0Q29udHJvbERhdGEoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgIGluUGFydCwKLQkgICAgICAgICAgICAgIGluVGFnTmFtZSwKLQkgICAgICAgICAgICAgIHNpemVvZihidWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgIGluUGFydCwKKyAgICAgICAgICAgICAgICAgICAgICBpblRhZ05hbWUsCisgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGJ1ZmZlciksCiAgICAgICAgICAgICAgICAgICAgICAgKFB0cikmYnVmZmVyKTsKIAogaWYgKF9lcnIgIT0gbm9FcnIpCi0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBfcmVzID0gUHlfTm9uZTsKIHJldHVybiBfcmVzOwogIiIiCkBAIC02OTYsMjkgKzY5NiwyOSBAQAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaE8mIiwKICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAvKiBDaGVjayBpdCBpcyBoYW5kbGUtc2l6ZWQgKi8KIF9lcnIgPSBHZXRDb250cm9sRGF0YVNpemUoX3NlbGYtPm9iX2l0c2VsZiwKLQkgICAgICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICAgICAgaW5UYWdOYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBpblBhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwogaWYgKF9lcnIgIT0gbm9FcnIpCi0JcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CiBpZiAoYnVmZmVyU2l6ZSAhPSBzaXplb2YoSGFuZGxlKSkgewotCVB5RXJyX1NldFN0cmluZyhDdGxfRXJyb3IsICJHZXRDb250cm9sRGF0YVNpemUoKSAhPSBzaXplb2YoSGFuZGxlKSIpOwotCXJldHVybiBOVUxMOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoQ3RsX0Vycm9yLCAiR2V0Q29udHJvbERhdGFTaXplKCkgIT0gc2l6ZW9mKEhhbmRsZSkiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAKIF9lcnIgPSBHZXRDb250cm9sRGF0YShfc2VsZi0+b2JfaXRzZWxmLAotCSAgICAgICAgICAgICAgaW5QYXJ0LAotCSAgICAgICAgICAgICAgaW5UYWdOYW1lLAotCSAgICAgICAgICAgICAgc2l6ZW9mKEhhbmRsZSksCisgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoSGFuZGxlKSwKICAgICAgICAgICAgICAgICAgICAgICAoUHRyKSZoZGwsCiAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclNpemUpOwogCiBpZiAoX2VyciAhPSBub0VycikgewotCXJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogfQogX3JlcyA9IFB5X0J1aWxkVmFsdWUoIk8mIiwgT3B0UmVzT2JqX05ldywgaGRsKTsKIHJldHVybiBfcmVzOwpAQCAtNzQwLDE4ICs3NDAsMTggQEAKICAgICAgICAgICAgICAgICAgICAgICAmaW5QYXJ0LAogICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJmluVGFnTmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAmY2FsbGJhY2spKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIAogaWYgKCBzZXRjYWxsYmFjaygoUHlPYmplY3QgKilfc2VsZiwgaW5UYWdOYW1lLCBjYWxsYmFjaywgJmNfY2FsbGJhY2spIDwgMCApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX2VyciA9IFNldENvbnRyb2xEYXRhKF9zZWxmLT5vYl9pdHNlbGYsCi0JICAgICAgICAgICAgICBpblBhcnQsCi0JICAgICAgICAgICAgICBpblRhZ05hbWUsCi0JICAgICAgICAgICAgICBzaXplb2YoY19jYWxsYmFjayksCisgICAgICAgICAgICAgICAgICAgICAgaW5QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgIGluVGFnTmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoY19jYWxsYmFjayksCiAgICAgICAgICAgICAgICAgICAgICAgKFB0cikmY19jYWxsYmFjayk7CiAKIGlmIChfZXJyICE9IG5vRXJyKQotCXJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogX3JlcyA9IFB5X05vbmU7CiByZXR1cm4gX3JlczsKICIiIgpAQCAtNzgzLDI2ICs3ODMsMjYgQEAKICAgICAgICAgICAgICAgICAgICAgICAmc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAmZGlyZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICZ0YWJBcnJheU9iaikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiBpID0gUHlTZXF1ZW5jZV9MZW5ndGgodGFiQXJyYXlPYmopOwogaWYgKGkgPT0gLTEpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogaWYgKGkgPiBNQVhUQUJTKSB7Ci0JUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRvbyBtYW55IHRhYnMiKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfU2V0U3RyaW5nKEN0bF9FcnJvciwgIlRvbyBtYW55IHRhYnMiKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiBudW1UYWJzID0gaTsKIGZvciAoaT0wOyBpPG51bVRhYnM7IGkrKykgewotCXRhYkVudHJ5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHRhYkFycmF5T2JqLCBpKTsKLQlpZiAodGFiRW50cnkgPT0gTlVMTCkKLQkJcmV0dXJuIE5VTEw7Ci0JaWYgKCFQeUFyZ19QYXJzZSh0YWJFbnRyeSwgIihPJk8mQikiLAotCSAgICAgICAgICAgICAgICAgQ29udHJvbEJ1dHRvbkNvbnRlbnRJbmZvX0NvbnZlcnQsICZ0YWJBcnJheVtpXS5pY29uLAotCSAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRhYkFycmF5W2ldLm5hbWUsCi0JICAgICAgICAgICAgICAgICAmdGFiQXJyYXlbaV0uZW5hYmxlZAotCSAgICAgICAgICAgICAgICAgKSkKLQkJcmV0dXJuIE5VTEw7CisgICAgICAgIHRhYkVudHJ5ID0gUHlTZXF1ZW5jZV9HZXRJdGVtKHRhYkFycmF5T2JqLCBpKTsKKyAgICAgICAgaWYgKHRhYkVudHJ5ID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgIGlmICghUHlBcmdfUGFyc2UodGFiRW50cnksICIoTyZPJkIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDb250cm9sQnV0dG9uQ29udGVudEluZm9fQ29udmVydCwgJnRhYkFycmF5W2ldLmljb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ0ZTdHJpbmdSZWZPYmpfQ29udmVydCwgJnRhYkFycmF5W2ldLm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgJnRhYkFycmF5W2ldLmVuYWJsZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICApKQorICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOwogfQogCiBfZXJyID0gQ3JlYXRlVGFic0NvbnRyb2wod2luZG93LApkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZGxnL2RsZ3NjYW4ucHkgYi9NYWMvTW9kdWxlcy9kbGcvZGxnc2Nhbi5weQppbmRleCAzNzEwZDVkLi43ZmI2OGY3IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9kbGcvZGxnc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9kbGcvZGxnc2Nhbi5weQpAQCAtMTIsMTA1ICsxMiwxMDUgQEAKIE9CSkVDVCA9ICJEaWFsb2dQdHIiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gTE9ORyArICIuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluICgiRGlhbG9nUHRyIiwgIkRpYWxvZ1JlZiIpIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gKCJEaWFsb2dQdHIiLCAiRGlhbG9nUmVmIikgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdJbml0RGlhbG9ncycsCi0JCQknRXJyb3JTb3VuZCcsCi0JCQkjIERpYWxvZ3MgYXJlIGRpc3Bvc2VkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCi0JCQknQ2xvc2VEaWFsb2cnLAotCQkJJ0Rpc3Bvc0RpYWxvZycsCi0JCQknRGlzcG9zZURpYWxvZycsCi0JCQknVXBkdERpYWxvZycsCi0JCQknQ291bGRBbGVydCcsCi0JCQknRnJlZUFsZXJ0JywKLQkJCSdDb3VsZERpYWxvZycsCi0JCQknRnJlZURpYWxvZycsCi0JCQknR2V0U3RkRmlsdGVyUHJvYycsCi0JCQknR2V0RGlhbG9nUGFyZW50JywKLSMjCQkJIyBDYW4ndCBmaW5kIHRoZXNlIGluIHRoZSBDVyBQcm8gMyBsaWJyYXJpZXMKLQkJCSdTZXREaWFsb2dNb3ZhYmxlTW9kYWwnLAotCQkJJ0dldERpYWxvZ0NvbnRyb2xOb3RpZmljYXRpb25Qcm9jJywKLQkJCSdTZXRHcmFmUG9ydE9mRGlhbG9nJywgIyBGdW5ueSwgYW5kIHByb2JhYmx5IG5vdCB1c2VmdWwKLQkJCSMgQ2FuJ3QgZmluZCB0aGVzZToKLQkJCSdDbG9zZVN0YW5kYXJkU2hlZXQnLAotCQkJJ1J1blN0YW5kYXJkQWxlcnQnLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ0luaXREaWFsb2dzJywKKyAgICAgICAgICAgICAgICAnRXJyb3JTb3VuZCcsCisgICAgICAgICAgICAgICAgIyBEaWFsb2dzIGFyZSBkaXNwb3NlZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVsZXRlZAorICAgICAgICAgICAgICAgICdDbG9zZURpYWxvZycsCisgICAgICAgICAgICAgICAgJ0Rpc3Bvc0RpYWxvZycsCisgICAgICAgICAgICAgICAgJ0Rpc3Bvc2VEaWFsb2cnLAorICAgICAgICAgICAgICAgICdVcGR0RGlhbG9nJywKKyAgICAgICAgICAgICAgICAnQ291bGRBbGVydCcsCisgICAgICAgICAgICAgICAgJ0ZyZWVBbGVydCcsCisgICAgICAgICAgICAgICAgJ0NvdWxkRGlhbG9nJywKKyAgICAgICAgICAgICAgICAnRnJlZURpYWxvZycsCisgICAgICAgICAgICAgICAgJ0dldFN0ZEZpbHRlclByb2MnLAorICAgICAgICAgICAgICAgICdHZXREaWFsb2dQYXJlbnQnLAorIyMgICAgICAgICAgICAgICAgICAgICAgIyBDYW4ndCBmaW5kIHRoZXNlIGluIHRoZSBDVyBQcm8gMyBsaWJyYXJpZXMKKyAgICAgICAgICAgICAgICAnU2V0RGlhbG9nTW92YWJsZU1vZGFsJywKKyAgICAgICAgICAgICAgICAnR2V0RGlhbG9nQ29udHJvbE5vdGlmaWNhdGlvblByb2MnLAorICAgICAgICAgICAgICAgICdTZXRHcmFmUG9ydE9mRGlhbG9nJywgIyBGdW5ueSwgYW5kIHByb2JhYmx5IG5vdCB1c2VmdWwKKyAgICAgICAgICAgICAgICAjIENhbid0IGZpbmQgdGhlc2U6CisgICAgICAgICAgICAgICAgJ0Nsb3NlU3RhbmRhcmRTaGVldCcsCisgICAgICAgICAgICAgICAgJ1J1blN0YW5kYXJkQWxlcnQnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiQWxlcnRTdGRBbGVydFBhcmFtUHRyIiwJIyBUb28gbXVjaCB3b3JrLCBmb3Igbm93Ci0JCQkiQWxlcnRTdGRBbGVydFBhcmFtUmVjIiwJIyBkaXR0bwotCQkJIkFsZXJ0U3RkQWxlcnRQYXJhbVJlY19wdHIiLAkjIGRpdHRvCi0JCQkiQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1QdHIiLAkjIGRpdHRvCi0JCQkiQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWMiLAotCQkJIkFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjX3B0ciIsCi0JCQkiUVRNb2RlbGVzc0NhbGxiYWNrUHJvY1B0ciIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiQWxlcnRTdGRBbGVydFBhcmFtUHRyIiwgICAgICAgICMgVG9vIG11Y2ggd29yaywgZm9yIG5vdworICAgICAgICAgICAgICAgICJBbGVydFN0ZEFsZXJ0UGFyYW1SZWMiLCAgICAgICAgIyBkaXR0bworICAgICAgICAgICAgICAgICJBbGVydFN0ZEFsZXJ0UGFyYW1SZWNfcHRyIiwgICAgIyBkaXR0bworICAgICAgICAgICAgICAgICJBbGVydFN0ZENGU3RyaW5nQWxlcnRQYXJhbVB0ciIsICAgICAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkFsZXJ0U3RkQ0ZTdHJpbmdBbGVydFBhcmFtUmVjIiwKKyAgICAgICAgICAgICAgICAiQWxlcnRTdGRDRlN0cmluZ0FsZXJ0UGFyYW1SZWNfcHRyIiwKKyAgICAgICAgICAgICAgICAiUVRNb2RlbGVzc0NhbGxiYWNrUHJvY1B0ciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAotCQkJIAotCQkJIyBHZXREaWFsb2dJdGVtIHJldHVybiBoYW5kbGUgaXMgb3B0aW9uYWwKLQkJCShbKCJIYW5kbGUiLCAiaXRlbSIsICJPdXRNb2RlIildLAotCQkJIFsoIk9wdEhhbmRsZSIsICJpdGVtIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkjIE5ld0RpYWxvZyBFVEMuCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiTnVsbFN0b3JhZ2UiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJCi0JCQkoWygiRGlhbG9nUHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJFeGlzdGluZ0RpYWxvZ1B0ciIsICIqIiwgIioiKV0pLAotCQkJKFsoIkRpYWxvZ1JlZiIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdEaWFsb2dQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiV2luZG93UHRyIiwgIioiLCAiUmV0dXJuTW9kZSIpXSwKLQkJCSBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJIyBTdGRGaWx0ZXJQcm9jCi0JCQkoWygnRXZlbnRSZWNvcmQnLCAnZXZlbnQnLCAnT3V0TW9kZScpLCAKLQkJCSAgKCdEaWFsb2dJdGVtSW5kZXgnLCAnaXRlbUhpdCcsICdPdXRNb2RlJyldLAotCQkJIFsoJ0V2ZW50UmVjb3JkJywgJ2V2ZW50JywgJ0luT3V0TW9kZScpLCAKLQkJCSAgKCdEaWFsb2dJdGVtSW5kZXgnLCAnaXRlbUhpdCcsICdJbk91dE1vZGUnKV0pCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoIlN0cjI1NSIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAogCi0JCQldCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgR2V0RGlhbG9nSXRlbSByZXR1cm4gaGFuZGxlIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgKFsoIkhhbmRsZSIsICJpdGVtIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdEhhbmRsZSIsICJpdGVtIiwgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBOZXdEaWFsb2cgRVRDLgorICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiTnVsbFN0b3JhZ2UiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIkRpYWxvZ1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nRGlhbG9nUHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIkRpYWxvZ1JlZiIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nRGlhbG9nUHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1B0ciIsICIqIiwgIlJldHVybk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIFN0ZEZpbHRlclByb2MKKyAgICAgICAgICAgICAgICAoWygnRXZlbnRSZWNvcmQnLCAnZXZlbnQnLCAnT3V0TW9kZScpLAorICAgICAgICAgICAgICAgICAgKCdEaWFsb2dJdGVtSW5kZXgnLCAnaXRlbUhpdCcsICdPdXRNb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdFdmVudFJlY29yZCcsICdldmVudCcsICdJbk91dE1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICgnRGlhbG9nSXRlbUluZGV4JywgJ2l0ZW1IaXQnLCAnSW5PdXRNb2RlJyldKQorCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RsZy9kbGdzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvZGxnL2RsZ3N1cHBvcnQucHkKaW5kZXggODViYzYwNy4uMWMwY2M2YSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZGxnL2RsZ3N1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvZGxnL2RsZ3N1cHBvcnQucHkKQEAgLTUwLDU1ICs1MCw1NSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFJlY29yZCAqZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0ICppdGVtSGl0KQogewotCUJvb2xlYW4gcnY7Ci0JUHlPYmplY3QgKmFyZ3MsICpyZXM7Ci0JUHlPYmplY3QgKmNhbGxiYWNrID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7Ci0JaWYgKGNhbGxiYWNrID09IE5VTEwpCi0JCXJldHVybiAwOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCi0JRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0JYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOwotCWlmIChhcmdzID09IE5VTEwpCi0JCXJlcyA9IE5VTEw7Ci0JZWxzZSB7Ci0JCXJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAocmVzID09IE5VTEwpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCSppdGVtSGl0ID0gLTE7IC8qIEZha2UgcmV0dXJuIGl0ZW0gKi8KLQkJcmV0dXJuIDE7IC8qIFdlIGhhbmRsZWQgaXQgKi8KLQl9Ci0JZWxzZSB7Ci0JCURsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0JCWlmIChQeUludF9DaGVjayhyZXMpKSB7Ci0JCQkqaXRlbUhpdCA9IFB5SW50X0FzTG9uZyhyZXMpOwotCQkJcnYgPSAxOwotCQl9Ci0JCWVsc2UKLQkJCXJ2ID0gUHlPYmplY3RfSXNUcnVlKHJlcyk7Ci0JfQotCVB5X0RFQ1JFRihyZXMpOwotCXJldHVybiBydjsKKyAgICAgICAgQm9vbGVhbiBydjsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgICAgIFB5T2JqZWN0ICpjYWxsYmFjayA9IERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrOworICAgICAgICBpZiAoY2FsbGJhY2sgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsgLyogRGVmYXVsdCBiZWhhdmlvciAqLworICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEbGdPYmpfV2hpY2hEaWFsb2csIGRpYWxvZywgUHlNYWNfQnVpbGRFdmVudFJlY29yZCwgZXZlbnQpOworICAgICAgICBpZiAoYXJncyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJlcyA9IE5VTEw7CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KGNhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgRmlsdGVyXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICAqaXRlbUhpdCA9IC0xOyAvKiBGYWtlIHJldHVybiBpdGVtICovCisgICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8qIFdlIGhhbmRsZWQgaXQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IGNhbGxiYWNrOworICAgICAgICAgICAgICAgIGlmIChQeUludF9DaGVjayhyZXMpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqaXRlbUhpdCA9IFB5SW50X0FzTG9uZyhyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcnYgPSAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBydiA9IFB5T2JqZWN0X0lzVHJ1ZShyZXMpOworICAgICAgICB9CisgICAgICAgIFB5X0RFQ1JFRihyZXMpOworICAgICAgICByZXR1cm4gcnY7CiB9CiAKIHN0YXRpYyBNb2RhbEZpbHRlclVQUAogRGxnX1Bhc3NGaWx0ZXJQcm9jKFB5T2JqZWN0ICpjYWxsYmFjaykKIHsKLQlQeU9iamVjdCAqdG1wID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7Ci0Jc3RhdGljIE1vZGFsRmlsdGVyVVBQIFVuaXZGaWx0ZXJVcHAgPSBOVUxMOwotCQotCURsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gTlVMTDsKLQlpZiAoY2FsbGJhY2sgPT0gUHlfTm9uZSkgewotCQlQeV9YREVDUkVGKHRtcCk7Ci0JCXJldHVybiBOVUxMOwotCX0KLQlQeV9JTkNSRUYoY2FsbGJhY2spOwotCURsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7Ci0JUHlfWERFQ1JFRih0bXApOwotCWlmICggVW5pdkZpbHRlclVwcCA9PSBOVUxMICkKLQkJVW5pdkZpbHRlclVwcCA9IE5ld01vZGFsRmlsdGVyVVBQKCZEbGdfVW5pdkZpbHRlclByb2MpOwotCXJldHVybiBVbml2RmlsdGVyVXBwOworICAgICAgICBQeU9iamVjdCAqdG1wID0gRGxnX0ZpbHRlclByb2NfY2FsbGJhY2s7CisgICAgICAgIHN0YXRpYyBNb2RhbEZpbHRlclVQUCBVbml2RmlsdGVyVXBwID0gTlVMTDsKKworICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7CisgICAgICAgIGlmIChjYWxsYmFjayA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgUHlfWERFQ1JFRih0bXApOworICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7CisgICAgICAgIERsZ19GaWx0ZXJQcm9jX2NhbGxiYWNrID0gY2FsbGJhY2s7CisgICAgICAgIFB5X1hERUNSRUYodG1wKTsKKyAgICAgICAgaWYgKCBVbml2RmlsdGVyVXBwID09IE5VTEwgKQorICAgICAgICAgICAgICAgIFVuaXZGaWx0ZXJVcHAgPSBOZXdNb2RhbEZpbHRlclVQUCgmRGxnX1VuaXZGaWx0ZXJQcm9jKTsKKyAgICAgICAgcmV0dXJuIFVuaXZGaWx0ZXJVcHA7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9IE5VTEw7CkBAIC0xMDYsMjQgKzEwNiwyNCBAQAogc3RhdGljIHBhc2NhbCB2b2lkIERsZ19Vbml2VXNlckl0ZW1Qcm9jKERpYWxvZ1B0ciBkaWFsb2csCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNob3J0IGl0ZW0pCiB7Ci0JUHlPYmplY3QgKmFyZ3MsICpyZXM7CisgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcmVzOwogCi0JaWYgKERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPT0gTlVMTCkKLQkJcmV0dXJuOyAvKiBEZWZhdWx0IGJlaGF2aW9yICovCi0JRGxnX0ZpbHRlclByb2NfY2FsbGJhY2sgPSBOVUxMOyAvKiBXZSdsbCByZXN0b3JlIGl0IHdoZW4gY2FsbCBzdWNjZXNzZnVsICovCi0JYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBpdGVtKTsKLQlpZiAoYXJncyA9PSBOVUxMKQotCQlyZXMgPSBOVUxMOwotCWVsc2UgewotCQlyZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrLCBhcmdzKTsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAocmVzID09IE5VTEwpIHsKLQkJUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgVXNlckl0ZW0gcHJvY1xcbiIpOwotCQlQeUVycl9QcmludCgpOwotCX0KLQlQeV9YREVDUkVGKHJlcyk7Ci0JcmV0dXJuOworICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybjsgLyogRGVmYXVsdCBiZWhhdmlvciAqLworICAgICAgICBEbGdfRmlsdGVyUHJvY19jYWxsYmFjayA9IE5VTEw7IC8qIFdlJ2xsIHJlc3RvcmUgaXQgd2hlbiBjYWxsIHN1Y2Nlc3NmdWwgKi8KKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8maCIsIERsZ09ial9XaGljaERpYWxvZywgZGlhbG9nLCBpdGVtKTsKKyAgICAgICAgaWYgKGFyZ3MgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXMgPSBOVUxMOworICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXMgPSBQeUV2YWxfQ2FsbE9iamVjdChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlTeXNfV3JpdGVTdGRlcnIoIkV4Y2VwdGlvbiBpbiBEaWFsb2cgVXNlckl0ZW0gcHJvY1xcbiIpOworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgIH0KKyAgICAgICAgUHlfWERFQ1JFRihyZXMpOworICAgICAgICByZXR1cm47CiB9CiAKICNpZiAwCkBAIC0xNDYsOSArMTQ2LDkgQEAKIFdpbmRvd1B0cgogRGxnT2JqX0NvbnZlcnRUb1dpbmRvdyhQeU9iamVjdCAqc2VsZikKIHsKLQlpZiAoIERsZ09ial9DaGVjayhzZWxmKSApCi0JCXJldHVybiBHZXREaWFsb2dXaW5kb3coKChEaWFsb2dPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgaWYgKCBEbGdPYmpfQ2hlY2soc2VsZikgKQorICAgICAgICAgICAgICAgIHJldHVybiBHZXREaWFsb2dXaW5kb3coKChEaWFsb2dPYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAjZW5kaWYKIC8qIFJldHVybiB0aGUgb2JqZWN0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIGRpYWxvZywgb3IgTm9uZSAqLwpAQCAtMTU2LDc3ICsxNTYsNzcgQEAKIFB5T2JqZWN0ICoKIERsZ09ial9XaGljaERpYWxvZyhEaWFsb2dQdHIgZCkKIHsKLQlQeU9iamVjdCAqaXQ7Ci0JCi0JaWYgKGQgPT0gTlVMTCkgewotCQlpdCA9IFB5X05vbmU7Ci0JCVB5X0lOQ1JFRihpdCk7Ci0JfSBlbHNlIHsKLQkJV2luZG93UHRyIHcgPSBHZXREaWFsb2dXaW5kb3coZCk7Ci0JCQotCQlpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOwotCQlpZiAoaXQgPT0gTlVMTCB8fCAoKERpYWxvZ09iamVjdCAqKWl0KS0+b2JfaXRzZWxmICE9IGQgfHwgIURsZ09ial9DaGVjayhpdCkpIHsKKyAgICAgICAgUHlPYmplY3QgKml0OworCisgICAgICAgIGlmIChkID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpdCA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBXaW5kb3dQdHIgdyA9IEdldERpYWxvZ1dpbmRvdyhkKTsKKworICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7CisgICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgKChEaWFsb2dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSBkIHx8ICFEbGdPYmpfQ2hlY2soaXQpKSB7CiAjaWYgMAotCQkJLyogU2hvdWxkIGRvIHRoaXMsIGJ1dCB3ZSBkb24ndCBoYXZlIGFuIG9iX2ZyZWVpdCBmb3IgZGlhbG9ncyB5ZXQuICovCi0JCQlpdCA9IFdpbk9ial9OZXcodyk7Ci0JCQkoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNob3VsZCBkbyB0aGlzLCBidXQgd2UgZG9uJ3QgaGF2ZSBhbiBvYl9mcmVlaXQgZm9yIGRpYWxvZ3MgeWV0LiAqLworICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOworICAgICAgICAgICAgICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CiAjZWxzZQotCQkJaXQgPSBQeV9Ob25lOwotCQkJUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CiAjZW5kaWYKLQkJfSBlbHNlIHsKLQkJCVB5X0lOQ1JFRihpdCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl0OworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm4gaXQ7CiB9CiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRGlhbG9nUHRyLCBEbGdPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9XaGljaERpYWxvZyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKERpYWxvZ1B0ciwgRGxnT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhEaWFsb2dQdHIsIERsZ09ial9XaGljaERpYWxvZyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChEaWFsb2dQdHIsIERsZ09ial9Db252ZXJ0KTsKICIiIgogCiAKICMgRGVmaW5lIGEgY2xhc3Mgd2hpY2ggc3BlY2lhbGl6ZXMgb3VyIG9iamVjdCBkZWZpbml0aW9uCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXggPSBOb25lLCBpdHNlbGZ0eXBlID0gTm9uZSk6Ci0JCUdsb2JhbE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXggPSBOb25lLCBpdHNlbGZ0eXBlID0gTm9uZSk6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQogIyMgVGhpcyB3b24ndCB3b3JrIGluIENhcmJvbiwgc28gd2UgZGlzYWJsZSBpdCBmb3IgYWxsIE1hY1B5dGhvbnM6LSgKICMjIEJ1dCBzZWUgdGhlIGNvbW1lbnQgYWJvdmU6LSgoCi0jIwkJc2VsZi5iYXNlY2hhaW4gPSAiJldpbk9ial9jaGFpbiIKKyMjICAgICAgICAgICAgICBzZWxmLmJhc2VjaGFpbiA9ICImV2luT2JqX2NoYWluIgogCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOyIpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiU2V0V1JlZkNvbihHZXREaWFsb2dXaW5kb3coaXRzZWxmKSwgKGxvbmcpaXQpOyIpCiAKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlfTm9uZTsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeV9Ob25lOyIpCiAKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0iKQotCQlPdXRwdXQoImlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoRGlhbG9nUHRyKVB5SW50X0FzTG9uZyh2KTsiKQotCQlPdXRwdXQoIiAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsgfSIpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9IikKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKERpYWxvZ1B0cilQeUludF9Bc0xvbmcodik7IikKKyAgICAgICAgT3V0cHV0KCIgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDE7IH0iKQogCi0JZGVmIG91dHB1dENvbXBhcmUoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIGludCAlc19jb21wYXJlKCVzICpzZWxmLCAlcyAqb3RoZXIpIiwgc2VsZi5wcmVmaXgsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmID4gb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAxOyIpCi0JCU91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPCBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIC0xOyIpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJCi0JZGVmIG91dHB1dEhhc2goc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIGludCAlc19oYXNoKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiRGlzcG9zZURpYWxvZyglcyk7IiwgaXRzZWxmbmFtZSkKKyAgICBkZWYgb3V0cHV0Q29tcGFyZShzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgaW50ICVzX2NvbXBhcmUoJXMgKnNlbGYsICVzICpvdGhlcikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCisgICAgZGVmIG91dHB1dEhhc2goc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIGludCAlc19oYXNoKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoIkRpc3Bvc2VEaWFsb2coJXMpOyIsIGl0c2VsZm5hbWUpCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZSgnX0RsZycsICdEbGcnLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKQEAgLTI0NywyOCArMjQ3LDI4IEBACiBmb3IgZiBpbiBtZXRob2RzOiBvYmplY3QuYWRkKGYpCiAKIHNldHVzZXJpdGVtYm9keSA9ICIiIgotCVB5T2JqZWN0ICpuZXcgPSBOVUxMOwotCQotCQotCWlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInxPIiwgJm5ldykpCi0JCXJldHVybiBOVUxMOworICAgICAgICBQeU9iamVjdCAqbmV3ID0gTlVMTDsKIAotCWlmIChEbGdfVXNlckl0ZW1Qcm9jX2NhbGxiYWNrICYmIG5ldyAmJiBuZXcgIT0gUHlfTm9uZSkgewotCQlQeUVycl9TZXRTdHJpbmcoRGxnX0Vycm9yLCAiQW5vdGhlciBVc2VySXRlbVByb2MgaXMgYWxyZWFkeSBpbnN0YWxsZWQiKTsKLQkJcmV0dXJuIE5VTEw7Ci0JfQotCQotCWlmIChuZXcgPT0gTlVMTCB8fCBuZXcgPT0gUHlfTm9uZSkgewotCQluZXcgPSBOVUxMOwotCQlfcmVzID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCX0gZWxzZSB7Ci0JCVB5X0lOQ1JFRihuZXcpOwotCQlfcmVzID0gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKU5ld1VzZXJJdGVtVVBQKERsZ19Vbml2VXNlckl0ZW1Qcm9jKSk7Ci0JfQotCQotCURsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBuZXc7Ci0JcmV0dXJuIF9yZXM7CisKKyAgICAgICAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAifE8iLCAmbmV3KSkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBpZiAoRGxnX1VzZXJJdGVtUHJvY19jYWxsYmFjayAmJiBuZXcgJiYgbmV3ICE9IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRGxnX0Vycm9yLCAiQW5vdGhlciBVc2VySXRlbVByb2MgaXMgYWxyZWFkeSBpbnN0YWxsZWQiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChuZXcgPT0gTlVMTCB8fCBuZXcgPT0gUHlfTm9uZSkgeworICAgICAgICAgICAgICAgIG5ldyA9IE5VTEw7CisgICAgICAgICAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihuZXcpOworICAgICAgICAgICAgICAgIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpTmV3VXNlckl0ZW1VUFAoRGxnX1VuaXZVc2VySXRlbVByb2MpKTsKKyAgICAgICAgfQorCisgICAgICAgIERsZ19Vc2VySXRlbVByb2NfY2FsbGJhY2sgPSBuZXc7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiBmID0gTWFudWFsR2VuZXJhdG9yKCJTZXRVc2VySXRlbUhhbmRsZXIiLCBzZXR1c2VyaXRlbWJvZHkpCiBtb2R1bGUuYWRkKGYpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9kcmFnL2RyYWdzY2FuLnB5IGIvTWFjL01vZHVsZXMvZHJhZy9kcmFnc2Nhbi5weQppbmRleCAyODI3MjhlLi45MjNhNTZiIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9kcmFnL2RyYWdzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3NjYW4ucHkKQEAgLTcsNzQgKzcsNzQgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIE1JU1NJTkdfREVGSU5FUz0iIiIKLWtEcmFnSGFzTGVmdFNlbmRlcldpbmRvdwk9ICgxIDw8IDApCitrRHJhZ0hhc0xlZnRTZW5kZXJXaW5kb3cgICAgICAgID0gKDEgPDwgMCkKIGtEcmFnSW5zaWRlU2VuZGVyQXBwbGljYXRpb24gPSAoMSA8PCAxKQota0RyYWdJbnNpZGVTZW5kZXJXaW5kb3cJCT0gKDEgPDwgMikKLWtEcmFnUmVnaW9uQW5kSW1hZ2UJCQk9ICgxIDw8IDQpCi1mbGF2b3JTZW5kZXJPbmx5CQkJPSAoMSA8PCAwKQotZmxhdm9yU2VuZGVyVHJhbnNsYXRlZAkJPSAoMSA8PCAxKQotZmxhdm9yTm90U2F2ZWQJCQkJPSAoMSA8PCAyKQotZmxhdm9yU3lzdGVtVHJhbnNsYXRlZAkJPSAoMSA8PCA4KQora0RyYWdJbnNpZGVTZW5kZXJXaW5kb3cgICAgICAgICA9ICgxIDw8IDIpCitrRHJhZ1JlZ2lvbkFuZEltYWdlICAgICAgICAgICAgICAgICAgICAgPSAoMSA8PCA0KQorZmxhdm9yU2VuZGVyT25seSAgICAgICAgICAgICAgICAgICAgICAgID0gKDEgPDwgMCkKK2ZsYXZvclNlbmRlclRyYW5zbGF0ZWQgICAgICAgICAgPSAoMSA8PCAxKQorZmxhdm9yTm90U2F2ZWQgICAgICAgICAgICAgICAgICAgICAgICAgID0gKDEgPDwgMikKK2ZsYXZvclN5c3RlbVRyYW5zbGF0ZWQgICAgICAgICAgPSAoMSA8PCA4KQogIiIiCiAKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IElOQ0xVREVESVIgKyAiRHJhZy5oIgotCW91dHB1dCA9ICJkcmFnZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIkRyYWdjb25zdC5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IGRyYWdzdXBwb3J0JyA9PT0iCi0JaW1wb3J0IGRyYWdzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBEcmFnbW9kdWxlLmMgPT09IgorICAgIGlucHV0ID0gSU5DTFVERURJUiArICJEcmFnLmgiCisgICAgb3V0cHV0ID0gImRyYWdnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiRHJhZ2NvbnN0LnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgZHJhZ3N1cHBvcnQnID09PSIKKyAgICBpbXBvcnQgZHJhZ3N1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIERyYWdtb2R1bGUuYyA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiAoJ0RyYWdSZWZlcmVuY2UnLCAnRHJhZ1JlZicpIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgaW4gKCdEcmFnUmVmZXJlbmNlJywgJ0RyYWdSZWYnKSBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uVGV4dEVkaXQgaW1wb3J0ICpcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLlF1aWNrRHJhdyBpbXBvcnQgKlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZmtEcmFnQWN0aW9uQWxsID0gLTFcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoIlxuIikKLQkJIyBEZWZpbmVzIHVucGFyc2VhYmxlIGluIERyYWcuaAotCQlzZWxmLmRlZnNmaWxlLndyaXRlKE1JU1NJTkdfREVGSU5FUykKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZnJvbSBDYXJib24uVGV4dEVkaXQgaW1wb3J0ICpcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLlF1aWNrRHJhdyBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZmtEcmFnQWN0aW9uQWxsID0gLTFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoIlxuIikKKyAgICAgICAgIyBEZWZpbmVzIHVucGFyc2VhYmxlIGluIERyYWcuaAorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKE1JU1NJTkdfREVGSU5FUykKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkia0RyYWdBY3Rpb25BbGwiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgImtEcmFnQWN0aW9uQWxsIiwKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkRyYWdUcmFja2luZ0hhbmRsZXJVUFAiLAotCQkJIkRyYWdSZWNlaXZlSGFuZGxlclVQUCIsCi0JCQkiRHJhZ1NlbmREYXRhVVBQIiwKLQkJCSJEcmFnSW5wdXRVUFAiLAotCQkJIkRyYWdEcmF3aW5nVVBQIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJEcmFnVHJhY2tpbmdIYW5kbGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiRHJhZ1JlY2VpdmVIYW5kbGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiRHJhZ1NlbmREYXRhVVBQIiwKKyAgICAgICAgICAgICAgICAiRHJhZ0lucHV0VVBQIiwKKyAgICAgICAgICAgICAgICAiRHJhZ0RyYXdpbmdVUFAiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiU2l6ZSIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJPcHRpb25hbEluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoIlNpemUiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJTaXplIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJPcHRpb25hbEluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJTaXplIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3N1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9kcmFnL2RyYWdzdXBwb3J0LnB5CmluZGV4IGMyMDA5NTAuLjQ1ODM4ZWYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2RyYWcvZHJhZ3N1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvZHJhZy9kcmFnc3VwcG9ydC5weQpAQCAtNiwxNiArNiwxNiBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0RyYWcuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19EcmFnJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnRHJhZ09iaicJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorTUFDSEVBREVSRklMRSA9ICdEcmFnLmgnICAgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19EcmFnJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnRHJhZ09iaicgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnRHJhZycJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gJ0RyYWdSZWYnCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnRHJhZycgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9ICdEcmFnUmVmJyAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC02OSw4MSArNjksODEgQEAKIGRyYWdnbHVlX1RyYWNraW5nSGFuZGxlcihEcmFnVHJhY2tpbmdNZXNzYWdlIHRoZU1lc3NhZ2UsIFdpbmRvd1B0ciB0aGVXaW5kb3csCiAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqaGFuZGxlclJlZkNvbiwgRHJhZ1JlZmVyZW5jZSB0aGVEcmFnKQogewotCVB5T2JqZWN0ICphcmdzLCAqcnY7Ci0JaW50IGk7Ci0JCi0JYXJncyA9IFB5X0J1aWxkVmFsdWUoImhPJk8mIiwgdGhlTWVzc2FnZSwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLQlpZiAoIGFyZ3MgPT0gTlVMTCApCi0JCXJldHVybiAtMTsKLQlydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gVHJhY2tpbmdIYW5kbGVyXFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaSA9IC0xOwotCWlmICggcnYgPT0gUHlfTm9uZSApCi0JCWkgPSAwOwotCWVsc2UKLQkJUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIGk7CisgICAgICAgIFB5T2JqZWN0ICphcmdzLCAqcnY7CisgICAgICAgIGludCBpOworCisgICAgICAgIGFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJoTyZPJiIsIHRoZU1lc3NhZ2UsIERyYWdPYmpfTmV3LCB0aGVEcmFnLCBXaW5PYmpfV2hpY2hXaW5kb3csIHRoZVdpbmRvdyk7CisgICAgICAgIGlmICggYXJncyA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoKFB5T2JqZWN0ICopaGFuZGxlclJlZkNvbiwgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gVHJhY2tpbmdIYW5kbGVyXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaSA9IC0xOworICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gaTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogZHJhZ2dsdWVfUmVjZWl2ZUhhbmRsZXIoV2luZG93UHRyIHRoZVdpbmRvdywgdm9pZCAqaGFuZGxlclJlZkNvbiwKICAgICAgICAgICAgICAgICAgICAgICAgIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLQlQeU9iamVjdCAqYXJncywgKnJ2OwotCWludCBpOwotCQotCWFyZ3MgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgRHJhZ09ial9OZXcsIHRoZURyYWcsIFdpbk9ial9XaGljaFdpbmRvdywgdGhlV2luZG93KTsKLQlpZiAoIGFyZ3MgPT0gTlVMTCApCi0JCXJldHVybiAtMTsKLQlydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gUmVjZWl2ZUhhbmRsZXJcXG4iKTsKLQkJUHlFcnJfUHJpbnQoKTsKLQkJcmV0dXJuIC0xOwotCX0KLQlpID0gLTE7Ci0JaWYgKCBydiA9PSBQeV9Ob25lICkKLQkJaSA9IDA7Ci0JZWxzZQotCQlQeUFyZ19QYXJzZShydiwgImwiLCAmaSk7Ci0JUHlfREVDUkVGKHJ2KTsKLQlyZXR1cm4gaTsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3MsICpydjsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLCBEcmFnT2JqX05ldywgdGhlRHJhZywgV2luT2JqX1doaWNoV2luZG93LCB0aGVXaW5kb3cpOworICAgICAgICBpZiAoIGFyZ3MgPT0gTlVMTCApCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBydiA9IFB5RXZhbF9DYWxsT2JqZWN0KChQeU9iamVjdCAqKWhhbmRsZXJSZWZDb24sIGFyZ3MpOworICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIGlmICggcnYgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiRHJhZzogRXhjZXB0aW9uIGluIFJlY2VpdmVIYW5kbGVyXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaSA9IC0xOworICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gaTsKIH0KIAogc3RhdGljIHBhc2NhbCBPU0VycgogZHJhZ2dsdWVfU2VuZERhdGEoRmxhdm9yVHlwZSB0aGVUeXBlLCB2b2lkICpkcmFnU2VuZFJlZkNvbiwKICAgICAgICAgICAgICAgICAgICAgICBJdGVtUmVmZXJlbmNlIHRoZUl0ZW0sIERyYWdSZWZlcmVuY2UgdGhlRHJhZykKIHsKLQlEcmFnT2JqT2JqZWN0ICpzZWxmID0gKERyYWdPYmpPYmplY3QgKilkcmFnU2VuZFJlZkNvbjsKLQlQeU9iamVjdCAqYXJncywgKnJ2OwotCWludCBpOwotCQotCWlmICggc2VsZi0+c2VuZHByb2MgPT0gTlVMTCApCi0JCXJldHVybiAtMTsKLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiTyZsIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHRoZVR5cGUsIHRoZUl0ZW0pOwotCWlmICggYXJncyA9PSBOVUxMICkKLQkJcmV0dXJuIC0xOwotCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3Qoc2VsZi0+c2VuZHByb2MsIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAoIHJ2ID09IE5VTEwgKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gU2VuZERhdGFIYW5kbGVyXFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiAtMTsKLQl9Ci0JaSA9IC0xOwotCWlmICggcnYgPT0gUHlfTm9uZSApCi0JCWkgPSAwOwotCWVsc2UKLQkJUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOwotCVB5X0RFQ1JFRihydik7Ci0JcmV0dXJuIGk7CisgICAgICAgIERyYWdPYmpPYmplY3QgKnNlbGYgPSAoRHJhZ09iak9iamVjdCAqKWRyYWdTZW5kUmVmQ29uOworICAgICAgICBQeU9iamVjdCAqYXJncywgKnJ2OworICAgICAgICBpbnQgaTsKKworICAgICAgICBpZiAoIHNlbGYtPnNlbmRwcm9jID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIk8mbCIsIFB5TWFjX0J1aWxkT1NUeXBlLCB0aGVUeXBlLCB0aGVJdGVtKTsKKyAgICAgICAgaWYgKCBhcmdzID09IE5VTEwgKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChzZWxmLT5zZW5kcHJvYywgYXJncyk7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKCBydiA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJEcmFnOiBFeGNlcHRpb24gaW4gU2VuZERhdGFIYW5kbGVyXFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgaSA9IC0xOworICAgICAgICBpZiAoIHJ2ID09IFB5X05vbmUgKQorICAgICAgICAgICAgICAgIGkgPSAwOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgUHlBcmdfUGFyc2UocnYsICJsIiwgJmkpOworICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICByZXR1cm4gaTsKIH0KIAogI2lmIDAKQEAgLTE2NSw4ICsxNjUsOCBAQAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKERyYWdSZWYsIERyYWdPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRHJhZ1JlZiwgRHJhZ09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoRHJhZ1JlZiwgRHJhZ09ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoRHJhZ1JlZiwgRHJhZ09ial9Db252ZXJ0KTsKICIiIgogCiB2YXJpYWJsZXN0dWZmID0gIiIiCkBAIC0xNzcsMzMgKzE3NywzMyBAQAogZHJhZ2dsdWVfSW5wdXRVUFAgPSBOZXdEcmFnSW5wdXRVUFAoZHJhZ2dsdWVfSW5wdXQpOwogZHJhZ2dsdWVfRHJhd2luZ1VQUCA9IE5ld0RyYWdEcmF3aW5nVVBQKGRyYWdnbHVlX0RyYXdpbmcpOwogI2VuZGlmCi0iIiIgICAgCisiIiIKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKERyYWdfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBEcmFnIik7Ci0JCQkJCXJldHVybiBOVUxMOwotCQkJCX0iIiIpCi0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJIyMgT3V0cHV0KCJEaXNwb3NlRHJhZyglcyk7IiwgaXRzZWxmbmFtZSkKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPnNlbmRwcm9jKTsiKQotCQkjIyBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+aW5wdXRwcm9jKTsiKQotCQkjIyBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+ZHJhd2luZ3Byb2MpOyIpCi0JCQotCWRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJQeU9iamVjdCAqc2VuZHByb2M7IikKLQkJIyMgT3V0cHV0KCJQeU9iamVjdCAqaW5wdXRwcm9jOyIpCi0JCSMjIE91dHB1dCgiUHlPYmplY3QgKmRyYXdpbmdwcm9jOyIpCi0JCQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIml0LT5zZW5kcHJvYyA9IE5VTEw7IikKLQkJIyMgT3V0cHV0KCJpdC0+aW5wdXRwcm9jID0gTlVMTDsiKQotCQkjIyBPdXRwdXQoIml0LT5kcmF3aW5ncHJvYyA9IE5VTEw7IikKLQkJCi0JCQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoRHJhZ19FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIERyYWciKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgICMjIE91dHB1dCgiRGlzcG9zZURyYWcoJXMpOyIsIGl0c2VsZm5hbWUpCisgICAgICAgIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5zZW5kcHJvYyk7IikKKyAgICAgICAgIyMgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPmlucHV0cHJvYyk7IikKKyAgICAgICAgIyMgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPmRyYXdpbmdwcm9jKTsiKQorCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpzZW5kcHJvYzsiKQorICAgICAgICAjIyBPdXRwdXQoIlB5T2JqZWN0ICppbnB1dHByb2M7IikKKyAgICAgICAgIyMgT3V0cHV0KCJQeU9iamVjdCAqZHJhd2luZ3Byb2M7IikKKworICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIml0LT5zZW5kcHJvYyA9IE5VTEw7IikKKyAgICAgICAgIyMgT3V0cHV0KCJpdC0+aW5wdXRwcm9jID0gTlVMTDsiKQorICAgICAgICAjIyBPdXRwdXQoIml0LT5kcmF3aW5ncHJvYyA9IE5VTEw7IikKKworCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZiwgdmFyaWFibGVzdHVmZikKIG9iamVjdCA9IE15T2JqZWN0RGVmaW5pdGlvbihPQkpFQ1ROQU1FLCBPQkpFQ1RQUkVGSVgsIE9CSkVDVFRZUEUpCkBAIC0yMjgsMTUgKzIyOCwxNSBAQAogICAgIFB5T2JqZWN0ICpjYWxsYmFjazsKICAgICBXaW5kb3dQdHIgdGhlV2luZG93ID0gTlVMTDsKICAgICBPU0VyciBfZXJyOwotICAgIAorCiAgICAgaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk98TyYiLCAmY2FsbGJhY2ssIFdpbk9ial9Db252ZXJ0LCAmdGhlV2luZG93KSApCi0gICAgCXJldHVybiBOVUxMOwotICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7CS8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgUHlfSU5DUkVGKGNhbGxiYWNrKTsgICAgICAgIC8qIENhbm5vdCBkZWNyZWYgbGF0ZXIsIHRvbyBiYWQgKi8KICAgICBfZXJyID0gSW5zdGFsbFRyYWNraW5nSGFuZGxlcihkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAsIHRoZVdpbmRvdywgKHZvaWQgKiljYWxsYmFjayk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiBpbnN0YWxsdHJhY2tpbmcgPSBNYW51YWxHZW5lcmF0b3IoIkluc3RhbGxUcmFja2luZ0hhbmRsZXIiLCBpbnN0YWxsdHJhY2tpbmdfYm9keSkKIG1vZHVsZS5hZGQoaW5zdGFsbHRyYWNraW5nKQpAQCAtMjQ1LDE1ICsyNDUsMTUgQEAKICAgICBQeU9iamVjdCAqY2FsbGJhY2s7CiAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CiAgICAgT1NFcnIgX2VycjsKLSAgICAKKwogICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPfE8mIiwgJmNhbGxiYWNrLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotICAgIAlyZXR1cm4gTlVMTDsKLSAgICBQeV9JTkNSRUYoY2FsbGJhY2spOwkvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCisgICAgICAgIHJldHVybiBOVUxMOworICAgIFB5X0lOQ1JFRihjYWxsYmFjayk7ICAgICAgICAvKiBDYW5ub3QgZGVjcmVmIGxhdGVyLCB0b28gYmFkICovCiAgICAgX2VyciA9IEluc3RhbGxSZWNlaXZlSGFuZGxlcihkcmFnZ2x1ZV9SZWNlaXZlSGFuZGxlclVQUCwgdGhlV2luZG93LCAodm9pZCAqKWNhbGxiYWNrKTsKLQlpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKKyAgICAgICAgaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CiAiIiIKIGluc3RhbGxyZWNlaXZlID0gTWFudWFsR2VuZXJhdG9yKCJJbnN0YWxsUmVjZWl2ZUhhbmRsZXIiLCBpbnN0YWxscmVjZWl2ZV9ib2R5KQogbW9kdWxlLmFkZChpbnN0YWxscmVjZWl2ZSkKQEAgLTI2MSwxNCArMjYxLDE0IEBACiByZW1vdmV0cmFja2luZ19ib2R5ID0gIiIiCiAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CiAgICAgT1NFcnIgX2VycjsKLSAgICAKKwogICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotICAgIAlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgX2VyciA9IFJlbW92ZVRyYWNraW5nSGFuZGxlcihkcmFnZ2x1ZV9UcmFja2luZ0hhbmRsZXJVUFAsIHRoZVdpbmRvdyk7Ci0JaWYgKF9lcnIgIT0gbm9FcnIpIHJldHVybiBQeU1hY19FcnJvcihfZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgICAgIGlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7CisgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgX3JlcyA9IFB5X05vbmU7CisgICAgICAgIHJldHVybiBfcmVzOwogIiIiCiByZW1vdmV0cmFja2luZyA9IE1hbnVhbEdlbmVyYXRvcigiUmVtb3ZlVHJhY2tpbmdIYW5kbGVyIiwgcmVtb3ZldHJhY2tpbmdfYm9keSkKIG1vZHVsZS5hZGQocmVtb3ZldHJhY2tpbmcpCkBAIC0yNzYsMTQgKzI3NiwxNCBAQAogcmVtb3ZlcmVjZWl2ZV9ib2R5ID0gIiIiCiAgICAgV2luZG93UHRyIHRoZVdpbmRvdyA9IE5VTEw7CiAgICAgT1NFcnIgX2VycjsKLSAgICAKKwogICAgIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJ8TyYiLCBXaW5PYmpfQ29udmVydCwgJnRoZVdpbmRvdykgKQotICAgIAlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiAgICAgX2VyciA9IFJlbW92ZVJlY2VpdmVIYW5kbGVyKGRyYWdnbHVlX1JlY2VpdmVIYW5kbGVyVVBQLCB0aGVXaW5kb3cpOwotCWlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7Ci0JUHlfSU5DUkVGKFB5X05vbmUpOwotCV9yZXMgPSBQeV9Ob25lOwotCXJldHVybiBfcmVzOworICAgICAgICBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKICIiIgogcmVtb3ZlcmVjZWl2ZSA9IE1hbnVhbEdlbmVyYXRvcigiUmVtb3ZlUmVjZWl2ZUhhbmRsZXIiLCByZW1vdmVyZWNlaXZlX2JvZHkpCiBtb2R1bGUuYWRkKHJlbW92ZXJlY2VpdmUpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9ldnQvZXZ0ZWRpdC5weSBiL01hYy9Nb2R1bGVzL2V2dC9ldnRlZGl0LnB5CmluZGV4IDM0MjZiNzAuLjAyMDg3ZTEgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2V2dC9ldnRlZGl0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2V2dC9ldnRlZGl0LnB5CkBAIC03LDQgKzcsMyBAQAogZiA9IEZ1bmN0aW9uKFVJbnQzMiwgJ1RpY2tDb3VudCcsCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2V2dC9ldnRzY2FuLnB5IGIvTWFjL01vZHVsZXMvZXZ0L2V2dHNjYW4ucHkKaW5kZXggZTU3NjJkOS4uMGQwYzllYyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZXZ0L2V2dHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvZXZ0L2V2dHNjYW4ucHkKQEAgLTExLDcxICsxMSw3MSBAQAogT0JKRUNUID0gIk5PVFVTRUQiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gTE9ORyArICIuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJLZXlUcmFuc2xhdGUiLAotCQkJIkdldEV2ZW50TWFzayIsCQkjIEkgY2Fubm90IHNlZW0gdG8gZmluZCB0aGlzIHJvdXRpbmUuLi4KLQkJCSJXYWl0TmV4dEV2ZW50IiwJIyBNYW51YWxseSBnZW5lcmF0ZWQgYmVjYXVzZSBvZiBvcHRpb25hbCByZWdpb24KLQkJCSMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKLQkJCSJvc0V2dE1lc3NhZ2VNYXNrIiwKLQkJCSMgT1M4IGNhbGxzCi0JCQknU3lzdGVtRXZlbnQnLAotCQkJJ1N5c3RlbVRhc2snLAotCQkJJ1N5c3RlbUNsaWNrJywKLQkJCSdHZXRPU0V2ZW50JywKLQkJCSdPU0V2ZW50QXZhaWwnLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIktleVRyYW5zbGF0ZSIsCisgICAgICAgICAgICAgICAgIkdldEV2ZW50TWFzayIsICAgICAgICAgIyBJIGNhbm5vdCBzZWVtIHRvIGZpbmQgdGhpcyByb3V0aW5lLi4uCisgICAgICAgICAgICAgICAgIldhaXROZXh0RXZlbnQiLCAgICAgICAgIyBNYW51YWxseSBnZW5lcmF0ZWQgYmVjYXVzZSBvZiBvcHRpb25hbCByZWdpb24KKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgIm9zRXZ0TWVzc2FnZU1hc2siLAorICAgICAgICAgICAgICAgICMgT1M4IGNhbGxzCisgICAgICAgICAgICAgICAgJ1N5c3RlbUV2ZW50JywKKyAgICAgICAgICAgICAgICAnU3lzdGVtVGFzaycsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUNsaWNrJywKKyAgICAgICAgICAgICAgICAnR2V0T1NFdmVudCcsCisgICAgICAgICAgICAgICAgJ09TRXZlbnRBdmFpbCcsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJFdlFFbFB0ciIsICJRSGRyUHRyIgotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkV2UUVsUHRyIiwgIlFIZHJQdHIiCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIndTdG9yYWdlIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiTnVsbFN0b3JhZ2UiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJCi0JCQkjIEdldEtleXMKLQkJCShbKCdLZXlNYXAnLCAndGhlS2V5cycsICdJbk1vZGUnKV0sCi0JCQkgWygnKicsICcqJywgJ091dE1vZGUnKV0pLAotCQkJIAotCQkJIyBHZXRUaWNrZXIKLQkJCShbKCd1bnNpZ25lZCBsb25nJywgJyonLCAnKicpXSwKLQkJCSBbKCd1bnNpZ25lZF9sb25nJywgJyonLCAnKicpXSksCi0JCQldCi0JCQkKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAid1N0b3JhZ2UiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiTnVsbFN0b3JhZ2UiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBHZXRLZXlzCisgICAgICAgICAgICAgICAgKFsoJ0tleU1hcCcsICd0aGVLZXlzJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnKicsICcqJywgJ091dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBHZXRUaWNrZXIKKyAgICAgICAgICAgICAgICAoWygndW5zaWduZWQgbG9uZycsICcqJywgJyonKV0sCisgICAgICAgICAgICAgICAgIFsoJ3Vuc2lnbmVkX2xvbmcnLCAnKicsICcqJyldKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9ldnQvZXZ0c3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2V2dC9ldnRzdXBwb3J0LnB5CmluZGV4IGNjZGMxYzUuLmY1OGRhMTQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2V2dC9ldnRzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2V2dC9ldnRzdXBwb3J0LnB5CkBAIC02LDE3ICs2LDE3IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnRXZlbnRzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfRXZ0JwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnRXZlbnQnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKLUtJTkQgPSAnUmVjb3JkJwkJCQkjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKK01BQ0hFQURFUkZJTEUgPSAnRXZlbnRzLmgnICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfRXZ0JyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ0V2ZW50JyAgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnUmVjb3JkJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0V2dCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnRXZ0JyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyBLSU5EICAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNzIsNyArNzIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICZldmVudE1hc2ssCiAgICAgICAgICAgICAgICAgICAgICAgJnNsZWVwLAogICAgICAgICAgICAgICAgICAgICAgIE9wdFJlc09ial9Db252ZXJ0LCAmbW91c2VyZWdpb24pKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIF9ydiA9IFdhaXROZXh0RXZlbnQoZXZlbnRNYXNrLAogICAgICAgICAgICAgICAgICAgICAmdGhlRXZlbnQsCiAgICAgICAgICAgICAgICAgICAgIHNsZWVwLApAQCAtOTAsNCArOTAsMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZmlsZS9maWxlc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2ZpbGUvZmlsZXNjYW4ucHkKaW5kZXggZjhiNWJhMi4uOGViYzY5ZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZmlsZS9maWxlc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzY2FuLnB5CkBAIC0xMCwxOTAgKzEwLDE5MCBAQAogU0hPUlQgPSAiZmlsZSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IFsiRmlsZXMuaCIsICJBbGlhc2VzLmgiLCAiRmluZGVyLmgiXQotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IFsiRmlsZXMuaCIsICJBbGlhc2VzLmgiLCAiRmluZGVyLmgiXQorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXJfT1NYKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQkjIEZ1bm55IHNwZWNpYWwgY2FzZQotCQkJaWYgbGVuKGFyZ2xpc3QpID4gMjoKLQkJCQl0LCBuLCBtID0gYXJnbGlzdFsxXQotCQkJCWlmIHQgPT0gIkFsaWFzSGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQkJY2xhc3NuYW1lID0gIkFyZzJNZXRob2RHZW5lcmF0b3IiCi0JCQkJCWxpc3RuYW1lID0gImFsaWFzX21ldGhvZHMiCi0JCQkJCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCi0JCQkjIE5vcm1hbCBjYXNlcwotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gIkFsaWFzSGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gImFsaWFzX21ldGhvZHMiCi0JCQlpZiB0ID09ICJGU1NwZWNfcHRyIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gImZzc3BlY19tZXRob2RzIgotCQkJaWYgdCA9PSAiRlNSZWZfcHRyIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gImZzcmVmX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgICMgRnVubnkgc3BlY2lhbCBjYXNlCisgICAgICAgICAgICBpZiBsZW4oYXJnbGlzdCkgPiAyOgorICAgICAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzFdCisgICAgICAgICAgICAgICAgaWYgdCA9PSAiQWxpYXNIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiQXJnMk1ldGhvZEdlbmVyYXRvciIKKyAgICAgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiYWxpYXNfbWV0aG9kcyIKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICAgICAgICAgICMgTm9ybWFsIGNhc2VzCisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCA9PSAiQWxpYXNIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiYWxpYXNfbWV0aG9kcyIKKyAgICAgICAgICAgIGlmIHQgPT0gIkZTU3BlY19wdHIiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiZnNzcGVjX21ldGhvZHMiCisgICAgICAgICAgICBpZiB0ID09ICJGU1JlZl9wdHIiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiZnNyZWZfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIENvbnN0YW50cyB3aXRoIGluY29tcGF0aWJsZSBkZWZpbml0aW9ucwotCQkJImtpb0FDQWNjZXNzT3duZXJNYXNrIiwKLQkJCSJrRlNDYXRJbmZvUmVzZXJ2ZWQiLAotCQkJImtGU0l0ZXJhdGVSZXNlcnZlZCIsCi0JCQkia1N5c3RlbUZvbGRlclR5cGUiLAotCQkJCi0JCQkiRlNSZWZNYWtlUGF0aCIsICMgRG8gdGhpcyBtYW51YWxseQotIwkJCSJSZXNvbHZlQWxpYXMiLCAjIERvIHRoaXMgbWFudWFsbHkKLSMJCQkiUmVzb2x2ZUFsaWFzV2l0aE1vdW50RmxhZ3MiLCAjIERvIHRoaXMgbWFudWFsbHkKLSMJCQkiRm9sbG93RmluZGVyQWxpYXMiLCAjIERvIHRoaXMgbWFudWFsbHkKLQkJCQotCQkJIkZTUmVhZCIsICMgQ291bGRuJ3QgYmUgYm90aGVyZWQKLQkJCSJGU1dyaXRlIiwgIyBkaXR0bwotCQkJIkZTUmVhZEZvcmsiLCAjIGRpdHRvCi0JCQkiRlNXcml0ZUZvcmsiLCAjIGRpdHRvCi0JCQkKLQkJCSMgT2xkIHJvdXRpbmVzOgotCQkJIkdldFdESW5mbyIsCi0JCQkiT3BlbldEIiwKLQkJCSJDbG9zZVdEIiwKLQkJCSJGSW5pdFF1ZXVlIiwKLQkJCSJyc3RmbG9jayIsCi0JCQkic2V0ZmxvY2siLAotCQkJInNldGZpbmZvIiwKLQkJCSJmc3JlbmFtZSIsCi0JCQkiZnNkZWxldGUiLAotCQkJImNyZWF0ZSIsCi0JCQkiZmx1c2h2b2wiLAotCQkJImVqZWN0IiwKLQkJCSJ1bW91bnR2b2wiLAotCQkJInNldHZvbCIsCi0JCQkiZ2V0dm9sIiwKLQkJCSJnZXRmaW5mbyIsCi0JCQkiZ2V0dmluZm8iLAotCQkJImZzb3BlbiIsCi0JCQkiUnN0RkxvY2siLAotCQkJIlNldEZMb2NrIiwKLQkJCSJTZXRGSW5mbyIsCi0JCQkiUmVuYW1lIiwKLQkJCSJPcGVuUkYiLAotCQkJIkZTRGVsZXRlIiwKLQkJCSJDcmVhdGUiLAotCQkJIkdldFZvbCIsCi0JCQkiR2V0RkluZm8iLAotCQkJIkdldFZJbmZvIiwKLQkJCSJGU09wZW4iLAotCQkJIkVqZWN0IiwKLQkJCSJTZXRWb2wiLAotCQkJIm9wZW5yZiIsCi0JCQkidW5tb3VudHZvbCIsCi0JCQkiT3BlbkRGIiwKLQkJCQotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIyBDb25zdGFudHMgd2l0aCBpbmNvbXBhdGlibGUgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAia2lvQUNBY2Nlc3NPd25lck1hc2siLAorICAgICAgICAgICAgICAgICJrRlNDYXRJbmZvUmVzZXJ2ZWQiLAorICAgICAgICAgICAgICAgICJrRlNJdGVyYXRlUmVzZXJ2ZWQiLAorICAgICAgICAgICAgICAgICJrU3lzdGVtRm9sZGVyVHlwZSIsCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkNJbmZvUEJQdHIiLCAjIE9sZCBzdHVmZgotCQkJIkNNb3ZlUEJQdHIiLCAjIE9sZCBzdHVmZgotCQkJIlBhcm1CbGtQdHIiLCAjIE9sZCBzdHVmZgotCQkJIkhQYXJtQmxrUHRyIiwgIyBPbGQgc3R1ZmYKLQkJCSJEVFBCUHRyIiwgIyBPbGQgc3R1ZmYKLQkJCSJGQ0JQQlB0ciIsICMgT2xkIHN0dWZmCi0JCQkiUUhkclB0ciIsICMgT2xkIHN0dWZmCi0JCQkiQ1NQYXJhbVB0ciIsICMgT2xkIHN0dWZmCi0JCQkiRlNDYXRhbG9nQnVsa1BhcmFtIiwgIyBvbGQgc3R1ZmYKLQkJCSJGU0ZvcmtDQkluZm9QYXJhbSIsICMgb2xkIHN0dWZmCi0JCQkiRlNGb3JrSU9QYXJhbSIsICMgb2xkIHN0dWZmCi0JCQkiRlNSZWZQYXJhbSIsICAjIG9sZCBzdHVmZgotCQkJIkZTVm9sdW1lSW5mb1BhcmFtIiwgIyBvbGQgc3R1ZmYKLQkJCSJXRFBCUHRyIiwgIyBvbGQgc3R1ZmYKLQkJCSJYQ0luZm9QQlB0ciIsICMgb2xkIHN0dWZmCi0JCQkiWFZvbHVtZVBhcmFtUHRyIiwgIyBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiRlNSZWZNYWtlUGF0aCIsICMgRG8gdGhpcyBtYW51YWxseQorIyAgICAgICAgICAgICAgICAgICAgICAgIlJlc29sdmVBbGlhcyIsICMgRG8gdGhpcyBtYW51YWxseQorIyAgICAgICAgICAgICAgICAgICAgICAgIlJlc29sdmVBbGlhc1dpdGhNb3VudEZsYWdzIiwgIyBEbyB0aGlzIG1hbnVhbGx5CisjICAgICAgICAgICAgICAgICAgICAgICAiRm9sbG93RmluZGVyQWxpYXMiLCAjIERvIHRoaXMgbWFudWFsbHkKIAotCQkJCi0JCQkiQ2F0UG9zaXRpb25SZWMiLCAjIFN0YXRlIHZhcmlhYmxlLCBub3QgdG9vIGRpZmZpY3VsdAotCQkJIkZTSXRlcmF0b3IiLCAjIFNob3VsZCBiZWNvbWUgYW4gb2JqZWN0Ci0JCQkiRlNGb3JrSW5mbyIsICMgTG90cyBvZiBmaWVsZHMsIGRpZmZpY3VsdCBzdHJ1Y3QKLQkJCSJGU1NlYXJjaFBhcmFtcyIsICMgQWxzbyBjYXRzZWFyY2ggc3R1ZmYKLQkJCSJGU1ZvbHVtZUluZm8iLCAjIGJpZyBzdHJ1Y3QKLQkJCSJGU1ZvbHVtZUluZm9fcHRyIiwgIyBiaWcgc3RydWN0Ci0JCQkKLQkJCSJJT0NvbXBsZXRpb25Qcm9jUHRyIiwgIyBwcm9jIHBvaW50ZXIKLQkJCSJJT0NvbXBsZXRpb25VUFAiLCAjIFByb2MgcG9pbnRlcgotCQkJIkFsaWFzRmlsdGVyUHJvY1B0ciIsCi0JCQkiQWxpYXNGaWx0ZXJVUFAiLAotCQkJIkZOU3Vic2NyaXB0aW9uVVBQIiwKLQkJCQotCQkJIkZOU3Vic2NyaXB0aW9uUmVmIiwgIyBMYXp5LCBmb3Igbm93LgotCQkJXQorICAgICAgICAgICAgICAgICJGU1JlYWQiLCAjIENvdWxkbid0IGJlIGJvdGhlcmVkCisgICAgICAgICAgICAgICAgIkZTV3JpdGUiLCAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkZTUmVhZEZvcmsiLCAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkZTV3JpdGVGb3JrIiwgIyBkaXR0bwogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIFZhcmlvdXMgd2F5cyB0byBnaXZlIHBhdGhuYW1lcwotCQkJKFsoJ2NoYXJfcHRyJywgJyonLCAnSW5Nb2RlJyldLAotCQkJIFsoJ3N0cmluZ3B0cicsICcqJywgJ0luTW9kZScpXQotCQkJKSwKLQkJCSAKLQkJCSMgVW5pY29kZSBmaWxlbmFtZXMgcGFzc2VkIGFzIGxlbmd0aCwgYnVmZmVyCi0JCQkoWygnVW5pQ2hhckNvdW50JywgJyonLCAnSW5Nb2RlJyksCi0JCQkgICgnVW5pQ2hhcl9wdHInLCAnKicsICdJbk1vZGUnKV0sCi0JCQkgWygnVW5pY29kZVJldmVyc2VJbkJ1ZmZlcicsICcqJywgJ0luTW9kZScpXQotCQkJKSwKLQkJCSMgV3JvbmcgZ3Vlc3MKLQkJCShbKCdTdHI2MycsICd0aGVTdHJpbmcnLCAnSW5Nb2RlJyldLAotCQkJIFsoJ1N0cjYzJywgJ3RoZVN0cmluZycsICdPdXRNb2RlJyldKSwKLQkJCSAKLQkJCSMgWWV0IGFub3RoZXIgd2F5IHRvIGdpdmUgYSBwYXRobmFtZTotKQotCQkJKFsoJ3Nob3J0JywgJ2Z1bGxQYXRoTGVuZ3RoJywgJ0luTW9kZScpLAotCQkJICAoJ3ZvaWRfcHRyJywgJ2Z1bGxQYXRoJywgJ0luTW9kZScpXSwKLQkJCSBbKCdGdWxsUGF0aE5hbWUnLCAnZnVsbFBhdGgnLCAnSW5Nb2RlJyldKSwKLQkKLQkJCSMgVmFyaW91cyBSZXNvbHZlQWxpYXNGaWxlWFhYWCBmdW5jdGlvbnMKLQkJCShbKCdGU1NwZWMnLCAndGhlU3BlYycsICdPdXRNb2RlJyldLAotCQkJIFsoJ0ZTU3BlY19wdHInLCAndGhlU3BlYycsICdJbk91dE1vZGUnKV0pLAotCQkJIAotCQkJKFsoJ0ZTUmVmJywgJ3RoZVJlZicsICdPdXRNb2RlJyldLAotCQkJIFsoJ0ZTUmVmX3B0cicsICd0aGVSZWYnLCAnSW5PdXRNb2RlJyldKSwKLQkJCSAKLQkJCSMgVGhlIG9wdGlvbmFsIEZTU3BlYyB0byBhbGwgUmVzb2x2ZUFsaWFzIGFuZCBOZXdBbGlhcyBtZXRob2RzCi0JCQkoWygnRlNTcGVjX3B0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0sCi0gICAgCQkgWygnT3B0RlNTcGVjUHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgIyBPbGQgcm91dGluZXM6CisgICAgICAgICAgICAgICAgIkdldFdESW5mbyIsCisgICAgICAgICAgICAgICAgIk9wZW5XRCIsCisgICAgICAgICAgICAgICAgIkNsb3NlV0QiLAorICAgICAgICAgICAgICAgICJGSW5pdFF1ZXVlIiwKKyAgICAgICAgICAgICAgICAicnN0ZmxvY2siLAorICAgICAgICAgICAgICAgICJzZXRmbG9jayIsCisgICAgICAgICAgICAgICAgInNldGZpbmZvIiwKKyAgICAgICAgICAgICAgICAiZnNyZW5hbWUiLAorICAgICAgICAgICAgICAgICJmc2RlbGV0ZSIsCisgICAgICAgICAgICAgICAgImNyZWF0ZSIsCisgICAgICAgICAgICAgICAgImZsdXNodm9sIiwKKyAgICAgICAgICAgICAgICAiZWplY3QiLAorICAgICAgICAgICAgICAgICJ1bW91bnR2b2wiLAorICAgICAgICAgICAgICAgICJzZXR2b2wiLAorICAgICAgICAgICAgICAgICJnZXR2b2wiLAorICAgICAgICAgICAgICAgICJnZXRmaW5mbyIsCisgICAgICAgICAgICAgICAgImdldHZpbmZvIiwKKyAgICAgICAgICAgICAgICAiZnNvcGVuIiwKKyAgICAgICAgICAgICAgICAiUnN0RkxvY2siLAorICAgICAgICAgICAgICAgICJTZXRGTG9jayIsCisgICAgICAgICAgICAgICAgIlNldEZJbmZvIiwKKyAgICAgICAgICAgICAgICAiUmVuYW1lIiwKKyAgICAgICAgICAgICAgICAiT3BlblJGIiwKKyAgICAgICAgICAgICAgICAiRlNEZWxldGUiLAorICAgICAgICAgICAgICAgICJDcmVhdGUiLAorICAgICAgICAgICAgICAgICJHZXRWb2wiLAorICAgICAgICAgICAgICAgICJHZXRGSW5mbyIsCisgICAgICAgICAgICAgICAgIkdldFZJbmZvIiwKKyAgICAgICAgICAgICAgICAiRlNPcGVuIiwKKyAgICAgICAgICAgICAgICAiRWplY3QiLAorICAgICAgICAgICAgICAgICJTZXRWb2wiLAorICAgICAgICAgICAgICAgICJvcGVucmYiLAorICAgICAgICAgICAgICAgICJ1bm1vdW50dm9sIiwKKyAgICAgICAgICAgICAgICAiT3BlbkRGIiwKIAotCQkJKFsoJ0ZTUmVmX3B0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0sCi0gICAgCQkgWygnT3B0RlNSZWZQdHInLCAnZnJvbUZpbGUnLCAnSW5Nb2RlJyldKSwKLSAgICAJCSAKLSMjICAgIAkJIyBGU0NhdGFsb2dJbmZvIGlucHV0IGhhbmRsaW5nCi0jIwkJCShbKCdGU0NhdGFsb2dJbmZvQml0bWFwJywgJ3doaWNoSW5mbycsICdJbk1vZGUnKSwKLSMjICAgIAkJICAoJ0ZTQ2F0YWxvZ0luZm9fcHRyJywgJ2NhdGFsb2dJbmZvJywgJ0luTW9kZScpXSwKLSMjICAgIAkJIFsoJ0ZTQ2F0YWxvZ0luZm9BbmRCaXRtYXBfaW4nLCAnY2F0YWxvZ0luZm8nLCAnSW5Nb2RlJyldKSwKLSMjICAgIAkJCi0jIyAgICAJCSMgRlNDYXRhbG9nSW5mbyBvdXRwdXQgaGFuZGxpbmcKLSMjCQkJKFsoJ0ZTQ2F0YWxvZ0luZm9CaXRtYXAnLCAnd2hpY2hJbmZvJywgJ0luTW9kZScpLAotIyMgICAgCQkgICgnRlNDYXRhbG9nSW5mbycsICdjYXRhbG9nSW5mbycsICdPdXRNb2RlJyldLAotIyMgICAgCQkgWygnRlNDYXRhbG9nSW5mb0FuZEJpdG1hcF9vdXQnLCAnY2F0YWxvZ0luZm8nLCAnSW5PdXRNb2RlJyldKSwKLSMjICAgIAkJCisgICAgICAgICAgICAgICAgXQogCi0JCV0KLQkJCi0gICAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IFRydWVcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gRmFsc2VcbiIpCi0JCQkKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJDSW5mb1BCUHRyIiwgIyBPbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiQ01vdmVQQlB0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIlBhcm1CbGtQdHIiLCAjIE9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJIUGFybUJsa1B0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIkRUUEJQdHIiLCAjIE9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGQ0JQQlB0ciIsICMgT2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIlFIZHJQdHIiLCAjIE9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJDU1BhcmFtUHRyIiwgIyBPbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiRlNDYXRhbG9nQnVsa1BhcmFtIiwgIyBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiRlNGb3JrQ0JJbmZvUGFyYW0iLCAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU0ZvcmtJT1BhcmFtIiwgIyBvbGQgc3R1ZmYKKyAgICAgICAgICAgICAgICAiRlNSZWZQYXJhbSIsICAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJGU1ZvbHVtZUluZm9QYXJhbSIsICMgb2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIldEUEJQdHIiLCAjIG9sZCBzdHVmZgorICAgICAgICAgICAgICAgICJYQ0luZm9QQlB0ciIsICMgb2xkIHN0dWZmCisgICAgICAgICAgICAgICAgIlhWb2x1bWVQYXJhbVB0ciIsICMgb2xkIHN0dWZmCisKKworICAgICAgICAgICAgICAgICJDYXRQb3NpdGlvblJlYyIsICMgU3RhdGUgdmFyaWFibGUsIG5vdCB0b28gZGlmZmljdWx0CisgICAgICAgICAgICAgICAgIkZTSXRlcmF0b3IiLCAjIFNob3VsZCBiZWNvbWUgYW4gb2JqZWN0CisgICAgICAgICAgICAgICAgIkZTRm9ya0luZm8iLCAjIExvdHMgb2YgZmllbGRzLCBkaWZmaWN1bHQgc3RydWN0CisgICAgICAgICAgICAgICAgIkZTU2VhcmNoUGFyYW1zIiwgIyBBbHNvIGNhdHNlYXJjaCBzdHVmZgorICAgICAgICAgICAgICAgICJGU1ZvbHVtZUluZm8iLCAjIGJpZyBzdHJ1Y3QKKyAgICAgICAgICAgICAgICAiRlNWb2x1bWVJbmZvX3B0ciIsICMgYmlnIHN0cnVjdAorCisgICAgICAgICAgICAgICAgIklPQ29tcGxldGlvblByb2NQdHIiLCAjIHByb2MgcG9pbnRlcgorICAgICAgICAgICAgICAgICJJT0NvbXBsZXRpb25VUFAiLCAjIFByb2MgcG9pbnRlcgorICAgICAgICAgICAgICAgICJBbGlhc0ZpbHRlclByb2NQdHIiLAorICAgICAgICAgICAgICAgICJBbGlhc0ZpbHRlclVQUCIsCisgICAgICAgICAgICAgICAgIkZOU3Vic2NyaXB0aW9uVVBQIiwKKworICAgICAgICAgICAgICAgICJGTlN1YnNjcmlwdGlvblJlZiIsICMgTGF6eSwgZm9yIG5vdy4KKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAjIFZhcmlvdXMgd2F5cyB0byBnaXZlIHBhdGhuYW1lcworICAgICAgICAgICAgICAgIChbKCdjaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnc3RyaW5ncHRyJywgJyonLCAnSW5Nb2RlJyldCisgICAgICAgICAgICAgICAgKSwKKworICAgICAgICAgICAgICAgICMgVW5pY29kZSBmaWxlbmFtZXMgcGFzc2VkIGFzIGxlbmd0aCwgYnVmZmVyCisgICAgICAgICAgICAgICAgKFsoJ1VuaUNoYXJDb3VudCcsICcqJywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgKCdVbmlDaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnVW5pY29kZVJldmVyc2VJbkJ1ZmZlcicsICcqJywgJ0luTW9kZScpXQorICAgICAgICAgICAgICAgICksCisgICAgICAgICAgICAgICAgIyBXcm9uZyBndWVzcworICAgICAgICAgICAgICAgIChbKCdTdHI2MycsICd0aGVTdHJpbmcnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdTdHI2MycsICd0aGVTdHJpbmcnLCAnT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIFlldCBhbm90aGVyIHdheSB0byBnaXZlIGEgcGF0aG5hbWU6LSkKKyAgICAgICAgICAgICAgICAoWygnc2hvcnQnLCAnZnVsbFBhdGhMZW5ndGgnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAoJ3ZvaWRfcHRyJywgJ2Z1bGxQYXRoJywgJ0luTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnRnVsbFBhdGhOYW1lJywgJ2Z1bGxQYXRoJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIFZhcmlvdXMgUmVzb2x2ZUFsaWFzRmlsZVhYWFggZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgKFsoJ0ZTU3BlYycsICd0aGVTcGVjJywgJ091dE1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ0ZTU3BlY19wdHInLCAndGhlU3BlYycsICdJbk91dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgKFsoJ0ZTUmVmJywgJ3RoZVJlZicsICdPdXRNb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdGU1JlZl9wdHInLCAndGhlUmVmJywgJ0luT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIFRoZSBvcHRpb25hbCBGU1NwZWMgdG8gYWxsIFJlc29sdmVBbGlhcyBhbmQgTmV3QWxpYXMgbWV0aG9kcworICAgICAgICAgICAgICAgIChbKCdGU1NwZWNfcHRyJywgJ2Zyb21GaWxlJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdEZTU3BlY1B0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgKFsoJ0ZTUmVmX3B0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0sCisgICAgICAgICBbKCdPcHRGU1JlZlB0cicsICdmcm9tRmlsZScsICdJbk1vZGUnKV0pLAorCisjIyAgICAgICAgICAgICAgIyBGU0NhdGFsb2dJbmZvIGlucHV0IGhhbmRsaW5nCisjIyAgICAgICAgICAgICAgICAgICAgICAoWygnRlNDYXRhbG9nSW5mb0JpdG1hcCcsICd3aGljaEluZm8nLCAnSW5Nb2RlJyksCisjIyAgICAgICAgICAgICAgICAoJ0ZTQ2F0YWxvZ0luZm9fcHRyJywgJ2NhdGFsb2dJbmZvJywgJ0luTW9kZScpXSwKKyMjICAgICAgICAgICAgICAgWygnRlNDYXRhbG9nSW5mb0FuZEJpdG1hcF9pbicsICdjYXRhbG9nSW5mbycsICdJbk1vZGUnKV0pLAorIyMKKyMjICAgICAgICAgICAgICAjIEZTQ2F0YWxvZ0luZm8gb3V0cHV0IGhhbmRsaW5nCisjIyAgICAgICAgICAgICAgICAgICAgICAoWygnRlNDYXRhbG9nSW5mb0JpdG1hcCcsICd3aGljaEluZm8nLCAnSW5Nb2RlJyksCisjIyAgICAgICAgICAgICAgICAoJ0ZTQ2F0YWxvZ0luZm8nLCAnY2F0YWxvZ0luZm8nLCAnT3V0TW9kZScpXSwKKyMjICAgICAgICAgICAgICAgWygnRlNDYXRhbG9nSW5mb0FuZEJpdG1hcF9vdXQnLCAnY2F0YWxvZ0luZm8nLCAnSW5PdXRNb2RlJyldKSwKKyMjCisKKyAgICAgICAgXQorCisKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IFRydWVcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gRmFsc2VcbiIpCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvZmlsZS9maWxlc3VwcG9ydC5weQppbmRleCBmMDZiYmI4Li5kYWM3MDZkIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9maWxlL2ZpbGVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2ZpbGUvZmlsZXN1cHBvcnQucHkKQEAgLTEwLDE0ICsxMCwxNCBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi0jTUFDSEVBREVSRklMRSA9ICdGaWxlcy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX0ZpbGUnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotTE9OR01PRE5BTUUgPSAnQ2FyYm9uLkZpbGUnCQkjIFRoZSAibm9ybWFsIiBleHRlcm5hbCBuYW1lIG9mIHRoZSBtb2R1bGUKKyNNQUNIRUFERVJGSUxFID0gJ0ZpbGVzLmgnICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfRmlsZScgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitMT05HTU9ETkFNRSA9ICdDYXJib24uRmlsZScgICAgICAgICAgICAgIyBUaGUgIm5vcm1hbCIgZXh0ZXJuYWwgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdGaWxlJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKK01PRFBSRUZJWCA9ICdGaWxlJyAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC0zMyw5ICszMyw5IEBACiAKICMgVmFyaW91cyB0eXBlcyBvZiBzdHJpbmdzOgogI2NsYXNzIFVuaUNoYXJDb3VudEJ1ZmZlcihJbnB1dE9ubHlUeXBlKToKLSMJcGFzcworIyAgICAgICBwYXNzCiBjbGFzcyBWYXJSZXZlcnNlSW5wdXRCdWZmZXJUeXBlKFJldmVyc2VJbnB1dEJ1ZmZlck1peGluLCBWYXJJbnB1dEJ1ZmZlclR5cGUpOgotCXBhc3MKKyAgICBwYXNzCiBGdWxsUGF0aE5hbWUgPSBWYXJSZXZlcnNlSW5wdXRCdWZmZXJUeXBlKCkKIENvbnN0U3RyMzFQYXJhbSA9IE9wYXF1ZUFycmF5VHlwZSgiU3RyMzEiLCAiUHlNYWNfQnVpbGRTdHIyNTUiLCAiUHlNYWNfR2V0U3RyMjU1IikKIENvbnN0U3RyMzJQYXJhbSA9IE9wYXF1ZUFycmF5VHlwZSgiU3RyMzIiLCAiUHlNYWNfQnVpbGRTdHIyNTUiLCAiUHlNYWNfR2V0U3RyMjU1IikKQEAgLTQ3LDYwICs0Nyw2MCBAQAogCiAjIE90aGVyIHR5cGVzOgogY2xhc3MgT3B0aW9uYWxGU3h4eFR5cGUoT3BhcXVlQnlWYWx1ZVR5cGUpOgotCWRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIiVzICVzX19idWZfXzsiLCBzZWxmLnR5cGVOYW1lLCBuYW1lKQotCQlPdXRwdXQoIiVzIColcyA9ICYlc19fYnVmX187Iiwgc2VsZi50eXBlTmFtZSwgbmFtZSwgbmFtZSkKKyAgICBkZWYgZGVjbGFyZShzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCIlcyAlc19fYnVmX187Iiwgc2VsZi50eXBlTmFtZSwgbmFtZSkKKyAgICAgICAgT3V0cHV0KCIlcyAqJXMgPSAmJXNfX2J1Zl9fOyIsIHNlbGYudHlwZU5hbWUsIG5hbWUsIG5hbWUpCiAKIGNsYXNzIEZTQ2F0YWxvZ0luZm9BbmRCaXRtYXBUeXBlKElucHV0T25seVR5cGUpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJSW5wdXRPbmx5VHlwZS5fX2luaXRfXyhzZWxmLCAiQlVHIiwgIkJVRyIpCi0JCQotCWRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoIlB5T2JqZWN0IColc19fb2JqZWN0ID0gTlVMTDsiLCBuYW1lKQotCQlPdXRwdXQoIkZTQ2F0YWxvZ0luZm9CaXRtYXAgJXNfX2JpdG1hcCA9IDA7IiwgbmFtZSkKLQkJT3V0cHV0KCJGU0NhdGFsb2dJbmZvICVzOyIsIG5hbWUpCi0JCQotCWRlZiBnZXRhcmdzRm9ybWF0KHNlbGYpOgotCQlyZXR1cm4gImxPIgotCQkKLQlkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXNfX2JpdG1hcCwgJXNfX29iamVjdCIlKG5hbWUsIG5hbWUpCi0JCQotCWRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiaWYgKCFjb252ZXJ0X0ZTQ2F0YWxvZ0luZm8oJXNfX29iamVjdCwgJXNfX2JpdG1hcCwgJiVzKSkgcmV0dXJuIE5VTEw7IiwgbmFtZSwgbmFtZSwgbmFtZSkKLQkJCi0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICIlc19fYml0bWFwLCAmJXMiJSAobmFtZSwgbmFtZSkKIAotCWRlZiBwYXNzT3V0cHV0KHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19iaXRtYXAsICYlcyIlIChuYW1lLCBuYW1lKQotCQkKLQlkZWYgbWt2YWx1ZUZvcm1hdChzZWxmKToKLQkJcmV0dXJuICJPIgorICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgSW5wdXRPbmx5VHlwZS5fX2luaXRfXyhzZWxmLCAiQlVHIiwgIkJVRyIpCiAKLQlkZWYgbWt2YWx1ZUFyZ3Moc2VsZiwgbmFtZSk6Ci0JCXJldHVybiAiJXNfX29iamVjdCIgJSAobmFtZSkKLQkJCi0JZGVmIHh4eHhta3ZhbHVlQ2hlY2soc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiaWYgKCglc19fb2JqZWN0ID0gbmV3X0ZTQ2F0YWxvZ0luZm8oJXNfX2JpdG1hcCwgJiVzKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IiwgbmFtZSwgbmFtZSkKLQkKKyAgICBkZWYgZGVjbGFyZShzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqJXNfX29iamVjdCA9IE5VTEw7IiwgbmFtZSkKKyAgICAgICAgT3V0cHV0KCJGU0NhdGFsb2dJbmZvQml0bWFwICVzX19iaXRtYXAgPSAwOyIsIG5hbWUpCisgICAgICAgIE91dHB1dCgiRlNDYXRhbG9nSW5mbyAlczsiLCBuYW1lKQorCisgICAgZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6CisgICAgICAgIHJldHVybiAibE8iCisKKyAgICBkZWYgZ2V0YXJnc0FyZ3Moc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX2JpdG1hcCwgJXNfX29iamVjdCIlKG5hbWUsIG5hbWUpCisKKyAgICBkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICghY29udmVydF9GU0NhdGFsb2dJbmZvKCVzX19vYmplY3QsICVzX19iaXRtYXAsICYlcykpIHJldHVybiBOVUxMOyIsIG5hbWUsIG5hbWUsIG5hbWUpCisKKyAgICBkZWYgcGFzc0lucHV0KHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiVzX19iaXRtYXAsICYlcyIlIChuYW1lLCBuYW1lKQorCisgICAgZGVmIHBhc3NPdXRwdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX2JpdG1hcCwgJiVzIiUgKG5hbWUsIG5hbWUpCisKKyAgICBkZWYgbWt2YWx1ZUZvcm1hdChzZWxmKToKKyAgICAgICAgcmV0dXJuICJPIgorCisgICAgZGVmIG1rdmFsdWVBcmdzKHNlbGYsIG5hbWUpOgorICAgICAgICByZXR1cm4gIiVzX19vYmplY3QiICUgKG5hbWUpCisKKyAgICBkZWYgeHh4eG1rdmFsdWVDaGVjayhzZWxmLCBuYW1lKToKKyAgICAgICAgT3V0cHV0KCJpZiAoKCVzX19vYmplY3QgPSBuZXdfRlNDYXRhbG9nSW5mbyglc19fYml0bWFwLCAmJXMpKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiLCBuYW1lLCBuYW1lKQorCiBjbGFzcyBGU0NhdGFsb2dJbmZvQW5kQml0bWFwX2luVHlwZShGU0NhdGFsb2dJbmZvQW5kQml0bWFwVHlwZSwgSW5wdXRPbmx5TWl4SW4pOgotCQotCWRlZiB4eHh4bWt2YWx1ZUNoZWNrKHNlbGYsIG5hbWUpOgotCQlwYXNzCi0JCisKKyAgICBkZWYgeHh4eG1rdmFsdWVDaGVjayhzZWxmLCBuYW1lKToKKyAgICAgICAgcGFzcworCiBjbGFzcyBGU0NhdGFsb2dJbmZvQW5kQml0bWFwX291dFR5cGUoRlNDYXRhbG9nSW5mb0FuZEJpdG1hcFR5cGUpOgogCi0JZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6Ci0JCXJldHVybiAibCIKLQkJCi0JZGVmIGdldGFyZ3NBcmdzKHNlbGYsIG5hbWUpOgotCQlyZXR1cm4gIiVzX19iaXRtYXAiICUgbmFtZQotCQkKLQlkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgotCQlwYXNzCi0JCisgICAgZGVmIGdldGFyZ3NGb3JtYXQoc2VsZik6CisgICAgICAgIHJldHVybiAibCIKKworICAgIGRlZiBnZXRhcmdzQXJncyhzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICIlc19fYml0bWFwIiAlIG5hbWUKKworICAgIGRlZiBnZXRhcmdzQ2hlY2soc2VsZiwgbmFtZSk6CisgICAgICAgIHBhc3MKKwogRkluZm8gPSBPcGFxdWVUeXBlKCJGSW5mbyIsICJGSW5mbyIpCiBGSW5mb19wdHIgPSBPcGFxdWVUeXBlKCJGSW5mbyIsICJGSW5mbyIpCiBBbGlhc0hhbmRsZSA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJBbGlhc0hhbmRsZSIsICJBbGlhcyIpCkBAIC0xNTcsMTMgKzE1NywxMyBAQAogc3RhdGljIGludAogVVRDRGF0ZVRpbWVfQ29udmVydChQeU9iamVjdCAqdiwgVVRDRGF0ZVRpbWUgKnB0cikKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihIbEgpIiwgJnB0ci0+aGlnaFNlY29uZHMsICZwdHItPmxvd1NlY29uZHMsICZwdHItPmZyYWN0aW9uKTsKKyAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlKHYsICIoSGxIKSIsICZwdHItPmhpZ2hTZWNvbmRzLCAmcHRyLT5sb3dTZWNvbmRzLCAmcHRyLT5mcmFjdGlvbik7CiB9CiAKIHN0YXRpYyBQeU9iamVjdCAqCiBVVENEYXRlVGltZV9OZXcoVVRDRGF0ZVRpbWUgKnB0cikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKEhsSCkiLCBwdHItPmhpZ2hTZWNvbmRzLCBwdHItPmxvd1NlY29uZHMsIHB0ci0+ZnJhY3Rpb24pOwogfQogCiAvKgpAQCAtMTcyLDIxICsxNzIsMjEgQEAKIHN0YXRpYyBpbnQKIG15UHlNYWNfR2V0T3B0RlNTcGVjUHRyKFB5T2JqZWN0ICp2LCBGU1NwZWMgKipzcGVjKQogewotCWlmICh2ID09IFB5X05vbmUpIHsKLQkJKnNwZWMgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqc3BlYyk7CisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAqc3BlYyA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIFB5TWFjX0dldEZTU3BlYyh2LCAqc3BlYyk7CiB9CiAKIHN0YXRpYyBpbnQKIG15UHlNYWNfR2V0T3B0RlNSZWZQdHIoUHlPYmplY3QgKnYsIEZTUmVmICoqcmVmKQogewotCWlmICh2ID09IFB5X05vbmUpIHsKLQkJKnJlZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQlyZXR1cm4gUHlNYWNfR2V0RlNSZWYodiwgKnJlZik7CisgICAgICAgIGlmICh2ID09IFB5X05vbmUpIHsKKyAgICAgICAgICAgICAgICAqcmVmID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNSZWYodiwgKnJlZik7CiB9CiAKIC8qCkBAIC0xOTYsNyArMTk2LDcgQEAKIFB5TWFjX0J1aWxkSEZTVW5pU3RyMjU1KEhGU1VuaVN0cjI1NSAqaXRzZWxmKQogewogCi0JcmV0dXJuIFB5X0J1aWxkVmFsdWUoInUjIiwgaXRzZWxmLT51bmljb2RlLCBpdHNlbGYtPmxlbmd0aCk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJ1IyIsIGl0c2VsZi0+dW5pY29kZSwgaXRzZWxmLT5sZW5ndGgpOwogfQogIiIiCiAKQEAgLTIwNCw4NiArMjA0LDg2IEBACiBpbnQKIFB5TWFjX0dldEZTU3BlYyhQeU9iamVjdCAqdiwgRlNTcGVjICpzcGVjKQogewotCVN0cjI1NSBwYXRoOwotCXNob3J0IHJlZm51bTsKLQlsb25nIHBhcmlkOwotCU9TRXJyIGVycjsKLQlGU1JlZiBmc3I7CisgICAgICAgIFN0cjI1NSBwYXRoOworICAgICAgICBzaG9ydCByZWZudW07CisgICAgICAgIGxvbmcgcGFyaWQ7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgRlNSZWYgZnNyOwogCi0JaWYgKEZTU3BlY19DaGVjayh2KSkgewotCQkqc3BlYyA9ICgoRlNTcGVjT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJcmV0dXJuIDE7Ci0JfQorICAgICAgICBpZiAoRlNTcGVjX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgKnNwZWMgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KIAotCWlmIChQeUFyZ19QYXJzZSh2LCAiKGhsTyYpIiwKLQkJCQkJCSZyZWZudW0sICZwYXJpZCwgUHlNYWNfR2V0U3RyMjU1LCAmcGF0aCkpIHsKLQkJZXJyID0gRlNNYWtlRlNTcGVjKHJlZm51bSwgcGFyaWQsIHBhdGgsIHNwZWMpOwotCQlpZiAoIGVyciAmJiBlcnIgIT0gZm5mRXJyICkgewotCQkJUHlNYWNfRXJyb3IoZXJyKTsKLQkJCXJldHVybiAwOwotCQl9Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCS8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCi0JKiogb24gT1M5IHdlIGFjY2VwdCBvbmx5IGEgcmVhbCBGU1JlZiBvYmplY3QKLQkqLwotCWlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7Ci0JCWVyciA9IEZTR2V0Q2F0YWxvZ0luZm8oJmZzciwga0ZTQ2F0SW5mb05vbmUsIE5VTEwsIE5VTEwsIHNwZWMsIE5VTEwpOwotCQlpZiAoZXJyICE9IG5vRXJyKSB7Ci0JCQlQeU1hY19FcnJvcihlcnIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiAwOworICAgICAgICBpZiAoUHlBcmdfUGFyc2UodiwgIihobE8mKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVmbnVtLCAmcGFyaWQsIFB5TWFjX0dldFN0cjI1NSwgJnBhdGgpKSB7CisgICAgICAgICAgICAgICAgZXJyID0gRlNNYWtlRlNTcGVjKHJlZm51bSwgcGFyaWQsIHBhdGgsIHNwZWMpOworICAgICAgICAgICAgICAgIGlmICggZXJyICYmIGVyciAhPSBmbmZFcnIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgIC8qIE90aGVyd2lzZSB3ZSB0cnkgdG8gZ28gdmlhIGFuIEZTUmVmLiBPbiBPU1ggd2UgZ28gYWxsIHRoZSB3YXksCisgICAgICAgICoqIG9uIE9TOSB3ZSBhY2NlcHQgb25seSBhIHJlYWwgRlNSZWYgb2JqZWN0CisgICAgICAgICovCisgICAgICAgIGlmICggUHlNYWNfR2V0RlNSZWYodiwgJmZzcikgKSB7CisgICAgICAgICAgICAgICAgZXJyID0gRlNHZXRDYXRhbG9nSW5mbygmZnNyLCBrRlNDYXRJbmZvTm9uZSwgTlVMTCwgTlVMTCwgc3BlYywgTlVMTCk7CisgICAgICAgICAgICAgICAgaWYgKGVyciAhPSBub0VycikgeworICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfRXJyb3IoZXJyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKIH0KIAogaW50CiBQeU1hY19HZXRGU1JlZihQeU9iamVjdCAqdiwgRlNSZWYgKmZzcikKIHsKLQlPU1N0YXR1cyBlcnI7Ci0JRlNTcGVjIGZzczsKLQkKLQlpZiAoRlNSZWZfQ2hlY2sodikpIHsKLQkJKmZzciA9ICgoRlNSZWZPYmplY3QgKil2KS0+b2JfaXRzZWxmOwotCQlyZXR1cm4gMTsKLQl9CisgICAgICAgIE9TU3RhdHVzIGVycjsKKyAgICAgICAgRlNTcGVjIGZzczsKIAotCS8qIE9uIE9TWCB3ZSBub3cgdHJ5IGEgcGF0aG5hbWUgKi8KLQlpZiAoIFB5U3RyaW5nX0NoZWNrKHYpIHx8IFB5VW5pY29kZV9DaGVjayh2KSkgewotCQljaGFyICpwYXRoID0gTlVMTDsKLQkJaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXQiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCkpCi0JCQlyZXR1cm4gTlVMTDsKLQkJaWYgKCAoZXJyPUZTUGF0aE1ha2VSZWYocGF0aCwgZnNyLCBOVUxMKSkgKSB7Ci0JCQlQeU1hY19FcnJvcihlcnIpOwotCQkJcmV0dXJuIDA7Ci0JCX0KLQkJcmV0dXJuIDE7Ci0JfQotCS8qIFhYWFggU2hvdWxkIHRyeSB1bmljb2RlIGhlcmUgdG9vICovCi0JLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNTcGVjICovCi0JaWYgKEZTU3BlY19DaGVjayh2KSkgewotCQlmc3MgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7Ci0JCWlmICgoZXJyPUZTcE1ha2VGU1JlZigmZnNzLCBmc3IpKSA9PSAwKQotCQkJcmV0dXJuIDE7Ci0JCVB5TWFjX0Vycm9yKGVycik7Ci0JCXJldHVybiAwOwotCX0KLQlQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiRlNSZWYsIEZTU3BlYyBvciBwYXRobmFtZSByZXF1aXJlZCIpOwotCXJldHVybiAwOworICAgICAgICBpZiAoRlNSZWZfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICAqZnNyID0gKChGU1JlZk9iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKworICAgICAgICAvKiBPbiBPU1ggd2Ugbm93IHRyeSBhIHBhdGhuYW1lICovCisgICAgICAgIGlmICggUHlTdHJpbmdfQ2hlY2sodikgfHwgUHlVbmljb2RlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgY2hhciAqcGF0aCA9IE5VTEw7CisgICAgICAgICAgICAgICAgaWYgKCFQeUFyZ19QYXJzZSh2LCAiZXQiLCBQeV9GaWxlU3lzdGVtRGVmYXVsdEVuY29kaW5nLCAmcGF0aCkpCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgICAgICBpZiAoIChlcnI9RlNQYXRoTWFrZVJlZihwYXRoLCBmc3IsIE5VTEwpKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgLyogWFhYWCBTaG91bGQgdHJ5IHVuaWNvZGUgaGVyZSB0b28gKi8KKyAgICAgICAgLyogT3RoZXJ3aXNlIHdlIHRyeSB0byBnbyB2aWEgYW4gRlNTcGVjICovCisgICAgICAgIGlmIChGU1NwZWNfQ2hlY2sodikpIHsKKyAgICAgICAgICAgICAgICBmc3MgPSAoKEZTU3BlY09iamVjdCAqKXYpLT5vYl9pdHNlbGY7CisgICAgICAgICAgICAgICAgaWYgKChlcnI9RlNwTWFrZUZTUmVmKCZmc3MsIGZzcikpID09IDApCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgICAgICAgICBQeU1hY19FcnJvcihlcnIpOworICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJGU1JlZiwgRlNTcGVjIG9yIHBhdGhuYW1lIHJlcXVpcmVkIik7CisgICAgICAgIHJldHVybiAwOwogfQogCiBleHRlcm4gUHlPYmplY3QgKgogUHlNYWNfQnVpbGRGU1NwZWMoRlNTcGVjICpzcGVjKQogewotCXJldHVybiBGU1NwZWNfTmV3KHNwZWMpOworICAgICAgICByZXR1cm4gRlNTcGVjX05ldyhzcGVjKTsKIH0KIAogZXh0ZXJuIFB5T2JqZWN0ICoKIFB5TWFjX0J1aWxkRlNSZWYoRlNSZWYgKnNwZWMpCiB7Ci0JcmV0dXJuIEZTUmVmX05ldyhzcGVjKTsKKyAgICAgICAgcmV0dXJuIEZTUmVmX05ldyhzcGVjKTsKIH0KICIiIgogCkBAIC0yOTgsNDQ2ICsyOTgsNDQ2IEBACiAKICMgT3VyIG9iamVjdCB0eXBlczoKIGNsYXNzIEZTQ2F0YWxvZ0luZm9EZWZpbml0aW9uKFBFUDI1M01peGluLCBPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoIm5vZGVGbGFncyIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJIXCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlRmxhZ3MpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiSFwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoInZvbHVtZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJoXCIsIHNlbGYtPm9iX2l0c2VsZi52b2x1bWUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiaFwiLCAmc2VsZi0+b2JfaXRzZWxmLnZvbHVtZSktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoInBhcmVudERpcklEIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5wYXJlbnREaXJJRCktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoIm5vZGVJRCIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5ub2RlSUQpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoImNyZWF0ZURhdGUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiY29udGVudE1vZERhdGUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuY29udGVudE1vZERhdGUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJhdHRyaWJ1dGVNb2REYXRlIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hdHRyaWJ1dGVNb2REYXRlKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsiLAotCQkgTm9uZQotCQkpLAotCQkoImFjY2Vzc0RhdGUiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiYmFja3VwRGF0ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmJhY2t1cERhdGUpLTE7IiwKLQkJIE5vbmUKLQkJKSwKLQkJKCJwZXJtaXNzaW9ucyIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCIobGxsbClcIiwgc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzBdLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMV0sIHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9uc1syXSwgc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzNdKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIihsbGxsKVwiLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzBdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzFdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzJdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzNdKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSMgWFhYWCBGaW5kZXJJbmZvIFRCRAotCQkjIFhYWFggRmluZGVyWEluZm8gVEJECi0JCSgidmFsZW5jZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiZGF0YUxvZ2ljYWxTaXplIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgiZGF0YVBoeXNpY2FsU2l6ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgicnNyY0xvZ2ljYWxTaXplIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYucnNyY0xvZ2ljYWxTaXplKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgicnNyY1BoeXNpY2FsU2l6ZSIsCi0JCSAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgic2hhcmluZ0ZsYWdzIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncyk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JCSgidXNlclByaXZpbGVnZXMiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiYlwiLCBzZWxmLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiYlwiLCAmc2VsZi0+b2JfaXRzZWxmLnVzZXJQcml2aWxlZ2VzKS0xOyIsCi0JCSBOb25lCi0JCSksCi0JXQotCSMgVGhlIHNhbWUgaW5mbywgYnV0IGluIGEgZGlmZmVyZW50IGZvcm0KLQlJTklURk9STUFUID0gIkhobGxPJk8mTyZPJk8mbGxsbGxsYiIKLQlJTklUQVJHUyA9ICIiIiYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudm9sdW1lLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5wYXJlbnREaXJJRCwKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYubm9kZUlELAotCQlVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5jcmVhdGVEYXRlLAotCQlVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5jb250ZW50TW9kRGF0ZSwKLQkJVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKLQkJVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuYWNjZXNzRGF0ZSwKLQkJVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSwKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5kYXRhUGh5c2ljYWxTaXplLAotCQkmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCi0JCSYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUsCi0JCSYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnNoYXJpbmdGbGFncywKLQkJJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMiIiIKLQlJTklUTkFNRVMgPSAiIiIKLQkJIm5vZGVGbGFncyIsCi0JCSJ2b2x1bWUiLAotCQkicGFyZW50RGlySUQiLAotCQkibm9kZUlEIiwKLQkJImNyZWF0ZURhdGUiLAotCQkiY29udGVudE1vZERhdGUiLAotCQkiYXRyaWJ1dGVNb2REYXRlIiwKLQkJImFjY2Vzc0RhdGUiLAotCQkiYmFja3VwRGF0ZSIsCi0JCSJ2YWxlbmNlIiwKLQkJImRhdGFMb2dpY2FsU2l6ZSIsCi0JCSJkYXRhUGh5c2ljYWxTaXplIiwKLQkJInJzcmNMb2dpY2FsU2l6ZSIsCi0JCSJyc3JjUGh5c2ljYWxTaXplIiwKLQkJInNoYXJpbmdGbGFncyIsCi0JCSJ1c2VyUHJpdmlsZWdlcyIKLQkJIiIiCi0JCQotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgotCQlPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKLQkJc2VsZi5hcmdyZWYgPSAiKiIJIyBTdG9yZSBGU1NwZWNzLCBidXQgcGFzcyB0aGVtIGJ5IGFkZHJlc3MKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCJub2RlRmxhZ3MiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIkhcIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiSFwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVGbGFncyktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoInZvbHVtZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiaFwiLCBzZWxmLT5vYl9pdHNlbGYudm9sdW1lKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJoXCIsICZzZWxmLT5vYl9pdHNlbGYudm9sdW1lKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgicGFyZW50RGlySUQiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnBhcmVudERpcklEKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYucGFyZW50RGlySUQpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJub2RlSUQiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLm5vZGVJRCktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoImNyZWF0ZURhdGUiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5jcmVhdGVEYXRlKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNyZWF0ZURhdGUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJjb250ZW50TW9kRGF0ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiYXR0cmlidXRlTW9kRGF0ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgVVRDRGF0ZVRpbWVfTmV3LCAmc2VsZi0+b2JfaXRzZWxmLmF0dHJpYnV0ZU1vZERhdGUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICZzZWxmLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoImFjY2Vzc0RhdGUiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFVUQ0RhdGVUaW1lX05ldywgJnNlbGYtPm9iX2l0c2VsZi5hY2Nlc3NEYXRlKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBVVENEYXRlVGltZV9Db252ZXJ0LCAmc2VsZi0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJiYWNrdXBEYXRlIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBVVENEYXRlVGltZV9OZXcsICZzZWxmLT5vYl9pdHNlbGYuYmFja3VwRGF0ZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgVVRDRGF0ZVRpbWVfQ29udmVydCwgJnNlbGYtPm9iX2l0c2VsZi5iYWNrdXBEYXRlKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgicGVybWlzc2lvbnMiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIihsbGxsKVwiLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbMF0sIHNlbGYtPm9iX2l0c2VsZi5wZXJtaXNzaW9uc1sxXSwgc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzJdLCBzZWxmLT5vYl9pdHNlbGYucGVybWlzc2lvbnNbM10pOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIihsbGxsKVwiLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzBdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzFdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzJdLCAmc2VsZi0+b2JfaXRzZWxmLnBlcm1pc3Npb25zWzNdKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICMgWFhYWCBGaW5kZXJJbmZvIFRCRAorICAgICAgICAgICAgIyBYWFhYIEZpbmRlclhJbmZvIFRCRAorICAgICAgICAgICAgKCJ2YWxlbmNlIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi52YWxlbmNlKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYudmFsZW5jZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoImRhdGFMb2dpY2FsU2l6ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJsXCIsICZzZWxmLT5vYl9pdHNlbGYuZGF0YUxvZ2ljYWxTaXplKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgiZGF0YVBoeXNpY2FsU2l6ZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwibFwiLCBzZWxmLT5vYl9pdHNlbGYuZGF0YVBoeXNpY2FsU2l6ZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJyc3JjTG9naWNhbFNpemUiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwibFwiLCAmc2VsZi0+b2JfaXRzZWxmLnJzcmNMb2dpY2FsU2l6ZSktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoInJzcmNQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImxcIiwgc2VsZi0+b2JfaXRzZWxmLnJzcmNQaHlzaWNhbFNpemUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplKS0xOyIsCisgICAgICAgICAgICAgTm9uZQorICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICgic2hhcmluZ0ZsYWdzIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJsXCIsIHNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImxcIiwgJnNlbGYtPm9iX2l0c2VsZi5zaGFyaW5nRmxhZ3MpLTE7IiwKKyAgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJ1c2VyUHJpdmlsZWdlcyIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiYlwiLCBzZWxmLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImJcIiwgJnNlbGYtPm9iX2l0c2VsZi51c2VyUHJpdmlsZWdlcyktMTsiLAorICAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksCisgICAgXQorICAgICMgVGhlIHNhbWUgaW5mbywgYnV0IGluIGEgZGlmZmVyZW50IGZvcm0KKyAgICBJTklURk9STUFUID0gIkhobGxPJk8mTyZPJk8mbGxsbGxsYiIKKyAgICBJTklUQVJHUyA9ICIiIiYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLm5vZGVGbGFncywKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnZvbHVtZSwKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLnBhcmVudERpcklELAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYubm9kZUlELAorICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuY3JlYXRlRGF0ZSwKKyAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmNvbnRlbnRNb2REYXRlLAorICAgICAgICAgICAgVVRDRGF0ZVRpbWVfQ29udmVydCwgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuYXR0cmlidXRlTW9kRGF0ZSwKKyAgICAgICAgICAgIFVUQ0RhdGVUaW1lX0NvbnZlcnQsICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmFjY2Vzc0RhdGUsCisgICAgICAgICAgICBVVENEYXRlVGltZV9Db252ZXJ0LCAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5iYWNrdXBEYXRlLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudmFsZW5jZSwKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmRhdGFMb2dpY2FsU2l6ZSwKKyAgICAgICAgICAgICYoKEZTQ2F0YWxvZ0luZm9PYmplY3QgKilzZWxmKS0+b2JfaXRzZWxmLmRhdGFQaHlzaWNhbFNpemUsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5yc3JjTG9naWNhbFNpemUsCisgICAgICAgICAgICAmKChGU0NhdGFsb2dJbmZvT2JqZWN0ICopc2VsZiktPm9iX2l0c2VsZi5yc3JjUGh5c2ljYWxTaXplLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYuc2hhcmluZ0ZsYWdzLAorICAgICAgICAgICAgJigoRlNDYXRhbG9nSW5mb09iamVjdCAqKXNlbGYpLT5vYl9pdHNlbGYudXNlclByaXZpbGVnZXMiIiIKKyAgICBJTklUTkFNRVMgPSAiIiIKKyAgICAgICAgICAgICJub2RlRmxhZ3MiLAorICAgICAgICAgICAgInZvbHVtZSIsCisgICAgICAgICAgICAicGFyZW50RGlySUQiLAorICAgICAgICAgICAgIm5vZGVJRCIsCisgICAgICAgICAgICAiY3JlYXRlRGF0ZSIsCisgICAgICAgICAgICAiY29udGVudE1vZERhdGUiLAorICAgICAgICAgICAgImF0cmlidXRlTW9kRGF0ZSIsCisgICAgICAgICAgICAiYWNjZXNzRGF0ZSIsCisgICAgICAgICAgICAiYmFja3VwRGF0ZSIsCisgICAgICAgICAgICAidmFsZW5jZSIsCisgICAgICAgICAgICAiZGF0YUxvZ2ljYWxTaXplIiwKKyAgICAgICAgICAgICJkYXRhUGh5c2ljYWxTaXplIiwKKyAgICAgICAgICAgICJyc3JjTG9naWNhbFNpemUiLAorICAgICAgICAgICAgInJzcmNQaHlzaWNhbFNpemUiLAorICAgICAgICAgICAgInNoYXJpbmdGbGFncyIsCisgICAgICAgICAgICAidXNlclByaXZpbGVnZXMiCisgICAgICAgICAgICAiIiIKIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeV9Ob25lOyIpCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6CisgICAgICAgIE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQorICAgICAgICBzZWxmLmFyZ3JlZiA9ICIqIiAgICAgICAjIFN0b3JlIEZTU3BlY3MsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcwogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOwotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIm1lbXNldCgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZiglcykpOyIsIAotCQkJc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIHNlbGY7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlfTm9uZTsiKQogCi0JZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKLQkJT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHslcywgMH07Iiwgc2VsZi5JTklUTkFNRVMpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8JXNcIiwga3csICVzKSkiLCAKLQkJCXNlbGYuSU5JVEZPUk1BVCwgc2VsZi5JTklUQVJHUykKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQorICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKTsKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJtZW1zZXQoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCAwLCBzaXplb2YoJXMpKTsiLAorICAgICAgICAgICAgICAgIHNlbGYub2JqZWN0dHlwZSwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiBzZWxmOyIpCisKKyAgICBkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0geyVzLCAwfTsiLCBzZWxmLklOSVROQU1FUykKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInwlc1wiLCBrdywgJXMpKSIsCisgICAgICAgICAgICAgICAgc2VsZi5JTklURk9STUFULCBzZWxmLklOSVRBUkdTKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisKIGNsYXNzIEZJbmZvRGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgT2JqZWN0RGVmaW5pdGlvbik6Ci0JZ2V0c2V0bGlzdCA9IFsKLQkJKCJUeXBlIiwKLQkJICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRUeXBlKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7IiwKLQkJICI0LWNoYXIgZmlsZSB0eXBlIgotCQkpLAotCQkoIkNyZWF0b3IiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZENyZWF0b3IpOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgUHlNYWNfR2V0T1NUeXBlLCAmc2VsZi0+b2JfaXRzZWxmLmZkQ3JlYXRvciktMTsiLAotCQkgIjQtY2hhciBmaWxlIGNyZWF0b3IiCi0JCSksCi0JCSgiRmxhZ3MiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiSFwiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyk7IiwKLQkJICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJIXCIsICZzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyktMTsiLAotCQkgIkZpbmRlciBmbGFnIGJpdHMiCi0JCSksCi0JCSgiTG9jYXRpb24iLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgUHlNYWNfQnVpbGRQb2ludCwgc2VsZi0+b2JfaXRzZWxmLmZkTG9jYXRpb24pOyIsCi0JCSAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgUHlNYWNfR2V0UG9pbnQsICZzZWxmLT5vYl9pdHNlbGYuZmRMb2NhdGlvbiktMTsiLAotCQkgIih4LCB5KSBsb2NhdGlvbiBvZiB0aGUgZmlsZSdzIGljb24gaW4gaXRzIHBhcmVudCBmaW5kZXIgd2luZG93IgotCQkpLAotCQkoIkZsZHIiLAotCQkgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiaFwiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGRyKTsiLAotCQkgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcImhcIiwgJnNlbGYtPm9iX2l0c2VsZi5mZEZsZHIpLTE7IiwKLQkJICJPcmlnaW5hbCBmb2xkZXIsIGZvciAncHV0IGF3YXknIgotCQkpLAotCQkKLQldCi0JCSAKLQlkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5fX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpCi0JCXNlbGYuYXJncmVmID0gIioiCSMgU3RvcmUgRlNTcGVjcywgYnV0IHBhc3MgdGhlbSBieSBhZGRyZXNzCisgICAgZ2V0c2V0bGlzdCA9IFsKKyAgICAgICAgICAgICgiVHlwZSIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiTyZcIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpOyIsCisgICAgICAgICAgICAgInJldHVybiBQeUFyZ19QYXJzZSh2LCBcIk8mXCIsIFB5TWFjX0dldE9TVHlwZSwgJnNlbGYtPm9iX2l0c2VsZi5mZFR5cGUpLTE7IiwKKyAgICAgICAgICAgICAiNC1jaGFyIGZpbGUgdHlwZSIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIkNyZWF0b3IiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcIk8mXCIsIFB5TWFjX0J1aWxkT1NUeXBlLCBzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKTsiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlBcmdfUGFyc2UodiwgXCJPJlwiLCBQeU1hY19HZXRPU1R5cGUsICZzZWxmLT5vYl9pdHNlbGYuZmRDcmVhdG9yKS0xOyIsCisgICAgICAgICAgICAgIjQtY2hhciBmaWxlIGNyZWF0b3IiCisgICAgICAgICAgICApLAorICAgICAgICAgICAgKCJGbGFncyIsCisgICAgICAgICAgICAgInJldHVybiBQeV9CdWlsZFZhbHVlKFwiSFwiLCBzZWxmLT5vYl9pdHNlbGYuZmRGbGFncyk7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiSFwiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxhZ3MpLTE7IiwKKyAgICAgICAgICAgICAiRmluZGVyIGZsYWcgYml0cyIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIkxvY2F0aW9uIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5X0J1aWxkVmFsdWUoXCJPJlwiLCBQeU1hY19CdWlsZFBvaW50LCBzZWxmLT5vYl9pdHNlbGYuZmRMb2NhdGlvbik7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiTyZcIiwgUHlNYWNfR2V0UG9pbnQsICZzZWxmLT5vYl9pdHNlbGYuZmRMb2NhdGlvbiktMTsiLAorICAgICAgICAgICAgICIoeCwgeSkgbG9jYXRpb24gb2YgdGhlIGZpbGUncyBpY29uIGluIGl0cyBwYXJlbnQgZmluZGVyIHdpbmRvdyIKKyAgICAgICAgICAgICksCisgICAgICAgICAgICAoIkZsZHIiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlfQnVpbGRWYWx1ZShcImhcIiwgc2VsZi0+b2JfaXRzZWxmLmZkRmxkcik7IiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5QXJnX1BhcnNlKHYsIFwiaFwiLCAmc2VsZi0+b2JfaXRzZWxmLmZkRmxkciktMTsiLAorICAgICAgICAgICAgICJPcmlnaW5hbCBmb2xkZXIsIGZvciAncHV0IGF3YXknIgorICAgICAgICAgICAgKSwKIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyAgICBdCiAKLQlkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6Ci0JCU91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCi0JCU91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwgCi0JCQlzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKKyAgICAgICAgc2VsZi5hcmdyZWYgPSAiKiIgICAgICAgIyBTdG9yZSBGU1NwZWNzLCBidXQgcGFzcyB0aGVtIGJ5IGFkZHJlc3MKIAotCWRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6Ci0JCU91dHB1dCgiJXMgKml0c2VsZiA9IE5VTEw7Iiwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIDB9OyIpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKFB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxPJlwiLCBrdywgRkluZm9fQ29udmVydCwgJml0c2VsZikpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoaXRzZWxmKSBtZW1jcHkoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCBpdHNlbGYsIHNpemVvZiglcykpOyIsIAotCQkJc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisKKyAgICBkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIE91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCIlcyAqaXRzZWxmID0gTlVMTDsiLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgMH07IikKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE8mXCIsIGt3LCBGSW5mb19Db252ZXJ0LCAmaXRzZWxmKSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYpIG1lbWNweSgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIGl0c2VsZiwgc2l6ZW9mKCVzKSk7IiwKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQogCiBjbGFzcyBGU1NwZWNEZWZpbml0aW9uKFBFUDI1M01peGluLCBPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoImRhdGEiLAotCQkgInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKSZzZWxmLT5vYl9pdHNlbGYsIHNpemVvZihzZWxmLT5vYl9pdHNlbGYpKTsiLAotCQkgTm9uZSwKLQkJICJSYXcgZGF0YSBvZiB0aGUgRlNTcGVjIG9iamVjdCIKLQkJKQotCV0KLQkJIAotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgotCQlPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKLQkJc2VsZi5hcmdyZWYgPSAiKiIJIyBTdG9yZSBGU1NwZWNzLCBidXQgcGFzcyB0aGVtIGJ5IGFkZHJlc3MKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCJkYXRhIiwKKyAgICAgICAgICAgICAicmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopJnNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKHNlbGYtPm9iX2l0c2VsZikpOyIsCisgICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICAiUmF3IGRhdGEgb2YgdGhlIEZTU3BlYyBvYmplY3QiCisgICAgICAgICAgICApCisgICAgXQogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCQkKLQkjIFdlIGRvIENvbnZlcnQgb3Vyc2VsdmVzICh3aXRoIFB5TWFjX0dldEZTeHh4KQotCWRlZiBvdXRwdXRDb252ZXJ0KHNlbGYpOgotCQlwYXNzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSk6CisgICAgICAgIE9iamVjdERlZmluaXRpb24uX19pbml0X18oc2VsZiwgbmFtZSwgcHJlZml4LCBpdHNlbGZ0eXBlKQorICAgICAgICBzZWxmLmFyZ3JlZiA9ICIqIiAgICAgICAjIFN0b3JlIEZTU3BlY3MsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcwogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOwotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIm1lbXNldCgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZiglcykpOyIsIAotCQkJc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIHNlbGY7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCiAKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICp2ID0gTlVMTDsiKQotCQlPdXRwdXQoImNoYXIgKnJhd2RhdGEgPSBOVUxMOyIpCi0JCU91dHB1dCgiaW50IHJhd2RhdGFsZW4gPSAwOyIpCi0JCU91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgXCJyYXdkYXRhXCIsIDB9OyIpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8T3MjXCIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRwdXQoImlmICh2ICYmIHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWRcIik7IikKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoIXYgJiYgIXJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZFwiKTsiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoImlmIChyYXdkYXRhKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKCVzKSkiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCIlcyByYXdkYXRhIGluY29ycmVjdCBzaXplXCIpOyIsCi0JCQlzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgibWVtY3B5KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCi0JZGVmIG91dHB1dFJlcHIoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgic3RhdGljIFB5T2JqZWN0ICogJXNfcmVwciglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoImNoYXIgYnVmWzUxMl07IikKLQkJT3V0cHV0KCIiIlB5T1Nfc25wcmludGYoYnVmLCBzaXplb2YoYnVmKSwgXCIlJXMoKCUlZCwgJSVsZCwgJyUlLipzJykpXCIsCi0JCXNlbGYtPm9iX3R5cGUtPnRwX25hbWUsCi0JCXNlbGYtPm9iX2l0c2VsZi52UmVmTnVtLCAKLQkJc2VsZi0+b2JfaXRzZWxmLnBhcklELAotCQlzZWxmLT5vYl9pdHNlbGYubmFtZVswXSwgc2VsZi0+b2JfaXRzZWxmLm5hbWUrMSk7IiIiKQotCQlPdXRwdXQoInJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nKGJ1Zik7IikKLQkJT3V0UmJyYWNlKCkKLQkJCisgICAgIyBXZSBkbyBDb252ZXJ0IG91cnNlbHZlcyAod2l0aCBQeU1hY19HZXRGU3h4eCkKKyAgICBkZWYgb3V0cHV0Q29udmVydChzZWxmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOworICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIm1lbXNldCgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZiglcykpOyIsCisgICAgICAgICAgICAgICAgc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIHNlbGY7IikKKworICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnYgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiY2hhciAqcmF3ZGF0YSA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpbnQgcmF3ZGF0YWxlbiA9IDA7IikKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCBcInJhd2RhdGFcIiwgMH07IikKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxPcyNcIiwga3csICZ2LCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKSIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dHB1dCgiaWYgKHYgJiYgcmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25seSBvbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbWF5IGJlIHNwZWNpZmllZFwiKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmICghdiAmJiAhcmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkXCIpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKHJhd2RhdGEpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAocmF3ZGF0YWxlbiAhPSBzaXplb2YoJXMpKSIsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIiVzIHJhd2RhdGEgaW5jb3JyZWN0IHNpemVcIik7IiwKKyAgICAgICAgICAgICAgICBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgibWVtY3B5KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKFB5TWFjX0dldEZTU3BlYyh2LCAmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYpKSByZXR1cm4gMDsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbNTEyXTsiKQorICAgICAgICBPdXRwdXQoIiIiUHlPU19zbnByaW50ZihidWYsIHNpemVvZihidWYpLCBcIiUlcygoJSVkLCAlJWxkLCAnJSUuKnMnKSlcIiwKKyAgICAgICAgc2VsZi0+b2JfdHlwZS0+dHBfbmFtZSwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sCisgICAgICAgIHNlbGYtPm9iX2l0c2VsZi5wYXJJRCwKKyAgICAgICAgc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0sIHNlbGYtPm9iX2l0c2VsZi5uYW1lKzEpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKIGNsYXNzIEZTUmVmRGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgT2JqZWN0RGVmaW5pdGlvbik6Ci0JZ2V0c2V0bGlzdCA9IFsKLQkJKCJkYXRhIiwKLQkJICJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7IiwKLQkJIE5vbmUsCi0JCSAiUmF3IGRhdGEgb2YgdGhlIEZTUmVmIG9iamVjdCIKLQkJKQotCV0KLQkJIAotCWRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgotCQlPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKLQkJc2VsZi5hcmdyZWYgPSAiKiIJIyBTdG9yZSBGU1JlZnMsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcworICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoImRhdGEiLAorICAgICAgICAgICAgICJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoKGNoYXIgKikmc2VsZi0+b2JfaXRzZWxmLCBzaXplb2Yoc2VsZi0+b2JfaXRzZWxmKSk7IiwKKyAgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgICJSYXcgZGF0YSBvZiB0aGUgRlNSZWYgb2JqZWN0IgorICAgICAgICAgICAgKQorICAgIF0KIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQkJCi0JIyBXZSBkbyBDb252ZXJ0IG91cnNlbHZlcyAod2l0aCBQeU1hY19HZXRGU3h4eCkKLQlkZWYgb3V0cHV0Q29udmVydChzZWxmKToKLQkJcGFzcworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBwcmVmaXgsIGl0c2VsZnR5cGUpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLl9faW5pdF9fKHNlbGYsIG5hbWUsIHByZWZpeCwgaXRzZWxmdHlwZSkKKyAgICAgICAgc2VsZi5hcmdyZWYgPSAiKiIgICAgICAgIyBTdG9yZSBGU1JlZnMsIGJ1dCBwYXNzIHRoZW0gYnkgYWRkcmVzcwogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOwotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIm1lbXNldCgmKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYsIDAsIHNpemVvZiglcykpOyIsIAotCQkJc2VsZi5vYmplY3R0eXBlLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIHNlbGY7IikKLQkKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICp2ID0gTlVMTDsiKQotCQlPdXRwdXQoImNoYXIgKnJhd2RhdGEgPSBOVUxMOyIpCi0JCU91dHB1dCgiaW50IHJhd2RhdGFsZW4gPSAwOyIpCi0JCU91dHB1dCgic3RhdGljIGNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgXCJyYXdkYXRhXCIsIDB9OyIpCi0JCU91dHB1dCgpCi0JCU91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8T3MjXCIsIGt3LCAmdiwgJnJhd2RhdGEsICZyYXdkYXRhbGVuKSkiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRwdXQoImlmICh2ICYmIHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWRcIik7IikKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoIXYgJiYgIXJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtdXN0IGJlIHNwZWNpZmllZFwiKTsiKQotCQlPdXRwdXQoInJldHVybiAtMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoImlmIChyYXdkYXRhKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiaWYgKHJhd2RhdGFsZW4gIT0gc2l6ZW9mKCVzKSkiLCBzZWxmLml0c2VsZnR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCIlcyByYXdkYXRhIGluY29ycmVjdCBzaXplXCIpOyIsCi0JCQlzZWxmLml0c2VsZnR5cGUpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgibWVtY3B5KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiaWYgKFB5TWFjX0dldEZTUmVmKHYsICYoKCVzICopc2VsZiktPm9iX2l0c2VsZikpIHJldHVybiAwOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisKKyAgICAjIFdlIGRvIENvbnZlcnQgb3Vyc2VsdmVzICh3aXRoIFB5TWFjX0dldEZTeHh4KQorICAgIGRlZiBvdXRwdXRDb252ZXJ0KHNlbGYpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb3V0cHV0X3RwX25ld0JvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKnNlbGY7Iik7CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgiaWYgKChzZWxmID0gdHlwZS0+dHBfYWxsb2ModHlwZSwgMCkpID09IE5VTEwpIHJldHVybiBOVUxMOyIpCisgICAgICAgIE91dHB1dCgibWVtc2V0KCYoKCVzICopc2VsZiktPm9iX2l0c2VsZiwgMCwgc2l6ZW9mKCVzKSk7IiwKKyAgICAgICAgICAgICAgICBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gc2VsZjsiKQorCisgICAgZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqdiA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJjaGFyICpyYXdkYXRhID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoImludCByYXdkYXRhbGVuID0gMDsiKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIFwicmF3ZGF0YVwiLCAwfTsiKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE9zI1wiLCBrdywgJnYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAodiAmJiByYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmx5IG9uZSBvZiBpdHNlbGYgb3IgcmF3ZGF0YSBtYXkgYmUgc3BlY2lmaWVkXCIpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKCF2ICYmICFyYXdkYXRhKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgXCJPbmUgb2YgaXRzZWxmIG9yIHJhd2RhdGEgbXVzdCBiZSBzcGVjaWZpZWRcIik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAocmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoImlmIChyYXdkYXRhbGVuICE9IHNpemVvZiglcykpIiwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiJXMgcmF3ZGF0YSBpbmNvcnJlY3Qgc2l6ZVwiKTsiLAorICAgICAgICAgICAgICAgIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJtZW1jcHkoJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmLCByYXdkYXRhLCByYXdkYXRhbGVuKTsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlNYWNfR2V0RlNSZWYodiwgJigoJXMgKilzZWxmKS0+b2JfaXRzZWxmKSkgcmV0dXJuIDA7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAtMTsiKQorCiBjbGFzcyBBbGlhc0RlZmluaXRpb24oUEVQMjUzTWl4aW4sIE9iamVjdERlZmluaXRpb24pOgotCSMgWFhYWCBTaG91bGQgaW5oZXJpdCBmcm9tIHJlc291cmNlPwotCWdldHNldGxpc3QgPSBbCi0JCSgiZGF0YSIsCi0JCSAiIiJpbnQgc2l6ZTsKLQkJCVB5T2JqZWN0ICpydjsKLQkJCQotCQkJc2l6ZSA9IEdldEhhbmRsZVNpemUoKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOwotCQkJSExvY2soKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYpOwotCQkJcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgqKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYsIHNpemUpOwotCQkJSFVubG9jaygoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7Ci0JCQlyZXR1cm4gcnY7Ci0JCSIiIiwKLQkJIE5vbmUsCi0JCSAiUmF3IGRhdGEgb2YgdGhlIGFsaWFzIG9iamVjdCIKLQkJKQotCV0KLQkJIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQkJCi0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoInZvaWQgKCpvYl9mcmVlaXQpKCVzIHB0cik7Iiwgc2VsZi5pdHNlbGZ0eXBlKQotCQkKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpdC0+b2JfZnJlZWl0ID0gTlVMTDsiKQotCQkKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoInNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7IikKKyAgICAjIFhYWFggU2hvdWxkIGluaGVyaXQgZnJvbSByZXNvdXJjZT8KKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCJkYXRhIiwKKyAgICAgICAgICAgICAiIiJpbnQgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QgKnJ2OwogCi0JZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgotCQlPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOwotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIHNlbGY7IikKLQkKLQlkZWYgb3V0cHV0X3RwX2luaXRCb2R5KHNlbGYpOgotCQlPdXRwdXQoIiVzIGl0c2VsZiA9IE5VTEw7Iiwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRwdXQoImNoYXIgKnJhd2RhdGEgPSBOVUxMOyIpCi0JCU91dHB1dCgiaW50IHJhd2RhdGFsZW4gPSAwOyIpCi0JCU91dHB1dCgiSGFuZGxlIGg7IikKLQkJT3V0cHV0KCJzdGF0aWMgY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCBcInJhd2RhdGFcIiwgMH07IikKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxPJnMjXCIsIGt3LCAlc19Db252ZXJ0LCAmaXRzZWxmLCAmcmF3ZGF0YSwgJnJhd2RhdGFsZW4pKSIsCi0JCQlzZWxmLnByZWZpeCkKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0cHV0KCJpZiAoaXRzZWxmICYmIHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWRcIik7IikKLQkJT3V0cHV0KCJyZXR1cm4gLTE7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoIWl0c2VsZiAmJiAhcmF3ZGF0YSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkXCIpOyIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiaWYgKHJhd2RhdGEpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoKGggPSBOZXdIYW5kbGUocmF3ZGF0YWxlbikpID09IE5VTEwpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9Ob01lbW9yeSgpOyIpCi0JCU91dHB1dCgicmV0dXJuIC0xOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiSExvY2soaCk7IikKLQkJT3V0cHV0KCJtZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7IikKLQkJT3V0cHV0KCJIVW5sb2NrKGgpOyIpCi0JCU91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSAoJXMpaDsiLCBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQorICAgICAgICAgICAgICAgICAgICBzaXplID0gR2V0SGFuZGxlU2l6ZSgoSGFuZGxlKXNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICAgICAgICAgIEhMb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgcnYgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgqKEhhbmRsZSlzZWxmLT5vYl9pdHNlbGYsIHNpemUpOworICAgICAgICAgICAgICAgICAgICBIVW5sb2NrKChIYW5kbGUpc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ2OworICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAgIlJhdyBkYXRhIG9mIHRoZSBhbGlhcyBvYmplY3QiCisgICAgICAgICAgICApCisgICAgXQorCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoInZvaWQgKCpvYl9mcmVlaXQpKCVzIHB0cik7Iiwgc2VsZi5pdHNlbGZ0eXBlKQorCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKKworICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorCisgICAgZGVmIG91dHB1dF90cF9uZXdCb2R5KHNlbGYpOgorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpzZWxmOyIpOworICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICgoc2VsZiA9IHR5cGUtPnRwX2FsbG9jKHR5cGUsIDApKSA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIHNlbGY7IikKKworICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiJXMgaXRzZWxmID0gTlVMTDsiLCBzZWxmLml0c2VsZnR5cGUpCisgICAgICAgIE91dHB1dCgiY2hhciAqcmF3ZGF0YSA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpbnQgcmF3ZGF0YWxlbiA9IDA7IikKKyAgICAgICAgT3V0cHV0KCJIYW5kbGUgaDsiKQorICAgICAgICBPdXRwdXQoInN0YXRpYyBjaGFyICprd1tdID0ge1wiaXRzZWxmXCIsIFwicmF3ZGF0YVwiLCAwfTsiKQorICAgICAgICBPdXRwdXQoKQorICAgICAgICBPdXRwdXQoImlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwifE8mcyNcIiwga3csICVzX0NvbnZlcnQsICZpdHNlbGYsICZyYXdkYXRhLCAmcmF3ZGF0YWxlbikpIiwKKyAgICAgICAgICAgICAgICBzZWxmLnByZWZpeCkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmICYmIHJhd2RhdGEpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBcIk9ubHkgb25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG1heSBiZSBzcGVjaWZpZWRcIik7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gLTE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoIWl0c2VsZiAmJiAhcmF3ZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsIFwiT25lIG9mIGl0c2VsZiBvciByYXdkYXRhIG11c3QgYmUgc3BlY2lmaWVkXCIpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKHJhd2RhdGEpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJpZiAoKGggPSBOZXdIYW5kbGUocmF3ZGF0YWxlbikpID09IE5VTEwpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeUVycl9Ob01lbW9yeSgpOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIC0xOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiSExvY2soaCk7IikKKyAgICAgICAgT3V0cHV0KCJtZW1jcHkoKGNoYXIgKikqaCwgcmF3ZGF0YSwgcmF3ZGF0YWxlbik7IikKKyAgICAgICAgT3V0cHV0KCJIVW5sb2NrKGgpOyIpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSAoJXMpaDsiLCBzZWxmLm9iamVjdHR5cGUsIHNlbGYuaXRzZWxmdHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorCiAjIEFsaWFzIG1ldGhvZHMgY29tZSBpbiB0d28gZmxhdm9yczogdGhvc2Ugd2l0aCB0aGUgYWxpYXMgYXMgYXJnMSBhbmQKICMgdGhvc2Ugd2l0aCB0aGUgYWxpYXMgYXMgYXJnIDIuCiBjbGFzcyBBcmcyTWV0aG9kR2VuZXJhdG9yKE9TRXJyTWV0aG9kR2VuZXJhdG9yKToKLQkiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIHNlY29uZCBhcmd1bWVudCIiIgorICAgICIiIlNpbWlsYXIgdG8gTWV0aG9kR2VuZXJhdG9yLCBidXQgaGFzIHNlbGYgYXMgc2Vjb25kIGFyZ3VtZW50IiIiCiAKLQlkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6Ci0JCWFyZ3MwLCBhcmcxLCBhcmdzcmVzdCA9IGFyZ3NbOjFdLCBhcmdzWzFdLCBhcmdzWzI6XQotCQl0MCwgbjAsIG0wID0gYXJnMQotCQlhcmdzID0gYXJnczAgKyBhcmdzcmVzdAotCQlpZiBtMCAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCi0JCXNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCi0JCXNlbGYuYXJndW1lbnRMaXN0Lmluc2VydCgyLCBzZWxmLml0c2VsZikKKyAgICBkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6CisgICAgICAgIGFyZ3MwLCBhcmcxLCBhcmdzcmVzdCA9IGFyZ3NbOjFdLCBhcmdzWzFdLCBhcmdzWzI6XQorICAgICAgICB0MCwgbjAsIG0wID0gYXJnMQorICAgICAgICBhcmdzID0gYXJnczAgKyBhcmdzcmVzdAorICAgICAgICBpZiBtMCAhPSBJbk1vZGU6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCisgICAgICAgIHNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCisgICAgICAgIEZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCisgICAgICAgIHNlbGYuYXJndW1lbnRMaXN0Lmluc2VydCgyLCBzZWxmLml0c2VsZikKIAogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZiwKLQlsb25nbmFtZT1MT05HTU9ETkFNRSkKKyAgICAgICAgbG9uZ25hbWU9TE9OR01PRE5BTUUpCiAKIGZzY2F0YWxvZ2luZm9vYmplY3QgPSBGU0NhdGFsb2dJbmZvRGVmaW5pdGlvbignRlNDYXRhbG9nSW5mbycsICdGU0NhdGFsb2dJbmZvJywgJ0ZTQ2F0YWxvZ0luZm8nKQogZmluZm9vYmplY3QgPSBGSW5mb0RlZmluaXRpb24oJ0ZJbmZvJywgJ0ZJbmZvJywgJ0ZJbmZvJykKQEAgLTc3MCwxMCArNzcwLDEwIEBACiBVSW50MzIgbWF4UGF0aFNpemUgPSBNQVhQQVRITkFNRTsKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogX2VyciA9IEZTUmVmTWFrZVBhdGgoJl9zZWxmLT5vYl9pdHNlbGYsCi0JCQkJCSBwYXRoLAotCQkJCQkgbWF4UGF0aFNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhQYXRoU2l6ZSk7CiBpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOwogX3JlcyA9IFB5X0J1aWxkVmFsdWUoInMiLCBwYXRoKTsKIHJldHVybiBfcmVzOwpAQCAtNzg0LDcgKzc4NCw3IEBACiAKIEZTUmVmX2FzX3BhdGhuYW1lX2JvZHkgPSAiIiIKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIiIpKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIF9yZXMgPSBGU1JlZl9GU1JlZk1ha2VQYXRoKF9zZWxmLCBfYXJncyk7CiByZXR1cm4gX3JlczsKICIiIgpAQCAtNzk3LDExICs3OTcsMTEgQEAKIE9TRXJyIGVycjsKIAogaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogZXJyID0gUHlNYWNfR2V0RnVsbFBhdGhuYW1lKCZfc2VsZi0+b2JfaXRzZWxmLCBzdHJidWYsIHNpemVvZihzdHJidWYpKTsKIGlmICggZXJyICkgewotCVB5TWFjX0Vycm9yKGVycik7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogX3JlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyYnVmKTsKIHJldHVybiBfcmVzOwpAQCAtODEyLDkgKzgxMiw5IEBACiAKIEZTU3BlY19hc190dXBsZV9ib2R5ID0gIiIiCiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSkKLQlyZXR1cm4gTlVMTDsKLV9yZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlzIykiLCBfc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sIF9zZWxmLT5vYl9pdHNlbGYucGFySUQsIAotCQkJCQkmX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzFdLCBfc2VsZi0+b2JfaXRzZWxmLm5hbWVbMF0pOworICAgICAgICByZXR1cm4gTlVMTDsKK19yZXMgPSBQeV9CdWlsZFZhbHVlKCIoaWlzIykiLCBfc2VsZi0+b2JfaXRzZWxmLnZSZWZOdW0sIF9zZWxmLT5vYl9pdHNlbGYucGFySUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9zZWxmLT5vYl9pdHNlbGYubmFtZVsxXSwgX3NlbGYtPm9iX2l0c2VsZi5uYW1lWzBdKTsKIHJldHVybiBfcmVzOwogIiIiCiBmID0gTWFudWFsR2VuZXJhdG9yKCJhc190dXBsZSIsIEZTU3BlY19hc190dXBsZV9ib2R5KQpAQCAtODI1LDEzICs4MjUsMTMgQEAKIFB5T2JqZWN0ICpvYmo7CiAKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8iLCAmb2JqKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBpZiAoUHlTdHJpbmdfQ2hlY2sob2JqKSkgewotCVB5X0lOQ1JFRihvYmopOwotCXJldHVybiBvYmo7CisgICAgICAgIFB5X0lOQ1JFRihvYmopOworICAgICAgICByZXR1cm4gb2JqOwogfQogaWYgKFB5VW5pY29kZV9DaGVjayhvYmopKQotCXJldHVybiBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG9iaiwgInV0ZjgiLCAic3RyaWN0Iik7CisgICAgICAgIHJldHVybiBQeVVuaWNvZGVfQXNFbmNvZGVkU3RyaW5nKG9iaiwgInV0ZjgiLCAic3RyaWN0Iik7CiBfcmVzID0gUHlPYmplY3RfQ2FsbE1ldGhvZChvYmosICJhc19wYXRobmFtZSIsIE5VTEwpOwogcmV0dXJuIF9yZXM7CiAiIiIKQEAgLTg0OSw0ICs4NDksMyBAQAogIyBnZW5lcmF0ZSBvdXRwdXQgKG9wZW4gdGhlIG91dHB1dCBmaWxlIGFzIGxhdGUgYXMgcG9zc2libGUpCiBTZXRPdXRwdXRGaWxlTmFtZShPVVRQVVRGSUxFKQogbW9kdWxlLmdlbmVyYXRlKCkKLQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm0vZm1zY2FuLnB5IGIvTWFjL01vZHVsZXMvZm0vZm1zY2FuLnB5CmluZGV4IDczYWFkM2UuLjMzNGQ1ZWMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZtL2Ztc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9mbS9mbXNjYW4ucHkKQEAgLTEwLDYzICsxMCw2MyBAQAogU0hPUlQgPSAiZm0iCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiRm9udHMuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJGb250cy5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIk91dGxpbmVNZXRyaWNzIiwJIyBUb28gY29tcGxpY2F0ZWQKLQkJCSJBbnRpVGV4dElzQW50aUFsaWFzZWQiLAkjIFhYWFggTWlzc2luZyBmcm9tIGxpYnJhcnkuLi4KLQkJCSJBbnRpVGV4dEdldEVuYWJsZWQiLAotCQkJIkFudGlUZXh0U2V0RW5hYmxlZCIsCi0JCQkiQW50aVRleHRHZXRBcHBsaWNhdGlvbkF3YXJlIiwKLQkJCSJBbnRpVGV4dFNldEFwcGxpY2F0aW9uQXdhcmUiLAotCQkJIyBUaGVzZSBhcmUgdHJpY2t5OiB0aGV5J3JlIG5vdCBDYXJib24gZGVwZW5kZW50IG9yIGFueXRoaW5nLCBidXQgdGhleQotCQkJIyBleGlzdCBvbmx5IG9uIDguNiBvciBsYXRlciAoYm90aCBpbiBDYXJib24gYW5kIENsYXNzaWMpLgotCQkJIyBEaXNhYmxpbmcgdGhlbSBpcyB0aGUgZWFzaWVzdCBwYXRoLgotCQkJJ1NldEFudGlBbGlhc2VkVGV4dEVuYWJsZWQnLAotCQkJJ0lzQW50aUFsaWFzZWRUZXh0RW5hYmxlZCcsCi0JCQkjIE9TOC1vbmx5Ci0JCQknSW5pdEZvbnRzJywKLQkJCSdTZXRGb250TG9jaycsCi0JCQknRmx1c2hGb250cycsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiT3V0bGluZU1ldHJpY3MiLCAgICAgICAjIFRvbyBjb21wbGljYXRlZAorICAgICAgICAgICAgICAgICJBbnRpVGV4dElzQW50aUFsaWFzZWQiLCAgICAgICAgIyBYWFhYIE1pc3NpbmcgZnJvbSBsaWJyYXJ5Li4uCisgICAgICAgICAgICAgICAgIkFudGlUZXh0R2V0RW5hYmxlZCIsCisgICAgICAgICAgICAgICAgIkFudGlUZXh0U2V0RW5hYmxlZCIsCisgICAgICAgICAgICAgICAgIkFudGlUZXh0R2V0QXBwbGljYXRpb25Bd2FyZSIsCisgICAgICAgICAgICAgICAgIkFudGlUZXh0U2V0QXBwbGljYXRpb25Bd2FyZSIsCisgICAgICAgICAgICAgICAgIyBUaGVzZSBhcmUgdHJpY2t5OiB0aGV5J3JlIG5vdCBDYXJib24gZGVwZW5kZW50IG9yIGFueXRoaW5nLCBidXQgdGhleQorICAgICAgICAgICAgICAgICMgZXhpc3Qgb25seSBvbiA4LjYgb3IgbGF0ZXIgKGJvdGggaW4gQ2FyYm9uIGFuZCBDbGFzc2ljKS4KKyAgICAgICAgICAgICAgICAjIERpc2FibGluZyB0aGVtIGlzIHRoZSBlYXNpZXN0IHBhdGguCisgICAgICAgICAgICAgICAgJ1NldEFudGlBbGlhc2VkVGV4dEVuYWJsZWQnLAorICAgICAgICAgICAgICAgICdJc0FudGlBbGlhc2VkVGV4dEVuYWJsZWQnLAorICAgICAgICAgICAgICAgICMgT1M4LW9ubHkKKyAgICAgICAgICAgICAgICAnSW5pdEZvbnRzJywKKyAgICAgICAgICAgICAgICAnU2V0Rm9udExvY2snLAorICAgICAgICAgICAgICAgICdGbHVzaEZvbnRzJywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkZNSW5wdXRfcHRyIiwJIyBOb3QgbmVlZGVkIGZvciBub3cKLQkJCSJGTU91dFB0ciIsCQkjIERpdHRvCi0jIwkJCSJ2b2lkX3B0ciIsCQkjIERvbid0IGtub3cgaG93IHRvIGRvIHRoaXMgcmlnaHQgbm93Ci0JCQkiRm9udEluZm8iLAkJIyBEaXR0bwotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkZNSW5wdXRfcHRyIiwgICMgTm90IG5lZWRlZCBmb3Igbm93CisgICAgICAgICAgICAgICAgIkZNT3V0UHRyIiwgICAgICAgICAgICAgIyBEaXR0bworIyMgICAgICAgICAgICAgICAgICAgICAgInZvaWRfcHRyIiwgICAgICAgICAgICAgIyBEb24ndCBrbm93IGhvdyB0byBkbyB0aGlzIHJpZ2h0IG5vdworICAgICAgICAgICAgICAgICJGb250SW5mbyIsICAgICAgICAgICAgICMgRGl0dG8KKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCShbKCdTdHIyNTUnLCAnKicsICdJbk1vZGUnKV0sIFsoJ1N0cjI1NScsICcqJywgJ091dE1vZGUnKV0pLAotCQkJKFsoJ0ZNZXRyaWNSZWNQdHInLCAndGhlTWV0cmljcycsICdJbk1vZGUnKV0sIFsoJ0ZNZXRyaWNSZWNQdHInLCAndGhlTWV0cmljcycsICdPdXRNb2RlJyldKSwKLQkJCShbKCdzaG9ydCcsICdieXRlQ291bnQnLCAnSW5Nb2RlJyksICgndm9pZF9wdHInLCAndGV4dEFkZHInLCAnSW5Nb2RlJyksXSwKLQkJCSBbKCdUZXh0QnVmZmVyJywgJ2luVGV4dCcsICdJbk1vZGUnKV0pLAotCQkJXQotCQkJCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtOaWxPcHRpb25zID0gMFxuIikKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygnU3RyMjU1JywgJyonLCAnSW5Nb2RlJyldLCBbKCdTdHIyNTUnLCAnKicsICdPdXRNb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoWygnRk1ldHJpY1JlY1B0cicsICd0aGVNZXRyaWNzJywgJ0luTW9kZScpXSwgWygnRk1ldHJpY1JlY1B0cicsICd0aGVNZXRyaWNzJywgJ091dE1vZGUnKV0pLAorICAgICAgICAgICAgICAgIChbKCdzaG9ydCcsICdieXRlQ291bnQnLCAnSW5Nb2RlJyksICgndm9pZF9wdHInLCAndGV4dEFkZHInLCAnSW5Nb2RlJyksXSwKKyAgICAgICAgICAgICAgICAgWygnVGV4dEJ1ZmZlcicsICdpblRleHQnLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia05pbE9wdGlvbnMgPSAwXG4iKQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvZm0vZm1zdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvZm0vZm1zdXBwb3J0LnB5CmluZGV4IDA3Yjk0NGUuLmU2OTIwNTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2ZtL2Ztc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9mbS9mbXN1cHBvcnQucHkKQEAgLTYsMjEgKzYsMjEgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdGb250cy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX0ZtJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK01BQ0hFQURFUkZJTEUgPSAnRm9udHMuaCcgICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfRm0nICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnRm0nCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ0ZtJyAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKICMgQ3JlYXRlIHRoZSB0eXBlIG9iamVjdHMKIAogY2xhc3MgUmV2VmFySW5wdXRCdWZmZXJUeXBlKFZhcklucHV0QnVmZmVyVHlwZSk6Ci0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICIlc19fbGVuX18sICVzX19pbl9fIiAlIChuYW1lLCBuYW1lKQorICAgIGRlZiBwYXNzSW5wdXQoc2VsZiwgbmFtZSk6CisgICAgICAgIHJldHVybiAiJXNfX2xlbl9fLCAlc19faW5fXyIgJSAobmFtZSwgbmFtZSkKIAogVGV4dEJ1ZmZlciA9IFJldlZhcklucHV0QnVmZmVyVHlwZSgpCiAKQEAgLTM2LDEyICszNiwxMiBAQAogRk1SZWNfTmV3KEZNZXRyaWNSZWMgKml0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJk8mIiwgCi0JCVB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+YXNjZW50LAotCQlQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmRlc2NlbnQsCi0JCVB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+bGVhZGluZywKLQkJUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT53aWRNYXgsCi0JCVJlc09ial9OZXcsIGl0c2VsZi0+d1RhYkhhbmRsZSk7CisgICAgICAgIHJldHVybiBQeV9CdWlsZFZhbHVlKCJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmFzY2VudCwKKyAgICAgICAgICAgICAgICBQeU1hY19CdWlsZEZpeGVkLCBpdHNlbGYtPmRlc2NlbnQsCisgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRGaXhlZCwgaXRzZWxmLT5sZWFkaW5nLAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkRml4ZWQsIGl0c2VsZi0+d2lkTWF4LAorICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGl0c2VsZi0+d1RhYkhhbmRsZSk7CiB9CiAKICNpZiAwCkBAIC00OSwxMiArNDksMTIgQEAKIHN0YXRpYyBpbnQKIEZNUmVjX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZNZXRyaWNSZWMgKnBfaXRzZWxmKQogewotCXJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZPJk8mIiwKLQkJUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmFzY2VudCwKLQkJUHlNYWNfR2V0Rml4ZWQsICZpdHNlbGYtPmRlc2NlbnQsCi0JCVB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5sZWFkaW5nLAotCQlQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+d2lkTWF4LAotCQlSZXNPYmpfQ29udmVydCwgJml0c2VsZi0+d1RhYkhhbmRsZSk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZVR1cGxlKHYsICJPJk8mTyZPJk8mIiwKKyAgICAgICAgICAgICAgICBQeU1hY19HZXRGaXhlZCwgJml0c2VsZi0+YXNjZW50LAorICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5kZXNjZW50LAorICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT5sZWFkaW5nLAorICAgICAgICAgICAgICAgIFB5TWFjX0dldEZpeGVkLCAmaXRzZWxmLT53aWRNYXgsCisgICAgICAgICAgICAgICAgUmVzT2JqX0NvbnZlcnQsICZpdHNlbGYtPndUYWJIYW5kbGUpOwogfQogI2VuZGlmCiAKQEAgLTc5LDQgKzc5LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZvbGRlci9mb2xkZXJzY2FuLnB5IGIvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnNjYW4ucHkKaW5kZXggMzliNWEwNS4uOGM5NDg5MyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnNjYW4ucHkKQEAgLTExLDU4ICsxMSw1OCBAQAogT0JKRUNUID0gIk5PVFVTRUQiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9IExPTkcgKyAiLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJGaW5kRm9sZGVyRXh0ZW5kZWQiLCAjIEhhcyBmdW5ueSB2b2lkKiBhcmd1bWVudAotCQkJIkZTRmluZEZvbGRlckV4dGVuZGVkIiwgIyBkaXR0bwotCQkJIkZvbGRlck1hbmFnZXJSZWdpc3RlckNhbGxOb3RpZmljYXRpb25Qcm9jcyIsICMgZGl0dG8KLQkJCQotCQkJIkZpbmRGb2xkZXJFeCIsICMgTm9uLU1hY09TIHJvdXRpbmUKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJGaW5kRm9sZGVyRXh0ZW5kZWQiLCAjIEhhcyBmdW5ueSB2b2lkKiBhcmd1bWVudAorICAgICAgICAgICAgICAgICJGU0ZpbmRGb2xkZXJFeHRlbmRlZCIsICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiRm9sZGVyTWFuYWdlclJlZ2lzdGVyQ2FsbE5vdGlmaWNhdGlvblByb2NzIiwgIyBkaXR0bwogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJGb2xkZXJNYW5hZ2VyTm90aWZpY2F0aW9uUHJvY1B0ciIsCi0JCQkiRm9sZGVyTWFuYWdlck5vdGlmaWNhdGlvblVQUCIsCi0JCQkiRm9sZGVyUm91dGluZyIsICMgVG8gYmUgZG9uZSwgbm90IGRpZmZpY3VsdAotCQkJIkZvbGRlckRlc2MiLCAjIFRvIGJlIGRvbmUsIG5vdCBkaWZmaWN1bHQKLQkJCQotCQkJXQorICAgICAgICAgICAgICAgICJGaW5kRm9sZGVyRXgiLCAjIE5vbi1NYWNPUyByb3V0aW5lCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCi0gICAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgidHJ1ZSA9IFRydWVcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZhbHNlID0gRmFsc2VcbiIpCi0JCQkKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJGb2xkZXJNYW5hZ2VyTm90aWZpY2F0aW9uUHJvY1B0ciIsCisgICAgICAgICAgICAgICAgIkZvbGRlck1hbmFnZXJOb3RpZmljYXRpb25VUFAiLAorICAgICAgICAgICAgICAgICJGb2xkZXJSb3V0aW5nIiwgIyBUbyBiZSBkb25lLCBub3QgZGlmZmljdWx0CisgICAgICAgICAgICAgICAgIkZvbGRlckRlc2MiLCAjIFRvIGJlIGRvbmUsIG5vdCBkaWZmaWN1bHQKKworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ0cnVlID0gVHJ1ZVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZmFsc2UgPSBGYWxzZVxuIikKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ZvbGRlci9mb2xkZXJzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnN1cHBvcnQucHkKaW5kZXggYjkyNDYxNS4uYjliNjRiZiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvZm9sZGVyL2ZvbGRlcnN1cHBvcnQucHkKQEAgLTYsMTMgKzYsMTMgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdGb2xkZXJzLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfRm9sZGVyJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK01BQ0hFQURFUkZJTEUgPSAnRm9sZGVycy5oJyAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfRm9sZGVyJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdGb2xkZXInCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ0ZvbGRlcicgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTU0LDQgKzU0LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2hlbHAvaGVscHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9oZWxwL2hlbHBzY2FuLnB5CmluZGV4IDMyYTc1OWEuLjUwZTA5MTkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2hlbHAvaGVscHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvaGVscC9oZWxwc2Nhbi5weQpAQCAtMTEsNTcgKzExLDU3IEBACiBPQkpFQ1QgPSAiTk9UVVNFRCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCSMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQotCQkJaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0ID09IE9CSkVDVCBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotIyMJCQkiVGlwRnVuY3Rpb25VUFAiLAotIyMJCQkiSE1NZXNzYWdlUmVjb3JkIiwKLSMjCQkJIkhNTWVzc2FnZVJlY29yZF9wdHIiLAotCQkJIkhNV2luZG93Q29udGVudFVQUCIsCi0JCQkiSE1NZW51VGl0bGVDb250ZW50VVBQIiwKLQkJCSJITUNvbnRyb2xDb250ZW50VVBQIiwKLQkJCSJITU1lbnVJdGVtQ29udGVudFVQUCIsCi0JCQkjIEZvciB0aGUgbW9tZW50Ci0JCQkiSE1IZWxwQ29udGVudFJlYyIsCi0JCQkiSE1IZWxwQ29udGVudFJlY19wdHIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisjIyAgICAgICAgICAgICAgICAgICAgICAiVGlwRnVuY3Rpb25VUFAiLAorIyMgICAgICAgICAgICAgICAgICAgICAgIkhNTWVzc2FnZVJlY29yZCIsCisjIyAgICAgICAgICAgICAgICAgICAgICAiSE1NZXNzYWdlUmVjb3JkX3B0ciIsCisgICAgICAgICAgICAgICAgIkhNV2luZG93Q29udGVudFVQUCIsCisgICAgICAgICAgICAgICAgIkhNTWVudVRpdGxlQ29udGVudFVQUCIsCisgICAgICAgICAgICAgICAgIkhNQ29udHJvbENvbnRlbnRVUFAiLAorICAgICAgICAgICAgICAgICJITU1lbnVJdGVtQ29udGVudFVQUCIsCisgICAgICAgICAgICAgICAgIyBGb3IgdGhlIG1vbWVudAorICAgICAgICAgICAgICAgICJITUhlbHBDb250ZW50UmVjIiwKKyAgICAgICAgICAgICAgICAiSE1IZWxwQ29udGVudFJlY19wdHIiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotIyMJCQkoWygiV2luZG93UHRyIiwgIioiLCAiT3V0TW9kZSIpXSwKLSMjCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQldCi0JCQkKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyMjICAgICAgICAgICAgICAgICAgICAgIChbKCJXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIildLAorIyMgICAgICAgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaGVscC9oZWxwc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2hlbHAvaGVscHN1cHBvcnQucHkKaW5kZXggYTYzMDYwMy4uNzdmNWMyZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaGVscC9oZWxwc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9oZWxwL2hlbHBzdXBwb3J0LnB5CkBAIC02LDE2ICs2LDE2IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1PRE5BTUUgPSAnX0hlbHAnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdVTlVTRUQnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKLUtJTkQgPSAnUmVjb3JkJwkJCQkjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKK01PRE5BTUUgPSAnX0hlbHAnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdVTlVTRUQnICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJ1JlY29yZCcgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdIZWxwJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORAkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdIZWxwJyAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC00MCwxNyArNDAsMTcgQEAKICIiIgogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFdpbmRvd09iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXQoIiIiCi0JCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkJaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQotCQkiIiIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dCgiIiIKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9CisgICAgICAgICIiIikKIAogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCkBAIC03Niw0ICs3NiwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9JQkNhcmJvbnNjYW4ucHkgYi9NYWMvTW9kdWxlcy9pYmNhcmJvbi9JQkNhcmJvbnNjYW4ucHkKaW5kZXggMWYwNTIxNy4uODRlNGYxZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaWJjYXJib24vSUJDYXJib25zY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc2Nhbi5weQpAQCAtMTAsNDAgKzEwLDQwIEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcl9PU1gKIAogZGVmIG1haW4oKToKLQlwcmludCAiLS0tU2Nhbm5pbmcgSUJDYXJib25SdW50aW1lLmgtLS0iCi0JaW5wdXQgPSBbIklCQ2FyYm9uUnVudGltZS5oIl0KLQlvdXRwdXQgPSAiSUJDYXJib25nZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiSUJDYXJib25SdW50aW1lLnB5IgotCXNjYW5uZXIgPSBJQkNhcmJvbl9TY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiLS1kb25lIHNjYW5uaW5nLCBpbXBvcnRpbmctLSIKLQlpbXBvcnQgSUJDYXJib25zdXBwb3J0Ci0JcHJpbnQgImRvbmUiCisgICAgcHJpbnQgIi0tLVNjYW5uaW5nIElCQ2FyYm9uUnVudGltZS5oLS0tIgorICAgIGlucHV0ID0gWyJJQkNhcmJvblJ1bnRpbWUuaCJdCisgICAgb3V0cHV0ID0gIklCQ2FyYm9uZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIklCQ2FyYm9uUnVudGltZS5weSIKKyAgICBzY2FubmVyID0gSUJDYXJib25fU2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIi0tZG9uZSBzY2FubmluZywgaW1wb3J0aW5nLS0iCisgICAgaW1wb3J0IElCQ2FyYm9uc3VwcG9ydAorICAgIHByaW50ICJkb25lIgogCiBjbGFzcyBJQkNhcmJvbl9TY2FubmVyKFNjYW5uZXJfT1NYKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIklCQ2FyYm9uRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0ID09ICJJQk5pYlJlZiIgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIklCQ2FyYm9uTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiSUJDYXJib25GdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgPT0gIklCTmliUmVmIiBhbmQgbSA9PSAiSW5Nb2RlIjoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiSUJDYXJib25NZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiRGlzcG9zZU5pYlJlZmVyZW5jZSIsCQkJCSMgdGFrZW4gY2FyZSBvZiBieSBkZXN0cnVjdG9yCi0JCQkiQ3JlYXRlTmliUmVmZXJlbmNlV2l0aENGQnVuZGxlIiwgICMjIG5lZWQgdG8gd3JhcCBDRkJ1bmRsZS5oIHByb3Blcmx5IGZpcnN0Ci0JCQldCi0JCQkKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFtdCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiRGlzcG9zZU5pYlJlZmVyZW5jZSIsICAgICAgICAgICAgICAgICAgICAgICAgICAjIHRha2VuIGNhcmUgb2YgYnkgZGVzdHJ1Y3RvcgorICAgICAgICAgICAgICAgICJDcmVhdGVOaWJSZWZlcmVuY2VXaXRoQ0ZCdW5kbGUiLCAgIyMgbmVlZCB0byB3cmFwIENGQnVuZGxlLmggcHJvcGVybHkgZmlyc3QKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFtdCiAKIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2liY2FyYm9uL0lCQ2FyYm9uc3VwcG9ydC5weQppbmRleCA1ZDA3YmUxLi41ZjQxMzI4IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pYmNhcmJvbi9JQkNhcmJvbnN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvaWJjYXJib24vSUJDYXJib25zdXBwb3J0LnB5CkBAIC0yNSwxMiArMjUsMTIgQEAKIG1vZHVsZSA9IE1hY01vZHVsZSgnX0lCQ2FyYm9uJywgJ0lCQ2FyYm9uJywgaW5jbHVkZXN0dWZmLCBmaW5hbHN0dWZmLCBpbml0c3R1ZmYpCiAKIGNsYXNzIENGUmVsZWFzZXJPYmplY3QoUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgbmFtZSk6Ci0JCU91dHB1dCgiQ0ZSZWxlYXNlKCVzKTsiICUgbmFtZSkKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIkNGUmVsZWFzZSglcyk7IiAlIG5hbWUpCiAKIGNsYXNzIENGTmliRGVzYyhQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCJEaXNwb3NlTmliUmVmZXJlbmNlKCVzKTsiICUgbmFtZSkKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIkRpc3Bvc2VOaWJSZWZlcmVuY2UoJXMpOyIgJSBuYW1lKQogCiAjY2ZzdHJpbmdvYmplY3QgPSBDRlJlbGVhc2VyT2JqZWN0KCJDRlN0cmluZ1JlZiIpCiAjbW9kdWxlLmFkZG9iamVjdChjZnN0cmluZ29iamVjdCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2ljbi9pY25zY2FuLnB5IGIvTWFjL01vZHVsZXMvaWNuL2ljbnNjYW4ucHkKaW5kZXggYzZhMzlmMy4uYmRjM2I4NCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvaWNuL2ljbnNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvaWNuL2ljbnNjYW4ucHkKQEAgLTExLDYyICsxMSw2MiBAQAogT0JKRUNUID0gIk5PVFVTRUQiCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSBMT05HICsgIi5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gTE9ORyArICIuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJHZXRJY29uQ2FjaGVEYXRhIiwKLQkJCSJTZXRJY29uQ2FjaGVEYXRhIiwKLQkJCSMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKLQkJCSJrU2VsZWN0b3JBbGxIdWdlRGF0YSIsCi0JCQkia1NlbGVjdG9yQWxsQXZhaWxhYmxlRGF0YSIsCi0JCQkic3ZBbGxBdmFpbGFibGVEYXRhIiwKLQkJCSMgU29tZXRoaW5nIGluIGEgY29tbWVudCBhY2NpZGVudGFsbHkgc2VlbiBhcyBhIGNvbnN0IGRlZmluaXRpb24KLQkJCSJlcnIiLAotCQkJIyBPUzggb25seQotCQkJJ0ljb25TZXJ2aWNlc1Rlcm1pbmF0ZScsCi0JCQkjIExhenksIHJpZ2h0IG5vdy4KLQkJCSJHZXRJY29uUmVmRnJvbUZpbGVJbmZvIgotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkdldEljb25DYWNoZURhdGEiLAorICAgICAgICAgICAgICAgICJTZXRJY29uQ2FjaGVEYXRhIiwKKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgImtTZWxlY3RvckFsbEh1Z2VEYXRhIiwKKyAgICAgICAgICAgICAgICAia1NlbGVjdG9yQWxsQXZhaWxhYmxlRGF0YSIsCisgICAgICAgICAgICAgICAgInN2QWxsQXZhaWxhYmxlRGF0YSIsCisgICAgICAgICAgICAgICAgIyBTb21ldGhpbmcgaW4gYSBjb21tZW50IGFjY2lkZW50YWxseSBzZWVuIGFzIGEgY29uc3QgZGVmaW5pdGlvbgorICAgICAgICAgICAgICAgICJlcnIiLAorICAgICAgICAgICAgICAgICMgT1M4IG9ubHkKKyAgICAgICAgICAgICAgICAnSWNvblNlcnZpY2VzVGVybWluYXRlJywKKyAgICAgICAgICAgICAgICAjIExhenksIHJpZ2h0IG5vdy4KKyAgICAgICAgICAgICAgICAiR2V0SWNvblJlZkZyb21GaWxlSW5mbyIKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIkljb25BY3Rpb25VUFAiLAotCQkJIkljb25HZXR0ZXJVUFAiLAotCQkJIkNGcmFnSW5pdEJsb2NrUHRyIiwKLQkJCSJDR1JlY3RfcHRyIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJJY29uQWN0aW9uVVBQIiwKKyAgICAgICAgICAgICAgICAiSWNvbkdldHRlclVQUCIsCisgICAgICAgICAgICAgICAgIkNGcmFnSW5pdEJsb2NrUHRyIiwKKyAgICAgICAgICAgICAgICAiQ0dSZWN0X3B0ciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQldCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCAqXG4iKQotCQkJCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCAqXG4iKQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvaWNuL2ljbnN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9pY24vaWNuc3VwcG9ydC5weQppbmRleCBlZjFkYmYzLi4xYjE1Mzg1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9pY24vaWNuc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9pY24vaWNuc3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ0ljb25zLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfSWNuJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnSWNvbicJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdIYW5kbGUnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTUFDSEVBREVSRklMRSA9ICdJY29ucy5oJyAgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19JY24nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnSWNvbicgICAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorS0lORCA9ICdIYW5kbGUnICAgICAgICAgICAgICAgICAgICAgICAgICMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJwogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnSWNuJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgS0lORAkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdJY24nICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQgICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC01MiwxNyArNTIsMTcgQEAKICIiIgogCiBjbGFzcyBNeU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRMYnJhY2UoImlmIChEbGdPYmpfQ2hlY2sodikpIikKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFdpbmRvd09iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXQoIiIiCi0JCWlmICh2ID09IFB5X05vbmUpIHsgKnBfaXRzZWxmID0gTlVMTDsgcmV0dXJuIDE7IH0KLQkJaWYgKFB5SW50X0NoZWNrKHYpKSB7ICpwX2l0c2VsZiA9IChXaW5kb3dQdHIpUHlJbnRfQXNMb25nKHYpOyByZXR1cm4gMTsgfQotCQkiIiIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dCgiIiIKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorICAgICAgICBpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9CisgICAgICAgICIiIikKIAogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCkBAIC04OCw0ICs4OCwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvbGF1bmNoc2Nhbi5weSBiL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzY2FuLnB5CmluZGV4IGJkZGExZGUuLjYyMTAzM2IgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzY2FuLnB5CkBAIC0xMSw3NiArMTEsNzYgQEAKIE9CSkVDVCA9ICJOT1RVU0VEIgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gTE9ORyArICIuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICMgVGhpcyBpcyBub24tZnVuY3Rpb25hbCB0b2RheQorICAgICAgICAgICAgaWYgdCA9PSBPQkpFQ1QgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkZpbGVzIGltcG9ydCAqXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNSZXF1ZXN0QWxsSW5mbyA9IC0xXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNSb2xlc0FsbCA9IC0xXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNVbmtub3duVHlwZSA9IEZPVVJfQ0hBUl9DT0RFKCdcXDBcXDBcXDBcXDAnKVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTVW5rbm93bkNyZWF0b3IgPSBGT1VSX0NIQVJfQ09ERSgnXFwwXFwwXFwwXFwwJylcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU0ludmFsaWRFeHRlbnNpb25JbmRleCA9IC0xXG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmcm9tIENhcmJvbi5GaWxlcyBpbXBvcnQgKlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTUmVxdWVzdEFsbEluZm8gPSAtMVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTUm9sZXNBbGwgPSAtMVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia0xTVW5rbm93blR5cGUgPSBGT1VSX0NIQVJfQ09ERSgnXFwwXFwwXFwwXFwwJylcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtMU1Vua25vd25DcmVhdG9yID0gRk9VUl9DSEFSX0NPREUoJ1xcMFxcMFxcMFxcMCcpXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrTFNJbnZhbGlkRXh0ZW5zaW9uSW5kZXggPSAtMVxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiTFNJbml0IiwKLQkJCSJMU1Rlcm0iLAotCQkJImtMU1JlcXVlc3RBbGxJbmZvIiwKLQkJCSJrTFNSb2xlc0FsbCIsCi0JCQkia0xTSW52YWxpZEV4dGVuc2lvbkluZGV4IiwKLQkJCSJrTFNVbmtub3duVHlwZSIsCi0JCQkia0xTVW5rbm93bkNyZWF0b3IiCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiTFNJbml0IiwKKyAgICAgICAgICAgICAgICAiTFNUZXJtIiwKKyAgICAgICAgICAgICAgICAia0xTUmVxdWVzdEFsbEluZm8iLAorICAgICAgICAgICAgICAgICJrTFNSb2xlc0FsbCIsCisgICAgICAgICAgICAgICAgImtMU0ludmFsaWRFeHRlbnNpb25JbmRleCIsCisgICAgICAgICAgICAgICAgImtMU1Vua25vd25UeXBlIiwKKyAgICAgICAgICAgICAgICAia0xTVW5rbm93bkNyZWF0b3IiCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJMU0xhdW5jaEZTUmVmU3BlY19wdHIiLAotCQkJIkxTTGF1bmNoVVJMU3BlY19wdHIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkxTTGF1bmNoRlNSZWZTcGVjX3B0ciIsCisgICAgICAgICAgICAgICAgIkxTTGF1bmNoVVJMU3BlY19wdHIiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIyBMU0dldEFwcGxpY2F0aW9uRm9ySW5mbwotCQkJKFsoJ0NGU3RyaW5nUmVmJywgJ2luRXh0ZW5zaW9uJywgJ0luTW9kZScpXSwKLSAgICAJCSBbKCdPcHRDRlN0cmluZ1JlZicsICdpbkV4dGVuc2lvbicsICdJbk1vZGUnKV0pLAotICAgIAkJIAotCQkJIyBMU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8KLQkJCShbKCdDRlN0cmluZ1JlZicsICdpbkJ1bmRsZUlEJywgJ0luTW9kZScpXSwKLSAgICAJCSBbKCdPcHRDRlN0cmluZ1JlZicsICdpbkJ1bmRsZUlEJywgJ0luTW9kZScpXSksCi0JCQkoWygnQ0ZTdHJpbmdSZWYnLCAnaW5OYW1lJywgJ0luTW9kZScpXSwKLSAgICAJCSBbKCdPcHRDRlN0cmluZ1JlZicsICdpbk5hbWUnLCAnSW5Nb2RlJyldKSwKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAjIExTR2V0QXBwbGljYXRpb25Gb3JJbmZvCisgICAgICAgICAgICAgICAgKFsoJ0NGU3RyaW5nUmVmJywgJ2luRXh0ZW5zaW9uJywgJ0luTW9kZScpXSwKKyAgICAgICAgIFsoJ09wdENGU3RyaW5nUmVmJywgJ2luRXh0ZW5zaW9uJywgJ0luTW9kZScpXSksCiAKLQkJCSMgVW5pY29kZSBmaWxlbmFtZXMgcGFzc2VkIGFzIGxlbmd0aCwgYnVmZmVyLiBMU0dldEV4dGVuc2lvbkluZm8KLQkJCShbKCdVbmlDaGFyQ291bnQnLCAnKicsICdJbk1vZGUnKSwKLQkJCSAgKCdVbmlDaGFyX3B0cicsICcqJywgJ0luTW9kZScpXSwKLQkJCSBbKCdVbmljb2RlUmV2ZXJzZUluQnVmZmVyJywgJyonLCAnSW5Nb2RlJyldCi0JCQkpLAotCQkJXQotCQkJCisgICAgICAgICAgICAgICAgIyBMU0ZpbmRBcHBsaWNhdGlvbkZvckluZm8KKyAgICAgICAgICAgICAgICAoWygnQ0ZTdHJpbmdSZWYnLCAnaW5CdW5kbGVJRCcsICdJbk1vZGUnKV0sCisgICAgICAgICBbKCdPcHRDRlN0cmluZ1JlZicsICdpbkJ1bmRsZUlEJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgKFsoJ0NGU3RyaW5nUmVmJywgJ2luTmFtZScsICdJbk1vZGUnKV0sCisgICAgICAgICBbKCdPcHRDRlN0cmluZ1JlZicsICdpbk5hbWUnLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgVW5pY29kZSBmaWxlbmFtZXMgcGFzc2VkIGFzIGxlbmd0aCwgYnVmZmVyLiBMU0dldEV4dGVuc2lvbkluZm8KKyAgICAgICAgICAgICAgICAoWygnVW5pQ2hhckNvdW50JywgJyonLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAoJ1VuaUNoYXJfcHRyJywgJyonLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdVbmljb2RlUmV2ZXJzZUluQnVmZmVyJywgJyonLCAnSW5Nb2RlJyldCisgICAgICAgICAgICAgICAgKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvbGF1bmNoc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzdXBwb3J0LnB5CmluZGV4IDEyMjI3OGMuLjM0YzJlZmIgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9sYXVuY2hzdXBwb3J0LnB5CkBAIC02LDE2ICs2LDE2IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1PRE5BTUUgPSAnX0xhdW5jaCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ1VOVVNFRCcJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdSZWNvcmQnCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTU9ETkFNRSA9ICdfTGF1bmNoJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitPQkpFQ1ROQU1FID0gJ1VOVVNFRCcgICAgICAgICAgICAgICAgICAgIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK0tJTkQgPSAnUmVjb3JkJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ0xhdW5jaCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArIEtJTkQJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnTGF1bmNoJyAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyBLSU5EICAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNDEsMjEgKzQxLDIxIEBACiBzdGF0aWMgaW50CiBPcHRDRlN0cmluZ1JlZk9ial9Db252ZXJ0KFB5T2JqZWN0ICp2LCBDRlN0cmluZ1JlZiAqc3BlYykKIHsKLQlpZiAodiA9PSBQeV9Ob25lKSB7Ci0JCSpzcGVjID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCXJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOworICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7CisgICAgICAgICAgICAgICAgKnNwZWMgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9Db252ZXJ0KHYsIHNwZWMpOwogfQogCiBQeU9iamVjdCAqCiBPcHRDRlN0cmluZ1JlZk9ial9OZXcoQ0ZTdHJpbmdSZWYgaXQpCiB7Ci0JaWYgKGl0ID09IE5VTEwpIHsKLQkJUHlfSU5DUkVGKFB5X05vbmUpOwotCQlyZXR1cm4gUHlfTm9uZTsKLQl9Ci0JcmV0dXJuIENGU3RyaW5nUmVmT2JqX05ldyhpdCk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBDRlN0cmluZ1JlZk9ial9OZXcoaXQpOwogfQogCiAvKgpAQCAtNjQsMTMgKzY0LDEzIEBACiBQeU9iamVjdCAqCiBMU0l0ZW1JbmZvUmVjb3JkX05ldyhMU0l0ZW1JbmZvUmVjb3JkICppdCkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgie3M6aXM6TyZzOk8mczpPJnM6TyZzOml9IiwgCi0JCSJmbGFncyIsIGl0LT5mbGFncywKLQkJImZpbGV0eXBlIiwgUHlNYWNfQnVpbGRPU1R5cGUsIGl0LT5maWxldHlwZSwKLQkJImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCi0JCSJleHRlbnNpb24iLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5leHRlbnNpb24sCi0JCSJpY29uRmlsZU5hbWUiLCBPcHRDRlN0cmluZ1JlZk9ial9OZXcsIGl0LT5pY29uRmlsZU5hbWUsCi0JCSJraW5kSUQiLCBpdC0+a2luZElEKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIntzOmlzOk8mczpPJnM6TyZzOk8mczppfSIsCisgICAgICAgICAgICAgICAgImZsYWdzIiwgaXQtPmZsYWdzLAorICAgICAgICAgICAgICAgICJmaWxldHlwZSIsIFB5TWFjX0J1aWxkT1NUeXBlLCBpdC0+ZmlsZXR5cGUsCisgICAgICAgICAgICAgICAgImNyZWF0b3IiLCBQeU1hY19CdWlsZE9TVHlwZSwgaXQtPmNyZWF0b3IsCisgICAgICAgICAgICAgICAgImV4dGVuc2lvbiIsIE9wdENGU3RyaW5nUmVmT2JqX05ldywgaXQtPmV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAiaWNvbkZpbGVOYW1lIiwgT3B0Q0ZTdHJpbmdSZWZPYmpfTmV3LCBpdC0+aWNvbkZpbGVOYW1lLAorICAgICAgICAgICAgICAgICJraW5kSUQiLCBpdC0+a2luZElEKTsKIH0KICIiIgogCkBAIC05OSw0ICs5OSwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9sYXVuY2gvc2V0dXAucHkgYi9NYWMvTW9kdWxlcy9sYXVuY2gvc2V0dXAucHkKaW5kZXggY2NmOGVlNy4uMjA1NDE5NSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvbGF1bmNoL3NldHVwLnB5CisrKyBiL01hYy9Nb2R1bGVzL2xhdW5jaC9zZXR1cC5weQpAQCAtNCwxMCArNCwxMCBAQAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uLCBzZXR1cAogCiBzZXR1cChuYW1lPSJMYXVuY2hTZXJ2aWNlcyIsIHZlcnNpb249IjAuMiIsCi0JZXh0X21vZHVsZXM9WwotCQlFeHRlbnNpb24oJ19MYXVuY2gnLCBbJ19MYXVuY2htb2R1bGUuYyddLAotCQlleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0FwcGxpY2F0aW9uU2VydmljZXMnXSkKLQldLAotCXB5X21vZHVsZXM9WydMYXVuY2hTZXJ2aWNlcy5MYXVuY2gnLCAnTGF1bmNoU2VydmljZXMuTGF1bmNoU2VydmljZXMnXSwKLQlwYWNrYWdlX2Rpcj17J0xhdW5jaFNlcnZpY2VzJzonLi4vLi4vLi4vTGliL3BsYXQtbWFjL0NhcmJvbid9Ci0JKQorICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCdfTGF1bmNoJywgWydfTGF1bmNobW9kdWxlLmMnXSwKKyAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0FwcGxpY2F0aW9uU2VydmljZXMnXSkKKyAgICAgICAgXSwKKyAgICAgICAgcHlfbW9kdWxlcz1bJ0xhdW5jaFNlcnZpY2VzLkxhdW5jaCcsICdMYXVuY2hTZXJ2aWNlcy5MYXVuY2hTZXJ2aWNlcyddLAorICAgICAgICBwYWNrYWdlX2Rpcj17J0xhdW5jaFNlcnZpY2VzJzonLi4vLi4vLi4vTGliL3BsYXQtbWFjL0NhcmJvbid9CisgICAgICAgICkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9saXN0L2xpc3RzY2FuLnB5CmluZGV4IDY2Y2IyYWQuLjg3N2Y2Y2IgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvbGlzdC9saXN0c2Nhbi5weQpAQCAtMTEsNzggKzExLDc4IEBACiBPQkpFQ1QgPSAiTGlzdEhhbmRsZSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgaW4gKCdMaXN0SGFuZGxlJywgJ0xpc3RSZWYnKSBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0Wy0xXQorICAgICAgICAgICAgIyBUaGlzIGlzIG5vbi1mdW5jdGlvbmFsIHRvZGF5CisgICAgICAgICAgICBpZiB0IGluICgnTGlzdEhhbmRsZScsICdMaXN0UmVmJykgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJMRGlzcG9zZSIsCQkjIERvbmUgYnkgcmVtb3ZpbmcgdGhlIG9iamVjdAotCQkJIkxTZWFyY2giLAkJIyBXZSBkb24ndCB3YW50IHRvIGhhbmRsZSBwcm9jcyBqdXN0IHlldAotCQkJIkNyZWF0ZUN1c3RvbUxpc3QiLCAgIyBkb25lIG1hbnVhbGx5Ci0JCQkiU2V0TGlzdERlZmluaXRpb25Qcm9jIiwKLQkJCQotCQkJIyBUaGVzZSBoYXZlIGZ1bm55IGFyZ3VtZW50L3JldHVybiB2YWx1ZXMKLQkJCSJHZXRMaXN0Vmlld0JvdW5kcyIsCi0JCQkiR2V0TGlzdENlbGxJbmRlbnQiLAotCQkJIkdldExpc3RDZWxsU2l6ZSIsCi0JCQkiR2V0TGlzdFZpc2libGVDZWxscyIsCi0JCQkiR2V0TGlzdENsaWNrTG9jYXRpb24iLAotCQkJIkdldExpc3RNb3VzZUxvY2F0aW9uIiwKLQkJCSJHZXRMaXN0RGF0YUJvdW5kcyIsCi0JCQkiU2V0TGlzdExhc3RDbGljayIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiTERpc3Bvc2UiLCAgICAgICAgICAgICAjIERvbmUgYnkgcmVtb3ZpbmcgdGhlIG9iamVjdAorICAgICAgICAgICAgICAgICJMU2VhcmNoIiwgICAgICAgICAgICAgICMgV2UgZG9uJ3Qgd2FudCB0byBoYW5kbGUgcHJvY3MganVzdCB5ZXQKKyAgICAgICAgICAgICAgICAiQ3JlYXRlQ3VzdG9tTGlzdCIsICAjIGRvbmUgbWFudWFsbHkKKyAgICAgICAgICAgICAgICAiU2V0TGlzdERlZmluaXRpb25Qcm9jIiwKIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiTGlzdENsaWNrTG9vcFVQUCIsICAjIFRvbyBkaWZmaWN1bHQgZm9yIG5vdwotCQkJIkxpc3REZWZTcGVjUHRyIiwgIyBsYXRlcgotCQkJXQorICAgICAgICAgICAgICAgICMgVGhlc2UgaGF2ZSBmdW5ueSBhcmd1bWVudC9yZXR1cm4gdmFsdWVzCisgICAgICAgICAgICAgICAgIkdldExpc3RWaWV3Qm91bmRzIiwKKyAgICAgICAgICAgICAgICAiR2V0TGlzdENlbGxJbmRlbnQiLAorICAgICAgICAgICAgICAgICJHZXRMaXN0Q2VsbFNpemUiLAorICAgICAgICAgICAgICAgICJHZXRMaXN0VmlzaWJsZUNlbGxzIiwKKyAgICAgICAgICAgICAgICAiR2V0TGlzdENsaWNrTG9jYXRpb24iLAorICAgICAgICAgICAgICAgICJHZXRMaXN0TW91c2VMb2NhdGlvbiIsCisgICAgICAgICAgICAgICAgIkdldExpc3REYXRhQm91bmRzIiwKKyAgICAgICAgICAgICAgICAiU2V0TGlzdExhc3RDbGljayIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygnTGlzdEJvdW5kc19wdHInLCAnKicsICdJbk1vZGUnKV0sCi0JCQkgWygnUmVjdF9wdHInLCAnKicsICdJbk1vZGUnKV0pLAorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkxpc3RDbGlja0xvb3BVUFAiLCAgIyBUb28gZGlmZmljdWx0IGZvciBub3cKKyAgICAgICAgICAgICAgICAiTGlzdERlZlNwZWNQdHIiLCAjIGxhdGVyCisgICAgICAgICAgICAgICAgXQogCi0JCQkoWygiQ2VsbCIsICJ0aGVDZWxsIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiQ2VsbCIsICJ0aGVDZWxsIiwgIkluT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJzaG9ydCIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlclNob3J0c2l6ZSIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJzaG9ydCIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyT3V0QnVmZmVyU2hvcnRzaXplIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCQotCQkJIyBTZXRMaXN0Q2VsbEluZGVudCBkb2Vzbid0IGhhdmUgY29uc3QKLQkJCShbKCJQb2ludCIsICJpbmRlbnQiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJQb2ludF9wdHIiLCAiaW5kZW50IiwgIkluTW9kZSIpXSksCi0JCQkKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygnTGlzdEJvdW5kc19wdHInLCAnKicsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgIFsoJ1JlY3RfcHRyJywgJyonLCAnSW5Nb2RlJyldKSwKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICAgICAgICAgIChbKCJDZWxsIiwgInRoZUNlbGwiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiQ2VsbCIsICJ0aGVDZWxsIiwgIkluT3V0TW9kZSIpXSksCiAKLQkJCQorICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoInNob3J0IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlclNob3J0c2l6ZSIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgic2hvcnQiLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJPdXRCdWZmZXJTaG9ydHNpemUiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBTZXRMaXN0Q2VsbEluZGVudCBkb2Vzbid0IGhhdmUgY29uc3QKKyAgICAgICAgICAgICAgICAoWygiUG9pbnQiLCAiaW5kZW50IiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlBvaW50X3B0ciIsICJpbmRlbnQiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9saXN0L2xpc3RzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvbGlzdC9saXN0c3VwcG9ydC5weQppbmRleCBlNDQzMTdhLi45M2JhZWRlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9saXN0L2xpc3RzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL2xpc3QvbGlzdHN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdMaXN0cy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX0xpc3QnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdMaXN0JwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCi1LSU5EID0gJ0hhbmRsZScJCQkJIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCitNQUNIRUFERVJGSUxFID0gJ0xpc3RzLmgnICAgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX0xpc3QnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdMaXN0JyAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJ0hhbmRsZScgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdMaXN0JwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSAiTGlzdEhhbmRsZSIJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnTGlzdCcgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9ICJMaXN0SGFuZGxlIiAgICAgICAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtMjksOCArMjksOCBAQAogCiBMaXN0RGVmU3BlYyA9IExpc3REZWZTcGVjX3B0ciA9IE9wYXF1ZVR5cGUoIkxpc3REZWZTcGVjIiwgIlB5TWFjX0J1aWxkTGlzdERlZlNwZWMiLCAiUHlNYWNfR2V0TGlzdERlZlNwZWMiKQogCi1WYXJPdXRCdWZmZXJTaG9ydHNpemUgPSBWYXJIZWFwT3V0cHV0QnVmZmVyVHlwZSgnY2hhcicsICdzaG9ydCcsICdzJykJIyAoYnVmLCAmbGVuKQotSW5CdWZmZXJTaG9ydHNpemUgPSBWYXJJbnB1dEJ1ZmZlclR5cGUoJ2NoYXInLCAnc2hvcnQnLCAncycpCQkjIChidWYsIGxlbikKK1Zhck91dEJ1ZmZlclNob3J0c2l6ZSA9IFZhckhlYXBPdXRwdXRCdWZmZXJUeXBlKCdjaGFyJywgJ3Nob3J0JywgJ3MnKSAgICMgKGJ1ZiwgJmxlbikKK0luQnVmZmVyU2hvcnRzaXplID0gVmFySW5wdXRCdWZmZXJUeXBlKCdjaGFyJywgJ3Nob3J0JywgJ3MnKSAgICAgICAgICAgICMgKGJ1ZiwgbGVuKQogCiBSZ25IYW5kbGUgPSBPcGFxdWVCeVZhbHVlVHlwZSgiUmduSGFuZGxlIiwgIlJlc09iaiIpCiBEYXRhSGFuZGxlID0gT3BhcXVlQnlWYWx1ZVR5cGUoIkRhdGFIYW5kbGUiLCAiUmVzT2JqIikKQEAgLTY0LDU5ICs2NCw1OSBAQAogIiIiCiAKIGNsYXNzIExpc3RNZXRob2RHZW5lcmF0b3IoTWV0aG9kR2VuZXJhdG9yKToKLQkiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKKyAgICAiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKIAotCWRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKLQkJYXJncywgYTAgPSBhcmdzWzotMV0sIGFyZ3NbLTFdCi0JCXQwLCBuMCwgbTAgPSBhMAotCQlpZiBtMCAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCi0JCXNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCi0JCXNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKKyAgICBkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6CisgICAgICAgIGFyZ3MsIGEwID0gYXJnc1s6LTFdLCBhcmdzWy0xXQorICAgICAgICB0MCwgbjAsIG0wID0gYTAKKyAgICAgICAgaWYgbTAgIT0gSW5Nb2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1ldGhvZCdzICdzZWxmJyBtdXN0IGJlICdJbk1vZGUnIgorICAgICAgICBzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQwLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQorICAgICAgICBGdW5jdGlvbkdlbmVyYXRvci5wYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKQorICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JIyBYWFhYIFNob3VsZCBpbmhlcml0IGZyb20gUmVzb3VyY2UKLQlnZXRzZXRsaXN0ID0gWygKLQkJJ2xpc3RGbGFncycsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIChsb25nKUdldExpc3RGbGFncyhzZWxmLT5vYl9pdHNlbGYpICYgMHhmZik7JywKLQkJJ2lmICghUHlBcmdfUGFyc2UodiwgIkIiLCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5saXN0RmxhZ3MpKSByZXR1cm4gLTE7JywKLQkJTm9uZSwKLQkJKSwgKAotCQknc2VsRmxhZ3MnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylHZXRMaXN0U2VsZWN0aW9uRmxhZ3Moc2VsZi0+b2JfaXRzZWxmKSAmIDB4ZmYpOycsCi0JCSdpZiAoIVB5QXJnX1BhcnNlKHYsICJCIiwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsRmxhZ3MpKSByZXR1cm4gLTE7JywKLQkJTm9uZSwKLQkJKSwgKAotCQknY2VsbFNpemUnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgKCpzZWxmLT5vYl9pdHNlbGYpLT5jZWxsU2l6ZSk7JywKLQkJJ2lmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOycsCi0JCU5vbmUKLQkJKV0KKyAgICAjIFhYWFggU2hvdWxkIGluaGVyaXQgZnJvbSBSZXNvdXJjZQorICAgIGdldHNldGxpc3QgPSBbKAorICAgICAgICAgICAgJ2xpc3RGbGFncycsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylHZXRMaXN0RmxhZ3Moc2VsZi0+b2JfaXRzZWxmKSAmIDB4ZmYpOycsCisgICAgICAgICAgICAnaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPmxpc3RGbGFncykpIHJldHVybiAtMTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdzZWxGbGFncycsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCAobG9uZylHZXRMaXN0U2VsZWN0aW9uRmxhZ3Moc2VsZi0+b2JfaXRzZWxmKSAmIDB4ZmYpOycsCisgICAgICAgICAgICAnaWYgKCFQeUFyZ19QYXJzZSh2LCAiQiIsICYoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEZsYWdzKSkgcmV0dXJuIC0xOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2NlbGxTaXplJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKTsnLAorICAgICAgICAgICAgJ2lmICghUHlBcmdfUGFyc2UodiwgIk8mIiwgUHlNYWNfR2V0UG9pbnQsICYoKnNlbGYtPm9iX2l0c2VsZiktPmNlbGxTaXplKSkgcmV0dXJuIC0xOycsCisgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApXQogCi0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpvYl9sZGVmX2Z1bmM7IikKLQkJT3V0cHV0KCJpbnQgb2JfbXVzdF9iZV9kaXNwb3NlZDsiKQorICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqb2JfbGRlZl9mdW5jOyIpCisgICAgICAgIE91dHB1dCgiaW50IG9iX211c3RfYmVfZGlzcG9zZWQ7IikKIAotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoTGlzdF9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIExpc3QiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIikKLQkJCQkKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKLQkJT3V0cHV0KCJpdC0+b2JfbGRlZl9mdW5jID0gTlVMTDsiKQotCQlPdXRwdXQoIml0LT5vYl9tdXN0X2JlX2Rpc3Bvc2VkID0gMTsiKQotCQlPdXRwdXQoIlNldExpc3RSZWZDb24oaXRzZWxmLCAobG9uZylpdCk7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKExpc3RfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBMaXN0Iik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSIiIikKIAotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9sZGVmX2Z1bmMpOyIpCi0JCU91dHB1dCgic2VsZi0+b2JfbGRlZl9mdW5jID0gTlVMTDsiKQotCQlPdXRwdXQoIlNldExpc3RSZWZDb24oc2VsZi0+b2JfaXRzZWxmLCAobG9uZykwKTsiKQotCQlPdXRwdXQoImlmIChzZWxmLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkICYmICVzKSBMRGlzcG9zZSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKLQkJCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2xkZWZfZnVuYyA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfbXVzdF9iZV9kaXNwb3NlZCA9IDE7IikKKyAgICAgICAgT3V0cHV0KCJTZXRMaXN0UmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOyIpCisKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfbGRlZl9mdW5jKTsiKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2xkZWZfZnVuYyA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJTZXRMaXN0UmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgKGxvbmcpMCk7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+b2JfbXVzdF9iZV9kaXNwb3NlZCAmJiAlcykgTERpc3Bvc2UoJXMpOyIsIGl0c2VsZm5hbWUsIGl0c2VsZm5hbWUpCisKICMgRnJvbSBoZXJlIG9uIGl0J3MgYmFzaWNhbGx5IGFsbCBib2lsZXIgcGxhdGUuLi4KIAogZmluYWxzdHVmZiA9IGZpbmFsc3R1ZmYgKyAiIiIKQEAgLTEyNiwzNCArMTI2LDM0IEBACiAgICAgICAgICAgICAgICAgICAgICAgIENlbGwgdGhlQ2VsbCwKICAgICAgICAgICAgICAgICAgICAgICAgU0ludDE2IGRhdGFPZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIFNJbnQxNiBkYXRhTGVuLAotICAgICAgICAgICAgICAgICAgICAgICBMaXN0SGFuZGxlIHRoZUxpc3QpICAKKyAgICAgICAgICAgICAgICAgICAgICAgTGlzdEhhbmRsZSB0aGVMaXN0KQogewotCVB5T2JqZWN0ICpsaXN0RGVmRnVuYywgKmFyZ3MsICpydj1OVUxMOwotCUxpc3RPYmplY3QgKnNlbGY7Ci0JCi0Jc2VsZiA9IChMaXN0T2JqZWN0KilHZXRMaXN0UmVmQ29uKHRoZUxpc3QpOwotCWlmIChzZWxmID09IE5VTEwgfHwgc2VsZi0+b2JfaXRzZWxmICE9IHRoZUxpc3QpCi0JCXJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCi0JbGlzdERlZkZ1bmMgPSBzZWxmLT5vYl9sZGVmX2Z1bmM7Ci0JaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCi0JCXJldHVybjsgIC8qIG5vdGhpbmcgd2UgY2FuIGRvICovCi0JYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCi0JICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGVjdGVkLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFJlY3QsIGNlbGxSZWN0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhTGVuLAotCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKLQlpZiAoYXJncyAhPSBOVUxMKSB7Ci0JCXJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOwotCQlQeV9ERUNSRUYoYXJncyk7Ci0JfQotCWlmIChydiA9PSBOVUxMKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XFxuIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JfSBlbHNlIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9CisgICAgICAgIFB5T2JqZWN0ICpsaXN0RGVmRnVuYywgKmFyZ3MsICpydj1OVUxMOworICAgICAgICBMaXN0T2JqZWN0ICpzZWxmOworCisgICAgICAgIHNlbGYgPSAoTGlzdE9iamVjdCopR2V0TGlzdFJlZkNvbih0aGVMaXN0KTsKKyAgICAgICAgaWYgKHNlbGYgPT0gTlVMTCB8fCBzZWxmLT5vYl9pdHNlbGYgIT0gdGhlTGlzdCkKKyAgICAgICAgICAgICAgICByZXR1cm47ICAvKiBub3RoaW5nIHdlIGNhbiBkbyAqLworICAgICAgICBsaXN0RGVmRnVuYyA9IHNlbGYtPm9iX2xkZWZfZnVuYzsKKyAgICAgICAgaWYgKGxpc3REZWZGdW5jID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuOyAgLyogbm90aGluZyB3ZSBjYW4gZG8gKi8KKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoImhiTyZPJmhoTyIsIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxlY3RlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkUmVjdCwgY2VsbFJlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZFBvaW50LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFMZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKKyAgICAgICAgaWYgKGFyZ3MgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHJ2ID0gUHlFdmFsX0NhbGxPYmplY3QobGlzdERlZkZ1bmMsIGFyZ3MpOworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAocnYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5U3lzX1dyaXRlU3RkZXJyKCJlcnJvciBpbiBsaXN0IGRlZmluaXRpb24gY2FsbGJhY2s6XFxuIik7CisgICAgICAgICAgICAgICAgUHlFcnJfUHJpbnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICB9CiB9CiAiIiIKIApAQCAtMTc3LDcgKzE3Nyw3IEBACiBIYW5kbGUgaDsKIExpc3RPYmplY3QgKmw7CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJPJiIsIFJlc09ial9Db252ZXJ0LCAmaCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogbCA9IChMaXN0T2JqZWN0ICopTGlzdE9ial9OZXcoYXNfTGlzdChoKSk7CiBsLT5vYl9tdXN0X2JlX2Rpc3Bvc2VkID0gMDsKIF9yZXMgPSBQeV9CdWlsZFZhbHVlKCJPIiwgbCk7CkBAIC0yMTUsMTAgKzIxNSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICZoYXNHcm93LAogICAgICAgICAgICAgICAgICAgICAgICZzY3JvbGxIb3JpeiwKICAgICAgICAgICAgICAgICAgICAgICAmc2Nyb2xsVmVydCkpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogCiAKLS8qIENhcmJvbiBhcHBsaWNhdGlvbnMgdXNlIHRoZSBDcmVhdGVDdXN0b21MaXN0IEFQSSAqLyAKKy8qIENhcmJvbiBhcHBsaWNhdGlvbnMgdXNlIHRoZSBDcmVhdGVDdXN0b21MaXN0IEFQSSAqLwogdGhlU3BlYy51LnVzZXJQcm9jID0gbXlMaXN0RGVmRnVuY3Rpb25VUFA7CiBDcmVhdGVDdXN0b21MaXN0KCZyVmlldywKICAgICAgICAgICAgICAgICAgJmRhdGFCb3VuZHMsCkBAIC0yMzQsNyArMjM0LDcgQEAKIAogX3JlcyA9IExpc3RPYmpfTmV3KG91dExpc3QpOwogaWYgKF9yZXMgPT0gTlVMTCkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBQeV9JTkNSRUYobGlzdERlZkZ1bmMpOwogKChMaXN0T2JqZWN0KilfcmVzKS0+b2JfbGRlZl9mdW5jID0gbGlzdERlZkZ1bmM7CiByZXR1cm4gX3JlcztcCkBAIC0yNTMsNCArMjUzLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL21lbnUvbWVudWVkaXQucHkgYi9NYWMvTW9kdWxlcy9tZW51L21lbnVlZGl0LnB5CmluZGV4IGY2MTNkOGIuLmI3NDMwMWQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL21lbnUvbWVudWVkaXQucHkKKysrIGIvTWFjL01vZHVsZXMvbWVudS9tZW51ZWRpdC5weQpAQCAtMTIxLDQgKzEyMSwzIEBACiAgICAgKE9TVHlwZSwgJ2luUHJvcGVydHlUYWcnLCBJbk1vZGUpLAogKQogZnVuY3Rpb25zLmFwcGVuZChmKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tZW51L21lbnVzY2FuLnB5IGIvTWFjL01vZHVsZXMvbWVudS9tZW51c2Nhbi5weQppbmRleCAyODFjYzg2Li5hZTk0NjVlIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tZW51L21lbnVzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL21lbnUvbWVudXNjYW4ucHkKQEAgLTcsOTEgKzcsOTEgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiTWVudXMuaCIKLQlvdXRwdXQgPSAibWVudWdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJNZW51cy5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IG1lbnVzdXBwb3J0JyA9PT0iCi0JaW1wb3J0IG1lbnVzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBNZW51bW9kdWxlLmMgPT09IgorICAgIGlucHV0ID0gIk1lbnVzLmgiCisgICAgb3V0cHV0ID0gIm1lbnVnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiTWVudXMucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgZG9pbmcgJ2ltcG9ydCBtZW51c3VwcG9ydCcgPT09IgorICAgIGltcG9ydCBtZW51c3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgTWVudW1vZHVsZS5jID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluICgiTWVudUhhbmRsZSIsICJNZW51UmVmIikgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiAoIk1lbnVIYW5kbGUiLCAiTWVudVJlZiIpIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0jIwkJCSJJc1Nob3dDb250ZXh0dWFsTWVudUNsaWNrIiwgIyBDYW4ndCBmaW5kIGl0IGluIHRoZSBsaWJyYXJ5Ci0jIwkJCSJJbml0Q29udGV4dHVhbE1lbnVzIiwgIyBkaXR0bwotCQkJIkdldE1lbnVJdGVtUHJvcGVydHkiLAkjIGRpZmZpY3VsdCBmb3IgdGhlIG1vbWVudAotCQkJIkdldE1lbnVJdGVtUHJvcGVydHlTaXplIiwKLQkJCSJTZXRNZW51SXRlbVByb3BlcnR5IiwKLQkJCSJSZW1vdmVNZW51SXRlbVByb3BlcnR5IiwKLQkJCSJTZXRNZW51Q29tbWFuZFByb3BlcnR5IiwKLQkJCSJHZXRNZW51Q29tbWFuZFByb3BlcnR5IiwKLQkJCSJHZXRNZW51VGl0bGUiLCAjIEZ1bm55IGFyZy9yZXR1cm52YWx1ZQotCQkJIlNldE1lbnVUaXRsZSIsCi0JCQkiU2V0TWVudVRpdGxlSWNvbiIsICMgdm9pZCoKLQkJCSMgT1M4IGNhbGxzOgotCQkJJ0dldE1lbnVJdGVtUmVmQ29uMicsCi0JCQknU2V0TWVudUl0ZW1SZWZDb24yJywKLQkJCSdFbmFibGVJdGVtJywKLQkJCSdEaXNhYmxlSXRlbScsCi0JCQknQ2hlY2tJdGVtJywKLQkJCSdDb3VudE1JdGVtcycsCi0JCQknT3BlbkRlc2tBY2MnLAotCQkJJ1N5c3RlbUVkaXQnLAotCQkJJ1N5c3RlbU1lbnUnLAotCQkJJ1NldE1lbnVGbGFzaCcsCi0JCQknSW5pdE1lbnVzJywKLQkJCSdJbml0UHJvY01lbnUnLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisjIyAgICAgICAgICAgICAgICAgICAgICAiSXNTaG93Q29udGV4dHVhbE1lbnVDbGljayIsICMgQ2FuJ3QgZmluZCBpdCBpbiB0aGUgbGlicmFyeQorIyMgICAgICAgICAgICAgICAgICAgICAgIkluaXRDb250ZXh0dWFsTWVudXMiLCAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkdldE1lbnVJdGVtUHJvcGVydHkiLCAgIyBkaWZmaWN1bHQgZm9yIHRoZSBtb21lbnQKKyAgICAgICAgICAgICAgICAiR2V0TWVudUl0ZW1Qcm9wZXJ0eVNpemUiLAorICAgICAgICAgICAgICAgICJTZXRNZW51SXRlbVByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAiUmVtb3ZlTWVudUl0ZW1Qcm9wZXJ0eSIsCisgICAgICAgICAgICAgICAgIlNldE1lbnVDb21tYW5kUHJvcGVydHkiLAorICAgICAgICAgICAgICAgICJHZXRNZW51Q29tbWFuZFByb3BlcnR5IiwKKyAgICAgICAgICAgICAgICAiR2V0TWVudVRpdGxlIiwgIyBGdW5ueSBhcmcvcmV0dXJudmFsdWUKKyAgICAgICAgICAgICAgICAiU2V0TWVudVRpdGxlIiwKKyAgICAgICAgICAgICAgICAiU2V0TWVudVRpdGxlSWNvbiIsICMgdm9pZCoKKyAgICAgICAgICAgICAgICAjIE9TOCBjYWxsczoKKyAgICAgICAgICAgICAgICAnR2V0TWVudUl0ZW1SZWZDb24yJywKKyAgICAgICAgICAgICAgICAnU2V0TWVudUl0ZW1SZWZDb24yJywKKyAgICAgICAgICAgICAgICAnRW5hYmxlSXRlbScsCisgICAgICAgICAgICAgICAgJ0Rpc2FibGVJdGVtJywKKyAgICAgICAgICAgICAgICAnQ2hlY2tJdGVtJywKKyAgICAgICAgICAgICAgICAnQ291bnRNSXRlbXMnLAorICAgICAgICAgICAgICAgICdPcGVuRGVza0FjYycsCisgICAgICAgICAgICAgICAgJ1N5c3RlbUVkaXQnLAorICAgICAgICAgICAgICAgICdTeXN0ZW1NZW51JywKKyAgICAgICAgICAgICAgICAnU2V0TWVudUZsYXNoJywKKyAgICAgICAgICAgICAgICAnSW5pdE1lbnVzJywKKyAgICAgICAgICAgICAgICAnSW5pdFByb2NNZW51JywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ01DVGFibGVIYW5kbGUnLAotCQkJJ01DRW50cnlQdHInLAotCQkJJ01DVGFibGVQdHInLAotCQkJJ0FFRGVzY19wdHInLCAjIEZvciBub3c6IGRvYWJsZSwgYnV0IG5vdCBlYXN5Ci0JCQknUHJvY2Vzc1NlcmlhbE51bWJlcicsICMgZGl0dG8KLQkJCSJNZW51RGVmU3BlY1B0ciIsICMgVG9vIGRpZmZpY3VsdCBmb3Igbm93Ci0JCQkiTWVudURlZlNwZWNfcHRyIiwgIyBkaXR0bwotCQkJIk1lbnVUcmFja2luZ0RhdGEiLAotCQkJInZvaWRfcHRyIiwgCSMgRG9uJ3Qga25vdyB5ZXQuCi0JCQkiRXZlbnRSZWYiLAkjIEZvciBub3csIG5vdCBleHBvcnRlZCB5ZXQuCi0JCQkiTWVudUl0ZW1EYXRhUHRyIiwgIyBOb3QgeWV0LgotCQkJIk1lbnVJdGVtRGF0YVJlY19wdHIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ01DVGFibGVIYW5kbGUnLAorICAgICAgICAgICAgICAgICdNQ0VudHJ5UHRyJywKKyAgICAgICAgICAgICAgICAnTUNUYWJsZVB0cicsCisgICAgICAgICAgICAgICAgJ0FFRGVzY19wdHInLCAjIEZvciBub3c6IGRvYWJsZSwgYnV0IG5vdCBlYXN5CisgICAgICAgICAgICAgICAgJ1Byb2Nlc3NTZXJpYWxOdW1iZXInLCAjIGRpdHRvCisgICAgICAgICAgICAgICAgIk1lbnVEZWZTcGVjUHRyIiwgIyBUb28gZGlmZmljdWx0IGZvciBub3cKKyAgICAgICAgICAgICAgICAiTWVudURlZlNwZWNfcHRyIiwgIyBkaXR0bworICAgICAgICAgICAgICAgICJNZW51VHJhY2tpbmdEYXRhIiwKKyAgICAgICAgICAgICAgICAidm9pZF9wdHIiLCAgICAgIyBEb24ndCBrbm93IHlldC4KKyAgICAgICAgICAgICAgICAiRXZlbnRSZWYiLCAgICAgIyBGb3Igbm93LCBub3QgZXhwb3J0ZWQgeWV0LgorICAgICAgICAgICAgICAgICJNZW51SXRlbURhdGFQdHIiLCAjIE5vdCB5ZXQuCisgICAgICAgICAgICAgICAgIk1lbnVJdGVtRGF0YVJlY19wdHIiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoIlN0cjI1NSIsICJpdGVtU3RyaW5nIiwgIkluTW9kZSIpXSwKLQkJCSBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCi0JCQkKLQkJCShbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCQotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAotCQkJICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKLQkJCShbKCJNZW51UmVmIiwgJ291dEhpZXJNZW51JywgIk91dE1vZGUiKV0sCi0JCQkgWygiT3B0TWVudVJlZiIsICdvdXRIaWVyTWVudScsICJPdXRNb2RlIildKSwKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiU3RyMjU1IiwgIml0ZW1TdHJpbmciLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAorICAgICAgICAgICAgICAgIChbKCJNZW51UmVmIiwgJ291dEhpZXJNZW51JywgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdE1lbnVSZWYiLCAnb3V0SGllck1lbnUnLCAiT3V0TW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tZW51L21lbnVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvbWVudS9tZW51c3VwcG9ydC5weQppbmRleCA3YzRhZTBkLi5hMDRiNzU1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tZW51L21lbnVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL21lbnUvbWVudXN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdNZW51cy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX01lbnUnCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ01lbnUnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnTWVudXMuaCcgICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfTWVudScgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdNZW51JyAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdNZW51JwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ0hhbmRsZScJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdNZW51JyAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdIYW5kbGUnICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCiBFWFRSQUZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdlZGl0LnB5JyAjIEEgc2ltaWxhciBmaWxlIGJ1dCBoYW5kLW1hZGUKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTQ4LDcgKzQ4LDcgQEAKIGV4dGVybiBpbnQgX01lbnVPYmpfQ29udmVydChQeU9iamVjdCAqLCBNZW51SGFuZGxlICopOwogCiAjZGVmaW5lIE1lbnVPYmpfTmV3IF9NZW51T2JqX05ldwotI2RlZmluZSBNZW51T2JqX0NvbnZlcnQgX01lbnVPYmpfQ29udmVydCAKKyNkZWZpbmUgTWVudU9ial9Db252ZXJ0IF9NZW51T2JqX0NvbnZlcnQKICNlbmRpZgogCiAjZGVmaW5lIGFzX01lbnUoaCkgKChNZW51SGFuZGxlKWgpCkBAIC01OCwzMSArNTgsMzEgQEAKIC8qIEFsdGVybmF0aXZlIHZlcnNpb24gb2YgTWVudU9ial9OZXcsIHdoaWNoIHJldHVybnMgTm9uZSBmb3IgTlVMTCBhcmd1bWVudCAqLwogUHlPYmplY3QgKk9wdE1lbnVPYmpfTmV3KE1lbnVSZWYgaXRzZWxmKQogewotCWlmIChpdHNlbGYgPT0gTlVMTCkgewotCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCXJldHVybiBQeV9Ob25lOwotCX0KLQlyZXR1cm4gTWVudU9ial9OZXcoaXRzZWxmKTsKKyAgICAgICAgaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICAgICAgICAgIHJldHVybiBQeV9Ob25lOworICAgICAgICB9CisgICAgICAgIHJldHVybiBNZW51T2JqX05ldyhpdHNlbGYpOwogfQogCiAvKiBBbHRlcm5hdGl2ZSB2ZXJzaW9uIG9mIE1lbnVPYmpfQ29udmVydCwgd2hpY2ggcmV0dXJucyBOVUxMIGZvciBhIE5vbmUgYXJndW1lbnQgKi8KIGludCBPcHRNZW51T2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIE1lbnVSZWYgKnBfaXRzZWxmKQogewotCWlmICggdiA9PSBQeV9Ob25lICkgewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIE1lbnVPYmpfQ29udmVydCh2LCBwX2l0c2VsZik7CisgICAgICAgIGlmICggdiA9PSBQeV9Ob25lICkgeworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIE1lbnVPYmpfQ29udmVydCh2LCBwX2l0c2VsZik7CiB9CiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTWVudUhhbmRsZSwgTWVudU9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZW51SGFuZGxlLCBNZW51T2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZW51SGFuZGxlLCBNZW51T2JqX0NvbnZlcnQpOwogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JcGFzcworICAgIHBhc3MKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQogbW9kdWxlID0gTWFjTW9kdWxlKE1PRE5BTUUsIE1PRFBSRUZJWCwgaW5jbHVkZXN0dWZmLCBmaW5hbHN0dWZmLCBpbml0c3R1ZmYpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tbHRlL21sdGVzY2FuLnB5IGIvTWFjL01vZHVsZXMvbWx0ZS9tbHRlc2Nhbi5weQppbmRleCAxMzRiZmZhLi5hZGVjYjRmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tbHRlL21sdGVzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXNjYW4ucHkKQEAgLTEyLDMzICsxMiwzMyBAQAogIyBBREQgb2JqZWN0IHR5cGVuYW1lcyBoZXJlCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiTWFjVGV4dEVkaXRvci5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCi0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJNYWNUZXh0RWRpdG9yLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcl9PU1gpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluIE9CSkVDVFMgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9IHQgKyAiX21ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiIiIKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiIiIKIGRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHgKIGZhbHNlID0gMAogdHJ1ZSA9IDEKQEAgLTU1LDg5ICs1NSw4OSBAQAogbm9ybWFsID0gMAogIiIiKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJUWE5HZXRGb250RGVmYXVsdHMiLCAjIEFyZyBpcyB0b28gZGlmZmljdWx0Ci0JCQkiVFhOU2V0Rm9udERlZmF1bHRzIiwgIyBBcmcgaXMgdG9vIGRpZmZpY3VsdAotCQkJIlRYTkluaXRUZXh0ZW5zaW9uIiwgIyBkb25lIG1hbnVhbGx5Ci0JCQkKLQkJCSMgQ29uc3RhbnRzIHdpdGggZnVubnkgZGVmaW5pdGlvbnMKLQkJCSJrVFhOQ2xlYXJUaGlzQ29udHJvbCIsIAotCQkJImtUWE5DbGVhclRoZXNlRm9udEZlYXR1cmVzIiwKLQkJCSJrVFhORG9udENhcmVUeXBlU2l6ZSIsCi0JCQkia1RYTkRlY3JlbWVudFR5cGVTaXplIiwKLQkJCSJrVFhOVXNlQ3VycmVudFNlbGVjdGlvbiIsCi0JCQkia1RYTlN0YXJ0T2Zmc2V0IiwKLQkJCSJrVFhORW5kT2Zmc2V0IiwKLQkJCSJrVFhOUURGb250TmFtZUF0dHJpYnV0ZVNpemUiLAotCQkJImtUWE5RREZvbnRGYW1pbHlJREF0dHJpYnV0ZVNpemUiLAotCQkJImtUWE5RREZvbnRTaXplQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlFERm9udFN0eWxlQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlFERm9udENvbG9yQXR0cmlidXRlU2l6ZSIsCi0JCQkia1RYTlRleHRFbmNvZGluZ0F0dHJpYnV0ZVNpemUiLAotCQkJImtUWE5Vc2VFbmNvZGluZ1dvcmRSdWxlc01hc2siLAotCQkJImtUWE5Gb250U2l6ZUF0dHJpYnV0ZVNpemUiLAotCQkJInN0YXR1cyIsCi0JCQkianVzdGlmaWNhdGlvbiIsCi0JCQknVFhOVFNNQ2hlY2snLCAjIE9TOAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlRYTkdldEZvbnREZWZhdWx0cyIsICMgQXJnIGlzIHRvbyBkaWZmaWN1bHQKKyAgICAgICAgICAgICAgICAiVFhOU2V0Rm9udERlZmF1bHRzIiwgIyBBcmcgaXMgdG9vIGRpZmZpY3VsdAorICAgICAgICAgICAgICAgICJUWE5Jbml0VGV4dGVuc2lvbiIsICMgZG9uZSBtYW51YWxseQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJUWE5UYWIiLCAjIFRCRAotCQkJIlRYTk1hcmdpbnMiLCAjIFRCRAotCQkJIlRYTkNvbnRyb2xEYXRhIiwgI1RCRAotCQkJIlRYTkFUU1VJRmVhdHVyZXMiLCAjVEJECi0JCQkiVFhOQVRTVUlWYXJpYXRpb25zIiwgI1RCRAotCQkJIlRYTkF0dHJpYnV0ZURhdGEiLCAjVEJECi0JCQkiVFhOVHlwZUF0dHJpYnV0ZXMiLCAjVEJECi0JCQkiVFhOTWF0Y2hUZXh0UmVjb3JkIiwgI1RCRAotCQkJIlRYTkJhY2tncm91bmQiLCAjVEJECi0JCQkiVFhORmluZFVQUCIsIAotCQkJIkFUU1VTdHlsZSIsICNUQkQKLQkJCSJUWE5CYWNrZ3JvdW5kX3B0ciIsICNUQkQKLQkJCSJUWE5Db250cm9sRGF0YV9wdHIiLCAjVEJECi0JCQkiVFhOQ29udHJvbFRhZ19wdHIiLCAjVEJECi0JCQkiVFhOTG9uZ1JlY3QiLCAjVEJECi0JCQkiVFhOTG9uZ1JlY3RfcHRyIiwgI1RCRAotCQkJIlRYTlR5cGVBdHRyaWJ1dGVzX3B0ciIsICNUQkQKKyAgICAgICAgICAgICAgICAjIENvbnN0YW50cyB3aXRoIGZ1bm55IGRlZmluaXRpb25zCisgICAgICAgICAgICAgICAgImtUWE5DbGVhclRoaXNDb250cm9sIiwKKyAgICAgICAgICAgICAgICAia1RYTkNsZWFyVGhlc2VGb250RmVhdHVyZXMiLAorICAgICAgICAgICAgICAgICJrVFhORG9udENhcmVUeXBlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5EZWNyZW1lbnRUeXBlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5Vc2VDdXJyZW50U2VsZWN0aW9uIiwKKyAgICAgICAgICAgICAgICAia1RYTlN0YXJ0T2Zmc2V0IiwKKyAgICAgICAgICAgICAgICAia1RYTkVuZE9mZnNldCIsCisgICAgICAgICAgICAgICAgImtUWE5RREZvbnROYW1lQXR0cmlidXRlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5RREZvbnRGYW1pbHlJREF0dHJpYnV0ZVNpemUiLAorICAgICAgICAgICAgICAgICJrVFhOUURGb250U2l6ZUF0dHJpYnV0ZVNpemUiLAorICAgICAgICAgICAgICAgICJrVFhOUURGb250U3R5bGVBdHRyaWJ1dGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTlFERm9udENvbG9yQXR0cmlidXRlU2l6ZSIsCisgICAgICAgICAgICAgICAgImtUWE5UZXh0RW5jb2RpbmdBdHRyaWJ1dGVTaXplIiwKKyAgICAgICAgICAgICAgICAia1RYTlVzZUVuY29kaW5nV29yZFJ1bGVzTWFzayIsCisgICAgICAgICAgICAgICAgImtUWE5Gb250U2l6ZUF0dHJpYnV0ZVNpemUiLAorICAgICAgICAgICAgICAgICJzdGF0dXMiLAorICAgICAgICAgICAgICAgICJqdXN0aWZpY2F0aW9uIiwKKyAgICAgICAgICAgICAgICAnVFhOVFNNQ2hlY2snLCAjIE9TOAorICAgICAgICAgICAgICAgIF0KIAotCQkJIlRYTkFjdGlvbktleU1hcHBlclByb2NQdHIiLAotCQkJIlRYTkFjdGlvbktleU1hcHBlclVQUCIsCi0JCQkiVFhOVGV4dEJveE9wdGlvbnNEYXRhIiwKLQkJCSJUWE5Db3VudE9wdGlvbnMiLAotCQkJInZvaWRfcHRyIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJUWE5UYWIiLCAjIFRCRAorICAgICAgICAgICAgICAgICJUWE5NYXJnaW5zIiwgIyBUQkQKKyAgICAgICAgICAgICAgICAiVFhOQ29udHJvbERhdGEiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTkFUU1VJRmVhdHVyZXMiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTkFUU1VJVmFyaWF0aW9ucyIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQXR0cmlidXRlRGF0YSIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOVHlwZUF0dHJpYnV0ZXMiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTk1hdGNoVGV4dFJlY29yZCIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQmFja2dyb3VuZCIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhORmluZFVQUCIsCisgICAgICAgICAgICAgICAgIkFUU1VTdHlsZSIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQmFja2dyb3VuZF9wdHIiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTkNvbnRyb2xEYXRhX3B0ciIsICNUQkQKKyAgICAgICAgICAgICAgICAiVFhOQ29udHJvbFRhZ19wdHIiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTkxvbmdSZWN0IiwgI1RCRAorICAgICAgICAgICAgICAgICJUWE5Mb25nUmVjdF9wdHIiLCAjVEJECisgICAgICAgICAgICAgICAgIlRYTlR5cGVBdHRyaWJ1dGVzX3B0ciIsICNUQkQKIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIyBUWE5OZXdPYmplY3QgaGFzIGEgbG90IG9mIG9wdGlvbmFsIHBhcmFtZXRlcnMKLQkJCShbKCJGU1NwZWNfcHRyIiwgImlGaWxlU3BlYyIsICJJbk1vZGUiKV0sCi0JCQkgWygiT3B0RlNTcGVjUHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiUmVjdCIsICJpRnJhbWUiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJPcHRSZWN0UHRyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCSAKLQkJCSMgSW4gVUggMzMyIHNvbWUgb2YgdGhlICJjb25zdCIgYXJlIG1pc3NpbmcgZm9yIGlucHV0IHBhcmFtZXRlcnMgcGFzc2VkCi0JCQkjIGJ5IHJlZmVyZW5jZS4gV2UgZml4IHRoYXQgdXAgaGVyZS4KLQkJCShbKCJFdmVudFJlY29yZCIsICJpRXZlbnQiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJFdmVudFJlY29yZF9wdHIiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJKFsoIkZTU3BlYyIsICJpRmlsZVNwZWNpZmljYXRpb24iLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJGU1NwZWNfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCShbKCJUWE5NYWNPU1ByZWZlcnJlZEZvbnREZXNjcmlwdGlvbiIsICJpRm9udERlZmF1bHRzIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiVFhOTWFjT1NQcmVmZXJyZWRGb250RGVzY3JpcHRpb25fcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCSAKLQkJCSMgSW4gYnVmZmVycyBhcmUgcGFzc2VkIGFzIHZvaWQgKgotCQkJKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgiQnl0ZUNvdW50IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIk1sdGVJbkJ1ZmZlciIsICIqIiwgIkluTW9kZSIpXSksCi0JCQkgCi0JCQkjIFRoZSBBZGp1c3RDdXJzb3IgcmVnaW9uIGhhbmRsZSBpcyBvcHRpb25hbAotCQkJKFsoIlJnbkhhbmRsZSIsICJpb0N1cnNvclJnbiIsICJJbk1vZGUiKV0sCi0JCQkgWygiT3B0UmduSGFuZGxlIiwgIioiLCAiKiIpXSksCi0JCQkgCi0JCQkjIFRoZSBHV29ybGQgZm9yIFRYTkRyYXcgaXMgb3B0aW9uYWwKLQkJCShbKCdHV29ybGRQdHInLCAnaURyYXdQb3J0JywgJ0luTW9kZScpXSwKLQkJCSBbKCdPcHRHV29ybGRQdHInLCAnKicsICcqJyldKSwKLQkJCV0KLQkJCQorICAgICAgICAgICAgICAgICJUWE5BY3Rpb25LZXlNYXBwZXJQcm9jUHRyIiwKKyAgICAgICAgICAgICAgICAiVFhOQWN0aW9uS2V5TWFwcGVyVVBQIiwKKyAgICAgICAgICAgICAgICAiVFhOVGV4dEJveE9wdGlvbnNEYXRhIiwKKyAgICAgICAgICAgICAgICAiVFhOQ291bnRPcHRpb25zIiwKKyAgICAgICAgICAgICAgICAidm9pZF9wdHIiLAorICAgICAgICAgICAgICAgIF0KKworICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICMgVFhOTmV3T2JqZWN0IGhhcyBhIGxvdCBvZiBvcHRpb25hbCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgKFsoIkZTU3BlY19wdHIiLCAiaUZpbGVTcGVjIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0RlNTcGVjUHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIlJlY3QiLCAiaUZyYW1lIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdFJlY3RQdHIiLCAiKiIsICJJbk1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBJbiBVSCAzMzIgc29tZSBvZiB0aGUgImNvbnN0IiBhcmUgbWlzc2luZyBmb3IgaW5wdXQgcGFyYW1ldGVycyBwYXNzZWQKKyAgICAgICAgICAgICAgICAjIGJ5IHJlZmVyZW5jZS4gV2UgZml4IHRoYXQgdXAgaGVyZS4KKyAgICAgICAgICAgICAgICAoWygiRXZlbnRSZWNvcmQiLCAiaUV2ZW50IiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV2ZW50UmVjb3JkX3B0ciIsICIqIiwgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgKFsoIkZTU3BlYyIsICJpRmlsZVNwZWNpZmljYXRpb24iLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRlNTcGVjX3B0ciIsICIqIiwgIkluTW9kZSIpXSksCisgICAgICAgICAgICAgICAgKFsoIlRYTk1hY09TUHJlZmVycmVkRm9udERlc2NyaXB0aW9uIiwgImlGb250RGVmYXVsdHMiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVFhOTWFjT1NQcmVmZXJyZWRGb250RGVzY3JpcHRpb25fcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgSW4gYnVmZmVycyBhcmUgcGFzc2VkIGFzIHZvaWQgKgorICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoIkJ5dGVDb3VudCIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiTWx0ZUluQnVmZmVyIiwgIioiLCAiSW5Nb2RlIildKSwKKworICAgICAgICAgICAgICAgICMgVGhlIEFkanVzdEN1cnNvciByZWdpb24gaGFuZGxlIGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgKFsoIlJnbkhhbmRsZSIsICJpb0N1cnNvclJnbiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIk9wdFJnbkhhbmRsZSIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgIyBUaGUgR1dvcmxkIGZvciBUWE5EcmF3IGlzIG9wdGlvbmFsCisgICAgICAgICAgICAgICAgKFsoJ0dXb3JsZFB0cicsICdpRHJhd1BvcnQnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdPcHRHV29ybGRQdHInLCAnKicsICcqJyldKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9tbHRlL21sdGVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvbWx0ZS9tbHRlc3VwcG9ydC5weQppbmRleCA4NjJkMGJjLi44ZGNiZWQ1IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9tbHRlL21sdGVzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL21sdGUvbWx0ZXN1cHBvcnQucHkKQEAgLTgsMTIgKzgsMTIgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTU9ETkFNRSA9ICdfTWx0ZScJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitNT0ROQU1FID0gJ19NbHRlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ01sdGUnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworTU9EUFJFRklYID0gJ01sdGUnICAgICAgICAgICAgICAgICAgICAgICMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTQzLDE0ICs0MywxNCBAQAogc3RhdGljIGludAogT3B0RlNTcGVjUHRyX0NvbnZlcnQoUHlPYmplY3QgKnYsIEZTU3BlYyAqKnBfaXRzZWxmKQogewotCXN0YXRpYyBGU1NwZWMgZnNzOwotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JKnBfaXRzZWxmID0gJmZzczsKLQlyZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpwX2l0c2VsZik7CisgICAgICAgIHN0YXRpYyBGU1NwZWMgZnNzOworICAgICAgICBpZiAodiA9PSBQeV9Ob25lKQorICAgICAgICB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gTlVMTDsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICAqcF9pdHNlbGYgPSAmZnNzOworICAgICAgICByZXR1cm4gUHlNYWNfR2V0RlNTcGVjKHYsICpwX2l0c2VsZik7CiB9CiAKIC8qCkBAIC01OSwxNSArNTksMTUgQEAKIHN0YXRpYyBpbnQKIE9wdFJlY3RQdHJfQ29udmVydChQeU9iamVjdCAqdiwgUmVjdCAqKnBfaXRzZWxmKQogewotCXN0YXRpYyBSZWN0IHI7Ci0JCi0JaWYgKHYgPT0gUHlfTm9uZSkKLQl7Ci0JCSpwX2l0c2VsZiA9IE5VTEw7Ci0JCXJldHVybiAxOwotCX0KLQkqcF9pdHNlbGYgPSAmcjsKLQlyZXR1cm4gUHlNYWNfR2V0UmVjdCh2LCAqcF9pdHNlbGYpOworICAgICAgICBzdGF0aWMgUmVjdCByOworCisgICAgICAgIGlmICh2ID09IFB5X05vbmUpCisgICAgICAgIHsKKyAgICAgICAgICAgICAgICAqcF9pdHNlbGYgPSBOVUxMOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgICpwX2l0c2VsZiA9ICZyOworICAgICAgICByZXR1cm4gUHlNYWNfR2V0UmVjdCh2LCAqcF9pdHNlbGYpOwogfQogCiAvKgpAQCAtNzUsMTkgKzc1LDE5IEBACiAqLwogc3RhdGljIGludAogT3B0R1dvcmxkT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEdXb3JsZFB0ciAqcF9pdHNlbGYpCi17CQotCWlmICh2ID09IFB5X05vbmUpCi0JewotCQkqcF9pdHNlbGYgPSBOVUxMOwotCQlyZXR1cm4gMTsKLQl9Ci0JcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKK3sKKyAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIEdXb3JsZE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKTsKIH0KIAogIiIiCiAKIGluaXRzdHVmZiA9IGluaXRzdHVmZiArICIiIgotLy8JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoeHh4eCk7CisvLyAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKHh4eHgpOwogIiIiCiBUWE5PYmplY3QgPSBPcGFxdWVCeVZhbHVlVHlwZSgiVFhOT2JqZWN0IiwgIlRYTk9iaiIpCiBUWE5Gb250TWVudU9iamVjdCA9IE9wYXF1ZUJ5VmFsdWVUeXBlKCJUWE5Gb250TWVudU9iamVjdCIsICJUWE5Gb250TWVudU9iaiIpCkBAIC0xMzMsMTIgKzEzMywxMiBAQAogIyBPdXIgKG9wYXF1ZSkgb2JqZWN0cwogCiBjbGFzcyBUWE5PYmpEZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQogCiBjbGFzcyBUWE5Gb250TWVudU9iakRlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCiAKIAogIyBBREQgb2JqZWN0IGNsYXNzIGhlcmUKQEAgLTE4Myw3ICsxODMsNyBAQAogVFhOSW5pdE9wdGlvbnMgaVVzYWdlRmxhZ3M7CiBQeU1hY19QUkVDSEVDSyhUWE5Jbml0VGV4dGVuc2lvbik7CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJsIiwgJmlVc2FnZUZsYWdzKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBfZXJyID0gVFhOSW5pdFRleHRlbnNpb24oaURlZmF1bHRGb250cywKICAgICAgICAgICAgICAgICAgICAgICAgICBpQ291bnREZWZhdWx0Rm9udHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaVVzYWdlRmxhZ3MpOwpAQCAtMjAwLDQgKzIwMCwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2Evb3Nhc2Nhbi5weSBiL01hYy9Nb2R1bGVzL29zYS9vc2FzY2FuLnB5CmluZGV4IDc1ZTFhMDguLmZiODE5NmYgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL29zYS9vc2FzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL29zYS9vc2FzY2FuLnB5CkBAIC0xMCw1MyArMTAsNTMgQEAKIFNIT1JUID0gIm9zYSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJPU0EuaCIKLQlvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSAiT1NBLmgiCisgICAgb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgorICAgIGRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gIkNvbXBvbmVudEluc3RhbmNlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gIm1ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0ID09ICJDb21wb25lbnRJbnN0YW5jZSIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gIk1ldGhvZCIKKyAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkFwcGxlRXZlbnRzIGltcG9ydCAqXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrQUVVc2VTdGFuZGFyZERpc3BhdGNoID0gLTFcbiIpCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImZyb20gQ2FyYm9uLkFwcGxlRXZlbnRzIGltcG9ydCAqXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrQUVVc2VTdGFuZGFyZERpc3BhdGNoID0gLTFcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIk9TQUNvcHlTY3JpcHQiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIk9TQUNvcHlTY3JpcHQiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiT1NBTG9jYWxPckdsb2JhbCIsCi0JCQkiT1NBQ3JlYXRlQXBwbGVFdmVudFVQUCIsCi0JCQkiT1NBQWN0aXZlVVBQIiwKLQkJCSJBRUV2ZW50SGFuZGxlclVQUCIsCi0JCQkiT1NBU2VuZFVQUCIsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiT1NBTG9jYWxPckdsb2JhbCIsCisgICAgICAgICAgICAgICAgIk9TQUNyZWF0ZUFwcGxlRXZlbnRVUFAiLAorICAgICAgICAgICAgICAgICJPU0FBY3RpdmVVUFAiLAorICAgICAgICAgICAgICAgICJBRUV2ZW50SGFuZGxlclVQUCIsCisgICAgICAgICAgICAgICAgIk9TQVNlbmRVUFAiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJXQotCQkJCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvb3NhL29zYXN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9vc2Evb3Nhc3VwcG9ydC5weQppbmRleCBiMGU3ZjRjLi44MzY5OTMyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9vc2Evb3Nhc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9vc2Evb3Nhc3VwcG9ydC5weQpAQCAtNiwxNCArNiwxNCBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ09TQS5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX09TQScJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCitNQUNIRUFERVJGSUxFID0gJ09TQS5oJyAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19PU0EnICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKIAogIyBUaGUgZm9sbG93aW5nIGlzICp1c3VhbGx5KiB1bmNoYW5nZWQgYnV0IG1heSBzdGlsbCByZXF1aXJlIHR1bmluZwotTU9EUFJFRklYID0gJ09TQScJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RQUkVGSVggPSAnT1NBT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnT1NBJyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUUFJFRklYID0gJ09TQU9iaicgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtMzYsOCArMzYsOCBAQAogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKIC8qCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoQ29tcG9uZW50SW5zdGFuY2UsIE9TQU9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChDb21wb25lbnRJbnN0YW5jZSwgT1NBT2JqX0NvbnZlcnQpOwogKi8KICIiIgogCkBAIC02MywyNCArNjMsMjQgQEAKICMgTk9URTogYXQgdGhlIG1vbWVudCBPU0EuQ29tcG9uZW50SW5zdGFuY2UgaXMgbm90IGEgc3ViY2xhc3MKICMgb2YgQ20uQ29tcG9uZW50SW5zdGFuY2UuIElmIHRoaXMgaXMgYSBwcm9ibGVtIGl0IGNhbiBiZSBmaXhlZC4KIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCQkJCVB5RXJyX1NldFN0cmluZyhPU0FfRXJyb3IsIk5VTEwgQ29tcG9uZW50SW5zdGFuY2UiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIikKLQkJCQkKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRwdXQoIiIiCi0JCQlpZiAoQ21wSW5zdE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKSkKLQkJCQlyZXR1cm4gMTsKLQkJCVB5RXJyX0NsZWFyKCk7Ci0JCQkiIiIpCi0JCQkJCQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoT1NBX0Vycm9yLCJOVUxMIENvbXBvbmVudEluc3RhbmNlIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSIiIikKKworICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiIKKyAgICAgICAgICAgICAgICBpZiAoQ21wSW5zdE9ial9Db252ZXJ0KHYsIHBfaXRzZWxmKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgIiIiKQorCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KIG1vZHVsZSA9IE1hY01vZHVsZShNT0ROQU1FLCBNT0RQUkVGSVgsIGluY2x1ZGVzdHVmZiwgZmluYWxzdHVmZiwgaW5pdHN0dWZmKQogb2JqZWN0ID0gTXlPYmplY3REZWZpbml0aW9uKCdPU0FDb21wb25lbnRJbnN0YW5jZScsIE9CSkVDVFBSRUZJWCwKLQkJJ0NvbXBvbmVudEluc3RhbmNlJykKKyAgICAgICAgICAgICAgICAnQ29tcG9uZW50SW5zdGFuY2UnKQogbW9kdWxlLmFkZG9iamVjdChvYmplY3QpCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgY2xhc3NlcyB1c2VkIHRvIHBvcHVsYXRlIHRoZSBsaXN0cwpAQCAtMTAzLDQgKzEwMywzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9vc2Evc2V0dXAucHkgYi9NYWMvTW9kdWxlcy9vc2Evc2V0dXAucHkKaW5kZXggODJlNzc0Mi4uNjM1MTE0ZSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvb3NhL3NldHVwLnB5CisrKyBiL01hYy9Nb2R1bGVzL29zYS9zZXR1cC5weQpAQCAtNCwxMCArNCwxMCBAQAogZnJvbSBkaXN0dXRpbHMuY29yZSBpbXBvcnQgRXh0ZW5zaW9uLCBzZXR1cAogCiBzZXR1cChuYW1lPSJPU0EiLCB2ZXJzaW9uPSIwLjEiLAotCWV4dF9tb2R1bGVzPVsKLQkJRXh0ZW5zaW9uKCdfT1NBJywgWydfT1NBbW9kdWxlLmMnXSwKLQkJZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nXSkKLQldLAotCXB5X21vZHVsZXM9WydPU0EuT1NBJywgJ09TQS5PU0Fjb25zdCddLAotCXBhY2thZ2VfZGlyPXsnT1NBJzonLi4vLi4vLi4vTGliL3BsYXQtbWFjL0NhcmJvbid9Ci0JKQorICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCdfT1NBJywgWydfT1NBbW9kdWxlLmMnXSwKKyAgICAgICAgICAgICAgICBleHRyYV9saW5rX2FyZ3M9WyctZnJhbWV3b3JrJywgJ0NhcmJvbiddKQorICAgICAgICBdLAorICAgICAgICBweV9tb2R1bGVzPVsnT1NBLk9TQScsICdPU0EuT1NBY29uc3QnXSwKKyAgICAgICAgcGFja2FnZV9kaXI9eydPU0EnOicuLi8uLi8uLi9MaWIvcGxhdC1tYWMvQ2FyYm9uJ30KKyAgICAgICAgKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWQvcWRlZGl0LnB5IGIvTWFjL01vZHVsZXMvcWQvcWRlZGl0LnB5CmluZGV4IGQ5ZTRhMTUuLjgzZDgxZWQgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3FkL3FkZWRpdC5weQorKysgYi9NYWMvTW9kdWxlcy9xZC9xZGVkaXQucHkKQEAgLTEsNSArMSw1IEBACiBmID0gRnVuY3Rpb24odm9pZCwgJ1NldFBvcnQnLAotCShHcmFmUHRyLCAndGhlUG9ydCcsIEluTW9kZSksCisgICAgICAgIChHcmFmUHRyLCAndGhlUG9ydCcsIEluTW9kZSksCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCiAKQEAgLTE1Niw0ICsxNTYsMyBAQAogICAgIChzaG9ydCwgJ2J5dGVDb3VudCcsIEluTW9kZSksCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL3Fkc2Nhbi5weSBiL01hYy9Nb2R1bGVzL3FkL3Fkc2Nhbi5weQppbmRleCBmNThiYjIyLi44NWE4Y2RjIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZC9xZHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvcWQvcWRzY2FuLnB5CkBAIC04LDIyOCArOCwyMjggQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiUXVpY2tEcmF3LmgiCi0Jb3V0cHV0ID0gInFkZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIlF1aWNrRHJhdy5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQkKLQkjIEdybXBmLiBVbml2ZXJzYWwgSGVhZGVycyBoYXZlIFRleHQtc3R1ZmYgaW4gYSBkaWZmZXJlbnQgaW5jbHVkZSBmaWxlLi4uCi0JaW5wdXQgPSAiUXVpY2tEcmF3VGV4dC5oIgotCW91dHB1dCA9ICJAcWRnZW50ZXh0LnB5IgotCWRlZnNvdXRwdXQgPSAiQFF1aWNrRHJhd1RleHQucHkiCi0JaGF2ZV9leHRyYSA9IDAKLQl0cnk6Ci0JCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQkJc2Nhbm5lci5zY2FuKCkKLQkJc2Nhbm5lci5jbG9zZSgpCi0JCWhhdmVfZXh0cmEgPSAxCi0JZXhjZXB0IElPRXJyb3I6Ci0JCXBhc3MKLQlpZiBoYXZlX2V4dHJhOgotCQlwcmludCAiPT09IENvcHlpbmcgUXVpY2tEcmF3VGV4dCBzdHVmZiBpbnRvIG1haW4gZmlsZXMuLi4gPT09IgotCQlpZnAgPSBvcGVuKCJAcWRnZW50ZXh0LnB5IikKLQkJb2ZwID0gb3BlbigicWRnZW4ucHkiLCAiYSIpCi0JCW9mcC53cml0ZShpZnAucmVhZCgpKQotCQlpZnAuY2xvc2UoKQotCQlvZnAuY2xvc2UoKQotCQlpZnAgPSBvcGVuKCJAUXVpY2tEcmF3VGV4dC5weSIpCi0JCW9mcCA9IG9wZW4oVE9PTEJPWERJUiArICJRdWlja0RyYXcucHkiLCAiYSIpCi0JCW9mcC53cml0ZShpZnAucmVhZCgpKQotCQlpZnAuY2xvc2UoKQotCQlvZnAuY2xvc2UoKQotCQkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKLQlpbXBvcnQgcWRzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJRdWlja0RyYXcuaCIKKyAgICBvdXRwdXQgPSAicWRnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiUXVpY2tEcmF3LnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorCisgICAgIyBHcm1wZi4gVW5pdmVyc2FsIEhlYWRlcnMgaGF2ZSBUZXh0LXN0dWZmIGluIGEgZGlmZmVyZW50IGluY2x1ZGUgZmlsZS4uLgorICAgIGlucHV0ID0gIlF1aWNrRHJhd1RleHQuaCIKKyAgICBvdXRwdXQgPSAiQHFkZ2VudGV4dC5weSIKKyAgICBkZWZzb3V0cHV0ID0gIkBRdWlja0RyYXdUZXh0LnB5IgorICAgIGhhdmVfZXh0cmEgPSAwCisgICAgdHJ5OgorICAgICAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgICAgIHNjYW5uZXIuc2NhbigpCisgICAgICAgIHNjYW5uZXIuY2xvc2UoKQorICAgICAgICBoYXZlX2V4dHJhID0gMQorICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICBwYXNzCisgICAgaWYgaGF2ZV9leHRyYToKKyAgICAgICAgcHJpbnQgIj09PSBDb3B5aW5nIFF1aWNrRHJhd1RleHQgc3R1ZmYgaW50byBtYWluIGZpbGVzLi4uID09PSIKKyAgICAgICAgaWZwID0gb3BlbigiQHFkZ2VudGV4dC5weSIpCisgICAgICAgIG9mcCA9IG9wZW4oInFkZ2VuLnB5IiwgImEiKQorICAgICAgICBvZnAud3JpdGUoaWZwLnJlYWQoKSkKKyAgICAgICAgaWZwLmNsb3NlKCkKKyAgICAgICAgb2ZwLmNsb3NlKCkKKyAgICAgICAgaWZwID0gb3BlbigiQFF1aWNrRHJhd1RleHQucHkiKQorICAgICAgICBvZnAgPSBvcGVuKFRPT0xCT1hESVIgKyAiUXVpY2tEcmF3LnB5IiwgImEiKQorICAgICAgICBvZnAud3JpdGUoaWZwLnJlYWQoKSkKKyAgICAgICAgaWZwLmNsb3NlKCkKKyAgICAgICAgb2ZwLmNsb3NlKCkKKworICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGltcG9ydCBxZHN1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgaW4gKCdHcmFmUHRyJywgJ0NHcmFmUHRyJykgYW5kIG0gPT0gJ0luTW9kZSc6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJncl9tZXRob2RzIgotCQkJZWxpZiB0ID09ICdCaXRNYXBQdHInIGFuZCBtID09ICdJbk1vZGUnOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAiYm1fbWV0aG9kcyIKLSMjCQkJZWxpZiB0ID09ICJQb2x5SGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLSMjCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0jIwkJCQlsaXN0bmFtZSA9ICJwX21ldGhvZHMiCi0jIwkJCWVsaWYgdCA9PSAiUmduSGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLSMjCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0jIwkJCQlsaXN0bmFtZSA9ICJyX21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0IGluICgnR3JhZlB0cicsICdDR3JhZlB0cicpIGFuZCBtID09ICdJbk1vZGUnOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAiZ3JfbWV0aG9kcyIKKyAgICAgICAgICAgIGVsaWYgdCA9PSAnQml0TWFwUHRyJyBhbmQgbSA9PSAnSW5Nb2RlJzoKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gImJtX21ldGhvZHMiCisjIyAgICAgICAgICAgICAgICAgICAgICBlbGlmIHQgPT0gIlBvbHlIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorIyMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJwX21ldGhvZHMiCisjIyAgICAgICAgICAgICAgICAgICAgICBlbGlmIHQgPT0gIlJnbkhhbmRsZSIgYW5kIG0gPT0gIkluTW9kZSI6CisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisjIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gInJfbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoIiIiCisgICAgZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6CisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoIiIiCiBkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4Ci1ub3JtYWwJCQkJCQk9IDAKLWJvbGQJCQkJCQk9IDEKLWl0YWxpYwkJCQkJCT0gMgotdW5kZXJsaW5lCQkJCQk9IDQKLW91dGxpbmUJCQkJCQk9IDgKLXNoYWRvdwkJCQkJCT0gMHgxMAotY29uZGVuc2UJCQkJCT0gMHgyMAotZXh0ZW5kCQkJCQkJPSAweDQwCitub3JtYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDAKK2JvbGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMQoraXRhbGljICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAyCit1bmRlcmxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDQKK291dGxpbmUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gOAorc2hhZG93ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPSAweDEwCitjb25kZW5zZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA9IDB4MjAKK2V4dGVuZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHg0MAogIiIiKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdJbml0R3JhZicsCi0JCQknU3R1ZmZIZXgnLAotCQkJJ1N0ZExpbmUnLAotCQkJJ1N0ZENvbW1lbnQnLAotCQkJJ1N0ZEdldFBpYycsCi0JCQknT3BlblBvcnQnLAotCQkJJ0luaXRQb3J0JywKLQkJCSdDbG9zZVBvcnQnLAotCQkJJ09wZW5DUG9ydCcsCi0JCQknSW5pdENQb3J0JywKLQkJCSdDbG9zZUNQb3J0JywKLQkJCSdCaXRNYXBUb1JlZ2lvbkdsdWUnLAotCQkJJ1N0ZE9wY29kZScsIAkjIFhYWFggTWlzc2luZyBmcm9tIGxpYnJhcnkuLi4KLQkJCSMgVGhlIGZvbGxvd2luZyBhcmUgZm9yIG5vbi1tYWNvcyB1c2U6Ci0JCQknTG9ja1BvcnRCaXRzJywKLQkJCSdVbmxvY2tQb3J0Qml0cycsCi0JCQknVXBkYXRlUG9ydCcsCi0JCQknR2V0UG9ydE5hdGl2ZVdpbmRvdycsCi0JCQknR2V0TmF0aXZlV2luZG93UG9ydCcsCi0JCQknTmF0aXZlUmVnaW9uVG9NYWNSZWdpb24nLAotCQkJJ01hY1JlZ2lvblRvTmF0aXZlUmVnaW9uJywKLQkJCSdHZXRQb3J0SFdORCcsCi0JCQknR2V0SFdORFBvcnQnLAotCQkJJ0dldFBJQ1RGcm9tRElCJywKLQkJCQotCQkJJ0hhbmRsZVRvUmduJywgIyBGdW5ueSBzaWduYXR1cmUKKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdJbml0R3JhZicsCisgICAgICAgICAgICAgICAgJ1N0dWZmSGV4JywKKyAgICAgICAgICAgICAgICAnU3RkTGluZScsCisgICAgICAgICAgICAgICAgJ1N0ZENvbW1lbnQnLAorICAgICAgICAgICAgICAgICdTdGRHZXRQaWMnLAorICAgICAgICAgICAgICAgICdPcGVuUG9ydCcsCisgICAgICAgICAgICAgICAgJ0luaXRQb3J0JywKKyAgICAgICAgICAgICAgICAnQ2xvc2VQb3J0JywKKyAgICAgICAgICAgICAgICAnT3BlbkNQb3J0JywKKyAgICAgICAgICAgICAgICAnSW5pdENQb3J0JywKKyAgICAgICAgICAgICAgICAnQ2xvc2VDUG9ydCcsCisgICAgICAgICAgICAgICAgJ0JpdE1hcFRvUmVnaW9uR2x1ZScsCisgICAgICAgICAgICAgICAgJ1N0ZE9wY29kZScsICAgICMgWFhYWCBNaXNzaW5nIGZyb20gbGlicmFyeS4uLgorICAgICAgICAgICAgICAgICMgVGhlIGZvbGxvd2luZyBhcmUgZm9yIG5vbi1tYWNvcyB1c2U6CisgICAgICAgICAgICAgICAgJ0xvY2tQb3J0Qml0cycsCisgICAgICAgICAgICAgICAgJ1VubG9ja1BvcnRCaXRzJywKKyAgICAgICAgICAgICAgICAnVXBkYXRlUG9ydCcsCisgICAgICAgICAgICAgICAgJ0dldFBvcnROYXRpdmVXaW5kb3cnLAorICAgICAgICAgICAgICAgICdHZXROYXRpdmVXaW5kb3dQb3J0JywKKyAgICAgICAgICAgICAgICAnTmF0aXZlUmVnaW9uVG9NYWNSZWdpb24nLAorICAgICAgICAgICAgICAgICdNYWNSZWdpb25Ub05hdGl2ZVJlZ2lvbicsCisgICAgICAgICAgICAgICAgJ0dldFBvcnRIV05EJywKKyAgICAgICAgICAgICAgICAnR2V0SFdORFBvcnQnLAorICAgICAgICAgICAgICAgICdHZXRQSUNURnJvbURJQicsCiAKLQkJCSMgTmVlZCBDbSwgd2hpY2ggd2UgZG9uJ3Qgd2FudCB0byBkcmFnIGluIGp1c3QgeWV0Ci0JCQknT3BlbkN1cnNvckNvbXBvbmVudCcsCi0JCQknQ2xvc2VDdXJzb3JDb21wb25lbnQnLAotCQkJJ1NldEN1cnNvckNvbXBvbmVudCcsCi0JCQknQ3Vyc29yQ29tcG9uZW50Q2hhbmdlZCcsCi0JCQknQ3Vyc29yQ29tcG9uZW50U2V0RGF0YScsCi0JCQldCisgICAgICAgICAgICAgICAgJ0hhbmRsZVRvUmduJywgIyBGdW5ueSBzaWduYXR1cmUKIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiUURSZWdpb25CaXRzUmVmIiwgIyBTaG91bGQgZG8gdGhpcywgYnV0IHRvbyBsYXp5IG5vdy4KLQkJCSdDSWNvbkhhbmRsZScsICMgT2Jzb2xldGUKLQkJCSdDUURQcm9jcycsCi0JCQknQ1FEUHJvY3NQdHInLAotCQkJJ0NTcGVjQXJyYXknLAotCQkJJ0NvbG9yQ29tcGxlbWVudFByb2NQdHInLAotCQkJJ0NvbG9yQ29tcGxlbWVudFVQUCcsCi0JCQknQ29sb3JTZWFyY2hQcm9jUHRyJywKLQkJCSdDb2xvclNlYXJjaFVQUCcsCi0JCQknQ29uc3RQYXR0ZXJuUGFyYW0nLAotCQkJJ0RldmljZUxvb3BEcmF3aW5nUHJvY1B0cicsCi0JCQknRGV2aWNlTG9vcEZsYWdzJywKLQkJCSdHcmFmVmVyYicsCi0JCQknT3BlbkNQaWNQYXJhbXNfcHRyJywKLQkJCSdQdHInLAotCQkJJ1FEUHJvY3MnLAotCQkJJ1JlcUxpc3RSZWMnLAotCQkJJ3ZvaWRfcHRyJywKLQkJCSdDdXN0b21YRmVyUHJvY1B0cicsCi0JCQldCisgICAgICAgICAgICAgICAgIyBOZWVkIENtLCB3aGljaCB3ZSBkb24ndCB3YW50IHRvIGRyYWcgaW4ganVzdCB5ZXQKKyAgICAgICAgICAgICAgICAnT3BlbkN1cnNvckNvbXBvbmVudCcsCisgICAgICAgICAgICAgICAgJ0Nsb3NlQ3Vyc29yQ29tcG9uZW50JywKKyAgICAgICAgICAgICAgICAnU2V0Q3Vyc29yQ29tcG9uZW50JywKKyAgICAgICAgICAgICAgICAnQ3Vyc29yQ29tcG9uZW50Q2hhbmdlZCcsCisgICAgICAgICAgICAgICAgJ0N1cnNvckNvbXBvbmVudFNldERhdGEnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoJ3ZvaWRfcHRyJywgJ3RleHRCdWYnLCAnSW5Nb2RlJyksCi0JCQkgICgnc2hvcnQnLCAnZmlyc3RCeXRlJywgJ0luTW9kZScpLAotCQkJICAoJ3Nob3J0JywgJ2J5dGVDb3VudCcsICdJbk1vZGUnKV0sCi0JCQkgWygnVGV4dFRoaW5naWUnLCAnKicsICcqJyksICgnKicsICcqJywgJyonKSwgKCcqJywgJyonLCAnKicpXSksCi0JCQkKLQkJCSMgR2V0UGVuIGFuZCBTZXRQdCB1c2UgYSBwb2ludC1wb2ludGVyIGFzIG91dHB1dC1vbmx5OgotCQkJKCdHZXRQZW4nLCBbKCdQb2ludCcsICcqJywgJ091dE1vZGUnKV0sIFsoJyonLCAnKicsICdPdXRNb2RlJyldKSwKLQkJCSgnU2V0UHQnLCBbKCdQb2ludCcsICcqJywgJ091dE1vZGUnKV0sIFsoJyonLCAnKicsICdPdXRNb2RlJyldKSwKLQkJCQotCQkJIyBBbGwgb3RoZXJzIHVzZSBpdCBhcyBpbnB1dC9vdXRwdXQ6Ci0JCQkoWygnUG9pbnQnLCAnKicsICdPdXRNb2RlJyldLAotCQkJIFsoJyonLCAnKicsICdJbk91dE1vZGUnKV0pLAotCQkJIAotCQkJICMgSW5zZXRSZWN0LCBPZmZzZXRSZWN0Ci0JCQkgKFsoJ1JlY3QnLCAncicsICdPdXRNb2RlJyksCi0JCQkgCSgnc2hvcnQnLCAnZGgnLCAnSW5Nb2RlJyksCi0JCQkgCSgnc2hvcnQnLCAnZHYnLCAnSW5Nb2RlJyldLAotCQkJICBbKCdSZWN0JywgJ3InLCAnSW5PdXRNb2RlJyksCi0JCQkgCSgnc2hvcnQnLCAnZGgnLCAnSW5Nb2RlJyksCi0JCQkgCSgnc2hvcnQnLCAnZHYnLCAnSW5Nb2RlJyldKSwKKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJRRFJlZ2lvbkJpdHNSZWYiLCAjIFNob3VsZCBkbyB0aGlzLCBidXQgdG9vIGxhenkgbm93LgorICAgICAgICAgICAgICAgICdDSWNvbkhhbmRsZScsICMgT2Jzb2xldGUKKyAgICAgICAgICAgICAgICAnQ1FEUHJvY3MnLAorICAgICAgICAgICAgICAgICdDUURQcm9jc1B0cicsCisgICAgICAgICAgICAgICAgJ0NTcGVjQXJyYXknLAorICAgICAgICAgICAgICAgICdDb2xvckNvbXBsZW1lbnRQcm9jUHRyJywKKyAgICAgICAgICAgICAgICAnQ29sb3JDb21wbGVtZW50VVBQJywKKyAgICAgICAgICAgICAgICAnQ29sb3JTZWFyY2hQcm9jUHRyJywKKyAgICAgICAgICAgICAgICAnQ29sb3JTZWFyY2hVUFAnLAorICAgICAgICAgICAgICAgICdDb25zdFBhdHRlcm5QYXJhbScsCisgICAgICAgICAgICAgICAgJ0RldmljZUxvb3BEcmF3aW5nUHJvY1B0cicsCisgICAgICAgICAgICAgICAgJ0RldmljZUxvb3BGbGFncycsCisgICAgICAgICAgICAgICAgJ0dyYWZWZXJiJywKKyAgICAgICAgICAgICAgICAnT3BlbkNQaWNQYXJhbXNfcHRyJywKKyAgICAgICAgICAgICAgICAnUHRyJywKKyAgICAgICAgICAgICAgICAnUURQcm9jcycsCisgICAgICAgICAgICAgICAgJ1JlcUxpc3RSZWMnLAorICAgICAgICAgICAgICAgICd2b2lkX3B0cicsCisgICAgICAgICAgICAgICAgJ0N1c3RvbVhGZXJQcm9jUHRyJywKKyAgICAgICAgICAgICAgICBdCiAKLQkJCSAjIE1hcFJlY3QKLQkJCSAoWygnUmVjdCcsICdyJywgJ091dE1vZGUnKSwKLQkJCSAJKCdSZWN0X3B0cicsICdzcmNSZWN0JywgJ0luTW9kZScpLAotCQkJIAkoJ1JlY3RfcHRyJywgJ2RzdFJlY3QnLCAnSW5Nb2RlJyldLAotCQkJICBbKCdSZWN0JywgJ3InLCAnSW5PdXRNb2RlJyksCi0JCQkgCSgnUmVjdF9wdHInLCAnc3JjUmVjdCcsICdJbk1vZGUnKSwKLQkJCSAJKCdSZWN0X3B0cicsICdkc3RSZWN0JywgJ0luTW9kZScpXSksCi0JCQkgCQotCQkJICMgQ29weUJpdHMgYW5kIGZyaWVuZHMKLQkJCSAoWygnUmduSGFuZGxlJywgJ21hc2tSZ24nLCAnSW5Nb2RlJyldLAotCQkJICBbKCdPcHRSZ25IYW5kbGUnLCAnbWFza1JnbicsICdJbk1vZGUnKV0pLAotCQkJICAKLQkJCSAoJ1FERmx1c2hQb3J0QnVmZmVyJywKLQkJCSAgWygnUmduSGFuZGxlJywgJyonLCAnSW5Nb2RlJyldLAotCQkJICBbKCdPcHRSZ25IYW5kbGUnLCAnKicsICdJbk1vZGUnKV0pLAotCQkJICAKLQkJCSAjIEFjY2Vzc29ycyB3aXRoIHJlZmVyZW5jZSBhcmd1bWVudCBhbHNvIHJldHVybmVkLgotCQkJIChbKCdSZWN0X3B0cicsICdHZXRQb3J0Qm91bmRzJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEZvcmVDb2xvcicsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUkdCQ29sb3JfcHRyJywgJ0dldFBvcnRCYWNrQ29sb3InLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1JHQkNvbG9yX3B0cicsICdHZXRQb3J0T3BDb2xvcicsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUkdCQ29sb3JfcHRyJywgJ0dldFBvcnRIaWxpdGVDb2xvcicsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUG9pbnRfcHRyJywgJ0dldFBvcnRQZW5TaXplJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdQb2ludF9wdHInLCAnR2V0UG9ydFBlbkxvY2F0aW9uJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdSZWN0X3B0cicsICdHZXRQaXhCb3VuZHMnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ0JpdE1hcF9wdHInLCAnR2V0UURHbG9iYWxzU2NyZWVuQml0cycsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnQ3Vyc29yX3B0cicsICdHZXRRREdsb2JhbHNBcnJvdycsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUmVjdF9wdHInLCAnR2V0UmVnaW9uQm91bmRzJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdQYXR0ZXJuX3B0cicsICcqJywgJ1JldHVybk1vZGUnKV0sCi0JCQkgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCQotCQkJIChbKCdQb2ludF9wdHInLCAnUURMb2NhbFRvR2xvYmFsUG9pbnQnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1JlY3RfcHRyJywgJ1FETG9jYWxUb0dsb2JhbFJlY3QnLCAnUmV0dXJuTW9kZScpXSwKLQkJCSAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAotCQkJCi0JCQkgKFsoJ1BvaW50X3B0cicsICdRREdsb2JhbFRvTG9jYWxQb2ludCcsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCSAoWygnUmVjdF9wdHInLCAnUURHbG9iYWxUb0xvY2FsUmVjdCcsICdSZXR1cm5Nb2RlJyldLAotCQkJICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCi0JCQkKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygndm9pZF9wdHInLCAndGV4dEJ1ZicsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICgnc2hvcnQnLCAnZmlyc3RCeXRlJywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgKCdzaG9ydCcsICdieXRlQ291bnQnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdUZXh0VGhpbmdpZScsICcqJywgJyonKSwgKCcqJywgJyonLCAnKicpLCAoJyonLCAnKicsICcqJyldKSwKKworICAgICAgICAgICAgICAgICMgR2V0UGVuIGFuZCBTZXRQdCB1c2UgYSBwb2ludC1wb2ludGVyIGFzIG91dHB1dC1vbmx5OgorICAgICAgICAgICAgICAgICgnR2V0UGVuJywgWygnUG9pbnQnLCAnKicsICdPdXRNb2RlJyldLCBbKCcqJywgJyonLCAnT3V0TW9kZScpXSksCisgICAgICAgICAgICAgICAgKCdTZXRQdCcsIFsoJ1BvaW50JywgJyonLCAnT3V0TW9kZScpXSwgWygnKicsICcqJywgJ091dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBBbGwgb3RoZXJzIHVzZSBpdCBhcyBpbnB1dC9vdXRwdXQ6CisgICAgICAgICAgICAgICAgKFsoJ1BvaW50JywgJyonLCAnT3V0TW9kZScpXSwKKyAgICAgICAgICAgICAgICAgWygnKicsICcqJywgJ0luT3V0TW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgIyBJbnNldFJlY3QsIE9mZnNldFJlY3QKKyAgICAgICAgICAgICAgICAgKFsoJ1JlY3QnLCAncicsICdPdXRNb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nob3J0JywgJ2RoJywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdzaG9ydCcsICdkdicsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCdSZWN0JywgJ3InLCAnSW5PdXRNb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ3Nob3J0JywgJ2RoJywgJ0luTW9kZScpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdzaG9ydCcsICdkdicsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgICMgTWFwUmVjdAorICAgICAgICAgICAgICAgICAoWygnUmVjdCcsICdyJywgJ091dE1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnUmVjdF9wdHInLCAnc3JjUmVjdCcsICdJbk1vZGUnKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnUmVjdF9wdHInLCAnZHN0UmVjdCcsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCdSZWN0JywgJ3InLCAnSW5PdXRNb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ1JlY3RfcHRyJywgJ3NyY1JlY3QnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgICAgICAgICAoJ1JlY3RfcHRyJywgJ2RzdFJlY3QnLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAjIENvcHlCaXRzIGFuZCBmcmllbmRzCisgICAgICAgICAgICAgICAgIChbKCdSZ25IYW5kbGUnLCAnbWFza1JnbicsICdJbk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCdPcHRSZ25IYW5kbGUnLCAnbWFza1JnbicsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgICgnUURGbHVzaFBvcnRCdWZmZXInLAorICAgICAgICAgICAgICAgICAgWygnUmduSGFuZGxlJywgJyonLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygnT3B0UmduSGFuZGxlJywgJyonLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAjIEFjY2Vzc29ycyB3aXRoIHJlZmVyZW5jZSBhcmd1bWVudCBhbHNvIHJldHVybmVkLgorICAgICAgICAgICAgICAgICAoWygnUmVjdF9wdHInLCAnR2V0UG9ydEJvdW5kcycsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEZvcmVDb2xvcicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydEJhY2tDb2xvcicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSR0JDb2xvcl9wdHInLCAnR2V0UG9ydE9wQ29sb3InLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUkdCQ29sb3JfcHRyJywgJ0dldFBvcnRIaWxpdGVDb2xvcicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdQb2ludF9wdHInLCAnR2V0UG9ydFBlblNpemUnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUG9pbnRfcHRyJywgJ0dldFBvcnRQZW5Mb2NhdGlvbicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICAgWygndm9pZCcsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIChbKCdSZWN0X3B0cicsICdHZXRQaXhCb3VuZHMnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnQml0TWFwX3B0cicsICdHZXRRREdsb2JhbHNTY3JlZW5CaXRzJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ0N1cnNvcl9wdHInLCAnR2V0UURHbG9iYWxzQXJyb3cnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUmVjdF9wdHInLCAnR2V0UmVnaW9uQm91bmRzJywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1BhdHRlcm5fcHRyJywgJyonLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUG9pbnRfcHRyJywgJ1FETG9jYWxUb0dsb2JhbFBvaW50JywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JlY3RfcHRyJywgJ1FETG9jYWxUb0dsb2JhbFJlY3QnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICAoWygnUG9pbnRfcHRyJywgJ1FER2xvYmFsVG9Mb2NhbFBvaW50JywgJ1JldHVybk1vZGUnKV0sCisgICAgICAgICAgICAgICAgICBbKCd2b2lkJywgJyonLCAnUmV0dXJuTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAgKFsoJ1JlY3RfcHRyJywgJ1FER2xvYmFsVG9Mb2NhbFJlY3QnLCAnUmV0dXJuTW9kZScpXSwKKyAgICAgICAgICAgICAgICAgIFsoJ3ZvaWQnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3FkL3Fkc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3FkL3Fkc3VwcG9ydC5weQppbmRleCBlMzYxYzAxLi5kMDc4YWM2IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZC9xZHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvcWQvcWRzdXBwb3J0LnB5CkBAIC02LDI5ICs2LDI5IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnUXVpY2tEcmF3LmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfUWQnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICdHcmFmJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitNQUNIRUFERVJGSUxFID0gJ1F1aWNrRHJhdy5oJyAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX1FkJyAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnR3JhZicgICAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnUWQnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUHRyJwkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdRZCcgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdQdHInICAgICAgICAgIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KK09CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCiBJTlBVVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdnZW4ucHknICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoZSBzY2FubmVyCiBFWFRSQUZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdlZGl0LnB5JyAjIEEgc2ltaWxhciBmaWxlIGJ1dCBoYW5kLW1hZGUKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKICMgQ3JlYXRlIHRoZSB0eXBlIG9iamVjdHMKIAogY2xhc3MgVGV4dFRoaW5naWVDbGFzcyhGaXhlZElucHV0QnVmZmVyVHlwZSk6Ci0JZGVmIGdldGFyZ3NDaGVjayhzZWxmLCBuYW1lKToKLQkJT3V0cHV0KCIvKiBGb29sIGNvbXBpbGVyIHdhcm5pbmdzICovIikKLQkJT3V0cHV0KCIlc19faW5fbGVuX18gPSAlc19faW5fbGVuX187IiwgbmFtZSwgbmFtZSkKKyAgICBkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoIi8qIEZvb2wgY29tcGlsZXIgd2FybmluZ3MgKi8iKQorICAgICAgICBPdXRwdXQoIiVzX19pbl9sZW5fXyA9ICVzX19pbl9sZW5fXzsiLCBuYW1lLCBuYW1lKQogCi0JZGVmIGRlY2xhcmVTaXplKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoImludCAlc19faW5fbGVuX187IiwgbmFtZSkKKyAgICBkZWYgZGVjbGFyZVNpemUoc2VsZiwgbmFtZSk6CisgICAgICAgIE91dHB1dCgiaW50ICVzX19pbl9sZW5fXzsiLCBuYW1lKQogCiBUZXh0VGhpbmdpZSA9IFRleHRUaGluZ2llQ2xhc3MoTm9uZSkKIApAQCAtOTIsMTkgKzkyLDE5IEBACiBQeU9iamVjdCAqUWRSR0JfTmV3KFJHQkNvbG9yUHRyIGl0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGwiLCAobG9uZylpdHNlbGYtPnJlZCwgKGxvbmcpaXRzZWxmLT5ncmVlbiwgKGxvbmcpaXRzZWxmLT5ibHVlKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbCIsIChsb25nKWl0c2VsZi0+cmVkLCAobG9uZylpdHNlbGYtPmdyZWVuLCAobG9uZylpdHNlbGYtPmJsdWUpOwogfQogCiBpbnQgUWRSR0JfQ29udmVydChQeU9iamVjdCAqdiwgUkdCQ29sb3JQdHIgcF9pdHNlbGYpCiB7Ci0JbG9uZyByZWQsIGdyZWVuLCBibHVlOwotCQotCWlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsIiwgJnJlZCwgJmdyZWVuLCAmYmx1ZSkgKQotCQlyZXR1cm4gMDsKLQlwX2l0c2VsZi0+cmVkID0gKHVuc2lnbmVkIHNob3J0KXJlZDsKLQlwX2l0c2VsZi0+Z3JlZW4gPSAodW5zaWduZWQgc2hvcnQpZ3JlZW47Ci0JcF9pdHNlbGYtPmJsdWUgPSAodW5zaWduZWQgc2hvcnQpYmx1ZTsKLQlyZXR1cm4gMTsKKyAgICAgICAgbG9uZyByZWQsIGdyZWVuLCBibHVlOworCisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsIiwgJnJlZCwgJmdyZWVuLCAmYmx1ZSkgKQorICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICBwX2l0c2VsZi0+cmVkID0gKHVuc2lnbmVkIHNob3J0KXJlZDsKKyAgICAgICAgcF9pdHNlbGYtPmdyZWVuID0gKHVuc2lnbmVkIHNob3J0KWdyZWVuOworICAgICAgICBwX2l0c2VsZi0+Ymx1ZSA9ICh1bnNpZ25lZCBzaG9ydClibHVlOworICAgICAgICByZXR1cm4gMTsKIH0KIAogLyoKQEAgLTExNCw4ICsxMTQsOCBAQAogUHlPYmplY3QgKlFkRklfTmV3KEZvbnRJbmZvICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaGhoaCIsIGl0c2VsZi0+YXNjZW50LCBpdHNlbGYtPmRlc2NlbnQsCi0JCQlpdHNlbGYtPndpZE1heCwgaXRzZWxmLT5sZWFkaW5nKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImhoaGgiLCBpdHNlbGYtPmFzY2VudCwgaXRzZWxmLT5kZXNjZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgaXRzZWxmLT53aWRNYXgsIGl0c2VsZi0+bGVhZGluZyk7CiB9CiAiIiIKIApAQCAtMTI1LDE1ICsxMjUsMTUgQEAKICovCiBQeU9iamVjdCAqQk1PYmpfTmV3Q29waWVkKEJpdE1hcFB0ciBpdHNlbGYpCiB7Ci0JQml0TWFwT2JqZWN0ICppdDsKLQlCaXRNYXBQdHIgaXRzZWxmX2NvcHk7Ci0JCi0JaWYgKChpdHNlbGZfY29weT0oQml0TWFwUHRyKW1hbGxvYyhzaXplb2YoQml0TWFwKSkpID09IE5VTEwpCi0JCXJldHVybiBQeUVycl9Ob01lbW9yeSgpOwotCSppdHNlbGZfY29weSA9ICppdHNlbGY7Ci0JaXQgPSAoQml0TWFwT2JqZWN0ICopQk1PYmpfTmV3KGl0c2VsZl9jb3B5KTsKLQlpdC0+cmVmZXJyZWRfYml0bWFwID0gaXRzZWxmX2NvcHk7Ci0JcmV0dXJuIChQeU9iamVjdCAqKWl0OworICAgICAgICBCaXRNYXBPYmplY3QgKml0OworICAgICAgICBCaXRNYXBQdHIgaXRzZWxmX2NvcHk7CisKKyAgICAgICAgaWYgKChpdHNlbGZfY29weT0oQml0TWFwUHRyKW1hbGxvYyhzaXplb2YoQml0TWFwKSkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CisgICAgICAgICppdHNlbGZfY29weSA9ICppdHNlbGY7CisgICAgICAgIGl0ID0gKEJpdE1hcE9iamVjdCAqKUJNT2JqX05ldyhpdHNlbGZfY29weSk7CisgICAgICAgIGl0LT5yZWZlcnJlZF9iaXRtYXAgPSBpdHNlbGZfY29weTsKKyAgICAgICAgcmV0dXJuIChQeU9iamVjdCAqKWl0OwogfQogCiAiIiIKQEAgLTE0MSwxMTIgKzE0MSwxMTIgQEAKIHZhcmlhYmxlc3R1ZmYgPSAiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhCaXRNYXBQdHIsIEJNT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEJpdE1hcFB0ciwgQk1PYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR3JhZlB0ciwgR3JhZk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHcmFmUHRyLCBHcmFmT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFJHQkNvbG9yUHRyLCBRZFJHQl9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChSR0JDb2xvciwgUWRSR0JfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEJpdE1hcFB0ciwgQk1PYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEJpdE1hcFB0ciwgQk1PYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEdyYWZQdHIsIEdyYWZPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdyYWZQdHIsIEdyYWZPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFJHQkNvbG9yUHRyLCBRZFJHQl9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoUkdCQ29sb3IsIFFkUkdCX0NvbnZlcnQpOwogIiIiCiAKICMjIG5vdCB5ZXQuLi4KICMjCiAjI2NsYXNzIFJlZ2lvbl9PYmplY3REZWZpbml0aW9uKEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotIyMJZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotIyMJCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0jIwlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotIyMJCU91dHB1dCgiRGlzcG9zZVJlZ2lvbiglcyk7IiwgaXRzZWxmbmFtZSkKKyMjICAgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorIyMgICAgICAgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisjIyAgICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisjIyAgICAgICAgICAgICAgT3V0cHV0KCJEaXNwb3NlUmVnaW9uKCVzKTsiLCBpdHNlbGZuYW1lKQogIyMKICMjY2xhc3MgUG9seWdvbl9PYmplY3REZWZpbml0aW9uKEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotIyMJZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotIyMJCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0jIwlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotIyMJCU91dHB1dCgiS2lsbFBvbHkoJXMpOyIsIGl0c2VsZm5hbWUpCisjIyAgICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyMjICAgICAgICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorIyMgICAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorIyMgICAgICAgICAgICAgIE91dHB1dCgiS2lsbFBvbHkoJXMpOyIsIGl0c2VsZm5hbWUpCiAKIGNsYXNzIE15R1JPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlnZXRzZXRsaXN0ID0gWwotCQkoJ3Zpc1JnbicsCi0JCSIiIlJnbkhhbmRsZSBoPU5ld1JnbigpOyAvKiBYWFhYIHdyb25nIGRpc3Bvc2Ugcm91dGluZSAqLwotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOwotCQkiIiIsCi0JCU5vbmUsCi0JCSJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIgotCQkpLCAoCi0JCSdjbGlwUmduJywKLQkJIiIiUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCi0JCXJldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFJlc09ial9OZXcsIChIYW5kbGUpR2V0UG9ydENsaXBSZWdpb24oc2VsZi0+b2JfaXRzZWxmLCBoKSk7Ci0JCSIiIiwKLQkJTm9uZSwKLQkJIkNvbnZlbmllbmNlIGF0dHJpYnV0ZTogcmV0dXJuIGEgY29weSBvZiB0aGUgY2xpcHBpbmcgcmVnaW9uIgotCQkpXQotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQlPdXRwdXQoIiNpZiAxIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJXaW5kb3dSZWYgd2luOyIpCi0JCU91dExicmFjZSgiaWYgKFdpbk9ial9Db252ZXJ0KHYsICZ3aW4pICYmIHYpIikKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KHdpbik7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCIjZWxzZSIpCi0JCU91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQotCQlPdXRwdXQoIkRpYWxvZ1JlZiBkbGcgPSAoRGlhbG9nUmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCi0JCU91dHB1dCgiKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydChHZXREaWFsb2dXaW5kb3coZGxnKSk7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRMYnJhY2UoImlmIChXaW5PYmpfQ2hlY2sodikpIikKLQkJT3V0cHV0KCJXaW5kb3dSZWYgd2luID0gKFdpbmRvd1JlZikoKEdyYWZQb3J0T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsiKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgiI2VuZGlmIikKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKCd2aXNSZ24nLAorICAgICAgICAgICAgIiIiUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRWaXNpYmxlUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOworICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIHZpc2libGUgcmVnaW9uIgorICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2NsaXBSZ24nLAorICAgICAgICAgICAgIiIiUmduSGFuZGxlIGg9TmV3UmduKCk7IC8qIFhYWFggd3JvbmcgZGlzcG9zZSByb3V0aW5lICovCisgICAgICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBSZXNPYmpfTmV3LCAoSGFuZGxlKUdldFBvcnRDbGlwUmVnaW9uKHNlbGYtPm9iX2l0c2VsZiwgaCkpOworICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICJDb252ZW5pZW5jZSBhdHRyaWJ1dGU6IHJldHVybiBhIGNvcHkgb2YgdGhlIGNsaXBwaW5nIHJlZ2lvbiIKKyAgICAgICAgICAgICldCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiI2lmIDEiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIldpbmRvd1JlZiB3aW47IikKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoV2luT2JqX0NvbnZlcnQodiwgJndpbikgJiYgdikiKQorICAgICAgICBPdXRwdXQoIipwX2l0c2VsZiA9IChHcmFmUHRyKUdldFdpbmRvd1BvcnQod2luKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfQ2xlYXIoKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIiNlbHNlIikKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCisgICAgICAgIE91dHB1dCgiRGlhbG9nUmVmIGRsZyA9IChEaWFsb2dSZWYpKChHcmFmUG9ydE9iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSAoR3JhZlB0cilHZXRXaW5kb3dQb3J0KEdldERpYWxvZ1dpbmRvdyhkbGcpKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dExicmFjZSgiaWYgKFdpbk9ial9DaGVjayh2KSkiKQorICAgICAgICBPdXRwdXQoIldpbmRvd1JlZiB3aW4gPSAoV2luZG93UmVmKSgoR3JhZlBvcnRPYmplY3QgKil2KS0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gKEdyYWZQdHIpR2V0V2luZG93UG9ydCh3aW4pOyIpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDE7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIjZW5kaWYiKQogCiBjbGFzcyBNeUJNT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZ2V0c2V0bGlzdCA9IFsKLQkoCi0JJ2Jhc2VBZGRyJywKLQkncmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIpOycsCi0JTm9uZSwKLQlOb25lCi0JKSwgKAotCSdyb3dCeXRlcycsCi0JJ3JldHVybiBQeUludF9Gcm9tTG9uZygobG9uZylzZWxmLT5vYl9pdHNlbGYtPnJvd0J5dGVzKTsnLAotCU5vbmUsCi0JTm9uZQotCSksICgKLQknYm91bmRzJywKLQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmc2VsZi0+b2JfaXRzZWxmLT5ib3VuZHMpOycsCi0JTm9uZSwKLQlOb25lCi0JKSwgKAotCSdiaXRtYXBfZGF0YScsCi0JJ3JldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKEJpdE1hcCkpOycsCi0JTm9uZSwKLQlOb25lCi0JKSwgKAotCSdwaXhtYXBfZGF0YScsCi0JJ3JldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgoY2hhciAqKXNlbGYtPm9iX2l0c2VsZiwgc2l6ZW9mKFBpeE1hcCkpOycsCi0JTm9uZSwKLQlOb25lCi0JKV0KLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0JZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCSMgV2UgbmVlZCB0byBtb3JlIGl0ZW1zOiBhIHBvaW50ZXIgdG8gcHJpdmF0ZWx5IGFsbG9jYXRlZCBkYXRhCi0JCSMgYW5kIGEgcHl0aG9uIG9iamVjdCB3ZSdyZSByZWZlcnJpbmcgdG8uCi0JCU91dHB1dCgiJXMgb2JfaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSkKLQkJT3V0cHV0KCJQeU9iamVjdCAqcmVmZXJyZWRfb2JqZWN0OyIpCi0JCU91dHB1dCgiQml0TWFwICpyZWZlcnJlZF9iaXRtYXA7IikKLQlkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaXQtPm9iX2l0c2VsZiA9ICVzaXRzZWxmOyIsIHNlbGYuYXJncmVmKQotCQlPdXRwdXQoIml0LT5yZWZlcnJlZF9vYmplY3QgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPnJlZmVycmVkX2JpdG1hcCA9IE5VTEw7IikKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5yZWZlcnJlZF9vYmplY3QpOyIpCi0JCU91dHB1dCgiaWYgKHNlbGYtPnJlZmVycmVkX2JpdG1hcCkgZnJlZShzZWxmLT5yZWZlcnJlZF9iaXRtYXApOyIpCQkKKyAgICBnZXRzZXRsaXN0ID0gWworICAgICgKKyAgICAnYmFzZUFkZHInLAorICAgICdyZXR1cm4gUHlJbnRfRnJvbUxvbmcoKGxvbmcpc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcik7JywKKyAgICBOb25lLAorICAgIE5vbmUKKyAgICApLCAoCisgICAgJ3Jvd0J5dGVzJywKKyAgICAncmV0dXJuIFB5SW50X0Zyb21Mb25nKChsb25nKXNlbGYtPm9iX2l0c2VsZi0+cm93Qnl0ZXMpOycsCisgICAgTm9uZSwKKyAgICBOb25lCisgICAgKSwgKAorICAgICdib3VuZHMnLAorICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFJlY3QsICZzZWxmLT5vYl9pdHNlbGYtPmJvdW5kcyk7JywKKyAgICBOb25lLAorICAgIE5vbmUKKyAgICApLCAoCisgICAgJ2JpdG1hcF9kYXRhJywKKyAgICAncmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoQml0TWFwKSk7JywKKyAgICBOb25lLAorICAgIE5vbmUKKyAgICApLCAoCisgICAgJ3BpeG1hcF9kYXRhJywKKyAgICAncmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKChjaGFyICopc2VsZi0+b2JfaXRzZWxmLCBzaXplb2YoUGl4TWFwKSk7JywKKyAgICBOb25lLAorICAgIE5vbmUKKyAgICApXQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgIyBXZSBuZWVkIHRvIG1vcmUgaXRlbXM6IGEgcG9pbnRlciB0byBwcml2YXRlbHkgYWxsb2NhdGVkIGRhdGEKKyAgICAgICAgIyBhbmQgYSBweXRob24gb2JqZWN0IHdlJ3JlIHJlZmVycmluZyB0by4KKyAgICAgICAgT3V0cHV0KCIlcyBvYl9pdHNlbGY7Iiwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpyZWZlcnJlZF9vYmplY3Q7IikKKyAgICAgICAgT3V0cHV0KCJCaXRNYXAgKnJlZmVycmVkX2JpdG1hcDsiKQorICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfaXRzZWxmID0gJXNpdHNlbGY7Iiwgc2VsZi5hcmdyZWYpCisgICAgICAgIE91dHB1dCgiaXQtPnJlZmVycmVkX29iamVjdCA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+cmVmZXJyZWRfYml0bWFwID0gTlVMTDsiKQorICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPnJlZmVycmVkX29iamVjdCk7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoc2VsZi0+cmVmZXJyZWRfYml0bWFwKSBmcmVlKHNlbGYtPnJlZmVycmVkX2JpdG1hcCk7IikKIAogIyBDcmVhdGUgdGhlIGdlbmVyYXRvciBncm91cHMgYW5kIGxpbmsgdGhlbQogbW9kdWxlID0gTWFjTW9kdWxlKE1PRE5BTUUsIE1PRFBSRUZJWCwgaW5jbHVkZXN0dWZmLCBmaW5hbHN0dWZmLCBpbml0c3R1ZmYsIHZhcmlhYmxlc3R1ZmYpCkBAIC0yODQsNyArMjg0LDcgQEAKIGNoYXIgKmNwOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiaWkiLCAmZnJvbSwgJmxlbmd0aCkgKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGNwID0gX3NlbGYtPm9iX2l0c2VsZi0+YmFzZUFkZHIrZnJvbTsKIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKIHJldHVybiBfcmVzOwpAQCAtMjk5LDcgKzI5OSw3IEBACiBjaGFyICpjcCwgKmljcDsKIAogaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgImlzIyIsICZmcm9tLCAmaWNwLCAmbGVuZ3RoKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogY3AgPSBfc2VsZi0+b2JfaXRzZWxmLT5iYXNlQWRkcitmcm9tOwogbWVtY3B5KGNwLCBpY3AsIGxlbmd0aCk7CiBQeV9JTkNSRUYoUHlfTm9uZSk7CkBAIC0zMjEsMjQgKzMyMSwyNCBAQAogY2hhciAqZGF0YTsKIAogaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8haU8mIiwgJlB5U3RyaW5nX1R5cGUsICZzb3VyY2UsICZyb3dieXRlcywgUHlNYWNfR2V0UmVjdCwKLQkJJmJvdW5kcykgKQotCXJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICZib3VuZHMpICkKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBkYXRhID0gUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKIGlmICgocHRyPShCaXRNYXAgKiltYWxsb2Moc2l6ZW9mKEJpdE1hcCkpKSA9PSBOVUxMICkKLQlyZXR1cm4gUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIFB5RXJyX05vTWVtb3J5KCk7CiBwdHItPmJhc2VBZGRyID0gKFB0cilkYXRhOwogcHRyLT5yb3dCeXRlcyA9IHJvd2J5dGVzOwogcHRyLT5ib3VuZHMgPSBib3VuZHM7CiBpZiAoIChfcmVzID0gQk1PYmpfTmV3KHB0cikpID09IE5VTEwgKSB7Ci0JZnJlZShwdHIpOwotCXJldHVybiBOVUxMOworICAgICAgICBmcmVlKHB0cik7CisgICAgICAgIHJldHVybiBOVUxMOwogfQogKChCaXRNYXBPYmplY3QgKilfcmVzKS0+cmVmZXJyZWRfb2JqZWN0ID0gc291cmNlOwogUHlfSU5DUkVGKHNvdXJjZSk7CiAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9iaXRtYXAgPSBwdHI7CiByZXR1cm4gX3JlczsKICIiIgotCQorCiBmID0gTWFudWFsR2VuZXJhdG9yKCJCaXRNYXAiLCBCaXRNYXBfYm9keSkKIGYuZG9jc3RyaW5nID0gbGFtYmRhOiAiIiJUYWtlIChzdHJpbmcsIGludCwgUmVjdCkgYXJndW1lbnQgYW5kIGNyZWF0ZSBCaXRNYXAiIiIKIG1vZHVsZS5hZGQoZikKQEAgLTM1MSwyMiArMzUxLDIyIEBACiBQeU9iamVjdCAqc291cmNlOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyEiLCAmUHlTdHJpbmdfVHlwZSwgJnNvdXJjZSkgKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIGlmICggUHlTdHJpbmdfU2l6ZShzb3VyY2UpICE9IHNpemVvZihCaXRNYXApICYmIFB5U3RyaW5nX1NpemUoc291cmNlKSAhPSBzaXplb2YoUGl4TWFwKSApIHsKLQlQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAKLQkJIkFyZ3VtZW50IHNpemUgd2FzICVkLCBzaG91bGQgYmUgJWQgKHNpemVvZiBCaXRNYXApIG9yICVkIChzaXplb2YgUGl4TWFwKSIsIAotCQlQeVN0cmluZ19TaXplKHNvdXJjZSksIHNpemVvZihCaXRNYXApLCBzaXplb2YoUGl4TWFwKSk7Ci0JcmV0dXJuIE5VTEw7CisgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCisgICAgICAgICAgICAgICAgIkFyZ3VtZW50IHNpemUgd2FzICVkLCBzaG91bGQgYmUgJWQgKHNpemVvZiBCaXRNYXApIG9yICVkIChzaXplb2YgUGl4TWFwKSIsCisgICAgICAgICAgICAgICAgUHlTdHJpbmdfU2l6ZShzb3VyY2UpLCBzaXplb2YoQml0TWFwKSwgc2l6ZW9mKFBpeE1hcCkpOworICAgICAgICByZXR1cm4gTlVMTDsKIH0KIHB0ciA9IChCaXRNYXBQdHIpUHlTdHJpbmdfQXNTdHJpbmcoc291cmNlKTsKIGlmICggKF9yZXMgPSBCTU9ial9OZXcocHRyKSkgPT0gTlVMTCApIHsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiAoKEJpdE1hcE9iamVjdCAqKV9yZXMpLT5yZWZlcnJlZF9vYmplY3QgPSBzb3VyY2U7CiBQeV9JTkNSRUYoc291cmNlKTsKIHJldHVybiBfcmVzOwogIiIiCi0JCisKIGYgPSBNYW51YWxHZW5lcmF0b3IoIlJhd0JpdE1hcCIsIFJhd0JpdE1hcF9ib2R5KQogZi5kb2NzdHJpbmcgPSBsYW1iZGE6ICIiIlRha2Ugc3RyaW5nIEJpdE1hcCBhbmQgdHVybiBpbnRvIEJpdE1hcCBvYmplY3QiIiIKIG1vZHVsZS5hZGQoZikKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3Fkb2Zmcy9xZG9mZnNzY2FuLnB5IGIvTWFjL01vZHVsZXMvcWRvZmZzL3Fkb2Zmc3NjYW4ucHkKaW5kZXggYWU3MDcwNy4uZDQ1NmUwMCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcWRvZmZzL3Fkb2Zmc3NjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvcWRvZmZzL3Fkb2Zmc3NjYW4ucHkKQEAgLTcsNjEgKzcsNjAgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIGRlZiBtYWluKCk6Ci0JaW5wdXQgPSAiUURPZmZzY3JlZW4uaCIKLQlvdXRwdXQgPSAicWRvZmZzZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgIlFET2Zmc2NyZWVuLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWltcG9ydCBxZG9mZnNzdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJRRE9mZnNjcmVlbi5oIgorICAgIG91dHB1dCA9ICJxZG9mZnNnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiUURPZmZzY3JlZW4ucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgaW1wb3J0IHFkb2Zmc3N1cHBvcnQKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gIkdXb3JsZFB0ciIgYW5kIG0gaW4gKCJJbk1vZGUiLCAiSW5PdXRNb2RlIik6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCA9PSAiR1dvcmxkUHRyIiBhbmQgbSBpbiAoIkluTW9kZSIsICJJbk91dE1vZGUiKToKKyAgICAgICAgICAgICAgICBjbGFzc25hbWUgPSAiTWV0aG9kIgorICAgICAgICAgICAgICAgIGxpc3RuYW1lID0gIm1ldGhvZHMiCisgICAgICAgIHJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCiAKLQlkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQknRGlzcG9zZUdXb3JsZCcsICMgSW1wbGllZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVsZXRlZAotCQkJJ05ld0dXb3JsZEZyb21IQklUTUFQJywgIyBEb24ndCBrbm93IHdoYXQgdGhlIGFyZ3MgZG8KLQkJCSdHZXRHRGV2aWNlQXR0cmlidXRlcycsICMgV2luZG93cy1vbmx5Ci0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnRGlzcG9zZUdXb3JsZCcsICMgSW1wbGllZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVsZXRlZAorICAgICAgICAgICAgICAgICdOZXdHV29ybGRGcm9tSEJJVE1BUCcsICMgRG9uJ3Qga25vdyB3aGF0IHRoZSBhcmdzIGRvCisgICAgICAgICAgICAgICAgJ0dldEdEZXZpY2VBdHRyaWJ1dGVzJywgIyBXaW5kb3dzLW9ubHkKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJInZvaWRfcHRyIiwJCSMgR2V0R0RldmljZVN1cmZhY2UsIGJsYWNrbGlzdGVkIGZvciBub3cKLQkJCSJQdHIiLAkJCSMgQWdhaW4sIGZvciBub3cgKGFycmF5IGlzIHByb2JhYmx5IG9rIGhlcmUpCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAidm9pZF9wdHIiLCAgICAgICAgICAgICAjIEdldEdEZXZpY2VTdXJmYWNlLCBibGFja2xpc3RlZCBmb3Igbm93CisgICAgICAgICAgICAgICAgIlB0ciIsICAgICAgICAgICAgICAgICAgIyBBZ2FpbiwgZm9yIG5vdyAoYXJyYXkgaXMgcHJvYmFibHkgb2sgaGVyZSkKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCQotIyMgCQkJKCJVcGRhdGVHV29ybGQiLAotIyMgCQkJIFsoIkdXb3JsZFB0ciIsICIqIiwgIk91dE1vZGUiKV0sCi0jIyAJCQkgWygiKiIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkjIFRoaXMgb25lIGlzIGluY29ycmVjdDogd2Ugc2F5IHRoYXQgYWxsIGlucHV0IGdkZXZpY2VzIGFyZQotCQkJIyBvcHRpb25hbCwgYnV0IHNvbWUgYXJlIG5vdC4gTW9zdCBhcmUsIGhvd2V2ZXIsIHNvIHVzZXJzIHBhc3NpbmcKLQkJCSMgTm9uZSBmb3Igbm9uLW9wdGlvbmFsIGdkZXZpY2VzIHdpbGwgZ2V0IGEgcWQgZXJyb3IsIEkgZ3Vlc3MsIGluCi0JCQkjIHN0ZWFkIG9mIGEgcHl0aG9uIGFyZ3VtZW50IGVycm9yLgotCQkJKFsoIkdESGFuZGxlIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIk9wdEdESGFuZGxlIiwgIioiLCAiSW5Nb2RlIildKSwKLQkJCV0KKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKworIyMgICAgICAgICAgICAgICAgICAgICAgKCJVcGRhdGVHV29ybGQiLAorIyMgICAgICAgICAgICAgICAgICAgICAgIFsoIkdXb3JsZFB0ciIsICIqIiwgIk91dE1vZGUiKV0sCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiKiIsICIqIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIFRoaXMgb25lIGlzIGluY29ycmVjdDogd2Ugc2F5IHRoYXQgYWxsIGlucHV0IGdkZXZpY2VzIGFyZQorICAgICAgICAgICAgICAgICMgb3B0aW9uYWwsIGJ1dCBzb21lIGFyZSBub3QuIE1vc3QgYXJlLCBob3dldmVyLCBzbyB1c2VycyBwYXNzaW5nCisgICAgICAgICAgICAgICAgIyBOb25lIGZvciBub24tb3B0aW9uYWwgZ2RldmljZXMgd2lsbCBnZXQgYSBxZCBlcnJvciwgSSBndWVzcywgaW4KKyAgICAgICAgICAgICAgICAjIHN0ZWFkIG9mIGEgcHl0aG9uIGFyZ3VtZW50IGVycm9yLgorICAgICAgICAgICAgICAgIChbKCJHREhhbmRsZSIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3B0R0RIYW5kbGUiLCAiKiIsICJJbk1vZGUiKV0pLAorICAgICAgICAgICAgICAgIF0KIAogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKLQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcWRvZmZzL3Fkb2Zmc3N1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc3VwcG9ydC5weQppbmRleCAxYmQ4ZjVhLi4xNjE3NzczIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9xZG9mZnMvcWRvZmZzc3VwcG9ydC5weQpAQCAtNiwxNyArNiwxNyBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ1FET2Zmc2NyZWVuLmgnCQkjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQotTU9ETkFNRSA9ICdfUWRvZmZzJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnR1dvcmxkJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitNQUNIRUFERVJGSUxFID0gJ1FET2Zmc2NyZWVuLmgnICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX1Fkb2ZmcycgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdHV29ybGQnICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdRZG9mZnMnCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUHRyJwkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE9CSkVDVE5BTUUgKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnUWRvZmZzJyAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUHRyJyAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBPQkpFQ1ROQU1FICsgJ09iaicgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgogI0VESVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZWRpdC5weScgIyBUaGUgbWFudWFsIGRlZmluaXRpb25zCi1PVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIJIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCitPVVRQVVRGSUxFID0gTU9ETkFNRSArICJtb2R1bGUuYyIgICAgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC00OSwyOCArNDksMjggQEAKICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhHV29ybGRQdHIsIEdXb3JsZE9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChHV29ybGRQdHIsIEdXb3JsZE9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoR1dvcmxkUHRyLCBHV29ybGRPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEdXb3JsZFB0ciwgR1dvcmxkT2JqX0NvbnZlcnQpOwogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JIyBYWFhYIFNob3VsZCBpbmhlcml0IGZyb20gR3JhZlB0cj8KLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCi0jIyAJZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotIyMgCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0jIyAJCU91dHB1dCgiU2V0V1JlZkNvbihpdHNlbGYsIChsb25nKWl0KTsiKQotIyMgCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0jIyAJCU91dExicmFjZSgiaWYgKERsZ09ial9DaGVjayh2KSkiKQotIyMgCQlPdXRwdXQoIipwX2l0c2VsZiA9ICgoV2luZG93T2JqZWN0ICopdiktPm9iX2l0c2VsZjsiKQotIyMgCQlPdXRwdXQoInJldHVybiAxOyIpCi0jIyAJCU91dFJicmFjZSgpCi0jIyAJCU91dCgiIiIKLSMjIAkJaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQotIyMgCQlpZiAoUHlJbnRfQ2hlY2sodikpIHsgKnBfaXRzZWxmID0gKFdpbmRvd1B0cilQeUludF9Bc0xvbmcodik7IHJldHVybiAxOyB9Ci0jIyAJCSIiIikKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoIkRpc3Bvc2VHV29ybGQoJXMpOyIsIGl0c2VsZm5hbWUpCisgICAgIyBYWFhYIFNob3VsZCBpbmhlcml0IGZyb20gR3JhZlB0cj8KKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKGl0c2VsZiA9PSBOVUxMKSByZXR1cm4gUHlNYWNfRXJyb3IocmVzTm90Rm91bmQpOyIpCisjIyAgICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyMjICAgICAgICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisjIyAgICAgICAgICAgICAgT3V0cHV0KCJTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOyIpCisjIyAgICAgIGRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6CisjIyAgICAgICAgICAgICAgT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NoZWNrKHYpKSIpCisjIyAgICAgICAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFdpbmRvd09iamVjdCAqKXYpLT5vYl9pdHNlbGY7IikKKyMjICAgICAgICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisjIyAgICAgICAgICAgICAgT3V0UmJyYWNlKCkKKyMjICAgICAgICAgICAgICBPdXQoIiIiCisjIyAgICAgICAgICAgICAgaWYgKHYgPT0gUHlfTm9uZSkgeyAqcF9pdHNlbGYgPSBOVUxMOyByZXR1cm4gMTsgfQorIyMgICAgICAgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyMjICAgICAgICAgICAgICAiIiIpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJEaXNwb3NlR1dvcmxkKCVzKTsiLCBpdHNlbGZuYW1lKQogIyBGcm9tIGhlcmUgb24gaXQncyBiYXNpY2FsbHkgYWxsIGJvaWxlciBwbGF0ZS4uLgogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCkBAIC0xMDAsNyArMTAwLDcgQEAKIGNoYXIgKmNwOwogCiBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZpaSIsIFJlc09ial9Db252ZXJ0LCAmcG0sICZmcm9tLCAmbGVuZ3RoKSApCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogY3AgPSBHZXRQaXhCYXNlQWRkcihwbSkrZnJvbTsKIF9yZXMgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjcCwgbGVuZ3RoKTsKIHJldHVybiBfcmVzOwpAQCAtMTE2LDcgKzExNiw3IEBACiBjaGFyICpjcCwgKmljcDsKIAogaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8maXMjIiwgUmVzT2JqX0NvbnZlcnQsICZwbSwgJmZyb20sICZpY3AsICZsZW5ndGgpICkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBjcCA9IEdldFBpeEJhc2VBZGRyKHBtKStmcm9tOwogbWVtY3B5KGNwLCBpY3AsIGxlbmd0aCk7CiBQeV9JTkNSRUYoUHlfTm9uZSk7CmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xdC9xdHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9xdC9xdHNjYW4ucHkKaW5kZXggYjc1NmJmZS4uYTJkYmExNSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcXQvcXRzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL3F0L3F0c2Nhbi5weQpAQCAtOSwzMTEgKzksMzExIEBACiBMT05HID0gIlF1aWNrVGltZSIKIFNIT1JUID0gInF0IgogSEVBREVSRklMRVM9ICgKLSMJIkNvbXBvbmVudHMuaCIgIC0tIEluIENhcmJvbi5DbQotCSJNb3ZpZXMuaCIsIAotCSJJbWFnZUNvbXByZXNzaW9uLmgiLCAKLQkiUXVpY2tUaW1lQ29tcG9uZW50cy5oIiwKLSMJIkltYWdlQ29kZWMuaCIgIC0tIHNlZW1zIG5vdCB0b28gdXNlZnVsLCBhbmQgZGlmZmljdWx0LgotIwkiSXNvY2hyb25vdXNEYXRhSGFuZGxlcnMuaCIgLS0gSXMgdGhpcyB1c2VmdWw/Ci0JIk1lZGlhSGFuZGxlcnMuaCIsCi0jCSJRVE1MLmgiLCAtLSBXaW5kb3dzIG9ubHksIG5lZWRzIHNlcGFyYXRlIG1vZHVsZQotIwkiUXVpY2tUaW1lU3RyZWFtaW5nLmgiLCAtLSBEaWZmaWN1bHQKLSMJIlFUU3RyZWFtaW5nQ29tcG9uZW50cy5oIiwgLS0gTmVlZHMgUVRTdHJlYW1pbmcKLQkiUXVpY2tUaW1lTXVzaWMuaCIsCi0jCSJRdWlja1RpbWVWUi5oIiwgLS0gTm90IGRvbmUgeWV0Ci0jCSJTb3VuZC5oIiwgLS0gSW4gQ2FyYm9uLlNuZAotCSkKLU9CSkVDVFMgPSAoIk1vdmllIiwgIlRyYWNrIiwgIk1lZGlhIiwgIlVzZXJEYXRhIiwgIlRpbWVCYXNlIiwgIk1vdmllQ29udHJvbGxlciIsIAotCSJJZGxlTWFuYWdlciIsICJTR091dHB1dCIpCisjICAgICAgICJDb21wb25lbnRzLmgiICAtLSBJbiBDYXJib24uQ20KKyAgICAgICAgIk1vdmllcy5oIiwKKyAgICAgICAgIkltYWdlQ29tcHJlc3Npb24uaCIsCisgICAgICAgICJRdWlja1RpbWVDb21wb25lbnRzLmgiLAorIyAgICAgICAiSW1hZ2VDb2RlYy5oIiAgLS0gc2VlbXMgbm90IHRvbyB1c2VmdWwsIGFuZCBkaWZmaWN1bHQuCisjICAgICAgICJJc29jaHJvbm91c0RhdGFIYW5kbGVycy5oIiAtLSBJcyB0aGlzIHVzZWZ1bD8KKyAgICAgICAgIk1lZGlhSGFuZGxlcnMuaCIsCisjICAgICAgICJRVE1MLmgiLCAtLSBXaW5kb3dzIG9ubHksIG5lZWRzIHNlcGFyYXRlIG1vZHVsZQorIyAgICAgICAiUXVpY2tUaW1lU3RyZWFtaW5nLmgiLCAtLSBEaWZmaWN1bHQKKyMgICAgICAgIlFUU3RyZWFtaW5nQ29tcG9uZW50cy5oIiwgLS0gTmVlZHMgUVRTdHJlYW1pbmcKKyAgICAgICAgIlF1aWNrVGltZU11c2ljLmgiLAorIyAgICAgICAiUXVpY2tUaW1lVlIuaCIsIC0tIE5vdCBkb25lIHlldAorIyAgICAgICAiU291bmQuaCIsIC0tIEluIENhcmJvbi5TbmQKKyAgICAgICAgKQorT0JKRUNUUyA9ICgiTW92aWUiLCAiVHJhY2siLCAiTWVkaWEiLCAiVXNlckRhdGEiLCAiVGltZUJhc2UiLCAiTW92aWVDb250cm9sbGVyIiwKKyAgICAgICAgIklkbGVNYW5hZ2VyIiwgIlNHT3V0cHV0IikKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IEhFQURFUkZJTEVTCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0Jc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gSEVBREVSRklMRVMKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyBMT05HICsgIi5weSIKKyAgICBzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBzY2FubmVyLmdlbnR5cGV0ZXN0KFNIT1JUKyJ0eXBldGVzdC5weSIpCisgICAgcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKKyAgICBleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCisgICAgcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCisgICAgZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCiAKIGNsYXNzIE15U2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiBPQkpFQ1RTIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSB0ICsgIl9tZXRob2RzIgorICAgICAgICByZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQogCi0JZGVmIHdyaXRlaW5pdGlhbGRlZnMoc2VsZik6Ci0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInhtbElkZW50aWZpZXJVbnJlY29nbml6ZWQgPSAtMVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgia0NvbnRyb2xsZXJNaW5pbXVtID0gLTB4Zjc3N1xuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgibm90SW1wbGVtZW50ZWRNdXNpY09TRXJyICAgICAgPSAtMjA3MVxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiY2FudFNlbmRUb1N5bnRoZXNpemVyT1NFcnIgICAgPSAtMjA3MlxuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiY2FudFJlY2VpdmVGcm9tU3ludGhlc2l6ZXJPU0VyciA9IC0yMDczXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsVm9pY2VBbGxvY2F0aW9uT1NFcnIgICA9IC0yMDc0XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsUGFydE9TRXJyICAgICAgICAgICAgICA9IC0yMDc1XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsQ2hhbm5lbE9TRXJyICAgICAgICAgICA9IC0yMDc2XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsS25vYk9TRXJyICAgICAgICAgICAgICA9IC0yMDc3XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsS25vYlZhbHVlT1NFcnIgICAgICAgICA9IC0yMDc4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsSW5zdHJ1bWVudE9TRXJyICAgICAgICA9IC0yMDc5XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsQ29udHJvbGxlck9TRXJyICAgICAgICA9IC0yMDgwXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJtaWRpTWFuYWdlckFic2VudE9TRXJyICAgICAgICA9IC0yMDgxXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJzeW50aGVzaXplck5vdFJlc3BvbmRpbmdPU0VyciA9IC0yMDgyXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJzeW50aGVzaXplck9TRXJyICAgICAgICAgICAgICA9IC0yMDgzXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJpbGxlZ2FsTm90ZUNoYW5uZWxPU0VyciAgICAgICA9IC0yMDg0XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJub3RlQ2hhbm5lbE5vdEFsbG9jYXRlZE9TRXJyICA9IC0yMDg1XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJ0dW5lUGxheWVyRnVsbE9TRXJyICAgICAgICAgICA9IC0yMDg2XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJ0dW5lUGFyc2VPU0VyciAgICAgICAgICAgICAgICA9IC0yMDg3XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJ4bWxJZGVudGlmaWVyVW5yZWNvZ25pemVkID0gLTFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImtDb250cm9sbGVyTWluaW11bSA9IC0weGY3NzdcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoIm5vdEltcGxlbWVudGVkTXVzaWNPU0VyciAgICAgID0gLTIwNzFcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImNhbnRTZW5kVG9TeW50aGVzaXplck9TRXJyICAgID0gLTIwNzJcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImNhbnRSZWNlaXZlRnJvbVN5bnRoZXNpemVyT1NFcnIgPSAtMjA3M1xuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbFZvaWNlQWxsb2NhdGlvbk9TRXJyICAgPSAtMjA3NFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbFBhcnRPU0VyciAgICAgICAgICAgICAgPSAtMjA3NVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbENoYW5uZWxPU0VyciAgICAgICAgICAgPSAtMjA3NlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbEtub2JPU0VyciAgICAgICAgICAgICAgPSAtMjA3N1xuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbEtub2JWYWx1ZU9TRXJyICAgICAgICAgPSAtMjA3OFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbEluc3RydW1lbnRPU0VyciAgICAgICAgPSAtMjA3OVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbENvbnRyb2xsZXJPU0VyciAgICAgICAgPSAtMjA4MFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgibWlkaU1hbmFnZXJBYnNlbnRPU0VyciAgICAgICAgPSAtMjA4MVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgic3ludGhlc2l6ZXJOb3RSZXNwb25kaW5nT1NFcnIgPSAtMjA4MlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgic3ludGhlc2l6ZXJPU0VyciAgICAgICAgICAgICAgPSAtMjA4M1xuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgiaWxsZWdhbE5vdGVDaGFubmVsT1NFcnIgICAgICAgPSAtMjA4NFxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgibm90ZUNoYW5uZWxOb3RBbGxvY2F0ZWRPU0VyciAgPSAtMjA4NVxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgidHVuZVBsYXllckZ1bGxPU0VyciAgICAgICAgICAgPSAtMjA4NlxuIikKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgidHVuZVBhcnNlT1NFcnIgICAgICAgICAgICAgICAgPSAtMjA4N1xuIikKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkieG1sSWRlbnRpZmllclVucmVjb2duaXplZCIsICMgY29uc3Qgd2l0aCBpbmNvbXBhdGlibGUgZGVmaW5pdGlvbgotCQkJIkRpc3Bvc2VNb3ZpZSIsCQkjIERvbmUgb24gcHl0aG9uLW9iamVjdCBkaXNwb3NhbAotCQkJIkRpc3Bvc2VNb3ZpZVRyYWNrIiwJIyBkaXR0bwotCQkJIkRpc3Bvc2VUcmFja01lZGlhIiwJIyBkaXR0bwotCQkJIkRpc3Bvc2VVc2VyRGF0YSIsCQkjIGRpdHRvCi0jCQkJIkRpc3Bvc2VUaW1lQmFzZSIsCQkjIGRpdHRvCi0JCQkiRGlzcG9zZU1vdmllQ29udHJvbGxlciIsICMgZGl0dG8KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJ4bWxJZGVudGlmaWVyVW5yZWNvZ25pemVkIiwgIyBjb25zdCB3aXRoIGluY29tcGF0aWJsZSBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VNb3ZpZSIsICAgICAgICAgIyBEb25lIG9uIHB5dGhvbi1vYmplY3QgZGlzcG9zYWwKKyAgICAgICAgICAgICAgICAiRGlzcG9zZU1vdmllVHJhY2siLCAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VUcmFja01lZGlhIiwgICAgIyBkaXR0bworICAgICAgICAgICAgICAgICJEaXNwb3NlVXNlckRhdGEiLCAgICAgICAgICAgICAgIyBkaXR0bworIyAgICAgICAgICAgICAgICAgICAgICAgIkRpc3Bvc2VUaW1lQmFzZSIsICAgICAgICAgICAgICAjIGRpdHRvCisgICAgICAgICAgICAgICAgIkRpc3Bvc2VNb3ZpZUNvbnRyb2xsZXIiLCAjIGRpdHRvCiAKLQkJCSMgVGhlIGZvbGxvd2luZyA0IHVzZSAndm9pZCAqJyBpbiBhbiB1bmNvbnRyb2xsZWQgd2F5Ci0JCQkjIFRCRCB3aGVuIEkndmUgcmVhZCB0aGUgbWFudWFsLi4uCi0JCQkiR2V0VXNlckRhdGFJdGVtIiwKLQkJCSJTZXRVc2VyRGF0YUl0ZW0iLAotCQkJIlNldFRleHRTYW1wbGVEYXRhIiwKLQkJCSJCZWdpbkZ1bGxTY3JlZW4iLAotCQkJIyBiZ2VuIGdldHMgdGhlIGFyZ3VtZW50IGluL291dCB3cm9uZy4uCi0JCQkiQWRkVGV4dFNhbXBsZSIsCi0JCQkiQWRkVEVTYW1wbGUiLAotCQkJIkFkZEhpbGl0ZVNhbXBsZSIsCi0JCQkiSGlsaXRlVGV4dFNhbXBsZSIsCi0JCQkKLQkJCSJNYWtlVHJhY2tUaW1lVGFibGUiLCAjIFVzZXMgbG9uZyAqIHJldHVybj8KLQkJCSJNYWtlTWVkaWFUaW1lVGFibGUiLCAjIGRpdHRvCi0jIwkJCSJWaWRlb01lZGlhR2V0U3RhbGxDb3VudCIsICMgVW5kZWZpbmVkIGluIENXIFBybyAzIGxpYnJhcnkKLQkJCSMgT1M4IG9ubHk6Ci0JCQknU3ByaXRlTWVkaWFHZXRJbmRJbWFnZVByb3BlcnR5JywJIyBYWFhYIFdoeSBpc24ndCB0aGlzIGluIGNhcmJvbj8KLQkJCSdDaGVja1F1aWNrVGltZVJlZ2lzdHJhdGlvbicsCi0JCQknU2V0TW92aWVBbmNob3JEYXRhUmVmJywKLQkJCSdHZXRNb3ZpZUFuY2hvckRhdGFSZWYnLAotCQkJJ0dldE1vdmllTG9hZFN0YXRlJywKLQkJCSdPcGVuQURhdGFIYW5kbGVyJywKLQkJCSdNb3ZpZU1lZGlhR2V0Q3VycmVudE1vdmllUHJvcGVydHknLAotCQkJJ01vdmllTWVkaWFHZXRDdXJyZW50VHJhY2tQcm9wZXJ0eScsCi0JCQknTW92aWVNZWRpYUdldENoaWxkTW92aWVEYXRhUmVmZXJlbmNlJywKLQkJCSdNb3ZpZU1lZGlhU2V0Q2hpbGRNb3ZpZURhdGFSZWZlcmVuY2UnLAotCQkJJ01vdmllTWVkaWFMb2FkQ2hpbGRNb3ZpZUZyb21EYXRhUmVmZXJlbmNlJywKLQkJCSdNZWRpYTNER2V0Vmlld09iamVjdCcsCisgICAgICAgICAgICAgICAgIyBUaGUgZm9sbG93aW5nIDQgdXNlICd2b2lkIConIGluIGFuIHVuY29udHJvbGxlZCB3YXkKKyAgICAgICAgICAgICAgICAjIFRCRCB3aGVuIEkndmUgcmVhZCB0aGUgbWFudWFsLi4uCisgICAgICAgICAgICAgICAgIkdldFVzZXJEYXRhSXRlbSIsCisgICAgICAgICAgICAgICAgIlNldFVzZXJEYXRhSXRlbSIsCisgICAgICAgICAgICAgICAgIlNldFRleHRTYW1wbGVEYXRhIiwKKyAgICAgICAgICAgICAgICAiQmVnaW5GdWxsU2NyZWVuIiwKKyAgICAgICAgICAgICAgICAjIGJnZW4gZ2V0cyB0aGUgYXJndW1lbnQgaW4vb3V0IHdyb25nLi4KKyAgICAgICAgICAgICAgICAiQWRkVGV4dFNhbXBsZSIsCisgICAgICAgICAgICAgICAgIkFkZFRFU2FtcGxlIiwKKyAgICAgICAgICAgICAgICAiQWRkSGlsaXRlU2FtcGxlIiwKKyAgICAgICAgICAgICAgICAiSGlsaXRlVGV4dFNhbXBsZSIsCiAKLSAgICAgICAgICAgICMgdGhlc2UgYXJlIEltYWdlQ29tcHJlc3Npb24gYmxhY2tsaXN0cwotCQkJIkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQdHIiLAotCQkJCi0JCQkjIFF1aWNrVGltZUNvbXBvbmVudHMKLQkJCSMgVGhlc2UgdHdvIG5lZWQgc29tZSBoZWxwOiB0aGUgZmlyc3QgcmV0dXJucyBhIHBvaW50IHRvIGEgZGF0YWJ1ZmZlciB0aGF0Ci0JCQkjIHRoZSBzZWNvbmQgZGlzcG9zZXMuIEdlbmVyYXRlIG1hbnVhbGx5PwotCQkJIlZEQ29tcHJlc3NEb25lIiwKLQkJCSJWRFJlbGVhc2VDb21wcmVzc0J1ZmZlciIsCi0JCQkiUVRWaWRlb091dHB1dEdldEdXb3JsZFBhcmFtZXRlcnMiLCAjIEhvdyB1c2VmdWwgaXMgdGhpcz8KLQkJCQotCQkJIyBNZWRpYUhhbmRsZXJzCi0JCQkiTWVkaWFNYWtlTWVkaWFUaW1lVGFibGUiLCAjIGp1c3QgbGF6eQotCQkJIk1lZGlhR2V0U2FtcGxlRGF0YVBvaW50ZXIiLCAjIGZ1bm55IG91dHB1dCBwb2ludGVyCi0JCQkKLQkJCSMgUXVpY2tUaW1lTXVzaWMKLQkJCSJrQ29udHJvbGxlck1pbmltdW0iLAotCQkJIyBUaGVzZSBhcmUgYXJ0ZWZhY3RzIG9mIGEgbWFjcm8gZGVmaW5pdGlvbgotCQkJInVsZW4iLAotCQkJIl9leHQiLAotCQkJIngiLAotCQkJIncxIiwKLQkJCSJ3MiIsCi0JCQldCisgICAgICAgICAgICAgICAgIk1ha2VUcmFja1RpbWVUYWJsZSIsICMgVXNlcyBsb25nICogcmV0dXJuPworICAgICAgICAgICAgICAgICJNYWtlTWVkaWFUaW1lVGFibGUiLCAjIGRpdHRvCisjIyAgICAgICAgICAgICAgICAgICAgICAiVmlkZW9NZWRpYUdldFN0YWxsQ291bnQiLCAjIFVuZGVmaW5lZCBpbiBDVyBQcm8gMyBsaWJyYXJ5CisgICAgICAgICAgICAgICAgIyBPUzggb25seToKKyAgICAgICAgICAgICAgICAnU3ByaXRlTWVkaWFHZXRJbmRJbWFnZVByb3BlcnR5JywgICAgICAgIyBYWFhYIFdoeSBpc24ndCB0aGlzIGluIGNhcmJvbj8KKyAgICAgICAgICAgICAgICAnQ2hlY2tRdWlja1RpbWVSZWdpc3RyYXRpb24nLAorICAgICAgICAgICAgICAgICdTZXRNb3ZpZUFuY2hvckRhdGFSZWYnLAorICAgICAgICAgICAgICAgICdHZXRNb3ZpZUFuY2hvckRhdGFSZWYnLAorICAgICAgICAgICAgICAgICdHZXRNb3ZpZUxvYWRTdGF0ZScsCisgICAgICAgICAgICAgICAgJ09wZW5BRGF0YUhhbmRsZXInLAorICAgICAgICAgICAgICAgICdNb3ZpZU1lZGlhR2V0Q3VycmVudE1vdmllUHJvcGVydHknLAorICAgICAgICAgICAgICAgICdNb3ZpZU1lZGlhR2V0Q3VycmVudFRyYWNrUHJvcGVydHknLAorICAgICAgICAgICAgICAgICdNb3ZpZU1lZGlhR2V0Q2hpbGRNb3ZpZURhdGFSZWZlcmVuY2UnLAorICAgICAgICAgICAgICAgICdNb3ZpZU1lZGlhU2V0Q2hpbGRNb3ZpZURhdGFSZWZlcmVuY2UnLAorICAgICAgICAgICAgICAgICdNb3ZpZU1lZGlhTG9hZENoaWxkTW92aWVGcm9tRGF0YVJlZmVyZW5jZScsCisgICAgICAgICAgICAgICAgJ01lZGlhM0RHZXRWaWV3T2JqZWN0JywKIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkjIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBkbyB0aGVzZQotCQkJIlFUU3luY1Rhc2tQdHIiLAotCQkJIyBXZSBkb250IGRvIGNhbGxiYWNrcyB5ZXQsIHNvIG5vIG5lZWQgZm9yIHRoZXNlCi0JCQkiUVRDYWxsQmFjayIsCi0JCQkjIFNraXBwZWQgZm9yIG5vdywgZHVlIHRvIGxhemluZXNzCi0JCQkiVHJhY2tFZGl0U3RhdGUiLAotCQkJIk1vdmllRWRpdFN0YXRlIiwKLQkJCSJNYXRyaXhSZWNvcmQiLAotCQkJIk1hdHJpeFJlY29yZF9wdHIiLAotCQkJIlNhbXBsZVJlZmVyZW5jZVB0ciIsCi0JCQkiUVRUd2VlbmVyIiwKLQkJCSJRVEVycm9yUmVwbGFjZW1lbnRQdHIiLAotCQkJIlFUUmVzdHJpY3Rpb25TZXQiLAotCQkJIlFUVVVJRCIsCi0JCQkiUVRVVUlEX3B0ciIsCisgICAgIyB0aGVzZSBhcmUgSW1hZ2VDb21wcmVzc2lvbiBibGFja2xpc3RzCisgICAgICAgICAgICAgICAgIkdyYXBoaWNzRXhwb3J0R2V0SW5wdXRQdHIiLAogCi0JCQkjIFJvdXRpbmUgcG9pbnRlcnMsIG5vdCB5ZXQuCi0JCQkiTW92aWVzRXJyb3JVUFAiLAotCQkJIk1vdmllUHJldmlld0NhbGxPdXRVUFAiLAotCQkJIk1vdmllRHJhd2luZ0NvbXBsZXRlVVBQIiwKLQkJCSJRVENhbGxCYWNrVVBQIiwKLQkJCSJUZXh0TWVkaWFVUFAiLAotCQkJIk1vdmllUHJvZ3Jlc3NVUFAiLAotCQkJIk1vdmllUmduQ292ZXJVUFAiLAotCQkJIk1DQWN0aW9uRmlsdGVyVVBQIiwKLQkJCSJNQ0FjdGlvbkZpbHRlcldpdGhSZWZDb25VUFAiLAotCQkJIkdldE1vdmllVVBQIiwKLQkJCSJNb2RhbEZpbHRlclVQUCIsCi0JCQkiVHJhY2tUcmFuc2ZlclVQUCIsCi0JCQkiTW92aWVQcmVQcmVyb2xsQ29tcGxldGVVUFAiLAotCQkJIk1vdmllRXhlY3V0ZVdpcmVkQWN0aW9uc1VQUCIsCi0JCQkiUVRCYW5kd2lkdGhOb3RpZmljYXRpb25VUFAiLAotCQkJIkRvTUNBY3Rpb25VUFAiLAotCQkJIlFUTmV4dFRhc2tOZWVkZWRTb29uZXJDYWxsYmFja1VQUCIsCi0JCQkKLQkJCSJTYW1wbGVSZWZlcmVuY2U2NFB0ciIsCSMgRG9uJ3Qga25vdyB3aGF0IHRoaXMgZG9lcywgeWV0Ci0JCQkiUVRSdW50aW1lU3ByaXRlRGVzY1B0ciIsCi0JCQkiUVRCYW5kd2lkdGhSZWZlcmVuY2UiLAotCQkJIlFUU2NoZWR1bGVkQmFuZHdpZHRoUmVmZXJlbmNlIiwKLQkJCSJRVEF0b21Db250YWluZXIiLAotCQkJIlNwcml0ZVdvcmxkIiwKLQkJCSJTcHJpdGUiLAorICAgICAgICAgICAgICAgICMgUXVpY2tUaW1lQ29tcG9uZW50cworICAgICAgICAgICAgICAgICMgVGhlc2UgdHdvIG5lZWQgc29tZSBoZWxwOiB0aGUgZmlyc3QgcmV0dXJucyBhIHBvaW50IHRvIGEgZGF0YWJ1ZmZlciB0aGF0CisgICAgICAgICAgICAgICAgIyB0aGUgc2Vjb25kIGRpc3Bvc2VzLiBHZW5lcmF0ZSBtYW51YWxseT8KKyAgICAgICAgICAgICAgICAiVkRDb21wcmVzc0RvbmUiLAorICAgICAgICAgICAgICAgICJWRFJlbGVhc2VDb21wcmVzc0J1ZmZlciIsCisgICAgICAgICAgICAgICAgIlFUVmlkZW9PdXRwdXRHZXRHV29ybGRQYXJhbWV0ZXJzIiwgIyBIb3cgdXNlZnVsIGlzIHRoaXM/CiAKLSAgICAgICAgICAgICMgdGhlc2UgYXJlIEltYWdlQ29tcHJlc3Npb24gYmxhY2tsaXN0cwotICAgICAgICAgICAgIklDTURhdGFVUFAiLAotICAgICAgICAgICAgIklDTUZsdXNoVVBQIiwKLSAgICAgICAgICAgICJJQ01Db21wbGV0aW9uVVBQIiwKLSAgICAgICAgICAgICJJQ01Qcm9ncmVzc1VQUCIsCi0gICAgICAgICAgICAiU3RkUGl4VVBQIiwKLSAgICAgICAgICAgICJRRFBpeFVQUCIsCi0gICAgICAgICAgICAiSUNNQWxpZ25tZW50VVBQIiwKLSAgICAgICAgICAgICJJQ01DdXJzb3JTaGllbGRlZFVQUCIsCi0gICAgICAgICAgICAiSUNNTWVtb3J5RGlzcG9zZWRVUFAiLAotICAgICAgICAgICAgIklDTUNvbnZlcnREYXRhRm9ybWF0VVBQIiwKLSAgICAgICAgICAgICJNb2RhbEZpbHRlcllEVVBQIiwKLQkJCSJGaWxlRmlsdGVyVVBQIiwKKyAgICAgICAgICAgICAgICAjIE1lZGlhSGFuZGxlcnMKKyAgICAgICAgICAgICAgICAiTWVkaWFNYWtlTWVkaWFUaW1lVGFibGUiLCAjIGp1c3QgbGF6eQorICAgICAgICAgICAgICAgICJNZWRpYUdldFNhbXBsZURhdGFQb2ludGVyIiwgIyBmdW5ueSBvdXRwdXQgcG9pbnRlcgogCi0gICAgICAgICAgICAiQ29kZWNOYW1lU3BlY0xpc3RQdHIiLAotICAgICAgICAgICAgIkNvZGVjSW5mbyIsCi0gICAgICAgICAgICAgIkltYWdlU2VxdWVuY2UiLAotICAgICAgICAgICAgIk1hdHJpeFJlY29yZFB0ciIsCi0gICAgICAgICAgICAiSUNNRGF0YVByb2NSZWNvcmRQdHIiLAotICAgICAgICAgICAgIk9wZW5DUGljUGFyYW1zIiwKLSAgICAgICAgICAgICJJQ01Qcm9ncmVzc1Byb2NSZWNvcmRQdHIiLAotICAgICAgICAgICAgIklDTUFsaWdubWVudFByb2NSZWNvcmRQdHIiLAotICAgICAgICAgICAgIklDTVBpeGVsRm9ybWF0SW5mb1B0ciIsCi0gICAgICAgICAgICAiSW1hZ2VTZXF1ZW5jZURhdGFTb3VyY2UiLAotICAgICAgICAgICAgIkNvbnN0U3RyRmlsZU5hbWVQYXJhbSIsCi0gICAgICAgICAgICAiSW1hZ2VUcmFuc2NvZGVTZXF1ZW5jZSIsCi0gICAgICAgICAgICAiSW1hZ2VGaWVsZFNlcXVlbmNlIiwKLSAgICAgICAgICAgICJGcmFjdCIsCi0gICAgICAgICAgICAiUGl4TWFwUHRyIiwKLSAgICAgICAgICAgICJHV29ybGRGbGFncyIsCi0gICAgICAgICAgICAidm9pZF9wdHIiLCAgICMgWFhYIEJlaW5nIGxhenksIHRoaXMgb25lIGlzIGRvYWJsZS4KLSAgICAgICAgICAgIAotICAgICAgICAgICAgIyBUaGVzZSBhcmUgZnJvbSBRdWlja1RpbWVDb21wb25lbnRzCi0gICAgICAgICAgICAiQ0RhdGFIYW5kbGVyVVBQIiwKLSAgICAgICAgICAgICJDaGFyRGF0YUhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIkNvbW1lbnRIYW5kbGVyVVBQIiwKLSAgICAgICAgICAgICJEYXRhSENvbXBsZXRpb25VUFAiLAotICAgICAgICAgICAgIidNb3ZpZUV4cG9ydEdldERhdGFVUFAiLAotICAgICAgICAgICAgIk1vdmllRXhwb3J0R2V0UHJvcGVydHlVUFAiLAotICAgICAgICAgICAgIlByZXByb2Nlc3NJbnN0cnVjdGlvbkhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIlNHTW9kYWxGaWx0ZXJVUFAiLAotICAgICAgICAgICAgIlN0YXJ0RG9jdW1lbnRIYW5kbGVyVVBQIiwKLSAgICAgICAgICAgICJTdGFydEVsZW1lbnRIYW5kbGVyVVBQIiwKLSAgICAgICAgICAgICJWZGlnSW50VVBQIiwKLSAgICAgICAgICAgICJTR0RhdGFVUFAiLAotICAgICAgICAgICAgIkVuZERvY3VtZW50SGFuZGxlclVQUCIsCi0gICAgICAgICAgICAiRW5kRWxlbWVudEhhbmRsZXJVUFAiLAotICAgICAgICAgICAgIlZpZGVvQm90dGxlcyIsICMgUmVjb3JkIGZ1bGwgb2YgVVBQcwotICAgICAgICAgICAgCi0gICAgICAgICAgICAiU0NQYXJhbXMiLAotICAgICAgICAgICAgIklDTUNvbXBsZXRpb25Qcm9jUmVjb3JkUHRyIiwKLSAgICAgICAgICAgICJEYXRhSFZvbHVtZUxpc3QiLAotICAgICAgICAgICAgIkRpZ2l0aXplckluZm8iLAotICAgICAgICAgICAgIlNHQ29tcHJlc3NJbmZvIiwKLSAgICAgICAgICAgICJTZXFHcmFiRXh0ZW5kZWRGcmFtZUluZm9QdHIiLAotICAgICAgICAgICAgIlNlcUdyYWJGcmFtZUluZm9QdHIiLAotICAgICAgICAgICAgIlRDVGV4dE9wdGlvbnNQdHIiLAotICAgICAgICAgICAgIlNHQ29tcHJlc3NJbmZvX3B0ciIsCi0gICAgICAgICAgICAiU0dEZXZpY2VMaXN0IiwKLSAgICAgICAgICAgICJUZXh0RGlzcGxheURhdGEiLAotICAgICAgICAgICAgIlRpbWVDb2RlRGVmIiwKLSAgICAgICAgICAgICJUaW1lQ29kZVJlY29yZCIsCi0gICAgICAgICAgICAiVHdlZW5SZWNvcmQiLAotICAgICAgICAgICAgIlZER2FtUmVjUHRyIiwKLSAgICAgICAgICAgICJUb25lRGVzY3JpcHRpb24iLCAJIyBYWFhYIEp1c3QgbGF6eTogdGhpcyBvbmUgaXMgZWFzeS4KLSAgICAgICAgICAgICJYTUxEb2MiLAotICAgICAgICAgICAgIlVJbnQ2NCIsIAkjIFhYWFggbGF6eQotICAgICAgICAgICAgIlVJbnQ2NF9wdHIiLCAjIFhYWFggbGF6eQotICAgICAgICAgICAgCi0gICAgICAgICAgICAjIEZyb20gTWVkaWFIYW5kbGVycwotICAgICAgICAgICAgIkFjdGlvbnNVUFAiLAotICAgICAgICAgICAgIlByZVByZXJvbGxDb21wbGV0ZVVQUCIsCi0gICAgICAgICAgICAiQ29kZWNDb21wb25lbnRIYW5kbGUiLCAjIERpZmZpY3VsdDogaGFuZGxlIGNvbnRhaW5pbmcgbGlzdCBvZiBjb21wb25lbnRzLgotICAgICAgICAgICAgIkdldE1vdmllQ29tcGxldGVQYXJhbXMiLCAjIEltbWVuc2Ugc3RydWN0Ci0gICAgICAgICAgICAiTGV2ZWxNZXRlckluZm9QdHIiLCAjIExhenkuIEFsc286IGNhbiBiZSBhbiBvdXRwdXQgcGFyYW1ldGVyISEKLSAgICAgICAgICAgICJNZWRpYUVRU3BlY3RydW1CYW5kc1JlY29yZFB0ciIsICMgZGl0dG8KLSAgICAgICAgICAgIAotICAgICAgICAgICAgIyBGcm9tIFF1aWNrVGltZU11c2ljCi0gICAgICAgICAgICAiTXVzaWNNSURJU2VuZFVQUCIsCi0gICAgICAgICAgICAiTXVzaWNPZmZsaW5lRGF0YVVQUCIsCi0gICAgICAgICAgICAiVHVuZUNhbGxCYWNrVVBQIiwKLSAgICAgICAgICAgICJUdW5lUGxheUNhbGxCYWNrVVBQIiwKLSAgICAgICAgICAgICJHQ1BhcnQiLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCi0gICAgICAgICAgICAiR0NQYXJ0X3B0ciIsCi0gICAgICAgICAgICAiR2VuZXJpY0tub2JEZXNjcmlwdGlvbiIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKLSAgICAgICAgICAgICJLbm9iRGVzY3JpcHRpb24iLCAgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcwotICAgICAgICAgICAgIkluc3RydW1lbnRBYm91dEluZm8iLCAjIFN0cnVjdCwgbm90IHRvbyBkaWZmaWN1bHQKLSAgICAgICAgICAgICJOb3RlQ2hhbm5lbCIsICMgWFhYWCBMYXp5LiBDb3VsZCBiZSBvcGFxdWUsIEkgdGhpbmsKLSAgICAgICAgICAgICJOb3RlUmVxdWVzdCIsICMgWFhYWCBMYXp5LiBOb3QtdG9vLWRpZmZpY3VsdCBzdHJ1Y3QKLSAgICAgICAgICAgICJTeW50aGVzaXplckNvbm5lY3Rpb25zIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcwotICAgICAgICAgICAgIlN5bnRoZXNpemVyRGVzY3JpcHRpb24iLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCi0gICAgICAgICAgICAiVHVuZVN0YXR1cyIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKLSAgICAgICAgICAgIAotCQkJXQorICAgICAgICAgICAgICAgICMgUXVpY2tUaW1lTXVzaWMKKyAgICAgICAgICAgICAgICAia0NvbnRyb2xsZXJNaW5pbXVtIiwKKyAgICAgICAgICAgICAgICAjIFRoZXNlIGFyZSBhcnRlZmFjdHMgb2YgYSBtYWNybyBkZWZpbml0aW9uCisgICAgICAgICAgICAgICAgInVsZW4iLAorICAgICAgICAgICAgICAgICJfZXh0IiwKKyAgICAgICAgICAgICAgICAieCIsCisgICAgICAgICAgICAgICAgIncxIiwKKyAgICAgICAgICAgICAgICAidzIiLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoJ0ZTU3BlYycsICcqJywgJ091dE1vZGUnKV0sIFsoJ0ZTU3BlY19wdHInLCAnKicsICdJbk1vZGUnKV0pLAotCQkJCi0JCQkjIE1vdmllIGNvbnRyb2xsZXIgY3JlYXRpb24KLQkJCShbKCdDb21wb25lbnRJbnN0YW5jZScsICdOZXdNb3ZpZUNvbnRyb2xsZXInLCAnUmV0dXJuTW9kZScpXSwKLQkJCSBbKCdNb3ZpZUNvbnRyb2xsZXInLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLQkJCSAKLQkJCSMgTmV3TW92aWVGcm9tRmlsZQotCQkJKFsoJ3Nob3J0JywgJ3Jlc0lkJywgJ091dE1vZGUnKSwgKCdTdHJpbmdQdHInLCAncmVzTmFtZScsICdJbk1vZGUnKV0sCi0JCQkgWygnc2hvcnQnLCAncmVzSWQnLCAnSW5PdXRNb2RlJyksICgnZHVtbXlTdHJpbmdQdHInLCAncmVzTmFtZScsICdJbk1vZGUnKV0pLAotCQkJIAotCQkJIyBNQ0RvQWN0aW9uIGFuZCBtb3JlCi0JCQkoWygndm9pZCcsICcqJywgJ091dE1vZGUnKV0sIFsoJ21jYWN0aW9ucGFyYW1zJywgJyonLCAnSW5Nb2RlJyldKSwKLQkJCQotCQkJIyBTZXRUaW1lQmFzZVplcm8uIERvZXMgbm90IGhhbmRsZSBOVUxMcywgdW5mb3J0dW5hdGVseQotCQkJKFsoJ1RpbWVSZWNvcmQnLCAnemVybycsICdPdXRNb2RlJyldLCBbKCdUaW1lUmVjb3JkJywgJ3plcm8nLCAnSW5Nb2RlJyldKSwKLQkJCQotCQkJIyBDb252ZXJ0VGltZSBhbmQgQ29udmVydFRpbWVTY2FsZQotCQkJKFsoJ1RpbWVSZWNvcmQnLCAnaW5vdXQnLCAnT3V0TW9kZScpXSwgWygnVGltZVJlY29yZCcsICdpbm91dCcsICdJbk91dE1vZGUnKV0pLAotCQkJKFsoJ1RpbWVSZWNvcmQnLCAndGhlVGltZScsICdPdXRNb2RlJyldLCBbKCdUaW1lUmVjb3JkJywgJ3RoZVRpbWUnLCAnSW5PdXRNb2RlJyldKSwKLQkJCQotCQkJIyBBZGRUaW1lIGFuZCBTdWJ0cmFjdFRpbWUKLQkJCShbKCdUaW1lUmVjb3JkJywgJ2RzdCcsICdPdXRNb2RlJyldLCBbKCdUaW1lUmVjb3JkJywgJ2RzdCcsICdJbk91dE1vZGUnKV0pLAotCQkJCi0JCQkjIEZ1bm55IGRlZmluaXRpb25zCi0JCQkoWygnY2hhcl9wdHInLCAnKicsICdJbk1vZGUnKV0sIFsoJ3N0cmluZ3B0cicsICcqJywgJ0luTW9kZScpXSksCi0JCQkoWygnRlNTcGVjUHRyJywgJyonLCAnSW5Nb2RlJyldLCBbKCdGU1NwZWNfcHRyJywgJyonLCAnSW5Nb2RlJyldKSwKLQkJCShbKCd1bnNpZ25lZF9jaGFyJywgJ3N3ZlZlcnNpb24nLCAnT3V0TW9kZScpXSwgWygnVUludDgnLCAnc3dmVmVyc2lvbicsICdPdXRNb2RlJyldKSwKLQkJCQotCQkJIyBJdCBzZWVtcyBNdXNpY01JRElQYWNrZXQgaWYgbmV2ZXIgZmxhZ2dlZCB3aXRoIGNvbnN0IGJ1dCBhbHdheXMgdXNlZAotCQkJIyBmb3Igc2VuZGluZyBvbmx5LiBJZiB0aGF0IGV2ZXIgY2hhbmdlcyB0aGlzIG5lZWRzIHRvIGJlIGZpeGVkLgotCQkJKFsoJ011c2ljTUlESVBhY2tldCcsICcqJywgJ091dE1vZGUnKV0sIFsoJ011c2ljTUlESVBhY2tldF9wdHInLCAnKicsICdJbk1vZGUnKV0pLAotCQkJCi0JCQkjIFFUTXVzaWMgY29uc3QtbGVzcyBpbnB1dCBwYXJhbWV0ZXJzCi0JCQkoWygndW5zaWduZWRfbG9uZycsICdoZWFkZXInLCAnT3V0TW9kZScpXSwgWygnVW5zaWduZWRMb25nUHRyJywgJ2hlYWRlcicsICdJbk1vZGUnKV0pLAotCQkJXQotCQkJCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAjIEkgZG9uJ3QgdGhpbmsgd2Ugd2FudCB0byBkbyB0aGVzZQorICAgICAgICAgICAgICAgICJRVFN5bmNUYXNrUHRyIiwKKyAgICAgICAgICAgICAgICAjIFdlIGRvbnQgZG8gY2FsbGJhY2tzIHlldCwgc28gbm8gbmVlZCBmb3IgdGhlc2UKKyAgICAgICAgICAgICAgICAiUVRDYWxsQmFjayIsCisgICAgICAgICAgICAgICAgIyBTa2lwcGVkIGZvciBub3csIGR1ZSB0byBsYXppbmVzcworICAgICAgICAgICAgICAgICJUcmFja0VkaXRTdGF0ZSIsCisgICAgICAgICAgICAgICAgIk1vdmllRWRpdFN0YXRlIiwKKyAgICAgICAgICAgICAgICAiTWF0cml4UmVjb3JkIiwKKyAgICAgICAgICAgICAgICAiTWF0cml4UmVjb3JkX3B0ciIsCisgICAgICAgICAgICAgICAgIlNhbXBsZVJlZmVyZW5jZVB0ciIsCisgICAgICAgICAgICAgICAgIlFUVHdlZW5lciIsCisgICAgICAgICAgICAgICAgIlFURXJyb3JSZXBsYWNlbWVudFB0ciIsCisgICAgICAgICAgICAgICAgIlFUUmVzdHJpY3Rpb25TZXQiLAorICAgICAgICAgICAgICAgICJRVFVVSUQiLAorICAgICAgICAgICAgICAgICJRVFVVSURfcHRyIiwKKworICAgICAgICAgICAgICAgICMgUm91dGluZSBwb2ludGVycywgbm90IHlldC4KKyAgICAgICAgICAgICAgICAiTW92aWVzRXJyb3JVUFAiLAorICAgICAgICAgICAgICAgICJNb3ZpZVByZXZpZXdDYWxsT3V0VVBQIiwKKyAgICAgICAgICAgICAgICAiTW92aWVEcmF3aW5nQ29tcGxldGVVUFAiLAorICAgICAgICAgICAgICAgICJRVENhbGxCYWNrVVBQIiwKKyAgICAgICAgICAgICAgICAiVGV4dE1lZGlhVVBQIiwKKyAgICAgICAgICAgICAgICAiTW92aWVQcm9ncmVzc1VQUCIsCisgICAgICAgICAgICAgICAgIk1vdmllUmduQ292ZXJVUFAiLAorICAgICAgICAgICAgICAgICJNQ0FjdGlvbkZpbHRlclVQUCIsCisgICAgICAgICAgICAgICAgIk1DQWN0aW9uRmlsdGVyV2l0aFJlZkNvblVQUCIsCisgICAgICAgICAgICAgICAgIkdldE1vdmllVVBQIiwKKyAgICAgICAgICAgICAgICAiTW9kYWxGaWx0ZXJVUFAiLAorICAgICAgICAgICAgICAgICJUcmFja1RyYW5zZmVyVVBQIiwKKyAgICAgICAgICAgICAgICAiTW92aWVQcmVQcmVyb2xsQ29tcGxldGVVUFAiLAorICAgICAgICAgICAgICAgICJNb3ZpZUV4ZWN1dGVXaXJlZEFjdGlvbnNVUFAiLAorICAgICAgICAgICAgICAgICJRVEJhbmR3aWR0aE5vdGlmaWNhdGlvblVQUCIsCisgICAgICAgICAgICAgICAgIkRvTUNBY3Rpb25VUFAiLAorICAgICAgICAgICAgICAgICJRVE5leHRUYXNrTmVlZGVkU29vbmVyQ2FsbGJhY2tVUFAiLAorCisgICAgICAgICAgICAgICAgIlNhbXBsZVJlZmVyZW5jZTY0UHRyIiwgIyBEb24ndCBrbm93IHdoYXQgdGhpcyBkb2VzLCB5ZXQKKyAgICAgICAgICAgICAgICAiUVRSdW50aW1lU3ByaXRlRGVzY1B0ciIsCisgICAgICAgICAgICAgICAgIlFUQmFuZHdpZHRoUmVmZXJlbmNlIiwKKyAgICAgICAgICAgICAgICAiUVRTY2hlZHVsZWRCYW5kd2lkdGhSZWZlcmVuY2UiLAorICAgICAgICAgICAgICAgICJRVEF0b21Db250YWluZXIiLAorICAgICAgICAgICAgICAgICJTcHJpdGVXb3JsZCIsCisgICAgICAgICAgICAgICAgIlNwcml0ZSIsCisKKyAgICAjIHRoZXNlIGFyZSBJbWFnZUNvbXByZXNzaW9uIGJsYWNrbGlzdHMKKyAgICAiSUNNRGF0YVVQUCIsCisgICAgIklDTUZsdXNoVVBQIiwKKyAgICAiSUNNQ29tcGxldGlvblVQUCIsCisgICAgIklDTVByb2dyZXNzVVBQIiwKKyAgICAiU3RkUGl4VVBQIiwKKyAgICAiUURQaXhVUFAiLAorICAgICJJQ01BbGlnbm1lbnRVUFAiLAorICAgICJJQ01DdXJzb3JTaGllbGRlZFVQUCIsCisgICAgIklDTU1lbW9yeURpc3Bvc2VkVVBQIiwKKyAgICAiSUNNQ29udmVydERhdGFGb3JtYXRVUFAiLAorICAgICJNb2RhbEZpbHRlcllEVVBQIiwKKyAgICAgICAgICAgICAgICAiRmlsZUZpbHRlclVQUCIsCisKKyAgICAiQ29kZWNOYW1lU3BlY0xpc3RQdHIiLAorICAgICJDb2RlY0luZm8iLAorICAgICAiSW1hZ2VTZXF1ZW5jZSIsCisgICAgIk1hdHJpeFJlY29yZFB0ciIsCisgICAgIklDTURhdGFQcm9jUmVjb3JkUHRyIiwKKyAgICAiT3BlbkNQaWNQYXJhbXMiLAorICAgICJJQ01Qcm9ncmVzc1Byb2NSZWNvcmRQdHIiLAorICAgICJJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyIiwKKyAgICAiSUNNUGl4ZWxGb3JtYXRJbmZvUHRyIiwKKyAgICAiSW1hZ2VTZXF1ZW5jZURhdGFTb3VyY2UiLAorICAgICJDb25zdFN0ckZpbGVOYW1lUGFyYW0iLAorICAgICJJbWFnZVRyYW5zY29kZVNlcXVlbmNlIiwKKyAgICAiSW1hZ2VGaWVsZFNlcXVlbmNlIiwKKyAgICAiRnJhY3QiLAorICAgICJQaXhNYXBQdHIiLAorICAgICJHV29ybGRGbGFncyIsCisgICAgInZvaWRfcHRyIiwgICAjIFhYWCBCZWluZyBsYXp5LCB0aGlzIG9uZSBpcyBkb2FibGUuCisKKyAgICAjIFRoZXNlIGFyZSBmcm9tIFF1aWNrVGltZUNvbXBvbmVudHMKKyAgICAiQ0RhdGFIYW5kbGVyVVBQIiwKKyAgICAiQ2hhckRhdGFIYW5kbGVyVVBQIiwKKyAgICAiQ29tbWVudEhhbmRsZXJVUFAiLAorICAgICJEYXRhSENvbXBsZXRpb25VUFAiLAorICAgICInTW92aWVFeHBvcnRHZXREYXRhVVBQIiwKKyAgICAiTW92aWVFeHBvcnRHZXRQcm9wZXJ0eVVQUCIsCisgICAgIlByZXByb2Nlc3NJbnN0cnVjdGlvbkhhbmRsZXJVUFAiLAorICAgICJTR01vZGFsRmlsdGVyVVBQIiwKKyAgICAiU3RhcnREb2N1bWVudEhhbmRsZXJVUFAiLAorICAgICJTdGFydEVsZW1lbnRIYW5kbGVyVVBQIiwKKyAgICAiVmRpZ0ludFVQUCIsCisgICAgIlNHRGF0YVVQUCIsCisgICAgIkVuZERvY3VtZW50SGFuZGxlclVQUCIsCisgICAgIkVuZEVsZW1lbnRIYW5kbGVyVVBQIiwKKyAgICAiVmlkZW9Cb3R0bGVzIiwgIyBSZWNvcmQgZnVsbCBvZiBVUFBzCisKKyAgICAiU0NQYXJhbXMiLAorICAgICJJQ01Db21wbGV0aW9uUHJvY1JlY29yZFB0ciIsCisgICAgIkRhdGFIVm9sdW1lTGlzdCIsCisgICAgIkRpZ2l0aXplckluZm8iLAorICAgICJTR0NvbXByZXNzSW5mbyIsCisgICAgIlNlcUdyYWJFeHRlbmRlZEZyYW1lSW5mb1B0ciIsCisgICAgIlNlcUdyYWJGcmFtZUluZm9QdHIiLAorICAgICJUQ1RleHRPcHRpb25zUHRyIiwKKyAgICAiU0dDb21wcmVzc0luZm9fcHRyIiwKKyAgICAiU0dEZXZpY2VMaXN0IiwKKyAgICAiVGV4dERpc3BsYXlEYXRhIiwKKyAgICAiVGltZUNvZGVEZWYiLAorICAgICJUaW1lQ29kZVJlY29yZCIsCisgICAgIlR3ZWVuUmVjb3JkIiwKKyAgICAiVkRHYW1SZWNQdHIiLAorICAgICJUb25lRGVzY3JpcHRpb24iLCAgIyBYWFhYIEp1c3QgbGF6eTogdGhpcyBvbmUgaXMgZWFzeS4KKyAgICAiWE1MRG9jIiwKKyAgICAiVUludDY0IiwgICAjIFhYWFggbGF6eQorICAgICJVSW50NjRfcHRyIiwgIyBYWFhYIGxhenkKKworICAgICMgRnJvbSBNZWRpYUhhbmRsZXJzCisgICAgIkFjdGlvbnNVUFAiLAorICAgICJQcmVQcmVyb2xsQ29tcGxldGVVUFAiLAorICAgICJDb2RlY0NvbXBvbmVudEhhbmRsZSIsICMgRGlmZmljdWx0OiBoYW5kbGUgY29udGFpbmluZyBsaXN0IG9mIGNvbXBvbmVudHMuCisgICAgIkdldE1vdmllQ29tcGxldGVQYXJhbXMiLCAjIEltbWVuc2Ugc3RydWN0CisgICAgIkxldmVsTWV0ZXJJbmZvUHRyIiwgIyBMYXp5LiBBbHNvOiBjYW4gYmUgYW4gb3V0cHV0IHBhcmFtZXRlciEhCisgICAgIk1lZGlhRVFTcGVjdHJ1bUJhbmRzUmVjb3JkUHRyIiwgIyBkaXR0bworCisgICAgIyBGcm9tIFF1aWNrVGltZU11c2ljCisgICAgIk11c2ljTUlESVNlbmRVUFAiLAorICAgICJNdXNpY09mZmxpbmVEYXRhVVBQIiwKKyAgICAiVHVuZUNhbGxCYWNrVVBQIiwKKyAgICAiVHVuZVBsYXlDYWxsQmFja1VQUCIsCisgICAgIkdDUGFydCIsICMgU3RydWN0IHdpdGggbG90cyBvZiBmaWVsZHMKKyAgICAiR0NQYXJ0X3B0ciIsCisgICAgIkdlbmVyaWNLbm9iRGVzY3JpcHRpb24iLCAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCisgICAgIktub2JEZXNjcmlwdGlvbiIsICAjIFN0cnVjdCB3aXRoIGxvdHMgb2YgZmllbGRzCisgICAgIkluc3RydW1lbnRBYm91dEluZm8iLCAjIFN0cnVjdCwgbm90IHRvbyBkaWZmaWN1bHQKKyAgICAiTm90ZUNoYW5uZWwiLCAjIFhYWFggTGF6eS4gQ291bGQgYmUgb3BhcXVlLCBJIHRoaW5rCisgICAgIk5vdGVSZXF1ZXN0IiwgIyBYWFhYIExhenkuIE5vdC10b28tZGlmZmljdWx0IHN0cnVjdAorICAgICJTeW50aGVzaXplckNvbm5lY3Rpb25zIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcworICAgICJTeW50aGVzaXplckRlc2NyaXB0aW9uIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcworICAgICJUdW5lU3RhdHVzIiwgIyBTdHJ1Y3Qgd2l0aCBsb3RzIG9mIGZpZWxkcworCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoJ0ZTU3BlYycsICcqJywgJ091dE1vZGUnKV0sIFsoJ0ZTU3BlY19wdHInLCAnKicsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBNb3ZpZSBjb250cm9sbGVyIGNyZWF0aW9uCisgICAgICAgICAgICAgICAgKFsoJ0NvbXBvbmVudEluc3RhbmNlJywgJ05ld01vdmllQ29udHJvbGxlcicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdNb3ZpZUNvbnRyb2xsZXInLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgTmV3TW92aWVGcm9tRmlsZQorICAgICAgICAgICAgICAgIChbKCdzaG9ydCcsICdyZXNJZCcsICdPdXRNb2RlJyksICgnU3RyaW5nUHRyJywgJ3Jlc05hbWUnLCAnSW5Nb2RlJyldLAorICAgICAgICAgICAgICAgICBbKCdzaG9ydCcsICdyZXNJZCcsICdJbk91dE1vZGUnKSwgKCdkdW1teVN0cmluZ1B0cicsICdyZXNOYW1lJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIE1DRG9BY3Rpb24gYW5kIG1vcmUKKyAgICAgICAgICAgICAgICAoWygndm9pZCcsICcqJywgJ091dE1vZGUnKV0sIFsoJ21jYWN0aW9ucGFyYW1zJywgJyonLCAnSW5Nb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgU2V0VGltZUJhc2VaZXJvLiBEb2VzIG5vdCBoYW5kbGUgTlVMTHMsIHVuZm9ydHVuYXRlbHkKKyAgICAgICAgICAgICAgICAoWygnVGltZVJlY29yZCcsICd6ZXJvJywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAnemVybycsICdJbk1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBDb252ZXJ0VGltZSBhbmQgQ29udmVydFRpbWVTY2FsZQorICAgICAgICAgICAgICAgIChbKCdUaW1lUmVjb3JkJywgJ2lub3V0JywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAnaW5vdXQnLCAnSW5PdXRNb2RlJyldKSwKKyAgICAgICAgICAgICAgICAoWygnVGltZVJlY29yZCcsICd0aGVUaW1lJywgJ091dE1vZGUnKV0sIFsoJ1RpbWVSZWNvcmQnLCAndGhlVGltZScsICdJbk91dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBBZGRUaW1lIGFuZCBTdWJ0cmFjdFRpbWUKKyAgICAgICAgICAgICAgICAoWygnVGltZVJlY29yZCcsICdkc3QnLCAnT3V0TW9kZScpXSwgWygnVGltZVJlY29yZCcsICdkc3QnLCAnSW5PdXRNb2RlJyldKSwKKworICAgICAgICAgICAgICAgICMgRnVubnkgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAoWygnY2hhcl9wdHInLCAnKicsICdJbk1vZGUnKV0sIFsoJ3N0cmluZ3B0cicsICcqJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgKFsoJ0ZTU3BlY1B0cicsICcqJywgJ0luTW9kZScpXSwgWygnRlNTcGVjX3B0cicsICcqJywgJ0luTW9kZScpXSksCisgICAgICAgICAgICAgICAgKFsoJ3Vuc2lnbmVkX2NoYXInLCAnc3dmVmVyc2lvbicsICdPdXRNb2RlJyldLCBbKCdVSW50OCcsICdzd2ZWZXJzaW9uJywgJ091dE1vZGUnKV0pLAorCisgICAgICAgICAgICAgICAgIyBJdCBzZWVtcyBNdXNpY01JRElQYWNrZXQgaWYgbmV2ZXIgZmxhZ2dlZCB3aXRoIGNvbnN0IGJ1dCBhbHdheXMgdXNlZAorICAgICAgICAgICAgICAgICMgZm9yIHNlbmRpbmcgb25seS4gSWYgdGhhdCBldmVyIGNoYW5nZXMgdGhpcyBuZWVkcyB0byBiZSBmaXhlZC4KKyAgICAgICAgICAgICAgICAoWygnTXVzaWNNSURJUGFja2V0JywgJyonLCAnT3V0TW9kZScpXSwgWygnTXVzaWNNSURJUGFja2V0X3B0cicsICcqJywgJ0luTW9kZScpXSksCisKKyAgICAgICAgICAgICAgICAjIFFUTXVzaWMgY29uc3QtbGVzcyBpbnB1dCBwYXJhbWV0ZXJzCisgICAgICAgICAgICAgICAgKFsoJ3Vuc2lnbmVkX2xvbmcnLCAnaGVhZGVyJywgJ091dE1vZGUnKV0sIFsoJ1Vuc2lnbmVkTG9uZ1B0cicsICdoZWFkZXInLCAnSW5Nb2RlJyldKSwKKyAgICAgICAgICAgICAgICBdCisKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9xdC9xdHN1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9xdC9xdHN1cHBvcnQucHkKaW5kZXggMjAzMDRjOS4uMTMyYzJiNCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvcXQvcXRzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3F0L3F0c3VwcG9ydC5weQpAQCAtOCwxNiArOCwxNiBAQAogaW1wb3J0IHN0cmluZwogCiAjIERlY2xhcmF0aW9ucyB0aGF0IGNoYW5nZSBmb3IgZWFjaCBtYW5hZ2VyCi1NQUNIRUFERVJGSUxFID0gJ01vdmllcy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX1F0JwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnTW92aWUnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKK01BQ0hFQURFUkZJTEUgPSAnTW92aWVzLmgnICAgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfUXQnICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdNb3ZpZScgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdRdCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gIk1vdmllIgkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdRdCcgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gIk1vdmllIiAgICAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNTcsNDUgKzU3LDQ1IEBACiAKIC8qIE1hY3JvIHRvIGFsbG93IHVzIHRvIEdldE5leHRJbnRlcmVzdGluZ1RpbWUgd2l0aG91dCBkdXJhdGlvbiAqLwogI2RlZmluZSBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWVPbmx5KG1lZGlhLCBmbGFncywgdGltZSwgcmF0ZSwgcnYpIFwKLQkJCUdldE1lZGlhTmV4dEludGVyZXN0aW5nVGltZShtZWRpYSwgZmxhZ3MsIHRpbWUsIHJhdGUsIHJ2LCBOVUxMKQotCQkJCisgICAgICAgICAgICAgICAgICAgICAgICBHZXRNZWRpYU5leHRJbnRlcmVzdGluZ1RpbWUobWVkaWEsIGZsYWdzLCB0aW1lLCByYXRlLCBydiwgTlVMTCkKKwogLyoKICoqIFBhcnNlL2dlbmVyYXRlIHRpbWUgcmVjb3JkcwogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBRdFRpbWVSZWNvcmRfTmV3KFRpbWVSZWNvcmQgKml0c2VsZikKIHsKLQlpZiAoaXRzZWxmLT5iYXNlKQotCQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyZsTyYiLCBQeU1hY19CdWlsZHdpZGUsICZpdHNlbGYtPnZhbHVlLCBpdHNlbGYtPnNjYWxlLCAKLQkJCVRpbWVCYXNlT2JqX05ldywgaXRzZWxmLT5iYXNlKTsKLQllbHNlCi0JCXJldHVybiAgUHlfQnVpbGRWYWx1ZSgiTyZsTyIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsIAotCQkJUHlfTm9uZSk7CisgICAgICAgIGlmIChpdHNlbGYtPmJhc2UpCisgICAgICAgICAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mbE8mIiwgUHlNYWNfQnVpbGR3aWRlLCAmaXRzZWxmLT52YWx1ZSwgaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVCYXNlT2JqX05ldywgaXRzZWxmLT5iYXNlKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHVybiAgUHlfQnVpbGRWYWx1ZSgiTyZsTyIsIFB5TWFjX0J1aWxkd2lkZSwgJml0c2VsZi0+dmFsdWUsIGl0c2VsZi0+c2NhbGUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeV9Ob25lKTsKIH0KIAogc3RhdGljIGludAogUXRUaW1lUmVjb3JkX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRpbWVSZWNvcmQgKnBfaXRzZWxmKQogewotCVB5T2JqZWN0ICpiYXNlID0gTlVMTDsKLQlpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKLQkJCSZiYXNlKSApCi0JCXJldHVybiAwOwotCWlmICggYmFzZSA9PSBOVUxMIHx8IGJhc2UgPT0gUHlfTm9uZSApCi0JCXBfaXRzZWxmLT5iYXNlID0gTlVMTDsKLQllbHNlCi0JCWlmICggIVRpbWVCYXNlT2JqX0NvbnZlcnQoYmFzZSwgJnBfaXRzZWxmLT5iYXNlKSApCi0JCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAgICAgUHlPYmplY3QgKmJhc2UgPSBOVUxMOworICAgICAgICBpZiggIVB5QXJnX1BhcnNlVHVwbGUodiwgIk8mbHxPIiwgUHlNYWNfR2V0d2lkZSwgJnBfaXRzZWxmLT52YWx1ZSwgJnBfaXRzZWxmLT5zY2FsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICZiYXNlKSApCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggYmFzZSA9PSBOVUxMIHx8IGJhc2UgPT0gUHlfTm9uZSApCisgICAgICAgICAgICAgICAgcF9pdHNlbGYtPmJhc2UgPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgaWYgKCAhVGltZUJhc2VPYmpfQ29udmVydChiYXNlLCAmcF9pdHNlbGYtPmJhc2UpICkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICByZXR1cm4gMTsKIH0KIAogc3RhdGljIGludAogUXRNdXNpY01JRElQYWNrZXRfQ29udmVydChQeU9iamVjdCAqdiwgTXVzaWNNSURJUGFja2V0ICpwX2l0c2VsZikKIHsKLQlpbnQgZHVtbXk7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJobHMjIiwgJnBfaXRzZWxmLT5sZW5ndGgsICZwX2l0c2VsZi0+cmVzZXJ2ZWQsIHBfaXRzZWxmLT5kYXRhLCBkdW1teSkgKQotCQlyZXR1cm4gMDsKLQlyZXR1cm4gMTsKKyAgICAgICAgaW50IGR1bW15OworCisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAiaGxzIyIsICZwX2l0c2VsZi0+bGVuZ3RoLCAmcF9pdHNlbGYtPnJlc2VydmVkLCBwX2l0c2VsZi0+ZGF0YSwgZHVtbXkpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIApAQCAtMTAzLDE4ICsxMDMsMTggQEAKICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUcmFjaywgVHJhY2tPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVHJhY2ssIFRyYWNrT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1vdmllLCBNb3ZpZU9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZSwgTW92aWVPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWVDb250cm9sbGVyLCBNb3ZpZUN0bE9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZUNvbnRyb2xsZXIsIE1vdmllQ3RsT2JqX0NvbnZlcnQpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChUaW1lQmFzZSwgVGltZUJhc2VPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVXNlckRhdGEsIFVzZXJEYXRhT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9Db252ZXJ0KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhNZWRpYSwgTWVkaWFPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoTWVkaWEsIE1lZGlhT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhUcmFjaywgVHJhY2tPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRyYWNrLCBUcmFja09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTW92aWUsIE1vdmllT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNb3ZpZSwgTW92aWVPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKE1vdmllQ29udHJvbGxlciwgTW92aWVDdGxPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKE1vdmllQ29udHJvbGxlciwgTW92aWVDdGxPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFRpbWVCYXNlLCBUaW1lQmFzZU9ial9OZXcpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoVGltZUJhc2UsIFRpbWVCYXNlT2JqX0NvbnZlcnQpOworICAgICAgICBQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhVc2VyRGF0YSwgVXNlckRhdGFPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFVzZXJEYXRhLCBVc2VyRGF0YU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoTWVkaWEsIE1lZGlhT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChNZWRpYSwgTWVkaWFPYmpfQ29udmVydCk7CiAiIiIKIAogIyBPdXIgKG9wYXF1ZSkgb2JqZWN0cwpAQCAtMjMyLDU2ICsyMzIsNTYgQEAKIAogIyBYWFhYIE5lZWQgdG8gb3ZlcnJpZGUgb3V0cHV0X3RwX25ld0JvZHkoKSB0byBhbGxvdyBmb3IgTm9uZSBpbml0aWFsaXplci4KIGNsYXNzIFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQkjIFdlIGRvbid0IGFsbG93IE5VTEwgcG9pbnRlcnMgdG8gYmUgcmV0dXJuZWQgYnkgUXVpY2tUaW1lIEFQSSBjYWxscywKLQkJIyBpbiBzdGVhZCB3ZSByYWlzZSBhbiBleGNlcHRpb24KLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcoUXRfRXJyb3IsIkNhbm5vdCBjcmVhdGUgJXMgZnJvbSBOVUxMIHBvaW50ZXIiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIiwgc2VsZi5uYW1lKQotCQotCWRlZiBvdXRwdXRDaGVja0NvbnZlcnRBcmcoc2VsZik6Ci0JCSMgQnV0IHdoYXQgd2UgZG8gYWxsb3cgaXMgcGFzc2luZyBOb25lIHdoZXJlZXZlciBhIHF1aWNrdGltZSBvYmplY3QgaXMKLQkJIyBleHBlY3RlZCwgYW5kIHBhc3MgdGhpcyBhcyBOVUxMIHRvIHRoZSBBUEkgcm91dGluZXMuIE5vdGUgeW91IGNhbgotCQkjIGNhbGwgbWV0aG9kcyB0b28gYnkgY3JlYXRpbmcgYW4gb2JqZWN0IHdpdGggTm9uZSBhcyB0aGUgaW5pdGlhbGl6ZXIuCi0JCU91dHB1dCgiaWYgKHYgPT0gUHlfTm9uZSkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIipwX2l0c2VsZiA9IE5VTEw7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgIyBXZSBkb24ndCBhbGxvdyBOVUxMIHBvaW50ZXJzIHRvIGJlIHJldHVybmVkIGJ5IFF1aWNrVGltZSBBUEkgY2FsbHMsCisgICAgICAgICMgaW4gc3RlYWQgd2UgcmFpc2UgYW4gZXhjZXB0aW9uCisgICAgICAgIE91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFF0X0Vycm9yLCJDYW5ub3QgY3JlYXRlICVzIGZyb20gTlVMTCBwb2ludGVyIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSIiIiwgc2VsZi5uYW1lKQorCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgIyBCdXQgd2hhdCB3ZSBkbyBhbGxvdyBpcyBwYXNzaW5nIE5vbmUgd2hlcmVldmVyIGEgcXVpY2t0aW1lIG9iamVjdCBpcworICAgICAgICAjIGV4cGVjdGVkLCBhbmQgcGFzcyB0aGlzIGFzIE5VTEwgdG8gdGhlIEFQSSByb3V0aW5lcy4gTm90ZSB5b3UgY2FuCisgICAgICAgICMgY2FsbCBtZXRob2RzIHRvbyBieSBjcmVhdGluZyBhbiBvYmplY3Qgd2l0aCBOb25lIGFzIHRoZSBpbml0aWFsaXplci4KKyAgICAgICAgT3V0cHV0KCJpZiAodiA9PSBQeV9Ob25lKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKIGNsYXNzIE1vdmllT2JqZWN0RGVmaW5pdGlvbihRdEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6Ci0JCU91dHB1dCgiaWYgKCVzKSBEaXNwb3NlTW92aWUoJXMpOyIsIGl0c2VsZm5hbWUsIGl0c2VsZm5hbWUpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VNb3ZpZSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKIAogY2xhc3MgVHJhY2tPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VNb3ZpZVRyYWNrKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCVzKSBEaXNwb3NlTW92aWVUcmFjayglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKIAogY2xhc3MgTWVkaWFPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VUcmFja01lZGlhKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiaWYgKCVzKSBEaXNwb3NlVHJhY2tNZWRpYSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKIAogY2xhc3MgVXNlckRhdGFPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJpZiAoJXMpIERpc3Bvc2VVc2VyRGF0YSglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICglcykgRGlzcG9zZVVzZXJEYXRhKCVzKTsiLCBpdHNlbGZuYW1lLCBpdHNlbGZuYW1lKQogCiBjbGFzcyBUaW1lQmFzZU9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCi0JCisgICAgcGFzcworCiBjbGFzcyBNb3ZpZUN0bE9iamVjdERlZmluaXRpb24oUXRHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoImlmICglcykgRGlzcG9zZU1vdmllQ29udHJvbGxlciglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICglcykgRGlzcG9zZU1vdmllQ29udHJvbGxlciglcyk7IiwgaXRzZWxmbmFtZSwgaXRzZWxmbmFtZSkKIAogY2xhc3MgSWRsZU1hbmFnZXJPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JcGFzcwotCQorICAgIHBhc3MKKwogY2xhc3MgU0dPdXRwdXRPYmplY3REZWZpbml0aW9uKFF0R2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JIyBYWFhYIEknbSBub3Qgc3VyZSBJIGZ1bGx5IHVuZGVyc3RhbmQgaG93IFNHT3V0cHV0IHdvcmtzLiBJdCBzZWVtcyBpdCdzIGFsd2F5cyB0aWVkCi0JIyB0byBhIHNwZWNpZmljIFNlcUdyYWJDb21wb25lbnQsIGJ1dCBJJ20gbm90IDEwMCUgc3VyZS4gQWxzbywgSSdtIG5vdCBzdXJlIGFsbCB0aGUKLQkjIHJvdXRpbmVzIHRoYXQgcmV0dXJuIGFuIFNHT3V0cHV0IGFjdHVhbGx5IHJldHVybiBhICpuZXcqIFNHT3V0cHV0LiBOZWVkIHRvIHJlYWQgdXAgb24KLQkjIHRoaXMuCi0JcGFzcworICAgICMgWFhYWCBJJ20gbm90IHN1cmUgSSBmdWxseSB1bmRlcnN0YW5kIGhvdyBTR091dHB1dCB3b3Jrcy4gSXQgc2VlbXMgaXQncyBhbHdheXMgdGllZAorICAgICMgdG8gYSBzcGVjaWZpYyBTZXFHcmFiQ29tcG9uZW50LCBidXQgSSdtIG5vdCAxMDAlIHN1cmUuIEFsc28sIEknbSBub3Qgc3VyZSBhbGwgdGhlCisgICAgIyByb3V0aW5lcyB0aGF0IHJldHVybiBhbiBTR091dHB1dCBhY3R1YWxseSByZXR1cm4gYSAqbmV3KiBTR091dHB1dC4gTmVlZCB0byByZWFkIHVwIG9uCisgICAgIyB0aGlzLgorICAgIHBhc3MKIAogCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCkBAIC0zMzEsMTkgKzMzMSwxOSBAQAogZHVtbXlSZWN0ID0gRmFrZVR5cGUoJyhSZWN0ICopMCcpCiAKIGYgPSBGdW5jdGlvbih2b2lkLCAnQWxpZ25XaW5kb3cnLAotCShXaW5kb3dQdHIsICd3cCcsIEluTW9kZSksCi0JKEJvb2xlYW4sICdmcm9udCcsIEluTW9kZSksCi0JKGR1bW15UmVjdCwgJ2FsaWdubWVudFJlY3QnLCBJbk1vZGUpLAotCShJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyLCAnYWxpZ25tZW50UHJvYycsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dQdHIsICd3cCcsIEluTW9kZSksCisgICAgICAgIChCb29sZWFuLCAnZnJvbnQnLCBJbk1vZGUpLAorICAgICAgICAoZHVtbXlSZWN0LCAnYWxpZ25tZW50UmVjdCcsIEluTW9kZSksCisgICAgICAgIChJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyLCAnYWxpZ25tZW50UHJvYycsIEluTW9kZSksCiApCiBmdW5jdGlvbnMuYXBwZW5kKGYpCiAKIGYgPSBGdW5jdGlvbih2b2lkLCAnRHJhZ0FsaWduZWRXaW5kb3cnLAotCShXaW5kb3dQdHIsICd3cCcsIEluTW9kZSksCi0JKFBvaW50LCAnc3RhcnRQdCcsIEluTW9kZSksCi0JKFJlY3RfcHRyLCAnYm91bmRzUmVjdCcsIEluTW9kZSksCi0JKGR1bW15UmVjdCwgJ2FsaWdubWVudFJlY3QnLCBJbk1vZGUpLAotCShJQ01BbGlnbm1lbnRQcm9jUmVjb3JkUHRyLCAnYWxpZ25tZW50UHJvYycsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dQdHIsICd3cCcsIEluTW9kZSksCisgICAgICAgIChQb2ludCwgJ3N0YXJ0UHQnLCBJbk1vZGUpLAorICAgICAgICAoUmVjdF9wdHIsICdib3VuZHNSZWN0JywgSW5Nb2RlKSwKKyAgICAgICAgKGR1bW15UmVjdCwgJ2FsaWdubWVudFJlY3QnLCBJbk1vZGUpLAorICAgICAgICAoSUNNQWxpZ25tZW50UHJvY1JlY29yZFB0ciwgJ2FsaWdubWVudFByb2MnLCBJbk1vZGUpLAogKQogZnVuY3Rpb25zLmFwcGVuZChmKQogCkBAIC0zNzcsNCArMzc3LDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3F0L3NldHVwLnB5IGIvTWFjL01vZHVsZXMvcXQvc2V0dXAucHkKaW5kZXggOThkODM2ZC4uODQ0MjAxMSAxMDA3NTUKLS0tIGEvTWFjL01vZHVsZXMvcXQvc2V0dXAucHkKKysrIGIvTWFjL01vZHVsZXMvcXQvc2V0dXAucHkKQEAgLTQsMTAgKzQsMTAgQEAKIGZyb20gZGlzdHV0aWxzLmNvcmUgaW1wb3J0IEV4dGVuc2lvbiwgc2V0dXAKIAogc2V0dXAobmFtZT0iUXVpY2tUaW1lIiwgdmVyc2lvbj0iMC4yIiwKLQlleHRfbW9kdWxlcz1bCi0JCUV4dGVuc2lvbignUXVpY2tUaW1lLl9RdCcsIFsnX1F0bW9kdWxlLmMnXSwKLQkJZXh0cmFfbGlua19hcmdzPVsnLWZyYW1ld29yaycsICdDYXJib24nLCAnLWZyYW1ld29yaycsICdRdWlja1RpbWUnXSkKLQldLAotCXB5X21vZHVsZXM9WydRdWlja1RpbWUuUXQnLCAnUXVpY2tUaW1lLlF1aWNrVGltZSddLAotCXBhY2thZ2VfZGlyPXsnUXVpY2tUaW1lJzonLi4vLi4vLi4vTGliL3BsYXQtbWFjL0NhcmJvbid9Ci0JKQorICAgICAgICBleHRfbW9kdWxlcz1bCisgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKCdRdWlja1RpbWUuX1F0JywgWydfUXRtb2R1bGUuYyddLAorICAgICAgICAgICAgICAgIGV4dHJhX2xpbmtfYXJncz1bJy1mcmFtZXdvcmsnLCAnQ2FyYm9uJywgJy1mcmFtZXdvcmsnLCAnUXVpY2tUaW1lJ10pCisgICAgICAgIF0sCisgICAgICAgIHB5X21vZHVsZXM9WydRdWlja1RpbWUuUXQnLCAnUXVpY2tUaW1lLlF1aWNrVGltZSddLAorICAgICAgICBwYWNrYWdlX2Rpcj17J1F1aWNrVGltZSc6Jy4uLy4uLy4uL0xpYi9wbGF0LW1hYy9DYXJib24nfQorICAgICAgICApCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9yZXMvcmVzZWRpdC5weSBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNlZGl0LnB5CmluZGV4IGFiNjBiMzQuLmIzZWY3OTAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3Jlcy9yZXNlZGl0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3Jlcy9yZXNlZGl0LnB5CkBAIC00LDExICs0LDExIEBACiAjI0hhbmRsZSBoOwogIyMKICMjaWYgKCFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAicyMiLCAmYnVmLCAmbGVuKSkKLSMjCXJldHVybiBOVUxMOworIyMgICAgICByZXR1cm4gTlVMTDsKICMjaCA9IE5ld0hhbmRsZShsZW4pOwogIyNpZiAoIGggPT0gTlVMTCApIHsKLSMjCVB5RXJyX05vTWVtb3J5KCk7Ci0jIwlyZXR1cm4gTlVMTDsKKyMjICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyMjICAgICAgcmV0dXJuIE5VTEw7CiAjI30KICMjSExvY2soaCk7CiAjI21lbWNweSgqaCwgYnVmLCBsZW4pOwpAQCAtMzMsMTEgKzMzLDExIEBACiBSZXNvdXJjZU9iamVjdCAqcnY7CiAKIGlmICghUHlBcmdfUGFyc2VUdXBsZShfYXJncywgInMjIiwgJmJ1ZiwgJmxlbikpCi0JcmV0dXJuIE5VTEw7CisgICAgICAgIHJldHVybiBOVUxMOwogaCA9IE5ld0hhbmRsZShsZW4pOwogaWYgKCBoID09IE5VTEwgKSB7Ci0JUHlFcnJfTm9NZW1vcnkoKTsKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgUHlFcnJfTm9NZW1vcnkoKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiB9CiBITG9jayhoKTsKIG1lbWNweSgqaCwgYnVmLCBsZW4pOwpAQCAtNjYsMTAgKzY2LDEwIEBACiAKIGRlZiBnZW5yZXNjb252ZXJ0ZXIobG9uZ25hbWUsIHNob3J0bmFtZSk6CiAKLQlmID0gTWFudWFsR2VuZXJhdG9yKCJhc18lcyIlbG9uZ25hbWUsIGFzX3h4eF9ib2R5JShzaG9ydG5hbWUsIGxvbmduYW1lKSkKLQlkb2NzdHJpbmcgPSAgIlJldHVybiB0aGlzIHJlc291cmNlL2hhbmRsZSBhcyBhICVzIiVsb25nbmFtZQotCWYuZG9jc3RyaW5nID0gbGFtYmRhIGRvY3N0cmluZz1kb2NzdHJpbmc6IGRvY3N0cmluZwotCXJldHVybiBmCisgICAgZiA9IE1hbnVhbEdlbmVyYXRvcigiYXNfJXMiJWxvbmduYW1lLCBhc194eHhfYm9keSUoc2hvcnRuYW1lLCBsb25nbmFtZSkpCisgICAgZG9jc3RyaW5nID0gICJSZXR1cm4gdGhpcyByZXNvdXJjZS9oYW5kbGUgYXMgYSAlcyIlbG9uZ25hbWUKKyAgICBmLmRvY3N0cmluZyA9IGxhbWJkYSBkb2NzdHJpbmc9ZG9jc3RyaW5nOiBkb2NzdHJpbmcKKyAgICByZXR1cm4gZgogCiByZXNtZXRob2RzLmFwcGVuZChnZW5yZXNjb252ZXJ0ZXIoIkNvbnRyb2wiLCAiQ3RsIikpCiByZXNtZXRob2RzLmFwcGVuZChnZW5yZXNjb252ZXJ0ZXIoIk1lbnUiLCAiTWVudSIpKQpAQCAtODcsMTMgKzg3LDEzIEBACiBBdXRvRGlzcG9zZV9ib2R5ID0gIiIiCiBpbnQgb25vZmYsIG9sZCA9IDA7CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBpZiAoIF9zZWxmLT5vYl9mcmVlaXQgKQotCW9sZCA9IDE7CisgICAgICAgIG9sZCA9IDE7CiBpZiAoIG9ub2ZmICkKLQlfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGU7CisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsKIGVsc2UKLQlfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7CiByZXR1cm4gX3JlczsKICIiIgpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcmVzL3Jlc3NjYW4ucHkgYi9NYWMvTW9kdWxlcy9yZXMvcmVzc2Nhbi5weQppbmRleCA0N2ExOWE2Li40N2E5N2U0IDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9yZXMvcmVzc2Nhbi5weQorKysgYi9NYWMvTW9kdWxlcy9yZXMvcmVzc2Nhbi5weQpAQCAtMTMsNzMgKzEzLDczIEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIlJlc291cmNlcy5oIgotCW91dHB1dCA9ICJyZXNnZW4ucHkiCi0JZGVmc291dHB1dCA9IFRPT0xCT1hESVIgKyAiUmVzb3VyY2VzLnB5IgotCXNjYW5uZXIgPSBSZXNvdXJjZXNTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IHJlc3N1cHBvcnQnID09PSIKLQlpbXBvcnQgcmVzc3VwcG9ydAotCXByaW50ICI9PT0gRG9uZSAnaW1wb3J0IHJlc3N1cHBvcnQnLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBSZXNtb2R1bGUuYyA9PT0iCisgICAgaW5wdXQgPSAiUmVzb3VyY2VzLmgiCisgICAgb3V0cHV0ID0gInJlc2dlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJSZXNvdXJjZXMucHkiCisgICAgc2Nhbm5lciA9IFJlc291cmNlc1NjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGRvaW5nICdpbXBvcnQgcmVzc3VwcG9ydCcgPT09IgorICAgIGltcG9ydCByZXNzdXBwb3J0CisgICAgcHJpbnQgIj09PSBEb25lICdpbXBvcnQgcmVzc3VwcG9ydCcuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIFJlc21vZHVsZS5jID09PSIKIAogY2xhc3MgUmVzb3VyY2VzU2Nhbm5lcihTY2FubmVyKToKIAotCWRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKLQkJY2xhc3NuYW1lID0gIlJlc0Z1bmN0aW9uIgotCQlsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCi0JCWlmIGFyZ2xpc3Q6Ci0JCQl0LCBuLCBtID0gYXJnbGlzdFswXQotCQkJaWYgdCA9PSAiSGFuZGxlIiBhbmQgbSA9PSAiSW5Nb2RlIjoKLQkJCQljbGFzc25hbWUgPSAiUmVzTWV0aG9kIgotCQkJCWxpc3RuYW1lID0gInJlc21ldGhvZHMiCi0JCXJldHVybiBjbGFzc25hbWUsIGxpc3RuYW1lCisgICAgZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgorICAgICAgICBjbGFzc25hbWUgPSAiUmVzRnVuY3Rpb24iCisgICAgICAgIGxpc3RuYW1lID0gImZ1bmN0aW9ucyIKKyAgICAgICAgaWYgYXJnbGlzdDoKKyAgICAgICAgICAgIHQsIG4sIG0gPSBhcmdsaXN0WzBdCisgICAgICAgICAgICBpZiB0ID09ICJIYW5kbGUiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJSZXNNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAicmVzbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiUmVhZFBhcnRpYWxSZXNvdXJjZSIsCi0JCQkiV3JpdGVQYXJ0aWFsUmVzb3VyY2UiLAotCQkJIlRlbXBJbnNlcnRST01NYXAiLAotIyMJCQkiUm12ZVJlc291cmNlIiwJCSMgUmVtb3ZlUmVzb3VyY2UKLSMjCQkJIlNpemVSZXNvdXJjZSIsCQkjIEdldFJlc291cmNlU2l6ZU9uRGlzawotIyMJCQkiTWF4U2l6ZVJzcmMiLAkJIyBHZXRNYXhSZXNvdXJjZVNpemUKLQkJCSMgT1M4IG9ubHkKLQkJCSdSR2V0UmVzb3VyY2UnLAotCQkJJ09wZW5SZXNGaWxlJywKLQkJCSdDcmVhdGVSZXNGaWxlJywKLQkJCSdSc3JjWm9uZUluaXQnLAotCQkJJ0luaXRSZXNvdXJjZXMnLAotCQkJJ1JzcmNNYXBFbnRyeScsCi0JCQldCi0JCQkKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJXQotCQkJCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluT3V0QnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIk91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkoWygiU0ludDgiLCAiKiIsICIqIildLAotCQkJIFsoIlNpZ25lZEJ5dGUiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCQotCQkJKFsoIlVuaUNoYXJDb3VudCIsICIqIiwgIkluTW9kZSIpLCAoIlVuaUNoYXJfcHRyIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIlVuaWNvZGVSZXZlcnNlSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJSZWFkUGFydGlhbFJlc291cmNlIiwKKyAgICAgICAgICAgICAgICAiV3JpdGVQYXJ0aWFsUmVzb3VyY2UiLAorICAgICAgICAgICAgICAgICJUZW1wSW5zZXJ0Uk9NTWFwIiwKKyMjICAgICAgICAgICAgICAgICAgICAgICJSbXZlUmVzb3VyY2UiLCAgICAgICAgICMgUmVtb3ZlUmVzb3VyY2UKKyMjICAgICAgICAgICAgICAgICAgICAgICJTaXplUmVzb3VyY2UiLCAgICAgICAgICMgR2V0UmVzb3VyY2VTaXplT25EaXNrCisjIyAgICAgICAgICAgICAgICAgICAgICAiTWF4U2l6ZVJzcmMiLCAgICAgICAgICAjIEdldE1heFJlc291cmNlU2l6ZQorICAgICAgICAgICAgICAgICMgT1M4IG9ubHkKKyAgICAgICAgICAgICAgICAnUkdldFJlc291cmNlJywKKyAgICAgICAgICAgICAgICAnT3BlblJlc0ZpbGUnLAorICAgICAgICAgICAgICAgICdDcmVhdGVSZXNGaWxlJywKKyAgICAgICAgICAgICAgICAnUnNyY1pvbmVJbml0JywKKyAgICAgICAgICAgICAgICAnSW5pdFJlc291cmNlcycsCisgICAgICAgICAgICAgICAgJ1JzcmNNYXBFbnRyeScsCisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICBdCisKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCIqIiwgIioiLCAiT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoInZvaWQiLCAiKiIsICJPdXRNb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5PdXRCdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJTSW50OCIsICIqIiwgIioiKV0sCisgICAgICAgICAgICAgICAgIFsoIlNpZ25lZEJ5dGUiLCAiKiIsICIqIildKSwKKworCisgICAgICAgICAgICAgICAgKFsoIlVuaUNoYXJDb3VudCIsICIqIiwgIkluTW9kZSIpLCAoIlVuaUNoYXJfcHRyIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJVbmljb2RlUmV2ZXJzZUluQnVmZmVyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvcmVzL3Jlc3N1cHBvcnQucHkgYi9NYWMvTW9kdWxlcy9yZXMvcmVzc3VwcG9ydC5weQppbmRleCA2MTM1NTYwLi4wNGExODIxIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9yZXMvcmVzc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy9yZXMvcmVzc3VwcG9ydC5weQpAQCAtNywxMyArNywxMyBAQAogCiBjbGFzcyBSZXNNaXhJbjoKIAotCWRlZiBjaGVja2l0KHNlbGYpOgotCQlpZiBzZWxmLnJldHVybnR5cGUuX19jbGFzc19fICE9IE9TRXJyVHlwZToKLQkJCU91dExicmFjZSgpCi0JCQlPdXRwdXQoIk9TRXJyIF9lcnIgPSBSZXNFcnJvcigpOyIpCi0JCQlPdXRwdXQoImlmIChfZXJyICE9IG5vRXJyKSByZXR1cm4gUHlNYWNfRXJyb3IoX2Vycik7IikKLQkJCU91dFJicmFjZSgpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLmNoZWNraXQoc2VsZikgIyBYWFgKKyAgICBkZWYgY2hlY2tpdChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5yZXR1cm50eXBlLl9fY2xhc3NfXyAhPSBPU0VyclR5cGU6CisgICAgICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICAgICAgT3V0cHV0KCJPU0VyciBfZXJyID0gUmVzRXJyb3IoKTsiKQorICAgICAgICAgICAgT3V0cHV0KCJpZiAoX2VyciAhPSBub0VycikgcmV0dXJuIFB5TWFjX0Vycm9yKF9lcnIpOyIpCisgICAgICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBGdW5jdGlvbkdlbmVyYXRvci5jaGVja2l0KHNlbGYpICMgWFhYCiAKIGNsYXNzIFJlc0Z1bmN0aW9uKFJlc01peEluLCBPU0VycldlYWtMaW5rRnVuY3Rpb25HZW5lcmF0b3IpOiBwYXNzCiBjbGFzcyBSZXNNZXRob2QoUmVzTWl4SW4sIE9TRXJyV2Vha0xpbmtNZXRob2RHZW5lcmF0b3IpOiBwYXNzCkBAIC00Miw3ICs0Miw3IEBACiBzdGF0aWMgdm9pZAogUHlNYWNfQXV0b0Rpc3Bvc2VIYW5kbGUoSGFuZGxlIGgpCiB7Ci0JRGlzcG9zZUhhbmRsZShoKTsKKyAgICAgICAgRGlzcG9zZUhhbmRsZShoKTsKIH0KICIiIgogCkBAIC01MSwxNTkgKzUxLDE1OSBAQAogLyogQWx0ZXJuYXRpdmUgdmVyc2lvbiBvZiBSZXNPYmpfTmV3LCB3aGljaCByZXR1cm5zIE5vbmUgZm9yIG51bGwgYXJndW1lbnQgKi8KIFB5T2JqZWN0ICpPcHRSZXNPYmpfTmV3KEhhbmRsZSBpdHNlbGYpCiB7Ci0JaWYgKGl0c2VsZiA9PSBOVUxMKSB7Ci0JCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQkJcmV0dXJuIFB5X05vbmU7Ci0JfQotCXJldHVybiBSZXNPYmpfTmV3KGl0c2VsZik7CisgICAgICAgIGlmIChpdHNlbGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gUHlfTm9uZTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUmVzT2JqX05ldyhpdHNlbGYpOwogfQogCiBpbnQgT3B0UmVzT2JqX0NvbnZlcnQoUHlPYmplY3QgKnYsIEhhbmRsZSAqcF9pdHNlbGYpCiB7Ci0JUHlPYmplY3QgKnRtcDsKLQkKLQlpZiAoIHYgPT0gUHlfTm9uZSApIHsKLQkJKnBfaXRzZWxmID0gTlVMTDsKLQkJcmV0dXJuIDE7Ci0JfQotCWlmIChSZXNPYmpfQ2hlY2sodikpCi0JewotCQkqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdiktPm9iX2l0c2VsZjsKLQkJcmV0dXJuIDE7Ci0JfQotCS8qIElmIGl0IGlzbid0IGEgcmVzb3VyY2UgeWV0IHNlZSB3aGV0aGVyIGl0IGlzIGNvbnZlcnRpYmxlICovCi0JaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApIHsKLQkJKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKLQkJUHlfREVDUkVGKHRtcCk7Ci0JCXJldHVybiAxOwotCX0KLQlQeUVycl9DbGVhcigpOwotCVB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJSZXNvdXJjZSByZXF1aXJlZCIpOwotCXJldHVybiAwOworICAgICAgICBQeU9iamVjdCAqdG1wOworCisgICAgICAgIGlmICggdiA9PSBQeV9Ob25lICkgeworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKFJlc09ial9DaGVjayh2KSkKKyAgICAgICAgeworICAgICAgICAgICAgICAgICpwX2l0c2VsZiA9ICgoUmVzb3VyY2VPYmplY3QgKil2KS0+b2JfaXRzZWxmOworICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIC8qIElmIGl0IGlzbid0IGEgcmVzb3VyY2UgeWV0IHNlZSB3aGV0aGVyIGl0IGlzIGNvbnZlcnRpYmxlICovCisgICAgICAgIGlmICggKHRtcD1QeU9iamVjdF9DYWxsTWV0aG9kKHYsICJhc19SZXNvdXJjZSIsICIiKSkgKSB7CisgICAgICAgICAgICAgICAgKnBfaXRzZWxmID0gKChSZXNvdXJjZU9iamVjdCAqKXRtcCktPm9iX2l0c2VsZjsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYodG1wKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBQeUVycl9DbGVhcigpOworICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiUmVzb3VyY2UgcmVxdWlyZWQiKTsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBSZXNPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBSZXNPYmpfQ29udmVydCk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBPcHRSZXNPYmpfTmV3KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoSGFuZGxlLCBPcHRSZXNPYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKEhhbmRsZSwgUmVzT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChIYW5kbGUsIFJlc09ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoSGFuZGxlLCBPcHRSZXNPYmpfTmV3KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKEhhbmRsZSwgT3B0UmVzT2JqX0NvbnZlcnQpOwogIiIiCiAKIG1vZHVsZSA9IE1hY01vZHVsZSgnX1JlcycsICdSZXMnLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKIAogY2xhc3MgUmVzRGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZ2V0c2V0bGlzdCA9IFsKLQkJKCdkYXRhJywKLQkJIiIiCi0JCVB5T2JqZWN0ICpyZXM7Ci0JCWNoYXIgc3RhdGU7CisgICAgZ2V0c2V0bGlzdCA9IFsKKyAgICAgICAgICAgICgnZGF0YScsCisgICAgICAgICAgICAiIiIKKyAgICAgICAgICAgIFB5T2JqZWN0ICpyZXM7CisgICAgICAgICAgICBjaGFyIHN0YXRlOwogCi0JCXN0YXRlID0gSEdldFN0YXRlKHNlbGYtPm9iX2l0c2VsZik7Ci0JCUhMb2NrKHNlbGYtPm9iX2l0c2VsZik7Ci0JCXJlcyA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotCQkJKnNlbGYtPm9iX2l0c2VsZiwKLQkJCUdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7Ci0JCUhVbmxvY2soc2VsZi0+b2JfaXRzZWxmKTsKLQkJSFNldFN0YXRlKHNlbGYtPm9iX2l0c2VsZiwgc3RhdGUpOwotCQlyZXR1cm4gcmVzOwotCQkiIiIsCi0JCSIiIgotCQljaGFyICpkYXRhOwotCQlsb25nIHNpemU7Ci0JCi0JCWlmICggdiA9PSBOVUxMICkKLQkJCXJldHVybiAtMTsKLQkJaWYgKCAhUHlTdHJpbmdfQ2hlY2sodikgKQotCQkJcmV0dXJuIC0xOwotCQlzaXplID0gUHlTdHJpbmdfU2l6ZSh2KTsKLQkJZGF0YSA9IFB5U3RyaW5nX0FzU3RyaW5nKHYpOwotCQkvKiBYWFhYIERvIEkgbmVlZCB0aGUgR2V0U3RhdGUvU2V0U3RhdGUgY2FsbHM/ICovCi0JCVNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKLQkJaWYgKCBNZW1FcnJvcigpKQotCQkJcmV0dXJuIC0xOwotCQlITG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCQltZW1jcHkoKGNoYXIgKikqc2VsZi0+b2JfaXRzZWxmLCBkYXRhLCBzaXplKTsKLQkJSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOwotCQkvKiBYWFhYIFNob3VsZCBJIGRvIHRoZSBDaGFuZ2VkIGNhbGwgaW1tZWRlYXRlbHk/ICovCi0JCXJldHVybiAwOwotCQkiIiIsCi0JCSdUaGUgcmVzb3VyY2UgZGF0YScKLQkJKSwgKAotCQknc2l6ZScsCi0JCSdyZXR1cm4gUHlJbnRfRnJvbUxvbmcoR2V0SGFuZGxlU2l6ZShzZWxmLT5vYl9pdHNlbGYpKTsnLAotCQlOb25lLAotCQknVGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgZGF0YScKLQkJKV0KKyAgICAgICAgICAgIHN0YXRlID0gSEdldFN0YXRlKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICBITG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgcmVzID0gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCisgICAgICAgICAgICAgICAgICAgICpzZWxmLT5vYl9pdHNlbGYsCisgICAgICAgICAgICAgICAgICAgIEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7CisgICAgICAgICAgICBIVW5sb2NrKHNlbGYtPm9iX2l0c2VsZik7CisgICAgICAgICAgICBIU2V0U3RhdGUoc2VsZi0+b2JfaXRzZWxmLCBzdGF0ZSk7CisgICAgICAgICAgICByZXR1cm4gcmVzOworICAgICAgICAgICAgIiIiLAorICAgICAgICAgICAgIiIiCisgICAgICAgICAgICBjaGFyICpkYXRhOworICAgICAgICAgICAgbG9uZyBzaXplOwogCi0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCQkKLQlkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgotCQkjIGlmIGl0IGlzbid0IGEgcmVzb3VyY2Ugd2UgbWF5IGJlIGFibGUgdG8gY29lcmNlIGl0Ci0JCU91dHB1dCgiaWYgKCElc19DaGVjayh2KSkiLCBzZWxmLnByZWZpeCkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJQeU9iamVjdCAqdG1wOyIpCi0JCU91dHB1dCgnaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApJykKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOyIpCi0JCU91dHB1dCgiUHlfREVDUkVGKHRtcCk7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKLQkJT3V0UmJyYWNlKCkKKyAgICAgICAgICAgIGlmICggdiA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgaWYgKCAhUHlTdHJpbmdfQ2hlY2sodikgKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICBzaXplID0gUHlTdHJpbmdfU2l6ZSh2KTsKKyAgICAgICAgICAgIGRhdGEgPSBQeVN0cmluZ19Bc1N0cmluZyh2KTsKKyAgICAgICAgICAgIC8qIFhYWFggRG8gSSBuZWVkIHRoZSBHZXRTdGF0ZS9TZXRTdGF0ZSBjYWxscz8gKi8KKyAgICAgICAgICAgIFNldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmLCBzaXplKTsKKyAgICAgICAgICAgIGlmICggTWVtRXJyb3IoKSkKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgSExvY2soc2VsZi0+b2JfaXRzZWxmKTsKKyAgICAgICAgICAgIG1lbWNweSgoY2hhciAqKSpzZWxmLT5vYl9pdHNlbGYsIGRhdGEsIHNpemUpOworICAgICAgICAgICAgSFVubG9jayhzZWxmLT5vYl9pdHNlbGYpOworICAgICAgICAgICAgLyogWFhYWCBTaG91bGQgSSBkbyB0aGUgQ2hhbmdlZCBjYWxsIGltbWVkZWF0ZWx5PyAqLworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICAiIiIsCisgICAgICAgICAgICAnVGhlIHJlc291cmNlIGRhdGEnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnc2l6ZScsCisgICAgICAgICAgICAncmV0dXJuIFB5SW50X0Zyb21Mb25nKEdldEhhbmRsZVNpemUoc2VsZi0+b2JfaXRzZWxmKSk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnVGhlIGxlbmd0aCBvZiB0aGUgcmVzb3VyY2UgZGF0YScKKyAgICAgICAgICAgICldCiAKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoJXMgcHRyKTsiLCBzZWxmLml0c2VsZnR5cGUpCi0JCQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBOVUxMOyIpCi0JCQotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpZiAoc2VsZi0+b2JfZnJlZWl0ICYmIHNlbGYtPm9iX2l0c2VsZikiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoInNlbGYtPm9iX2ZyZWVpdChzZWxmLT5vYl9pdHNlbGYpOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgic2VsZi0+b2JfaXRzZWxmID0gTlVMTDsiKQorICAgIGRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpZiAoaXRzZWxmID09IE5VTEwpIHJldHVybiBQeU1hY19FcnJvcihyZXNOb3RGb3VuZCk7IikKIAotCWRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKLQkJT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKQotCQlPdXRwdXQKLQkJT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKLQkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfZnJlZWl0ID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIHNlbGY7IikKLQkJCi0JZGVmIG91dHB1dF90cF9pbml0Qm9keShzZWxmKToKLQkJT3V0cHV0KCJjaGFyICpzcmNkYXRhID0gTlVMTDsiKQotCQlPdXRwdXQoImludCBzcmNsZW4gPSAwOyIpCi0JCU91dHB1dCgiJXMgaXRzZWxmOyIsIHNlbGYuaXRzZWxmdHlwZSk7Ci0JCU91dHB1dCgiY2hhciAqa3dbXSA9IHtcIml0c2VsZlwiLCAwfTsiKQotCQlPdXRwdXQoKQotCQlPdXRwdXQoImlmIChQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJPJlwiLCBrdywgJXNfQ29udmVydCwgJml0c2VsZikpIiwKLQkJCXNlbGYucHJlZml4KTsKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IGl0c2VsZjsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCJQeUVycl9DbGVhcigpOyIpCi0JCU91dHB1dCgiaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dkcywgXCJ8cyNcIiwga3csICZzcmNkYXRhLCAmc3JjbGVuKSkgcmV0dXJuIC0xOyIpCi0JCU91dHB1dCgiaWYgKChpdHNlbGYgPSBOZXdIYW5kbGUoc3JjbGVuKSkgPT0gTlVMTCkiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX05vTWVtb3J5KCk7IikKLQkJT3V0cHV0KCJyZXR1cm4gMDsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKLSMgWFhYWAkJT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlSGFuZGxlOyIpCi0JCU91dHB1dCgiaWYgKHNyY2xlbiAmJiBzcmNkYXRhKSIpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiSExvY2soaXRzZWxmKTsiKQotCQlPdXRwdXQoIm1lbWNweSgqaXRzZWxmLCBzcmNkYXRhLCBzcmNsZW4pOyIpCi0JCU91dHB1dCgiSFVubG9jayhpdHNlbGYpOyIpCi0JCU91dFJicmFjZSgpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKKyAgICBkZWYgb3V0cHV0Q2hlY2tDb252ZXJ0QXJnKHNlbGYpOgorICAgICAgICAjIGlmIGl0IGlzbid0IGEgcmVzb3VyY2Ugd2UgbWF5IGJlIGFibGUgdG8gY29lcmNlIGl0CisgICAgICAgIE91dHB1dCgiaWYgKCElc19DaGVjayh2KSkiLCBzZWxmLnByZWZpeCkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqdG1wOyIpCisgICAgICAgIE91dHB1dCgnaWYgKCAodG1wPVB5T2JqZWN0X0NhbGxNZXRob2QodiwgImFzX1Jlc291cmNlIiwgIiIpKSApJykKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSAoKFJlc291cmNlT2JqZWN0ICopdG1wKS0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dHB1dCgiUHlfREVDUkVGKHRtcCk7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKworICAgIGRlZiBvdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJ2b2lkICgqb2JfZnJlZWl0KSglcyBwdHIpOyIsIHNlbGYuaXRzZWxmdHlwZSkKKworICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9mcmVlaXQgPSBOVUxMOyIpCisKKyAgICBkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7IikKKworICAgIGRlZiBvdXRwdXRfdHBfbmV3Qm9keShzZWxmKToKKyAgICAgICAgT3V0cHV0KCJQeU9iamVjdCAqc2VsZjsiKQorICAgICAgICBPdXRwdXQKKyAgICAgICAgT3V0cHV0KCJpZiAoKHNlbGYgPSB0eXBlLT50cF9hbGxvYyh0eXBlLCAwKSkgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCIoKCVzICopc2VsZiktPm9iX2l0c2VsZiA9IE5VTEw7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfZnJlZWl0ID0gTlVMTDsiLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIHNlbGY7IikKKworICAgIGRlZiBvdXRwdXRfdHBfaW5pdEJvZHkoc2VsZik6CisgICAgICAgIE91dHB1dCgiY2hhciAqc3JjZGF0YSA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpbnQgc3JjbGVuID0gMDsiKQorICAgICAgICBPdXRwdXQoIiVzIGl0c2VsZjsiLCBzZWxmLml0c2VsZnR5cGUpOworICAgICAgICBPdXRwdXQoImNoYXIgKmt3W10gPSB7XCJpdHNlbGZcIiwgMH07IikKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJpZiAoUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3ZHMsIFwiTyZcIiwga3csICVzX0NvbnZlcnQsICZpdHNlbGYpKSIsCisgICAgICAgICAgICAgICAgc2VsZi5wcmVmaXgpOworICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIigoJXMgKilzZWxmKS0+b2JfaXRzZWxmID0gaXRzZWxmOyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoIVB5QXJnX1BhcnNlVHVwbGVBbmRLZXl3b3JkcyhhcmdzLCBrd2RzLCBcInxzI1wiLCBrdywgJnNyY2RhdGEsICZzcmNsZW4pKSByZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoKGl0c2VsZiA9IE5ld0hhbmRsZShzcmNsZW4pKSA9PSBOVUxMKSIpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiUHlFcnJfTm9NZW1vcnkoKTsiKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9pdHNlbGYgPSBpdHNlbGY7Iiwgc2VsZi5vYmplY3R0eXBlKQorIyBYWFhYICAgICAgICAgIE91dHB1dCgiKCglcyAqKXNlbGYpLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZUhhbmRsZTsiKQorICAgICAgICBPdXRwdXQoImlmIChzcmNsZW4gJiYgc3JjZGF0YSkiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIkhMb2NrKGl0c2VsZik7IikKKyAgICAgICAgT3V0cHV0KCJtZW1jcHkoKml0c2VsZiwgc3JjZGF0YSwgc3JjbGVuKTsiKQorICAgICAgICBPdXRwdXQoIkhVbmxvY2soaXRzZWxmKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInJldHVybiAwOyIpCiAKIHJlc29iamVjdCA9IFJlc0RlZmluaXRpb24oJ1Jlc291cmNlJywgJ1Jlc09iaicsICdIYW5kbGUnKQogbW9kdWxlLmFkZG9iamVjdChyZXNvYmplY3QpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zY3JhcC9zY3JhcHNjYW4ucHkgYi9NYWMvTW9kdWxlcy9zY3JhcC9zY3JhcHNjYW4ucHkKaW5kZXggMGIxNzNhNC4uMWZjODE5MSAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc2NyYXAvc2NyYXBzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc2Nhbi5weQpAQCAtMTMsNDkgKzEzLDQ5IEBACiBTSE9SVCA9ICJzY3JhcCIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJTY3JhcC5oIgotCW91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKLQlkZWZzb3V0cHV0ID0gIkBTY3JhcC5weSIKLQlzY2FubmVyID0gTXlTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLSMjCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0jIwlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSAiU2NyYXAuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9ICJAU2NyYXAucHkiCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisgICAgc2Nhbm5lci5jbG9zZSgpCisjIyAgICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisjIyAgICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0ID09ICdTY3JhcFJlZicgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCA9PSAnU2NyYXBSZWYnIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCIsCi0JCQknSW5mb1NjcmFwJywKLQkJCSdHZXRTY3JhcCcsCi0JCQknWmVyb1NjcmFwJywKLQkJCSdQdXRTY3JhcCcsCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAiR2V0U2NyYXBGbGF2b3JJbmZvTGlzdCIsCisgICAgICAgICAgICAgICAgJ0luZm9TY3JhcCcsCisgICAgICAgICAgICAgICAgJ0dldFNjcmFwJywKKyAgICAgICAgICAgICAgICAnWmVyb1NjcmFwJywKKyAgICAgICAgICAgICAgICAnUHV0U2NyYXAnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQknU2NyYXBQcm9taXNlS2VlcGVyVVBQJywKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICdTY3JhcFByb21pc2VLZWVwZXJVUFAnLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoJ3ZvaWQnLCAnKicsICdPdXRNb2RlJyldLCBbKCdwdXRzY3JhcGJ1ZmZlcicsICcqJywgJ0luTW9kZScpXSksCi0JCQkoWygndm9pZF9wdHInLCAnKicsICdJbk1vZGUnKV0sIFsoJ3B1dHNjcmFwYnVmZmVyJywgJyonLCAnSW5Nb2RlJyldKSwKLQkJCV0KLQkJCQorICAgIGRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgIChbKCd2b2lkJywgJyonLCAnT3V0TW9kZScpXSwgWygncHV0c2NyYXBidWZmZXInLCAnKicsICdJbk1vZGUnKV0pLAorICAgICAgICAgICAgICAgIChbKCd2b2lkX3B0cicsICcqJywgJ0luTW9kZScpXSwgWygncHV0c2NyYXBidWZmZXInLCAnKicsICdJbk1vZGUnKV0pLAorICAgICAgICAgICAgICAgIF0KKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3NjcmFwL3NjcmFwc3VwcG9ydC5weQppbmRleCA2MzRhNDM5Li44NGE3NWQyIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy9zY3JhcC9zY3JhcHN1cHBvcnQucHkKKysrIGIvTWFjL01vZHVsZXMvc2NyYXAvc2NyYXBzdXBwb3J0LnB5CkBAIC05LDE2ICs5LDE2IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnU2NyYXAuaCcJCSMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCi1NT0ROQU1FID0gJ19TY3JhcCcJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ1NjcmFwJwkJCSMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitNQUNIRUFERVJGSUxFID0gJ1NjcmFwLmgnICAgICAgICAgICAgICAgIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKK01PRE5BTUUgPSAnX1NjcmFwJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdTY3JhcCcgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdTY3JhcCcJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gT0JKRUNUTkFNRSArICdSZWYnCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnU2NyYXAnICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUmVmJyAjIFRoZSBDIHR5cGUgdXNlZCB0byByZXByZXNlbnQgdGhlbQorT0JKRUNUUFJFRklYID0gTU9EUFJFRklYICsgJ09iaicgICAgICAgICMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKIElOUFVURklMRSA9IHN0cmluZy5sb3dlcihNT0RQUkVGSVgpICsgJ2dlbi5weScgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKLU9VVFBVVEZJTEUgPSAnQCcgKyBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSAnQCcgKyBNT0ROQU1FICsgIm1vZHVsZS5jIiAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTMzLDEyICszMywxMiBAQAogKi8KIHN0YXRpYyBQeU9iamVjdCAqCiBTQ1JSZWNfTmV3KGl0c2VsZikKLQlTY3JhcFN0dWZmICppdHNlbGY7CisgICAgICAgIFNjcmFwU3R1ZmYgKml0c2VsZjsKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsTyZoaE8mIiwgaXRzZWxmLT5zY3JhcFNpemUsCi0JCVJlc09ial9OZXcsIGl0c2VsZi0+c2NyYXBIYW5kbGUsIGl0c2VsZi0+c2NyYXBDb3VudCwgaXRzZWxmLT5zY3JhcFN0YXRlLAotCQlQeU1hY19CdWlsZFN0cjI1NSwgaXRzZWxmLT5zY3JhcE5hbWUpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibE8maGhPJiIsIGl0c2VsZi0+c2NyYXBTaXplLAorICAgICAgICAgICAgICAgIFJlc09ial9OZXcsIGl0c2VsZi0+c2NyYXBIYW5kbGUsIGl0c2VsZi0+c2NyYXBDb3VudCwgaXRzZWxmLT5zY3JhcFN0YXRlLAorICAgICAgICAgICAgICAgIFB5TWFjX0J1aWxkU3RyMjU1LCBpdHNlbGYtPnNjcmFwTmFtZSk7CiB9CiAiIiIKIApAQCAtNDksNyArNDksNyBAQAogcHV0c2NyYXBidWZmZXIgPSBGaXhlZElucHV0QnVmZmVyVHlwZSgndm9pZCAqJykKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQlwYXNzCisgICAgcGFzcwogCiAjIENyZWF0ZSB0aGUgZ2VuZXJhdG9yIGdyb3VwcyBhbmQgbGluayB0aGVtCiBtb2R1bGUgPSBNYWNNb2R1bGUoTU9ETkFNRSwgTU9EUFJFRklYLCBpbmNsdWRlc3R1ZmYsIGZpbmFsc3R1ZmYsIGluaXRzdHVmZikKQEAgLTczLDQgKzczLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3NuZC9zbmRzY2FuLnB5IGIvTWFjL01vZHVsZXMvc25kL3NuZHNjYW4ucHkKaW5kZXggYTI4N2M3My4uYzRhODI2NiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvc25kL3NuZHNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvc25kL3NuZHNjYW4ucHkKQEAgLTEwLDExOSArMTAsMTE5IEBACiBmcm9tIHNjYW50b29scyBpbXBvcnQgU2Nhbm5lcgogCiBkZWYgbWFpbigpOgotCWlucHV0ID0gIlNvdW5kLmgiCi0Jb3V0cHV0ID0gInNuZGdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJTb3VuZC5weSIKLQlzY2FubmVyID0gU291bmRTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCi0Jc2Nhbm5lci5zY2FuKCkKLQlzY2FubmVyLmNsb3NlKCkKLQlwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgotCWV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKLQlwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IHNuZHN1cHBvcnQnID09PSIKLQlpbXBvcnQgc25kc3VwcG9ydAotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgU25kbW9kdWxlLmMgPT09IgorICAgIGlucHV0ID0gIlNvdW5kLmgiCisgICAgb3V0cHV0ID0gInNuZGdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJTb3VuZC5weSIKKyAgICBzY2FubmVyID0gU291bmRTY2FubmVyKGlucHV0LCBvdXRwdXQsIGRlZnNvdXRwdXQpCisgICAgc2Nhbm5lci5zY2FuKCkKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBkb2luZyAnaW1wb3J0IHNuZHN1cHBvcnQnID09PSIKKyAgICBpbXBvcnQgc25kc3VwcG9ydAorICAgIHByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgU25kbW9kdWxlLmMgPT09IgogCiBjbGFzcyBTb3VuZFNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJTbmRGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCWlmIHQgPT0gIlNuZENoYW5uZWxQdHIiIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJTbmRNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAic25kbWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJTbmRGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgIGlmIHQgPT0gIlNuZENoYW5uZWxQdHIiIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJTbmRNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAic25kbWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdTbmREaXNwb3NlQ2hhbm5lbCcsCQkjIGF1dG9tYXRpYyBvbiBkZWFsbG9jYXRpb24KLQkJCSdTbmRBZGRNb2RpZmllcicsCQkjIGZvciBpbnRlcm5hbCB1c2Ugb25seQotCQkJJ1NuZFBsYXlEb3VibGVCdWZmZXInLAkJIyB2ZXJ5IGxvdyBsZXZlbCByb3V0aW5lCi0JCQkjIE1pc3NpbmcgZnJvbSBsaWJyYXJpZXMgKFVIMzMyKQotCQkJJ1NvdW5kTWFuYWdlclNldEluZm8nLAotCQkJJ1NvdW5kTWFuYWdlckdldEluZm8nLAotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJJ3JhdGU0OGtoeicsCi0JCQkncmF0ZTQ0a2h6JywKLQkJCSdrSW52YWxpZFNvdXJjZScsCi0JCQkjIE9TOCBvbmx5OgotCQkJJ01BQ0VWZXJzaW9uJywKLQkJCSdTUEJSZWNvcmRUb0ZpbGUnLAotCQkJJ0V4cDF0bzYnLAotCQkJJ0NvbXA2dG8xJywKLQkJCSdFeHAxdG8zJywKLQkJCSdDb21wM3RvMScsCi0JCQknU25kQ29udHJvbCcsCi0JCQknU25kU3RvcEZpbGVQbGF5JywKLQkJCSdTbmRTdGFydEZpbGVQbGF5JywKLQkJCSdTbmRQYXVzZUZpbGVQbGF5JywKLQkJCSdTbmRSZWNvcmRUb0ZpbGUnLAorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgJ1NuZERpc3Bvc2VDaGFubmVsJywgICAgICAgICAgICAjIGF1dG9tYXRpYyBvbiBkZWFsbG9jYXRpb24KKyAgICAgICAgICAgICAgICAnU25kQWRkTW9kaWZpZXInLCAgICAgICAgICAgICAgICMgZm9yIGludGVybmFsIHVzZSBvbmx5CisgICAgICAgICAgICAgICAgJ1NuZFBsYXlEb3VibGVCdWZmZXInLCAgICAgICAgICAjIHZlcnkgbG93IGxldmVsIHJvdXRpbmUKKyAgICAgICAgICAgICAgICAjIE1pc3NpbmcgZnJvbSBsaWJyYXJpZXMgKFVIMzMyKQorICAgICAgICAgICAgICAgICdTb3VuZE1hbmFnZXJTZXRJbmZvJywKKyAgICAgICAgICAgICAgICAnU291bmRNYW5hZ2VyR2V0SW5mbycsCisgICAgICAgICAgICAgICAgIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICdyYXRlNDhraHonLAorICAgICAgICAgICAgICAgICdyYXRlNDRraHonLAorICAgICAgICAgICAgICAgICdrSW52YWxpZFNvdXJjZScsCisgICAgICAgICAgICAgICAgIyBPUzggb25seToKKyAgICAgICAgICAgICAgICAnTUFDRVZlcnNpb24nLAorICAgICAgICAgICAgICAgICdTUEJSZWNvcmRUb0ZpbGUnLAorICAgICAgICAgICAgICAgICdFeHAxdG82JywKKyAgICAgICAgICAgICAgICAnQ29tcDZ0bzEnLAorICAgICAgICAgICAgICAgICdFeHAxdG8zJywKKyAgICAgICAgICAgICAgICAnQ29tcDN0bzEnLAorICAgICAgICAgICAgICAgICdTbmRDb250cm9sJywKKyAgICAgICAgICAgICAgICAnU25kU3RvcEZpbGVQbGF5JywKKyAgICAgICAgICAgICAgICAnU25kU3RhcnRGaWxlUGxheScsCisgICAgICAgICAgICAgICAgJ1NuZFBhdXNlRmlsZVBsYXknLAorICAgICAgICAgICAgICAgICdTbmRSZWNvcmRUb0ZpbGUnLAogCi0JCQldCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJHZXRTb3VuZFZvbCIsCi0JCQkiU2V0U291bmRWb2wiLAotCQkJIlVuc2lnbmVkRml4ZWQiLAotCQkJIyBEb24ndCBoYXZlIHRoZSB0aW1lIHRvIGRpZyBpbnRvIHRoaXMuLi4KLQkJCSJDb21wb25lbnQiLAotCQkJIkNvbXBvbmVudEluc3RhbmNlIiwKLQkJCSJTb3VuZENvbXBvbmVudERhdGFQdHIiLAotCQkJIlNvdW5kQ29tcG9uZW50RGF0YSIsCi0JCQkiU291bmRDb21wb25lbnREYXRhX3B0ciIsCi0JCQkiU291bmRDb252ZXJ0ZXIiLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIkdldFNvdW5kVm9sIiwKKyAgICAgICAgICAgICAgICAiU2V0U291bmRWb2wiLAorICAgICAgICAgICAgICAgICJVbnNpZ25lZEZpeGVkIiwKKyAgICAgICAgICAgICAgICAjIERvbid0IGhhdmUgdGhlIHRpbWUgdG8gZGlnIGludG8gdGhpcy4uLgorICAgICAgICAgICAgICAgICJDb21wb25lbnQiLAorICAgICAgICAgICAgICAgICJDb21wb25lbnRJbnN0YW5jZSIsCisgICAgICAgICAgICAgICAgIlNvdW5kQ29tcG9uZW50RGF0YVB0ciIsCisgICAgICAgICAgICAgICAgIlNvdW5kQ29tcG9uZW50RGF0YSIsCisgICAgICAgICAgICAgICAgIlNvdW5kQ29tcG9uZW50RGF0YV9wdHIiLAorICAgICAgICAgICAgICAgICJTb3VuZENvbnZlcnRlciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygiU3RyMjU1IiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCQotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCi0JCQkgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJWYXJWYXJPdXRCdWZmZXIiLCAiKiIsICJJbk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygiU0NTdGF0dXNQdHIiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiU0NTdGF0dXMiLCAiKiIsICJPdXRNb2RlIildKSwKLQkJCQotCQkJKFsoIlNNU3RhdHVzUHRyIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIlNNU3RhdHVzIiwgIioiLCAiT3V0TW9kZSIpXSksCi0JCQkgCi0JCQkoWygiQ29tcHJlc3Npb25JbmZvUHRyIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkNvbXByZXNzaW9uSW5mbyIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkjIEZvciBTbmRQbGF5J3MgU25kTGlzdEhhbmRsZSBhcmd1bWVudAotCQkJKFsoIkhhbmRsZSIsICJzbmRIZGwiLCAiSW5Nb2RlIildLAotCQkJIFsoIlNuZExpc3RIYW5kbGUiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgRm9yIFNuZFN0YXJ0RmlsZVBsYXkKLQkJCShbKCJsb25nIiwgImJ1ZmZlclNpemUiLCAiSW5Nb2RlIiksICgidm9pZCIsICJ0aGVCdWZmZXIiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCIqIiwgIioiLCAiKiIpLCAoIkZha2VUeXBlKCcwJykiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJCi0JCQkjIEZvciBDb21wM3RvMSBldGMuCi0JCQkoWygidm9pZF9wdHIiLCAiaW5CdWZmZXIiLCAiSW5Nb2RlIiksCi0JCQkgICgidm9pZCIsICJvdXRCdWZmZXIiLCAiT3V0TW9kZSIpLAotCQkJICAoInVuc2lnbmVkX2xvbmciLCAiY250IiwgIkluTW9kZSIpXSwKLQkJCSBbKCJJbk91dEJ1ZmZlciIsICJidWZmZXIiLCAiSW5PdXRNb2RlIildKSwKLQkJCQotCQkJIyBEaXR0bwotIyMJCQkoWygidm9pZF9wdHIiLCAiaW5TdGF0ZSIsICJJbk1vZGUiKSwgKCJ2b2lkIiwgIm91dFN0YXRlIiwgIk91dE1vZGUiKV0sCi0jIwkJCSBbKCJJbk91dEJ1ZjEyOCIsICJzdGF0ZSIsICJJbk91dE1vZGUiKV0pLAotCQkJKFsoIlN0YXRlQmxvY2tQdHIiLCAiaW5TdGF0ZSIsICJJbk1vZGUiKSwgKCJTdGF0ZUJsb2NrUHRyIiwgIm91dFN0YXRlIiwgIkluTW9kZSIpXSwKLQkJCSBbKCJTdGF0ZUJsb2NrIiwgInN0YXRlIiwgIkluT3V0TW9kZSIpXSksCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoIlN0cjI1NSIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAogCi0JCQkjIENhdGNoLWFsbCBmb3IgdGhlIGxhc3QgY291cGxlIG9mIHZvaWQgcG9pbnRlcnMKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpXSwKLQkJCSBbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpXSksCi0JCQldCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgibG9uZyIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJsb25nIiwgIioiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiVmFyVmFyT3V0QnVmZmVyIiwgIioiLCAiSW5PdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJTQ1N0YXR1c1B0ciIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiU0NTdGF0dXMiLCAiKiIsICJPdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJTTVN0YXR1c1B0ciIsICIqIiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiU01TdGF0dXMiLCAiKiIsICJPdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJDb21wcmVzc2lvbkluZm9QdHIiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkNvbXByZXNzaW9uSW5mbyIsICIqIiwgIk91dE1vZGUiKV0pLAorCisgICAgICAgICAgICAgICAgIyBGb3IgU25kUGxheSdzIFNuZExpc3RIYW5kbGUgYXJndW1lbnQKKyAgICAgICAgICAgICAgICAoWygiSGFuZGxlIiwgInNuZEhkbCIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlNuZExpc3RIYW5kbGUiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgRm9yIFNuZFN0YXJ0RmlsZVBsYXkKKyAgICAgICAgICAgICAgICAoWygibG9uZyIsICJidWZmZXJTaXplIiwgIkluTW9kZSIpLCAoInZvaWQiLCAidGhlQnVmZmVyIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIioiLCAiKiIsICIqIiksICgiRmFrZVR5cGUoJzAnKSIsICIqIiwgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIEZvciBDb21wM3RvMSBldGMuCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgImluQnVmZmVyIiwgIkluTW9kZSIpLAorICAgICAgICAgICAgICAgICAgKCJ2b2lkIiwgIm91dEJ1ZmZlciIsICJPdXRNb2RlIiksCisgICAgICAgICAgICAgICAgICAoInVuc2lnbmVkX2xvbmciLCAiY250IiwgIkluTW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiSW5PdXRCdWZmZXIiLCAiYnVmZmVyIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIERpdHRvCisjIyAgICAgICAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiaW5TdGF0ZSIsICJJbk1vZGUiKSwgKCJ2b2lkIiwgIm91dFN0YXRlIiwgIk91dE1vZGUiKV0sCisjIyAgICAgICAgICAgICAgICAgICAgICAgWygiSW5PdXRCdWYxMjgiLCAic3RhdGUiLCAiSW5PdXRNb2RlIildKSwKKyAgICAgICAgICAgICAgICAoWygiU3RhdGVCbG9ja1B0ciIsICJpblN0YXRlIiwgIkluTW9kZSIpLCAoIlN0YXRlQmxvY2tQdHIiLCAib3V0U3RhdGUiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJTdGF0ZUJsb2NrIiwgInN0YXRlIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIENhdGNoLWFsbCBmb3IgdGhlIGxhc3QgY291cGxlIG9mIHZvaWQgcG9pbnRlcnMKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIildKSwKKyAgICAgICAgICAgICAgICBdCiAKIGlmIF9fbmFtZV9fID09ICJfX21haW5fXyI6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy9zbmQvc25kc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3NuZC9zbmRzdXBwb3J0LnB5CmluZGV4IDk5ZGY1YmUuLmNmMGZhNmMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3NuZC9zbmRzdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3NuZC9zbmRzdXBwb3J0LnB5CkBAIC0yNywxMiArMjcsMTIgQEAKICMgZGVmaW5lIHR5cGVzIHVzZWQgZm9yIGFyZ3VtZW50cyAoaW4gYWRkaXRpb24gdG8gc3RhbmRhcmQgYW5kIG1hY3N1cHBvcnQgdHlwZXMpCiAKIGNsYXNzIFNuZENoYW5uZWxQdHJUeXBlKE9wYXF1ZUJ5VmFsdWVUeXBlKToKLQlkZWYgZGVjbGFyZShzZWxmLCBuYW1lKToKLQkJIyBJbml0aWFsaXppbmcgYWxsIFNuZENoYW5uZWxQdHIgb2JqZWN0cyB0byAwIHNhdmVzCi0JCSMgc3BlY2lhbC1jYXNpbmcgTmV3U25kQ2hhbm5lbCgpLCB3aGVyZSBpdCBpcyBmb3JtYWxseSBhbgotCQkjIGlucHV0LW91dHB1dCBwYXJhbWV0ZXIgYnV0IHdlIHRyZWF0IGl0IGFzIG91dHB1dC1vbmx5Ci0JCSMgKHNpbmNlIFB5dGhvbiB1c2VycyBhcmUgbm90IHN1cHBvc2VkIHRvIGFsbG9jYXRlIG1lbW9yeSkKLQkJT3V0cHV0KCJTbmRDaGFubmVsUHRyICVzID0gMDsiLCBuYW1lKQorICAgIGRlZiBkZWNsYXJlKHNlbGYsIG5hbWUpOgorICAgICAgICAjIEluaXRpYWxpemluZyBhbGwgU25kQ2hhbm5lbFB0ciBvYmplY3RzIHRvIDAgc2F2ZXMKKyAgICAgICAgIyBzcGVjaWFsLWNhc2luZyBOZXdTbmRDaGFubmVsKCksIHdoZXJlIGl0IGlzIGZvcm1hbGx5IGFuCisgICAgICAgICMgaW5wdXQtb3V0cHV0IHBhcmFtZXRlciBidXQgd2UgdHJlYXQgaXQgYXMgb3V0cHV0LW9ubHkKKyAgICAgICAgIyAoc2luY2UgUHl0aG9uIHVzZXJzIGFyZSBub3Qgc3VwcG9zZWQgdG8gYWxsb2NhdGUgbWVtb3J5KQorICAgICAgICBPdXRwdXQoIlNuZENoYW5uZWxQdHIgJXMgPSAwOyIsIG5hbWUpCiAKIFNuZENoYW5uZWxQdHIgPSBTbmRDaGFubmVsUHRyVHlwZSgnU25kQ2hhbm5lbFB0cicsICdTbmRDaCcpCiAKQEAgLTQ5LDI4ICs0OSwyOCBAQAogdm9pZF9wdHIgPSBUeXBlKCJ2b2lkICoiLCAidyIpCiAKIGNsYXNzIFNuZENhbGxCYWNrVHlwZShJbnB1dE9ubHlUeXBlKToKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCVR5cGUuX19pbml0X18oc2VsZiwgJ1B5T2JqZWN0KicsICdPJykKLQlkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgotCQlPdXRwdXQoImlmICglcyAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKCVzKSkiLCBuYW1lLCBuYW1lKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7JykKLQkJT3V0cHV0KCJnb3RvICVzX19lcnJvcl9fOyIsIG5hbWUpCi0JCU91dFJicmFjZSgpCi0JZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKLQkJcmV0dXJuICJOZXdTbmRDYWxsQmFja1VQUChTbmRDaF9Vc2VyUm91dGluZSkiCi0JZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6Ci0JCSMgWFhYIFRoaXMga25vd3MgaXQgaXMgZXhlY3V0aW5nIGluc2lkZSB0aGUgU25kTmV3Q2hhbm5lbCB3cmFwcGVyCi0JCU91dHB1dCgiaWYgKF9yZXMgIT0gTlVMTCAmJiAlcyAhPSBQeV9Ob25lKSIsIG5hbWUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopX3JlczsiKQotCQlPdXRwdXQoInAtPm9iX2l0c2VsZi0+dXNlckluZm8gPSAobG9uZylwOyIpCi0JCU91dHB1dCgiUHlfSU5DUkVGKCVzKTsiLCBuYW1lKQotCQlPdXRwdXQoInAtPm9iX2NhbGxiYWNrID0gJXM7IiwgbmFtZSkKLQkJT3V0UmJyYWNlKCkKLQkJRGVkZW50TGV2ZWwoKQotCQlPdXRwdXQoIiAlc19fZXJyb3JfXzogOyIsIG5hbWUpCi0JCUluZGVudExldmVsKCkKKyAgICBkZWYgX19pbml0X18oc2VsZik6CisgICAgICAgIFR5cGUuX19pbml0X18oc2VsZiwgJ1B5T2JqZWN0KicsICdPJykKKyAgICBkZWYgZ2V0YXJnc0NoZWNrKHNlbGYsIG5hbWUpOgorICAgICAgICBPdXRwdXQoImlmICglcyAhPSBQeV9Ob25lICYmICFQeUNhbGxhYmxlX0NoZWNrKCVzKSkiLCBuYW1lLCBuYW1lKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoJ1B5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJjYWxsYmFjayBtdXN0IGJlIGNhbGxhYmxlIik7JykKKyAgICAgICAgT3V0cHV0KCJnb3RvICVzX19lcnJvcl9fOyIsIG5hbWUpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgZGVmIHBhc3NJbnB1dChzZWxmLCBuYW1lKToKKyAgICAgICAgcmV0dXJuICJOZXdTbmRDYWxsQmFja1VQUChTbmRDaF9Vc2VyUm91dGluZSkiCisgICAgZGVmIGNsZWFudXAoc2VsZiwgbmFtZSk6CisgICAgICAgICMgWFhYIFRoaXMga25vd3MgaXQgaXMgZXhlY3V0aW5nIGluc2lkZSB0aGUgU25kTmV3Q2hhbm5lbCB3cmFwcGVyCisgICAgICAgIE91dHB1dCgiaWYgKF9yZXMgIT0gTlVMTCAmJiAlcyAhPSBQeV9Ob25lKSIsIG5hbWUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopX3JlczsiKQorICAgICAgICBPdXRwdXQoInAtPm9iX2l0c2VsZi0+dXNlckluZm8gPSAobG9uZylwOyIpCisgICAgICAgIE91dHB1dCgiUHlfSU5DUkVGKCVzKTsiLCBuYW1lKQorICAgICAgICBPdXRwdXQoInAtPm9iX2NhbGxiYWNrID0gJXM7IiwgbmFtZSkKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgRGVkZW50TGV2ZWwoKQorICAgICAgICBPdXRwdXQoIiAlc19fZXJyb3JfXzogOyIsIG5hbWUpCisgICAgICAgIEluZGVudExldmVsKCkKIAogU25kQ2FsbEJhY2tQcm9jUHRyID0gU25kQ2FsbEJhY2tUeXBlKCkKIFNuZENhbGxCYWNrVVBQID0gU25kQ2FsbEJhY2tQcm9jUHRyCkBAIC05NSwxNiArOTUsMTYgQEAKIHN0YXRpYyBpbnQKIFNuZENtZF9Db252ZXJ0KFB5T2JqZWN0ICp2LCBTbmRDb21tYW5kICpwYykKIHsKLQlpbnQgbGVuOwotCXBjLT5wYXJhbTEgPSAwOwotCXBjLT5wYXJhbTIgPSAwOwotCWlmIChQeVR1cGxlX0NoZWNrKHYpKSB7Ci0JCWlmIChQeUFyZ19QYXJzZVR1cGxlKHYsICJofGhsIiwgJnBjLT5jbWQsICZwYy0+cGFyYW0xLCAmcGMtPnBhcmFtMikpCi0JCQlyZXR1cm4gMTsKLQkJUHlFcnJfQ2xlYXIoKTsKLQkJcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIkhocyMiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yLCAmbGVuKTsKLQl9Ci0JcmV0dXJuIFB5QXJnX1BhcnNlKHYsICJIIiwgJnBjLT5jbWQpOworICAgICAgICBpbnQgbGVuOworICAgICAgICBwYy0+cGFyYW0xID0gMDsKKyAgICAgICAgcGMtPnBhcmFtMiA9IDA7CisgICAgICAgIGlmIChQeVR1cGxlX0NoZWNrKHYpKSB7CisgICAgICAgICAgICAgICAgaWYgKFB5QXJnX1BhcnNlVHVwbGUodiwgImh8aGwiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yKSkKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICAgICAgICAgIFB5RXJyX0NsZWFyKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFB5QXJnX1BhcnNlVHVwbGUodiwgIkhocyMiLCAmcGMtPmNtZCwgJnBjLT5wYXJhbTEsICZwYy0+cGFyYW0yLCAmbGVuKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIkgiLCAmcGMtPmNtZCk7CiB9CiAKIHN0YXRpYyBwYXNjYWwgdm9pZCBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCk7IC8qIEZvcndhcmQgKi8KQEAgLTExNyw2MiArMTE3LDYyIEBACiBzdGF0aWMgaW50CiBTbmRDaF9DYWxsQ2FsbEJhY2sodm9pZCAqYXJnKQogewotCVNuZENoYW5uZWxPYmplY3QgKnAgPSAoU25kQ2hhbm5lbE9iamVjdCAqKWFyZzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqcmVzOwotCWFyZ3MgPSBQeV9CdWlsZFZhbHVlKCIoTyhoaGwpKSIsCi0JICAgICAgICAgICAgICAgICAgICAgcCwgcC0+b2JfY21kLmNtZCwgcC0+b2JfY21kLnBhcmFtMSwgcC0+b2JfY21kLnBhcmFtMik7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfY2FsbGJhY2ssIGFyZ3MpOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopYXJnOworICAgICAgICBQeU9iamVjdCAqYXJnczsKKyAgICAgICAgUHlPYmplY3QgKnJlczsKKyAgICAgICAgYXJncyA9IFB5X0J1aWxkVmFsdWUoIihPKGhobCkpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCwgcC0+b2JfY21kLmNtZCwgcC0+b2JfY21kLnBhcmFtMSwgcC0+b2JfY21kLnBhcmFtMik7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX2NhbGxiYWNrLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICBpZiAocmVzID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICBQeV9ERUNSRUYocmVzKTsKKyAgICAgICAgcmV0dXJuIDA7CiB9CiAKIC8qIFJvdXRpbmUgcGFzc2VkIHRvIE5ld1NuZENoYW5uZWwgLS0gc2NoZWR1bGUgYSBjYWxsIHRvIFNuZENoX0NhbGxDYWxsQmFjayAqLwogc3RhdGljIHBhc2NhbCB2b2lkCiBTbmRDaF9Vc2VyUm91dGluZShTbmRDaGFubmVsUHRyIGNoYW4sIFNuZENvbW1hbmQgKmNtZCkKIHsKLQlTbmRDaGFubmVsT2JqZWN0ICpwID0gKFNuZENoYW5uZWxPYmplY3QgKikoY2hhbi0+dXNlckluZm8pOwotCWlmIChwLT5vYl9jYWxsYmFjayAhPSBOVUxMKSB7Ci0JCWxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7Ci0JCXAtPm9iX2NtZCA9ICpjbWQ7Ci0JCVB5X0FkZFBlbmRpbmdDYWxsKFNuZENoX0NhbGxDYWxsQmFjaywgKHZvaWQgKilwKTsKLQkJU2V0QTUoQTUpOwotCX0KKyAgICAgICAgU25kQ2hhbm5lbE9iamVjdCAqcCA9IChTbmRDaGFubmVsT2JqZWN0ICopKGNoYW4tPnVzZXJJbmZvKTsKKyAgICAgICAgaWYgKHAtPm9iX2NhbGxiYWNrICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOworICAgICAgICAgICAgICAgIHAtPm9iX2NtZCA9ICpjbWQ7CisgICAgICAgICAgICAgICAgUHlfQWRkUGVuZGluZ0NhbGwoU25kQ2hfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOworICAgICAgICAgICAgICAgIFNldEE1KEE1KTsKKyAgICAgICAgfQogfQogCiAvKiBTUEIgY2FsbGJhY2tzIC0gU2NoZWR1bGUgY2FsbGJhY2tzIHRvIFB5dGhvbiAqLwogc3RhdGljIGludAogU1BCX0NhbGxDYWxsQmFjayh2b2lkICphcmcpCiB7Ci0JU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKWFyZzsKLQlQeU9iamVjdCAqYXJnczsKLQlQeU9iamVjdCAqcmVzOwotCQotCWlmICggcC0+b2JfdGhpc2NhbGxiYWNrID09IDAgKSByZXR1cm4gMDsKLQlhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8pIiwgcCk7Ci0JcmVzID0gUHlFdmFsX0NhbGxPYmplY3QocC0+b2JfdGhpc2NhbGxiYWNrLCBhcmdzKTsKLQlwLT5vYl90aGlzY2FsbGJhY2sgPSAwOwotCVB5X0RFQ1JFRihhcmdzKTsKLQlpZiAocmVzID09IE5VTEwpCi0JCXJldHVybiAtMTsKLQlQeV9ERUNSRUYocmVzKTsKLQlyZXR1cm4gMDsKKyAgICAgICAgU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKWFyZzsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M7CisgICAgICAgIFB5T2JqZWN0ICpyZXM7CisKKyAgICAgICAgaWYgKCBwLT5vYl90aGlzY2FsbGJhY2sgPT0gMCApIHJldHVybiAwOworICAgICAgICBhcmdzID0gUHlfQnVpbGRWYWx1ZSgiKE8pIiwgcCk7CisgICAgICAgIHJlcyA9IFB5RXZhbF9DYWxsT2JqZWN0KHAtPm9iX3RoaXNjYWxsYmFjaywgYXJncyk7CisgICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IDA7CisgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgaWYgKHJlcyA9PSBOVUxMKQorICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgUHlfREVDUkVGKHJlcyk7CisgICAgICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgcGFzY2FsIHZvaWQKIFNQQl9jb21wbGV0aW9uKFNQQlB0ciBteV9zcGIpCiB7Ci0JU1BCT2JqZWN0ICpwID0gKFNQQk9iamVjdCAqKShteV9zcGItPnVzZXJMb25nKTsKLQkKLQlpZiAocCAmJiBwLT5vYl9jb21wbGV0aW9uKSB7Ci0JCWxvbmcgQTUgPSBTZXRBNShwLT5vYl9BNSk7Ci0JCXAtPm9iX3RoaXNjYWxsYmFjayA9IHAtPm9iX2NvbXBsZXRpb247CS8qIEhvcGUgd2UgY2Fubm90IGdldCB0d28gYXQgdGhlIHNhbWUgdGltZSAqLwotCQlQeV9BZGRQZW5kaW5nQ2FsbChTUEJfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOwotCQlTZXRBNShBNSk7Ci0JfQorICAgICAgICBTUEJPYmplY3QgKnAgPSAoU1BCT2JqZWN0ICopKG15X3NwYi0+dXNlckxvbmcpOworCisgICAgICAgIGlmIChwICYmIHAtPm9iX2NvbXBsZXRpb24pIHsKKyAgICAgICAgICAgICAgICBsb25nIEE1ID0gU2V0QTUocC0+b2JfQTUpOworICAgICAgICAgICAgICAgIHAtPm9iX3RoaXNjYWxsYmFjayA9IHAtPm9iX2NvbXBsZXRpb247ICAvKiBIb3BlIHdlIGNhbm5vdCBnZXQgdHdvIGF0IHRoZSBzYW1lIHRpbWUgKi8KKyAgICAgICAgICAgICAgICBQeV9BZGRQZW5kaW5nQ2FsbChTUEJfQ2FsbENhbGxCYWNrLCAodm9pZCAqKXApOworICAgICAgICAgICAgICAgIFNldEE1KEE1KTsKKyAgICAgICAgfQogfQogCiAiIiIKQEAgLTE4MiwxMTAgKzE4MiwxMTAgQEAKIAogY2xhc3MgU25kT2JqZWN0RGVmaW5pdGlvbihQRVAyNTJNaXhpbiwgT2JqZWN0RGVmaW5pdGlvbik6CiAKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiLyogTWVtYmVycyB1c2VkIHRvIGltcGxlbWVudCBjYWxsYmFja3M6ICovIikKLQkJT3V0cHV0KCJQeU9iamVjdCAqb2JfY2FsbGJhY2s7IikKLQkJT3V0cHV0KCJsb25nIG9iX0E1OyIpOwotCQlPdXRwdXQoIlNuZENvbW1hbmQgb2JfY21kOyIpCisgICAgZGVmIG91dHB1dFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE9iamVjdERlZmluaXRpb24ub3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIi8qIE1lbWJlcnMgdXNlZCB0byBpbXBsZW1lbnQgY2FsbGJhY2tzOiAqLyIpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKm9iX2NhbGxiYWNrOyIpCisgICAgICAgIE91dHB1dCgibG9uZyBvYl9BNTsiKTsKKyAgICAgICAgT3V0cHV0KCJTbmRDb21tYW5kIG9iX2NtZDsiKQogCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiaXQtPm9iX2NhbGxiYWNrID0gTlVMTDsiKQotCQlPdXRwdXQoIml0LT5vYl9BNSA9IFNldEN1cnJlbnRBNSgpOyIpOworICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9jYWxsYmFjayA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfQTUgPSBTZXRDdXJyZW50QTUoKTsiKTsKIAotCWRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKLQkJT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOyIpCi0JCi0JZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLQkJT3V0cHV0KCJTbmREaXNwb3NlQ2hhbm5lbCglcywgMSk7IiwgaXRzZWxmbmFtZSkKLQkJCi0JZGVmIG91dHB1dENvbnZlcnQoc2VsZik6Ci0JCXBhc3MgIyBOb3QgbmVlZGVkCi0JCQorICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfY2FsbGJhY2spOyIpCisKKyAgICBkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgorICAgICAgICBPdXRwdXQoIlNuZERpc3Bvc2VDaGFubmVsKCVzLCAxKTsiLCBpdHNlbGZuYW1lKQorCisgICAgZGVmIG91dHB1dENvbnZlcnQoc2VsZik6CisgICAgICAgIHBhc3MgIyBOb3QgbmVlZGVkCisKICMKIAogY2xhc3MgU3BiT2JqZWN0RGVmaW5pdGlvbihQRVAyNTJNaXhpbiwgT2JqZWN0RGVmaW5pdGlvbik6Ci0JZ2V0c2V0bGlzdCA9IFsKLQkJKAotCQknaW5SZWZOdW0nLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImwiLCBzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOycsCi0JCSdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOycsCi0JCU5vbmUsCi0JCSksICgKLQkJJ2NvdW50JywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJsIiwgc2VsZi0+b2Jfc3BiLmNvdW50KTsnLAotCQkncmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLmNvdW50KTsnLAotCQlOb25lCi0JCSksICgKLQkJJ21pbGxpc2Vjb25kcycsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOycsCi0JCSdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIubWlsbGlzZWNvbmRzKTsnLAotCQlOb25lLAotCQkpLCAoCi0JCSdlcnJvcicsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsIHNlbGYtPm9iX3NwYi5lcnJvcik7JywKLQkJTm9uZSwKLQkJTm9uZQotCQkpLCAoCi0JCSdjb21wbGV0aW9uUm91dGluZScsCi0JCU5vbmUsCi0JCSIiInNlbGYtPm9iX3NwYi5jb21wbGV0aW9uUm91dGluZSA9IE5ld1NJQ29tcGxldGlvblVQUChTUEJfY29tcGxldGlvbik7Ci0JCXNlbGYtPm9iX2NvbXBsZXRpb24gPSB2OwotCQlQeV9JTkNSRUYodik7Ci0JCXJldHVybiAwOyIiIiwKLQkJTm9uZSwKLQkJKV0KKyAgICBnZXRzZXRsaXN0ID0gWworICAgICAgICAgICAgKAorICAgICAgICAgICAgJ2luUmVmTnVtJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5pblJlZk51bSk7JywKKyAgICAgICAgICAgICdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuaW5SZWZOdW0pOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2NvdW50JywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5jb3VudCk7JywKKyAgICAgICAgICAgICdyZXR1cm4gLTEgKyBQeUFyZ19QYXJzZSh2LCAibCIsICZzZWxmLT5vYl9zcGIuY291bnQpOycsCisgICAgICAgICAgICBOb25lCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnbWlsbGlzZWNvbmRzJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibCIsIHNlbGYtPm9iX3NwYi5taWxsaXNlY29uZHMpOycsCisgICAgICAgICAgICAncmV0dXJuIC0xICsgUHlBcmdfUGFyc2UodiwgImwiLCAmc2VsZi0+b2Jfc3BiLm1pbGxpc2Vjb25kcyk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnZXJyb3InLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgc2VsZi0+b2Jfc3BiLmVycm9yKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgIE5vbmUKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdjb21wbGV0aW9uUm91dGluZScsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgIiIic2VsZi0+b2Jfc3BiLmNvbXBsZXRpb25Sb3V0aW5lID0gTmV3U0lDb21wbGV0aW9uVVBQKFNQQl9jb21wbGV0aW9uKTsKKyAgICAgICAgICAgIHNlbGYtPm9iX2NvbXBsZXRpb24gPSB2OworICAgICAgICAgICAgUHlfSU5DUkVGKHYpOworICAgICAgICAgICAgcmV0dXJuIDA7IiIiLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICldCiAKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCIvKiBNZW1iZXJzIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrczogKi8iKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpvYl9jb21wbGV0aW9uOyIpCi0JCU91dHB1dCgiUHlPYmplY3QgKm9iX2ludGVycnVwdDsiKQotCQlPdXRwdXQoIlB5T2JqZWN0ICpvYl90aGlzY2FsbGJhY2s7Iik7Ci0JCU91dHB1dCgibG9uZyBvYl9BNTsiKQotCQlPdXRwdXQoIlNQQiBvYl9zcGI7IikKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCIvKiBNZW1iZXJzIHVzZWQgdG8gaW1wbGVtZW50IGNhbGxiYWNrczogKi8iKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpvYl9jb21wbGV0aW9uOyIpCisgICAgICAgIE91dHB1dCgiUHlPYmplY3QgKm9iX2ludGVycnVwdDsiKQorICAgICAgICBPdXRwdXQoIlB5T2JqZWN0ICpvYl90aGlzY2FsbGJhY2s7Iik7CisgICAgICAgIE91dHB1dCgibG9uZyBvYl9BNTsiKQorICAgICAgICBPdXRwdXQoIlNQQiBvYl9zcGI7IikKIAotCWRlZiBvdXRwdXROZXcoc2VsZik6Ci0JCU91dHB1dCgpCi0JCU91dHB1dCgiJXNQeU9iamVjdCAqJXNfTmV3KHZvaWQpIiwgc2VsZi5zdGF0aWMsIHNlbGYucHJlZml4KQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIiVzICppdDsiLCBzZWxmLm9iamVjdHR5cGUpCi0JCXNlbGYub3V0cHV0Q2hlY2tOZXdBcmcoKQotCQlPdXRwdXQoIml0ID0gUHlPYmplY3RfTkVXKCVzLCAmJXMpOyIsIHNlbGYub2JqZWN0dHlwZSwgc2VsZi50eXBlbmFtZSkKLQkJT3V0cHV0KCJpZiAoaXQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7IikKLQkJc2VsZi5vdXRwdXRJbml0U3RydWN0TWVtYmVycygpCi0JCU91dHB1dCgicmV0dXJuIChQeU9iamVjdCAqKWl0OyIpCi0JCU91dFJicmFjZSgpCisgICAgZGVmIG91dHB1dE5ldyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCIlc1B5T2JqZWN0IColc19OZXcodm9pZCkiLCBzZWxmLnN0YXRpYywgc2VsZi5wcmVmaXgpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiJXMgKml0OyIsIHNlbGYub2JqZWN0dHlwZSkKKyAgICAgICAgc2VsZi5vdXRwdXRDaGVja05ld0FyZygpCisgICAgICAgIE91dHB1dCgiaXQgPSBQeU9iamVjdF9ORVcoJXMsICYlcyk7Iiwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLnR5cGVuYW1lKQorICAgICAgICBPdXRwdXQoImlmIChpdCA9PSBOVUxMKSByZXR1cm4gTlVMTDsiKQorICAgICAgICBzZWxmLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKCkKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gKFB5T2JqZWN0ICopaXQ7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKIAotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJT3V0cHV0KCJpdC0+b2JfY29tcGxldGlvbiA9IE5VTEw7IikKLQkJT3V0cHV0KCJpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsiKQotCQlPdXRwdXQoIml0LT5vYl90aGlzY2FsbGJhY2sgPSBOVUxMOyIpCi0JCU91dHB1dCgiaXQtPm9iX0E1ID0gU2V0Q3VycmVudEE1KCk7IikKLQkJT3V0cHV0KCJtZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsiKQotCQlPdXRwdXQoIml0LT5vYl9zcGIudXNlckxvbmcgPSAobG9uZylpdDsiKQorICAgIGRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfY29tcGxldGlvbiA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpdC0+b2JfaW50ZXJydXB0ID0gTlVMTDsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl90aGlzY2FsbGJhY2sgPSBOVUxMOyIpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX0E1ID0gU2V0Q3VycmVudEE1KCk7IikKKyAgICAgICAgT3V0cHV0KCJtZW1zZXQoKGNoYXIgKikmaXQtPm9iX3NwYiwgMCwgc2l6ZW9mKGl0LT5vYl9zcGIpKTsiKQorICAgICAgICBPdXRwdXQoIml0LT5vYl9zcGIudXNlckxvbmcgPSAobG9uZylpdDsiKQogCi0JZGVmIG91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlPYmplY3REZWZpbml0aW9uLm91dHB1dENsZWFudXBTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgic2VsZi0+b2Jfc3BiLnVzZXJMb25nID0gMDsiKQotCQlPdXRwdXQoInNlbGYtPm9iX3RoaXNjYWxsYmFjayA9IDA7IikKLQkJT3V0cHV0KCJQeV9YREVDUkVGKHNlbGYtPm9iX2NvbXBsZXRpb24pOyIpCi0JCU91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9pbnRlcnJ1cHQpOyIpCi0JCi0JZGVmIG91dHB1dENvbnZlcnQoc2VsZik6Ci0JCU91dHB1dCgiJXNpbnQgJXNfQ29udmVydChQeU9iamVjdCAqdiwgJXMgKnBfaXRzZWxmKSIsIHNlbGYuc3RhdGljLCBzZWxmLnByZWZpeCwgc2VsZi5pdHNlbGZ0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlzZWxmLm91dHB1dENoZWNrQ29udmVydEFyZygpCi0JCU91dHB1dCgiaWYgKCElc19DaGVjayh2KSkiLCBzZWxmLnByZWZpeCkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCdQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiJXMgcmVxdWlyZWQiKTsnLCBzZWxmLm5hbWUpCi0JCU91dHB1dCgicmV0dXJuIDA7IikKLQkJT3V0UmJyYWNlKCkKLQkJT3V0cHV0KCIqcF9pdHNlbGYgPSAmKCglcyAqKXYpLT5vYl9zcGI7Iiwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRwdXQoInJldHVybiAxOyIpCi0JCU91dFJicmFjZSgpCi0JCQkJCQorICAgIGRlZiBvdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRDbGVhbnVwU3RydWN0TWVtYmVycyhzZWxmKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX3NwYi51c2VyTG9uZyA9IDA7IikKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl90aGlzY2FsbGJhY2sgPSAwOyIpCisgICAgICAgIE91dHB1dCgiUHlfWERFQ1JFRihzZWxmLT5vYl9jb21wbGV0aW9uKTsiKQorICAgICAgICBPdXRwdXQoIlB5X1hERUNSRUYoc2VsZi0+b2JfaW50ZXJydXB0KTsiKQorCisgICAgZGVmIG91dHB1dENvbnZlcnQoc2VsZik6CisgICAgICAgIE91dHB1dCgiJXNpbnQgJXNfQ29udmVydChQeU9iamVjdCAqdiwgJXMgKnBfaXRzZWxmKSIsIHNlbGYuc3RhdGljLCBzZWxmLnByZWZpeCwgc2VsZi5pdHNlbGZ0eXBlKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBzZWxmLm91dHB1dENoZWNrQ29udmVydEFyZygpCisgICAgICAgIE91dHB1dCgiaWYgKCElc19DaGVjayh2KSkiLCBzZWxmLnByZWZpeCkKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCdQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiJXMgcmVxdWlyZWQiKTsnLCBzZWxmLm5hbWUpCisgICAgICAgIE91dHB1dCgicmV0dXJuIDA7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCIqcF9pdHNlbGYgPSAmKCglcyAqKXYpLT5vYl9zcGI7Iiwgc2VsZi5vYmplY3R0eXBlKQorICAgICAgICBPdXRwdXQoInJldHVybiAxOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKIAogc25kb2JqZWN0ID0gU25kT2JqZWN0RGVmaW5pdGlvbignU25kQ2hhbm5lbCcsICdTbmRDaCcsICdTbmRDaGFubmVsUHRyJykKIHNwYm9iamVjdCA9IFNwYk9iamVjdERlZmluaXRpb24oJ1NQQicsICdTUEJPYmonLCAnU1BCUHRyJykKZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3RlL3Rlc2Nhbi5weSBiL01hYy9Nb2R1bGVzL3RlL3Rlc2Nhbi5weQppbmRleCBjODFhOGJmLi5mNWI2ZmZmIDEwMDY0NAotLS0gYS9NYWMvTW9kdWxlcy90ZS90ZXNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvdGUvdGVzY2FuLnB5CkBAIC0xMSw1NyArMTEsNTcgQEAKIE9CSkVDVCA9ICJURUhhbmRsZSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IExPTkcgKyAiLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBUT09MQk9YRElSICsgTE9ORyArICIucHkiCi0Jc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQotCXNjYW5uZXIuc2NhbigpCi0Jc2Nhbm5lci5jbG9zZSgpCi0JcHJpbnQgIj09PSBUZXN0aW5nIGRlZmluaXRpb25zIG91dHB1dCBjb2RlID09PSIKLQlleGVjZmlsZShkZWZzb3V0cHV0LCB7fSwge30pCi0JcHJpbnQgIj09PSBEb25lIHNjYW5uaW5nIGFuZCBnZW5lcmF0aW5nLCBub3cgaW1wb3J0aW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4uLiA9PT0iCi0JZXhlYyAiaW1wb3J0ICIgKyBTSE9SVCArICJzdXBwb3J0IgotCXByaW50ICI9PT0gRG9uZS4gIEl0J3MgdXAgdG8geW91IHRvIGNvbXBpbGUgaXQgbm93ISA9PT0iCisgICAgaW5wdXQgPSBMT05HICsgIi5oIgorICAgIG91dHB1dCA9IFNIT1JUICsgImdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArIExPTkcgKyAiLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKKyAgICBwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgogCiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCisgICAgICAgICAgICAjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKKyAgICAgICAgICAgIGlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiVEVEaXNwb3NlIiwKLQkJCSJURUluaXQiLAotIyMJCQkiVEVHZXRIaWxpdGVSZ24iLAotCQkJXQorICAgIGRlZiBtYWtlYmxhY2tsaXN0bmFtZXMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgIlRFRGlzcG9zZSIsCisgICAgICAgICAgICAgICAgIlRFSW5pdCIsCisjIyAgICAgICAgICAgICAgICAgICAgICAiVEVHZXRIaWxpdGVSZ24iLAorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlYmxhY2tsaXN0dHlwZXMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkiVEVDbGlja0xvb3BVUFAiLAotCQkJIlVuaXZlcnNhbFByb2NQdHIiLAotCQkJIldvcmRCcmVha1VQUCIsCi0JCQkiVEVEb1RleHRVUFAiLAotCQkJIlRFUmVjYWxjVVBQIiwKLQkJCSJURUZpbmRXb3JkVVBQIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJURUNsaWNrTG9vcFVQUCIsCisgICAgICAgICAgICAgICAgIlVuaXZlcnNhbFByb2NQdHIiLAorICAgICAgICAgICAgICAgICJXb3JkQnJlYWtVUFAiLAorICAgICAgICAgICAgICAgICJURURvVGV4dFVQUCIsCisgICAgICAgICAgICAgICAgIlRFUmVjYWxjVVBQIiwKKyAgICAgICAgICAgICAgICAiVEVGaW5kV29yZFVQUCIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6Ci0JCXJldHVybiBbCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkgCi0JCQkjIFRFQ29udGludW91c1N0eWxlCi0JCQkoWygic2hvcnQiLCAibW9kZSIsICJPdXRNb2RlIiksICgiVGV4dFN0eWxlIiwgImFTdHlsZSIsICJPdXRNb2RlIildLAotCQkJIFsoInNob3J0IiwgIm1vZGUiLCAiSW5PdXRNb2RlIiksICgiVGV4dFN0eWxlIiwgImFTdHlsZSIsICJJbk91dE1vZGUiKV0pCi0JCQldCi0JCQkKKyAgICBkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgIyBURUNvbnRpbnVvdXNTdHlsZQorICAgICAgICAgICAgICAgIChbKCJzaG9ydCIsICJtb2RlIiwgIk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiYVN0eWxlIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoInNob3J0IiwgIm1vZGUiLCAiSW5PdXRNb2RlIiksICgiVGV4dFN0eWxlIiwgImFTdHlsZSIsICJJbk91dE1vZGUiKV0pCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvdGUvdGVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvdGUvdGVzdXBwb3J0LnB5CmluZGV4IDEzZjFiOTcuLmFkNmMwNTMgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3RlL3Rlc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy90ZS90ZXN1cHBvcnQucHkKQEAgLTYsMTcgKzYsMTcgQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdUZXh0RWRpdC5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX1RFJwkJCQkjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKLU9CSkVDVE5BTUUgPSAnVEUnCQkJIyBUaGUgYmFzaWMgbmFtZSBvZiB0aGUgb2JqZWN0cyB1c2VkIGhlcmUKLUtJTkQgPSAnSGFuZGxlJwkJCQkjIFVzdWFsbHkgJ1B0cicgb3IgJ0hhbmRsZScKK01BQ0hFQURFUkZJTEUgPSAnVGV4dEVkaXQuaCcgICAgICAgICAgICAjIFRoZSBBcHBsZSBoZWFkZXIgZmlsZQorTU9ETkFNRSA9ICdfVEUnICAgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQorT0JKRUNUTkFNRSA9ICdURScgICAgICAgICAgICAgICAgICAgICAgICMgVGhlIGJhc2ljIG5hbWUgb2YgdGhlIG9iamVjdHMgdXNlZCBoZXJlCitLSU5EID0gJ0hhbmRsZScgICAgICAgICAgICAgICAgICAgICAgICAgIyBVc3VhbGx5ICdQdHInIG9yICdIYW5kbGUnCiAKICMgVGhlIGZvbGxvd2luZyBpcyAqdXN1YWxseSogdW5jaGFuZ2VkIGJ1dCBtYXkgc3RpbGwgcmVxdWlyZSB0dW5pbmcKLU1PRFBSRUZJWCA9ICdURScJCQkjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCi1PQkpFQ1RUWVBFID0gIlRFSGFuZGxlIgkJIyBUaGUgQyB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZW0KLU9CSkVDVFBSRUZJWCA9IE1PRFBSRUZJWCArICdPYmonCSMgVGhlIHByZWZpeCBmb3Igb2JqZWN0IG1ldGhvZHMKK01PRFBSRUZJWCA9ICdURScgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBwcmVmaXggZm9yIG1vZHVsZS13aWRlIHJvdXRpbmVzCitPQkpFQ1RUWVBFID0gIlRFSGFuZGxlIiAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiCSMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQorT1VUUFVURklMRSA9IE1PRE5BTUUgKyAibW9kdWxlLmMiICAgICAgICMgVGhlIGZpbGUgZ2VuZXJhdGVkIGJ5IHRoaXMgcHJvZ3JhbQogCiBmcm9tIG1hY3N1cHBvcnQgaW1wb3J0ICoKIApAQCAtNTIsMTM3ICs1MiwxMzcgQEAKIFRleHRTdHlsZV9OZXcoVGV4dFN0eWxlUHRyIGl0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGxPJiIsIChsb25nKWl0c2VsZi0+dHNGb250LCAobG9uZylpdHNlbGYtPnRzRmFjZSwgKGxvbmcpaXRzZWxmLT50c1NpemUsIFFkUkdCX05ldywKLQkJCQkmaXRzZWxmLT50c0NvbG9yKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50c0NvbG9yKTsKIH0KIAogc3RhdGljIGludAogVGV4dFN0eWxlX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRleHRTdHlsZVB0ciBwX2l0c2VsZikKIHsKLQlsb25nIGZvbnQsIGZhY2UsIHNpemU7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQotCQlyZXR1cm4gMDsKLQlwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7Ci0JcF9pdHNlbGYtPnRzRmFjZSA9IChTdHlsZSlmYWNlOwotCXBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKLQlyZXR1cm4gMTsKKyAgICAgICAgbG9uZyBmb250LCBmYWNlLCBzaXplOworCisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsTyYiLCAmZm9udCwgJmZhY2UsICZzaXplLCBRZFJHQl9Db252ZXJ0LCAmcF9pdHNlbGYtPnRzQ29sb3IpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcF9pdHNlbGYtPnRzRm9udCA9IChzaG9ydClmb250OworICAgICAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7CisgICAgICAgIHBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAiIiIKIAogaW5pdHN0dWZmID0gaW5pdHN0dWZmICsgIiIiCi0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVEVIYW5kbGUsIFRFT2JqX05ldyk7Ci0JUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFRFSGFuZGxlLCBURU9ial9Db252ZXJ0KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9ORVcoVEVIYW5kbGUsIFRFT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfQ09OVkVSVChURUhhbmRsZSwgVEVPYmpfQ29udmVydCk7CiAiIiIKIAogY2xhc3MgVEVNZXRob2RHZW5lcmF0b3IoT1NFcnJXZWFrTGlua01ldGhvZEdlbmVyYXRvcik6Ci0JIiIiU2ltaWxhciB0byBNZXRob2RHZW5lcmF0b3IsIGJ1dCBoYXMgc2VsZiBhcyBsYXN0IGFyZ3VtZW50IiIiCisgICAgIiIiU2ltaWxhciB0byBNZXRob2RHZW5lcmF0b3IsIGJ1dCBoYXMgc2VsZiBhcyBsYXN0IGFyZ3VtZW50IiIiCiAKLQlkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6Ci0JCWFyZ3MsIGEwID0gYXJnc1s6LTFdLCBhcmdzWy0xXQotCQl0MCwgbjAsIG0wID0gYTAKLQkJaWYgbTAgIT0gSW5Nb2RlOgotCQkJcmFpc2UgVmFsdWVFcnJvciwgIm1ldGhvZCdzICdzZWxmJyBtdXN0IGJlICdJbk1vZGUnIgotCQlzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQwLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQotCQlGdW5jdGlvbkdlbmVyYXRvci5wYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKQotCQlzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCisgICAgZGVmIHBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpOgorICAgICAgICBhcmdzLCBhMCA9IGFyZ3NbOi0xXSwgYXJnc1stMV0KKyAgICAgICAgdDAsIG4wLCBtMCA9IGEwCisgICAgICAgIGlmIG0wICE9IEluTW9kZToKKyAgICAgICAgICAgIHJhaXNlIFZhbHVlRXJyb3IsICJtZXRob2QncyAnc2VsZicgbXVzdCBiZSAnSW5Nb2RlJyIKKyAgICAgICAgc2VsZi5pdHNlbGYgPSBWYXJpYWJsZSh0MCwgIl9zZWxmLT5vYl9pdHNlbGYiLCBTZWxmTW9kZSkKKyAgICAgICAgRnVuY3Rpb25HZW5lcmF0b3IucGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncykKKyAgICAgICAgc2VsZi5hcmd1bWVudExpc3QuYXBwZW5kKHNlbGYuaXRzZWxmKQogCiAKIAogY2xhc3MgTXlPYmplY3REZWZpbml0aW9uKFBFUDI1M01peGluLCBHbG9iYWxPYmplY3REZWZpbml0aW9uKToKLQkjIFhYWFggQ291bGQgYmUgc3VidHlwZSBvZiBSZXNvdXJjZQotCSMgQXR0cmlidXRlcyB0aGF0IGNhbiBiZSBzZXQuCi0JZ2V0c2V0bGlzdCA9IFsKLQkJKAotCQknZGVzdFJlY3QnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5kZXN0UmVjdCk7JywKLQkJTm9uZSwKLQkJJ0Rlc3RpbmF0aW9uIHJlY3RhbmdsZScKLQkJKSwgKAotCQkndmlld1JlY3QnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7JywKLQkJTm9uZSwKLQkJJ1ZpZXdpbmcgcmVjdGFuZ2xlJwotCQkpLCAoCi0JCSdzZWxSZWN0JywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+c2VsUmVjdCk7JywKLQkJTm9uZSwKLQkJJ1NlbGVjdGlvbiByZWN0YW5nbGUnCi0JCSksICgKLQkJJ2xpbmVIZWlnaHQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPmxpbmVIZWlnaHQpOycsCi0JCU5vbmUsCi0JCSdIZWlnaHQgb2YgYSBsaW5lJwotCQkpLCAoCi0JCSdmb250QXNjZW50JywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5mb250QXNjZW50KTsnLAotCQlOb25lLAotCQknQXNjZW50IG9mIGEgbGluZScKLQkJKSwgKAotCQkic2VsUG9pbnQiLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRQb2ludCwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxQb2ludCk7JywKLQkJTm9uZSwKLQkJJ1NlbGVjdGlvbiBQb2ludCcKLQkJKSwgKAotCQknc2VsU3RhcnQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFN0YXJ0KTsnLAotCQlOb25lLAotCQknU3RhcnQgb2Ygc2VsZWN0aW9uJwotCQkpLCAoCi0JCSdzZWxFbmQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEVuZCk7JywKLQkJTm9uZSwKLQkJJ0VuZCBvZiBzZWxlY3Rpb24nCi0JCSksICgKLQkJJ2FjdGl2ZScsCi0JCSdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+YWN0aXZlKTsnLAotCQlOb25lLAotCQknVEJEJwotCQkpLCAoCi0JCSdqdXN0JywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5qdXN0KTsnLAotCQlOb25lLAotCQknSnVzdGlmaWNhdGlvbicKLQkJKSwgKAotCQkndGVMZW5ndGgnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnRlTGVuZ3RoKTsnLAotCQlOb25lLAotCQknVEJEJwotCQkpLCAoCi0JCSd0eEZvbnQnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4Rm9udCk7JywKLQkJTm9uZSwKLQkJJ0N1cnJlbnQgZm9udCcKLQkJKSwgKAotCQkndHhGYWNlJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eEZhY2UpOycsCi0JCU5vbmUsCi0JCSdDdXJyZW50IGZvbnQgdmFyaWFudCcKLQkJKSwgKAotCQkndHhNb2RlJywKLQkJJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOycsCi0JCU5vbmUsCi0JCSdDdXJyZW50IHRleHQtZHJhd2luZyBtb2RlJwotCQkpLCAoCi0JCSd0eFNpemUnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnR4U2l6ZSk7JywKLQkJTm9uZSwKLQkJJ0N1cnJlbnQgZm9udCBzaXplJwotCQkpLCAoCi0JCSduTGluZXMnLAotCQkncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPm5MaW5lcyk7JywKLQkJTm9uZSwKLQkJJ1RCRCcKLQkJKV0JCQotCQkKLQlkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6Ci0JCU91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKLQkJCQkJUHlFcnJfU2V0U3RyaW5nKFRFX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgVEUiKTsKLQkJCQkJcmV0dXJuIE5VTEw7Ci0JCQkJfSIiIikKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoIlRFRGlzcG9zZSglcyk7IiwgaXRzZWxmbmFtZSkKLQkJCisgICAgIyBYWFhYIENvdWxkIGJlIHN1YnR5cGUgb2YgUmVzb3VyY2UKKyAgICAjIEF0dHJpYnV0ZXMgdGhhdCBjYW4gYmUgc2V0LgorICAgIGdldHNldGxpc3QgPSBbCisgICAgICAgICAgICAoCisgICAgICAgICAgICAnZGVzdFJlY3QnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJPJiIsIFB5TWFjX0J1aWxkUmVjdCwgJigqc2VsZi0+b2JfaXRzZWxmKS0+ZGVzdFJlY3QpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0Rlc3RpbmF0aW9uIHJlY3RhbmdsZScKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd2aWV3UmVjdCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT52aWV3UmVjdCk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnVmlld2luZyByZWN0YW5nbGUnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnc2VsUmVjdCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoIk8mIiwgUHlNYWNfQnVpbGRSZWN0LCAmKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxSZWN0KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdTZWxlY3Rpb24gcmVjdGFuZ2xlJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2xpbmVIZWlnaHQnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5saW5lSGVpZ2h0KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdIZWlnaHQgb2YgYSBsaW5lJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ2ZvbnRBc2NlbnQnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5mb250QXNjZW50KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdBc2NlbnQgb2YgYSBsaW5lJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgInNlbFBvaW50IiwKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiTyYiLCBQeU1hY19CdWlsZFBvaW50LCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbFBvaW50KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdTZWxlY3Rpb24gUG9pbnQnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAnc2VsU3RhcnQnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5zZWxTdGFydCk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnU3RhcnQgb2Ygc2VsZWN0aW9uJworICAgICAgICAgICAgKSwgKAorICAgICAgICAgICAgJ3NlbEVuZCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnNlbEVuZCk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnRW5kIG9mIHNlbGVjdGlvbicKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdhY3RpdmUnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5hY3RpdmUpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1RCRCcKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICdqdXN0JywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+anVzdCk7JywKKyAgICAgICAgICAgIE5vbmUsCisgICAgICAgICAgICAnSnVzdGlmaWNhdGlvbicKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd0ZUxlbmd0aCcsCisgICAgICAgICAgICAncmV0dXJuIFB5X0J1aWxkVmFsdWUoImgiLCAoKnNlbGYtPm9iX2l0c2VsZiktPnRlTGVuZ3RoKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdUQkQnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAndHhGb250JywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGb250KTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdDdXJyZW50IGZvbnQnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAndHhGYWNlJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhGYWNlKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdDdXJyZW50IGZvbnQgdmFyaWFudCcKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICd0eE1vZGUnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT50eE1vZGUpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ0N1cnJlbnQgdGV4dC1kcmF3aW5nIG1vZGUnCisgICAgICAgICAgICApLCAoCisgICAgICAgICAgICAndHhTaXplJywKKyAgICAgICAgICAgICdyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiaCIsICgqc2VsZi0+b2JfaXRzZWxmKS0+dHhTaXplKTsnLAorICAgICAgICAgICAgTm9uZSwKKyAgICAgICAgICAgICdDdXJyZW50IGZvbnQgc2l6ZScKKyAgICAgICAgICAgICksICgKKyAgICAgICAgICAgICduTGluZXMnLAorICAgICAgICAgICAgJ3JldHVybiBQeV9CdWlsZFZhbHVlKCJoIiwgKCpzZWxmLT5vYl9pdHNlbGYpLT5uTGluZXMpOycsCisgICAgICAgICAgICBOb25lLAorICAgICAgICAgICAgJ1RCRCcKKyAgICAgICAgICAgICldCisKKyAgICBkZWYgb3V0cHV0Q2hlY2tOZXdBcmcoc2VsZik6CisgICAgICAgIE91dHB1dCgiIiJpZiAoaXRzZWxmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFRFX0Vycm9yLCJDYW5ub3QgY3JlYXRlIG51bGwgVEUiKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQorICAgIGRlZiBvdXRwdXRGcmVlSXQoc2VsZiwgaXRzZWxmbmFtZSk6CisgICAgICAgIE91dHB1dCgiVEVEaXNwb3NlKCVzKTsiLCBpdHNlbGZuYW1lKQorCiAKICMgRnJvbSBoZXJlIG9uIGl0J3MgYmFzaWNhbGx5IGFsbCBib2lsZXIgcGxhdGUuLi4KIApAQCAtMjE0LDQgKzIxNCwzIEBACiAjIGdlbmVyYXRlIG91dHB1dCAob3BlbiB0aGUgb3V0cHV0IGZpbGUgYXMgbGF0ZSBhcyBwb3NzaWJsZSkKIFNldE91dHB1dEZpbGVOYW1lKE9VVFBVVEZJTEUpCiBtb2R1bGUuZ2VuZXJhdGUoKQotCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXNjYW4ucHkgYi9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXNjYW4ucHkKaW5kZXggODI5OGYyNi4uYjVhMmI0MyAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvd2FzdGUvd2FzdGVzY2FuLnB5CisrKyBiL01hYy9Nb2R1bGVzL3dhc3RlL3dhc3Rlc2Nhbi5weQpAQCAtNyw5ICs3LDkgQEAKIGZyb20gc2NhbnRvb2xzIGltcG9ydCBTY2FubmVyCiAKIFdBU1RFRElSPScvVXNlcnMvamFjay9zcmMvd2FzdGUvQ19DKysgSGVhZGVycy8nCi0JCQorCiBpZiBub3Qgb3MucGF0aC5leGlzdHMoV0FTVEVESVIpOgotCXJhaXNlICdFcnJvcjogbm90IGZvdW5kOiAlcycsIFdBU1RFRElSCisgICAgcmFpc2UgJ0Vycm9yOiBub3QgZm91bmQ6ICVzJywgV0FTVEVESVIKIAogT0JKRUNUID0gIlRFSGFuZGxlIgogU0hPUlQgPSAid2FzdGUiCkBAIC0xNywxMzYgKzE3LDEzNiBAQAogT0JKRUNUMiA9ICJXRU9iamVjdFJlZmVyZW5jZSIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9IFdBU1RFRElSICsgIldBU1RFLmgiCi0Jb3V0cHV0ID0gU0hPUlQgKyAiZ2VuLnB5IgotCWRlZnNvdXRwdXQgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5zcGxpdChUT09MQk9YRElSKVswXSwgIldBU1RFY29uc3QucHkiKQotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotIyMJc2Nhbm5lci5nZW50eXBldGVzdChTSE9SVCsidHlwZXRlc3QucHkiKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWV4ZWMgImltcG9ydCAiICsgU0hPUlQgKyAic3VwcG9ydCIKLQlwcmludCAiPT09IERvbmUuICBJdCdzIHVwIHRvIHlvdSB0byBjb21waWxlIGl0IG5vdyEgPT09IgorICAgIGlucHV0ID0gV0FTVEVESVIgKyAiV0FTVEUuaCIKKyAgICBvdXRwdXQgPSBTSE9SVCArICJnZW4ucHkiCisgICAgZGVmc291dHB1dCA9IG9zLnBhdGguam9pbihvcy5wYXRoLnNwbGl0KFRPT0xCT1hESVIpWzBdLCAiV0FTVEVjb25zdC5weSIpCisgICAgc2Nhbm5lciA9IE15U2Nhbm5lcihpbnB1dCwgb3V0cHV0LCBkZWZzb3V0cHV0KQorICAgIHNjYW5uZXIuc2NhbigpCisjIyAgICAgIHNjYW5uZXIuZ2VudHlwZXRlc3QoU0hPUlQrInR5cGV0ZXN0LnB5IikKKyAgICBzY2FubmVyLmNsb3NlKCkKKyAgICBwcmludCAiPT09IFRlc3RpbmcgZGVmaW5pdGlvbnMgb3V0cHV0IGNvZGUgPT09IgorICAgIGV4ZWNmaWxlKGRlZnNvdXRwdXQsIHt9LCB7fSkKKyAgICBwcmludCAiPT09IERvbmUgc2Nhbm5pbmcgYW5kIGdlbmVyYXRpbmcsIG5vdyBpbXBvcnRpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLi4uID09PSIKKyAgICBleGVjICJpbXBvcnQgIiArIFNIT1JUICsgInN1cHBvcnQiCisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogI2NsYXNzIE15U2Nhbm5lcihTY2FubmVyX1ByZVVIMyk6CiBjbGFzcyBNeVNjYW5uZXIoU2Nhbm5lcik6CiAKLQlkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6Ci0JCWNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKLQkJbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgotCQlpZiBhcmdsaXN0OgotCQkJdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCi0JCQkjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKLQkJCWlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgotCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QiCi0JCQkJbGlzdG5hbWUgPSAibWV0aG9kcyIKLQkJCWVsc2U6Ci0JCQkJdCwgbiwgbSA9IGFyZ2xpc3RbMF0KLQkJCQlpZiB0ID09IE9CSkVDVDIgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJCWNsYXNzbmFtZSA9ICJNZXRob2QyIgotCQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzMiIKLQkJcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKKyAgICBkZWYgZGVzdGluYXRpb24oc2VsZiwgdHlwZSwgbmFtZSwgYXJnbGlzdCk6CisgICAgICAgIGNsYXNzbmFtZSA9ICJGdW5jdGlvbiIKKyAgICAgICAgbGlzdG5hbWUgPSAiZnVuY3Rpb25zIgorICAgICAgICBpZiBhcmdsaXN0OgorICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbLTFdCisgICAgICAgICAgICAjIFRoaXMgaXMgbm9uLWZ1bmN0aW9uYWwgdG9kYXkKKyAgICAgICAgICAgIGlmIHQgPT0gT0JKRUNUIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgdCwgbiwgbSA9IGFyZ2xpc3RbMF0KKyAgICAgICAgICAgICAgICBpZiB0ID09IE9CSkVDVDIgYW5kIG0gPT0gIkluTW9kZSI6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QyIgorICAgICAgICAgICAgICAgICAgICBsaXN0bmFtZSA9ICJtZXRob2RzMiIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrUGFzY2FsU3RhY2tCYXNlZCA9IE5vbmUgIyB3b3JrYXJvdW5kIGZvciBoZWFkZXIgcGFyc2luZ1xuIikKLQkJc2VsZi5kZWZzZmlsZS53cml0ZSgiZGVmIEZPVVJfQ0hBUl9DT0RFKHgpOiByZXR1cm4geFxuIikKKyAgICBkZWYgd3JpdGVpbml0aWFsZGVmcyhzZWxmKToKKyAgICAgICAgc2VsZi5kZWZzZmlsZS53cml0ZSgia1Bhc2NhbFN0YWNrQmFzZWQgPSBOb25lICMgd29ya2Fyb3VuZCBmb3IgaGVhZGVyIHBhcnNpbmdcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoImRlZiBGT1VSX0NIQVJfQ09ERSh4KTogcmV0dXJuIHhcbiIpCiAKLQlkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJIldFRGlzcG9zZSIsCi0JCQkiV0VTZXRJbmZvIiwgIyBBcmd1bWVudCB0eXBlIHVua25vd24uLi4KLQkJCSJXRUdldEluZm8iLAotCQkJIldFVmVyc2lvbiIsICMgVW5mb3J0dW5hdGVseS4uLgotCQkJIldFUHV0IiwgIyBYWFhYIFRCRDogbmVlZHMgYXJyYXkgb2YgZmxhdm9ydHlwZXMuCi0JCQkiV0VHZXRPbmVBdHRyaWJ1dGUiLCAjIFhYWFggVEJEOiBvdXRwdXQgYnVmZmVyCi0JCQkjIEluY29tcGF0aWJsZSBjb25zdGFudCBkZWZpbml0aW9ucwotCQkJIndlRG9BdXRvU2Nyb2xsIiwKLQkJCSJ3ZURvT3V0bGluZUhpbGl0ZSIsCi0JCQkid2VEb1JlYWRPbmx5IiwKLQkJCSJ3ZURvVW5kbyIsCi0JCQkid2VEb0ludEN1dEFuZFBhc3RlIiwKLQkJCSJ3ZURvRHJhZ0FuZERyb3AiLAotCQkJIndlRG9JbmhpYml0UmVjYWwiLAotCQkJIndlRG9Vc2VUZW1wTWVtIiwKLQkJCSJ3ZURvRHJhd09mZnNjcmVlbiIsCi0JCQkid2VEb0luaGliaXRSZWRyYXciLAotCQkJIndlRG9Nb25vU3R5bGVkIiwKLQkJCSJ3ZURvTXVsdGlwbGVVbmRvIiwKLQkJCSJ3ZURvTm9LZXlib2FyZFN5bmMiLAotCQkJIndlRG9JbmhpYml0SUNTdXBwb3J0IiwKLQkJCSJ3ZURvSW5oaWJpdENvbG9yIiwKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdG5hbWVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJXRURpc3Bvc2UiLAorICAgICAgICAgICAgICAgICJXRVNldEluZm8iLCAjIEFyZ3VtZW50IHR5cGUgdW5rbm93bi4uLgorICAgICAgICAgICAgICAgICJXRUdldEluZm8iLAorICAgICAgICAgICAgICAgICJXRVZlcnNpb24iLCAjIFVuZm9ydHVuYXRlbHkuLi4KKyAgICAgICAgICAgICAgICAiV0VQdXQiLCAjIFhYWFggVEJEOiBuZWVkcyBhcnJheSBvZiBmbGF2b3J0eXBlcy4KKyAgICAgICAgICAgICAgICAiV0VHZXRPbmVBdHRyaWJ1dGUiLCAjIFhYWFggVEJEOiBvdXRwdXQgYnVmZmVyCisgICAgICAgICAgICAgICAgIyBJbmNvbXBhdGlibGUgY29uc3RhbnQgZGVmaW5pdGlvbnMKKyAgICAgICAgICAgICAgICAid2VEb0F1dG9TY3JvbGwiLAorICAgICAgICAgICAgICAgICJ3ZURvT3V0bGluZUhpbGl0ZSIsCisgICAgICAgICAgICAgICAgIndlRG9SZWFkT25seSIsCisgICAgICAgICAgICAgICAgIndlRG9VbmRvIiwKKyAgICAgICAgICAgICAgICAid2VEb0ludEN1dEFuZFBhc3RlIiwKKyAgICAgICAgICAgICAgICAid2VEb0RyYWdBbmREcm9wIiwKKyAgICAgICAgICAgICAgICAid2VEb0luaGliaXRSZWNhbCIsCisgICAgICAgICAgICAgICAgIndlRG9Vc2VUZW1wTWVtIiwKKyAgICAgICAgICAgICAgICAid2VEb0RyYXdPZmZzY3JlZW4iLAorICAgICAgICAgICAgICAgICJ3ZURvSW5oaWJpdFJlZHJhdyIsCisgICAgICAgICAgICAgICAgIndlRG9Nb25vU3R5bGVkIiwKKyAgICAgICAgICAgICAgICAid2VEb011bHRpcGxlVW5kbyIsCisgICAgICAgICAgICAgICAgIndlRG9Ob0tleWJvYXJkU3luYyIsCisgICAgICAgICAgICAgICAgIndlRG9JbmhpYml0SUNTdXBwb3J0IiwKKyAgICAgICAgICAgICAgICAid2VEb0luaGliaXRDb2xvciIsCisgICAgICAgICAgICAgICAgXQogCi0JZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSJEcmFnUmVmZXJlbmNlIiwJIyBGb3Igbm93Li4uCi0JCQkiVW5pdmVyc2FsUHJvY1B0ciIsCi0JCQkiV0VGb250SURUb05hbWVVUFAiLAotCQkJIldFRm9udE5hbWVUb0lEVVBQIiwKLQkJCSJXRUNsaWNrTG9vcFVQUCIsCi0JCQkiV0VTY3JvbGxVUFAiLAotCQkJIldFVFNNUHJlVXBkYXRlVVBQIiwKLQkJCSJXRVRTTVBvc3RVcGRhdGVVUFAiLAotCQkJIldFUHJlVHJhY2tEcmFnVVBQIiwKLQkJCSJXRVRyYW5zbGF0ZURyYWdVUFAiLAotCQkJIldFSGlsaXRlRHJvcEFyZWFVUFAiLAotCQkJIldFRHJhd1RleHRVUFAiLAotCQkJIldFRHJhd1RTTUhpbGl0ZVVQUCIsCi0JCQkiV0VQaXhlbFRvQ2hhclVQUCIsCi0JCQkiV0VDaGFyVG9QaXhlbFVQUCIsCi0JCQkiV0VMaW5lQnJlYWtVUFAiLAotCQkJIldFV29yZEJyZWFrVVBQIiwKLQkJCSJXRUNoYXJCeXRlVVBQIiwKLQkJCSJXRUNoYXJUeXBlVVBQIiwKLQkJCSJXRUVyYXNlVVBQIiwKLQkJCSJXRUZsdXhVUFAiLAotCQkJIldFTmV3T2JqZWN0VVBQIiwKLQkJCSJXRURpc3Bvc2VPYmplY3RVUFAiLAotCQkJIldFRHJhd09iamVjdFVQUCIsCi0JCQkiV0VDbGlja09iamVjdFVQUCIsCi0JCQkiV0VTdHJlYW1PYmplY3RVUFAiLAotCQkJIldFSG92ZXJPYmplY3RVUFAiLAotCQkJIldFUnVsZXIiLAkJIyBYWFhYIFRvIGJlIGRvbmUKLQkJCSJXRVJ1bGVyX3B0ciIsCSMgZGl0dG8KLQkJCSJXRVBhcmFJbmZvIiwJIyBYWFhYIFRvIGJlIGRvbmUKLQkJCSJXRVByaW50U2Vzc2lvbiIsCSMgWFhYWCBUbyBiZSBkb25lCi0JCQkiV0VQcmludE9wdGlvbnNfcHRyIiwgIyBYWFhYIFRvIGJlIGRvbmUKLQkJCV0KKyAgICBkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgorICAgICAgICByZXR1cm4gWworICAgICAgICAgICAgICAgICJEcmFnUmVmZXJlbmNlIiwgICAgICAgICMgRm9yIG5vdy4uLgorICAgICAgICAgICAgICAgICJVbml2ZXJzYWxQcm9jUHRyIiwKKyAgICAgICAgICAgICAgICAiV0VGb250SURUb05hbWVVUFAiLAorICAgICAgICAgICAgICAgICJXRUZvbnROYW1lVG9JRFVQUCIsCisgICAgICAgICAgICAgICAgIldFQ2xpY2tMb29wVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VTY3JvbGxVUFAiLAorICAgICAgICAgICAgICAgICJXRVRTTVByZVVwZGF0ZVVQUCIsCisgICAgICAgICAgICAgICAgIldFVFNNUG9zdFVwZGF0ZVVQUCIsCisgICAgICAgICAgICAgICAgIldFUHJlVHJhY2tEcmFnVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VUcmFuc2xhdGVEcmFnVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VIaWxpdGVEcm9wQXJlYVVQUCIsCisgICAgICAgICAgICAgICAgIldFRHJhd1RleHRVUFAiLAorICAgICAgICAgICAgICAgICJXRURyYXdUU01IaWxpdGVVUFAiLAorICAgICAgICAgICAgICAgICJXRVBpeGVsVG9DaGFyVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VDaGFyVG9QaXhlbFVQUCIsCisgICAgICAgICAgICAgICAgIldFTGluZUJyZWFrVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VXb3JkQnJlYWtVUFAiLAorICAgICAgICAgICAgICAgICJXRUNoYXJCeXRlVVBQIiwKKyAgICAgICAgICAgICAgICAiV0VDaGFyVHlwZVVQUCIsCisgICAgICAgICAgICAgICAgIldFRXJhc2VVUFAiLAorICAgICAgICAgICAgICAgICJXRUZsdXhVUFAiLAorICAgICAgICAgICAgICAgICJXRU5ld09iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFRGlzcG9zZU9iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFRHJhd09iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFQ2xpY2tPYmplY3RVUFAiLAorICAgICAgICAgICAgICAgICJXRVN0cmVhbU9iamVjdFVQUCIsCisgICAgICAgICAgICAgICAgIldFSG92ZXJPYmplY3RVUFAiLAorICAgICAgICAgICAgICAgICJXRVJ1bGVyIiwgICAgICAgICAgICAgICMgWFhYWCBUbyBiZSBkb25lCisgICAgICAgICAgICAgICAgIldFUnVsZXJfcHRyIiwgICMgZGl0dG8KKyAgICAgICAgICAgICAgICAiV0VQYXJhSW5mbyIsICAgIyBYWFhYIFRvIGJlIGRvbmUKKyAgICAgICAgICAgICAgICAiV0VQcmludFNlc3Npb24iLCAgICAgICAjIFhYWFggVG8gYmUgZG9uZQorICAgICAgICAgICAgICAgICJXRVByaW50T3B0aW9uc19wdHIiLCAjIFhYWFggVG8gYmUgZG9uZQorICAgICAgICAgICAgICAgIF0KIAotCWRlZiBtYWtlcmVwYWlyaW5zdHJ1Y3Rpb25zKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiU0ludDMyIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisgICAgICAgICAgICAgICAgKFsoInZvaWRfcHRyIiwgIioiLCAiSW5Nb2RlIiksICgiU0ludDMyIiwgIioiLCAiSW5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJJbkJ1ZmZlciIsICIqIiwgIioiKV0pLAogCi0JCQkjIFdFQ29udGludW91c1N0eWxlCi0JCQkoWygiV0VTdHlsZU1vZGUiLCAiaW9Nb2RlIiwgIk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAib3V0VGV4dFN0eWxlIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiV0VTdHlsZU1vZGUiLCAiKiIsICJJbk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAiKiIsICIqIildKSwKLQkJCSAKLQkJCSMgV0VDb3B5UmFuZ2UKLQkJCShbKCdIYW5kbGUnLCAnb3V0VGV4dCcsICdJbk1vZGUnKSwgKCdTdFNjcnBIYW5kbGUnLCAnb3V0U3R5bGVzJywgJ0luTW9kZScpLAotICAgIAkJCSgnV0VTb3VwSGFuZGxlJywgJ291dFNvdXAnLCAnSW5Nb2RlJyldLAotICAgIAkJIFsoJ09wdEhhbmRsZScsICcqJywgJyonKSwgKCdPcHRTdFNjcnBIYW5kbGUnLCAnKicsICcqJyksCi0gICAgCQkJKCdPcHRTb3VwSGFuZGxlJywgJyonLCAnKicpXSksCi0JCQkgCi0JCQkjIFdFSW5zZXJ0Ci0JCQkoWygnU3RTY3JwSGFuZGxlJywgJ2luU3R5bGVzJywgJ0luTW9kZScpLCAoJ1dFU291cEhhbmRsZScsICdpblNvdXAnLCAnSW5Nb2RlJyldLAotICAgIAkJIFsoJ09wdFN0U2NycEhhbmRsZScsICcqJywgJyonKSwgKCdPcHRTb3VwSGFuZGxlJywgJyonLCAnKicpXSksCi0gICAgCQkgCi0gICAgCQkjIFdFR2V0T2JqZWN0T3duZXIKLSAgICAJCSgiV0VHZXRPYmplY3RPd25lciIsCi0gICAgCQkgWygnV0VSZWZlcmVuY2UnLCAnKicsICdSZXR1cm5Nb2RlJyldLAotICAgIAkJIFsoJ0V4aXN0aW5nV0VSZWZlcmVuY2UnLCAnKicsICdSZXR1cm5Nb2RlJyldKSwKLSAgICAJCSAKLSAgICAJCSMgV0VGaW5kUGFyYWdyYXBoCi0gICAgCQkoWygiY2hhcl9wdHIiLCAiaW5LZXkiLCAiSW5Nb2RlIildLAotICAgIAkJIFsoInN0cmluZ3B0ciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkjIFdFU2V0T25lQXR0cmlidXRlCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJCeXRlQ291bnQiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiSW5CdWZmZXIiLCAiKiIsICIqIildKSwKLQkJCV0KLQkJCQorICAgICAgICAgICAgICAgICMgV0VDb250aW51b3VzU3R5bGUKKyAgICAgICAgICAgICAgICAoWygiV0VTdHlsZU1vZGUiLCAiaW9Nb2RlIiwgIk91dE1vZGUiKSwgKCJUZXh0U3R5bGUiLCAib3V0VGV4dFN0eWxlIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIldFU3R5bGVNb2RlIiwgIioiLCAiSW5PdXRNb2RlIiksICgiVGV4dFN0eWxlIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAjIFdFQ29weVJhbmdlCisgICAgICAgICAgICAgICAgKFsoJ0hhbmRsZScsICdvdXRUZXh0JywgJ0luTW9kZScpLCAoJ1N0U2NycEhhbmRsZScsICdvdXRTdHlsZXMnLCAnSW5Nb2RlJyksCisgICAgICAgICAgICAgICAgKCdXRVNvdXBIYW5kbGUnLCAnb3V0U291cCcsICdJbk1vZGUnKV0sCisgICAgICAgICBbKCdPcHRIYW5kbGUnLCAnKicsICcqJyksICgnT3B0U3RTY3JwSGFuZGxlJywgJyonLCAnKicpLAorICAgICAgICAgICAgICAgICgnT3B0U291cEhhbmRsZScsICcqJywgJyonKV0pLAorCisgICAgICAgICAgICAgICAgIyBXRUluc2VydAorICAgICAgICAgICAgICAgIChbKCdTdFNjcnBIYW5kbGUnLCAnaW5TdHlsZXMnLCAnSW5Nb2RlJyksICgnV0VTb3VwSGFuZGxlJywgJ2luU291cCcsICdJbk1vZGUnKV0sCisgICAgICAgICBbKCdPcHRTdFNjcnBIYW5kbGUnLCAnKicsICcqJyksICgnT3B0U291cEhhbmRsZScsICcqJywgJyonKV0pLAorCisgICAgICAgICMgV0VHZXRPYmplY3RPd25lcgorICAgICAgICAoIldFR2V0T2JqZWN0T3duZXIiLAorICAgICAgICAgWygnV0VSZWZlcmVuY2UnLCAnKicsICdSZXR1cm5Nb2RlJyldLAorICAgICAgICAgWygnRXhpc3RpbmdXRVJlZmVyZW5jZScsICcqJywgJ1JldHVybk1vZGUnKV0pLAorCisgICAgICAgICMgV0VGaW5kUGFyYWdyYXBoCisgICAgICAgIChbKCJjaGFyX3B0ciIsICJpbktleSIsICJJbk1vZGUiKV0sCisgICAgICAgICBbKCJzdHJpbmdwdHIiLCAiKiIsICIqIildKSwKKworICAgICAgICAgICAgICAgICMgV0VTZXRPbmVBdHRyaWJ1dGUKKyAgICAgICAgICAgICAgICAoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJCeXRlQ291bnQiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgXQorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL01vZHVsZXMvd2FzdGUvd2FzdGVzdXBwb3J0LnB5IGIvTWFjL01vZHVsZXMvd2FzdGUvd2FzdGVzdXBwb3J0LnB5CmluZGV4IGM2NjlmYTEuLjEzZGRjNDAgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3dhc3RlL3dhc3Rlc3VwcG9ydC5weQorKysgYi9NYWMvTW9kdWxlcy93YXN0ZS93YXN0ZXN1cHBvcnQucHkKQEAgLTYsMTggKzYsMTggQEAKIGltcG9ydCBzdHJpbmcKIAogIyBEZWNsYXJhdGlvbnMgdGhhdCBjaGFuZ2UgZm9yIGVhY2ggbWFuYWdlcgotTUFDSEVBREVSRklMRSA9ICdXQVNURS5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnd2FzdGUnCQkJCSMgVGhlIG5hbWUgb2YgdGhlIG1vZHVsZQotT0JKRUNUTkFNRSA9ICd3YXN0ZScJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQotS0lORCA9ICdQdHInCQkJCSMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJworTUFDSEVBREVSRklMRSA9ICdXQVNURS5oJyAgICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ3dhc3RlJyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnd2FzdGUnICAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorS0lORCA9ICdQdHInICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgVXN1YWxseSAnUHRyJyBvciAnSGFuZGxlJwogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSBNT0ROQU1FCQkJIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcwotT0JKRUNUVFlQRSA9ICJXRVJlZmVyZW5jZSIJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSBNT0ROQU1FICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9ICJXRVJlZmVyZW5jZSIgICAgICAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gJ3dhc3RlZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotVFlQRVRFU1RGSUxFID0gJ3dhc3RldHlwZXRlc3QucHknCSMgQW5vdGhlciBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgotT1VUUFVURklMRSA9ICJ3YXN0ZW1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK1RZUEVURVNURklMRSA9ICd3YXN0ZXR5cGV0ZXN0LnB5JyAgICAgICAjIEFub3RoZXIgZmlsZSBnZW5lcmF0ZWQgYnkgdGhlIHNjYW5uZXIKK09VVFBVVEZJTEUgPSAid2FzdGVtb2R1bGUuYyIgICAgIyBUaGUgZmlsZSBnZW5lcmF0ZWQgYnkgdGhpcyBwcm9ncmFtCiAKIGZyb20gbWFjc3VwcG9ydCBpbXBvcnQgKgogCkBAIC04MywyMSArODMsMjEgQEAKIFRleHRTdHlsZV9OZXcoVGV4dFN0eWxlUHRyIGl0c2VsZikKIHsKIAotCXJldHVybiBQeV9CdWlsZFZhbHVlKCJsbGxPJiIsIChsb25nKWl0c2VsZi0+dHNGb250LCAobG9uZylpdHNlbGYtPnRzRmFjZSwgKGxvbmcpaXRzZWxmLT50c1NpemUsIFFkUkdCX05ldywKLQkJCQkmaXRzZWxmLT50c0NvbG9yKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoImxsbE8mIiwgKGxvbmcpaXRzZWxmLT50c0ZvbnQsIChsb25nKWl0c2VsZi0+dHNGYWNlLCAobG9uZylpdHNlbGYtPnRzU2l6ZSwgUWRSR0JfTmV3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXRzZWxmLT50c0NvbG9yKTsKIH0KIAogc3RhdGljIGludAogVGV4dFN0eWxlX0NvbnZlcnQoUHlPYmplY3QgKnYsIFRleHRTdHlsZVB0ciBwX2l0c2VsZikKIHsKLQlsb25nIGZvbnQsIGZhY2UsIHNpemU7Ci0JCi0JaWYoICFQeUFyZ19QYXJzZVR1cGxlKHYsICJsbGxPJiIsICZmb250LCAmZmFjZSwgJnNpemUsIFFkUkdCX0NvbnZlcnQsICZwX2l0c2VsZi0+dHNDb2xvcikgKQotCQlyZXR1cm4gMDsKLQlwX2l0c2VsZi0+dHNGb250ID0gKHNob3J0KWZvbnQ7Ci0JcF9pdHNlbGYtPnRzRmFjZSA9IChTdHlsZSlmYWNlOwotCXBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKLQlyZXR1cm4gMTsKKyAgICAgICAgbG9uZyBmb250LCBmYWNlLCBzaXplOworCisgICAgICAgIGlmKCAhUHlBcmdfUGFyc2VUdXBsZSh2LCAibGxsTyYiLCAmZm9udCwgJmZhY2UsICZzaXplLCBRZFJHQl9Db252ZXJ0LCAmcF9pdHNlbGYtPnRzQ29sb3IpICkKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgcF9pdHNlbGYtPnRzRm9udCA9IChzaG9ydClmb250OworICAgICAgICBwX2l0c2VsZi0+dHNGYWNlID0gKFN0eWxlKWZhY2U7CisgICAgICAgIHBfaXRzZWxmLT50c1NpemUgPSAoc2hvcnQpc2l6ZTsKKyAgICAgICAgcmV0dXJuIDE7CiB9CiAKIC8qCkBAIC0xMDcsMzMgKzEwNywzMyBAQAogUnVuSW5mb19OZXcoV0VSdW5JbmZvICppdHNlbGYpCiB7CiAKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxoaE8mTyYiLCBpdHNlbGYtPnJ1blN0YXJ0LCBpdHNlbGYtPnJ1bkVuZCwgaXRzZWxmLT5ydW5IZWlnaHQsCi0JCWl0c2VsZi0+cnVuQXNjZW50LCBUZXh0U3R5bGVfTmV3LCAmaXRzZWxmLT5ydW5TdHlsZSwgV0VPT2JqX05ldywgaXRzZWxmLT5ydW5PYmplY3QpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgibGxoaE8mTyYiLCBpdHNlbGYtPnJ1blN0YXJ0LCBpdHNlbGYtPnJ1bkVuZCwgaXRzZWxmLT5ydW5IZWlnaHQsCisgICAgICAgICAgICAgICAgaXRzZWxmLT5ydW5Bc2NlbnQsIFRleHRTdHlsZV9OZXcsICZpdHNlbGYtPnJ1blN0eWxlLCBXRU9PYmpfTmV3LCBpdHNlbGYtPnJ1bk9iamVjdCk7CiB9CiAKIC8qIENvbnZlcnNpb24gb2YgbG9uZyBwb2ludHMgYW5kIHJlY3RzICovCiBpbnQKIExvbmdSZWN0X0NvbnZlcnQoUHlPYmplY3QgKnYsIExvbmdSZWN0ICpyKQogewotCXJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGxsbGwpIiwgJnItPmxlZnQsICZyLT50b3AsICZyLT5yaWdodCwgJnItPmJvdHRvbSk7CisgICAgICAgIHJldHVybiBQeUFyZ19QYXJzZSh2LCAiKGxsbGwpIiwgJnItPmxlZnQsICZyLT50b3AsICZyLT5yaWdodCwgJnItPmJvdHRvbSk7CiB9CiAKIFB5T2JqZWN0ICoKIExvbmdSZWN0X05ldyhMb25nUmVjdCAqcikKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsbGwpIiwgci0+bGVmdCwgci0+dG9wLCByLT5yaWdodCwgci0+Ym90dG9tKTsKKyAgICAgICAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIihsbGxsKSIsIHItPmxlZnQsIHItPnRvcCwgci0+cmlnaHQsIHItPmJvdHRvbSk7CiB9CiAKIGludAogTG9uZ1B0X0NvbnZlcnQoUHlPYmplY3QgKnYsIExvbmdQdCAqcCkKIHsKLQlyZXR1cm4gUHlBcmdfUGFyc2UodiwgIihsbCkiLCAmcC0+aCwgJnAtPnYpOworICAgICAgICByZXR1cm4gUHlBcmdfUGFyc2UodiwgIihsbCkiLCAmcC0+aCwgJnAtPnYpOwogfQogCiBQeU9iamVjdCAqCiBMb25nUHRfTmV3KExvbmdQdCAqcCkKIHsKLQlyZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsKSIsIHAtPmgsIHAtPnYpOworICAgICAgICByZXR1cm4gUHlfQnVpbGRWYWx1ZSgiKGxsKSIsIHAtPmgsIHAtPnYpOwogfQogCiAvKiBTdHVmZiBmb3IgdGhlIGNhbGxiYWNrczogKi8KQEAgLTE0NiwxMTAgKzE0NiwxMTAgQEAKIHN0YXRpYyBPU0VycgogYW55X2hhbmRsZXIoV0VTZWxlY3RvciB3aGF0LCBXRU9iamVjdFJlZmVyZW5jZSB3aG8sIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqKnJ2KQogewotCUZsYXZvclR5cGUgdHA7Ci0JUHlPYmplY3QgKmtleSwgKmZ1bmM7Ci0JCi0JaWYgKCBhcmdzID09IE5VTEwgKSByZXR1cm4gZXJyQUVDb3JydXB0RGF0YTsKLQkKLQl0cCA9IFdFR2V0T2JqZWN0VHlwZSh3aG8pOwotCQotCWlmKCAoa2V5PVB5X0J1aWxkVmFsdWUoIk8mTyYiLCBQeU1hY19CdWlsZE9TVHlwZSwgdHAsIFB5TWFjX0J1aWxkT1NUeXBlLCB3aGF0KSkgPT0gTlVMTCkKLQkJcmV0dXJuIGVyckFFQ29ycnVwdERhdGE7Ci0JaWYoIChmdW5jID0gUHlEaWN0X0dldEl0ZW0oY2FsbGJhY2tkaWN0LCBrZXkpKSA9PSBOVUxMICkgewotCQlQeV9ERUNSRUYoa2V5KTsKLQkJcmV0dXJuIGVyckFFSGFuZGxlck5vdEZvdW5kOwotCX0KLQlQeV9JTkNSRUYoZnVuYyk7Ci0JKnJ2ID0gUHlFdmFsX0NhbGxPYmplY3QoZnVuYywgYXJncyk7Ci0JUHlfREVDUkVGKGZ1bmMpOwotCVB5X0RFQ1JFRihrZXkpOwotCWlmICggKnJ2ID09IE5VTEwgKSB7Ci0JCVB5U3lzX1dyaXRlU3RkZXJyKCItLUV4Y2VwdGlvbiBpbiBjYWxsYmFjazogIik7Ci0JCVB5RXJyX1ByaW50KCk7Ci0JCXJldHVybiBlcnJBRVJlcGx5Tm90QXJyaXZlZDsKLQl9Ci0JcmV0dXJuIDA7CisgICAgICAgIEZsYXZvclR5cGUgdHA7CisgICAgICAgIFB5T2JqZWN0ICprZXksICpmdW5jOworCisgICAgICAgIGlmICggYXJncyA9PSBOVUxMICkgcmV0dXJuIGVyckFFQ29ycnVwdERhdGE7CisKKyAgICAgICAgdHAgPSBXRUdldE9iamVjdFR5cGUod2hvKTsKKworICAgICAgICBpZiggKGtleT1QeV9CdWlsZFZhbHVlKCJPJk8mIiwgUHlNYWNfQnVpbGRPU1R5cGUsIHRwLCBQeU1hY19CdWlsZE9TVHlwZSwgd2hhdCkpID09IE5VTEwpCisgICAgICAgICAgICAgICAgcmV0dXJuIGVyckFFQ29ycnVwdERhdGE7CisgICAgICAgIGlmKCAoZnVuYyA9IFB5RGljdF9HZXRJdGVtKGNhbGxiYWNrZGljdCwga2V5KSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZXJyQUVIYW5kbGVyTm90Rm91bmQ7CisgICAgICAgIH0KKyAgICAgICAgUHlfSU5DUkVGKGZ1bmMpOworICAgICAgICAqcnYgPSBQeUV2YWxfQ2FsbE9iamVjdChmdW5jLCBhcmdzKTsKKyAgICAgICAgUHlfREVDUkVGKGZ1bmMpOworICAgICAgICBQeV9ERUNSRUYoa2V5KTsKKyAgICAgICAgaWYgKCAqcnYgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBQeVN5c19Xcml0ZVN0ZGVycigiLS1FeGNlcHRpb24gaW4gY2FsbGJhY2s6ICIpOworICAgICAgICAgICAgICAgIFB5RXJyX1ByaW50KCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGVyckFFUmVwbHlOb3RBcnJpdmVkOworICAgICAgICB9CisgICAgICAgIHJldHVybiAwOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBteV9uZXdfaGFuZGxlcihQb2ludCAqb2JqZWN0U2l6ZSwgV0VPYmplY3RSZWZlcmVuY2Ugb2JqcmVmKQogewotCVB5T2JqZWN0ICphcmdzPU5VTEwsICpydj1OVUxMOwotCU9TRXJyIGVycjsKLQkKLQlhcmdzPVB5X0J1aWxkVmFsdWUoIihPJikiLCBXRU9PYmpfTmV3LCBvYmpyZWYpOwotCWVyciA9IGFueV9oYW5kbGVyKHdlTmV3SGFuZGxlciwgb2JqcmVmLCBhcmdzLCAmcnYpOwotCWlmICghZXJyKSB7Ci0JCWlmICghUHlNYWNfR2V0UG9pbnQocnYsIG9iamVjdFNpemUpICkKLQkJCWVyciA9IGVyckFFQ29lcmNpb25GYWlsOwotCX0KLQlpZiAoIGFyZ3MgKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JaWYgKCBydiApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7CisgICAgICAgIE9TRXJyIGVycjsKKworICAgICAgICBhcmdzPVB5X0J1aWxkVmFsdWUoIihPJikiLCBXRU9PYmpfTmV3LCBvYmpyZWYpOworICAgICAgICBlcnIgPSBhbnlfaGFuZGxlcih3ZU5ld0hhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKKyAgICAgICAgaWYgKCFlcnIpIHsKKyAgICAgICAgICAgICAgICBpZiAoIVB5TWFjX0dldFBvaW50KHJ2LCBvYmplY3RTaXplKSApCisgICAgICAgICAgICAgICAgICAgICAgICBlcnIgPSBlcnJBRUNvZXJjaW9uRmFpbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIGFyZ3MgKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKGFyZ3MpOworICAgICAgICB9CisgICAgICAgIGlmICggcnYgKSB7CisgICAgICAgICAgICAgICAgUHlfREVDUkVGKHJ2KTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gZXJyOwogfQogCiBzdGF0aWMgcGFzY2FsIE9TRXJyCiBteV9kaXNwb3NlX2hhbmRsZXIoV0VPYmplY3RSZWZlcmVuY2Ugb2JqcmVmKQogewotCVB5T2JqZWN0ICphcmdzPU5VTEwsICpydj1OVUxMOwotCU9TRXJyIGVycjsKLQkKLQlhcmdzPVB5X0J1aWxkVmFsdWUoIihPJikiLCBXRU9PYmpfTmV3LCBvYmpyZWYpOwotCWVyciA9IGFueV9oYW5kbGVyKHdlRGlzcG9zZUhhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKLQlpZiAoIGFyZ3MgKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JaWYgKCBydiApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7CisgICAgICAgIE9TRXJyIGVycjsKKworICAgICAgICBhcmdzPVB5X0J1aWxkVmFsdWUoIihPJikiLCBXRU9PYmpfTmV3LCBvYmpyZWYpOworICAgICAgICBlcnIgPSBhbnlfaGFuZGxlcih3ZURpc3Bvc2VIYW5kbGVyLCBvYmpyZWYsIGFyZ3MsICZydik7CisgICAgICAgIGlmICggYXJncyApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBydiApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBwYXNjYWwgT1NFcnIKIG15X2RyYXdfaGFuZGxlcihjb25zdCBSZWN0ICpkZXN0UmVjdCwgV0VPYmplY3RSZWZlcmVuY2Ugb2JqcmVmKQogewotCVB5T2JqZWN0ICphcmdzPU5VTEwsICpydj1OVUxMOwotCU9TRXJyIGVycjsKLQkKLQlhcmdzPVB5X0J1aWxkVmFsdWUoIk8mTyYiLCBQeU1hY19CdWlsZFJlY3QsIGRlc3RSZWN0LCBXRU9PYmpfTmV3LCBvYmpyZWYpOwotCWVyciA9IGFueV9oYW5kbGVyKHdlRHJhd0hhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKLQlpZiAoIGFyZ3MgKSB7Ci0JCVB5X0RFQ1JFRihhcmdzKTsKLQl9Ci0JaWYgKCBydiApIHsKLQkJUHlfREVDUkVGKHJ2KTsKLQl9Ci0JcmV0dXJuIGVycjsKKyAgICAgICAgUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7CisgICAgICAgIE9TRXJyIGVycjsKKworICAgICAgICBhcmdzPVB5X0J1aWxkVmFsdWUoIk8mTyYiLCBQeU1hY19CdWlsZFJlY3QsIGRlc3RSZWN0LCBXRU9PYmpfTmV3LCBvYmpyZWYpOworICAgICAgICBlcnIgPSBhbnlfaGFuZGxlcih3ZURyYXdIYW5kbGVyLCBvYmpyZWYsIGFyZ3MsICZydik7CisgICAgICAgIGlmICggYXJncyApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYoYXJncyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBydiApIHsKKyAgICAgICAgICAgICAgICBQeV9ERUNSRUYocnYpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBlcnI7CiB9CiAKIHN0YXRpYyBwYXNjYWwgQm9vbGVhbgogbXlfY2xpY2tfaGFuZGxlcihQb2ludCBoaXRQdCwgRXZlbnRNb2RpZmllcnMgbW9kaWZpZXJzLAotCQl1bnNpZ25lZCBsb25nIGNsaWNrVGltZSwgV0VPYmplY3RSZWZlcmVuY2Ugb2JqcmVmKQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgY2xpY2tUaW1lLCBXRU9iamVjdFJlZmVyZW5jZSBvYmpyZWYpCiB7Ci0JUHlPYmplY3QgKmFyZ3M9TlVMTCwgKnJ2PU5VTEw7Ci0JaW50IHJldHZhbHVlOwotCU9TRXJyIGVycjsKLQkKLQlhcmdzPVB5X0J1aWxkVmFsdWUoIk8mbGxPJiIsIFB5TWFjX0J1aWxkUG9pbnQsIGhpdFB0LAotCQkJKGxvbmcpbW9kaWZpZXJzLCAobG9uZyljbGlja1RpbWUsIFdFT09ial9OZXcsIG9ianJlZik7Ci0JZXJyID0gYW55X2hhbmRsZXIod2VDbGlja0hhbmRsZXIsIG9ianJlZiwgYXJncywgJnJ2KTsKLQlpZiAoIWVycikKLQkJcmV0dmFsdWUgPSBQeUludF9Bc0xvbmcocnYpOwotCWVsc2UKLQkJcmV0dmFsdWUgPSAwOwotCWlmICggYXJncyApIHsKLQkJUHlfREVDUkVGKGFyZ3MpOwotCX0KLQlpZiAoIHJ2ICkgewotCQlQeV9ERUNSRUYocnYpOwotCX0KLQlyZXR1cm4gcmV0dmFsdWU7CisgICAgICAgIFB5T2JqZWN0ICphcmdzPU5VTEwsICpydj1OVUxMOworICAgICAgICBpbnQgcmV0dmFsdWU7CisgICAgICAgIE9TRXJyIGVycjsKKworICAgICAgICBhcmdzPVB5X0J1aWxkVmFsdWUoIk8mbGxPJiIsIFB5TWFjX0J1aWxkUG9pbnQsIGhpdFB0LAorICAgICAgICAgICAgICAgICAgICAgICAgKGxvbmcpbW9kaWZpZXJzLCAobG9uZyljbGlja1RpbWUsIFdFT09ial9OZXcsIG9ianJlZik7CisgICAgICAgIGVyciA9IGFueV9oYW5kbGVyKHdlQ2xpY2tIYW5kbGVyLCBvYmpyZWYsIGFyZ3MsICZydik7CisgICAgICAgIGlmICghZXJyKQorICAgICAgICAgICAgICAgIHJldHZhbHVlID0gUHlJbnRfQXNMb25nKHJ2KTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHJldHZhbHVlID0gMDsKKyAgICAgICAgaWYgKCBhcmdzICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihhcmdzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJ2ICkgeworICAgICAgICAgICAgICAgIFB5X0RFQ1JFRihydik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbHVlOwogfQotCQkKKwogCiAiIiIKIGZpbmFsc3R1ZmYgPSBmaW5hbHN0dWZmICsgIiIiCkBAIC0yNTcsNjIgKzI1Nyw2MiBAQAogCiBQeU9iamVjdCAqCiBFeGlzdGluZ3dhc3RlT2JqX05ldyh3KQotCVdFUmVmZXJlbmNlIHc7CisgICAgICAgIFdFUmVmZXJlbmNlIHc7CiB7Ci0JUHlPYmplY3QgKml0ID0gTlVMTDsKLQkKLQlpZiAodyA9PSBOVUxMKQotCQlpdCA9IE5VTEw7Ci0JZWxzZQotCQlXRUdldEluZm8od2VSZWZDb24sICh2b2lkICopJml0LCB3KTsKLQlpZiAoaXQgPT0gTlVMTCB8fCAoKHdhc3RlT2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdykKLQkJaXQgPSBQeV9Ob25lOwotCVB5X0lOQ1JFRihpdCk7Ci0JcmV0dXJuIGl0OworICAgICAgICBQeU9iamVjdCAqaXQgPSBOVUxMOworCisgICAgICAgIGlmICh3ID09IE5VTEwpCisgICAgICAgICAgICAgICAgaXQgPSBOVUxMOworICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgV0VHZXRJbmZvKHdlUmVmQ29uLCAodm9pZCAqKSZpdCwgdyk7CisgICAgICAgIGlmIChpdCA9PSBOVUxMIHx8ICgod2FzdGVPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3KQorICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgUHlfSU5DUkVGKGl0KTsKKyAgICAgICAgcmV0dXJuIGl0OwogfQogIiIiCiAKIGNsYXNzIFdFTWV0aG9kR2VuZXJhdG9yKE9TRXJyTWV0aG9kR2VuZXJhdG9yKToKLQkiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKKyAgICAiIiJTaW1pbGFyIHRvIE1ldGhvZEdlbmVyYXRvciwgYnV0IGhhcyBzZWxmIGFzIGxhc3QgYXJndW1lbnQiIiIKIAotCWRlZiBwYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKToKLQkJYXJncywgYTAgPSBhcmdzWzotMV0sIGFyZ3NbLTFdCi0JCXQwLCBuMCwgbTAgPSBhMAotCQlpZiBtMCAhPSBJbk1vZGU6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAibWV0aG9kJ3MgJ3NlbGYnIG11c3QgYmUgJ0luTW9kZSciCi0JCXNlbGYuaXRzZWxmID0gVmFyaWFibGUodDAsICJfc2VsZi0+b2JfaXRzZWxmIiwgU2VsZk1vZGUpCi0JCUZ1bmN0aW9uR2VuZXJhdG9yLnBhcnNlQXJndW1lbnRMaXN0KHNlbGYsIGFyZ3MpCi0JCXNlbGYuYXJndW1lbnRMaXN0LmFwcGVuZChzZWxmLml0c2VsZikKKyAgICBkZWYgcGFyc2VBcmd1bWVudExpc3Qoc2VsZiwgYXJncyk6CisgICAgICAgIGFyZ3MsIGEwID0gYXJnc1s6LTFdLCBhcmdzWy0xXQorICAgICAgICB0MCwgbjAsIG0wID0gYTAKKyAgICAgICAgaWYgbTAgIT0gSW5Nb2RlOgorICAgICAgICAgICAgcmFpc2UgVmFsdWVFcnJvciwgIm1ldGhvZCdzICdzZWxmJyBtdXN0IGJlICdJbk1vZGUnIgorICAgICAgICBzZWxmLml0c2VsZiA9IFZhcmlhYmxlKHQwLCAiX3NlbGYtPm9iX2l0c2VsZiIsIFNlbGZNb2RlKQorICAgICAgICBGdW5jdGlvbkdlbmVyYXRvci5wYXJzZUFyZ3VtZW50TGlzdChzZWxmLCBhcmdzKQorICAgICAgICBzZWxmLmFyZ3VtZW50TGlzdC5hcHBlbmQoc2VsZi5pdHNlbGYpCiAKIAogCiBjbGFzcyBXRU9iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeUVycl9TZXRTdHJpbmcod2FzdGVfRXJyb3IsIkNhbm5vdCBjcmVhdGUgbnVsbCBXRSIpOwotCQkJCQlyZXR1cm4gTlVMTDsKLQkJCQl9IiIiKQotCWRlZiBvdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRJbml0U3RydWN0TWVtYmVycyhzZWxmKQotCQlPdXRwdXQoIldFU2V0SW5mbyh3ZVJlZkNvbiwgKHZvaWQgKikmaXQsIGl0c2VsZik7IikKLQlkZWYgb3V0cHV0RnJlZUl0KHNlbGYsIGl0c2VsZm5hbWUpOgotCQlPdXRwdXQoIldFRGlzcG9zZSglcyk7IiwgaXRzZWxmbmFtZSkKLQkJCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5RXJyX1NldFN0cmluZyh3YXN0ZV9FcnJvciwiQ2Fubm90IGNyZWF0ZSBudWxsIFdFIik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgfSIiIikKKyAgICBkZWYgb3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIEdsb2JhbE9iamVjdERlZmluaXRpb24ub3V0cHV0SW5pdFN0cnVjdE1lbWJlcnMoc2VsZikKKyAgICAgICAgT3V0cHV0KCJXRVNldEluZm8od2VSZWZDb24sICh2b2lkICopJml0LCBpdHNlbGYpOyIpCisgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyAgICAgICAgT3V0cHV0KCJXRURpc3Bvc2UoJXMpOyIsIGl0c2VsZm5hbWUpCisKIGNsYXNzIFdFT09iamVjdERlZmluaXRpb24oUEVQMjUzTWl4aW4sIEdsb2JhbE9iamVjdERlZmluaXRpb24pOgotCWRlZiBvdXRwdXRDaGVja05ld0FyZyhzZWxmKToKLQkJT3V0cHV0KCIiImlmIChpdHNlbGYgPT0gTlVMTCkgewotCQkJCQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JCQkJCXJldHVybiBQeV9Ob25lOwotCQkJCX0iIiIpCi0JCQkJCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoIiIiaWYgKGl0c2VsZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihQeV9Ob25lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFB5X05vbmU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IiIiKQorCiB2YXJpYWJsZXN0dWZmID0gIiIiCi0JY2FsbGJhY2tkaWN0ID0gUHlEaWN0X05ldygpOwotCWlmIChjYWxsYmFja2RpY3QgPT0gTlVMTCB8fCBQeURpY3RfU2V0SXRlbVN0cmluZyhkLCAiY2FsbGJhY2tzIiwgY2FsbGJhY2tkaWN0KSAhPSAwKQotCQlyZXR1cm47Ci0JdXBwX25ld19oYW5kbGVyID0gTmV3V0VOZXdPYmplY3RQcm9jKG15X25ld19oYW5kbGVyKTsKLQl1cHBfZGlzcG9zZV9oYW5kbGVyID0gTmV3V0VEaXNwb3NlT2JqZWN0UHJvYyhteV9kaXNwb3NlX2hhbmRsZXIpOwotCXVwcF9kcmF3X2hhbmRsZXIgPSBOZXdXRURyYXdPYmplY3RQcm9jKG15X2RyYXdfaGFuZGxlcik7Ci0JdXBwX2NsaWNrX2hhbmRsZXIgPSBOZXdXRUNsaWNrT2JqZWN0UHJvYyhteV9jbGlja19oYW5kbGVyKTsKKyAgICAgICAgY2FsbGJhY2tkaWN0ID0gUHlEaWN0X05ldygpOworICAgICAgICBpZiAoY2FsbGJhY2tkaWN0ID09IE5VTEwgfHwgUHlEaWN0X1NldEl0ZW1TdHJpbmcoZCwgImNhbGxiYWNrcyIsIGNhbGxiYWNrZGljdCkgIT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgIHVwcF9uZXdfaGFuZGxlciA9IE5ld1dFTmV3T2JqZWN0UHJvYyhteV9uZXdfaGFuZGxlcik7CisgICAgICAgIHVwcF9kaXNwb3NlX2hhbmRsZXIgPSBOZXdXRURpc3Bvc2VPYmplY3RQcm9jKG15X2Rpc3Bvc2VfaGFuZGxlcik7CisgICAgICAgIHVwcF9kcmF3X2hhbmRsZXIgPSBOZXdXRURyYXdPYmplY3RQcm9jKG15X2RyYXdfaGFuZGxlcik7CisgICAgICAgIHVwcF9jbGlja19oYW5kbGVyID0gTmV3V0VDbGlja09iamVjdFByb2MobXlfY2xpY2tfaGFuZGxlcik7CiAiIiIKIAogCkBAIC0zNDEsNzggKzM0MSw3OCBAQAogCiAjIEEgZnVuY3Rpb24gd3JpdHRlbiBieSBoYW5kOgogc3RkaGFuZGxlcnNfYm9keSA9ICIiIgotCU9TRXJyIGVycjsKLQkvLyBpbnN0YWxsIHRoZSBzYW1wbGUgb2JqZWN0IGhhbmRsZXJzIGZvciBwaWN0dXJlcyBhbmQgc291bmRzCi0jZGVmaW5lCWtUeXBlUGljdHVyZQkJCSdQSUNUJwotI2RlZmluZQlrVHlwZVNvdW5kCQkJCSdzbmQgJwotCQotCWlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICIiKSApIHJldHVybiBOVUxMOwotCQotCWlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVBpY3R1cmUsIHdlTmV3SGFuZGxlciwKLQkJCQkoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VOZXdPYmplY3RQcm9jKEhhbmRsZU5ld1BpY3R1cmUpLCBOVUxMKSkgIT0gbm9FcnIpCi0JCWdvdG8gY2xlYW51cDsKLQkKLQlpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVQaWN0dXJlLCB3ZURpc3Bvc2VIYW5kbGVyLAotCQkJCShVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRURpc3Bvc2VPYmplY3RQcm9jKEhhbmRsZURpc3Bvc2VQaWN0dXJlKSwgTlVMTCkpICE9IG5vRXJyKQotCQlnb3RvIGNsZWFudXA7Ci0JCi0JaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlUGljdHVyZSwgd2VEcmF3SGFuZGxlciwKLQkJCQkoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VEcmF3T2JqZWN0UHJvYyhIYW5kbGVEcmF3UGljdHVyZSksIE5VTEwpKSAhPSBub0VycikKLQkJZ290byBjbGVhbnVwOwotCQotCWlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZU5ld0hhbmRsZXIsCi0JCQkJKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFTmV3T2JqZWN0UHJvYyhIYW5kbGVOZXdTb3VuZCksIE5VTEwpKSAhPSBub0VycikKLQkJZ290byBjbGVhbnVwOwotCQotCWlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZURyYXdIYW5kbGVyLAotCQkJCShVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRURyYXdPYmplY3RQcm9jKEhhbmRsZURyYXdTb3VuZCksIE5VTEwpKSAhPSBub0VycikKLQkJZ290byBjbGVhbnVwOwotCQotCWlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVNvdW5kLCB3ZUNsaWNrSGFuZGxlciwKLQkJCQkoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VDbGlja09iamVjdFByb2MoSGFuZGxlQ2xpY2tTb3VuZCksIE5VTEwpKSAhPSBub0VycikKLQkJZ290byBjbGVhbnVwOwotCVB5X0lOQ1JFRihQeV9Ob25lKTsKLQlfcmVzID0gUHlfTm9uZTsKLQlyZXR1cm4gX3JlczsKLQkKKyAgICAgICAgT1NFcnIgZXJyOworICAgICAgICAvLyBpbnN0YWxsIHRoZSBzYW1wbGUgb2JqZWN0IGhhbmRsZXJzIGZvciBwaWN0dXJlcyBhbmQgc291bmRzCisjZGVmaW5lIGtUeXBlUGljdHVyZSAgICAgICAgICAgICAgICAgICAgJ1BJQ1QnCisjZGVmaW5lIGtUeXBlU291bmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnc25kICcKKworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiIikgKSByZXR1cm4gTlVMTDsKKworICAgICAgICBpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVQaWN0dXJlLCB3ZU5ld0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRU5ld09iamVjdFByb2MoSGFuZGxlTmV3UGljdHVyZSksIE5VTEwpKSAhPSBub0VycikKKyAgICAgICAgICAgICAgICBnb3RvIGNsZWFudXA7CisKKyAgICAgICAgaWYgKChlcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKGtUeXBlUGljdHVyZSwgd2VEaXNwb3NlSGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFRGlzcG9zZU9iamVjdFByb2MoSGFuZGxlRGlzcG9zZVBpY3R1cmUpLCBOVUxMKSkgIT0gbm9FcnIpCisgICAgICAgICAgICAgICAgZ290byBjbGVhbnVwOworCisgICAgICAgIGlmICgoZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihrVHlwZVBpY3R1cmUsIHdlRHJhd0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRURyYXdPYmplY3RQcm9jKEhhbmRsZURyYXdQaWN0dXJlKSwgTlVMTCkpICE9IG5vRXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICBpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVTb3VuZCwgd2VOZXdIYW5kbGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVW5pdmVyc2FsUHJvY1B0cikgTmV3V0VOZXdPYmplY3RQcm9jKEhhbmRsZU5ld1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICBpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVTb3VuZCwgd2VEcmF3SGFuZGxlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKFVuaXZlcnNhbFByb2NQdHIpIE5ld1dFRHJhd09iamVjdFByb2MoSGFuZGxlRHJhd1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKworICAgICAgICBpZiAoKGVyciA9IFdFSW5zdGFsbE9iamVjdEhhbmRsZXIoa1R5cGVTb3VuZCwgd2VDbGlja0hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChVbml2ZXJzYWxQcm9jUHRyKSBOZXdXRUNsaWNrT2JqZWN0UHJvYyhIYW5kbGVDbGlja1NvdW5kKSwgTlVMTCkpICE9IG5vRXJyKQorICAgICAgICAgICAgICAgIGdvdG8gY2xlYW51cDsKKyAgICAgICAgUHlfSU5DUkVGKFB5X05vbmUpOworICAgICAgICBfcmVzID0gUHlfTm9uZTsKKyAgICAgICAgcmV0dXJuIF9yZXM7CisKIGNsZWFudXA6Ci0JcmV0dXJuIFB5TWFjX0Vycm9yKGVycik7CisgICAgICAgIHJldHVybiBQeU1hY19FcnJvcihlcnIpOwogIiIiCiAKIGluc2hhbmRsZXJfYm9keSA9ICIiIgotCU9TRXJyIGVycjsKLQlGbGF2b3JUeXBlIG9iamVjdFR5cGU7Ci0JV0VTZWxlY3RvciBzZWxlY3RvcjsKLQlQeU9iamVjdCAqcHlfaGFuZGxlcjsKLQlVbml2ZXJzYWxQcm9jUHRyIGhhbmRsZXI7Ci0JV0VSZWZlcmVuY2Ugd2UgPSBOVUxMOwotCVB5T2JqZWN0ICprZXk7Ci0JCi0JCi0JaWYgKCAhUHlBcmdfUGFyc2VUdXBsZShfYXJncywgIk8mTyZPfE8mIiwKLQkJCVB5TWFjX0dldE9TVHlwZSwgJm9iamVjdFR5cGUsCi0JCQlQeU1hY19HZXRPU1R5cGUsICZzZWxlY3RvciwKLQkJCSZweV9oYW5kbGVyLAotCQkJV0VPT2JqX0NvbnZlcnQsICZ3ZSkgKSByZXR1cm4gTlVMTDsKLQkJCQotCWlmICggc2VsZWN0b3IgPT0gd2VOZXdIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9uZXdfaGFuZGxlcjsKLQllbHNlIGlmICggc2VsZWN0b3IgPT0gd2VEaXNwb3NlSGFuZGxlciApIGhhbmRsZXIgPSAoVW5pdmVyc2FsUHJvY1B0cil1cHBfZGlzcG9zZV9oYW5kbGVyOwotCWVsc2UgaWYgKCBzZWxlY3RvciA9PSB3ZURyYXdIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9kcmF3X2hhbmRsZXI7Ci0JZWxzZSBpZiAoIHNlbGVjdG9yID09IHdlQ2xpY2tIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9jbGlja19oYW5kbGVyOwotCWVsc2UgcmV0dXJuIFB5TWFjX0Vycm9yKHdlVW5kZWZpbmVkU2VsZWN0b3JFcnIpOwotCQkJCi0JaWYgKChrZXkgPSBQeV9CdWlsZFZhbHVlKCJPJk8mIiwgCi0JCQlQeU1hY19CdWlsZE9TVHlwZSwgb2JqZWN0VHlwZSwgCi0JCQlQeU1hY19CdWlsZE9TVHlwZSwgc2VsZWN0b3IpKSA9PSBOVUxMICkKLQkJcmV0dXJuIE5VTEw7Ci0JCQotCVB5RGljdF9TZXRJdGVtKGNhbGxiYWNrZGljdCwga2V5LCBweV9oYW5kbGVyKTsKLQkKLQllcnIgPSBXRUluc3RhbGxPYmplY3RIYW5kbGVyKG9iamVjdFR5cGUsIHNlbGVjdG9yLCBoYW5kbGVyLCB3ZSk7Ci0JaWYgKCBlcnIgKSByZXR1cm4gUHlNYWNfRXJyb3IoZXJyKTsKLQlQeV9JTkNSRUYoUHlfTm9uZSk7Ci0JX3JlcyA9IFB5X05vbmU7Ci0JcmV0dXJuIF9yZXM7CisgICAgICAgIE9TRXJyIGVycjsKKyAgICAgICAgRmxhdm9yVHlwZSBvYmplY3RUeXBlOworICAgICAgICBXRVNlbGVjdG9yIHNlbGVjdG9yOworICAgICAgICBQeU9iamVjdCAqcHlfaGFuZGxlcjsKKyAgICAgICAgVW5pdmVyc2FsUHJvY1B0ciBoYW5kbGVyOworICAgICAgICBXRVJlZmVyZW5jZSB3ZSA9IE5VTEw7CisgICAgICAgIFB5T2JqZWN0ICprZXk7CisKKworICAgICAgICBpZiAoICFQeUFyZ19QYXJzZVR1cGxlKF9hcmdzLCAiTyZPJk98TyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfR2V0T1NUeXBlLCAmb2JqZWN0VHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5TWFjX0dldE9TVHlwZSwgJnNlbGVjdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgJnB5X2hhbmRsZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBXRU9PYmpfQ29udmVydCwgJndlKSApIHJldHVybiBOVUxMOworCisgICAgICAgIGlmICggc2VsZWN0b3IgPT0gd2VOZXdIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9uZXdfaGFuZGxlcjsKKyAgICAgICAgZWxzZSBpZiAoIHNlbGVjdG9yID09IHdlRGlzcG9zZUhhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX2Rpc3Bvc2VfaGFuZGxlcjsKKyAgICAgICAgZWxzZSBpZiAoIHNlbGVjdG9yID09IHdlRHJhd0hhbmRsZXIgKSBoYW5kbGVyID0gKFVuaXZlcnNhbFByb2NQdHIpdXBwX2RyYXdfaGFuZGxlcjsKKyAgICAgICAgZWxzZSBpZiAoIHNlbGVjdG9yID09IHdlQ2xpY2tIYW5kbGVyICkgaGFuZGxlciA9IChVbml2ZXJzYWxQcm9jUHRyKXVwcF9jbGlja19oYW5kbGVyOworICAgICAgICBlbHNlIHJldHVybiBQeU1hY19FcnJvcih3ZVVuZGVmaW5lZFNlbGVjdG9yRXJyKTsKKworICAgICAgICBpZiAoKGtleSA9IFB5X0J1aWxkVmFsdWUoIk8mTyYiLAorICAgICAgICAgICAgICAgICAgICAgICAgUHlNYWNfQnVpbGRPU1R5cGUsIG9iamVjdFR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICBQeU1hY19CdWlsZE9TVHlwZSwgc2VsZWN0b3IpKSA9PSBOVUxMICkKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKworICAgICAgICBQeURpY3RfU2V0SXRlbShjYWxsYmFja2RpY3QsIGtleSwgcHlfaGFuZGxlcik7CisKKyAgICAgICAgZXJyID0gV0VJbnN0YWxsT2JqZWN0SGFuZGxlcihvYmplY3RUeXBlLCBzZWxlY3RvciwgaGFuZGxlciwgd2UpOworICAgICAgICBpZiAoIGVyciApIHJldHVybiBQeU1hY19FcnJvcihlcnIpOworICAgICAgICBQeV9JTkNSRUYoUHlfTm9uZSk7CisgICAgICAgIF9yZXMgPSBQeV9Ob25lOworICAgICAgICByZXR1cm4gX3JlczsKICIiIgogCiBzdGRoYW5kID0gTWFudWFsR2VuZXJhdG9yKCJTVERPYmplY3RIYW5kbGVycyIsIHN0ZGhhbmRsZXJzX2JvZHkpCkBAIC00NDIsNCArNDQyLDMgQEAKICMgZ2VuZXJhdGUgb3V0cHV0IChvcGVuIHRoZSBvdXRwdXQgZmlsZSBhcyBsYXRlIGFzIHBvc3NpYmxlKQogU2V0T3V0cHV0RmlsZU5hbWUoT1VUUFVURklMRSkKIG1vZHVsZS5nZW5lcmF0ZSgpCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi93aW5lZGl0LnB5IGIvTWFjL01vZHVsZXMvd2luL3dpbmVkaXQucHkKaW5kZXggZDc5MzU2Zi4uMDFjZmU4NiAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvd2luL3dpbmVkaXQucHkKKysrIGIvTWFjL01vZHVsZXMvd2luL3dpbmVkaXQucHkKQEAgLTcsMjUgKzcsMjUgQEAKIG1ldGhvZHMuYXBwZW5kKGYpCiAKIGYgPSBNZXRob2Qodm9pZCwgJ0dldFdpbmRvd1N0cnVjdHVyZVJnbicsCi0JKFdpbmRvd1JlZiwgJ3RoZVdpbmRvdycsIEluTW9kZSksCi0JKFJnbkhhbmRsZSwgJ3InLCBJbk1vZGUpLAorICAgICAgICAoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKKyAgICAgICAgKFJnbkhhbmRsZSwgJ3InLCBJbk1vZGUpLAogKQogbWV0aG9kcy5hcHBlbmQoZikKIAogZiA9IE1ldGhvZCh2b2lkLCAnR2V0V2luZG93Q29udGVudFJnbicsCi0JKFdpbmRvd1JlZiwgJ3RoZVdpbmRvdycsIEluTW9kZSksCi0JKFJnbkhhbmRsZSwgJ3InLCBJbk1vZGUpLAorICAgICAgICAoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKKyAgICAgICAgKFJnbkhhbmRsZSwgJ3InLCBJbk1vZGUpLAogKQogbWV0aG9kcy5hcHBlbmQoZikKIAogZiA9IE1ldGhvZCh2b2lkLCAnR2V0V2luZG93VXBkYXRlUmduJywKLQkoV2luZG93UmVmLCAndGhlV2luZG93JywgSW5Nb2RlKSwKLQkoUmduSGFuZGxlLCAncicsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dSZWYsICd0aGVXaW5kb3cnLCBJbk1vZGUpLAorICAgICAgICAoUmduSGFuZGxlLCAncicsIEluTW9kZSksCiApCiBtZXRob2RzLmFwcGVuZChmKQogCiBmID0gTWV0aG9kKEV4aXN0aW5nV2luZG93UHRyLCAnR2V0TmV4dFdpbmRvdycsCi0JKFdpbmRvd1JlZiwgJ3RoZVdpbmRvdycsIEluTW9kZSksCisgICAgICAgIChXaW5kb3dSZWYsICd0aGVXaW5kb3cnLCBJbk1vZGUpLAogKQogbWV0aG9kcy5hcHBlbmQoZikKIApAQCAtNTQsMTggKzU0LDE2IEBACiBBdXRvRGlzcG9zZV9ib2R5ID0gIiIiCiBpbnQgb25vZmYsIG9sZCA9IDA7CiBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJm9ub2ZmKSkKLQlyZXR1cm4gTlVMTDsKKyAgICAgICAgcmV0dXJuIE5VTEw7CiBpZiAoIF9zZWxmLT5vYl9mcmVlaXQgKQotCW9sZCA9IDE7CisgICAgICAgIG9sZCA9IDE7CiBpZiAoIG9ub2ZmICkKLQlfc2VsZi0+b2JfZnJlZWl0ID0gUHlNYWNfQXV0b0Rpc3Bvc2VXaW5kb3c7CisgICAgICAgIF9zZWxmLT5vYl9mcmVlaXQgPSBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdzsKIGVsc2UKLQlfc2VsZi0+b2JfZnJlZWl0ID0gTlVMTDsKKyAgICAgICAgX3NlbGYtPm9iX2ZyZWVpdCA9IE5VTEw7CiBfcmVzID0gUHlfQnVpbGRWYWx1ZSgiaSIsIG9sZCk7CiByZXR1cm4gX3JlczsKICIiIgogZiA9IE1hbnVhbEdlbmVyYXRvcigiQXV0b0Rpc3Bvc2UiLCBBdXRvRGlzcG9zZV9ib2R5KQogZi5kb2NzdHJpbmcgPSBsYW1iZGE6ICIoaW50KS0+aW50LiBBdXRvbWF0aWNhbGx5IERpc3Bvc2VIYW5kbGUgdGhlIG9iamVjdCBvbiBQeXRob24gb2JqZWN0IGNsZWFudXAiCiBtZXRob2RzLmFwcGVuZChmKQotCi0KZGlmZiAtLWdpdCBhL01hYy9Nb2R1bGVzL3dpbi93aW5zY2FuLnB5IGIvTWFjL01vZHVsZXMvd2luL3dpbnNjYW4ucHkKaW5kZXggNmIwOGMwMC4uZjc4OTM1ZCAxMDA2NDQKLS0tIGEvTWFjL01vZHVsZXMvd2luL3dpbnNjYW4ucHkKKysrIGIvTWFjL01vZHVsZXMvd2luL3dpbnNjYW4ucHkKQEAgLTcsMTI1ICs3LDEyNCBAQAogZnJvbSBzY2FudG9vbHMgaW1wb3J0IFNjYW5uZXIKIAogZGVmIG1haW4oKToKLQlpbnB1dCA9ICJNYWNXaW5kb3dzLmgiCi0Jb3V0cHV0ID0gIndpbmdlbi5weSIKLQlkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJXaW5kb3dzLnB5IgotCXNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKLQlzY2FubmVyLnNjYW4oKQotCXNjYW5uZXIuY2xvc2UoKQotCXByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCi0JZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQotCXByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgotCWltcG9ydCB3aW5zdXBwb3J0Ci0JcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKKyAgICBpbnB1dCA9ICJNYWNXaW5kb3dzLmgiCisgICAgb3V0cHV0ID0gIndpbmdlbi5weSIKKyAgICBkZWZzb3V0cHV0ID0gVE9PTEJPWERJUiArICJXaW5kb3dzLnB5IgorICAgIHNjYW5uZXIgPSBNeVNjYW5uZXIoaW5wdXQsIG91dHB1dCwgZGVmc291dHB1dCkKKyAgICBzY2FubmVyLnNjYW4oKQorICAgIHNjYW5uZXIuY2xvc2UoKQorICAgIHByaW50ICI9PT0gVGVzdGluZyBkZWZpbml0aW9ucyBvdXRwdXQgY29kZSA9PT0iCisgICAgZXhlY2ZpbGUoZGVmc291dHB1dCwge30sIHt9KQorICAgIHByaW50ICI9PT0gRG9uZSBzY2FubmluZyBhbmQgZ2VuZXJhdGluZywgbm93IGltcG9ydGluZyB0aGUgZ2VuZXJhdGVkIGNvZGUuLi4gPT09IgorICAgIGltcG9ydCB3aW5zdXBwb3J0CisgICAgcHJpbnQgIj09PSBEb25lLiAgSXQncyB1cCB0byB5b3UgdG8gY29tcGlsZSBpdCBub3chID09PSIKIAogY2xhc3MgTXlTY2FubmVyKFNjYW5uZXIpOgogCi0JZGVmIGRlc3RpbmF0aW9uKHNlbGYsIHR5cGUsIG5hbWUsIGFyZ2xpc3QpOgotCQljbGFzc25hbWUgPSAiRnVuY3Rpb24iCi0JCWxpc3RuYW1lID0gImZ1bmN0aW9ucyIKLQkJaWYgYXJnbGlzdDoKLQkJCXQsIG4sIG0gPSBhcmdsaXN0WzBdCi0JCQlpZiB0IGluICgiV2luZG93UHRyIiwgIldpbmRvd1BlZWsiLCAiV2luZG93UmVmIikgYW5kIG0gPT0gIkluTW9kZSI6Ci0JCQkJY2xhc3NuYW1lID0gIk1ldGhvZCIKLQkJCQlsaXN0bmFtZSA9ICJtZXRob2RzIgotCQlyZXR1cm4gY2xhc3NuYW1lLCBsaXN0bmFtZQorICAgIGRlZiBkZXN0aW5hdGlvbihzZWxmLCB0eXBlLCBuYW1lLCBhcmdsaXN0KToKKyAgICAgICAgY2xhc3NuYW1lID0gIkZ1bmN0aW9uIgorICAgICAgICBsaXN0bmFtZSA9ICJmdW5jdGlvbnMiCisgICAgICAgIGlmIGFyZ2xpc3Q6CisgICAgICAgICAgICB0LCBuLCBtID0gYXJnbGlzdFswXQorICAgICAgICAgICAgaWYgdCBpbiAoIldpbmRvd1B0ciIsICJXaW5kb3dQZWVrIiwgIldpbmRvd1JlZiIpIGFuZCBtID09ICJJbk1vZGUiOgorICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9ICJNZXRob2QiCisgICAgICAgICAgICAgICAgbGlzdG5hbWUgPSAibWV0aG9kcyIKKyAgICAgICAgcmV0dXJuIGNsYXNzbmFtZSwgbGlzdG5hbWUKIAotCWRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJmYWxzZSA9IDBcbiIpCi0JCXNlbGYuZGVmc2ZpbGUud3JpdGUoInRydWUgPSAxXG4iKQotCQlzZWxmLmRlZnNmaWxlLndyaXRlKCJrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUgPSAweDgwMDAwMDAwXG4iKQorICAgIGRlZiB3cml0ZWluaXRpYWxkZWZzKHNlbGYpOgorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJkZWYgRk9VUl9DSEFSX0NPREUoeCk6IHJldHVybiB4XG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJmYWxzZSA9IDBcbiIpCisgICAgICAgIHNlbGYuZGVmc2ZpbGUud3JpdGUoInRydWUgPSAxXG4iKQorICAgICAgICBzZWxmLmRlZnNmaWxlLndyaXRlKCJrV2luZG93Tm9Db25zdHJhaW5BdHRyaWJ1dGUgPSAweDgwMDAwMDAwXG4iKQogCi0JZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCSdEaXNwb3NlV2luZG93JywgIyBJbXBsaWVkIHdoZW4gdGhlIG9iamVjdCBpcyBkZWxldGVkCi0JCQknQ2xvc2VXaW5kb3cnLAotCQkJJ1NldFdpbmRvd1Byb3BlcnR5JywJIyBGb3IgdGhlIG1vbWVudAotCQkJJ0dldFdpbmRvd1Byb3BlcnR5JywKLQkJCSdHZXRXaW5kb3dQcm9wZXJ0eVNpemUnLAotCQkJJ1JlbW92ZVdpbmRvd1Byb3BlcnR5JywKLQkJCSdNYWNDbG9zZVdpbmRvdycsCi0JCQknR2V0V2luZG93TGlzdCcsICMgRG9uJ3Qga25vdyB3aGV0aGVyIHRoaXMgaXMgc2FmZS4uLgotCQkJIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucwotCQkJJ2tNb3VzZVVwT3V0T2ZTbG9wJywKLQkJCSdrQWxsV2luZG93Q2xhc3NlcycsCi0JCQkna1dpbmRvd05vQ29uc3RyYWluQXR0cmlidXRlJywKLQkJCSMgT1M4IG9ubHk6Ci0JCQknR2V0QXV4V2luJywKLQkJCSdHZXRXaW5kb3dEYXRhSGFuZGxlJywKLQkJCSdTYXZlT2xkJywKLQkJCSdEcmF3TmV3JywKLQkJCSdTZXRXaW5Db2xvcicsCi0JCQknU2V0RGVza0NQYXQnLAotCQkJJ0luaXRXaW5kb3dzJywKLQkJCSdJbml0RmxvYXRpbmdXaW5kb3dzJywKLQkJCSdHZXRXTWdyUG9ydCcsCi0JCQknR2V0Q1dNZ3JQb3J0JywKLQkJCSdWYWxpZFJnbicsCQkjIFVzZSB2ZXJzaW9ucyB3aXRoIFdpbmRvdyBpbiB0aGVpciBuYW1lCi0JCQknVmFsaWRSZWN0JywKLQkJCSdJbnZhbFJnbicsCi0JCQknSW52YWxSZWN0JywKLQkJCSdJc1ZhbGlkV2luZG93UHRyJywgIyBJIHRoaW5rIHRoaXMgaXMgdXNlbGVzcyBmb3IgUHl0aG9uLCBidXQgbm90IHN1cmUuLi4KLQkJCSdHZXRXaW5kb3dab29tRmxhZycsCSMgTm90IGF2YWlsYWJsZSBpbiBDYXJib24KLQkJCSdHZXRXaW5kb3dUaXRsZVdpZHRoJywJIyBEaXR0bwotCQkJJ0dldFdpbmRvd0dvQXdheUZsYWcnLAotCQkJJ0dldFdpbmRvd1NwYXJlRmxhZycsCi0JCQldCi0JCQkJCQkKLQlkZWYgbWFrZWJsYWNrbGlzdHR5cGVzKHNlbGYpOgotCQlyZXR1cm4gWwotCQkJJ1Byb2NQdHInLAotCQkJJ0RyYWdHcmF5UmduVVBQJywKLQkJCSdXaW5kb3dQYWludFVQUCcsCi0JCQknQ29sbGVjdGlvbicsCQkjIEZvciBub3csIHRvIGJlIGRvbmUgbGF0ZXIKLQkJCSdXaW5kb3dEZWZTcGVjJywJIyBUb28gZGlmZmljdWx0IGZvciBub3cKLQkJCSdXaW5kb3dEZWZTcGVjX3B0cicsCi0JCQknRXZlbnRSZWYnLCAjVEJECi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3RuYW1lcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnRGlzcG9zZVdpbmRvdycsICMgSW1wbGllZCB3aGVuIHRoZSBvYmplY3QgaXMgZGVsZXRlZAorICAgICAgICAgICAgICAgICdDbG9zZVdpbmRvdycsCisgICAgICAgICAgICAgICAgJ1NldFdpbmRvd1Byb3BlcnR5JywgICAgIyBGb3IgdGhlIG1vbWVudAorICAgICAgICAgICAgICAgICdHZXRXaW5kb3dQcm9wZXJ0eScsCisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd1Byb3BlcnR5U2l6ZScsCisgICAgICAgICAgICAgICAgJ1JlbW92ZVdpbmRvd1Byb3BlcnR5JywKKyAgICAgICAgICAgICAgICAnTWFjQ2xvc2VXaW5kb3cnLAorICAgICAgICAgICAgICAgICdHZXRXaW5kb3dMaXN0JywgIyBEb24ndCBrbm93IHdoZXRoZXIgdGhpcyBpcyBzYWZlLi4uCisgICAgICAgICAgICAgICAgIyBDb25zdGFudHMgd2l0aCBmdW5ueSBkZWZpbml0aW9ucworICAgICAgICAgICAgICAgICdrTW91c2VVcE91dE9mU2xvcCcsCisgICAgICAgICAgICAgICAgJ2tBbGxXaW5kb3dDbGFzc2VzJywKKyAgICAgICAgICAgICAgICAna1dpbmRvd05vQ29uc3RyYWluQXR0cmlidXRlJywKKyAgICAgICAgICAgICAgICAjIE9TOCBvbmx5OgorICAgICAgICAgICAgICAgICdHZXRBdXhXaW4nLAorICAgICAgICAgICAgICAgICdHZXRXaW5kb3dEYXRhSGFuZGxlJywKKyAgICAgICAgICAgICAgICAnU2F2ZU9sZCcsCisgICAgICAgICAgICAgICAgJ0RyYXdOZXcnLAorICAgICAgICAgICAgICAgICdTZXRXaW5Db2xvcicsCisgICAgICAgICAgICAgICAgJ1NldERlc2tDUGF0JywKKyAgICAgICAgICAgICAgICAnSW5pdFdpbmRvd3MnLAorICAgICAgICAgICAgICAgICdJbml0RmxvYXRpbmdXaW5kb3dzJywKKyAgICAgICAgICAgICAgICAnR2V0V01nclBvcnQnLAorICAgICAgICAgICAgICAgICdHZXRDV01nclBvcnQnLAorICAgICAgICAgICAgICAgICdWYWxpZFJnbicsICAgICAgICAgICAgICMgVXNlIHZlcnNpb25zIHdpdGggV2luZG93IGluIHRoZWlyIG5hbWUKKyAgICAgICAgICAgICAgICAnVmFsaWRSZWN0JywKKyAgICAgICAgICAgICAgICAnSW52YWxSZ24nLAorICAgICAgICAgICAgICAgICdJbnZhbFJlY3QnLAorICAgICAgICAgICAgICAgICdJc1ZhbGlkV2luZG93UHRyJywgIyBJIHRoaW5rIHRoaXMgaXMgdXNlbGVzcyBmb3IgUHl0aG9uLCBidXQgbm90IHN1cmUuLi4KKyAgICAgICAgICAgICAgICAnR2V0V2luZG93Wm9vbUZsYWcnLCAgICAjIE5vdCBhdmFpbGFibGUgaW4gQ2FyYm9uCisgICAgICAgICAgICAgICAgJ0dldFdpbmRvd1RpdGxlV2lkdGgnLCAgIyBEaXR0bworICAgICAgICAgICAgICAgICdHZXRXaW5kb3dHb0F3YXlGbGFnJywKKyAgICAgICAgICAgICAgICAnR2V0V2luZG93U3BhcmVGbGFnJywKKyAgICAgICAgICAgICAgICBdCiAKLQlkZWYgbWFrZXJlcGFpcmluc3RydWN0aW9ucyhzZWxmKToKLQkJcmV0dXJuIFsKLQkJCQotCQkJIyBHZXRXVGl0bGUKLQkJCShbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCi0JCQkgWygiKiIsICIqIiwgIk91dE1vZGUiKV0pLAotCQkJCi0JCQkoWygidm9pZF9wdHIiLCAiKiIsICJJbk1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIildLAotCQkJIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIioiLCAiT3V0TW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKSwKLQkJCSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoImxvbmciLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCi0JCQkKLQkJCShbKCJ2b2lkIiwgIndTdG9yYWdlIiwgIk91dE1vZGUiKV0sCi0JCQkgWygiTnVsbFN0b3JhZ2UiLCAiKiIsICJJbk1vZGUiKV0pLAotCQkJCi0JCQkjIG1hdGNoIEZpbmRXaW5kb3dPZkNsYXNzCi0JCQkoWygiV2luZG93UmVmIiwgIm91dFdpbmRvdyIsICJPdXRNb2RlIiksICgiV2luZG93UGFydENvZGUiLCAib3V0V2luZG93UGFydCIsICJPdXRNb2RlIildLAotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiT3V0TW9kZSIpLCAoIldpbmRvd1BhcnRDb2RlIiwgIm91dFdpbmRvd1BhcnQiLCAiT3V0TW9kZSIpXSksCi0JCSAgICAjIHRoZW4gbWF0Y2ggQ3JlYXRlTmV3V2luZG93IGFuZCBDcmVhdGVXaW5kb3dGcm9tUmVzb3VyY2UKLQkJCShbKCJXaW5kb3dSZWYiLCAib3V0V2luZG93IiwgIk91dE1vZGUiKV0sCi0JCQkgWygiV2luZG93UmVmIiwgIioiLCAiKiIpXSksCi0JCQkKLQkJCShbKCJXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIildLAotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiV2luZG93UmVmIiwgIioiLCAiT3V0TW9kZSIpXSwJIyBTYW1lLCBidXQgb3RoZXIgc3R5bGUgaGVhZGVyZmlsZXMKLQkJCSBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAotCQkJCi0JCQkoWygiV2luZG93UHRyIiwgIkZyb250V2luZG93IiwgIlJldHVybk1vZGUiKV0sCi0JCQkgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICIqIildKSwKLQkJCShbKCJXaW5kb3dSZWYiLCAiRnJvbnRXaW5kb3ciLCAiUmV0dXJuTW9kZSIpXSwJIyBEaXR0bwotCQkJIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCi0JCQkoWygiV2luZG93UHRyIiwgIkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciLCAiUmV0dXJuTW9kZSIpXSwKLQkJCSBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAotCQkJKFsoIldpbmRvd1JlZiIsICJGcm9udE5vbkZsb2F0aW5nV2luZG93IiwgIlJldHVybk1vZGUiKV0sCSMgRGl0dG8KLQkJCSBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAotCQkJIAotCQkJKFsoIlJlY3RfcHRyIiwgIioiLCAiUmV0dXJuTW9kZSIpXSwgIyBHZXRXaW5kb3dYWFhTdGF0ZSBhY2Nlc3NvcnMKLQkJCSBbKCJ2b2lkIiwgIioiLCAiUmV0dXJuTW9kZSIpXSksCi0JCQldCisgICAgZGVmIG1ha2VibGFja2xpc3R0eXBlcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIFsKKyAgICAgICAgICAgICAgICAnUHJvY1B0cicsCisgICAgICAgICAgICAgICAgJ0RyYWdHcmF5UmduVVBQJywKKyAgICAgICAgICAgICAgICAnV2luZG93UGFpbnRVUFAnLAorICAgICAgICAgICAgICAgICdDb2xsZWN0aW9uJywgICAgICAgICAgICMgRm9yIG5vdywgdG8gYmUgZG9uZSBsYXRlcgorICAgICAgICAgICAgICAgICdXaW5kb3dEZWZTcGVjJywgICAgICAgICMgVG9vIGRpZmZpY3VsdCBmb3Igbm93CisgICAgICAgICAgICAgICAgJ1dpbmRvd0RlZlNwZWNfcHRyJywKKyAgICAgICAgICAgICAgICAnRXZlbnRSZWYnLCAjVEJECisgICAgICAgICAgICAgICAgXQorCisgICAgZGVmIG1ha2VyZXBhaXJpbnN0cnVjdGlvbnMoc2VsZik6CisgICAgICAgIHJldHVybiBbCisKKyAgICAgICAgICAgICAgICAjIEdldFdUaXRsZQorICAgICAgICAgICAgICAgIChbKCJTdHIyNTUiLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIioiLCAiKiIsICJPdXRNb2RlIildKSwKKworICAgICAgICAgICAgICAgIChbKCJ2b2lkX3B0ciIsICIqIiwgIkluTW9kZSIpLCAoImxvbmciLCAiKiIsICJJbk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkluQnVmZmVyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICIqIiwgIk91dE1vZGUiKSwgKCJsb25nIiwgIioiLCAiSW5Nb2RlIiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgibG9uZyIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIlZhclZhck91dEJ1ZmZlciIsICIqIiwgIkluT3V0TW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAoWygidm9pZCIsICJ3U3RvcmFnZSIsICJPdXRNb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJOdWxsU3RvcmFnZSIsICIqIiwgIkluTW9kZSIpXSksCisKKyAgICAgICAgICAgICAgICAjIG1hdGNoIEZpbmRXaW5kb3dPZkNsYXNzCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1JlZiIsICJvdXRXaW5kb3ciLCAiT3V0TW9kZSIpLCAoIldpbmRvd1BhcnRDb2RlIiwgIm91dFdpbmRvd1BhcnQiLCAiT3V0TW9kZSIpXSwKKyAgICAgICAgICAgICAgICAgWygiRXhpc3RpbmdXaW5kb3dQdHIiLCAiKiIsICJPdXRNb2RlIiksICgiV2luZG93UGFydENvZGUiLCAib3V0V2luZG93UGFydCIsICJPdXRNb2RlIildKSwKKyAgICAgICAgICAgICMgdGhlbiBtYXRjaCBDcmVhdGVOZXdXaW5kb3cgYW5kIENyZWF0ZVdpbmRvd0Zyb21SZXNvdXJjZQorICAgICAgICAgICAgICAgIChbKCJXaW5kb3dSZWYiLCAib3V0V2luZG93IiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIldpbmRvd1JlZiIsICIqIiwgIioiKV0pLAorCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1B0ciIsICIqIiwgIk91dE1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1JlZiIsICIqIiwgIk91dE1vZGUiKV0sICAgICAgICMgU2FtZSwgYnV0IG90aGVyIHN0eWxlIGhlYWRlcmZpbGVzCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiV2luZG93UHRyIiwgIkZyb250V2luZG93IiwgIlJldHVybk1vZGUiKV0sCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisgICAgICAgICAgICAgICAgKFsoIldpbmRvd1JlZiIsICJGcm9udFdpbmRvdyIsICJSZXR1cm5Nb2RlIildLCAgIyBEaXR0bworICAgICAgICAgICAgICAgICBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAorICAgICAgICAgICAgICAgIChbKCJXaW5kb3dQdHIiLCAiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIsICJSZXR1cm5Nb2RlIildLAorICAgICAgICAgICAgICAgICBbKCJFeGlzdGluZ1dpbmRvd1B0ciIsICIqIiwgIioiKV0pLAorICAgICAgICAgICAgICAgIChbKCJXaW5kb3dSZWYiLCAiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIsICJSZXR1cm5Nb2RlIildLCAgICAgICAjIERpdHRvCisgICAgICAgICAgICAgICAgIFsoIkV4aXN0aW5nV2luZG93UHRyIiwgIioiLCAiKiIpXSksCisKKyAgICAgICAgICAgICAgICAoWygiUmVjdF9wdHIiLCAiKiIsICJSZXR1cm5Nb2RlIildLCAjIEdldFdpbmRvd1hYWFN0YXRlIGFjY2Vzc29ycworICAgICAgICAgICAgICAgICBbKCJ2b2lkIiwgIioiLCAiUmV0dXJuTW9kZSIpXSksCisgICAgICAgICAgICAgICAgXQogCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgotCW1haW4oKQotCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvTW9kdWxlcy93aW4vd2luc3VwcG9ydC5weSBiL01hYy9Nb2R1bGVzL3dpbi93aW5zdXBwb3J0LnB5CmluZGV4IDY0MGUzM2EuLjA4YTAzNzkgMTAwNjQ0Ci0tLSBhL01hYy9Nb2R1bGVzL3dpbi93aW5zdXBwb3J0LnB5CisrKyBiL01hYy9Nb2R1bGVzL3dpbi93aW5zdXBwb3J0LnB5CkBAIC02LDE3ICs2LDE3IEBACiBpbXBvcnQgc3RyaW5nCiAKICMgRGVjbGFyYXRpb25zIHRoYXQgY2hhbmdlIGZvciBlYWNoIG1hbmFnZXIKLU1BQ0hFQURFUkZJTEUgPSAnV2luZG93cy5oJwkJIyBUaGUgQXBwbGUgaGVhZGVyIGZpbGUKLU1PRE5BTUUgPSAnX1dpbicJCQkJIyBUaGUgbmFtZSBvZiB0aGUgbW9kdWxlCi1PQkpFQ1ROQU1FID0gJ1dpbmRvdycJCQkjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQorTUFDSEVBREVSRklMRSA9ICdXaW5kb3dzLmgnICAgICAgICAgICAgICMgVGhlIEFwcGxlIGhlYWRlciBmaWxlCitNT0ROQU1FID0gJ19XaW4nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjIFRoZSBuYW1lIG9mIHRoZSBtb2R1bGUKK09CSkVDVE5BTUUgPSAnV2luZG93JyAgICAgICAgICAgICAgICAgICAjIFRoZSBiYXNpYyBuYW1lIG9mIHRoZSBvYmplY3RzIHVzZWQgaGVyZQogCiAjIFRoZSBmb2xsb3dpbmcgaXMgKnVzdWFsbHkqIHVuY2hhbmdlZCBidXQgbWF5IHN0aWxsIHJlcXVpcmUgdHVuaW5nCi1NT0RQUkVGSVggPSAnV2luJwkJCSMgVGhlIHByZWZpeCBmb3IgbW9kdWxlLXdpZGUgcm91dGluZXMKLU9CSkVDVFRZUEUgPSBPQkpFQ1ROQU1FICsgJ1B0cicJCSMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCi1PQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJwkjIFRoZSBwcmVmaXggZm9yIG9iamVjdCBtZXRob2RzCitNT0RQUkVGSVggPSAnV2luJyAgICAgICAgICAgICAgICAgICAgICAgIyBUaGUgcHJlZml4IGZvciBtb2R1bGUtd2lkZSByb3V0aW5lcworT0JKRUNUVFlQRSA9IE9CSkVDVE5BTUUgKyAnUHRyJyAgICAgICAgICMgVGhlIEMgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCB0aGVtCitPQkpFQ1RQUkVGSVggPSBNT0RQUkVGSVggKyAnT2JqJyAgICAgICAgIyBUaGUgcHJlZml4IGZvciBvYmplY3QgbWV0aG9kcwogSU5QVVRGSUxFID0gc3RyaW5nLmxvd2VyKE1PRFBSRUZJWCkgKyAnZ2VuLnB5JyAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGUgc2Nhbm5lcgogRURJVEZJTEUgPSBzdHJpbmcubG93ZXIoTU9EUFJFRklYKSArICdlZGl0LnB5JyAjIFRoZSBtYW51YWwgZGVmaW5pdGlvbnMKLU9VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIgkjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KK09VVFBVVEZJTEUgPSBNT0ROQU1FICsgIm1vZHVsZS5jIiAgICAgICAjIFRoZSBmaWxlIGdlbmVyYXRlZCBieSB0aGlzIHByb2dyYW0KIAogZnJvbSBtYWNzdXBwb3J0IGltcG9ydCAqCiAKQEAgLTc5LDcgKzc5LDcgQEAKIHN0YXRpYyB2b2lkCiBQeU1hY19BdXRvRGlzcG9zZVdpbmRvdyhXaW5kb3dQdHIgdykKIHsKLQlEaXNwb3NlV2luZG93KHcpOworICAgICAgICBEaXNwb3NlV2luZG93KHcpOwogfQogIiIiCiAKQEAgLTg5LDk0ICs4OSw5NCBAQAogUHlPYmplY3QgKgogV2luT2JqX1doaWNoV2luZG93KFdpbmRvd1B0ciB3KQogewotCVB5T2JqZWN0ICppdDsKLQkKLQlpZiAodyA9PSBOVUxMKSB7Ci0JCWl0ID0gUHlfTm9uZTsKLQkJUHlfSU5DUkVGKGl0KTsKLQl9IGVsc2UgewotCQlpdCA9IChQeU9iamVjdCAqKSBHZXRXUmVmQ29uKHcpOwotCQlpZiAoaXQgPT0gTlVMTCB8fCAhSXNQb2ludGVyVmFsaWQoKFB0cilpdCkgfHwgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2l0c2VsZiAhPSB3IHx8ICFXaW5PYmpfQ2hlY2soaXQpKSB7Ci0JCQlpdCA9IFdpbk9ial9OZXcodyk7Ci0JCQkoKFdpbmRvd09iamVjdCAqKWl0KS0+b2JfZnJlZWl0ID0gTlVMTDsKLQkJfSBlbHNlIHsKLQkJCVB5X0lOQ1JFRihpdCk7Ci0JCX0KLQl9Ci0JcmV0dXJuIGl0OworICAgICAgICBQeU9iamVjdCAqaXQ7CisKKyAgICAgICAgaWYgKHcgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGl0ID0gUHlfTm9uZTsKKyAgICAgICAgICAgICAgICBQeV9JTkNSRUYoaXQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGl0ID0gKFB5T2JqZWN0ICopIEdldFdSZWZDb24odyk7CisgICAgICAgICAgICAgICAgaWYgKGl0ID09IE5VTEwgfHwgIUlzUG9pbnRlclZhbGlkKChQdHIpaXQpIHx8ICgoV2luZG93T2JqZWN0ICopaXQpLT5vYl9pdHNlbGYgIT0gdyB8fCAhV2luT2JqX0NoZWNrKGl0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaXQgPSBXaW5PYmpfTmV3KHcpOworICAgICAgICAgICAgICAgICAgICAgICAgKChXaW5kb3dPYmplY3QgKilpdCktPm9iX2ZyZWVpdCA9IE5VTEw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFB5X0lOQ1JFRihpdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiBpdDsKIH0KICIiIgogCiBpbml0c3R1ZmYgPSBpbml0c3R1ZmYgKyAiIiIKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX05FVyhXaW5kb3dQdHIsIFdpbk9ial9OZXcpOwotCVB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX1doaWNoV2luZG93KTsKLQlQeU1hY19JTklUX1RPT0xCT1hfT0JKRUNUX0NPTlZFUlQoV2luZG93UHRyLCBXaW5PYmpfQ29udmVydCk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX05ldyk7CisgICAgICAgIFB5TWFjX0lOSVRfVE9PTEJPWF9PQkpFQ1RfTkVXKFdpbmRvd1B0ciwgV2luT2JqX1doaWNoV2luZG93KTsKKyAgICAgICAgUHlNYWNfSU5JVF9UT09MQk9YX09CSkVDVF9DT05WRVJUKFdpbmRvd1B0ciwgV2luT2JqX0NvbnZlcnQpOwogIiIiCiAKIGNsYXNzIE15T2JqZWN0RGVmaW5pdGlvbihQRVAyNTNNaXhpbiwgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbik6Ci0JZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgotCQlPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQotCQlPdXRwdXQoIi8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBXaGljaFdpbmRvdyBjb2RlIGhlcmU/ICovIikKLQlkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKLQkJR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoJXMgcHRyKTsiLCBzZWxmLml0c2VsZnR5cGUpCi0JZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgotCQlHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCi0JCU91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKLQkJT3V0cHV0KCJpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOyIpCi0JCU91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OyIpCi0JCU91dFJicmFjZSgpCi0JZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKLQkJT3V0KCIiIgotCQlpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9Ci0JCWlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KLQkJIiIiKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoIkRpYWxvZ1JlZiBkbGc7IikKLQkJT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NvbnZlcnQodiwgJmRsZykgJiYgZGxnKSIpCi0JCU91dHB1dCgiKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7IikKLQkJT3V0cHV0KCJyZXR1cm4gMTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKLQkJT3V0UmJyYWNlKCkKLQlkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6Ci0JCU91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJTZXRXUmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgMCk7IikKLQkJT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsiKQotCQlPdXRSYnJhY2UoKQotCQlPdXRwdXQoInNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7IikKLQkJT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOyIpCi0JCQotCWRlZiBvdXRwdXRDb21wYXJlKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBpbnQgJXNfY29tcGFyZSglcyAqc2VsZiwgJXMgKm90aGVyKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUsIHNlbGYub2JqZWN0dHlwZSkKLQkJT3V0TGJyYWNlKCkKLQkJT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA+IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gMTsiKQotCQlPdXRwdXQoImlmICggc2VsZi0+b2JfaXRzZWxmIDwgb3RoZXItPm9iX2l0c2VsZiApIHJldHVybiAtMTsiKQotCQlPdXRwdXQoInJldHVybiAwOyIpCi0JCU91dFJicmFjZSgpCi0JCQotCWRlZiBvdXRwdXRIYXNoKHNlbGYpOgotCQlPdXRwdXQoKQotCQlPdXRwdXQoInN0YXRpYyBpbnQgJXNfaGFzaCglcyAqc2VsZikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlKQotCQlPdXRMYnJhY2UoKQotCQlPdXRwdXQoInJldHVybiAoaW50KXNlbGYtPm9iX2l0c2VsZjsiKQotCQlPdXRSYnJhY2UoKQotCQkKLQlkZWYgb3V0cHV0UmVwcihzZWxmKToKLQkJT3V0cHV0KCkKLQkJT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCi0JCU91dExicmFjZSgpCi0JCU91dHB1dCgiY2hhciBidWZbMTAwXTsiKQotCQlPdXRwdXQoIiIic3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKLQkJT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCi0JCU91dFJicmFjZSgpCi0JCQotIyMJZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKLSMjCQlPdXRwdXQoIkRpc3Bvc2VXaW5kb3coJXMpOyIsIGl0c2VsZm5hbWUpCisgICAgZGVmIG91dHB1dENoZWNrTmV3QXJnKHNlbGYpOgorICAgICAgICBPdXRwdXQoImlmIChpdHNlbGYgPT0gTlVMTCkgcmV0dXJuIFB5TWFjX0Vycm9yKHJlc05vdEZvdW5kKTsiKQorICAgICAgICBPdXRwdXQoIi8qIFhYWFggT3Igc2hvdWxkIHdlIHVzZSBXaGljaFdpbmRvdyBjb2RlIGhlcmU/ICovIikKKyAgICBkZWYgb3V0cHV0U3RydWN0TWVtYmVycyhzZWxmKToKKyAgICAgICAgR2xvYmFsT2JqZWN0RGVmaW5pdGlvbi5vdXRwdXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgidm9pZCAoKm9iX2ZyZWVpdCkoJXMgcHRyKTsiLCBzZWxmLml0c2VsZnR5cGUpCisgICAgZGVmIG91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpOgorICAgICAgICBHbG9iYWxPYmplY3REZWZpbml0aW9uLm91dHB1dEluaXRTdHJ1Y3RNZW1iZXJzKHNlbGYpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoR2V0V1JlZkNvbihpdHNlbGYpID09IDApIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJTZXRXUmVmQ29uKGl0c2VsZiwgKGxvbmcpaXQpOyIpCisgICAgICAgIE91dHB1dCgiaXQtPm9iX2ZyZWVpdCA9IFB5TWFjX0F1dG9EaXNwb3NlV2luZG93OyIpCisgICAgICAgIE91dFJicmFjZSgpCisgICAgZGVmIG91dHB1dENoZWNrQ29udmVydEFyZyhzZWxmKToKKyAgICAgICAgT3V0KCIiIgorICAgICAgICBpZiAodiA9PSBQeV9Ob25lKSB7ICpwX2l0c2VsZiA9IE5VTEw7IHJldHVybiAxOyB9CisgICAgICAgIGlmIChQeUludF9DaGVjayh2KSkgeyAqcF9pdHNlbGYgPSAoV2luZG93UHRyKVB5SW50X0FzTG9uZyh2KTsgcmV0dXJuIDE7IH0KKyAgICAgICAgIiIiKQorICAgICAgICBPdXRMYnJhY2UoKQorICAgICAgICBPdXRwdXQoIkRpYWxvZ1JlZiBkbGc7IikKKyAgICAgICAgT3V0TGJyYWNlKCJpZiAoRGxnT2JqX0NvbnZlcnQodiwgJmRsZykgJiYgZGxnKSIpCisgICAgICAgIE91dHB1dCgiKnBfaXRzZWxmID0gR2V0RGlhbG9nV2luZG93KGRsZyk7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoIlB5RXJyX0NsZWFyKCk7IikKKyAgICAgICAgT3V0UmJyYWNlKCkKKyAgICBkZWYgb3V0cHV0Q2xlYW51cFN0cnVjdE1lbWJlcnMoc2VsZik6CisgICAgICAgIE91dHB1dCgiaWYgKHNlbGYtPm9iX2ZyZWVpdCAmJiBzZWxmLT5vYl9pdHNlbGYpIikKKyAgICAgICAgT3V0TGJyYWNlKCkKKyAgICAgICAgT3V0cHV0KCJTZXRXUmVmQ29uKHNlbGYtPm9iX2l0c2VsZiwgMCk7IikKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQoc2VsZi0+b2JfaXRzZWxmKTsiKQorICAgICAgICBPdXRSYnJhY2UoKQorICAgICAgICBPdXRwdXQoInNlbGYtPm9iX2l0c2VsZiA9IE5VTEw7IikKKyAgICAgICAgT3V0cHV0KCJzZWxmLT5vYl9mcmVlaXQgPSBOVUxMOyIpCisKKyAgICBkZWYgb3V0cHV0Q29tcGFyZShzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgaW50ICVzX2NvbXBhcmUoJXMgKnNlbGYsICVzICpvdGhlcikiLCBzZWxmLnByZWZpeCwgc2VsZi5vYmplY3R0eXBlLCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiaWYgKCBzZWxmLT5vYl9pdHNlbGYgPiBvdGhlci0+b2JfaXRzZWxmICkgcmV0dXJuIDE7IikKKyAgICAgICAgT3V0cHV0KCJpZiAoIHNlbGYtPm9iX2l0c2VsZiA8IG90aGVyLT5vYl9pdHNlbGYgKSByZXR1cm4gLTE7IikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gMDsiKQorICAgICAgICBPdXRSYnJhY2UoKQorCisgICAgZGVmIG91dHB1dEhhc2goc2VsZik6CisgICAgICAgIE91dHB1dCgpCisgICAgICAgIE91dHB1dCgic3RhdGljIGludCAlc19oYXNoKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgicmV0dXJuIChpbnQpc2VsZi0+b2JfaXRzZWxmOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyAgICBkZWYgb3V0cHV0UmVwcihzZWxmKToKKyAgICAgICAgT3V0cHV0KCkKKyAgICAgICAgT3V0cHV0KCJzdGF0aWMgUHlPYmplY3QgKiAlc19yZXByKCVzICpzZWxmKSIsIHNlbGYucHJlZml4LCBzZWxmLm9iamVjdHR5cGUpCisgICAgICAgIE91dExicmFjZSgpCisgICAgICAgIE91dHB1dCgiY2hhciBidWZbMTAwXTsiKQorICAgICAgICBPdXRwdXQoIiIic3ByaW50ZihidWYsICI8V2luZG93IG9iamVjdCBhdCAweCUlOC44eCBmb3IgMHglJTguOHg+IiwgKHVuc2lnbmVkKXNlbGYsICh1bnNpZ25lZClzZWxmLT5vYl9pdHNlbGYpOyIiIikKKyAgICAgICAgT3V0cHV0KCJyZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhidWYpOyIpCisgICAgICAgIE91dFJicmFjZSgpCisKKyMjICAgICAgZGVmIG91dHB1dEZyZWVJdChzZWxmLCBpdHNlbGZuYW1lKToKKyMjICAgICAgICAgICAgICBPdXRwdXQoIkRpc3Bvc2VXaW5kb3coJXMpOyIsIGl0c2VsZm5hbWUpCiAjIEZyb20gaGVyZSBvbiBpdCdzIGJhc2ljYWxseSBhbGwgYm9pbGVyIHBsYXRlLi4uCiAKICMgQ3JlYXRlIHRoZSBnZW5lcmF0b3IgZ3JvdXBzIGFuZCBsaW5rIHRoZW0KQEAgLTE5OSw3ICsxOTksNyBAQAogbG9uZyBwdHI7CiAKIGlmICggIVB5QXJnX1BhcnNlVHVwbGUoX2FyZ3MsICJpIiwgJnB0cikgKQotCXJldHVybiBOVUxMOworICAgICAgICByZXR1cm4gTlVMTDsKIF9yZXMgPSBXaW5PYmpfV2hpY2hXaW5kb3coKFdpbmRvd1B0cilwdHIpOwogcmV0dXJuIF9yZXM7CiAiIiIKZGlmZiAtLWdpdCBhL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvU3RhbmRhcmRfU3VpdGUucHkgYi9NYWMvT1NYL0RvYy9IZWxwSW5kZXhpbmdUb29sL1N0YW5kYXJkX1N1aXRlLnB5CmluZGV4IGU5ODZkNzUuLjRmNjYwNGMgMTAwNjQ0Ci0tLSBhL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvU3RhbmRhcmRfU3VpdGUucHkKKysrIGIvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9TdGFuZGFyZF9TdWl0ZS5weQpAQCAtMzA0LDkgKzMwNCw5IEBACiBkb2N1bWVudC5fcHJpdmVsZW1kaWN0ID0gewogfQogX0VudW1fc2F2byA9IHsKLSAgICAneWVzJyA6ICd5ZXMgJywJIyBTYXZlIG9iamVjdHMgbm93Ci0gICAgJ25vJyA6ICdubyAgJywJIyBEbyBub3Qgc2F2ZSBvYmplY3RzCi0gICAgJ2FzaycgOiAnYXNrICcsCSMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgdG8gc2F2ZQorICAgICd5ZXMnIDogJ3llcyAnLCAgICAgIyBTYXZlIG9iamVjdHMgbm93CisgICAgJ25vJyA6ICdubyAgJywgICAgICAjIERvIG5vdCBzYXZlIG9iamVjdHMKKyAgICAnYXNrJyA6ICdhc2sgJywgICAgICMgQXNrIHRoZSB1c2VyIHdoZXRoZXIgdG8gc2F2ZQogfQogCiAKZGlmZiAtLWdpdCBhL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvX19pbml0X18ucHkgYi9NYWMvT1NYL0RvYy9IZWxwSW5kZXhpbmdUb29sL19faW5pdF9fLnB5CmluZGV4IDI3NDUwODYuLjUzNTlkZjUgMTAwNjQ0Ci0tLSBhL01hYy9PU1gvRG9jL0hlbHBJbmRleGluZ1Rvb2wvX19pbml0X18ucHkKKysrIGIvTWFjL09TWC9Eb2MvSGVscEluZGV4aW5nVG9vbC9fX2luaXRfXy5weQpAQCAtNzYsNCArNzYsMyBAQAogICAgIF9zaWduYXR1cmUgPSAnaGl0aScKIAogICAgIF9tb2R1bGVOYW1lID0gJ0hlbHBJbmRleGluZ1Rvb2wnCi0KZGlmZiAtLWdpdCBhL01hYy9PU1gvRG9jL3NldHVwLnB5IGIvTWFjL09TWC9Eb2Mvc2V0dXAucHkKaW5kZXggNThkOGRmNi4uYWU4NmI4MCAxMDA2NDQKLS0tIGEvTWFjL09TWC9Eb2Mvc2V0dXAucHkKKysrIGIvTWFjL09TWC9Eb2Mvc2V0dXAucHkKQEAgLTI5LDE4MCArMjksMTgwIEBACiBpbXBvcnQgdGltZQogCiBjbGFzcyBEb2NCdWlsZChidWlsZCk6Ci0JZGVmIGluaXRpYWxpemVfb3B0aW9ucyhzZWxmKToKLQkJYnVpbGQuaW5pdGlhbGl6ZV9vcHRpb25zKHNlbGYpCi0JCXNlbGYuYnVpbGRfaHRtbCA9IE5vbmUKLQkJc2VsZi5idWlsZF9kZXN0ID0gTm9uZQotCQlzZWxmLmRvd25sb2FkID0gMAotCQlzZWxmLmRvY192ZXJzaW9uID0gJzIuM2IxJyAjIE9ubHkgbmVlZGVkIGlmIGRvd25sb2FkIGlzIHRydWUKLQkJCi0JZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6Ci0JCWJ1aWxkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKLQkJaWYgc2VsZi5idWlsZF9odG1sIGlzIE5vbmU6Ci0JCQlzZWxmLmJ1aWxkX2h0bWwgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLCAnaHRtbCcpCi0JCWlmIHNlbGYuYnVpbGRfZGVzdCBpcyBOb25lOgotCQkJc2VsZi5idWlsZF9kZXN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwgJ1B5dGhvbkRvY3VtZW50YXRpb24nKQotCQotCWRlZiBzcGF3bihzZWxmLCAqYXJncyk6Ci0JCXNwYXduKGFyZ3MsIDEsICBzZWxmLnZlcmJvc2UsIHNlbGYuZHJ5X3J1bikKLQkKLQlkZWYgZG93bmxvYWREb2NzKHNlbGYpOgotCQl3b3JrZGlyID0gb3MuZ2V0Y3dkKCkKLQkJdXJsID0gJ2h0dHA6Ly93d3cucHl0aG9uLm9yZy9mdHAvcHl0aG9uL2RvYy8lcy9odG1sLSVzLnRneicgJSBcCi0JCQkoc2VsZi5kb2NfdmVyc2lvbixzZWxmLmRvY192ZXJzaW9uKQotCQlvcy5jaGRpcihzZWxmLmJ1aWxkX2Jhc2UpCi0JCXNlbGYuc3Bhd24oJ2N1cmwnLCctTycsIHVybCkKLQkJb3MuY2hkaXIod29ya2RpcikKLQkJdGFyZmlsZSA9ICdodG1sLSVzLnRneicgJSBzZWxmLmRvY192ZXJzaW9uCi0jIyBUaGlzIG5vIGxvbmdlciB3b3JrcyBkdWUgdG8gbmFtZSBjaGFuZ2VzCi0jIwkJc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9odG1sKQotIyMJCW9zLmNoZGlyKHNlbGYuYnVpbGRfaHRtbCkKLSMjCQlzZWxmLnNwYXduKCd0YXInLCAnLXh6ZicsICcuLi8nICsgdGFyZmlsZSkKLSMjCQlvcy5jaGRpcih3b3JrZGlyKQotCQlwcmludCAiKiogUGxlYXNlIHVucGFjayAlcyIgJSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLCB0YXJmaWxlKQotCQlwcmludCAiKiogVW5wYWNrIHRoZSBmaWxlcyBpbnRvICVzIiAlIHNlbGYuYnVpbGRfaHRtbAotCQlyYWlzZSBSdW50aW1lRXJyb3IsICJZb3UgbmVlZCB0byB1bnBhY2sgdGhlIGRvY3MgbWFudWFsbHkiCi0JCQotCWRlZiBidWlsZERvY3NGcm9tU291cmNlKHNlbGYpOgotCQlzcmNkaXIgPSAnLi4vLi4vLi4nCi0JCWRvY2RpciA9IG9zLnBhdGguam9pbihzcmNkaXIsICdEb2MnKQotCQlodG1sZGlyID0gb3MucGF0aC5qb2luKGRvY2RpciwgJ2h0bWwnKQotCQlzcGF3bigoJ21ha2UnLCctLWRpcmVjdG9yeScsIGRvY2RpciwgJ2h0bWwnKSwgMSwgc2VsZi52ZXJib3NlLCBzZWxmLmRyeV9ydW4pCi0JCXNlbGYubWtwYXRoKHNlbGYuYnVpbGRfaHRtbCkKLQkJY29weV90cmVlKGh0bWxkaXIsIHNlbGYuYnVpbGRfaHRtbCkKLQkJCi0JZGVmIGVuc3VyZUh0bWwoc2VsZik6Ci0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzZWxmLmJ1aWxkX2h0bWwpOgotCQkJaWYgc2VsZi5kb3dubG9hZDoKLQkJCQlzZWxmLmRvd25sb2FkRG9jcygpCi0JCQllbHNlOgotCQkJCXNlbGYuYnVpbGREb2NzRnJvbVNvdXJjZSgpCi0JCQkJCi0JZGVmIGhhY2tJbmRleChzZWxmKToKLQkJaW5kX2h0bWwgPSAnaW5kZXguaHRtbCcKLQkJI3ByaW50ICdzZWxmLmJ1aWxkX2Rlc3QgPScsIHNlbGYuYnVpbGRfZGVzdAotCQloYWNrZWRJbmRleCA9IGZpbGUob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGVzdCwgaW5kX2h0bWwpLCd3JykKLQkJb3JpZ0luZGV4ID0gZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9odG1sLGluZF9odG1sKSkKLQkJciA9IHJlLmNvbXBpbGUoJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Lio8L3N0eWxlPicsIHJlLkRPVEFMTCkKLQkJaGFja2VkSW5kZXgud3JpdGUoci5zdWIoJzxNRVRBIE5BTUU9IkFwcGxlVGl0bGUiIENPTlRFTlQ9IlB5dGhvbiBEb2N1bWVudGF0aW9uIj4nLG9yaWdJbmRleC5yZWFkKCkpKQotCQotCWRlZiBoYWNrRmlsZShzZWxmLGQsZik6Ci0JCW9yaWdQYXRoID0gb3MucGF0aC5qb2luKGQsZikKLQkJYXNzZXJ0KG9yaWdQYXRoWzpsZW4oc2VsZi5idWlsZF9odG1sKV0gPT0gc2VsZi5idWlsZF9odG1sKQotCQlvdXRQYXRoID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGVzdCwgZFtsZW4oc2VsZi5idWlsZF9odG1sKSsxOl0sIGYpCi0JCShuYW1lLCBleHQpID0gb3MucGF0aC5zcGxpdGV4dChmKQotCQlpZiBvcy5wYXRoLmlzZGlyKG9yaWdQYXRoKToKLQkJCXNlbGYubWtwYXRoKG91dFBhdGgpCi0JCWVsaWYgZXh0ID09ICcuaHRtbCc6Ci0JCQlpZiBzZWxmLnZlcmJvc2U6IHByaW50ICdoYWNraW5nICVzIHRvICVzJyAlIChvcmlnUGF0aCxvdXRQYXRoKQotCQkJaGFja2VkRmlsZSA9IGZpbGUob3V0UGF0aCwgJ3cnKQotCQkJb3JpZ0ZpbGUgPSBmaWxlKG9yaWdQYXRoLCdyJykKLQkJCWhhY2tlZEZpbGUud3JpdGUoc2VsZi5yLnN1YignPGRsPjxkdD48ZGQ+Jywgb3JpZ0ZpbGUucmVhZCgpKSkKLQkJZWxzZToKLQkJCWNvcHlfZmlsZShvcmlnUGF0aCwgb3V0UGF0aCkKLQkJCQotCWRlZiBoYWNrSHRtbChzZWxmKToKLQkJc2VsZi5yID0gcmUuY29tcGlsZSgnPGRsPjxkZD4nKQotCQlvcy5wYXRoLndhbGsoc2VsZi5idWlsZF9odG1sLCBzZWxmLnZpc2l0LCBOb25lKQorICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGJ1aWxkLmluaXRpYWxpemVfb3B0aW9ucyhzZWxmKQorICAgICAgICBzZWxmLmJ1aWxkX2h0bWwgPSBOb25lCisgICAgICAgIHNlbGYuYnVpbGRfZGVzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5kb3dubG9hZCA9IDAKKyAgICAgICAgc2VsZi5kb2NfdmVyc2lvbiA9ICcyLjNiMScgIyBPbmx5IG5lZWRlZCBpZiBkb3dubG9hZCBpcyB0cnVlCiAKLQlkZWYgdmlzaXQoc2VsZiwgZHVtbXksIGRpcm5hbWUsIGZpbGVuYW1lcyk6Ci0JCWZvciBmIGluIGZpbGVuYW1lczoKLQkJCXNlbGYuaGFja0ZpbGUoZGlybmFtZSwgZikKLQkJCQotCWRlZiBtYWtlSGVscEluZGV4KHNlbGYpOgotCQlhcHAgPSAnL0RldmVsb3Blci9BcHBsaWNhdGlvbnMvQXBwbGUgSGVscCBJbmRleGluZyBUb29sLmFwcCcKLQkJc2VsZi5zcGF3bignb3BlbicsICctYScsIGFwcCAsIHNlbGYuYnVpbGRfZGVzdCkKLQkJcHJpbnQgIlBsZWFzZSB3YWl0IHVudGlsIEFwcGxlIEhlbHAgSW5kZXhpbmcgVG9vbCBmaW5pc2hlcyBiZWZvcmUgaW5zdGFsbGluZyIKLQkJCi0JZGVmIG1ha2VIZWxwSW5kZXgoc2VsZik6Ci0JCWFwcCA9IEhlbHBJbmRleGluZ1Rvb2wuSGVscEluZGV4aW5nVG9vbChzdGFydD0xKQotCQlhcHAub3BlbihDYXJib24uRmlsZS5GU1NwZWMoc2VsZi5idWlsZF9kZXN0KSkKLQkJc3lzLnN0ZGVyci53cml0ZSgiV2FpdGluZyBmb3IgSGVscCBJbmRleGluZyBUb29sIHRvIHN0YXJ0Li4uIikKLQkJd2hpbGUgMToKLQkJCSMgVGhpcyBpcyBiYWQgZGVzaWduIGluIHRoZSBzdWl0ZSBnZW5lcmF0aW9uIGNvZGUhCi0JCQlpZGxlID0gYXBwLl9nZXQoSGVscEluZGV4aW5nVG9vbC5IZWxwX0luZGV4aW5nX1Rvb2xfU3VpdGUuX1Byb3BfaWRsZVN0YXR1cygpKQotCQkJdGltZS5zbGVlcCgxMCkKLQkJCWlmIG5vdCBpZGxlOiBicmVhawotCQkJc3lzLnN0ZGVyci53cml0ZSgiLiIpCi0JCXN5cy5zdGRlcnIud3JpdGUoIlxuIikKLQkJc3lzLnN0ZGVyci53cml0ZSgiV2FpdGluZyBmb3IgSGVscCBJbmRleGluZyBUb29sIHRvIGZpbmlzaC4uLiIpCi0JCXdoaWxlIDE6Ci0JCQkjIFRoaXMgaXMgYmFkIGRlc2lnbiBpbiB0aGUgc3VpdGUgZ2VuZXJhdGlvbiBjb2RlIQotCQkJaWRsZSA9IGFwcC5fZ2V0KEhlbHBJbmRleGluZ1Rvb2wuSGVscF9JbmRleGluZ19Ub29sX1N1aXRlLl9Qcm9wX2lkbGVTdGF0dXMoKSkKLQkJCXRpbWUuc2xlZXAoMTApCi0JCQlpZiBpZGxlOiBicmVhawotCQkJc3lzLnN0ZGVyci53cml0ZSgiLiIpCi0JCXN5cy5zdGRlcnIud3JpdGUoIlxuIikKLQkJCQotCQkKLQlkZWYgcnVuKHNlbGYpOgotCQlzZWxmLmVuc3VyZV9maW5hbGl6ZWQoKQotCQlzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2Jhc2UpCi0JCXNlbGYuZW5zdXJlSHRtbCgpCi0JCWlmIG5vdCBvcy5wYXRoLmlzZGlyKHNlbGYuYnVpbGRfaHRtbCk6Ci0JCQlyYWlzZSBSdW50aW1lRXJyb3IsIFwKLSAgCQkJIkNhbid0IGZpbmQgc291cmNlIGZvbGRlciBmb3IgZG9jdW1lbnRhdGlvbi4iCi0gIAkJc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9kZXN0KQotCQlpZiBkZXBfdXRpbC5uZXdlcihvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9odG1sLCdpbmRleC5odG1sJyksIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Rlc3QsJ2luZGV4Lmh0bWwnKSk6Ci0JCQlzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2Rlc3QpCi0JCQlzZWxmLmhhY2tIdG1sKCkKLQkJCXNlbGYuaGFja0luZGV4KCkKLQkJCXNlbGYubWFrZUhlbHBJbmRleCgpCisgICAgZGVmIGZpbmFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIGJ1aWxkLmZpbmFsaXplX29wdGlvbnMoc2VsZikKKyAgICAgICAgaWYgc2VsZi5idWlsZF9odG1sIGlzIE5vbmU6CisgICAgICAgICAgICBzZWxmLmJ1aWxkX2h0bWwgPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9iYXNlLCAnaHRtbCcpCisgICAgICAgIGlmIHNlbGYuYnVpbGRfZGVzdCBpcyBOb25lOgorICAgICAgICAgICAgc2VsZi5idWlsZF9kZXN0ID0gb3MucGF0aC5qb2luKHNlbGYuYnVpbGRfYmFzZSwgJ1B5dGhvbkRvY3VtZW50YXRpb24nKQorCisgICAgZGVmIHNwYXduKHNlbGYsICphcmdzKToKKyAgICAgICAgc3Bhd24oYXJncywgMSwgIHNlbGYudmVyYm9zZSwgc2VsZi5kcnlfcnVuKQorCisgICAgZGVmIGRvd25sb2FkRG9jcyhzZWxmKToKKyAgICAgICAgd29ya2RpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIHVybCA9ICdodHRwOi8vd3d3LnB5dGhvbi5vcmcvZnRwL3B5dGhvbi9kb2MvJXMvaHRtbC0lcy50Z3onICUgXAorICAgICAgICAgICAgICAgIChzZWxmLmRvY192ZXJzaW9uLHNlbGYuZG9jX3ZlcnNpb24pCisgICAgICAgIG9zLmNoZGlyKHNlbGYuYnVpbGRfYmFzZSkKKyAgICAgICAgc2VsZi5zcGF3bignY3VybCcsJy1PJywgdXJsKQorICAgICAgICBvcy5jaGRpcih3b3JrZGlyKQorICAgICAgICB0YXJmaWxlID0gJ2h0bWwtJXMudGd6JyAlIHNlbGYuZG9jX3ZlcnNpb24KKyMjIFRoaXMgbm8gbG9uZ2VyIHdvcmtzIGR1ZSB0byBuYW1lIGNoYW5nZXMKKyMjICAgICAgICAgICAgICBzZWxmLm1rcGF0aChzZWxmLmJ1aWxkX2h0bWwpCisjIyAgICAgICAgICAgICAgb3MuY2hkaXIoc2VsZi5idWlsZF9odG1sKQorIyMgICAgICAgICAgICAgIHNlbGYuc3Bhd24oJ3RhcicsICcteHpmJywgJy4uLycgKyB0YXJmaWxlKQorIyMgICAgICAgICAgICAgIG9zLmNoZGlyKHdvcmtkaXIpCisgICAgICAgIHByaW50ICIqKiBQbGVhc2UgdW5wYWNrICVzIiAlIG9zLnBhdGguam9pbihzZWxmLmJ1aWxkX2Jhc2UsIHRhcmZpbGUpCisgICAgICAgIHByaW50ICIqKiBVbnBhY2sgdGhlIGZpbGVzIGludG8gJXMiICUgc2VsZi5idWlsZF9odG1sCisgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgIllvdSBuZWVkIHRvIHVucGFjayB0aGUgZG9jcyBtYW51YWxseSIKKworICAgIGRlZiBidWlsZERvY3NGcm9tU291cmNlKHNlbGYpOgorICAgICAgICBzcmNkaXIgPSAnLi4vLi4vLi4nCisgICAgICAgIGRvY2RpciA9IG9zLnBhdGguam9pbihzcmNkaXIsICdEb2MnKQorICAgICAgICBodG1sZGlyID0gb3MucGF0aC5qb2luKGRvY2RpciwgJ2h0bWwnKQorICAgICAgICBzcGF3bigoJ21ha2UnLCctLWRpcmVjdG9yeScsIGRvY2RpciwgJ2h0bWwnKSwgMSwgc2VsZi52ZXJib3NlLCBzZWxmLmRyeV9ydW4pCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuYnVpbGRfaHRtbCkKKyAgICAgICAgY29weV90cmVlKGh0bWxkaXIsIHNlbGYuYnVpbGRfaHRtbCkKKworICAgIGRlZiBlbnN1cmVIdG1sKHNlbGYpOgorICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoc2VsZi5idWlsZF9odG1sKToKKyAgICAgICAgICAgIGlmIHNlbGYuZG93bmxvYWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kb3dubG9hZERvY3MoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmJ1aWxkRG9jc0Zyb21Tb3VyY2UoKQorCisgICAgZGVmIGhhY2tJbmRleChzZWxmKToKKyAgICAgICAgaW5kX2h0bWwgPSAnaW5kZXguaHRtbCcKKyAgICAgICAgI3ByaW50ICdzZWxmLmJ1aWxkX2Rlc3QgPScsIHNlbGYuYnVpbGRfZGVzdAorICAgICAgICBoYWNrZWRJbmRleCA9IGZpbGUob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfZGVzdCwgaW5kX2h0bWwpLCd3JykKKyAgICAgICAgb3JpZ0luZGV4ID0gZmlsZShvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9odG1sLGluZF9odG1sKSkKKyAgICAgICAgciA9IHJlLmNvbXBpbGUoJzxzdHlsZSB0eXBlPSJ0ZXh0L2NzcyI+Lio8L3N0eWxlPicsIHJlLkRPVEFMTCkKKyAgICAgICAgaGFja2VkSW5kZXgud3JpdGUoci5zdWIoJzxNRVRBIE5BTUU9IkFwcGxlVGl0bGUiIENPTlRFTlQ9IlB5dGhvbiBEb2N1bWVudGF0aW9uIj4nLG9yaWdJbmRleC5yZWFkKCkpKQorCisgICAgZGVmIGhhY2tGaWxlKHNlbGYsZCxmKToKKyAgICAgICAgb3JpZ1BhdGggPSBvcy5wYXRoLmpvaW4oZCxmKQorICAgICAgICBhc3NlcnQob3JpZ1BhdGhbOmxlbihzZWxmLmJ1aWxkX2h0bWwpXSA9PSBzZWxmLmJ1aWxkX2h0bWwpCisgICAgICAgIG91dFBhdGggPSBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kZXN0LCBkW2xlbihzZWxmLmJ1aWxkX2h0bWwpKzE6XSwgZikKKyAgICAgICAgKG5hbWUsIGV4dCkgPSBvcy5wYXRoLnNwbGl0ZXh0KGYpCisgICAgICAgIGlmIG9zLnBhdGguaXNkaXIob3JpZ1BhdGgpOgorICAgICAgICAgICAgc2VsZi5ta3BhdGgob3V0UGF0aCkKKyAgICAgICAgZWxpZiBleHQgPT0gJy5odG1sJzoKKyAgICAgICAgICAgIGlmIHNlbGYudmVyYm9zZTogcHJpbnQgJ2hhY2tpbmcgJXMgdG8gJXMnICUgKG9yaWdQYXRoLG91dFBhdGgpCisgICAgICAgICAgICBoYWNrZWRGaWxlID0gZmlsZShvdXRQYXRoLCAndycpCisgICAgICAgICAgICBvcmlnRmlsZSA9IGZpbGUob3JpZ1BhdGgsJ3InKQorICAgICAgICAgICAgaGFja2VkRmlsZS53cml0ZShzZWxmLnIuc3ViKCc8ZGw+PGR0PjxkZD4nLCBvcmlnRmlsZS5yZWFkKCkpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgY29weV9maWxlKG9yaWdQYXRoLCBvdXRQYXRoKQorCisgICAgZGVmIGhhY2tIdG1sKHNlbGYpOgorICAgICAgICBzZWxmLnIgPSByZS5jb21waWxlKCc8ZGw+PGRkPicpCisgICAgICAgIG9zLnBhdGgud2FsayhzZWxmLmJ1aWxkX2h0bWwsIHNlbGYudmlzaXQsIE5vbmUpCisKKyAgICBkZWYgdmlzaXQoc2VsZiwgZHVtbXksIGRpcm5hbWUsIGZpbGVuYW1lcyk6CisgICAgICAgIGZvciBmIGluIGZpbGVuYW1lczoKKyAgICAgICAgICAgIHNlbGYuaGFja0ZpbGUoZGlybmFtZSwgZikKKworICAgIGRlZiBtYWtlSGVscEluZGV4KHNlbGYpOgorICAgICAgICBhcHAgPSAnL0RldmVsb3Blci9BcHBsaWNhdGlvbnMvQXBwbGUgSGVscCBJbmRleGluZyBUb29sLmFwcCcKKyAgICAgICAgc2VsZi5zcGF3bignb3BlbicsICctYScsIGFwcCAsIHNlbGYuYnVpbGRfZGVzdCkKKyAgICAgICAgcHJpbnQgIlBsZWFzZSB3YWl0IHVudGlsIEFwcGxlIEhlbHAgSW5kZXhpbmcgVG9vbCBmaW5pc2hlcyBiZWZvcmUgaW5zdGFsbGluZyIKKworICAgIGRlZiBtYWtlSGVscEluZGV4KHNlbGYpOgorICAgICAgICBhcHAgPSBIZWxwSW5kZXhpbmdUb29sLkhlbHBJbmRleGluZ1Rvb2woc3RhcnQ9MSkKKyAgICAgICAgYXBwLm9wZW4oQ2FyYm9uLkZpbGUuRlNTcGVjKHNlbGYuYnVpbGRfZGVzdCkpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhaXRpbmcgZm9yIEhlbHAgSW5kZXhpbmcgVG9vbCB0byBzdGFydC4uLiIpCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICAjIFRoaXMgaXMgYmFkIGRlc2lnbiBpbiB0aGUgc3VpdGUgZ2VuZXJhdGlvbiBjb2RlIQorICAgICAgICAgICAgaWRsZSA9IGFwcC5fZ2V0KEhlbHBJbmRleGluZ1Rvb2wuSGVscF9JbmRleGluZ19Ub29sX1N1aXRlLl9Qcm9wX2lkbGVTdGF0dXMoKSkKKyAgICAgICAgICAgIHRpbWUuc2xlZXAoMTApCisgICAgICAgICAgICBpZiBub3QgaWRsZTogYnJlYWsKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi4iKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJcbiIpCisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIldhaXRpbmcgZm9yIEhlbHAgSW5kZXhpbmcgVG9vbCB0byBmaW5pc2guLi4iKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgIyBUaGlzIGlzIGJhZCBkZXNpZ24gaW4gdGhlIHN1aXRlIGdlbmVyYXRpb24gY29kZSEKKyAgICAgICAgICAgIGlkbGUgPSBhcHAuX2dldChIZWxwSW5kZXhpbmdUb29sLkhlbHBfSW5kZXhpbmdfVG9vbF9TdWl0ZS5fUHJvcF9pZGxlU3RhdHVzKCkpCisgICAgICAgICAgICB0aW1lLnNsZWVwKDEwKQorICAgICAgICAgICAgaWYgaWRsZTogYnJlYWsKKyAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIi4iKQorICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJcbiIpCisKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuYnVpbGRfYmFzZSkKKyAgICAgICAgc2VsZi5lbnN1cmVIdG1sKCkKKyAgICAgICAgaWYgbm90IG9zLnBhdGguaXNkaXIoc2VsZi5idWlsZF9odG1sKToKKyAgICAgICAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvciwgXAorICAgICAgICAgICAgIkNhbid0IGZpbmQgc291cmNlIGZvbGRlciBmb3IgZG9jdW1lbnRhdGlvbi4iCisgICAgICAgIHNlbGYubWtwYXRoKHNlbGYuYnVpbGRfZGVzdCkKKyAgICAgICAgaWYgZGVwX3V0aWwubmV3ZXIob3MucGF0aC5qb2luKHNlbGYuYnVpbGRfaHRtbCwnaW5kZXguaHRtbCcpLCBvcy5wYXRoLmpvaW4oc2VsZi5idWlsZF9kZXN0LCdpbmRleC5odG1sJykpOgorICAgICAgICAgICAgc2VsZi5ta3BhdGgoc2VsZi5idWlsZF9kZXN0KQorICAgICAgICAgICAgc2VsZi5oYWNrSHRtbCgpCisgICAgICAgICAgICBzZWxmLmhhY2tJbmRleCgpCisgICAgICAgICAgICBzZWxmLm1ha2VIZWxwSW5kZXgoKQogCiBjbGFzcyBBSFZEb2NJbnN0YWxsKENvbW1hbmQpOgotCWRlc2NyaXB0aW9uID0gImluc3RhbGwgQXBwbGUgSGVscCBWaWV3ZXIgaHRtbCBmaWxlcyIKLQl1c2VyX29wdGlvbnMgPSBbKCdpbnN0YWxsLWRvYz0nLCAnZCcsCi0JCSdkaXJlY3RvcnkgdG8gaW5zdGFsbCBIVE1MIHRyZWUnKSwKLQkJICgncm9vdD0nLCBOb25lLAotCQkgImluc3RhbGwgZXZlcnl0aGluZyByZWxhdGl2ZSB0byB0aGlzIGFsdGVybmF0ZSByb290IGRpcmVjdG9yeSIpLAotCQldCi0JCQotCWRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6Ci0JCXNlbGYuYnVpbGRfZGVzdCA9IE5vbmUKLQkJc2VsZi5pbnN0YWxsX2RvYyA9IE5vbmUKLQkJc2VsZi5wcmVmaXggPSBOb25lCi0JCXNlbGYucm9vdCA9IE5vbmUKLQkJCQotCWRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgotCQlzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsCi0JCQkoJ3ByZWZpeCcsICdwcmVmaXgnKSwKLQkJCSgncm9vdCcsICdyb290JykpCi0jCQlpbXBvcnQgcGRiIDsgcGRiLnNldF90cmFjZSgpCi0JCWJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCi0JCWlmIHNlbGYuYnVpbGRfZGVzdCA9PSBOb25lOgotCQkJYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKLQkJCXNlbGYuYnVpbGRfZGVzdCA9IGJ1aWxkX2NtZC5idWlsZF9kZXN0Ci0JCWlmIHNlbGYuaW5zdGFsbF9kb2MgPT0gTm9uZToKLQkJCXNlbGYuaW5zdGFsbF9kb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKLQkJcHJpbnQgJ0lOU1RBTEwnLCBzZWxmLmJ1aWxkX2Rlc3QsICctPicsIHNlbGYuaW5zdGFsbF9kb2MKLQkJCi0JZGVmIHJ1bihzZWxmKToKLQkJc2VsZi5maW5hbGl6ZV9vcHRpb25zKCkKLQkJc2VsZi5lbnN1cmVfZmluYWxpemVkKCkKLQkJcHJpbnQgIlJ1bm5pbmcgSW5zdGFsbGVyIgotCQlpbnN0bG9jID0gc2VsZi5pbnN0YWxsX2RvYwotCQlpZiBzZWxmLnJvb3Q6Ci0JCQlpbnN0bG9jID0gY2hhbmdlX3Jvb3Qoc2VsZi5yb290LCBpbnN0bG9jKQotCQlzZWxmLm1rcGF0aChpbnN0bG9jKQotCQljb3B5X3RyZWUoc2VsZi5idWlsZF9kZXN0LCBpbnN0bG9jKQotCQlwcmludCAiSW5zdGFsbGF0aW9uIGNvbXBsZXRlIgotCQkKKyAgICBkZXNjcmlwdGlvbiA9ICJpbnN0YWxsIEFwcGxlIEhlbHAgVmlld2VyIGh0bWwgZmlsZXMiCisgICAgdXNlcl9vcHRpb25zID0gWygnaW5zdGFsbC1kb2M9JywgJ2QnLAorICAgICAgICAgICAgJ2RpcmVjdG9yeSB0byBpbnN0YWxsIEhUTUwgdHJlZScpLAorICAgICAgICAgICAgICgncm9vdD0nLCBOb25lLAorICAgICAgICAgICAgICJpbnN0YWxsIGV2ZXJ5dGhpbmcgcmVsYXRpdmUgdG8gdGhpcyBhbHRlcm5hdGUgcm9vdCBkaXJlY3RvcnkiKSwKKyAgICAgICAgICAgIF0KKworICAgIGRlZiBpbml0aWFsaXplX29wdGlvbnMoc2VsZik6CisgICAgICAgIHNlbGYuYnVpbGRfZGVzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5pbnN0YWxsX2RvYyA9IE5vbmUKKyAgICAgICAgc2VsZi5wcmVmaXggPSBOb25lCisgICAgICAgIHNlbGYucm9vdCA9IE5vbmUKKworICAgIGRlZiBmaW5hbGl6ZV9vcHRpb25zKHNlbGYpOgorICAgICAgICBzZWxmLnNldF91bmRlZmluZWRfb3B0aW9ucygnaW5zdGFsbCcsCisgICAgICAgICAgICAgICAgKCdwcmVmaXgnLCAncHJlZml4JyksCisgICAgICAgICAgICAgICAgKCdyb290JywgJ3Jvb3QnKSkKKyMgICAgICAgICAgICAgICBpbXBvcnQgcGRiIDsgcGRiLnNldF90cmFjZSgpCisgICAgICAgIGJ1aWxkX2NtZCA9IHNlbGYuZ2V0X2ZpbmFsaXplZF9jb21tYW5kKCdidWlsZCcpCisgICAgICAgIGlmIHNlbGYuYnVpbGRfZGVzdCA9PSBOb25lOgorICAgICAgICAgICAgYnVpbGRfY21kID0gc2VsZi5nZXRfZmluYWxpemVkX2NvbW1hbmQoJ2J1aWxkJykKKyAgICAgICAgICAgIHNlbGYuYnVpbGRfZGVzdCA9IGJ1aWxkX2NtZC5idWlsZF9kZXN0CisgICAgICAgIGlmIHNlbGYuaW5zdGFsbF9kb2MgPT0gTm9uZToKKyAgICAgICAgICAgIHNlbGYuaW5zdGFsbF9kb2MgPSBvcy5wYXRoLmpvaW4oc2VsZi5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcC9Db250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKKyAgICAgICAgcHJpbnQgJ0lOU1RBTEwnLCBzZWxmLmJ1aWxkX2Rlc3QsICctPicsIHNlbGYuaW5zdGFsbF9kb2MKKworICAgIGRlZiBydW4oc2VsZik6CisgICAgICAgIHNlbGYuZmluYWxpemVfb3B0aW9ucygpCisgICAgICAgIHNlbGYuZW5zdXJlX2ZpbmFsaXplZCgpCisgICAgICAgIHByaW50ICJSdW5uaW5nIEluc3RhbGxlciIKKyAgICAgICAgaW5zdGxvYyA9IHNlbGYuaW5zdGFsbF9kb2MKKyAgICAgICAgaWYgc2VsZi5yb290OgorICAgICAgICAgICAgaW5zdGxvYyA9IGNoYW5nZV9yb290KHNlbGYucm9vdCwgaW5zdGxvYykKKyAgICAgICAgc2VsZi5ta3BhdGgoaW5zdGxvYykKKyAgICAgICAgY29weV90cmVlKHNlbGYuYnVpbGRfZGVzdCwgaW5zdGxvYykKKyAgICAgICAgcHJpbnQgIkluc3RhbGxhdGlvbiBjb21wbGV0ZSIKKwogZGVmIG11bmdlVmVyc2lvbihpbmZpbGUsIG91dGZpbGUpOgotCWkgPSBmaWxlKGluZmlsZSwncicpCi0JbyA9IGZpbGUob3V0ZmlsZSwndycpCi0Jby53cml0ZShyZS5zdWIoJ1wkXChWRVJTSU9OXCknLHN5c2NvbmZpZy5nZXRfY29uZmlnX3ZhcignVkVSU0lPTicpLGkucmVhZCgpKSkKLQlpLmNsb3NlKCkKLQlvLmNsb3NlKCkKLQkJCisgICAgaSA9IGZpbGUoaW5maWxlLCdyJykKKyAgICBvID0gZmlsZShvdXRmaWxlLCd3JykKKyAgICBvLndyaXRlKHJlLnN1YignXCRcKFZFUlNJT05cKScsc3lzY29uZmlnLmdldF9jb25maWdfdmFyKCdWRVJTSU9OJyksaS5yZWFkKCkpKQorICAgIGkuY2xvc2UoKQorICAgIG8uY2xvc2UoKQorCiBkZWYgbWFpbigpOgotCSMgdHVybiBvZmYgd2FybmluZ3Mgd2hlbiBkZXByZWNhdGVkIG1vZHVsZXMgYXJlIGltcG9ydGVkCi0jIwlpbXBvcnQgd2FybmluZ3MKLSMjCXdhcm5pbmdzLmZpbHRlcndhcm5pbmdzKCJpZ25vcmUiLGNhdGVnb3J5PURlcHJlY2F0aW9uV2FybmluZykKLQlzZXR1cChuYW1lID0gJ0RvY3VtZW50YXRpb24nLAotICAJCXZlcnNpb24gPSAnJWQuJWQnICUgc3lzLnZlcnNpb25faW5mb1s6Ml0sCi0gIAkJY21kY2xhc3MgPSB7J2luc3RhbGxfZGF0YSc6QUhWRG9jSW5zdGFsbCwgJ2J1aWxkJzpEb2NCdWlsZH0sCi0gIAkJZGF0YV9maWxlcyA9IFsnZHVtbXknXSwKLSAJCSkKKyAgICAjIHR1cm4gb2ZmIHdhcm5pbmdzIHdoZW4gZGVwcmVjYXRlZCBtb2R1bGVzIGFyZSBpbXBvcnRlZAorIyMgICAgICBpbXBvcnQgd2FybmluZ3MKKyMjICAgICAgd2FybmluZ3MuZmlsdGVyd2FybmluZ3MoImlnbm9yZSIsY2F0ZWdvcnk9RGVwcmVjYXRpb25XYXJuaW5nKQorICAgIHNldHVwKG5hbWUgPSAnRG9jdW1lbnRhdGlvbicsCisgICAgICAgICAgICB2ZXJzaW9uID0gJyVkLiVkJyAlIHN5cy52ZXJzaW9uX2luZm9bOjJdLAorICAgICAgICAgICAgY21kY2xhc3MgPSB7J2luc3RhbGxfZGF0YSc6QUhWRG9jSW5zdGFsbCwgJ2J1aWxkJzpEb2NCdWlsZH0sCisgICAgICAgICAgICBkYXRhX2ZpbGVzID0gWydkdW1teSddLAorICAgICAgICAgICAgKQogCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQorICAgIG1haW4oKQpkaWZmIC0tZ2l0IGEvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weSBiL01hYy9PU1gvRXh0cmFzLmluc3RhbGwucHkKaW5kZXggMTkzOTkwNC4uMjUyMWYwNiAxMDA2NDQKLS0tIGEvTWFjL09TWC9FeHRyYXMuaW5zdGFsbC5weQorKysgYi9NYWMvT1NYL0V4dHJhcy5pbnN0YWxsLnB5CkBAIC05LDQ1ICs5LDQ1IEBACiBkZWJ1ZyA9IDAKIAogZGVmIGlzY2xlYW4obmFtZSk6Ci0JaWYgbmFtZSA9PSAnQ1ZTJzogcmV0dXJuIDAKLQlpZiBuYW1lID09ICcuY3ZzaWdub3JlJzogcmV0dXJuIDAKLQlpZiBuYW1lID09ICcuRFNfc3RvcmUnOiByZXR1cm4gMAotCWlmIG5hbWUuZW5kc3dpdGgoJ34nKTogcmV0dXJuIDAKLQlpZiBuYW1lLmVuZHN3aXRoKCcuQkFLJyk6IHJldHVybiAwCi0JaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpOiByZXR1cm4gMAotCWlmIG5hbWUuZW5kc3dpdGgoJy5weW8nKTogcmV0dXJuIDAKLQlpZiBuYW1lLmVuZHN3aXRoKCcub3JpZycpOiByZXR1cm4gMAotCXJldHVybiAxCi0JCisgICAgaWYgbmFtZSA9PSAnQ1ZTJzogcmV0dXJuIDAKKyAgICBpZiBuYW1lID09ICcuY3ZzaWdub3JlJzogcmV0dXJuIDAKKyAgICBpZiBuYW1lID09ICcuRFNfc3RvcmUnOiByZXR1cm4gMAorICAgIGlmIG5hbWUuZW5kc3dpdGgoJ34nKTogcmV0dXJuIDAKKyAgICBpZiBuYW1lLmVuZHN3aXRoKCcuQkFLJyk6IHJldHVybiAwCisgICAgaWYgbmFtZS5lbmRzd2l0aCgnLnB5YycpOiByZXR1cm4gMAorICAgIGlmIG5hbWUuZW5kc3dpdGgoJy5weW8nKTogcmV0dXJuIDAKKyAgICBpZiBuYW1lLmVuZHN3aXRoKCcub3JpZycpOiByZXR1cm4gMAorICAgIHJldHVybiAxCisKIGRlZiBjb3B5Y2xlYW5kaXIoc3JjLCBkc3QpOgotCWZvciBjdXJzcmMsIGRpcnMsIGZpbGVzIGluIG9zLndhbGsoc3JjKToKLQkJYXNzZXJ0IGN1cnNyYy5zdGFydHN3aXRoKHNyYykKLQkJY3VyZHN0ID0gZHN0ICsgY3Vyc3JjW2xlbihzcmMpOl0KLQkJaWYgdmVyYm9zZToKLQkJCXByaW50ICJta2RpciIsIGN1cmRzdAotCQlpZiBub3QgZGVidWc6Ci0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoY3VyZHN0KToKLQkJCQlvcy5tYWtlZGlycyhjdXJkc3QpCi0JCWZvciBmbiBpbiBmaWxlczoKLQkJCWlmIGlzY2xlYW4oZm4pOgotCQkJCWlmIHZlcmJvc2U6Ci0JCQkJCXByaW50ICJjb3B5Iiwgb3MucGF0aC5qb2luKGN1cnNyYywgZm4pLCBvcy5wYXRoLmpvaW4oY3VyZHN0LCBmbikKLQkJCQlpZiBub3QgZGVidWc6Ci0JCQkJCXNodXRpbC5jb3B5Mihvcy5wYXRoLmpvaW4oY3Vyc3JjLCBmbiksIG9zLnBhdGguam9pbihjdXJkc3QsIGZuKSkKLQkJCWVsc2U6Ci0JCQkJaWYgdmVyYm9zZToKLQkJCQkJcHJpbnQgInNraXBmaWxlIiwgb3MucGF0aC5qb2luKGN1cnNyYywgZm4pCi0JCWZvciBpIGluIHJhbmdlKGxlbihkaXJzKS0xLCAtMSwgLTEpOgotCQkJaWYgbm90IGlzY2xlYW4oZGlyc1tpXSk6Ci0JCQkJaWYgdmVyYm9zZToKLQkJCQkJcHJpbnQgInNraXBkaXIiLCBvcy5wYXRoLmpvaW4oY3Vyc3JjLCBkaXJzW2ldKQotCQkJCWRlbCBkaXJzW2ldCi0JCQkJCisgICAgZm9yIGN1cnNyYywgZGlycywgZmlsZXMgaW4gb3Mud2FsayhzcmMpOgorICAgICAgICBhc3NlcnQgY3Vyc3JjLnN0YXJ0c3dpdGgoc3JjKQorICAgICAgICBjdXJkc3QgPSBkc3QgKyBjdXJzcmNbbGVuKHNyYyk6XQorICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgcHJpbnQgIm1rZGlyIiwgY3VyZHN0CisgICAgICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjdXJkc3QpOgorICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKGN1cmRzdCkKKyAgICAgICAgZm9yIGZuIGluIGZpbGVzOgorICAgICAgICAgICAgaWYgaXNjbGVhbihmbik6CisgICAgICAgICAgICAgICAgaWYgdmVyYm9zZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgImNvcHkiLCBvcy5wYXRoLmpvaW4oY3Vyc3JjLCBmbiksIG9zLnBhdGguam9pbihjdXJkc3QsIGZuKQorICAgICAgICAgICAgICAgIGlmIG5vdCBkZWJ1ZzoKKyAgICAgICAgICAgICAgICAgICAgc2h1dGlsLmNvcHkyKG9zLnBhdGguam9pbihjdXJzcmMsIGZuKSwgb3MucGF0aC5qb2luKGN1cmRzdCwgZm4pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAic2tpcGZpbGUiLCBvcy5wYXRoLmpvaW4oY3Vyc3JjLCBmbikKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGRpcnMpLTEsIC0xLCAtMSk6CisgICAgICAgICAgICBpZiBub3QgaXNjbGVhbihkaXJzW2ldKToKKyAgICAgICAgICAgICAgICBpZiB2ZXJib3NlOgorICAgICAgICAgICAgICAgICAgICBwcmludCAic2tpcGRpciIsIG9zLnBhdGguam9pbihjdXJzcmMsIGRpcnNbaV0pCisgICAgICAgICAgICAgICAgZGVsIGRpcnNbaV0KKwogZGVmIG1haW4oKToKLQlpZiBsZW4oc3lzLmFyZ3YpICE9IDM6Ci0JCXN5cy5zdGRlcnIud3JpdGUoIlVzYWdlOiAlcyBzcmNkaXIgZHN0ZGlyXG4iICUgc3lzLmFyZ3ZbMF0pCi0JCXN5cy5leGl0KDEpCi0JY29weWNsZWFuZGlyKHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSkKLQkKKyAgICBpZiBsZW4oc3lzLmFyZ3YpICE9IDM6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlVzYWdlOiAlcyBzcmNkaXIgZHN0ZGlyXG4iICUgc3lzLmFyZ3ZbMF0pCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgY29weWNsZWFuZGlyKHN5cy5hcmd2WzFdLCBzeXMuYXJndlsyXSkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvT1NYL2ZpeHZlcnNpb25zLnB5IGIvTWFjL09TWC9maXh2ZXJzaW9ucy5weQppbmRleCBlNzgyZThjLi4wMjc3Yzc5IDEwMDY0NAotLS0gYS9NYWMvT1NYL2ZpeHZlcnNpb25zLnB5CisrKyBiL01hYy9PU1gvZml4dmVyc2lvbnMucHkKQEAgLTgsNjMgKzgsNjIgQEAKIAogU0hPUlRWRVJTSU9OID0gIiVkLiVkIiAlIChzeXMudmVyc2lvbl9pbmZvWzBdLCBzeXMudmVyc2lvbl9pbmZvWzFdKQogaWYgc3lzLnZlcnNpb25faW5mb1syXToKLQlTSE9SVFZFUlNJT04gPSBTSE9SVFZFUlNJT04gKyAiLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bMl0KKyAgICBTSE9SVFZFUlNJT04gPSBTSE9SVFZFUlNJT04gKyAiLiVkIiAlIHN5cy52ZXJzaW9uX2luZm9bMl0KIGlmIHN5cy52ZXJzaW9uX2luZm9bM10gIT0gJ2ZpbmFsJzoKLQlTSE9SVFZFUlNJT04gPSBTSE9SVFZFUlNJT04gKyAiJXMlZCIgJSAoc3lzLnZlcnNpb25faW5mb1szXSwgc3lzLnZlcnNpb25faW5mb1s0XSkKKyAgICBTSE9SVFZFUlNJT04gPSBTSE9SVFZFUlNJT04gKyAiJXMlZCIgJSAoc3lzLnZlcnNpb25faW5mb1szXSwgc3lzLnZlcnNpb25faW5mb1s0XSkKIAogQ09QWVJJR0hUID0gIihjKSAlZCBQeXRob24gU29mdHdhcmUgRm91bmRhdGlvbi4iICUgdGltZS5nbXRpbWUoKVswXQogCiBMT05HVkVSU0lPTiA9IFNIT1JUVkVSU0lPTiArICIsICIgKyBDT1BZUklHSFQKIAogZGVmIGZpeChmaWxlKToKLQlwbGlzdCA9IHBsaXN0bGliLlBsaXN0LmZyb21GaWxlKGZpbGUpCi0JY2hhbmdlZCA9IEZhbHNlCi0JaWYgcGxpc3QuaGFzX2tleSgiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIikgYW5kIFwKLQkJCXBsaXN0WyJDRkJ1bmRsZUdldEluZm9TdHJpbmciXSAhPSBMT05HVkVSU0lPTjoKLQkJcGxpc3RbIkNGQnVuZGxlR2V0SW5mb1N0cmluZyJdID0gTE9OR1ZFUlNJT04KLQkJY2hhbmdlZCA9IFRydWUKLQlpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIikgYW5kIFwKLQkJCXBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gIT0gTE9OR1ZFUlNJT046Ci0JCXBsaXN0WyJDRkJ1bmRsZUxvbmdWZXJzaW9uU3RyaW5nIl0gPSBMT05HVkVSU0lPTgotCQljaGFuZ2VkID0gVHJ1ZQotCWlmIHBsaXN0Lmhhc19rZXkoIk5TSHVtYW5SZWFkYWJsZUNvcHlyaWdodCIpIGFuZCBcCi0JCQlwbGlzdFsiTlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0Il0gIT0gQ09QWVJJR0hUOgotCQlwbGlzdFsiTlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0Il0gPSBDT1BZUklHSFQKLQkJY2hhbmdlZCA9IFRydWUKLQlpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZVZlcnNpb24iKSBhbmQgXAotCQkJcGxpc3RbIkNGQnVuZGxlVmVyc2lvbiJdICE9IFNIT1JUVkVSU0lPTjoKLQkJcGxpc3RbIkNGQnVuZGxlVmVyc2lvbiJdID0gU0hPUlRWRVJTSU9OCi0JCWNoYW5nZWQgPSBUcnVlCi0JaWYgcGxpc3QuaGFzX2tleSgiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciKSBhbmQgXAotCQkJcGxpc3RbIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIl0gIT0gU0hPUlRWRVJTSU9OOgotCQlwbGlzdFsiQ0ZCdW5kbGVTaG9ydFZlcnNpb25TdHJpbmciXSA9IFNIT1JUVkVSU0lPTgotCQljaGFuZ2VkID0gVHJ1ZQotCWlmIGNoYW5nZWQ6Ci0JCW9zLnJlbmFtZShmaWxlLCBmaWxlICsgJ34nKQotCQlwbGlzdC53cml0ZShmaWxlKQotCQkKKyAgICBwbGlzdCA9IHBsaXN0bGliLlBsaXN0LmZyb21GaWxlKGZpbGUpCisgICAgY2hhbmdlZCA9IEZhbHNlCisgICAgaWYgcGxpc3QuaGFzX2tleSgiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIikgYW5kIFwKKyAgICAgICAgICAgICAgICAgICAgcGxpc3RbIkNGQnVuZGxlR2V0SW5mb1N0cmluZyJdICE9IExPTkdWRVJTSU9OOgorICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVHZXRJbmZvU3RyaW5nIl0gPSBMT05HVkVSU0lPTgorICAgICAgICBjaGFuZ2VkID0gVHJ1ZQorICAgIGlmIHBsaXN0Lmhhc19rZXkoIkNGQnVuZGxlTG9uZ1ZlcnNpb25TdHJpbmciKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZyJdICE9IExPTkdWRVJTSU9OOgorICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVMb25nVmVyc2lvblN0cmluZyJdID0gTE9OR1ZFUlNJT04KKyAgICAgICAgY2hhbmdlZCA9IFRydWUKKyAgICBpZiBwbGlzdC5oYXNfa2V5KCJOU0h1bWFuUmVhZGFibGVDb3B5cmlnaHQiKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBwbGlzdFsiTlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0Il0gIT0gQ09QWVJJR0hUOgorICAgICAgICBwbGlzdFsiTlNIdW1hblJlYWRhYmxlQ29weXJpZ2h0Il0gPSBDT1BZUklHSFQKKyAgICAgICAgY2hhbmdlZCA9IFRydWUKKyAgICBpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZVZlcnNpb24iKSBhbmQgXAorICAgICAgICAgICAgICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVWZXJzaW9uIl0gIT0gU0hPUlRWRVJTSU9OOgorICAgICAgICBwbGlzdFsiQ0ZCdW5kbGVWZXJzaW9uIl0gPSBTSE9SVFZFUlNJT04KKyAgICAgICAgY2hhbmdlZCA9IFRydWUKKyAgICBpZiBwbGlzdC5oYXNfa2V5KCJDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyIpIGFuZCBcCisgICAgICAgICAgICAgICAgICAgIHBsaXN0WyJDRkJ1bmRsZVNob3J0VmVyc2lvblN0cmluZyJdICE9IFNIT1JUVkVSU0lPTjoKKyAgICAgICAgcGxpc3RbIkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nIl0gPSBTSE9SVFZFUlNJT04KKyAgICAgICAgY2hhbmdlZCA9IFRydWUKKyAgICBpZiBjaGFuZ2VkOgorICAgICAgICBvcy5yZW5hbWUoZmlsZSwgZmlsZSArICd+JykKKyAgICAgICAgcGxpc3Qud3JpdGUoZmlsZSkKKwogZGVmIG1haW4oKToKLQlpZiBsZW4oc3lzLmFyZ3YpIDwgMjoKLQkJcHJpbnQgIlVzYWdlOiAlcyBwbGlzdGZpbGUgLi4uIiAlIHN5cy5hcmd2WzBdCi0JCXByaW50ICJvcjogJXMgLWEgICAgICBmaXggc3RhbmRhcmQgUHl0aG9uIHBsaXN0IGZpbGVzIgotCQlzeXMuZXhpdCgxKQotCWlmIHN5cy5hcmd2WzFdID09ICItYSI6Ci0JCWZpbGVzID0gWwotCQkJIi4uL09TWFJlc291cmNlcy9hcHAvSW5mby5wbGlzdCIsCi0JCQkiLi4vT1NYUmVzb3VyY2VzL2ZyYW1ld29yay92ZXJzaW9uLnBsaXN0IiwKLQkJCSIuLi9Ub29scy9JREUvUGFja2FnZU1hbmFnZXIucGxpc3QiLAotCQkJIi4uL1Rvb2xzL0lERS9QeXRob25JREUucGxpc3QiLAotCQkJIi4uL3NjcmlwdHMvQnVpbGRBcHBsZXQucGxpc3QiCi0JCV0KLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGZpbGVzWzBdKToKLQkJCXByaW50ICIlcyAtYSBtdXN0IGJlIHJ1biBmcm9tIE1hYy9PU1ggZGlyZWN0b3J5IgotCQkJc3lzLmV4aXQoMSkKLQllbHNlOgotCQlmaWxlcyA9IHN5cy5hcmd2WzE6XQotCWZvciBmaWxlIGluIGZpbGVzOgotCQlmaXgoZmlsZSkKLQlzeXMuZXhpdCgwKQotCQorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBwcmludCAiVXNhZ2U6ICVzIHBsaXN0ZmlsZSAuLi4iICUgc3lzLmFyZ3ZbMF0KKyAgICAgICAgcHJpbnQgIm9yOiAlcyAtYSAgICAgIGZpeCBzdGFuZGFyZCBQeXRob24gcGxpc3QgZmlsZXMiCisgICAgICAgIHN5cy5leGl0KDEpCisgICAgaWYgc3lzLmFyZ3ZbMV0gPT0gIi1hIjoKKyAgICAgICAgZmlsZXMgPSBbCisgICAgICAgICAgICAgICAgIi4uL09TWFJlc291cmNlcy9hcHAvSW5mby5wbGlzdCIsCisgICAgICAgICAgICAgICAgIi4uL09TWFJlc291cmNlcy9mcmFtZXdvcmsvdmVyc2lvbi5wbGlzdCIsCisgICAgICAgICAgICAgICAgIi4uL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5wbGlzdCIsCisgICAgICAgICAgICAgICAgIi4uL1Rvb2xzL0lERS9QeXRob25JREUucGxpc3QiLAorICAgICAgICAgICAgICAgICIuLi9zY3JpcHRzL0J1aWxkQXBwbGV0LnBsaXN0IgorICAgICAgICBdCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhmaWxlc1swXSk6CisgICAgICAgICAgICBwcmludCAiJXMgLWEgbXVzdCBiZSBydW4gZnJvbSBNYWMvT1NYIGRpcmVjdG9yeSIKKyAgICAgICAgICAgIHN5cy5leGl0KDEpCisgICAgZWxzZToKKyAgICAgICAgZmlsZXMgPSBzeXMuYXJndlsxOl0KKyAgICBmb3IgZmlsZSBpbiBmaWxlczoKKyAgICAgICAgZml4KGZpbGUpCisgICAgc3lzLmV4aXQoMCkKKwogaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLQltYWluKCkKLQkKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL0J1aWxkSURFLnB5IGIvTWFjL1Rvb2xzL0lERS9CdWlsZElERS5weQppbmRleCA3ZTY1ODY5Li45MTQwMjhjIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL0J1aWxkSURFLnB5CisrKyBiL01hYy9Ub29scy9JREUvQnVpbGRJREUucHkKQEAgLTEsNCArMSw0IEBACi0iIiJCdWlsZCBhICJiaWciIGFwcGxldCBmb3IgdGhlIElERSwgYW5kIHB1dCBpdCBpbiB0aGUgUHl0aG9uIGhvbWUgCisiIiJCdWlsZCBhICJiaWciIGFwcGxldCBmb3IgdGhlIElERSwgYW5kIHB1dCBpdCBpbiB0aGUgUHl0aG9uIGhvbWUKIGRpcmVjdG9yeS4gSXQgd2lsbCBjb250YWluIGFsbCBJREUtc3BlY2lmaWMgbW9kdWxlcyBhcyBQWUMgcmVzb3VyY2VzLAogd2hpY2ggcmVkdWNlcyB0aGUgc3RhcnR1cCB0aW1lIChlc3BlY2lhbGx5IG9uIHNsb3dlciBtYWNoaW5lcykuIiIiCiAKQEAgLTI1LDE3ICsyNSwxNiBAQAogZmlsZXMgPSBvcy5saXN0ZGlyKGlkZV9ob21lKQogCiAjIHNraXAgdGhpcyBzY3JpcHQgYW5kIHRoZSBtYWluIHByb2dyYW0KLWZpbGVzID0gZmlsdGVyKGxhbWJkYSB4OiB4Wy0zOl0gPT0gJy5weScgYW5kIAotCQl4IG5vdCBpbiAoIkJ1aWxkSURFLnB5IiwgIlB5dGhvbklERS5weSIpLCBmaWxlcykKK2ZpbGVzID0gZmlsdGVyKGxhbWJkYSB4OiB4Wy0zOl0gPT0gJy5weScgYW5kCisgICAgICAgICAgICAgICAgeCBub3QgaW4gKCJCdWlsZElERS5weSIsICJQeXRob25JREUucHkiKSwgZmlsZXMpCiAKICMgYWRkIHRoZSBtb2R1bGVzIGFzIFBZQyByZXNvdXJjZXMKIGZvciBuYW1lIGluIGZpbGVzOgotCXByaW50ICJhZGRpbmciLCBuYW1lCi0JZnVsbHBhdGggPSBvcy5wYXRoLmpvaW4oaWRlX2hvbWUsIG5hbWUpCi0JaWQsIG5hbWUgPSBweV9yZXNvdXJjZS5mcm9tcHlmaWxlKGZ1bGxwYXRoLCBuYW1lWzotM10sIHByZWxvYWQ9MSwKLQkJaXNwYWNrYWdlPTApCisgICAgcHJpbnQgImFkZGluZyIsIG5hbWUKKyAgICBmdWxscGF0aCA9IG9zLnBhdGguam9pbihpZGVfaG9tZSwgbmFtZSkKKyAgICBpZCwgbmFtZSA9IHB5X3Jlc291cmNlLmZyb21weWZpbGUoZnVsbHBhdGgsIG5hbWVbOi0zXSwgcHJlbG9hZD0xLAorICAgICAgICAgICAgaXNwYWNrYWdlPTApCiAKICMgYWRkIFcgcmVzb3VyY2VzCiB3cmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKG9zLnBhdGguam9pbihpZGVfaG9tZSwgIldpZGdldHMucnNyYyIpLCAxKQogYnVpbGR0b29scy5jb3B5cmVzKHdyZXNyZWYsIHRhcmdldHJlZiwgW10sIDApCi0KZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvRm9udFNldHRpbmdzLnB5IGIvTWFjL1Rvb2xzL0lERS9Gb250U2V0dGluZ3MucHkKaW5kZXggYWYyYmQ4MC4uZDcxMzQzOCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9Gb250U2V0dGluZ3MucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Gb250U2V0dGluZ3MucHkKQEAgLTEsOSArMSw5IEBACi0iIiJ1c2FnZTogCi1uZXdzZXR0aW5ncyA9IEZvbnREaWFsb2coKCdDaGljYWdvJywgMCwgMTIsICgwLCAwLCAwKSkpCSMgZm9udCBuYW1lIG9yIGlkLCBzdHlsZSBmbGFncywgc2l6ZSwgY29sb3IgKGNvbG9yIGlzIGlnbm9yZWQpCisiIiJ1c2FnZToKK25ld3NldHRpbmdzID0gRm9udERpYWxvZygoJ0NoaWNhZ28nLCAwLCAxMiwgKDAsIDAsIDApKSkgIyBmb250IG5hbWUgb3IgaWQsIHN0eWxlIGZsYWdzLCBzaXplLCBjb2xvciAoY29sb3IgaXMgaWdub3JlZCkKIGlmIG5ld3NldHRpbmdzOgotCWZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBuZXdzZXR0aW5ncwotCWZvbnQsIHN0eWxlLCBzaXplLCBjb2xvciA9IGZvbnRzZXR0aW5ncwkjICdmb250JyBpcyBhbHdheXMgdGhlIGZvbnQgbmFtZSwgbm90IHRoZSBpZCBudW1iZXIKLQkjIGRvIHNvbWV0aGluZworICAgICAgICBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gbmV3c2V0dGluZ3MKKyAgICAgICAgZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yID0gZm9udHNldHRpbmdzICMgJ2ZvbnQnIGlzIGFsd2F5cyB0aGUgZm9udCBuYW1lLCBub3QgdGhlIGlkIG51bWJlcgorICAgICAgICAjIGRvIHNvbWV0aGluZwogIiIiCiAKIGltcG9ydCBXCkBAIC0xNSwyMDkgKzE1LDIwOSBAQAogaW1wb3J0IHN5cwogaW1wb3J0IE1hY09TCiBpZiBoYXNhdHRyKE1hY09TLCAiU3lzQmVlcCIpOgotCVN5c0JlZXAgPSBNYWNPUy5TeXNCZWVwCisgICAgU3lzQmVlcCA9IE1hY09TLlN5c0JlZXAKIGVsc2U6Ci0JZGVmIFN5c0JlZXAoKmFyZ3MpOgotCQlwYXNzCisgICAgZGVmIFN5c0JlZXAoKmFyZ3MpOgorICAgICAgICBwYXNzCiAKIF9zdHlsZW5hbWVzID0gWyJQbGFpbiIsICJCb2xkIiwgIkl0YWxpYyIsICJVbmRlcmxpbmUiLCAiT3V0bGluZSIsICJTaGFkb3ciLCAiQ29uZGVuc2VkIiwgIkV4dGVuZGVkIl0KIAogCiBjbGFzcyBfRm9udERpYWxvZzoKLQkKLQkjZGVmIF9fZGVsX18oc2VsZik6Ci0JIwlwcmludCAiZG9laSEiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpOgotCQlsZWZ0bWFyZ2luID0gNjAKLQkJbGVmdG1hcmdpbjIgPSBsZWZ0bWFyZ2luIC0gMTYKLQkJc2VsZi53ID0gVy5Nb2RhbERpYWxvZygoNDQwLCAxODApLCAnRm9udCBzZXR0aW5ncycpCi0JCXNlbGYudy5mb250dGl0bGUgPSBXLlRleHRCb3goKDEwLCAxMiwgbGVmdG1hcmdpbjIsIDE0KSwgIkZvbnQ6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCi0JCXNlbGYudy5wb3AgPSBXLkZvbnRNZW51KChsZWZ0bWFyZ2luLCAxMCwgMTYsIDE2KSwgc2VsZi5zZXRmb250KQotCQlzZWxmLncuZm9udG5hbWUgPSBXLlRleHRCb3goKGxlZnRtYXJnaW4gKyAyMCwgMTIsIDE1MCwgMTQpKQotCQlzZWxmLncuc2l6ZXRpdGxlID0gVy5UZXh0Qm94KCgxMCwgMzgsIGxlZnRtYXJnaW4yLCAxNCksICJTaXplOiIsIFRleHRFZGl0LnRlSnVzdFJpZ2h0KQotCQlzZWxmLncuc2l6ZWVkaXQgPSBXLkVkaXRUZXh0KChsZWZ0bWFyZ2luLCAzNSwgNDAsIDIwKSwgIiIsIHNlbGYuY2hlY2tzaXplKQotCQlzdHlsZXRvcCA9IDY0Ci0JCXNlbGYudy5zdHlsZXRpdGxlID0gVy5UZXh0Qm94KCgxMCwgc3R5bGV0b3AgKyAyLCBsZWZ0bWFyZ2luMiwgMTQpLCAiU3R5bGU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCi0JCWZvciBpIGluIHJhbmdlKGxlbihfc3R5bGVuYW1lcykpOgotCQkJdG9wID0gc3R5bGV0b3AgKyAoaSAlIDQpICogMjAKLQkJCWxlZnQgPSBsZWZ0bWFyZ2luICsgODAgKiAoaSA+IDMpIC0gMgotCQkJaWYgaToKLQkJCQlzZWxmLndbaV0gPSBXLkNoZWNrQm94KChsZWZ0LCB0b3AsIDc2LCAxNiksIF9zdHlsZW5hbWVzW2ldLCBzZWxmLmRvc3R5bGUpCi0JCQllbHNlOgotCQkJCXNlbGYud1tpXSA9IFcuQ2hlY2tCb3goKGxlZnQsIHRvcCwgNzAsIDE2KSwgX3N0eWxlbmFtZXNbaV0sIHNlbGYuZG9wbGFpbikKLQkJCi0JCWlmIHRhYnNldHRpbmdzOgotCQkJc2VsZi5sYXN0dGFiLCBzZWxmLnRhYm1vZGUgPSB0YWJzZXR0aW5ncwotCQkJc2VsZi53LnRhYnNpemV0aXRsZSA9IFcuVGV4dEJveCgoMTAsIC0yNiwgbGVmdG1hcmdpbjIsIDE0KSwgIlRhYnNpemU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCi0JCQlzZWxmLncudGFic2l6ZWVkaXQgPSBXLkVkaXRUZXh0KChsZWZ0bWFyZ2luLCAtMjksIDQwLCAyMCksICIiLCBzZWxmLmNoZWNrdGFiKQotCQkJc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCi0JCQlyYWRpb2J1dHRvbnMgPSBbXQotCQkJc2VsZi53LnRhYnNpemVjaGFycyA9IFcuUmFkaW9CdXR0b24oKGxlZnRtYXJnaW4gKyA0OCwgLTI2LCA1NSwgMTQpLCAiU3BhY2VzIiwgCi0JCQkJCXJhZGlvYnV0dG9ucywgc2VsZi50b2dnbGV0YWJtb2RlKQotCQkJc2VsZi53LnRhYnNpemVwaXhlbHMgPSBXLlJhZGlvQnV0dG9uKChsZWZ0bWFyZ2luICsgMTEwLCAtMjYsIDU1LCAxNCksICJQaXhlbHMiLCAKLQkJCQkJcmFkaW9idXR0b25zLCBzZWxmLnRvZ2dsZXRhYm1vZGUpCi0JCQlpZiBzZWxmLnRhYm1vZGU6Ci0JCQkJc2VsZi53LnRhYnNpemVjaGFycy5zZXQoMSkKLQkJCWVsc2U6Ci0JCQkJc2VsZi53LnRhYnNpemVwaXhlbHMuc2V0KDEpCi0JCWVsc2U6Ci0JCQlzZWxmLnRhYm1vZGUgPSBOb25lCi0JCQotCQlzZWxmLncuY2FuY2VsYnV0dG9uID0gVy5CdXR0b24oKC0xODAsIC0yNiwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuY2FuY2VsKQotCQlzZWxmLncuZG9uZWJ1dHRvbiA9IFcuQnV0dG9uKCgtOTAsIC0yNiwgODAsIDE2KSwgIkRvbmUiLCBzZWxmLmRvbmUpCi0JCQotCQlzYW1wbGV0ZXh0ID0gIlNhbXBsZSB0ZXh0LiIKLQkJc2VsZi53LnNhbXBsZSA9IFcuRWRpdFRleHQoKDIzMCwgMTAsIC0xMCwgMTMwKSwgc2FtcGxldGV4dCwgCi0JCQkJZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzKQotCQkKLQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LmRvbmVidXR0b24pCi0JCXNlbGYudy5iaW5kKCdjbWQuJywgc2VsZi53LmNhbmNlbGJ1dHRvbi5wdXNoKQotCQlzZWxmLncuYmluZCgnY21kdycsIHNlbGYudy5kb25lYnV0dG9uLnB1c2gpCi0JCXNlbGYubGFzdHNpemUgPSBmb250c2V0dGluZ3NbMl0KLQkJc2VsZi5fcnYgPSBOb25lCi0JCXNlbGYuc2V0KGZvbnRzZXR0aW5ncykKLQkJc2VsZi53Lm9wZW4oKQotCQotCWRlZiB0b2dnbGV0YWJtb2RlKHNlbGYsIG9ub2ZmKToKLQkJaWYgc2VsZi53LnRhYnNpemVjaGFycy5nZXQoKToKLQkJCXRhYm1vZGUgPSAxCi0JCWVsc2U6Ci0JCQl0YWJtb2RlID0gMAotCQlpZiBzZWxmLnRhYm1vZGUgPD4gdGFibW9kZToKLQkJCXBvcnQgPSBzZWxmLncud2lkLkdldFdpbmRvd1BvcnQoKQotCQkJKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvciksICh0YWJzaXplLCBkdW1teSkgPSBzZWxmLmdldCgpCi0JCQlzYXZlc2V0dGluZ3MgPSBXLkdldFBvcnRGb250U2V0dGluZ3MocG9ydCkKLQkJCVcuU2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0LCAoZm9udCwgc3R5bGUsIHNpemUpKQotCQkJc3BhY2V3aWR0aCA9IFFkLlN0cmluZ1dpZHRoKCcgJykKLQkJCVcuU2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0LCBzYXZlc2V0dGluZ3MpCi0JCQlpZiB0YWJtb2RlOgotCQkJCSMgY29udmVydCBwaXhlbHMgdG8gc3BhY2VzCi0JCQkJc2VsZi5sYXN0dGFiID0gaW50KHJvdW5kKGZsb2F0KHRhYnNpemUpIC8gc3BhY2V3aWR0aCkpCi0JCQllbHNlOgotCQkJCSMgY29udmVydCBzcGFjZXMgdG8gcGl4ZWxzCi0JCQkJc2VsZi5sYXN0dGFiID0gc3BhY2V3aWR0aCAqIHRhYnNpemUKLQkJCXNlbGYudy50YWJzaXplZWRpdC5zZXQocmVwcihzZWxmLmxhc3R0YWIpKQotCQkJc2VsZi50YWJtb2RlID0gdGFibW9kZQotCQkJc2VsZi5kb2l0KCkKLQkKLQlkZWYgc2V0KHNlbGYsIGZvbnRzZXR0aW5ncyk6Ci0JCWZvbnQsIHN0eWxlLCBzaXplLCBjb2xvciA9IGZvbnRzZXR0aW5ncwotCQlpZiB0eXBlKGZvbnQpIDw+IHR5cGVzLlN0cmluZ1R5cGU6Ci0JCQlmcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0JCQlyZXMgPSBSZXMuR2V0UmVzb3VyY2UoJ0ZPTkQnLCBmb250KQotCQkJZm9udCA9IHJlcy5HZXRSZXNJbmZvKClbMl0KLQkJc2VsZi53LmZvbnRuYW1lLnNldChmb250KQotCQlzZWxmLncuc2l6ZWVkaXQuc2V0KHN0cihzaXplKSkKLQkJaWYgc3R5bGU6Ci0JCQlmb3IgaSBpbiByYW5nZSgxLCBsZW4oX3N0eWxlbmFtZXMpKToKLQkJCQlzZWxmLndbaV0uc2V0KHN0eWxlICYgMHgwMSkKLQkJCQlzdHlsZSA9IHN0eWxlID4+IDEKLQkJZWxzZToKLQkJCXNlbGYud1swXS5zZXQoMSkKLQkKLQlkZWYgZ2V0KHNlbGYpOgotCQlmb250ID0gc2VsZi53LmZvbnRuYW1lLmdldCgpCi0JCXN0eWxlID0gMAotCQlpZiBub3Qgc2VsZi53WzBdLmdldCgpOgotCQkJZmxhZyA9IDB4MDEKLQkJCWZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgotCQkJCWlmIHNlbGYud1tpXS5nZXQoKToKLQkJCQkJc3R5bGUgPSBzdHlsZSB8IGZsYWcKLQkJCQlmbGFnID0gZmxhZyA8PCAxCi0JCXNpemUgPSBzZWxmLmxhc3RzaXplCi0JCWlmIHNlbGYudGFibW9kZSBpcyBOb25lOgotCQkJcmV0dXJuIChmb250LCBzdHlsZSwgc2l6ZSwgKDAsIDAsIDApKSwgKDMyLCAwKQotCQllbHNlOgotCQkJcmV0dXJuIChmb250LCBzdHlsZSwgc2l6ZSwgKDAsIDAsIDApKSwgKHNlbGYubGFzdHRhYiwgc2VsZi50YWJtb2RlKQotCQotCWRlZiBkb2l0KHNlbGYpOgotCQlpZiBzZWxmLndbMF0uZ2V0KCk6Ci0JCQlzdHlsZSA9IDAKLQkJZWxzZToKLQkJCXN0eWxlID0gMAotCQkJZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6Ci0JCQkJaWYgc2VsZi53W2ldLmdldCgpOgotCQkJCQlzdHlsZSA9IHN0eWxlIHwgMiAqKiAoaSAtIDEpCi0JCSNzZWxmLncuc2FtcGxlLnNldChyZXByKHN0eWxlKSkKLQkJZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNlbGYuZ2V0KCkKLQkJc2VsZi53LnNhbXBsZS5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQotCQlzZWxmLncuc2FtcGxlLnNldHRhYnNldHRpbmdzKHRhYnNldHRpbmdzKQotCQotCWRlZiBjaGVja3RhYihzZWxmKToKLQkJdGFic2l6ZSA9IHNlbGYudy50YWJzaXplZWRpdC5nZXQoKQotCQlpZiBub3QgdGFic2l6ZToKLQkJCXJldHVybgotCQl0cnk6Ci0JCQl0YWJzaXplID0gc3RyaW5nLmF0b2kodGFic2l6ZSkKLQkJZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKLQkJCWdvb2QgPSAwCi0JCQlzeXMuZXhjX3RyYWNlYmFjayA9IE5vbmUKLQkJZWxzZToKLQkJCWdvb2QgPSAxIDw9IHRhYnNpemUgPD0gNTAwCi0JCWlmIGdvb2Q6Ci0JCQlpZiBzZWxmLmxhc3R0YWIgPD4gdGFic2l6ZToKLQkJCQlzZWxmLmxhc3R0YWIgPSB0YWJzaXplCi0JCQkJc2VsZi5kb2l0KCkKLQkJZWxzZToKLQkJCVN5c0JlZXAoMCkKLQkJCXNlbGYudy50YWJzaXplZWRpdC5zZXQocmVwcihzZWxmLmxhc3R0YWIpKQotCQkJc2VsZi53LnRhYnNpemVlZGl0LnNlbGVjdGFsbCgpCi0JCi0JZGVmIGNoZWNrc2l6ZShzZWxmKToKLQkJc2l6ZSA9IHNlbGYudy5zaXplZWRpdC5nZXQoKQotCQlpZiBub3Qgc2l6ZToKLQkJCXJldHVybgotCQl0cnk6Ci0JCQlzaXplID0gc3RyaW5nLmF0b2koc2l6ZSkKLQkJZXhjZXB0IChWYWx1ZUVycm9yLCBPdmVyZmxvd0Vycm9yKToKLQkJCWdvb2QgPSAwCi0JCQlzeXMuZXhjX3RyYWNlYmFjayA9IE5vbmUKLQkJZWxzZToKLQkJCWdvb2QgPSAxIDw9IHNpemUgPD0gNTAwCi0JCWlmIGdvb2Q6Ci0JCQlpZiBzZWxmLmxhc3RzaXplIDw+IHNpemU6Ci0JCQkJc2VsZi5sYXN0c2l6ZSA9IHNpemUKLQkJCQlzZWxmLmRvaXQoKQotCQllbHNlOgotCQkJU3lzQmVlcCgwKQotCQkJc2VsZi53LnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHNpemUpKQotCQkJc2VsZi53LnNpemVlZGl0LnNlbGVjdGFsbCgpCi0JCi0JZGVmIGRvcGxhaW4oc2VsZik6Ci0JCWZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgotCQkJc2VsZi53W2ldLnNldCgwKQotCQlzZWxmLndbMF0uc2V0KDEpCi0JCXNlbGYuZG9pdCgpCi0JCi0JZGVmIGRvc3R5bGUoc2VsZik6Ci0JCWZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgotCQkJaWYgc2VsZi53W2ldLmdldCgpOgotCQkJCXNlbGYud1swXS5zZXQoMCkKLQkJCQlicmVhawotCQllbHNlOgotCQkJc2VsZi53WzBdLnNldCgxKQotCQlzZWxmLmRvaXQoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi53LmNsb3NlKCkKLQkJZGVsIHNlbGYudwotCQotCWRlZiBjYW5jZWwoc2VsZik6Ci0JCXNlbGYuY2xvc2UoKQotCQotCWRlZiBkb25lKHNlbGYpOgotCQlzZWxmLl9ydiA9IHNlbGYuZ2V0KCkKLQkJc2VsZi5jbG9zZSgpCi0JCi0JZGVmIHNldGZvbnQoc2VsZiwgZm9udG5hbWUpOgotCQlzZWxmLncuZm9udG5hbWUuc2V0KGZvbnRuYW1lKQotCQlzZWxmLmRvaXQoKQotCQorCisgICAgI2RlZiBfX2RlbF9fKHNlbGYpOgorICAgICMgICAgICAgcHJpbnQgImRvZWkhIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpOgorICAgICAgICBsZWZ0bWFyZ2luID0gNjAKKyAgICAgICAgbGVmdG1hcmdpbjIgPSBsZWZ0bWFyZ2luIC0gMTYKKyAgICAgICAgc2VsZi53ID0gVy5Nb2RhbERpYWxvZygoNDQwLCAxODApLCAnRm9udCBzZXR0aW5ncycpCisgICAgICAgIHNlbGYudy5mb250dGl0bGUgPSBXLlRleHRCb3goKDEwLCAxMiwgbGVmdG1hcmdpbjIsIDE0KSwgIkZvbnQ6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCisgICAgICAgIHNlbGYudy5wb3AgPSBXLkZvbnRNZW51KChsZWZ0bWFyZ2luLCAxMCwgMTYsIDE2KSwgc2VsZi5zZXRmb250KQorICAgICAgICBzZWxmLncuZm9udG5hbWUgPSBXLlRleHRCb3goKGxlZnRtYXJnaW4gKyAyMCwgMTIsIDE1MCwgMTQpKQorICAgICAgICBzZWxmLncuc2l6ZXRpdGxlID0gVy5UZXh0Qm94KCgxMCwgMzgsIGxlZnRtYXJnaW4yLCAxNCksICJTaXplOiIsIFRleHRFZGl0LnRlSnVzdFJpZ2h0KQorICAgICAgICBzZWxmLncuc2l6ZWVkaXQgPSBXLkVkaXRUZXh0KChsZWZ0bWFyZ2luLCAzNSwgNDAsIDIwKSwgIiIsIHNlbGYuY2hlY2tzaXplKQorICAgICAgICBzdHlsZXRvcCA9IDY0CisgICAgICAgIHNlbGYudy5zdHlsZXRpdGxlID0gVy5UZXh0Qm94KCgxMCwgc3R5bGV0b3AgKyAyLCBsZWZ0bWFyZ2luMiwgMTQpLCAiU3R5bGU6IiwgVGV4dEVkaXQudGVKdXN0UmlnaHQpCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihfc3R5bGVuYW1lcykpOgorICAgICAgICAgICAgdG9wID0gc3R5bGV0b3AgKyAoaSAlIDQpICogMjAKKyAgICAgICAgICAgIGxlZnQgPSBsZWZ0bWFyZ2luICsgODAgKiAoaSA+IDMpIC0gMgorICAgICAgICAgICAgaWYgaToKKyAgICAgICAgICAgICAgICBzZWxmLndbaV0gPSBXLkNoZWNrQm94KChsZWZ0LCB0b3AsIDc2LCAxNiksIF9zdHlsZW5hbWVzW2ldLCBzZWxmLmRvc3R5bGUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYud1tpXSA9IFcuQ2hlY2tCb3goKGxlZnQsIHRvcCwgNzAsIDE2KSwgX3N0eWxlbmFtZXNbaV0sIHNlbGYuZG9wbGFpbikKKworICAgICAgICBpZiB0YWJzZXR0aW5nczoKKyAgICAgICAgICAgIHNlbGYubGFzdHRhYiwgc2VsZi50YWJtb2RlID0gdGFic2V0dGluZ3MKKyAgICAgICAgICAgIHNlbGYudy50YWJzaXpldGl0bGUgPSBXLlRleHRCb3goKDEwLCAtMjYsIGxlZnRtYXJnaW4yLCAxNCksICJUYWJzaXplOiIsIFRleHRFZGl0LnRlSnVzdFJpZ2h0KQorICAgICAgICAgICAgc2VsZi53LnRhYnNpemVlZGl0ID0gVy5FZGl0VGV4dCgobGVmdG1hcmdpbiwgLTI5LCA0MCwgMjApLCAiIiwgc2VsZi5jaGVja3RhYikKKyAgICAgICAgICAgIHNlbGYudy50YWJzaXplZWRpdC5zZXQocmVwcihzZWxmLmxhc3R0YWIpKQorICAgICAgICAgICAgcmFkaW9idXR0b25zID0gW10KKyAgICAgICAgICAgIHNlbGYudy50YWJzaXplY2hhcnMgPSBXLlJhZGlvQnV0dG9uKChsZWZ0bWFyZ2luICsgNDgsIC0yNiwgNTUsIDE0KSwgIlNwYWNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9idXR0b25zLCBzZWxmLnRvZ2dsZXRhYm1vZGUpCisgICAgICAgICAgICBzZWxmLncudGFic2l6ZXBpeGVscyA9IFcuUmFkaW9CdXR0b24oKGxlZnRtYXJnaW4gKyAxMTAsIC0yNiwgNTUsIDE0KSwgIlBpeGVscyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFkaW9idXR0b25zLCBzZWxmLnRvZ2dsZXRhYm1vZGUpCisgICAgICAgICAgICBpZiBzZWxmLnRhYm1vZGU6CisgICAgICAgICAgICAgICAgc2VsZi53LnRhYnNpemVjaGFycy5zZXQoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53LnRhYnNpemVwaXhlbHMuc2V0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRhYm1vZGUgPSBOb25lCisKKyAgICAgICAgc2VsZi53LmNhbmNlbGJ1dHRvbiA9IFcuQnV0dG9uKCgtMTgwLCAtMjYsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLmNhbmNlbCkKKyAgICAgICAgc2VsZi53LmRvbmVidXR0b24gPSBXLkJ1dHRvbigoLTkwLCAtMjYsIDgwLCAxNiksICJEb25lIiwgc2VsZi5kb25lKQorCisgICAgICAgIHNhbXBsZXRleHQgPSAiU2FtcGxlIHRleHQuIgorICAgICAgICBzZWxmLncuc2FtcGxlID0gVy5FZGl0VGV4dCgoMjMwLCAxMCwgLTEwLCAxMzApLCBzYW1wbGV0ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzKQorCisgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5kb25lYnV0dG9uKQorICAgICAgICBzZWxmLncuYmluZCgnY21kLicsIHNlbGYudy5jYW5jZWxidXR0b24ucHVzaCkKKyAgICAgICAgc2VsZi53LmJpbmQoJ2NtZHcnLCBzZWxmLncuZG9uZWJ1dHRvbi5wdXNoKQorICAgICAgICBzZWxmLmxhc3RzaXplID0gZm9udHNldHRpbmdzWzJdCisgICAgICAgIHNlbGYuX3J2ID0gTm9uZQorICAgICAgICBzZWxmLnNldChmb250c2V0dGluZ3MpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKworICAgIGRlZiB0b2dnbGV0YWJtb2RlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgc2VsZi53LnRhYnNpemVjaGFycy5nZXQoKToKKyAgICAgICAgICAgIHRhYm1vZGUgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0YWJtb2RlID0gMAorICAgICAgICBpZiBzZWxmLnRhYm1vZGUgPD4gdGFibW9kZToKKyAgICAgICAgICAgIHBvcnQgPSBzZWxmLncud2lkLkdldFdpbmRvd1BvcnQoKQorICAgICAgICAgICAgKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvciksICh0YWJzaXplLCBkdW1teSkgPSBzZWxmLmdldCgpCisgICAgICAgICAgICBzYXZlc2V0dGluZ3MgPSBXLkdldFBvcnRGb250U2V0dGluZ3MocG9ydCkKKyAgICAgICAgICAgIFcuU2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0LCAoZm9udCwgc3R5bGUsIHNpemUpKQorICAgICAgICAgICAgc3BhY2V3aWR0aCA9IFFkLlN0cmluZ1dpZHRoKCcgJykKKyAgICAgICAgICAgIFcuU2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0LCBzYXZlc2V0dGluZ3MpCisgICAgICAgICAgICBpZiB0YWJtb2RlOgorICAgICAgICAgICAgICAgICMgY29udmVydCBwaXhlbHMgdG8gc3BhY2VzCisgICAgICAgICAgICAgICAgc2VsZi5sYXN0dGFiID0gaW50KHJvdW5kKGZsb2F0KHRhYnNpemUpIC8gc3BhY2V3aWR0aCkpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgY29udmVydCBzcGFjZXMgdG8gcGl4ZWxzCisgICAgICAgICAgICAgICAgc2VsZi5sYXN0dGFiID0gc3BhY2V3aWR0aCAqIHRhYnNpemUKKyAgICAgICAgICAgIHNlbGYudy50YWJzaXplZWRpdC5zZXQocmVwcihzZWxmLmxhc3R0YWIpKQorICAgICAgICAgICAgc2VsZi50YWJtb2RlID0gdGFibW9kZQorICAgICAgICAgICAgc2VsZi5kb2l0KCkKKworICAgIGRlZiBzZXQoc2VsZiwgZm9udHNldHRpbmdzKToKKyAgICAgICAgZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yID0gZm9udHNldHRpbmdzCisgICAgICAgIGlmIHR5cGUoZm9udCkgPD4gdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICAgICAgICAgIHJlcyA9IFJlcy5HZXRSZXNvdXJjZSgnRk9ORCcsIGZvbnQpCisgICAgICAgICAgICBmb250ID0gcmVzLkdldFJlc0luZm8oKVsyXQorICAgICAgICBzZWxmLncuZm9udG5hbWUuc2V0KGZvbnQpCisgICAgICAgIHNlbGYudy5zaXplZWRpdC5zZXQoc3RyKHNpemUpKQorICAgICAgICBpZiBzdHlsZToKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgorICAgICAgICAgICAgICAgIHNlbGYud1tpXS5zZXQoc3R5bGUgJiAweDAxKQorICAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGUgPj4gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53WzBdLnNldCgxKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgZm9udCA9IHNlbGYudy5mb250bmFtZS5nZXQoKQorICAgICAgICBzdHlsZSA9IDAKKyAgICAgICAgaWYgbm90IHNlbGYud1swXS5nZXQoKToKKyAgICAgICAgICAgIGZsYWcgPSAweDAxCisgICAgICAgICAgICBmb3IgaSBpbiByYW5nZSgxLCBsZW4oX3N0eWxlbmFtZXMpKToKKyAgICAgICAgICAgICAgICBpZiBzZWxmLndbaV0uZ2V0KCk6CisgICAgICAgICAgICAgICAgICAgIHN0eWxlID0gc3R5bGUgfCBmbGFnCisgICAgICAgICAgICAgICAgZmxhZyA9IGZsYWcgPDwgMQorICAgICAgICBzaXplID0gc2VsZi5sYXN0c2l6ZQorICAgICAgICBpZiBzZWxmLnRhYm1vZGUgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAoZm9udCwgc3R5bGUsIHNpemUsICgwLCAwLCAwKSksICgzMiwgMCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAoZm9udCwgc3R5bGUsIHNpemUsICgwLCAwLCAwKSksIChzZWxmLmxhc3R0YWIsIHNlbGYudGFibW9kZSkKKworICAgIGRlZiBkb2l0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLndbMF0uZ2V0KCk6CisgICAgICAgICAgICBzdHlsZSA9IDAKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHN0eWxlID0gMAorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6CisgICAgICAgICAgICAgICAgaWYgc2VsZi53W2ldLmdldCgpOgorICAgICAgICAgICAgICAgICAgICBzdHlsZSA9IHN0eWxlIHwgMiAqKiAoaSAtIDEpCisgICAgICAgICNzZWxmLncuc2FtcGxlLnNldChyZXByKHN0eWxlKSkKKyAgICAgICAgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNlbGYuZ2V0KCkKKyAgICAgICAgc2VsZi53LnNhbXBsZS5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQorICAgICAgICBzZWxmLncuc2FtcGxlLnNldHRhYnNldHRpbmdzKHRhYnNldHRpbmdzKQorCisgICAgZGVmIGNoZWNrdGFiKHNlbGYpOgorICAgICAgICB0YWJzaXplID0gc2VsZi53LnRhYnNpemVlZGl0LmdldCgpCisgICAgICAgIGlmIG5vdCB0YWJzaXplOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHRhYnNpemUgPSBzdHJpbmcuYXRvaSh0YWJzaXplKQorICAgICAgICBleGNlcHQgKFZhbHVlRXJyb3IsIE92ZXJmbG93RXJyb3IpOgorICAgICAgICAgICAgZ29vZCA9IDAKKyAgICAgICAgICAgIHN5cy5leGNfdHJhY2ViYWNrID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZ29vZCA9IDEgPD0gdGFic2l6ZSA8PSA1MDAKKyAgICAgICAgaWYgZ29vZDoKKyAgICAgICAgICAgIGlmIHNlbGYubGFzdHRhYiA8PiB0YWJzaXplOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdHRhYiA9IHRhYnNpemUKKyAgICAgICAgICAgICAgICBzZWxmLmRvaXQoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU3lzQmVlcCgwKQorICAgICAgICAgICAgc2VsZi53LnRhYnNpemVlZGl0LnNldChyZXByKHNlbGYubGFzdHRhYikpCisgICAgICAgICAgICBzZWxmLncudGFic2l6ZWVkaXQuc2VsZWN0YWxsKCkKKworICAgIGRlZiBjaGVja3NpemUoc2VsZik6CisgICAgICAgIHNpemUgPSBzZWxmLncuc2l6ZWVkaXQuZ2V0KCkKKyAgICAgICAgaWYgbm90IHNpemU6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2l6ZSA9IHN0cmluZy5hdG9pKHNpemUpCisgICAgICAgIGV4Y2VwdCAoVmFsdWVFcnJvciwgT3ZlcmZsb3dFcnJvcik6CisgICAgICAgICAgICBnb29kID0gMAorICAgICAgICAgICAgc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBnb29kID0gMSA8PSBzaXplIDw9IDUwMAorICAgICAgICBpZiBnb29kOgorICAgICAgICAgICAgaWYgc2VsZi5sYXN0c2l6ZSA8PiBzaXplOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdHNpemUgPSBzaXplCisgICAgICAgICAgICAgICAgc2VsZi5kb2l0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFN5c0JlZXAoMCkKKyAgICAgICAgICAgIHNlbGYudy5zaXplZWRpdC5zZXQocmVwcihzZWxmLmxhc3RzaXplKSkKKyAgICAgICAgICAgIHNlbGYudy5zaXplZWRpdC5zZWxlY3RhbGwoKQorCisgICAgZGVmIGRvcGxhaW4oc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKDEsIGxlbihfc3R5bGVuYW1lcykpOgorICAgICAgICAgICAgc2VsZi53W2ldLnNldCgwKQorICAgICAgICBzZWxmLndbMF0uc2V0KDEpCisgICAgICAgIHNlbGYuZG9pdCgpCisKKyAgICBkZWYgZG9zdHlsZShzZWxmKToKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMSwgbGVuKF9zdHlsZW5hbWVzKSk6CisgICAgICAgICAgICBpZiBzZWxmLndbaV0uZ2V0KCk6CisgICAgICAgICAgICAgICAgc2VsZi53WzBdLnNldCgwKQorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLndbMF0uc2V0KDEpCisgICAgICAgIHNlbGYuZG9pdCgpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYudy5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLncKKworICAgIGRlZiBjYW5jZWwoc2VsZik6CisgICAgICAgIHNlbGYuY2xvc2UoKQorCisgICAgZGVmIGRvbmUoc2VsZik6CisgICAgICAgIHNlbGYuX3J2ID0gc2VsZi5nZXQoKQorICAgICAgICBzZWxmLmNsb3NlKCkKKworICAgIGRlZiBzZXRmb250KHNlbGYsIGZvbnRuYW1lKToKKyAgICAgICAgc2VsZi53LmZvbnRuYW1lLnNldChmb250bmFtZSkKKyAgICAgICAgc2VsZi5kb2l0KCkKKwogCiBkZWYgRm9udERpYWxvZyhmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gKDMyLCAwKSk6Ci0JZmQgPSBfRm9udERpYWxvZyhmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzKQotCXJldHVybiBmZC5fcnYKKyAgICBmZCA9IF9Gb250RGlhbG9nKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpCisgICAgcmV0dXJuIGZkLl9ydgogCiBkZWYgdGVzdCgpOgotCXByaW50IEZvbnREaWFsb2coKCdaYXBhdGEtTGlnaHQnLCAwLCAyNSwgKDAsIDAsIDApKSkKKyAgICBwcmludCBGb250RGlhbG9nKCgnWmFwYXRhLUxpZ2h0JywgMCwgMjUsICgwLCAwLCAwKSkpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL01hY1ByZWZzLnB5IGIvTWFjL1Rvb2xzL0lERS9NYWNQcmVmcy5weQppbmRleCAyNWRkYTRmLi4zY2Y5MTUzIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL01hY1ByZWZzLnB5CisrKyBiL01hYy9Ub29scy9JREUvTWFjUHJlZnMucHkKQEAgLTQsMTA1ICs0LDEwNSBAQAogZnJvbSBDYXJib24gaW1wb3J0IEZvbGRlcnMKIAogY2xhc3MgUHJlZk9iamVjdDoKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgZGljdCA9IE5vbmUpOgotCQlpZiBkaWN0ID09IE5vbmU6Ci0JCQlzZWxmLl9wcmVmc2RpY3QgPSB7fQotCQllbHNlOgotCQkJc2VsZi5fcHJlZnNkaWN0ID0gZGljdAotCQotCWRlZiBfX2xlbl9fKHNlbGYpOgotCQlyZXR1cm4gbGVuKHNlbGYuX3ByZWZzZGljdCkKLQkKLQlkZWYgX19kZWxhdHRyX18oc2VsZiwgYXR0cik6Ci0JCWlmIHNlbGYuX3ByZWZzZGljdC5oYXNfa2V5KGF0dHIpOgotCQkJZGVsIHNlbGYuX3ByZWZzZGljdFthdHRyXQotCQllbHNlOgotCQkJcmFpc2UgQXR0cmlidXRlRXJyb3IsICdkZWxldGUgbm9uLWV4aXN0aW5nIGluc3RhbmNlIGF0dHJpYnV0ZScKLQkKLQlkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6Ci0JCWlmIGF0dHIgPT0gJ19fbWVtYmVyc19fJzoKLQkJCWtleXMgPSBzZWxmLl9wcmVmc2RpY3Qua2V5cygpCi0JCQlrZXlzLnNvcnQoKQotCQkJcmV0dXJuIGtleXMKLQkJdHJ5OgotCQkJcmV0dXJuIHNlbGYuX3ByZWZzZGljdFthdHRyXQotCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgotCQotCWRlZiBfX3NldGF0dHJfXyhzZWxmLCBhdHRyLCB2YWx1ZSk6Ci0JCWlmIGF0dHJbMF0gPD4gJ18nOgotCQkJc2VsZi5fcHJlZnNkaWN0W2F0dHJdID0gdmFsdWUKLQkJZWxzZToKLQkJCXNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWx1ZQotCQotCWRlZiBnZXRwcmVmc2RpY3Qoc2VsZik6Ci0JCXJldHVybiBzZWxmLl9wcmVmc2RpY3QKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBkaWN0ID0gTm9uZSk6CisgICAgICAgIGlmIGRpY3QgPT0gTm9uZToKKyAgICAgICAgICAgIHNlbGYuX3ByZWZzZGljdCA9IHt9CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9wcmVmc2RpY3QgPSBkaWN0CisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLl9wcmVmc2RpY3QpCisKKyAgICBkZWYgX19kZWxhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGlmIHNlbGYuX3ByZWZzZGljdC5oYXNfa2V5KGF0dHIpOgorICAgICAgICAgICAgZGVsIHNlbGYuX3ByZWZzZGljdFthdHRyXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICdkZWxldGUgbm9uLWV4aXN0aW5nIGluc3RhbmNlIGF0dHJpYnV0ZScKKworICAgIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBhdHRyKToKKyAgICAgICAgaWYgYXR0ciA9PSAnX19tZW1iZXJzX18nOgorICAgICAgICAgICAga2V5cyA9IHNlbGYuX3ByZWZzZGljdC5rZXlzKCkKKyAgICAgICAgICAgIGtleXMuc29ydCgpCisgICAgICAgICAgICByZXR1cm4ga2V5cworICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fcHJlZnNkaWN0W2F0dHJdCisgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsdWUpOgorICAgICAgICBpZiBhdHRyWzBdIDw+ICdfJzoKKyAgICAgICAgICAgIHNlbGYuX3ByZWZzZGljdFthdHRyXSA9IHZhbHVlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9fZGljdF9fW2F0dHJdID0gdmFsdWUKKworICAgIGRlZiBnZXRwcmVmc2RpY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9wcmVmc2RpY3QKIAogCiBjbGFzcyBQcmVmRmlsZShQcmVmT2JqZWN0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgY3JlYXRvciA9ICdQeXRoJyk6Ci0JCSMgRmluZCB0aGUgcHJlZmVyZW5jZXMgZm9sZGVyIGFuZCBvdXIgcHJlZnMgZmlsZSwgY3JlYXRlIGlmIG5lZWRlZC4KLQkJc2VsZi5fX3BhdGggPSBwYXRoCi0JCXNlbGYuX19jcmVhdG9yID0gY3JlYXRvcgotCQlzZWxmLl9wcmVmc2RpY3QgPSB7fQotCQl0cnk6Ci0JCQlwcmVmZGljdCA9IG1hcnNoYWwubG9hZChvcGVuKHNlbGYuX19wYXRoLCAncmInKSkKLQkJZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKToKLQkJCSMgZmlsZSBub3QgZm91bmQsIG9yIGN1cnJ1cHQgbWFyc2hhbCBkYXRhCi0JCQlwYXNzCi0JCWVsc2U6Ci0JCQlmb3Iga2V5LCB2YWx1ZSBpbiBwcmVmZGljdC5pdGVtcygpOgotCQkJCWlmIHR5cGUodmFsdWUpID09IHR5cGVzLkRpY3RUeXBlOgotCQkJCQlzZWxmLl9wcmVmc2RpY3Rba2V5XSA9IFByZWZPYmplY3QodmFsdWUpCi0JCQkJZWxzZToKLQkJCQkJc2VsZi5fcHJlZnNkaWN0W2tleV0gPSB2YWx1ZQotCQotCWRlZiBzYXZlKHNlbGYpOgotCQlwcmVmZGljdCA9IHt9Ci0JCWZvciBrZXksIHZhbHVlIGluIHNlbGYuX3ByZWZzZGljdC5pdGVtcygpOgotCQkJaWYgdHlwZSh2YWx1ZSkgPT0gdHlwZXMuSW5zdGFuY2VUeXBlOgotCQkJCXByZWZkaWN0W2tleV0gPSB2YWx1ZS5nZXRwcmVmc2RpY3QoKQotCQkJCWlmIG5vdCBwcmVmZGljdFtrZXldOgotCQkJCQlkZWwgcHJlZmRpY3Rba2V5XQotCQkJZWxzZToKLQkJCQlwcmVmZGljdFtrZXldID0gdmFsdWUKLQkJbWFyc2hhbC5kdW1wKHByZWZkaWN0LCBvcGVuKHNlbGYuX19wYXRoLCAnd2InKSkKLQkJdHJ5OgotCQkJTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoc2VsZi5fX3BhdGgsIHNlbGYuX19jcmVhdG9yLCAncHJlZicpCi0JCWV4Y2VwdDoKLQkJCXBhc3MKLQkKLQlkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6Ci0JCWlmIGF0dHIgPT0gJ19fbWVtYmVyc19fJzoKLQkJCWtleXMgPSBzZWxmLl9wcmVmc2RpY3Qua2V5cygpCi0JCQlrZXlzLnNvcnQoKQotCQkJcmV0dXJuIGtleXMKLQkJdHJ5OgotCQkJcmV0dXJuIHNlbGYuX3ByZWZzZGljdFthdHRyXQotCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQlpZiBhdHRyWzBdIDw+ICdfJzoKLQkJCQlzZWxmLl9wcmVmc2RpY3RbYXR0cl0gPSBQcmVmT2JqZWN0KCkKLQkJCQlyZXR1cm4gc2VsZi5fcHJlZnNkaWN0W2F0dHJdCi0JCQllbHNlOgotCQkJCXJhaXNlIEF0dHJpYnV0ZUVycm9yLCBhdHRyCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcGF0aCwgY3JlYXRvciA9ICdQeXRoJyk6CisgICAgICAgICMgRmluZCB0aGUgcHJlZmVyZW5jZXMgZm9sZGVyIGFuZCBvdXIgcHJlZnMgZmlsZSwgY3JlYXRlIGlmIG5lZWRlZC4KKyAgICAgICAgc2VsZi5fX3BhdGggPSBwYXRoCisgICAgICAgIHNlbGYuX19jcmVhdG9yID0gY3JlYXRvcgorICAgICAgICBzZWxmLl9wcmVmc2RpY3QgPSB7fQorICAgICAgICB0cnk6CisgICAgICAgICAgICBwcmVmZGljdCA9IG1hcnNoYWwubG9hZChvcGVuKHNlbGYuX19wYXRoLCAncmInKSkKKyAgICAgICAgZXhjZXB0IChJT0Vycm9yLCBWYWx1ZUVycm9yKToKKyAgICAgICAgICAgICMgZmlsZSBub3QgZm91bmQsIG9yIGN1cnJ1cHQgbWFyc2hhbCBkYXRhCisgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBwcmVmZGljdC5pdGVtcygpOgorICAgICAgICAgICAgICAgIGlmIHR5cGUodmFsdWUpID09IHR5cGVzLkRpY3RUeXBlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9wcmVmc2RpY3Rba2V5XSA9IFByZWZPYmplY3QodmFsdWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJlZnNkaWN0W2tleV0gPSB2YWx1ZQorCisgICAgZGVmIHNhdmUoc2VsZik6CisgICAgICAgIHByZWZkaWN0ID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5fcHJlZnNkaWN0Lml0ZW1zKCk6CisgICAgICAgICAgICBpZiB0eXBlKHZhbHVlKSA9PSB0eXBlcy5JbnN0YW5jZVR5cGU6CisgICAgICAgICAgICAgICAgcHJlZmRpY3Rba2V5XSA9IHZhbHVlLmdldHByZWZzZGljdCgpCisgICAgICAgICAgICAgICAgaWYgbm90IHByZWZkaWN0W2tleV06CisgICAgICAgICAgICAgICAgICAgIGRlbCBwcmVmZGljdFtrZXldCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHByZWZkaWN0W2tleV0gPSB2YWx1ZQorICAgICAgICBtYXJzaGFsLmR1bXAocHJlZmRpY3QsIG9wZW4oc2VsZi5fX3BhdGgsICd3YicpKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShzZWxmLl9fcGF0aCwgc2VsZi5fX2NyZWF0b3IsICdwcmVmJykKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcGFzcworCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyID09ICdfX21lbWJlcnNfXyc6CisgICAgICAgICAgICBrZXlzID0gc2VsZi5fcHJlZnNkaWN0LmtleXMoKQorICAgICAgICAgICAga2V5cy5zb3J0KCkKKyAgICAgICAgICAgIHJldHVybiBrZXlzCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJldHVybiBzZWxmLl9wcmVmc2RpY3RbYXR0cl0KKyAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgaWYgYXR0clswXSA8PiAnXyc6CisgICAgICAgICAgICAgICAgc2VsZi5fcHJlZnNkaWN0W2F0dHJdID0gUHJlZk9iamVjdCgpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ByZWZzZGljdFthdHRyXQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgogCiAKIF9wcmVmc2NhY2hlID0ge30KIAogZGVmIEdldFByZWZzKHByZWZuYW1lLCBjcmVhdG9yID0gJ1B5dGgnKToKLQlpbXBvcnQgbWFjb3N0b29scywgb3MKLQlpZiBfcHJlZnNjYWNoZS5oYXNfa2V5KHByZWZuYW1lKToKLQkJcmV0dXJuIF9wcmVmc2NhY2hlW3ByZWZuYW1lXQotCSMgRmluZCB0aGUgcHJlZmVyZW5jZXMgZm9sZGVyIGFuZCBvdXIgcHJlZnMgZmlsZSwgY3JlYXRlIGlmIG5lZWRlZC4KLQlmc3IgPSBGb2xkZXIuRlNGaW5kRm9sZGVyKEZvbGRlcnMua09uU3lzdGVtRGlzaywgJ3ByZWYnLCAxKQotCXByZWZzZm9sZGVyID0gZnNyLmFzX3BhdGhuYW1lKCkKLQlwYXRoID0gb3MucGF0aC5qb2luKHByZWZzZm9sZGVyLCBwcmVmbmFtZSkKLQloZWFkLCB0YWlsID0gb3MucGF0aC5zcGxpdChwYXRoKQotCSMgbWFrZSBzdXJlIHRoZSBmb2xkZXIocykgZXhpc3QKLQltYWNvc3Rvb2xzLm1rZGlycyhoZWFkKQotCQotCXByZWZmaWxlID0gUHJlZkZpbGUocGF0aCwgY3JlYXRvcikKLQlfcHJlZnNjYWNoZVtwcmVmbmFtZV0gPSBwcmVmZmlsZQotCXJldHVybiBwcmVmZmlsZQorICAgIGltcG9ydCBtYWNvc3Rvb2xzLCBvcworICAgIGlmIF9wcmVmc2NhY2hlLmhhc19rZXkocHJlZm5hbWUpOgorICAgICAgICByZXR1cm4gX3ByZWZzY2FjaGVbcHJlZm5hbWVdCisgICAgIyBGaW5kIHRoZSBwcmVmZXJlbmNlcyBmb2xkZXIgYW5kIG91ciBwcmVmcyBmaWxlLCBjcmVhdGUgaWYgbmVlZGVkLgorICAgIGZzciA9IEZvbGRlci5GU0ZpbmRGb2xkZXIoRm9sZGVycy5rT25TeXN0ZW1EaXNrLCAncHJlZicsIDEpCisgICAgcHJlZnNmb2xkZXIgPSBmc3IuYXNfcGF0aG5hbWUoKQorICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ocHJlZnNmb2xkZXIsIHByZWZuYW1lKQorICAgIGhlYWQsIHRhaWwgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgIyBtYWtlIHN1cmUgdGhlIGZvbGRlcihzKSBleGlzdAorICAgIG1hY29zdG9vbHMubWtkaXJzKGhlYWQpCisKKyAgICBwcmVmZmlsZSA9IFByZWZGaWxlKHBhdGgsIGNyZWF0b3IpCisgICAgX3ByZWZzY2FjaGVbcHJlZm5hbWVdID0gcHJlZmZpbGUKKyAgICByZXR1cm4gcHJlZmZpbGUKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvTW9kdWxlQnJvd3Nlci5weSBiL01hYy9Ub29scy9JREUvTW9kdWxlQnJvd3Nlci5weQppbmRleCAwZTg4NTBmLi45ZmUxMDY0IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL01vZHVsZUJyb3dzZXIucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Nb2R1bGVCcm93c2VyLnB5CkBAIC02LDE3MiArNiwxNzIgQEAKIF9fYXV0aG9yX18gPSAianZyIgogCiBjbGFzcyBfbW9kdWxlYnJvd3NlcjoKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYuZWRpdG1vZHVsZXMgPSBbXQotCQlzZWxmLm1vZHVsZXMgPSBbXQotCQlzZWxmLndpbmRvdyA9IFcuV2luZG93KCgyMTAsIDEwMDApLCAiTW9kdWxlIEJyb3dzZXIiLCBtaW5zaXplID0gKDIxMCwgMTYwKSwgbWF4c2l6ZSA9ICgzNDAsIDIwMDAwKSkKLQkJCi0JCXNlbGYud2luZG93Lm9wZW5idXR0b24gPSBXLkJ1dHRvbigoMTAsIDgsIDkwLCAxNiksICJPcGVuIiwgc2VsZi5vcGVuYnV0dG9uaGl0KQotCQlzZWxmLndpbmRvdy5icm93c2VidXR0b24gPSBXLkJ1dHRvbigoMTEwLCA4LCA5MCwgMTYpLCAiQnJvd3NlXHhjOSIsIHNlbGYuYnJvd3NlYnV0dG9uaGl0KQotCQlzZWxmLndpbmRvdy5yZWxvYWRidXR0b24gPSBXLkJ1dHRvbigoMTAsIDMyLCA5MCwgMTYpLCAiUmVsb2FkIiwgc2VsZi5yZWxvYWRidXR0b25oaXQpCi0JCXNlbGYud2luZG93Lm9wZW5vdGhlcmJ1dHRvbiA9IFcuQnV0dG9uKCgxMTAsIDMyLCA5MCwgMTYpLCAiT3BlbiBvdGhlclx4YzkiLCBzZWxmLm9wZW5vdGhlcikKLQkJCi0JCXNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCi0JCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKLQkJc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLmVuYWJsZSgwKQotCQlzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKLQkJCi0JCXNlbGYud2luZG93LmJpbmQoImNtZHIiLCBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24ucHVzaCkKLQkJc2VsZi53aW5kb3cuYmluZCgiY21kYiIsIHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5wdXNoKQotCQotCQlzZWxmLndpbmRvdy5iaW5kKCI8YWN0aXZhdGU+Iiwgc2VsZi5hY3RpdmF0ZSkKLQkJc2VsZi53aW5kb3cuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCi0JCQotCQlzZWxmLndpbmRvdy5saXN0ID0gVy5MaXN0KCgtMSwgNTYsIDEsIC0xNCksIFtdLCBzZWxmLmxpc3RoaXQpCi0JCQotCQlzZWxmLndpbmRvdy5vcGVuKCkKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJZ2xvYmFsIF9icm93c2VyCi0JCV9icm93c2VyID0gTm9uZQotCQotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi5tYWtlbGlzdCgpCi0JCQotCWRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsKToKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQlpZiBpc2RibDoKLQkJCWlmIHNlbGYud2luZG93Ll9kZWZhdWx0YnV0dG9uOgotCQkJCXNlbGYud2luZG93Ll9kZWZhdWx0YnV0dG9uLnB1c2goKQotCQotCWRlZiBjaGVja2J1dHRvbnMoc2VsZik6Ci0JCXNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKLQkJaWYgc2VsOgotCQkJZm9yIGkgaW4gc2VsOgotCQkJCWlmIHNlbGYuZWRpdG1vZHVsZXNbaV06Ci0JCQkJCXNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDEpCi0JCQkJCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMSkKLQkJCQkJc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5vcGVuYnV0dG9uKQotCQkJCQlicmVhawotCQkJZWxzZToKLQkJCQlzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQotCQkJCXNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5lbmFibGUoMCkKLQkJCQlzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKLQkJCXNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5lbmFibGUoMSkKLQkJZWxzZToKLQkJCSNzZWxmLndpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbikKLQkJCXNlbGYud2luZG93Lm9wZW5idXR0b24uZW5hYmxlKDApCi0JCQlzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDApCi0JCQlzZWxmLndpbmRvdy5icm93c2VidXR0b24uZW5hYmxlKDApCi0JCi0JZGVmIG9wZW5idXR0b25oaXQoc2VsZik6Ci0JCWltcG9ydCBpbXAKLQkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQotCQlXLlNldEN1cnNvcigid2F0Y2giKQotCQlmb3IgaSBpbiBzZWw6Ci0JCQltb2RuYW1lID0gc2VsZi53aW5kb3cubGlzdFtpXQotCQkJdHJ5OgotCQkJCXNlbGYub3BlbnNjcmlwdChzeXMubW9kdWxlc1ttb2RuYW1lXS5fX2ZpbGVfXywgbW9kbmFtZSkKLQkJCWV4Y2VwdCBJT0Vycm9yOgotCQkJCXRyeToKLQkJCQkJZmlsZSwgcGF0aCwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUobW9kbmFtZSkKLQkJCQlleGNlcHQgSW1wb3J0RXJyb3I6Ci0JCQkJCVcuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCQkJCVcuTWVzc2FnZSgiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJyVzJy4iIAotCQkJCQkJCSUgbW9kbmFtZSkKLQkJCQllbHNlOgotCQkJCQlzZWxmLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZSkJCQkJCQotCQotCWRlZiBvcGVuc2NyaXB0KHNlbGYsIHBhdGgsIG1vZG5hbWUpOgotCQlpbXBvcnQgb3MKLQkJaWYgcGF0aFstMzpdID09ICcucHknOgotCQkJVy5nZXRhcHBsaWNhdGlvbigpLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZT1tb2RuYW1lKQotCQllbGlmIHBhdGhbLTQ6XSBpbiBbJy5weWMnLCAnLnB5byddOgotCQkJVy5nZXRhcHBsaWNhdGlvbigpLm9wZW5zY3JpcHQocGF0aFs6LTFdLCBtb2RuYW1lPW1vZG5hbWUpCi0JCWVsc2U6Ci0JCQlXLk1lc3NhZ2UoIkNhbid0IGVkaXQgJyVzJzsgaXQgbWlnaHQgYmUgYSBzaGFyZWQgbGlicmFyeSBvciBhIC5weWMgZmlsZS4iIAotCQkJCQklIG1vZG5hbWUpCi0JCi0JZGVmIG9wZW5vdGhlcihzZWxmKToKLQkJaW1wb3J0IGltcAotCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJCi0JCW1vZG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIk9wZW4gbW9kdWxlOiIpCi0JCWlmIG1vZG5hbWU6Ci0JCQl0cnk6Ci0JCQkJZmlsZSwgcGF0aCwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUobW9kbmFtZSkKLQkJCWV4Y2VwdCBJbXBvcnRFcnJvcjoKLQkJCQlpZiBtb2RuYW1lIGluIHN5cy5idWlsdGluX21vZHVsZV9uYW1lczoKLQkJCQkJYWxlcnR0ZXh0ID0gIiclcycgaXMgYSBidWlsdGluIG1vZHVsZSwgd2hpY2ggeW91IGNhbid0IGVkaXQuIiAlIG1vZG5hbWUKLQkJCQllbHNlOgotCQkJCQlhbGVydHRleHQgPSAiTm8gbW9kdWxlIG5hbWVkICclcycuIiAlIG1vZG5hbWUKLQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsIGFsZXJ0dGV4dAotCQkJc2VsZi5vcGVuc2NyaXB0KHBhdGgsIG1vZG5hbWUpCi0JCi0JZGVmIHJlbG9hZGJ1dHRvbmhpdChzZWxmKToKLQkJc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQotCQlXLlNldEN1cnNvcigid2F0Y2giKQotCQlmb3IgaSBpbiBzZWw6Ci0JCQltbmFtZSA9IHNlbGYud2luZG93Lmxpc3RbaV0KLQkJCW0gPSBzeXMubW9kdWxlc1ttbmFtZV0KLQkJCSMgU2V0IHRoZSBfX25hbWVfXyBhdHRyaWJ1dGUgb2YgdGhlIG1vZHVsZSB0byBpdHMgcmVhbCBuYW1lLgotCQkJIyByZWxvYWQoKSBjb21wbGFpbnMgaWYgaXQncyBfX21haW5fXywgd2hpY2ggaXMgdHJ1ZQotCQkJIyB3aGVuIGl0IHJlY2VudGx5IGhhcyBiZWVuIHJ1biBhcyBhIHNjcmlwdCB3aXRoICJSdW4gYXMgX19tYWluX18iIAotCQkJIyBlbmFibGVkLgotCQkJbS5fX25hbWVfXyA9IG1uYW1lCi0JCQlyZWxvYWQobSkKLQkKLQlkZWYgYnJvd3NlYnV0dG9uaGl0KHNlbGYpOgotCQlzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCi0JCWlmIG5vdCBzZWw6Ci0JCQlyZXR1cm4KLQkJaW1wb3J0IFB5QnJvd3NlcgotCQlmb3IgaSBpbiBzZWw6Ci0JCQlQeUJyb3dzZXIuQnJvd3NlcihzeXMubW9kdWxlc1tzZWxmLndpbmRvdy5saXN0W2ldXSkKLQkKLQlkZWYgbWFrZWxpc3Qoc2VsZik6Ci0JCWVkaXRtb2R1bGVzLCBtb2R1bGVzID0gZ2V0bW9kdWxlc2xpc3QoKQotCQlpZiBtb2R1bGVzID09IHNlbGYubW9kdWxlczoKLQkJCXJldHVybgotCQlzZWxmLmVkaXRtb2R1bGVzLCBzZWxmLm1vZHVsZXMgPSBlZGl0bW9kdWxlcywgbW9kdWxlcwotCQlzZWxmLndpbmRvdy5saXN0LnNldGRyYXdpbmdtb2RlKDApCi0JCXNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJc2VsZi53aW5kb3cubGlzdC5zZXQoc2VsZi5tb2R1bGVzKQotCQlzZWxmLndpbmRvdy5saXN0LnNldHNlbGVjdGVkb2JqZWN0cyhzZWwpCi0JCXNlbGYud2luZG93Lmxpc3Quc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5lZGl0bW9kdWxlcyA9IFtdCisgICAgICAgIHNlbGYubW9kdWxlcyA9IFtdCisgICAgICAgIHNlbGYud2luZG93ID0gVy5XaW5kb3coKDIxMCwgMTAwMCksICJNb2R1bGUgQnJvd3NlciIsIG1pbnNpemUgPSAoMjEwLCAxNjApLCBtYXhzaXplID0gKDM0MCwgMjAwMDApKQorCisgICAgICAgIHNlbGYud2luZG93Lm9wZW5idXR0b24gPSBXLkJ1dHRvbigoMTAsIDgsIDkwLCAxNiksICJPcGVuIiwgc2VsZi5vcGVuYnV0dG9uaGl0KQorICAgICAgICBzZWxmLndpbmRvdy5icm93c2VidXR0b24gPSBXLkJ1dHRvbigoMTEwLCA4LCA5MCwgMTYpLCAiQnJvd3NlXHhjOSIsIHNlbGYuYnJvd3NlYnV0dG9uaGl0KQorICAgICAgICBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24gPSBXLkJ1dHRvbigoMTAsIDMyLCA5MCwgMTYpLCAiUmVsb2FkIiwgc2VsZi5yZWxvYWRidXR0b25oaXQpCisgICAgICAgIHNlbGYud2luZG93Lm9wZW5vdGhlcmJ1dHRvbiA9IFcuQnV0dG9uKCgxMTAsIDMyLCA5MCwgMTYpLCAiT3BlbiBvdGhlclx4YzkiLCBzZWxmLm9wZW5vdGhlcikKKworICAgICAgICBzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDApCisgICAgICAgIHNlbGYud2luZG93LmJyb3dzZWJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCisKKyAgICAgICAgc2VsZi53aW5kb3cuYmluZCgiY21kciIsIHNlbGYud2luZG93LnJlbG9hZGJ1dHRvbi5wdXNoKQorICAgICAgICBzZWxmLndpbmRvdy5iaW5kKCJjbWRiIiwgc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLnB1c2gpCisKKyAgICAgICAgc2VsZi53aW5kb3cuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCisgICAgICAgIHNlbGYud2luZG93LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmNsb3NlKQorCisgICAgICAgIHNlbGYud2luZG93Lmxpc3QgPSBXLkxpc3QoKC0xLCA1NiwgMSwgLTE0KSwgW10sIHNlbGYubGlzdGhpdCkKKworICAgICAgICBzZWxmLndpbmRvdy5vcGVuKCkKKyAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBnbG9iYWwgX2Jyb3dzZXIKKyAgICAgICAgX2Jyb3dzZXIgPSBOb25lCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYubWFrZWxpc3QoKQorCisgICAgZGVmIGxpc3RoaXQoc2VsZiwgaXNkYmwpOgorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisgICAgICAgIGlmIGlzZGJsOgorICAgICAgICAgICAgaWYgc2VsZi53aW5kb3cuX2RlZmF1bHRidXR0b246CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuX2RlZmF1bHRidXR0b24ucHVzaCgpCisKKyAgICBkZWYgY2hlY2tidXR0b25zKHNlbGYpOgorICAgICAgICBzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGlvbigpCisgICAgICAgIGlmIHNlbDoKKyAgICAgICAgICAgIGZvciBpIGluIHNlbDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmVkaXRtb2R1bGVzW2ldOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYud2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53aW5kb3cub3BlbmJ1dHRvbikKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3cub3BlbmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvdy5yZWxvYWRidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCisgICAgICAgICAgICBzZWxmLndpbmRvdy5icm93c2VidXR0b24uZW5hYmxlKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjc2VsZi53aW5kb3cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndpbmRvdy5icm93c2VidXR0b24pCisgICAgICAgICAgICBzZWxmLndpbmRvdy5vcGVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53aW5kb3cucmVsb2FkYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53aW5kb3cuYnJvd3NlYnV0dG9uLmVuYWJsZSgwKQorCisgICAgZGVmIG9wZW5idXR0b25oaXQoc2VsZik6CisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgc2VsID0gc2VsZi53aW5kb3cubGlzdC5nZXRzZWxlY3Rpb24oKQorICAgICAgICBXLlNldEN1cnNvcigid2F0Y2giKQorICAgICAgICBmb3IgaSBpbiBzZWw6CisgICAgICAgICAgICBtb2RuYW1lID0gc2VsZi53aW5kb3cubGlzdFtpXQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHNlbGYub3BlbnNjcmlwdChzeXMubW9kdWxlc1ttb2RuYW1lXS5fX2ZpbGVfXywgbW9kbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBJT0Vycm9yOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZmlsZSwgcGF0aCwgZGVzY3JpcHRpb24gPSBpbXAuZmluZF9tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6CisgICAgICAgICAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCJhcnJvdyIpCisgICAgICAgICAgICAgICAgICAgIFcuTWVzc2FnZSgiQ2FuJ3QgZmluZCBmaWxlIGZvciBtb2R1bGUgJyVzJy4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlIG1vZG5hbWUpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KHBhdGgsIG1vZG5hbWUpCisKKyAgICBkZWYgb3BlbnNjcmlwdChzZWxmLCBwYXRoLCBtb2RuYW1lKToKKyAgICAgICAgaW1wb3J0IG9zCisgICAgICAgIGlmIHBhdGhbLTM6XSA9PSAnLnB5JzoKKyAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KHBhdGgsIG1vZG5hbWU9bW9kbmFtZSkKKyAgICAgICAgZWxpZiBwYXRoWy00Ol0gaW4gWycucHljJywgJy5weW8nXToKKyAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KHBhdGhbOi0xXSwgbW9kbmFtZT1tb2RuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVy5NZXNzYWdlKCJDYW4ndCBlZGl0ICclcyc7IGl0IG1pZ2h0IGJlIGEgc2hhcmVkIGxpYnJhcnkgb3IgYSAucHljIGZpbGUuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgbW9kbmFtZSkKKworICAgIGRlZiBvcGVub3RoZXIoc2VsZik6CisgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisKKyAgICAgICAgbW9kbmFtZSA9IEVhc3lEaWFsb2dzLkFza1N0cmluZygiT3BlbiBtb2R1bGU6IikKKyAgICAgICAgaWYgbW9kbmFtZToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlLCBwYXRoLCBkZXNjcmlwdGlvbiA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIGlmIG1vZG5hbWUgaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgorICAgICAgICAgICAgICAgICAgICBhbGVydHRleHQgPSAiJyVzJyBpcyBhIGJ1aWx0aW4gbW9kdWxlLCB3aGljaCB5b3UgY2FuJ3QgZWRpdC4iICUgbW9kbmFtZQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGFsZXJ0dGV4dCA9ICJObyBtb2R1bGUgbmFtZWQgJyVzJy4iICUgbW9kbmFtZQorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgYWxlcnR0ZXh0CisgICAgICAgICAgICBzZWxmLm9wZW5zY3JpcHQocGF0aCwgbW9kbmFtZSkKKworICAgIGRlZiByZWxvYWRidXR0b25oaXQoc2VsZik6CisgICAgICAgIHNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgVy5TZXRDdXJzb3IoIndhdGNoIikKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgbW5hbWUgPSBzZWxmLndpbmRvdy5saXN0W2ldCisgICAgICAgICAgICBtID0gc3lzLm1vZHVsZXNbbW5hbWVdCisgICAgICAgICAgICAjIFNldCB0aGUgX19uYW1lX18gYXR0cmlidXRlIG9mIHRoZSBtb2R1bGUgdG8gaXRzIHJlYWwgbmFtZS4KKyAgICAgICAgICAgICMgcmVsb2FkKCkgY29tcGxhaW5zIGlmIGl0J3MgX19tYWluX18sIHdoaWNoIGlzIHRydWUKKyAgICAgICAgICAgICMgd2hlbiBpdCByZWNlbnRseSBoYXMgYmVlbiBydW4gYXMgYSBzY3JpcHQgd2l0aCAiUnVuIGFzIF9fbWFpbl9fIgorICAgICAgICAgICAgIyBlbmFibGVkLgorICAgICAgICAgICAgbS5fX25hbWVfXyA9IG1uYW1lCisgICAgICAgICAgICByZWxvYWQobSkKKworICAgIGRlZiBicm93c2VidXR0b25oaXQoc2VsZik6CisgICAgICAgIHNlbCA9IHNlbGYud2luZG93Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbm90IHNlbDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbXBvcnQgUHlCcm93c2VyCisgICAgICAgIGZvciBpIGluIHNlbDoKKyAgICAgICAgICAgIFB5QnJvd3Nlci5Ccm93c2VyKHN5cy5tb2R1bGVzW3NlbGYud2luZG93Lmxpc3RbaV1dKQorCisgICAgZGVmIG1ha2VsaXN0KHNlbGYpOgorICAgICAgICBlZGl0bW9kdWxlcywgbW9kdWxlcyA9IGdldG1vZHVsZXNsaXN0KCkKKyAgICAgICAgaWYgbW9kdWxlcyA9PSBzZWxmLm1vZHVsZXM6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5lZGl0bW9kdWxlcywgc2VsZi5tb2R1bGVzID0gZWRpdG1vZHVsZXMsIG1vZHVsZXMKKyAgICAgICAgc2VsZi53aW5kb3cubGlzdC5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICBzZWwgPSBzZWxmLndpbmRvdy5saXN0LmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgIHNlbGYud2luZG93Lmxpc3Quc2V0KHNlbGYubW9kdWxlcykKKyAgICAgICAgc2VsZi53aW5kb3cubGlzdC5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQorICAgICAgICBzZWxmLndpbmRvdy5saXN0LnNldGRyYXdpbmdtb2RlKDEpCiAKIAogZGVmIGdldG1vZHVsZXNsaXN0KCk6Ci0JaW1wb3J0IFB5QnJvd3NlcgkjIGZvciBjYXNlbGVzc3NvcnQgZnVuY3Rpb24KLQltb2R1bGVpdGVtcyA9IHN5cy5tb2R1bGVzLml0ZW1zKCkKLQltb2R1bGVpdGVtcyA9IGZpbHRlcihsYW1iZGEgKG5hbWUsIG1vZHVsZSk6IG1vZHVsZSBpcyBub3QgTm9uZSwgbW9kdWxlaXRlbXMpCi0JbW9kdWxlcyA9IG1hcChsYW1iZGEgKG5hbWUsIG1vZHVsZSk6IG5hbWUsIG1vZHVsZWl0ZW1zKQotCW1vZHVsZXMgPSBQeUJyb3dzZXIuY2FzZWxlc3Nzb3J0KG1vZHVsZXMpCi0JZWRpdG1vZHVsZXMgPSBbXQotCXN5c21vZHVsZXMgPSBzeXMubW9kdWxlcwotCW1vZHVsZXNhcHBlbmQgPSBlZGl0bW9kdWxlcy5hcHBlbmQKLQlmb3IgbSBpbiBtb2R1bGVzOgotCQltb2R1bGUgPSBzeXNtb2R1bGVzW21dCi0JCXRyeToKLQkJCWlmIHN5c21vZHVsZXNbbV0uX19maWxlX19bLTM6XSA9PSAnLnB5JyBvciBcCi0JCQkJCXN5c21vZHVsZXNbbV0uX19maWxlX19bLTQ6XSBpbiBbJy5weWMnLCAnLnB5byddOgotCQkJCW1vZHVsZXNhcHBlbmQoMSkKLQkJCWVsc2U6Ci0JCQkJbW9kdWxlc2FwcGVuZCgwKQotCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQltb2R1bGVzYXBwZW5kKDApCi0JcmV0dXJuIGVkaXRtb2R1bGVzLCBtb2R1bGVzCi0JCi0JCisgICAgaW1wb3J0IFB5QnJvd3NlciAgICAgICAgIyBmb3IgY2FzZWxlc3Nzb3J0IGZ1bmN0aW9uCisgICAgbW9kdWxlaXRlbXMgPSBzeXMubW9kdWxlcy5pdGVtcygpCisgICAgbW9kdWxlaXRlbXMgPSBmaWx0ZXIobGFtYmRhIChuYW1lLCBtb2R1bGUpOiBtb2R1bGUgaXMgbm90IE5vbmUsIG1vZHVsZWl0ZW1zKQorICAgIG1vZHVsZXMgPSBtYXAobGFtYmRhIChuYW1lLCBtb2R1bGUpOiBuYW1lLCBtb2R1bGVpdGVtcykKKyAgICBtb2R1bGVzID0gUHlCcm93c2VyLmNhc2VsZXNzc29ydChtb2R1bGVzKQorICAgIGVkaXRtb2R1bGVzID0gW10KKyAgICBzeXNtb2R1bGVzID0gc3lzLm1vZHVsZXMKKyAgICBtb2R1bGVzYXBwZW5kID0gZWRpdG1vZHVsZXMuYXBwZW5kCisgICAgZm9yIG0gaW4gbW9kdWxlczoKKyAgICAgICAgbW9kdWxlID0gc3lzbW9kdWxlc1ttXQorICAgICAgICB0cnk6CisgICAgICAgICAgICBpZiBzeXNtb2R1bGVzW21dLl9fZmlsZV9fWy0zOl0gPT0gJy5weScgb3IgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c21vZHVsZXNbbV0uX19maWxlX19bLTQ6XSBpbiBbJy5weWMnLCAnLnB5byddOgorICAgICAgICAgICAgICAgIG1vZHVsZXNhcHBlbmQoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kdWxlc2FwcGVuZCgwKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICBtb2R1bGVzYXBwZW5kKDApCisgICAgcmV0dXJuIGVkaXRtb2R1bGVzLCBtb2R1bGVzCisKKwogCiBfYnJvd3NlciA9IE5vbmUKIAogZGVmIE1vZHVsZUJyb3dzZXIoKToKLQlnbG9iYWwgX2Jyb3dzZXIKLQlpZiBfYnJvd3NlciBpcyBub3QgTm9uZToKLQkJX2Jyb3dzZXIud2luZG93LnNlbGVjdCgpCi0JZWxzZToKLQkJX2Jyb3dzZXIgPSBfbW9kdWxlYnJvd3NlcigpCisgICAgZ2xvYmFsIF9icm93c2VyCisgICAgaWYgX2Jyb3dzZXIgaXMgbm90IE5vbmU6CisgICAgICAgIF9icm93c2VyLndpbmRvdy5zZWxlY3QoKQorICAgIGVsc2U6CisgICAgICAgIF9icm93c2VyID0gX21vZHVsZWJyb3dzZXIoKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5weSBiL01hYy9Ub29scy9JREUvUGFja2FnZU1hbmFnZXIucHkKaW5kZXggZWU2MzU1Yi4uMDA0MWExNyAxMDA3NTUKLS0tIGEvTWFjL1Rvb2xzL0lERS9QYWNrYWdlTWFuYWdlci5weQorKysgYi9NYWMvVG9vbHMvSURFL1BhY2thZ2VNYW5hZ2VyLnB5CkBAIC0xLDM3ICsxLDM3IEBACiAjIFByZWx1ZGUgdG8gYWxsb3cgcnVubmluZyB0aGlzIGFzIGEgbWFpbiBwcm9ncmFtCiBkZWYgX2luaXQoKToKLQlpbXBvcnQgbWFjcmVzb3VyY2UKLQlpbXBvcnQgc3lzLCBvcwotCW1hY3Jlc291cmNlLm5lZWQoJ0RJVEwnLCA0NjgsICJQeXRob25JREUucnNyYyIpCi0Jd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQotCXdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyh3aWRnZXRyZXNmaWxlKToKLQkJd2lkZ2V0cmVzcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIiwgIldpZGdldHMucnNyYyJdCi0JCXdpZGdldHJlc2ZpbGUgPSBvcy5wYXRoLmpvaW4oKndpZGdldHJlc3BhdGhzZWdzKQotCXJlZm5vID0gbWFjcmVzb3VyY2UubmVlZCgnQ1VSUycsIDQ2OCwgd2lkZ2V0cmVzZmlsZSkKLQlpZiBvcy5lbnZpcm9uLmhhc19rZXkoJ1BZVEhPTklERVBBVEgnKToKLQkJIyBGb3IgZGV2ZWxvcG1lbnQgc2V0IHRoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUKLQkJaWRlX3BhdGggPSBvcy5lbnZpcm9uWydQWVRIT05JREVQQVRIJ10KLQllbGlmIHJlZm5vOgotCQkjIFdlJ3JlIG5vdCBhIGZ1bGxibG93biBhcHBsaWNhdGlvbgotCQlpZGVwYXRoc2VncyA9IFtzeXMuZXhlY19wcmVmaXgsICJNYWMiLCAiVG9vbHMiLCAiSURFIl0KLQkJaWRlX3BhdGggPSBvcy5wYXRoLmpvaW4oKmlkZXBhdGhzZWdzKQotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgotCQkJaWRlcGF0aHNlZ3MgPSBbb3MucGFyZGlyLCAiVG9vbHMiLCAiSURFIl0KLQkJCWZvciBwIGluIHN5cy5wYXRoOgotCQkJCWlkZV9wYXRoID0gb3MucGF0aC5qb2luKCooW3BdK2lkZXBhdGhzZWdzKSkKLQkJCQlpZiBvcy5wYXRoLmV4aXN0cyhpZGVfcGF0aCk6Ci0JCQkJCWJyZWFrCi0JCQotCWVsc2U6Ci0JCSMgV2UgYXJlIGEgZnVsbHkgZnJvemVuIGFwcGxpY2F0aW9uCi0JCWlkZV9wYXRoID0gc3lzLmFyZ3ZbMF0KLQlpZiBpZGVfcGF0aCBub3QgaW4gc3lzLnBhdGg6Ci0JCXN5cy5wYXRoLmluc2VydCgwLCBpZGVfcGF0aCkKLQkJCisgICAgaW1wb3J0IG1hY3Jlc291cmNlCisgICAgaW1wb3J0IHN5cywgb3MKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdESVRMJywgNDY4LCAiUHl0aG9uSURFLnJzcmMiKQorICAgIHdpZGdldHJlc3BhdGhzZWdzID0gW3N5cy5leGVjX3ByZWZpeCwgIk1hYyIsICJUb29scyIsICJJREUiLCAiV2lkZ2V0cy5yc3JjIl0KKyAgICB3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMod2lkZ2V0cmVzZmlsZSk6CisgICAgICAgIHdpZGdldHJlc3BhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQorICAgICAgICB3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKKyAgICByZWZubyA9IG1hY3Jlc291cmNlLm5lZWQoJ0NVUlMnLCA0NjgsIHdpZGdldHJlc2ZpbGUpCisgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdQWVRIT05JREVQQVRIJyk6CisgICAgICAgICMgRm9yIGRldmVsb3BtZW50IHNldCB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgIGlkZV9wYXRoID0gb3MuZW52aXJvblsnUFlUSE9OSURFUEFUSCddCisgICAgZWxpZiByZWZubzoKKyAgICAgICAgIyBXZSdyZSBub3QgYSBmdWxsYmxvd24gYXBwbGljYXRpb24KKyAgICAgICAgaWRlcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSJdCisgICAgICAgIGlkZV9wYXRoID0gb3MucGF0aC5qb2luKCppZGVwYXRoc2VncykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGlkZV9wYXRoKToKKyAgICAgICAgICAgIGlkZXBhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSJdCisgICAgICAgICAgICBmb3IgcCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICBpZGVfcGF0aCA9IG9zLnBhdGguam9pbigqKFtwXStpZGVwYXRoc2VncykpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZWxzZToKKyAgICAgICAgIyBXZSBhcmUgYSBmdWxseSBmcm96ZW4gYXBwbGljYXRpb24KKyAgICAgICAgaWRlX3BhdGggPSBzeXMuYXJndlswXQorICAgIGlmIGlkZV9wYXRoIG5vdCBpbiBzeXMucGF0aDoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGlkZV9wYXRoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCV9pbml0KCkKLQkKKyAgICBfaW5pdCgpCisKIGltcG9ydCBXCiBpbXBvcnQgV2FwcGxpY2F0aW9uCiBmcm9tIENhcmJvbiBpbXBvcnQgRXZ0CkBAIC00OCw0MjQgKzQ4LDQyNCBAQAogUEFDS01BTl9IT01FUEFHRT0iaHR0cDovL3d3dy5weXRob24ub3JnL3BhY2ttYW4iCiAKIEVMSVBTRVMgPSAnLi4uJwotCQkKKwogVVNFUl9JTlNUQUxMX0RJUiA9IG9zLnBhdGguam9pbihvcy5lbnZpcm9uLmdldCgnSE9NRScsICcnKSwKLQkJCQkJCQkJJ0xpYnJhcnknLAotCQkJCQkJCQknUHl0aG9uJywKLQkJCQkJCQkJc3lzLnZlcnNpb25bOjNdLAotCQkJCQkJCQknc2l0ZS1wYWNrYWdlcycpCi0JCQkJCQkJCQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdMaWJyYXJ5JywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnUHl0aG9uJywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeXMudmVyc2lvbls6M10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NpdGUtcGFja2FnZXMnKQorCiBjbGFzcyBQYWNrYWdlTWFuYWdlck1haW4oV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUGFja2FnZSBJbnN0YWxsIE1hbmFnZXIgUHJlZnMiKQotCQlXYXBwbGljYXRpb24uQXBwbGljYXRpb24uX19pbml0X18oc2VsZiwgJ1BpbXAnKQotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUUKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFwcGxlRXZlbnRzCi0JCXNlbGYuZGVmYXVsdHVybCA9ICIiCi0JCQotCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuQXBwbGljYXRpb24sIAotCQkJCXNlbGYuaWdub3JlZXZlbnQpCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVJlb3BlbkFwcGxpY2F0aW9uLCAKLQkJCQlzZWxmLmlnbm9yZWV2ZW50KQotCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVQcmludERvY3VtZW50cywgCi0JCQkJc2VsZi5pZ25vcmVldmVudCkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUXVpdEFwcGxpY2F0aW9uLCAKLQkJCQlzZWxmLnF1aXRldmVudCkKLQkJaWYgMToKLQkJCWltcG9ydCBQeUNvbnNvbGUKLQkJCSMgV2l0aCAtRCBvcHRpb24gKE9TWCBjb21tYW5kIGxpbmUgb25seSkga2VlcCBzdGRlcnIsIGZvciBkZWJ1Z2dpbmcgdGhlIElERQotCQkJIyBpdHNlbGYuCi0JCQlkZWJ1Z19zdGRlcnIgPSBOb25lCi0JCQlpZiBsZW4oc3lzLmFyZ3YpID49IDIgYW5kIHN5cy5hcmd2WzFdID09ICctRCc6Ci0JCQkJZGVidWdfc3RkZXJyID0gc3lzLnN0ZGVycgotCQkJCWRlbCBzeXMuYXJndlsxXQotCQkJUHlDb25zb2xlLmluc3RhbGxvdXRwdXQoKQotCQkJaWYgZGVidWdfc3RkZXJyOgotCQkJCXN5cy5zdGRlcnIgPSBkZWJ1Z19zdGRlcnIKLQkJc2VsZi5kb21lbnVfb3BlbnN0YW5kYXJkKCkKLQkJc2VsZi5tYWlubG9vcCgpCi0JCQotCWRlZiBtYWtldXNlcm1lbnVzKHNlbGYpOgotCQltID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiRmlsZSIpCi0JCW5ld2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4gU3RhbmRhcmQgRGF0YWJhc2UiLCAiTiIsICdvcGVuc3RhbmRhcmQnKQotCQluZXdleHBpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIEV4cGVyaW1lbnRhbCBEYXRhYmFzZSIsIE5vbmUsICdvcGVuZXhwZXJpbWVudGFsJykKLQkJbmV3ZXhwaXRlbS5lbmFibGUocGltcC5QSU1QX1ZFUlNJT04gPj0gIjAuNCIpCi0JCW9wZW5pdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJPcGVuIitFTElQU0VTLCAiTyIsICdvcGVuJykKLQkJb3BlblVSTGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4gVVJMIitFTElQU0VTLCAiRCIsICdvcGVuVVJMJykKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQltb3JlaW5mb2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk1vcmUgRGF0YWJhc2VzIiwgTm9uZSwgJ29wZW5kYXRhYmFzZXBhZ2UnKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCWNsb3NlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xvc2UiLCAiVyIsICdjbG9zZScpCi0jIwkJc2F2ZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsICdzYXZlJykKLSMjCQlzYXZlYXNpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIGFzIitFTElQU0VTLCBOb25lLCAnc2F2ZV9hcycpCi0jIwkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQkKLQkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQl1bmRvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiVW5kbyIsICdaJywgInVuZG8iKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCWN1dGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkN1dCIsICdYJywgImN1dCIpCi0JCWNvcHlpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCAiY29weSIpCi0JCXBhc3RlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFzdGUiLCAiViIsICJwYXN0ZSIpCi0JCUZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xlYXIiLCBOb25lLCAgImNsZWFyIikKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlzZWxhbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTZWxlY3QgYWxsIiwgIkEiLCAic2VsZWN0YWxsIikKLQkJCi0JCW0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJQYWNrYWdlIikKLQkJcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiSW5zdGFsbCIsICJJIiwgJ2luc3RhbGwnKQotCQlob21lcGFnZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlZpc2l0IEhvbWVwYWdlIiwgTm9uZSwgJ2hvbWVwYWdlJykKLQkJCi0JCXNlbGYub3BlbndpbmRvd3NtZW51ID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAnV2luZG93cycpCi0JCXNlbGYubWFrZW9wZW53aW5kb3dzbWVudSgpCi0JCXNlbGYubWFrZWhlbHBtZW51KCkKLQkJc2VsZi5fbWVudXN0b2NoZWNrID0gW2Nsb3NlaXRlbSwgCi0JCQkJdW5kb2l0ZW0sIGN1dGl0ZW0sIGNvcHlpdGVtLCBwYXN0ZWl0ZW0sIAotCQkJCXNlbGFsbGl0ZW0sCi0JCQkJcnVuaXRlbSwgaG9tZXBhZ2VpdGVtXQotCQkJCi0JZGVmIG1ha2VoZWxwbWVudShzZWxmKToKLQkJcHl0aG9uX2FwcCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnUmVzb3VyY2VzL1B5dGhvbi5hcHAnKQotCQloZWxwX3NvdXJjZSA9IG9zLnBhdGguam9pbihweXRob25fYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbicpCi0JCWhhc2hlbHAgPSBvcy5wYXRoLmlzZGlyKGhlbHBfc291cmNlKQogCi0JCXNlbGYuaGVscG1lbnUgPSBtID0gc2VsZi5nZXRoZWxwbWVudSgpCi0JCWhlbHBpdGVtMSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFja2FnZU1hbmFnZXIgSGVscCIsIE5vbmUsIHNlbGYuZG9tZW51X3BhY2ttYW5oZWxwKQotCQloZWxwaXRlbTEuZW5hYmxlKGhhc2hlbHApCi0JCWhlbHBpdGVtMiA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTWFjUHl0aG9uIEhlbHAiLCBOb25lLCBzZWxmLmRvbWVudV9weXRob25oZWxwKQotCQloZWxwaXRlbTIuZW5hYmxlKGhhc2hlbHApCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnByZWZmaWxlcGF0aCA9IG9zLnBhdGguam9pbigiUHl0aG9uIiwgIlBhY2thZ2UgSW5zdGFsbCBNYW5hZ2VyIFByZWZzIikKKyAgICAgICAgV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYsICdQaW1wJykKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFFCisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBcHBsZUV2ZW50cworICAgICAgICBzZWxmLmRlZmF1bHR1cmwgPSAiIgogCi0JZGVmIHF1aXRldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6Ci0JCXNlbGYuX3F1aXQoKQotCQkKLQlkZWYgaWdub3JlZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgotCQlwYXNzCi0JCi0JZGVmIG9wZW5kb2NzZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlpbXBvcnQgYWV0b29scwotCQlwYXJhbWV0ZXJzLCBhcmdzID0gYWV0b29scy51bnBhY2tldmVudCh0aGVBcHBsZUV2ZW50KQotCQlkb2NzID0gcGFyYW1ldGVyc1snLS0tLSddCi0JCWlmIHR5cGUoZG9jcykgPD4gdHlwZShbXSk6Ci0JCQlkb2NzID0gW2RvY3NdCi0JCWZvciBkb2MgaW4gZG9jczoKLQkJCWZzciwgYSA9IGRvYy5GU1Jlc29sdmVBbGlhcyhOb25lKQotCQkJcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCi0JCQlwYXRoID0gdXJsbGliLnBhdGhuYW1lMnVybChwYXRoKQotCQkJc2VsZi5vcGVuZG9jKHBhdGgpCi0JCi0JZGVmIG9wZW5kb2Moc2VsZiwgdXJsKToKLQkJaWYgdXJsOgotCQkJc2VsZi5kZWZhdWx0dXJsID0gdXJsCi0JCVBhY2thZ2VCcm93c2VyKHVybCkKLQkKLQlkZWYgZ2V0YWJvdXR0ZXh0KHNlbGYpOgotCQlyZXR1cm4gIkFib3V0IFBhY2thZ2UgTWFuYWdlciIrRUxJUFNFUwotCQotCWRlZiBkb19hYm91dChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIlBhY2thZ2UgSW5zdGFsbCBNYW5hZ2VyIGZvciBQeXRob25cblBhY2tNYW4gZW5naW5lIChwaW1wKSB2ZXJzaW9uOiAlcyIgJQotCQkJcGltcC5QSU1QX1ZFUlNJT04pCi0JCi0JZGVmIGRvbWVudV9vcGVuc3RhbmRhcmQoc2VsZiwgKmFyZ3MpOgotCQlpZiBwaW1wLlBJTVBfVkVSU0lPTiA+PSAiMC40IjoKLQkJCXVybCA9IHBpbXAuZ2V0RGVmYXVsdERhdGFiYXNlKCkKLQkJZWxzZToKLQkJCSMgMC4zIGNvbXBhdGliaWxpdHkKLQkJCXVybCA9IE5vbmUKLQkJc2VsZi5vcGVuZG9jKHVybCkKLQkJCi0JZGVmIGRvbWVudV9vcGVuZXhwZXJpbWVudGFsKHNlbGYsICphcmdzKToKLQkJZGF0YWJhc2UgPSBwaW1wLmdldERlZmF1bHREYXRhYmFzZShleHBlcmltZW50YWw9VHJ1ZSkKLQkJc2VsZi5vcGVuZG9jKGRhdGFiYXNlKQotCQkKLQlkZWYgZG9tZW51X29wZW4oc2VsZiwgKmFyZ3MpOgotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKHR5cGVMaXN0PSgiVEVYVCIsKSkKLQkJaWYgZmlsZW5hbWU6Ci0JCQlmaWxlbmFtZSA9IHVybGxpYi5wYXRobmFtZTJ1cmwoZmlsZW5hbWUpCi0JCQlzZWxmLm9wZW5kb2MoZmlsZW5hbWUpCi0JCQkKLQlkZWYgZG9tZW51X29wZW5VUkwoc2VsZiwgKmFyZ3MpOgotCQlvayA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKAotCQkJIldhcm5pbmc6IGJ5IG9wZW5pbmcgYSBub24tc3RhbmRhcmQgZGF0YWJhc2UgIgotCQkJInlvdSBhcmUgdHJ1c3RpbmcgdGhlIG1haW50YWluZXIgb2YgaXQgIgotCQkJInRvIHJ1biBhcmJpdHJhcnkgY29kZSBvbiB5b3VyIG1hY2hpbmUuIiwKLQkJCXllcz0iT0siLCBubz0iIikKLQkJaWYgb2sgPD0gMDogcmV0dXJuCi0JCXVybCA9IEVhc3lEaWFsb2dzLkFza1N0cmluZygiVVJMIG9mIGRhdGFiYXNlIHRvIG9wZW46IiwgCi0JCQlkZWZhdWx0PXNlbGYuZGVmYXVsdHVybCwgb2s9Ik9wZW4iKQotCQlpZiB1cmw6Ci0JCQlzZWxmLm9wZW5kb2ModXJsKQotCQotCWRlZiBkb21lbnVfb3BlbmRhdGFiYXNlcGFnZShzZWxmKToKLQkJaW1wb3J0IGljCi0JCQkKLQkJaWNyID0gaWMuSUMoKQotCQlpY3IubGF1bmNodXJsKFBBQ0tNQU5fSE9NRVBBR0UpCi0JZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6Ci0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcykpOgotCQkJc2VsZi5vcGVud2luZG93c21lbnUubWVudS5EZWxldGVNZW51SXRlbSgxKQotCQkJc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMgPSBbXQotCQl3aW5kb3dzID0gW10KLQkJc2VsZi5fb3BlbndpbmRvd3MgPSB7fQotCQlmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3Mua2V5cygpOgotCQkJdGl0bGUgPSB3aW5kb3cuR2V0V1RpdGxlKCkKLQkJCWlmIG5vdCB0aXRsZToKLQkJCQl0aXRsZSA9ICI8bm8gdGl0bGU+IgotCQkJd2luZG93cy5hcHBlbmQoKHRpdGxlLCB3aW5kb3cpKQotCQl3aW5kb3dzLnNvcnQoKQotCQlmb3IgdGl0bGUsIHdpbmRvdyBpbiB3aW5kb3dzOgotCQkJc2hvcnRjdXQgPSBOb25lCi0JCQlpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYub3BlbndpbmRvd3NtZW51LCB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrID0gc2VsZi5kb21lbnVfb3BlbndpbmRvd3MpCi0JCQlzZWxmLl9vcGVud2luZG93c1tpdGVtLml0ZW1dID0gd2luZG93Ci0JCXNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAotCQlzZWxmLmNoZWNrb3BlbndpbmRvd3NtZW51KCkKLQkJCi0JZGVmIGRvbWVudV9vcGVud2luZG93cyhzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCXcgPSBzZWxmLl9vcGVud2luZG93c1tpdGVtXQotCQl3LlNob3dXaW5kb3coKQotCQl3LlNlbGVjdFdpbmRvdygpCi0JCi0JZGVmIGRvbWVudV9xdWl0KHNlbGYpOgotCQlzZWxmLl9xdWl0KCkKLQkKLQlkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgotCQlwcmludCAiU2F2ZSIKLQkKLQlkZWYgZG9tZW51X3B5dGhvbmhlbHAoc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJQUguQUhHb3RvUGFnZSgiTWFjUHl0aG9uIEhlbHAiLCBOb25lLCBOb25lKQotCQkKLQlkZWYgZG9tZW51X3BhY2ttYW5oZWxwKHNlbGYsICphcmdzKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCUFILkFIR290b1BhZ2UoIk1hY1B5dGhvbiBIZWxwIiwgInBhY2ttYW4uaHRtbCIsIE5vbmUpCi0JCQotCWRlZiBfcXVpdChzZWxmKToKLSMjCQlpbXBvcnQgUHlDb25zb2xlLCBQeUVkaXQKLQkJZm9yIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzLnZhbHVlcygpOgotCQkJdHJ5OgotCQkJCXJ2ID0gd2luZG93LmNsb3NlKCkgIyBpZ25vcmUgYW55IGVycm9ycyB3aGlsZSBxdWl0dGluZwotCQkJZXhjZXB0OgotCQkJCXJ2ID0gMAkgIyAob3RoZXJ3aXNlLCB3ZSBjYW4gZ2V0IHN0dWNrISkKLQkJCWlmIHJ2IGFuZCBydiA+IDA6Ci0JCQkJcmV0dXJuCi0jIwkJdHJ5OgotIyMJCQlQeUNvbnNvbGUuY29uc29sZS53cml0ZXByZWZzKCkKLSMjCQkJUHlDb25zb2xlLm91dHB1dC53cml0ZXByZWZzKCkKLSMjCQkJUHlFZGl0LnNlYXJjaGVuZ2luZS53cml0ZXByZWZzKCkKLSMjCQlleGNlcHQ6Ci0jIwkJCSMgV3JpdGUgdG8gX19zdGRlcnJfXyBzbyB0aGUgbXNnIGVuZCB1cCBpbiBDb25zb2xlLmFwcCBhbmQgaGFzCi0jIwkJCSMgYXQgbGVhc3QgX3NvbWVfIGNoYW5jZSBvZiBnZXR0aW5nIHJlYWQuLi4KLSMjCQkJIyBCdXQ6IHRoaXMgaXMgYSB3b3JrYXJvdW5kIGZvciB3YXkgbW9yZSBzZXJpb3VzIHByb2JsZW1zIHdpdGgKLSMjCQkJIyB0aGUgUHl0aG9uIDIuMiBKYWd1YXIgYWRkb24uCi0jIwkJCXN5cy5fX3N0ZGVycl9fLndyaXRlKCIqKiogUHl0aG9uSURFOiBDYW4ndCB3cml0ZSBwcmVmZXJlbmNlcyAqKipcbiIpCi0JCXNlbGYucXVpdHRpbmcgPSAxCi0JCQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuQXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZWV2ZW50KQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVSZW9wZW5BcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlZXZlbnQpCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVByaW50RG9jdW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVldmVudCkKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUXVpdEFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWl0ZXZlbnQpCisgICAgICAgIGlmIDE6CisgICAgICAgICAgICBpbXBvcnQgUHlDb25zb2xlCisgICAgICAgICAgICAjIFdpdGggLUQgb3B0aW9uIChPU1ggY29tbWFuZCBsaW5lIG9ubHkpIGtlZXAgc3RkZXJyLCBmb3IgZGVidWdnaW5nIHRoZSBJREUKKyAgICAgICAgICAgICMgaXRzZWxmLgorICAgICAgICAgICAgZGVidWdfc3RkZXJyID0gTm9uZQorICAgICAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSA+PSAyIGFuZCBzeXMuYXJndlsxXSA9PSAnLUQnOgorICAgICAgICAgICAgICAgIGRlYnVnX3N0ZGVyciA9IHN5cy5zdGRlcnIKKyAgICAgICAgICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KKyAgICAgICAgICAgIFB5Q29uc29sZS5pbnN0YWxsb3V0cHV0KCkKKyAgICAgICAgICAgIGlmIGRlYnVnX3N0ZGVycjoKKyAgICAgICAgICAgICAgICBzeXMuc3RkZXJyID0gZGVidWdfc3RkZXJyCisgICAgICAgIHNlbGYuZG9tZW51X29wZW5zdGFuZGFyZCgpCisgICAgICAgIHNlbGYubWFpbmxvb3AoKQorCisgICAgZGVmIG1ha2V1c2VybWVudXMoc2VsZik6CisgICAgICAgIG0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKKyAgICAgICAgbmV3aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBTdGFuZGFyZCBEYXRhYmFzZSIsICJOIiwgJ29wZW5zdGFuZGFyZCcpCisgICAgICAgIG5ld2V4cGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4gRXhwZXJpbWVudGFsIERhdGFiYXNlIiwgTm9uZSwgJ29wZW5leHBlcmltZW50YWwnKQorICAgICAgICBuZXdleHBpdGVtLmVuYWJsZShwaW1wLlBJTVBfVkVSU0lPTiA+PSAiMC40IikKKyAgICAgICAgb3Blbml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4iK0VMSVBTRVMsICJPIiwgJ29wZW4nKQorICAgICAgICBvcGVuVVJMaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBVUkwiK0VMSVBTRVMsICJEIiwgJ29wZW5VUkwnKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIG1vcmVpbmZvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTW9yZSBEYXRhYmFzZXMiLCBOb25lLCAnb3BlbmRhdGFiYXNlcGFnZScpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgY2xvc2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgJ2Nsb3NlJykKKyMjICAgICAgICAgICAgICBzYXZlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgJ3NhdmUnKQorIyMgICAgICAgICAgICAgIHNhdmVhc2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUgYXMiK0VMSVBTRVMsIE5vbmUsICdzYXZlX2FzJykKKyMjICAgICAgICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisKKyAgICAgICAgbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICB1bmRvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiVW5kbyIsICdaJywgInVuZG8iKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIGN1dGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkN1dCIsICdYJywgImN1dCIpCisgICAgICAgIGNvcHlpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCAiY29weSIpCisgICAgICAgIHBhc3RlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFzdGUiLCAiViIsICJwYXN0ZSIpCisgICAgICAgIEZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xlYXIiLCBOb25lLCAgImNsZWFyIikKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBzZWxhbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTZWxlY3QgYWxsIiwgIkEiLCAic2VsZWN0YWxsIikKKworICAgICAgICBtID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiUGFja2FnZSIpCisgICAgICAgIHJ1bml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkluc3RhbGwiLCAiSSIsICdpbnN0YWxsJykKKyAgICAgICAgaG9tZXBhZ2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJWaXNpdCBIb21lcGFnZSIsIE5vbmUsICdob21lcGFnZScpCisKKyAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICdXaW5kb3dzJykKKyAgICAgICAgc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKKyAgICAgICAgc2VsZi5tYWtlaGVscG1lbnUoKQorICAgICAgICBzZWxmLl9tZW51c3RvY2hlY2sgPSBbY2xvc2VpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgdW5kb2l0ZW0sIGN1dGl0ZW0sIGNvcHlpdGVtLCBwYXN0ZWl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxhbGxpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVuaXRlbSwgaG9tZXBhZ2VpdGVtXQorCisgICAgZGVmIG1ha2VoZWxwbWVudShzZWxmKToKKyAgICAgICAgcHl0aG9uX2FwcCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnUmVzb3VyY2VzL1B5dGhvbi5hcHAnKQorICAgICAgICBoZWxwX3NvdXJjZSA9IG9zLnBhdGguam9pbihweXRob25fYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbicpCisgICAgICAgIGhhc2hlbHAgPSBvcy5wYXRoLmlzZGlyKGhlbHBfc291cmNlKQorCisgICAgICAgIHNlbGYuaGVscG1lbnUgPSBtID0gc2VsZi5nZXRoZWxwbWVudSgpCisgICAgICAgIGhlbHBpdGVtMSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFja2FnZU1hbmFnZXIgSGVscCIsIE5vbmUsIHNlbGYuZG9tZW51X3BhY2ttYW5oZWxwKQorICAgICAgICBoZWxwaXRlbTEuZW5hYmxlKGhhc2hlbHApCisgICAgICAgIGhlbHBpdGVtMiA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTWFjUHl0aG9uIEhlbHAiLCBOb25lLCBzZWxmLmRvbWVudV9weXRob25oZWxwKQorICAgICAgICBoZWxwaXRlbTIuZW5hYmxlKGhhc2hlbHApCisKKyAgICBkZWYgcXVpdGV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgaWdub3JlZXZlbnQoc2VsZiwgdGhlQXBwbGVFdmVudCwgdGhlUmVwbHkpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgb3BlbmRvY3NldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6CisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIGltcG9ydCBhZXRvb2xzCisgICAgICAgIHBhcmFtZXRlcnMsIGFyZ3MgPSBhZXRvb2xzLnVucGFja2V2ZW50KHRoZUFwcGxlRXZlbnQpCisgICAgICAgIGRvY3MgPSBwYXJhbWV0ZXJzWyctLS0tJ10KKyAgICAgICAgaWYgdHlwZShkb2NzKSA8PiB0eXBlKFtdKToKKyAgICAgICAgICAgIGRvY3MgPSBbZG9jc10KKyAgICAgICAgZm9yIGRvYyBpbiBkb2NzOgorICAgICAgICAgICAgZnNyLCBhID0gZG9jLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCisgICAgICAgICAgICBwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgICAgIHBhdGggPSB1cmxsaWIucGF0aG5hbWUydXJsKHBhdGgpCisgICAgICAgICAgICBzZWxmLm9wZW5kb2MocGF0aCkKKworICAgIGRlZiBvcGVuZG9jKHNlbGYsIHVybCk6CisgICAgICAgIGlmIHVybDoKKyAgICAgICAgICAgIHNlbGYuZGVmYXVsdHVybCA9IHVybAorICAgICAgICBQYWNrYWdlQnJvd3Nlcih1cmwpCisKKyAgICBkZWYgZ2V0YWJvdXR0ZXh0KHNlbGYpOgorICAgICAgICByZXR1cm4gIkFib3V0IFBhY2thZ2UgTWFuYWdlciIrRUxJUFNFUworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiUGFja2FnZSBJbnN0YWxsIE1hbmFnZXIgZm9yIFB5dGhvblxuUGFja01hbiBlbmdpbmUgKHBpbXApIHZlcnNpb246ICVzIiAlCisgICAgICAgICAgICAgICAgcGltcC5QSU1QX1ZFUlNJT04pCisKKyAgICBkZWYgZG9tZW51X29wZW5zdGFuZGFyZChzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIHBpbXAuUElNUF9WRVJTSU9OID49ICIwLjQiOgorICAgICAgICAgICAgdXJsID0gcGltcC5nZXREZWZhdWx0RGF0YWJhc2UoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgIyAwLjMgY29tcGF0aWJpbGl0eQorICAgICAgICAgICAgdXJsID0gTm9uZQorICAgICAgICBzZWxmLm9wZW5kb2ModXJsKQorCisgICAgZGVmIGRvbWVudV9vcGVuZXhwZXJpbWVudGFsKHNlbGYsICphcmdzKToKKyAgICAgICAgZGF0YWJhc2UgPSBwaW1wLmdldERlZmF1bHREYXRhYmFzZShleHBlcmltZW50YWw9VHJ1ZSkKKyAgICAgICAgc2VsZi5vcGVuZG9jKGRhdGFiYXNlKQorCisgICAgZGVmIGRvbWVudV9vcGVuKHNlbGYsICphcmdzKToKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oIlRFWFQiLCkpCisgICAgICAgIGlmIGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSB1cmxsaWIucGF0aG5hbWUydXJsKGZpbGVuYW1lKQorICAgICAgICAgICAgc2VsZi5vcGVuZG9jKGZpbGVuYW1lKQorCisgICAgZGVmIGRvbWVudV9vcGVuVVJMKHNlbGYsICphcmdzKToKKyAgICAgICAgb2sgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgKKyAgICAgICAgICAgICAgICAiV2FybmluZzogYnkgb3BlbmluZyBhIG5vbi1zdGFuZGFyZCBkYXRhYmFzZSAiCisgICAgICAgICAgICAgICAgInlvdSBhcmUgdHJ1c3RpbmcgdGhlIG1haW50YWluZXIgb2YgaXQgIgorICAgICAgICAgICAgICAgICJ0byBydW4gYXJiaXRyYXJ5IGNvZGUgb24geW91ciBtYWNoaW5lLiIsCisgICAgICAgICAgICAgICAgeWVzPSJPSyIsIG5vPSIiKQorICAgICAgICBpZiBvayA8PSAwOiByZXR1cm4KKyAgICAgICAgdXJsID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKCJVUkwgb2YgZGF0YWJhc2UgdG8gb3BlbjoiLAorICAgICAgICAgICAgICAgIGRlZmF1bHQ9c2VsZi5kZWZhdWx0dXJsLCBvaz0iT3BlbiIpCisgICAgICAgIGlmIHVybDoKKyAgICAgICAgICAgIHNlbGYub3BlbmRvYyh1cmwpCisKKyAgICBkZWYgZG9tZW51X29wZW5kYXRhYmFzZXBhZ2Uoc2VsZik6CisgICAgICAgIGltcG9ydCBpYworCisgICAgICAgIGljciA9IGljLklDKCkKKyAgICAgICAgaWNyLmxhdW5jaHVybChQQUNLTUFOX0hPTUVQQUdFKQorICAgIGRlZiBtYWtlb3BlbndpbmRvd3NtZW51KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMpKToKKyAgICAgICAgICAgIHNlbGYub3BlbndpbmRvd3NtZW51Lm1lbnUuRGVsZXRlTWVudUl0ZW0oMSkKKyAgICAgICAgICAgIHNlbGYub3BlbndpbmRvd3NtZW51Lml0ZW1zID0gW10KKyAgICAgICAgd2luZG93cyA9IFtdCisgICAgICAgIHNlbGYuX29wZW53aW5kb3dzID0ge30KKyAgICAgICAgZm9yIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzLmtleXMoKToKKyAgICAgICAgICAgIHRpdGxlID0gd2luZG93LkdldFdUaXRsZSgpCisgICAgICAgICAgICBpZiBub3QgdGl0bGU6CisgICAgICAgICAgICAgICAgdGl0bGUgPSAiPG5vIHRpdGxlPiIKKyAgICAgICAgICAgIHdpbmRvd3MuYXBwZW5kKCh0aXRsZSwgd2luZG93KSkKKyAgICAgICAgd2luZG93cy5zb3J0KCkKKyAgICAgICAgZm9yIHRpdGxlLCB3aW5kb3cgaW4gd2luZG93czoKKyAgICAgICAgICAgIHNob3J0Y3V0ID0gTm9uZQorICAgICAgICAgICAgaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShzZWxmLm9wZW53aW5kb3dzbWVudSwgdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjayA9IHNlbGYuZG9tZW51X29wZW53aW5kb3dzKQorICAgICAgICAgICAgc2VsZi5fb3BlbndpbmRvd3NbaXRlbS5pdGVtXSA9IHdpbmRvdworICAgICAgICBzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IDAKKyAgICAgICAgc2VsZi5jaGVja29wZW53aW5kb3dzbWVudSgpCisKKyAgICBkZWYgZG9tZW51X29wZW53aW5kb3dzKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgdyA9IHNlbGYuX29wZW53aW5kb3dzW2l0ZW1dCisgICAgICAgIHcuU2hvd1dpbmRvdygpCisgICAgICAgIHcuU2VsZWN0V2luZG93KCkKKworICAgIGRlZiBkb21lbnVfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwcmludCAiU2F2ZSIKKworICAgIGRlZiBkb21lbnVfcHl0aG9uaGVscChzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICBBSC5BSEdvdG9QYWdlKCJNYWNQeXRob24gSGVscCIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X3BhY2ttYW5oZWxwKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgIEFILkFIR290b1BhZ2UoIk1hY1B5dGhvbiBIZWxwIiwgInBhY2ttYW4uaHRtbCIsIE5vbmUpCisKKyAgICBkZWYgX3F1aXQoc2VsZik6CisjIyAgICAgICAgICAgICAgaW1wb3J0IFB5Q29uc29sZSwgUHlFZGl0CisgICAgICAgIGZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydiA9IHdpbmRvdy5jbG9zZSgpICMgaWdub3JlIGFueSBlcnJvcnMgd2hpbGUgcXVpdHRpbmcKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBydiA9IDAgICAjIChvdGhlcndpc2UsIHdlIGNhbiBnZXQgc3R1Y2shKQorICAgICAgICAgICAgaWYgcnYgYW5kIHJ2ID4gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyMjICAgICAgICAgICAgICB0cnk6CisjIyAgICAgICAgICAgICAgICAgICAgICBQeUNvbnNvbGUuY29uc29sZS53cml0ZXByZWZzKCkKKyMjICAgICAgICAgICAgICAgICAgICAgIFB5Q29uc29sZS5vdXRwdXQud3JpdGVwcmVmcygpCisjIyAgICAgICAgICAgICAgICAgICAgICBQeUVkaXQuc2VhcmNoZW5naW5lLndyaXRlcHJlZnMoKQorIyMgICAgICAgICAgICAgIGV4Y2VwdDoKKyMjICAgICAgICAgICAgICAgICAgICAgICMgV3JpdGUgdG8gX19zdGRlcnJfXyBzbyB0aGUgbXNnIGVuZCB1cCBpbiBDb25zb2xlLmFwcCBhbmQgaGFzCisjIyAgICAgICAgICAgICAgICAgICAgICAjIGF0IGxlYXN0IF9zb21lXyBjaGFuY2Ugb2YgZ2V0dGluZyByZWFkLi4uCisjIyAgICAgICAgICAgICAgICAgICAgICAjIEJ1dDogdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHdheSBtb3JlIHNlcmlvdXMgcHJvYmxlbXMgd2l0aAorIyMgICAgICAgICAgICAgICAgICAgICAgIyB0aGUgUHl0aG9uIDIuMiBKYWd1YXIgYWRkb24uCisjIyAgICAgICAgICAgICAgICAgICAgICBzeXMuX19zdGRlcnJfXy53cml0ZSgiKioqIFB5dGhvbklERTogQ2FuJ3Qgd3JpdGUgcHJlZmVyZW5jZXMgKioqXG4iKQorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMQorCiBjbGFzcyBQaW1wSW50ZXJmYWNlOgogCi0JZGVmIHNldHVwcGltcChzZWxmLCB1cmwpOgotCQlzZWxmLnBpbXBwcmVmcyA9IHBpbXAuUGltcFByZWZlcmVuY2VzKCkKLQkJc2VsZi5waW1wZGIgPSBwaW1wLlBpbXBEYXRhYmFzZShzZWxmLnBpbXBwcmVmcykKLQkJaWYgbm90IHVybDoKLQkJCXVybCA9IHNlbGYucGltcHByZWZzLnBpbXBEYXRhYmFzZQotCQl0cnk6Ci0JCQlzZWxmLnBpbXBkYi5hcHBlbmRVUkwodXJsKQotCQlleGNlcHQgSU9FcnJvciwgYXJnOgotCQkJcnYgPSAiQ2Fubm90IG9wZW4gJXM6ICVzXG4iICUgKHVybCwgYXJnKQotCQkJcnYgKz0gIlxuU2VlIE1hY1B5dGhvbiBQYWNrYWdlIE1hbmFnZXIgaGVscCBwYWdlLiIKLQkJCXJldHVybiBydgotCQlleGNlcHQ6Ci0JCQlydiA9ICJVbnNwZWNpZmllZCBlcnJvciB3aGlsZSBwYXJzaW5nIGRhdGFiYXNlOiAlc1xuIiAlIHVybAotCQkJcnYgKz0gIlVzdWFsbHksIHRoaXMgbWVhbnMgdGhlIGRhdGFiYXNlIGlzIG5vdCBjb3JyZWN0bHkgZm9ybWF0dGVkLlxuIgotCQkJcnYgKz0gIlxuU2VlIE1hY1B5dGhvbiBQYWNrYWdlIE1hbmFnZXIgaGVscCBwYWdlLiIKLQkJCXJldHVybiBydgotCQkjIENoZWNrIHdoZXRoZXIgd2UgY2FuIHdyaXRlIHRoZSBpbnN0YWxsYXRpb24gZGlyZWN0b3J5LgotCQkjIElmIG5vdCwgc2V0IHRvIHRoZSBwZXItdXNlciBkaXJlY3RvcnksIHBvc3NpYmx5Ci0JCSMgY3JlYXRpbmcgaXQsIGlmIG5lZWRlZC4KLQkJaW5zdGFsbERpciA9IHNlbGYucGltcHByZWZzLmluc3RhbGxEaXIKLQkJaWYgbm90IG9zLmFjY2VzcyhpbnN0YWxsRGlyLCBvcy5SX09LfG9zLldfT0t8b3MuWF9PSyk6Ci0JCQlydiA9IHNlbGYuc2V0dXNlcmluc3RhbGwoMSkKLQkJCWlmIHJ2OiByZXR1cm4gcnYKLQkJcmV0dXJuIHNlbGYucGltcHByZWZzLmNoZWNrKCkKLQkJCi0JZGVmIGNsb3NlcGltcChzZWxmKToKLQkJc2VsZi5waW1wZGIuY2xvc2UoKQotCQlzZWxmLnBpbXBwcmVmcyA9IE5vbmUKLQkJc2VsZi5waW1wZGIgPSBOb25lCi0JCXNlbGYucGFja2FnZXMgPSBbXQorICAgIGRlZiBzZXR1cHBpbXAoc2VsZiwgdXJsKToKKyAgICAgICAgc2VsZi5waW1wcHJlZnMgPSBwaW1wLlBpbXBQcmVmZXJlbmNlcygpCisgICAgICAgIHNlbGYucGltcGRiID0gcGltcC5QaW1wRGF0YWJhc2Uoc2VsZi5waW1wcHJlZnMpCisgICAgICAgIGlmIG5vdCB1cmw6CisgICAgICAgICAgICB1cmwgPSBzZWxmLnBpbXBwcmVmcy5waW1wRGF0YWJhc2UKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5waW1wZGIuYXBwZW5kVVJMKHVybCkKKyAgICAgICAgZXhjZXB0IElPRXJyb3IsIGFyZzoKKyAgICAgICAgICAgIHJ2ID0gIkNhbm5vdCBvcGVuICVzOiAlc1xuIiAlICh1cmwsIGFyZykKKyAgICAgICAgICAgIHJ2ICs9ICJcblNlZSBNYWNQeXRob24gUGFja2FnZSBNYW5hZ2VyIGhlbHAgcGFnZS4iCisgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgcnYgPSAiVW5zcGVjaWZpZWQgZXJyb3Igd2hpbGUgcGFyc2luZyBkYXRhYmFzZTogJXNcbiIgJSB1cmwKKyAgICAgICAgICAgIHJ2ICs9ICJVc3VhbGx5LCB0aGlzIG1lYW5zIHRoZSBkYXRhYmFzZSBpcyBub3QgY29ycmVjdGx5IGZvcm1hdHRlZC5cbiIKKyAgICAgICAgICAgIHJ2ICs9ICJcblNlZSBNYWNQeXRob24gUGFja2FnZSBNYW5hZ2VyIGhlbHAgcGFnZS4iCisgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgIyBDaGVjayB3aGV0aGVyIHdlIGNhbiB3cml0ZSB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKyAgICAgICAgIyBJZiBub3QsIHNldCB0byB0aGUgcGVyLXVzZXIgZGlyZWN0b3J5LCBwb3NzaWJseQorICAgICAgICAjIGNyZWF0aW5nIGl0LCBpZiBuZWVkZWQuCisgICAgICAgIGluc3RhbGxEaXIgPSBzZWxmLnBpbXBwcmVmcy5pbnN0YWxsRGlyCisgICAgICAgIGlmIG5vdCBvcy5hY2Nlc3MoaW5zdGFsbERpciwgb3MuUl9PS3xvcy5XX09LfG9zLlhfT0spOgorICAgICAgICAgICAgcnYgPSBzZWxmLnNldHVzZXJpbnN0YWxsKDEpCisgICAgICAgICAgICBpZiBydjogcmV0dXJuIHJ2CisgICAgICAgIHJldHVybiBzZWxmLnBpbXBwcmVmcy5jaGVjaygpCiAKLQlkZWYgc2V0dXNlcmluc3RhbGwoc2VsZiwgb25vZmYpOgotCQlydiA9ICIiCi0JCWlmIG9ub2ZmOgotCQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKFVTRVJfSU5TVEFMTF9ESVIpOgotCQkJCXRyeToKLQkJCQkJb3MubWFrZWRpcnMoVVNFUl9JTlNUQUxMX0RJUikKLQkJCQlleGNlcHQgT1NFcnJvciwgYXJnOgotCQkJCQlydiA9IHJ2ICsgYXJnICsgIlxuIgotCQkJaWYgbm90IFVTRVJfSU5TVEFMTF9ESVIgaW4gc3lzLnBhdGg6Ci0JCQkJaW1wb3J0IHNpdGUKLQkJCQlyZWxvYWQoc2l0ZSkKLQkJCXNlbGYucGltcHByZWZzLnNldEluc3RhbGxEaXIoVVNFUl9JTlNUQUxMX0RJUikKLQkJZWxzZToKLQkJCXNlbGYucGltcHByZWZzLnNldEluc3RhbGxEaXIoTm9uZSkKLQkJcnYgPSBydiArIHNlbGYucGltcHByZWZzLmNoZWNrKCkKLQkJcmV0dXJuIHJ2Ci0JCQotCWRlZiBnZXR1c2VyaW5zdGFsbChzZWxmKToKLQkJcmV0dXJuIHNlbGYucGltcHByZWZzLmluc3RhbGxEaXIgPT0gVVNFUl9JTlNUQUxMX0RJUgotCQkJCi0JZGVmIGdldGJyb3dzZXJkYXRhKHNlbGYsIHNob3dfaGlkZGVuPTEpOgotCQlwYWNrYWdlcyA9IHNlbGYucGltcGRiLmxpc3QoKQotCQlpZiBzaG93X2hpZGRlbjoKLQkJCXNlbGYucGFja2FnZXMgPSBwYWNrYWdlcwotCQllbHNlOgotCQkJc2VsZi5wYWNrYWdlcyA9IFtdCi0JCQlmb3IgcGtnIGluIHBhY2thZ2VzOgotCQkJCW5hbWUgPSBwa2cuZnVsbG5hbWUoKQotCQkJCWlmIG5hbWVbMF0gPT0gJygnIGFuZCBuYW1lWy0xXSA9PSAnKScgYW5kIG5vdCBzaG93X2hpZGRlbjoKLQkJCQkJY29udGludWUKLQkJCQlzZWxmLnBhY2thZ2VzLmFwcGVuZChwa2cpCQkJCi0JCXJ2ID0gW10KLQkJZm9yIHBrZyBpbiBzZWxmLnBhY2thZ2VzOgotCQkJbmFtZSA9IHBrZy5mdWxsbmFtZSgpCi0JCQlzdGF0dXMsIF8gPSBwa2cuaW5zdGFsbGVkKCkKLQkJCWRlc2NyaXB0aW9uID0gcGtnLmRlc2NyaXB0aW9uKCkKLQkJCWRlc2NyaXB0aW9uX2xpbmUxID0gZGVzY3JpcHRpb24uc3BsaXQoJ1xuJylbMF0KLQkJCXJ2LmFwcGVuZCgoc3RhdHVzLCBuYW1lLCBkZXNjcmlwdGlvbl9saW5lMSkpCi0JCXJldHVybiBydgotCQkKLQlkZWYgZ2V0c3RhdHVzKHNlbGYsIG51bWJlcik6Ci0JCXBrZyA9IHNlbGYucGFja2FnZXNbbnVtYmVyXQotCQlyZXR1cm4gcGtnLmluc3RhbGxlZCgpCi0JCQotCWRlZiBpbnN0YWxscGFja2FnZShzZWxmLCBzZWwsIG91dHB1dCwgcmVjdXJzaXZlLCBmb3JjZSk6Ci0JCXBrZyA9IHNlbGYucGFja2FnZXNbc2VsXQotCQlwaW1waW5zdGFsbGVyID0gcGltcC5QaW1wSW5zdGFsbGVyKHNlbGYucGltcGRiKQotCQlsaXN0LCBtZXNzYWdlcyA9IHBpbXBpbnN0YWxsZXIucHJlcGFyZUluc3RhbGwocGtnLCBmb3JjZSwgcmVjdXJzaXZlKQotCQlpZiBtZXNzYWdlczoKLQkJCXJldHVybiBtZXNzYWdlcwotCQltZXNzYWdlcyA9IHBpbXBpbnN0YWxsZXIuaW5zdGFsbChsaXN0LCBvdXRwdXQpCi0JCXJldHVybiBtZXNzYWdlcwotCQkJCisgICAgZGVmIGNsb3NlcGltcChzZWxmKToKKyAgICAgICAgc2VsZi5waW1wZGIuY2xvc2UoKQorICAgICAgICBzZWxmLnBpbXBwcmVmcyA9IE5vbmUKKyAgICAgICAgc2VsZi5waW1wZGIgPSBOb25lCisgICAgICAgIHNlbGYucGFja2FnZXMgPSBbXQorCisgICAgZGVmIHNldHVzZXJpbnN0YWxsKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgcnYgPSAiIgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhVU0VSX0lOU1RBTExfRElSKToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLm1ha2VkaXJzKFVTRVJfSU5TVEFMTF9ESVIpCisgICAgICAgICAgICAgICAgZXhjZXB0IE9TRXJyb3IsIGFyZzoKKyAgICAgICAgICAgICAgICAgICAgcnYgPSBydiArIGFyZyArICJcbiIKKyAgICAgICAgICAgIGlmIG5vdCBVU0VSX0lOU1RBTExfRElSIGluIHN5cy5wYXRoOgorICAgICAgICAgICAgICAgIGltcG9ydCBzaXRlCisgICAgICAgICAgICAgICAgcmVsb2FkKHNpdGUpCisgICAgICAgICAgICBzZWxmLnBpbXBwcmVmcy5zZXRJbnN0YWxsRGlyKFVTRVJfSU5TVEFMTF9ESVIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBpbXBwcmVmcy5zZXRJbnN0YWxsRGlyKE5vbmUpCisgICAgICAgIHJ2ID0gcnYgKyBzZWxmLnBpbXBwcmVmcy5jaGVjaygpCisgICAgICAgIHJldHVybiBydgorCisgICAgZGVmIGdldHVzZXJpbnN0YWxsKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5waW1wcHJlZnMuaW5zdGFsbERpciA9PSBVU0VSX0lOU1RBTExfRElSCisKKyAgICBkZWYgZ2V0YnJvd3NlcmRhdGEoc2VsZiwgc2hvd19oaWRkZW49MSk6CisgICAgICAgIHBhY2thZ2VzID0gc2VsZi5waW1wZGIubGlzdCgpCisgICAgICAgIGlmIHNob3dfaGlkZGVuOgorICAgICAgICAgICAgc2VsZi5wYWNrYWdlcyA9IHBhY2thZ2VzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnBhY2thZ2VzID0gW10KKyAgICAgICAgICAgIGZvciBwa2cgaW4gcGFja2FnZXM6CisgICAgICAgICAgICAgICAgbmFtZSA9IHBrZy5mdWxsbmFtZSgpCisgICAgICAgICAgICAgICAgaWYgbmFtZVswXSA9PSAnKCcgYW5kIG5hbWVbLTFdID09ICcpJyBhbmQgbm90IHNob3dfaGlkZGVuOgorICAgICAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgICAgIHNlbGYucGFja2FnZXMuYXBwZW5kKHBrZykKKyAgICAgICAgcnYgPSBbXQorICAgICAgICBmb3IgcGtnIGluIHNlbGYucGFja2FnZXM6CisgICAgICAgICAgICBuYW1lID0gcGtnLmZ1bGxuYW1lKCkKKyAgICAgICAgICAgIHN0YXR1cywgXyA9IHBrZy5pbnN0YWxsZWQoKQorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSBwa2cuZGVzY3JpcHRpb24oKQorICAgICAgICAgICAgZGVzY3JpcHRpb25fbGluZTEgPSBkZXNjcmlwdGlvbi5zcGxpdCgnXG4nKVswXQorICAgICAgICAgICAgcnYuYXBwZW5kKChzdGF0dXMsIG5hbWUsIGRlc2NyaXB0aW9uX2xpbmUxKSkKKyAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgZ2V0c3RhdHVzKHNlbGYsIG51bWJlcik6CisgICAgICAgIHBrZyA9IHNlbGYucGFja2FnZXNbbnVtYmVyXQorICAgICAgICByZXR1cm4gcGtnLmluc3RhbGxlZCgpCisKKyAgICBkZWYgaW5zdGFsbHBhY2thZ2Uoc2VsZiwgc2VsLCBvdXRwdXQsIHJlY3Vyc2l2ZSwgZm9yY2UpOgorICAgICAgICBwa2cgPSBzZWxmLnBhY2thZ2VzW3NlbF0KKyAgICAgICAgcGltcGluc3RhbGxlciA9IHBpbXAuUGltcEluc3RhbGxlcihzZWxmLnBpbXBkYikKKyAgICAgICAgbGlzdCwgbWVzc2FnZXMgPSBwaW1waW5zdGFsbGVyLnByZXBhcmVJbnN0YWxsKHBrZywgZm9yY2UsIHJlY3Vyc2l2ZSkKKyAgICAgICAgaWYgbWVzc2FnZXM6CisgICAgICAgICAgICByZXR1cm4gbWVzc2FnZXMKKyAgICAgICAgbWVzc2FnZXMgPSBwaW1waW5zdGFsbGVyLmluc3RhbGwobGlzdCwgb3V0cHV0KQorICAgICAgICByZXR1cm4gbWVzc2FnZXMKKwogY2xhc3MgUGFja2FnZUJyb3dzZXIoUGltcEludGVyZmFjZSk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHVybCA9IE5vbmUpOgotCQlzZWxmLmljID0gTm9uZQotCQltZXNzYWdlcyA9IHNlbGYuc2V0dXBwaW1wKHVybCkKLQkJc2VsZi5zZXR1cHdpZGdldHMoKQotCQlzZWxmLnVwZGF0ZXN0YXR1cygpCi0JCXNlbGYuc2hvd21lc3NhZ2VzKG1lc3NhZ2VzKQotCQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuY2xvc2VwaW1wKCkKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgotCQlERVNDUklQVElPTl9IRUlHSFQgPSAxNDAKLQkJSU5TVEFMTF9QT1MgPSAtMzAKLQkJU1RBVFVTX1BPUyA9IElOU1RBTExfUE9TIC0gKDcwICsgREVTQ1JJUFRJT05fSEVJR0hUKQotCQlzZWxmLncgPSBXLldpbmRvdygoNTgwLCA2MDApLCAiUHl0aG9uIEluc3RhbGwgTWFuYWdlciIsIG1pbnNpemUgPSAoNDAwLCA0MDApLCB0YWJiYWJsZSA9IDApCi0JCXNlbGYudy50aXRsZWJhciA9IFcuVGV4dEJveCgoNCwgOCwgNjAsIDE4KSwgJ1BhY2thZ2VzOicpCi0JCXNlbGYudy5oaWRkZW5fYnV0dG9uID0gVy5DaGVja0JveCgoLTEwMCwgNCwgMCwgMTgpLCAnU2hvdyBIaWRkZW4nLCBzZWxmLnVwZGF0ZXN0YXR1cykKLQkJZGF0YSA9IHNlbGYuZ2V0YnJvd3NlcmRhdGEoKQotCQlzZWxmLncucGFja2FnZWJyb3dzZXIgPSBXLk11bHRpTGlzdCgoNCwgMjQsIDAsIFNUQVRVU19QT1MtMiksIGRhdGEsIHNlbGYubGlzdGhpdCwgY29scz0zKQotCQkKLQkJc2VsZi53Lmluc3RhbGxlZF9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TLCA3MCwgMTIpLCAnSW5zdGFsbGVkOicpCi0JCXNlbGYudy5pbnN0YWxsZWQgPSBXLlRleHRCb3goKDc0LCBTVEFUVVNfUE9TLCAwLCAxMiksICcnKQotCQlzZWxmLncubWVzc2FnZV9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TKzIwLCA3MCwgMTIpLCAnU3RhdHVzOicpCi0JCXNlbGYudy5tZXNzYWdlID0gVy5UZXh0Qm94KCg3NCwgU1RBVFVTX1BPUysyMCwgMCwgMTIpLCAnJykKLQkJc2VsZi53LmhvbWVwYWdlX2J1dHRvbiA9IFcuQnV0dG9uKCg0LCBTVEFUVVNfUE9TKzQwLCA5NiwgMTgpLCAnVmlldyBob21lcGFnZScsIHNlbGYuZG9faG9tZXBhZ2UpCi0JCXNlbGYudy5kZXNjcmlwdGlvbl9sID0gVy5UZXh0Qm94KCg0LCBTVEFUVVNfUE9TKzcwLCA3MCwgMTIpLCAnRGVzY3JpcHRpb246JykKLQkJc2VsZi53LmRlc2NyaXB0aW9uID0gVy5FZGl0VGV4dCgoNzQsIFNUQVRVU19QT1MrNzAsIDAsIERFU0NSSVBUSU9OX0hFSUdIVC00KSkKLQkJCi0JCXNlbGYudy5kaXZsaW5lID0gVy5Ib3Jpem9udGFsTGluZSgoMCwgSU5TVEFMTF9QT1MtNCwgMCwgMCkpCi0JCXNlbGYudy52ZXJib3NlX2J1dHRvbiA9IFcuQ2hlY2tCb3goKDg0LCBJTlNUQUxMX1BPUys0LCA2MCwgMTgpLCAnVmVyYm9zZScpCi0JCXNlbGYudy5yZWN1cnNpdmVfYnV0dG9uID0gVy5DaGVja0JveCgoMTQ2LCBJTlNUQUxMX1BPUys0LCAxMjAsIDE4KSwgJ0luc3RhbGwgZGVwZW5kZW5jaWVzJywgc2VsZi51cGRhdGVzdGF0dXMpCi0JCXNlbGYudy5yZWN1cnNpdmVfYnV0dG9uLnNldCgxKQotCQlzZWxmLncuZm9yY2VfYnV0dG9uID0gVy5DaGVja0JveCgoMjY4LCBJTlNUQUxMX1BPUys0LCA3MCwgMTgpLCAnT3ZlcndyaXRlJywgc2VsZi51cGRhdGVzdGF0dXMpCi0JCXNlbGYudy51c2VyX2J1dHRvbiA9IFcuQ2hlY2tCb3goKDM0MCwgSU5TVEFMTF9QT1MrNCwgMTQwLCAxOCksICdGb3IgQ3VycmVudCBVc2VyIE9ubHknLCBzZWxmLmRvX3VzZXIpCi0JCXNlbGYudy5pbnN0YWxsX2J1dHRvbiA9IFcuQnV0dG9uKCg0LCBJTlNUQUxMX1BPUys0LCA1NiwgMTgpLCAnSW5zdGFsbDonLCBzZWxmLmRvX2luc3RhbGwpCi0JCXNlbGYudy5vcGVuKCkKLQkJc2VsZi53LmRlc2NyaXB0aW9uLmVuYWJsZSgwKQotCQkKLQlkZWYgdXBkYXRlc3RhdHVzKHNlbGYpOgotCQl0b3BjZWxsID0gc2VsZi53LnBhY2thZ2Vicm93c2VyLmdldHRvcGNlbGwoKQotCQlzZWwgPSBzZWxmLncucGFja2FnZWJyb3dzZXIuZ2V0c2VsZWN0aW9uKCkKLQkJZGF0YSA9IHNlbGYuZ2V0YnJvd3NlcmRhdGEoc2VsZi53LmhpZGRlbl9idXR0b24uZ2V0KCkpCi0JCXNlbGYudy5wYWNrYWdlYnJvd3Nlci5zZXRpdGVtcyhkYXRhKQotCQlzZWxmLncudXNlcl9idXR0b24uc2V0KHNlbGYuZ2V0dXNlcmluc3RhbGwoKSkKLQkJaWYgbGVuKHNlbCkgIT0gMToKLQkJCXNlbGYudy5pbnN0YWxsZWQuc2V0KCcnKQotCQkJc2VsZi53Lm1lc3NhZ2Uuc2V0KCcnKQotCQkJc2VsZi53Lmluc3RhbGxfYnV0dG9uLmVuYWJsZSgwKQotCQkJc2VsZi53LmhvbWVwYWdlX2J1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYudy5kZXNjcmlwdGlvbi5zZXQoJycpCi0JCQlzZWxmLncudmVyYm9zZV9idXR0b24uZW5hYmxlKDApCi0JCQlzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYudy5mb3JjZV9idXR0b24uZW5hYmxlKDApCi0JCQlzZWxmLncudXNlcl9idXR0b24uZW5hYmxlKDApCi0JCWVsc2U6Ci0JCQlzZWwgPSBzZWxbMF0KLQkJCWlmIHNlbCA+PSBsZW4oc2VsZi5wYWNrYWdlcyk6Ci0JCQkJc2VsID0gMAotCQkJc2VsZi53LnBhY2thZ2Vicm93c2VyLnNldHNlbGVjdGlvbihbc2VsXSkKLQkJCWluc3RhbGxlZCwgbWVzc2FnZSA9IHNlbGYuZ2V0c3RhdHVzKHNlbCkKLQkJCXNlbGYudy5pbnN0YWxsZWQuc2V0KGluc3RhbGxlZCkKLQkJCXNlbGYudy5tZXNzYWdlLnNldChtZXNzYWdlKQotCQkJc2VsZi53Lmluc3RhbGxfYnV0dG9uLmVuYWJsZShpbnN0YWxsZWQgIT0gInllcyIgb3Igc2VsZi53LmZvcmNlX2J1dHRvbi5nZXQoKSkKLQkJCXNlbGYudy5ob21lcGFnZV9idXR0b24uZW5hYmxlKG5vdCBub3Qgc2VsZi5wYWNrYWdlc1tzZWxdLmhvbWVwYWdlKCkpCi0JCQlkZXNjcmlwdGlvbiA9IHNlbGYucGFja2FnZXNbc2VsXS5kZXNjcmlwdGlvbigpCi0JCQlkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnNwbGl0bGluZXMoKQotCQkJZGVzY3JpcHRpb24gPSAnXHInLmpvaW4oZGVzY3JpcHRpb24pCi0JCQlzZWxmLncuZGVzY3JpcHRpb24uc2V0KGRlc2NyaXB0aW9uKQotCQkJc2VsZi53LnZlcmJvc2VfYnV0dG9uLmVuYWJsZSgxKQotCQkJc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24uZW5hYmxlKDEpCi0JCQlzZWxmLncuZm9yY2VfYnV0dG9uLmVuYWJsZSgxKQotCQkJc2VsZi53LnVzZXJfYnV0dG9uLmVuYWJsZSgxKQotCQlzZWxmLncucGFja2FnZWJyb3dzZXIuc2V0dG9wY2VsbCh0b3BjZWxsKQotCQkKLQlkZWYgbGlzdGhpdChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotCQlzZWxmLnVwZGF0ZXN0YXR1cygpCi0JCQotCWRlZiBkb19pbnN0YWxsKHNlbGYpOgotCQlzZWwgPSBzZWxmLncucGFja2FnZWJyb3dzZXIuZ2V0c2VsZWN0aW9uKClbMF0KLQkJaWYgc2VsZi53LnZlcmJvc2VfYnV0dG9uLmdldCgpOgotCQkJb3V0cHV0ID0gc3lzLnN0ZG91dAotCQllbHNlOgotCQkJb3V0cHV0ID0gTm9uZQotCQlyZWN1cnNpdmUgPSBzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5nZXQoKQotCQlmb3JjZSA9IHNlbGYudy5mb3JjZV9idXR0b24uZ2V0KCkKLQkJbWVzc2FnZXMgPSBzZWxmLmluc3RhbGxwYWNrYWdlKHNlbCwgb3V0cHV0LCByZWN1cnNpdmUsIGZvcmNlKQotCQkKLQkJIyBSZS1yZWFkIC5wdGggZmlsZXMKLQkJaW1wb3J0IHNpdGUKLQkJcmVsb2FkKHNpdGUpCi0JCQotCQlzZWxmLnVwZGF0ZXN0YXR1cygpCi0JCXNlbGYuc2hvd21lc3NhZ2VzKG1lc3NhZ2VzKQotCQkKLQlkZWYgc2hvd21lc3NhZ2VzKHNlbGYsIG1lc3NhZ2VzKToKLQkJaWYgbWVzc2FnZXM6Ci0JCQkjIFRvIGJlIG9uIHRoZSBzYWZlIHNpZGUgd2UgYWx3YXlzIHNob3cgdGhlIGhpZGRlbiBwYWNrYWdlcywKLQkJCSMgdGhleSBtYXkgYmUgcmVmZXJyZWQgdG8gaW4gdGhlIGVycm9yIG1lc3NhZ2VzLgotCQkJaWYgbm90IHNlbGYudy5oaWRkZW5fYnV0dG9uLmdldCgpOgotCQkJCXNlbGYudy5oaWRkZW5fYnV0dG9uLnNldCgxKQotCQkJCXNlbGYudXBkYXRlc3RhdHVzKCkKLQkJCWlmIHR5cGUobWVzc2FnZXMpID09IGxpc3Q6Ci0JCQkJbWVzc2FnZXMgPSAnXG4nLmpvaW4obWVzc2FnZXMpCi0JCQlpZiBzZWxmLncudmVyYm9zZV9idXR0b24uZ2V0KCk6Ci0JCQkJc3lzLnN0ZG91dC53cml0ZShtZXNzYWdlcyArICdcbicpCi0JCQlFYXN5RGlhbG9ncy5NZXNzYWdlKG1lc3NhZ2VzKQotCQkKLQlkZWYgZG9faG9tZXBhZ2Uoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKVswXQotCQlpZiBub3Qgc2VsZi5pYzoKLQkJCWltcG9ydCBpYwotCQkJCi0JCQlzZWxmLmljID0gaWMuSUMoKQotCQlzZWxmLmljLmxhdW5jaHVybChzZWxmLnBhY2thZ2VzW3NlbF0uaG9tZXBhZ2UoKSkKLQkJCi0JZGVmIGRvX3VzZXIoc2VsZik6Ci0JCW1lc3NhZ2VzID0gc2VsZi5zZXR1c2VyaW5zdGFsbChzZWxmLncudXNlcl9idXR0b24uZ2V0KCkpCi0JCXNlbGYudXBkYXRlc3RhdHVzKCkKLQkJc2VsZi5zaG93bWVzc2FnZXMobWVzc2FnZXMpCi0JCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHVybCA9IE5vbmUpOgorICAgICAgICBzZWxmLmljID0gTm9uZQorICAgICAgICBtZXNzYWdlcyA9IHNlbGYuc2V0dXBwaW1wKHVybCkKKyAgICAgICAgc2VsZi5zZXR1cHdpZGdldHMoKQorICAgICAgICBzZWxmLnVwZGF0ZXN0YXR1cygpCisgICAgICAgIHNlbGYuc2hvd21lc3NhZ2VzKG1lc3NhZ2VzKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmNsb3NlcGltcCgpCisKKyAgICBkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgorICAgICAgICBERVNDUklQVElPTl9IRUlHSFQgPSAxNDAKKyAgICAgICAgSU5TVEFMTF9QT1MgPSAtMzAKKyAgICAgICAgU1RBVFVTX1BPUyA9IElOU1RBTExfUE9TIC0gKDcwICsgREVTQ1JJUFRJT05fSEVJR0hUKQorICAgICAgICBzZWxmLncgPSBXLldpbmRvdygoNTgwLCA2MDApLCAiUHl0aG9uIEluc3RhbGwgTWFuYWdlciIsIG1pbnNpemUgPSAoNDAwLCA0MDApLCB0YWJiYWJsZSA9IDApCisgICAgICAgIHNlbGYudy50aXRsZWJhciA9IFcuVGV4dEJveCgoNCwgOCwgNjAsIDE4KSwgJ1BhY2thZ2VzOicpCisgICAgICAgIHNlbGYudy5oaWRkZW5fYnV0dG9uID0gVy5DaGVja0JveCgoLTEwMCwgNCwgMCwgMTgpLCAnU2hvdyBIaWRkZW4nLCBzZWxmLnVwZGF0ZXN0YXR1cykKKyAgICAgICAgZGF0YSA9IHNlbGYuZ2V0YnJvd3NlcmRhdGEoKQorICAgICAgICBzZWxmLncucGFja2FnZWJyb3dzZXIgPSBXLk11bHRpTGlzdCgoNCwgMjQsIDAsIFNUQVRVU19QT1MtMiksIGRhdGEsIHNlbGYubGlzdGhpdCwgY29scz0zKQorCisgICAgICAgIHNlbGYudy5pbnN0YWxsZWRfbCA9IFcuVGV4dEJveCgoNCwgU1RBVFVTX1BPUywgNzAsIDEyKSwgJ0luc3RhbGxlZDonKQorICAgICAgICBzZWxmLncuaW5zdGFsbGVkID0gVy5UZXh0Qm94KCg3NCwgU1RBVFVTX1BPUywgMCwgMTIpLCAnJykKKyAgICAgICAgc2VsZi53Lm1lc3NhZ2VfbCA9IFcuVGV4dEJveCgoNCwgU1RBVFVTX1BPUysyMCwgNzAsIDEyKSwgJ1N0YXR1czonKQorICAgICAgICBzZWxmLncubWVzc2FnZSA9IFcuVGV4dEJveCgoNzQsIFNUQVRVU19QT1MrMjAsIDAsIDEyKSwgJycpCisgICAgICAgIHNlbGYudy5ob21lcGFnZV9idXR0b24gPSBXLkJ1dHRvbigoNCwgU1RBVFVTX1BPUys0MCwgOTYsIDE4KSwgJ1ZpZXcgaG9tZXBhZ2UnLCBzZWxmLmRvX2hvbWVwYWdlKQorICAgICAgICBzZWxmLncuZGVzY3JpcHRpb25fbCA9IFcuVGV4dEJveCgoNCwgU1RBVFVTX1BPUys3MCwgNzAsIDEyKSwgJ0Rlc2NyaXB0aW9uOicpCisgICAgICAgIHNlbGYudy5kZXNjcmlwdGlvbiA9IFcuRWRpdFRleHQoKDc0LCBTVEFUVVNfUE9TKzcwLCAwLCBERVNDUklQVElPTl9IRUlHSFQtNCkpCisKKyAgICAgICAgc2VsZi53LmRpdmxpbmUgPSBXLkhvcml6b250YWxMaW5lKCgwLCBJTlNUQUxMX1BPUy00LCAwLCAwKSkKKyAgICAgICAgc2VsZi53LnZlcmJvc2VfYnV0dG9uID0gVy5DaGVja0JveCgoODQsIElOU1RBTExfUE9TKzQsIDYwLCAxOCksICdWZXJib3NlJykKKyAgICAgICAgc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24gPSBXLkNoZWNrQm94KCgxNDYsIElOU1RBTExfUE9TKzQsIDEyMCwgMTgpLCAnSW5zdGFsbCBkZXBlbmRlbmNpZXMnLCBzZWxmLnVwZGF0ZXN0YXR1cykKKyAgICAgICAgc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24uc2V0KDEpCisgICAgICAgIHNlbGYudy5mb3JjZV9idXR0b24gPSBXLkNoZWNrQm94KCgyNjgsIElOU1RBTExfUE9TKzQsIDcwLCAxOCksICdPdmVyd3JpdGUnLCBzZWxmLnVwZGF0ZXN0YXR1cykKKyAgICAgICAgc2VsZi53LnVzZXJfYnV0dG9uID0gVy5DaGVja0JveCgoMzQwLCBJTlNUQUxMX1BPUys0LCAxNDAsIDE4KSwgJ0ZvciBDdXJyZW50IFVzZXIgT25seScsIHNlbGYuZG9fdXNlcikKKyAgICAgICAgc2VsZi53Lmluc3RhbGxfYnV0dG9uID0gVy5CdXR0b24oKDQsIElOU1RBTExfUE9TKzQsIDU2LCAxOCksICdJbnN0YWxsOicsIHNlbGYuZG9faW5zdGFsbCkKKyAgICAgICAgc2VsZi53Lm9wZW4oKQorICAgICAgICBzZWxmLncuZGVzY3JpcHRpb24uZW5hYmxlKDApCisKKyAgICBkZWYgdXBkYXRlc3RhdHVzKHNlbGYpOgorICAgICAgICB0b3BjZWxsID0gc2VsZi53LnBhY2thZ2Vicm93c2VyLmdldHRvcGNlbGwoKQorICAgICAgICBzZWwgPSBzZWxmLncucGFja2FnZWJyb3dzZXIuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZGF0YSA9IHNlbGYuZ2V0YnJvd3NlcmRhdGEoc2VsZi53LmhpZGRlbl9idXR0b24uZ2V0KCkpCisgICAgICAgIHNlbGYudy5wYWNrYWdlYnJvd3Nlci5zZXRpdGVtcyhkYXRhKQorICAgICAgICBzZWxmLncudXNlcl9idXR0b24uc2V0KHNlbGYuZ2V0dXNlcmluc3RhbGwoKSkKKyAgICAgICAgaWYgbGVuKHNlbCkgIT0gMToKKyAgICAgICAgICAgIHNlbGYudy5pbnN0YWxsZWQuc2V0KCcnKQorICAgICAgICAgICAgc2VsZi53Lm1lc3NhZ2Uuc2V0KCcnKQorICAgICAgICAgICAgc2VsZi53Lmluc3RhbGxfYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgc2VsZi53LmhvbWVwYWdlX2J1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy5kZXNjcmlwdGlvbi5zZXQoJycpCisgICAgICAgICAgICBzZWxmLncudmVyYm9zZV9idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLncucmVjdXJzaXZlX2J1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy5mb3JjZV9idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLncudXNlcl9idXR0b24uZW5hYmxlKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWwgPSBzZWxbMF0KKyAgICAgICAgICAgIGlmIHNlbCA+PSBsZW4oc2VsZi5wYWNrYWdlcyk6CisgICAgICAgICAgICAgICAgc2VsID0gMAorICAgICAgICAgICAgc2VsZi53LnBhY2thZ2Vicm93c2VyLnNldHNlbGVjdGlvbihbc2VsXSkKKyAgICAgICAgICAgIGluc3RhbGxlZCwgbWVzc2FnZSA9IHNlbGYuZ2V0c3RhdHVzKHNlbCkKKyAgICAgICAgICAgIHNlbGYudy5pbnN0YWxsZWQuc2V0KGluc3RhbGxlZCkKKyAgICAgICAgICAgIHNlbGYudy5tZXNzYWdlLnNldChtZXNzYWdlKQorICAgICAgICAgICAgc2VsZi53Lmluc3RhbGxfYnV0dG9uLmVuYWJsZShpbnN0YWxsZWQgIT0gInllcyIgb3Igc2VsZi53LmZvcmNlX2J1dHRvbi5nZXQoKSkKKyAgICAgICAgICAgIHNlbGYudy5ob21lcGFnZV9idXR0b24uZW5hYmxlKG5vdCBub3Qgc2VsZi5wYWNrYWdlc1tzZWxdLmhvbWVwYWdlKCkpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IHNlbGYucGFja2FnZXNbc2VsXS5kZXNjcmlwdGlvbigpCisgICAgICAgICAgICBkZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uLnNwbGl0bGluZXMoKQorICAgICAgICAgICAgZGVzY3JpcHRpb24gPSAnXHInLmpvaW4oZGVzY3JpcHRpb24pCisgICAgICAgICAgICBzZWxmLncuZGVzY3JpcHRpb24uc2V0KGRlc2NyaXB0aW9uKQorICAgICAgICAgICAgc2VsZi53LnZlcmJvc2VfYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgc2VsZi53LnJlY3Vyc2l2ZV9idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBzZWxmLncuZm9yY2VfYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgc2VsZi53LnVzZXJfYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICBzZWxmLncucGFja2FnZWJyb3dzZXIuc2V0dG9wY2VsbCh0b3BjZWxsKQorCisgICAgZGVmIGxpc3RoaXQoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgc2VsZi51cGRhdGVzdGF0dXMoKQorCisgICAgZGVmIGRvX2luc3RhbGwoc2VsZik6CisgICAgICAgIHNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKVswXQorICAgICAgICBpZiBzZWxmLncudmVyYm9zZV9idXR0b24uZ2V0KCk6CisgICAgICAgICAgICBvdXRwdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBvdXRwdXQgPSBOb25lCisgICAgICAgIHJlY3Vyc2l2ZSA9IHNlbGYudy5yZWN1cnNpdmVfYnV0dG9uLmdldCgpCisgICAgICAgIGZvcmNlID0gc2VsZi53LmZvcmNlX2J1dHRvbi5nZXQoKQorICAgICAgICBtZXNzYWdlcyA9IHNlbGYuaW5zdGFsbHBhY2thZ2Uoc2VsLCBvdXRwdXQsIHJlY3Vyc2l2ZSwgZm9yY2UpCisKKyAgICAgICAgIyBSZS1yZWFkIC5wdGggZmlsZXMKKyAgICAgICAgaW1wb3J0IHNpdGUKKyAgICAgICAgcmVsb2FkKHNpdGUpCisKKyAgICAgICAgc2VsZi51cGRhdGVzdGF0dXMoKQorICAgICAgICBzZWxmLnNob3dtZXNzYWdlcyhtZXNzYWdlcykKKworICAgIGRlZiBzaG93bWVzc2FnZXMoc2VsZiwgbWVzc2FnZXMpOgorICAgICAgICBpZiBtZXNzYWdlczoKKyAgICAgICAgICAgICMgVG8gYmUgb24gdGhlIHNhZmUgc2lkZSB3ZSBhbHdheXMgc2hvdyB0aGUgaGlkZGVuIHBhY2thZ2VzLAorICAgICAgICAgICAgIyB0aGV5IG1heSBiZSByZWZlcnJlZCB0byBpbiB0aGUgZXJyb3IgbWVzc2FnZXMuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi53LmhpZGRlbl9idXR0b24uZ2V0KCk6CisgICAgICAgICAgICAgICAgc2VsZi53LmhpZGRlbl9idXR0b24uc2V0KDEpCisgICAgICAgICAgICAgICAgc2VsZi51cGRhdGVzdGF0dXMoKQorICAgICAgICAgICAgaWYgdHlwZShtZXNzYWdlcykgPT0gbGlzdDoKKyAgICAgICAgICAgICAgICBtZXNzYWdlcyA9ICdcbicuam9pbihtZXNzYWdlcykKKyAgICAgICAgICAgIGlmIHNlbGYudy52ZXJib3NlX2J1dHRvbi5nZXQoKToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKG1lc3NhZ2VzICsgJ1xuJykKKyAgICAgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UobWVzc2FnZXMpCisKKyAgICBkZWYgZG9faG9tZXBhZ2Uoc2VsZik6CisgICAgICAgIHNlbCA9IHNlbGYudy5wYWNrYWdlYnJvd3Nlci5nZXRzZWxlY3Rpb24oKVswXQorICAgICAgICBpZiBub3Qgc2VsZi5pYzoKKyAgICAgICAgICAgIGltcG9ydCBpYworCisgICAgICAgICAgICBzZWxmLmljID0gaWMuSUMoKQorICAgICAgICBzZWxmLmljLmxhdW5jaHVybChzZWxmLnBhY2thZ2VzW3NlbF0uaG9tZXBhZ2UoKSkKKworICAgIGRlZiBkb191c2VyKHNlbGYpOgorICAgICAgICBtZXNzYWdlcyA9IHNlbGYuc2V0dXNlcmluc3RhbGwoc2VsZi53LnVzZXJfYnV0dG9uLmdldCgpKQorICAgICAgICBzZWxmLnVwZGF0ZXN0YXR1cygpCisgICAgICAgIHNlbGYuc2hvd21lc3NhZ2VzKG1lc3NhZ2VzKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCVBhY2thZ2VNYW5hZ2VyTWFpbigpCisgICAgUGFja2FnZU1hbmFnZXJNYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHJvZmlsZUJyb3dzZXIucHkgYi9NYWMvVG9vbHMvSURFL1Byb2ZpbGVCcm93c2VyLnB5CmluZGV4IGExOTY0MWMuLmEyZGFmZGQgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvUHJvZmlsZUJyb3dzZXIucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Qcm9maWxlQnJvd3Nlci5weQpAQCAtOSw4NCArOSw4NCBAQAogCiAjIGluY3JlYXNlIHByZWNpc2lvbgogZGVmIGY4KHgpOgotCXJldHVybiBzdHJpbmcucmp1c3QoZnBmb3JtYXQuZml4KHgsIDQpLCA4KQorICAgIHJldHVybiBzdHJpbmcucmp1c3QoZnBmb3JtYXQuZml4KHgsIDQpLCA4KQogcHN0YXRzLmY4ID0gZjgKIAogIyBoYWNraW5nIGFyb3VuZCBhIGhhY2sKIGlmIHN5cy52ZXJzaW9uWzozXSA+ICcxLjQnOgotCXRpbWVyID0gRXZ0LlRpY2tDb3VudAorICAgIHRpbWVyID0gRXZ0LlRpY2tDb3VudAogZWxzZToKLQlkZWYgdGltZXIoVGlja0NvdW50ID0gRXZ0LlRpY2tDb3VudCk6Ci0JCXJldHVybiBUaWNrQ291bnQoKSAvIDYwLjAKKyAgICBkZWYgdGltZXIoVGlja0NvdW50ID0gRXZ0LlRpY2tDb3VudCk6CisgICAgICAgIHJldHVybiBUaWNrQ291bnQoKSAvIDYwLjAKIAogY2xhc3MgUHJvZmlsZUJyb3dzZXI6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHN0YXRzID0gTm9uZSk6Ci0JCXNlbGYuc29ydGtleXMgPSAoJ2NhbGxzJywpCi0JCXNlbGYuc2V0dXB3aWRnZXRzKCkKLQkJc2VsZi5zZXRzdGF0cyhzdGF0cykKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOiAKLQkJc2VsZi53ID0gVy5XaW5kb3coKDU4MCwgNDAwKSwgIlByb2ZpbGUgU3RhdGlzdGljcyIsIG1pbnNpemUgPSAoMjAwLCAxMDApLCB0YWJiYWJsZSA9IDApCi0JCXNlbGYudy5kaXZsaW5lID0gVy5Ib3Jpem9udGFsTGluZSgoMCwgMjAsIDAsIDApKQotCQlzZWxmLncudGl0bGViYXIgPSBXLlRleHRCb3goKDQsIDQsIDQwLCAxMiksICdTb3J0IGJ5OicpCi0JCXNlbGYuYnV0dG9ucyA9IFtdCi0JCXggPSA1NAotCQl3aWR0aDEgPSA1MAotCQl3aWR0aDIgPSA3NQotCQlmb3IgbmFtZSBpbiBbImNhbGxzIiwgInRpbWUiLCAiY3VtdWxhdGl2ZSIsICJzdGRuYW1lIiwgImZpbGUiLCAibGluZSIsICJuYW1lIl06Ci0JCQlpZiBsZW4obmFtZSkgPiA2OgotCQkJCXdpZHRoID0gd2lkdGgyCi0JCQllbHNlOgotCQkJCXdpZHRoID0gd2lkdGgxCi0JCQlzZWxmLndbImJ1dHRvbl8iICsgbmFtZV0gPSBXLlJhZGlvQnV0dG9uKCh4LCA0LCB3aWR0aCwgMTIpLCBuYW1lLCBzZWxmLmJ1dHRvbnMsIHNlbGYuc2V0c29ydCkKLQkJCXggKz0gd2lkdGggKyAxMAotCQlzZWxmLncuYnV0dG9uX2NhbGxzLnNldCgxKQotCQlzZWxmLncudGV4dCA9IFcuVGV4dEVkaXRvcigoMCwgMjEsIC0xNSwgLTE1KSwgaW5zZXQgPSAoNiwgNSksIAotCQkJCXJlYWRvbmx5ID0gMSwgd3JhcCA9IDAsIGZvbnRzZXR0aW5ncyA9ICgnTW9uYWNvJywgMCwgOSwgKDAsIDAsIDApKSkKLQkJc2VsZi53Ll9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMjAsIDE2LCAtMTQpLCBzZWxmLncudGV4dC52c2Nyb2xsLCBtYXggPSAzMjc2NykKLQkJc2VsZi53Ll9iYXJ4ID0gVy5TY3JvbGxiYXIoKC0xLCAtMTUsIC0xNCwgMTYpLCBzZWxmLncudGV4dC5oc2Nyb2xsLCBtYXggPSAzMjc2NykKLQkJc2VsZi53Lm9wZW4oKQotCQotCWRlZiBzZXRzdGF0cyhzZWxmLCBzdGF0cyk6Ci0JCXNlbGYuc3RhdHMgPSBzdGF0cwotCQlzZWxmLnN0YXRzLnN0cmlwX2RpcnMoKQotCQlzZWxmLmRpc3BsYXlzdGF0cygpCi0JCi0JZGVmIHNldHNvcnQoc2VsZik6Ci0JCSMgR3JtcGYuIFRoZSBjYWxsYmFjayBkb2Vzbid0IGdpdmUgdXMgdGhlIGJ1dHRvbjotKAotCQlmb3IgYiBpbiBzZWxmLmJ1dHRvbnM6Ci0JCQlpZiBiLmdldCgpOgotCQkJCWlmIGIuX3RpdGxlID09IHNlbGYuc29ydGtleXNbMF06Ci0JCQkJCXJldHVybgotCQkJCXNlbGYuc29ydGtleXMgPSAoYi5fdGl0bGUsKSArIHNlbGYuc29ydGtleXNbOjNdCi0JCQkJYnJlYWsKLQkJc2VsZi5kaXNwbGF5c3RhdHMoKQotCQotCWRlZiBkaXNwbGF5c3RhdHMoc2VsZik6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWFwcGx5KHNlbGYuc3RhdHMuc29ydF9zdGF0cywgc2VsZi5zb3J0a2V5cykKLQkJc2F2ZW91dCA9IHN5cy5zdGRvdXQKLQkJdHJ5OgotCQkJcyA9IHN5cy5zdGRvdXQgPSBTdHJpbmdJTy5TdHJpbmdJTygpCi0JCQlzZWxmLnN0YXRzLnByaW50X3N0YXRzKCkKLQkJZmluYWxseToKLQkJCXN5cy5zdGRvdXQgPSBzYXZlb3V0Ci0JCXRleHQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQocy5nZXR2YWx1ZSgpLCAnXG4nKSwgJ1xyJykKLQkJc2VsZi53LnRleHQuc2V0KHRleHQpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc3RhdHMgPSBOb25lKToKKyAgICAgICAgc2VsZi5zb3J0a2V5cyA9ICgnY2FsbHMnLCkKKyAgICAgICAgc2VsZi5zZXR1cHdpZGdldHMoKQorICAgICAgICBzZWxmLnNldHN0YXRzKHN0YXRzKQorCisgICAgZGVmIHNldHVwd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coKDU4MCwgNDAwKSwgIlByb2ZpbGUgU3RhdGlzdGljcyIsIG1pbnNpemUgPSAoMjAwLCAxMDApLCB0YWJiYWJsZSA9IDApCisgICAgICAgIHNlbGYudy5kaXZsaW5lID0gVy5Ib3Jpem9udGFsTGluZSgoMCwgMjAsIDAsIDApKQorICAgICAgICBzZWxmLncudGl0bGViYXIgPSBXLlRleHRCb3goKDQsIDQsIDQwLCAxMiksICdTb3J0IGJ5OicpCisgICAgICAgIHNlbGYuYnV0dG9ucyA9IFtdCisgICAgICAgIHggPSA1NAorICAgICAgICB3aWR0aDEgPSA1MAorICAgICAgICB3aWR0aDIgPSA3NQorICAgICAgICBmb3IgbmFtZSBpbiBbImNhbGxzIiwgInRpbWUiLCAiY3VtdWxhdGl2ZSIsICJzdGRuYW1lIiwgImZpbGUiLCAibGluZSIsICJuYW1lIl06CisgICAgICAgICAgICBpZiBsZW4obmFtZSkgPiA2OgorICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHdpZHRoID0gd2lkdGgxCisgICAgICAgICAgICBzZWxmLndbImJ1dHRvbl8iICsgbmFtZV0gPSBXLlJhZGlvQnV0dG9uKCh4LCA0LCB3aWR0aCwgMTIpLCBuYW1lLCBzZWxmLmJ1dHRvbnMsIHNlbGYuc2V0c29ydCkKKyAgICAgICAgICAgIHggKz0gd2lkdGggKyAxMAorICAgICAgICBzZWxmLncuYnV0dG9uX2NhbGxzLnNldCgxKQorICAgICAgICBzZWxmLncudGV4dCA9IFcuVGV4dEVkaXRvcigoMCwgMjEsIC0xNSwgLTE1KSwgaW5zZXQgPSAoNiwgNSksCisgICAgICAgICAgICAgICAgICAgICAgICByZWFkb25seSA9IDEsIHdyYXAgPSAwLCBmb250c2V0dGluZ3MgPSAoJ01vbmFjbycsIDAsIDksICgwLCAwLCAwKSkpCisgICAgICAgIHNlbGYudy5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDIwLCAxNiwgLTE0KSwgc2VsZi53LnRleHQudnNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNlbGYudy5fYmFyeCA9IFcuU2Nyb2xsYmFyKCgtMSwgLTE1LCAtMTQsIDE2KSwgc2VsZi53LnRleHQuaHNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKworICAgIGRlZiBzZXRzdGF0cyhzZWxmLCBzdGF0cyk6CisgICAgICAgIHNlbGYuc3RhdHMgPSBzdGF0cworICAgICAgICBzZWxmLnN0YXRzLnN0cmlwX2RpcnMoKQorICAgICAgICBzZWxmLmRpc3BsYXlzdGF0cygpCisKKyAgICBkZWYgc2V0c29ydChzZWxmKToKKyAgICAgICAgIyBHcm1wZi4gVGhlIGNhbGxiYWNrIGRvZXNuJ3QgZ2l2ZSB1cyB0aGUgYnV0dG9uOi0oCisgICAgICAgIGZvciBiIGluIHNlbGYuYnV0dG9uczoKKyAgICAgICAgICAgIGlmIGIuZ2V0KCk6CisgICAgICAgICAgICAgICAgaWYgYi5fdGl0bGUgPT0gc2VsZi5zb3J0a2V5c1swXToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgc2VsZi5zb3J0a2V5cyA9IChiLl90aXRsZSwpICsgc2VsZi5zb3J0a2V5c1s6M10KKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBzZWxmLmRpc3BsYXlzdGF0cygpCisKKyAgICBkZWYgZGlzcGxheXN0YXRzKHNlbGYpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBhcHBseShzZWxmLnN0YXRzLnNvcnRfc3RhdHMsIHNlbGYuc29ydGtleXMpCisgICAgICAgIHNhdmVvdXQgPSBzeXMuc3Rkb3V0CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHMgPSBzeXMuc3Rkb3V0ID0gU3RyaW5nSU8uU3RyaW5nSU8oKQorICAgICAgICAgICAgc2VsZi5zdGF0cy5wcmludF9zdGF0cygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBzeXMuc3Rkb3V0ID0gc2F2ZW91dAorICAgICAgICB0ZXh0ID0gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KHMuZ2V0dmFsdWUoKSwgJ1xuJyksICdccicpCisgICAgICAgIHNlbGYudy50ZXh0LnNldCh0ZXh0KQogCiAKIGRlZiBtYWluKCk6Ci0JaW1wb3J0IHBzdGF0cwotCWFyZ3MgPSBzeXMuYXJndlsxOl0KLQlmb3IgaSBpbiBhcmdzOgotCQlzdGF0cyA9IHBzdGF0cy5TdGF0cyhpKQotCQlicm93c2VyID0gUHJvZmlsZUJyb3dzZXIoc3RhdHMpCi0JZWxzZToKLQkJZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSdQcm9maWxlciBkYXRhJykKLQkJaWYgbm90IGZpbGVuYW1lOiBzeXMuZXhpdCgwKQotCQlzdGF0cyA9IHBzdGF0cy5TdGF0cyhmaWxlbmFtZSkKLQkJYnJvd3NlciA9IFByb2ZpbGVCcm93c2VyKHN0YXRzKQorICAgIGltcG9ydCBwc3RhdHMKKyAgICBhcmdzID0gc3lzLmFyZ3ZbMTpdCisgICAgZm9yIGkgaW4gYXJnczoKKyAgICAgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMoaSkKKyAgICAgICAgYnJvd3NlciA9IFByb2ZpbGVCcm93c2VyKHN0YXRzKQorICAgIGVsc2U6CisgICAgICAgIGZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nUHJvZmlsZXIgZGF0YScpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZTogc3lzLmV4aXQoMCkKKyAgICAgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMoZmlsZW5hbWUpCisgICAgICAgIGJyb3dzZXIgPSBQcm9maWxlQnJvd3NlcihzdGF0cykKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQltYWluKCkKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlCcm93c2VyLnB5IGIvTWFjL1Rvb2xzL0lERS9QeUJyb3dzZXIucHkKaW5kZXggMzk3MzQ3ZS4uMGFkM2E5YSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeUJyb3dzZXIucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeUJyb3dzZXIucHkKQEAgLTE4LDYwMCArMTgsNTk5IEBACiAKIGhhc19jdGxjaGFyc1JFID0gcmUuY29tcGlsZShyJ1tcMDAwLVwwMzdcMTc3LVwzNzddJykKIGRlZiBjdGxjaGFyc1JFc2VhcmNoKHN0cik6Ci0JaWYgaGFzX2N0bGNoYXJzUkUuc2VhcmNoKHN0cikgaXMgTm9uZToKLQkJcmV0dXJuIC0xCi0JcmV0dXJuIDEKLQkKLWRlZiBkb3VibGVfcmVwcihrZXksIHZhbHVlLCB0cnVuY3ZhbHVlID0gMCwgCi0JCQl0eXBlID0gdHlwZSwgU3RyaW5nVHlwZSA9IHR5cGVzLlN0cmluZ1R5cGUsCi0JCQloYXNfY3RsY2hhcnMgPSBjdGxjaGFyc1JFc2VhcmNoLCBfcmVwciA9IHJlcHIsIHN0ciA9IHN0cik6Ci0JaWYgdHlwZShrZXkpID09IFN0cmluZ1R5cGUgYW5kIGhhc19jdGxjaGFycyhrZXkpIDwgMDoKLQkJa2V5ID0gc3RyKGtleSkKLQllbHNlOgotCQlrZXkgPSBfcmVwcihrZXkpCi0JaWYga2V5ID09ICdfX2J1aWx0aW5zX18nOgotCQl2YWx1ZSA9ICI8IiArIHR5cGUodmFsdWUpLl9fbmFtZV9fICsgIiAnX19idWlsdGluX18nPiIKLQllbGlmIGtleSA9PSAnX19yZXR1cm5fXyc6Ci0JCSMgYmxlaCwgd2hlbiByZXR1cm5pbmcgZnJvbSBhIGNsYXNzIGNvZGVibG9jayB3ZSBnZXQgaW5maW5pdGUgcmVjdXJzaW9uIGluIHJlcHIuIAotCQkjIFVzZSBzYWZlIHJlcHIgaW5zdGVhZC4KLQkJaW1wb3J0IHJlcHIKLQkJdmFsdWUgPSByZXByLnJlcHIodmFsdWUpCi0JZWxzZToKLQkJdHJ5OgotCQkJdmFsdWUgPSBfcmVwcih2YWx1ZSkKLQkJCScnICsgdmFsdWUJIyB0ZXN0IHRvIHNlZSBpZiBpdCBpcyBhIHN0cmluZywgaW4gY2FzZSBhIF9fcmVwcl9fIG1ldGhvZCBpcyBidWdneQotCQlleGNlcHQ6Ci0JCQl2YWx1ZSA9ICdceGE1XHhhNVx4YTUgZXhjZXB0aW9uIGluIHJlcHIoKScKLQlpZiB0cnVuY3ZhbHVlOgotCQlyZXR1cm4ga2V5ICsgJ1x0JyArIHZhbHVlWzoyNTVdCi0JcmV0dXJuIGtleSArICdcdCcgKyB2YWx1ZQorICAgIGlmIGhhc19jdGxjaGFyc1JFLnNlYXJjaChzdHIpIGlzIE5vbmU6CisgICAgICAgIHJldHVybiAtMQorICAgIHJldHVybiAxCisKK2RlZiBkb3VibGVfcmVwcihrZXksIHZhbHVlLCB0cnVuY3ZhbHVlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSB0eXBlLCBTdHJpbmdUeXBlID0gdHlwZXMuU3RyaW5nVHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGhhc19jdGxjaGFycyA9IGN0bGNoYXJzUkVzZWFyY2gsIF9yZXByID0gcmVwciwgc3RyID0gc3RyKToKKyAgICBpZiB0eXBlKGtleSkgPT0gU3RyaW5nVHlwZSBhbmQgaGFzX2N0bGNoYXJzKGtleSkgPCAwOgorICAgICAgICBrZXkgPSBzdHIoa2V5KQorICAgIGVsc2U6CisgICAgICAgIGtleSA9IF9yZXByKGtleSkKKyAgICBpZiBrZXkgPT0gJ19fYnVpbHRpbnNfXyc6CisgICAgICAgIHZhbHVlID0gIjwiICsgdHlwZSh2YWx1ZSkuX19uYW1lX18gKyAiICdfX2J1aWx0aW5fXyc+IgorICAgIGVsaWYga2V5ID09ICdfX3JldHVybl9fJzoKKyAgICAgICAgIyBibGVoLCB3aGVuIHJldHVybmluZyBmcm9tIGEgY2xhc3MgY29kZWJsb2NrIHdlIGdldCBpbmZpbml0ZSByZWN1cnNpb24gaW4gcmVwci4KKyAgICAgICAgIyBVc2Ugc2FmZSByZXByIGluc3RlYWQuCisgICAgICAgIGltcG9ydCByZXByCisgICAgICAgIHZhbHVlID0gcmVwci5yZXByKHZhbHVlKQorICAgIGVsc2U6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gX3JlcHIodmFsdWUpCisgICAgICAgICAgICAnJyArIHZhbHVlICAgICAgIyB0ZXN0IHRvIHNlZSBpZiBpdCBpcyBhIHN0cmluZywgaW4gY2FzZSBhIF9fcmVwcl9fIG1ldGhvZCBpcyBidWdneQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICB2YWx1ZSA9ICdceGE1XHhhNVx4YTUgZXhjZXB0aW9uIGluIHJlcHIoKScKKyAgICBpZiB0cnVuY3ZhbHVlOgorICAgICAgICByZXR1cm4ga2V5ICsgJ1x0JyArIHZhbHVlWzoyNTVdCisgICAgcmV0dXJuIGtleSArICdcdCcgKyB2YWx1ZQogCiAKIGRlZiB0cnVuY1N0cmluZyhzLCBtYXh3aWQpOgotCWlmIG1heHdpZCA8IDE6Ci0JCXJldHVybiAxLCAiIgotCXN0cmxlbiA9IGxlbihzKQotCXN0cndpZCA9IFFkLlRleHRXaWR0aChzLCAwLCBzdHJsZW4pOwotCWlmIHN0cndpZCA8PSBtYXh3aWQ6Ci0JCXJldHVybiAwLCBzCi0JCi0JUWQuVGV4dEZhY2UoUXVpY2tEcmF3LmNvbmRlbnNlKQotCXN0cndpZCA9IFFkLlRleHRXaWR0aChzLCAwLCBzdHJsZW4pCi0JZWxsaXBzaXMgPSBRZC5TdHJpbmdXaWR0aCgnXHhjOScpCi0JCi0JaWYgc3Ryd2lkIDw9IG1heHdpZDoKLQkJUWQuVGV4dEZhY2UoMCkKLQkJcmV0dXJuIDEsIHMKLQlpZiBzdHJ3aWQgPCAxOgotCQlRZC5UZXh0RmFjZSgwKQotCQlyZXR1cm4gMSwgIiIKLQkKLQltaWQgPSBpbnQoc3RybGVuICogbWF4d2lkIC8gc3Ryd2lkKQotCXdoaWxlIDE6Ci0JCWlmIG1pZCA8PSAwOgotCQkJbWlkID0gMAotCQkJYnJlYWsKLQkJc3Ryd2lkID0gUWQuVGV4dFdpZHRoKHMsIDAsIG1pZCkgKyBlbGxpcHNpcwotCQlzdHJ3aWQyID0gUWQuVGV4dFdpZHRoKHMsIDAsIG1pZCArIDEpICsgZWxsaXBzaXMKLQkJaWYgc3Ryd2lkIDw9IG1heHdpZCBhbmQgbWF4d2lkIDw9IHN0cndpZDI6Ci0JCQlpZiBtYXh3aWQgPT0gc3Ryd2lkMjoKLQkJCQltaWQgKz0gMQotCQkJYnJlYWsKLQkJaWYgc3Ryd2lkID4gbWF4d2lkOgotCQkJbWlkIC09IDEKLQkJCWlmIG1pZCA8PSAwOgotCQkJCW1pZCA9IDAKLQkJCQlicmVhawotCQllbGlmIHN0cndpZDIgPCBtYXh3aWQ6Ci0JCQltaWQgKz0gMQotCVFkLlRleHRGYWNlKDApCi0JcmV0dXJuIDEsIHNbOm1pZF0gKyAnXHhjOScKKyAgICBpZiBtYXh3aWQgPCAxOgorICAgICAgICByZXR1cm4gMSwgIiIKKyAgICBzdHJsZW4gPSBsZW4ocykKKyAgICBzdHJ3aWQgPSBRZC5UZXh0V2lkdGgocywgMCwgc3RybGVuKTsKKyAgICBpZiBzdHJ3aWQgPD0gbWF4d2lkOgorICAgICAgICByZXR1cm4gMCwgcworCisgICAgUWQuVGV4dEZhY2UoUXVpY2tEcmF3LmNvbmRlbnNlKQorICAgIHN0cndpZCA9IFFkLlRleHRXaWR0aChzLCAwLCBzdHJsZW4pCisgICAgZWxsaXBzaXMgPSBRZC5TdHJpbmdXaWR0aCgnXHhjOScpCisKKyAgICBpZiBzdHJ3aWQgPD0gbWF4d2lkOgorICAgICAgICBRZC5UZXh0RmFjZSgwKQorICAgICAgICByZXR1cm4gMSwgcworICAgIGlmIHN0cndpZCA8IDE6CisgICAgICAgIFFkLlRleHRGYWNlKDApCisgICAgICAgIHJldHVybiAxLCAiIgorCisgICAgbWlkID0gaW50KHN0cmxlbiAqIG1heHdpZCAvIHN0cndpZCkKKyAgICB3aGlsZSAxOgorICAgICAgICBpZiBtaWQgPD0gMDoKKyAgICAgICAgICAgIG1pZCA9IDAKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHN0cndpZCA9IFFkLlRleHRXaWR0aChzLCAwLCBtaWQpICsgZWxsaXBzaXMKKyAgICAgICAgc3Ryd2lkMiA9IFFkLlRleHRXaWR0aChzLCAwLCBtaWQgKyAxKSArIGVsbGlwc2lzCisgICAgICAgIGlmIHN0cndpZCA8PSBtYXh3aWQgYW5kIG1heHdpZCA8PSBzdHJ3aWQyOgorICAgICAgICAgICAgaWYgbWF4d2lkID09IHN0cndpZDI6CisgICAgICAgICAgICAgICAgbWlkICs9IDEKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIHN0cndpZCA+IG1heHdpZDoKKyAgICAgICAgICAgIG1pZCAtPSAxCisgICAgICAgICAgICBpZiBtaWQgPD0gMDoKKyAgICAgICAgICAgICAgICBtaWQgPSAwCisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxpZiBzdHJ3aWQyIDwgbWF4d2lkOgorICAgICAgICAgICAgbWlkICs9IDEKKyAgICBRZC5UZXh0RmFjZSgwKQorICAgIHJldHVybiAxLCBzWzptaWRdICsgJ1x4YzknCiAKIAogZGVmIGRyYXdUZXh0Q2VsbCh0ZXh0LCBjZWxsUmVjdCwgYXNjZW50LCB0aGVMaXN0KToKLQlsLCB0LCByLCBiID0gY2VsbFJlY3QKLQljZWxsd2lkdGggPSByIC0gbAotCVFkLk1vdmVUbyhpbnQobCArIDIpLCBpbnQodCArIGFzY2VudCkpCi0JY29uZGVuc2UsIHRleHQgPSB0cnVuY1N0cmluZyh0ZXh0LCBjZWxsd2lkdGggLSAzKQotCWlmIGNvbmRlbnNlOgotCQlRZC5UZXh0RmFjZShRdWlja0RyYXcuY29uZGVuc2UpCi0JUWQuRHJhd1RleHQodGV4dCwgMCwgbGVuKHRleHQpKQotCVFkLlRleHRGYWNlKDApCisgICAgbCwgdCwgciwgYiA9IGNlbGxSZWN0CisgICAgY2VsbHdpZHRoID0gciAtIGwKKyAgICBRZC5Nb3ZlVG8oaW50KGwgKyAyKSwgaW50KHQgKyBhc2NlbnQpKQorICAgIGNvbmRlbnNlLCB0ZXh0ID0gdHJ1bmNTdHJpbmcodGV4dCwgY2VsbHdpZHRoIC0gMykKKyAgICBpZiBjb25kZW5zZToKKyAgICAgICAgUWQuVGV4dEZhY2UoUXVpY2tEcmF3LmNvbmRlbnNlKQorICAgIFFkLkRyYXdUZXh0KHRleHQsIDAsIGxlbih0ZXh0KSkKKyAgICBRZC5UZXh0RmFjZSgwKQogCiAKIFBJQ1RXSURUSCA9IDE2CiAKIAogY2xhc3MgQnJvd3NlcldpZGdldChXLkN1c3RvbUxpc3QpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBvYmplY3QgPSBOb25lLCBjb2wgPSAxMDAsIGNsb3NlY2hpbGRyZW4gPSAwKToKLQkJVy5MaXN0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGNhbGxiYWNrID0gc2VsZi5saXN0aGl0KQotCQlzZWxmLm9iamVjdCA9IChOb25lLCkKLQkJc2VsZi5pbmRlbnQgPSAxNgotCQlzZWxmLmxhc3RtYXhpbmRlbnQgPSAwCi0JCXNlbGYuY2xvc2VjaGlsZHJlbiA9IGNsb3NlY2hpbGRyZW4KLQkJc2VsZi5jaGlsZHJlbiA9IFtdCi0JCXNlbGYubWluY29sID0gNjQKLQkJc2VsZi5zZXRjb2x1bW4oY29sKQotCQlzZWxmLmJpbmQoJ3JldHVybicsIHNlbGYub3BlbnNlbGVjdGlvbikKLQkJc2VsZi5iaW5kKCdlbnRlcicsIHNlbGYub3BlbnNlbGVjdGlvbikKLQkJaWYgb2JqZWN0IGlzIG5vdCBOb25lOgotCQkJc2VsZi5zZXQob2JqZWN0KQotCQotCWRlZiBzZXQoc2VsZiwgb2JqZWN0KToKLQkJaWYgc2VsZi5vYmplY3RbMF0gaXMgbm90IG9iamVjdDoKLQkJCXNlbGYub2JqZWN0ID0gb2JqZWN0LAotCQkJc2VsZls6XSA9IHNlbGYudW5wYWNrKG9iamVjdCwgMCkKLQkJZWxpZiBzZWxmLl9wYXJlbnR3aW5kb3cgaXMgbm90IE5vbmUgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQ6Ci0JCQlzZWxmLnVwZGF0ZSgpCi0JCi0JZGVmIHVucGFjayhzZWxmLCBvYmplY3QsIGluZGVudCk6Ci0JCXJldHVybiB1bnBhY2tfb2JqZWN0KG9iamVjdCwgaW5kZW50KQotCQotCWRlZiB1cGRhdGUoc2VsZik6Ci0JCSMgZm9yIG5vdy4uLgotCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCXNlbCA9IHNlbGYuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJZm9sZCA9IHNlbGYuZ2V0dW5mb2xkZWRvYmplY3RzKCkKLQkJdG9wY2VsbCA9IHNlbGYuZ2V0dG9wY2VsbCgpCi0JCXNlbGZbOl0gPSBzZWxmLnVucGFjayhzZWxmLm9iamVjdFswXSwgMCkKLQkJc2VsZi51bmZvbGRvYmplY3RzKGZvbGQpCi0JCXNlbGYuc2V0c2VsZWN0ZWRvYmplY3RzKHNlbCkKLQkJc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCi0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgc2V0Y29sdW1uKHNlbGYsIGNvbCk6Ci0JCXNlbGYuY29sID0gY29sCi0JCXNlbGYuY29sc3RyID0gc3RydWN0LnBhY2soJ2gnLCBjb2wpCi0JCWlmIHNlbGYuX2xpc3Q6Ci0JCQlzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCQlzZWxmLnNldGl0ZW1zKHNlbGYuaXRlbXMpCi0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWwpCi0JCi0JZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6Ci0JCWlmIGNoYXIgaW4gKFdrZXlzLmxlZnRhcnJvd2tleSwgV2tleXMucmlnaHRhcnJvd2tleSk6Ci0JCQlzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCQlzZWwucmV2ZXJzZSgpCi0JCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCQlmb3IgaW5kZXggaW4gc2VsOgotCQkJCXNlbGYuZm9sZChpbmRleCwgY2hhciA9PSBXa2V5cy5yaWdodGFycm93a2V5KQotCQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQllbHNlOgotCQkJVy5MaXN0LmtleShzZWxmLCBjaGFyLCBldmVudCkKLQkKLQlkZWYgcm9sbG92ZXIoc2VsZiwgKHgsIHkpLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJaWYgc2VsZi5pbmNvbHVtbigoeCwgeSkpOgotCQkJCVcuU2V0Q3Vyc29yKCdobW92ZXInKQotCQkJZWxzZToKLQkJCQlXLlNldEN1cnNvcignYXJyb3cnKQotCQotCWRlZiBpbmFycm93KHNlbGYsICh4LCB5KSk6Ci0JCWNsLCBjdCwgY3IsIGNiID0gc2VsZi5fbGlzdC5MUmVjdCgoMCwgMCkpCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJaWYgKHggLSBjbCkgPCAxNjoKLQkJCWNlbGxoZWlnaHQgPSBjYiAtIGN0Ci0JCQlpbmRleCA9ICh5IC0gY3QpIC8gY2VsbGhlaWdodAotCQkJaWYgaW5kZXggPCBsZW4oc2VsZi5pdGVtcyk6Ci0JCQkJcmV0dXJuIDEsIGluZGV4Ci0JCXJldHVybiBOb25lLCBOb25lCi0JCi0JZGVmIGluY29sdW1uKHNlbGYsICh4LCB5KSk6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKLQkJYWJzY29sID0gbCArIHNlbGYuY29sCi0JCXJldHVybiBhYnMoYWJzY29sIC0geCkgPCAzCi0JCi0JZGVmIHRyYWNrY29sdW1uKHNlbGYsICh4LCB5KSk6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBRZCwgUXVpY2tEcmF3LCBFdnQKLQkJc2VsZi5TZXRQb3J0KCkKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlib3VuZHMgPSBsLCB0LCByLCBiID0gbCArIDEsIHQgKyAxLCByIC0gMTYsIGIgLSAxCi0JCWFic2NvbCA9IGwgKyBzZWxmLmNvbAotCQltaW5jb2wgPSBsICsgc2VsZi5taW5jb2wKLQkJbWF4Y29sID0gciAtIDEwCi0JCWRpZmYgPSBhYnNjb2wgLSB4Ci0JCVFkLlBlblBhdCgnXDAwMFwzNzdcMDAwXDM3N1wwMDBcMzc3XDAwMFwzNzcnKQotCQlRZC5QZW5Nb2RlKFF1aWNrRHJhdy5zcmNYb3IpCi0JCXJlY3QgPSBhYnNjb2wgLSAxLCB0LCBhYnNjb2wsIGIKLQkJUWQuUGFpbnRSZWN0KHJlY3QpCi0JCWxhc3Rwb2ludCA9ICh4LCB5KQotCQluZXdjb2wgPSAtMQotCQkjVy5TZXRDdXJzb3IoJ2Zpc3QnKQotCQl3aGlsZSBFdnQuQnV0dG9uKCk6Ci0JCQlFdnQuV2FpdE5leHRFdmVudCgwLCAxLCBOb25lKSAgIyBuZWVkZWQgZm9yIE9TWAotCQkJKHgsIHkpID0gRXZ0LkdldE1vdXNlKCkKLQkJCWlmICh4LCB5KSA8PiBsYXN0cG9pbnQ6Ci0JCQkJbmV3Y29sID0geCArIGRpZmYKLQkJCQluZXdjb2wgPSBtYXgobmV3Y29sLCBtaW5jb2wpCi0JCQkJbmV3Y29sID0gbWluKG5ld2NvbCwgbWF4Y29sKQotCQkJCVFkLlBhaW50UmVjdChyZWN0KQotCQkJCXJlY3QgPSBuZXdjb2wgLSAxLCB0LCBuZXdjb2wsIGIKLQkJCQlRZC5QYWludFJlY3QocmVjdCkKLQkJCQlsYXN0cG9pbnQgPSAoeCwgeSkKLQkJUWQuUGFpbnRSZWN0KHJlY3QpCi0JCVFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNCbGFjaygpKQotCQlRZC5QZW5Ob3JtYWwoKQotCQlpZiBuZXdjb2wgPiAwIGFuZCBuZXdjb2wgPD4gYWJzY29sOgotCQkJc2VsZi5zZXRjb2x1bW4obmV3Y29sIC0gbCkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIHBvaW50ID09ICgtMSwgLTEpOgkjIGdyb3NzLgotCQkJVy5MaXN0LmNsaWNrKHNlbGYsIHBvaW50ICxtb2RpZmllcnMpCi0JCQlyZXR1cm4KLQkJaGl0LCBpbmRleCA9IHNlbGYuaW5hcnJvdyhwb2ludCkKLQkJaWYgaGl0OgotCQkJKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZi5pdGVtc1tpbmRleF0KLQkJCXNlbGYuZm9sZChpbmRleCwgYXJyb3cgPT0gMSkKLQkJZWxpZiBzZWxmLmluY29sdW1uKHBvaW50KToKLQkJCXNlbGYudHJhY2tjb2x1bW4ocG9pbnQpCi0JCWVsc2U6Ci0JCQlXLkxpc3QuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKLQkKLQkjIGZvciBXLkxpc3Qua2V5Ci0JZGVmIGZpbmRtYXRjaChzZWxmLCB0YWcpOgotCQlsb3dlciA9IHN0cmluZy5sb3dlcgotCQlpdGVtcyA9IHNlbGYuaXRlbXMKLQkJdGFnbGVuID0gbGVuKHRhZykKLQkJbWF0Y2ggPSAnXDM3NycgKiAxMDAKLQkJbWF0Y2hfaSA9IC0xCi0JCWZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgotCQkJaXRlbSA9IGxvd2VyKHN0cihpdGVtc1tpXVswXSkpCi0JCQlpZiB0YWcgPD0gaXRlbSA8IG1hdGNoOgotCQkJCW1hdGNoID0gaXRlbQotCQkJCW1hdGNoX2kgPSBpCi0JCWlmIG1hdGNoX2kgPj0gMDoKLQkJCXJldHVybiBtYXRjaF9pCi0JCWVsc2U6Ci0JCQlyZXR1cm4gbGVuKGl0ZW1zKSAtIDEKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYuY2xvc2VjaGlsZHJlbjoKLQkJCWZvciB3aW5kb3cgaW4gc2VsZi5jaGlsZHJlbjoKLQkJCQl3aW5kb3cuY2xvc2UoKQotCQlzZWxmLmNoaWxkcmVuID0gW10KLQkJVy5MaXN0LmNsb3NlKHNlbGYpCi0JCi0JZGVmIGZvbGQoc2VsZiwgaW5kZXgsIG9ub2ZmKToKLQkJKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZi5pdGVtc1tpbmRleF0KLQkJaWYgYXJyb3cgPT0gMCBvciAob25vZmYgYW5kIGFycm93ID09IDIpIG9yIChub3Qgb25vZmYgYW5kIGFycm93ID09IDEpOgotCQkJcmV0dXJuCi0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCXRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQotCQlpZiBvbm9mZjoKLQkJCXNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDQsIGluZGVudCkKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJCXNlbGZbaW5kZXgrMTppbmRleCsxXSA9IHNlbGYudW5wYWNrKHZhbHVlLCBpbmRlbnQgKyAxKQotCQkJc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgMiwgaW5kZW50KQotCQllbHNlOgotCQkJc2VsZltpbmRleF0gPSAoa2V5LCB2YWx1ZSwgMywgaW5kZW50KQotCQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQotCQkJY291bnQgPSAwCi0JCQlmb3IgaSBpbiByYW5nZShpbmRleCArIDEsIGxlbihzZWxmLml0ZW1zKSk6Ci0JCQkJKGR1bW15LCBkdW1teSwgZHVtbXksIHN1YmluZGVudCkgPSBzZWxmLml0ZW1zW2ldCi0JCQkJaWYgc3ViaW5kZW50IDw9IGluZGVudDoKLQkJCQkJYnJlYWsKLQkJCQljb3VudCA9IGNvdW50ICsgMQotCQkJc2VsZltpbmRleCsxOmluZGV4KzErY291bnRdID0gW10KLQkJCXNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDEsIGluZGVudCkKLQkJbWF4aW5kZW50ID0gc2VsZi5nZXRtYXhpbmRlbnQoKQotCQlpZiBtYXhpbmRlbnQgPD4gc2VsZi5sYXN0bWF4aW5kZW50OgotCQkJbmV3YWJzaW5kZW50ID0gc2VsZi5jb2wgKyAobWF4aW5kZW50IC0gc2VsZi5sYXN0bWF4aW5kZW50KSAqIHNlbGYuaW5kZW50Ci0JCQlpZiBuZXdhYnNpbmRlbnQgPj0gc2VsZi5taW5jb2w6Ci0JCQkJc2VsZi5zZXRjb2x1bW4obmV3YWJzaW5kZW50KQotCQkJc2VsZi5sYXN0bWF4aW5kZW50ID0gbWF4aW5kZW50Ci0JCXNlbGYuc2V0dG9wY2VsbCh0b3BjZWxsKQotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDEpCi0JCi0JZGVmIHVuZm9sZG9iamVjdHMoc2VsZiwgb2JqZWN0cyk6Ci0JCWZvciBvYmogaW4gb2JqZWN0czoKLQkJCXRyeToKLQkJCQlpbmRleCA9IHNlbGYuaXRlbXMuaW5kZXgob2JqKQotCQkJZXhjZXB0IFZhbHVlRXJyb3I6Ci0JCQkJcGFzcwotCQkJZWxzZToKLQkJCQlzZWxmLmZvbGQoaW5kZXgsIDEpCi0JCi0JZGVmIGdldHVuZm9sZGVkb2JqZWN0cyhzZWxmKToKLQkJY3VyaW5kZW50ID0gMAotCQlvYmplY3RzID0gW10KLQkJZm9yIGluZGV4IGluIHJhbmdlKGxlbihzZWxmLml0ZW1zKSk6Ci0JCQkoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCkgPSBzZWxmLml0ZW1zW2luZGV4XQotCQkJaWYgaW5kZW50ID4gY3VyaW5kZW50OgotCQkJCShrLCB2LCBhLCBpKSA9IHNlbGYuaXRlbXNbaW5kZXggLSAxXQotCQkJCW9iamVjdHMuYXBwZW5kKChrLCB2LCAxLCBpKSkKLQkJCQljdXJpbmRlbnQgPSBpbmRlbnQKLQkJCWVsaWYgaW5kZW50IDwgY3VyaW5kZW50OgotCQkJCWN1cmluZGVudCA9IGluZGVudAotCQlyZXR1cm4gb2JqZWN0cwotCQotCWRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsKToKLQkJaWYgaXNkYmw6Ci0JCQlzZWxmLm9wZW5zZWxlY3Rpb24oKQotCQotCWRlZiBvcGVuc2VsZWN0aW9uKHNlbGYpOgotCQlpbXBvcnQgb3MKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlmb3IgaW5kZXggaW4gc2VsOgotCQkJKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZltpbmRleF0KLQkJCWlmIGFycm93OgotCQkJCXNlbGYuY2hpbGRyZW4uYXBwZW5kKEJyb3dzZXIodmFsdWUpKQotCQkJZWxpZiB0eXBlKHZhbHVlKSA9PSB0eXBlcy5TdHJpbmdUeXBlIGFuZCAnXDAnIG5vdCBpbiB2YWx1ZToKLQkJCQllZGl0b3IgPSBzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50LmdldHNjcmlwdCh2YWx1ZSkKLQkJCQlpZiBlZGl0b3I6Ci0JCQkJCWVkaXRvci5zZWxlY3QoKQotCQkJCQlyZXR1cm4KLQkJCQllbGlmIG9zLnBhdGguZXhpc3RzKHZhbHVlKSBhbmQgb3MucGF0aC5pc2ZpbGUodmFsdWUpOgotCQkJCQlpZiBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZSh2YWx1ZSlbMV0gaW4gKCdURVhUJywgJ1wwXDBcMFwwJyk6Ci0JCQkJCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdCh2YWx1ZSkKLQkKLQlkZWYgaXRlbXJlcHIoc2VsZiwgKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpLCBzdHIgPSBzdHIsIGRvdWJsZV9yZXByID0gZG91YmxlX3JlcHIsIAotCQkJYXJyb3dzID0gYXJyb3dzLCBwYWNrID0gc3RydWN0LnBhY2spOgotCQlhcnJvdyA9IGFycm93c1thcnJvd10KLQkJcmV0dXJuIGFycm93ICsgcGFjaygnaCcsIHNlbGYuaW5kZW50ICogaW5kZW50KSArIHNlbGYuY29sc3RyICsgXAotCQkJCWRvdWJsZV9yZXByKGtleSwgdmFsdWUsIDEpCi0JCi0JZGVmIGdldG1heGluZGVudChzZWxmLCBtYXggPSBtYXgpOgotCQltYXhpbmRlbnQgPSAwCi0JCWZvciBpdGVtIGluIHNlbGYuaXRlbXM6Ci0JCQltYXhpbmRlbnQgPSBtYXgobWF4aW5kZW50LCBpdGVtWzNdKQotCQlyZXR1cm4gbWF4aW5kZW50Ci0JCi0JZGVmIGRvbWVudV9jb3B5KHNlbGYsICphcmdzKToKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQlzZWxpdGVtcyA9IFtdCi0JCWZvciBrZXksIHZhbHVlLCBkdW1teSwgZHVtbXkgaW4gc2VsOgotCQkJc2VsaXRlbXMuYXBwZW5kKGRvdWJsZV9yZXByKGtleSwgdmFsdWUpKQotCQl0ZXh0ID0gc3RyaW5nLmpvaW4oc2VsaXRlbXMsICdccicpCi0JCWlmIHRleHQ6Ci0JCQlmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKLQkJCWlmIGhhc2F0dHIoU2NyYXAsICdQdXRTY3JhcCcpOgotCQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCQkJU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCB0ZXh0KQotCQkJZWxzZToKLQkJCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCQkJc2MgPSBTY3JhcC5HZXRDdXJyZW50U2NyYXAoKQotCQkJCXNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgdGV4dCkKIAotCWRlZiBsaXN0RGVmRHJhdyhzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsIAotCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6Ci0JCXNlbGYubXlEcmF3Q2VsbCgwLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsIAotCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKLQkKLQlkZWYgbGlzdERlZkhpZ2hsaWdodChzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsIAotCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6Ci0JCXNlbGYubXlEcmF3Q2VsbCgxLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsIAotCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKLQkKLQlkZWYgbXlEcmF3Q2VsbChzZWxmLCBvbmx5SGlsaXRlLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsIAotCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6Ci0JCXNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQotCQlRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKLQkJc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKLQkJUWQuR2V0Q2xpcChzYXZlZENsaXApCi0JCVFkLkNsaXBSZWN0KGNlbGxSZWN0KQotCQlzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQotCQlRZC5QZW5Ob3JtYWwoKQotCQkKLQkJbCwgdCwgciwgYiA9IGNlbGxSZWN0Ci0JCQotCQlpZiBub3Qgb25seUhpbGl0ZToKLQkJCVFkLkVyYXNlUmVjdChjZWxsUmVjdCkKLQkJCQotCQkJYXNjZW50LCBkZXNjZW50LCBsZWFkaW5nLCBzaXplLCBobSA9IEZtLkZvbnRNZXRyaWNzKCkKLQkJCWxpbmVmZWVkID0gYXNjZW50ICsgZGVzY2VudCArIGxlYWRpbmcKLQkJCQotCQkJaWYgZGF0YUxlbiA+PSA2OgotCQkJCWRhdGEgPSB0aGVMaXN0LkxHZXRDZWxsKGRhdGFMZW4sIHRoZUNlbGwpCi0JCQkJaWNvbklkLCBpbmRlbnQsIHRhYiA9IHN0cnVjdC51bnBhY2soImhoaCIsIGRhdGFbOjZdKQotCQkJCXRyeToKLQkJCQkJa2V5LCB2YWx1ZSA9IGRhdGFbNjpdLnNwbGl0KCJcdCIsIDEpCi0JCQkJZXhjZXB0IFZhbHVlRXJyb3I6Ci0JCQkJCSMgYm9ndXMgZGF0YSwgYXQgbGVhc3QgZG9uJ3QgY3Jhc2guCi0JCQkJCWluZGVudCA9IDAKLQkJCQkJdGFiID0gMAotCQkJCQlpY29uSWQgPSAwCi0JCQkJCWtleSA9ICIiCi0JCQkJCXZhbHVlID0gZGF0YVs2Ol0KLQkJCQkKLQkJCQlpZiBpY29uSWQ6Ci0JCQkJCXRyeToKLQkJCQkJCXRoZUljb24gPSBJY24uR2V0Q0ljb24oaWNvbklkKQotCQkJCQlleGNlcHQgSWNuLkVycm9yOgotCQkJCQkJcGFzcwotCQkJCQllbHNlOgotCQkJCQkJcmVjdCA9ICgwLCAwLCAxNiwgMTYpCi0JCQkJCQlyZWN0ID0gUWQuT2Zmc2V0UmVjdChyZWN0LCBsLCB0KQotCQkJCQkJcmVjdCA9IFFkLk9mZnNldFJlY3QocmVjdCwgMCwgKHRoZUxpc3QuY2VsbFNpemVbMV0gLSAocmVjdFszXSAtIHJlY3RbMV0pKSAvIDIpCi0JCQkJCQlJY24uUGxvdENJY29uKHJlY3QsIHRoZUljb24pCi0JCQkJCi0JCQkJaWYgbGVuKGtleSkgPj0gMDoKLQkJCQkJY2wsIGN0LCBjciwgY2IgPSBjZWxsUmVjdAotCQkJCQl2bCwgdnQsIHZyLCB2YiA9IHNlbGYuX3ZpZXdib3VuZHMKLQkJCQkJY2wgPSB2bCArIFBJQ1RXSURUSCArIGluZGVudAotCQkJCQljciA9IHZsICsgdGFiCi0JCQkJCWlmIGNyID4gdnI6Ci0JCQkJCQljciA9IHZyCi0JCQkJCWlmIGNsIDwgY3I6Ci0JCQkJCQlkcmF3VGV4dENlbGwoa2V5LCAoY2wsIGN0LCBjciwgY2IpLCBhc2NlbnQsIHRoZUxpc3QpCi0JCQkJCWNsID0gdmwgKyB0YWIKLQkJCQkJY3IgPSB2cgotCQkJCQlpZiBjbCA8IGNyOgotCQkJCQkJZHJhd1RleHRDZWxsKHZhbHVlLCAoY2wsIGN0LCBjciwgY2IpLCBhc2NlbnQsIHRoZUxpc3QpCi0JCQkjZWxpZiBkYXRhTGVuICE9IDA6Ci0JCQkjCWRyYXdUZXh0Q2VsbCgiPz8/IiwgMywgY2VsbFJlY3QsIGFzY2VudCwgdGhlTGlzdCkKLQkJCWVsc2U6Ci0JCQkJcmV0dXJuICAjIHdlIGhhdmUgYm9ndXMgZGF0YQotCQkJCi0JCQkjIGRyYXcgbmljZSBkb3R0ZWQgbGluZQotCQkJbCwgdCwgciwgYiA9IGNlbGxSZWN0Ci0JCQlsID0gc2VsZi5fdmlld2JvdW5kc1swXSArIHRhYgotCQkJciA9IGwgKyAxOwotCQkJaWYgbm90ICh0aGVMaXN0LmNlbGxTaXplWzFdICYgMHgwMSkgb3IgKHQgJiAweDAxKToKLQkJCQlteVBhdCA9ICJceGZmXHgwMFx4ZmZceDAwXHhmZlx4MDBceGZmXHgwMCIKLQkJCWVsc2U6Ci0JCQkJbXlQYXQgPSAiXHgwMFx4ZmZceDAwXHhmZlx4MDBceGZmXHgwMFx4ZmYiCi0JCQlRZC5QZW5QYXQobXlQYXQpCi0JCQlRZC5QZW5Nb2RlKFF1aWNrRHJhdy5zcmNDb3B5KQotCQkJUWQuUGFpbnRSZWN0KChsLCB0LCByLCBiKSkKLQkJCVFkLlBlbk5vcm1hbCgpCi0JCQotCQlpZiBzZWxlY3RlZCBvciBvbmx5SGlsaXRlOgotCQkJbCwgdCwgciwgYiA9IGNlbGxSZWN0Ci0JCQlsID0gc2VsZi5fdmlld2JvdW5kc1swXSArIFBJQ1RXSURUSAotCQkJciA9IHNlbGYuX3ZpZXdib3VuZHNbMl0KLQkJCVFkLlBlbk1vZGUoaGlsaXRldHJhbnNmZXJtb2RlKQotCQkJUWQuUGFpbnRSZWN0KChsLCB0LCByLCBiKSkKLQkJCi0JCSMgcmVzdG9yZSBncmFwaGljcyBlbnZpcm9ubWVudAotCQlRZC5TZXRQb3J0KHNhdmVkUG9ydCkKLQkJUWQuU2V0Q2xpcChzYXZlZENsaXApCi0JCVFkLkRpc3Bvc2VSZ24oc2F2ZWRDbGlwKQotCQlRZC5TZXRQZW5TdGF0ZShzYXZlZFBlblN0YXRlKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBvYmplY3QgPSBOb25lLCBjb2wgPSAxMDAsIGNsb3NlY2hpbGRyZW4gPSAwKToKKyAgICAgICAgVy5MaXN0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGNhbGxiYWNrID0gc2VsZi5saXN0aGl0KQorICAgICAgICBzZWxmLm9iamVjdCA9IChOb25lLCkKKyAgICAgICAgc2VsZi5pbmRlbnQgPSAxNgorICAgICAgICBzZWxmLmxhc3RtYXhpbmRlbnQgPSAwCisgICAgICAgIHNlbGYuY2xvc2VjaGlsZHJlbiA9IGNsb3NlY2hpbGRyZW4KKyAgICAgICAgc2VsZi5jaGlsZHJlbiA9IFtdCisgICAgICAgIHNlbGYubWluY29sID0gNjQKKyAgICAgICAgc2VsZi5zZXRjb2x1bW4oY29sKQorICAgICAgICBzZWxmLmJpbmQoJ3JldHVybicsIHNlbGYub3BlbnNlbGVjdGlvbikKKyAgICAgICAgc2VsZi5iaW5kKCdlbnRlcicsIHNlbGYub3BlbnNlbGVjdGlvbikKKyAgICAgICAgaWYgb2JqZWN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi5zZXQob2JqZWN0KQorCisgICAgZGVmIHNldChzZWxmLCBvYmplY3QpOgorICAgICAgICBpZiBzZWxmLm9iamVjdFswXSBpcyBub3Qgb2JqZWN0OgorICAgICAgICAgICAgc2VsZi5vYmplY3QgPSBvYmplY3QsCisgICAgICAgICAgICBzZWxmWzpdID0gc2VsZi51bnBhY2sob2JqZWN0LCAwKQorICAgICAgICBlbGlmIHNlbGYuX3BhcmVudHdpbmRvdyBpcyBub3QgTm9uZSBhbmQgc2VsZi5fcGFyZW50d2luZG93LndpZDoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlKCkKKworICAgIGRlZiB1bnBhY2soc2VsZiwgb2JqZWN0LCBpbmRlbnQpOgorICAgICAgICByZXR1cm4gdW5wYWNrX29iamVjdChvYmplY3QsIGluZGVudCkKKworICAgIGRlZiB1cGRhdGUoc2VsZik6CisgICAgICAgICMgZm9yIG5vdy4uLgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgZm9sZCA9IHNlbGYuZ2V0dW5mb2xkZWRvYmplY3RzKCkKKyAgICAgICAgdG9wY2VsbCA9IHNlbGYuZ2V0dG9wY2VsbCgpCisgICAgICAgIHNlbGZbOl0gPSBzZWxmLnVucGFjayhzZWxmLm9iamVjdFswXSwgMCkKKyAgICAgICAgc2VsZi51bmZvbGRvYmplY3RzKGZvbGQpCisgICAgICAgIHNlbGYuc2V0c2VsZWN0ZWRvYmplY3RzKHNlbCkKKyAgICAgICAgc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBzZXRjb2x1bW4oc2VsZiwgY29sKToKKyAgICAgICAgc2VsZi5jb2wgPSBjb2wKKyAgICAgICAgc2VsZi5jb2xzdHIgPSBzdHJ1Y3QucGFjaygnaCcsIGNvbCkKKyAgICAgICAgaWYgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgICAgIHNlbGYuc2V0aXRlbXMoc2VsZi5pdGVtcykKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbCkKKworICAgIGRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgorICAgICAgICBpZiBjaGFyIGluIChXa2V5cy5sZWZ0YXJyb3drZXksIFdrZXlzLnJpZ2h0YXJyb3drZXkpOgorICAgICAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICAgICAgc2VsLnJldmVyc2UoKQorICAgICAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICAgICAgZm9yIGluZGV4IGluIHNlbDoKKyAgICAgICAgICAgICAgICBzZWxmLmZvbGQoaW5kZXgsIGNoYXIgPT0gV2tleXMucmlnaHRhcnJvd2tleSkKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFcuTGlzdC5rZXkoc2VsZiwgY2hhciwgZXZlbnQpCisKKyAgICBkZWYgcm9sbG92ZXIoc2VsZiwgKHgsIHkpLCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5pbmNvbHVtbigoeCwgeSkpOgorICAgICAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCdobW92ZXInKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBXLlNldEN1cnNvcignYXJyb3cnKQorCisgICAgZGVmIGluYXJyb3coc2VsZiwgKHgsIHkpKToKKyAgICAgICAgY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICBpZiAoeCAtIGNsKSA8IDE2OgorICAgICAgICAgICAgY2VsbGhlaWdodCA9IGNiIC0gY3QKKyAgICAgICAgICAgIGluZGV4ID0gKHkgLSBjdCkgLyBjZWxsaGVpZ2h0CisgICAgICAgICAgICBpZiBpbmRleCA8IGxlbihzZWxmLml0ZW1zKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMSwgaW5kZXgKKyAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgIGRlZiBpbmNvbHVtbihzZWxmLCAoeCwgeSkpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fbGlzdC5MUmVjdCgoMCwgMCkpCisgICAgICAgIGFic2NvbCA9IGwgKyBzZWxmLmNvbAorICAgICAgICByZXR1cm4gYWJzKGFic2NvbCAtIHgpIDwgMworCisgICAgZGVmIHRyYWNrY29sdW1uKHNlbGYsICh4LCB5KSk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBRZCwgUXVpY2tEcmF3LCBFdnQKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICBib3VuZHMgPSBsLCB0LCByLCBiID0gbCArIDEsIHQgKyAxLCByIC0gMTYsIGIgLSAxCisgICAgICAgIGFic2NvbCA9IGwgKyBzZWxmLmNvbAorICAgICAgICBtaW5jb2wgPSBsICsgc2VsZi5taW5jb2wKKyAgICAgICAgbWF4Y29sID0gciAtIDEwCisgICAgICAgIGRpZmYgPSBhYnNjb2wgLSB4CisgICAgICAgIFFkLlBlblBhdCgnXDAwMFwzNzdcMDAwXDM3N1wwMDBcMzc3XDAwMFwzNzcnKQorICAgICAgICBRZC5QZW5Nb2RlKFF1aWNrRHJhdy5zcmNYb3IpCisgICAgICAgIHJlY3QgPSBhYnNjb2wgLSAxLCB0LCBhYnNjb2wsIGIKKyAgICAgICAgUWQuUGFpbnRSZWN0KHJlY3QpCisgICAgICAgIGxhc3Rwb2ludCA9ICh4LCB5KQorICAgICAgICBuZXdjb2wgPSAtMQorICAgICAgICAjVy5TZXRDdXJzb3IoJ2Zpc3QnKQorICAgICAgICB3aGlsZSBFdnQuQnV0dG9uKCk6CisgICAgICAgICAgICBFdnQuV2FpdE5leHRFdmVudCgwLCAxLCBOb25lKSAgIyBuZWVkZWQgZm9yIE9TWAorICAgICAgICAgICAgKHgsIHkpID0gRXZ0LkdldE1vdXNlKCkKKyAgICAgICAgICAgIGlmICh4LCB5KSA8PiBsYXN0cG9pbnQ6CisgICAgICAgICAgICAgICAgbmV3Y29sID0geCArIGRpZmYKKyAgICAgICAgICAgICAgICBuZXdjb2wgPSBtYXgobmV3Y29sLCBtaW5jb2wpCisgICAgICAgICAgICAgICAgbmV3Y29sID0gbWluKG5ld2NvbCwgbWF4Y29sKQorICAgICAgICAgICAgICAgIFFkLlBhaW50UmVjdChyZWN0KQorICAgICAgICAgICAgICAgIHJlY3QgPSBuZXdjb2wgLSAxLCB0LCBuZXdjb2wsIGIKKyAgICAgICAgICAgICAgICBRZC5QYWludFJlY3QocmVjdCkKKyAgICAgICAgICAgICAgICBsYXN0cG9pbnQgPSAoeCwgeSkKKyAgICAgICAgUWQuUGFpbnRSZWN0KHJlY3QpCisgICAgICAgIFFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNCbGFjaygpKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBpZiBuZXdjb2wgPiAwIGFuZCBuZXdjb2wgPD4gYWJzY29sOgorICAgICAgICAgICAgc2VsZi5zZXRjb2x1bW4obmV3Y29sIC0gbCkKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgcG9pbnQgPT0gKC0xLCAtMSk6ICAgIyBncm9zcy4KKyAgICAgICAgICAgIFcuTGlzdC5jbGljayhzZWxmLCBwb2ludCAsbW9kaWZpZXJzKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGhpdCwgaW5kZXggPSBzZWxmLmluYXJyb3cocG9pbnQpCisgICAgICAgIGlmIGhpdDoKKyAgICAgICAgICAgIChrZXksIHZhbHVlLCBhcnJvdywgaW5kZW50KSA9IHNlbGYuaXRlbXNbaW5kZXhdCisgICAgICAgICAgICBzZWxmLmZvbGQoaW5kZXgsIGFycm93ID09IDEpCisgICAgICAgIGVsaWYgc2VsZi5pbmNvbHVtbihwb2ludCk6CisgICAgICAgICAgICBzZWxmLnRyYWNrY29sdW1uKHBvaW50KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgVy5MaXN0LmNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpCisKKyAgICAjIGZvciBXLkxpc3Qua2V5CisgICAgZGVmIGZpbmRtYXRjaChzZWxmLCB0YWcpOgorICAgICAgICBsb3dlciA9IHN0cmluZy5sb3dlcgorICAgICAgICBpdGVtcyA9IHNlbGYuaXRlbXMKKyAgICAgICAgdGFnbGVuID0gbGVuKHRhZykKKyAgICAgICAgbWF0Y2ggPSAnXDM3NycgKiAxMDAKKyAgICAgICAgbWF0Y2hfaSA9IC0xCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgaXRlbSA9IGxvd2VyKHN0cihpdGVtc1tpXVswXSkpCisgICAgICAgICAgICBpZiB0YWcgPD0gaXRlbSA8IG1hdGNoOgorICAgICAgICAgICAgICAgIG1hdGNoID0gaXRlbQorICAgICAgICAgICAgICAgIG1hdGNoX2kgPSBpCisgICAgICAgIGlmIG1hdGNoX2kgPj0gMDoKKyAgICAgICAgICAgIHJldHVybiBtYXRjaF9pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gbGVuKGl0ZW1zKSAtIDEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWNoaWxkcmVuOgorICAgICAgICAgICAgZm9yIHdpbmRvdyBpbiBzZWxmLmNoaWxkcmVuOgorICAgICAgICAgICAgICAgIHdpbmRvdy5jbG9zZSgpCisgICAgICAgIHNlbGYuY2hpbGRyZW4gPSBbXQorICAgICAgICBXLkxpc3QuY2xvc2Uoc2VsZikKKworICAgIGRlZiBmb2xkKHNlbGYsIGluZGV4LCBvbm9mZik6CisgICAgICAgIChrZXksIHZhbHVlLCBhcnJvdywgaW5kZW50KSA9IHNlbGYuaXRlbXNbaW5kZXhdCisgICAgICAgIGlmIGFycm93ID09IDAgb3IgKG9ub2ZmIGFuZCBhcnJvdyA9PSAyKSBvciAobm90IG9ub2ZmIGFuZCBhcnJvdyA9PSAxKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICB0b3BjZWxsID0gc2VsZi5nZXR0b3BjZWxsKCkKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmW2luZGV4XSA9IChrZXksIHZhbHVlLCA0LCBpbmRlbnQpCisgICAgICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgICAgICBzZWxmW2luZGV4KzE6aW5kZXgrMV0gPSBzZWxmLnVucGFjayh2YWx1ZSwgaW5kZW50ICsgMSkKKyAgICAgICAgICAgIHNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDIsIGluZGVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGZbaW5kZXhdID0gKGtleSwgdmFsdWUsIDMsIGluZGVudCkKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIGNvdW50ID0gMAorICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UoaW5kZXggKyAxLCBsZW4oc2VsZi5pdGVtcykpOgorICAgICAgICAgICAgICAgIChkdW1teSwgZHVtbXksIGR1bW15LCBzdWJpbmRlbnQpID0gc2VsZi5pdGVtc1tpXQorICAgICAgICAgICAgICAgIGlmIHN1YmluZGVudCA8PSBpbmRlbnQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgICAgIHNlbGZbaW5kZXgrMTppbmRleCsxK2NvdW50XSA9IFtdCisgICAgICAgICAgICBzZWxmW2luZGV4XSA9IChrZXksIHZhbHVlLCAxLCBpbmRlbnQpCisgICAgICAgIG1heGluZGVudCA9IHNlbGYuZ2V0bWF4aW5kZW50KCkKKyAgICAgICAgaWYgbWF4aW5kZW50IDw+IHNlbGYubGFzdG1heGluZGVudDoKKyAgICAgICAgICAgIG5ld2Fic2luZGVudCA9IHNlbGYuY29sICsgKG1heGluZGVudCAtIHNlbGYubGFzdG1heGluZGVudCkgKiBzZWxmLmluZGVudAorICAgICAgICAgICAgaWYgbmV3YWJzaW5kZW50ID49IHNlbGYubWluY29sOgorICAgICAgICAgICAgICAgIHNlbGYuc2V0Y29sdW1uKG5ld2Fic2luZGVudCkKKyAgICAgICAgICAgIHNlbGYubGFzdG1heGluZGVudCA9IG1heGluZGVudAorICAgICAgICBzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQorCisgICAgZGVmIHVuZm9sZG9iamVjdHMoc2VsZiwgb2JqZWN0cyk6CisgICAgICAgIGZvciBvYmogaW4gb2JqZWN0czoKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBpbmRleCA9IHNlbGYuaXRlbXMuaW5kZXgob2JqKQorICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLmZvbGQoaW5kZXgsIDEpCisKKyAgICBkZWYgZ2V0dW5mb2xkZWRvYmplY3RzKHNlbGYpOgorICAgICAgICBjdXJpbmRlbnQgPSAwCisgICAgICAgIG9iamVjdHMgPSBbXQorICAgICAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKKyAgICAgICAgICAgIChrZXksIHZhbHVlLCBhcnJvdywgaW5kZW50KSA9IHNlbGYuaXRlbXNbaW5kZXhdCisgICAgICAgICAgICBpZiBpbmRlbnQgPiBjdXJpbmRlbnQ6CisgICAgICAgICAgICAgICAgKGssIHYsIGEsIGkpID0gc2VsZi5pdGVtc1tpbmRleCAtIDFdCisgICAgICAgICAgICAgICAgb2JqZWN0cy5hcHBlbmQoKGssIHYsIDEsIGkpKQorICAgICAgICAgICAgICAgIGN1cmluZGVudCA9IGluZGVudAorICAgICAgICAgICAgZWxpZiBpbmRlbnQgPCBjdXJpbmRlbnQ6CisgICAgICAgICAgICAgICAgY3VyaW5kZW50ID0gaW5kZW50CisgICAgICAgIHJldHVybiBvYmplY3RzCisKKyAgICBkZWYgbGlzdGhpdChzZWxmLCBpc2RibCk6CisgICAgICAgIGlmIGlzZGJsOgorICAgICAgICAgICAgc2VsZi5vcGVuc2VsZWN0aW9uKCkKKworICAgIGRlZiBvcGVuc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBmb3IgaW5kZXggaW4gc2VsOgorICAgICAgICAgICAgKGtleSwgdmFsdWUsIGFycm93LCBpbmRlbnQpID0gc2VsZltpbmRleF0KKyAgICAgICAgICAgIGlmIGFycm93OgorICAgICAgICAgICAgICAgIHNlbGYuY2hpbGRyZW4uYXBwZW5kKEJyb3dzZXIodmFsdWUpKQorICAgICAgICAgICAgZWxpZiB0eXBlKHZhbHVlKSA9PSB0eXBlcy5TdHJpbmdUeXBlIGFuZCAnXDAnIG5vdCBpbiB2YWx1ZToKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSBzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50LmdldHNjcmlwdCh2YWx1ZSkKKyAgICAgICAgICAgICAgICBpZiBlZGl0b3I6CisgICAgICAgICAgICAgICAgICAgIGVkaXRvci5zZWxlY3QoKQorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbGlmIG9zLnBhdGguZXhpc3RzKHZhbHVlKSBhbmQgb3MucGF0aC5pc2ZpbGUodmFsdWUpOgorICAgICAgICAgICAgICAgICAgICBpZiBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZSh2YWx1ZSlbMV0gaW4gKCdURVhUJywgJ1wwXDBcMFwwJyk6CisgICAgICAgICAgICAgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdCh2YWx1ZSkKKworICAgIGRlZiBpdGVtcmVwcihzZWxmLCAoa2V5LCB2YWx1ZSwgYXJyb3csIGluZGVudCksIHN0ciA9IHN0ciwgZG91YmxlX3JlcHIgPSBkb3VibGVfcmVwciwKKyAgICAgICAgICAgICAgICAgICAgYXJyb3dzID0gYXJyb3dzLCBwYWNrID0gc3RydWN0LnBhY2spOgorICAgICAgICBhcnJvdyA9IGFycm93c1thcnJvd10KKyAgICAgICAgcmV0dXJuIGFycm93ICsgcGFjaygnaCcsIHNlbGYuaW5kZW50ICogaW5kZW50KSArIHNlbGYuY29sc3RyICsgXAorICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX3JlcHIoa2V5LCB2YWx1ZSwgMSkKKworICAgIGRlZiBnZXRtYXhpbmRlbnQoc2VsZiwgbWF4ID0gbWF4KToKKyAgICAgICAgbWF4aW5kZW50ID0gMAorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLml0ZW1zOgorICAgICAgICAgICAgbWF4aW5kZW50ID0gbWF4KG1heGluZGVudCwgaXRlbVszXSkKKyAgICAgICAgcmV0dXJuIG1heGluZGVudAorCisgICAgZGVmIGRvbWVudV9jb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICBzZWxpdGVtcyA9IFtdCisgICAgICAgIGZvciBrZXksIHZhbHVlLCBkdW1teSwgZHVtbXkgaW4gc2VsOgorICAgICAgICAgICAgc2VsaXRlbXMuYXBwZW5kKGRvdWJsZV9yZXByKGtleSwgdmFsdWUpKQorICAgICAgICB0ZXh0ID0gc3RyaW5nLmpvaW4oc2VsaXRlbXMsICdccicpCisgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdQdXRTY3JhcCcpOgorICAgICAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgICAgICAgICAgU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCB0ZXh0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgICAgICAgICAgc2MgPSBTY3JhcC5HZXRDdXJyZW50U2NyYXAoKQorICAgICAgICAgICAgICAgIHNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgdGV4dCkKKworICAgIGRlZiBsaXN0RGVmRHJhdyhzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgorICAgICAgICBzZWxmLm15RHJhd0NlbGwoMCwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCisKKyAgICBkZWYgbGlzdERlZkhpZ2hsaWdodChzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgorICAgICAgICBzZWxmLm15RHJhd0NlbGwoMSwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCisKKyAgICBkZWYgbXlEcmF3Q2VsbChzZWxmLCBvbmx5SGlsaXRlLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgorICAgICAgICBzYXZlZFBvcnQgPSBRZC5HZXRQb3J0KCkKKyAgICAgICAgUWQuU2V0UG9ydCh0aGVMaXN0LkdldExpc3RQb3J0KCkpCisgICAgICAgIHNhdmVkQ2xpcCA9IFFkLk5ld1JnbigpCisgICAgICAgIFFkLkdldENsaXAoc2F2ZWRDbGlwKQorICAgICAgICBRZC5DbGlwUmVjdChjZWxsUmVjdCkKKyAgICAgICAgc2F2ZWRQZW5TdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKKyAgICAgICAgUWQuUGVuTm9ybWFsKCkKKworICAgICAgICBsLCB0LCByLCBiID0gY2VsbFJlY3QKKworICAgICAgICBpZiBub3Qgb25seUhpbGl0ZToKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdChjZWxsUmVjdCkKKworICAgICAgICAgICAgYXNjZW50LCBkZXNjZW50LCBsZWFkaW5nLCBzaXplLCBobSA9IEZtLkZvbnRNZXRyaWNzKCkKKyAgICAgICAgICAgIGxpbmVmZWVkID0gYXNjZW50ICsgZGVzY2VudCArIGxlYWRpbmcKKworICAgICAgICAgICAgaWYgZGF0YUxlbiA+PSA2OgorICAgICAgICAgICAgICAgIGRhdGEgPSB0aGVMaXN0LkxHZXRDZWxsKGRhdGFMZW4sIHRoZUNlbGwpCisgICAgICAgICAgICAgICAgaWNvbklkLCBpbmRlbnQsIHRhYiA9IHN0cnVjdC51bnBhY2soImhoaCIsIGRhdGFbOjZdKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAga2V5LCB2YWx1ZSA9IGRhdGFbNjpdLnNwbGl0KCJcdCIsIDEpCisgICAgICAgICAgICAgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICMgYm9ndXMgZGF0YSwgYXQgbGVhc3QgZG9uJ3QgY3Jhc2guCisgICAgICAgICAgICAgICAgICAgIGluZGVudCA9IDAKKyAgICAgICAgICAgICAgICAgICAgdGFiID0gMAorICAgICAgICAgICAgICAgICAgICBpY29uSWQgPSAwCisgICAgICAgICAgICAgICAgICAgIGtleSA9ICIiCisgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gZGF0YVs2Ol0KKworICAgICAgICAgICAgICAgIGlmIGljb25JZDoKKyAgICAgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICAgICAgdGhlSWNvbiA9IEljbi5HZXRDSWNvbihpY29uSWQpCisgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJY24uRXJyb3I6CisgICAgICAgICAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICByZWN0ID0gKDAsIDAsIDE2LCAxNikKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlY3QgPSBRZC5PZmZzZXRSZWN0KHJlY3QsIGwsIHQpCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0ID0gUWQuT2Zmc2V0UmVjdChyZWN0LCAwLCAodGhlTGlzdC5jZWxsU2l6ZVsxXSAtIChyZWN0WzNdIC0gcmVjdFsxXSkpIC8gMikKKyAgICAgICAgICAgICAgICAgICAgICAgIEljbi5QbG90Q0ljb24ocmVjdCwgdGhlSWNvbikKKworICAgICAgICAgICAgICAgIGlmIGxlbihrZXkpID49IDA6CisgICAgICAgICAgICAgICAgICAgIGNsLCBjdCwgY3IsIGNiID0gY2VsbFJlY3QKKyAgICAgICAgICAgICAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLl92aWV3Ym91bmRzCisgICAgICAgICAgICAgICAgICAgIGNsID0gdmwgKyBQSUNUV0lEVEggKyBpbmRlbnQKKyAgICAgICAgICAgICAgICAgICAgY3IgPSB2bCArIHRhYgorICAgICAgICAgICAgICAgICAgICBpZiBjciA+IHZyOgorICAgICAgICAgICAgICAgICAgICAgICAgY3IgPSB2cgorICAgICAgICAgICAgICAgICAgICBpZiBjbCA8IGNyOgorICAgICAgICAgICAgICAgICAgICAgICAgZHJhd1RleHRDZWxsKGtleSwgKGNsLCBjdCwgY3IsIGNiKSwgYXNjZW50LCB0aGVMaXN0KQorICAgICAgICAgICAgICAgICAgICBjbCA9IHZsICsgdGFiCisgICAgICAgICAgICAgICAgICAgIGNyID0gdnIKKyAgICAgICAgICAgICAgICAgICAgaWYgY2wgPCBjcjoKKyAgICAgICAgICAgICAgICAgICAgICAgIGRyYXdUZXh0Q2VsbCh2YWx1ZSwgKGNsLCBjdCwgY3IsIGNiKSwgYXNjZW50LCB0aGVMaXN0KQorICAgICAgICAgICAgI2VsaWYgZGF0YUxlbiAhPSAwOgorICAgICAgICAgICAgIyAgICAgICBkcmF3VGV4dENlbGwoIj8/PyIsIDMsIGNlbGxSZWN0LCBhc2NlbnQsIHRoZUxpc3QpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJldHVybiAgIyB3ZSBoYXZlIGJvZ3VzIGRhdGEKKworICAgICAgICAgICAgIyBkcmF3IG5pY2UgZG90dGVkIGxpbmUKKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBjZWxsUmVjdAorICAgICAgICAgICAgbCA9IHNlbGYuX3ZpZXdib3VuZHNbMF0gKyB0YWIKKyAgICAgICAgICAgIHIgPSBsICsgMTsKKyAgICAgICAgICAgIGlmIG5vdCAodGhlTGlzdC5jZWxsU2l6ZVsxXSAmIDB4MDEpIG9yICh0ICYgMHgwMSk6CisgICAgICAgICAgICAgICAgbXlQYXQgPSAiXHhmZlx4MDBceGZmXHgwMFx4ZmZceDAwXHhmZlx4MDAiCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG15UGF0ID0gIlx4MDBceGZmXHgwMFx4ZmZceDAwXHhmZlx4MDBceGZmIgorICAgICAgICAgICAgUWQuUGVuUGF0KG15UGF0KQorICAgICAgICAgICAgUWQuUGVuTW9kZShRdWlja0RyYXcuc3JjQ29weSkKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdCgobCwgdCwgciwgYikpCisgICAgICAgICAgICBRZC5QZW5Ob3JtYWwoKQorCisgICAgICAgIGlmIHNlbGVjdGVkIG9yIG9ubHlIaWxpdGU6CisgICAgICAgICAgICBsLCB0LCByLCBiID0gY2VsbFJlY3QKKyAgICAgICAgICAgIGwgPSBzZWxmLl92aWV3Ym91bmRzWzBdICsgUElDVFdJRFRICisgICAgICAgICAgICByID0gc2VsZi5fdmlld2JvdW5kc1syXQorICAgICAgICAgICAgUWQuUGVuTW9kZShoaWxpdGV0cmFuc2Zlcm1vZGUpCisgICAgICAgICAgICBRZC5QYWludFJlY3QoKGwsIHQsIHIsIGIpKQorCisgICAgICAgICMgcmVzdG9yZSBncmFwaGljcyBlbnZpcm9ubWVudAorICAgICAgICBRZC5TZXRQb3J0KHNhdmVkUG9ydCkKKyAgICAgICAgUWQuU2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkRpc3Bvc2VSZ24oc2F2ZWRDbGlwKQorICAgICAgICBRZC5TZXRQZW5TdGF0ZShzYXZlZFBlblN0YXRlKQogCiAKIAogY2xhc3MgQnJvd3NlcjoKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgb2JqZWN0ID0gTm9uZSwgdGl0bGUgPSBOb25lLCBjbG9zZWNoaWxkcmVuID0gMCk6Ci0JCWlmIGhhc2F0dHIob2JqZWN0LCAnX19uYW1lX18nKToKLQkJCW5hbWUgPSBvYmplY3QuX19uYW1lX18KLQkJZWxzZToKLQkJCW5hbWUgPSAnJwotCQlpZiB0aXRsZSBpcyBOb25lOgotCQkJdGl0bGUgPSAnT2JqZWN0IGJyb3dzZXInCi0JCQlpZiBuYW1lOgotCQkJCXRpdGxlID0gdGl0bGUgKyAnOiAnICsgbmFtZQotCQlzZWxmLncgPSB3ID0gVy5XaW5kb3coKDMwMCwgNDAwKSwgdGl0bGUsIG1pbnNpemUgPSAoMTAwLCAxMDApKQotCQl3LmluZm8gPSBXLlRleHRCb3goKDE4LCA4LCAtNzAsIDE1KSkKLQkJdy51cGRhdGVidXR0b24gPSBXLkJldmVsQnV0dG9uKCgtNjQsIDQsIDUwLCAxNiksICdVcGRhdGUnLCBzZWxmLnVwZGF0ZSkKLQkJdy5icm93c2VyID0gQnJvd3NlcldpZGdldCgoLTEsIDI0LCAxLCAtMTQpLCBOb25lKQotCQl3LmJpbmQoJ2NtZHUnLCB3LnVwZGF0ZWJ1dHRvbi5wdXNoKQotCQl3Lm9wZW4oKQotCQlzZWxmLnNldChvYmplY3QsIG5hbWUpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLncud2lkOgotCQkJc2VsZi53LmNsb3NlKCkKLQkKLQlkZWYgc2V0KHNlbGYsIG9iamVjdCwgbmFtZSA9ICcnKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJdHAgPSB0eXBlKG9iamVjdCkuX19uYW1lX18KLQkJdHJ5OgotCQkJbGVuZ3RoID0gbGVuKG9iamVjdCkKLQkJZXhjZXB0OgotCQkJbGVuZ3RoID0gLTEKLQkJaWYgbm90IG5hbWUgYW5kIGhhc2F0dHIob2JqZWN0LCAnX19uYW1lX18nKToKLQkJCW5hbWUgPSBvYmplY3QuX19uYW1lX18KLQkJaWYgbmFtZToKLQkJCWluZm8gPSBuYW1lICsgJzogJyArIHRwCi0JCWVsc2U6Ci0JCQlpbmZvID0gdHAKLQkJaWYgbGVuZ3RoID49IDA6Ci0JCQlpZiBsZW5ndGggPT0gMToKLQkJCQlpbmZvID0gaW5mbyArICcgKCVkIGVsZW1lbnQpJyAlIGxlbmd0aAotCQkJZWxzZToKLQkJCQlpbmZvID0gaW5mbyArICcgKCVkIGVsZW1lbnRzKScgJSBsZW5ndGgKLQkJc2VsZi53LmluZm8uc2V0KGluZm8pCi0JCXNlbGYudy5icm93c2VyLnNldChvYmplY3QpCi0JCi0JZGVmIHVwZGF0ZShzZWxmKToKLQkJc2VsZi53LmJyb3dzZXIudXBkYXRlKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBvYmplY3QgPSBOb25lLCB0aXRsZSA9IE5vbmUsIGNsb3NlY2hpbGRyZW4gPSAwKToKKyAgICAgICAgaWYgaGFzYXR0cihvYmplY3QsICdfX25hbWVfXycpOgorICAgICAgICAgICAgbmFtZSA9IG9iamVjdC5fX25hbWVfXworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmFtZSA9ICcnCisgICAgICAgIGlmIHRpdGxlIGlzIE5vbmU6CisgICAgICAgICAgICB0aXRsZSA9ICdPYmplY3QgYnJvd3NlcicKKyAgICAgICAgICAgIGlmIG5hbWU6CisgICAgICAgICAgICAgICAgdGl0bGUgPSB0aXRsZSArICc6ICcgKyBuYW1lCisgICAgICAgIHNlbGYudyA9IHcgPSBXLldpbmRvdygoMzAwLCA0MDApLCB0aXRsZSwgbWluc2l6ZSA9ICgxMDAsIDEwMCkpCisgICAgICAgIHcuaW5mbyA9IFcuVGV4dEJveCgoMTgsIDgsIC03MCwgMTUpKQorICAgICAgICB3LnVwZGF0ZWJ1dHRvbiA9IFcuQmV2ZWxCdXR0b24oKC02NCwgNCwgNTAsIDE2KSwgJ1VwZGF0ZScsIHNlbGYudXBkYXRlKQorICAgICAgICB3LmJyb3dzZXIgPSBCcm93c2VyV2lkZ2V0KCgtMSwgMjQsIDEsIC0xNCksIE5vbmUpCisgICAgICAgIHcuYmluZCgnY21kdScsIHcudXBkYXRlYnV0dG9uLnB1c2gpCisgICAgICAgIHcub3BlbigpCisgICAgICAgIHNlbGYuc2V0KG9iamVjdCwgbmFtZSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi53LndpZDoKKyAgICAgICAgICAgIHNlbGYudy5jbG9zZSgpCisKKyAgICBkZWYgc2V0KHNlbGYsIG9iamVjdCwgbmFtZSA9ICcnKToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgdHAgPSB0eXBlKG9iamVjdCkuX19uYW1lX18KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgbGVuZ3RoID0gbGVuKG9iamVjdCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgbGVuZ3RoID0gLTEKKyAgICAgICAgaWYgbm90IG5hbWUgYW5kIGhhc2F0dHIob2JqZWN0LCAnX19uYW1lX18nKToKKyAgICAgICAgICAgIG5hbWUgPSBvYmplY3QuX19uYW1lX18KKyAgICAgICAgaWYgbmFtZToKKyAgICAgICAgICAgIGluZm8gPSBuYW1lICsgJzogJyArIHRwCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbmZvID0gdHAKKyAgICAgICAgaWYgbGVuZ3RoID49IDA6CisgICAgICAgICAgICBpZiBsZW5ndGggPT0gMToKKyAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICcgKCVkIGVsZW1lbnQpJyAlIGxlbmd0aAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpbmZvID0gaW5mbyArICcgKCVkIGVsZW1lbnRzKScgJSBsZW5ndGgKKyAgICAgICAgc2VsZi53LmluZm8uc2V0KGluZm8pCisgICAgICAgIHNlbGYudy5icm93c2VyLnNldChvYmplY3QpCisKKyAgICBkZWYgdXBkYXRlKHNlbGYpOgorICAgICAgICBzZWxmLncuYnJvd3Nlci51cGRhdGUoKQogCiAKIFNJTVBMRV9UWVBFUyA9ICgKLQl0eXBlKE5vbmUpLAotCWludCwKLQlsb25nLAotCWZsb2F0LAotCWNvbXBsZXgsCi0Jc3RyLAotCXVuaWNvZGUsCisgICAgICAgIHR5cGUoTm9uZSksCisgICAgICAgIGludCwKKyAgICAgICAgbG9uZywKKyAgICAgICAgZmxvYXQsCisgICAgICAgIGNvbXBsZXgsCisgICAgICAgIHN0ciwKKyAgICAgICAgdW5pY29kZSwKICkKIAogZGVmIGdldF9pdmFycyhvYmopOgotCSIiIlJldHVybiBhIGxpc3QgdGhlIG5hbWVzIG9mIGFsbCAocG90ZW50aWFsKSBpbnN0YW5jZSB2YXJpYWJsZXMuIiIiCi0JIyBfX21yb19fIHJlY2lwZSBmcm9tIEd1aWRvCi0Jc2xvdHMgPSB7fQotCSMgb2xkLXN0eWxlIEMgb2JqZWN0cwotCWlmIGhhc2F0dHIob2JqLCAiX19tZW1iZXJzX18iKToKLQkJZm9yIG5hbWUgaW4gb2JqLl9fbWVtYmVyc19fOgotCQkJc2xvdHNbbmFtZV0gPSBOb25lCi0JaWYgaGFzYXR0cihvYmosICJfX21ldGhvZHNfXyIpOgotCQlmb3IgbmFtZSBpbiBvYmouX19tZXRob2RzX186Ci0JCQlzbG90c1tuYW1lXSA9IE5vbmUKLQkjIGdlbmVyaWMgdHlwZQotCWlmIGhhc2F0dHIob2JqLCAiX19kaWN0X18iKToKLQkJc2xvdHMudXBkYXRlKG9iai5fX2RpY3RfXykKLQljbHMgPSB0eXBlKG9iaikKLQlpZiBoYXNhdHRyKGNscywgIl9fbXJvX18iKToKLQkJIyBuZXctc3R5bGUgY2xhc3MsIHVzZSBkZXNjcmlwdG9ycwotCQlmb3IgYmFzZSBpbiBjbHMuX19tcm9fXzoKLQkJCWZvciBuYW1lLCB2YWx1ZSBpbiBiYXNlLl9fZGljdF9fLml0ZW1zKCk6Ci0JCQkJIyBYWFggdXNpbmcgY2FsbGFibGUoKSBpcyBhIGhldXJpc3RpYyB3aGljaCBpc24ndCAxMDAlCi0JCQkJIyBmb29scHJvb2YuCi0JCQkJaWYgaGFzYXR0cih2YWx1ZSwgIl9fZ2V0X18iKSBhbmQgbm90IGNhbGxhYmxlKHZhbHVlKToKLQkJCQkJc2xvdHNbbmFtZV0gPSBOb25lCi0JaWYgIl9fZGljdF9fIiBpbiBzbG90czoKLQkJZGVsIHNsb3RzWyJfX2RpY3RfXyJdCi0Jc2xvdHMgPSBzbG90cy5rZXlzKCkKLQlzbG90cy5zb3J0KCkKLQlyZXR1cm4gc2xvdHMKKyAgICAiIiJSZXR1cm4gYSBsaXN0IHRoZSBuYW1lcyBvZiBhbGwgKHBvdGVudGlhbCkgaW5zdGFuY2UgdmFyaWFibGVzLiIiIgorICAgICMgX19tcm9fXyByZWNpcGUgZnJvbSBHdWlkbworICAgIHNsb3RzID0ge30KKyAgICAjIG9sZC1zdHlsZSBDIG9iamVjdHMKKyAgICBpZiBoYXNhdHRyKG9iaiwgIl9fbWVtYmVyc19fIik6CisgICAgICAgIGZvciBuYW1lIGluIG9iai5fX21lbWJlcnNfXzoKKyAgICAgICAgICAgIHNsb3RzW25hbWVdID0gTm9uZQorICAgIGlmIGhhc2F0dHIob2JqLCAiX19tZXRob2RzX18iKToKKyAgICAgICAgZm9yIG5hbWUgaW4gb2JqLl9fbWV0aG9kc19fOgorICAgICAgICAgICAgc2xvdHNbbmFtZV0gPSBOb25lCisgICAgIyBnZW5lcmljIHR5cGUKKyAgICBpZiBoYXNhdHRyKG9iaiwgIl9fZGljdF9fIik6CisgICAgICAgIHNsb3RzLnVwZGF0ZShvYmouX19kaWN0X18pCisgICAgY2xzID0gdHlwZShvYmopCisgICAgaWYgaGFzYXR0cihjbHMsICJfX21yb19fIik6CisgICAgICAgICMgbmV3LXN0eWxlIGNsYXNzLCB1c2UgZGVzY3JpcHRvcnMKKyAgICAgICAgZm9yIGJhc2UgaW4gY2xzLl9fbXJvX186CisgICAgICAgICAgICBmb3IgbmFtZSwgdmFsdWUgaW4gYmFzZS5fX2RpY3RfXy5pdGVtcygpOgorICAgICAgICAgICAgICAgICMgWFhYIHVzaW5nIGNhbGxhYmxlKCkgaXMgYSBoZXVyaXN0aWMgd2hpY2ggaXNuJ3QgMTAwJQorICAgICAgICAgICAgICAgICMgZm9vbHByb29mLgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIodmFsdWUsICJfX2dldF9fIikgYW5kIG5vdCBjYWxsYWJsZSh2YWx1ZSk6CisgICAgICAgICAgICAgICAgICAgIHNsb3RzW25hbWVdID0gTm9uZQorICAgIGlmICJfX2RpY3RfXyIgaW4gc2xvdHM6CisgICAgICAgIGRlbCBzbG90c1siX19kaWN0X18iXQorICAgIHNsb3RzID0gc2xvdHMua2V5cygpCisgICAgc2xvdHMuc29ydCgpCisgICAgcmV0dXJuIHNsb3RzCiAKIGRlZiB1bnBhY2tfb2JqZWN0KG9iamVjdCwgaW5kZW50ID0gMCk6Ci0JdHAgPSB0eXBlKG9iamVjdCkKLQlpZiBpc2luc3RhbmNlKG9iamVjdCwgU0lNUExFX1RZUEVTKSBhbmQgb2JqZWN0IGlzIG5vdCBOb25lOgotCQlyYWlzZSBUeXBlRXJyb3IsICJjYW4ndCBicm93c2Ugc2ltcGxlIHR5cGU6ICVzIiAlIHRwLl9fbmFtZV9fCi0JZWxpZiBpc2luc3RhbmNlKG9iamVjdCwgZGljdCk6Ci0JCXJldHVybiB1bnBhY2tfZGljdChvYmplY3QsIGluZGVudCkKLQllbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCAodHVwbGUsIGxpc3QpKToKLQkJcmV0dXJuIHVucGFja19zZXF1ZW5jZShvYmplY3QsIGluZGVudCkKLQllbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5Nb2R1bGVUeXBlKToKLQkJcmV0dXJuIHVucGFja19kaWN0KG9iamVjdC5fX2RpY3RfXywgaW5kZW50KQotCWVsc2U6Ci0JCXJldHVybiB1bnBhY2tfb3RoZXIob2JqZWN0LCBpbmRlbnQpCisgICAgdHAgPSB0eXBlKG9iamVjdCkKKyAgICBpZiBpc2luc3RhbmNlKG9iamVjdCwgU0lNUExFX1RZUEVTKSBhbmQgb2JqZWN0IGlzIG5vdCBOb25lOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYW4ndCBicm93c2Ugc2ltcGxlIHR5cGU6ICVzIiAlIHRwLl9fbmFtZV9fCisgICAgZWxpZiBpc2luc3RhbmNlKG9iamVjdCwgZGljdCk6CisgICAgICAgIHJldHVybiB1bnBhY2tfZGljdChvYmplY3QsIGluZGVudCkKKyAgICBlbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCAodHVwbGUsIGxpc3QpKToKKyAgICAgICAgcmV0dXJuIHVucGFja19zZXF1ZW5jZShvYmplY3QsIGluZGVudCkKKyAgICBlbGlmIGlzaW5zdGFuY2Uob2JqZWN0LCB0eXBlcy5Nb2R1bGVUeXBlKToKKyAgICAgICAgcmV0dXJuIHVucGFja19kaWN0KG9iamVjdC5fX2RpY3RfXywgaW5kZW50KQorICAgIGVsc2U6CisgICAgICAgIHJldHVybiB1bnBhY2tfb3RoZXIob2JqZWN0LCBpbmRlbnQpCiAKIGRlZiB1bnBhY2tfc2VxdWVuY2Uoc2VxLCBpbmRlbnQgPSAwKToKLQlyZXR1cm4gWyhpLCB2LCBub3QgaXNpbnN0YW5jZSh2LCBTSU1QTEVfVFlQRVMpLCBpbmRlbnQpCi0JICAgICAgICAgZm9yIGksIHYgaW4gZW51bWVyYXRlKHNlcSldCisgICAgcmV0dXJuIFsoaSwgdiwgbm90IGlzaW5zdGFuY2UodiwgU0lNUExFX1RZUEVTKSwgaW5kZW50KQorICAgICAgICAgICAgIGZvciBpLCB2IGluIGVudW1lcmF0ZShzZXEpXQogCiBkZWYgdW5wYWNrX2RpY3QoZGljdCwgaW5kZW50ID0gMCk6Ci0JaXRlbXMgPSBkaWN0Lml0ZW1zKCkKLQlyZXR1cm4gcGFja19pdGVtcyhpdGVtcywgaW5kZW50KQorICAgIGl0ZW1zID0gZGljdC5pdGVtcygpCisgICAgcmV0dXJuIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCkKIAogZGVmIHVucGFja19pbnN0YW5jZShpbnN0LCBpbmRlbnQgPSAwKToKLQlpZiBoYXNhdHRyKGluc3QsICdfX3B5YnJvd3NlX3VucGFja19fJyk6Ci0JCXJldHVybiB1bnBhY2tfb2JqZWN0KGluc3QuX19weWJyb3dzZV91bnBhY2tfXygpLCBpbmRlbnQpCi0JZWxzZToKLQkJaXRlbXMgPSBbKCdfX2NsYXNzX18nLCBpbnN0Ll9fY2xhc3NfXyldICsgaW5zdC5fX2RpY3RfXy5pdGVtcygpCi0JCXJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCisgICAgaWYgaGFzYXR0cihpbnN0LCAnX19weWJyb3dzZV91bnBhY2tfXycpOgorICAgICAgICByZXR1cm4gdW5wYWNrX29iamVjdChpbnN0Ll9fcHlicm93c2VfdW5wYWNrX18oKSwgaW5kZW50KQorICAgIGVsc2U6CisgICAgICAgIGl0ZW1zID0gWygnX19jbGFzc19fJywgaW5zdC5fX2NsYXNzX18pXSArIGluc3QuX19kaWN0X18uaXRlbXMoKQorICAgICAgICByZXR1cm4gcGFja19pdGVtcyhpdGVtcywgaW5kZW50KQogCiBkZWYgdW5wYWNrX2NsYXNzKGNsc3MsIGluZGVudCA9IDApOgotCWl0ZW1zID0gWygnX19iYXNlc19fJywgY2xzcy5fX2Jhc2VzX18pLCAoJ19fbmFtZV9fJywgY2xzcy5fX25hbWVfXyldICsgY2xzcy5fX2RpY3RfXy5pdGVtcygpCi0JcmV0dXJuIHBhY2tfaXRlbXMoaXRlbXMsIGluZGVudCkKKyAgICBpdGVtcyA9IFsoJ19fYmFzZXNfXycsIGNsc3MuX19iYXNlc19fKSwgKCdfX25hbWVfXycsIGNsc3MuX19uYW1lX18pXSArIGNsc3MuX19kaWN0X18uaXRlbXMoKQorICAgIHJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCiAKIGRlZiB1bnBhY2tfb3RoZXIob2JqZWN0LCBpbmRlbnQgPSAwKToKLQlhdHRycyA9IGdldF9pdmFycyhvYmplY3QpCi0JaXRlbXMgPSBbXQotCWZvciBhdHRyIGluIGF0dHJzOgotCQl0cnk6Ci0JCQl2YWx1ZSA9IGdldGF0dHIob2JqZWN0LCBhdHRyKQotCQlleGNlcHQ6Ci0JCQlwYXNzCi0JCWVsc2U6Ci0JCQlpdGVtcy5hcHBlbmQoKGF0dHIsIHZhbHVlKSkKLQlyZXR1cm4gcGFja19pdGVtcyhpdGVtcywgaW5kZW50KQorICAgIGF0dHJzID0gZ2V0X2l2YXJzKG9iamVjdCkKKyAgICBpdGVtcyA9IFtdCisgICAgZm9yIGF0dHIgaW4gYXR0cnM6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlID0gZ2V0YXR0cihvYmplY3QsIGF0dHIpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZCgoYXR0ciwgdmFsdWUpKQorICAgIHJldHVybiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQpCiAKIGRlZiBwYWNrX2l0ZW1zKGl0ZW1zLCBpbmRlbnQgPSAwKToKLQlpdGVtcyA9IFsoaywgdiwgbm90IGlzaW5zdGFuY2UodiwgU0lNUExFX1RZUEVTKSwgaW5kZW50KQotCSAgICAgICAgIGZvciBrLCB2IGluIGl0ZW1zXQotCXJldHVybiB0dXBsZV9jYXNlbGVzc3NvcnQoaXRlbXMpCisgICAgaXRlbXMgPSBbKGssIHYsIG5vdCBpc2luc3RhbmNlKHYsIFNJTVBMRV9UWVBFUyksIGluZGVudCkKKyAgICAgICAgICAgICBmb3IgaywgdiBpbiBpdGVtc10KKyAgICByZXR1cm4gdHVwbGVfY2FzZWxlc3Nzb3J0KGl0ZW1zKQogCiBkZWYgY2FzZWxlc3Nzb3J0KGFsaXN0KToKLQkiIiJSZXR1cm4gYSBzb3J0ZWQgY29weSBvZiBhIGxpc3QuIElmIHRoZXJlIGFyZSBvbmx5IHN0cmluZ3MgaW4gdGhlIGxpc3QsIAotCWl0IHdpbGwgbm90IGNvbnNpZGVyIGNhc2UiIiIKLQkKLQl0cnk6Ci0JCSMgdHVybiBbJ0ZPTycsICAnYWFCYycsICdBQmNEJ10gaW50byBbKCdmb28nLCAnRk9PJyksICgnYWFiYycsICdhYUJjJyksICgnYWJjZCcsICdBQmNEJyldLCBpZiBwb3NzaWJsZQotCQl0dXBsZWRsaXN0ID0gbWFwKGxhbWJkYSBpdGVtLCBsb3dlciA9IHN0cmluZy5sb3dlcjogKGxvd2VyKGl0ZW0pLCBpdGVtKSwgYWxpc3QpCi0JZXhjZXB0IFR5cGVFcnJvcjoKLQkJIyBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBhbGlzdCBpcyBub3QgYSBzdHJpbmcsIHByb2NlZWQgdGhlIG5vcm1hbCB3YXkuLi4KLQkJYWxpc3QgPSBhbGlzdFs6XQotCQlhbGlzdC5zb3J0KCkKLQkJcmV0dXJuIGFsaXN0Ci0JZWxzZToKLQkJdHVwbGVkbGlzdC5zb3J0KCkKLQkJIyB0dXJuIFsoJ2FhYmMnLCAnYWFCYycpLCAoJ2FiY2QnLCAnQUJjRCcpLCAoJ2ZvbycsICdGT08nKV0gaW50byBbJ2FhQmMnLCAnQUJjRCcsICdGT08nXQotCQlyZXR1cm4gbWFwKGxhbWJkYSB4OiB4WzFdLCB0dXBsZWRsaXN0KQorICAgICIiIlJldHVybiBhIHNvcnRlZCBjb3B5IG9mIGEgbGlzdC4gSWYgdGhlcmUgYXJlIG9ubHkgc3RyaW5ncyBpbiB0aGUgbGlzdCwKKyAgICBpdCB3aWxsIG5vdCBjb25zaWRlciBjYXNlIiIiCisKKyAgICB0cnk6CisgICAgICAgICMgdHVybiBbJ0ZPTycsICAnYWFCYycsICdBQmNEJ10gaW50byBbKCdmb28nLCAnRk9PJyksICgnYWFiYycsICdhYUJjJyksICgnYWJjZCcsICdBQmNEJyldLCBpZiBwb3NzaWJsZQorICAgICAgICB0dXBsZWRsaXN0ID0gbWFwKGxhbWJkYSBpdGVtLCBsb3dlciA9IHN0cmluZy5sb3dlcjogKGxvd2VyKGl0ZW0pLCBpdGVtKSwgYWxpc3QpCisgICAgZXhjZXB0IFR5cGVFcnJvcjoKKyAgICAgICAgIyBhdCBsZWFzdCBvbmUgZWxlbWVudCBpbiBhbGlzdCBpcyBub3QgYSBzdHJpbmcsIHByb2NlZWQgdGhlIG5vcm1hbCB3YXkuLi4KKyAgICAgICAgYWxpc3QgPSBhbGlzdFs6XQorICAgICAgICBhbGlzdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIGFsaXN0CisgICAgZWxzZToKKyAgICAgICAgdHVwbGVkbGlzdC5zb3J0KCkKKyAgICAgICAgIyB0dXJuIFsoJ2FhYmMnLCAnYWFCYycpLCAoJ2FiY2QnLCAnQUJjRCcpLCAoJ2ZvbycsICdGT08nKV0gaW50byBbJ2FhQmMnLCAnQUJjRCcsICdGT08nXQorICAgICAgICByZXR1cm4gbWFwKGxhbWJkYSB4OiB4WzFdLCB0dXBsZWRsaXN0KQogCiBkZWYgdHVwbGVfY2FzZWxlc3Nzb3J0KGl0ZW1zKToKLQl0cnk6Ci0JCXR1cGxlZGxpc3QgPSBtYXAobGFtYmRhIHR1cGxlLCBsb3dlciA9IHN0cmluZy5sb3dlcjogKGxvd2VyKHR1cGxlWzBdKSwgdHVwbGUpLCBpdGVtcykKLQlleGNlcHQgKEF0dHJpYnV0ZUVycm9yLCBUeXBlRXJyb3IpOgotCQlpdGVtcyA9IGl0ZW1zWzpdCi0JCWl0ZW1zLnNvcnQoKQotCQlyZXR1cm4gaXRlbXMKLQllbHNlOgotCQl0dXBsZWRsaXN0LnNvcnQoKQotCQlyZXR1cm4gbWFwKGxhbWJkYSAobG93LCB0dXBsZSk6IHR1cGxlLCB0dXBsZWRsaXN0KQotCisgICAgdHJ5OgorICAgICAgICB0dXBsZWRsaXN0ID0gbWFwKGxhbWJkYSB0dXBsZSwgbG93ZXIgPSBzdHJpbmcubG93ZXI6IChsb3dlcih0dXBsZVswXSksIHR1cGxlKSwgaXRlbXMpCisgICAgZXhjZXB0IChBdHRyaWJ1dGVFcnJvciwgVHlwZUVycm9yKToKKyAgICAgICAgaXRlbXMgPSBpdGVtc1s6XQorICAgICAgICBpdGVtcy5zb3J0KCkKKyAgICAgICAgcmV0dXJuIGl0ZW1zCisgICAgZWxzZToKKyAgICAgICAgdHVwbGVkbGlzdC5zb3J0KCkKKyAgICAgICAgcmV0dXJuIG1hcChsYW1iZGEgKGxvdywgdHVwbGUpOiB0dXBsZSwgdHVwbGVkbGlzdCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlDb25zb2xlLnB5IGIvTWFjL1Rvb2xzL0lERS9QeUNvbnNvbGUucHkKaW5kZXggNmYzOThkMS4uYjhkNjQ4OSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeUNvbnNvbGUucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeUNvbnNvbGUucHkKQEAgLTE0LDQyNCArMTQsNDI0IEBACiBpbXBvcnQgUHlJbnRlcmFjdGl2ZQogCiBpZiBub3QgaGFzYXR0cihzeXMsICdwczEnKToKLQlzeXMucHMxID0gJz4+PiAnCisgICAgc3lzLnBzMSA9ICc+Pj4gJwogaWYgbm90IGhhc2F0dHIoc3lzLCAncHMyJyk6Ci0Jc3lzLnBzMiA9ICcuLi4gJworICAgIHN5cy5wczIgPSAnLi4uICcKIAotZGVmIGluc3BlY3QoZm9vKToJCQkjIEpKUyAxLzI1Lzk5Ci0JIkxhdW5jaCB0aGUgYnJvd3NlciBvbiB0aGUgZ2l2ZW4gb2JqZWN0LiAgVGhpcyBpcyBhIGdlbmVyYWwgYnVpbHQtaW4gZnVuY3Rpb24uIgotCWltcG9ydCBQeUJyb3dzZXIKLQlQeUJyb3dzZXIuQnJvd3Nlcihmb28pCitkZWYgaW5zcGVjdChmb28pOiAgICAgICAgICAgICAgICAgICAgICAgIyBKSlMgMS8yNS85OQorICAgICJMYXVuY2ggdGhlIGJyb3dzZXIgb24gdGhlIGdpdmVuIG9iamVjdC4gIFRoaXMgaXMgYSBnZW5lcmFsIGJ1aWx0LWluIGZ1bmN0aW9uLiIKKyAgICBpbXBvcnQgUHlCcm93c2VyCisgICAgUHlCcm93c2VyLkJyb3dzZXIoZm9vKQogCiBjbGFzcyBDb25zb2xlVGV4dFdpZGdldChXLkVkaXRUZXh0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLQkJYXBwbHkoVy5FZGl0VGV4dC5fX2luaXRfXywgKHNlbGYsKSArIGFyZ3MsIGt3YXJncykKLQkJc2VsZi5faW5wdXRzdGFydCA9IDAKLQkJc2VsZi5fYnVmID0gJycKLQkJc2VsZi5weWludGVyYWN0aXZlID0gUHlJbnRlcmFjdGl2ZS5QeUludGVyYWN0aXZlKCkKLQkKLQkJaW1wb3J0IF9fbWFpbl9fCi0JCXNlbGYuX25hbWVzcGFjZSA9IF9fbWFpbl9fLl9fZGljdF9fCi0JCXNlbGYuX25hbWVzcGFjZVsnaW5zcGVjdCddID0gaW5zcGVjdAkJCSMgSkpTIDEvMjUvOTkKLQkKLQlkZWYgaW5zZXJ0KHNlbGYsIHRleHQpOgotCQlzZWxmLmNoZWNrc2VsZWN0aW9uKCkKLQkJc2VsZi50ZWQuV0VJbnNlcnQodGV4dCwgTm9uZSwgTm9uZSkKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQlzZWxmLnNlbGNoYW5nZWQgPSAxCi0JCi0JZGVmIHNldF9uYW1lc3BhY2Uoc2VsZiwgZGljdCk6Ci0JCWlmIHR5cGUoZGljdCkgPD4gRGljdGlvbmFyeVR5cGU6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJUaGUgbmFtZXNwYWNlIG5lZWRzIHRvIGJlIGEgZGljdGlvbmFyeSIKLQkJaWYgJ2luc3BlY3QnIG5vdCBpbiBkaWN0LmtleXMoKTogZGljdFsnaW5zcGVjdCddID0gaW5zcGVjdAkJCSMgSkpTIDEvMjUvOTkKLQkJc2VsZi5fbmFtZXNwYWNlID0gZGljdAotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlpbXBvcnQgX19tYWluX18KLQkJVy5FZGl0VGV4dC5vcGVuKHNlbGYpCi0JCXNlbGYud3JpdGUoJ1B5dGhvbiAlc1xuJyAlIHN5cy52ZXJzaW9uKQotCQlzZWxmLndyaXRlKCdUeXBlICJjb3B5cmlnaHQiLCAiY3JlZGl0cyIgb3IgImxpY2Vuc2UiIGZvciBtb3JlIGluZm9ybWF0aW9uLlxuJykKLQkJc2VsZi53cml0ZSgnTWFjUHl0aG9uIElERSAlc1xuJyAlIF9fbWFpbl9fLl9fdmVyc2lvbl9fKQotCQlzZWxmLndyaXRlKHN5cy5wczEpCi0JCXNlbGYuZmx1c2goKQotCQotCWRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlpZiBzZWxmLl9lbmFibGVkIGFuZCBub3QgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleSBvciBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKLQkJCWlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgotCQkJCXNlbGYuY2hlY2tzZWxlY3Rpb24oKQotCQkJaWYgY2hhciA9PSBXa2V5cy5lbnRlcmtleToKLQkJCQljaGFyID0gV2tleXMucmV0dXJua2V5Ci0JCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQkJaWYgY2hhciA9PSBXa2V5cy5iYWNrc3BhY2VrZXk6Ci0JCQkJaWYgc2Vsc3RhcnQgPD0gKHNlbGYuX2lucHV0c3RhcnQgLSAoc2Vsc3RhcnQgPD4gc2VsZW5kKSk6Ci0JCQkJCXJldHVybgotCQkJc2VsZi50ZWQuV0VLZXkob3JkKGNoYXIpLCBtb2RpZmllcnMpCi0JCQlpZiBjaGFyIG5vdCBpbiBXa2V5cy5uYXZpZ2F0aW9ua2V5czoKLQkJCQlzZWxmLmNoYW5nZWQgPSAxCi0JCQlpZiBjaGFyIG5vdCBpbiBXa2V5cy5zY3JvbGxrZXlzOgotCQkJCXNlbGYuc2VsY2hhbmdlZCA9IDEKLQkJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCQlpZiBjaGFyID09IFdrZXlzLnJldHVybmtleToKLQkJCQl0ZXh0ID0gc2VsZi5nZXQoKVtzZWxmLl9pbnB1dHN0YXJ0OnNlbHN0YXJ0XQotCQkJCXRleHQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQodGV4dCwgIlxyIiksICJcbiIpCi0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCQlzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKLQkJCQlzZWxmLl9zY3JpcHREb25lID0gRmFsc2UKLQkJCQlpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0JCQkJCSMgc2VlIGlkZW50aWNhbCBjb25zdHJ1Y3QgaW4gUHlFZGl0LnB5Ci0JCQkJCWZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKLQkJCQkJdCA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fdXNlckNhbmNlbGxlZE1vbml0b3IsCi0JCQkJCQkJbmFtZT0iVXNlckNhbmNlbGxlZE1vbml0b3IiKQotCQkJCQl0LnN0YXJ0KCkKLQkJCQl0cnk6Ci0JCQkJCXNlbGYucHlpbnRlcmFjdGl2ZS5leGVjdXRlbGluZSh0ZXh0LCBzZWxmLCBzZWxmLl9uYW1lc3BhY2UpCi0JCQkJZmluYWxseToKLQkJCQkJc2VsZi5fc2NyaXB0RG9uZSA9IFRydWUKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaChzYXZleWllbGQpCi0JCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJCQlzZWxmLl9pbnB1dHN0YXJ0ID0gc2Vsc3RhcnQKLQkKLQlkZWYgX3VzZXJDYW5jZWxsZWRNb25pdG9yKHNlbGYpOgotCQkjIFhYWCBkdXBsaWNhdGUgY29kZSBmcm9tIFB5RWRpdC5weQotCQlpbXBvcnQgdGltZSwgb3MKLQkJZnJvbSBzaWduYWwgaW1wb3J0IFNJR0lOVAotCQlmcm9tIENhcmJvbiBpbXBvcnQgRXZ0Ci0JCXdoaWxlIG5vdCBzZWxmLl9zY3JpcHREb25lOgotCQkJaWYgRXZ0LkNoZWNrRXZlbnRRdWV1ZUZvclVzZXJDYW5jZWwoKToKLQkJCQkjIFNlbmQgYSBTSUdJTlQgc2lnbmFsIHRvIG91cnNlbHZlcy4KLQkJCQkjIFRoaXMgZ2V0cyBkZWxpdmVyZWQgdG8gdGhlIG1haW4gdGhyZWFkLAotCQkJCSMgY2FuY2VsbGluZyB0aGUgcnVubmluZyBzY3JpcHQuCi0JCQkJb3Mua2lsbChvcy5nZXRwaWQoKSwgU0lHSU5UKQotCQkJCWJyZWFrCi0JCQl0aW1lLnNsZWVwKDAuMjUpCi0JCi0JZGVmIGRvbWVudV9zYXZlX2FzKHNlbGYsICphcmdzKToKLQkJZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGNvbnNvbGUgdGV4dCBhczonLCAKLQkJCXNhdmVkRmlsZU5hbWU9J2NvbnNvbGUudHh0JykKLQkJaWYgbm90IGZpbGVuYW1lOgotCQkJcmV0dXJuCi0JCWYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQotCQlmLndyaXRlKHNlbGYuZ2V0KCkpCi0JCWYuY2xvc2UoKQotCQlNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSwgVy5fc2lnbmF0dXJlLCAnVEVYVCcpCi0JCi0JZGVmIHdyaXRlKHNlbGYsIHRleHQpOgotCQlzZWxmLl9idWYgPSBzZWxmLl9idWYgKyB0ZXh0Ci0JCWlmICdcbicgaW4gc2VsZi5fYnVmOgotCQkJc2VsZi5mbHVzaCgpCi0JCi0JZGVmIGZsdXNoKHNlbGYpOgotCQlzdHVmZiA9IHN0cmluZy5zcGxpdChzZWxmLl9idWYsICdcbicpCi0JCXN0dWZmID0gc3RyaW5nLmpvaW4oc3R1ZmYsICdccicpCi0JCXNlbGYuc2V0c2VsZWN0aW9uX2F0X2VuZCgpCi0JCXRyeToKLQkJCXNlbGYudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQotCQlmaW5hbGx5OgotCQkJc2VsZi5fYnVmID0gIiIKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJc2VsZi5faW5wdXRzdGFydCA9IHNlbHN0YXJ0Ci0JCXNlbGYudGVkLldFQ2xlYXJVbmRvKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURJc1BvcnRCdWZmZXJlZCgpOgotCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKLQkKLQlkZWYgc2VsZWN0aW9uX29rKHNlbGYpOgotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlyZXR1cm4gbm90IChzZWxzdGFydCA8IHNlbGYuX2lucHV0c3RhcnQgb3Igc2VsZW5kIDwgc2VsZi5faW5wdXRzdGFydCkKLQkKLQlkZWYgY2hlY2tzZWxlY3Rpb24oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLnNlbGVjdGlvbl9vaygpOgotCQkJc2VsZi5zZXRzZWxlY3Rpb25fYXRfZW5kKCkKLQkKLQlkZWYgc2V0c2VsZWN0aW9uX2F0X2VuZChzZWxmKToKLQkJZW5kID0gc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkKLQkJc2VsZi5zZXRzZWxlY3Rpb24oZW5kLCBlbmQpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCQotCWRlZiBkb21lbnVfY3V0KHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6Ci0JCQlyZXR1cm4KLQkJVy5FZGl0VGV4dC5kb21lbnVfY3V0KHNlbGYpCi0JCi0JZGVmIGRvbWVudV9wYXN0ZShzZWxmLCAqYXJncyk6Ci0JCWlmIG5vdCBzZWxmLnNlbGVjdGlvbl9vaygpOgotCQkJc2VsZi5zZXRzZWxlY3Rpb25fYXRfZW5kKCkKLQkJVy5FZGl0VGV4dC5kb21lbnVfcGFzdGUoc2VsZikKLQkKLQlkZWYgZG9tZW51X2NsZWFyKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6Ci0JCQlyZXR1cm4KLQkJVy5FZGl0VGV4dC5kb21lbnVfY2xlYXIoc2VsZikKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgorICAgICAgICBhcHBseShXLkVkaXRUZXh0Ll9faW5pdF9fLCAoc2VsZiwpICsgYXJncywga3dhcmdzKQorICAgICAgICBzZWxmLl9pbnB1dHN0YXJ0ID0gMAorICAgICAgICBzZWxmLl9idWYgPSAnJworICAgICAgICBzZWxmLnB5aW50ZXJhY3RpdmUgPSBQeUludGVyYWN0aXZlLlB5SW50ZXJhY3RpdmUoKQorCisgICAgICAgIGltcG9ydCBfX21haW5fXworICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICBzZWxmLl9uYW1lc3BhY2VbJ2luc3BlY3QnXSA9IGluc3BlY3QgICAgICAgICAgICAgICAgICAgICMgSkpTIDEvMjUvOTkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYuY2hlY2tzZWxlY3Rpb24oKQorICAgICAgICBzZWxmLnRlZC5XRUluc2VydCh0ZXh0LCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDEKKworICAgIGRlZiBzZXRfbmFtZXNwYWNlKHNlbGYsIGRpY3QpOgorICAgICAgICBpZiB0eXBlKGRpY3QpIDw+IERpY3Rpb25hcnlUeXBlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiVGhlIG5hbWVzcGFjZSBuZWVkcyB0byBiZSBhIGRpY3Rpb25hcnkiCisgICAgICAgIGlmICdpbnNwZWN0JyBub3QgaW4gZGljdC5rZXlzKCk6IGRpY3RbJ2luc3BlY3QnXSA9IGluc3BlY3QgICAgICAgICAgICAgICAgICAgICAgIyBKSlMgMS8yNS85OQorICAgICAgICBzZWxmLl9uYW1lc3BhY2UgPSBkaWN0CisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIFcuRWRpdFRleHQub3BlbihzZWxmKQorICAgICAgICBzZWxmLndyaXRlKCdQeXRob24gJXNcbicgJSBzeXMudmVyc2lvbikKKyAgICAgICAgc2VsZi53cml0ZSgnVHlwZSAiY29weXJpZ2h0IiwgImNyZWRpdHMiIG9yICJsaWNlbnNlIiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbicpCisgICAgICAgIHNlbGYud3JpdGUoJ01hY1B5dGhvbiBJREUgJXNcbicgJSBfX21haW5fXy5fX3ZlcnNpb25fXykKKyAgICAgICAgc2VsZi53cml0ZShzeXMucHMxKQorICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBpZiBzZWxmLl9lbmFibGVkIGFuZCBub3QgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleSBvciBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKKyAgICAgICAgICAgIGlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgorICAgICAgICAgICAgICAgIHNlbGYuY2hlY2tzZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgY2hhciA9PSBXa2V5cy5lbnRlcmtleToKKyAgICAgICAgICAgICAgICBjaGFyID0gV2tleXMucmV0dXJua2V5CisgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICAgICAgaWYgY2hhciA9PSBXa2V5cy5iYWNrc3BhY2VrZXk6CisgICAgICAgICAgICAgICAgaWYgc2Vsc3RhcnQgPD0gKHNlbGYuX2lucHV0c3RhcnQgLSAoc2Vsc3RhcnQgPD4gc2VsZW5kKSk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKGNoYXIpLCBtb2RpZmllcnMpCisgICAgICAgICAgICBpZiBjaGFyIG5vdCBpbiBXa2V5cy5uYXZpZ2F0aW9ua2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLmNoYW5nZWQgPSAxCisgICAgICAgICAgICBpZiBjaGFyIG5vdCBpbiBXa2V5cy5zY3JvbGxrZXlzOgorICAgICAgICAgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDEKKyAgICAgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgICAgICBpZiBjaGFyID09IFdrZXlzLnJldHVybmtleToKKyAgICAgICAgICAgICAgICB0ZXh0ID0gc2VsZi5nZXQoKVtzZWxmLl9pbnB1dHN0YXJ0OnNlbHN0YXJ0XQorICAgICAgICAgICAgICAgIHRleHQgPSBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQodGV4dCwgIlxyIiksICJcbiIpCisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKKyAgICAgICAgICAgICAgICBzZWxmLl9zY3JpcHREb25lID0gRmFsc2UKKyAgICAgICAgICAgICAgICBpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6CisgICAgICAgICAgICAgICAgICAgICMgc2VlIGlkZW50aWNhbCBjb25zdHJ1Y3QgaW4gUHlFZGl0LnB5CisgICAgICAgICAgICAgICAgICAgIGZyb20gdGhyZWFkaW5nIGltcG9ydCBUaHJlYWQKKyAgICAgICAgICAgICAgICAgICAgdCA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fdXNlckNhbmNlbGxlZE1vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lPSJVc2VyQ2FuY2VsbGVkTW9uaXRvciIpCisgICAgICAgICAgICAgICAgICAgIHQuc3RhcnQoKQorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5weWludGVyYWN0aXZlLmV4ZWN1dGVsaW5lKHRleHQsIHNlbGYsIHNlbGYuX25hbWVzcGFjZSkKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zY3JpcHREb25lID0gVHJ1ZQorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKHNhdmV5aWVsZCkKKyAgICAgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICAgICAgICAgIHNlbGYuX2lucHV0c3RhcnQgPSBzZWxzdGFydAorCisgICAgZGVmIF91c2VyQ2FuY2VsbGVkTW9uaXRvcihzZWxmKToKKyAgICAgICAgIyBYWFggZHVwbGljYXRlIGNvZGUgZnJvbSBQeUVkaXQucHkKKyAgICAgICAgaW1wb3J0IHRpbWUsIG9zCisgICAgICAgIGZyb20gc2lnbmFsIGltcG9ydCBTSUdJTlQKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEV2dAorICAgICAgICB3aGlsZSBub3Qgc2VsZi5fc2NyaXB0RG9uZToKKyAgICAgICAgICAgIGlmIEV2dC5DaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsKCk6CisgICAgICAgICAgICAgICAgIyBTZW5kIGEgU0lHSU5UIHNpZ25hbCB0byBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgIyBUaGlzIGdldHMgZGVsaXZlcmVkIHRvIHRoZSBtYWluIHRocmVhZCwKKyAgICAgICAgICAgICAgICAjIGNhbmNlbGxpbmcgdGhlIHJ1bm5pbmcgc2NyaXB0LgorICAgICAgICAgICAgICAgIG9zLmtpbGwob3MuZ2V0cGlkKCksIFNJR0lOVCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgwLjI1KQorCisgICAgZGVmIGRvbWVudV9zYXZlX2FzKHNlbGYsICphcmdzKToKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGNvbnNvbGUgdGV4dCBhczonLAorICAgICAgICAgICAgICAgIHNhdmVkRmlsZU5hbWU9J2NvbnNvbGUudHh0JykKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQorICAgICAgICBmLndyaXRlKHNlbGYuZ2V0KCkpCisgICAgICAgIGYuY2xvc2UoKQorICAgICAgICBNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSwgVy5fc2lnbmF0dXJlLCAnVEVYVCcpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIHRleHQKKyAgICAgICAgaWYgJ1xuJyBpbiBzZWxmLl9idWY6CisgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKworICAgIGRlZiBmbHVzaChzZWxmKToKKyAgICAgICAgc3R1ZmYgPSBzdHJpbmcuc3BsaXQoc2VsZi5fYnVmLCAnXG4nKQorICAgICAgICBzdHVmZiA9IHN0cmluZy5qb2luKHN0dWZmLCAnXHInKQorICAgICAgICBzZWxmLnNldHNlbGVjdGlvbl9hdF9lbmQoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUluc2VydChzdHVmZiwgTm9uZSwgTm9uZSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX2J1ZiA9ICIiCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbGYuX2lucHV0c3RhcnQgPSBzZWxzdGFydAorICAgICAgICBzZWxmLnRlZC5XRUNsZWFyVW5kbygpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIGlmIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFESXNQb3J0QnVmZmVyZWQoKToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpCisKKyAgICBkZWYgc2VsZWN0aW9uX29rKHNlbGYpOgorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICByZXR1cm4gbm90IChzZWxzdGFydCA8IHNlbGYuX2lucHV0c3RhcnQgb3Igc2VsZW5kIDwgc2VsZi5faW5wdXRzdGFydCkKKworICAgIGRlZiBjaGVja3NlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbl9hdF9lbmQoKQorCisgICAgZGVmIHNldHNlbGVjdGlvbl9hdF9lbmQoc2VsZik6CisgICAgICAgIGVuZCA9IHNlbGYudGVkLldFR2V0VGV4dExlbmd0aCgpCisgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKGVuZCwgZW5kKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorCisgICAgZGVmIGRvbWVudV9jdXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBXLkVkaXRUZXh0LmRvbWVudV9jdXQoc2VsZikKKworICAgIGRlZiBkb21lbnVfcGFzdGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBub3Qgc2VsZi5zZWxlY3Rpb25fb2soKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uX2F0X2VuZCgpCisgICAgICAgIFcuRWRpdFRleHQuZG9tZW51X3Bhc3RlKHNlbGYpCisKKyAgICBkZWYgZG9tZW51X2NsZWFyKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbm90IHNlbGYuc2VsZWN0aW9uX29rKCk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgVy5FZGl0VGV4dC5kb21lbnVfY2xlYXIoc2VsZikKIAogCiBjbGFzcyBQeUNvbnNvbGUoVy5XaW5kb3cpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBib3VuZHMsIHNob3cgPSAxLCBmb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSksIAotCQkJdGFic2V0dGluZ3MgPSAoMzIsIDApLCB1bmNsb3NhYmxlID0gMCk6Ci0JCVcuV2luZG93Ll9faW5pdF9fKHNlbGYsCi0JCQkJCWJvdW5kcywgCi0JCQkJCSJQeXRob24gSW50ZXJhY3RpdmUiLCAKLQkJCQkJbWluc2l6ZSA9ICgyMDAsIDEwMCksIAotCQkJCQl0YWJiYWJsZSA9IDAsIAotCQkJCQlzaG93ID0gc2hvdykKLQkJCi0JCXNlbGYuX3VuY2xvc2FibGUgPSB1bmNsb3NhYmxlCi0JCWNvbnNvbGV0ZXh0ID0gQ29uc29sZVRleHRXaWRnZXQoKC0xLCAtMSwgLTE0LCAxKSwgaW5zZXQgPSAoNiwgNSksIAotCQkJCWZvbnRzZXR0aW5ncyA9IGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncykKLQkJc2VsZi5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDE0LCAxNiwgLTE0KSwgY29uc29sZXRleHQudnNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNlbGYuY29uc29sZXRleHQgPSBjb25zb2xldGV4dAotCQlzZWxmLm5hbWVzcGFjZW1lbnUgPSBXLlBvcHVwTWVudSgoLTE1LCAtMSwgMTYsIDE2KSwgW10sIHNlbGYuY29uc29sZXRleHQuc2V0X25hbWVzcGFjZSkKLQkJc2VsZi5uYW1lc3BhY2VtZW51LmJpbmQoJzxjbGljaz4nLCBzZWxmLm1ha2VuYW1lc3BhY2VtZW51KQotCQlzZWxmLm9wZW4oKQotCQotCWRlZiBtYWtlbmFtZXNwYWNlbWVudShzZWxmLCAqYXJncyk6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCW5hbWVzcGFjZWxpc3QgPSBzZWxmLmdldG5hbWVzcGFjZWxpc3QoKQotCQlzZWxmLm5hbWVzcGFjZW1lbnUuc2V0KFsoIkNsZWFyIHdpbmRvdyIsIHNlbGYuY2xlYXJidWZmZXIpLCAoIkZvbnQgc2V0dGluZ3NceGM5Iiwgc2VsZi5kb2ZvbnRzZXR0aW5ncyksIAotCQkJCVsiTmFtZXNwYWNlIl0gKyBuYW1lc3BhY2VsaXN0LCAoIkJyb3dzZSBuYW1lc3BhY2VceGM5Iiwgc2VsZi5icm93c2VuYW1lc3BhY2UpXSkKLQkJY3VycmVudG5hbWUgPSBzZWxmLmNvbnNvbGV0ZXh0Ll9uYW1lc3BhY2VbIl9fbmFtZV9fIl0KLQkJZm9yIGkgaW4gcmFuZ2UobGVuKG5hbWVzcGFjZWxpc3QpKToKLQkJCWlmIG5hbWVzcGFjZWxpc3RbaV1bMF0gPT0gY3VycmVudG5hbWU6Ci0JCQkJYnJlYWsKLQkJZWxzZToKLQkJCXJldHVybgotCQkjIFhYWCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIGdlbmVyYWxseSBhdmFpbGFibGUgaW4gV21lbnVzCi0JCXN1Ym1lbnVpZCA9IHNlbGYubmFtZXNwYWNlbWVudS5tZW51Lm1lbnUuR2V0SXRlbU1hcmsoMykKLQkJbWVudSA9IHNlbGYubmFtZXNwYWNlbWVudS5tZW51LmJhci5tZW51c1tzdWJtZW51aWRdCi0JCW1lbnUubWVudS5DaGVja01lbnVJdGVtKGkgKyAxLCAxKQotCQotCWRlZiBicm93c2VuYW1lc3BhY2Uoc2VsZik6Ci0JCWltcG9ydCBQeUJyb3dzZXIsIFcKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJUHlCcm93c2VyLkJyb3dzZXIoc2VsZi5jb25zb2xldGV4dC5fbmFtZXNwYWNlLCBzZWxmLmNvbnNvbGV0ZXh0Ll9uYW1lc3BhY2VbIl9fbmFtZV9fIl0pCi0JCi0JZGVmIGNsZWFyYnVmZmVyKHNlbGYpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0JCXNlbGYuY29uc29sZXRleHQudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UoJycpKQotCQlzZWxmLmNvbnNvbGV0ZXh0LndyaXRlKHN5cy5wczEpCi0JCXNlbGYuY29uc29sZXRleHQuZmx1c2goKQotCQotCWRlZiBnZXRuYW1lc3BhY2VsaXN0KHNlbGYpOgotCQlpbXBvcnQgb3MKLQkJaW1wb3J0IF9fbWFpbl9fCi0JCWVkaXRvcnMgPSBmaWx0ZXIobGFtYmRhIHg6IHguX19jbGFzc19fLl9fbmFtZV9fID09ICJFZGl0b3IiLCBzZWxmLnBhcmVudC5fd2luZG93cy52YWx1ZXMoKSkKLQkJCi0JCW5hbWVzcGFjZXMgPSBbICgiX19tYWluX18iLF9fbWFpbl9fLl9fZGljdF9fKSBdCi0JCWZvciBlZCBpbiBlZGl0b3JzOgotCQkJbW9kbmFtZSA9IG9zLnBhdGguc3BsaXRleHQoZWQudGl0bGUpWzBdCi0JCQlpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG1vZG5hbWUpOgotCQkJCW1vZHVsZSA9IHN5cy5tb2R1bGVzW21vZG5hbWVdIAotCQkJCW5hbWVzcGFjZXMuYXBwZW5kKChtb2RuYW1lLCBtb2R1bGUuX19kaWN0X18pKQotCQkJZWxzZToKLQkJCQlpZiBlZC50aXRsZVstMzpdID09ICcucHknOgotCQkJCQltb2RuYW1lID0gZWQudGl0bGVbOi0zXQotCQkJCWVsc2U6Ci0JCQkJCW1vZG5hbWUgPSBlZC50aXRsZQotCQkJCWVkLmdsb2JhbHNbIl9fbmFtZV9fIl0gPSBtb2RuYW1lCi0JCQkJbmFtZXNwYWNlcy5hcHBlbmQoKG1vZG5hbWUsIGVkLmdsb2JhbHMpKQotCQlyZXR1cm4gbmFtZXNwYWNlcwotCQotCWRlZiBkb2ZvbnRzZXR0aW5ncyhzZWxmKToKLQkJaW1wb3J0IEZvbnRTZXR0aW5ncwotCQlzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKHNlbGYuY29uc29sZXRleHQuZ2V0Zm9udHNldHRpbmdzKCksCi0JCQkJc2VsZi5jb25zb2xldGV4dC5nZXR0YWJzZXR0aW5ncygpKQotCQlpZiBzZXR0aW5nczoKLQkJCWZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBzZXR0aW5ncwotCQkJc2VsZi5jb25zb2xldGV4dC5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQotCQkJc2VsZi5jb25zb2xldGV4dC5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKLQkKLQlkZWYgc2hvdyhzZWxmLCBvbm9mZiA9IDEpOgotCQlXLldpbmRvdy5zaG93KHNlbGYsIG9ub2ZmKQotCQlpZiBvbm9mZjoKLQkJCXNlbGYuc2VsZWN0KCkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYuX3VuY2xvc2FibGU6Ci0JCQlzZWxmLnNob3coMCkKLQkJCXJldHVybiAtMQotCQlXLldpbmRvdy5jbG9zZShzZWxmKQotCQotCWRlZiB3cml0ZXByZWZzKHNlbGYpOgotCQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JCXByZWZzLmNvbnNvbGUuc2hvdyA9IHNlbGYuaXN2aXNpYmxlKCkKLQkJcHJlZnMuY29uc29sZS53aW5kb3dib3VuZHMgPSBzZWxmLmdldGJvdW5kcygpCi0JCXByZWZzLmNvbnNvbGUuZm9udHNldHRpbmdzID0gc2VsZi5jb25zb2xldGV4dC5nZXRmb250c2V0dGluZ3MoKQotCQlwcmVmcy5jb25zb2xlLnRhYnNldHRpbmdzID0gc2VsZi5jb25zb2xldGV4dC5nZXR0YWJzZXR0aW5ncygpCi0JCXByZWZzLnNhdmUoKQogCi0JZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKLQkJcmV0dXJuIHNlbGYuY29uc29sZXRleHQuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYm91bmRzLCBzaG93ID0gMSwgZm9udHNldHRpbmdzID0gKCJNb25hY28iLCAwLCA5LCAoMCwgMCwgMCkpLAorICAgICAgICAgICAgICAgICAgICB0YWJzZXR0aW5ncyA9ICgzMiwgMCksIHVuY2xvc2FibGUgPSAwKToKKyAgICAgICAgVy5XaW5kb3cuX19pbml0X18oc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm91bmRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiUHl0aG9uIEludGVyYWN0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSA9ICgyMDAsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYmJhYmxlID0gMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvdyA9IHNob3cpCisKKyAgICAgICAgc2VsZi5fdW5jbG9zYWJsZSA9IHVuY2xvc2FibGUKKyAgICAgICAgY29uc29sZXRleHQgPSBDb25zb2xlVGV4dFdpZGdldCgoLTEsIC0xLCAtMTQsIDEpLCBpbnNldCA9ICg2LCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzZXR0aW5ncyA9IGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncykKKyAgICAgICAgc2VsZi5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDE0LCAxNiwgLTE0KSwgY29uc29sZXRleHQudnNjcm9sbCwgbWF4ID0gMzI3NjcpCisgICAgICAgIHNlbGYuY29uc29sZXRleHQgPSBjb25zb2xldGV4dAorICAgICAgICBzZWxmLm5hbWVzcGFjZW1lbnUgPSBXLlBvcHVwTWVudSgoLTE1LCAtMSwgMTYsIDE2KSwgW10sIHNlbGYuY29uc29sZXRleHQuc2V0X25hbWVzcGFjZSkKKyAgICAgICAgc2VsZi5uYW1lc3BhY2VtZW51LmJpbmQoJzxjbGljaz4nLCBzZWxmLm1ha2VuYW1lc3BhY2VtZW51KQorICAgICAgICBzZWxmLm9wZW4oKQorCisgICAgZGVmIG1ha2VuYW1lc3BhY2VtZW51KHNlbGYsICphcmdzKToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgbmFtZXNwYWNlbGlzdCA9IHNlbGYuZ2V0bmFtZXNwYWNlbGlzdCgpCisgICAgICAgIHNlbGYubmFtZXNwYWNlbWVudS5zZXQoWygiQ2xlYXIgd2luZG93Iiwgc2VsZi5jbGVhcmJ1ZmZlciksICgiRm9udCBzZXR0aW5nc1x4YzkiLCBzZWxmLmRvZm9udHNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFsiTmFtZXNwYWNlIl0gKyBuYW1lc3BhY2VsaXN0LCAoIkJyb3dzZSBuYW1lc3BhY2VceGM5Iiwgc2VsZi5icm93c2VuYW1lc3BhY2UpXSkKKyAgICAgICAgY3VycmVudG5hbWUgPSBzZWxmLmNvbnNvbGV0ZXh0Ll9uYW1lc3BhY2VbIl9fbmFtZV9fIl0KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKG5hbWVzcGFjZWxpc3QpKToKKyAgICAgICAgICAgIGlmIG5hbWVzcGFjZWxpc3RbaV1bMF0gPT0gY3VycmVudG5hbWU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICAjIFhYWCB0aGlzIGZ1bmN0aW9uYWxpdHkgc2hvdWxkIGJlIGdlbmVyYWxseSBhdmFpbGFibGUgaW4gV21lbnVzCisgICAgICAgIHN1Ym1lbnVpZCA9IHNlbGYubmFtZXNwYWNlbWVudS5tZW51Lm1lbnUuR2V0SXRlbU1hcmsoMykKKyAgICAgICAgbWVudSA9IHNlbGYubmFtZXNwYWNlbWVudS5tZW51LmJhci5tZW51c1tzdWJtZW51aWRdCisgICAgICAgIG1lbnUubWVudS5DaGVja01lbnVJdGVtKGkgKyAxLCAxKQorCisgICAgZGVmIGJyb3dzZW5hbWVzcGFjZShzZWxmKToKKyAgICAgICAgaW1wb3J0IFB5QnJvd3NlciwgVworICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBQeUJyb3dzZXIuQnJvd3NlcihzZWxmLmNvbnNvbGV0ZXh0Ll9uYW1lc3BhY2UsIHNlbGYuY29uc29sZXRleHQuX25hbWVzcGFjZVsiX19uYW1lX18iXSkKKworICAgIGRlZiBjbGVhcmJ1ZmZlcihzZWxmKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IFJlcworICAgICAgICBzZWxmLmNvbnNvbGV0ZXh0LnRlZC5XRVVzZVRleHQoUmVzLlJlc291cmNlKCcnKSkKKyAgICAgICAgc2VsZi5jb25zb2xldGV4dC53cml0ZShzeXMucHMxKQorICAgICAgICBzZWxmLmNvbnNvbGV0ZXh0LmZsdXNoKCkKKworICAgIGRlZiBnZXRuYW1lc3BhY2VsaXN0KHNlbGYpOgorICAgICAgICBpbXBvcnQgb3MKKyAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgIGVkaXRvcnMgPSBmaWx0ZXIobGFtYmRhIHg6IHguX19jbGFzc19fLl9fbmFtZV9fID09ICJFZGl0b3IiLCBzZWxmLnBhcmVudC5fd2luZG93cy52YWx1ZXMoKSkKKworICAgICAgICBuYW1lc3BhY2VzID0gWyAoIl9fbWFpbl9fIixfX21haW5fXy5fX2RpY3RfXykgXQorICAgICAgICBmb3IgZWQgaW4gZWRpdG9yczoKKyAgICAgICAgICAgIG1vZG5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KGVkLnRpdGxlKVswXQorICAgICAgICAgICAgaWYgc3lzLm1vZHVsZXMuaGFzX2tleShtb2RuYW1lKToKKyAgICAgICAgICAgICAgICBtb2R1bGUgPSBzeXMubW9kdWxlc1ttb2RuYW1lXQorICAgICAgICAgICAgICAgIG5hbWVzcGFjZXMuYXBwZW5kKChtb2RuYW1lLCBtb2R1bGUuX19kaWN0X18pKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBlZC50aXRsZVstMzpdID09ICcucHknOgorICAgICAgICAgICAgICAgICAgICBtb2RuYW1lID0gZWQudGl0bGVbOi0zXQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBlZC50aXRsZQorICAgICAgICAgICAgICAgIGVkLmdsb2JhbHNbIl9fbmFtZV9fIl0gPSBtb2RuYW1lCisgICAgICAgICAgICAgICAgbmFtZXNwYWNlcy5hcHBlbmQoKG1vZG5hbWUsIGVkLmdsb2JhbHMpKQorICAgICAgICByZXR1cm4gbmFtZXNwYWNlcworCisgICAgZGVmIGRvZm9udHNldHRpbmdzKHNlbGYpOgorICAgICAgICBpbXBvcnQgRm9udFNldHRpbmdzCisgICAgICAgIHNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coc2VsZi5jb25zb2xldGV4dC5nZXRmb250c2V0dGluZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuY29uc29sZXRleHQuZ2V0dGFic2V0dGluZ3MoKSkKKyAgICAgICAgaWYgc2V0dGluZ3M6CisgICAgICAgICAgICBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2V0dGluZ3MKKyAgICAgICAgICAgIHNlbGYuY29uc29sZXRleHQuc2V0Zm9udHNldHRpbmdzKGZvbnRzZXR0aW5ncykKKyAgICAgICAgICAgIHNlbGYuY29uc29sZXRleHQuc2V0dGFic2V0dGluZ3ModGFic2V0dGluZ3MpCisKKyAgICBkZWYgc2hvdyhzZWxmLCBvbm9mZiA9IDEpOgorICAgICAgICBXLldpbmRvdy5zaG93KHNlbGYsIG9ub2ZmKQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0KCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fdW5jbG9zYWJsZToKKyAgICAgICAgICAgIHNlbGYuc2hvdygwKQorICAgICAgICAgICAgcmV0dXJuIC0xCisgICAgICAgIFcuV2luZG93LmNsb3NlKHNlbGYpCisKKyAgICBkZWYgd3JpdGVwcmVmcyhzZWxmKToKKyAgICAgICAgcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQorICAgICAgICBwcmVmcy5jb25zb2xlLnNob3cgPSBzZWxmLmlzdmlzaWJsZSgpCisgICAgICAgIHByZWZzLmNvbnNvbGUud2luZG93Ym91bmRzID0gc2VsZi5nZXRib3VuZHMoKQorICAgICAgICBwcmVmcy5jb25zb2xlLmZvbnRzZXR0aW5ncyA9IHNlbGYuY29uc29sZXRleHQuZ2V0Zm9udHNldHRpbmdzKCkKKyAgICAgICAgcHJlZnMuY29uc29sZS50YWJzZXR0aW5ncyA9IHNlbGYuY29uc29sZXRleHQuZ2V0dGFic2V0dGluZ3MoKQorICAgICAgICBwcmVmcy5zYXZlKCkKKworICAgIGRlZiBnZXRzZWxlY3RlZHRleHQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLmNvbnNvbGV0ZXh0LmdldHNlbGVjdGVkdGV4dCgpCisKIGNsYXNzIE91dHB1dFRleHRXaWRnZXQoVy5FZGl0VGV4dCk6Ci0JCi0JZGVmIGRvbWVudV9zYXZlX2FzKHNlbGYsICphcmdzKToKLQkJdGl0bGUgPSBzZWxmLl9wYXJlbnR3aW5kb3cuZ2V0dGl0bGUoKQotCQlmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgJXMgdGV4dCBhczonICUgdGl0bGUsIAotCQkJc2F2ZWRGaWxlTmFtZT10aXRsZSArICcudHh0JykKLQkJaWYgbm90IGZpbGVuYW1lOgotCQkJcmV0dXJuCi0JCWYgPSBvcGVuKGZpbGVuYW1lLCAnd2InKQotCQlmLndyaXRlKHNlbGYuZ2V0KCkpCi0JCWYuY2xvc2UoKQotCQlNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSwgVy5fc2lnbmF0dXJlLCAnVEVYVCcpCi0JCi0JZGVmIGRvbWVudV9jdXQoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLmRvbWVudV9jb3B5KCphcmdzKQotCQotCWRlZiBkb21lbnVfY2xlYXIoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLnNldCgnJykKKworICAgIGRlZiBkb21lbnVfc2F2ZV9hcyhzZWxmLCAqYXJncyk6CisgICAgICAgIHRpdGxlID0gc2VsZi5fcGFyZW50d2luZG93LmdldHRpdGxlKCkKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlICVzIHRleHQgYXM6JyAlIHRpdGxlLAorICAgICAgICAgICAgICAgIHNhdmVkRmlsZU5hbWU9dGl0bGUgKyAnLnR4dCcpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3diJykKKyAgICAgICAgZi53cml0ZShzZWxmLmdldCgpKQorICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgTWFjT1MuU2V0Q3JlYXRvckFuZFR5cGUoZmlsZW5hbWUsIFcuX3NpZ25hdHVyZSwgJ1RFWFQnKQorCisgICAgZGVmIGRvbWVudV9jdXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmRvbWVudV9jb3B5KCphcmdzKQorCisgICAgZGVmIGRvbWVudV9jbGVhcihzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuc2V0KCcnKQogCiAKIGNsYXNzIFB5T3V0cHV0OgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBib3VuZHMsIHNob3cgPSAxLCBmb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSksIHRhYnNldHRpbmdzID0gKDMyLCAwKSk6Ci0JCXNlbGYuYm91bmRzID0gYm91bmRzCi0JCXNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCXNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncwotCQlzZWxmLncgPSBOb25lCi0JCXNlbGYuY2xvc2VkID0gMQotCQlzZWxmLl9idWYgPSAnJwotCQkjIHNob3VsZCBiZSBhYmxlIHRvIHNldCB0aGlzCi0JCXNlbGYuc2F2ZXN0ZG91dCwgc2VsZi5zYXZlc3RkZXJyID0gc3lzLnN0ZG91dCwgc3lzLnN0ZGVycgotCQlzeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IHNlbGYKLQkJaWYgc2hvdzoKLQkJCXNlbGYuc2hvdygpCi0JCi0JZGVmIHNldHVwd2lkZ2V0cyhzZWxmKToKLQkJc2VsZi53ID0gVy5XaW5kb3coc2VsZi5ib3VuZHMsICJPdXRwdXQiLCAKLQkJCQltaW5zaXplID0gKDIwMCwgMTAwKSwgCi0JCQkJdGFiYmFibGUgPSAwKQotCQlzZWxmLncub3V0cHV0dGV4dCA9IE91dHB1dFRleHRXaWRnZXQoKC0xLCAtMSwgLTE0LCAxKSwgaW5zZXQgPSAoNiwgNSksIAotCQkJCWZvbnRzZXR0aW5ncyA9IHNlbGYuZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNlbGYudGFic2V0dGluZ3MsIHJlYWRvbmx5ID0gMSkKLQkJbWVudWl0ZW1zID0gWygiQ2xlYXIgd2luZG93Iiwgc2VsZi5jbGVhcmJ1ZmZlciksICgiRm9udCBzZXR0aW5nc1x4YzkiLCBzZWxmLmRvZm9udHNldHRpbmdzKV0KLQkJc2VsZi53LnBvcHVwbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBtZW51aXRlbXMpCi0JCQotCQlzZWxmLncuX2JhcnkgPSBXLlNjcm9sbGJhcigoLTE1LCAxNCwgMTYsIC0xNCksIHNlbGYudy5vdXRwdXR0ZXh0LnZzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzZWxmLncuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCi0JCXNlbGYudy5iaW5kKCI8YWN0aXZhdGU+Iiwgc2VsZi5hY3RpdmF0ZSkKLQkKLQlkZWYgd3JpdGUoc2VsZiwgdGV4dCk6Ci0JCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCW9sZHlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQl0cnk6Ci0JCQlzZWxmLl9idWYgPSBzZWxmLl9idWYgKyB0ZXh0Ci0JCQlpZiAnXG4nIGluIHNlbGYuX2J1ZjoKLQkJCQlzZWxmLmZsdXNoKCkKLQkJZmluYWxseToKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2gob2xkeWllbGQpCi0JCi0JZGVmIGZsdXNoKHNlbGYpOgotCQlzZWxmLnNob3coKQotCQlzdHVmZiA9IHN0cmluZy5zcGxpdChzZWxmLl9idWYsICdcbicpCi0JCXN0dWZmID0gc3RyaW5nLmpvaW4oc3R1ZmYsICdccicpCi0JCWVuZCA9IHNlbGYudy5vdXRwdXR0ZXh0LnRlZC5XRUdldFRleHRMZW5ndGgoKQotCQlzZWxmLncub3V0cHV0dGV4dC5zZXRzZWxlY3Rpb24oZW5kLCBlbmQpCi0JCXNlbGYudy5vdXRwdXR0ZXh0LnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIDApCi0JCXRyeToKLQkJCXNlbGYudy5vdXRwdXR0ZXh0LnRlZC5XRUluc2VydChzdHVmZiwgTm9uZSwgTm9uZSkKLQkJZmluYWxseToKLQkJCXNlbGYuX2J1ZiA9ICIiCi0JCXNlbGYudy5vdXRwdXR0ZXh0LnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLncub3V0cHV0dGV4dC50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAxKQotCQlpZiBzZWxmLncud2lkLkdldFdpbmRvd1BvcnQoKS5RRElzUG9ydEJ1ZmZlcmVkKCk6Ci0JCQlzZWxmLncud2lkLkdldFdpbmRvd1BvcnQoKS5RREZsdXNoUG9ydEJ1ZmZlcihOb25lKQotCQotCWRlZiBzaG93KHNlbGYpOgotCQlpZiBzZWxmLmNsb3NlZDoKLQkJCWlmIG5vdCBzZWxmLnc6Ci0JCQkJc2VsZi5zZXR1cHdpZGdldHMoKQotCQkJCXNlbGYudy5vcGVuKCkKLQkJCQlzZWxmLncub3V0cHV0dGV4dC51cGRhdGVzY3JvbGxiYXJzKCkKLQkJCQlzZWxmLmNsb3NlZCA9IDAKLQkJCWVsc2U6Ci0JCQkJc2VsZi53LnNob3coMSkKLQkJCQlzZWxmLmNsb3NlZCA9IDAKLQkJCQlzZWxmLncuc2VsZWN0KCkKLQkKLQlkZWYgd3JpdGVwcmVmcyhzZWxmKToKLQkJaWYgc2VsZi53IGlzIG5vdCBOb25lOgotCQkJcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQotCQkJcHJlZnMub3V0cHV0LnNob3cgPSBzZWxmLncuaXN2aXNpYmxlKCkKLQkJCXByZWZzLm91dHB1dC53aW5kb3dib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKLQkJCXByZWZzLm91dHB1dC5mb250c2V0dGluZ3MgPSBzZWxmLncub3V0cHV0dGV4dC5nZXRmb250c2V0dGluZ3MoKQotCQkJcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzID0gc2VsZi53Lm91dHB1dHRleHQuZ2V0dGFic2V0dGluZ3MoKQotCQkJcHJlZnMuc2F2ZSgpCi0JCi0JZGVmIGRvZm9udHNldHRpbmdzKHNlbGYpOgotCQlpbXBvcnQgRm9udFNldHRpbmdzCi0JCXNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coc2VsZi53Lm91dHB1dHRleHQuZ2V0Zm9udHNldHRpbmdzKCksCi0JCQkJc2VsZi53Lm91dHB1dHRleHQuZ2V0dGFic2V0dGluZ3MoKSkKLQkJaWYgc2V0dGluZ3M6Ci0JCQlmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzID0gc2V0dGluZ3MKLQkJCXNlbGYudy5vdXRwdXR0ZXh0LnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCi0JCQlzZWxmLncub3V0cHV0dGV4dC5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKLQkKLQlkZWYgY2xlYXJidWZmZXIoc2VsZik6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLQkJc2VsZi53Lm91dHB1dHRleHQuc2V0KCcnKQotCQotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi5jbG9zZWQgPSAwCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLncuc2hvdygwKQotCQlzZWxmLmNsb3NlZCA9IDEKLQkJcmV0dXJuIC0xCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgYm91bmRzLCBzaG93ID0gMSwgZm9udHNldHRpbmdzID0gKCJNb25hY28iLCAwLCA5LCAoMCwgMCwgMCkpLCB0YWJzZXR0aW5ncyA9ICgzMiwgMCkpOgorICAgICAgICBzZWxmLmJvdW5kcyA9IGJvdW5kcworICAgICAgICBzZWxmLmZvbnRzZXR0aW5ncyA9IGZvbnRzZXR0aW5ncworICAgICAgICBzZWxmLnRhYnNldHRpbmdzID0gdGFic2V0dGluZ3MKKyAgICAgICAgc2VsZi53ID0gTm9uZQorICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgc2VsZi5fYnVmID0gJycKKyAgICAgICAgIyBzaG91bGQgYmUgYWJsZSB0byBzZXQgdGhpcworICAgICAgICBzZWxmLnNhdmVzdGRvdXQsIHNlbGYuc2F2ZXN0ZGVyciA9IHN5cy5zdGRvdXQsIHN5cy5zdGRlcnIKKyAgICAgICAgc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBzZWxmCisgICAgICAgIGlmIHNob3c6CisgICAgICAgICAgICBzZWxmLnNob3coKQorCisgICAgZGVmIHNldHVwd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coc2VsZi5ib3VuZHMsICJPdXRwdXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgbWluc2l6ZSA9ICgyMDAsIDEwMCksCisgICAgICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZSA9IDApCisgICAgICAgIHNlbGYudy5vdXRwdXR0ZXh0ID0gT3V0cHV0VGV4dFdpZGdldCgoLTEsIC0xLCAtMTQsIDEpLCBpbnNldCA9ICg2LCA1KSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzZXR0aW5ncyA9IHNlbGYuZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNlbGYudGFic2V0dGluZ3MsIHJlYWRvbmx5ID0gMSkKKyAgICAgICAgbWVudWl0ZW1zID0gWygiQ2xlYXIgd2luZG93Iiwgc2VsZi5jbGVhcmJ1ZmZlciksICgiRm9udCBzZXR0aW5nc1x4YzkiLCBzZWxmLmRvZm9udHNldHRpbmdzKV0KKyAgICAgICAgc2VsZi53LnBvcHVwbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBtZW51aXRlbXMpCisKKyAgICAgICAgc2VsZi53Ll9iYXJ5ID0gVy5TY3JvbGxiYXIoKC0xNSwgMTQsIDE2LCAtMTQpLCBzZWxmLncub3V0cHV0dGV4dC52c2Nyb2xsLCBtYXggPSAzMjc2NykKKyAgICAgICAgc2VsZi53LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCisKKyAgICBkZWYgd3JpdGUoc2VsZiwgdGV4dCk6CisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgIG9sZHlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLl9idWYgPSBzZWxmLl9idWYgKyB0ZXh0CisgICAgICAgICAgICBpZiAnXG4nIGluIHNlbGYuX2J1ZjoKKyAgICAgICAgICAgICAgICBzZWxmLmZsdXNoKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2gob2xkeWllbGQpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHNlbGYuc2hvdygpCisgICAgICAgIHN0dWZmID0gc3RyaW5nLnNwbGl0KHNlbGYuX2J1ZiwgJ1xuJykKKyAgICAgICAgc3R1ZmYgPSBzdHJpbmcuam9pbihzdHVmZiwgJ1xyJykKKyAgICAgICAgZW5kID0gc2VsZi53Lm91dHB1dHRleHQudGVkLldFR2V0VGV4dExlbmd0aCgpCisgICAgICAgIHNlbGYudy5vdXRwdXR0ZXh0LnNldHNlbGVjdGlvbihlbmQsIGVuZCkKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi53Lm91dHB1dHRleHQudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fYnVmID0gIiIKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYudy5vdXRwdXR0ZXh0LnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIDEpCisgICAgICAgIGlmIHNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpLlFESXNQb3J0QnVmZmVyZWQoKToKKyAgICAgICAgICAgIHNlbGYudy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpCisKKyAgICBkZWYgc2hvdyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi53OgorICAgICAgICAgICAgICAgIHNlbGYuc2V0dXB3aWRnZXRzKCkKKyAgICAgICAgICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgICAgICAgICAgc2VsZi53Lm91dHB1dHRleHQudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAwCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYudy5zaG93KDEpCisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZWQgPSAwCisgICAgICAgICAgICAgICAgc2VsZi53LnNlbGVjdCgpCisKKyAgICBkZWYgd3JpdGVwcmVmcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi53IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQorICAgICAgICAgICAgcHJlZnMub3V0cHV0LnNob3cgPSBzZWxmLncuaXN2aXNpYmxlKCkKKyAgICAgICAgICAgIHByZWZzLm91dHB1dC53aW5kb3dib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKKyAgICAgICAgICAgIHByZWZzLm91dHB1dC5mb250c2V0dGluZ3MgPSBzZWxmLncub3V0cHV0dGV4dC5nZXRmb250c2V0dGluZ3MoKQorICAgICAgICAgICAgcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzID0gc2VsZi53Lm91dHB1dHRleHQuZ2V0dGFic2V0dGluZ3MoKQorICAgICAgICAgICAgcHJlZnMuc2F2ZSgpCisKKyAgICBkZWYgZG9mb250c2V0dGluZ3Moc2VsZik6CisgICAgICAgIGltcG9ydCBGb250U2V0dGluZ3MKKyAgICAgICAgc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhzZWxmLncub3V0cHV0dGV4dC5nZXRmb250c2V0dGluZ3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudy5vdXRwdXR0ZXh0LmdldHRhYnNldHRpbmdzKCkpCisgICAgICAgIGlmIHNldHRpbmdzOgorICAgICAgICAgICAgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNldHRpbmdzCisgICAgICAgICAgICBzZWxmLncub3V0cHV0dGV4dC5zZXRmb250c2V0dGluZ3MoZm9udHNldHRpbmdzKQorICAgICAgICAgICAgc2VsZi53Lm91dHB1dHRleHQuc2V0dGFic2V0dGluZ3ModGFic2V0dGluZ3MpCisKKyAgICBkZWYgY2xlYXJidWZmZXIoc2VsZik6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICAgICAgc2VsZi53Lm91dHB1dHRleHQuc2V0KCcnKQorCisgICAgZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLmNsb3NlZCA9IDAKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi53LnNob3coMCkKKyAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisgICAgICAgIHJldHVybiAtMQogCiAKIGNsYXNzIFNpbXBsZVN0ZGluOgotCQotCWRlZiByZWFkbGluZShzZWxmKToKLQkJaW1wb3J0IEVhc3lEaWFsb2dzCi0JCSMgQSB0cmljayB0byBtYWtlIHRoZSBpbnB1dCBkaWFsb2cgYm94IGEgYml0IG1vcmUgcGFsYXRhYmxlCi0JCWlmIGhhc2F0dHIoc3lzLnN0ZG91dCwgJ19idWYnKToKLQkJCXByb21wdCA9IHN5cy5zdGRvdXQuX2J1ZgotCQllbHNlOgotCQkJcHJvbXB0ID0gIiIKLQkJaWYgbm90IHByb21wdDoKLQkJCXByb21wdCA9ICJTdGRpbiBpbnB1dDoiCi0JCXN5cy5zdGRvdXQuZmx1c2goKQotCQlydiA9IEVhc3lEaWFsb2dzLkFza1N0cmluZyhwcm9tcHQpCi0JCWlmIHJ2IGlzIE5vbmU6Ci0JCQlyZXR1cm4gIiIKLQkJcnYgPSBydiArICJcbiIgICMgcmVhZGxpbmUgc2hvdWxkIGluY2x1ZGUgbGluZSB0ZXJtaW5hdG9yCi0JCXN5cy5zdGRvdXQud3JpdGUocnYpICAjIGVjaG8gdXNlcidzIHJlcGx5Ci0JCXJldHVybiBydgorCisgICAgZGVmIHJlYWRsaW5lKHNlbGYpOgorICAgICAgICBpbXBvcnQgRWFzeURpYWxvZ3MKKyAgICAgICAgIyBBIHRyaWNrIHRvIG1ha2UgdGhlIGlucHV0IGRpYWxvZyBib3ggYSBiaXQgbW9yZSBwYWxhdGFibGUKKyAgICAgICAgaWYgaGFzYXR0cihzeXMuc3Rkb3V0LCAnX2J1ZicpOgorICAgICAgICAgICAgcHJvbXB0ID0gc3lzLnN0ZG91dC5fYnVmCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcm9tcHQgPSAiIgorICAgICAgICBpZiBub3QgcHJvbXB0OgorICAgICAgICAgICAgcHJvbXB0ID0gIlN0ZGluIGlucHV0OiIKKyAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIHJ2ID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKHByb21wdCkKKyAgICAgICAgaWYgcnYgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybiAiIgorICAgICAgICBydiA9IHJ2ICsgIlxuIiAgIyByZWFkbGluZSBzaG91bGQgaW5jbHVkZSBsaW5lIHRlcm1pbmF0b3IKKyAgICAgICAgc3lzLnN0ZG91dC53cml0ZShydikgICMgZWNobyB1c2VyJ3MgcmVwbHkKKyAgICAgICAgcmV0dXJuIHJ2CiAKIAogZGVmIGluc3RhbGxjb25zb2xlKGRlZmF1bHRzaG93ID0gMSk6Ci0JZ2xvYmFsIGNvbnNvbGUKLQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JaWYgbm90IHByZWZzLmNvbnNvbGUgb3Igbm90IGhhc2F0dHIocHJlZnMuY29uc29sZSwgJ3Nob3cnKToKLQkJcHJlZnMuY29uc29sZS5zaG93ID0gZGVmYXVsdHNob3cKLQlpZiBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAid2luZG93Ym91bmRzIik6Ci0JCXByZWZzLmNvbnNvbGUud2luZG93Ym91bmRzID0gKDQ1MCwgMjUwKQotCWlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJmb250c2V0dGluZ3MiKToKLQkJcHJlZnMuY29uc29sZS5mb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSkKLQlpZiBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAidGFic2V0dGluZ3MiKToKLQkJcHJlZnMuY29uc29sZS50YWJzZXR0aW5ncyA9ICgzMiwgMCkKLQljb25zb2xlID0gUHlDb25zb2xlKHByZWZzLmNvbnNvbGUud2luZG93Ym91bmRzLCBwcmVmcy5jb25zb2xlLnNob3csIAotCQkJcHJlZnMuY29uc29sZS5mb250c2V0dGluZ3MsIHByZWZzLmNvbnNvbGUudGFic2V0dGluZ3MsIDEpCisgICAgZ2xvYmFsIGNvbnNvbGUKKyAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgaWYgbm90IHByZWZzLmNvbnNvbGUgb3Igbm90IGhhc2F0dHIocHJlZnMuY29uc29sZSwgJ3Nob3cnKToKKyAgICAgICAgcHJlZnMuY29uc29sZS5zaG93ID0gZGVmYXVsdHNob3cKKyAgICBpZiBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAid2luZG93Ym91bmRzIik6CisgICAgICAgIHByZWZzLmNvbnNvbGUud2luZG93Ym91bmRzID0gKDQ1MCwgMjUwKQorICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLmNvbnNvbGUsICJmb250c2V0dGluZ3MiKToKKyAgICAgICAgcHJlZnMuY29uc29sZS5mb250c2V0dGluZ3MgPSAoIk1vbmFjbyIsIDAsIDksICgwLCAwLCAwKSkKKyAgICBpZiBub3QgaGFzYXR0cihwcmVmcy5jb25zb2xlLCAidGFic2V0dGluZ3MiKToKKyAgICAgICAgcHJlZnMuY29uc29sZS50YWJzZXR0aW5ncyA9ICgzMiwgMCkKKyAgICBjb25zb2xlID0gUHlDb25zb2xlKHByZWZzLmNvbnNvbGUud2luZG93Ym91bmRzLCBwcmVmcy5jb25zb2xlLnNob3csCisgICAgICAgICAgICAgICAgICAgIHByZWZzLmNvbnNvbGUuZm9udHNldHRpbmdzLCBwcmVmcy5jb25zb2xlLnRhYnNldHRpbmdzLCAxKQogCiBkZWYgaW5zdGFsbG91dHB1dChkZWZhdWx0c2hvdyA9IDAsIE91dFB1dFdpbmRvdyA9IFB5T3V0cHV0KToKLQlnbG9iYWwgb3V0cHV0Ci0JCi0JIyBxdWljayAnbicgZGlydHkgc3RkIGluIGVtdWxhdGlvbgotCXN5cy5zdGRpbiA9IFNpbXBsZVN0ZGluKCkKLQkKLQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JaWYgbm90IHByZWZzLm91dHB1dCBvciBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICdzaG93Jyk6Ci0JCXByZWZzLm91dHB1dC5zaG93ID0gZGVmYXVsdHNob3cKLQlpZiBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICJ3aW5kb3dib3VuZHMiKToKLQkJcHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcyA9ICg0NTAsIDI1MCkKLQlpZiBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICJmb250c2V0dGluZ3MiKToKLQkJcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKQotCWlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgInRhYnNldHRpbmdzIik6Ci0JCXByZWZzLm91dHB1dC50YWJzZXR0aW5ncyA9ICgzMiwgMCkKLQlvdXRwdXQgPSBPdXRQdXRXaW5kb3cocHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcywgcHJlZnMub3V0cHV0LnNob3csIAotCQkJcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncywgcHJlZnMub3V0cHV0LnRhYnNldHRpbmdzKQorICAgIGdsb2JhbCBvdXRwdXQKKworICAgICMgcXVpY2sgJ24nIGRpcnR5IHN0ZCBpbiBlbXVsYXRpb24KKyAgICBzeXMuc3RkaW4gPSBTaW1wbGVTdGRpbigpCisKKyAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgaWYgbm90IHByZWZzLm91dHB1dCBvciBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICdzaG93Jyk6CisgICAgICAgIHByZWZzLm91dHB1dC5zaG93ID0gZGVmYXVsdHNob3cKKyAgICBpZiBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICJ3aW5kb3dib3VuZHMiKToKKyAgICAgICAgcHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcyA9ICg0NTAsIDI1MCkKKyAgICBpZiBub3QgaGFzYXR0cihwcmVmcy5vdXRwdXQsICJmb250c2V0dGluZ3MiKToKKyAgICAgICAgcHJlZnMub3V0cHV0LmZvbnRzZXR0aW5ncyA9ICgiTW9uYWNvIiwgMCwgOSwgKDAsIDAsIDApKQorICAgIGlmIG5vdCBoYXNhdHRyKHByZWZzLm91dHB1dCwgInRhYnNldHRpbmdzIik6CisgICAgICAgIHByZWZzLm91dHB1dC50YWJzZXR0aW5ncyA9ICgzMiwgMCkKKyAgICBvdXRwdXQgPSBPdXRQdXRXaW5kb3cocHJlZnMub3V0cHV0LndpbmRvd2JvdW5kcywgcHJlZnMub3V0cHV0LnNob3csCisgICAgICAgICAgICAgICAgICAgIHByZWZzLm91dHB1dC5mb250c2V0dGluZ3MsIHByZWZzLm91dHB1dC50YWJzZXR0aW5ncykKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlEZWJ1Z2dlci5weSBiL01hYy9Ub29scy9JREUvUHlEZWJ1Z2dlci5weQppbmRleCA1MWJhNzUzLi41ZWU5MmQ1IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5RGVidWdnZXIucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeURlYnVnZ2VyLnB5CkBAIC0xMyw4ODIgKzEzLDg4MiBAQAogX2ZpbGVuYW1lcyA9IHt9CiAKIFNJTVBMRV9UWVBFUyA9ICgKLQl0eXBlcy5Ob25lVHlwZSwKLQl0eXBlcy5JbnRUeXBlLAotCXR5cGVzLkxvbmdUeXBlLAotCXR5cGVzLkZsb2F0VHlwZSwKLQl0eXBlcy5Db21wbGV4VHlwZSwKLQl0eXBlcy5TdHJpbmdUeXBlCisgICAgICAgIHR5cGVzLk5vbmVUeXBlLAorICAgICAgICB0eXBlcy5JbnRUeXBlLAorICAgICAgICB0eXBlcy5Mb25nVHlwZSwKKyAgICAgICAgdHlwZXMuRmxvYXRUeXBlLAorICAgICAgICB0eXBlcy5Db21wbGV4VHlwZSwKKyAgICAgICAgdHlwZXMuU3RyaW5nVHlwZQogKQogCiAKIGNsYXNzIERlYnVnZ2VyKGJkYi5CZGIpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSA9ICdEZWJ1Z2dlcicpOgotCQliZGIuQmRiLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYuY2xvc2VkID0gMQotCQlzZWxmLnRpdGxlID0gdGl0bGUKLQkJc2VsZi5icmVha3N2aWV3ZXIgPSBOb25lCi0JCXNlbGYucmVzZXQoKQotCQlzZWxmLnRyYWNpbmcgPSAwCi0JCXNlbGYudHJhY2luZ21vbml0b3J0aW1lID0gRXZ0LlRpY2tDb3VudCgpCi0JCXNlbGYuZWRpdG9ycyA9IHt9Ci0JCQotCQlwcmVmcyA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRwcmVmcygpCi0JCWlmIHByZWZzLmRlYnVnZ2VyOgotCQkJZm9yIGZpbGUsIGJyZWFrcyBpbiBwcmVmcy5kZWJ1Z2dlci5icmVha3MuaXRlbXMoKToKLQkJCQlmb3IgYiBpbiBicmVha3M6Ci0JCQkJCXNlbGYuc2V0X2JyZWFrKGZpbGUsIGIpCi0JCQlzZWxmLmJvdW5kcywgc2VsZi5ob3JwYW5lcywgc2VsZi52ZXJwYW5lcyA9IHByZWZzLmRlYnVnZ2VyLndpbmRvd3NldHRpbmdzCi0JCQlzZWxmLnRyYWNlbWFnaWMgPSBwcmVmcy5kZWJ1Z2dlci50cmFjZW1hZ2ljCi0JCWVsc2U6Ci0JCQlzZWxmLmJyZWFrcyA9IHt9Ci0JCQlzZWxmLmhvcnBhbmVzID0gKDAuNCwgMC42KQotCQkJc2VsZi52ZXJwYW5lcyA9ICgwLjMsIDAuMzUsIDAuMzUpCi0JCQlzZWxmLmJvdW5kcyA9ICg2MDAsIDQwMCkKLQkJCXNlbGYudHJhY2VtYWdpYyA9IDAKLQkJc2VsZi5sYXN0c3RhY2tzZWwgPSBOb25lCi0JCi0JZGVmIGNhbm9uaWMoc2VsZiwgZmlsZW5hbWUpOgotCQkjIG92ZXJyaWRlOiB0aGUgcHJvdmlkZWQgY2Fub25pYygpIG1ldGhvZCBicmVha3Mgb3VyCi0JCSMgZmlsZS1sZXNzIFVudGl0bGVkIHdpbmRvd3MKLQkJcmV0dXJuIGZpbGVuYW1lCi0JCi0JZGVmIHJlc2V0KHNlbGYpOgotCQlzZWxmLmN1cnJlbnRmcmFtZSA9IE5vbmUKLQkJc2VsZi5maWxlID0gTm9uZQotCQlzZWxmLmxhc3RzdGFjayA9IE5vbmUKLQkJc2VsZi5yZWFzb24gPSAnTm90IHJ1bm5pbmcnCi0JCXNlbGYuY29udGludWV3aXRob3V0ZGVidWdnZXIgPSAwCi0JCWJkYi5CZGIucmVzZXQoc2VsZikKLQkJc2VsZi5mb3JnZXQoKQotCQotCWRlZiBzdGFydChzZWxmLCBib3R0b21mcmFtZSA9IE5vbmUsIHJ1bm5pbmcgPSAwKToKLQkJVy5nZXRhcHBsaWNhdGlvbigpLkRlYnVnZ2VyUXVpdCA9IGJkYi5CZGJRdWl0Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBNZW51Ci0JCU1lbnUuSGlsaXRlTWVudSgwKQotCQlpZiBzZWxmLmNsb3NlZDoKLQkJCXNlbGYuc2V0dXB3aWRnZXRzKHNlbGYudGl0bGUpCi0JCQlzZWxmLmNsb3NlZCA9IDAKLQkJaWYgbm90IHNlbGYudy5wYXJlbnQuZGVidWdnZXJfcXVpdHRpbmc6Ci0JCQlzZWxmLncuc2VsZWN0KCkKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgJ1RoZXJlIGlzIGFub3RoZXIgZGVidWdnZXIgc2Vzc2lvbiBidXN5LicKLQkJc2VsZi5yZXNldCgpCi0JCXNlbGYuYm90ZnJhbWUgPSBib3R0b21mcmFtZQotCQlpZiBydW5uaW5nOgotCQkJc2VsZi5zZXRfY29udGludWUoKQotCQkJc2VsZi5yZWFzb24gPSAnUnVubmluZ1x4YzknCi0JCQlzZWxmLnNldHN0YXRlKCdydW5uaW5nJykKLQkJZWxzZToKLQkJCXNlbGYuc2V0X3N0ZXAoKQotCQkJc2VsZi5yZWFzb24gPSAnc3RvcHBlZCcKLQkJCXNlbGYuc2V0c3RhdGUoJ3N0b3BwZWQnKQotCQlzeXMuc2V0dHJhY2Uoc2VsZi50cmFjZV9kaXNwYXRjaCkKLQkKLQlkZWYgc3RvcChzZWxmKToKLQkJc2VsZi5zZXRfcXVpdCgpCi0JCWlmIHNlbGYudy5wYXJlbnQ6Ci0JCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkJc2VsZi5yZXNldHdpZGdldHMoKQotCQotCWRlZiBzZXRfY29udGludWVfd2l0aG91dF9kZWJ1Z2dlcihzZWxmKToKLQkJc3lzLnNldHRyYWNlKE5vbmUpCi0JCXNlbGYuc2V0X3F1aXQoKQotCQlzZWxmLmNsZWFyX3RyYWNlZnVuY3MoKQotCQlzZWxmLmNvbnRpbnVld2l0aG91dGRlYnVnZ2VyID0gMQotCQlpZiBoYXNhdHRyKHNlbGYsICJ3IikgYW5kIHNlbGYudy5wYXJlbnQ6Ci0JCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQkJc2VsZi5yZXNldHdpZGdldHMoKQotCQotCWRlZiBjbGVhcl90cmFjZWZ1bmNzKHNlbGYpOgotCQl0cnk6Ci0JCQlyYWlzZSAnc3BhbScKLQkJZXhjZXB0OgotCQkJcGFzcwotCQlmcmFtZSA9IHN5cy5leGNfdHJhY2ViYWNrLnRiX2ZyYW1lCi0JCXdoaWxlIGZyYW1lIGlzIG5vdCBOb25lOgotCQkJZGVsIGZyYW1lLmZfdHJhY2UKLQkJCWZyYW1lID0gZnJhbWUuZl9iYWNrCi0JCi0JZGVmIHBvc3Rtb3J0ZW0oc2VsZiwgZXhjX3R5cGUsIGV4Y192YWx1ZSwgdHJhY2ViYWNrKToKLQkJaWYgc2VsZi5jbG9zZWQ6Ci0JCQlzZWxmLnNldHVwd2lkZ2V0cyhzZWxmLnRpdGxlKQotCQkJc2VsZi5jbG9zZWQgPSAwCi0JCWlmIG5vdCBzZWxmLncucGFyZW50LmRlYnVnZ2VyX3F1aXR0aW5nOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAnVGhlcmUgaXMgYW5vdGhlciBkZWJ1Z2dlciBzZXNzaW9uIGJ1c3kuJwotCQlzZWxmLnJlc2V0KCkKLQkJaWYgdHJhY2ViYWNrOgotCQkJc2VsZi5ib3RmcmFtZSA9IHRyYWNlYmFjay50Yl9mcmFtZQotCQkJd2hpbGUgdHJhY2ViYWNrLnRiX25leHQgPD4gTm9uZToKLQkJCQl0cmFjZWJhY2sgPSB0cmFjZWJhY2sudGJfbmV4dAotCQkJZnJhbWUgPSB0cmFjZWJhY2sudGJfZnJhbWUKLQkJZWxzZToKLQkJCXNlbGYuYm90ZnJhbWUgPSBOb25lCi0JCQlmcmFtZSA9IE5vbmUKLQkJc2VsZi53LnBhbmVzLmJvdHRvbS5idXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCi0JCXNlbGYucmVhc29uID0gJyhkZWFkKSAnICsgc2VsZi5mb3JtYXRleGNlcHRpb24oZXhjX3R5cGUsIGV4Y192YWx1ZSkKLQkJc2VsZi53LnNlbGVjdCgpCi0JCXNlbGYuc2V0dXAoZnJhbWUsIHRyYWNlYmFjaykKLQkJc2VsZi5zZXRzdGF0ZSgnZGVhZCcpCi0JCXNlbGYuc2hvd3N0YWNrKHNlbGYuY3VyaW5kZXgpCi0JCXNlbGYuc2hvd2ZyYW1lKHNlbGYuY3VyaW5kZXgpCi0JCi0JZGVmIHNldHVwd2lkZ2V0cyhzZWxmLCB0aXRsZSk6Ci0JCXNlbGYudyA9IHcgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgdGl0bGUsIG1pbnNpemUgPSAoNTAwLCAzMDApKQotCQkKLQkJdy5wYW5lcyA9IFcuSG9yaXpvbnRhbFBhbmVzKCg4LCA0LCAtOCwgLTgpLCBzZWxmLmhvcnBhbmVzKQotCQkKLQkJdy5wYW5lcy5icm93c2VycGFuZXMgPSBicm93c2VycGFuZXMgPSBXLlZlcnRpY2FsUGFuZXMoTm9uZSwgc2VsZi52ZXJwYW5lcykKLQkJCi0JCWJyb3dzZXJwYW5lcy5zdGFja2xpc3QgPSBXLkdyb3VwKE5vbmUpCi0JCWJyb3dzZXJwYW5lcy5zdGFja2xpc3QudGl0bGUgPSBXLlRleHRCb3goKDQsIDAsIDAsIDEyKSwgJ1N0YWNrJykKLQkJYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjayA9IFcuTGlzdCgoMCwgMTYsIDAsIDApLCBjYWxsYmFjayA9IHNlbGYuZG9fc3RhY2ssIGZsYWdzID0gTGlzdHMubE9ubHlPbmUpCi0JCQotCQlicm93c2VycGFuZXMubG9jYWxzID0gVy5Hcm91cChOb25lKQotCQlicm93c2VycGFuZXMubG9jYWxzLnRpdGxlID0gVy5UZXh0Qm94KCg0LCAwLCAwLCAxMiksICdMb2NhbCB2YXJpYWJsZXMnKQotCQlicm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIgPSBQeUJyb3dzZXIuQnJvd3NlcldpZGdldCgoMCwgMTYsIDAsIDApKQotCQkKLQkJYnJvd3NlcnBhbmVzLmdsb2JhbHMgPSBXLkdyb3VwKE5vbmUpCi0JCWJyb3dzZXJwYW5lcy5nbG9iYWxzLnRpdGxlID0gVy5UZXh0Qm94KCg0LCAwLCAwLCAxMiksICdHbG9iYWwgdmFyaWFibGVzJykKLQkJYnJvd3NlcnBhbmVzLmdsb2JhbHMuYnJvd3NlciA9IFB5QnJvd3Nlci5Ccm93c2VyV2lkZ2V0KCgwLCAxNiwgMCwgMCkpCi0JCQotCQl3LnBhbmVzLmJvdHRvbSA9IGJvdHRvbSA9IFcuR3JvdXAoTm9uZSkKLQkJYm90dG9tLnNyYyA9IHNyYyA9IFcuR3JvdXAoKDAsIDY0LCAwLCAwKSkKLQkJc291cmNlID0gU291cmNlVmlld2VyKCgxLCAxLCAtMTUsIC0xNSksIHJlYWRvbmx5ID0gMSwgZGVidWdnZXIgPSBzZWxmKQotCQlzcmMub3B0aW9uc21lbnUgPSBXLlBvcHVwTWVudSgoLTE2LCAwLCAxNiwgMTYpLCBbXSkKLQkJc3JjLm9wdGlvbnNtZW51LmJpbmQoJzxjbGljaz4nLCBzZWxmLm1ha2VvcHRpb25zbWVudSkKLQkJCi0JCXNyYy5fYmFyeCA9IFcuU2Nyb2xsYmFyKCgwLCAtMTYsIC0xNSwgMTYpLCBzb3VyY2UuaHNjcm9sbCwgbWF4ID0gMzI3NjcpCi0JCXNyYy5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTYsIDE1LCAxNiwgLTE1KSwgc291cmNlLnZzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzcmMuc291cmNlID0gc291cmNlCi0JCXNyYy5mcmFtZSA9IFcuRnJhbWUoKDAsIDAsIC0xNSwgLTE1KSkKLQkJCi0JCWJvdHRvbS50cmFjaW5nbW9uaXRvciA9IFRyYWNpbmdNb25pdG9yKCgwLCAyMywgNiwgNikpCi0JCWJvdHRvbS5zdGF0ZSA9IFcuVGV4dEJveCgoMTIsIDI0LCAwLCAxNiksIHNlbGYucmVhc29uKQotCQkKLQkJYm90dG9tLnNyY3RpdGxlID0gVy5UZXh0Qm94KCgxMiwgNDQsIDAsIDE2KSkKLQkJYm90dG9tLmJ1dHRvbnMgPSBidXR0b25zID0gVy5Hcm91cCgoMTIsIDAsIDAsIDIwKSkKLQkJCi0JCWJ1dHRvbnMucnVuYnV0dG9uID0gVy5CdXR0b24oKDAsIDAsIDUwLCAxNiksICJSdW4iLCBzZWxmLmRvX3J1bikKLQkJYnV0dG9ucy5zdG9wYnV0dG9uID0gVy5CdXR0b24oKDU4LCAwLCA1MCwgMTYpLCAiU3RvcCIsIHNlbGYuZG9fc3RvcCkKLQkJYnV0dG9ucy5raWxsYnV0dG9uID0gVy5CdXR0b24oKDExNiwgMCwgNTAsIDE2KSwgIktpbGwiLCBzZWxmLmRvX2tpbGwpCi0JCWJ1dHRvbnMubGluZSA9IFcuVmVydGljYWxMaW5lKCgxNzMsIDAsIDAsIDApKQotCQlidXR0b25zLnN0ZXBidXR0b24gPSBXLkJ1dHRvbigoMTgxLCAwLCA2MCwgMTYpLCAiU3RlcCIsIHNlbGYuZG9fc3RlcCkKLQkJYnV0dG9ucy5zdGVwaW5idXR0b24gPSBXLkJ1dHRvbigoMjQ5LCAwLCA2MCwgMTYpLCAiU3RlcCBpbiIsIHNlbGYuZG9fc3RlcGluKQotCQlidXR0b25zLnN0ZXBvdXRidXR0b24gPSBXLkJ1dHRvbigoMzE3LCAwLCA2MCwgMTYpLCAiU3RlcCBvdXQiLCBzZWxmLmRvX3N0ZXBvdXQpCi0JCQotCQl3LmJpbmQoJ2NtZHInLCBidXR0b25zLnJ1bmJ1dHRvbi5wdXNoKQotCQl3LmJpbmQoJ2NtZC4nLCBidXR0b25zLnN0b3BidXR0b24ucHVzaCkKLQkJdy5iaW5kKCdjbWRrJywgYnV0dG9ucy5raWxsYnV0dG9uLnB1c2gpCi0JCXcuYmluZCgnY21kcycsIGJ1dHRvbnMuc3RlcGJ1dHRvbi5wdXNoKQotCQl3LmJpbmQoJ2NtZHQnLCBidXR0b25zLnN0ZXBpbmJ1dHRvbi5wdXNoKQotCQl3LmJpbmQoJ2NtZHUnLCBidXR0b25zLnN0ZXBvdXRidXR0b24ucHVzaCkKLQkJCi0JCXcuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCi0JCQotCQl3Lm9wZW4oKQotCQl3Lnh4eF9fX3NlbGVjdCh3LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlKQotCQotCWRlZiBtYWtlb3B0aW9uc21lbnUoc2VsZik6Ci0JCW9wdGlvbnMgPSBbKCdDbGVhciBicmVha3BvaW50cycsIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5jbGVhcmJyZWFrcG9pbnRzKSwgCi0JCQkJKCdDbGVhciBhbGwgYnJlYWtwb2ludHMnLCBzZWxmLmNsZWFyX2FsbF9icmVha3MpLAotCQkJCSgnRWRpdCBicmVha3BvaW50c1x4YzknLCBzZWxmLmVkaXRfYnJlYWtzKSwgJy0nLAotCQkJCShzZWxmLnRyYWNlbWFnaWMgYW5kIAotCQkJCQknRGlzYWJsZSBfX21hZ2ljX18gdHJhY2luZycgb3IgJ0VuYWJsZSBfX21hZ2ljX18gdHJhY2luZycsIHNlbGYudG9nZ2xlbWFnaWMpXQotCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5vcHRpb25zbWVudS5zZXQob3B0aW9ucykKLQkKLQlkZWYgZWRpdF9icmVha3Moc2VsZik6Ci0JCWlmIHNlbGYuYnJlYWtzdmlld2VyOgotCQkJc2VsZi5icmVha3N2aWV3ZXIuc2VsZWN0KCkKLQkJZWxzZToKLQkJCXNlbGYuYnJlYWtzdmlld2VyID0gQnJlYWtwb2ludHNWaWV3ZXIoc2VsZikKLQkKLQlkZWYgdG9nZ2xlbWFnaWMoc2VsZik6Ci0JCXNlbGYudHJhY2VtYWdpYyA9IG5vdCBzZWxmLnRyYWNlbWFnaWMKLQkKLQlkZWYgc2V0c3RhdGUoc2VsZiwgc3RhdGUpOgotCQlzZWxmLncucGFuZXMuYm90dG9tLnRyYWNpbmdtb25pdG9yLnJlc2V0KCkKLQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zdGF0ZS5zZXQoc2VsZi5yZWFzb24pCi0JCWJ1dHRvbnMgPSBzZWxmLncucGFuZXMuYm90dG9tLmJ1dHRvbnMKLQkJaWYgc3RhdGUgPT0gJ3N0b3BwZWQnOgotCQkJYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDEpCi0JCQlidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCi0JCQlidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDEpCi0JCQlidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMSkKLQkJZWxpZiBzdGF0ZSA9PSAncnVubmluZyc6Ci0JCQlidXR0b25zLnJ1bmJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RvcGJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMSkKLQkJCWJ1dHRvbnMuc3RlcGJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RlcGluYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdGVwb3V0YnV0dG9uLmVuYWJsZSgwKQotCQllbGlmIHN0YXRlID09ICdpZGxlJzoKLQkJCWJ1dHRvbnMucnVuYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdG9wYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdGVwYnV0dG9uLmVuYWJsZSgwKQotCQkJYnV0dG9ucy5zdGVwaW5idXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0ZXBvdXRidXR0b24uZW5hYmxlKDApCi0JCWVsaWYgc3RhdGUgPT0gJ2RlYWQnOgotCQkJYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCi0JCQlidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDApCi0JCQlidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMCkKLQkJCWJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMCkKLQkJZWxzZToKLQkJCXByaW50ICd1bmtub3duIHN0YXRlOicsIHN0YXRlCi0JCi0JZGVmIHJlc2V0d2lkZ2V0cyhzZWxmKToKLQkJc2VsZi5yZWFzb24gPSAnJwotCQlzZWxmLncucGFuZXMuYm90dG9tLnNyY3RpdGxlLnNldCgnJykKLQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgnJykKLQkJc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suc2V0KFtdKQotCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyLnNldCh7fSkKLQkJc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KHt9KQotCQlzZWxmLnNldHN0YXRlKCdpZGxlJykKLQkKLQkjIFcgY2FsbGJhY2tzCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLnNldF9xdWl0KCkKLQkJc2VsZi5leGl0X21haW5sb29wKCkKLQkJc2VsZi5jbG9zZWQgPSAxCi0JCQotCQlzZWxmLnVucmVnaXN0ZXJfZWRpdG9yKHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZSwgCi0JCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLmZpbGUpCi0JCXNlbGYuaG9ycGFuZXMgPSBzZWxmLncucGFuZXMuZ2V0cGFuZXNpemVzKCkKLQkJc2VsZi52ZXJwYW5lcyA9IHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuZ2V0cGFuZXNpemVzKCkKLQkJc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKLQkJcHJlZnMgPSBXLmdldGFwcGxpY2F0aW9uKCkuZ2V0cHJlZnMoKQotCQlwcmVmcy5kZWJ1Z2dlci5icmVha3MgPSBzZWxmLmJyZWFrcwotCQlwcmVmcy5kZWJ1Z2dlci53aW5kb3dzZXR0aW5ncyA9IHNlbGYuYm91bmRzLCBzZWxmLmhvcnBhbmVzLCBzZWxmLnZlcnBhbmVzCi0JCXByZWZzLmRlYnVnZ2VyLnRyYWNlbWFnaWMgPSBzZWxmLnRyYWNlbWFnaWMKLQkJcHJlZnMuc2F2ZSgpCi0JCi0JIyBzdGFjayBsaXN0IGNhbGxiYWNrCi0JCi0JZGVmIGRvX3N0YWNrKHNlbGYsIGlzZGJsKToKLQkJc2VsID0gc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suZ2V0c2VsZWN0aW9uKCkKLQkJaWYgaXNkYmw6Ci0JCQlpZiBzZWw6Ci0JCQkJZnJhbWUsIGxpbmVubyA9IHNlbGYuc3RhY2tbc2VsWzBdICsgMV0KLQkJCQlmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQotCQkJCWVkaXRvciA9IHNlbGYudy5fcGFyZW50d2luZG93LnBhcmVudC5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8pCi0JCQkJaWYgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQkJCWVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKLQkJZWxzZToKLQkJCWlmIHNlbCBhbmQgc2VsIDw+IHNlbGYubGFzdHN0YWNrc2VsOgotCQkJCXNlbGYuc2hvd2ZyYW1lKHNlbFswXSArIDEpCi0JCQlzZWxmLmxhc3RzdGFja3NlbCA9IHNlbAotCQotCWRlZiBnZXRlZGl0b3Ioc2VsZiwgZmlsZW5hbWUpOgotCQlpZiBmaWxlbmFtZVs6MV0gPT0gJzwnIGFuZCBmaWxlbmFtZVstMTpdID09ICc+JzoKLQkJCWVkaXRvciA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRzY3JpcHQoZmlsZW5hbWVbMTotMV0pCi0JCWVsc2U6Ci0JCQllZGl0b3IgPSBXLmdldGFwcGxpY2F0aW9uKCkuZ2V0c2NyaXB0KGZpbGVuYW1lKQotCQlyZXR1cm4gZWRpdG9yCi0JCi0JIyBidXR0b24gY2FsbGJhY2tzCi0JCi0JZGVmIGRvX3J1bihzZWxmKToKLQkJc2VsZi5ydW5uaW5nKCkKLQkJc2VsZi5zZXRfY29udGludWUoKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQotCWRlZiBkb19zdG9wKHNlbGYpOgotCQlzZWxmLnNldF9zdGVwKCkKLQkKLQlkZWYgZG9fa2lsbChzZWxmKToKLQkJc2VsZi5zZXRfcXVpdCgpCi0JCXNlbGYuZXhpdF9tYWlubG9vcCgpCi0JCXNlbGYucmVzZXR3aWRnZXRzKCkKLQkKLQlkZWYgZG9fc3RlcChzZWxmKToKLQkJc2VsZi5ydW5uaW5nKCkKLQkJc2VsZi5zZXRfbmV4dChzZWxmLmN1cmZyYW1lKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQotCWRlZiBkb19zdGVwaW4oc2VsZik6Ci0JCXNlbGYucnVubmluZygpCi0JCXNlbGYuc2V0X3N0ZXAoKQotCQlzZWxmLmV4aXRfbWFpbmxvb3AoKQotCQotCWRlZiBkb19zdGVwb3V0KHNlbGYpOgotCQlzZWxmLnJ1bm5pbmcoKQotCQlzZWxmLnNldF9yZXR1cm4oc2VsZi5jdXJmcmFtZSkKLQkJc2VsZi5leGl0X21haW5sb29wKCkKLQkKLQlkZWYgcnVubmluZyhzZWxmKToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJc2VsZi5yZWFzb24gPSAnUnVubmluZ1x4YzknCi0JCXNlbGYuc2V0c3RhdGUoJ3J1bm5pbmcnKQotCQkjc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgnJykKLQkJI3NlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLnNldChbXSkKLQkJI3NlbGYudy5wYW5lcy5icm93c2VycGFuZXMubG9jYWxzLmJyb3dzZXIuc2V0KHt9KQotCQkjc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KHt9KQotCQotCWRlZiBleGl0X21haW5sb29wKHNlbGYpOgotCQlzZWxmLncucGFyZW50LmRlYnVnZ2VyX3F1aXR0aW5nID0gMQotCQotCSMKLQkKLQlkZWYgc2hvd2ZyYW1lKHNlbGYsIHN0YWNraW5kZXgpOgotCQkoZnJhbWUsIGxpbmVubykgPSBzZWxmLnN0YWNrW3N0YWNraW5kZXhdCi0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0JCWlmIGZpbGVuYW1lIDw+IHNlbGYuZmlsZToKLQkJCWVkaXRvciA9IHNlbGYuZ2V0ZWRpdG9yKGZpbGVuYW1lKQotCQkJaWYgZWRpdG9yOgotCQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoZWRpdG9yLmdldCgpLCBmaWxlbmFtZSkKLQkJCWVsc2U6Ci0JCQkJdHJ5OgotCQkJCQlmID0gb3BlbihmaWxlbmFtZSwgJ3JVJykKLQkJCQkJZGF0YSA9IGYucmVhZCgpCi0JCQkJCWYuY2xvc2UoKQotCQkJCWV4Y2VwdCBJT0Vycm9yOgotCQkJCQlpZiBmaWxlbmFtZVstMzpdID09ICcucHknOgotCQkJCQkJaW1wb3J0IGltcAotCQkJCQkJbW9kbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpWzotM10KLQkJCQkJCXRyeToKLQkJCQkJCQlmLCBmaWxlbmFtZSwgKHN1ZmYsIG1vZGUsIGR1bW15KSA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQotCQkJCQkJZXhjZXB0IEltcG9ydEVycm9yOgotCQkJCQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoImNhbid0IGZpbmQgZmlsZSIpCi0JCQkJCQllbHNlOgotCQkJCQkJCWlmIGY6Ci0JCQkJCQkJCWYuY2xvc2UoKQotCQkJCQkJCWlmIGYgYW5kIHN1ZmYgPT0gJy5weSc6Ci0JCQkJCQkJCWYgPSBvcGVuKGZpbGVuYW1lLCAnclUnKQotCQkJCQkJCQlkYXRhID0gZi5yZWFkKCkKLQkJCQkJCQkJZi5jbG9zZSgpCi0JCQkJCQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoZGF0YSwgZmlsZW5hbWUpCi0JCQkJCQkJZWxzZToKLQkJCQkJCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgiY2FuJ3QgZmluZCBmaWxlIikKLQkJCQkJZWxzZToKLQkJCQkJCXNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoImNhbid0IGZpbmQgZmlsZSIpCi0JCQkJZWxzZToKLQkJCQkJZGF0YSA9IGRhdGEucmVwbGFjZSgnXG4nLCAnXHInKQotCQkJCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KGRhdGEsIGZpbGVuYW1lKQotCQkJc2VsZi5maWxlID0gZmlsZW5hbWUKLQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmN0aXRsZS5zZXQoJ1NvdXJjZTogJyArIGZpbGVuYW1lICsgKChsaW5lbm8gPiAwKSBhbmQgKCcgKGxpbmUgJWQpJyAlIGxpbmVubykgb3IgJyAnKSkKLQkJc2VsZi5nb3RvX2xpbmUobGluZW5vKQotCQlzZWxmLmxpbmVubyA9IGxpbmVubwotCQlzZWxmLnNob3d2YXJzKChmcmFtZSwgbGluZW5vKSkKLQkKLQlkZWYgc2hvd3ZhcnMoc2VsZiwgKGZyYW1lLCBsaW5lbm8pKToKLQkJaWYgZnJhbWUuZl9sb2NhbHMgaXMgbm90IGZyYW1lLmZfZ2xvYmFsczoKLQkJCWxvY2FscyA9IGZyYW1lLmZfbG9jYWxzCi0JCWVsc2U6Ci0JCQlsb2NhbHMgPSB7J1NhbWUgYXMgR2xvYmFscyc6Jyd9Ci0JCWZpbHRlcmVkbG9jYWxzID0ge30KLQkJZm9yIGtleSwgdmFsdWUgaW4gbG9jYWxzLml0ZW1zKCk6Ci0JCQkjIGVtcHR5IGtleSBpcyBtYWdpYyBmb3IgUHl0aG9uIDEuNDsgJy4nIGlzIG1hZ2ljIGZvciAxLjUuLi4KLQkJCWlmIG5vdCBrZXkgb3Iga2V5WzBdIDw+ICcuJzoKLQkJCQlmaWx0ZXJlZGxvY2Fsc1trZXldID0gdmFsdWUKLQkJc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5sb2NhbHMuYnJvd3Nlci5zZXQoZmlsdGVyZWRsb2NhbHMpCi0JCXNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuZ2xvYmFscy5icm93c2VyLnNldChmcmFtZS5mX2dsb2JhbHMpCi0JCi0JZGVmIHNob3dzdGFjayhzZWxmLCBzdGFja2luZGV4KToKLQkJc3RhY2sgPSBbXQotCQlmb3IgZnJhbWUsIGxpbmVubyBpbiBzZWxmLnN0YWNrWzE6XToKLQkJCWZpbGVuYW1lID0gZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lCi0JCQl0cnk6Ci0JCQkJZmlsZW5hbWUgPSBfZmlsZW5hbWVzW2ZpbGVuYW1lXQotCQkJZXhjZXB0IEtleUVycm9yOgotCQkJCWlmIGZpbGVuYW1lWzoxXSArIGZpbGVuYW1lWy0xOl0gPD4gJzw+JzoKLQkJCQkJZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKQotCQkJCV9maWxlbmFtZXNbZnJhbWUuZl9jb2RlLmNvX2ZpbGVuYW1lXSA9IGZpbGVuYW1lCi0JCQlmdW5jbmFtZSA9IGZyYW1lLmZfY29kZS5jb19uYW1lCi0JCQlpZiBmdW5jbmFtZSA9PSAnPyc6Ci0JCQkJZnVuY25hbWUgPSAnPHRvcGxldmVsPicKLQkJCXN0YWNrLmFwcGVuZChmaWxlbmFtZSArICc6ICcgKyBmdW5jbmFtZSkKLQkJaWYgc3RhY2sgPD4gc2VsZi5sYXN0c3RhY2s6Ci0JCQlzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXQoc3RhY2spCi0JCQlzZWxmLmxhc3RzdGFjayA9IHN0YWNrCi0JCXNlbCA9IFtzdGFja2luZGV4IC0gMV0KLQkJc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suc2V0c2VsZWN0aW9uKHNlbCkKLQkJc2VsZi5sYXN0c3RhY2tzZWwgPSBzZWwKLQkKLQlkZWYgZ290b19saW5lKHNlbGYsIGxpbmVubyk6Ci0JCWlmIGxpbmVubyA+IDA6Ci0JCQlzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2VsZWN0bGluZShsaW5lbm8gLSAxKQotCQllbHNlOgotCQkJc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldHNlbGVjdGlvbigwLCAwKQotCQotCSMgYmRiIGVudHJ5IHBvaW50cwotCQotIwlkZWYgdXNlcl9jYWxsKHNlbGYsIGZyYW1lLCBhcmd1bWVudF9saXN0KToKLSMJCXNlbGYucmVhc29uID0gJ0NhbGxpbmcnCi0jCQlzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lKQotCQotCWRlZiB1c2VyX2xpbmUoc2VsZiwgZnJhbWUpOgotCQkjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugc3RvcCBvciBicmVhayBhdCB0aGlzIGxpbmUKLQkJc2VsZi5yZWFzb24gPSAnU3RvcHBlZCcKLQkJc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKLQkKLQlkZWYgdXNlcl9yZXR1cm4oc2VsZiwgZnJhbWUsIHJldHVybl92YWx1ZSk6Ci0JCSMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBhIHJldHVybiB0cmFwIGlzIHNldCBoZXJlCi0JCWZuYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKLQkJaWYgZm5hbWUgPD4gJz8nOgotCQkJc2VsZi5yZWFzb24gPSAnUmV0dXJuaW5nIGZyb20gJXMoKScgJSBmcmFtZS5mX2NvZGUuY29fbmFtZQotCQkJZnJhbWUuZl9sb2NhbHNbJ19fcmV0dXJuX18nXSA9IHJldHVybl92YWx1ZQotCQllbGlmIGZyYW1lLmZfYmFjayBpcyBzZWxmLmJvdGZyYW1lOgotCQkJc2VsZi5yZWFzb24gPSAnRG9uZScKLQkJZWxzZToKLQkJCXNlbGYucmVhc29uID0gJ1JldHVybmluZycKLQkJc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSwgMSkKLQkKLQlkZWYgdXNlcl9leGNlcHRpb24oc2VsZiwgZnJhbWUsIChleGNfdHlwZSwgZXhjX3ZhbHVlLCBleGNfdHJhY2ViYWNrKSk6Ci0JCSMgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiB3ZSBzdG9wIG9yIGJyZWFrIGF0IHRoaXMgbGluZQotCQlzZWxmLnJlYXNvbiA9IHNlbGYuZm9ybWF0ZXhjZXB0aW9uKGV4Y190eXBlLCBleGNfdmFsdWUpCi0JCXNlbGYuaW50ZXJhY3Rpb24oZnJhbWUsIGV4Y190cmFjZWJhY2spCi0JCi0JZGVmIGZvcm1hdGV4Y2VwdGlvbihzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlKToKLQkJaWYgZXhjX3R5cGUgPT0gU3ludGF4RXJyb3I6Ci0JCQl0cnk6Ci0JCQkJdmFsdWUsIChmaWxlbmFtZSwgbGluZW5vLCBjaGFybm8sIGxpbmUpID0gZXhjX3ZhbHVlCi0JCQlleGNlcHQ6Ci0JCQkJcGFzcwotCQkJZWxzZToKLQkJCQlyZXR1cm4gc3RyKGV4Y190eXBlKSArICc6ICcgKyBzdHIodmFsdWUpCi0JCWlmIHR5cGUoZXhjX3R5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKLQkJCW5pY2UgPSBleGNfdHlwZS5fX25hbWVfXwotCQllbHNlOgotCQkJbmljZSA9IHN0cihleGNfdHlwZSkKLQkJdmFsdWUgPSBzdHIoZXhjX3ZhbHVlKQotCQlpZiBleGNfdmFsdWUgYW5kIHZhbHVlOgotCQkJbmljZSA9IG5pY2UgKyAiOiAiICsgdmFsdWUKLQkJcmV0dXJuIG5pY2UKLQkKLQlkZWYgZm9yZ2V0KHNlbGYpOgotCQlzZWxmLnN0YWNrID0gW10KLQkJc2VsZi5jdXJpbmRleCA9IDAKLQkJc2VsZi5jdXJmcmFtZSA9IE5vbmUKLQkKLQlkZWYgc2V0dXAoc2VsZiwgZiwgdCwgaXNyZXR1cm5pbmcgPSAwKToKLQkJc2VsZi5mb3JnZXQoKQotCQlzZWxmLnN0YWNrLCBzZWxmLmN1cmluZGV4ID0gc2VsZi5nZXRfc3RhY2soZiwgdCkKLQkJc2VsZi5jdXJmcmFtZSA9IHNlbGYuc3RhY2tbc2VsZi5jdXJpbmRleCAtIGlzcmV0dXJuaW5nXVswXQotCQotCWRlZiBpbnRlcmFjdGlvbihzZWxmLCBmcmFtZSwgdHJhY2ViYWNrLCBpc3JldHVybmluZyA9IDApOgotCQlzYXZlcG9ydCA9IFFkLkdldFBvcnQoKQotCQlzZWxmLncuc2VsZWN0KCkKLQkJdHJ5OgotCQkJc2VsZi5zZXR1cChmcmFtZSwgdHJhY2ViYWNrLCBpc3JldHVybmluZykKLQkJCXNlbGYuc2V0c3RhdGUoJ3N0b3BwZWQnKQotCQkJc3RhY2tpbmRleCA9IHNlbGYuY3VyaW5kZXgKLQkJCWlmIGlzcmV0dXJuaW5nOgotCQkJCWlmIGZyYW1lLmZfYmFjayBpcyBub3Qgc2VsZi5ib3RmcmFtZToKLQkJCQkJc3RhY2tpbmRleCA9IHN0YWNraW5kZXggLSAxCi0JCQlzZWxmLnNob3dzdGFjayhzdGFja2luZGV4KQotCQkJc2VsZi5zaG93ZnJhbWUoc3RhY2tpbmRleCkKLQkJCXNlbGYudy5wYXJlbnQuZGVidWdnZXJfbWFpbmxvb3AoKQotCQkJc2VsZi5mb3JnZXQoKQotCQlmaW5hbGx5OgotCQkJUWQuU2V0UG9ydChzYXZlcG9ydCkKLQkKLQkjIGJkYiBjdXN0b21pemF0aW9uCi0JCi0JZGVmIHRyYWNlX2Rpc3BhdGNoKHNlbGYsIGZyYW1lLCBldmVudCwgYXJnLCBUaWNrQ291bnQgPSBFdnQuVGlja0NvdW50KToKLQkJaWYgVGlja0NvdW50KCkgLSBzZWxmLnRyYWNpbmdtb25pdG9ydGltZSA+IDE1OgotCQkJc2VsZi50cmFjaW5nbW9uaXRvcnRpbWUgPSBUaWNrQ291bnQoKQotCQkJc2VsZi53LnBhbmVzLmJvdHRvbS50cmFjaW5nbW9uaXRvci50b2dnbGUoKQotCQl0cnk6Ci0JCQl0cnk6Ci0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKLQkJCQlpZiBzZWxmLnF1aXR0aW5nOgotCQkJCQkjIHJldHVybmluZyBOb25lIGlzIG5vdCBlbm91Z2gsIGEgZm9ybWVyIEJkYlF1aXQgZXhjZXB0aW9uCi0JCQkJCSMgbWlnaHQgaGF2ZSBiZWVuIGVhdGVuIGJ5IHRoZSBwcmludCBzdGF0ZW1lbnQKLQkJCQkJcmFpc2UgYmRiLkJkYlF1aXQKLQkJCQlpZiBldmVudCA9PSAnbGluZSc6Ci0JCQkJCXJldHVybiBzZWxmLmRpc3BhdGNoX2xpbmUoZnJhbWUpCi0JCQkJaWYgZXZlbnQgPT0gJ2NhbGwnOgotCQkJCQlyZXR1cm4gc2VsZi5kaXNwYXRjaF9jYWxsKGZyYW1lLCBhcmcpCi0JCQkJaWYgZXZlbnQgPT0gJ3JldHVybic6Ci0JCQkJCXJldHVybiBzZWxmLmRpc3BhdGNoX3JldHVybihmcmFtZSwgYXJnKQotCQkJCWlmIGV2ZW50ID09ICdleGNlcHRpb24nOgotCQkJCQlyZXR1cm4gc2VsZi5kaXNwYXRjaF9leGNlcHRpb24oZnJhbWUsIGFyZykKLQkJCQlwcmludCAnYmRiLkJkYi5kaXNwYXRjaDogdW5rbm93biBkZWJ1Z2dpbmcgZXZlbnQ6JywgcmVwcihldmVudCkKLQkJCQlyZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAotCQkJZmluYWxseToKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgotCQkJc2VsZi5zZXRfc3RlcCgpCi0JCQlyZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAotCQlleGNlcHQgYmRiLkJkYlF1aXQ6Ci0JCQlpZiBzZWxmLmNvbnRpbnVld2l0aG91dGRlYnVnZ2VyOgotCQkJCXNlbGYuY2xlYXJfdHJhY2VmdW5jcygpCi0JCQkJcmV0dXJuCi0JCQllbHNlOgotCQkJCXJhaXNlIGJkYi5CZGJRdWl0Ci0JCWV4Y2VwdDoKLQkJCXByaW50ICdYWFggRXhjZXB0aW9uIGR1cmluZyBkZWJ1Z2dlciBpbnRlcmFjdGlvbi4nLCBcCi0JCQkJCXNlbGYuZm9ybWF0ZXhjZXB0aW9uKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSkKLQkJCWltcG9ydCB0cmFjZWJhY2sKLQkJCXRyYWNlYmFjay5wcmludF9leGMoKQotCQkJcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKLQkKLQlkZWYgZGlzcGF0Y2hfY2FsbChzZWxmLCBmcmFtZSwgYXJnKToKLQkJaWYgbm90IHNlbGYudHJhY2VtYWdpYyBhbmQgXAotCQkJCWZyYW1lLmZfY29kZS5jb19uYW1lWzoyXSA9PSAnX18nID09IGZyYW1lLmZfY29kZS5jb19uYW1lWy0yOl0gYW5kIFwKLQkJCQlmcmFtZS5mX2NvZGUuY29fbmFtZSA8PiAnX19pbml0X18nOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYuYm90ZnJhbWUgaXMgTm9uZToKLQkJCSMgRmlyc3QgY2FsbCBvZiBkaXNwYXRjaCBzaW5jZSByZXNldCgpCi0JCQlzZWxmLmJvdGZyYW1lID0gZnJhbWUuZl9iYWNrCSMgeHh4ICEhISBhZGRlZCBmX2JhY2sKLQkJCXJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCi0JCWlmIG5vdCAoc2VsZi5zdG9wX2hlcmUoZnJhbWUpIG9yIHNlbGYuYnJlYWtfYW55d2hlcmUoZnJhbWUpKToKLQkJCSMgTm8gbmVlZCB0byB0cmFjZSB0aGlzIGZ1bmN0aW9uCi0JCQlyZXR1cm4gIyBOb25lCi0JCXNlbGYudXNlcl9jYWxsKGZyYW1lLCBhcmcpCi0JCWlmIHNlbGYucXVpdHRpbmc6Ci0JCQlyYWlzZSBiZGIuQmRiUXVpdAotCQlyZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAotCQotCWRlZiBzZXRfY29udGludWUoc2VsZik6Ci0JCSMgRG9uJ3Qgc3RvcCBleGNlcHQgYXQgYnJlYWtwb2ludHMgb3Igd2hlbiBmaW5pc2hlZAotCQlzZWxmLnN0b3BmcmFtZSA9IHNlbGYuYm90ZnJhbWUKLQkJc2VsZi5yZXR1cm5mcmFtZSA9IE5vbmUKLQkJc2VsZi5xdWl0dGluZyA9IDAKLQkJIyB1bmxpa2UgaW4gYmRiL3BkYiwgdGhlcmUncyBhIGNoYW5jZSB0aGF0IGJyZWFrcG9pbnRzIGNoYW5nZSAKLQkJIyAqd2hpbGUqIGEgcHJvZ3JhbSAodGhpcyBwcm9ncmFtIDstKSBpcyBydW5uaW5nLiBJdCdzIGFjdHVhbGx5IHF1aXRlIGxpa2VseS4KLQkJIyBTbyB3ZSBkb24ndCBkZWxldGUgZnJhbWUuZl90cmFjZSB1bnRpbCB0aGUgYm90dG9tIGZyYW1lIGlmIHRoZXJlIGFyZSBubyBicmVha3BvaW50cy4KLQkKLQlkZWYgc2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotCQlpZiBub3Qgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQlzZWxmLmJyZWFrc1tmaWxlbmFtZV0gPSBbXQotCQlsaXN0ID0gc2VsZi5icmVha3NbZmlsZW5hbWVdCi0JCWlmIGxpbmVubyBpbiBsaXN0OgotCQkJcmV0dXJuICdUaGVyZSBpcyBhbHJlYWR5IGEgYnJlYWtwb2ludCB0aGVyZSEnCi0JCWxpc3QuYXBwZW5kKGxpbmVubykKLQkJbGlzdC5zb3J0KCkJIyBJIHdhbnQgdG8ga2VlcCB0aGVtIG5lYXRseSBzb3J0ZWQ7IGVhc2llciBmb3IgZHJhd2luZwotCQlpZiBoYXNhdHRyKGJkYiwgIkJyZWFrcG9pbnQiKToKLQkJCSMgMS41LjJiMSBzcGVjaWZpYwotCQkJYnAgPSBiZGIuQnJlYWtwb2ludChmaWxlbmFtZSwgbGluZW5vLCAwLCBOb25lKQotCQlzZWxmLnVwZGF0ZV9icmVha3MoZmlsZW5hbWUpCi0JCi0JZGVmIGNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotCQliZGIuQmRiLmNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCi0JCXNlbGYudXBkYXRlX2JyZWFrcyhmaWxlbmFtZSkKLQkKLQlkZWYgY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKHNlbGYsIGZpbGVuYW1lKToKLQkJYmRiLkJkYi5jbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpCi0JCXNlbGYudXBkYXRlX2JyZWFrcyhmaWxlbmFtZSkKLQkKLQlkZWYgY2xlYXJfYWxsX2JyZWFrcyhzZWxmKToKLQkJYmRiLkJkYi5jbGVhcl9hbGxfYnJlYWtzKHNlbGYpCi0JCWZvciBlZGl0b3JzIGluIHNlbGYuZWRpdG9ycy52YWx1ZXMoKToKLQkJCWZvciBlZGl0b3IgaW4gZWRpdG9yczoKLQkJCQllZGl0b3IuZHJhd2JyZWFrcG9pbnRzKCkKLQkKLQkjIHNwZWNpYWwKLQkKLQlkZWYgdG9nZ2xlX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgotCQlpZiBzZWxmLmdldF9icmVhayhmaWxlbmFtZSwgbGluZW5vKToKLQkJCXNlbGYuY2xlYXJfYnJlYWsoZmlsZW5hbWUsIGxpbmVubykKLQkJZWxzZToKLQkJCXNlbGYuc2V0X2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pCi0JCi0JZGVmIGNsZWFyX2JyZWFrc19hYm92ZShzZWxmLCBmaWxlbmFtZSwgYWJvdmUpOgotCQlpZiBub3Qgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQlyZXR1cm4gJ1RoZXJlIGFyZSBubyBicmVha3BvaW50cyBpbiB0aGF0IGZpbGUhJwotCQlmb3IgbGluZW5vIGluIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXVs6XToKLQkJCWlmIGxpbmVubyA+IGFib3ZlOgotCQkJCXNlbGYuYnJlYWtzW2ZpbGVuYW1lXS5yZW1vdmUobGluZW5vKQotCQlpZiBub3Qgc2VsZi5icmVha3NbZmlsZW5hbWVdOgotCQkJZGVsIHNlbGYuYnJlYWtzW2ZpbGVuYW1lXQotCQotCSMgZWRpdG9yIHN0dWZmCi0JCi0JZGVmIHVwZGF0ZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgotCQlpZiBzZWxmLmJyZWFrc3ZpZXdlcjoKLQkJCXNlbGYuYnJlYWtzdmlld2VyLnVwZGF0ZSgpCi0JCWlmIHNlbGYuZWRpdG9ycy5oYXNfa2V5KGZpbGVuYW1lKToKLQkJCWZvciBlZGl0b3IgaW4gc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKLQkJCQlpZiBlZGl0b3IuX2RlYnVnZ2VyOgkjIFhYWAotCQkJCQllZGl0b3IuZHJhd2JyZWFrcG9pbnRzKCkKLQkJCQllbHNlOgotCQkJCQlwcmludCAneHh4IGRlYWQgZWRpdG9yIScKLQkKLQlkZWYgdXBkYXRlX2FsbGJyZWFrcyhzZWxmKToKLQkJaWYgc2VsZi5icmVha3N2aWV3ZXI6Ci0JCQlzZWxmLmJyZWFrc3ZpZXdlci51cGRhdGUoKQotCQlmb3IgZmlsZW5hbWUgaW4gc2VsZi5icmVha3Mua2V5cygpOgotCQkJaWYgc2VsZi5lZGl0b3JzLmhhc19rZXkoZmlsZW5hbWUpOgotCQkJCWZvciBlZGl0b3IgaW4gc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKLQkJCQkJaWYgZWRpdG9yLl9kZWJ1Z2dlcjoJIyBYWFgKLQkJCQkJCWVkaXRvci5kcmF3YnJlYWtwb2ludHMoKQotCQkJCQllbHNlOgotCQkJCQkJcHJpbnQgJ3h4eCBkZWFkIGVkaXRvciEnCi0JCi0JZGVmIHJlZ2lzdGVyX2VkaXRvcihzZWxmLCBlZGl0b3IsIGZpbGVuYW1lKToKLQkJaWYgbm90IGZpbGVuYW1lOgotCQkJcmV0dXJuCi0JCWlmIG5vdCBzZWxmLmVkaXRvcnMuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQlzZWxmLmVkaXRvcnNbZmlsZW5hbWVdID0gW2VkaXRvcl0KLQkJZWxpZiBlZGl0b3Igbm90IGluIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV06Ci0JCQlzZWxmLmVkaXRvcnNbZmlsZW5hbWVdLmFwcGVuZChlZGl0b3IpCi0JCi0JZGVmIHVucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIGVkaXRvciwgZmlsZW5hbWUpOgotCQlpZiBub3QgZmlsZW5hbWU6Ci0JCQlyZXR1cm4KLQkJdHJ5OgotCQkJc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXS5yZW1vdmUoZWRpdG9yKQotCQkJaWYgbm90IHNlbGYuZWRpdG9yc1tmaWxlbmFtZV06Ci0JCQkJZGVsIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV0KLQkJCQkjIGlmIHRoaXMgd2FzIGFuIHVudGl0bGVkIHdpbmRvdywgY2xlYXIgdGhlIGJyZWFrcy4KLQkJCQlpZiBmaWxlbmFtZVs6MV0gPT0gJzwnIGFuZCBmaWxlbmFtZVstMTpdID09ICc+JyBhbmQgXAotCQkJCQkJc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6Ci0JCQkJCXNlbGYuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQotCQlleGNlcHQgKEtleUVycm9yLCBWYWx1ZUVycm9yKToKLQkJCXBhc3MKLQkJCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUgPSAnRGVidWdnZXInKToKKyAgICAgICAgYmRiLkJkYi5fX2luaXRfXyhzZWxmKQorICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgc2VsZi50aXRsZSA9IHRpdGxlCisgICAgICAgIHNlbGYuYnJlYWtzdmlld2VyID0gTm9uZQorICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgc2VsZi50cmFjaW5nID0gMAorICAgICAgICBzZWxmLnRyYWNpbmdtb25pdG9ydGltZSA9IEV2dC5UaWNrQ291bnQoKQorICAgICAgICBzZWxmLmVkaXRvcnMgPSB7fQorCisgICAgICAgIHByZWZzID0gVy5nZXRhcHBsaWNhdGlvbigpLmdldHByZWZzKCkKKyAgICAgICAgaWYgcHJlZnMuZGVidWdnZXI6CisgICAgICAgICAgICBmb3IgZmlsZSwgYnJlYWtzIGluIHByZWZzLmRlYnVnZ2VyLmJyZWFrcy5pdGVtcygpOgorICAgICAgICAgICAgICAgIGZvciBiIGluIGJyZWFrczoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5zZXRfYnJlYWsoZmlsZSwgYikKKyAgICAgICAgICAgIHNlbGYuYm91bmRzLCBzZWxmLmhvcnBhbmVzLCBzZWxmLnZlcnBhbmVzID0gcHJlZnMuZGVidWdnZXIud2luZG93c2V0dGluZ3MKKyAgICAgICAgICAgIHNlbGYudHJhY2VtYWdpYyA9IHByZWZzLmRlYnVnZ2VyLnRyYWNlbWFnaWMKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnJlYWtzID0ge30KKyAgICAgICAgICAgIHNlbGYuaG9ycGFuZXMgPSAoMC40LCAwLjYpCisgICAgICAgICAgICBzZWxmLnZlcnBhbmVzID0gKDAuMywgMC4zNSwgMC4zNSkKKyAgICAgICAgICAgIHNlbGYuYm91bmRzID0gKDYwMCwgNDAwKQorICAgICAgICAgICAgc2VsZi50cmFjZW1hZ2ljID0gMAorICAgICAgICBzZWxmLmxhc3RzdGFja3NlbCA9IE5vbmUKKworICAgIGRlZiBjYW5vbmljKHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgIyBvdmVycmlkZTogdGhlIHByb3ZpZGVkIGNhbm9uaWMoKSBtZXRob2QgYnJlYWtzIG91cgorICAgICAgICAjIGZpbGUtbGVzcyBVbnRpdGxlZCB3aW5kb3dzCisgICAgICAgIHJldHVybiBmaWxlbmFtZQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBzZWxmLmN1cnJlbnRmcmFtZSA9IE5vbmUKKyAgICAgICAgc2VsZi5maWxlID0gTm9uZQorICAgICAgICBzZWxmLmxhc3RzdGFjayA9IE5vbmUKKyAgICAgICAgc2VsZi5yZWFzb24gPSAnTm90IHJ1bm5pbmcnCisgICAgICAgIHNlbGYuY29udGludWV3aXRob3V0ZGVidWdnZXIgPSAwCisgICAgICAgIGJkYi5CZGIucmVzZXQoc2VsZikKKyAgICAgICAgc2VsZi5mb3JnZXQoKQorCisgICAgZGVmIHN0YXJ0KHNlbGYsIGJvdHRvbWZyYW1lID0gTm9uZSwgcnVubmluZyA9IDApOgorICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkuRGVidWdnZXJRdWl0ID0gYmRiLkJkYlF1aXQKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IE1lbnUKKyAgICAgICAgTWVudS5IaWxpdGVNZW51KDApCisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5zZXR1cHdpZGdldHMoc2VsZi50aXRsZSkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICBpZiBub3Qgc2VsZi53LnBhcmVudC5kZWJ1Z2dlcl9xdWl0dGluZzoKKyAgICAgICAgICAgIHNlbGYudy5zZWxlY3QoKQorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAnVGhlcmUgaXMgYW5vdGhlciBkZWJ1Z2dlciBzZXNzaW9uIGJ1c3kuJworICAgICAgICBzZWxmLnJlc2V0KCkKKyAgICAgICAgc2VsZi5ib3RmcmFtZSA9IGJvdHRvbWZyYW1lCisgICAgICAgIGlmIHJ1bm5pbmc6CisgICAgICAgICAgICBzZWxmLnNldF9jb250aW51ZSgpCisgICAgICAgICAgICBzZWxmLnJlYXNvbiA9ICdSdW5uaW5nXHhjOScKKyAgICAgICAgICAgIHNlbGYuc2V0c3RhdGUoJ3J1bm5pbmcnKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfc3RlcCgpCisgICAgICAgICAgICBzZWxmLnJlYXNvbiA9ICdzdG9wcGVkJworICAgICAgICAgICAgc2VsZi5zZXRzdGF0ZSgnc3RvcHBlZCcpCisgICAgICAgIHN5cy5zZXR0cmFjZShzZWxmLnRyYWNlX2Rpc3BhdGNoKQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIHNlbGYuc2V0X3F1aXQoKQorICAgICAgICBpZiBzZWxmLncucGFyZW50OgorICAgICAgICAgICAgc2VsZi5leGl0X21haW5sb29wKCkKKyAgICAgICAgICAgIHNlbGYucmVzZXR3aWRnZXRzKCkKKworICAgIGRlZiBzZXRfY29udGludWVfd2l0aG91dF9kZWJ1Z2dlcihzZWxmKToKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIHNlbGYuc2V0X3F1aXQoKQorICAgICAgICBzZWxmLmNsZWFyX3RyYWNlZnVuY3MoKQorICAgICAgICBzZWxmLmNvbnRpbnVld2l0aG91dGRlYnVnZ2VyID0gMQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJ3IikgYW5kIHNlbGYudy5wYXJlbnQ6CisgICAgICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorICAgICAgICAgICAgc2VsZi5yZXNldHdpZGdldHMoKQorCisgICAgZGVmIGNsZWFyX3RyYWNlZnVuY3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJhaXNlICdzcGFtJworICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIGZyYW1lID0gc3lzLmV4Y190cmFjZWJhY2sudGJfZnJhbWUKKyAgICAgICAgd2hpbGUgZnJhbWUgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBkZWwgZnJhbWUuZl90cmFjZQorICAgICAgICAgICAgZnJhbWUgPSBmcmFtZS5mX2JhY2sKKworICAgIGRlZiBwb3N0bW9ydGVtKHNlbGYsIGV4Y190eXBlLCBleGNfdmFsdWUsIHRyYWNlYmFjayk6CisgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgc2VsZi5zZXR1cHdpZGdldHMoc2VsZi50aXRsZSkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICBpZiBub3Qgc2VsZi53LnBhcmVudC5kZWJ1Z2dlcl9xdWl0dGluZzoKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgJ1RoZXJlIGlzIGFub3RoZXIgZGVidWdnZXIgc2Vzc2lvbiBidXN5LicKKyAgICAgICAgc2VsZi5yZXNldCgpCisgICAgICAgIGlmIHRyYWNlYmFjazoKKyAgICAgICAgICAgIHNlbGYuYm90ZnJhbWUgPSB0cmFjZWJhY2sudGJfZnJhbWUKKyAgICAgICAgICAgIHdoaWxlIHRyYWNlYmFjay50Yl9uZXh0IDw+IE5vbmU6CisgICAgICAgICAgICAgICAgdHJhY2ViYWNrID0gdHJhY2ViYWNrLnRiX25leHQKKyAgICAgICAgICAgIGZyYW1lID0gdHJhY2ViYWNrLnRiX2ZyYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLmJvdGZyYW1lID0gTm9uZQorICAgICAgICAgICAgZnJhbWUgPSBOb25lCisgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICBzZWxmLnJlYXNvbiA9ICcoZGVhZCkgJyArIHNlbGYuZm9ybWF0ZXhjZXB0aW9uKGV4Y190eXBlLCBleGNfdmFsdWUpCisgICAgICAgIHNlbGYudy5zZWxlY3QoKQorICAgICAgICBzZWxmLnNldHVwKGZyYW1lLCB0cmFjZWJhY2spCisgICAgICAgIHNlbGYuc2V0c3RhdGUoJ2RlYWQnKQorICAgICAgICBzZWxmLnNob3dzdGFjayhzZWxmLmN1cmluZGV4KQorICAgICAgICBzZWxmLnNob3dmcmFtZShzZWxmLmN1cmluZGV4KQorCisgICAgZGVmIHNldHVwd2lkZ2V0cyhzZWxmLCB0aXRsZSk6CisgICAgICAgIHNlbGYudyA9IHcgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgdGl0bGUsIG1pbnNpemUgPSAoNTAwLCAzMDApKQorCisgICAgICAgIHcucGFuZXMgPSBXLkhvcml6b250YWxQYW5lcygoOCwgNCwgLTgsIC04KSwgc2VsZi5ob3JwYW5lcykKKworICAgICAgICB3LnBhbmVzLmJyb3dzZXJwYW5lcyA9IGJyb3dzZXJwYW5lcyA9IFcuVmVydGljYWxQYW5lcyhOb25lLCBzZWxmLnZlcnBhbmVzKQorCisgICAgICAgIGJyb3dzZXJwYW5lcy5zdGFja2xpc3QgPSBXLkdyb3VwKE5vbmUpCisgICAgICAgIGJyb3dzZXJwYW5lcy5zdGFja2xpc3QudGl0bGUgPSBXLlRleHRCb3goKDQsIDAsIDAsIDEyKSwgJ1N0YWNrJykKKyAgICAgICAgYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjayA9IFcuTGlzdCgoMCwgMTYsIDAsIDApLCBjYWxsYmFjayA9IHNlbGYuZG9fc3RhY2ssIGZsYWdzID0gTGlzdHMubE9ubHlPbmUpCisKKyAgICAgICAgYnJvd3NlcnBhbmVzLmxvY2FscyA9IFcuR3JvdXAoTm9uZSkKKyAgICAgICAgYnJvd3NlcnBhbmVzLmxvY2Fscy50aXRsZSA9IFcuVGV4dEJveCgoNCwgMCwgMCwgMTIpLCAnTG9jYWwgdmFyaWFibGVzJykKKyAgICAgICAgYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyID0gUHlCcm93c2VyLkJyb3dzZXJXaWRnZXQoKDAsIDE2LCAwLCAwKSkKKworICAgICAgICBicm93c2VycGFuZXMuZ2xvYmFscyA9IFcuR3JvdXAoTm9uZSkKKyAgICAgICAgYnJvd3NlcnBhbmVzLmdsb2JhbHMudGl0bGUgPSBXLlRleHRCb3goKDQsIDAsIDAsIDEyKSwgJ0dsb2JhbCB2YXJpYWJsZXMnKQorICAgICAgICBicm93c2VycGFuZXMuZ2xvYmFscy5icm93c2VyID0gUHlCcm93c2VyLkJyb3dzZXJXaWRnZXQoKDAsIDE2LCAwLCAwKSkKKworICAgICAgICB3LnBhbmVzLmJvdHRvbSA9IGJvdHRvbSA9IFcuR3JvdXAoTm9uZSkKKyAgICAgICAgYm90dG9tLnNyYyA9IHNyYyA9IFcuR3JvdXAoKDAsIDY0LCAwLCAwKSkKKyAgICAgICAgc291cmNlID0gU291cmNlVmlld2VyKCgxLCAxLCAtMTUsIC0xNSksIHJlYWRvbmx5ID0gMSwgZGVidWdnZXIgPSBzZWxmKQorICAgICAgICBzcmMub3B0aW9uc21lbnUgPSBXLlBvcHVwTWVudSgoLTE2LCAwLCAxNiwgMTYpLCBbXSkKKyAgICAgICAgc3JjLm9wdGlvbnNtZW51LmJpbmQoJzxjbGljaz4nLCBzZWxmLm1ha2VvcHRpb25zbWVudSkKKworICAgICAgICBzcmMuX2JhcnggPSBXLlNjcm9sbGJhcigoMCwgLTE2LCAtMTUsIDE2KSwgc291cmNlLmhzY3JvbGwsIG1heCA9IDMyNzY3KQorICAgICAgICBzcmMuX2JhcnkgPSBXLlNjcm9sbGJhcigoLTE2LCAxNSwgMTYsIC0xNSksIHNvdXJjZS52c2Nyb2xsLCBtYXggPSAzMjc2NykKKyAgICAgICAgc3JjLnNvdXJjZSA9IHNvdXJjZQorICAgICAgICBzcmMuZnJhbWUgPSBXLkZyYW1lKCgwLCAwLCAtMTUsIC0xNSkpCisKKyAgICAgICAgYm90dG9tLnRyYWNpbmdtb25pdG9yID0gVHJhY2luZ01vbml0b3IoKDAsIDIzLCA2LCA2KSkKKyAgICAgICAgYm90dG9tLnN0YXRlID0gVy5UZXh0Qm94KCgxMiwgMjQsIDAsIDE2KSwgc2VsZi5yZWFzb24pCisKKyAgICAgICAgYm90dG9tLnNyY3RpdGxlID0gVy5UZXh0Qm94KCgxMiwgNDQsIDAsIDE2KSkKKyAgICAgICAgYm90dG9tLmJ1dHRvbnMgPSBidXR0b25zID0gVy5Hcm91cCgoMTIsIDAsIDAsIDIwKSkKKworICAgICAgICBidXR0b25zLnJ1bmJ1dHRvbiA9IFcuQnV0dG9uKCgwLCAwLCA1MCwgMTYpLCAiUnVuIiwgc2VsZi5kb19ydW4pCisgICAgICAgIGJ1dHRvbnMuc3RvcGJ1dHRvbiA9IFcuQnV0dG9uKCg1OCwgMCwgNTAsIDE2KSwgIlN0b3AiLCBzZWxmLmRvX3N0b3ApCisgICAgICAgIGJ1dHRvbnMua2lsbGJ1dHRvbiA9IFcuQnV0dG9uKCgxMTYsIDAsIDUwLCAxNiksICJLaWxsIiwgc2VsZi5kb19raWxsKQorICAgICAgICBidXR0b25zLmxpbmUgPSBXLlZlcnRpY2FsTGluZSgoMTczLCAwLCAwLCAwKSkKKyAgICAgICAgYnV0dG9ucy5zdGVwYnV0dG9uID0gVy5CdXR0b24oKDE4MSwgMCwgNjAsIDE2KSwgIlN0ZXAiLCBzZWxmLmRvX3N0ZXApCisgICAgICAgIGJ1dHRvbnMuc3RlcGluYnV0dG9uID0gVy5CdXR0b24oKDI0OSwgMCwgNjAsIDE2KSwgIlN0ZXAgaW4iLCBzZWxmLmRvX3N0ZXBpbikKKyAgICAgICAgYnV0dG9ucy5zdGVwb3V0YnV0dG9uID0gVy5CdXR0b24oKDMxNywgMCwgNjAsIDE2KSwgIlN0ZXAgb3V0Iiwgc2VsZi5kb19zdGVwb3V0KQorCisgICAgICAgIHcuYmluZCgnY21kcicsIGJ1dHRvbnMucnVuYnV0dG9uLnB1c2gpCisgICAgICAgIHcuYmluZCgnY21kLicsIGJ1dHRvbnMuc3RvcGJ1dHRvbi5wdXNoKQorICAgICAgICB3LmJpbmQoJ2NtZGsnLCBidXR0b25zLmtpbGxidXR0b24ucHVzaCkKKyAgICAgICAgdy5iaW5kKCdjbWRzJywgYnV0dG9ucy5zdGVwYnV0dG9uLnB1c2gpCisgICAgICAgIHcuYmluZCgnY21kdCcsIGJ1dHRvbnMuc3RlcGluYnV0dG9uLnB1c2gpCisgICAgICAgIHcuYmluZCgnY21kdScsIGJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5wdXNoKQorCisgICAgICAgIHcuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCisKKyAgICAgICAgdy5vcGVuKCkKKyAgICAgICAgdy54eHhfX19zZWxlY3Qody5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZSkKKworICAgIGRlZiBtYWtlb3B0aW9uc21lbnUoc2VsZik6CisgICAgICAgIG9wdGlvbnMgPSBbKCdDbGVhciBicmVha3BvaW50cycsIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5jbGVhcmJyZWFrcG9pbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnQ2xlYXIgYWxsIGJyZWFrcG9pbnRzJywgc2VsZi5jbGVhcl9hbGxfYnJlYWtzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgnRWRpdCBicmVha3BvaW50c1x4YzknLCBzZWxmLmVkaXRfYnJlYWtzKSwgJy0nLAorICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYudHJhY2VtYWdpYyBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ0Rpc2FibGUgX19tYWdpY19fIHRyYWNpbmcnIG9yICdFbmFibGUgX19tYWdpY19fIHRyYWNpbmcnLCBzZWxmLnRvZ2dsZW1hZ2ljKV0KKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMub3B0aW9uc21lbnUuc2V0KG9wdGlvbnMpCisKKyAgICBkZWYgZWRpdF9icmVha3Moc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnJlYWtzdmlld2VyOgorICAgICAgICAgICAgc2VsZi5icmVha3N2aWV3ZXIuc2VsZWN0KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYnJlYWtzdmlld2VyID0gQnJlYWtwb2ludHNWaWV3ZXIoc2VsZikKKworICAgIGRlZiB0b2dnbGVtYWdpYyhzZWxmKToKKyAgICAgICAgc2VsZi50cmFjZW1hZ2ljID0gbm90IHNlbGYudHJhY2VtYWdpYworCisgICAgZGVmIHNldHN0YXRlKHNlbGYsIHN0YXRlKToKKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS50cmFjaW5nbW9uaXRvci5yZXNldCgpCisgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3RhdGUuc2V0KHNlbGYucmVhc29uKQorICAgICAgICBidXR0b25zID0gc2VsZi53LnBhbmVzLmJvdHRvbS5idXR0b25zCisgICAgICAgIGlmIHN0YXRlID09ICdzdG9wcGVkJzoKKyAgICAgICAgICAgIGJ1dHRvbnMucnVuYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgYnV0dG9ucy5zdG9wYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwaW5idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0ZXBvdXRidXR0b24uZW5hYmxlKDEpCisgICAgICAgIGVsaWYgc3RhdGUgPT0gJ3J1bm5pbmcnOgorICAgICAgICAgICAgYnV0dG9ucy5ydW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0b3BidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLmtpbGxidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBidXR0b25zLnN0ZXBidXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0ZXBpbmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcG91dGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgZWxpZiBzdGF0ZSA9PSAnaWRsZSc6CisgICAgICAgICAgICBidXR0b25zLnJ1bmJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RvcGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMua2lsbGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcGJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGJ1dHRvbnMuc3RlcGluYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwb3V0YnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBlbGlmIHN0YXRlID09ICdkZWFkJzoKKyAgICAgICAgICAgIGJ1dHRvbnMucnVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdG9wYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5raWxsYnV0dG9uLmVuYWJsZSgxKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICAgICAgYnV0dG9ucy5zdGVwaW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBidXR0b25zLnN0ZXBvdXRidXR0b24uZW5hYmxlKDApCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAndW5rbm93biBzdGF0ZTonLCBzdGF0ZQorCisgICAgZGVmIHJlc2V0d2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi5yZWFzb24gPSAnJworICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyY3RpdGxlLnNldCgnJykKKyAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldCgnJykKKyAgICAgICAgc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5zdGFja2xpc3Quc3RhY2suc2V0KFtdKQorICAgICAgICBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyLnNldCh7fSkKKyAgICAgICAgc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5nbG9iYWxzLmJyb3dzZXIuc2V0KHt9KQorICAgICAgICBzZWxmLnNldHN0YXRlKCdpZGxlJykKKworICAgICMgVyBjYWxsYmFja3MKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5zZXRfcXVpdCgpCisgICAgICAgIHNlbGYuZXhpdF9tYWlubG9vcCgpCisgICAgICAgIHNlbGYuY2xvc2VkID0gMQorCisgICAgICAgIHNlbGYudW5yZWdpc3Rlcl9lZGl0b3Ioc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLmZpbGUpCisgICAgICAgIHNlbGYuaG9ycGFuZXMgPSBzZWxmLncucGFuZXMuZ2V0cGFuZXNpemVzKCkKKyAgICAgICAgc2VsZi52ZXJwYW5lcyA9IHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuZ2V0cGFuZXNpemVzKCkKKyAgICAgICAgc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKKyAgICAgICAgcHJlZnMgPSBXLmdldGFwcGxpY2F0aW9uKCkuZ2V0cHJlZnMoKQorICAgICAgICBwcmVmcy5kZWJ1Z2dlci5icmVha3MgPSBzZWxmLmJyZWFrcworICAgICAgICBwcmVmcy5kZWJ1Z2dlci53aW5kb3dzZXR0aW5ncyA9IHNlbGYuYm91bmRzLCBzZWxmLmhvcnBhbmVzLCBzZWxmLnZlcnBhbmVzCisgICAgICAgIHByZWZzLmRlYnVnZ2VyLnRyYWNlbWFnaWMgPSBzZWxmLnRyYWNlbWFnaWMKKyAgICAgICAgcHJlZnMuc2F2ZSgpCisKKyAgICAjIHN0YWNrIGxpc3QgY2FsbGJhY2sKKworICAgIGRlZiBkb19zdGFjayhzZWxmLCBpc2RibCk6CisgICAgICAgIHNlbCA9IHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLmdldHNlbGVjdGlvbigpCisgICAgICAgIGlmIGlzZGJsOgorICAgICAgICAgICAgaWYgc2VsOgorICAgICAgICAgICAgICAgIGZyYW1lLCBsaW5lbm8gPSBzZWxmLnN0YWNrW3NlbFswXSArIDFdCisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgICAgICBlZGl0b3IgPSBzZWxmLncuX3BhcmVudHdpbmRvdy5wYXJlbnQub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuYnJlYWtzLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICBlZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBzZWwgYW5kIHNlbCA8PiBzZWxmLmxhc3RzdGFja3NlbDoKKyAgICAgICAgICAgICAgICBzZWxmLnNob3dmcmFtZShzZWxbMF0gKyAxKQorICAgICAgICAgICAgc2VsZi5sYXN0c3RhY2tzZWwgPSBzZWwKKworICAgIGRlZiBnZXRlZGl0b3Ioc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBpZiBmaWxlbmFtZVs6MV0gPT0gJzwnIGFuZCBmaWxlbmFtZVstMTpdID09ICc+JzoKKyAgICAgICAgICAgIGVkaXRvciA9IFcuZ2V0YXBwbGljYXRpb24oKS5nZXRzY3JpcHQoZmlsZW5hbWVbMTotMV0pCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBlZGl0b3IgPSBXLmdldGFwcGxpY2F0aW9uKCkuZ2V0c2NyaXB0KGZpbGVuYW1lKQorICAgICAgICByZXR1cm4gZWRpdG9yCisKKyAgICAjIGJ1dHRvbiBjYWxsYmFja3MKKworICAgIGRlZiBkb19ydW4oc2VsZik6CisgICAgICAgIHNlbGYucnVubmluZygpCisgICAgICAgIHNlbGYuc2V0X2NvbnRpbnVlKCkKKyAgICAgICAgc2VsZi5leGl0X21haW5sb29wKCkKKworICAgIGRlZiBkb19zdG9wKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9zdGVwKCkKKworICAgIGRlZiBkb19raWxsKHNlbGYpOgorICAgICAgICBzZWxmLnNldF9xdWl0KCkKKyAgICAgICAgc2VsZi5leGl0X21haW5sb29wKCkKKyAgICAgICAgc2VsZi5yZXNldHdpZGdldHMoKQorCisgICAgZGVmIGRvX3N0ZXAoc2VsZik6CisgICAgICAgIHNlbGYucnVubmluZygpCisgICAgICAgIHNlbGYuc2V0X25leHQoc2VsZi5jdXJmcmFtZSkKKyAgICAgICAgc2VsZi5leGl0X21haW5sb29wKCkKKworICAgIGRlZiBkb19zdGVwaW4oc2VsZik6CisgICAgICAgIHNlbGYucnVubmluZygpCisgICAgICAgIHNlbGYuc2V0X3N0ZXAoKQorICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorCisgICAgZGVmIGRvX3N0ZXBvdXQoc2VsZik6CisgICAgICAgIHNlbGYucnVubmluZygpCisgICAgICAgIHNlbGYuc2V0X3JldHVybihzZWxmLmN1cmZyYW1lKQorICAgICAgICBzZWxmLmV4aXRfbWFpbmxvb3AoKQorCisgICAgZGVmIHJ1bm5pbmcoc2VsZik6CisgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIHNlbGYucmVhc29uID0gJ1J1bm5pbmdceGM5JworICAgICAgICBzZWxmLnNldHN0YXRlKCdydW5uaW5nJykKKyAgICAgICAgI3NlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoJycpCisgICAgICAgICNzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXQoW10pCisgICAgICAgICNzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLmxvY2Fscy5icm93c2VyLnNldCh7fSkKKyAgICAgICAgI3NlbGYudy5wYW5lcy5icm93c2VycGFuZXMuZ2xvYmFscy5icm93c2VyLnNldCh7fSkKKworICAgIGRlZiBleGl0X21haW5sb29wKHNlbGYpOgorICAgICAgICBzZWxmLncucGFyZW50LmRlYnVnZ2VyX3F1aXR0aW5nID0gMQorCisgICAgIworCisgICAgZGVmIHNob3dmcmFtZShzZWxmLCBzdGFja2luZGV4KToKKyAgICAgICAgKGZyYW1lLCBsaW5lbm8pID0gc2VsZi5zdGFja1tzdGFja2luZGV4XQorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBmaWxlbmFtZSA9IGZyYW1lLmZfY29kZS5jb19maWxlbmFtZQorICAgICAgICBpZiBmaWxlbmFtZSA8PiBzZWxmLmZpbGU6CisgICAgICAgICAgICBlZGl0b3IgPSBzZWxmLmdldGVkaXRvcihmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIGVkaXRvcjoKKyAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KGVkaXRvci5nZXQoKSwgZmlsZW5hbWUpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZiA9IG9wZW4oZmlsZW5hbWUsICdyVScpCisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBmLnJlYWQoKQorICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWVbLTM6XSA9PSAnLnB5JzoKKyAgICAgICAgICAgICAgICAgICAgICAgIGltcG9ydCBpbXAKKyAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKVs6LTNdCisgICAgICAgICAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiwgZmlsZW5hbWUsIChzdWZmLCBtb2RlLCBkdW1teSkgPSBpbXAuZmluZF9tb2R1bGUobW9kbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdCBJbXBvcnRFcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCJjYW4ndCBmaW5kIGZpbGUiKQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmIGFuZCBzdWZmID09ICcucHknOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmID0gb3BlbihmaWxlbmFtZSwgJ3JVJykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KGRhdGEsIGZpbGVuYW1lKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXQoImNhbid0IGZpbmQgZmlsZSIpCisgICAgICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuYm90dG9tLnNyYy5zb3VyY2Uuc2V0KCJjYW4ndCBmaW5kIGZpbGUiKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGRhdGEgPSBkYXRhLnJlcGxhY2UoJ1xuJywgJ1xyJykKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNldChkYXRhLCBmaWxlbmFtZSkKKyAgICAgICAgICAgIHNlbGYuZmlsZSA9IGZpbGVuYW1lCisgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjdGl0bGUuc2V0KCdTb3VyY2U6ICcgKyBmaWxlbmFtZSArICgobGluZW5vID4gMCkgYW5kICgnIChsaW5lICVkKScgJSBsaW5lbm8pIG9yICcgJykpCisgICAgICAgIHNlbGYuZ290b19saW5lKGxpbmVubykKKyAgICAgICAgc2VsZi5saW5lbm8gPSBsaW5lbm8KKyAgICAgICAgc2VsZi5zaG93dmFycygoZnJhbWUsIGxpbmVubykpCisKKyAgICBkZWYgc2hvd3ZhcnMoc2VsZiwgKGZyYW1lLCBsaW5lbm8pKToKKyAgICAgICAgaWYgZnJhbWUuZl9sb2NhbHMgaXMgbm90IGZyYW1lLmZfZ2xvYmFsczoKKyAgICAgICAgICAgIGxvY2FscyA9IGZyYW1lLmZfbG9jYWxzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBsb2NhbHMgPSB7J1NhbWUgYXMgR2xvYmFscyc6Jyd9CisgICAgICAgIGZpbHRlcmVkbG9jYWxzID0ge30KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gbG9jYWxzLml0ZW1zKCk6CisgICAgICAgICAgICAjIGVtcHR5IGtleSBpcyBtYWdpYyBmb3IgUHl0aG9uIDEuNDsgJy4nIGlzIG1hZ2ljIGZvciAxLjUuLi4KKyAgICAgICAgICAgIGlmIG5vdCBrZXkgb3Iga2V5WzBdIDw+ICcuJzoKKyAgICAgICAgICAgICAgICBmaWx0ZXJlZGxvY2Fsc1trZXldID0gdmFsdWUKKyAgICAgICAgc2VsZi53LnBhbmVzLmJyb3dzZXJwYW5lcy5sb2NhbHMuYnJvd3Nlci5zZXQoZmlsdGVyZWRsb2NhbHMpCisgICAgICAgIHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuZ2xvYmFscy5icm93c2VyLnNldChmcmFtZS5mX2dsb2JhbHMpCisKKyAgICBkZWYgc2hvd3N0YWNrKHNlbGYsIHN0YWNraW5kZXgpOgorICAgICAgICBzdGFjayA9IFtdCisgICAgICAgIGZvciBmcmFtZSwgbGluZW5vIGluIHNlbGYuc3RhY2tbMTpdOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWUKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IF9maWxlbmFtZXNbZmlsZW5hbWVdCisgICAgICAgICAgICBleGNlcHQgS2V5RXJyb3I6CisgICAgICAgICAgICAgICAgaWYgZmlsZW5hbWVbOjFdICsgZmlsZW5hbWVbLTE6XSA8PiAnPD4nOgorICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpCisgICAgICAgICAgICAgICAgX2ZpbGVuYW1lc1tmcmFtZS5mX2NvZGUuY29fZmlsZW5hbWVdID0gZmlsZW5hbWUKKyAgICAgICAgICAgIGZ1bmNuYW1lID0gZnJhbWUuZl9jb2RlLmNvX25hbWUKKyAgICAgICAgICAgIGlmIGZ1bmNuYW1lID09ICc/JzoKKyAgICAgICAgICAgICAgICBmdW5jbmFtZSA9ICc8dG9wbGV2ZWw+JworICAgICAgICAgICAgc3RhY2suYXBwZW5kKGZpbGVuYW1lICsgJzogJyArIGZ1bmNuYW1lKQorICAgICAgICBpZiBzdGFjayA8PiBzZWxmLmxhc3RzdGFjazoKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5icm93c2VycGFuZXMuc3RhY2tsaXN0LnN0YWNrLnNldChzdGFjaykKKyAgICAgICAgICAgIHNlbGYubGFzdHN0YWNrID0gc3RhY2sKKyAgICAgICAgc2VsID0gW3N0YWNraW5kZXggLSAxXQorICAgICAgICBzZWxmLncucGFuZXMuYnJvd3NlcnBhbmVzLnN0YWNrbGlzdC5zdGFjay5zZXRzZWxlY3Rpb24oc2VsKQorICAgICAgICBzZWxmLmxhc3RzdGFja3NlbCA9IHNlbAorCisgICAgZGVmIGdvdG9fbGluZShzZWxmLCBsaW5lbm8pOgorICAgICAgICBpZiBsaW5lbm8gPiAwOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmJvdHRvbS5zcmMuc291cmNlLnNlbGVjdGxpbmUobGluZW5vIC0gMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20uc3JjLnNvdXJjZS5zZXRzZWxlY3Rpb24oMCwgMCkKKworICAgICMgYmRiIGVudHJ5IHBvaW50cworCisjICAgICAgIGRlZiB1c2VyX2NhbGwoc2VsZiwgZnJhbWUsIGFyZ3VtZW50X2xpc3QpOgorIyAgICAgICAgICAgICAgIHNlbGYucmVhc29uID0gJ0NhbGxpbmcnCisjICAgICAgICAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKworICAgIGRlZiB1c2VyX2xpbmUoc2VsZiwgZnJhbWUpOgorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugc3RvcCBvciBicmVhayBhdCB0aGlzIGxpbmUKKyAgICAgICAgc2VsZi5yZWFzb24gPSAnU3RvcHBlZCcKKyAgICAgICAgc2VsZi5pbnRlcmFjdGlvbihmcmFtZSwgTm9uZSkKKworICAgIGRlZiB1c2VyX3JldHVybihzZWxmLCBmcmFtZSwgcmV0dXJuX3ZhbHVlKToKKyAgICAgICAgIyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCB3aGVuIGEgcmV0dXJuIHRyYXAgaXMgc2V0IGhlcmUKKyAgICAgICAgZm5hbWUgPSBmcmFtZS5mX2NvZGUuY29fbmFtZQorICAgICAgICBpZiBmbmFtZSA8PiAnPyc6CisgICAgICAgICAgICBzZWxmLnJlYXNvbiA9ICdSZXR1cm5pbmcgZnJvbSAlcygpJyAlIGZyYW1lLmZfY29kZS5jb19uYW1lCisgICAgICAgICAgICBmcmFtZS5mX2xvY2Fsc1snX19yZXR1cm5fXyddID0gcmV0dXJuX3ZhbHVlCisgICAgICAgIGVsaWYgZnJhbWUuZl9iYWNrIGlzIHNlbGYuYm90ZnJhbWU6CisgICAgICAgICAgICBzZWxmLnJlYXNvbiA9ICdEb25lJworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5yZWFzb24gPSAnUmV0dXJuaW5nJworICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBOb25lLCAxKQorCisgICAgZGVmIHVzZXJfZXhjZXB0aW9uKHNlbGYsIGZyYW1lLCAoZXhjX3R5cGUsIGV4Y192YWx1ZSwgZXhjX3RyYWNlYmFjaykpOgorICAgICAgICAjIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gd2Ugc3RvcCBvciBicmVhayBhdCB0aGlzIGxpbmUKKyAgICAgICAgc2VsZi5yZWFzb24gPSBzZWxmLmZvcm1hdGV4Y2VwdGlvbihleGNfdHlwZSwgZXhjX3ZhbHVlKQorICAgICAgICBzZWxmLmludGVyYWN0aW9uKGZyYW1lLCBleGNfdHJhY2ViYWNrKQorCisgICAgZGVmIGZvcm1hdGV4Y2VwdGlvbihzZWxmLCBleGNfdHlwZSwgZXhjX3ZhbHVlKToKKyAgICAgICAgaWYgZXhjX3R5cGUgPT0gU3ludGF4RXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgdmFsdWUsIChmaWxlbmFtZSwgbGluZW5vLCBjaGFybm8sIGxpbmUpID0gZXhjX3ZhbHVlCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4gc3RyKGV4Y190eXBlKSArICc6ICcgKyBzdHIodmFsdWUpCisgICAgICAgIGlmIHR5cGUoZXhjX3R5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgIG5pY2UgPSBleGNfdHlwZS5fX25hbWVfXworICAgICAgICBlbHNlOgorICAgICAgICAgICAgbmljZSA9IHN0cihleGNfdHlwZSkKKyAgICAgICAgdmFsdWUgPSBzdHIoZXhjX3ZhbHVlKQorICAgICAgICBpZiBleGNfdmFsdWUgYW5kIHZhbHVlOgorICAgICAgICAgICAgbmljZSA9IG5pY2UgKyAiOiAiICsgdmFsdWUKKyAgICAgICAgcmV0dXJuIG5pY2UKKworICAgIGRlZiBmb3JnZXQoc2VsZik6CisgICAgICAgIHNlbGYuc3RhY2sgPSBbXQorICAgICAgICBzZWxmLmN1cmluZGV4ID0gMAorICAgICAgICBzZWxmLmN1cmZyYW1lID0gTm9uZQorCisgICAgZGVmIHNldHVwKHNlbGYsIGYsIHQsIGlzcmV0dXJuaW5nID0gMCk6CisgICAgICAgIHNlbGYuZm9yZ2V0KCkKKyAgICAgICAgc2VsZi5zdGFjaywgc2VsZi5jdXJpbmRleCA9IHNlbGYuZ2V0X3N0YWNrKGYsIHQpCisgICAgICAgIHNlbGYuY3VyZnJhbWUgPSBzZWxmLnN0YWNrW3NlbGYuY3VyaW5kZXggLSBpc3JldHVybmluZ11bMF0KKworICAgIGRlZiBpbnRlcmFjdGlvbihzZWxmLCBmcmFtZSwgdHJhY2ViYWNrLCBpc3JldHVybmluZyA9IDApOgorICAgICAgICBzYXZlcG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBzZWxmLncuc2VsZWN0KCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi5zZXR1cChmcmFtZSwgdHJhY2ViYWNrLCBpc3JldHVybmluZykKKyAgICAgICAgICAgIHNlbGYuc2V0c3RhdGUoJ3N0b3BwZWQnKQorICAgICAgICAgICAgc3RhY2tpbmRleCA9IHNlbGYuY3VyaW5kZXgKKyAgICAgICAgICAgIGlmIGlzcmV0dXJuaW5nOgorICAgICAgICAgICAgICAgIGlmIGZyYW1lLmZfYmFjayBpcyBub3Qgc2VsZi5ib3RmcmFtZToKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tpbmRleCA9IHN0YWNraW5kZXggLSAxCisgICAgICAgICAgICBzZWxmLnNob3dzdGFjayhzdGFja2luZGV4KQorICAgICAgICAgICAgc2VsZi5zaG93ZnJhbWUoc3RhY2tpbmRleCkKKyAgICAgICAgICAgIHNlbGYudy5wYXJlbnQuZGVidWdnZXJfbWFpbmxvb3AoKQorICAgICAgICAgICAgc2VsZi5mb3JnZXQoKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgUWQuU2V0UG9ydChzYXZlcG9ydCkKKworICAgICMgYmRiIGN1c3RvbWl6YXRpb24KKworICAgIGRlZiB0cmFjZV9kaXNwYXRjaChzZWxmLCBmcmFtZSwgZXZlbnQsIGFyZywgVGlja0NvdW50ID0gRXZ0LlRpY2tDb3VudCk6CisgICAgICAgIGlmIFRpY2tDb3VudCgpIC0gc2VsZi50cmFjaW5nbW9uaXRvcnRpbWUgPiAxNToKKyAgICAgICAgICAgIHNlbGYudHJhY2luZ21vbml0b3J0aW1lID0gVGlja0NvdW50KCkKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5ib3R0b20udHJhY2luZ21vbml0b3IudG9nZ2xlKCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDApCisgICAgICAgICAgICAgICAgaWYgc2VsZi5xdWl0dGluZzoKKyAgICAgICAgICAgICAgICAgICAgIyByZXR1cm5pbmcgTm9uZSBpcyBub3QgZW5vdWdoLCBhIGZvcm1lciBCZGJRdWl0IGV4Y2VwdGlvbgorICAgICAgICAgICAgICAgICAgICAjIG1pZ2h0IGhhdmUgYmVlbiBlYXRlbiBieSB0aGUgcHJpbnQgc3RhdGVtZW50CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIGJkYi5CZGJRdWl0CisgICAgICAgICAgICAgICAgaWYgZXZlbnQgPT0gJ2xpbmUnOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9saW5lKGZyYW1lKQorICAgICAgICAgICAgICAgIGlmIGV2ZW50ID09ICdjYWxsJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGF0Y2hfY2FsbChmcmFtZSwgYXJnKQorICAgICAgICAgICAgICAgIGlmIGV2ZW50ID09ICdyZXR1cm4nOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5kaXNwYXRjaF9yZXR1cm4oZnJhbWUsIGFyZykKKyAgICAgICAgICAgICAgICBpZiBldmVudCA9PSAnZXhjZXB0aW9uJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZGlzcGF0Y2hfZXhjZXB0aW9uKGZyYW1lLCBhcmcpCisgICAgICAgICAgICAgICAgcHJpbnQgJ2JkYi5CZGIuZGlzcGF0Y2g6IHVua25vd24gZGVidWdnaW5nIGV2ZW50OicsIHJlcHIoZXZlbnQpCisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgICAgIHNlbGYuc2V0X3N0ZXAoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKyAgICAgICAgZXhjZXB0IGJkYi5CZGJRdWl0OgorICAgICAgICAgICAgaWYgc2VsZi5jb250aW51ZXdpdGhvdXRkZWJ1Z2dlcjoKKyAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX3RyYWNlZnVuY3MoKQorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBiZGIuQmRiUXVpdAorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwcmludCAnWFhYIEV4Y2VwdGlvbiBkdXJpbmcgZGVidWdnZXIgaW50ZXJhY3Rpb24uJywgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuZm9ybWF0ZXhjZXB0aW9uKHN5cy5leGNfdHlwZSwgc3lzLmV4Y192YWx1ZSkKKyAgICAgICAgICAgIGltcG9ydCB0cmFjZWJhY2sKKyAgICAgICAgICAgIHRyYWNlYmFjay5wcmludF9leGMoKQorICAgICAgICAgICAgcmV0dXJuIHNlbGYudHJhY2VfZGlzcGF0Y2gKKworICAgIGRlZiBkaXNwYXRjaF9jYWxsKHNlbGYsIGZyYW1lLCBhcmcpOgorICAgICAgICBpZiBub3Qgc2VsZi50cmFjZW1hZ2ljIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mX2NvZGUuY29fbmFtZVs6Ml0gPT0gJ19fJyA9PSBmcmFtZS5mX2NvZGUuY29fbmFtZVstMjpdIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZS5mX2NvZGUuY29fbmFtZSA8PiAnX19pbml0X18nOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIHNlbGYuYm90ZnJhbWUgaXMgTm9uZToKKyAgICAgICAgICAgICMgRmlyc3QgY2FsbCBvZiBkaXNwYXRjaCBzaW5jZSByZXNldCgpCisgICAgICAgICAgICBzZWxmLmJvdGZyYW1lID0gZnJhbWUuZl9iYWNrICAgICMgeHh4ICEhISBhZGRlZCBmX2JhY2sKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRyYWNlX2Rpc3BhdGNoCisgICAgICAgIGlmIG5vdCAoc2VsZi5zdG9wX2hlcmUoZnJhbWUpIG9yIHNlbGYuYnJlYWtfYW55d2hlcmUoZnJhbWUpKToKKyAgICAgICAgICAgICMgTm8gbmVlZCB0byB0cmFjZSB0aGlzIGZ1bmN0aW9uCisgICAgICAgICAgICByZXR1cm4gIyBOb25lCisgICAgICAgIHNlbGYudXNlcl9jYWxsKGZyYW1lLCBhcmcpCisgICAgICAgIGlmIHNlbGYucXVpdHRpbmc6CisgICAgICAgICAgICByYWlzZSBiZGIuQmRiUXVpdAorICAgICAgICByZXR1cm4gc2VsZi50cmFjZV9kaXNwYXRjaAorCisgICAgZGVmIHNldF9jb250aW51ZShzZWxmKToKKyAgICAgICAgIyBEb24ndCBzdG9wIGV4Y2VwdCBhdCBicmVha3BvaW50cyBvciB3aGVuIGZpbmlzaGVkCisgICAgICAgIHNlbGYuc3RvcGZyYW1lID0gc2VsZi5ib3RmcmFtZQorICAgICAgICBzZWxmLnJldHVybmZyYW1lID0gTm9uZQorICAgICAgICBzZWxmLnF1aXR0aW5nID0gMAorICAgICAgICAjIHVubGlrZSBpbiBiZGIvcGRiLCB0aGVyZSdzIGEgY2hhbmNlIHRoYXQgYnJlYWtwb2ludHMgY2hhbmdlCisgICAgICAgICMgKndoaWxlKiBhIHByb2dyYW0gKHRoaXMgcHJvZ3JhbSA7LSkgaXMgcnVubmluZy4gSXQncyBhY3R1YWxseSBxdWl0ZSBsaWtlbHkuCisgICAgICAgICMgU28gd2UgZG9uJ3QgZGVsZXRlIGZyYW1lLmZfdHJhY2UgdW50aWwgdGhlIGJvdHRvbSBmcmFtZSBpZiB0aGVyZSBhcmUgbm8gYnJlYWtwb2ludHMuCisKKyAgICBkZWYgc2V0X2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBpZiBub3Qgc2VsZi5icmVha3MuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICBzZWxmLmJyZWFrc1tmaWxlbmFtZV0gPSBbXQorICAgICAgICBsaXN0ID0gc2VsZi5icmVha3NbZmlsZW5hbWVdCisgICAgICAgIGlmIGxpbmVubyBpbiBsaXN0OgorICAgICAgICAgICAgcmV0dXJuICdUaGVyZSBpcyBhbHJlYWR5IGEgYnJlYWtwb2ludCB0aGVyZSEnCisgICAgICAgIGxpc3QuYXBwZW5kKGxpbmVubykKKyAgICAgICAgbGlzdC5zb3J0KCkgICAgICMgSSB3YW50IHRvIGtlZXAgdGhlbSBuZWF0bHkgc29ydGVkOyBlYXNpZXIgZm9yIGRyYXdpbmcKKyAgICAgICAgaWYgaGFzYXR0cihiZGIsICJCcmVha3BvaW50Iik6CisgICAgICAgICAgICAjIDEuNS4yYjEgc3BlY2lmaWMKKyAgICAgICAgICAgIGJwID0gYmRiLkJyZWFrcG9pbnQoZmlsZW5hbWUsIGxpbmVubywgMCwgTm9uZSkKKyAgICAgICAgc2VsZi51cGRhdGVfYnJlYWtzKGZpbGVuYW1lKQorCisgICAgZGVmIGNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICBiZGIuQmRiLmNsZWFyX2JyZWFrKHNlbGYsIGZpbGVuYW1lLCBsaW5lbm8pCisgICAgICAgIHNlbGYudXBkYXRlX2JyZWFrcyhmaWxlbmFtZSkKKworICAgIGRlZiBjbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZiwgZmlsZW5hbWUpOgorICAgICAgICBiZGIuQmRiLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSkKKyAgICAgICAgc2VsZi51cGRhdGVfYnJlYWtzKGZpbGVuYW1lKQorCisgICAgZGVmIGNsZWFyX2FsbF9icmVha3Moc2VsZik6CisgICAgICAgIGJkYi5CZGIuY2xlYXJfYWxsX2JyZWFrcyhzZWxmKQorICAgICAgICBmb3IgZWRpdG9ycyBpbiBzZWxmLmVkaXRvcnMudmFsdWVzKCk6CisgICAgICAgICAgICBmb3IgZWRpdG9yIGluIGVkaXRvcnM6CisgICAgICAgICAgICAgICAgZWRpdG9yLmRyYXdicmVha3BvaW50cygpCisKKyAgICAjIHNwZWNpYWwKKworICAgIGRlZiB0b2dnbGVfYnJlYWsoc2VsZiwgZmlsZW5hbWUsIGxpbmVubyk6CisgICAgICAgIGlmIHNlbGYuZ2V0X2JyZWFrKGZpbGVuYW1lLCBsaW5lbm8pOgorICAgICAgICAgICAgc2VsZi5jbGVhcl9icmVhayhmaWxlbmFtZSwgbGluZW5vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zZXRfYnJlYWsoZmlsZW5hbWUsIGxpbmVubykKKworICAgIGRlZiBjbGVhcl9icmVha3NfYWJvdmUoc2VsZiwgZmlsZW5hbWUsIGFib3ZlKToKKyAgICAgICAgaWYgbm90IHNlbGYuYnJlYWtzLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICAgICAgcmV0dXJuICdUaGVyZSBhcmUgbm8gYnJlYWtwb2ludHMgaW4gdGhhdCBmaWxlIScKKyAgICAgICAgZm9yIGxpbmVubyBpbiBzZWxmLmJyZWFrc1tmaWxlbmFtZV1bOl06CisgICAgICAgICAgICBpZiBsaW5lbm8gPiBhYm92ZToKKyAgICAgICAgICAgICAgICBzZWxmLmJyZWFrc1tmaWxlbmFtZV0ucmVtb3ZlKGxpbmVubykKKyAgICAgICAgaWYgbm90IHNlbGYuYnJlYWtzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgIGRlbCBzZWxmLmJyZWFrc1tmaWxlbmFtZV0KKworICAgICMgZWRpdG9yIHN0dWZmCisKKyAgICBkZWYgdXBkYXRlX2JyZWFrcyhzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIHNlbGYuYnJlYWtzdmlld2VyOgorICAgICAgICAgICAgc2VsZi5icmVha3N2aWV3ZXIudXBkYXRlKCkKKyAgICAgICAgaWYgc2VsZi5lZGl0b3JzLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICAgICAgZm9yIGVkaXRvciBpbiBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdOgorICAgICAgICAgICAgICAgIGlmIGVkaXRvci5fZGVidWdnZXI6ICAgICMgWFhYCisgICAgICAgICAgICAgICAgICAgIGVkaXRvci5kcmF3YnJlYWtwb2ludHMoKQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHByaW50ICd4eHggZGVhZCBlZGl0b3IhJworCisgICAgZGVmIHVwZGF0ZV9hbGxicmVha3Moc2VsZik6CisgICAgICAgIGlmIHNlbGYuYnJlYWtzdmlld2VyOgorICAgICAgICAgICAgc2VsZi5icmVha3N2aWV3ZXIudXBkYXRlKCkKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIHNlbGYuYnJlYWtzLmtleXMoKToKKyAgICAgICAgICAgIGlmIHNlbGYuZWRpdG9ycy5oYXNfa2V5KGZpbGVuYW1lKToKKyAgICAgICAgICAgICAgICBmb3IgZWRpdG9yIGluIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV06CisgICAgICAgICAgICAgICAgICAgIGlmIGVkaXRvci5fZGVidWdnZXI6ICAgICMgWFhYCisgICAgICAgICAgICAgICAgICAgICAgICBlZGl0b3IuZHJhd2JyZWFrcG9pbnRzKCkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ICd4eHggZGVhZCBlZGl0b3IhJworCisgICAgZGVmIHJlZ2lzdGVyX2VkaXRvcihzZWxmLCBlZGl0b3IsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG5vdCBzZWxmLmVkaXRvcnMuaGFzX2tleShmaWxlbmFtZSk6CisgICAgICAgICAgICBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdID0gW2VkaXRvcl0KKyAgICAgICAgZWxpZiBlZGl0b3Igbm90IGluIHNlbGYuZWRpdG9yc1tmaWxlbmFtZV06CisgICAgICAgICAgICBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdLmFwcGVuZChlZGl0b3IpCisKKyAgICBkZWYgdW5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgZWRpdG9yLCBmaWxlbmFtZSk6CisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLmVkaXRvcnNbZmlsZW5hbWVdLnJlbW92ZShlZGl0b3IpCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5lZGl0b3JzW2ZpbGVuYW1lXQorICAgICAgICAgICAgICAgICMgaWYgdGhpcyB3YXMgYW4gdW50aXRsZWQgd2luZG93LCBjbGVhciB0aGUgYnJlYWtzLgorICAgICAgICAgICAgICAgIGlmIGZpbGVuYW1lWzoxXSA9PSAnPCcgYW5kIGZpbGVuYW1lWy0xOl0gPT0gJz4nIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuYnJlYWtzLmhhc19rZXkoZmlsZW5hbWUpOgorICAgICAgICAgICAgICAgICAgICBzZWxmLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhmaWxlbmFtZSkKKyAgICAgICAgZXhjZXB0IChLZXlFcnJvciwgVmFsdWVFcnJvcik6CisgICAgICAgICAgICBwYXNzCisKIAogY2xhc3MgU291cmNlVmlld2VyKFcuUHlFZGl0b3IpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotCQlhcHBseShXLlB5RWRpdG9yLl9faW5pdF9fLCAoc2VsZiwpICsgYXJncywga3dhcmdzKQotCQlzZWxmLmJpbmQoJzxjbGljaz4nLCBzZWxmLmNsaWNraW50ZXJjZXB0KQotCQotCWRlZiBjbGlja2ludGVyY2VwdChzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0IDw+IHNlbGYgYW5kIG5vdCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6Ci0JCQlzZWxmLl9wYXJlbnR3aW5kb3cueHh4X19fc2VsZWN0KHNlbGYpCi0JCQlyZXR1cm4gMQotCQotCWRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlyZXR1cm4gKGwgKyAxMiwgdCArIDIsIHIgLSAxLCBiIC0gMikKLQkJZWxzZToKLQkJCXJldHVybiAobCArIDUsIHQgKyAyLCByIC0gMSwgYiAtIDIpCi0JCi0JZGVmIHNlbGVjdChzZWxmLCBvbm9mZiwgaXNjbGljayA9IDApOgotCQlpZiBXLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKLQkJCXJldHVybgotCQlzZWxmLlNldFBvcnQoKQotCQkjaWYgb25vZmY6Ci0JCSMJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCSNlbHNlOgotCQkjCXNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCi0JCXNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQotCQotCWRlZiBkcmF3c2VsZnJhbWUoc2VsZiwgb25vZmYpOgotCQlwYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgYXBwbHkoVy5QeUVkaXRvci5fX2luaXRfXywgKHNlbGYsKSArIGFyZ3MsIGt3YXJncykKKyAgICAgICAgc2VsZi5iaW5kKCc8Y2xpY2s+Jywgc2VsZi5jbGlja2ludGVyY2VwdCkKKworICAgIGRlZiBjbGlja2ludGVyY2VwdChzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0IDw+IHNlbGYgYW5kIG5vdCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cueHh4X19fc2VsZWN0KHNlbGYpCisgICAgICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIF9nZXR2aWV3cmVjdChzZWxmKToKKyAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgIHJldHVybiAobCArIDEyLCB0ICsgMiwgciAtIDEsIGIgLSAyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIChsICsgNSwgdCArIDIsIHIgLSAxLCBiIC0gMikKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgb25vZmYsIGlzY2xpY2sgPSAwKToKKyAgICAgICAgaWYgVy5TZWxlY3RhYmxlV2lkZ2V0LnNlbGVjdChzZWxmLCBvbm9mZik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgI2lmIG9ub2ZmOgorICAgICAgICAjICAgICAgIHNlbGYudGVkLldFQWN0aXZhdGUoKQorICAgICAgICAjZWxzZToKKyAgICAgICAgIyAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKKworICAgIGRlZiBkcmF3c2VsZnJhbWUoc2VsZiwgb25vZmYpOgorICAgICAgICBwYXNzCiAKIAogY2xhc3MgQnJlYWtwb2ludHNWaWV3ZXI6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIGRlYnVnZ2VyKToKLQkJc2VsZi5kZWJ1Z2dlciA9IGRlYnVnZ2VyCi0JCXNlbGYudyA9IFcuV2luZG93KCgzMDAsIDI1MCksICdCcmVha3BvaW50cycsIG1pbnNpemUgPSAoMjAwLCAyMDApKQotCQlzZWxmLncucGFuZXMgPSBXLkhvcml6b250YWxQYW5lcygoOCwgOCwgLTgsIC0zMiksICgwLjMsIDAuNykpCi0JCXNlbGYudy5wYW5lcy5maWxlcyA9IFcuTGlzdChOb25lLCBjYWxsYmFjayA9IHNlbGYuZmlsZWhpdCkJCSMsIGZsYWdzID0gTGlzdHMubE9ubHlPbmUpCi0JCXNlbGYudy5wYW5lcy5nciA9IFcuR3JvdXAoTm9uZSkKLQkJc2VsZi53LnBhbmVzLmdyLmJyZWFrcyA9IFcuTGlzdCgoMCwgMCwgLTEzMCwgMCksIGNhbGxiYWNrID0gc2VsZi5saW5laGl0KQkjLCBmbGFncyA9IExpc3RzLmxPbmx5T25lKQotCQlzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbiA9IFcuQnV0dG9uKCgtODAsIDQsIDAsIDE2KSwgJ1ZpZXdceGM5Jywgc2VsZi5vcGVuYnV0dG9uaGl0KQotCQlzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uID0gVy5CdXR0b24oKC04MCwgMjgsIDAsIDE2KSwgJ0RlbGV0ZScsIHNlbGYuZGVsZXRlYnV0dG9uaGl0KQotCQkKLQkJc2VsZi53LmJpbmQoJzxjbG9zZT4nLCBzZWxmLmNsb3NlKQotCQlzZWxmLncuYmluZCgnYmFja3NwYWNlJywgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5wdXNoKQotCQkKLQkJc2VsZi5zZXR1cCgpCi0JCXNlbGYudy5vcGVuKCkKLQkJc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24uZW5hYmxlKDApCi0JCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCi0JCXNlbGYuY3VyZmlsZSA9IE5vbmUKLQkKLQlkZWYgZGVsZXRlYnV0dG9uaGl0KHNlbGYpOgotCQlpZiBzZWxmLncuX2N1cnJlbnR3aWRnZXQgPT0gc2VsZi53LnBhbmVzLmZpbGVzOgotCQkJc2VsZi5kZWxfZmlsZW5hbWUoKQotCQllbHNlOgotCQkJc2VsZi5kZWxfbnVtYmVyKCkKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBkZWxfbnVtYmVyKHNlbGYpOgotCQlpZiBzZWxmLmN1cmZpbGUgaXMgTm9uZToKLQkJCXJldHVybgotCQlzZWwgPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGVkb2JqZWN0cygpCi0JCWZvciBsaW5lbm8gaW4gc2VsOgotCQkJc2VsZi5kZWJ1Z2dlci5jbGVhcl9icmVhayhzZWxmLmN1cmZpbGUsIGxpbmVubykKLQkKLQlkZWYgZGVsX2ZpbGVuYW1lKHNlbGYpOgotCQlzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJZm9yIGZpbGVuYW1lIGluIHNlbDoKLQkJCXNlbGYuZGVidWdnZXIuY2xlYXJfYWxsX2ZpbGVfYnJlYWtzKGZpbGVuYW1lKQotCQlzZWxmLmRlYnVnZ2VyLnVwZGF0ZV9hbGxicmVha3MoKQotCQotCWRlZiBzZXR1cChzZWxmKToKLQkJZmlsZXMgPSBzZWxmLmRlYnVnZ2VyLmJyZWFrcy5rZXlzKCkKLQkJZmlsZXMuc29ydCgpCi0JCXNlbGYudy5wYW5lcy5maWxlcy5zZXQoZmlsZXMpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLmRlYnVnZ2VyLmJyZWFrc3ZpZXdlciA9IE5vbmUKLQkJc2VsZi5kZWJ1Z2dlciA9IE5vbmUKLQkKLQlkZWYgdXBkYXRlKHNlbGYpOgotCQlzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJc2VsZi5zZXR1cCgpCi0JCXNlbGYudy5wYW5lcy5maWxlcy5zZXRzZWxlY3RlZG9iamVjdHMoc2VsKQotCQlzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0aW9uKCkKLQkJaWYgbGVuKHNlbCkgPT0gMCBhbmQgc2VsZi5jdXJmaWxlOgotCQkJc2VsZi53LnBhbmVzLmZpbGVzLnNldHNlbGVjdGVkb2JqZWN0cyhbc2VsZi5jdXJmaWxlXSkKLQkJc2VsZi5maWxlaGl0KDApCi0JCi0JZGVmIHNlbGVjdChzZWxmKToKLQkJc2VsZi53LnNlbGVjdCgpCi0JCi0JZGVmIHNlbGVjdGZpbGUoc2VsZiwgZmlsZSk6Ci0JCXNlbGYudy5wYW5lcy5maWxlcy5zZXRzZWxlY3RlZG9iamVjdHMoW2ZpbGVdKQotCQlzZWxmLmZpbGVoaXQoMCkJCQkKLQkKLQlkZWYgb3BlbmJ1dHRvbmhpdChzZWxmKToKLQkJc2VsZi5maWxlaGl0KDEpCi0JCi0JZGVmIGZpbGVoaXQoc2VsZiwgaXNkYmwpOgotCQlzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJaWYgaXNkYmw6Ci0JCQlmb3IgZmlsZW5hbWUgaW4gc2VsOgotCQkJCWxpbmVubyA9IE5vbmUKLQkJCQlpZiBmaWxlbmFtZSA9PSBzZWxmLmN1cmZpbGU6Ci0JCQkJCWxpbmVzZWwgPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGVkb2JqZWN0cygpCi0JCQkJCWlmIGxpbmVzZWw6Ci0JCQkJCQlsaW5lbm8gPSBsaW5lc2VsWy0xXQotCQkJCQllbGlmIHNlbGYudy5wYW5lcy5nci5icmVha3M6Ci0JCQkJCQlsaW5lbm8gPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzWzBdCi0JCQkJZWRpdG9yID0gc2VsZi53Ll9wYXJlbnR3aW5kb3cucGFyZW50Lm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubykKLQkJCQllZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKDEpCi0JCQlyZXR1cm4KLQkJaWYgbGVuKHNlbCkgPT0gMToKLQkJCWZpbGUgPSBzZWxbMF0KLQkJCWZpbGVicmVha3MgPSBzZWxmLmRlYnVnZ2VyLmJyZWFrc1tmaWxlXVs6XQotCQkJaWYgc2VsZi5jdXJmaWxlID09IGZpbGU6Ci0JCQkJbGluZXNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJCXNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0KGZpbGVicmVha3MpCi0JCQlpZiBzZWxmLmN1cmZpbGUgPT0gZmlsZToKLQkJCQlzZWxmLncucGFuZXMuZ3IuYnJlYWtzLnNldHNlbGVjdGVkb2JqZWN0cyhsaW5lc2VsKQotCQkJc2VsZi5jdXJmaWxlID0gZmlsZQotCQllbHNlOgotCQkJaWYgbGVuKHNlbCkgPD4gMDoKLQkJCQlzZWxmLmN1cmZpbGUgPSBOb25lCi0JCQlzZWxmLncucGFuZXMuZ3IuYnJlYWtzLnNldChbXSkKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBsaW5laGl0KHNlbGYsIGlzZGJsKToKLQkJaWYgaXNkYmw6Ci0JCQlmaWxlcyA9IHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3RlZG9iamVjdHMoKQotCQkJaWYgbGVuKGZpbGVzKSA8PiAxOgotCQkJCXJldHVybgotCQkJZmlsZW5hbWUgPSBmaWxlc1swXQotCQkJbGluZW5vcyA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKLQkJCWlmIG5vdCBsaW5lbm9zOgotCQkJCXJldHVybgotCQkJbGluZW5vID0gbGluZW5vc1stMV0KLQkJCWVkaXRvciA9IHNlbGYudy5fcGFyZW50d2luZG93LnBhcmVudC5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8pCi0JCQllZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKDEpCi0JCXNlbGYuY2hlY2tidXR0b25zKCkKLQkKLQlkZWYgY2hlY2tidXR0b25zKHNlbGYpOgotCQlpZiBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0aW9uKCk6Ci0JCQlzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbi5lbmFibGUoMSkKLQkJCXNlbGYudy5fcGFyZW50d2luZG93LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24pCi0JCQlpZiBzZWxmLncuX2N1cnJlbnR3aWRnZXQgPT0gc2VsZi53LnBhbmVzLmZpbGVzOgotCQkJCWlmIHNlbGYudy5wYW5lcy5maWxlcy5nZXRzZWxlY3Rpb24oKToKLQkJCQkJc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMSkKLQkJCQllbHNlOgotCQkJCQlzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgwKQotCQkJZWxzZToKLQkJCQlpZiBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGlvbigpOgotCQkJCQlzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgxKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCi0JCWVsc2U6Ci0JCQlzZWxmLncucGFuZXMuZ3Iub3BlbmJ1dHRvbi5lbmFibGUoMCkKLQkJCXNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDApCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgZGVidWdnZXIpOgorICAgICAgICBzZWxmLmRlYnVnZ2VyID0gZGVidWdnZXIKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coKDMwMCwgMjUwKSwgJ0JyZWFrcG9pbnRzJywgbWluc2l6ZSA9ICgyMDAsIDIwMCkpCisgICAgICAgIHNlbGYudy5wYW5lcyA9IFcuSG9yaXpvbnRhbFBhbmVzKCg4LCA4LCAtOCwgLTMyKSwgKDAuMywgMC43KSkKKyAgICAgICAgc2VsZi53LnBhbmVzLmZpbGVzID0gVy5MaXN0KE5vbmUsIGNhbGxiYWNrID0gc2VsZi5maWxlaGl0KSAgICAgICAgICAgICAgIywgZmxhZ3MgPSBMaXN0cy5sT25seU9uZSkKKyAgICAgICAgc2VsZi53LnBhbmVzLmdyID0gVy5Hcm91cChOb25lKQorICAgICAgICBzZWxmLncucGFuZXMuZ3IuYnJlYWtzID0gVy5MaXN0KCgwLCAwLCAtMTMwLCAwKSwgY2FsbGJhY2sgPSBzZWxmLmxpbmVoaXQpICAgICAgICMsIGZsYWdzID0gTGlzdHMubE9ubHlPbmUpCisgICAgICAgIHNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uID0gVy5CdXR0b24oKC04MCwgNCwgMCwgMTYpLCAnVmlld1x4YzknLCBzZWxmLm9wZW5idXR0b25oaXQpCisgICAgICAgIHNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24gPSBXLkJ1dHRvbigoLTgwLCAyOCwgMCwgMTYpLCAnRGVsZXRlJywgc2VsZi5kZWxldGVidXR0b25oaXQpCisKKyAgICAgICAgc2VsZi53LmJpbmQoJzxjbG9zZT4nLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLncuYmluZCgnYmFja3NwYWNlJywgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5wdXNoKQorCisgICAgICAgIHNlbGYuc2V0dXAoKQorICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBzZWxmLmN1cmZpbGUgPSBOb25lCisKKyAgICBkZWYgZGVsZXRlYnV0dG9uaGl0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLncuX2N1cnJlbnR3aWRnZXQgPT0gc2VsZi53LnBhbmVzLmZpbGVzOgorICAgICAgICAgICAgc2VsZi5kZWxfZmlsZW5hbWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5kZWxfbnVtYmVyKCkKKyAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGRlbF9udW1iZXIoc2VsZik6CisgICAgICAgIGlmIHNlbGYuY3VyZmlsZSBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgZm9yIGxpbmVubyBpbiBzZWw6CisgICAgICAgICAgICBzZWxmLmRlYnVnZ2VyLmNsZWFyX2JyZWFrKHNlbGYuY3VyZmlsZSwgbGluZW5vKQorCisgICAgZGVmIGRlbF9maWxlbmFtZShzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBzZWw6CisgICAgICAgICAgICBzZWxmLmRlYnVnZ2VyLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhmaWxlbmFtZSkKKyAgICAgICAgc2VsZi5kZWJ1Z2dlci51cGRhdGVfYWxsYnJlYWtzKCkKKworICAgIGRlZiBzZXR1cChzZWxmKToKKyAgICAgICAgZmlsZXMgPSBzZWxmLmRlYnVnZ2VyLmJyZWFrcy5rZXlzKCkKKyAgICAgICAgZmlsZXMuc29ydCgpCisgICAgICAgIHNlbGYudy5wYW5lcy5maWxlcy5zZXQoZmlsZXMpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuZGVidWdnZXIuYnJlYWtzdmlld2VyID0gTm9uZQorICAgICAgICBzZWxmLmRlYnVnZ2VyID0gTm9uZQorCisgICAgZGVmIHVwZGF0ZShzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgIHNlbGYuc2V0dXAoKQorICAgICAgICBzZWxmLncucGFuZXMuZmlsZXMuc2V0c2VsZWN0ZWRvYmplY3RzKHNlbCkKKyAgICAgICAgc2VsID0gc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGlvbigpCisgICAgICAgIGlmIGxlbihzZWwpID09IDAgYW5kIHNlbGYuY3VyZmlsZToKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5maWxlcy5zZXRzZWxlY3RlZG9iamVjdHMoW3NlbGYuY3VyZmlsZV0pCisgICAgICAgIHNlbGYuZmlsZWhpdCgwKQorCisgICAgZGVmIHNlbGVjdChzZWxmKToKKyAgICAgICAgc2VsZi53LnNlbGVjdCgpCisKKyAgICBkZWYgc2VsZWN0ZmlsZShzZWxmLCBmaWxlKToKKyAgICAgICAgc2VsZi53LnBhbmVzLmZpbGVzLnNldHNlbGVjdGVkb2JqZWN0cyhbZmlsZV0pCisgICAgICAgIHNlbGYuZmlsZWhpdCgwKQorCisgICAgZGVmIG9wZW5idXR0b25oaXQoc2VsZik6CisgICAgICAgIHNlbGYuZmlsZWhpdCgxKQorCisgICAgZGVmIGZpbGVoaXQoc2VsZiwgaXNkYmwpOgorICAgICAgICBzZWwgPSBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBmb3IgZmlsZW5hbWUgaW4gc2VsOgorICAgICAgICAgICAgICAgIGxpbmVubyA9IE5vbmUKKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZSA9PSBzZWxmLmN1cmZpbGU6CisgICAgICAgICAgICAgICAgICAgIGxpbmVzZWwgPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgICAgICAgICAgICAgIGlmIGxpbmVzZWw6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBsaW5lc2VsWy0xXQorICAgICAgICAgICAgICAgICAgICBlbGlmIHNlbGYudy5wYW5lcy5nci5icmVha3M6CisgICAgICAgICAgICAgICAgICAgICAgICBsaW5lbm8gPSBzZWxmLncucGFuZXMuZ3IuYnJlYWtzWzBdCisgICAgICAgICAgICAgICAgZWRpdG9yID0gc2VsZi53Ll9wYXJlbnR3aW5kb3cucGFyZW50Lm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgICAgICAgICBlZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKDEpCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgbGVuKHNlbCkgPT0gMToKKyAgICAgICAgICAgIGZpbGUgPSBzZWxbMF0KKyAgICAgICAgICAgIGZpbGVicmVha3MgPSBzZWxmLmRlYnVnZ2VyLmJyZWFrc1tmaWxlXVs6XQorICAgICAgICAgICAgaWYgc2VsZi5jdXJmaWxlID09IGZpbGU6CisgICAgICAgICAgICAgICAgbGluZXNlbCA9IHNlbGYudy5wYW5lcy5nci5icmVha3MuZ2V0c2VsZWN0ZWRvYmplY3RzKCkKKyAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5icmVha3Muc2V0KGZpbGVicmVha3MpCisgICAgICAgICAgICBpZiBzZWxmLmN1cmZpbGUgPT0gZmlsZToKKyAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLnNldHNlbGVjdGVkb2JqZWN0cyhsaW5lc2VsKQorICAgICAgICAgICAgc2VsZi5jdXJmaWxlID0gZmlsZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbGVuKHNlbCkgPD4gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmN1cmZpbGUgPSBOb25lCisgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuYnJlYWtzLnNldChbXSkKKyAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGxpbmVoaXQoc2VsZiwgaXNkYmwpOgorICAgICAgICBpZiBpc2RibDoKKyAgICAgICAgICAgIGZpbGVzID0gc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGVkb2JqZWN0cygpCisgICAgICAgICAgICBpZiBsZW4oZmlsZXMpIDw+IDE6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVzWzBdCisgICAgICAgICAgICBsaW5lbm9zID0gc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3RlZG9iamVjdHMoKQorICAgICAgICAgICAgaWYgbm90IGxpbmVub3M6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBsaW5lbm8gPSBsaW5lbm9zWy0xXQorICAgICAgICAgICAgZWRpdG9yID0gc2VsZi53Ll9wYXJlbnR3aW5kb3cucGFyZW50Lm9wZW5zY3JpcHQoZmlsZW5hbWUsIGxpbmVubykKKyAgICAgICAgICAgIGVkaXRvci5zaG93YnJlYWtwb2ludHMoMSkKKyAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi53LnBhbmVzLmZpbGVzLmdldHNlbGVjdGlvbigpOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICBzZWxmLncuX3BhcmVudHdpbmRvdy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5wYW5lcy5nci5vcGVuYnV0dG9uKQorICAgICAgICAgICAgaWYgc2VsZi53Ll9jdXJyZW50d2lkZ2V0ID09IHNlbGYudy5wYW5lcy5maWxlczoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLncucGFuZXMuZmlsZXMuZ2V0c2VsZWN0aW9uKCk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYudy5wYW5lcy5nci5kZWxldGVidXR0b24uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi53LnBhbmVzLmdyLmJyZWFrcy5nZXRzZWxlY3Rpb24oKToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLmRlbGV0ZWJ1dHRvbi5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgwKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53LnBhbmVzLmdyLm9wZW5idXR0b24uZW5hYmxlKDApCisgICAgICAgICAgICBzZWxmLncucGFuZXMuZ3IuZGVsZXRlYnV0dG9uLmVuYWJsZSgwKQogCiAKIGNsYXNzIFRyYWNpbmdNb25pdG9yKFcuV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLQkJYXBwbHkoVy5XaWRnZXQuX19pbml0X18sIChzZWxmLCkgKyBhcmdzLCBrd2FyZ3MpCi0JCXNlbGYuc3RhdGUgPSAwCi0JCi0JZGVmIHRvZ2dsZShzZWxmKToKLQkJaWYgaGFzYXR0cihzZWxmLCAiX3BhcmVudHdpbmRvdyIpIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLnN0YXRlID0gc2VsZi5zdGF0ZSAlIDIgKyAxCi0JCQlwb3J0ID0gUWQuR2V0UG9ydCgpCi0JCQlzZWxmLlNldFBvcnQoKQotCQkJc2VsZi5kcmF3KCkKLQkJCVFkLlNldFBvcnQocG9ydCkKLQkKLQlkZWYgcmVzZXQoc2VsZik6Ci0JCWlmIHNlbGYuX3BhcmVudHdpbmRvdzoKLQkJCXNlbGYuc3RhdGUgPSAwCi0JCQlwb3J0ID0gUWQuR2V0UG9ydCgpCi0JCQlzZWxmLlNldFBvcnQoKQotCQkJc2VsZi5kcmF3KCkKLQkJCVFkLlNldFBvcnQocG9ydCkKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5zdGF0ZSA9PSAyOgotCQkJUWQuUGFpbnRPdmFsKHNlbGYuX2JvdW5kcykKLQkJZWxzZToKLQkJCVFkLkVyYXNlT3ZhbChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKKyAgICAgICAgYXBwbHkoVy5XaWRnZXQuX19pbml0X18sIChzZWxmLCkgKyBhcmdzLCBrd2FyZ3MpCisgICAgICAgIHNlbGYuc3RhdGUgPSAwCisKKyAgICBkZWYgdG9nZ2xlKHNlbGYpOgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJfcGFyZW50d2luZG93IikgYW5kIHNlbGYuX3BhcmVudHdpbmRvdyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuc3RhdGUgPSBzZWxmLnN0YXRlICUgMiArIDEKKyAgICAgICAgICAgIHBvcnQgPSBRZC5HZXRQb3J0KCkKKyAgICAgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICAgICBzZWxmLmRyYXcoKQorICAgICAgICAgICAgUWQuU2V0UG9ydChwb3J0KQorCisgICAgZGVmIHJlc2V0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3c6CisgICAgICAgICAgICBzZWxmLnN0YXRlID0gMAorICAgICAgICAgICAgcG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIHNlbGYuZHJhdygpCisgICAgICAgICAgICBRZC5TZXRQb3J0KHBvcnQpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5zdGF0ZSA9PSAyOgorICAgICAgICAgICAgUWQuUGFpbnRPdmFsKHNlbGYuX2JvdW5kcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFFkLkVyYXNlT3ZhbChzZWxmLl9ib3VuZHMpCiAKIAogIyBjb252ZW5pZW5jZSBmdW5jcwogCiBkZWYgcG9zdG1vcnRlbShleGNfdHlwZSwgZXhjX3ZhbHVlLCB0Yik6Ci0JZCA9IGdldGRlYnVnZ2VyKCkKLQlkLnBvc3Rtb3J0ZW0oZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIpCisgICAgZCA9IGdldGRlYnVnZ2VyKCkKKyAgICBkLnBvc3Rtb3J0ZW0oZXhjX3R5cGUsIGV4Y192YWx1ZSwgdGIpCiAKIGRlZiBzdGFydChib3R0b21mcmFtZSA9IE5vbmUpOgotCWQgPSBnZXRkZWJ1Z2dlcigpCi0JZC5zdGFydChib3R0b21mcmFtZSkKKyAgICBkID0gZ2V0ZGVidWdnZXIoKQorICAgIGQuc3RhcnQoYm90dG9tZnJhbWUpCiAKIGRlZiBzdGFydGZyb21oZXJlKCk6Ci0JZCA9IGdldGRlYnVnZ2VyKCkKLQl0cnk6Ci0JCXJhaXNlICdzcGFtJwotCWV4Y2VwdDoKLQkJZnJhbWUgPSBzeXMuZXhjX3RyYWNlYmFjay50Yl9mcmFtZS5mX2JhY2sKLQlkLnN0YXJ0KGZyYW1lKQorICAgIGQgPSBnZXRkZWJ1Z2dlcigpCisgICAgdHJ5OgorICAgICAgICByYWlzZSAnc3BhbScKKyAgICBleGNlcHQ6CisgICAgICAgIGZyYW1lID0gc3lzLmV4Y190cmFjZWJhY2sudGJfZnJhbWUuZl9iYWNrCisgICAgZC5zdGFydChmcmFtZSkKIAogZGVmIHN0YXJ0ZnJvbWJvdHRvbSgpOgotCWQgPSBnZXRkZWJ1Z2dlcigpCi0JZC5zdGFydChfZ2V0Ym90dG9tZnJhbWUoKSwgMSkKKyAgICBkID0gZ2V0ZGVidWdnZXIoKQorICAgIGQuc3RhcnQoX2dldGJvdHRvbWZyYW1lKCksIDEpCiAKIGRlZiBzdG9wKCk6Ci0JZCA9IGdldGRlYnVnZ2VyKCkKLQlkLnN0b3AoKQorICAgIGQgPSBnZXRkZWJ1Z2dlcigpCisgICAgZC5zdG9wKCkKIAogZGVmIGNvbnQoKToKLQlzeXMuc2V0dHJhY2UoTm9uZSkKLQlkID0gZ2V0ZGVidWdnZXIoKQotCWQuc2V0X2NvbnRpbnVlX3dpdGhvdXRfZGVidWdnZXIoKQorICAgIHN5cy5zZXR0cmFjZShOb25lKQorICAgIGQgPSBnZXRkZWJ1Z2dlcigpCisgICAgZC5zZXRfY29udGludWVfd2l0aG91dF9kZWJ1Z2dlcigpCiAKIGRlZiBfZ2V0Ym90dG9tZnJhbWUoKToKLQl0cnk6Ci0JCXJhaXNlICdzcGFtJwotCWV4Y2VwdDoKLQkJcGFzcwotCWZyYW1lID0gc3lzLmV4Y190cmFjZWJhY2sudGJfZnJhbWUKLQl3aGlsZSAxOgotCQlpZiBmcmFtZS5mX2NvZGUuY29fbmFtZSA9PSAnbWFpbmxvb3AnIG9yIGZyYW1lLmZfYmFjayBpcyBOb25lOgotCQkJYnJlYWsKLQkJZnJhbWUgPSBmcmFtZS5mX2JhY2sKLQlyZXR1cm4gZnJhbWUKKyAgICB0cnk6CisgICAgICAgIHJhaXNlICdzcGFtJworICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIGZyYW1lID0gc3lzLmV4Y190cmFjZWJhY2sudGJfZnJhbWUKKyAgICB3aGlsZSAxOgorICAgICAgICBpZiBmcmFtZS5mX2NvZGUuY29fbmFtZSA9PSAnbWFpbmxvb3AnIG9yIGZyYW1lLmZfYmFjayBpcyBOb25lOgorICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZnJhbWUgPSBmcmFtZS5mX2JhY2sKKyAgICByZXR1cm4gZnJhbWUKIAogX2RlYnVnZ2VyID0gTm9uZQogCiBkZWYgZ2V0ZGVidWdnZXIoKToKLQlpZiBub3QgX19kZWJ1Z19fOgotCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBkZWJ1ZyBpbiBcIk9wdGltaXplIGJ5dGVjb2RlXCIgbW9kZS5ccihzZWUgXCJEZWZhdWx0IHN0YXJ0dXAgb3B0aW9uc1wiIGluIEVkaXRQeXRob25QcmVmZXJlbmNlcykiCi0JZ2xvYmFsIF9kZWJ1Z2dlcgotCWlmIF9kZWJ1Z2dlciBpcyBOb25lOgotCQlfZGVidWdnZXIgPSBEZWJ1Z2dlcigpCi0JcmV0dXJuIF9kZWJ1Z2dlcgorICAgIGlmIG5vdCBfX2RlYnVnX186CisgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGRlYnVnIGluIFwiT3B0aW1pemUgYnl0ZWNvZGVcIiBtb2RlLlxyKHNlZSBcIkRlZmF1bHQgc3RhcnR1cCBvcHRpb25zXCIgaW4gRWRpdFB5dGhvblByZWZlcmVuY2VzKSIKKyAgICBnbG9iYWwgX2RlYnVnZ2VyCisgICAgaWYgX2RlYnVnZ2VyIGlzIE5vbmU6CisgICAgICAgIF9kZWJ1Z2dlciA9IERlYnVnZ2VyKCkKKyAgICByZXR1cm4gX2RlYnVnZ2VyCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1B5RG9jU2VhcmNoLnB5IGIvTWFjL1Rvb2xzL0lERS9QeURvY1NlYXJjaC5weQppbmRleCAxYWJkNGNkLi5lYzY2NmI2IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1B5RG9jU2VhcmNoLnB5CisrKyBiL01hYy9Ub29scy9JREUvUHlEb2NTZWFyY2gucHkKQEAgLTEzLDI0NCArMTMsMjQ0IEBACiBfdGl0bGVwYXQgPSByZS5jb21waWxlKCc8dGl0bGU+XChbXjxdKlwpPC90aXRsZT4nKQogCiBkZWYgc3Vja3RpdGxlKHBhdGgpOgotCWYgPSBvcGVuKHBhdGgpCi0JdGV4dCA9IGYucmVhZCgxMDI0KSAjIGFzc3VtZSB0aGUgdGl0bGUgaXMgaW4gdGhlIGZpcnN0IDEwMjQgYnl0ZXMKLQlmLmNsb3NlKCkKLQlsb3dlcnRleHQgPSB0ZXh0Lmxvd2VyKCkKLQltYXRjaGVyID0gX3RpdGxlcGF0LnNlYXJjaChsb3dlcnRleHQpCi0JaWYgbWF0Y2hlcjoKLQkJcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSkKLQlyZXR1cm4gcGF0aAorICAgIGYgPSBvcGVuKHBhdGgpCisgICAgdGV4dCA9IGYucmVhZCgxMDI0KSAjIGFzc3VtZSB0aGUgdGl0bGUgaXMgaW4gdGhlIGZpcnN0IDEwMjQgYnl0ZXMKKyAgICBmLmNsb3NlKCkKKyAgICBsb3dlcnRleHQgPSB0ZXh0Lmxvd2VyKCkKKyAgICBtYXRjaGVyID0gX3RpdGxlcGF0LnNlYXJjaChsb3dlcnRleHQpCisgICAgaWYgbWF0Y2hlcjoKKyAgICAgICAgcmV0dXJuIG1hdGNoZXIuZ3JvdXAoMSkKKyAgICByZXR1cm4gcGF0aAogCiBkZWYgdmVyaWZ5ZG9jcGF0aChkb2NwYXRoKToKLQl0cnk6Ci0JCXR1dCA9IG9zLnBhdGguam9pbihkb2NwYXRoLCAidHV0IikKLQkJbGliID0gb3MucGF0aC5qb2luKGRvY3BhdGgsICJsaWIiKQotCQlyZWYgPSBvcy5wYXRoLmpvaW4oZG9jcGF0aCwgInJlZiIpCi0JCWZvciBwYXRoIGluIFt0dXQsIGxpYiwgcmVmXToKLQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCQlyZXR1cm4gMAotCWV4Y2VwdDoKLQkJcmV0dXJuIDAKLQlyZXR1cm4gMQorICAgIHRyeToKKyAgICAgICAgdHV0ID0gb3MucGF0aC5qb2luKGRvY3BhdGgsICJ0dXQiKQorICAgICAgICBsaWIgPSBvcy5wYXRoLmpvaW4oZG9jcGF0aCwgImxpYiIpCisgICAgICAgIHJlZiA9IG9zLnBhdGguam9pbihkb2NwYXRoLCAicmVmIikKKyAgICAgICAgZm9yIHBhdGggaW4gW3R1dCwgbGliLCByZWZdOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgIHJldHVybiAwCisgICAgZXhjZXB0OgorICAgICAgICByZXR1cm4gMAorICAgIHJldHVybiAxCiAKIAogX3Jlc3VsdHNjb3VudGVyID0gMQogCiBjbGFzcyBSZXN1bHRzOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBoaXRzKToKLQkJZ2xvYmFsIF9yZXN1bHRzY291bnRlcgotCQloaXRzID0gbWFwKGxhbWJkYSAocGF0aCwgaGl0cyk6IChzdWNrdGl0bGUocGF0aCksIHBhdGgsIGhpdHMpLCBoaXRzKQotCQloaXRzLnNvcnQoKQotCQlzZWxmLmhpdHMgPSBoaXRzCi0JCW5pY2VoaXRzID0gbWFwKAotCQkJCWxhbWJkYSAodGl0bGUsIHBhdGgsIGhpdHMpOgotCQkJCXRpdGxlICsgJ1xyJyArIHN0cmluZy5qb2luKAotCQkJCW1hcChsYW1iZGEgKGMsIHApOiAiJXMgKCVkKSIgJSAocCwgYyksIGhpdHMpLCAnLCAnKSwgaGl0cykKLQkJbmljZWhpdHMuc29ydCgpCi0JCXNlbGYudyA9IFcuV2luZG93KCg0NDAsIDMwMCksICJTZWFyY2ggcmVzdWx0cyAlZCIgJSBfcmVzdWx0c2NvdW50ZXIsIG1pbnNpemUgPSAoMjAwLCAxMDApKQotCQlzZWxmLncucmVzdWx0cyA9IFcuVHdvTGluZUxpc3QoKC0xLCAtMSwgMSwgLTE0KSwgbmljZWhpdHMsIHNlbGYubGlzdGhpdCkKLQkJc2VsZi53Lm9wZW4oKQotCQlzZWxmLncuYmluZCgncmV0dXJuJywgc2VsZi5saXN0aGl0KQotCQlzZWxmLncuYmluZCgnZW50ZXInLCBzZWxmLmxpc3RoaXQpCi0JCV9yZXN1bHRzY291bnRlciA9IF9yZXN1bHRzY291bnRlciArIDEKLQkKLQlkZWYgbGlzdGhpdChzZWxmLCBpc2RibCA9IDEpOgotCQlpZiBpc2RibDoKLQkJCWZvciBpIGluIHNlbGYudy5yZXN1bHRzLmdldHNlbGVjdGlvbigpOgotCQkJCXBhdGggPSBzZWxmLmhpdHNbaV1bMV0KLQkJCQl1cmwgPSAiZmlsZTovLyIgKyAiLyIuam9pbihwYXRoLnNwbGl0KCI6IikpCi0JCQkJd2ViYnJvd3Nlci5vcGVuKHVybCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBoaXRzKToKKyAgICAgICAgZ2xvYmFsIF9yZXN1bHRzY291bnRlcgorICAgICAgICBoaXRzID0gbWFwKGxhbWJkYSAocGF0aCwgaGl0cyk6IChzdWNrdGl0bGUocGF0aCksIHBhdGgsIGhpdHMpLCBoaXRzKQorICAgICAgICBoaXRzLnNvcnQoKQorICAgICAgICBzZWxmLmhpdHMgPSBoaXRzCisgICAgICAgIG5pY2VoaXRzID0gbWFwKAorICAgICAgICAgICAgICAgICAgICAgICAgbGFtYmRhICh0aXRsZSwgcGF0aCwgaGl0cyk6CisgICAgICAgICAgICAgICAgICAgICAgICB0aXRsZSArICdccicgKyBzdHJpbmcuam9pbigKKyAgICAgICAgICAgICAgICAgICAgICAgIG1hcChsYW1iZGEgKGMsIHApOiAiJXMgKCVkKSIgJSAocCwgYyksIGhpdHMpLCAnLCAnKSwgaGl0cykKKyAgICAgICAgbmljZWhpdHMuc29ydCgpCisgICAgICAgIHNlbGYudyA9IFcuV2luZG93KCg0NDAsIDMwMCksICJTZWFyY2ggcmVzdWx0cyAlZCIgJSBfcmVzdWx0c2NvdW50ZXIsIG1pbnNpemUgPSAoMjAwLCAxMDApKQorICAgICAgICBzZWxmLncucmVzdWx0cyA9IFcuVHdvTGluZUxpc3QoKC0xLCAtMSwgMSwgLTE0KSwgbmljZWhpdHMsIHNlbGYubGlzdGhpdCkKKyAgICAgICAgc2VsZi53Lm9wZW4oKQorICAgICAgICBzZWxmLncuYmluZCgncmV0dXJuJywgc2VsZi5saXN0aGl0KQorICAgICAgICBzZWxmLncuYmluZCgnZW50ZXInLCBzZWxmLmxpc3RoaXQpCisgICAgICAgIF9yZXN1bHRzY291bnRlciA9IF9yZXN1bHRzY291bnRlciArIDEKKworICAgIGRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsID0gMSk6CisgICAgICAgIGlmIGlzZGJsOgorICAgICAgICAgICAgZm9yIGkgaW4gc2VsZi53LnJlc3VsdHMuZ2V0c2VsZWN0aW9uKCk6CisgICAgICAgICAgICAgICAgcGF0aCA9IHNlbGYuaGl0c1tpXVsxXQorICAgICAgICAgICAgICAgIHVybCA9ICJmaWxlOi8vIiArICIvIi5qb2luKHBhdGguc3BsaXQoIjoiKSkKKyAgICAgICAgICAgICAgICB3ZWJicm93c2VyLm9wZW4odXJsKQogCiAKIGNsYXNzIFN0YXR1czoKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYudyA9IFcuRGlhbG9nKCg0NDAsIDY0KSwgIlNlYXJjaGluZ1x4YzkiKQotCQlzZWxmLncuc2VhcmNoaW5nID0gVy5UZXh0Qm94KCg0LCA0LCAtNCwgMTYpLCAiIikKLQkJc2VsZi53LmhpdHMgPSBXLlRleHRCb3goKDQsIDI0LCAtNCwgMTYpLCAiSGl0czogMCIpCi0JCXNlbGYudy5jYW5jZWx0aXAgPSBXLlRleHRCb3goKDQsIDQ0LCAtNCwgMTYpLCAiVHlwZSBjbWQtcGVyaW9kICguKSB0byBjYW5jZWwuIikKLQkJc2VsZi53Lm9wZW4oKQotCQotCWRlZiBzZXQoc2VsZiwgcGF0aCwgaGl0cyk6Ci0JCXNlbGYudy5zZWFyY2hpbmcuc2V0KHBhdGgpCi0JCXNlbGYudy5oaXRzLnNldCgnSGl0czogJXInICUgKGhpdHMsKSkKLQkJYXBwLmJyZWF0aGUoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi53LmNsb3NlKCkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5EaWFsb2coKDQ0MCwgNjQpLCAiU2VhcmNoaW5nXHhjOSIpCisgICAgICAgIHNlbGYudy5zZWFyY2hpbmcgPSBXLlRleHRCb3goKDQsIDQsIC00LCAxNiksICIiKQorICAgICAgICBzZWxmLncuaGl0cyA9IFcuVGV4dEJveCgoNCwgMjQsIC00LCAxNiksICJIaXRzOiAwIikKKyAgICAgICAgc2VsZi53LmNhbmNlbHRpcCA9IFcuVGV4dEJveCgoNCwgNDQsIC00LCAxNiksICJUeXBlIGNtZC1wZXJpb2QgKC4pIHRvIGNhbmNlbC4iKQorICAgICAgICBzZWxmLncub3BlbigpCisKKyAgICBkZWYgc2V0KHNlbGYsIHBhdGgsIGhpdHMpOgorICAgICAgICBzZWxmLncuc2VhcmNoaW5nLnNldChwYXRoKQorICAgICAgICBzZWxmLncuaGl0cy5zZXQoJ0hpdHM6ICVyJyAlIChoaXRzLCkpCisgICAgICAgIGFwcC5icmVhdGhlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi53LmNsb3NlKCkKIAogCiBkZWYgbWF0Y2godGV4dCwgcGF0dGVybnMsIGFsbCk6Ci0JaGl0cyA9IFtdCi0JaGl0c2FwcGVuZCA9IGhpdHMuYXBwZW5kCi0Jc3RyaW5nY291bnQgPSBzdHJpbmcuY291bnQKLQlmb3IgcGF0IGluIHBhdHRlcm5zOgotCQljID0gc3RyaW5nY291bnQodGV4dCwgcGF0KQotCQlpZiBjID4gMDoKLQkJCWhpdHNhcHBlbmQoKGMsIHBhdCkpCi0JCWVsaWYgYWxsOgotCQkJaGl0c1s6XSA9IFtdCi0JCQlicmVhawotCWhpdHMuc29ydCgpCi0JaGl0cy5yZXZlcnNlKCkKLQlyZXR1cm4gaGl0cworICAgIGhpdHMgPSBbXQorICAgIGhpdHNhcHBlbmQgPSBoaXRzLmFwcGVuZAorICAgIHN0cmluZ2NvdW50ID0gc3RyaW5nLmNvdW50CisgICAgZm9yIHBhdCBpbiBwYXR0ZXJuczoKKyAgICAgICAgYyA9IHN0cmluZ2NvdW50KHRleHQsIHBhdCkKKyAgICAgICAgaWYgYyA+IDA6CisgICAgICAgICAgICBoaXRzYXBwZW5kKChjLCBwYXQpKQorICAgICAgICBlbGlmIGFsbDoKKyAgICAgICAgICAgIGhpdHNbOl0gPSBbXQorICAgICAgICAgICAgYnJlYWsKKyAgICBoaXRzLnNvcnQoKQorICAgIGhpdHMucmV2ZXJzZSgpCisgICAgcmV0dXJuIGhpdHMKIAogCiBkZWYgZG9zZWFyY2goZG9jcGF0aCwgc2VhcmNoc3RyaW5nLCBzZXR0aW5ncyk6Ci0JKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKSA9IHNldHRpbmdzCi0JYm9va3MgPSBbKHR1dCwgJ3R1dCcpLCAobGliLCAnbGliJyksIChyZWYsICdyZWYnKSwgKGV4dCwgJ2V4dCcpLCAoYXBpLCAnYXBpJyldCi0JaWYgbm90IGNhc2U6Ci0JCXNlYXJjaHN0cmluZyA9IHN0cmluZy5sb3dlcihzZWFyY2hzdHJpbmcpCi0JCi0JaWYga2luZCA9PSAxOgotCQlwYXR0ZXJucyA9IHN0cmluZy5zcGxpdChzZWFyY2hzdHJpbmcpCi0JCWFsbCA9IDEKLQllbGlmIGtpbmQgPT0gMjoKLQkJcGF0dGVybnMgPSBzdHJpbmcuc3BsaXQoc2VhcmNoc3RyaW5nKQotCQlhbGwgPSAwCi0JZWxzZToKLQkJcGF0dGVybnMgPSBbc2VhcmNoc3RyaW5nXQotCQlhbGwgPSAwICMgbm90IHJlbGV2YW50Ci0JCi0Jb3NwYXRoam9pbiA9IG9zLnBhdGguam9pbgotCXN0cmluZ2xvd2VyID0gc3RyaW5nLmxvd2VyCi0Jc3RhdHVzID0gU3RhdHVzKCkKLQlzdGF0dXNzZXQgPSBzdGF0dXMuc2V0Ci0JX21hdGNoID0gbWF0Y2gKLQlfb3BlbiA9IG9wZW4KLQloaXRzID0ge30KLQl0cnk6Ci0JCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQotCQl0cnk6Ci0JCQlmb3IgZG8sIG5hbWUgaW4gYm9va3M6Ci0JCQkJaWYgbm90IGRvOgotCQkJCQljb250aW51ZQotCQkJCWJvb2twYXRoID0gb3NwYXRoam9pbihkb2NwYXRoLCBuYW1lKQotCQkJCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhib29rcGF0aCk6Ci0JCQkJCWNvbnRpbnVlCi0JCQkJZmlsZXMgPSBvcy5saXN0ZGlyKGJvb2twYXRoKQotCQkJCWZvciBmaWxlIGluIGZpbGVzOgotCQkJCQlmdWxscGF0aCA9IG9zcGF0aGpvaW4oYm9va3BhdGgsIGZpbGUpCi0JCQkJCWlmIGZ1bGxwYXRoWy01Ol0gPD4gJy5odG1sJzoKLQkJCQkJCWNvbnRpbnVlCi0JCQkJCXN0YXR1c3NldChmdWxscGF0aCwgbGVuKGhpdHMpKQotCQkJCQlmID0gX29wZW4oZnVsbHBhdGgpCi0JCQkJCXRleHQgPSBmLnJlYWQoKQotCQkJCQlpZiBub3QgY2FzZToKLQkJCQkJCXRleHQgPSBzdHJpbmdsb3dlcih0ZXh0KQotCQkJCQlmLmNsb3NlKCkKLQkJCQkJZmlsZWhpdHMgPSBfbWF0Y2godGV4dCwgcGF0dGVybnMsIGFsbCkKLQkJCQkJaWYgZmlsZWhpdHM6Ci0JCQkJCQloaXRzW2Z1bGxwYXRoXSA9IGZpbGVoaXRzCi0JCWZpbmFsbHk6Ci0JCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQkJc3RhdHVzLmNsb3NlKCkKLQlleGNlcHQgS2V5Ym9hcmRJbnRlcnJ1cHQ6Ci0JCXBhc3MKLQloaXRzID0gaGl0cy5pdGVtcygpCi0JaGl0cy5zb3J0KCkKLQlyZXR1cm4gaGl0cworICAgIChkb2NwYXRoLCBraW5kLCBjYXNlLCB3b3JkLCB0dXQsIGxpYiwgcmVmLCBleHQsIGFwaSkgPSBzZXR0aW5ncworICAgIGJvb2tzID0gWyh0dXQsICd0dXQnKSwgKGxpYiwgJ2xpYicpLCAocmVmLCAncmVmJyksIChleHQsICdleHQnKSwgKGFwaSwgJ2FwaScpXQorICAgIGlmIG5vdCBjYXNlOgorICAgICAgICBzZWFyY2hzdHJpbmcgPSBzdHJpbmcubG93ZXIoc2VhcmNoc3RyaW5nKQorCisgICAgaWYga2luZCA9PSAxOgorICAgICAgICBwYXR0ZXJucyA9IHN0cmluZy5zcGxpdChzZWFyY2hzdHJpbmcpCisgICAgICAgIGFsbCA9IDEKKyAgICBlbGlmIGtpbmQgPT0gMjoKKyAgICAgICAgcGF0dGVybnMgPSBzdHJpbmcuc3BsaXQoc2VhcmNoc3RyaW5nKQorICAgICAgICBhbGwgPSAwCisgICAgZWxzZToKKyAgICAgICAgcGF0dGVybnMgPSBbc2VhcmNoc3RyaW5nXQorICAgICAgICBhbGwgPSAwICMgbm90IHJlbGV2YW50CisKKyAgICBvc3BhdGhqb2luID0gb3MucGF0aC5qb2luCisgICAgc3RyaW5nbG93ZXIgPSBzdHJpbmcubG93ZXIKKyAgICBzdGF0dXMgPSBTdGF0dXMoKQorICAgIHN0YXR1c3NldCA9IHN0YXR1cy5zZXQKKyAgICBfbWF0Y2ggPSBtYXRjaAorICAgIF9vcGVuID0gb3BlbgorICAgIGhpdHMgPSB7fQorICAgIHRyeToKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDApCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGZvciBkbywgbmFtZSBpbiBib29rczoKKyAgICAgICAgICAgICAgICBpZiBub3QgZG86CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICAgICAgYm9va3BhdGggPSBvc3BhdGhqb2luKGRvY3BhdGgsIG5hbWUpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGJvb2twYXRoKToKKyAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICBmaWxlcyA9IG9zLmxpc3RkaXIoYm9va3BhdGgpCisgICAgICAgICAgICAgICAgZm9yIGZpbGUgaW4gZmlsZXM6CisgICAgICAgICAgICAgICAgICAgIGZ1bGxwYXRoID0gb3NwYXRoam9pbihib29rcGF0aCwgZmlsZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgZnVsbHBhdGhbLTU6XSA8PiAnLmh0bWwnOgorICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgICAgICAgICAgc3RhdHVzc2V0KGZ1bGxwYXRoLCBsZW4oaGl0cykpCisgICAgICAgICAgICAgICAgICAgIGYgPSBfb3BlbihmdWxscGF0aCkKKyAgICAgICAgICAgICAgICAgICAgdGV4dCA9IGYucmVhZCgpCisgICAgICAgICAgICAgICAgICAgIGlmIG5vdCBjYXNlOgorICAgICAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHN0cmluZ2xvd2VyKHRleHQpCisgICAgICAgICAgICAgICAgICAgIGYuY2xvc2UoKQorICAgICAgICAgICAgICAgICAgICBmaWxlaGl0cyA9IF9tYXRjaCh0ZXh0LCBwYXR0ZXJucywgYWxsKQorICAgICAgICAgICAgICAgICAgICBpZiBmaWxlaGl0czoKKyAgICAgICAgICAgICAgICAgICAgICAgIGhpdHNbZnVsbHBhdGhdID0gZmlsZWhpdHMKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgICAgICAgICBzdGF0dXMuY2xvc2UoKQorICAgIGV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKKyAgICAgICAgcGFzcworICAgIGhpdHMgPSBoaXRzLml0ZW1zKCkKKyAgICBoaXRzLnNvcnQoKQorICAgIHJldHVybiBoaXRzCiAKIAogY2xhc3MgUHlEb2NTZWFyY2g6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYpOgotCQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JCXRyeToKLQkJCShkb2NwYXRoLCBraW5kLCBjYXNlLCB3b3JkLCB0dXQsIGxpYiwgcmVmLCBleHQsIGFwaSkgPSBwcmVmcy5kb2NzZWFyY2hlbmdpbmUKLQkJZXhjZXB0OgotCQkJKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKSA9IHByZWZzLmRvY3NlYXJjaGVuZ2luZSA9IFwKLQkJCQkoIiIsIDAsIDAsIDAsIDEsIDEsIDAsIDAsIDApCi0JCQotCQlpZiBkb2NwYXRoIGFuZCBub3QgdmVyaWZ5ZG9jcGF0aChkb2NwYXRoKToKLQkJCWRvY3BhdGggPSAiIgotCQkKLQkJc2VsZi53ID0gVy5XaW5kb3coKDQwMCwgMjAwKSwgIlNlYXJjaCB0aGUgUHl0aG9uIERvY3VtZW50YXRpb24iKQotCQlzZWxmLncuc2VhcmNodGV4dCA9IFcuRWRpdFRleHQoKDEwLCAxMCwgLTEwMCwgMjApLCBjYWxsYmFjayA9IHNlbGYuY2hlY2tidXR0b25zKQotCQlzZWxmLncuc2VhcmNoYnV0dG9uID0gVy5CdXR0b24oKC05MCwgMTIsIDgwLCAxNiksICJTZWFyY2giLCBzZWxmLnNlYXJjaCkKLQkJYnV0dG9ucyA9IFtdCi0JCQotCQlndXR0ZXIgPSAxMAotCQl3aWR0aCA9IDEzMAotCQlib29rc3RhcnQgPSB3aWR0aCArIDIgKiBndXR0ZXIKLQkJc2VsZi53LnBocmFzZXJhZGlvID0gVy5SYWRpb0J1dHRvbigoMTAsIDM4LCB3aWR0aCwgMTYpLCAiQXMgYSBwaHJhc2UiLCBidXR0b25zKQotCQlzZWxmLncuYWxsd29yZHNyYWRpbyA9IFcuUmFkaW9CdXR0b24oKDEwLCA1OCwgd2lkdGgsIDE2KSwgIkFsbCB3b3JkcyIsIGJ1dHRvbnMpCi0JCXNlbGYudy5hbnl3b3Jkc3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTAsIDc4LCB3aWR0aCwgMTYpLCAiQW55IHdvcmQiLCBidXR0b25zKQotCQlzZWxmLncuY2FzZXNlbnMgPSBXLkNoZWNrQm94KCgxMCwgOTgsIHdpZHRoLCAxNiksICJDYXNlIHNlbnNpdGl2ZSIpCi0JCXNlbGYudy53aG9sZXdvcmRzID0gVy5DaGVja0JveCgoMTAsIDExOCwgd2lkdGgsIDE2KSwgIldob2xlIHdvcmRzIikKLQkJc2VsZi53LnR1dG9yaWFsID0gVy5DaGVja0JveCgoYm9va3N0YXJ0LCAzOCwgLTEwLCAxNiksICJUdXRvcmlhbCIpCi0JCXNlbGYudy5saWJyYXJ5ID0gVy5DaGVja0JveCgoYm9va3N0YXJ0LCA1OCwgLTEwLCAxNiksICJMaWJyYXJ5IHJlZmVyZW5jZSIpCi0JCXNlbGYudy5sYW5ndWVyZWYgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDc4LCAtMTAsIDE2KSwgIkxhbnVhZ2UgcmVmZXJlbmNlIG1hbnVhbCIpCi0JCXNlbGYudy5leHRlbmRpbmcgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDk4LCAtMTAsIDE2KSwgIkV4dGVuZGluZyAmIGVtYmVkZGluZyIpCi0JCXNlbGYudy5hcGkgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDExOCwgLTEwLCAxNiksICJDL0MrKyBBUEkiKQotCQkKLQkJc2VsZi53LnNldGRvY2ZvbGRlcmJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgLTMwLCAxMDAsIDE2KSwgIlNldCBkb2MgZm9sZGVyIiwgc2VsZi5zZXRkb2NwYXRoKQotCQkKLQkJaWYgZG9jcGF0aDoKLQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5zZWFyY2hidXR0b24pCi0JCWVsc2U6Ci0JCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuc2V0ZG9jZm9sZGVyYnV0dG9uKQotCQkKLQkJc2VsZi5kb2NwYXRoID0gZG9jcGF0aAotCQlpZiBub3QgZG9jcGF0aDoKLQkJCWRvY3BhdGggPSAiKHBsZWFzZSBzZWxlY3QgdGhlIFB5dGhvbiBodG1sIGRvY3VtZW50YXRpb24gZm9sZGVyKSIKLQkJc2VsZi53LmRvY2ZvbGRlciA9IFcuVGV4dEJveCgoMTIwLCAtMjgsIC0xMCwgMTYpLCBkb2NwYXRoKQotCQkKLQkJW3NlbGYudy5waHJhc2VyYWRpbywgc2VsZi53LmFsbHdvcmRzcmFkaW8sIHNlbGYudy5hbnl3b3Jkc3JhZGlvXVtraW5kXS5zZXQoMSkKLQkJCi0JCXNlbGYudy5jYXNlc2Vucy5zZXQoY2FzZSkKLQkJc2VsZi53Lndob2xld29yZHMuc2V0KHdvcmQpCi0JCXNlbGYudy50dXRvcmlhbC5zZXQodHV0KQotCQlzZWxmLncubGlicmFyeS5zZXQobGliKQotCQlzZWxmLncubGFuZ3VlcmVmLnNldChyZWYpCi0JCXNlbGYudy5leHRlbmRpbmcuc2V0KGV4dCkKLQkJc2VsZi53LmFwaS5zZXQoYXBpKQotCQkKLQkJc2VsZi53Lm9wZW4oKQotCQlzZWxmLncud2hvbGV3b3Jkcy5lbmFibGUoMCkKLQkJc2VsZi53LmJpbmQoJzxjbG9zZT4nLCBzZWxmLmNsb3NlKQotCQlzZWxmLncuc2VhcmNoYnV0dG9uLmVuYWJsZSgwKQotCQotCWRlZiBzZWFyY2goc2VsZik6Ci0JCWhpdHMgPSBkb3NlYXJjaChzZWxmLmRvY3BhdGgsIHNlbGYudy5zZWFyY2h0ZXh0LmdldCgpLCBzZWxmLmdldHNldHRpbmdzKCkpCi0JCWlmIGhpdHM6Ci0JCQlSZXN1bHRzKGhpdHMpCi0JCWVsaWYgaGFzYXR0cihNYWNPUywgJ1N5c0JlZXAnKToKLQkJCU1hY09TLlN5c0JlZXAoMCkKLQkKLQlkZWYgc2V0ZG9jcGF0aChzZWxmKToKLQkJZG9jcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcigpCi0JCWlmIGRvY3BhdGg6Ci0JCQlpZiBub3QgdmVyaWZ5ZG9jcGF0aChkb2NwYXRoKToKLQkJCQlXLk1lc3NhZ2UoIlRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBhIFB5dGhvbiBkb2N1bWVudGF0aW9uIGZvbGRlci4uLiIpCi0JCQllbHNlOgotCQkJCXNlbGYuZG9jcGF0aCA9IGRvY3BhdGgKLQkJCQlzZWxmLncuZG9jZm9sZGVyLnNldChkb2NwYXRoKQotCQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5zZWFyY2hidXR0b24pCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCi0JCXByZWZzLmRvY3NlYXJjaGVuZ2luZSA9IHNlbGYuZ2V0c2V0dGluZ3MoKQotCQotCWRlZiBnZXRzZXR0aW5ncyhzZWxmKToKLQkJcmFkaW9idXR0b25zID0gW3NlbGYudy5waHJhc2VyYWRpbywgc2VsZi53LmFsbHdvcmRzcmFkaW8sIHNlbGYudy5hbnl3b3Jkc3JhZGlvXQotCQlmb3IgaSBpbiByYW5nZSgzKToKLQkJCWlmIHJhZGlvYnV0dG9uc1tpXS5nZXQoKToKLQkJCQlraW5kID0gaQotCQkJCWJyZWFrCi0JCWRvY3BhdGggPSBzZWxmLmRvY3BhdGgKLQkJY2FzZSA9IHNlbGYudy5jYXNlc2Vucy5nZXQoKQotCQl3b3JkID0gc2VsZi53Lndob2xld29yZHMuZ2V0KCkKLQkJdHV0ID0gc2VsZi53LnR1dG9yaWFsLmdldCgpCi0JCWxpYiA9IHNlbGYudy5saWJyYXJ5LmdldCgpCi0JCXJlZiA9IHNlbGYudy5sYW5ndWVyZWYuZ2V0KCkKLQkJZXh0ID0gc2VsZi53LmV4dGVuZGluZy5nZXQoKQotCQlhcGkgPSBzZWxmLncuYXBpLmdldCgpCi0JCXJldHVybiAoZG9jcGF0aCwga2luZCwgY2FzZSwgd29yZCwgdHV0LCBsaWIsIHJlZiwgZXh0LCBhcGkpCi0JCi0JZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKLQkJc2VsZi53LnNlYXJjaGJ1dHRvbi5lbmFibGUobm90IG5vdCBzZWxmLncuc2VhcmNodGV4dC5nZXQoKSkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICAoZG9jcGF0aCwga2luZCwgY2FzZSwgd29yZCwgdHV0LCBsaWIsIHJlZiwgZXh0LCBhcGkpID0gcHJlZnMuZG9jc2VhcmNoZW5naW5lCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIChkb2NwYXRoLCBraW5kLCBjYXNlLCB3b3JkLCB0dXQsIGxpYiwgcmVmLCBleHQsIGFwaSkgPSBwcmVmcy5kb2NzZWFyY2hlbmdpbmUgPSBcCisgICAgICAgICAgICAgICAgICAgICgiIiwgMCwgMCwgMCwgMSwgMSwgMCwgMCwgMCkKKworICAgICAgICBpZiBkb2NwYXRoIGFuZCBub3QgdmVyaWZ5ZG9jcGF0aChkb2NwYXRoKToKKyAgICAgICAgICAgIGRvY3BhdGggPSAiIgorCisgICAgICAgIHNlbGYudyA9IFcuV2luZG93KCg0MDAsIDIwMCksICJTZWFyY2ggdGhlIFB5dGhvbiBEb2N1bWVudGF0aW9uIikKKyAgICAgICAgc2VsZi53LnNlYXJjaHRleHQgPSBXLkVkaXRUZXh0KCgxMCwgMTAsIC0xMDAsIDIwKSwgY2FsbGJhY2sgPSBzZWxmLmNoZWNrYnV0dG9ucykKKyAgICAgICAgc2VsZi53LnNlYXJjaGJ1dHRvbiA9IFcuQnV0dG9uKCgtOTAsIDEyLCA4MCwgMTYpLCAiU2VhcmNoIiwgc2VsZi5zZWFyY2gpCisgICAgICAgIGJ1dHRvbnMgPSBbXQorCisgICAgICAgIGd1dHRlciA9IDEwCisgICAgICAgIHdpZHRoID0gMTMwCisgICAgICAgIGJvb2tzdGFydCA9IHdpZHRoICsgMiAqIGd1dHRlcgorICAgICAgICBzZWxmLncucGhyYXNlcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxMCwgMzgsIHdpZHRoLCAxNiksICJBcyBhIHBocmFzZSIsIGJ1dHRvbnMpCisgICAgICAgIHNlbGYudy5hbGx3b3Jkc3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTAsIDU4LCB3aWR0aCwgMTYpLCAiQWxsIHdvcmRzIiwgYnV0dG9ucykKKyAgICAgICAgc2VsZi53LmFueXdvcmRzcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxMCwgNzgsIHdpZHRoLCAxNiksICJBbnkgd29yZCIsIGJ1dHRvbnMpCisgICAgICAgIHNlbGYudy5jYXNlc2VucyA9IFcuQ2hlY2tCb3goKDEwLCA5OCwgd2lkdGgsIDE2KSwgIkNhc2Ugc2Vuc2l0aXZlIikKKyAgICAgICAgc2VsZi53Lndob2xld29yZHMgPSBXLkNoZWNrQm94KCgxMCwgMTE4LCB3aWR0aCwgMTYpLCAiV2hvbGUgd29yZHMiKQorICAgICAgICBzZWxmLncudHV0b3JpYWwgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDM4LCAtMTAsIDE2KSwgIlR1dG9yaWFsIikKKyAgICAgICAgc2VsZi53LmxpYnJhcnkgPSBXLkNoZWNrQm94KChib29rc3RhcnQsIDU4LCAtMTAsIDE2KSwgIkxpYnJhcnkgcmVmZXJlbmNlIikKKyAgICAgICAgc2VsZi53Lmxhbmd1ZXJlZiA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgNzgsIC0xMCwgMTYpLCAiTGFudWFnZSByZWZlcmVuY2UgbWFudWFsIikKKyAgICAgICAgc2VsZi53LmV4dGVuZGluZyA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgOTgsIC0xMCwgMTYpLCAiRXh0ZW5kaW5nICYgZW1iZWRkaW5nIikKKyAgICAgICAgc2VsZi53LmFwaSA9IFcuQ2hlY2tCb3goKGJvb2tzdGFydCwgMTE4LCAtMTAsIDE2KSwgIkMvQysrIEFQSSIpCisKKyAgICAgICAgc2VsZi53LnNldGRvY2ZvbGRlcmJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgLTMwLCAxMDAsIDE2KSwgIlNldCBkb2MgZm9sZGVyIiwgc2VsZi5zZXRkb2NwYXRoKQorCisgICAgICAgIGlmIGRvY3BhdGg6CisgICAgICAgICAgICBzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuc2VhcmNoYnV0dG9uKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53LnNldGRvY2ZvbGRlcmJ1dHRvbikKKworICAgICAgICBzZWxmLmRvY3BhdGggPSBkb2NwYXRoCisgICAgICAgIGlmIG5vdCBkb2NwYXRoOgorICAgICAgICAgICAgZG9jcGF0aCA9ICIocGxlYXNlIHNlbGVjdCB0aGUgUHl0aG9uIGh0bWwgZG9jdW1lbnRhdGlvbiBmb2xkZXIpIgorICAgICAgICBzZWxmLncuZG9jZm9sZGVyID0gVy5UZXh0Qm94KCgxMjAsIC0yOCwgLTEwLCAxNiksIGRvY3BhdGgpCisKKyAgICAgICAgW3NlbGYudy5waHJhc2VyYWRpbywgc2VsZi53LmFsbHdvcmRzcmFkaW8sIHNlbGYudy5hbnl3b3Jkc3JhZGlvXVtraW5kXS5zZXQoMSkKKworICAgICAgICBzZWxmLncuY2FzZXNlbnMuc2V0KGNhc2UpCisgICAgICAgIHNlbGYudy53aG9sZXdvcmRzLnNldCh3b3JkKQorICAgICAgICBzZWxmLncudHV0b3JpYWwuc2V0KHR1dCkKKyAgICAgICAgc2VsZi53LmxpYnJhcnkuc2V0KGxpYikKKyAgICAgICAgc2VsZi53Lmxhbmd1ZXJlZi5zZXQocmVmKQorICAgICAgICBzZWxmLncuZXh0ZW5kaW5nLnNldChleHQpCisgICAgICAgIHNlbGYudy5hcGkuc2V0KGFwaSkKKworICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYudy53aG9sZXdvcmRzLmVuYWJsZSgwKQorICAgICAgICBzZWxmLncuYmluZCgnPGNsb3NlPicsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudy5zZWFyY2hidXR0b24uZW5hYmxlKDApCisKKyAgICBkZWYgc2VhcmNoKHNlbGYpOgorICAgICAgICBoaXRzID0gZG9zZWFyY2goc2VsZi5kb2NwYXRoLCBzZWxmLncuc2VhcmNodGV4dC5nZXQoKSwgc2VsZi5nZXRzZXR0aW5ncygpKQorICAgICAgICBpZiBoaXRzOgorICAgICAgICAgICAgUmVzdWx0cyhoaXRzKQorICAgICAgICBlbGlmIGhhc2F0dHIoTWFjT1MsICdTeXNCZWVwJyk6CisgICAgICAgICAgICBNYWNPUy5TeXNCZWVwKDApCisKKyAgICBkZWYgc2V0ZG9jcGF0aChzZWxmKToKKyAgICAgICAgZG9jcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcigpCisgICAgICAgIGlmIGRvY3BhdGg6CisgICAgICAgICAgICBpZiBub3QgdmVyaWZ5ZG9jcGF0aChkb2NwYXRoKToKKyAgICAgICAgICAgICAgICBXLk1lc3NhZ2UoIlRoaXMgZG9lcyBub3Qgc2VlbSB0byBiZSBhIFB5dGhvbiBkb2N1bWVudGF0aW9uIGZvbGRlci4uLiIpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuZG9jcGF0aCA9IGRvY3BhdGgKKyAgICAgICAgICAgICAgICBzZWxmLncuZG9jZm9sZGVyLnNldChkb2NwYXRoKQorICAgICAgICAgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5zZWFyY2hidXR0b24pCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKKyAgICAgICAgcHJlZnMuZG9jc2VhcmNoZW5naW5lID0gc2VsZi5nZXRzZXR0aW5ncygpCisKKyAgICBkZWYgZ2V0c2V0dGluZ3Moc2VsZik6CisgICAgICAgIHJhZGlvYnV0dG9ucyA9IFtzZWxmLncucGhyYXNlcmFkaW8sIHNlbGYudy5hbGx3b3Jkc3JhZGlvLCBzZWxmLncuYW55d29yZHNyYWRpb10KKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UoMyk6CisgICAgICAgICAgICBpZiByYWRpb2J1dHRvbnNbaV0uZ2V0KCk6CisgICAgICAgICAgICAgICAga2luZCA9IGkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBkb2NwYXRoID0gc2VsZi5kb2NwYXRoCisgICAgICAgIGNhc2UgPSBzZWxmLncuY2FzZXNlbnMuZ2V0KCkKKyAgICAgICAgd29yZCA9IHNlbGYudy53aG9sZXdvcmRzLmdldCgpCisgICAgICAgIHR1dCA9IHNlbGYudy50dXRvcmlhbC5nZXQoKQorICAgICAgICBsaWIgPSBzZWxmLncubGlicmFyeS5nZXQoKQorICAgICAgICByZWYgPSBzZWxmLncubGFuZ3VlcmVmLmdldCgpCisgICAgICAgIGV4dCA9IHNlbGYudy5leHRlbmRpbmcuZ2V0KCkKKyAgICAgICAgYXBpID0gc2VsZi53LmFwaS5nZXQoKQorICAgICAgICByZXR1cm4gKGRvY3BhdGgsIGtpbmQsIGNhc2UsIHdvcmQsIHR1dCwgbGliLCByZWYsIGV4dCwgYXBpKQorCisgICAgZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKKyAgICAgICAgc2VsZi53LnNlYXJjaGJ1dHRvbi5lbmFibGUobm90IG5vdCBzZWxmLncuc2VhcmNodGV4dC5nZXQoKSkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlFZGl0LnB5IGIvTWFjL1Rvb2xzL0lERS9QeUVkaXQucHkKaW5kZXggY2UyMjhmZi4uODhjNzJhYyAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeUVkaXQucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeUVkaXQucHkKQEAgLTIxLDkgKzIxLDkgQEAKIHNtQWxsU2NyaXB0cyA9IC0zCiAKIGlmIGhhc2F0dHIoV2luLCAiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIpOgotCU15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnROb25GbG9hdGluZ1dpbmRvdworICAgIE15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnROb25GbG9hdGluZ1dpbmRvdwogZWxzZToKLQlNeUZyb250V2luZG93ID0gV2luLkZyb250V2luZG93CisgICAgTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udFdpbmRvdwogCiAKIF9zY3JpcHR1bnRpdGxlZGNvdW50ZXIgPSAxCkBAIC0zNSwxMzI4ICszNSwxMzI4IEBACiAKIAogY2xhc3MgRWRpdG9yKFcuV2luZG93KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcGF0aCA9ICIiLCB0aXRsZSA9ICIiKToKLQkJZGVmYXVsdGZvbnRzZXR0aW5ncywgZGVmYXVsdHRhYnNldHRpbmdzLCBkZWZhdWx0d2luZG93c2l6ZSA9IGdldGVkaXRvcnByZWZzKCkKLQkJZ2xvYmFsIF9zY3JpcHR1bnRpdGxlZGNvdW50ZXIKLQkJaWYgbm90IHBhdGg6Ci0JCQlpZiB0aXRsZToKLQkJCQlzZWxmLnRpdGxlID0gdGl0bGUKLQkJCWVsc2U6Ci0JCQkJc2VsZi50aXRsZSA9ICJVbnRpdGxlZCBTY3JpcHQgJXIiICUgKF9zY3JpcHR1bnRpdGxlZGNvdW50ZXIsKQotCQkJCV9zY3JpcHR1bnRpdGxlZGNvdW50ZXIgPSBfc2NyaXB0dW50aXRsZWRjb3VudGVyICsgMQotCQkJdGV4dCA9ICIiCi0JCQlzZWxmLl9jcmVhdG9yID0gVy5fc2lnbmF0dXJlCi0JCQlzZWxmLl9lb2xuID0gb3MubGluZXNlcAotCQllbGlmIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotCQkJcGF0aCA9IHJlc29sdmVhbGlhc2VzKHBhdGgpCi0JCQlkaXIsIG5hbWUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCi0JCQlzZWxmLnRpdGxlID0gbmFtZQotCQkJZiA9IG9wZW4ocGF0aCwgInJiIikKLQkJCXRleHQgPSBmLnJlYWQoKQotCQkJZi5jbG9zZSgpCi0JCQlzZWxmLl9jcmVhdG9yLCBmaWxldHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHBhdGgpCi0JCQlzZWxmLmFkZHJlY2VudGZpbGUocGF0aCkKLQkJCWlmICdcbicgaW4gdGV4dDoKLQkJCQlpZiBzdHJpbmcuZmluZCh0ZXh0LCAnXHJcbicpID49IDA6Ci0JCQkJCXNlbGYuX2VvbG4gPSAnXHJcbicKLQkJCQllbHNlOgotCQkJCQlzZWxmLl9lb2xuID0gJ1xuJwotCQkJCXRleHQgPSBzdHJpbmcucmVwbGFjZSh0ZXh0LCBzZWxmLl9lb2xuLCAnXHInKQotCQkJZWxzZToKLQkJCQlzZWxmLl9lb2xuID0gJ1xyJwotCQllbHNlOgotCQkJcmFpc2UgSU9FcnJvciwgImZpbGUgJyVzJyBkb2VzIG5vdCBleGlzdCIgJSBwYXRoCi0JCXNlbGYucGF0aCA9IHBhdGgKLQkJCi0JCXNlbGYuc2V0dGluZ3MgPSB7fQotCQlpZiBzZWxmLnBhdGg6Ci0JCQlzZWxmLnJlYWR3aW5kb3dzZXR0aW5ncygpCi0JCWlmIHNlbGYuc2V0dGluZ3MuaGFzX2tleSgid2luZG93Ym91bmRzIik6Ci0JCQlib3VuZHMgPSBzZWxmLnNldHRpbmdzWyJ3aW5kb3dib3VuZHMiXQotCQllbHNlOgotCQkJYm91bmRzID0gZGVmYXVsdHdpbmRvd3NpemUKLQkJaWYgc2VsZi5zZXR0aW5ncy5oYXNfa2V5KCJmb250c2V0dGluZ3MiKToKLQkJCXNlbGYuZm9udHNldHRpbmdzID0gc2VsZi5zZXR0aW5nc1siZm9udHNldHRpbmdzIl0KLQkJZWxzZToKLQkJCXNlbGYuZm9udHNldHRpbmdzID0gZGVmYXVsdGZvbnRzZXR0aW5ncwotCQlpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoInRhYnNpemUiKToKLQkJCXRyeToKLQkJCQlzZWxmLnRhYnNldHRpbmdzID0gKHRhYnNpemUsIHRhYm1vZGUpID0gc2VsZi5zZXR0aW5nc1sidGFic2l6ZSJdCi0JCQlleGNlcHQ6Ci0JCQkJc2VsZi50YWJzZXR0aW5ncyA9IGRlZmF1bHR0YWJzZXR0aW5ncwotCQllbHNlOgotCQkJc2VsZi50YWJzZXR0aW5ncyA9IGRlZmF1bHR0YWJzZXR0aW5ncwotCQkKLQkJVy5XaW5kb3cuX19pbml0X18oc2VsZiwgYm91bmRzLCBzZWxmLnRpdGxlLCBtaW5zaXplID0gKDMzMCwgMTIwKSwgdGFiYmFibGUgPSAwKQotCQlzZWxmLnNldHVwd2lkZ2V0cyh0ZXh0KQotCQkKLQkJaWYgc2VsZi5zZXR0aW5ncy5oYXNfa2V5KCJzZWxlY3Rpb24iKToKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnNldHRpbmdzWyJzZWxlY3Rpb24iXQotCQkJc2VsZi5zZXRzZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc2VsZi5vcGVuKCkKLQkJc2VsZi5zZXRpbmZvdGV4dCgpCi0JCXNlbGYuZ2xvYmFscyA9IHt9Ci0JCXNlbGYuX2J1ZiA9ICIiICAjIGZvciB3cml0ZSBtZXRob2QKLQkJc2VsZi5kZWJ1Z2dpbmcgPSAwCi0JCXNlbGYucHJvZmlsaW5nID0gMAotCQlzZWxmLnJ1bl9hc19tYWluID0gc2VsZi5zZXR0aW5ncy5nZXQoInJ1bl9hc19tYWluIiwgMCkKLQkJc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IHNlbGYuc2V0dGluZ3MuZ2V0KCJydW5fd2l0aF9pbnRlcnByZXRlciIsIDApCi0JCXNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIgPSBzZWxmLnNldHRpbmdzLmdldCgicnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIiLCAwKQotCQotCWRlZiByZWFkd2luZG93c2V0dGluZ3Moc2VsZik6Ci0JCXRyeToKLQkJCXJlc3JlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDEpCi0JCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQlyZXR1cm4KLQkJdHJ5OgotCQkJUmVzLlVzZVJlc0ZpbGUocmVzcmVmKQotCQkJZGF0YSA9IFJlcy5HZXQxUmVzb3VyY2UoJ1B5V1MnLCAxMjgpCi0JCQlzZWxmLnNldHRpbmdzID0gbWFyc2hhbC5sb2FkcyhkYXRhLmRhdGEpCi0JCWV4Y2VwdDoKLQkJCXBhc3MKLQkJUmVzLkNsb3NlUmVzRmlsZShyZXNyZWYpCi0JCQotCWRlZiB3cml0ZXdpbmRvd3NldHRpbmdzKHNlbGYpOgotCQl0cnk6Ci0JCQlyZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAzKQotCQlleGNlcHQgUmVzLkVycm9yOgotCQkJUmVzLkZTcENyZWF0ZVJlc0ZpbGUoc2VsZi5wYXRoLCBzZWxmLl9jcmVhdG9yLCAnVEVYVCcsIHNtQWxsU2NyaXB0cykKLQkJCXJlc3JlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCi0JCXRyeToKLQkJCWRhdGEgPSBSZXMuUmVzb3VyY2UobWFyc2hhbC5kdW1wcyhzZWxmLnNldHRpbmdzKSkKLQkJCVJlcy5Vc2VSZXNGaWxlKHJlc3JlZikKLQkJCXRyeToKLQkJCQl0ZW1wID0gUmVzLkdldDFSZXNvdXJjZSgnUHlXUycsIDEyOCkKLQkJCQl0ZW1wLlJlbW92ZVJlc291cmNlKCkKLQkJCWV4Y2VwdCBSZXMuRXJyb3I6Ci0JCQkJcGFzcwotCQkJZGF0YS5BZGRSZXNvdXJjZSgnUHlXUycsIDEyOCwgIndpbmRvdyBzZXR0aW5ncyIpCi0JCWZpbmFsbHk6Ci0JCQlSZXMuVXBkYXRlUmVzRmlsZShyZXNyZWYpCi0JCQlSZXMuQ2xvc2VSZXNGaWxlKHJlc3JlZikKLQkKLQlkZWYgZ2V0c2V0dGluZ3Moc2VsZik6Ci0JCXNlbGYuc2V0dGluZ3MgPSB7fQotCQlzZWxmLnNldHRpbmdzWyJ3aW5kb3dib3VuZHMiXSA9IHNlbGYuZ2V0Ym91bmRzKCkKLQkJc2VsZi5zZXR0aW5nc1sic2VsZWN0aW9uIl0gPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCXNlbGYuc2V0dGluZ3NbImZvbnRzZXR0aW5ncyJdID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldGZvbnRzZXR0aW5ncygpCi0JCXNlbGYuc2V0dGluZ3NbInRhYnNpemUiXSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXR0YWJzZXR0aW5ncygpCi0JCXNlbGYuc2V0dGluZ3NbInJ1bl9hc19tYWluIl0gPSBzZWxmLnJ1bl9hc19tYWluCi0JCXNlbGYuc2V0dGluZ3NbInJ1bl93aXRoX2ludGVycHJldGVyIl0gPSBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyCi0JCXNlbGYuc2V0dGluZ3NbInJ1bl93aXRoX2NsX2ludGVycHJldGVyIl0gPSBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQotCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCXJldHVybiBzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkKLQlkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgotCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0c2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCQotCWRlZiBnZXRzZWxlY3RlZHRleHQoc2VsZik6Ci0JCXJldHVybiBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkKLQlkZWYgZ2V0ZmlsZW5hbWUoc2VsZik6Ci0JCWlmIHNlbGYucGF0aDoKLQkJCXJldHVybiBzZWxmLnBhdGgKLQkJcmV0dXJuICc8JXM+JyAlIHNlbGYudGl0bGUKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYsIHRleHQpOgotCQl0b3BiYXJoZWlnaHQgPSAyNAotCQlwb3BmaWVsZHdpZHRoID0gODAKLQkJc2VsZi5sYXN0bGluZW5vID0gTm9uZQotCQkKLQkJIyBtYWtlIGFuIGVkaXRvcgotCQlzZWxmLmVkaXRncm91cCA9IFcuR3JvdXAoKDAsIHRvcGJhcmhlaWdodCArIDEsIDAsIDApKQotCQllZGl0b3IgPSBXLlB5RWRpdG9yKCgwLCAwLCAtMTUsLTE1KSwgdGV4dCwgCi0JCQkJZm9udHNldHRpbmdzID0gc2VsZi5mb250c2V0dGluZ3MsIAotCQkJCXRhYnNldHRpbmdzID0gc2VsZi50YWJzZXR0aW5ncywKLQkJCQlmaWxlID0gc2VsZi5nZXRmaWxlbmFtZSgpKQotCQkKLQkJIyBtYWtlIHRoZSB3aWRnZXRzCi0JCXNlbGYucG9wZmllbGQgPSBDbGFzc0ZpbmRlcigocG9wZmllbGR3aWR0aCAtIDE3LCAtMTUsIDE2LCAxNiksIFtdLCBzZWxmLnBvcHNlbGVjdGxpbmUpCi0JCXNlbGYubGluZWZpZWxkID0gVy5FZGl0VGV4dCgoLTEsIC0xNSwgcG9wZmllbGR3aWR0aCAtIDE1LCAxNiksIGluc2V0ID0gKDYsIDEpKQotCQlzZWxmLmVkaXRncm91cC5fYmFyeCA9IFcuU2Nyb2xsYmFyKChwb3BmaWVsZHdpZHRoIC0gMiwgLTE1LCAtMTQsIDE2KSwgZWRpdG9yLmhzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzZWxmLmVkaXRncm91cC5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDE0LCAxNiwgLTE0KSwgZWRpdG9yLnZzY3JvbGwsIG1heCA9IDMyNzY3KQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IgPSBlZGl0b3IJIyBhZGQgZWRpdG9yICphZnRlciogc2Nyb2xsYmFycwotCQkKLQkJc2VsZi5lZGl0Z3JvdXAub3B0aW9uc21lbnUgPSBXLlBvcHVwTWVudSgoLTE1LCAtMSwgMTYsIDE2KSwgW10pCi0JCXNlbGYuZWRpdGdyb3VwLm9wdGlvbnNtZW51LmJpbmQoJzxjbGljaz4nLCBzZWxmLm1ha2VvcHRpb25zbWVudSkKLQkJCi0JCXNlbGYuYmV2ZWxib3ggPSBXLkJldmVsQm94KCgwLCAwLCAwLCB0b3BiYXJoZWlnaHQpKQotCQlzZWxmLmhsaW5lID0gVy5Ib3Jpem9udGFsTGluZSgoMCwgdG9wYmFyaGVpZ2h0LCAwLCAwKSkKLQkJc2VsZi5pbmZvdGV4dCA9IFcuVGV4dEJveCgoMTc1LCA2LCAtNCwgMTQpLCBiYWNrZ3JvdW5kY29sb3IgPSAoMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCkpCi0JCXNlbGYucnVuYnV0dG9uID0gVy5CZXZlbEJ1dHRvbigoNiwgNCwgODAsIDE2KSwgcnVuQnV0dG9uTGFiZWxzWzBdLCBzZWxmLnJ1bikKLQkJc2VsZi5ydW5zZWxidXR0b24gPSBXLkJldmVsQnV0dG9uKCg5MCwgNCwgODAsIDE2KSwgcnVuU2VsQnV0dG9uTGFiZWxzWzBdLCBzZWxmLnJ1bnNlbGVjdGlvbikKLQkJCi0JCSMgYmluZCBzb21lIGtleXMKLQkJZWRpdG9yLmJpbmQoImNtZHIiLCBzZWxmLnJ1bmJ1dHRvbi5wdXNoKQotCQllZGl0b3IuYmluZCgiZW50ZXIiLCBzZWxmLnJ1bnNlbGJ1dHRvbi5wdXNoKQotCQllZGl0b3IuYmluZCgiY21kaiIsIHNlbGYuZG9tZW51X2dvdG9saW5lKQotCQllZGl0b3IuYmluZCgiY21kZCIsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKQotCQllZGl0b3IuYmluZCgiPGlkbGU+Iiwgc2VsZi51cGRhdGVzZWxlY3Rpb24pCi0JCQotCQllZGl0b3IuYmluZCgiY21kZSIsIHNlYXJjaGVuZ2luZS5zZXRmaW5kc3RyaW5nKQotCQllZGl0b3IuYmluZCgiY21kZiIsIHNlYXJjaGVuZ2luZS5zaG93KQotCQllZGl0b3IuYmluZCgiY21kZyIsIHNlYXJjaGVuZ2luZS5maW5kbmV4dCkKLQkJZWRpdG9yLmJpbmQoImNtZHNoaWZ0ciIsIHNlYXJjaGVuZ2luZS5yZXBsYWNlKQotCQllZGl0b3IuYmluZCgiY21kdCIsIHNlYXJjaGVuZ2luZS5yZXBsYWNlZmluZCkKLQkJCi0JCXNlbGYubGluZWZpZWxkLmJpbmQoInJldHVybiIsIHNlbGYuZG9saW5lZmllbGQpCi0JCXNlbGYubGluZWZpZWxkLmJpbmQoImVudGVyIiwgc2VsZi5kb2xpbmVmaWVsZCkKLQkJc2VsZi5saW5lZmllbGQuYmluZCgidGFiIiwgc2VsZi5kb2xpbmVmaWVsZCkKLQkJCi0JCSMgaW50ZXJjZXB0IGNsaWNrcwotCQllZGl0b3IuYmluZCgiPGNsaWNrPiIsIHNlbGYuY2xpY2tlZGl0b3IpCi0JCXNlbGYubGluZWZpZWxkLmJpbmQoIjxjbGljaz4iLCBzZWxmLmNsaWNrbGluZWZpZWxkKQotCQotCWRlZiBtYWtlb3B0aW9uc21lbnUoc2VsZik6Ci0JCW1lbnVpdGVtcyA9IFsoJ0ZvbnQgc2V0dGluZ3NceGM5Jywgc2VsZi5kb21lbnVfZm9udHNldHRpbmdzKSwgCi0JCQkJKCJTYXZlIG9wdGlvbnNceGM5Iiwgc2VsZi5kb21lbnVfb3B0aW9ucyksCi0JCQkJJy0nLAotCQkJCSgnXDAnICsgY2hyKHNlbGYucnVuX2FzX21haW4pICsgJ1J1biBhcyBfX21haW5fXycsIHNlbGYuZG9tZW51X3RvZ2dsZV9ydW5fYXNfbWFpbiksIAotCQkJCSMoJ1wwJyArIGNocihzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyKSArICdSdW4gd2l0aCBJbnRlcnByZXRlcicsIHNlbGYuZG9tZW51X2R0b2dnbGVfcnVuX3dpdGhfaW50ZXJwcmV0ZXIpLCAKLQkJCQkoJ1wwJyArIGNocihzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyKSArICdSdW4gd2l0aCBjb21tYW5kbGluZSBQeXRob24nLCBzZWxmLmRvbWVudV90b2dnbGVfcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIpLCAKLQkJCQknLScsCi0JCQkJKCdNb2R1bGFyaXplJywgc2VsZi5kb21lbnVfbW9kdWxhcml6ZSksCi0JCQkJKCdCcm93c2UgbmFtZXNwYWNlXHhjOScsIHNlbGYuZG9tZW51X2Jyb3dzZW5hbWVzcGFjZSksIAotCQkJCSctJ10KLQkJaWYgc2VsZi5wcm9maWxpbmc6Ci0JCQltZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdEaXNhYmxlIHByb2ZpbGVyJywgc2VsZi5kb21lbnVfdG9nZ2xlcHJvZmlsZXIpXQotCQllbHNlOgotCQkJbWVudWl0ZW1zID0gbWVudWl0ZW1zICsgWygnRW5hYmxlIHByb2ZpbGVyJywgc2VsZi5kb21lbnVfdG9nZ2xlcHJvZmlsZXIpXQotCQlpZiBzZWxmLmVkaXRncm91cC5lZGl0b3IuX2RlYnVnZ2VyOgotCQkJbWVudWl0ZW1zID0gbWVudWl0ZW1zICsgWygnRGlzYWJsZSBkZWJ1Z2dlcicsIHNlbGYuZG9tZW51X3RvZ2dsZWRlYnVnZ2VyKSwKLQkJCQkoJ0NsZWFyIGJyZWFrcG9pbnRzJywgc2VsZi5kb21lbnVfY2xlYXJicmVha3BvaW50cyksCi0JCQkJKCdFZGl0IGJyZWFrcG9pbnRzXHhjOScsIHNlbGYuZG9tZW51X2VkaXRicmVha3BvaW50cyldCi0JCWVsc2U6Ci0JCQltZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdFbmFibGUgZGVidWdnZXInLCBzZWxmLmRvbWVudV90b2dnbGVkZWJ1Z2dlcildCi0JCXNlbGYuZWRpdGdyb3VwLm9wdGlvbnNtZW51LnNldChtZW51aXRlbXMpCi0JCi0JZGVmIGRvbWVudV90b2dnbGVfcnVuX2FzX21haW4oc2VsZik6Ci0JCXNlbGYucnVuX2FzX21haW4gPSBub3Qgc2VsZi5ydW5fYXNfbWFpbgotCQlzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyID0gMAotCQlzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyID0gMAotCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCi0JZGVmIFhYZG9tZW51X3RvZ2dsZV9ydW5fd2l0aF9pbnRlcnByZXRlcihzZWxmKToKLQkJc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlciA9IG5vdCBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyCi0JCXNlbGYucnVuX2FzX21haW4gPSAwCi0JCXNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIgPSAwCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkKLQlkZWYgZG9tZW51X3RvZ2dsZV9ydW5fd2l0aF9jbF9pbnRlcnByZXRlcihzZWxmKToKLQkJc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IG5vdCBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyCi0JCXNlbGYucnVuX2FzX21haW4gPSAwCi0JCXNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSAwCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkKLQlkZWYgc2hvd2JyZWFrcG9pbnRzKHNlbGYsIG9ub2ZmKToKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNob3dicmVha3BvaW50cyhvbm9mZikKLQkJc2VsZi5kZWJ1Z2dpbmcgPSBvbm9mZgotCQotCWRlZiBkb21lbnVfY2xlYXJicmVha3BvaW50cyhzZWxmLCAqYXJncyk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5jbGVhcmJyZWFrcG9pbnRzKCkKLQkKLQlkZWYgZG9tZW51X2VkaXRicmVha3BvaW50cyhzZWxmLCAqYXJncyk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5lZGl0YnJlYWtwb2ludHMoKQotCQotCWRlZiBkb21lbnVfdG9nZ2xlZGVidWdnZXIoc2VsZiwgKmFyZ3MpOgotCQlpZiBub3Qgc2VsZi5kZWJ1Z2dpbmc6Ci0JCQlXLlNldEN1cnNvcignd2F0Y2gnKQotCQlzZWxmLmRlYnVnZ2luZyA9IG5vdCBzZWxmLmRlYnVnZ2luZwotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IudG9nZ2xlYnJlYWtwb2ludHMoKQotCQkKLQlkZWYgZG9tZW51X3RvZ2dsZXByb2ZpbGVyKHNlbGYsICphcmdzKToKLQkJc2VsZi5wcm9maWxpbmcgPSBub3Qgc2VsZi5wcm9maWxpbmcKLQkKLQlkZWYgZG9tZW51X2Jyb3dzZW5hbWVzcGFjZShzZWxmLCAqYXJncyk6Ci0JCWltcG9ydCBQeUJyb3dzZXIsIFcKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJZ2xvYmFscywgZmlsZSwgbW9kbmFtZSA9IHNlbGYuZ2V0ZW52aXJvbm1lbnQoKQotCQlpZiBub3QgbW9kbmFtZToKLQkJCW1vZG5hbWUgPSBzZWxmLnRpdGxlCi0JCVB5QnJvd3Nlci5Ccm93c2VyKGdsb2JhbHMsICJPYmplY3QgYnJvd3NlcjogIiArIG1vZG5hbWUpCi0JCi0JZGVmIGRvbWVudV9tb2R1bGFyaXplKHNlbGYsICphcmdzKToKLQkJbW9kbmFtZSA9IF9maWxlbmFtZV9hc19tb2RuYW1lKHNlbGYudGl0bGUpCi0JCWlmIG5vdCBtb2RuYW1lOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgbW9kdWxhcml6ZSBcIiVzXCIiICUgc2VsZi50aXRsZQotCQlydW5fYXNfbWFpbiA9IHNlbGYucnVuX2FzX21haW4KLQkJc2VsZi5ydW5fYXNfbWFpbiA9IDAKLQkJc2VsZi5ydW4oKQotCQlzZWxmLnJ1bl9hc19tYWluID0gcnVuX2FzX21haW4KLQkJaWYgc2VsZi5wYXRoOgotCQkJZmlsZSA9IHNlbGYucGF0aAotCQllbHNlOgotCQkJZmlsZSA9IHNlbGYudGl0bGUKLQkJCi0JCWlmIHNlbGYuZ2xvYmFscyBhbmQgbm90IHN5cy5tb2R1bGVzLmhhc19rZXkobW9kbmFtZSk6Ci0JCQltb2R1bGUgPSBpbXAubmV3X21vZHVsZShtb2RuYW1lKQotCQkJZm9yIGF0dHIgaW4gc2VsZi5nbG9iYWxzLmtleXMoKToKLQkJCQlzZXRhdHRyKG1vZHVsZSxhdHRyLHNlbGYuZ2xvYmFsc1thdHRyXSkKLQkJCXN5cy5tb2R1bGVzW21vZG5hbWVdID0gbW9kdWxlCi0JCQlzZWxmLmdsb2JhbHMgPSB7fQotCQotCWRlZiBkb21lbnVfZm9udHNldHRpbmdzKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IEZvbnRTZXR0aW5ncwotCQlmb250c2V0dGluZ3MgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0Zm9udHNldHRpbmdzKCkKLQkJdGFic2V0dGluZ3MgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0dGFic2V0dGluZ3MoKQotCQlzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MpCi0JCWlmIHNldHRpbmdzOgotCQkJZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncyA9IHNldHRpbmdzCi0JCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0Zm9udHNldHRpbmdzKGZvbnRzZXR0aW5ncykKLQkJCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZXR0YWJzZXR0aW5ncyh0YWJzZXR0aW5ncykKLQkKLQlkZWYgZG9tZW51X29wdGlvbnMoc2VsZiwgKmFyZ3MpOgotCQlydiA9IFNhdmVPcHRpb25zKHNlbGYuX2NyZWF0b3IsIHNlbGYuX2VvbG4pCi0JCWlmIHJ2OgotCQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKSAjIG91Y2guLi4KLQkJCXNlbGYuX2NyZWF0b3IsIHNlbGYuX2VvbG4gPSBydgotCQotCWRlZiBjbGlja2xpbmVmaWVsZChzZWxmKToKLQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCA8PiBzZWxmLmxpbmVmaWVsZDoKLQkJCXNlbGYubGluZWZpZWxkLnNlbGVjdCgxKQotCQkJc2VsZi5saW5lZmllbGQuc2VsZWN0YWxsKCkKLQkJCXJldHVybiAxCi0JCi0JZGVmIGNsaWNrZWRpdG9yKHNlbGYpOgotCQlpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IDw+IHNlbGYuZWRpdGdyb3VwLmVkaXRvcjoKLQkJCXNlbGYuZG9saW5lZmllbGQoKQotCQkJcmV0dXJuIDEKLQkKLQlkZWYgdXBkYXRlc2VsZWN0aW9uKHNlbGYsIGZvcmNlID0gMCk6Ci0JCXNlbCA9IG1pbihzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0c2VsZWN0aW9uKCkpCi0JCWxpbmVubyA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5vZmZzZXR0b2xpbmUoc2VsKQotCQlpZiBsaW5lbm8gPD4gc2VsZi5sYXN0bGluZW5vIG9yIGZvcmNlOgotCQkJc2VsZi5sYXN0bGluZW5vID0gbGluZW5vCi0JCQlzZWxmLmxpbmVmaWVsZC5zZXQoc3RyKGxpbmVubyArIDEpKQotCQkJc2VsZi5saW5lZmllbGQuc2VsdmlldygpCi0JCi0JZGVmIGRvbGluZWZpZWxkKHNlbGYpOgotCQl0cnk6Ci0JCQlsaW5lbm8gPSBzdHJpbmcuYXRvaShzZWxmLmxpbmVmaWVsZC5nZXQoKSkgLSAxCi0JCQlpZiBsaW5lbm8gPD4gc2VsZi5sYXN0bGluZW5vOgotCQkJCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3RsaW5lKGxpbmVubykKLQkJCQlzZWxmLnVwZGF0ZXNlbGVjdGlvbigxKQotCQlleGNlcHQ6Ci0JCQlzZWxmLnVwZGF0ZXNlbGVjdGlvbigxKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0KDEpCi0JCi0JZGVmIHNldGluZm90ZXh0KHNlbGYpOgotCQlpZiBub3QgaGFzYXR0cihzZWxmLCAnaW5mb3RleHQnKToKLQkJCXJldHVybgotCQlpZiBzZWxmLnBhdGg6Ci0JCQlzZWxmLmluZm90ZXh0LnNldChzZWxmLnBhdGgpCi0JCWVsc2U6Ci0JCQlzZWxmLmluZm90ZXh0LnNldCgiIikKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkOgotCQkJUWQuSW5pdEN1cnNvcigpCi0JCQlzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyAlIHNlbGYudGl0bGUsCi0JCQkJCWRlZmF1bHQ9MSwgbm89IkRvblx4ZDV0IHNhdmUiKQotCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJaWYgc2VsZi5kb21lbnVfc2F2ZSgpOgotCQkJCQlyZXR1cm4gMQotCQkJZWxpZiBzYXZlIDwgMDoKLQkJCQlyZXR1cm4gMQotCQlzZWxmLmdsb2JhbHMgPSBOb25lCi0JCVcuV2luZG93LmNsb3NlKHNlbGYpCi0JCi0JZGVmIGRvbWVudV9jbG9zZShzZWxmLCAqYXJncyk6Ci0JCXJldHVybiBzZWxmLmNsb3NlKCkKLQkKLQlkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgotCQlpZiBub3Qgc2VsZi5wYXRoOgotCQkJIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKLQkJCXJldHVybiBzZWxmLmRvbWVudV9zYXZlX2FzKCkKLQkJZGF0YSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQotCQlpZiBzZWxmLl9lb2xuICE9ICdccic6Ci0JCQlkYXRhID0gc3RyaW5nLnJlcGxhY2UoZGF0YSwgJ1xyJywgc2VsZi5fZW9sbikKLQkJZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgb3BlbiBmaWxlIGluIGJpbmFyeSBtb2RlLCBkYXRhIGhhcyAnXHInIGxpbmUtZW5kaW5ncwotCQlmcC53cml0ZShkYXRhKQotCQlmcC5jbG9zZSgpCi0JCU1hY09TLlNldENyZWF0b3JBbmRUeXBlKHNlbGYucGF0aCwgc2VsZi5fY3JlYXRvciwgJ1RFWFQnKQotCQlzZWxmLmdldHNldHRpbmdzKCkKLQkJc2VsZi53cml0ZXdpbmRvd3NldHRpbmdzKCkKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQgPSAwCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxjaGFuZ2VkID0gMAotCQlpbXBvcnQgbGluZWNhY2hlCi0JCWlmIGxpbmVjYWNoZS5jYWNoZS5oYXNfa2V5KHNlbGYucGF0aCk6Ci0JCQlkZWwgbGluZWNhY2hlLmNhY2hlW3NlbGYucGF0aF0KLQkJaW1wb3J0IG1hY29zdG9vbHMKLQkJbWFjb3N0b29scy50b3VjaGVkKHNlbGYucGF0aCkKLQkJc2VsZi5hZGRyZWNlbnRmaWxlKHNlbGYucGF0aCkKLQkKLQlkZWYgY2FuX3NhdmUoc2VsZiwgbWVudWl0ZW0pOgotCQlyZXR1cm4gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQgb3Igc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGNoYW5nZWQKLQkKLQlkZWYgZG9tZW51X3NhdmVfYXMoc2VsZiwgKmFyZ3MpOgotCQlwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhczonLCBzYXZlZEZpbGVOYW1lPXNlbGYudGl0bGUpCi0JCWlmIG5vdCBwYXRoOiAKLQkJCXJldHVybiAxCi0JCXNlbGYuc2hvd2JyZWFrcG9pbnRzKDApCi0JCXNlbGYucGF0aCA9IHBhdGgKLQkJc2VsZi5zZXRpbmZvdGV4dCgpCi0JCXNlbGYudGl0bGUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCi0JCXNlbGYud2lkLlNldFdUaXRsZShzZWxmLnRpdGxlKQotCQlzZWxmLmRvbWVudV9zYXZlKCkKLQkJc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNldGZpbGUoc2VsZi5nZXRmaWxlbmFtZSgpKQotCQlhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQkJYXBwLm1ha2VvcGVud2luZG93c21lbnUoKQotCQlpZiBoYXNhdHRyKGFwcCwgJ21ha2VzY3JpcHRzbWVudScpOgotCQkJYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCi0JCQlmc3IsIGNoYW5nZWQgPSBhcHAuc2NyaXB0c2ZvbGRlci5GU1Jlc29sdmVBbGlhcyhOb25lKQotCQkJcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCi0JCQlpZiBwYXRoID09IHNlbGYucGF0aFs6bGVuKHBhdGgpXToKLQkJCQlXLmdldGFwcGxpY2F0aW9uKCkubWFrZXNjcmlwdHNtZW51KCkKLQkKLQlkZWYgZG9tZW51X3NhdmVfYXNfYXBwbGV0KHNlbGYsICphcmdzKToKLQkJaW1wb3J0IGJ1aWxkdG9vbHMKLQkJCi0JCWJ1aWxkdG9vbHMuREVCVUcgPSAwCSMgb3VjaC4KLQkJCi0JCWlmIHNlbGYudGl0bGVbLTM6XSA9PSAiLnB5IjoKLQkJCWRlc3RuYW1lID0gc2VsZi50aXRsZVs6LTNdCi0JCWVsc2U6Ci0JCQlkZXN0bmFtZSA9IHNlbGYudGl0bGUgKyAiLmFwcGxldCIKLQkJZGVzdG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFzIEFwcGxldDonLCAKLQkJCXNhdmVkRmlsZU5hbWU9ZGVzdG5hbWUpCi0JCWlmIG5vdCBkZXN0bmFtZTogCi0JCQlyZXR1cm4gMQotCQlXLlNldEN1cnNvcigid2F0Y2giKQotCQlpZiBzZWxmLnBhdGg6Ci0JCQlmaWxlbmFtZSA9IHNlbGYucGF0aAotCQkJaWYgZmlsZW5hbWVbLTM6XSA9PSAiLnB5IjoKLQkJCQlyc3JjbmFtZSA9IGZpbGVuYW1lWzotM10gKyAnLnJzcmMnCi0JCQllbHNlOgotCQkJCXJzcmNuYW1lID0gZmlsZW5hbWUgKyAnLnJzcmMnCi0JCWVsc2U6Ci0JCQlmaWxlbmFtZSA9IHNlbGYudGl0bGUKLQkJCXJzcmNuYW1lID0gIiIKLQkJCi0JCXB5dGV4dCA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQotCQlweXRleHQgPSBzdHJpbmcuc3BsaXQocHl0ZXh0LCAnXHInKQotCQlweXRleHQgPSBzdHJpbmcuam9pbihweXRleHQsICdcbicpICsgJ1xuJwotCQl0cnk6Ci0JCQljb2RlID0gY29tcGlsZShweXRleHQsIGZpbGVuYW1lLCAiZXhlYyIpCi0JCWV4Y2VwdCAoU3ludGF4RXJyb3IsIEVPRkVycm9yKToKLQkJCXJhaXNlIGJ1aWxkdG9vbHMuQnVpbGRFcnJvciwgIlN5bnRheCBlcnJvciBpbiBzY3JpcHQgJXIiICUgKGZpbGVuYW1lLCkKLQkJCQotCQlpbXBvcnQgdGVtcGZpbGUKLQkJdG1wZGlyID0gdGVtcGZpbGUubWtkdGVtcCgpCi0JCQotCQlpZiBmaWxlbmFtZVstMzpdICE9ICIucHkiOgotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZSArICIucHkiCi0JCWZpbGVuYW1lID0gb3MucGF0aC5qb2luKHRtcGRpciwgb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0pCi0JCWZwID0gb3BlbihmaWxlbmFtZSwgInciKQotCQlmcC53cml0ZShweXRleHQpCi0JCWZwLmNsb3NlKCkKLQkJCi0JCSMgVHJ5IHJlbW92aW5nIHRoZSBvdXRwdXQgZmlsZQotCQl0cnk6Ci0JCQlvcy5yZW1vdmUoZGVzdG5hbWUpCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCXBhc3MKLQkJdGVtcGxhdGUgPSBidWlsZHRvb2xzLmZpbmR0ZW1wbGF0ZSgpCi0JCWJ1aWxkdG9vbHMucHJvY2Vzcyh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRlc3RuYW1lLCAxLCByc3JjbmFtZT1yc3JjbmFtZSwgcHJvZ3Jlc3M9Tm9uZSkKLQkJdHJ5OgotCQkJb3MucmVtb3ZlKGZpbGVuYW1lKQotCQkJb3Mucm1kaXIodG1wZGlyKQotCQlleGNlcHQgb3MuZXJyb3I6Ci0JCQlwYXNzCi0JCi0JZGVmIGRvbWVudV9nb3RvbGluZShzZWxmLCAqYXJncyk6Ci0JCXNlbGYubGluZWZpZWxkLnNlbGVjdGFsbCgpCi0JCXNlbGYubGluZWZpZWxkLnNlbGVjdCgxKQotCQlzZWxmLmxpbmVmaWVsZC5zZWxlY3RhbGwoKQotCQotCWRlZiBkb21lbnVfc2VsZWN0bGluZShzZWxmLCAqYXJncyk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5leHBhbmRzZWxlY3Rpb24oKQotCQotCWRlZiBkb21lbnVfZmluZChzZWxmLCAqYXJncyk6Ci0JCXNlYXJjaGVuZ2luZS5zaG93KCkKLQkKLQlkZWYgZG9tZW51X2VudGVyc2VhcmNoc3RyaW5nKHNlbGYsICphcmdzKToKLQkJc2VhcmNoZW5naW5lLnNldGZpbmRzdHJpbmcoKQotCQotCWRlZiBkb21lbnVfcmVwbGFjZShzZWxmLCAqYXJncyk6Ci0JCXNlYXJjaGVuZ2luZS5yZXBsYWNlKCkKLQkKLQlkZWYgZG9tZW51X2ZpbmRuZXh0KHNlbGYsICphcmdzKToKLQkJc2VhcmNoZW5naW5lLmZpbmRuZXh0KCkKLQkKLQlkZWYgZG9tZW51X3JlcGxhY2VmaW5kKHNlbGYsICphcmdzKToKLQkJc2VhcmNoZW5naW5lLnJlcGxhY2VmaW5kKCkKLQkKLQlkZWYgZG9tZW51X3J1bihzZWxmLCAqYXJncyk6Ci0JCXNlbGYucnVuYnV0dG9uLnB1c2goKQotCQotCWRlZiBkb21lbnVfcnVuc2VsZWN0aW9uKHNlbGYsICphcmdzKToKLQkJc2VsZi5ydW5zZWxidXR0b24ucHVzaCgpCi0JCi0JZGVmIHJ1bihzZWxmKToKLQkJc2VsZi5fcnVuKCkKLQkKLQlkZWYgX3J1bihzZWxmKToKLQkJaWYgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlcjoKLQkJCWlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkOgotCQkJCVFkLkluaXRDdXJzb3IoKQotCQkJCXNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSAiJXMiIGJlZm9yZSBydW5uaW5nPycgJSBzZWxmLnRpdGxlLCAxKQotCQkJCWlmIHNhdmUgPiAwOgotCQkJCQlpZiBzZWxmLmRvbWVudV9zYXZlKCk6Ci0JCQkJCQlyZXR1cm4KLQkJCQllbGlmIHNhdmUgPCAwOgotCQkJCQlyZXR1cm4KLQkJCWlmIG5vdCBzZWxmLnBhdGg6Ci0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIHVuc2F2ZWQgZmlsZSIKLQkJCXNlbGYuX3J1bl93aXRoX2ludGVycHJldGVyKCkKLQkJZWxpZiBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyOgotCQkJaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQ6Ci0JCQkJUWQuSW5pdEN1cnNvcigpCi0JCQkJc2F2ZSA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCdTYXZlICIlcyIgYmVmb3JlIHJ1bm5pbmc/JyAlIHNlbGYudGl0bGUsIDEpCi0JCQkJaWYgc2F2ZSA+IDA6Ci0JCQkJCWlmIHNlbGYuZG9tZW51X3NhdmUoKToKLQkJCQkJCXJldHVybgotCQkJCWVsaWYgc2F2ZSA8IDA6Ci0JCQkJCXJldHVybgotCQkJaWYgbm90IHNlbGYucGF0aDoKLQkJCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBydW4gdW5zYXZlZCBmaWxlIgotCQkJc2VsZi5fcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIoKQotCQllbHNlOgotCQkJcHl0ZXh0ID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCi0JCQlnbG9iYWxzLCBmaWxlLCBtb2RuYW1lID0gc2VsZi5nZXRlbnZpcm9ubWVudCgpCi0JCQlzZWxmLmV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBnbG9iYWxzLCBmaWxlLCBtb2RuYW1lKQotCQotCWRlZiBfcnVuX3dpdGhfaW50ZXJwcmV0ZXIoc2VsZik6Ci0JCWludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgIlB5dGhvbkludGVycHJldGVyIikKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgaW50ZXJwcmV0ZXIiCi0JCWltcG9ydCBmaW5kZXJ0b29scwotCQlYWFgKIAotCWRlZiBfcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIoc2VsZik6Ci0JCWltcG9ydCBUZXJtaW5hbAotCQlpbnRlcnBfcGF0aCA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsIAotCQkJIlJlc291cmNlcyIsICJQeXRob24uYXBwIiwgIkNvbnRlbnRzIiwgIk1hY09TIiwgIlB5dGhvbiIpCi0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbnRlcnBfcGF0aCk6Ci0JCQlpbnRlcnBfcGF0aCA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICJiaW4iLCAicHl0aG9uIikKLQkJZmlsZV9wYXRoID0gc2VsZi5wYXRoCi0JCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbnRlcnBfcGF0aCk6Ci0JCQkjIFRoaXMgImNhbiBoYXBwZW4iIGlmIHdlIGFyZSBydW5uaW5nIElERSB1bmRlciBNYWNQeXRob24tT1M5LgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBjb21tYW5kLWxpbmUgUHl0aG9uIgotCQljbWQgPSAnIiVzIiAiJXMiIDsgZXhpdCcgJSAoaW50ZXJwX3BhdGgsIGZpbGVfcGF0aCkKLQkJdCA9IFRlcm1pbmFsLlRlcm1pbmFsKCkKLQkJdC5kb19zY3JpcHQoY21kKQotCQotCWRlZiBydW5zZWxlY3Rpb24oc2VsZik6Ci0JCXNlbGYuX3J1bnNlbGVjdGlvbigpCi0JCi0JZGVmIF9ydW5zZWxlY3Rpb24oc2VsZik6Ci0JCWlmIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgb3Igc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlcjoKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IHJ1biBzZWxlY3Rpb24gd2l0aCBJbnRlcnByZXRlciIKLQkJZ2xvYmFscywgZmlsZSwgbW9kbmFtZSA9IHNlbGYuZ2V0ZW52aXJvbm1lbnQoKQotCQlsb2NhbHMgPSBnbG9iYWxzCi0JCSMgc2VsZWN0IHdob2xlIGxpbmVzCi0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5leHBhbmRzZWxlY3Rpb24oKQotCQkKLQkJIyBnZXQgbGluZW5vIG9mIGZpcnN0IHNlbGVjdGVkIGxpbmUKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc2VsZmlyc3RsaW5lID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLm9mZnNldHRvbGluZShzZWxzdGFydCkKLQkJYWxsdGV4dCA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQotCQlweXRleHQgPSBhbGx0ZXh0W3NlbHN0YXJ0OnNlbGVuZF0KLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQocHl0ZXh0LCAnXHInKQotCQlpbmRlbnQgPSBnZXRtaW5pbmRlbnQobGluZXMpCi0JCWlmIGluZGVudCA9PSAxOgotCQkJY2xhc3NuYW1lID0gJycKLQkJCWFsbGxpbmVzID0gc3RyaW5nLnNwbGl0KGFsbHRleHQsICdccicpCi0JCQlmb3IgaSBpbiByYW5nZShzZWxmaXJzdGxpbmUgLSAxLCAtMSwgLTEpOgotCQkJCWxpbmUgPSBhbGxsaW5lc1tpXQotCQkJCWlmIGxpbmVbOjZdID09ICdjbGFzcyAnOgotCQkJCQljbGFzc25hbWUgPSBzdHJpbmcuc3BsaXQoc3RyaW5nLnN0cmlwKGxpbmVbNjpdKSlbMF0KLQkJCQkJY2xhc3NlbmQgPSBpZGVudGlmaWVSRV9tYXRjaChjbGFzc25hbWUpCi0JCQkJCWlmIGNsYXNzZW5kIDwgMToKLQkJCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgYSBjbGFzcy4iCi0JCQkJCWNsYXNzbmFtZSA9IGNsYXNzbmFtZVs6Y2xhc3NlbmRdCi0JCQkJCWJyZWFrCi0JCQkJZWxpZiBsaW5lIGFuZCBsaW5lWzBdIG5vdCBpbiAnXHQjJzoKLQkJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBhIGNsYXNzLiIKLQkJCWVsc2U6Ci0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBhIGNsYXNzLiIKLQkJCWlmIGdsb2JhbHMuaGFzX2tleShjbGFzc25hbWUpOgotCQkJCWtsYXNzID0gZ2xvYmFsc1tjbGFzc25hbWVdCi0JCQllbHNlOgotCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgY2xhc3MgXCIlc1wiLiIgJSBjbGFzc25hbWUKLQkJCSMgYWRkIGNsYXNzIGRlZgotCQkJcHl0ZXh0ID0gKCJjbGFzcyAlczpcbiIgJSBjbGFzc25hbWUpICsgcHl0ZXh0Ci0JCQlzZWxmaXJzdGxpbmUgPSBzZWxmaXJzdGxpbmUgLSAxCi0JCWVsaWYgaW5kZW50ID4gMDoKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IHJ1biBpbmRlbnRlZCBjb2RlLiIKLQkJCi0JCSMgYWRkICJuZXdsaW5lcyIgdG8gZm9vbCBjb21waWxlL2V4ZWM6IAotCQkjIG5vdyBhIHRyYWNlYmFjayB3aWxsIGdpdmUgdGhlIHJpZ2h0IGxpbmUgbnVtYmVyCi0JCXB5dGV4dCA9IHNlbGZpcnN0bGluZSAqICdccicgKyBweXRleHQKLQkJc2VsZi5leGVjc3RyaW5nKHB5dGV4dCwgZ2xvYmFscywgbG9jYWxzLCBmaWxlLCBtb2RuYW1lKQotCQlpZiBpbmRlbnQgPT0gMSBhbmQgZ2xvYmFsc1tjbGFzc25hbWVdIGlzIG5vdCBrbGFzczoKLQkJCSMgdXBkYXRlIHRoZSBjbGFzcyBpbiBwbGFjZQotCQkJa2xhc3MuX19kaWN0X18udXBkYXRlKGdsb2JhbHNbY2xhc3NuYW1lXS5fX2RpY3RfXykKLQkJCWdsb2JhbHNbY2xhc3NuYW1lXSA9IGtsYXNzCi0JCi0JZGVmIGV4ZWNzdHJpbmcoc2VsZiwgcHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIG1vZG5hbWUpOgotCQl0cmFjZWJhY2t3aW5kb3cuaGlkZSgpCi0JCSMgdXBkYXRlIHdpbmRvd3MKLQkJVy5nZXRhcHBsaWNhdGlvbigpLnJlZnJlc2h3aW5kb3dzKCkKLQkJaWYgc2VsZi5ydW5fYXNfbWFpbjoKLQkJCW1vZG5hbWUgPSAiX19tYWluX18iCi0JCWlmIHNlbGYucGF0aDoKLQkJCWRpciA9IG9zLnBhdGguZGlybmFtZShzZWxmLnBhdGgpCi0JCQlzYXZlZGlyID0gb3MuZ2V0Y3dkKCkKLQkJCW9zLmNoZGlyKGRpcikKLQkJCXN5cy5wYXRoLmluc2VydCgwLCBkaXIpCi0JCXNlbGYuX3NjcmlwdERvbmUgPSBGYWxzZQotCQlpZiBzeXMucGxhdGZvcm0gPT0gImRhcndpbiI6Ci0JCQkjIE9uIE1hY09TWCwgTWFjUHl0aG9uIGRvZXNuJ3QgcG9sbCBmb3IgY29tbWFuZC1wZXJpb2QKLQkJCSMgKGNhbmNlbCksIHNvIHRvIGVuYWJsZSB0aGUgdXNlciB0byBjYW5jZWwgYSBydW5uaW5nCi0JCQkjIHNjcmlwdCwgd2UgaGF2ZSB0byBzcGF3biBhIHRocmVhZCB3aGljaCBkb2VzIHRoZQotCQkJIyBwb2xsaW5nLiBJdCB3aWxsIHNlbmQgYSBTSUdJTlQgdG8gdGhlIG1haW4gdGhyZWFkCi0JCQkjIChpbiB3aGljaCB0aGUgc2NyaXB0IGlzIHJ1bm5pbmcpIHdoZW4gdGhlIHVzZXIgdHlwZXMKLQkJCSMgY29tbWFuZC1wZXJpb2QuCi0JCQlmcm9tIHRocmVhZGluZyBpbXBvcnQgVGhyZWFkCi0JCQl0ID0gVGhyZWFkKHRhcmdldD1zZWxmLl91c2VyQ2FuY2VsbGVkTW9uaXRvciwKLQkJCQkJbmFtZT0iVXNlckNhbmNlbGxlZE1vbml0b3IiKQotCQkJdC5zdGFydCgpCi0JCXRyeToKLQkJCWV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIHNlbGYuZGVidWdnaW5nLCAKLQkJCQkJbW9kbmFtZSwgc2VsZi5wcm9maWxpbmcpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLl9zY3JpcHREb25lID0gVHJ1ZQotCQkJaWYgc2VsZi5wYXRoOgotCQkJCW9zLmNoZGlyKHNhdmVkaXIpCi0JCQkJZGVsIHN5cy5wYXRoWzBdCi0JCi0JZGVmIF91c2VyQ2FuY2VsbGVkTW9uaXRvcihzZWxmKToKLQkJaW1wb3J0IHRpbWUKLQkJZnJvbSBzaWduYWwgaW1wb3J0IFNJR0lOVAotCQl3aGlsZSBub3Qgc2VsZi5fc2NyaXB0RG9uZToKLQkJCWlmIEV2dC5DaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsKCk6Ci0JCQkJIyBTZW5kIGEgU0lHSU5UIHNpZ25hbCB0byBvdXJzZWx2ZXMuCi0JCQkJIyBUaGlzIGdldHMgZGVsaXZlcmVkIHRvIHRoZSBtYWluIHRocmVhZCwKLQkJCQkjIGNhbmNlbGxpbmcgdGhlIHJ1bm5pbmcgc2NyaXB0LgotCQkJCW9zLmtpbGwob3MuZ2V0cGlkKCksIFNJR0lOVCkKLQkJCQlicmVhawotCQkJdGltZS5zbGVlcCgwLjI1KQotCQotCWRlZiBnZXRlbnZpcm9ubWVudChzZWxmKToKLQkJaWYgc2VsZi5wYXRoOgotCQkJZmlsZSA9IHNlbGYucGF0aAotCQkJZGlyID0gb3MucGF0aC5kaXJuYW1lKGZpbGUpCi0JCQkjIGNoZWNrIGlmIHdlJ3JlIHBhcnQgb2YgYSBwYWNrYWdlCi0JCQltb2RuYW1lID0gIiIKLQkJCXdoaWxlIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihkaXIsICJfX2luaXRfXy5weSIpKToKLQkJCQlkaXIsIGRpcm5hbWUgPSBvcy5wYXRoLnNwbGl0KGRpcikKLQkJCQltb2RuYW1lID0gZGlybmFtZSArICcuJyArIG1vZG5hbWUKLQkJCXN1Ym5hbWUgPSBfZmlsZW5hbWVfYXNfbW9kbmFtZShzZWxmLnRpdGxlKQotCQkJaWYgc3VibmFtZSBpcyBOb25lOgotCQkJCXJldHVybiBzZWxmLmdsb2JhbHMsIGZpbGUsIE5vbmUKLQkJCWlmIG1vZG5hbWU6Ci0JCQkJaWYgc3VibmFtZSA9PSAiX19pbml0X18iOgotCQkJCQkjIHN0cmlwIHRyYWlsaW5nIHBlcmlvZAotCQkJCQltb2RuYW1lID0gbW9kbmFtZVs6LTFdCi0JCQkJZWxzZToKLQkJCQkJbW9kbmFtZSA9IG1vZG5hbWUgKyBzdWJuYW1lCi0JCQllbHNlOgotCQkJCW1vZG5hbWUgPSBzdWJuYW1lCi0JCQlpZiBzeXMubW9kdWxlcy5oYXNfa2V5KG1vZG5hbWUpOgotCQkJCWdsb2JhbHMgPSBzeXMubW9kdWxlc1ttb2RuYW1lXS5fX2RpY3RfXwotCQkJCXNlbGYuZ2xvYmFscyA9IHt9Ci0JCQllbHNlOgotCQkJCWdsb2JhbHMgPSBzZWxmLmdsb2JhbHMKLQkJCQltb2RuYW1lID0gc3VibmFtZQotCQllbHNlOgotCQkJZmlsZSA9ICc8JXM+JyAlIHNlbGYudGl0bGUKLQkJCWdsb2JhbHMgPSBzZWxmLmdsb2JhbHMKLQkJCW1vZG5hbWUgPSBmaWxlCi0JCXJldHVybiBnbG9iYWxzLCBmaWxlLCBtb2RuYW1lCi0JCi0JZGVmIHdyaXRlKHNlbGYsIHN0dWZmKToKLQkJIiIiZm9yIHVzZSBhcyBzdGRvdXQiIiIKLQkJc2VsZi5fYnVmID0gc2VsZi5fYnVmICsgc3R1ZmYKLQkJaWYgJ1xuJyBpbiBzZWxmLl9idWY6Ci0JCQlzZWxmLmZsdXNoKCkKLQkKLQlkZWYgZmx1c2goc2VsZik6Ci0JCXN0dWZmID0gc3RyaW5nLnNwbGl0KHNlbGYuX2J1ZiwgJ1xuJykKLQkJc3R1ZmYgPSBzdHJpbmcuam9pbihzdHVmZiwgJ1xyJykKLQkJZW5kID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnRlZC5XRUdldFRleHRMZW5ndGgoKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFU2V0U2VsZWN0aW9uKGVuZCwgZW5kKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQotCQlzZWxmLmVkaXRncm91cC5lZGl0b3IudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYuX2J1ZiA9ICIiCi0JCSMgPyBvcHRpb25hbDoKLQkJI3NlbGYud2lkLlNlbGVjdFdpbmRvdygpCi0JCi0JZGVmIGdldGNsYXNzbGlzdChzZWxmKToKLQkJZnJvbSBzdHJpbmcgaW1wb3J0IGZpbmQsIHN0cmlwCi0JCW1ldGhvZFJFID0gcmUuY29tcGlsZShyIlxyWyBcdF0rZGVmICIpCi0JCWZpbmRNZXRob2QgPSBtZXRob2RSRS5zZWFyY2gKLQkJZWRpdG9yID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yCi0JCXRleHQgPSBlZGl0b3IuZ2V0KCkKLQkJbGlzdCA9IFtdCi0JCWFwcGVuZCA9IGxpc3QuYXBwZW5kCi0JCWZ1bmN0YWcgPSAiZnVuYyIKLQkJY2xhc3N0YWcgPSAiY2xhc3MiCi0JCW1ldGhvZHRhZyA9ICJtZXRob2QiCi0JCXBvcyA9IC0xCi0JCWlmIHRleHRbOjRdID09ICdkZWYgJzoKLQkJCWFwcGVuZCgocG9zICsgNCwgZnVuY3RhZykpCi0JCQlwb3MgPSA0Ci0JCXdoaWxlIDE6Ci0JCQlwb3MgPSBmaW5kKHRleHQsICdccmRlZiAnLCBwb3MgKyAxKQotCQkJaWYgcG9zIDwgMDoKLQkJCQlicmVhawotCQkJYXBwZW5kKChwb3MgKyA1LCBmdW5jdGFnKSkKLQkJcG9zID0gLTEKLQkJaWYgdGV4dFs6Nl0gPT0gJ2NsYXNzICc6Ci0JCQlhcHBlbmQoKHBvcyArIDYsIGNsYXNzdGFnKSkKLQkJCXBvcyA9IDYKLQkJd2hpbGUgMToKLQkJCXBvcyA9IGZpbmQodGV4dCwgJ1xyY2xhc3MgJywgcG9zICsgMSkKLQkJCWlmIHBvcyA8IDA6Ci0JCQkJYnJlYWsKLQkJCWFwcGVuZCgocG9zICsgNywgY2xhc3N0YWcpKQotCQlwb3MgPSAwCi0JCXdoaWxlIDE6Ci0JCQltID0gZmluZE1ldGhvZCh0ZXh0LCBwb3MgKyAxKQotCQkJaWYgbSBpcyBOb25lOgotCQkJCWJyZWFrCi0JCQlwb3MgPSBtLnJlZ3NbMF1bMF0KLQkJCSNwb3MgPSBmaW5kKHRleHQsICdcclx0ZGVmICcsIHBvcyArIDEpCi0JCQlhcHBlbmQoKG0ucmVnc1swXVsxXSwgbWV0aG9kdGFnKSkKLQkJbGlzdC5zb3J0KCkKLQkJY2xhc3NsaXN0ID0gW10KLQkJbWV0aG9kbGlzdGFwcGVuZCA9IE5vbmUKLQkJb2Zmc2V0VG9MaW5lID0gZWRpdG9yLnRlZC5XRU9mZnNldFRvTGluZQotCQlnZXRMaW5lUmFuZ2UgPSBlZGl0b3IudGVkLldFR2V0TGluZVJhbmdlCi0JCWFwcGVuZCA9IGNsYXNzbGlzdC5hcHBlbmQKLQkJZm9yIHBvcywgdGFnIGluIGxpc3Q6Ci0JCQlsaW5lbm8gPSBvZmZzZXRUb0xpbmUocG9zKQotCQkJbGluZVN0YXJ0LCBsaW5lRW5kID0gZ2V0TGluZVJhbmdlKGxpbmVubykKLQkJCWxpbmUgPSBzdHJpcCh0ZXh0W3BvczpsaW5lRW5kXSkKLQkJCWxpbmUgPSBsaW5lWzppZGVudGlmaWVSRV9tYXRjaChsaW5lKV0KLQkJCWlmIHRhZyBpcyBmdW5jdGFnOgotCQkJCWFwcGVuZCgoImRlZiAiICsgbGluZSwgbGluZW5vICsgMSkpCi0JCQkJbWV0aG9kbGlzdGFwcGVuZCA9IE5vbmUKLQkJCWVsaWYgdGFnIGlzIGNsYXNzdGFnOgotCQkJCWFwcGVuZChbImNsYXNzICIgKyBsaW5lXSkKLQkJCQltZXRob2RsaXN0YXBwZW5kID0gY2xhc3NsaXN0Wy0xXS5hcHBlbmQKLQkJCWVsaWYgbWV0aG9kbGlzdGFwcGVuZCBhbmQgdGFnIGlzIG1ldGhvZHRhZzoKLQkJCQltZXRob2RsaXN0YXBwZW5kKCgiZGVmICIgKyBsaW5lLCBsaW5lbm8gKyAxKSkKLQkJcmV0dXJuIGNsYXNzbGlzdAotCQotCWRlZiBwb3BzZWxlY3RsaW5lKHNlbGYsIGxpbmVubyk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3RsaW5lKGxpbmVubyAtIDEpCi0JCi0JZGVmIHNlbGVjdGxpbmUoc2VsZiwgbGluZW5vLCBjaGFyb2Zmc2V0ID0gMCk6Ci0JCXNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3RsaW5lKGxpbmVubyAtIDEsIGNoYXJvZmZzZXQpCi0JCQotCWRlZiBhZGRyZWNlbnRmaWxlKHNlbGYsIGZpbGVuYW1lKToKLQkJYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCi0JCWFwcC5hZGRyZWNlbnRmaWxlKGZpbGVuYW1lKQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwYXRoID0gIiIsIHRpdGxlID0gIiIpOgorICAgICAgICBkZWZhdWx0Zm9udHNldHRpbmdzLCBkZWZhdWx0dGFic2V0dGluZ3MsIGRlZmF1bHR3aW5kb3dzaXplID0gZ2V0ZWRpdG9ycHJlZnMoKQorICAgICAgICBnbG9iYWwgX3NjcmlwdHVudGl0bGVkY291bnRlcgorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIGlmIHRpdGxlOgorICAgICAgICAgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRpdGxlID0gIlVudGl0bGVkIFNjcmlwdCAlciIgJSAoX3NjcmlwdHVudGl0bGVkY291bnRlciwpCisgICAgICAgICAgICAgICAgX3NjcmlwdHVudGl0bGVkY291bnRlciA9IF9zY3JpcHR1bnRpdGxlZGNvdW50ZXIgKyAxCisgICAgICAgICAgICB0ZXh0ID0gIiIKKyAgICAgICAgICAgIHNlbGYuX2NyZWF0b3IgPSBXLl9zaWduYXR1cmUKKyAgICAgICAgICAgIHNlbGYuX2VvbG4gPSBvcy5saW5lc2VwCisgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBwYXRoID0gcmVzb2x2ZWFsaWFzZXMocGF0aCkKKyAgICAgICAgICAgIGRpciwgbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyAgICAgICAgICAgIHNlbGYudGl0bGUgPSBuYW1lCisgICAgICAgICAgICBmID0gb3BlbihwYXRoLCAicmIiKQorICAgICAgICAgICAgdGV4dCA9IGYucmVhZCgpCisgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIHNlbGYuX2NyZWF0b3IsIGZpbGV0eXBlID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUocGF0aCkKKyAgICAgICAgICAgIHNlbGYuYWRkcmVjZW50ZmlsZShwYXRoKQorICAgICAgICAgICAgaWYgJ1xuJyBpbiB0ZXh0OgorICAgICAgICAgICAgICAgIGlmIHN0cmluZy5maW5kKHRleHQsICdcclxuJykgPj0gMDoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fZW9sbiA9ICdcclxuJworICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2VvbG4gPSAnXG4nCisgICAgICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5yZXBsYWNlKHRleHQsIHNlbGYuX2VvbG4sICdccicpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2VvbG4gPSAnXHInCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBJT0Vycm9yLCAiZmlsZSAnJXMnIGRvZXMgbm90IGV4aXN0IiAlIHBhdGgKKyAgICAgICAgc2VsZi5wYXRoID0gcGF0aAorCisgICAgICAgIHNlbGYuc2V0dGluZ3MgPSB7fQorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICBzZWxmLnJlYWR3aW5kb3dzZXR0aW5ncygpCisgICAgICAgIGlmIHNlbGYuc2V0dGluZ3MuaGFzX2tleSgid2luZG93Ym91bmRzIik6CisgICAgICAgICAgICBib3VuZHMgPSBzZWxmLnNldHRpbmdzWyJ3aW5kb3dib3VuZHMiXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYm91bmRzID0gZGVmYXVsdHdpbmRvd3NpemUKKyAgICAgICAgaWYgc2VsZi5zZXR0aW5ncy5oYXNfa2V5KCJmb250c2V0dGluZ3MiKToKKyAgICAgICAgICAgIHNlbGYuZm9udHNldHRpbmdzID0gc2VsZi5zZXR0aW5nc1siZm9udHNldHRpbmdzIl0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZm9udHNldHRpbmdzID0gZGVmYXVsdGZvbnRzZXR0aW5ncworICAgICAgICBpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoInRhYnNpemUiKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBzZWxmLnRhYnNldHRpbmdzID0gKHRhYnNpemUsIHRhYm1vZGUpID0gc2VsZi5zZXR0aW5nc1sidGFic2l6ZSJdCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgc2VsZi50YWJzZXR0aW5ncyA9IGRlZmF1bHR0YWJzZXR0aW5ncworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi50YWJzZXR0aW5ncyA9IGRlZmF1bHR0YWJzZXR0aW5ncworCisgICAgICAgIFcuV2luZG93Ll9faW5pdF9fKHNlbGYsIGJvdW5kcywgc2VsZi50aXRsZSwgbWluc2l6ZSA9ICgzMzAsIDEyMCksIHRhYmJhYmxlID0gMCkKKyAgICAgICAgc2VsZi5zZXR1cHdpZGdldHModGV4dCkKKworICAgICAgICBpZiBzZWxmLnNldHRpbmdzLmhhc19rZXkoInNlbGVjdGlvbiIpOgorICAgICAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYuc2V0dGluZ3NbInNlbGVjdGlvbiJdCisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihzZWxzdGFydCwgc2VsZW5kKQorICAgICAgICBzZWxmLm9wZW4oKQorICAgICAgICBzZWxmLnNldGluZm90ZXh0KCkKKyAgICAgICAgc2VsZi5nbG9iYWxzID0ge30KKyAgICAgICAgc2VsZi5fYnVmID0gIiIgICMgZm9yIHdyaXRlIG1ldGhvZAorICAgICAgICBzZWxmLmRlYnVnZ2luZyA9IDAKKyAgICAgICAgc2VsZi5wcm9maWxpbmcgPSAwCisgICAgICAgIHNlbGYucnVuX2FzX21haW4gPSBzZWxmLnNldHRpbmdzLmdldCgicnVuX2FzX21haW4iLCAwKQorICAgICAgICBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyID0gc2VsZi5zZXR0aW5ncy5nZXQoInJ1bl93aXRoX2ludGVycHJldGVyIiwgMCkKKyAgICAgICAgc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IHNlbGYuc2V0dGluZ3MuZ2V0KCJydW5fd2l0aF9jbF9pbnRlcnByZXRlciIsIDApCisKKyAgICBkZWYgcmVhZHdpbmRvd3NldHRpbmdzKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXNyZWYgPSBSZXMuRlNwT3BlblJlc0ZpbGUoc2VsZi5wYXRoLCAxKQorICAgICAgICBleGNlcHQgUmVzLkVycm9yOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIFJlcy5Vc2VSZXNGaWxlKHJlc3JlZikKKyAgICAgICAgICAgIGRhdGEgPSBSZXMuR2V0MVJlc291cmNlKCdQeVdTJywgMTI4KQorICAgICAgICAgICAgc2VsZi5zZXR0aW5ncyA9IG1hcnNoYWwubG9hZHMoZGF0YS5kYXRhKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBwYXNzCisgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmVzcmVmKQorCisgICAgZGVmIHdyaXRld2luZG93c2V0dGluZ3Moc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHJlc3JlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShzZWxmLnBhdGgsIDMpCisgICAgICAgIGV4Y2VwdCBSZXMuRXJyb3I6CisgICAgICAgICAgICBSZXMuRlNwQ3JlYXRlUmVzRmlsZShzZWxmLnBhdGgsIHNlbGYuX2NyZWF0b3IsICdURVhUJywgc21BbGxTY3JpcHRzKQorICAgICAgICAgICAgcmVzcmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKHNlbGYucGF0aCwgMykKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgZGF0YSA9IFJlcy5SZXNvdXJjZShtYXJzaGFsLmR1bXBzKHNlbGYuc2V0dGluZ3MpKQorICAgICAgICAgICAgUmVzLlVzZVJlc0ZpbGUocmVzcmVmKQorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHRlbXAgPSBSZXMuR2V0MVJlc291cmNlKCdQeVdTJywgMTI4KQorICAgICAgICAgICAgICAgIHRlbXAuUmVtb3ZlUmVzb3VyY2UoKQorICAgICAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgICAgICBkYXRhLkFkZFJlc291cmNlKCdQeVdTJywgMTI4LCAid2luZG93IHNldHRpbmdzIikKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIFJlcy5VcGRhdGVSZXNGaWxlKHJlc3JlZikKKyAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUocmVzcmVmKQorCisgICAgZGVmIGdldHNldHRpbmdzKHNlbGYpOgorICAgICAgICBzZWxmLnNldHRpbmdzID0ge30KKyAgICAgICAgc2VsZi5zZXR0aW5nc1sid2luZG93Ym91bmRzIl0gPSBzZWxmLmdldGJvdW5kcygpCisgICAgICAgIHNlbGYuc2V0dGluZ3NbInNlbGVjdGlvbiJdID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBzZWxmLnNldHRpbmdzWyJmb250c2V0dGluZ3MiXSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRmb250c2V0dGluZ3MoKQorICAgICAgICBzZWxmLnNldHRpbmdzWyJ0YWJzaXplIl0gPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0dGFic2V0dGluZ3MoKQorICAgICAgICBzZWxmLnNldHRpbmdzWyJydW5fYXNfbWFpbiJdID0gc2VsZi5ydW5fYXNfbWFpbgorICAgICAgICBzZWxmLnNldHRpbmdzWyJydW5fd2l0aF9pbnRlcnByZXRlciJdID0gc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlcgorICAgICAgICBzZWxmLnNldHRpbmdzWyJydW5fd2l0aF9jbF9pbnRlcnByZXRlciJdID0gc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlcgorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci50ZWQuV0VHZXRTZWxlY3Rpb24oKQorCisgICAgZGVmIHNldHNlbGVjdGlvbihzZWxmLCBzZWxzdGFydCwgc2VsZW5kKToKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNldHNlbGVjdGlvbihzZWxzdGFydCwgc2VsZW5kKQorCisgICAgZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXRzZWxlY3RlZHRleHQoKQorCisgICAgZGVmIGdldGZpbGVuYW1lKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5wYXRoCisgICAgICAgIHJldHVybiAnPCVzPicgJSBzZWxmLnRpdGxlCisKKyAgICBkZWYgc2V0dXB3aWRnZXRzKHNlbGYsIHRleHQpOgorICAgICAgICB0b3BiYXJoZWlnaHQgPSAyNAorICAgICAgICBwb3BmaWVsZHdpZHRoID0gODAKKyAgICAgICAgc2VsZi5sYXN0bGluZW5vID0gTm9uZQorCisgICAgICAgICMgbWFrZSBhbiBlZGl0b3IKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAgPSBXLkdyb3VwKCgwLCB0b3BiYXJoZWlnaHQgKyAxLCAwLCAwKSkKKyAgICAgICAgZWRpdG9yID0gVy5QeUVkaXRvcigoMCwgMCwgLTE1LC0xNSksIHRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3MgPSBzZWxmLmZvbnRzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNldHRpbmdzID0gc2VsZi50YWJzZXR0aW5ncywKKyAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgPSBzZWxmLmdldGZpbGVuYW1lKCkpCisKKyAgICAgICAgIyBtYWtlIHRoZSB3aWRnZXRzCisgICAgICAgIHNlbGYucG9wZmllbGQgPSBDbGFzc0ZpbmRlcigocG9wZmllbGR3aWR0aCAtIDE3LCAtMTUsIDE2LCAxNiksIFtdLCBzZWxmLnBvcHNlbGVjdGxpbmUpCisgICAgICAgIHNlbGYubGluZWZpZWxkID0gVy5FZGl0VGV4dCgoLTEsIC0xNSwgcG9wZmllbGR3aWR0aCAtIDE1LCAxNiksIGluc2V0ID0gKDYsIDEpKQorICAgICAgICBzZWxmLmVkaXRncm91cC5fYmFyeCA9IFcuU2Nyb2xsYmFyKChwb3BmaWVsZHdpZHRoIC0gMiwgLTE1LCAtMTQsIDE2KSwgZWRpdG9yLmhzY3JvbGwsIG1heCA9IDMyNzY3KQorICAgICAgICBzZWxmLmVkaXRncm91cC5fYmFyeSA9IFcuU2Nyb2xsYmFyKCgtMTUsIDE0LCAxNiwgLTE0KSwgZWRpdG9yLnZzY3JvbGwsIG1heCA9IDMyNzY3KQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IgPSBlZGl0b3IgICMgYWRkIGVkaXRvciAqYWZ0ZXIqIHNjcm9sbGJhcnMKKworICAgICAgICBzZWxmLmVkaXRncm91cC5vcHRpb25zbWVudSA9IFcuUG9wdXBNZW51KCgtMTUsIC0xLCAxNiwgMTYpLCBbXSkKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAub3B0aW9uc21lbnUuYmluZCgnPGNsaWNrPicsIHNlbGYubWFrZW9wdGlvbnNtZW51KQorCisgICAgICAgIHNlbGYuYmV2ZWxib3ggPSBXLkJldmVsQm94KCgwLCAwLCAwLCB0b3BiYXJoZWlnaHQpKQorICAgICAgICBzZWxmLmhsaW5lID0gVy5Ib3Jpem9udGFsTGluZSgoMCwgdG9wYmFyaGVpZ2h0LCAwLCAwKSkKKyAgICAgICAgc2VsZi5pbmZvdGV4dCA9IFcuVGV4dEJveCgoMTc1LCA2LCAtNCwgMTQpLCBiYWNrZ3JvdW5kY29sb3IgPSAoMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCkpCisgICAgICAgIHNlbGYucnVuYnV0dG9uID0gVy5CZXZlbEJ1dHRvbigoNiwgNCwgODAsIDE2KSwgcnVuQnV0dG9uTGFiZWxzWzBdLCBzZWxmLnJ1bikKKyAgICAgICAgc2VsZi5ydW5zZWxidXR0b24gPSBXLkJldmVsQnV0dG9uKCg5MCwgNCwgODAsIDE2KSwgcnVuU2VsQnV0dG9uTGFiZWxzWzBdLCBzZWxmLnJ1bnNlbGVjdGlvbikKKworICAgICAgICAjIGJpbmQgc29tZSBrZXlzCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWRyIiwgc2VsZi5ydW5idXR0b24ucHVzaCkKKyAgICAgICAgZWRpdG9yLmJpbmQoImVudGVyIiwgc2VsZi5ydW5zZWxidXR0b24ucHVzaCkKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZGoiLCBzZWxmLmRvbWVudV9nb3RvbGluZSkKKyAgICAgICAgZWRpdG9yLmJpbmQoImNtZGQiLCBzZWxmLmRvbWVudV90b2dnbGVkZWJ1Z2dlcikKKyAgICAgICAgZWRpdG9yLmJpbmQoIjxpZGxlPiIsIHNlbGYudXBkYXRlc2VsZWN0aW9uKQorCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWRlIiwgc2VhcmNoZW5naW5lLnNldGZpbmRzdHJpbmcpCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWRmIiwgc2VhcmNoZW5naW5lLnNob3cpCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWRnIiwgc2VhcmNoZW5naW5lLmZpbmRuZXh0KQorICAgICAgICBlZGl0b3IuYmluZCgiY21kc2hpZnRyIiwgc2VhcmNoZW5naW5lLnJlcGxhY2UpCisgICAgICAgIGVkaXRvci5iaW5kKCJjbWR0Iiwgc2VhcmNoZW5naW5lLnJlcGxhY2VmaW5kKQorCisgICAgICAgIHNlbGYubGluZWZpZWxkLmJpbmQoInJldHVybiIsIHNlbGYuZG9saW5lZmllbGQpCisgICAgICAgIHNlbGYubGluZWZpZWxkLmJpbmQoImVudGVyIiwgc2VsZi5kb2xpbmVmaWVsZCkKKyAgICAgICAgc2VsZi5saW5lZmllbGQuYmluZCgidGFiIiwgc2VsZi5kb2xpbmVmaWVsZCkKKworICAgICAgICAjIGludGVyY2VwdCBjbGlja3MKKyAgICAgICAgZWRpdG9yLmJpbmQoIjxjbGljaz4iLCBzZWxmLmNsaWNrZWRpdG9yKQorICAgICAgICBzZWxmLmxpbmVmaWVsZC5iaW5kKCI8Y2xpY2s+Iiwgc2VsZi5jbGlja2xpbmVmaWVsZCkKKworICAgIGRlZiBtYWtlb3B0aW9uc21lbnUoc2VsZik6CisgICAgICAgIG1lbnVpdGVtcyA9IFsoJ0ZvbnQgc2V0dGluZ3NceGM5Jywgc2VsZi5kb21lbnVfZm9udHNldHRpbmdzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICgiU2F2ZSBvcHRpb25zXHhjOSIsIHNlbGYuZG9tZW51X29wdGlvbnMpLAorICAgICAgICAgICAgICAgICAgICAgICAgJy0nLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdcMCcgKyBjaHIoc2VsZi5ydW5fYXNfbWFpbikgKyAnUnVuIGFzIF9fbWFpbl9fJywgc2VsZi5kb21lbnVfdG9nZ2xlX3J1bl9hc19tYWluKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICMoJ1wwJyArIGNocihzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyKSArICdSdW4gd2l0aCBJbnRlcnByZXRlcicsIHNlbGYuZG9tZW51X2R0b2dnbGVfcnVuX3dpdGhfaW50ZXJwcmV0ZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdcMCcgKyBjaHIoc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlcikgKyAnUnVuIHdpdGggY29tbWFuZGxpbmUgUHl0aG9uJywgc2VsZi5kb21lbnVfdG9nZ2xlX3J1bl93aXRoX2NsX2ludGVycHJldGVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICctJywKKyAgICAgICAgICAgICAgICAgICAgICAgICgnTW9kdWxhcml6ZScsIHNlbGYuZG9tZW51X21vZHVsYXJpemUpLAorICAgICAgICAgICAgICAgICAgICAgICAgKCdCcm93c2UgbmFtZXNwYWNlXHhjOScsIHNlbGYuZG9tZW51X2Jyb3dzZW5hbWVzcGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAnLSddCisgICAgICAgIGlmIHNlbGYucHJvZmlsaW5nOgorICAgICAgICAgICAgbWVudWl0ZW1zID0gbWVudWl0ZW1zICsgWygnRGlzYWJsZSBwcm9maWxlcicsIHNlbGYuZG9tZW51X3RvZ2dsZXByb2ZpbGVyKV0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1lbnVpdGVtcyA9IG1lbnVpdGVtcyArIFsoJ0VuYWJsZSBwcm9maWxlcicsIHNlbGYuZG9tZW51X3RvZ2dsZXByb2ZpbGVyKV0KKyAgICAgICAgaWYgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgIG1lbnVpdGVtcyA9IG1lbnVpdGVtcyArIFsoJ0Rpc2FibGUgZGVidWdnZXInLCBzZWxmLmRvbWVudV90b2dnbGVkZWJ1Z2dlciksCisgICAgICAgICAgICAgICAgICAgICgnQ2xlYXIgYnJlYWtwb2ludHMnLCBzZWxmLmRvbWVudV9jbGVhcmJyZWFrcG9pbnRzKSwKKyAgICAgICAgICAgICAgICAgICAgKCdFZGl0IGJyZWFrcG9pbnRzXHhjOScsIHNlbGYuZG9tZW51X2VkaXRicmVha3BvaW50cyldCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtZW51aXRlbXMgPSBtZW51aXRlbXMgKyBbKCdFbmFibGUgZGVidWdnZXInLCBzZWxmLmRvbWVudV90b2dnbGVkZWJ1Z2dlcildCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLm9wdGlvbnNtZW51LnNldChtZW51aXRlbXMpCisKKyAgICBkZWYgZG9tZW51X3RvZ2dsZV9ydW5fYXNfbWFpbihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fYXNfbWFpbiA9IG5vdCBzZWxmLnJ1bl9hc19tYWluCisgICAgICAgIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSAwCisgICAgICAgIHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIgPSAwCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKKworICAgIGRlZiBYWGRvbWVudV90b2dnbGVfcnVuX3dpdGhfaW50ZXJwcmV0ZXIoc2VsZik6CisgICAgICAgIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSBub3Qgc2VsZi5ydW5fd2l0aF9pbnRlcnByZXRlcgorICAgICAgICBzZWxmLnJ1bl9hc19tYWluID0gMAorICAgICAgICBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyID0gMAorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0aW9uY2hhbmdlZCgpCisKKyAgICBkZWYgZG9tZW51X3RvZ2dsZV9ydW5fd2l0aF9jbF9pbnRlcnByZXRlcihzZWxmKToKKyAgICAgICAgc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlciA9IG5vdCBzZWxmLnJ1bl93aXRoX2NsX2ludGVycHJldGVyCisgICAgICAgIHNlbGYucnVuX2FzX21haW4gPSAwCisgICAgICAgIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXIgPSAwCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKKworICAgIGRlZiBzaG93YnJlYWtwb2ludHMoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2hvd2JyZWFrcG9pbnRzKG9ub2ZmKQorICAgICAgICBzZWxmLmRlYnVnZ2luZyA9IG9ub2ZmCisKKyAgICBkZWYgZG9tZW51X2NsZWFyYnJlYWtwb2ludHMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2xlYXJicmVha3BvaW50cygpCisKKyAgICBkZWYgZG9tZW51X2VkaXRicmVha3BvaW50cyhzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5lZGl0YnJlYWtwb2ludHMoKQorCisgICAgZGVmIGRvbWVudV90b2dnbGVkZWJ1Z2dlcihzZWxmLCAqYXJncyk6CisgICAgICAgIGlmIG5vdCBzZWxmLmRlYnVnZ2luZzoKKyAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgIHNlbGYuZGVidWdnaW5nID0gbm90IHNlbGYuZGVidWdnaW5nCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci50b2dnbGVicmVha3BvaW50cygpCisKKyAgICBkZWYgZG9tZW51X3RvZ2dsZXByb2ZpbGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5wcm9maWxpbmcgPSBub3Qgc2VsZi5wcm9maWxpbmcKKworICAgIGRlZiBkb21lbnVfYnJvd3NlbmFtZXNwYWNlKHNlbGYsICphcmdzKToKKyAgICAgICAgaW1wb3J0IFB5QnJvd3NlciwgVworICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBnbG9iYWxzLCBmaWxlLCBtb2RuYW1lID0gc2VsZi5nZXRlbnZpcm9ubWVudCgpCisgICAgICAgIGlmIG5vdCBtb2RuYW1lOgorICAgICAgICAgICAgbW9kbmFtZSA9IHNlbGYudGl0bGUKKyAgICAgICAgUHlCcm93c2VyLkJyb3dzZXIoZ2xvYmFscywgIk9iamVjdCBicm93c2VyOiAiICsgbW9kbmFtZSkKKworICAgIGRlZiBkb21lbnVfbW9kdWxhcml6ZShzZWxmLCAqYXJncyk6CisgICAgICAgIG1vZG5hbWUgPSBfZmlsZW5hbWVfYXNfbW9kbmFtZShzZWxmLnRpdGxlKQorICAgICAgICBpZiBub3QgbW9kbmFtZToKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IG1vZHVsYXJpemUgXCIlc1wiIiAlIHNlbGYudGl0bGUKKyAgICAgICAgcnVuX2FzX21haW4gPSBzZWxmLnJ1bl9hc19tYWluCisgICAgICAgIHNlbGYucnVuX2FzX21haW4gPSAwCisgICAgICAgIHNlbGYucnVuKCkKKyAgICAgICAgc2VsZi5ydW5fYXNfbWFpbiA9IHJ1bl9hc19tYWluCisgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLnBhdGgKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZpbGUgPSBzZWxmLnRpdGxlCisKKyAgICAgICAgaWYgc2VsZi5nbG9iYWxzIGFuZCBub3Qgc3lzLm1vZHVsZXMuaGFzX2tleShtb2RuYW1lKToKKyAgICAgICAgICAgIG1vZHVsZSA9IGltcC5uZXdfbW9kdWxlKG1vZG5hbWUpCisgICAgICAgICAgICBmb3IgYXR0ciBpbiBzZWxmLmdsb2JhbHMua2V5cygpOgorICAgICAgICAgICAgICAgIHNldGF0dHIobW9kdWxlLGF0dHIsc2VsZi5nbG9iYWxzW2F0dHJdKQorICAgICAgICAgICAgc3lzLm1vZHVsZXNbbW9kbmFtZV0gPSBtb2R1bGUKKyAgICAgICAgICAgIHNlbGYuZ2xvYmFscyA9IHt9CisKKyAgICBkZWYgZG9tZW51X2ZvbnRzZXR0aW5ncyhzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCBGb250U2V0dGluZ3MKKyAgICAgICAgZm9udHNldHRpbmdzID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldGZvbnRzZXR0aW5ncygpCisgICAgICAgIHRhYnNldHRpbmdzID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldHRhYnNldHRpbmdzKCkKKyAgICAgICAgc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzKQorICAgICAgICBpZiBzZXR0aW5nczoKKyAgICAgICAgICAgIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MgPSBzZXR0aW5ncworICAgICAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNldGZvbnRzZXR0aW5ncyhmb250c2V0dGluZ3MpCisgICAgICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2V0dGFic2V0dGluZ3ModGFic2V0dGluZ3MpCisKKyAgICBkZWYgZG9tZW51X29wdGlvbnMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBydiA9IFNhdmVPcHRpb25zKHNlbGYuX2NyZWF0b3IsIHNlbGYuX2VvbG4pCisgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKSAjIG91Y2guLi4KKyAgICAgICAgICAgIHNlbGYuX2NyZWF0b3IsIHNlbGYuX2VvbG4gPSBydgorCisgICAgZGVmIGNsaWNrbGluZWZpZWxkKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IDw+IHNlbGYubGluZWZpZWxkOgorICAgICAgICAgICAgc2VsZi5saW5lZmllbGQuc2VsZWN0KDEpCisgICAgICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZWxlY3RhbGwoKQorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBjbGlja2VkaXRvcihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldCA8PiBzZWxmLmVkaXRncm91cC5lZGl0b3I6CisgICAgICAgICAgICBzZWxmLmRvbGluZWZpZWxkKCkKKyAgICAgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgdXBkYXRlc2VsZWN0aW9uKHNlbGYsIGZvcmNlID0gMCk6CisgICAgICAgIHNlbCA9IG1pbihzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0c2VsZWN0aW9uKCkpCisgICAgICAgIGxpbmVubyA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5vZmZzZXR0b2xpbmUoc2VsKQorICAgICAgICBpZiBsaW5lbm8gPD4gc2VsZi5sYXN0bGluZW5vIG9yIGZvcmNlOgorICAgICAgICAgICAgc2VsZi5sYXN0bGluZW5vID0gbGluZW5vCisgICAgICAgICAgICBzZWxmLmxpbmVmaWVsZC5zZXQoc3RyKGxpbmVubyArIDEpKQorICAgICAgICAgICAgc2VsZi5saW5lZmllbGQuc2VsdmlldygpCisKKyAgICBkZWYgZG9saW5lZmllbGQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGxpbmVubyA9IHN0cmluZy5hdG9pKHNlbGYubGluZWZpZWxkLmdldCgpKSAtIDEKKyAgICAgICAgICAgIGlmIGxpbmVubyA8PiBzZWxmLmxhc3RsaW5lbm86CisgICAgICAgICAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vKQorICAgICAgICAgICAgICAgIHNlbGYudXBkYXRlc2VsZWN0aW9uKDEpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHNlbGYudXBkYXRlc2VsZWN0aW9uKDEpCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3QoMSkKKworICAgIGRlZiBzZXRpbmZvdGV4dChzZWxmKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgJ2luZm90ZXh0Jyk6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5wYXRoOgorICAgICAgICAgICAgc2VsZi5pbmZvdGV4dC5zZXQoc2VsZi5wYXRoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5pbmZvdGV4dC5zZXQoIiIpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkOgorICAgICAgICAgICAgUWQuSW5pdEN1cnNvcigpCisgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgd2luZG93ICIlcyIgYmVmb3JlIGNsb3Npbmc/JyAlIHNlbGYudGl0bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0xLCBubz0iRG9uXHhkNXQgc2F2ZSIpCisgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICBpZiBzZWxmLmRvbWVudV9zYXZlKCk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHNlbGYuZ2xvYmFscyA9IE5vbmUKKyAgICAgICAgVy5XaW5kb3cuY2xvc2Uoc2VsZikKKworICAgIGRlZiBkb21lbnVfY2xvc2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICByZXR1cm4gc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgIyBXaWxsIGNhbGwgdXMgcmVjdXJzaXZlbHkKKyAgICAgICAgICAgIHJldHVybiBzZWxmLmRvbWVudV9zYXZlX2FzKCkKKyAgICAgICAgZGF0YSA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQorICAgICAgICBpZiBzZWxmLl9lb2xuICE9ICdccic6CisgICAgICAgICAgICBkYXRhID0gc3RyaW5nLnJlcGxhY2UoZGF0YSwgJ1xyJywgc2VsZi5fZW9sbikKKyAgICAgICAgZnAgPSBvcGVuKHNlbGYucGF0aCwgJ3diJykgICMgb3BlbiBmaWxlIGluIGJpbmFyeSBtb2RlLCBkYXRhIGhhcyAnXHInIGxpbmUtZW5kaW5ncworICAgICAgICBmcC53cml0ZShkYXRhKQorICAgICAgICBmcC5jbG9zZSgpCisgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKHNlbGYucGF0aCwgc2VsZi5fY3JlYXRvciwgJ1RFWFQnKQorICAgICAgICBzZWxmLmdldHNldHRpbmdzKCkKKyAgICAgICAgc2VsZi53cml0ZXdpbmRvd3NldHRpbmdzKCkKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmNoYW5nZWQgPSAwCisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxjaGFuZ2VkID0gMAorICAgICAgICBpbXBvcnQgbGluZWNhY2hlCisgICAgICAgIGlmIGxpbmVjYWNoZS5jYWNoZS5oYXNfa2V5KHNlbGYucGF0aCk6CisgICAgICAgICAgICBkZWwgbGluZWNhY2hlLmNhY2hlW3NlbGYucGF0aF0KKyAgICAgICAgaW1wb3J0IG1hY29zdG9vbHMKKyAgICAgICAgbWFjb3N0b29scy50b3VjaGVkKHNlbGYucGF0aCkKKyAgICAgICAgc2VsZi5hZGRyZWNlbnRmaWxlKHNlbGYucGF0aCkKKworICAgIGRlZiBjYW5fc2F2ZShzZWxmLCBtZW51aXRlbSk6CisgICAgICAgIHJldHVybiBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZCBvciBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsY2hhbmdlZAorCisgICAgZGVmIGRvbWVudV9zYXZlX2FzKHNlbGYsICphcmdzKToKKyAgICAgICAgcGF0aCA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9J1NhdmUgYXM6Jywgc2F2ZWRGaWxlTmFtZT1zZWxmLnRpdGxlKQorICAgICAgICBpZiBub3QgcGF0aDoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgIHNlbGYuc2hvd2JyZWFrcG9pbnRzKDApCisgICAgICAgIHNlbGYucGF0aCA9IHBhdGgKKyAgICAgICAgc2VsZi5zZXRpbmZvdGV4dCgpCisgICAgICAgIHNlbGYudGl0bGUgPSBvcy5wYXRoLnNwbGl0KHNlbGYucGF0aClbLTFdCisgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZShzZWxmLnRpdGxlKQorICAgICAgICBzZWxmLmRvbWVudV9zYXZlKCkKKyAgICAgICAgc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnNldGZpbGUoc2VsZi5nZXRmaWxlbmFtZSgpKQorICAgICAgICBhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKKyAgICAgICAgYXBwLm1ha2VvcGVud2luZG93c21lbnUoKQorICAgICAgICBpZiBoYXNhdHRyKGFwcCwgJ21ha2VzY3JpcHRzbWVudScpOgorICAgICAgICAgICAgYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpCisgICAgICAgICAgICBmc3IsIGNoYW5nZWQgPSBhcHAuc2NyaXB0c2ZvbGRlci5GU1Jlc29sdmVBbGlhcyhOb25lKQorICAgICAgICAgICAgcGF0aCA9IGZzci5hc19wYXRobmFtZSgpCisgICAgICAgICAgICBpZiBwYXRoID09IHNlbGYucGF0aFs6bGVuKHBhdGgpXToKKyAgICAgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkubWFrZXNjcmlwdHNtZW51KCkKKworICAgIGRlZiBkb21lbnVfc2F2ZV9hc19hcHBsZXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgYnVpbGR0b29scworCisgICAgICAgIGJ1aWxkdG9vbHMuREVCVUcgPSAwICAgICMgb3VjaC4KKworICAgICAgICBpZiBzZWxmLnRpdGxlWy0zOl0gPT0gIi5weSI6CisgICAgICAgICAgICBkZXN0bmFtZSA9IHNlbGYudGl0bGVbOi0zXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZGVzdG5hbWUgPSBzZWxmLnRpdGxlICsgIi5hcHBsZXQiCisgICAgICAgIGRlc3RuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhcyBBcHBsZXQ6JywKKyAgICAgICAgICAgICAgICBzYXZlZEZpbGVOYW1lPWRlc3RuYW1lKQorICAgICAgICBpZiBub3QgZGVzdG5hbWU6CisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBXLlNldEN1cnNvcigid2F0Y2giKQorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYucGF0aAorICAgICAgICAgICAgaWYgZmlsZW5hbWVbLTM6XSA9PSAiLnB5IjoKKyAgICAgICAgICAgICAgICByc3JjbmFtZSA9IGZpbGVuYW1lWzotM10gKyAnLnJzcmMnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJzcmNuYW1lID0gZmlsZW5hbWUgKyAnLnJzcmMnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYudGl0bGUKKyAgICAgICAgICAgIHJzcmNuYW1lID0gIiIKKworICAgICAgICBweXRleHQgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IuZ2V0KCkKKyAgICAgICAgcHl0ZXh0ID0gc3RyaW5nLnNwbGl0KHB5dGV4dCwgJ1xyJykKKyAgICAgICAgcHl0ZXh0ID0gc3RyaW5nLmpvaW4ocHl0ZXh0LCAnXG4nKSArICdcbicKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgY29kZSA9IGNvbXBpbGUocHl0ZXh0LCBmaWxlbmFtZSwgImV4ZWMiKQorICAgICAgICBleGNlcHQgKFN5bnRheEVycm9yLCBFT0ZFcnJvcik6CisgICAgICAgICAgICByYWlzZSBidWlsZHRvb2xzLkJ1aWxkRXJyb3IsICJTeW50YXggZXJyb3IgaW4gc2NyaXB0ICVyIiAlIChmaWxlbmFtZSwpCisKKyAgICAgICAgaW1wb3J0IHRlbXBmaWxlCisgICAgICAgIHRtcGRpciA9IHRlbXBmaWxlLm1rZHRlbXAoKQorCisgICAgICAgIGlmIGZpbGVuYW1lWy0zOl0gIT0gIi5weSI6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lICsgIi5weSIKKyAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLmpvaW4odG1wZGlyLCBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXSkKKyAgICAgICAgZnAgPSBvcGVuKGZpbGVuYW1lLCAidyIpCisgICAgICAgIGZwLndyaXRlKHB5dGV4dCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgICAgICMgVHJ5IHJlbW92aW5nIHRoZSBvdXRwdXQgZmlsZQorICAgICAgICB0cnk6CisgICAgICAgICAgICBvcy5yZW1vdmUoZGVzdG5hbWUpCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIHBhc3MKKyAgICAgICAgdGVtcGxhdGUgPSBidWlsZHRvb2xzLmZpbmR0ZW1wbGF0ZSgpCisgICAgICAgIGJ1aWxkdG9vbHMucHJvY2Vzcyh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRlc3RuYW1lLCAxLCByc3JjbmFtZT1yc3JjbmFtZSwgcHJvZ3Jlc3M9Tm9uZSkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3MucmVtb3ZlKGZpbGVuYW1lKQorICAgICAgICAgICAgb3Mucm1kaXIodG1wZGlyKQorICAgICAgICBleGNlcHQgb3MuZXJyb3I6CisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZG9tZW51X2dvdG9saW5lKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5saW5lZmllbGQuc2VsZWN0YWxsKCkKKyAgICAgICAgc2VsZi5saW5lZmllbGQuc2VsZWN0KDEpCisgICAgICAgIHNlbGYubGluZWZpZWxkLnNlbGVjdGFsbCgpCisKKyAgICBkZWYgZG9tZW51X3NlbGVjdGxpbmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IuZXhwYW5kc2VsZWN0aW9uKCkKKworICAgIGRlZiBkb21lbnVfZmluZChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlYXJjaGVuZ2luZS5zaG93KCkKKworICAgIGRlZiBkb21lbnVfZW50ZXJzZWFyY2hzdHJpbmcoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWFyY2hlbmdpbmUuc2V0ZmluZHN0cmluZygpCisKKyAgICBkZWYgZG9tZW51X3JlcGxhY2Uoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWFyY2hlbmdpbmUucmVwbGFjZSgpCisKKyAgICBkZWYgZG9tZW51X2ZpbmRuZXh0KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VhcmNoZW5naW5lLmZpbmRuZXh0KCkKKworICAgIGRlZiBkb21lbnVfcmVwbGFjZWZpbmQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWFyY2hlbmdpbmUucmVwbGFjZWZpbmQoKQorCisgICAgZGVmIGRvbWVudV9ydW4oc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnJ1bmJ1dHRvbi5wdXNoKCkKKworICAgIGRlZiBkb21lbnVfcnVuc2VsZWN0aW9uKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5ydW5zZWxidXR0b24ucHVzaCgpCisKKyAgICBkZWYgcnVuKHNlbGYpOgorICAgICAgICBzZWxmLl9ydW4oKQorCisgICAgZGVmIF9ydW4oc2VsZik6CisgICAgICAgIGlmIHNlbGYucnVuX3dpdGhfaW50ZXJwcmV0ZXI6CisgICAgICAgICAgICBpZiBzZWxmLmVkaXRncm91cC5lZGl0b3IuY2hhbmdlZDoKKyAgICAgICAgICAgICAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICAgICAgICAgICAgICBzYXZlID0gRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoJ1NhdmUgIiVzIiBiZWZvcmUgcnVubmluZz8nICUgc2VsZi50aXRsZSwgMSkKKyAgICAgICAgICAgICAgICBpZiBzYXZlID4gMDoKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi5kb21lbnVfc2F2ZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICAgICAgZWxpZiBzYXZlIDwgMDoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBpZiBub3Qgc2VsZi5wYXRoOgorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IHJ1biB1bnNhdmVkIGZpbGUiCisgICAgICAgICAgICBzZWxmLl9ydW5fd2l0aF9pbnRlcnByZXRlcigpCisgICAgICAgIGVsaWYgc2VsZi5ydW5fd2l0aF9jbF9pbnRlcnByZXRlcjoKKyAgICAgICAgICAgIGlmIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5jaGFuZ2VkOgorICAgICAgICAgICAgICAgIFFkLkluaXRDdXJzb3IoKQorICAgICAgICAgICAgICAgIHNhdmUgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgnU2F2ZSAiJXMiIGJlZm9yZSBydW5uaW5nPycgJSBzZWxmLnRpdGxlLCAxKQorICAgICAgICAgICAgICAgIGlmIHNhdmUgPiAwOgorICAgICAgICAgICAgICAgICAgICBpZiBzZWxmLmRvbWVudV9zYXZlKCk6CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgICAgICBlbGlmIHNhdmUgPCAwOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLnBhdGg6CisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIHVuc2F2ZWQgZmlsZSIKKyAgICAgICAgICAgIHNlbGYuX3J1bl93aXRoX2NsX2ludGVycHJldGVyKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHB5dGV4dCA9IHNlbGYuZWRpdGdyb3VwLmVkaXRvci5nZXQoKQorICAgICAgICAgICAgZ2xvYmFscywgZmlsZSwgbW9kbmFtZSA9IHNlbGYuZ2V0ZW52aXJvbm1lbnQoKQorICAgICAgICAgICAgc2VsZi5leGVjc3RyaW5nKHB5dGV4dCwgZ2xvYmFscywgZ2xvYmFscywgZmlsZSwgbW9kbmFtZSkKKworICAgIGRlZiBfcnVuX3dpdGhfaW50ZXJwcmV0ZXIoc2VsZik6CisgICAgICAgIGludGVycF9wYXRoID0gb3MucGF0aC5qb2luKHN5cy5leGVjX3ByZWZpeCwgIlB5dGhvbkludGVycHJldGVyIikKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGludGVycF9wYXRoKToKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgaW50ZXJwcmV0ZXIiCisgICAgICAgIGltcG9ydCBmaW5kZXJ0b29scworICAgICAgICBYWFgKKworICAgIGRlZiBfcnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXIoc2VsZik6CisgICAgICAgIGltcG9ydCBUZXJtaW5hbAorICAgICAgICBpbnRlcnBfcGF0aCA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsCisgICAgICAgICAgICAgICAgIlJlc291cmNlcyIsICJQeXRob24uYXBwIiwgIkNvbnRlbnRzIiwgIk1hY09TIiwgIlB5dGhvbiIpCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbnRlcnBfcGF0aCk6CisgICAgICAgICAgICBpbnRlcnBfcGF0aCA9IG9zLnBhdGguam9pbihzeXMuZXhlY19wcmVmaXgsICJiaW4iLCAicHl0aG9uIikKKyAgICAgICAgZmlsZV9wYXRoID0gc2VsZi5wYXRoCisgICAgICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhpbnRlcnBfcGF0aCk6CisgICAgICAgICAgICAjIFRoaXMgImNhbiBoYXBwZW4iIGlmIHdlIGFyZSBydW5uaW5nIElERSB1bmRlciBNYWNQeXRob24tT1M5LgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBjb21tYW5kLWxpbmUgUHl0aG9uIgorICAgICAgICBjbWQgPSAnIiVzIiAiJXMiIDsgZXhpdCcgJSAoaW50ZXJwX3BhdGgsIGZpbGVfcGF0aCkKKyAgICAgICAgdCA9IFRlcm1pbmFsLlRlcm1pbmFsKCkKKyAgICAgICAgdC5kb19zY3JpcHQoY21kKQorCisgICAgZGVmIHJ1bnNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgc2VsZi5fcnVuc2VsZWN0aW9uKCkKKworICAgIGRlZiBfcnVuc2VsZWN0aW9uKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJ1bl93aXRoX2ludGVycHJldGVyIG9yIHNlbGYucnVuX3dpdGhfY2xfaW50ZXJwcmV0ZXI6CisgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBydW4gc2VsZWN0aW9uIHdpdGggSW50ZXJwcmV0ZXIiCisgICAgICAgIGdsb2JhbHMsIGZpbGUsIG1vZG5hbWUgPSBzZWxmLmdldGVudmlyb25tZW50KCkKKyAgICAgICAgbG9jYWxzID0gZ2xvYmFscworICAgICAgICAjIHNlbGVjdCB3aG9sZSBsaW5lcworICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IuZXhwYW5kc2VsZWN0aW9uKCkKKworICAgICAgICAjIGdldCBsaW5lbm8gb2YgZmlyc3Qgc2VsZWN0ZWQgbGluZQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQorICAgICAgICBzZWxmaXJzdGxpbmUgPSBzZWxmLmVkaXRncm91cC5lZGl0b3Iub2Zmc2V0dG9saW5lKHNlbHN0YXJ0KQorICAgICAgICBhbGx0ZXh0ID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLmdldCgpCisgICAgICAgIHB5dGV4dCA9IGFsbHRleHRbc2Vsc3RhcnQ6c2VsZW5kXQorICAgICAgICBsaW5lcyA9IHN0cmluZy5zcGxpdChweXRleHQsICdccicpCisgICAgICAgIGluZGVudCA9IGdldG1pbmluZGVudChsaW5lcykKKyAgICAgICAgaWYgaW5kZW50ID09IDE6CisgICAgICAgICAgICBjbGFzc25hbWUgPSAnJworICAgICAgICAgICAgYWxsbGluZXMgPSBzdHJpbmcuc3BsaXQoYWxsdGV4dCwgJ1xyJykKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHNlbGZpcnN0bGluZSAtIDEsIC0xLCAtMSk6CisgICAgICAgICAgICAgICAgbGluZSA9IGFsbGxpbmVzW2ldCisgICAgICAgICAgICAgICAgaWYgbGluZVs6Nl0gPT0gJ2NsYXNzICc6CisgICAgICAgICAgICAgICAgICAgIGNsYXNzbmFtZSA9IHN0cmluZy5zcGxpdChzdHJpbmcuc3RyaXAobGluZVs2Ol0pKVswXQorICAgICAgICAgICAgICAgICAgICBjbGFzc2VuZCA9IGlkZW50aWZpZVJFX21hdGNoKGNsYXNzbmFtZSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2xhc3NlbmQgPCAxOgorICAgICAgICAgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBhIGNsYXNzLiIKKyAgICAgICAgICAgICAgICAgICAgY2xhc3NuYW1lID0gY2xhc3NuYW1lWzpjbGFzc2VuZF0KKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICBlbGlmIGxpbmUgYW5kIGxpbmVbMF0gbm90IGluICdcdCMnOgorICAgICAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGEgY2xhc3MuIgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsICJDYW4ndCBmaW5kIGEgY2xhc3MuIgorICAgICAgICAgICAgaWYgZ2xvYmFscy5oYXNfa2V5KGNsYXNzbmFtZSk6CisgICAgICAgICAgICAgICAga2xhc3MgPSBnbG9iYWxzW2NsYXNzbmFtZV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZmluZCBjbGFzcyBcIiVzXCIuIiAlIGNsYXNzbmFtZQorICAgICAgICAgICAgIyBhZGQgY2xhc3MgZGVmCisgICAgICAgICAgICBweXRleHQgPSAoImNsYXNzICVzOlxuIiAlIGNsYXNzbmFtZSkgKyBweXRleHQKKyAgICAgICAgICAgIHNlbGZpcnN0bGluZSA9IHNlbGZpcnN0bGluZSAtIDEKKyAgICAgICAgZWxpZiBpbmRlbnQgPiAwOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgcnVuIGluZGVudGVkIGNvZGUuIgorCisgICAgICAgICMgYWRkICJuZXdsaW5lcyIgdG8gZm9vbCBjb21waWxlL2V4ZWM6CisgICAgICAgICMgbm93IGEgdHJhY2ViYWNrIHdpbGwgZ2l2ZSB0aGUgcmlnaHQgbGluZSBudW1iZXIKKyAgICAgICAgcHl0ZXh0ID0gc2VsZmlyc3RsaW5lICogJ1xyJyArIHB5dGV4dAorICAgICAgICBzZWxmLmV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIG1vZG5hbWUpCisgICAgICAgIGlmIGluZGVudCA9PSAxIGFuZCBnbG9iYWxzW2NsYXNzbmFtZV0gaXMgbm90IGtsYXNzOgorICAgICAgICAgICAgIyB1cGRhdGUgdGhlIGNsYXNzIGluIHBsYWNlCisgICAgICAgICAgICBrbGFzcy5fX2RpY3RfXy51cGRhdGUoZ2xvYmFsc1tjbGFzc25hbWVdLl9fZGljdF9fKQorICAgICAgICAgICAgZ2xvYmFsc1tjbGFzc25hbWVdID0ga2xhc3MKKworICAgIGRlZiBleGVjc3RyaW5nKHNlbGYsIHB5dGV4dCwgZ2xvYmFscywgbG9jYWxzLCBmaWxlLCBtb2RuYW1lKToKKyAgICAgICAgdHJhY2ViYWNrd2luZG93LmhpZGUoKQorICAgICAgICAjIHVwZGF0ZSB3aW5kb3dzCisgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5yZWZyZXNod2luZG93cygpCisgICAgICAgIGlmIHNlbGYucnVuX2FzX21haW46CisgICAgICAgICAgICBtb2RuYW1lID0gIl9fbWFpbl9fIgorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoc2VsZi5wYXRoKQorICAgICAgICAgICAgc2F2ZWRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgICAgICBvcy5jaGRpcihkaXIpCisgICAgICAgICAgICBzeXMucGF0aC5pbnNlcnQoMCwgZGlyKQorICAgICAgICBzZWxmLl9zY3JpcHREb25lID0gRmFsc2UKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgIyBPbiBNYWNPU1gsIE1hY1B5dGhvbiBkb2Vzbid0IHBvbGwgZm9yIGNvbW1hbmQtcGVyaW9kCisgICAgICAgICAgICAjIChjYW5jZWwpLCBzbyB0byBlbmFibGUgdGhlIHVzZXIgdG8gY2FuY2VsIGEgcnVubmluZworICAgICAgICAgICAgIyBzY3JpcHQsIHdlIGhhdmUgdG8gc3Bhd24gYSB0aHJlYWQgd2hpY2ggZG9lcyB0aGUKKyAgICAgICAgICAgICMgcG9sbGluZy4gSXQgd2lsbCBzZW5kIGEgU0lHSU5UIHRvIHRoZSBtYWluIHRocmVhZAorICAgICAgICAgICAgIyAoaW4gd2hpY2ggdGhlIHNjcmlwdCBpcyBydW5uaW5nKSB3aGVuIHRoZSB1c2VyIHR5cGVzCisgICAgICAgICAgICAjIGNvbW1hbmQtcGVyaW9kLgorICAgICAgICAgICAgZnJvbSB0aHJlYWRpbmcgaW1wb3J0IFRocmVhZAorICAgICAgICAgICAgdCA9IFRocmVhZCh0YXJnZXQ9c2VsZi5fdXNlckNhbmNlbGxlZE1vbml0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZT0iVXNlckNhbmNlbGxlZE1vbml0b3IiKQorICAgICAgICAgICAgdC5zdGFydCgpCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIGV4ZWNzdHJpbmcocHl0ZXh0LCBnbG9iYWxzLCBsb2NhbHMsIGZpbGUsIHNlbGYuZGVidWdnaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUsIHNlbGYucHJvZmlsaW5nKQorICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgc2VsZi5fc2NyaXB0RG9uZSA9IFRydWUKKyAgICAgICAgICAgIGlmIHNlbGYucGF0aDoKKyAgICAgICAgICAgICAgICBvcy5jaGRpcihzYXZlZGlyKQorICAgICAgICAgICAgICAgIGRlbCBzeXMucGF0aFswXQorCisgICAgZGVmIF91c2VyQ2FuY2VsbGVkTW9uaXRvcihzZWxmKToKKyAgICAgICAgaW1wb3J0IHRpbWUKKyAgICAgICAgZnJvbSBzaWduYWwgaW1wb3J0IFNJR0lOVAorICAgICAgICB3aGlsZSBub3Qgc2VsZi5fc2NyaXB0RG9uZToKKyAgICAgICAgICAgIGlmIEV2dC5DaGVja0V2ZW50UXVldWVGb3JVc2VyQ2FuY2VsKCk6CisgICAgICAgICAgICAgICAgIyBTZW5kIGEgU0lHSU5UIHNpZ25hbCB0byBvdXJzZWx2ZXMuCisgICAgICAgICAgICAgICAgIyBUaGlzIGdldHMgZGVsaXZlcmVkIHRvIHRoZSBtYWluIHRocmVhZCwKKyAgICAgICAgICAgICAgICAjIGNhbmNlbGxpbmcgdGhlIHJ1bm5pbmcgc2NyaXB0LgorICAgICAgICAgICAgICAgIG9zLmtpbGwob3MuZ2V0cGlkKCksIFNJR0lOVCkKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGltZS5zbGVlcCgwLjI1KQorCisgICAgZGVmIGdldGVudmlyb25tZW50KHNlbGYpOgorICAgICAgICBpZiBzZWxmLnBhdGg6CisgICAgICAgICAgICBmaWxlID0gc2VsZi5wYXRoCisgICAgICAgICAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUoZmlsZSkKKyAgICAgICAgICAgICMgY2hlY2sgaWYgd2UncmUgcGFydCBvZiBhIHBhY2thZ2UKKyAgICAgICAgICAgIG1vZG5hbWUgPSAiIgorICAgICAgICAgICAgd2hpbGUgb3MucGF0aC5leGlzdHMob3MucGF0aC5qb2luKGRpciwgIl9faW5pdF9fLnB5IikpOgorICAgICAgICAgICAgICAgIGRpciwgZGlybmFtZSA9IG9zLnBhdGguc3BsaXQoZGlyKQorICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBkaXJuYW1lICsgJy4nICsgbW9kbmFtZQorICAgICAgICAgICAgc3VibmFtZSA9IF9maWxlbmFtZV9hc19tb2RuYW1lKHNlbGYudGl0bGUpCisgICAgICAgICAgICBpZiBzdWJuYW1lIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuZ2xvYmFscywgZmlsZSwgTm9uZQorICAgICAgICAgICAgaWYgbW9kbmFtZToKKyAgICAgICAgICAgICAgICBpZiBzdWJuYW1lID09ICJfX2luaXRfXyI6CisgICAgICAgICAgICAgICAgICAgICMgc3RyaXAgdHJhaWxpbmcgcGVyaW9kCisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBtb2RuYW1lWzotMV0KKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBtb2RuYW1lID0gbW9kbmFtZSArIHN1Ym5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbW9kbmFtZSA9IHN1Ym5hbWUKKyAgICAgICAgICAgIGlmIHN5cy5tb2R1bGVzLmhhc19rZXkobW9kbmFtZSk6CisgICAgICAgICAgICAgICAgZ2xvYmFscyA9IHN5cy5tb2R1bGVzW21vZG5hbWVdLl9fZGljdF9fCisgICAgICAgICAgICAgICAgc2VsZi5nbG9iYWxzID0ge30KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZ2xvYmFscyA9IHNlbGYuZ2xvYmFscworICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBzdWJuYW1lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmaWxlID0gJzwlcz4nICUgc2VsZi50aXRsZQorICAgICAgICAgICAgZ2xvYmFscyA9IHNlbGYuZ2xvYmFscworICAgICAgICAgICAgbW9kbmFtZSA9IGZpbGUKKyAgICAgICAgcmV0dXJuIGdsb2JhbHMsIGZpbGUsIG1vZG5hbWUKKworICAgIGRlZiB3cml0ZShzZWxmLCBzdHVmZik6CisgICAgICAgICIiImZvciB1c2UgYXMgc3Rkb3V0IiIiCisgICAgICAgIHNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIHN0dWZmCisgICAgICAgIGlmICdcbicgaW4gc2VsZi5fYnVmOgorICAgICAgICAgICAgc2VsZi5mbHVzaCgpCisKKyAgICBkZWYgZmx1c2goc2VsZik6CisgICAgICAgIHN0dWZmID0gc3RyaW5nLnNwbGl0KHNlbGYuX2J1ZiwgJ1xuJykKKyAgICAgICAgc3R1ZmYgPSBzdHJpbmcuam9pbihzdHVmZiwgJ1xyJykKKyAgICAgICAgZW5kID0gc2VsZi5lZGl0Z3JvdXAuZWRpdG9yLnRlZC5XRUdldFRleHRMZW5ndGgoKQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFU2V0U2VsZWN0aW9uKGVuZCwgZW5kKQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IudGVkLldFSW5zZXJ0KHN0dWZmLCBOb25lLCBOb25lKQorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3IudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuX2J1ZiA9ICIiCisgICAgICAgICMgPyBvcHRpb25hbDoKKyAgICAgICAgI3NlbGYud2lkLlNlbGVjdFdpbmRvdygpCisKKyAgICBkZWYgZ2V0Y2xhc3NsaXN0KHNlbGYpOgorICAgICAgICBmcm9tIHN0cmluZyBpbXBvcnQgZmluZCwgc3RyaXAKKyAgICAgICAgbWV0aG9kUkUgPSByZS5jb21waWxlKHIiXHJbIFx0XStkZWYgIikKKyAgICAgICAgZmluZE1ldGhvZCA9IG1ldGhvZFJFLnNlYXJjaAorICAgICAgICBlZGl0b3IgPSBzZWxmLmVkaXRncm91cC5lZGl0b3IKKyAgICAgICAgdGV4dCA9IGVkaXRvci5nZXQoKQorICAgICAgICBsaXN0ID0gW10KKyAgICAgICAgYXBwZW5kID0gbGlzdC5hcHBlbmQKKyAgICAgICAgZnVuY3RhZyA9ICJmdW5jIgorICAgICAgICBjbGFzc3RhZyA9ICJjbGFzcyIKKyAgICAgICAgbWV0aG9kdGFnID0gIm1ldGhvZCIKKyAgICAgICAgcG9zID0gLTEKKyAgICAgICAgaWYgdGV4dFs6NF0gPT0gJ2RlZiAnOgorICAgICAgICAgICAgYXBwZW5kKChwb3MgKyA0LCBmdW5jdGFnKSkKKyAgICAgICAgICAgIHBvcyA9IDQKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIHBvcyA9IGZpbmQodGV4dCwgJ1xyZGVmICcsIHBvcyArIDEpCisgICAgICAgICAgICBpZiBwb3MgPCAwOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBhcHBlbmQoKHBvcyArIDUsIGZ1bmN0YWcpKQorICAgICAgICBwb3MgPSAtMQorICAgICAgICBpZiB0ZXh0Wzo2XSA9PSAnY2xhc3MgJzoKKyAgICAgICAgICAgIGFwcGVuZCgocG9zICsgNiwgY2xhc3N0YWcpKQorICAgICAgICAgICAgcG9zID0gNgorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgcG9zID0gZmluZCh0ZXh0LCAnXHJjbGFzcyAnLCBwb3MgKyAxKQorICAgICAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgYXBwZW5kKChwb3MgKyA3LCBjbGFzc3RhZykpCisgICAgICAgIHBvcyA9IDAKKyAgICAgICAgd2hpbGUgMToKKyAgICAgICAgICAgIG0gPSBmaW5kTWV0aG9kKHRleHQsIHBvcyArIDEpCisgICAgICAgICAgICBpZiBtIGlzIE5vbmU6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIHBvcyA9IG0ucmVnc1swXVswXQorICAgICAgICAgICAgI3BvcyA9IGZpbmQodGV4dCwgJ1xyXHRkZWYgJywgcG9zICsgMSkKKyAgICAgICAgICAgIGFwcGVuZCgobS5yZWdzWzBdWzFdLCBtZXRob2R0YWcpKQorICAgICAgICBsaXN0LnNvcnQoKQorICAgICAgICBjbGFzc2xpc3QgPSBbXQorICAgICAgICBtZXRob2RsaXN0YXBwZW5kID0gTm9uZQorICAgICAgICBvZmZzZXRUb0xpbmUgPSBlZGl0b3IudGVkLldFT2Zmc2V0VG9MaW5lCisgICAgICAgIGdldExpbmVSYW5nZSA9IGVkaXRvci50ZWQuV0VHZXRMaW5lUmFuZ2UKKyAgICAgICAgYXBwZW5kID0gY2xhc3NsaXN0LmFwcGVuZAorICAgICAgICBmb3IgcG9zLCB0YWcgaW4gbGlzdDoKKyAgICAgICAgICAgIGxpbmVubyA9IG9mZnNldFRvTGluZShwb3MpCisgICAgICAgICAgICBsaW5lU3RhcnQsIGxpbmVFbmQgPSBnZXRMaW5lUmFuZ2UobGluZW5vKQorICAgICAgICAgICAgbGluZSA9IHN0cmlwKHRleHRbcG9zOmxpbmVFbmRdKQorICAgICAgICAgICAgbGluZSA9IGxpbmVbOmlkZW50aWZpZVJFX21hdGNoKGxpbmUpXQorICAgICAgICAgICAgaWYgdGFnIGlzIGZ1bmN0YWc6CisgICAgICAgICAgICAgICAgYXBwZW5kKCgiZGVmICIgKyBsaW5lLCBsaW5lbm8gKyAxKSkKKyAgICAgICAgICAgICAgICBtZXRob2RsaXN0YXBwZW5kID0gTm9uZQorICAgICAgICAgICAgZWxpZiB0YWcgaXMgY2xhc3N0YWc6CisgICAgICAgICAgICAgICAgYXBwZW5kKFsiY2xhc3MgIiArIGxpbmVdKQorICAgICAgICAgICAgICAgIG1ldGhvZGxpc3RhcHBlbmQgPSBjbGFzc2xpc3RbLTFdLmFwcGVuZAorICAgICAgICAgICAgZWxpZiBtZXRob2RsaXN0YXBwZW5kIGFuZCB0YWcgaXMgbWV0aG9kdGFnOgorICAgICAgICAgICAgICAgIG1ldGhvZGxpc3RhcHBlbmQoKCJkZWYgIiArIGxpbmUsIGxpbmVubyArIDEpKQorICAgICAgICByZXR1cm4gY2xhc3NsaXN0CisKKyAgICBkZWYgcG9wc2VsZWN0bGluZShzZWxmLCBsaW5lbm8pOgorICAgICAgICBzZWxmLmVkaXRncm91cC5lZGl0b3Iuc2VsZWN0bGluZShsaW5lbm8gLSAxKQorCisgICAgZGVmIHNlbGVjdGxpbmUoc2VsZiwgbGluZW5vLCBjaGFyb2Zmc2V0ID0gMCk6CisgICAgICAgIHNlbGYuZWRpdGdyb3VwLmVkaXRvci5zZWxlY3RsaW5lKGxpbmVubyAtIDEsIGNoYXJvZmZzZXQpCisKKyAgICBkZWYgYWRkcmVjZW50ZmlsZShzZWxmLCBmaWxlbmFtZSk6CisgICAgICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgICAgICBhcHAuYWRkcmVjZW50ZmlsZShmaWxlbmFtZSkKIAogY2xhc3MgX3NhdmVvcHRpb25zOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBjcmVhdG9yLCBlb2xuKToKLQkJc2VsZi5ydiA9IE5vbmUKLQkJc2VsZi5lb2xuID0gZW9sbgotCQlzZWxmLncgPSB3ID0gVy5Nb2RhbERpYWxvZygoMjYwLCAxNjApLCAnU2F2ZSBvcHRpb25zJykKLQkJcmFkaW9idXR0b25zID0gW10KLQkJdy5sYWJlbCA9IFcuVGV4dEJveCgoOCwgOCwgODAsIDE4KSwgIkZpbGUgY3JlYXRvcjoiKQotCQl3LmlkZV9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDIyLCAxNjAsIDE4KSwgIlB5dGhvbklERSIsIHJhZGlvYnV0dG9ucywgc2VsZi5pZGVfaGl0KQotCQl3LmludGVycF9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDQyLCAxNjAsIDE4KSwgIk1hY1B5dGhvbi1PUzkgSW50ZXJwcmV0ZXIiLCByYWRpb2J1dHRvbnMsIHNlbGYuaW50ZXJwX2hpdCkKLQkJdy5pbnRlcnB4X3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgNjIsIDE2MCwgMTgpLCAiUHl0aG9uTGF1bmNoZXIiLCByYWRpb2J1dHRvbnMsIHNlbGYuaW50ZXJweF9oaXQpCi0JCXcub3RoZXJfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCA4MiwgNTAsIDE4KSwgIk90aGVyOiIsIHJhZGlvYnV0dG9ucykKLQkJdy5vdGhlcl9jcmVhdG9yID0gVy5FZGl0VGV4dCgoNjIsIDgyLCA0MCwgMjApLCBjcmVhdG9yLCBzZWxmLm90aGVyc2VsZWN0KQotCQl3Lm5vbmVfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCAxMDIsIDE2MCwgMTgpLCAiTm9uZSIsIHJhZGlvYnV0dG9ucywgc2VsZi5ub25lX2hpdCkKLQkJdy5jYW5jZWxidXR0b24gPSBXLkJ1dHRvbigoLTE4MCwgLTMwLCA4MCwgMTYpLCAiQ2FuY2VsIiwgc2VsZi5jYW5jZWxidXR0b25oaXQpCi0JCXcub2tidXR0b24gPSBXLkJ1dHRvbigoLTkwLCAtMzAsIDgwLCAxNiksICJEb25lIiwgc2VsZi5va2J1dHRvbmhpdCkKLQkJdy5zZXRkZWZhdWx0YnV0dG9uKHcub2tidXR0b24pCi0JCWlmIGNyZWF0b3IgPT0gJ1B5dGgnOgotCQkJdy5pbnRlcnBfcmFkaW8uc2V0KDEpCi0JCWVsaWYgY3JlYXRvciA9PSBXLl9zaWduYXR1cmU6Ci0JCQl3LmlkZV9yYWRpby5zZXQoMSkKLQkJZWxpZiBjcmVhdG9yID09ICdQeXRYJzoKLQkJCXcuaW50ZXJweF9yYWRpby5zZXQoMSkKLQkJZWxpZiBjcmVhdG9yID09ICdcMFwwXDBcMCc6Ci0JCQl3Lm5vbmVfcmFkaW8uc2V0KDEpCi0JCWVsc2U6Ci0JCQl3Lm90aGVyX3JhZGlvLnNldCgxKQotCQkJCi0JCXcuZW9sbmxhYmVsID0gVy5UZXh0Qm94KCgxNjgsIDgsIDgwLCAxOCksICJOZXdsaW5lIHN0eWxlOiIpCi0JCXJhZGlvYnV0dG9ucyA9IFtdCi0JCXcudW5peF9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDE2OCwgMjIsIDgwLCAxOCksICJVbml4IiwgcmFkaW9idXR0b25zLCBzZWxmLnVuaXhfaGl0KQotCQl3Lm1hY19yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDE2OCwgNDIsIDgwLCAxOCksICJNYWNpbnRvc2giLCByYWRpb2J1dHRvbnMsIHNlbGYubWFjX2hpdCkKLQkJdy53aW5fcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxNjgsIDYyLCA4MCwgMTgpLCAiV2luZG93cyIsIHJhZGlvYnV0dG9ucywgc2VsZi53aW5faGl0KQotCQlpZiBzZWxmLmVvbG4gPT0gJ1xuJzoKLQkJCXcudW5peF9yYWRpby5zZXQoMSkKLQkJZWxpZiBzZWxmLmVvbG4gPT0gJ1xyXG4nOgotCQkJdy53aW5fcmFkaW8uc2V0KDEpCi0JCWVsc2U6Ci0JCQl3Lm1hY19yYWRpby5zZXQoMSkKLQkJCi0JCXcuYmluZCgiY21kLiIsIHcuY2FuY2VsYnV0dG9uLnB1c2gpCi0JCXcub3BlbigpCi0JCi0JZGVmIGlkZV9oaXQoc2VsZik6Ci0JCXNlbGYudy5vdGhlcl9jcmVhdG9yLnNldChXLl9zaWduYXR1cmUpCi0JCi0JZGVmIGludGVycF9oaXQoc2VsZik6Ci0JCXNlbGYudy5vdGhlcl9jcmVhdG9yLnNldCgiUHl0aCIpCi0JCi0JZGVmIGludGVycHhfaGl0KHNlbGYpOgotCQlzZWxmLncub3RoZXJfY3JlYXRvci5zZXQoIlB5dFgiKQotCQotCWRlZiBub25lX2hpdChzZWxmKToKLQkJc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KCJcMFwwXDBcMCIpCi0JCi0JZGVmIG90aGVyc2VsZWN0KHNlbGYsICphcmdzKToKLQkJc2VsX2Zyb20sIHNlbF90byA9IHNlbGYudy5vdGhlcl9jcmVhdG9yLmdldHNlbGVjdGlvbigpCi0JCWNyZWF0b3IgPSBzZWxmLncub3RoZXJfY3JlYXRvci5nZXQoKVs6NF0KLQkJY3JlYXRvciA9IGNyZWF0b3IgKyAiICIgKiAoNCAtIGxlbihjcmVhdG9yKSkKLQkJc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KGNyZWF0b3IpCi0JCXNlbGYudy5vdGhlcl9jcmVhdG9yLnNldHNlbGVjdGlvbihzZWxfZnJvbSwgc2VsX3RvKQotCQlzZWxmLncub3RoZXJfcmFkaW8uc2V0KDEpCi0JCi0JZGVmIG1hY19oaXQoc2VsZik6Ci0JCXNlbGYuZW9sbiA9ICdccicKLQkJCi0JZGVmIHVuaXhfaGl0KHNlbGYpOgotCQlzZWxmLmVvbG4gPSAnXG4nCi0JCQotCWRlZiB3aW5faGl0KHNlbGYpOgotCQlzZWxmLmVvbG4gPSAnXHJcbicKLQkJCi0JZGVmIGNhbmNlbGJ1dHRvbmhpdChzZWxmKToKLQkJc2VsZi53LmNsb3NlKCkKLQkKLQlkZWYgb2tidXR0b25oaXQoc2VsZik6Ci0JCXNlbGYucnYgPSAoc2VsZi53Lm90aGVyX2NyZWF0b3IuZ2V0KClbOjRdLCBzZWxmLmVvbG4pCi0JCXNlbGYudy5jbG9zZSgpCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgY3JlYXRvciwgZW9sbik6CisgICAgICAgIHNlbGYucnYgPSBOb25lCisgICAgICAgIHNlbGYuZW9sbiA9IGVvbG4KKyAgICAgICAgc2VsZi53ID0gdyA9IFcuTW9kYWxEaWFsb2coKDI2MCwgMTYwKSwgJ1NhdmUgb3B0aW9ucycpCisgICAgICAgIHJhZGlvYnV0dG9ucyA9IFtdCisgICAgICAgIHcubGFiZWwgPSBXLlRleHRCb3goKDgsIDgsIDgwLCAxOCksICJGaWxlIGNyZWF0b3I6IikKKyAgICAgICAgdy5pZGVfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCAyMiwgMTYwLCAxOCksICJQeXRob25JREUiLCByYWRpb2J1dHRvbnMsIHNlbGYuaWRlX2hpdCkKKyAgICAgICAgdy5pbnRlcnBfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCg4LCA0MiwgMTYwLCAxOCksICJNYWNQeXRob24tT1M5IEludGVycHJldGVyIiwgcmFkaW9idXR0b25zLCBzZWxmLmludGVycF9oaXQpCisgICAgICAgIHcuaW50ZXJweF9yYWRpbyA9IFcuUmFkaW9CdXR0b24oKDgsIDYyLCAxNjAsIDE4KSwgIlB5dGhvbkxhdW5jaGVyIiwgcmFkaW9idXR0b25zLCBzZWxmLmludGVycHhfaGl0KQorICAgICAgICB3Lm90aGVyX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgODIsIDUwLCAxOCksICJPdGhlcjoiLCByYWRpb2J1dHRvbnMpCisgICAgICAgIHcub3RoZXJfY3JlYXRvciA9IFcuRWRpdFRleHQoKDYyLCA4MiwgNDAsIDIwKSwgY3JlYXRvciwgc2VsZi5vdGhlcnNlbGVjdCkKKyAgICAgICAgdy5ub25lX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoOCwgMTAyLCAxNjAsIDE4KSwgIk5vbmUiLCByYWRpb2J1dHRvbnMsIHNlbGYubm9uZV9oaXQpCisgICAgICAgIHcuY2FuY2VsYnV0dG9uID0gVy5CdXR0b24oKC0xODAsIC0zMCwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuY2FuY2VsYnV0dG9uaGl0KQorICAgICAgICB3Lm9rYnV0dG9uID0gVy5CdXR0b24oKC05MCwgLTMwLCA4MCwgMTYpLCAiRG9uZSIsIHNlbGYub2tidXR0b25oaXQpCisgICAgICAgIHcuc2V0ZGVmYXVsdGJ1dHRvbih3Lm9rYnV0dG9uKQorICAgICAgICBpZiBjcmVhdG9yID09ICdQeXRoJzoKKyAgICAgICAgICAgIHcuaW50ZXJwX3JhZGlvLnNldCgxKQorICAgICAgICBlbGlmIGNyZWF0b3IgPT0gVy5fc2lnbmF0dXJlOgorICAgICAgICAgICAgdy5pZGVfcmFkaW8uc2V0KDEpCisgICAgICAgIGVsaWYgY3JlYXRvciA9PSAnUHl0WCc6CisgICAgICAgICAgICB3LmludGVycHhfcmFkaW8uc2V0KDEpCisgICAgICAgIGVsaWYgY3JlYXRvciA9PSAnXDBcMFwwXDAnOgorICAgICAgICAgICAgdy5ub25lX3JhZGlvLnNldCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdy5vdGhlcl9yYWRpby5zZXQoMSkKKworICAgICAgICB3LmVvbG5sYWJlbCA9IFcuVGV4dEJveCgoMTY4LCA4LCA4MCwgMTgpLCAiTmV3bGluZSBzdHlsZToiKQorICAgICAgICByYWRpb2J1dHRvbnMgPSBbXQorICAgICAgICB3LnVuaXhfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxNjgsIDIyLCA4MCwgMTgpLCAiVW5peCIsIHJhZGlvYnV0dG9ucywgc2VsZi51bml4X2hpdCkKKyAgICAgICAgdy5tYWNfcmFkaW8gPSBXLlJhZGlvQnV0dG9uKCgxNjgsIDQyLCA4MCwgMTgpLCAiTWFjaW50b3NoIiwgcmFkaW9idXR0b25zLCBzZWxmLm1hY19oaXQpCisgICAgICAgIHcud2luX3JhZGlvID0gVy5SYWRpb0J1dHRvbigoMTY4LCA2MiwgODAsIDE4KSwgIldpbmRvd3MiLCByYWRpb2J1dHRvbnMsIHNlbGYud2luX2hpdCkKKyAgICAgICAgaWYgc2VsZi5lb2xuID09ICdcbic6CisgICAgICAgICAgICB3LnVuaXhfcmFkaW8uc2V0KDEpCisgICAgICAgIGVsaWYgc2VsZi5lb2xuID09ICdcclxuJzoKKyAgICAgICAgICAgIHcud2luX3JhZGlvLnNldCgxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdy5tYWNfcmFkaW8uc2V0KDEpCisKKyAgICAgICAgdy5iaW5kKCJjbWQuIiwgdy5jYW5jZWxidXR0b24ucHVzaCkKKyAgICAgICAgdy5vcGVuKCkKKworICAgIGRlZiBpZGVfaGl0KHNlbGYpOgorICAgICAgICBzZWxmLncub3RoZXJfY3JlYXRvci5zZXQoVy5fc2lnbmF0dXJlKQorCisgICAgZGVmIGludGVycF9oaXQoc2VsZik6CisgICAgICAgIHNlbGYudy5vdGhlcl9jcmVhdG9yLnNldCgiUHl0aCIpCisKKyAgICBkZWYgaW50ZXJweF9oaXQoc2VsZik6CisgICAgICAgIHNlbGYudy5vdGhlcl9jcmVhdG9yLnNldCgiUHl0WCIpCisKKyAgICBkZWYgbm9uZV9oaXQoc2VsZik6CisgICAgICAgIHNlbGYudy5vdGhlcl9jcmVhdG9yLnNldCgiXDBcMFwwXDAiKQorCisgICAgZGVmIG90aGVyc2VsZWN0KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsX2Zyb20sIHNlbF90byA9IHNlbGYudy5vdGhlcl9jcmVhdG9yLmdldHNlbGVjdGlvbigpCisgICAgICAgIGNyZWF0b3IgPSBzZWxmLncub3RoZXJfY3JlYXRvci5nZXQoKVs6NF0KKyAgICAgICAgY3JlYXRvciA9IGNyZWF0b3IgKyAiICIgKiAoNCAtIGxlbihjcmVhdG9yKSkKKyAgICAgICAgc2VsZi53Lm90aGVyX2NyZWF0b3Iuc2V0KGNyZWF0b3IpCisgICAgICAgIHNlbGYudy5vdGhlcl9jcmVhdG9yLnNldHNlbGVjdGlvbihzZWxfZnJvbSwgc2VsX3RvKQorICAgICAgICBzZWxmLncub3RoZXJfcmFkaW8uc2V0KDEpCisKKyAgICBkZWYgbWFjX2hpdChzZWxmKToKKyAgICAgICAgc2VsZi5lb2xuID0gJ1xyJworCisgICAgZGVmIHVuaXhfaGl0KHNlbGYpOgorICAgICAgICBzZWxmLmVvbG4gPSAnXG4nCisKKyAgICBkZWYgd2luX2hpdChzZWxmKToKKyAgICAgICAgc2VsZi5lb2xuID0gJ1xyXG4nCisKKyAgICBkZWYgY2FuY2VsYnV0dG9uaGl0KHNlbGYpOgorICAgICAgICBzZWxmLncuY2xvc2UoKQorCisgICAgZGVmIG9rYnV0dG9uaGl0KHNlbGYpOgorICAgICAgICBzZWxmLnJ2ID0gKHNlbGYudy5vdGhlcl9jcmVhdG9yLmdldCgpWzo0XSwgc2VsZi5lb2xuKQorICAgICAgICBzZWxmLncuY2xvc2UoKQogCiAKIGRlZiBTYXZlT3B0aW9ucyhjcmVhdG9yLCBlb2xuKToKLQlzID0gX3NhdmVvcHRpb25zKGNyZWF0b3IsIGVvbG4pCi0JcmV0dXJuIHMucnYKKyAgICBzID0gX3NhdmVvcHRpb25zKGNyZWF0b3IsIGVvbG4pCisgICAgcmV0dXJuIHMucnYKIAogCi1kZWYgX2VzY2FwZSh3aGVyZSwgd2hhdCkgOiAKLQlyZXR1cm4gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KHdoZXJlLCB3aGF0KSwgJ1xcJyArIHdoYXQpCitkZWYgX2VzY2FwZSh3aGVyZSwgd2hhdCkgOgorICAgIHJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQod2hlcmUsIHdoYXQpLCAnXFwnICsgd2hhdCkKIAogZGVmIF9tYWtld2hvbGV3b3JkcGF0dGVybih3b3JkKToKLQkjIGZpcnN0LCBlc2NhcGUgc3BlY2lhbCByZWdleCBjaGFycwotCWZvciBlc2MgaW4gIlxcW10oKXwuKl4rJD8iOgotCQl3b3JkID0gX2VzY2FwZSh3b3JkLCBlc2MpCi0Jbm90d29yZGNoYXJzcGF0ID0gJ1teJyArIF93b3JkY2hhcnMgKyAnXScKLQlwYXR0ZXJuID0gJygnICsgd29yZCArICcpJwotCWlmIHdvcmRbMF0gaW4gX3dvcmRjaGFyczoKLQkJcGF0dGVybiA9IG5vdHdvcmRjaGFyc3BhdCArIHBhdHRlcm4KLQlpZiB3b3JkWy0xXSBpbiBfd29yZGNoYXJzOgotCQlwYXR0ZXJuID0gcGF0dGVybiArIG5vdHdvcmRjaGFyc3BhdAotCXJldHVybiByZS5jb21waWxlKHBhdHRlcm4pCisgICAgIyBmaXJzdCwgZXNjYXBlIHNwZWNpYWwgcmVnZXggY2hhcnMKKyAgICBmb3IgZXNjIGluICJcXFtdKCl8LipeKyQ/IjoKKyAgICAgICAgd29yZCA9IF9lc2NhcGUod29yZCwgZXNjKQorICAgIG5vdHdvcmRjaGFyc3BhdCA9ICdbXicgKyBfd29yZGNoYXJzICsgJ10nCisgICAgcGF0dGVybiA9ICcoJyArIHdvcmQgKyAnKScKKyAgICBpZiB3b3JkWzBdIGluIF93b3JkY2hhcnM6CisgICAgICAgIHBhdHRlcm4gPSBub3R3b3JkY2hhcnNwYXQgKyBwYXR0ZXJuCisgICAgaWYgd29yZFstMV0gaW4gX3dvcmRjaGFyczoKKyAgICAgICAgcGF0dGVybiA9IHBhdHRlcm4gKyBub3R3b3JkY2hhcnNwYXQKKyAgICByZXR1cm4gcmUuY29tcGlsZShwYXR0ZXJuKQogCiAKIGNsYXNzIFNlYXJjaEVuZ2luZToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYudmlzaWJsZSA9IDAKLQkJc2VsZi53ID0gTm9uZQotCQlzZWxmLnBhcm1zID0geyAgImZpbmQiOiAiIiwKLQkJCQkJInJlcGxhY2UiOiAiIiwKLQkJCQkJIndyYXAiOiAxLAotCQkJCQkiY2FzZXNlbnMiOiAxLAotCQkJCQkid2hvbGV3b3JkIjogMQotCQkJCX0KLQkJaW1wb3J0IE1hY1ByZWZzCi0JCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQkJaWYgcHJlZnMuc2VhcmNoZW5naW5lOgotCQkJc2VsZi5wYXJtc1siY2FzZXNlbnMiXSA9IHByZWZzLnNlYXJjaGVuZ2luZS5jYXNlc2VucwotCQkJc2VsZi5wYXJtc1sid3JhcCJdID0gcHJlZnMuc2VhcmNoZW5naW5lLndyYXAKLQkJCXNlbGYucGFybXNbIndob2xld29yZCJdID0gcHJlZnMuc2VhcmNoZW5naW5lLndob2xld29yZAotCQotCWRlZiBzaG93KHNlbGYpOgotCQlzZWxmLnZpc2libGUgPSAxCi0JCWlmIHNlbGYudzoKLQkJCXNlbGYudy53aWQuU2hvd1dpbmRvdygpCi0JCQlzZWxmLncud2lkLlNlbGVjdFdpbmRvdygpCi0JCQlzZWxmLncuZmluZC5lZGl0LnNlbGVjdCgxKQotCQkJc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQotCQkJcmV0dXJuCi0JCXNlbGYudyA9IFcuRGlhbG9nKCg0MjAsIDE1MCksICJGaW5kIikKLQkJCi0JCXNlbGYudy5maW5kID0gVGl0bGVkRWRpdFRleHQoKDEwLCA0LCAzMDAsIDM2KSwgIlNlYXJjaCBmb3I6IikKLQkJc2VsZi53LnJlcGxhY2UgPSBUaXRsZWRFZGl0VGV4dCgoMTAsIDEwMCwgMzAwLCAzNiksICJSZXBsYWNlIHdpdGg6IikKLQkJCi0JCXNlbGYudy5ib3hlcyA9IFcuR3JvdXAoKDEwLCA1MCwgMzAwLCA0MCkpCi0JCXNlbGYudy5ib3hlcy5jYXNlc2VucyA9IFcuQ2hlY2tCb3goKDAsIDAsIDEwMCwgMTYpLCAiQ2FzZSBzZW5zaXRpdmUiKQotCQlzZWxmLncuYm94ZXMud2hvbGV3b3JkID0gVy5DaGVja0JveCgoMCwgMjAsIDEwMCwgMTYpLCAiV2hvbGUgd29yZCIpCi0JCXNlbGYudy5ib3hlcy53cmFwID0gVy5DaGVja0JveCgoMTEwLCAwLCAxMDAsIDE2KSwgIldyYXAgYXJvdW5kIikKLQkJCi0JCXNlbGYuYnV0dG9ucyA9IFsJKCJGaW5kIiwJCSJjbWRmIiwJIHNlbGYuZmluZCksIAotCQkJCQkoIlJlcGxhY2UiLAkgICAgICJjbWRyIiwJIHNlbGYucmVwbGFjZSksIAotCQkJCQkoIlJlcGxhY2UgYWxsIiwJIE5vbmUsICAgc2VsZi5yZXBsYWNlYWxsKSwgCi0JCQkJCSgiRG9uJ3QgZmluZCIsICAiY21kZCIsCSBzZWxmLmRvbnQpLCAKLQkJCQkJKCJDYW5jZWwiLAkgICAgICAiY21kLiIsCSBzZWxmLmNhbmNlbCkKLQkJCQldCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLmJ1dHRvbnMpKToKLQkJCWJvdW5kcyA9IC05MCwgMjIgKyBpICogMjQsIDgwLCAxNgotCQkJdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjayA9IHNlbGYuYnV0dG9uc1tpXQotCQkJc2VsZi53W3RpdGxlXSA9IFcuQnV0dG9uKGJvdW5kcywgdGl0bGUsIGNhbGxiYWNrKQotCQkJaWYgc2hvcnRjdXQ6Ci0JCQkJc2VsZi53LmJpbmQoc2hvcnRjdXQsIHNlbGYud1t0aXRsZV0ucHVzaCkKLQkJc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJEb24ndCBmaW5kIl0pCi0JCXNlbGYudy5maW5kLmVkaXQuYmluZCgiPGtleT4iLCBzZWxmLmtleSkKLQkJc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQotCQlzZWxmLncuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCi0JCXNlbGYudy5vcGVuKCkKLQkJc2VsZi5zZXRwYXJtcygpCi0JCXNlbGYudy5maW5kLmVkaXQuc2VsZWN0KDEpCi0JCXNlbGYudy5maW5kLmVkaXQuc2VsZWN0YWxsKCkKLQkJc2VsZi5jaGVja2J1dHRvbnMoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5oaWRlKCkKLQkJcmV0dXJuIC0xCi0JCi0JZGVmIGtleShzZWxmLCBjaGFyLCBtb2RpZmllcnMpOgotCQlzZWxmLncuZmluZC5lZGl0LmtleShjaGFyLCBtb2RpZmllcnMpCi0JCXNlbGYuY2hlY2tidXR0b25zKCkKLQkJcmV0dXJuIDEKLQkKLQlkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgotCQlpZiBvbm9mZjoKLQkJCXNlbGYuY2hlY2tidXR0b25zKCkKLQkKLQlkZWYgY2hlY2tidXR0b25zKHNlbGYpOgotCQllZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCi0JCWlmIGVkaXRvcjoKLQkJCWlmIHNlbGYudy5maW5kLmdldCgpOgotCQkJCWZvciB0aXRsZSwgY21kLCBjYWxsIGluIHNlbGYuYnV0dG9uc1s6LTJdOgotCQkJCQlzZWxmLndbdGl0bGVdLmVuYWJsZSgxKQotCQkJCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud1siRmluZCJdKQotCQkJZWxzZToKLQkJCQlmb3IgdGl0bGUsIGNtZCwgY2FsbCBpbiBzZWxmLmJ1dHRvbnNbOi0yXToKLQkJCQkJc2VsZi53W3RpdGxlXS5lbmFibGUoMCkKLQkJCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndbIkRvbid0IGZpbmQiXSkKLQkJZWxzZToKLQkJCWZvciB0aXRsZSwgY21kLCBjYWxsIGluIHNlbGYuYnV0dG9uc1s6LTJdOgotCQkJCXNlbGYud1t0aXRsZV0uZW5hYmxlKDApCi0JCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLndbIkRvbid0IGZpbmQiXSkKLQkKLQlkZWYgZmluZChzZWxmKToKLQkJc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQotCQlpZiBzZWxmLmZpbmRuZXh0KCk6Ci0JCQlzZWxmLmhpZGUoKQotCQotCWRlZiByZXBsYWNlKHNlbGYpOgotCQllZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCi0JCWlmIG5vdCBlZGl0b3I6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi52aXNpYmxlOgotCQkJc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQotCQl0ZXh0ID0gZWRpdG9yLmdldHNlbGVjdGVkdGV4dCgpCi0JCWZpbmQgPSBzZWxmLnBhcm1zWyJmaW5kIl0KLQkJaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06Ci0JCQlmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCi0JCQl0ZXh0ID0gc3RyaW5nLmxvd2VyKHRleHQpCi0JCWlmIHRleHQgPT0gZmluZDoKLQkJCXNlbGYuaGlkZSgpCi0JCQllZGl0b3IuaW5zZXJ0KHNlbGYucGFybXNbInJlcGxhY2UiXSkKLQkKLQlkZWYgcmVwbGFjZWFsbChzZWxmKToKLQkJZWRpdG9yID0gZmluZGVkaXRvcihzZWxmKQotCQlpZiBub3QgZWRpdG9yOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYudmlzaWJsZToKLQkJCXNlbGYuZ2V0cGFybXNmcm9td2luZG93KCkKLQkJVy5TZXRDdXJzb3IoIndhdGNoIikKLQkJZmluZCA9IHNlbGYucGFybXNbImZpbmQiXQotCQlpZiBub3QgZmluZDoKLQkJCXJldHVybgotCQlmaW5kbGVuID0gbGVuKGZpbmQpCi0JCXJlcGxhY2UgPSBzZWxmLnBhcm1zWyJyZXBsYWNlIl0KLQkJcmVwbGFjZWxlbiA9IGxlbihyZXBsYWNlKQotCQlUZXh0ID0gZWRpdG9yLmdldCgpCi0JCWlmIG5vdCBzZWxmLnBhcm1zWyJjYXNlc2VucyJdOgotCQkJZmluZCA9IHN0cmluZy5sb3dlcihmaW5kKQotCQkJdGV4dCA9IHN0cmluZy5sb3dlcihUZXh0KQotCQllbHNlOgotCQkJdGV4dCA9IFRleHQKLQkJbmV3dGV4dCA9ICIiCi0JCXBvcyA9IDAKLQkJY291bnRlciA9IDAKLQkJd2hpbGUgMToKLQkJCWlmIHNlbGYucGFybXNbIndob2xld29yZCJdOgotCQkJCXdob2xld29yZFJFID0gX21ha2V3aG9sZXdvcmRwYXR0ZXJuKGZpbmQpCi0JCQkJbWF0Y2ggPSB3aG9sZXdvcmRSRS5zZWFyY2godGV4dCwgcG9zKQotCQkJCWlmIG1hdGNoOgotCQkJCQlwb3MgPSBtYXRjaC5zdGFydCgxKQotCQkJCWVsc2U6Ci0JCQkJCXBvcyA9IC0xCi0JCQllbHNlOgotCQkJCXBvcyA9IHN0cmluZy5maW5kKHRleHQsIGZpbmQsIHBvcykKLQkJCWlmIHBvcyA8IDA6Ci0JCQkJYnJlYWsKLQkJCWNvdW50ZXIgPSBjb3VudGVyICsgMQotCQkJdGV4dCA9IHRleHRbOnBvc10gKyByZXBsYWNlICsgdGV4dFtwb3MgKyBmaW5kbGVuOl0KLQkJCVRleHQgPSBUZXh0Wzpwb3NdICsgcmVwbGFjZSArIFRleHRbcG9zICsgZmluZGxlbjpdCi0JCQlwb3MgPSBwb3MgKyByZXBsYWNlbGVuCi0JCVcuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCWlmIGNvdW50ZXI6Ci0JCQlzZWxmLmhpZGUoKQotCQkJZnJvbSBDYXJib24gaW1wb3J0IFJlcwotCQkJZWRpdG9yLnRleHRjaGFuZ2VkKCkKLQkJCWVkaXRvci5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJCWVkaXRvci5zZXQoVGV4dCkKLQkJCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIlJlcGxhY2VkICVkIG9jY3VycmVuY2VzIiAlIGNvdW50ZXIpCi0JCi0JZGVmIGRvbnQoc2VsZik6Ci0JCXNlbGYuZ2V0cGFybXNmcm9td2luZG93KCkKLQkJc2VsZi5oaWRlKCkKLQkKLQlkZWYgcmVwbGFjZWZpbmQoc2VsZik6Ci0JCXNlbGYucmVwbGFjZSgpCi0JCXNlbGYuZmluZG5leHQoKQotCQotCWRlZiBzZXRmaW5kc3RyaW5nKHNlbGYpOgotCQllZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCi0JCWlmIG5vdCBlZGl0b3I6Ci0JCQlyZXR1cm4KLQkJZmluZCA9IGVkaXRvci5nZXRzZWxlY3RlZHRleHQoKQotCQlpZiBub3QgZmluZDoKLQkJCXJldHVybgotCQlzZWxmLnBhcm1zWyJmaW5kIl0gPSBmaW5kCi0JCWlmIHNlbGYudzoKLQkJCXNlbGYudy5maW5kLmVkaXQuc2V0KHNlbGYucGFybXNbImZpbmQiXSkKLQkJCXNlbGYudy5maW5kLmVkaXQuc2VsZWN0YWxsKCkKLQkKLQlkZWYgZmluZG5leHQoc2VsZik6Ci0JCWVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKLQkJaWYgbm90IGVkaXRvcjoKLQkJCXJldHVybgotCQlmaW5kID0gc2VsZi5wYXJtc1siZmluZCJdCi0JCWlmIG5vdCBmaW5kOgotCQkJcmV0dXJuCi0JCXRleHQgPSBlZGl0b3IuZ2V0KCkKLQkJaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06Ci0JCQlmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCi0JCQl0ZXh0ID0gc3RyaW5nLmxvd2VyKHRleHQpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBlZGl0b3IuZ2V0c2VsZWN0aW9uKCkKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCi0JCWlmIHNlbGYucGFybXNbIndob2xld29yZCJdOgotCQkJd2hvbGV3b3JkUkUgPSBfbWFrZXdob2xld29yZHBhdHRlcm4oZmluZCkKLQkJCW1hdGNoID0gd2hvbGV3b3JkUkUuc2VhcmNoKHRleHQsIHNlbGVuZCkKLQkJCWlmIG1hdGNoOgotCQkJCXBvcyA9IG1hdGNoLnN0YXJ0KDEpCi0JCQllbHNlOgotCQkJCXBvcyA9IC0xCi0JCWVsc2U6Ci0JCQlwb3MgPSBzdHJpbmcuZmluZCh0ZXh0LCBmaW5kLCBzZWxlbmQpCi0JCWlmIHBvcyA+PSAwOgotCQkJZWRpdG9yLnNldHNlbGVjdGlvbihwb3MsIHBvcyArIGxlbihmaW5kKSkKLQkJCXJldHVybiAxCi0JCWVsaWYgc2VsZi5wYXJtc1sid3JhcCJdOgotCQkJaWYgc2VsZi5wYXJtc1sid2hvbGV3b3JkIl06Ci0JCQkJbWF0Y2ggPSB3aG9sZXdvcmRSRS5zZWFyY2godGV4dCwgMCkKLQkJCQlpZiBtYXRjaDoKLQkJCQkJcG9zID0gbWF0Y2guc3RhcnQoMSkKLQkJCQllbHNlOgotCQkJCQlwb3MgPSAtMQotCQkJZWxzZToKLQkJCQlwb3MgPSBzdHJpbmcuZmluZCh0ZXh0LCBmaW5kKQotCQkJaWYgc2Vsc3RhcnQgPiBwb3MgPj0gMDoKLQkJCQllZGl0b3Iuc2V0c2VsZWN0aW9uKHBvcywgcG9zICsgbGVuKGZpbmQpKQotCQkJCXJldHVybiAxCi0JCi0JZGVmIHNldHBhcm1zKHNlbGYpOgotCQlmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLnBhcm1zLml0ZW1zKCk6Ci0JCQl0cnk6Ci0JCQkJc2VsZi53W2tleV0uc2V0KHZhbHVlKQotCQkJZXhjZXB0IEtleUVycm9yOgotCQkJCXNlbGYudy5ib3hlc1trZXldLnNldCh2YWx1ZSkKLQkKLQlkZWYgZ2V0cGFybXNmcm9td2luZG93KHNlbGYpOgotCQlpZiBub3Qgc2VsZi53OgotCQkJcmV0dXJuCi0JCWZvciBrZXksIHZhbHVlIGluIHNlbGYucGFybXMuaXRlbXMoKToKLQkJCXRyeToKLQkJCQl2YWx1ZSA9IHNlbGYud1trZXldLmdldCgpCi0JCQlleGNlcHQgS2V5RXJyb3I6Ci0JCQkJdmFsdWUgPSBzZWxmLncuYm94ZXNba2V5XS5nZXQoKQotCQkJc2VsZi5wYXJtc1trZXldID0gdmFsdWUKLQkKLQlkZWYgY2FuY2VsKHNlbGYpOgotCQlzZWxmLmhpZGUoKQotCQlzZWxmLnNldHBhcm1zKCkKLQkKLQlkZWYgaGlkZShzZWxmKToKLQkJaWYgc2VsZi53OgotCQkJc2VsZi53LndpZC5IaWRlV2luZG93KCkKLQkJCXNlbGYudmlzaWJsZSA9IDAKLQkKLQlkZWYgd3JpdGVwcmVmcyhzZWxmKToKLQkJaW1wb3J0IE1hY1ByZWZzCi0JCXNlbGYuZ2V0cGFybXNmcm9td2luZG93KCkKLQkJcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQotCQlwcmVmcy5zZWFyY2hlbmdpbmUuY2FzZXNlbnMgPSBzZWxmLnBhcm1zWyJjYXNlc2VucyJdCi0JCXByZWZzLnNlYXJjaGVuZ2luZS53cmFwID0gc2VsZi5wYXJtc1sid3JhcCJdCi0JCXByZWZzLnNlYXJjaGVuZ2luZS53aG9sZXdvcmQgPSBzZWxmLnBhcm1zWyJ3aG9sZXdvcmQiXQotCQlwcmVmcy5zYXZlKCkKLQkKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi52aXNpYmxlID0gMAorICAgICAgICBzZWxmLncgPSBOb25lCisgICAgICAgIHNlbGYucGFybXMgPSB7ICAiZmluZCI6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVwbGFjZSI6ICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid3JhcCI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjYXNlc2VucyI6IDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3aG9sZXdvcmQiOiAxCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgIGltcG9ydCBNYWNQcmVmcworICAgICAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgICAgIGlmIHByZWZzLnNlYXJjaGVuZ2luZToKKyAgICAgICAgICAgIHNlbGYucGFybXNbImNhc2VzZW5zIl0gPSBwcmVmcy5zZWFyY2hlbmdpbmUuY2FzZXNlbnMKKyAgICAgICAgICAgIHNlbGYucGFybXNbIndyYXAiXSA9IHByZWZzLnNlYXJjaGVuZ2luZS53cmFwCisgICAgICAgICAgICBzZWxmLnBhcm1zWyJ3aG9sZXdvcmQiXSA9IHByZWZzLnNlYXJjaGVuZ2luZS53aG9sZXdvcmQKKworICAgIGRlZiBzaG93KHNlbGYpOgorICAgICAgICBzZWxmLnZpc2libGUgPSAxCisgICAgICAgIGlmIHNlbGYudzoKKyAgICAgICAgICAgIHNlbGYudy53aWQuU2hvd1dpbmRvdygpCisgICAgICAgICAgICBzZWxmLncud2lkLlNlbGVjdFdpbmRvdygpCisgICAgICAgICAgICBzZWxmLncuZmluZC5lZGl0LnNlbGVjdCgxKQorICAgICAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudyA9IFcuRGlhbG9nKCg0MjAsIDE1MCksICJGaW5kIikKKworICAgICAgICBzZWxmLncuZmluZCA9IFRpdGxlZEVkaXRUZXh0KCgxMCwgNCwgMzAwLCAzNiksICJTZWFyY2ggZm9yOiIpCisgICAgICAgIHNlbGYudy5yZXBsYWNlID0gVGl0bGVkRWRpdFRleHQoKDEwLCAxMDAsIDMwMCwgMzYpLCAiUmVwbGFjZSB3aXRoOiIpCisKKyAgICAgICAgc2VsZi53LmJveGVzID0gVy5Hcm91cCgoMTAsIDUwLCAzMDAsIDQwKSkKKyAgICAgICAgc2VsZi53LmJveGVzLmNhc2VzZW5zID0gVy5DaGVja0JveCgoMCwgMCwgMTAwLCAxNiksICJDYXNlIHNlbnNpdGl2ZSIpCisgICAgICAgIHNlbGYudy5ib3hlcy53aG9sZXdvcmQgPSBXLkNoZWNrQm94KCgwLCAyMCwgMTAwLCAxNiksICJXaG9sZSB3b3JkIikKKyAgICAgICAgc2VsZi53LmJveGVzLndyYXAgPSBXLkNoZWNrQm94KCgxMTAsIDAsIDEwMCwgMTYpLCAiV3JhcCBhcm91bmQiKQorCisgICAgICAgIHNlbGYuYnV0dG9ucyA9IFsgICAgICAgICgiRmluZCIsICAgICAgICAgICAgICAgICJjbWRmIiwgIHNlbGYuZmluZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiUmVwbGFjZSIsICAgICAgICAgICJjbWRyIiwgICAgIHNlbGYucmVwbGFjZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgiUmVwbGFjZSBhbGwiLCAgTm9uZSwgICBzZWxmLnJlcGxhY2VhbGwpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoIkRvbid0IGZpbmQiLCAgImNtZGQiLCAgc2VsZi5kb250KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCJDYW5jZWwiLCAgICAgICAgICAgICJjbWQuIiwgICAgc2VsZi5jYW5jZWwpCisgICAgICAgICAgICAgICAgICAgICAgICBdCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLmJ1dHRvbnMpKToKKyAgICAgICAgICAgIGJvdW5kcyA9IC05MCwgMjIgKyBpICogMjQsIDgwLCAxNgorICAgICAgICAgICAgdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjayA9IHNlbGYuYnV0dG9uc1tpXQorICAgICAgICAgICAgc2VsZi53W3RpdGxlXSA9IFcuQnV0dG9uKGJvdW5kcywgdGl0bGUsIGNhbGxiYWNrKQorICAgICAgICAgICAgaWYgc2hvcnRjdXQ6CisgICAgICAgICAgICAgICAgc2VsZi53LmJpbmQoc2hvcnRjdXQsIHNlbGYud1t0aXRsZV0ucHVzaCkKKyAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJEb24ndCBmaW5kIl0pCisgICAgICAgIHNlbGYudy5maW5kLmVkaXQuYmluZCgiPGtleT4iLCBzZWxmLmtleSkKKyAgICAgICAgc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQorICAgICAgICBzZWxmLncuYmluZCgiPGNsb3NlPiIsIHNlbGYuY2xvc2UpCisgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgc2VsZi5zZXRwYXJtcygpCisgICAgICAgIHNlbGYudy5maW5kLmVkaXQuc2VsZWN0KDEpCisgICAgICAgIHNlbGYudy5maW5kLmVkaXQuc2VsZWN0YWxsKCkKKyAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLmhpZGUoKQorICAgICAgICByZXR1cm4gLTEKKworICAgIGRlZiBrZXkoc2VsZiwgY2hhciwgbW9kaWZpZXJzKToKKyAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5rZXkoY2hhciwgbW9kaWZpZXJzKQorICAgICAgICBzZWxmLmNoZWNrYnV0dG9ucygpCisgICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuY2hlY2tidXR0b25zKCkKKworICAgIGRlZiBjaGVja2J1dHRvbnMoc2VsZik6CisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgZWRpdG9yOgorICAgICAgICAgICAgaWYgc2VsZi53LmZpbmQuZ2V0KCk6CisgICAgICAgICAgICAgICAgZm9yIHRpdGxlLCBjbWQsIGNhbGwgaW4gc2VsZi5idXR0b25zWzotMl06CisgICAgICAgICAgICAgICAgICAgIHNlbGYud1t0aXRsZV0uZW5hYmxlKDEpCisgICAgICAgICAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oc2VsZi53WyJGaW5kIl0pCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciB0aXRsZSwgY21kLCBjYWxsIGluIHNlbGYuYnV0dG9uc1s6LTJdOgorICAgICAgICAgICAgICAgICAgICBzZWxmLndbdGl0bGVdLmVuYWJsZSgwKQorICAgICAgICAgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud1siRG9uJ3QgZmluZCJdKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZm9yIHRpdGxlLCBjbWQsIGNhbGwgaW4gc2VsZi5idXR0b25zWzotMl06CisgICAgICAgICAgICAgICAgc2VsZi53W3RpdGxlXS5lbmFibGUoMCkKKyAgICAgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYud1siRG9uJ3QgZmluZCJdKQorCisgICAgZGVmIGZpbmQoc2VsZik6CisgICAgICAgIHNlbGYuZ2V0cGFybXNmcm9td2luZG93KCkKKyAgICAgICAgaWYgc2VsZi5maW5kbmV4dCgpOgorICAgICAgICAgICAgc2VsZi5oaWRlKCkKKworICAgIGRlZiByZXBsYWNlKHNlbGYpOgorICAgICAgICBlZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCisgICAgICAgIGlmIG5vdCBlZGl0b3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi52aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQorICAgICAgICB0ZXh0ID0gZWRpdG9yLmdldHNlbGVjdGVkdGV4dCgpCisgICAgICAgIGZpbmQgPSBzZWxmLnBhcm1zWyJmaW5kIl0KKyAgICAgICAgaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06CisgICAgICAgICAgICBmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCisgICAgICAgICAgICB0ZXh0ID0gc3RyaW5nLmxvd2VyKHRleHQpCisgICAgICAgIGlmIHRleHQgPT0gZmluZDoKKyAgICAgICAgICAgIHNlbGYuaGlkZSgpCisgICAgICAgICAgICBlZGl0b3IuaW5zZXJ0KHNlbGYucGFybXNbInJlcGxhY2UiXSkKKworICAgIGRlZiByZXBsYWNlYWxsKHNlbGYpOgorICAgICAgICBlZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCisgICAgICAgIGlmIG5vdCBlZGl0b3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi52aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQorICAgICAgICBXLlNldEN1cnNvcigid2F0Y2giKQorICAgICAgICBmaW5kID0gc2VsZi5wYXJtc1siZmluZCJdCisgICAgICAgIGlmIG5vdCBmaW5kOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGZpbmRsZW4gPSBsZW4oZmluZCkKKyAgICAgICAgcmVwbGFjZSA9IHNlbGYucGFybXNbInJlcGxhY2UiXQorICAgICAgICByZXBsYWNlbGVuID0gbGVuKHJlcGxhY2UpCisgICAgICAgIFRleHQgPSBlZGl0b3IuZ2V0KCkKKyAgICAgICAgaWYgbm90IHNlbGYucGFybXNbImNhc2VzZW5zIl06CisgICAgICAgICAgICBmaW5kID0gc3RyaW5nLmxvd2VyKGZpbmQpCisgICAgICAgICAgICB0ZXh0ID0gc3RyaW5nLmxvd2VyKFRleHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZXh0ID0gVGV4dAorICAgICAgICBuZXd0ZXh0ID0gIiIKKyAgICAgICAgcG9zID0gMAorICAgICAgICBjb3VudGVyID0gMAorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgaWYgc2VsZi5wYXJtc1sid2hvbGV3b3JkIl06CisgICAgICAgICAgICAgICAgd2hvbGV3b3JkUkUgPSBfbWFrZXdob2xld29yZHBhdHRlcm4oZmluZCkKKyAgICAgICAgICAgICAgICBtYXRjaCA9IHdob2xld29yZFJFLnNlYXJjaCh0ZXh0LCBwb3MpCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IG1hdGNoLnN0YXJ0KDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQodGV4dCwgZmluZCwgcG9zKQorICAgICAgICAgICAgaWYgcG9zIDwgMDoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgY291bnRlciA9IGNvdW50ZXIgKyAxCisgICAgICAgICAgICB0ZXh0ID0gdGV4dFs6cG9zXSArIHJlcGxhY2UgKyB0ZXh0W3BvcyArIGZpbmRsZW46XQorICAgICAgICAgICAgVGV4dCA9IFRleHRbOnBvc10gKyByZXBsYWNlICsgVGV4dFtwb3MgKyBmaW5kbGVuOl0KKyAgICAgICAgICAgIHBvcyA9IHBvcyArIHJlcGxhY2VsZW4KKyAgICAgICAgVy5TZXRDdXJzb3IoImFycm93IikKKyAgICAgICAgaWYgY291bnRlcjoKKyAgICAgICAgICAgIHNlbGYuaGlkZSgpCisgICAgICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisgICAgICAgICAgICBlZGl0b3IudGV4dGNoYW5nZWQoKQorICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICAgICAgZWRpdG9yLnNldChUZXh0KQorICAgICAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSgiUmVwbGFjZWQgJWQgb2NjdXJyZW5jZXMiICUgY291bnRlcikKKworICAgIGRlZiBkb250KHNlbGYpOgorICAgICAgICBzZWxmLmdldHBhcm1zZnJvbXdpbmRvdygpCisgICAgICAgIHNlbGYuaGlkZSgpCisKKyAgICBkZWYgcmVwbGFjZWZpbmQoc2VsZik6CisgICAgICAgIHNlbGYucmVwbGFjZSgpCisgICAgICAgIHNlbGYuZmluZG5leHQoKQorCisgICAgZGVmIHNldGZpbmRzdHJpbmcoc2VsZik6CisgICAgICAgIGVkaXRvciA9IGZpbmRlZGl0b3Ioc2VsZikKKyAgICAgICAgaWYgbm90IGVkaXRvcjoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBmaW5kID0gZWRpdG9yLmdldHNlbGVjdGVkdGV4dCgpCisgICAgICAgIGlmIG5vdCBmaW5kOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYucGFybXNbImZpbmQiXSA9IGZpbmQKKyAgICAgICAgaWYgc2VsZi53OgorICAgICAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5zZXQoc2VsZi5wYXJtc1siZmluZCJdKQorICAgICAgICAgICAgc2VsZi53LmZpbmQuZWRpdC5zZWxlY3RhbGwoKQorCisgICAgZGVmIGZpbmRuZXh0KHNlbGYpOgorICAgICAgICBlZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCisgICAgICAgIGlmIG5vdCBlZGl0b3I6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZmluZCA9IHNlbGYucGFybXNbImZpbmQiXQorICAgICAgICBpZiBub3QgZmluZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0ZXh0ID0gZWRpdG9yLmdldCgpCisgICAgICAgIGlmIG5vdCBzZWxmLnBhcm1zWyJjYXNlc2VucyJdOgorICAgICAgICAgICAgZmluZCA9IHN0cmluZy5sb3dlcihmaW5kKQorICAgICAgICAgICAgdGV4dCA9IHN0cmluZy5sb3dlcih0ZXh0KQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gZWRpdG9yLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQorICAgICAgICBpZiBzZWxmLnBhcm1zWyJ3aG9sZXdvcmQiXToKKyAgICAgICAgICAgIHdob2xld29yZFJFID0gX21ha2V3aG9sZXdvcmRwYXR0ZXJuKGZpbmQpCisgICAgICAgICAgICBtYXRjaCA9IHdob2xld29yZFJFLnNlYXJjaCh0ZXh0LCBzZWxlbmQpCisgICAgICAgICAgICBpZiBtYXRjaDoKKyAgICAgICAgICAgICAgICBwb3MgPSBtYXRjaC5zdGFydCgxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwb3MgPSAtMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQodGV4dCwgZmluZCwgc2VsZW5kKQorICAgICAgICBpZiBwb3MgPj0gMDoKKyAgICAgICAgICAgIGVkaXRvci5zZXRzZWxlY3Rpb24ocG9zLCBwb3MgKyBsZW4oZmluZCkpCisgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBlbGlmIHNlbGYucGFybXNbIndyYXAiXToKKyAgICAgICAgICAgIGlmIHNlbGYucGFybXNbIndob2xld29yZCJdOgorICAgICAgICAgICAgICAgIG1hdGNoID0gd2hvbGV3b3JkUkUuc2VhcmNoKHRleHQsIDApCisgICAgICAgICAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICAgICAgICAgIHBvcyA9IG1hdGNoLnN0YXJ0KDEpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcG9zID0gLTEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQodGV4dCwgZmluZCkKKyAgICAgICAgICAgIGlmIHNlbHN0YXJ0ID4gcG9zID49IDA6CisgICAgICAgICAgICAgICAgZWRpdG9yLnNldHNlbGVjdGlvbihwb3MsIHBvcyArIGxlbihmaW5kKSkKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIHNldHBhcm1zKHNlbGYpOgorICAgICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBzZWxmLnBhcm1zLml0ZW1zKCk6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi53W2tleV0uc2V0KHZhbHVlKQorICAgICAgICAgICAgZXhjZXB0IEtleUVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYudy5ib3hlc1trZXldLnNldCh2YWx1ZSkKKworICAgIGRlZiBnZXRwYXJtc2Zyb213aW5kb3coc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLnc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZm9yIGtleSwgdmFsdWUgaW4gc2VsZi5wYXJtcy5pdGVtcygpOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi53W2tleV0uZ2V0KCkKKyAgICAgICAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbGYudy5ib3hlc1trZXldLmdldCgpCisgICAgICAgICAgICBzZWxmLnBhcm1zW2tleV0gPSB2YWx1ZQorCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgc2VsZi5oaWRlKCkKKyAgICAgICAgc2VsZi5zZXRwYXJtcygpCisKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi53OgorICAgICAgICAgICAgc2VsZi53LndpZC5IaWRlV2luZG93KCkKKyAgICAgICAgICAgIHNlbGYudmlzaWJsZSA9IDAKKworICAgIGRlZiB3cml0ZXByZWZzKHNlbGYpOgorICAgICAgICBpbXBvcnQgTWFjUHJlZnMKKyAgICAgICAgc2VsZi5nZXRwYXJtc2Zyb213aW5kb3coKQorICAgICAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgICAgIHByZWZzLnNlYXJjaGVuZ2luZS5jYXNlc2VucyA9IHNlbGYucGFybXNbImNhc2VzZW5zIl0KKyAgICAgICAgcHJlZnMuc2VhcmNoZW5naW5lLndyYXAgPSBzZWxmLnBhcm1zWyJ3cmFwIl0KKyAgICAgICAgcHJlZnMuc2VhcmNoZW5naW5lLndob2xld29yZCA9IHNlbGYucGFybXNbIndob2xld29yZCJdCisgICAgICAgIHByZWZzLnNhdmUoKQorCiAKIGNsYXNzIFRpdGxlZEVkaXRUZXh0KFcuR3JvdXApOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSwgdGV4dCA9ICIiKToKLQkJVy5Hcm91cC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLnRpdGxlID0gVy5UZXh0Qm94KCgwLCAwLCAwLCAxNiksIHRpdGxlKQotCQlzZWxmLmVkaXQgPSBXLkVkaXRUZXh0KCgwLCAxNiwgMCwgMCksIHRleHQpCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCXNlbGYuZWRpdC5zZXQodmFsdWUpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuZWRpdC5nZXQoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCB0ZXh0ID0gIiIpOgorICAgICAgICBXLkdyb3VwLl9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYudGl0bGUgPSBXLlRleHRCb3goKDAsIDAsIDAsIDE2KSwgdGl0bGUpCisgICAgICAgIHNlbGYuZWRpdCA9IFcuRWRpdFRleHQoKDAsIDE2LCAwLCAwKSwgdGV4dCkKKworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICBzZWxmLmVkaXQuc2V0KHZhbHVlKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuZWRpdC5nZXQoKQogCiAKIGNsYXNzIENsYXNzRmluZGVyKFcuUG9wdXBXaWRnZXQpOgotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJVy5TZXRDdXJzb3IoIndhdGNoIikKLQkJc2VsZi5zZXQoc2VsZi5fcGFyZW50d2luZG93LmdldGNsYXNzbGlzdCgpKQotCQlXLlBvcHVwV2lkZ2V0LmNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIFcuU2V0Q3Vyc29yKCJ3YXRjaCIpCisgICAgICAgIHNlbGYuc2V0KHNlbGYuX3BhcmVudHdpbmRvdy5nZXRjbGFzc2xpc3QoKSkKKyAgICAgICAgVy5Qb3B1cFdpZGdldC5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQogCiAKIGRlZiBnZXRtaW5pbmRlbnQobGluZXMpOgotCWluZGVudCA9IC0xCi0JZm9yIGxpbmUgaW4gbGluZXM6Ci0JCXN0cmlwcGVkID0gc3RyaW5nLnN0cmlwKGxpbmUpCi0JCWlmIG5vdCBzdHJpcHBlZCBvciBzdHJpcHBlZFswXSA9PSAnIyc6Ci0JCQljb250aW51ZQotCQlpZiBpbmRlbnQgPCAwIG9yIGxpbmVbOmluZGVudF0gPD4gaW5kZW50ICogJ1x0JzoKLQkJCWluZGVudCA9IDAKLQkJCWZvciBjIGluIGxpbmU6Ci0JCQkJaWYgYyA8PiAnXHQnOgotCQkJCQlicmVhawotCQkJCWluZGVudCA9IGluZGVudCArIDEKLQlyZXR1cm4gaW5kZW50CisgICAgaW5kZW50ID0gLTEKKyAgICBmb3IgbGluZSBpbiBsaW5lczoKKyAgICAgICAgc3RyaXBwZWQgPSBzdHJpbmcuc3RyaXAobGluZSkKKyAgICAgICAgaWYgbm90IHN0cmlwcGVkIG9yIHN0cmlwcGVkWzBdID09ICcjJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGlmIGluZGVudCA8IDAgb3IgbGluZVs6aW5kZW50XSA8PiBpbmRlbnQgKiAnXHQnOgorICAgICAgICAgICAgaW5kZW50ID0gMAorICAgICAgICAgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgICAgICAgICBpZiBjIDw+ICdcdCc6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgaW5kZW50ID0gaW5kZW50ICsgMQorICAgIHJldHVybiBpbmRlbnQKIAogCiBkZWYgZ2V0b3B0aW9ua2V5KCk6Ci0JcmV0dXJuIG5vdCBub3Qgb3JkKEV2dC5HZXRLZXlzKClbN10pICYgMHgwNAorICAgIHJldHVybiBub3Qgbm90IG9yZChFdnQuR2V0S2V5cygpWzddKSAmIDB4MDQKIAogCi1kZWYgZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZW5hbWU9IjxzdHJpbmc+IiwgZGVidWdnaW5nPTAsIAotCQkJbW9kbmFtZT0iX19tYWluX18iLCBwcm9maWxpbmc9MCk6Ci0JaWYgZGVidWdnaW5nOgotCQlpbXBvcnQgUHlEZWJ1Z2dlciwgYmRiCi0JCUJkYlF1aXQgPSBiZGIuQmRiUXVpdAotCWVsc2U6Ci0JCUJkYlF1aXQgPSAnQmRiUXVpdER1bW15RXhjZXB0aW9uJwotCXB5dGV4dCA9IHN0cmluZy5zcGxpdChweXRleHQsICdccicpCi0JcHl0ZXh0ID0gc3RyaW5nLmpvaW4ocHl0ZXh0LCAnXG4nKSArICdcbicKLQlXLlNldEN1cnNvcigid2F0Y2giKQotCWdsb2JhbHNbJ19fbmFtZV9fJ10gPSBtb2RuYW1lCi0JZ2xvYmFsc1snX19maWxlX18nXSA9IGZpbGVuYW1lCi0Jc3lzLmFyZ3YgPSBbZmlsZW5hbWVdCi0JdHJ5OgotCQljb2RlID0gY29tcGlsZShweXRleHQsIGZpbGVuYW1lLCAiZXhlYyIpCi0JZXhjZXB0OgotCQkjIFhYWFggQkFBQUFEREQuLi4uIFdlIGxldCB0cmFjZWJhY2t3aW5kb3cgZGVjaWRlIHRvIHRyZWF0IFN5bnRheEVycm9yIAotCQkjIHNwZWNpYWwuIFRoYXQncyB3cm9uZyBiZWNhdXNlIFRISVMgY2FzZSBpcyBzcGVjaWFsIChjb3VsZCBiZSBsaXRlcmFsIAotCQkjIG92ZXJmbG93ISkgYW5kIFN5bnRheEVycm9yIGNvdWxkIG1lYW4gd2UgbmVlZCBhIHRyYWNlYmFjayAoc3ludGF4IGVycm9yIAotCQkjIGluIGltcG9ydGVkIG1vZHVsZSEhIQotCQl0cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKDEsIGZpbGVuYW1lKQotCQlyZXR1cm4KLQl0cnk6Ci0JCWlmIGRlYnVnZ2luZzoKLQkJCVB5RGVidWdnZXIuc3RhcnRmcm9taGVyZSgpCi0JCWVsc2U6Ci0JCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDApCi0JCXRyeToKLQkJCWlmIHByb2ZpbGluZzoKLQkJCQlpbXBvcnQgcHJvZmlsZSwgUHJvZmlsZUJyb3dzZXIKLQkJCQlwID0gcHJvZmlsZS5Qcm9maWxlKCkKLQkJCQlwLnNldF9jbWQoZmlsZW5hbWUpCi0JCQkJdHJ5OgotCQkJCQlwLnJ1bmN0eChjb2RlLCBnbG9iYWxzLCBsb2NhbHMpCi0JCQkJZmluYWxseToKLQkJCQkJaW1wb3J0IHBzdGF0cwotCQkJCQkKLQkJCQkJc3RhdHMgPSBwc3RhdHMuU3RhdHMocCkKLQkJCQkJUHJvZmlsZUJyb3dzZXIuUHJvZmlsZUJyb3dzZXIoc3RhdHMpCi0JCQllbHNlOgotCQkJCWV4ZWMgY29kZSBpbiBnbG9iYWxzLCBsb2NhbHMKLQkJZmluYWxseToKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JZXhjZXB0IFcuQWxlcnRFcnJvciwgZGV0YWlsOgotCQlyYWlzZSBXLkFsZXJ0RXJyb3IsIGRldGFpbAotCWV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIEJkYlF1aXQpOgotCQlwYXNzCi0JZXhjZXB0IFN5c3RlbUV4aXQsIGFyZzoKLQkJaWYgYXJnLmNvZGU6Ci0JCQlzeXMuc3RkZXJyLndyaXRlKCJTY3JpcHQgZXhpdGVkIHdpdGggc3RhdHVzIGNvZGU6ICVzXG4iICUgcmVwcihhcmcuY29kZSkpCi0JZXhjZXB0OgotCQlpZiBkZWJ1Z2dpbmc6Ci0JCQlzeXMuc2V0dHJhY2UoTm9uZSkKLQkJCVB5RGVidWdnZXIucG9zdG1vcnRlbShzeXMuZXhjX3R5cGUsIHN5cy5leGNfdmFsdWUsIHN5cy5leGNfdHJhY2ViYWNrKQotCQkJcmV0dXJuCi0JCWVsc2U6Ci0JCQl0cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKDEsIGZpbGVuYW1lKQotCWlmIGRlYnVnZ2luZzoKLQkJc3lzLnNldHRyYWNlKE5vbmUpCi0JCVB5RGVidWdnZXIuc3RvcCgpCitkZWYgZXhlY3N0cmluZyhweXRleHQsIGdsb2JhbHMsIGxvY2FscywgZmlsZW5hbWU9IjxzdHJpbmc+IiwgZGVidWdnaW5nPTAsCisgICAgICAgICAgICAgICAgICAgICAgICBtb2RuYW1lPSJfX21haW5fXyIsIHByb2ZpbGluZz0wKToKKyAgICBpZiBkZWJ1Z2dpbmc6CisgICAgICAgIGltcG9ydCBQeURlYnVnZ2VyLCBiZGIKKyAgICAgICAgQmRiUXVpdCA9IGJkYi5CZGJRdWl0CisgICAgZWxzZToKKyAgICAgICAgQmRiUXVpdCA9ICdCZGJRdWl0RHVtbXlFeGNlcHRpb24nCisgICAgcHl0ZXh0ID0gc3RyaW5nLnNwbGl0KHB5dGV4dCwgJ1xyJykKKyAgICBweXRleHQgPSBzdHJpbmcuam9pbihweXRleHQsICdcbicpICsgJ1xuJworICAgIFcuU2V0Q3Vyc29yKCJ3YXRjaCIpCisgICAgZ2xvYmFsc1snX19uYW1lX18nXSA9IG1vZG5hbWUKKyAgICBnbG9iYWxzWydfX2ZpbGVfXyddID0gZmlsZW5hbWUKKyAgICBzeXMuYXJndiA9IFtmaWxlbmFtZV0KKyAgICB0cnk6CisgICAgICAgIGNvZGUgPSBjb21waWxlKHB5dGV4dCwgZmlsZW5hbWUsICJleGVjIikKKyAgICBleGNlcHQ6CisgICAgICAgICMgWFhYWCBCQUFBQURERC4uLi4gV2UgbGV0IHRyYWNlYmFja3dpbmRvdyBkZWNpZGUgdG8gdHJlYXQgU3ludGF4RXJyb3IKKyAgICAgICAgIyBzcGVjaWFsLiBUaGF0J3Mgd3JvbmcgYmVjYXVzZSBUSElTIGNhc2UgaXMgc3BlY2lhbCAoY291bGQgYmUgbGl0ZXJhbAorICAgICAgICAjIG92ZXJmbG93ISkgYW5kIFN5bnRheEVycm9yIGNvdWxkIG1lYW4gd2UgbmVlZCBhIHRyYWNlYmFjayAoc3ludGF4IGVycm9yCisgICAgICAgICMgaW4gaW1wb3J0ZWQgbW9kdWxlISEhCisgICAgICAgIHRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soMSwgZmlsZW5hbWUpCisgICAgICAgIHJldHVybgorICAgIHRyeToKKyAgICAgICAgaWYgZGVidWdnaW5nOgorICAgICAgICAgICAgUHlEZWJ1Z2dlci5zdGFydGZyb21oZXJlKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgcHJvZmlsaW5nOgorICAgICAgICAgICAgICAgIGltcG9ydCBwcm9maWxlLCBQcm9maWxlQnJvd3NlcgorICAgICAgICAgICAgICAgIHAgPSBwcm9maWxlLlByb2ZpbGUoKQorICAgICAgICAgICAgICAgIHAuc2V0X2NtZChmaWxlbmFtZSkKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHAucnVuY3R4KGNvZGUsIGdsb2JhbHMsIGxvY2FscykKKyAgICAgICAgICAgICAgICBmaW5hbGx5OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgcHN0YXRzCisKKyAgICAgICAgICAgICAgICAgICAgc3RhdHMgPSBwc3RhdHMuU3RhdHMocCkKKyAgICAgICAgICAgICAgICAgICAgUHJvZmlsZUJyb3dzZXIuUHJvZmlsZUJyb3dzZXIoc3RhdHMpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGV4ZWMgY29kZSBpbiBnbG9iYWxzLCBsb2NhbHMKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisgICAgZXhjZXB0IFcuQWxlcnRFcnJvciwgZGV0YWlsOgorICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsIGRldGFpbAorICAgIGV4Y2VwdCAoS2V5Ym9hcmRJbnRlcnJ1cHQsIEJkYlF1aXQpOgorICAgICAgICBwYXNzCisgICAgZXhjZXB0IFN5c3RlbUV4aXQsIGFyZzoKKyAgICAgICAgaWYgYXJnLmNvZGU6CisgICAgICAgICAgICBzeXMuc3RkZXJyLndyaXRlKCJTY3JpcHQgZXhpdGVkIHdpdGggc3RhdHVzIGNvZGU6ICVzXG4iICUgcmVwcihhcmcuY29kZSkpCisgICAgZXhjZXB0OgorICAgICAgICBpZiBkZWJ1Z2dpbmc6CisgICAgICAgICAgICBzeXMuc2V0dHJhY2UoTm9uZSkKKyAgICAgICAgICAgIFB5RGVidWdnZXIucG9zdG1vcnRlbShzeXMuZXhjX3R5cGUsIHN5cy5leGNfdmFsdWUsIHN5cy5leGNfdHJhY2ViYWNrKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKDEsIGZpbGVuYW1lKQorICAgIGlmIGRlYnVnZ2luZzoKKyAgICAgICAgc3lzLnNldHRyYWNlKE5vbmUpCisgICAgICAgIFB5RGVidWdnZXIuc3RvcCgpCiAKIAogX2lkZW50aWZpZVJFID0gcmUuY29tcGlsZShyIltBLVphLXpfXVtBLVphLXpfMC05XSoiKQogCiBkZWYgaWRlbnRpZmllUkVfbWF0Y2goc3RyKToKLQltYXRjaCA9IF9pZGVudGlmaWVSRS5tYXRjaChzdHIpCi0JaWYgbm90IG1hdGNoOgotCQlyZXR1cm4gLTEKLQlyZXR1cm4gbWF0Y2guZW5kKCkKKyAgICBtYXRjaCA9IF9pZGVudGlmaWVSRS5tYXRjaChzdHIpCisgICAgaWYgbm90IG1hdGNoOgorICAgICAgICByZXR1cm4gLTEKKyAgICByZXR1cm4gbWF0Y2guZW5kKCkKIAogZGVmIF9maWxlbmFtZV9hc19tb2RuYW1lKGZuYW1lKToKLQlpZiBmbmFtZVstMzpdID09ICcucHknOgotCQltb2RuYW1lID0gZm5hbWVbOi0zXQotCQltYXRjaCA9IF9pZGVudGlmaWVSRS5tYXRjaChtb2RuYW1lKQotCQlpZiBtYXRjaCBhbmQgbWF0Y2guc3RhcnQoKSA9PSAwIGFuZCBtYXRjaC5lbmQoKSA9PSBsZW4obW9kbmFtZSk6Ci0JCQlyZXR1cm4gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KG1vZG5hbWUsICcuJyksICdfJykKKyAgICBpZiBmbmFtZVstMzpdID09ICcucHknOgorICAgICAgICBtb2RuYW1lID0gZm5hbWVbOi0zXQorICAgICAgICBtYXRjaCA9IF9pZGVudGlmaWVSRS5tYXRjaChtb2RuYW1lKQorICAgICAgICBpZiBtYXRjaCBhbmQgbWF0Y2guc3RhcnQoKSA9PSAwIGFuZCBtYXRjaC5lbmQoKSA9PSBsZW4obW9kbmFtZSk6CisgICAgICAgICAgICByZXR1cm4gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KG1vZG5hbWUsICcuJyksICdfJykKIAogZGVmIGZpbmRlZGl0b3IodG9wd2luZG93LCBmcm9tdG9wID0gMCk6Ci0Jd2lkID0gTXlGcm9udFdpbmRvdygpCi0JaWYgbm90IGZyb210b3A6Ci0JCWlmIHRvcHdpbmRvdy53IGFuZCB3aWQgPT0gdG9wd2luZG93Lncud2lkOgotCQkJd2lkID0gdG9wd2luZG93Lncud2lkLkdldE5leHRXaW5kb3coKQotCWlmIG5vdCB3aWQ6Ci0JCXJldHVybgotCWFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQotCWlmIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6ICMgS2V5RXJyb3Igb3RoZXJ3aXNlIGNhbiBoYXBwZW4gaW4gUm9ib0ZvZyA6LSgKLQkJd2luZG93ID0gVy5nZXRhcHBsaWNhdGlvbigpLl93aW5kb3dzW3dpZF0KLQllbHNlOgotCQlyZXR1cm4KLQlpZiBub3QgaXNpbnN0YW5jZSh3aW5kb3csIEVkaXRvcik6Ci0JCXJldHVybgotCXJldHVybiB3aW5kb3cuZWRpdGdyb3VwLmVkaXRvcgorICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgIGlmIG5vdCBmcm9tdG9wOgorICAgICAgICBpZiB0b3B3aW5kb3cudyBhbmQgd2lkID09IHRvcHdpbmRvdy53LndpZDoKKyAgICAgICAgICAgIHdpZCA9IHRvcHdpbmRvdy53LndpZC5HZXROZXh0V2luZG93KCkKKyAgICBpZiBub3Qgd2lkOgorICAgICAgICByZXR1cm4KKyAgICBhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKKyAgICBpZiBhcHAuX3dpbmRvd3MuaGFzX2tleSh3aWQpOiAjIEtleUVycm9yIG90aGVyd2lzZSBjYW4gaGFwcGVuIGluIFJvYm9Gb2cgOi0oCisgICAgICAgIHdpbmRvdyA9IFcuZ2V0YXBwbGljYXRpb24oKS5fd2luZG93c1t3aWRdCisgICAgZWxzZToKKyAgICAgICAgcmV0dXJuCisgICAgaWYgbm90IGlzaW5zdGFuY2Uod2luZG93LCBFZGl0b3IpOgorICAgICAgICByZXR1cm4KKyAgICByZXR1cm4gd2luZG93LmVkaXRncm91cC5lZGl0b3IKIAogCiBjbGFzcyBfRWRpdG9yRGVmYXVsdFNldHRpbmdzOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJc2VsZi50ZW1wbGF0ZSA9ICIlcywgJWQgcG9pbnQiCi0JCXNlbGYuZm9udHNldHRpbmdzLCBzZWxmLnRhYnNldHRpbmdzLCBzZWxmLndpbmRvd3NpemUgPSBnZXRlZGl0b3JwcmVmcygpCi0JCXNlbGYudyA9IFcuRGlhbG9nKCgzMjgsIDEyMCksICJFZGl0b3IgZGVmYXVsdCBzZXR0aW5ncyIpCi0JCXNlbGYudy5zZXRmb250YnV0dG9uID0gVy5CdXR0b24oKDgsIDgsIDgwLCAxNiksICJTZXQgZm9udFx4YzkiLCBzZWxmLmRvZm9udCkKLQkJc2VsZi53LmZvbnR0ZXh0ID0gVy5UZXh0Qm94KCg5OCwgMTAsIC04LCAxNCksIHNlbGYudGVtcGxhdGUgJSAoc2VsZi5mb250c2V0dGluZ3NbMF0sIHNlbGYuZm9udHNldHRpbmdzWzJdKSkKLQkJCi0JCXNlbGYudy5waWNrc2l6ZWJ1dHRvbiA9IFcuQnV0dG9uKCg4LCA1MCwgODAsIDE2KSwgIkZyb250IHdpbmRvdyIsIHNlbGYucGlja3NpemUpCi0JCXNlbGYudy54c2l6ZWxhYmVsID0gVy5UZXh0Qm94KCg5OCwgMzIsIDQwLCAxNCksICJXaWR0aDoiKQotCQlzZWxmLncueXNpemVsYWJlbCA9IFcuVGV4dEJveCgoMTQ4LCAzMiwgNDAsIDE0KSwgIkhlaWdodDoiKQotCQlzZWxmLncueHNpemUgPSBXLkVkaXRUZXh0KCg5OCwgNDgsIDQwLCAyMCksIHJlcHIoc2VsZi53aW5kb3dzaXplWzBdKSkKLQkJc2VsZi53LnlzaXplID0gVy5FZGl0VGV4dCgoMTQ4LCA0OCwgNDAsIDIwKSwgcmVwcihzZWxmLndpbmRvd3NpemVbMV0pKQotCQkKLQkJc2VsZi53LmNhbmNlbGJ1dHRvbiA9IFcuQnV0dG9uKCgtMTgwLCAtMjYsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLmNhbmNlbCkKLQkJc2VsZi53Lm9rYnV0dG9uID0gVy5CdXR0b24oKC05MCwgLTI2LCA4MCwgMTYpLCAiRG9uZSIsIHNlbGYub2spCi0JCXNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5va2J1dHRvbikKLQkJc2VsZi53LmJpbmQoJ2NtZC4nLCBzZWxmLncuY2FuY2VsYnV0dG9uLnB1c2gpCi0JCXNlbGYudy5vcGVuKCkKLQkKLQlkZWYgcGlja3NpemUoc2VsZik6Ci0JCWFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQotCQllZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCi0JCWlmIGVkaXRvciBpcyBub3QgTm9uZToKLQkJCXdpZHRoLCBoZWlnaHQgPSBlZGl0b3IuX3BhcmVudHdpbmRvdy5fYm91bmRzWzI6XQotCQkJc2VsZi53LnhzaXplLnNldChyZXByKHdpZHRoKSkKLQkJCXNlbGYudy55c2l6ZS5zZXQocmVwcihoZWlnaHQpKQotCQllbHNlOgotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiTm8gZWRpdCB3aW5kb3cgZm91bmQiCi0JCi0JZGVmIGRvZm9udChzZWxmKToKLQkJaW1wb3J0IEZvbnRTZXR0aW5ncwotCQlzZXR0aW5ncyA9IEZvbnRTZXR0aW5ncy5Gb250RGlhbG9nKHNlbGYuZm9udHNldHRpbmdzLCBzZWxmLnRhYnNldHRpbmdzKQotCQlpZiBzZXR0aW5nczoKLQkJCXNlbGYuZm9udHNldHRpbmdzLCBzZWxmLnRhYnNldHRpbmdzID0gc2V0dGluZ3MKLQkJCXN5cy5leGNfdHJhY2ViYWNrID0gTm9uZQotCQkJc2VsZi53LmZvbnR0ZXh0LnNldChzZWxmLnRlbXBsYXRlICUgKHNlbGYuZm9udHNldHRpbmdzWzBdLCBzZWxmLmZvbnRzZXR0aW5nc1syXSkpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlzZWxmLncuY2xvc2UoKQotCQlkZWwgc2VsZi53Ci0JCi0JZGVmIGNhbmNlbChzZWxmKToKLQkJc2VsZi5jbG9zZSgpCi0JCi0JZGVmIG9rKHNlbGYpOgotCQl0cnk6Ci0JCQl3aWR0aCA9IHN0cmluZy5hdG9pKHNlbGYudy54c2l6ZS5nZXQoKSkKLQkJZXhjZXB0OgotCQkJc2VsZi53LnhzaXplLnNlbGVjdCgxKQotCQkJc2VsZi53LnhzaXplLnNlbGVjdGFsbCgpCi0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJCYWQgbnVtYmVyIGZvciB3aW5kb3cgd2lkdGgiCi0JCXRyeToKLQkJCWhlaWdodCA9IHN0cmluZy5hdG9pKHNlbGYudy55c2l6ZS5nZXQoKSkKLQkJZXhjZXB0OgotCQkJc2VsZi53LnlzaXplLnNlbGVjdCgxKQotCQkJc2VsZi53LnlzaXplLnNlbGVjdGFsbCgpCi0JCQlyYWlzZSBXLkFsZXJ0RXJyb3IsICJCYWQgbnVtYmVyIGZvciB3aW5kb3cgaGVpZ2h0IgotCQlzZWxmLndpbmRvd3NpemUgPSB3aWR0aCwgaGVpZ2h0Ci0JCXNldGVkaXRvcnByZWZzKHNlbGYuZm9udHNldHRpbmdzLCBzZWxmLnRhYnNldHRpbmdzLCBzZWxmLndpbmRvd3NpemUpCi0JCXNlbGYuY2xvc2UoKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBzZWxmLnRlbXBsYXRlID0gIiVzLCAlZCBwb2ludCIKKyAgICAgICAgc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MsIHNlbGYud2luZG93c2l6ZSA9IGdldGVkaXRvcnByZWZzKCkKKyAgICAgICAgc2VsZi53ID0gVy5EaWFsb2coKDMyOCwgMTIwKSwgIkVkaXRvciBkZWZhdWx0IHNldHRpbmdzIikKKyAgICAgICAgc2VsZi53LnNldGZvbnRidXR0b24gPSBXLkJ1dHRvbigoOCwgOCwgODAsIDE2KSwgIlNldCBmb250XHhjOSIsIHNlbGYuZG9mb250KQorICAgICAgICBzZWxmLncuZm9udHRleHQgPSBXLlRleHRCb3goKDk4LCAxMCwgLTgsIDE0KSwgc2VsZi50ZW1wbGF0ZSAlIChzZWxmLmZvbnRzZXR0aW5nc1swXSwgc2VsZi5mb250c2V0dGluZ3NbMl0pKQorCisgICAgICAgIHNlbGYudy5waWNrc2l6ZWJ1dHRvbiA9IFcuQnV0dG9uKCg4LCA1MCwgODAsIDE2KSwgIkZyb250IHdpbmRvdyIsIHNlbGYucGlja3NpemUpCisgICAgICAgIHNlbGYudy54c2l6ZWxhYmVsID0gVy5UZXh0Qm94KCg5OCwgMzIsIDQwLCAxNCksICJXaWR0aDoiKQorICAgICAgICBzZWxmLncueXNpemVsYWJlbCA9IFcuVGV4dEJveCgoMTQ4LCAzMiwgNDAsIDE0KSwgIkhlaWdodDoiKQorICAgICAgICBzZWxmLncueHNpemUgPSBXLkVkaXRUZXh0KCg5OCwgNDgsIDQwLCAyMCksIHJlcHIoc2VsZi53aW5kb3dzaXplWzBdKSkKKyAgICAgICAgc2VsZi53LnlzaXplID0gVy5FZGl0VGV4dCgoMTQ4LCA0OCwgNDAsIDIwKSwgcmVwcihzZWxmLndpbmRvd3NpemVbMV0pKQorCisgICAgICAgIHNlbGYudy5jYW5jZWxidXR0b24gPSBXLkJ1dHRvbigoLTE4MCwgLTI2LCA4MCwgMTYpLCAiQ2FuY2VsIiwgc2VsZi5jYW5jZWwpCisgICAgICAgIHNlbGYudy5va2J1dHRvbiA9IFcuQnV0dG9uKCgtOTAsIC0yNiwgODAsIDE2KSwgIkRvbmUiLCBzZWxmLm9rKQorICAgICAgICBzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncub2tidXR0b24pCisgICAgICAgIHNlbGYudy5iaW5kKCdjbWQuJywgc2VsZi53LmNhbmNlbGJ1dHRvbi5wdXNoKQorICAgICAgICBzZWxmLncub3BlbigpCisKKyAgICBkZWYgcGlja3NpemUoc2VsZik6CisgICAgICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgICAgICBlZGl0b3IgPSBmaW5kZWRpdG9yKHNlbGYpCisgICAgICAgIGlmIGVkaXRvciBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHdpZHRoLCBoZWlnaHQgPSBlZGl0b3IuX3BhcmVudHdpbmRvdy5fYm91bmRzWzI6XQorICAgICAgICAgICAgc2VsZi53LnhzaXplLnNldChyZXByKHdpZHRoKSkKKyAgICAgICAgICAgIHNlbGYudy55c2l6ZS5zZXQocmVwcihoZWlnaHQpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiTm8gZWRpdCB3aW5kb3cgZm91bmQiCisKKyAgICBkZWYgZG9mb250KHNlbGYpOgorICAgICAgICBpbXBvcnQgRm9udFNldHRpbmdzCisgICAgICAgIHNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2coc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MpCisgICAgICAgIGlmIHNldHRpbmdzOgorICAgICAgICAgICAgc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MgPSBzZXR0aW5ncworICAgICAgICAgICAgc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCisgICAgICAgICAgICBzZWxmLncuZm9udHRleHQuc2V0KHNlbGYudGVtcGxhdGUgJSAoc2VsZi5mb250c2V0dGluZ3NbMF0sIHNlbGYuZm9udHNldHRpbmdzWzJdKSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi53LmNsb3NlKCkKKyAgICAgICAgZGVsIHNlbGYudworCisgICAgZGVmIGNhbmNlbChzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgb2soc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHdpZHRoID0gc3RyaW5nLmF0b2koc2VsZi53LnhzaXplLmdldCgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLncueHNpemUuc2VsZWN0KDEpCisgICAgICAgICAgICBzZWxmLncueHNpemUuc2VsZWN0YWxsKCkKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkJhZCBudW1iZXIgZm9yIHdpbmRvdyB3aWR0aCIKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaGVpZ2h0ID0gc3RyaW5nLmF0b2koc2VsZi53LnlzaXplLmdldCgpKQorICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICBzZWxmLncueXNpemUuc2VsZWN0KDEpCisgICAgICAgICAgICBzZWxmLncueXNpemUuc2VsZWN0YWxsKCkKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkJhZCBudW1iZXIgZm9yIHdpbmRvdyBoZWlnaHQiCisgICAgICAgIHNlbGYud2luZG93c2l6ZSA9IHdpZHRoLCBoZWlnaHQKKyAgICAgICAgc2V0ZWRpdG9ycHJlZnMoc2VsZi5mb250c2V0dGluZ3MsIHNlbGYudGFic2V0dGluZ3MsIHNlbGYud2luZG93c2l6ZSkKKyAgICAgICAgc2VsZi5jbG9zZSgpCiAKIGRlZiBnZXRlZGl0b3JwcmVmcygpOgotCWltcG9ydCBNYWNQcmVmcwotCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQl0cnk6Ci0JCWZvbnRzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC5mb250c2V0dGluZ3MKLQkJdGFic2V0dGluZ3MgPSBwcmVmcy5weWVkaXQudGFic2V0dGluZ3MKLQkJd2luZG93c2l6ZSA9IHByZWZzLnB5ZWRpdC53aW5kb3dzaXplCi0JZXhjZXB0OgotCQlmb250c2V0dGluZ3MgPSBwcmVmcy5weWVkaXQuZm9udHNldHRpbmdzID0gKCJHZW5ldmEiLCAwLCAxMCwgKDAsIDAsIDApKQotCQl0YWJzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC50YWJzZXR0aW5ncyA9ICg4LCAxKQotCQl3aW5kb3dzaXplID0gcHJlZnMucHllZGl0LndpbmRvd3NpemUgPSAoNTAwLCAyNTApCi0JCXN5cy5leGNfdHJhY2ViYWNrID0gTm9uZQotCXJldHVybiBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzLCB3aW5kb3dzaXplCisgICAgaW1wb3J0IE1hY1ByZWZzCisgICAgcHJlZnMgPSBNYWNQcmVmcy5HZXRQcmVmcyhXLmdldGFwcGxpY2F0aW9uKCkucHJlZmZpbGVwYXRoKQorICAgIHRyeToKKyAgICAgICAgZm9udHNldHRpbmdzID0gcHJlZnMucHllZGl0LmZvbnRzZXR0aW5ncworICAgICAgICB0YWJzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC50YWJzZXR0aW5ncworICAgICAgICB3aW5kb3dzaXplID0gcHJlZnMucHllZGl0LndpbmRvd3NpemUKKyAgICBleGNlcHQ6CisgICAgICAgIGZvbnRzZXR0aW5ncyA9IHByZWZzLnB5ZWRpdC5mb250c2V0dGluZ3MgPSAoIkdlbmV2YSIsIDAsIDEwLCAoMCwgMCwgMCkpCisgICAgICAgIHRhYnNldHRpbmdzID0gcHJlZnMucHllZGl0LnRhYnNldHRpbmdzID0gKDgsIDEpCisgICAgICAgIHdpbmRvd3NpemUgPSBwcmVmcy5weWVkaXQud2luZG93c2l6ZSA9ICg1MDAsIDI1MCkKKyAgICAgICAgc3lzLmV4Y190cmFjZWJhY2sgPSBOb25lCisgICAgcmV0dXJuIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MsIHdpbmRvd3NpemUKIAogZGVmIHNldGVkaXRvcnByZWZzKGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MsIHdpbmRvd3NpemUpOgotCWltcG9ydCBNYWNQcmVmcwotCXByZWZzID0gTWFjUHJlZnMuR2V0UHJlZnMoVy5nZXRhcHBsaWNhdGlvbigpLnByZWZmaWxlcGF0aCkKLQlwcmVmcy5weWVkaXQuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JcHJlZnMucHllZGl0LnRhYnNldHRpbmdzID0gdGFic2V0dGluZ3MKLQlwcmVmcy5weWVkaXQud2luZG93c2l6ZSA9IHdpbmRvd3NpemUKLQlwcmVmcy5zYXZlKCkKKyAgICBpbXBvcnQgTWFjUHJlZnMKKyAgICBwcmVmcyA9IE1hY1ByZWZzLkdldFByZWZzKFcuZ2V0YXBwbGljYXRpb24oKS5wcmVmZmlsZXBhdGgpCisgICAgcHJlZnMucHllZGl0LmZvbnRzZXR0aW5ncyA9IGZvbnRzZXR0aW5ncworICAgIHByZWZzLnB5ZWRpdC50YWJzZXR0aW5ncyA9IHRhYnNldHRpbmdzCisgICAgcHJlZnMucHllZGl0LndpbmRvd3NpemUgPSB3aW5kb3dzaXplCisgICAgcHJlZnMuc2F2ZSgpCiAKIF9kZWZhdWx0U2V0dGluZ3NFZGl0b3IgPSBOb25lCiAKIGRlZiBFZGl0b3JEZWZhdWx0U2V0dGluZ3MoKToKLQlnbG9iYWwgX2RlZmF1bHRTZXR0aW5nc0VkaXRvcgotCWlmIF9kZWZhdWx0U2V0dGluZ3NFZGl0b3IgaXMgTm9uZSBvciBub3QgaGFzYXR0cihfZGVmYXVsdFNldHRpbmdzRWRpdG9yLCAidyIpOgotCQlfZGVmYXVsdFNldHRpbmdzRWRpdG9yID0gX0VkaXRvckRlZmF1bHRTZXR0aW5ncygpCi0JZWxzZToKLQkJX2RlZmF1bHRTZXR0aW5nc0VkaXRvci53LnNlbGVjdCgpCisgICAgZ2xvYmFsIF9kZWZhdWx0U2V0dGluZ3NFZGl0b3IKKyAgICBpZiBfZGVmYXVsdFNldHRpbmdzRWRpdG9yIGlzIE5vbmUgb3Igbm90IGhhc2F0dHIoX2RlZmF1bHRTZXR0aW5nc0VkaXRvciwgInciKToKKyAgICAgICAgX2RlZmF1bHRTZXR0aW5nc0VkaXRvciA9IF9FZGl0b3JEZWZhdWx0U2V0dGluZ3MoKQorICAgIGVsc2U6CisgICAgICAgIF9kZWZhdWx0U2V0dGluZ3NFZGl0b3Iudy5zZWxlY3QoKQogCiBkZWYgcmVzb2x2ZWFsaWFzZXMocGF0aCk6Ci0JdHJ5OgotCQlmc3IsIGQxLCBkMiA9IEZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKHBhdGgsIDEpCi0JCXBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQotCQlyZXR1cm4gcGF0aAotCWV4Y2VwdCAoRmlsZS5FcnJvciwgVmFsdWVFcnJvciksIChlcnJvciwgc3RyKToKLQkJaWYgZXJyb3IgPD4gLTEyMDoKLQkJCXJhaXNlCi0JCWRpciwgZmlsZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLQkJcmV0dXJuIG9zLnBhdGguam9pbihyZXNvbHZlYWxpYXNlcyhkaXIpLCBmaWxlKQorICAgIHRyeToKKyAgICAgICAgZnNyLCBkMSwgZDIgPSBGaWxlLkZTUmVzb2x2ZUFsaWFzRmlsZShwYXRoLCAxKQorICAgICAgICBwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgcmV0dXJuIHBhdGgKKyAgICBleGNlcHQgKEZpbGUuRXJyb3IsIFZhbHVlRXJyb3IpLCAoZXJyb3IsIHN0cik6CisgICAgICAgIGlmIGVycm9yIDw+IC0xMjA6CisgICAgICAgICAgICByYWlzZQorICAgICAgICBkaXIsIGZpbGUgPSBvcy5wYXRoLnNwbGl0KHBhdGgpCisgICAgICAgIHJldHVybiBvcy5wYXRoLmpvaW4ocmVzb2x2ZWFsaWFzZXMoZGlyKSwgZmlsZSkKIAogc2VhcmNoZW5naW5lID0gU2VhcmNoRW5naW5lKCkKIHRyYWNlYmFja3dpbmRvdyA9IFd0cmFjZWJhY2suVHJhY2VCYWNrKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHlGb250aWZ5LnB5IGIvTWFjL1Rvb2xzL0lERS9QeUZvbnRpZnkucHkKaW5kZXggZWIzN2FkMy4uNDFmMTk0MiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeUZvbnRpZnkucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeUZvbnRpZnkucHkKQEAgLTEsMjkgKzEsMjkgQEAKICIiIk1vZHVsZSB0byBhbmFseXplIFB5dGhvbiBzb3VyY2UgY29kZTsgZm9yIHN5bnRheCBjb2xvcmluZyB0b29scy4KIAogSW50ZXJmYWNlOgotCXRhZ3MgPSBmb250aWZ5KHB5dGV4dCwgc2VhcmNoZnJvbSwgc2VhcmNodG8pCisgICAgICAgIHRhZ3MgPSBmb250aWZ5KHB5dGV4dCwgc2VhcmNoZnJvbSwgc2VhcmNodG8pCiAKIFRoZSAncHl0ZXh0JyBhcmd1bWVudCBpcyBhIHN0cmluZyBjb250YWluaW5nIFB5dGhvbiBzb3VyY2UgY29kZS4KLVRoZSAob3B0aW9uYWwpIGFyZ3VtZW50cyAnc2VhcmNoZnJvbScgYW5kICdzZWFyY2h0bycgbWF5IGNvbnRhaW4gYSBzbGljZSBpbiBweXRleHQuIAorVGhlIChvcHRpb25hbCkgYXJndW1lbnRzICdzZWFyY2hmcm9tJyBhbmQgJ3NlYXJjaHRvJyBtYXkgY29udGFpbiBhIHNsaWNlIGluIHB5dGV4dC4KIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhIGxpc3Qgb2YgdHVwbGVzLCBmb3JtYXR0ZWQgbGlrZSB0aGlzOgotCVsoJ2tleXdvcmQnLCAwLCA2LCBOb25lKSwgKCdrZXl3b3JkJywgMTEsIDE3LCBOb25lKSwgKCdjb21tZW50JywgMjMsIDUzLCBOb25lKSwgZXRjLiBdCisgICAgICAgIFsoJ2tleXdvcmQnLCAwLCA2LCBOb25lKSwgKCdrZXl3b3JkJywgMTEsIDE3LCBOb25lKSwgKCdjb21tZW50JywgMjMsIDUzLCBOb25lKSwgZXRjLiBdCiBUaGUgdHVwbGUgY29udGVudHMgYXJlIGFsd2F5cyBsaWtlIHRoaXM6Ci0JKHRhZywgc3RhcnRpbmRleCwgZW5kaW5kZXgsIHN1Ymxpc3QpCisgICAgICAgICh0YWcsIHN0YXJ0aW5kZXgsIGVuZGluZGV4LCBzdWJsaXN0KQogdGFnIGlzIG9uZSBvZiAna2V5d29yZCcsICdzdHJpbmcnLCAnY29tbWVudCcgb3IgJ2lkZW50aWZpZXInCi1zdWJsaXN0IGlzIG5vdCB1c2VkLCBoZW5jZSBhbHdheXMgTm9uZS4gCitzdWJsaXN0IGlzIG5vdCB1c2VkLCBoZW5jZSBhbHdheXMgTm9uZS4KICIiIgogCiAjIEJhc2VkIG9uIEZvbnRUZXh0LnB5IGJ5IE1pdGNoZWxsIFMuIENoYXBtYW4sCiAjIHdoaWNoIHdhcyBtb2RpZmllZCBieSBaYWNoYXJ5IFJvYWRob3VzZSwKICMgdGhlbiB1bi1UaydkIGJ5IEp1c3QgdmFuIFJvc3N1bS4KICMgTWFueSB0aGFua3MgZm9yIHJlZ3VsYXIgZXhwcmVzc2lvbiBkZWJ1Z2dpbmcgJiBhdXRob3JpbmcgYXJlIGR1ZSB0bzoKLSMJVGltICh0aGUtaW5jcmVkaWItbHkgeSdycykgUGV0ZXJzIGFuZCBDcmlzdGlhbiBUaXNtZXIKKyMgICAgICAgVGltICh0aGUtaW5jcmVkaWItbHkgeSdycykgUGV0ZXJzIGFuZCBDcmlzdGlhbiBUaXNtZXIKICMgU28sIHdobyBvd25zIHRoZSBjb3B5cmlnaHQ/IDstKSBIb3cgYWJvdXQgdGhpczoKLSMgQ29weXJpZ2h0IDE5OTYtMjAwMTogCi0jCU1pdGNoZWxsIFMuIENoYXBtYW4sCi0jCVphY2hhcnkgUm9hZGhvdXNlLAotIwlUaW0gUGV0ZXJzLAotIwlKdXN0IHZhbiBSb3NzdW0KKyMgQ29weXJpZ2h0IDE5OTYtMjAwMToKKyMgICAgICAgTWl0Y2hlbGwgUy4gQ2hhcG1hbiwKKyMgICAgICAgWmFjaGFyeSBSb2FkaG91c2UsCisjICAgICAgIFRpbSBQZXRlcnMsCisjICAgICAgIEp1c3QgdmFuIFJvc3N1bQogCiBfX3ZlcnNpb25fXyA9ICIwLjQiCiAKQEAgLTMzLDE4ICszMywxOCBAQAogIyBGaXJzdCBhIGxpdHRsZSBoZWxwZXIsIHNpbmNlIEkgZG9uJ3QgbGlrZSB0byByZXBlYXQgdGhpbmdzLiAoVGlzbWVyIHNwZWFraW5nKQogaW1wb3J0IHN0cmluZwogZGVmIHJlcGxhY2Uod2hlcmUsIHdoYXQsIHdpdGgpOgotCXJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQod2hlcmUsIHdoYXQpLCB3aXRoKQorICAgIHJldHVybiBzdHJpbmcuam9pbihzdHJpbmcuc3BsaXQod2hlcmUsIHdoYXQpLCB3aXRoKQogCiAjIFRoaXMgbGlzdCBvZiBrZXl3b3JkcyBpcyB0YWtlbiBmcm9tIHJlZi9ub2RlMTMuaHRtbCBvZiB0aGUKICMgUHl0aG9uIDEuMyBIVE1MIGRvY3VtZW50YXRpb24uICgiYWNjZXNzIiBpcyBpbnRlbnRpb25hbGx5IG9taXR0ZWQuKQoga2V5d29yZHNMaXN0ID0gWwotCSJhc3NlcnQiLCAiZXhlYyIsCi0JImRlbCIsICJmcm9tIiwgImxhbWJkYSIsICJyZXR1cm4iLAotCSJhbmQiLCAiZWxpZiIsICJnbG9iYWwiLCAibm90IiwgInRyeSIsCi0JImJyZWFrIiwgImVsc2UiLCAiaWYiLCAib3IiLCAid2hpbGUiLAotCSJjbGFzcyIsICJleGNlcHQiLCAiaW1wb3J0IiwgInBhc3MiLAotCSJjb250aW51ZSIsICJmaW5hbGx5IiwgImluIiwgInByaW50IiwKLQkiZGVmIiwgImZvciIsICJpcyIsICJyYWlzZSIsICJ5aWVsZCJdCisgICAgICAgICJhc3NlcnQiLCAiZXhlYyIsCisgICAgICAgICJkZWwiLCAiZnJvbSIsICJsYW1iZGEiLCAicmV0dXJuIiwKKyAgICAgICAgImFuZCIsICJlbGlmIiwgImdsb2JhbCIsICJub3QiLCAidHJ5IiwKKyAgICAgICAgImJyZWFrIiwgImVsc2UiLCAiaWYiLCAib3IiLCAid2hpbGUiLAorICAgICAgICAiY2xhc3MiLCAiZXhjZXB0IiwgImltcG9ydCIsICJwYXNzIiwKKyAgICAgICAgImNvbnRpbnVlIiwgImZpbmFsbHkiLCAiaW4iLCAicHJpbnQiLAorICAgICAgICAiZGVmIiwgImZvciIsICJpcyIsICJyYWlzZSIsICJ5aWVsZCJdCiAKICMgQnVpbGQgdXAgYSByZWd1bGFyIGV4cHJlc3Npb24gd2hpY2ggd2lsbCBtYXRjaCBhbnl0aGluZwogIyBpbnRlcmVzdGluZywgaW5jbHVkaW5nIG11bHRpLWxpbmUgdHJpcGxlLXF1b3RlZCBzdHJpbmdzLgpAQCAtNTUsMjQgKzU1LDI0IEBACiAKICMgV2F5IHRvIGdvLCBUaW0hCiBwYXQgPSByIiIiCi0JcXFxCi0JW15cXHFdKgotCSgKLQkJKAlcXFtcMDAwLVwzNzddCi0JCXwJcQotCQkJKAlcXFtcMDAwLVwzNzddCi0JCQl8CVteXHFdCi0JCQl8CXEKLQkJCQkoCVxcW1wwMDAtXDM3N10KLQkJCQl8CVteXFxxXQotCQkJCSkKLQkJCSkKLQkJKQotCQlbXlxccV0qCi0JKSoKLQlxcXEKKyAgICAgICAgcXFxCisgICAgICAgIFteXFxxXSoKKyAgICAgICAgKAorICAgICAgICAgICAgICAgICggICAgICAgXFxbXDAwMC1cMzc3XQorICAgICAgICAgICAgICAgIHwgICAgICAgcQorICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICBcXFtcMDAwLVwzNzddCisgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIFteXHFdCisgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgIHEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAgICAgICBcXFtcMDAwLVwzNzddCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgW15cXHFdCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAgICAgW15cXHFdKgorICAgICAgICApKgorICAgICAgICBxcXEKICIiIgotcGF0ID0gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KHBhdCksICcnKQkjIGdldCByaWQgb2Ygd2hpdGVzcGFjZQorcGF0ID0gc3RyaW5nLmpvaW4oc3RyaW5nLnNwbGl0KHBhdCksICcnKSAgICAgICAgIyBnZXQgcmlkIG9mIHdoaXRlc3BhY2UKIHRyaXBsZVF1b3RlUGF0ID0gcmVwbGFjZShwYXQsICJxIiwgIiciKSArICJ8IiArIHJlcGxhY2UocGF0LCAncScsICciJykKIAogIyBCdWlsZCB1cCBhIHJlZ3VsYXIgZXhwcmVzc2lvbiB3aGljaCBtYXRjaGVzIGFsbCBhbmQgb25seQpAQCAtODcsNjkgKzg3LDY5IEBACiBtYXRjaFBhdCA9IGNvbW1lbnRQYXQgKyAifCIgKyBrZXlQYXQgKyAifCIgKyB0cmlwbGVRdW90ZVBhdCArICJ8IiArIHF1b3RlUGF0CiBtYXRjaFJFID0gcmUuY29tcGlsZShtYXRjaFBhdCkKIAotaWRLZXlQYXQgPSAiWyBcdF0qW0EtWmEtel9dW0EtWmEtel8wLTkuXSoiCSMgSWRlbnQgdy4gbGVhZGluZyB3aGl0ZXNwYWNlLgoraWRLZXlQYXQgPSAiWyBcdF0qW0EtWmEtel9dW0EtWmEtel8wLTkuXSoiICAgICAgIyBJZGVudCB3LiBsZWFkaW5nIHdoaXRlc3BhY2UuCiBpZFJFID0gcmUuY29tcGlsZShpZEtleVBhdCkKIAogCiBkZWYgZm9udGlmeShweXRleHQsIHNlYXJjaGZyb20gPSAwLCBzZWFyY2h0byA9IE5vbmUpOgotCWlmIHNlYXJjaHRvIGlzIE5vbmU6Ci0JCXNlYXJjaHRvID0gbGVuKHB5dGV4dCkKLQkjIENhY2hlIGEgZmV3IGF0dHJpYnV0ZXMgZm9yIHF1aWNrZXIgcmVmZXJlbmNlLgotCXNlYXJjaCA9IG1hdGNoUkUuc2VhcmNoCi0JaWRTZWFyY2ggPSBpZFJFLnNlYXJjaAotCQotCXRhZ3MgPSBbXQotCXRhZ3NfYXBwZW5kID0gdGFncy5hcHBlbmQKLQljb21tZW50VGFnID0gJ2NvbW1lbnQnCi0Jc3RyaW5nVGFnID0gJ3N0cmluZycKLQlrZXl3b3JkVGFnID0gJ2tleXdvcmQnCi0JaWRlbnRpZmllclRhZyA9ICdpZGVudGlmaWVyJwotCQotCXN0YXJ0ID0gMAotCWVuZCA9IHNlYXJjaGZyb20KLQl3aGlsZSAxOgotCQltID0gc2VhcmNoKHB5dGV4dCwgZW5kKQotCQlpZiBtIGlzIE5vbmU6Ci0JCQlicmVhawkjIEVYSVQgTE9PUAotCQlzdGFydCA9IG0uc3RhcnQoKQotCQlpZiBzdGFydCA+PSBzZWFyY2h0bzoKLQkJCWJyZWFrCSMgRVhJVCBMT09QCi0JCW1hdGNoID0gbS5ncm91cCgwKQotCQllbmQgPSBzdGFydCArIGxlbihtYXRjaCkKLQkJYyA9IG1hdGNoWzBdCi0JCWlmIGMgbm90IGluICIjJ1wiIjoKLQkJCSMgTXVzdCBoYXZlIG1hdGNoZWQgYSBrZXl3b3JkLgotCQkJaWYgc3RhcnQgPD4gc2VhcmNoZnJvbToKLQkJCQkjIHRoZXJlJ3Mgc3RpbGwgYSByZWR1bmRhbnQgY2hhciBiZWZvcmUgYW5kIGFmdGVyIGl0LCBzdHJpcCEKLQkJCQltYXRjaCA9IG1hdGNoWzE6LTFdCi0JCQkJc3RhcnQgPSBzdGFydCArIDEKLQkJCWVsc2U6Ci0JCQkJIyB0aGlzIGlzIHRoZSBmaXJzdCBrZXl3b3JkIGluIHRoZSB0ZXh0LgotCQkJCSMgT25seSBhIHNwYWNlIGF0IHRoZSBlbmQuCi0JCQkJbWF0Y2ggPSBtYXRjaFs6LTFdCi0JCQllbmQgPSBlbmQgLSAxCi0JCQl0YWdzX2FwcGVuZCgoa2V5d29yZFRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCi0JCQkjIElmIHRoaXMgd2FzIGEgZGVmaW5pbmcga2V5d29yZCwgbG9vayBhaGVhZCB0byB0aGUKLQkJCSMgZm9sbG93aW5nIGlkZW50aWZpZXIuCi0JCQlpZiBtYXRjaCBpbiBbImRlZiIsICJjbGFzcyJdOgotCQkJCW0gPSBpZFNlYXJjaChweXRleHQsIGVuZCkKLQkJCQlpZiBtIGlzIG5vdCBOb25lOgotCQkJCQlzdGFydCA9IG0uc3RhcnQoKQotCQkJCQlpZiBzdGFydCA9PSBlbmQ6Ci0JCQkJCQltYXRjaCA9IG0uZ3JvdXAoMCkKLQkJCQkJCWVuZCA9IHN0YXJ0ICsgbGVuKG1hdGNoKQotCQkJCQkJdGFnc19hcHBlbmQoKGlkZW50aWZpZXJUYWcsIHN0YXJ0LCBlbmQsIE5vbmUpKQotCQllbGlmIGMgPT0gIiMiOgotCQkJdGFnc19hcHBlbmQoKGNvbW1lbnRUYWcsIHN0YXJ0LCBlbmQsIE5vbmUpKQotCQllbHNlOgotCQkJdGFnc19hcHBlbmQoKHN0cmluZ1RhZywgc3RhcnQsIGVuZCwgTm9uZSkpCi0JcmV0dXJuIHRhZ3MKKyAgICBpZiBzZWFyY2h0byBpcyBOb25lOgorICAgICAgICBzZWFyY2h0byA9IGxlbihweXRleHQpCisgICAgIyBDYWNoZSBhIGZldyBhdHRyaWJ1dGVzIGZvciBxdWlja2VyIHJlZmVyZW5jZS4KKyAgICBzZWFyY2ggPSBtYXRjaFJFLnNlYXJjaAorICAgIGlkU2VhcmNoID0gaWRSRS5zZWFyY2gKKworICAgIHRhZ3MgPSBbXQorICAgIHRhZ3NfYXBwZW5kID0gdGFncy5hcHBlbmQKKyAgICBjb21tZW50VGFnID0gJ2NvbW1lbnQnCisgICAgc3RyaW5nVGFnID0gJ3N0cmluZycKKyAgICBrZXl3b3JkVGFnID0gJ2tleXdvcmQnCisgICAgaWRlbnRpZmllclRhZyA9ICdpZGVudGlmaWVyJworCisgICAgc3RhcnQgPSAwCisgICAgZW5kID0gc2VhcmNoZnJvbQorICAgIHdoaWxlIDE6CisgICAgICAgIG0gPSBzZWFyY2gocHl0ZXh0LCBlbmQpCisgICAgICAgIGlmIG0gaXMgTm9uZToKKyAgICAgICAgICAgIGJyZWFrICAgIyBFWElUIExPT1AKKyAgICAgICAgc3RhcnQgPSBtLnN0YXJ0KCkKKyAgICAgICAgaWYgc3RhcnQgPj0gc2VhcmNodG86CisgICAgICAgICAgICBicmVhayAgICMgRVhJVCBMT09QCisgICAgICAgIG1hdGNoID0gbS5ncm91cCgwKQorICAgICAgICBlbmQgPSBzdGFydCArIGxlbihtYXRjaCkKKyAgICAgICAgYyA9IG1hdGNoWzBdCisgICAgICAgIGlmIGMgbm90IGluICIjJ1wiIjoKKyAgICAgICAgICAgICMgTXVzdCBoYXZlIG1hdGNoZWQgYSBrZXl3b3JkLgorICAgICAgICAgICAgaWYgc3RhcnQgPD4gc2VhcmNoZnJvbToKKyAgICAgICAgICAgICAgICAjIHRoZXJlJ3Mgc3RpbGwgYSByZWR1bmRhbnQgY2hhciBiZWZvcmUgYW5kIGFmdGVyIGl0LCBzdHJpcCEKKyAgICAgICAgICAgICAgICBtYXRjaCA9IG1hdGNoWzE6LTFdCisgICAgICAgICAgICAgICAgc3RhcnQgPSBzdGFydCArIDEKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB0aGlzIGlzIHRoZSBmaXJzdCBrZXl3b3JkIGluIHRoZSB0ZXh0LgorICAgICAgICAgICAgICAgICMgT25seSBhIHNwYWNlIGF0IHRoZSBlbmQuCisgICAgICAgICAgICAgICAgbWF0Y2ggPSBtYXRjaFs6LTFdCisgICAgICAgICAgICBlbmQgPSBlbmQgLSAxCisgICAgICAgICAgICB0YWdzX2FwcGVuZCgoa2V5d29yZFRhZywgc3RhcnQsIGVuZCwgTm9uZSkpCisgICAgICAgICAgICAjIElmIHRoaXMgd2FzIGEgZGVmaW5pbmcga2V5d29yZCwgbG9vayBhaGVhZCB0byB0aGUKKyAgICAgICAgICAgICMgZm9sbG93aW5nIGlkZW50aWZpZXIuCisgICAgICAgICAgICBpZiBtYXRjaCBpbiBbImRlZiIsICJjbGFzcyJdOgorICAgICAgICAgICAgICAgIG0gPSBpZFNlYXJjaChweXRleHQsIGVuZCkKKyAgICAgICAgICAgICAgICBpZiBtIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgICAgICBzdGFydCA9IG0uc3RhcnQoKQorICAgICAgICAgICAgICAgICAgICBpZiBzdGFydCA9PSBlbmQ6CisgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaCA9IG0uZ3JvdXAoMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IHN0YXJ0ICsgbGVuKG1hdGNoKQorICAgICAgICAgICAgICAgICAgICAgICAgdGFnc19hcHBlbmQoKGlkZW50aWZpZXJUYWcsIHN0YXJ0LCBlbmQsIE5vbmUpKQorICAgICAgICBlbGlmIGMgPT0gIiMiOgorICAgICAgICAgICAgdGFnc19hcHBlbmQoKGNvbW1lbnRUYWcsIHN0YXJ0LCBlbmQsIE5vbmUpKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGFnc19hcHBlbmQoKHN0cmluZ1RhZywgc3RhcnQsIGVuZCwgTm9uZSkpCisgICAgcmV0dXJuIHRhZ3MKIAogCiBkZWYgdGVzdChwYXRoKToKLQlmID0gb3BlbihwYXRoKQotCXRleHQgPSBmLnJlYWQoKQotCWYuY2xvc2UoKQotCXRhZ3MgPSBmb250aWZ5KHRleHQpCi0JZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgotCQlwcmludCB0YWcsIHJlcHIodGV4dFtzdGFydDplbmRdKQorICAgIGYgPSBvcGVuKHBhdGgpCisgICAgdGV4dCA9IGYucmVhZCgpCisgICAgZi5jbG9zZSgpCisgICAgdGFncyA9IGZvbnRpZnkodGV4dCkKKyAgICBmb3IgdGFnLCBzdGFydCwgZW5kLCBzdWJsaXN0IGluIHRhZ3M6CisgICAgICAgIHByaW50IHRhZywgcmVwcih0ZXh0W3N0YXJ0OmVuZF0pCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1B5SW50ZXJhY3RpdmUucHkgYi9NYWMvVG9vbHMvSURFL1B5SW50ZXJhY3RpdmUucHkKaW5kZXggM2FkMDJjNS4uOTg3ZWVjNSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeUludGVyYWN0aXZlLnB5CisrKyBiL01hYy9Ub29scy9JREUvUHlJbnRlcmFjdGl2ZS5weQpAQCAtNCwxMTQgKzQsMTE0IEBACiAKIAogdHJ5OgotCXN5cy5wczEKKyAgICBzeXMucHMxCiBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0Jc3lzLnBzMSA9ICI+Pj4gIgorICAgIHN5cy5wczEgPSAiPj4+ICIKIHRyeToKLQlzeXMucHMyCisgICAgc3lzLnBzMgogZXhjZXB0IEF0dHJpYnV0ZUVycm9yOgotCXN5cy5wczIgPSAiLi4uICIKKyAgICBzeXMucHMyID0gIi4uLiAiCiAKIAogZGVmIHByaW50X2V4YyhsaW1pdD1Ob25lLCBmaWxlPU5vbmUpOgotCWlmIG5vdCBmaWxlOgotCQlmaWxlID0gc3lzLnN0ZGVycgotCSMgd2UncmUgZ29pbmcgdG8gc2tpcCB0aGUgb3V0ZXJtb3N0IHRyYWNlYmFjayBvYmplY3QsIHdlIGRvbid0Ci0JIyB3YW50IHBlb3BsZSB0byBzZWUgdGhlIGxpbmUgd2hpY2ggZXhjZWN1dGVkIHRoZWlyIGNvZGUuCi0JdGIgPSBzeXMuZXhjX3RyYWNlYmFjawotCWlmIHRiOgotCQl0YiA9IHRiLnRiX25leHQKLQl0cnk6Ci0JCXN5cy5sYXN0X3R5cGUgPSBzeXMuZXhjX3R5cGUKLQkJc3lzLmxhc3RfdmFsdWUgPSBzeXMuZXhjX3ZhbHVlCi0JCXN5cy5sYXN0X3RyYWNlYmFjayA9IHRiCi0JCXRyYWNlYmFjay5wcmludF9leGNlcHRpb24oc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsIAotCQkJCQlzeXMubGFzdF90cmFjZWJhY2ssIGxpbWl0LCBmaWxlKQotCWV4Y2VwdDoKLQkJcHJpbnQgJy0tLSBob2xhISAtLS0nCi0JCXRyYWNlYmFjay5wcmludF9leGNlcHRpb24oc3lzLmV4Y190eXBlLCBzeXMuZXhjX3ZhbHVlLCAKLQkJCQkJc3lzLmV4Y190cmFjZWJhY2ssIGxpbWl0LCBmaWxlKQorICAgIGlmIG5vdCBmaWxlOgorICAgICAgICBmaWxlID0gc3lzLnN0ZGVycgorICAgICMgd2UncmUgZ29pbmcgdG8gc2tpcCB0aGUgb3V0ZXJtb3N0IHRyYWNlYmFjayBvYmplY3QsIHdlIGRvbid0CisgICAgIyB3YW50IHBlb3BsZSB0byBzZWUgdGhlIGxpbmUgd2hpY2ggZXhjZWN1dGVkIHRoZWlyIGNvZGUuCisgICAgdGIgPSBzeXMuZXhjX3RyYWNlYmFjaworICAgIGlmIHRiOgorICAgICAgICB0YiA9IHRiLnRiX25leHQKKyAgICB0cnk6CisgICAgICAgIHN5cy5sYXN0X3R5cGUgPSBzeXMuZXhjX3R5cGUKKyAgICAgICAgc3lzLmxhc3RfdmFsdWUgPSBzeXMuZXhjX3ZhbHVlCisgICAgICAgIHN5cy5sYXN0X3RyYWNlYmFjayA9IHRiCisgICAgICAgIHRyYWNlYmFjay5wcmludF9leGNlcHRpb24oc3lzLmxhc3RfdHlwZSwgc3lzLmxhc3RfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5sYXN0X3RyYWNlYmFjaywgbGltaXQsIGZpbGUpCisgICAgZXhjZXB0OgorICAgICAgICBwcmludCAnLS0tIGhvbGEhIC0tLScKKyAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4Y2VwdGlvbihzeXMuZXhjX3R5cGUsIHN5cy5leGNfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5cy5leGNfdHJhY2ViYWNrLCBsaW1pdCwgZmlsZSkKIAogCiBjbGFzcyBQeUludGVyYWN0aXZlOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJaW1wb3J0IGNvZGVvcAotCQlzZWxmLl9weWJ1ZiA9ICIiCi0JCXNlbGYuX2NvbXBpbGUgPSBjb2Rlb3AuQ29tcGlsZSgpCi0JCi0JZGVmIGV4ZWN1dGVsaW5lKHNlbGYsIHN0dWZmLCBvdXQgPSBOb25lLCBlbnYgPSBOb25lKToKLQkJaWYgZW52IGlzIE5vbmU6Ci0JCQlpbXBvcnQgX19tYWluX18KLQkJCWVudiA9IF9fbWFpbl9fLl9fZGljdF9fCi0JCWlmIG91dDoKLQkJCXNhdmVlcnIsIHNhdmVvdXQgPSBzeXMuc3RkZXJyLCBzeXMuc3Rkb3V0Ci0JCQlzeXMuc3RkZXJyID0gc3lzLnN0ZG91dCA9IG91dAotCQl0cnk6Ci0JCQlpZiBzZWxmLl9weWJ1ZjoKLQkJCQlzZWxmLl9weWJ1ZiA9IHNlbGYuX3B5YnVmICsgJ1xuJyArIHN0dWZmCi0JCQllbHNlOgotCQkJCXNlbGYuX3B5YnVmID0gc3R1ZmYKLQkJCQotCQkJIyBDb21waWxlIHRocmVlIHRpbWVzOiBhcyBpcywgd2l0aCBcbiwgYW5kIHdpdGggXG5cbiBhcHBlbmRlZC4KLQkJCSMgSWYgaXQgY29tcGlsZXMgYXMgaXMsIGl0J3MgY29tcGxldGUuICBJZiBpdCBjb21waWxlcyB3aXRoCi0JCQkjIG9uZSBcbiBhcHBlbmRlZCwgd2UgZXhwZWN0IG1vcmUuICBJZiBpdCBkb2Vzbid0IGNvbXBpbGUKLQkJCSMgZWl0aGVyIHdheSwgd2UgY29tcGFyZSB0aGUgZXJyb3Igd2UgZ2V0IHdoZW4gY29tcGlsaW5nIHdpdGgKLQkJCSMgXG4gb3IgXG5cbiBhcHBlbmRlZC4gIElmIHRoZSBlcnJvcnMgYXJlIHRoZSBzYW1lLCB0aGUgY29kZQotCQkJIyBpcyBicm9rZW4uICBCdXQgaWYgdGhlIGVycm9ycyBhcmUgZGlmZmVyZW50LCB3ZSBleHBlY3QgbW9yZS4KLQkJCSMgTm90IGludHVpdGl2ZTsgbm90IGV2ZW4gZ3VhcmFudGVlZCB0byBob2xkIGluIGZ1dHVyZQotCQkJIyByZWxlYXNlczsgYnV0IHRoaXMgbWF0Y2hlcyB0aGUgY29tcGlsZXIncyBiZWhhdmlvciBpbiBQeXRob24KLQkJCSMgMS40IGFuZCAxLjUuCi0JCQllcnIgPSBlcnIxID0gZXJyMiA9IE5vbmUKLQkJCWNvZGUgPSBjb2RlMSA9IGNvZGUyID0gTm9uZQotCQkJCi0JCQkjIHF1aWNrbHkgZ2V0IG91dCBvZiBoZXJlIHdoZW4gdGhlIGxpbmUgaXMgJ2VtcHR5JyBvciBpcyBhIGNvbW1lbnQKLQkJCXN0cmlwcGVkID0gc3RyaW5nLnN0cmlwKHNlbGYuX3B5YnVmKQotCQkJaWYgbm90IHN0cmlwcGVkIG9yIHN0cmlwcGVkWzBdID09ICcjJzoKLQkJCQlzZWxmLl9weWJ1ZiA9ICcnCi0JCQkJc3lzLnN0ZG91dC53cml0ZShzeXMucHMxKQotCQkJCXN5cy5zdGRvdXQuZmx1c2goKQotCQkJCXJldHVybgotCQkJCi0JCQl0cnk6Ci0JCQkJY29kZSA9IHNlbGYuX2NvbXBpbGUoc2VsZi5fcHlidWYsICI8aW5wdXQ+IiwgInNpbmdsZSIpCi0JCQlleGNlcHQgU3ludGF4RXJyb3IsIGVycjoKLQkJCQlwYXNzCi0JCQlleGNlcHQ6Ci0JCQkJIyBPdmVyZmxvd0Vycm9yLiBNb3JlPwotCQkJCXByaW50X2V4YygpCi0JCQkJc2VsZi5fcHlidWYgPSAiIgotCQkJCXN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMSkKLQkJCQlzeXMuc3Rkb3V0LmZsdXNoKCkKLQkJCQlyZXR1cm4KLQkJCQotCQkJdHJ5OgotCQkJCWNvZGUxID0gc2VsZi5fY29tcGlsZShzZWxmLl9weWJ1ZiArICJcbiIsICI8aW5wdXQ+IiwgInNpbmdsZSIpCi0JCQlleGNlcHQgU3ludGF4RXJyb3IsIGVycjE6Ci0JCQkJcGFzcwotCQkJCi0JCQl0cnk6Ci0JCQkJY29kZTIgPSBzZWxmLl9jb21waWxlKHNlbGYuX3B5YnVmICsgIlxuXG4iLCAiPGlucHV0PiIsICJzaW5nbGUiKQotCQkJZXhjZXB0IFN5bnRheEVycm9yLCBlcnIyOgotCQkJCXBhc3MKLQkJCQotCQkJaWYgY29kZToKLQkJCQl0cnk6Ci0JCQkJCWV4ZWMgY29kZSBpbiBlbnYKLQkJCQlleGNlcHQ6Ci0JCQkJCXByaW50X2V4YygpCi0JCQkJc2VsZi5fcHlidWYgPSAiIgotCQkJZWxpZiBjb2RlMToKLQkJCQlwYXNzCi0JCQllbGlmIGVycjEgPT0gZXJyMiBvciAobm90IHN0dWZmIGFuZCBzZWxmLl9weWJ1Zik6Ci0JCQkJcHJpbnRfZXhjKCkKLQkJCQlzZWxmLl9weWJ1ZiA9ICIiCi0JCQlpZiBzZWxmLl9weWJ1ZjoKLQkJCQlzeXMuc3Rkb3V0LndyaXRlKHN5cy5wczIpCi0JCQkJc3lzLnN0ZG91dC5mbHVzaCgpCi0JCQllbHNlOgotCQkJCXN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMSkKLQkJCQlzeXMuc3Rkb3V0LmZsdXNoKCkKLQkJZmluYWxseToKLQkJCWlmIG91dDoKLQkJCQlzeXMuc3RkZXJyLCBzeXMuc3Rkb3V0ID0gc2F2ZWVyciwgc2F2ZW91dAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBpbXBvcnQgY29kZW9wCisgICAgICAgIHNlbGYuX3B5YnVmID0gIiIKKyAgICAgICAgc2VsZi5fY29tcGlsZSA9IGNvZGVvcC5Db21waWxlKCkKKworICAgIGRlZiBleGVjdXRlbGluZShzZWxmLCBzdHVmZiwgb3V0ID0gTm9uZSwgZW52ID0gTm9uZSk6CisgICAgICAgIGlmIGVudiBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IF9fbWFpbl9fCisgICAgICAgICAgICBlbnYgPSBfX21haW5fXy5fX2RpY3RfXworICAgICAgICBpZiBvdXQ6CisgICAgICAgICAgICBzYXZlZXJyLCBzYXZlb3V0ID0gc3lzLnN0ZGVyciwgc3lzLnN0ZG91dAorICAgICAgICAgICAgc3lzLnN0ZGVyciA9IHN5cy5zdGRvdXQgPSBvdXQKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgaWYgc2VsZi5fcHlidWY6CisgICAgICAgICAgICAgICAgc2VsZi5fcHlidWYgPSBzZWxmLl9weWJ1ZiArICdcbicgKyBzdHVmZgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9weWJ1ZiA9IHN0dWZmCisKKyAgICAgICAgICAgICMgQ29tcGlsZSB0aHJlZSB0aW1lczogYXMgaXMsIHdpdGggXG4sIGFuZCB3aXRoIFxuXG4gYXBwZW5kZWQuCisgICAgICAgICAgICAjIElmIGl0IGNvbXBpbGVzIGFzIGlzLCBpdCdzIGNvbXBsZXRlLiAgSWYgaXQgY29tcGlsZXMgd2l0aAorICAgICAgICAgICAgIyBvbmUgXG4gYXBwZW5kZWQsIHdlIGV4cGVjdCBtb3JlLiAgSWYgaXQgZG9lc24ndCBjb21waWxlCisgICAgICAgICAgICAjIGVpdGhlciB3YXksIHdlIGNvbXBhcmUgdGhlIGVycm9yIHdlIGdldCB3aGVuIGNvbXBpbGluZyB3aXRoCisgICAgICAgICAgICAjIFxuIG9yIFxuXG4gYXBwZW5kZWQuICBJZiB0aGUgZXJyb3JzIGFyZSB0aGUgc2FtZSwgdGhlIGNvZGUKKyAgICAgICAgICAgICMgaXMgYnJva2VuLiAgQnV0IGlmIHRoZSBlcnJvcnMgYXJlIGRpZmZlcmVudCwgd2UgZXhwZWN0IG1vcmUuCisgICAgICAgICAgICAjIE5vdCBpbnR1aXRpdmU7IG5vdCBldmVuIGd1YXJhbnRlZWQgdG8gaG9sZCBpbiBmdXR1cmUKKyAgICAgICAgICAgICMgcmVsZWFzZXM7IGJ1dCB0aGlzIG1hdGNoZXMgdGhlIGNvbXBpbGVyJ3MgYmVoYXZpb3IgaW4gUHl0aG9uCisgICAgICAgICAgICAjIDEuNCBhbmQgMS41LgorICAgICAgICAgICAgZXJyID0gZXJyMSA9IGVycjIgPSBOb25lCisgICAgICAgICAgICBjb2RlID0gY29kZTEgPSBjb2RlMiA9IE5vbmUKKworICAgICAgICAgICAgIyBxdWlja2x5IGdldCBvdXQgb2YgaGVyZSB3aGVuIHRoZSBsaW5lIGlzICdlbXB0eScgb3IgaXMgYSBjb21tZW50CisgICAgICAgICAgICBzdHJpcHBlZCA9IHN0cmluZy5zdHJpcChzZWxmLl9weWJ1ZikKKyAgICAgICAgICAgIGlmIG5vdCBzdHJpcHBlZCBvciBzdHJpcHBlZFswXSA9PSAnIyc6CisgICAgICAgICAgICAgICAgc2VsZi5fcHlidWYgPSAnJworICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQud3JpdGUoc3lzLnBzMSkKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LmZsdXNoKCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGUgPSBzZWxmLl9jb21waWxlKHNlbGYuX3B5YnVmLCAiPGlucHV0PiIsICJzaW5nbGUiKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlcnI6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICMgT3ZlcmZsb3dFcnJvci4gTW9yZT8KKyAgICAgICAgICAgICAgICBwcmludF9leGMoKQorICAgICAgICAgICAgICAgIHNlbGYuX3B5YnVmID0gIiIKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN5cy5wczEpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgICAgICAgICAgcmV0dXJuCisKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBjb2RlMSA9IHNlbGYuX2NvbXBpbGUoc2VsZi5fcHlidWYgKyAiXG4iLCAiPGlucHV0PiIsICJzaW5nbGUiKQorICAgICAgICAgICAgZXhjZXB0IFN5bnRheEVycm9yLCBlcnIxOgorICAgICAgICAgICAgICAgIHBhc3MKKworICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGNvZGUyID0gc2VsZi5fY29tcGlsZShzZWxmLl9weWJ1ZiArICJcblxuIiwgIjxpbnB1dD4iLCAic2luZ2xlIikKKyAgICAgICAgICAgIGV4Y2VwdCBTeW50YXhFcnJvciwgZXJyMjoKKyAgICAgICAgICAgICAgICBwYXNzCisKKyAgICAgICAgICAgIGlmIGNvZGU6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBleGVjIGNvZGUgaW4gZW52CisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBwcmludF9leGMoKQorICAgICAgICAgICAgICAgIHNlbGYuX3B5YnVmID0gIiIKKyAgICAgICAgICAgIGVsaWYgY29kZTE6CisgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgZWxpZiBlcnIxID09IGVycjIgb3IgKG5vdCBzdHVmZiBhbmQgc2VsZi5fcHlidWYpOgorICAgICAgICAgICAgICAgIHByaW50X2V4YygpCisgICAgICAgICAgICAgICAgc2VsZi5fcHlidWYgPSAiIgorICAgICAgICAgICAgaWYgc2VsZi5fcHlidWY6CisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC53cml0ZShzeXMucHMyKQorICAgICAgICAgICAgICAgIHN5cy5zdGRvdXQuZmx1c2goKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzeXMuc3Rkb3V0LndyaXRlKHN5cy5wczEpCisgICAgICAgICAgICAgICAgc3lzLnN0ZG91dC5mbHVzaCgpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBvdXQ6CisgICAgICAgICAgICAgICAgc3lzLnN0ZGVyciwgc3lzLnN0ZG91dCA9IHNhdmVlcnIsIHNhdmVvdXQKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvUHl0aG9uSURFLnB5IGIvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucHkKaW5kZXggMWVhNzcxMS4uYjhmNTRhOSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9QeXRob25JREUucHkKQEAgLTEsNiArMSw2IEBACiAjIGNvcHlyaWdodCAxOTk2LTIwMDEgSnVzdCB2YW4gUm9zc3VtLCBMZXR0ZXJyb3IuIGp1c3RAbGV0dGVycm9yLmNvbQogCi0jIGtlZXAgdGhpcyAoX19tYWluX18pIGFzIGNsZWFuIGFzIHBvc3NpYmxlLCBzaW5jZSB3ZSBhcmUgdXNpbmcgCisjIGtlZXAgdGhpcyAoX19tYWluX18pIGFzIGNsZWFuIGFzIHBvc3NpYmxlLCBzaW5jZSB3ZSBhcmUgdXNpbmcKICMgaXQgbGlrZSB0aGUgIm5vcm1hbCIgaW50ZXJwcmV0ZXIuCiAKIF9fdmVyc2lvbl9fID0gJzEuMC4yJwpAQCAtOCw0OCArOCw0OCBAQAogaW1wb3J0IG9zCiAKIGRlZiBpbml0KCk6Ci0JaW1wb3J0IE1hY09TCi0JaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCi0JdHJ5OgotCQlpbXBvcnQgYXV0b0dJTAotCWV4Y2VwdCBJbXBvcnRFcnJvcjoKLQkJcGFzcwotCWVsc2U6Ci0JCWF1dG9HSUwuaW5zdGFsbEF1dG9HSUwoKQotCQotCWZyb20gQ2FyYm9uIGltcG9ydCBRZCwgUXVpY2tEcmF3Ci0JUWQuU2V0Q3Vyc29yKFFkLkdldEN1cnNvcihRdWlja0RyYXcud2F0Y2hDdXJzb3IpLmRhdGEpCi0JCi0JaW1wb3J0IG1hY3Jlc291cmNlCi0JaW1wb3J0IHN5cywgb3MKLQltYWNyZXNvdXJjZS5uZWVkKCdESVRMJywgNDY4LCAiUHl0aG9uSURFLnJzcmMiKQotCXdpZGdldHJlc3BhdGhzZWdzID0gW3N5cy5leGVjX3ByZWZpeCwgIk1hYyIsICJUb29scyIsICJJREUiLCAiV2lkZ2V0cy5yc3JjIl0KLQl3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKLQlpZiBub3Qgb3MucGF0aC5leGlzdHMod2lkZ2V0cmVzZmlsZSk6Ci0JCXdpZGdldHJlc3BhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQotCQl3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKLQlyZWZubyA9IG1hY3Jlc291cmNlLm5lZWQoJ0NVUlMnLCA0NjgsIHdpZGdldHJlc2ZpbGUpCi0JaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdQWVRIT05JREVQQVRIJyk6Ci0JCSMgRm9yIGRldmVsb3BtZW50IHNldCB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlCi0JCWlkZV9wYXRoID0gb3MuZW52aXJvblsnUFlUSE9OSURFUEFUSCddCi0JZWxpZiByZWZubzoKLQkJIyBXZSdyZSBub3QgYSBmdWxsYmxvd24gYXBwbGljYXRpb24KLQkJaWRlcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSJdCi0JCWlkZV9wYXRoID0gb3MucGF0aC5qb2luKCppZGVwYXRoc2VncykKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGlkZV9wYXRoKToKLQkJCWlkZXBhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSJdCi0JCQlmb3IgcCBpbiBzeXMucGF0aDoKLQkJCQlpZGVfcGF0aCA9IG9zLnBhdGguam9pbigqKFtwXStpZGVwYXRoc2VncykpCi0JCQkJaWYgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgotCQkJCQlicmVhawotCQkKLQllbHNlOgotCQkjIFdlIGFyZSBhIGZ1bGx5IGZyb3plbiBhcHBsaWNhdGlvbgotCQlpZGVfcGF0aCA9IHN5cy5hcmd2WzBdCi0JaWYgaWRlX3BhdGggbm90IGluIHN5cy5wYXRoOgotCQlzeXMucGF0aC5pbnNlcnQoMSwgaWRlX3BhdGgpCisgICAgaW1wb3J0IE1hY09TCisgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCisKKyAgICB0cnk6CisgICAgICAgIGltcG9ydCBhdXRvR0lMCisgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICBwYXNzCisgICAgZWxzZToKKyAgICAgICAgYXV0b0dJTC5pbnN0YWxsQXV0b0dJTCgpCisKKyAgICBmcm9tIENhcmJvbiBpbXBvcnQgUWQsIFF1aWNrRHJhdworICAgIFFkLlNldEN1cnNvcihRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LndhdGNoQ3Vyc29yKS5kYXRhKQorCisgICAgaW1wb3J0IG1hY3Jlc291cmNlCisgICAgaW1wb3J0IHN5cywgb3MKKyAgICBtYWNyZXNvdXJjZS5uZWVkKCdESVRMJywgNDY4LCAiUHl0aG9uSURFLnJzcmMiKQorICAgIHdpZGdldHJlc3BhdGhzZWdzID0gW3N5cy5leGVjX3ByZWZpeCwgIk1hYyIsICJUb29scyIsICJJREUiLCAiV2lkZ2V0cy5yc3JjIl0KKyAgICB3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMod2lkZ2V0cmVzZmlsZSk6CisgICAgICAgIHdpZGdldHJlc3BhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSIsICJXaWRnZXRzLnJzcmMiXQorICAgICAgICB3aWRnZXRyZXNmaWxlID0gb3MucGF0aC5qb2luKCp3aWRnZXRyZXNwYXRoc2VncykKKyAgICByZWZubyA9IG1hY3Jlc291cmNlLm5lZWQoJ0NVUlMnLCA0NjgsIHdpZGdldHJlc2ZpbGUpCisgICAgaWYgb3MuZW52aXJvbi5oYXNfa2V5KCdQWVRIT05JREVQQVRIJyk6CisgICAgICAgICMgRm9yIGRldmVsb3BtZW50IHNldCB0aGlzIGVudmlyb25tZW50IHZhcmlhYmxlCisgICAgICAgIGlkZV9wYXRoID0gb3MuZW52aXJvblsnUFlUSE9OSURFUEFUSCddCisgICAgZWxpZiByZWZubzoKKyAgICAgICAgIyBXZSdyZSBub3QgYSBmdWxsYmxvd24gYXBwbGljYXRpb24KKyAgICAgICAgaWRlcGF0aHNlZ3MgPSBbc3lzLmV4ZWNfcHJlZml4LCAiTWFjIiwgIlRvb2xzIiwgIklERSJdCisgICAgICAgIGlkZV9wYXRoID0gb3MucGF0aC5qb2luKCppZGVwYXRoc2VncykKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGlkZV9wYXRoKToKKyAgICAgICAgICAgIGlkZXBhdGhzZWdzID0gW29zLnBhcmRpciwgIlRvb2xzIiwgIklERSJdCisgICAgICAgICAgICBmb3IgcCBpbiBzeXMucGF0aDoKKyAgICAgICAgICAgICAgICBpZGVfcGF0aCA9IG9zLnBhdGguam9pbigqKFtwXStpZGVwYXRoc2VncykpCisgICAgICAgICAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoaWRlX3BhdGgpOgorICAgICAgICAgICAgICAgICAgICBicmVhaworCisgICAgZWxzZToKKyAgICAgICAgIyBXZSBhcmUgYSBmdWxseSBmcm96ZW4gYXBwbGljYXRpb24KKyAgICAgICAgaWRlX3BhdGggPSBzeXMuYXJndlswXQorICAgIGlmIGlkZV9wYXRoIG5vdCBpbiBzeXMucGF0aDoKKyAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDEsIGlkZV9wYXRoKQogCiAKIGluaXQoKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9QeXRob25JREVNYWluLnB5IGIvTWFjL1Rvb2xzL0lERS9QeXRob25JREVNYWluLnB5CmluZGV4IDExMWEwYjAuLjRkYmU5MmEgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvUHl0aG9uSURFTWFpbi5weQorKysgYi9NYWMvVG9vbHMvSURFL1B5dGhvbklERU1haW4ucHkKQEAgLTEzLDQ3NiArMTMsNDc2IEBACiBmcm9tIENhcmJvbiBpbXBvcnQgRmlsZXMKIAogaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdtYWNobyc6Ci0JRUxMSVBTSVMgPSAnLi4uJworICAgIEVMTElQU0lTID0gJy4uLicKIGVsc2U6Ci0JRUxMSVBTSVMgPSAnXHhjOScKKyAgICBFTExJUFNJUyA9ICdceGM5JwogCiBkZWYgcnVubmluZ09uT1NYKCk6Ci0JZnJvbSBnZXN0YWx0IGltcG9ydCBnZXN0YWx0Ci0JZ2VzdGFsdE1lbnVNZ3JBcXVhTGF5b3V0Qml0ID0gMSAgIyBtZW51cyBoYXZlIHRoZSBBcXVhIDEuMCBsYXlvdXQKLQlnZXN0YWx0TWVudU1nckFxdWFMYXlvdXRNYXNrID0gKDFMIDw8IGdlc3RhbHRNZW51TWdyQXF1YUxheW91dEJpdCkKLQl2YWx1ZSA9IGdlc3RhbHQoIm1lbnUiKSAmIGdlc3RhbHRNZW51TWdyQXF1YUxheW91dE1hc2sKLQlyZXR1cm4gbm90IG5vdCB2YWx1ZQorICAgIGZyb20gZ2VzdGFsdCBpbXBvcnQgZ2VzdGFsdAorICAgIGdlc3RhbHRNZW51TWdyQXF1YUxheW91dEJpdCA9IDEgICMgbWVudXMgaGF2ZSB0aGUgQXF1YSAxLjAgbGF5b3V0CisgICAgZ2VzdGFsdE1lbnVNZ3JBcXVhTGF5b3V0TWFzayA9ICgxTCA8PCBnZXN0YWx0TWVudU1nckFxdWFMYXlvdXRCaXQpCisgICAgdmFsdWUgPSBnZXN0YWx0KCJtZW51IikgJiBnZXN0YWx0TWVudU1nckFxdWFMYXlvdXRNYXNrCisgICAgcmV0dXJuIG5vdCBub3QgdmFsdWUKIAogZGVmIGdldG1vZHRpbWUoZmlsZSk6Ci0JZmlsZSA9IEZpbGUuRlNSZWYoZmlsZSkKLQljYXRpbmZvLCBkMSwgZDIsIGQzID0gZmlsZS5GU0dldENhdGFsb2dJbmZvKEZpbGVzLmtGU0NhdEluZm9Db250ZW50TW9kKQotCXJldHVybiBjYXRpbmZvLmNvbnRlbnRNb2REYXRlCisgICAgZmlsZSA9IEZpbGUuRlNSZWYoZmlsZSkKKyAgICBjYXRpbmZvLCBkMSwgZDIsIGQzID0gZmlsZS5GU0dldENhdGFsb2dJbmZvKEZpbGVzLmtGU0NhdEluZm9Db250ZW50TW9kKQorICAgIHJldHVybiBjYXRpbmZvLmNvbnRlbnRNb2REYXRlCiAKIGNsYXNzIFB5dGhvbklERShXYXBwbGljYXRpb24uQXBwbGljYXRpb24pOgotCQotCWRlZiBfX2luaXRfXyhzZWxmKToKLQkJaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotCQkJaWYgbGVuKHN5cy5hcmd2KSA+IDEgYW5kIHN5cy5hcmd2WzFdLnN0YXJ0c3dpdGgoIi1wc24iKToKLQkJCQlob21lID0gb3MuZ2V0ZW52KCJIT01FIikKLQkJCQlpZiBob21lOgotCQkJCQlvcy5jaGRpcihob21lKQotCQlzZWxmLnByZWZmaWxlcGF0aCA9IG9zLnBhdGguam9pbigiUHl0aG9uIiwgIlB5dGhvbklERSBwcmVmZXJlbmNlcyIpCi0JCVdhcHBsaWNhdGlvbi5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmLCAnUGlkZScpCi0JCWZyb20gQ2FyYm9uIGltcG9ydCBBRQotCQlmcm9tIENhcmJvbiBpbXBvcnQgQXBwbGVFdmVudHMKLQkJCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRU9wZW5BcHBsaWNhdGlvbiwgCi0JCQkJc2VsZi5pZ25vcmVldmVudCkKLQkJQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUmVvcGVuQXBwbGljYXRpb24sIAotCQkJCXNlbGYuaWdub3JlZXZlbnQpCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVByaW50RG9jdW1lbnRzLCAKLQkJCQlzZWxmLmlnbm9yZWV2ZW50KQotCQlBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuRG9jdW1lbnRzLCAKLQkJCQlzZWxmLm9wZW5kb2NzZXZlbnQpCi0JCUFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVF1aXRBcHBsaWNhdGlvbiwgCi0JCQkJc2VsZi5xdWl0ZXZlbnQpCi0JCWltcG9ydCBQeUNvbnNvbGUsIFB5RWRpdAotCQlTcGxhc2gud2FpdCgpCi0JCSMgV2l0aCAtRCBvcHRpb24gKE9TWCBjb21tYW5kIGxpbmUgb25seSkga2VlcCBzdGRlcnIsIGZvciBkZWJ1Z2dpbmcgdGhlIElERQotCQkjIGl0c2VsZi4KLQkJZGVidWdfc3RkZXJyID0gTm9uZQotCQlpZiBsZW4oc3lzLmFyZ3YpID49IDIgYW5kIHN5cy5hcmd2WzFdID09ICctRCc6Ci0JCQlkZWJ1Z19zdGRlcnIgPSBzeXMuc3RkZXJyCi0JCQlkZWwgc3lzLmFyZ3ZbMV0KLQkJUHlDb25zb2xlLmluc3RhbGxvdXRwdXQoKQotCQlQeUNvbnNvbGUuaW5zdGFsbGNvbnNvbGUoKQotCQlpZiBkZWJ1Z19zdGRlcnI6Ci0JCQlzeXMuc3RkZXJyID0gZGVidWdfc3RkZXJyCi0JCWZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKLQkJCWlmIHBhdGguc3RhcnRzd2l0aCgiLXAiKToKLQkJCQkjIHByb2Nlc3MgbnVtYmVyIGFkZGVkIGJ5IHRoZSBPUwotCQkJCWNvbnRpbnVlCi0JCQlzZWxmLm9wZW5kb2MocGF0aCkKLQkJc2VsZi5tYWlubG9vcCgpCi0JCi0JZGVmIG1ha2V1c2VybWVudXMoc2VsZik6Ci0JCW0gPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICJGaWxlIikKLQkJbmV3aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTmV3IiwgIk4iLCAnbmV3JykKLQkJb3Blbml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4iK0VMTElQU0lTLCAiTyIsICdvcGVuJykKLQkJb3BlbmJ5bmFtZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk9wZW4gRmlsZSBieSBOYW1lIitFTExJUFNJUywgIkQiLCAnb3BlbmJ5bmFtZScpCi0JCXNlbGYub3BlbnJlY2VudG1lbnUgPSBGcmFtZVdvcmsuU3ViTWVudShtLCAiT3BlbiBSZWNlbnQiKQotCQlzZWxmLm1ha2VvcGVucmVjZW50bWVudSgpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJY2xvc2VpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDbG9zZSIsICJXIiwgJ2Nsb3NlJykKLQkJc2F2ZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUiLCAiUyIsICdzYXZlJykKLQkJc2F2ZWFzaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSBhcyIrRUxMSVBTSVMsIE5vbmUsICdzYXZlX2FzJykKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlzYXZlYXNhcHBsZXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIGFzIEFwcGxldCIrRUxMSVBTSVMsIE5vbmUsICdzYXZlX2FzX2FwcGxldCcpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJaW5zdG1ncml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlBhY2thZ2UgTWFuYWdlciIsIE5vbmUsICdvcGVucGFja2FnZW1hbmFnZXInKQotCQlnZW5zdWl0ZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkdlbmVyYXRlIE9TQSBTdWl0ZS4uLiIsIE5vbmUsICdnZW5zdWl0ZScpCi0JCWlmIG5vdCBydW5uaW5nT25PU1goKToKLQkJCSMgT24gT1NYIHRoZXJlJ3MgYSBzcGVjaWFsICJtYWdpYyIgcXVpdCBtZW51LCBzbyB3ZSBzaG91bGRuJ3QgYWRkCi0JCQkjIGl0IHRvIHRoZSBGaWxlIG1lbnUuCi0JCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCQlxdWl0aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUXVpdCIsICJRIiwgJ3F1aXQnKQotCQkKLQkJbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQotCQl1bmRvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiVW5kbyIsICdaJywgInVuZG8iKQotCQlGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCi0JCWN1dGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkN1dCIsICdYJywgImN1dCIpCi0JCWNvcHlpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCAiY29weSIpCi0JCXBhc3RlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFzdGUiLCAiViIsICJwYXN0ZSIpCi0JCUZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xlYXIiLCBOb25lLCAgImNsZWFyIikKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlzZWxhbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTZWxlY3QgYWxsIiwgIkEiLCAic2VsZWN0YWxsIikKLQkJc2VsbGluZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBsaW5lIiwgIkwiLCAic2VsZWN0bGluZSIpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkZpbmQiK0VMTElQU0lTLCAiRiIsICJmaW5kIikKLQkJZmluZGFnYWluaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiRmluZCBhZ2FpbiIsICdHJywgImZpbmRuZXh0IikKLQkJZW50ZXJzZWxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJFbnRlciBzZWFyY2ggc3RyaW5nIiwgIkUiLCAiZW50ZXJzZWFyY2hzdHJpbmciKQotCQlyZXBsYWNlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUmVwbGFjZSIsIE5vbmUsICJyZXBsYWNlIikKLQkJcmVwbGFjZWZpbmRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSZXBsYWNlICYgZmluZCBhZ2FpbiIsICdUJywgInJlcGxhY2VmaW5kIikKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQlzaGlmdGxlZnRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTaGlmdCBsZWZ0IiwgIlsiLCAic2hpZnRsZWZ0IikKLQkJc2hpZnRyaWdodGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNoaWZ0IHJpZ2h0IiwgIl0iLCAic2hpZnRyaWdodCIpCi0JCQotCQltID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAiUHl0aG9uIikKLQkJcnVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUnVuIHdpbmRvdyIsICJSIiwgJ3J1bicpCi0JCXJ1bnNlbGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJ1biBzZWxlY3Rpb24iLCBOb25lLCAncnVuc2VsZWN0aW9uJykKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQltb2RpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNb2R1bGUgYnJvd3NlciIrRUxMSVBTSVMsICJNIiwgc2VsZi5kb21lbnVfbW9kdWxlYnJvd3NlcikKLQkJRnJhbWVXb3JrLlNlcGFyYXRvcihtKQotCQltbSA9IEZyYW1lV29yay5TdWJNZW51KG0sICJQcmVmZXJlbmNlcyIpCi0JCUZyYW1lV29yay5NZW51SXRlbShtbSwgIlNldCBTY3JpcHRzIGZvbGRlciIrRUxMSVBTSVMsIE5vbmUsIHNlbGYuZG9fc2V0c2NyaXB0c2ZvbGRlcikKLQkJRnJhbWVXb3JrLk1lbnVJdGVtKG1tLCAiRWRpdG9yIGRlZmF1bHQgc2V0dGluZ3MiK0VMTElQU0lTLCBOb25lLCBzZWxmLmRvX2VkaXRvcnByZWZzKQotCQlGcmFtZVdvcmsuTWVudUl0ZW0obW0sICJTZXQgZGVmYXVsdCB3aW5kb3cgZm9udCIrRUxMSVBTSVMsIE5vbmUsIHNlbGYuZG9fc2V0d2luZG93Zm9udCkKLQkJCi0JCXNlbGYub3BlbndpbmRvd3NtZW51ID0gV2FwcGxpY2F0aW9uLk1lbnUoc2VsZi5tZW51YmFyLCAnV2luZG93cycpCi0JCXNlbGYubWFrZW9wZW53aW5kb3dzbWVudSgpCi0JCXNlbGYuX21lbnVzdG9jaGVjayA9IFtjbG9zZWl0ZW0sIHNhdmVpdGVtLCBzYXZlYXNpdGVtLCBzYXZlYXNhcHBsZXRpdGVtLAotCQkJCXVuZG9pdGVtLCBjdXRpdGVtLCBjb3B5aXRlbSwgcGFzdGVpdGVtLCAKLQkJCQlzZWxhbGxpdGVtLCBzZWxsaW5laXRlbSwgCi0JCQkJZmluZGl0ZW0sIGZpbmRhZ2Fpbml0ZW0sIGVudGVyc2VsaXRlbSwgcmVwbGFjZWl0ZW0sIHJlcGxhY2VmaW5kaXRlbSwKLQkJCQlzaGlmdGxlZnRpdGVtLCBzaGlmdHJpZ2h0aXRlbSwgCi0JCQkJcnVuaXRlbSwgcnVuc2VsaXRlbV0KLQkJCi0JCXByZWZzID0gc2VsZi5nZXRwcmVmcygpCi0JCXRyeToKLQkJCWZzciwgZCA9IEZpbGUuQWxpYXMocmF3ZGF0YT1wcmVmcy5zY3JpcHRzZm9sZGVyKS5GU1Jlc29sdmVBbGlhcyhOb25lKQotCQkJc2VsZi5zY3JpcHRzZm9sZGVyID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLQkJZXhjZXB0OgotCQkJcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRjd2QoKSwgIk1hYyIsICJJREUgc2NyaXB0cyIpCi0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0JCQkJaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgotCQkJCQlwYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGVudigiSE9NRSIpLCAiTGlicmFyeSIsICJQeXRob24iLCAiSURFLVNjcmlwdHMiKQotCQkJCWVsc2U6Ci0JCQkJCXBhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICJTY3JpcHRzIikKLQkJCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6Ci0JCQkJCW9zLm1ha2VkaXJzKHBhdGgpCi0JCQkJCWYgPSBvcGVuKG9zLnBhdGguam9pbihwYXRoLCAiUGxhY2UgeW91ciBzY3JpcHRzIGhlcmUiK0VMTElQU0lTKSwgInciKQotCQkJCQlmLmNsb3NlKCkKLQkJCWZzciA9IEZpbGUuRlNSZWYocGF0aCkKLQkJCXNlbGYuc2NyaXB0c2ZvbGRlciA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCi0JCQlzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lID0gZ2V0bW9kdGltZShmc3IpCi0JCWVsc2U6Ci0JCQlzZWxmLnNjcmlwdHNmb2xkZXJtb2R0aW1lID0gZ2V0bW9kdGltZShmc3IpCi0JCXByZWZzLnNjcmlwdHNmb2xkZXIgPSBzZWxmLnNjcmlwdHNmb2xkZXIuZGF0YQotCQlzZWxmLl9zY3JpcHRzID0ge30KLQkJc2VsZi5zY3JpcHRzbWVudSA9IE5vbmUKLQkJc2VsZi5tYWtlc2NyaXB0c21lbnUoKQotCQlzZWxmLm1ha2VoZWxwbWVudSgpCi0JCi0JZGVmIHF1aXRldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6Ci0JCXNlbGYuX3F1aXQoKQotCQotCWRlZiBzdXNwZW5kcmVzdW1lKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlmc3IsIGNoYW5nZWQgPSBzZWxmLnNjcmlwdHNmb2xkZXIuRlNSZXNvbHZlQWxpYXMoTm9uZSkKLQkJCW1vZHRpbWUgPSBnZXRtb2R0aW1lKGZzcikKLQkJCWlmIHNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPD4gbW9kdGltZSBvciBjaGFuZ2VkOgotCQkJCXNlbGYuc2NyaXB0c2ZvbGRlcm1vZHRpbWUgPSBtb2R0aW1lCi0JCQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJCQlzZWxmLm1ha2VzY3JpcHRzbWVudSgpCi0JCi0JZGVmIGlnbm9yZWV2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKLQkJcGFzcwotCQotCWRlZiBvcGVuZG9jc2V2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKLQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaW1wb3J0IGFldG9vbHMKLQkJcGFyYW1ldGVycywgYXJncyA9IGFldG9vbHMudW5wYWNrZXZlbnQodGhlQXBwbGVFdmVudCkKLQkJZG9jcyA9IHBhcmFtZXRlcnNbJy0tLS0nXQotCQlpZiB0eXBlKGRvY3MpIDw+IHR5cGUoW10pOgotCQkJZG9jcyA9IFtkb2NzXQotCQlmb3IgZG9jIGluIGRvY3M6Ci0JCQlmc3IsIGEgPSBkb2MuRlNSZXNvbHZlQWxpYXMoTm9uZSkKLQkJCXBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQotCQkJc2VsZi5vcGVuZG9jKHBhdGgpCi0JCi0JZGVmIG9wZW5kb2Moc2VsZiwgcGF0aCk6Ci0JCWZjcmVhdG9yLCBmdHlwZSA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKHBhdGgpCi0JCWlmIGZ0eXBlID09ICdURVhUJzoKLQkJCXNlbGYub3BlbnNjcmlwdChwYXRoKQotCQllbGlmIGZ0eXBlID09ICdcMFwwXDBcMCcgYW5kIHBhdGhbLTM6XSA9PSAnLnB5JzoKLQkJCXNlbGYub3BlbnNjcmlwdChwYXRoKQotCQllbHNlOgotCQkJVy5NZXNzYWdlKCJDYW4ndCBvcGVuIGZpbGUgb2YgdHlwZSAnJXMnLiIgJSBmdHlwZSkKLQkKLQlkZWYgZ2V0YWJvdXR0ZXh0KHNlbGYpOgotCQlyZXR1cm4gIkFib3V0IFB5dGhvbiBJREUiK0VMTElQU0lTCi0JCi0JZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJU3BsYXNoLmFib3V0KCkKLQkKLQlkZWYgZG9fc2V0c2NyaXB0c2ZvbGRlcihzZWxmLCAqYXJncyk6Ci0JCWZzciA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPSJTZWxlY3QgU2NyaXB0cyBGb2xkZXIiLAotCQkJd2FudGVkPUZpbGUuRlNSZWYpCi0JCWlmIGZzcjoKLQkJCXByZWZzID0gc2VsZi5nZXRwcmVmcygpCi0JCQlhbGlzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKLQkJCXByZWZzLnNjcmlwdHNmb2xkZXIgPSBhbGlzLmRhdGEKLQkJCXNlbGYuc2NyaXB0c2ZvbGRlciA9IGFsaXMKLQkJCXNlbGYubWFrZXNjcmlwdHNtZW51KCkKLQkJCXByZWZzLnNhdmUoKQotCQotCWRlZiBkb21lbnVfbW9kdWxlYnJvd3NlcihzZWxmLCAqYXJncyk6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWltcG9ydCBNb2R1bGVCcm93c2VyCi0JCU1vZHVsZUJyb3dzZXIuTW9kdWxlQnJvd3NlcigpCi0JCi0JZGVmIGRvbWVudV9vcGVuKHNlbGYsICphcmdzKToKLQkJZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3Blbih0eXBlTGlzdD0oIlRFWFQiLCkpCi0JCWlmIGZpbGVuYW1lOgotCQkJc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lKQotCQotCWRlZiBkb21lbnVfb3BlbmJ5bmFtZShzZWxmLCAqYXJncyk6Ci0JCSMgT3BlbiBhIGZpbGUgYnkgbmFtZS4gSWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIGZpbGVuYW1lCi0JCSMgdXNlIHRoYXQgYXMgdGhlIGRlZmF1bHQuCi0JCWZyb20gQ2FyYm9uIGltcG9ydCBTY3JhcAotCQl0cnk6Ci0JCQlzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCi0JCQlkZnQgPSBzYy5HZXRTY3JhcEZsYXZvckRhdGEoIlRFWFQiKQotCQlleGNlcHQgU2NyYXAuRXJyb3I6Ci0JCQlkZnQgPSAiIgotCQllbHNlOgotCQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKGRmdCk6Ci0JCQkJZGZ0ID0gIiIKLQkJZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIk9wZW4gRmlsZSBOYW1lZDoiLCBkZWZhdWx0PWRmdCwgb2s9Ik9wZW4iKQotCQlpZiBmaWxlbmFtZToKLQkJCXNlbGYub3BlbnNjcmlwdChmaWxlbmFtZSkKLQkKLQlkZWYgZG9tZW51X25ldyhzZWxmLCAqYXJncyk6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWltcG9ydCBQeUVkaXQKLQkJcmV0dXJuIFB5RWRpdC5FZGl0b3IoKQotCQotCWRlZiBtYWtlc2NyaXB0c21lbnUoc2VsZik6Ci0JCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JCWlmIHNlbGYuX3NjcmlwdHM6Ci0JCQlmb3IgaWQsIGl0ZW0gaW4gc2VsZi5fc2NyaXB0cy5rZXlzKCk6Ci0JCQkJaWYgc2VsZi5tZW51YmFyLm1lbnVzLmhhc19rZXkoaWQpOgotCQkJCQltID0gc2VsZi5tZW51YmFyLm1lbnVzW2lkXQotCQkJCQltLmRlbGV0ZSgpCi0JCQlzZWxmLl9zY3JpcHRzID0ge30KLQkJaWYgc2VsZi5zY3JpcHRzbWVudToKLQkJCWlmIGhhc2F0dHIoc2VsZi5zY3JpcHRzbWVudSwgJ2lkJykgYW5kIHNlbGYubWVudWJhci5tZW51cy5oYXNfa2V5KHNlbGYuc2NyaXB0c21lbnUuaWQpOgotCQkJCXNlbGYuc2NyaXB0c21lbnUuZGVsZXRlKCkKLQkJc2VsZi5zY3JpcHRzbWVudSA9IEZyYW1lV29yay5NZW51KHNlbGYubWVudWJhciwgIlNjcmlwdHMiKQotCQkjRnJhbWVXb3JrLk1lbnVJdGVtKHNlbGYuc2NyaXB0c21lbnUsICJOZXcgc2NyaXB0IiwgTm9uZSwgc2VsZi5kb21lbnVfbmV3KQotCQkjc2VsZi5zY3JpcHRzbWVudS5hZGRzZXBhcmF0b3IoKQotCQlmc3IsIGQxID0gc2VsZi5zY3JpcHRzZm9sZGVyLkZTUmVzb2x2ZUFsaWFzKE5vbmUpCi0JCXNlbGYuc2NyaXB0c3dhbGsoZnNyLmFzX3BhdGhuYW1lKCksIHNlbGYuc2NyaXB0c21lbnUpCi0JCi0JZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6Ci0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcykpOgotCQkJc2VsZi5vcGVud2luZG93c21lbnUubWVudS5EZWxldGVNZW51SXRlbSgxKQotCQkJc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMgPSBbXQotCQl3aW5kb3dzID0gW10KLQkJc2VsZi5fb3BlbndpbmRvd3MgPSB7fQotCQlmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3Mua2V5cygpOgotCQkJdGl0bGUgPSB3aW5kb3cuR2V0V1RpdGxlKCkKLQkJCWlmIG5vdCB0aXRsZToKLQkJCQl0aXRsZSA9ICI8bm8gdGl0bGU+IgotCQkJd2luZG93cy5hcHBlbmQoKHRpdGxlLCB3aW5kb3cpKQotCQl3aW5kb3dzLnNvcnQoKQotCQlmb3IgdGl0bGUsIHdpbmRvdyBpbiB3aW5kb3dzOgotCQkJaWYgdGl0bGUgPT0gIlB5dGhvbiBJbnRlcmFjdGl2ZSI6CSMgdWdseSBidXQgdXNlZnVsIGhhY2sgYnkgSm9lIFN0cm91dAotCQkJCXNob3J0Y3V0ID0gJzAnCi0JCQllbHNlOiAKLQkJCQlzaG9ydGN1dCA9IE5vbmUKLQkJCWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5vcGVud2luZG93c21lbnUsIHRpdGxlLCBzaG9ydGN1dCwgY2FsbGJhY2sgPSBzZWxmLmRvbWVudV9vcGVud2luZG93cykKLQkJCXNlbGYuX29wZW53aW5kb3dzW2l0ZW0uaXRlbV0gPSB3aW5kb3cKLQkJc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSAwCi0JCXNlbGYuY2hlY2tvcGVud2luZG93c21lbnUoKQotCQkKLQlkZWYgbWFrZW9wZW5yZWNlbnRtZW51KHNlbGYpOgotCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vcGVucmVjZW50bWVudS5pdGVtcykpOgotCQkJc2VsZi5vcGVucmVjZW50bWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKDEpCi0JCQlzZWxmLm9wZW5yZWNlbnRtZW51Lml0ZW1zID0gW10KLQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJZmlsZWxpc3QgPSBwcmVmcy5yZWNlbnRmaWxlcwotCQlpZiBub3QgZmlsZWxpc3Q6Ci0JCQlzZWxmLm9wZW5yZWNlbnRtZW51LmVuYWJsZSgwKQotCQkJcmV0dXJuCi0JCXNlbGYub3BlbnJlY2VudG1lbnUuZW5hYmxlKDEpCi0JCWZvciBmaWxlbmFtZSBpbiBmaWxlbGlzdDoKLQkJCWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5vcGVucmVjZW50bWVudSwgZmlsZW5hbWUsIE5vbmUsIGNhbGxiYWNrID0gc2VsZi5kb21lbnVfb3BlbnJlY2VudCkKLQkJCi0JZGVmIGFkZHJlY2VudGZpbGUoc2VsZiwgZmlsZSk6Ci0JCXByZWZzID0gc2VsZi5nZXRwcmVmcygpCi0JCWZpbGVsaXN0ID0gcHJlZnMucmVjZW50ZmlsZXMKLQkJaWYgbm90IGZpbGVsaXN0OgotCQkJZmlsZWxpc3QgPSBbXQotCQkKLQkJaWYgZmlsZSBpbiBmaWxlbGlzdDoKLQkJCWlmIGZpbGUgPT0gZmlsZWxpc3RbMF06Ci0JCQkJcmV0dXJuCi0JCQlmaWxlbGlzdC5yZW1vdmUoZmlsZSkKLQkJZmlsZWxpc3QuaW5zZXJ0KDAsIGZpbGUpCi0JCWZpbGVsaXN0ID0gZmlsZWxpc3RbOjEwXQotCQlwcmVmcy5yZWNlbnRmaWxlcyA9IGZpbGVsaXN0Ci0JCXByZWZzLnNhdmUoKQotCQlzZWxmLm1ha2VvcGVucmVjZW50bWVudSgpCi0JCQotCWRlZiBkb21lbnVfb3BlbndpbmRvd3Moc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQl3ID0gc2VsZi5fb3BlbndpbmRvd3NbaXRlbV0KLQkJdy5TaG93V2luZG93KCkKLQkJdy5TZWxlY3RXaW5kb3coKQotCQotCWRlZiBkb21lbnVfb3BlbnJlY2VudChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCXByZWZzID0gc2VsZi5nZXRwcmVmcygpCi0JCWZpbGVsaXN0ID0gcHJlZnMucmVjZW50ZmlsZXMKLQkJaWYgbm90IGZpbGVsaXN0OgotCQkJZmlsZWxpc3QgPSBbXQotCQlpdGVtID0gaXRlbSAtIDEKLQkJZmlsZW5hbWUgPSBmaWxlbGlzdFtpdGVtXQotCQlzZWxmLm9wZW5zY3JpcHQoZmlsZW5hbWUpCi0JCi0JZGVmIGRvbWVudV9xdWl0KHNlbGYpOgotCQlzZWxmLl9xdWl0KCkKLQkKLQlkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgotCQlwcmludCAiU2F2ZSIKLQkKLQlkZWYgX3F1aXQoc2VsZik6Ci0JCWltcG9ydCBQeUNvbnNvbGUsIFB5RWRpdAotCQlmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3MudmFsdWVzKCk6Ci0JCQl0cnk6Ci0JCQkJcnYgPSB3aW5kb3cuY2xvc2UoKSAjIGlnbm9yZSBhbnkgZXJyb3JzIHdoaWxlIHF1aXR0aW5nCi0JCQlleGNlcHQ6Ci0JCQkJcnYgPSAwICAgIyAob3RoZXJ3aXNlLCB3ZSBjYW4gZ2V0IHN0dWNrISkKLQkJCWlmIHJ2IGFuZCBydiA+IDA6Ci0JCQkJcmV0dXJuCi0JCXRyeToKLQkJCVB5Q29uc29sZS5jb25zb2xlLndyaXRlcHJlZnMoKQotCQkJUHlDb25zb2xlLm91dHB1dC53cml0ZXByZWZzKCkKLQkJCVB5RWRpdC5zZWFyY2hlbmdpbmUud3JpdGVwcmVmcygpCi0JCWV4Y2VwdDoKLQkJCSMgV3JpdGUgdG8gX19zdGRlcnJfXyBzbyB0aGUgbXNnIGVuZCB1cCBpbiBDb25zb2xlLmFwcCBhbmQgaGFzCi0JCQkjIGF0IGxlYXN0IF9zb21lXyBjaGFuY2Ugb2YgZ2V0dGluZyByZWFkLi4uCi0JCQkjIEJ1dDogdGhpcyBpcyBhIHdvcmthcm91bmQgZm9yIHdheSBtb3JlIHNlcmlvdXMgcHJvYmxlbXMgd2l0aAotCQkJIyB0aGUgUHl0aG9uIDIuMiBKYWd1YXIgYWRkb24uCi0JCQlzeXMuX19zdGRlcnJfXy53cml0ZSgiKioqIFB5dGhvbklERTogQ2FuJ3Qgd3JpdGUgcHJlZmVyZW5jZXMgKioqXG4iKQotCQlzZWxmLnF1aXR0aW5nID0gMQotCQkKLQlkZWYgZG9tZW51X29wZW5wYWNrYWdlbWFuYWdlcihzZWxmKToKLQkJaW1wb3J0IFBhY2thZ2VNYW5hZ2VyCi0JCVBhY2thZ2VNYW5hZ2VyLlBhY2thZ2VCcm93c2VyKCkKLQkJCi0JZGVmIGRvbWVudV9nZW5zdWl0ZShzZWxmKToKLQkJaW1wb3J0IGdlbnN1aXRlbW9kdWxlCi0JCWdlbnN1aXRlbW9kdWxlLm1haW5faW50ZXJhY3RpdmUoKQotCQkKLQlkZWYgbWFrZWhlbHBtZW51KHNlbGYpOgotCQloYXNoZWxwLCBoYXNkb2NzID0gc2VsZi5pbnN0YWxsZG9jdW1lbnRhdGlvbigpCi0JCXNlbGYuaGVscG1lbnUgPSBtID0gc2VsZi5nZXRoZWxwbWVudSgpCi0JCWhlbHBpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJNYWNQeXRob24gSGVscCIsIE5vbmUsIHNlbGYuZG9tZW51X2xvY2FsaGVscCkKLQkJaGVscGl0ZW0uZW5hYmxlKGhhc2hlbHApCi0JCWRvY2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlB5dGhvbiBEb2N1bWVudGF0aW9uIiwgTm9uZSwgc2VsZi5kb21lbnVfbG9jYWxkb2NzKQotCQlkb2NpdGVtLmVuYWJsZShoYXNkb2NzKQotCQlmaW5kaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTG9va3VwIGluIFB5dGhvbiBEb2N1bWVudGF0aW9uIiwgTm9uZSwgJ2xvb2t1cHB5dGhvbicpCi0JCWZpbmRpdGVtLmVuYWJsZShoYXNkb2NzKQotCQlpZiBydW5uaW5nT25PU1goKToKLQkJCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJCWRvYzJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJBcHBsZSBEZXZlbG9wZXIgRG9jdW1lbnRhdGlvbiIsIE5vbmUsIHNlbGYuZG9tZW51X2FwcGxlZG9jcykKLQkJCWZpbmQyaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTG9va3VwIGluIENhcmJvbiBEb2N1bWVudGF0aW9uIiwgTm9uZSwgJ2xvb2t1cGNhcmJvbicpCi0JCUZyYW1lV29yay5TZXBhcmF0b3IobSkKLQkJd2ViaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUHl0aG9uIERvY3VtZW50YXRpb24gb24gdGhlIFdlYiIsIE5vbmUsIHNlbGYuZG9tZW51X3dlYmRvY3MpCi0JCXdlYjJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQeXRob24gb24gdGhlIFdlYiIsIE5vbmUsIHNlbGYuZG9tZW51X3dlYnB5dGhvbikKLQkJd2ViM2l0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk1hY1B5dGhvbiBvbiB0aGUgV2ViIiwgTm9uZSwgc2VsZi5kb21lbnVfd2VibWFjcHl0aG9uKQotCQkKLQlkZWYgZG9tZW51X2xvY2FsZG9jcyhzZWxmLCAqYXJncyk6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBBSAotCQlBSC5BSEdvdG9QYWdlKCJQeXRob24gRG9jdW1lbnRhdGlvbiIsIE5vbmUsIE5vbmUpCi0JCQotCWRlZiBkb21lbnVfbG9jYWxoZWxwKHNlbGYsICphcmdzKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCUFILkFIR290b1BhZ2UoIk1hY1B5dGhvbiBIZWxwIiwgTm9uZSwgTm9uZSkKLQkJCi0JZGVmIGRvbWVudV9hcHBsZWRvY3Moc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgsIEFwcGxlSGVscAotCQl0cnk6Ci0JCQlBSC5BSEdvdG9NYWluVE9DKEFwcGxlSGVscC5rQUhUT0NUeXBlRGV2ZWxvcGVyKQotCQlleGNlcHQgQUguRXJyb3IsIGFyZzoKLQkJCWlmIGFyZ1swXSA9PSAtNTA6Ci0JCQkJVy5NZXNzYWdlKCJEZXZlbG9wZXIgZG9jdW1lbnRhdGlvbiBub3QgaW5zdGFsbGVkIikKLQkJCWVsc2U6Ci0JCQkJVy5NZXNzYWdlKCJBcHBsZUhlbHAgRXJyb3I6ICVyIiAlIChhcmcsKSkKLQkJCi0JZGVmIGRvbWVudV9sb29rdXBweXRob24oc2VsZiwgKmFyZ3MpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgQUgKLQkJc2VhcmNoc3RyaW5nID0gc2VsZi5fZ2V0c2VhcmNoc3RyaW5nKCkKLQkJaWYgbm90IHNlYXJjaHN0cmluZzoKLQkJCXJldHVybgotCQl0cnk6Ci0JCQlBSC5BSFNlYXJjaCgiUHl0aG9uIERvY3VtZW50YXRpb24iLCBzZWFyY2hzdHJpbmcpCi0JCWV4Y2VwdCBBSC5FcnJvciwgYXJnOgotCQkJVy5NZXNzYWdlKCJBcHBsZUhlbHAgRXJyb3I6ICVyIiAlIChhcmcsKSkKLQkJCQotCWRlZiBkb21lbnVfbG9va3VwY2FyYm9uKHNlbGYsICphcmdzKToKLQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCXNlYXJjaHN0cmluZyA9IHNlbGYuX2dldHNlYXJjaHN0cmluZygpCi0JCWlmIG5vdCBzZWFyY2hzdHJpbmc6Ci0JCQlyZXR1cm4KLQkJdHJ5OgotCQkJQUguQUhTZWFyY2goIkNhcmJvbiIsIHNlYXJjaHN0cmluZykKLQkJZXhjZXB0IEFILkVycm9yLCBhcmc6Ci0JCQlXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQotCQkJCi0JZGVmIF9nZXRzZWFyY2hzdHJpbmcoc2VsZik6Ci0JCSMgRmlyc3Qgd2UgZ2V0IHRoZSBmcm9udG1vc3Qgd2luZG93Ci0JCWZyb250ID0gc2VsZi5nZXRmcm9udHdpbmRvdygpCi0JCWlmIGZyb250IGFuZCBoYXNhdHRyKGZyb250LCAnZ2V0c2VsZWN0ZWR0ZXh0Jyk6Ci0JCQl0ZXh0ID0gZnJvbnQuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJCWlmIHRleHQ6Ci0JCQkJcmV0dXJuIHRleHQKLQkJIyBUaGlzIGlzIGEgY29wLW91dC4gV2Ugc2hvdWxkIGhhdmUgZGlzYWJsZWQgdGhlIG1lbnVzCi0JCSMgaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBidXQgdGhlIGNhbl8gbWV0aG9kcyBvbmx5IHNlZW0KLQkJIyB0byB3b3JrIGZvciBXaW5kb3dzLiBPciBub3QgZm9yIHRoZSBIZWxwIG1lbnUsIG1heWJlPwotCQl0ZXh0ID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKCJTZWFyY2ggZG9jdW1lbnRhdGlvbiBmb3IiLCBvaz0iU2VhcmNoIikKLQkJcmV0dXJuIHRleHQKLQkJCi0JZGVmIGRvbWVudV93ZWJkb2NzKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IHdlYmJyb3dzZXIKLQkJbWFqb3IsIG1pbm9yLCBtaWNybywgc3RhdGUsIG5hbm8gPSBzeXMudmVyc2lvbl9pbmZvCi0JCWlmIHN0YXRlIGluICgnYWxwaGEnLCAnYmV0YScpOgotCQkJZG9jdmVyc2lvbiA9ICdkZXYvZG9jL2RldmVsJwotCQllbGlmIG1pY3JvID09IDA6Ci0JCQlkb2N2ZXJzaW9uID0gJ2RvYy8lZC4lZCcgJSAobWFqb3IsIG1pbm9yKQotCQllbHNlOgotCQkJZG9jdmVyc2lvbiA9ICdkb2MvJWQuJWQuJWQnICUgKG1ham9yLCBtaW5vciwgbWljcm8pCi0JCXdlYmJyb3dzZXIub3BlbigiaHR0cDovL3d3dy5weXRob24ub3JnLyVzIiAlIGRvY3ZlcnNpb24pCi0JCQotCWRlZiBkb21lbnVfd2VicHl0aG9uKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IHdlYmJyb3dzZXIKLQkJd2ViYnJvd3Nlci5vcGVuKCJodHRwOi8vd3d3LnB5dGhvbi5vcmcvIikKLQkJCi0JZGVmIGRvbWVudV93ZWJtYWNweXRob24oc2VsZiwgKmFyZ3MpOgotCQlpbXBvcnQgd2ViYnJvd3NlcgotCQl3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sIikKLQkJCi0JZGVmIGluc3RhbGxkb2N1bWVudGF0aW9uKHNlbGYpOgotCQkjIFRoaXMgaXMgcmF0aGVyIG11Y2ggb2YgYSBoYWNrLiBTb21lb25lIGhhcyB0byB0ZWxsIHRoZSBIZWxwIFZpZXdlcgotCQkjIGFib3V0IHRoZSBQeXRob24gZG9jdW1lbnRhdGlvbiwgc28gd2h5IG5vdCB1cy4gVGhlIGRvY3VtZW50YXRpb24KLQkJIyBpcyBsb2NhdGVkIGluIHRoZSBmcmFtZXdvcmssIGJ1dCB0aGVyZSdzIGEgc3ltbGluayBpbiBQeXRob24uYXBwLgotCQkjIEFuZCBhcyBBSFJlZ2lzdGVySGVscEJvb2sgd2FudHMgYSBidW5kbGUgKHdpdGggdGhlIHJpZ2h0IGJpdHMgaW4KLQkJIyB0aGUgcGxpc3QgZmlsZSkgd2UgcmVmZXIgaXQgdG8gUHl0aG9uLmFwcAotCQkjCi0JCSMgVG8gbWFrZSBtYXR0ZXJzIHdvcnNlIHdlIGhhdmUgdG8gbG9vayBpbiB0d28gcGxhY2VzOiBmaXJzdCBpbiB0aGUgSURFCi0JCSMgaXRzZWxmLCB0aGVuIGluIHRoZSBQeXRob24gYXBwbGljYXRpb24gaW5zaWRlIHRoZSBmcmFtZXdvcmsuCi0JCWhhc19oZWxwID0gRmFsc2UKLQkJaGFzX2RvYyA9IEZhbHNlCi0JCWlkZV9wYXRoX2NvbXBvbmVudHMgPSBzeXMuYXJndlswXS5zcGxpdCgiLyIpCi0JCWlmIGlkZV9wYXRoX2NvbXBvbmVudHNbLTM6XSA9PSBbIkNvbnRlbnRzIiwgIlJlc291cmNlcyIsICJQeXRob25JREUucHkiXToKLQkJCWlkZV9hcHAgPSAiLyIuam9pbihpZGVfcGF0aF9jb21wb25lbnRzWzotM10pCi0JCQloZWxwX3NvdXJjZSA9IG9zLnBhdGguam9pbihpZGVfYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbicpCi0JCQlkb2Nfc291cmNlID0gb3MucGF0aC5qb2luKGlkZV9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKLQkJCWhhc19oZWxwID0gb3MucGF0aC5pc2RpcihoZWxwX3NvdXJjZSkKLQkJCWhhc19kb2MgPSBvcy5wYXRoLmlzZGlyKGRvY19zb3VyY2UpCi0JCQlpZiBoYXNfaGVscCBvciBoYXNfZG9jOgotCQkJCXRyeToKLQkJCQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCQkJCUFILkFIUmVnaXN0ZXJIZWxwQm9vayhpZGVfYXBwKQotCQkJCWV4Y2VwdCAoSW1wb3J0RXJyb3IsIE1hY09TLkVycm9yKSwgYXJnOgotCQkJCQlwYXNzICMgVy5NZXNzYWdlKCJDYW5ub3QgcmVnaXN0ZXIgUHl0aG9uIERvY3VtZW50YXRpb246ICVzIiAlIHN0cihhcmcpKQotCQlweXRob25fYXBwID0gb3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdSZXNvdXJjZXMvUHl0aG9uLmFwcCcpCi0JCWlmIG5vdCBoYXNfaGVscDoKLQkJCWhlbHBfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9Eb2N1bWVudGF0aW9uJykKLQkJCWhhc19oZWxwID0gb3MucGF0aC5pc2RpcihoZWxwX3NvdXJjZSkKLQkJaWYgbm90IGhhc19kb2M6Ci0JCQlkb2Nfc291cmNlID0gb3MucGF0aC5qb2luKHB5dGhvbl9hcHAsICdDb250ZW50cy9SZXNvdXJjZXMvRW5nbGlzaC5scHJvai9QeXRob25Eb2N1bWVudGF0aW9uJykKLQkJCWhhc19kb2MgPSBvcy5wYXRoLmlzZGlyKGRvY19zb3VyY2UpCi0JCWlmIGhhc19oZWxwIG9yIGhhc19kb2M6Ci0JCQl0cnk6Ci0JCQkJZnJvbSBDYXJib24gaW1wb3J0IEFICi0JCQkJQUguQUhSZWdpc3RlckhlbHBCb29rKHB5dGhvbl9hcHApCi0JCQlleGNlcHQgKEltcG9ydEVycm9yLCBNYWNPUy5FcnJvciksIGFyZzoKLQkJCQlwYXNzICMgVy5NZXNzYWdlKCJDYW5ub3QgcmVnaXN0ZXIgUHl0aG9uIERvY3VtZW50YXRpb246ICVzIiAlIHN0cihhcmcpKQotCQlyZXR1cm4gaGFzX2hlbHAsIGhhc19kb2MKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgaWYgc3lzLnBsYXRmb3JtID09ICJkYXJ3aW4iOgorICAgICAgICAgICAgaWYgbGVuKHN5cy5hcmd2KSA+IDEgYW5kIHN5cy5hcmd2WzFdLnN0YXJ0c3dpdGgoIi1wc24iKToKKyAgICAgICAgICAgICAgICBob21lID0gb3MuZ2V0ZW52KCJIT01FIikKKyAgICAgICAgICAgICAgICBpZiBob21lOgorICAgICAgICAgICAgICAgICAgICBvcy5jaGRpcihob21lKQorICAgICAgICBzZWxmLnByZWZmaWxlcGF0aCA9IG9zLnBhdGguam9pbigiUHl0aG9uIiwgIlB5dGhvbklERSBwcmVmZXJlbmNlcyIpCisgICAgICAgIFdhcHBsaWNhdGlvbi5BcHBsaWNhdGlvbi5fX2luaXRfXyhzZWxmLCAnUGlkZScpCisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBRQorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgQXBwbGVFdmVudHMKKworICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVPcGVuQXBwbGljYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLmlnbm9yZWV2ZW50KQorICAgICAgICBBRS5BRUluc3RhbGxFdmVudEhhbmRsZXIoQXBwbGVFdmVudHMua0NvcmVFdmVudENsYXNzLCBBcHBsZUV2ZW50cy5rQUVSZW9wZW5BcHBsaWNhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuaWdub3JlZXZlbnQpCisgICAgICAgIEFFLkFFSW5zdGFsbEV2ZW50SGFuZGxlcihBcHBsZUV2ZW50cy5rQ29yZUV2ZW50Q2xhc3MsIEFwcGxlRXZlbnRzLmtBRVByaW50RG9jdW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5pZ25vcmVldmVudCkKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFT3BlbkRvY3VtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3BlbmRvY3NldmVudCkKKyAgICAgICAgQUUuQUVJbnN0YWxsRXZlbnRIYW5kbGVyKEFwcGxlRXZlbnRzLmtDb3JlRXZlbnRDbGFzcywgQXBwbGVFdmVudHMua0FFUXVpdEFwcGxpY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5xdWl0ZXZlbnQpCisgICAgICAgIGltcG9ydCBQeUNvbnNvbGUsIFB5RWRpdAorICAgICAgICBTcGxhc2gud2FpdCgpCisgICAgICAgICMgV2l0aCAtRCBvcHRpb24gKE9TWCBjb21tYW5kIGxpbmUgb25seSkga2VlcCBzdGRlcnIsIGZvciBkZWJ1Z2dpbmcgdGhlIElERQorICAgICAgICAjIGl0c2VsZi4KKyAgICAgICAgZGVidWdfc3RkZXJyID0gTm9uZQorICAgICAgICBpZiBsZW4oc3lzLmFyZ3YpID49IDIgYW5kIHN5cy5hcmd2WzFdID09ICctRCc6CisgICAgICAgICAgICBkZWJ1Z19zdGRlcnIgPSBzeXMuc3RkZXJyCisgICAgICAgICAgICBkZWwgc3lzLmFyZ3ZbMV0KKyAgICAgICAgUHlDb25zb2xlLmluc3RhbGxvdXRwdXQoKQorICAgICAgICBQeUNvbnNvbGUuaW5zdGFsbGNvbnNvbGUoKQorICAgICAgICBpZiBkZWJ1Z19zdGRlcnI6CisgICAgICAgICAgICBzeXMuc3RkZXJyID0gZGVidWdfc3RkZXJyCisgICAgICAgIGZvciBwYXRoIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgICAgIGlmIHBhdGguc3RhcnRzd2l0aCgiLXAiKToKKyAgICAgICAgICAgICAgICAjIHByb2Nlc3MgbnVtYmVyIGFkZGVkIGJ5IHRoZSBPUworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBzZWxmLm9wZW5kb2MocGF0aCkKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKKyAgICBkZWYgbWFrZXVzZXJtZW51cyhzZWxmKToKKyAgICAgICAgbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkZpbGUiKQorICAgICAgICBuZXdpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJOZXciLCAiTiIsICduZXcnKQorICAgICAgICBvcGVuaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiIrRUxMSVBTSVMsICJPIiwgJ29wZW4nKQorICAgICAgICBvcGVuYnluYW1laXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiT3BlbiBGaWxlIGJ5IE5hbWUiK0VMTElQU0lTLCAiRCIsICdvcGVuYnluYW1lJykKKyAgICAgICAgc2VsZi5vcGVucmVjZW50bWVudSA9IEZyYW1lV29yay5TdWJNZW51KG0sICJPcGVuIFJlY2VudCIpCisgICAgICAgIHNlbGYubWFrZW9wZW5yZWNlbnRtZW51KCkKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBjbG9zZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkNsb3NlIiwgIlciLCAnY2xvc2UnKQorICAgICAgICBzYXZlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiU2F2ZSIsICJTIiwgJ3NhdmUnKQorICAgICAgICBzYXZlYXNpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTYXZlIGFzIitFTExJUFNJUywgTm9uZSwgJ3NhdmVfYXMnKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIHNhdmVhc2FwcGxldGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNhdmUgYXMgQXBwbGV0IitFTExJUFNJUywgTm9uZSwgJ3NhdmVfYXNfYXBwbGV0JykKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBpbnN0bWdyaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFja2FnZSBNYW5hZ2VyIiwgTm9uZSwgJ29wZW5wYWNrYWdlbWFuYWdlcicpCisgICAgICAgIGdlbnN1aXRlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiR2VuZXJhdGUgT1NBIFN1aXRlLi4uIiwgTm9uZSwgJ2dlbnN1aXRlJykKKyAgICAgICAgaWYgbm90IHJ1bm5pbmdPbk9TWCgpOgorICAgICAgICAgICAgIyBPbiBPU1ggdGhlcmUncyBhIHNwZWNpYWwgIm1hZ2ljIiBxdWl0IG1lbnUsIHNvIHdlIHNob3VsZG4ndCBhZGQKKyAgICAgICAgICAgICMgaXQgdG8gdGhlIEZpbGUgbWVudS4KKyAgICAgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgICAgIHF1aXRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJRdWl0IiwgIlEiLCAncXVpdCcpCisKKyAgICAgICAgbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIkVkaXQiKQorICAgICAgICB1bmRvaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiVW5kbyIsICdaJywgInVuZG8iKQorICAgICAgICBGcmFtZVdvcmsuU2VwYXJhdG9yKG0pCisgICAgICAgIGN1dGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkN1dCIsICdYJywgImN1dCIpCisgICAgICAgIGNvcHlpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJDb3B5IiwgIkMiLCAiY29weSIpCisgICAgICAgIHBhc3RlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUGFzdGUiLCAiViIsICJwYXN0ZSIpCisgICAgICAgIEZyYW1lV29yay5NZW51SXRlbShtLCAiQ2xlYXIiLCBOb25lLCAgImNsZWFyIikKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBzZWxhbGxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTZWxlY3QgYWxsIiwgIkEiLCAic2VsZWN0YWxsIikKKyAgICAgICAgc2VsbGluZWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNlbGVjdCBsaW5lIiwgIkwiLCAic2VsZWN0bGluZSIpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgZmluZGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkZpbmQiK0VMTElQU0lTLCAiRiIsICJmaW5kIikKKyAgICAgICAgZmluZGFnYWluaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiRmluZCBhZ2FpbiIsICdHJywgImZpbmRuZXh0IikKKyAgICAgICAgZW50ZXJzZWxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJFbnRlciBzZWFyY2ggc3RyaW5nIiwgIkUiLCAiZW50ZXJzZWFyY2hzdHJpbmciKQorICAgICAgICByZXBsYWNlaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUmVwbGFjZSIsIE5vbmUsICJyZXBsYWNlIikKKyAgICAgICAgcmVwbGFjZWZpbmRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSZXBsYWNlICYgZmluZCBhZ2FpbiIsICdUJywgInJlcGxhY2VmaW5kIikKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICBzaGlmdGxlZnRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJTaGlmdCBsZWZ0IiwgIlsiLCAic2hpZnRsZWZ0IikKKyAgICAgICAgc2hpZnRyaWdodGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlNoaWZ0IHJpZ2h0IiwgIl0iLCAic2hpZnRyaWdodCIpCisKKyAgICAgICAgbSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYubWVudWJhciwgIlB5dGhvbiIpCisgICAgICAgIHJ1bml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlJ1biB3aW5kb3ciLCAiUiIsICdydW4nKQorICAgICAgICBydW5zZWxpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJSdW4gc2VsZWN0aW9uIiwgTm9uZSwgJ3J1bnNlbGVjdGlvbicpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgbW9kaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTW9kdWxlIGJyb3dzZXIiK0VMTElQU0lTLCAiTSIsIHNlbGYuZG9tZW51X21vZHVsZWJyb3dzZXIpCisgICAgICAgIEZyYW1lV29yay5TZXBhcmF0b3IobSkKKyAgICAgICAgbW0gPSBGcmFtZVdvcmsuU3ViTWVudShtLCAiUHJlZmVyZW5jZXMiKQorICAgICAgICBGcmFtZVdvcmsuTWVudUl0ZW0obW0sICJTZXQgU2NyaXB0cyBmb2xkZXIiK0VMTElQU0lTLCBOb25lLCBzZWxmLmRvX3NldHNjcmlwdHNmb2xkZXIpCisgICAgICAgIEZyYW1lV29yay5NZW51SXRlbShtbSwgIkVkaXRvciBkZWZhdWx0IHNldHRpbmdzIitFTExJUFNJUywgTm9uZSwgc2VsZi5kb19lZGl0b3JwcmVmcykKKyAgICAgICAgRnJhbWVXb3JrLk1lbnVJdGVtKG1tLCAiU2V0IGRlZmF1bHQgd2luZG93IGZvbnQiK0VMTElQU0lTLCBOb25lLCBzZWxmLmRvX3NldHdpbmRvd2ZvbnQpCisKKyAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLm1lbnViYXIsICdXaW5kb3dzJykKKyAgICAgICAgc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKKyAgICAgICAgc2VsZi5fbWVudXN0b2NoZWNrID0gW2Nsb3NlaXRlbSwgc2F2ZWl0ZW0sIHNhdmVhc2l0ZW0sIHNhdmVhc2FwcGxldGl0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICB1bmRvaXRlbSwgY3V0aXRlbSwgY29weWl0ZW0sIHBhc3RlaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGFsbGl0ZW0sIHNlbGxpbmVpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgZmluZGl0ZW0sIGZpbmRhZ2Fpbml0ZW0sIGVudGVyc2VsaXRlbSwgcmVwbGFjZWl0ZW0sIHJlcGxhY2VmaW5kaXRlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHNoaWZ0bGVmdGl0ZW0sIHNoaWZ0cmlnaHRpdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgcnVuaXRlbSwgcnVuc2VsaXRlbV0KKworICAgICAgICBwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBmc3IsIGQgPSBGaWxlLkFsaWFzKHJhd2RhdGE9cHJlZnMuc2NyaXB0c2ZvbGRlcikuRlNSZXNvbHZlQWxpYXMoTm9uZSkKKyAgICAgICAgICAgIHNlbGYuc2NyaXB0c2ZvbGRlciA9IGZzci5GU05ld0FsaWFzTWluaW1hbCgpCisgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4ob3MuZ2V0Y3dkKCksICJNYWMiLCAiSURFIHNjcmlwdHMiKQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAiZGFyd2luIjoKKyAgICAgICAgICAgICAgICAgICAgcGF0aCA9IG9zLnBhdGguam9pbihvcy5nZXRlbnYoIkhPTUUiKSwgIkxpYnJhcnkiLCAiUHl0aG9uIiwgIklERS1TY3JpcHRzIikKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBwYXRoID0gb3MucGF0aC5qb2luKG9zLmdldGN3ZCgpLCAiU2NyaXB0cyIpCisgICAgICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgorICAgICAgICAgICAgICAgICAgICBvcy5tYWtlZGlycyhwYXRoKQorICAgICAgICAgICAgICAgICAgICBmID0gb3Blbihvcy5wYXRoLmpvaW4ocGF0aCwgIlBsYWNlIHlvdXIgc2NyaXB0cyBoZXJlIitFTExJUFNJUyksICJ3IikKKyAgICAgICAgICAgICAgICAgICAgZi5jbG9zZSgpCisgICAgICAgICAgICBmc3IgPSBGaWxlLkZTUmVmKHBhdGgpCisgICAgICAgICAgICBzZWxmLnNjcmlwdHNmb2xkZXIgPSBmc3IuRlNOZXdBbGlhc01pbmltYWwoKQorICAgICAgICAgICAgc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA9IGdldG1vZHRpbWUoZnNyKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA9IGdldG1vZHRpbWUoZnNyKQorICAgICAgICBwcmVmcy5zY3JpcHRzZm9sZGVyID0gc2VsZi5zY3JpcHRzZm9sZGVyLmRhdGEKKyAgICAgICAgc2VsZi5fc2NyaXB0cyA9IHt9CisgICAgICAgIHNlbGYuc2NyaXB0c21lbnUgPSBOb25lCisgICAgICAgIHNlbGYubWFrZXNjcmlwdHNtZW51KCkKKyAgICAgICAgc2VsZi5tYWtlaGVscG1lbnUoKQorCisgICAgZGVmIHF1aXRldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6CisgICAgICAgIHNlbGYuX3F1aXQoKQorCisgICAgZGVmIHN1c3BlbmRyZXN1bWUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIGZzciwgY2hhbmdlZCA9IHNlbGYuc2NyaXB0c2ZvbGRlci5GU1Jlc29sdmVBbGlhcyhOb25lKQorICAgICAgICAgICAgbW9kdGltZSA9IGdldG1vZHRpbWUoZnNyKQorICAgICAgICAgICAgaWYgc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA8PiBtb2R0aW1lIG9yIGNoYW5nZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5zY3JpcHRzZm9sZGVybW9kdGltZSA9IG1vZHRpbWUKKyAgICAgICAgICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICAgICAgICAgIHNlbGYubWFrZXNjcmlwdHNtZW51KCkKKworICAgIGRlZiBpZ25vcmVldmVudChzZWxmLCB0aGVBcHBsZUV2ZW50LCB0aGVSZXBseSk6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBvcGVuZG9jc2V2ZW50KHNlbGYsIHRoZUFwcGxlRXZlbnQsIHRoZVJlcGx5KToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgaW1wb3J0IGFldG9vbHMKKyAgICAgICAgcGFyYW1ldGVycywgYXJncyA9IGFldG9vbHMudW5wYWNrZXZlbnQodGhlQXBwbGVFdmVudCkKKyAgICAgICAgZG9jcyA9IHBhcmFtZXRlcnNbJy0tLS0nXQorICAgICAgICBpZiB0eXBlKGRvY3MpIDw+IHR5cGUoW10pOgorICAgICAgICAgICAgZG9jcyA9IFtkb2NzXQorICAgICAgICBmb3IgZG9jIGluIGRvY3M6CisgICAgICAgICAgICBmc3IsIGEgPSBkb2MuRlNSZXNvbHZlQWxpYXMoTm9uZSkKKyAgICAgICAgICAgIHBhdGggPSBmc3IuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgc2VsZi5vcGVuZG9jKHBhdGgpCisKKyAgICBkZWYgb3BlbmRvYyhzZWxmLCBwYXRoKToKKyAgICAgICAgZmNyZWF0b3IsIGZ0eXBlID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUocGF0aCkKKyAgICAgICAgaWYgZnR5cGUgPT0gJ1RFWFQnOgorICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KHBhdGgpCisgICAgICAgIGVsaWYgZnR5cGUgPT0gJ1wwXDBcMFwwJyBhbmQgcGF0aFstMzpdID09ICcucHknOgorICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBXLk1lc3NhZ2UoIkNhbid0IG9wZW4gZmlsZSBvZiB0eXBlICclcycuIiAlIGZ0eXBlKQorCisgICAgZGVmIGdldGFib3V0dGV4dChzZWxmKToKKyAgICAgICAgcmV0dXJuICJBYm91dCBQeXRob24gSURFIitFTExJUFNJUworCisgICAgZGVmIGRvX2Fib3V0KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgU3BsYXNoLmFib3V0KCkKKworICAgIGRlZiBkb19zZXRzY3JpcHRzZm9sZGVyKHNlbGYsICphcmdzKToKKyAgICAgICAgZnNyID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9IlNlbGVjdCBTY3JpcHRzIEZvbGRlciIsCisgICAgICAgICAgICAgICAgd2FudGVkPUZpbGUuRlNSZWYpCisgICAgICAgIGlmIGZzcjoKKyAgICAgICAgICAgIHByZWZzID0gc2VsZi5nZXRwcmVmcygpCisgICAgICAgICAgICBhbGlzID0gZnNyLkZTTmV3QWxpYXNNaW5pbWFsKCkKKyAgICAgICAgICAgIHByZWZzLnNjcmlwdHNmb2xkZXIgPSBhbGlzLmRhdGEKKyAgICAgICAgICAgIHNlbGYuc2NyaXB0c2ZvbGRlciA9IGFsaXMKKyAgICAgICAgICAgIHNlbGYubWFrZXNjcmlwdHNtZW51KCkKKyAgICAgICAgICAgIHByZWZzLnNhdmUoKQorCisgICAgZGVmIGRvbWVudV9tb2R1bGVicm93c2VyKHNlbGYsICphcmdzKToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgaW1wb3J0IE1vZHVsZUJyb3dzZXIKKyAgICAgICAgTW9kdWxlQnJvd3Nlci5Nb2R1bGVCcm93c2VyKCkKKworICAgIGRlZiBkb21lbnVfb3BlbihzZWxmLCAqYXJncyk6CisgICAgICAgIGZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4odHlwZUxpc3Q9KCJURVhUIiwpKQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYub3BlbnNjcmlwdChmaWxlbmFtZSkKKworICAgIGRlZiBkb21lbnVfb3BlbmJ5bmFtZShzZWxmLCAqYXJncyk6CisgICAgICAgICMgT3BlbiBhIGZpbGUgYnkgbmFtZS4gSWYgdGhlIGNsaXBib2FyZCBjb250YWlucyBhIGZpbGVuYW1lCisgICAgICAgICMgdXNlIHRoYXQgYXMgdGhlIGRlZmF1bHQuCisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBTY3JhcAorICAgICAgICB0cnk6CisgICAgICAgICAgICBzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCisgICAgICAgICAgICBkZnQgPSBzYy5HZXRTY3JhcEZsYXZvckRhdGEoIlRFWFQiKQorICAgICAgICBleGNlcHQgU2NyYXAuRXJyb3I6CisgICAgICAgICAgICBkZnQgPSAiIgorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGRmdCk6CisgICAgICAgICAgICAgICAgZGZ0ID0gIiIKKyAgICAgICAgZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tTdHJpbmcoIk9wZW4gRmlsZSBOYW1lZDoiLCBkZWZhdWx0PWRmdCwgb2s9Ik9wZW4iKQorICAgICAgICBpZiBmaWxlbmFtZToKKyAgICAgICAgICAgIHNlbGYub3BlbnNjcmlwdChmaWxlbmFtZSkKKworICAgIGRlZiBkb21lbnVfbmV3KHNlbGYsICphcmdzKToKKyAgICAgICAgVy5TZXRDdXJzb3IoJ3dhdGNoJykKKyAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICByZXR1cm4gUHlFZGl0LkVkaXRvcigpCisKKyAgICBkZWYgbWFrZXNjcmlwdHNtZW51KHNlbGYpOgorICAgICAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpZiBzZWxmLl9zY3JpcHRzOgorICAgICAgICAgICAgZm9yIGlkLCBpdGVtIGluIHNlbGYuX3NjcmlwdHMua2V5cygpOgorICAgICAgICAgICAgICAgIGlmIHNlbGYubWVudWJhci5tZW51cy5oYXNfa2V5KGlkKToKKyAgICAgICAgICAgICAgICAgICAgbSA9IHNlbGYubWVudWJhci5tZW51c1tpZF0KKyAgICAgICAgICAgICAgICAgICAgbS5kZWxldGUoKQorICAgICAgICAgICAgc2VsZi5fc2NyaXB0cyA9IHt9CisgICAgICAgIGlmIHNlbGYuc2NyaXB0c21lbnU6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYuc2NyaXB0c21lbnUsICdpZCcpIGFuZCBzZWxmLm1lbnViYXIubWVudXMuaGFzX2tleShzZWxmLnNjcmlwdHNtZW51LmlkKToKKyAgICAgICAgICAgICAgICBzZWxmLnNjcmlwdHNtZW51LmRlbGV0ZSgpCisgICAgICAgIHNlbGYuc2NyaXB0c21lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLm1lbnViYXIsICJTY3JpcHRzIikKKyAgICAgICAgI0ZyYW1lV29yay5NZW51SXRlbShzZWxmLnNjcmlwdHNtZW51LCAiTmV3IHNjcmlwdCIsIE5vbmUsIHNlbGYuZG9tZW51X25ldykKKyAgICAgICAgI3NlbGYuc2NyaXB0c21lbnUuYWRkc2VwYXJhdG9yKCkKKyAgICAgICAgZnNyLCBkMSA9IHNlbGYuc2NyaXB0c2ZvbGRlci5GU1Jlc29sdmVBbGlhcyhOb25lKQorICAgICAgICBzZWxmLnNjcmlwdHN3YWxrKGZzci5hc19wYXRobmFtZSgpLCBzZWxmLnNjcmlwdHNtZW51KQorCisgICAgZGVmIG1ha2VvcGVud2luZG93c21lbnUoc2VsZik6CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLm9wZW53aW5kb3dzbWVudS5pdGVtcykpOgorICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUubWVudS5EZWxldGVNZW51SXRlbSgxKQorICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUuaXRlbXMgPSBbXQorICAgICAgICB3aW5kb3dzID0gW10KKyAgICAgICAgc2VsZi5fb3BlbndpbmRvd3MgPSB7fQorICAgICAgICBmb3Igd2luZG93IGluIHNlbGYuX3dpbmRvd3Mua2V5cygpOgorICAgICAgICAgICAgdGl0bGUgPSB3aW5kb3cuR2V0V1RpdGxlKCkKKyAgICAgICAgICAgIGlmIG5vdCB0aXRsZToKKyAgICAgICAgICAgICAgICB0aXRsZSA9ICI8bm8gdGl0bGU+IgorICAgICAgICAgICAgd2luZG93cy5hcHBlbmQoKHRpdGxlLCB3aW5kb3cpKQorICAgICAgICB3aW5kb3dzLnNvcnQoKQorICAgICAgICBmb3IgdGl0bGUsIHdpbmRvdyBpbiB3aW5kb3dzOgorICAgICAgICAgICAgaWYgdGl0bGUgPT0gIlB5dGhvbiBJbnRlcmFjdGl2ZSI6ICAgICAgICMgdWdseSBidXQgdXNlZnVsIGhhY2sgYnkgSm9lIFN0cm91dAorICAgICAgICAgICAgICAgIHNob3J0Y3V0ID0gJzAnCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNob3J0Y3V0ID0gTm9uZQorICAgICAgICAgICAgaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShzZWxmLm9wZW53aW5kb3dzbWVudSwgdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjayA9IHNlbGYuZG9tZW51X29wZW53aW5kb3dzKQorICAgICAgICAgICAgc2VsZi5fb3BlbndpbmRvd3NbaXRlbS5pdGVtXSA9IHdpbmRvdworICAgICAgICBzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IDAKKyAgICAgICAgc2VsZi5jaGVja29wZW53aW5kb3dzbWVudSgpCisKKyAgICBkZWYgbWFrZW9wZW5yZWNlbnRtZW51KHNlbGYpOgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5vcGVucmVjZW50bWVudS5pdGVtcykpOgorICAgICAgICAgICAgc2VsZi5vcGVucmVjZW50bWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKDEpCisgICAgICAgICAgICBzZWxmLm9wZW5yZWNlbnRtZW51Lml0ZW1zID0gW10KKyAgICAgICAgcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKKyAgICAgICAgZmlsZWxpc3QgPSBwcmVmcy5yZWNlbnRmaWxlcworICAgICAgICBpZiBub3QgZmlsZWxpc3Q6CisgICAgICAgICAgICBzZWxmLm9wZW5yZWNlbnRtZW51LmVuYWJsZSgwKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYub3BlbnJlY2VudG1lbnUuZW5hYmxlKDEpCisgICAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbGlzdDoKKyAgICAgICAgICAgIGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0oc2VsZi5vcGVucmVjZW50bWVudSwgZmlsZW5hbWUsIE5vbmUsIGNhbGxiYWNrID0gc2VsZi5kb21lbnVfb3BlbnJlY2VudCkKKworICAgIGRlZiBhZGRyZWNlbnRmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBwcmVmcyA9IHNlbGYuZ2V0cHJlZnMoKQorICAgICAgICBmaWxlbGlzdCA9IHByZWZzLnJlY2VudGZpbGVzCisgICAgICAgIGlmIG5vdCBmaWxlbGlzdDoKKyAgICAgICAgICAgIGZpbGVsaXN0ID0gW10KKworICAgICAgICBpZiBmaWxlIGluIGZpbGVsaXN0OgorICAgICAgICAgICAgaWYgZmlsZSA9PSBmaWxlbGlzdFswXToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGZpbGVsaXN0LnJlbW92ZShmaWxlKQorICAgICAgICBmaWxlbGlzdC5pbnNlcnQoMCwgZmlsZSkKKyAgICAgICAgZmlsZWxpc3QgPSBmaWxlbGlzdFs6MTBdCisgICAgICAgIHByZWZzLnJlY2VudGZpbGVzID0gZmlsZWxpc3QKKyAgICAgICAgcHJlZnMuc2F2ZSgpCisgICAgICAgIHNlbGYubWFrZW9wZW5yZWNlbnRtZW51KCkKKworICAgIGRlZiBkb21lbnVfb3BlbndpbmRvd3Moc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB3ID0gc2VsZi5fb3BlbndpbmRvd3NbaXRlbV0KKyAgICAgICAgdy5TaG93V2luZG93KCkKKyAgICAgICAgdy5TZWxlY3RXaW5kb3coKQorCisgICAgZGVmIGRvbWVudV9vcGVucmVjZW50KHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKKyAgICAgICAgcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKKyAgICAgICAgZmlsZWxpc3QgPSBwcmVmcy5yZWNlbnRmaWxlcworICAgICAgICBpZiBub3QgZmlsZWxpc3Q6CisgICAgICAgICAgICBmaWxlbGlzdCA9IFtdCisgICAgICAgIGl0ZW0gPSBpdGVtIC0gMQorICAgICAgICBmaWxlbmFtZSA9IGZpbGVsaXN0W2l0ZW1dCisgICAgICAgIHNlbGYub3BlbnNjcmlwdChmaWxlbmFtZSkKKworICAgIGRlZiBkb21lbnVfcXVpdChzZWxmKToKKyAgICAgICAgc2VsZi5fcXVpdCgpCisKKyAgICBkZWYgZG9tZW51X3NhdmUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwcmludCAiU2F2ZSIKKworICAgIGRlZiBfcXVpdChzZWxmKToKKyAgICAgICAgaW1wb3J0IFB5Q29uc29sZSwgUHlFZGl0CisgICAgICAgIGZvciB3aW5kb3cgaW4gc2VsZi5fd2luZG93cy52YWx1ZXMoKToKKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBydiA9IHdpbmRvdy5jbG9zZSgpICMgaWdub3JlIGFueSBlcnJvcnMgd2hpbGUgcXVpdHRpbmcKKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBydiA9IDAgICAjIChvdGhlcndpc2UsIHdlIGNhbiBnZXQgc3R1Y2shKQorICAgICAgICAgICAgaWYgcnYgYW5kIHJ2ID4gMDoKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgUHlDb25zb2xlLmNvbnNvbGUud3JpdGVwcmVmcygpCisgICAgICAgICAgICBQeUNvbnNvbGUub3V0cHV0LndyaXRlcHJlZnMoKQorICAgICAgICAgICAgUHlFZGl0LnNlYXJjaGVuZ2luZS53cml0ZXByZWZzKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgIyBXcml0ZSB0byBfX3N0ZGVycl9fIHNvIHRoZSBtc2cgZW5kIHVwIGluIENvbnNvbGUuYXBwIGFuZCBoYXMKKyAgICAgICAgICAgICMgYXQgbGVhc3QgX3NvbWVfIGNoYW5jZSBvZiBnZXR0aW5nIHJlYWQuLi4KKyAgICAgICAgICAgICMgQnV0OiB0aGlzIGlzIGEgd29ya2Fyb3VuZCBmb3Igd2F5IG1vcmUgc2VyaW91cyBwcm9ibGVtcyB3aXRoCisgICAgICAgICAgICAjIHRoZSBQeXRob24gMi4yIEphZ3VhciBhZGRvbi4KKyAgICAgICAgICAgIHN5cy5fX3N0ZGVycl9fLndyaXRlKCIqKiogUHl0aG9uSURFOiBDYW4ndCB3cml0ZSBwcmVmZXJlbmNlcyAqKipcbiIpCisgICAgICAgIHNlbGYucXVpdHRpbmcgPSAxCisKKyAgICBkZWYgZG9tZW51X29wZW5wYWNrYWdlbWFuYWdlcihzZWxmKToKKyAgICAgICAgaW1wb3J0IFBhY2thZ2VNYW5hZ2VyCisgICAgICAgIFBhY2thZ2VNYW5hZ2VyLlBhY2thZ2VCcm93c2VyKCkKKworICAgIGRlZiBkb21lbnVfZ2Vuc3VpdGUoc2VsZik6CisgICAgICAgIGltcG9ydCBnZW5zdWl0ZW1vZHVsZQorICAgICAgICBnZW5zdWl0ZW1vZHVsZS5tYWluX2ludGVyYWN0aXZlKCkKKworICAgIGRlZiBtYWtlaGVscG1lbnUoc2VsZik6CisgICAgICAgIGhhc2hlbHAsIGhhc2RvY3MgPSBzZWxmLmluc3RhbGxkb2N1bWVudGF0aW9uKCkKKyAgICAgICAgc2VsZi5oZWxwbWVudSA9IG0gPSBzZWxmLmdldGhlbHBtZW51KCkKKyAgICAgICAgaGVscGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIk1hY1B5dGhvbiBIZWxwIiwgTm9uZSwgc2VsZi5kb21lbnVfbG9jYWxoZWxwKQorICAgICAgICBoZWxwaXRlbS5lbmFibGUoaGFzaGVscCkKKyAgICAgICAgZG9jaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiUHl0aG9uIERvY3VtZW50YXRpb24iLCBOb25lLCBzZWxmLmRvbWVudV9sb2NhbGRvY3MpCisgICAgICAgIGRvY2l0ZW0uZW5hYmxlKGhhc2RvY3MpCisgICAgICAgIGZpbmRpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJMb29rdXAgaW4gUHl0aG9uIERvY3VtZW50YXRpb24iLCBOb25lLCAnbG9va3VwcHl0aG9uJykKKyAgICAgICAgZmluZGl0ZW0uZW5hYmxlKGhhc2RvY3MpCisgICAgICAgIGlmIHJ1bm5pbmdPbk9TWCgpOgorICAgICAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICAgICAgZG9jMml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIkFwcGxlIERldmVsb3BlciBEb2N1bWVudGF0aW9uIiwgTm9uZSwgc2VsZi5kb21lbnVfYXBwbGVkb2NzKQorICAgICAgICAgICAgZmluZDJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJMb29rdXAgaW4gQ2FyYm9uIERvY3VtZW50YXRpb24iLCBOb25lLCAnbG9va3VwY2FyYm9uJykKKyAgICAgICAgRnJhbWVXb3JrLlNlcGFyYXRvcihtKQorICAgICAgICB3ZWJpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG0sICJQeXRob24gRG9jdW1lbnRhdGlvbiBvbiB0aGUgV2ViIiwgTm9uZSwgc2VsZi5kb21lbnVfd2ViZG9jcykKKyAgICAgICAgd2ViMml0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obSwgIlB5dGhvbiBvbiB0aGUgV2ViIiwgTm9uZSwgc2VsZi5kb21lbnVfd2VicHl0aG9uKQorICAgICAgICB3ZWIzaXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtLCAiTWFjUHl0aG9uIG9uIHRoZSBXZWIiLCBOb25lLCBzZWxmLmRvbWVudV93ZWJtYWNweXRob24pCisKKyAgICBkZWYgZG9tZW51X2xvY2FsZG9jcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICBBSC5BSEdvdG9QYWdlKCJQeXRob24gRG9jdW1lbnRhdGlvbiIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X2xvY2FsaGVscChzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICBBSC5BSEdvdG9QYWdlKCJNYWNQeXRob24gSGVscCIsIE5vbmUsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X2FwcGxlZG9jcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSCwgQXBwbGVIZWxwCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIEFILkFIR290b01haW5UT0MoQXBwbGVIZWxwLmtBSFRPQ1R5cGVEZXZlbG9wZXIpCisgICAgICAgIGV4Y2VwdCBBSC5FcnJvciwgYXJnOgorICAgICAgICAgICAgaWYgYXJnWzBdID09IC01MDoKKyAgICAgICAgICAgICAgICBXLk1lc3NhZ2UoIkRldmVsb3BlciBkb2N1bWVudGF0aW9uIG5vdCBpbnN0YWxsZWQiKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQorCisgICAgZGVmIGRvbWVudV9sb29rdXBweXRob24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgQUgKKyAgICAgICAgc2VhcmNoc3RyaW5nID0gc2VsZi5fZ2V0c2VhcmNoc3RyaW5nKCkKKyAgICAgICAgaWYgbm90IHNlYXJjaHN0cmluZzoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cnk6CisgICAgICAgICAgICBBSC5BSFNlYXJjaCgiUHl0aG9uIERvY3VtZW50YXRpb24iLCBzZWFyY2hzdHJpbmcpCisgICAgICAgIGV4Y2VwdCBBSC5FcnJvciwgYXJnOgorICAgICAgICAgICAgVy5NZXNzYWdlKCJBcHBsZUhlbHAgRXJyb3I6ICVyIiAlIChhcmcsKSkKKworICAgIGRlZiBkb21lbnVfbG9va3VwY2FyYm9uKHNlbGYsICphcmdzKToKKyAgICAgICAgZnJvbSBDYXJib24gaW1wb3J0IEFICisgICAgICAgIHNlYXJjaHN0cmluZyA9IHNlbGYuX2dldHNlYXJjaHN0cmluZygpCisgICAgICAgIGlmIG5vdCBzZWFyY2hzdHJpbmc6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgQUguQUhTZWFyY2goIkNhcmJvbiIsIHNlYXJjaHN0cmluZykKKyAgICAgICAgZXhjZXB0IEFILkVycm9yLCBhcmc6CisgICAgICAgICAgICBXLk1lc3NhZ2UoIkFwcGxlSGVscCBFcnJvcjogJXIiICUgKGFyZywpKQorCisgICAgZGVmIF9nZXRzZWFyY2hzdHJpbmcoc2VsZik6CisgICAgICAgICMgRmlyc3Qgd2UgZ2V0IHRoZSBmcm9udG1vc3Qgd2luZG93CisgICAgICAgIGZyb250ID0gc2VsZi5nZXRmcm9udHdpbmRvdygpCisgICAgICAgIGlmIGZyb250IGFuZCBoYXNhdHRyKGZyb250LCAnZ2V0c2VsZWN0ZWR0ZXh0Jyk6CisgICAgICAgICAgICB0ZXh0ID0gZnJvbnQuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgICAgIGlmIHRleHQ6CisgICAgICAgICAgICAgICAgcmV0dXJuIHRleHQKKyAgICAgICAgIyBUaGlzIGlzIGEgY29wLW91dC4gV2Ugc2hvdWxkIGhhdmUgZGlzYWJsZWQgdGhlIG1lbnVzCisgICAgICAgICMgaWYgdGhlcmUgaXMgbm8gc2VsZWN0aW9uLCBidXQgdGhlIGNhbl8gbWV0aG9kcyBvbmx5IHNlZW0KKyAgICAgICAgIyB0byB3b3JrIGZvciBXaW5kb3dzLiBPciBub3QgZm9yIHRoZSBIZWxwIG1lbnUsIG1heWJlPworICAgICAgICB0ZXh0ID0gRWFzeURpYWxvZ3MuQXNrU3RyaW5nKCJTZWFyY2ggZG9jdW1lbnRhdGlvbiBmb3IiLCBvaz0iU2VhcmNoIikKKyAgICAgICAgcmV0dXJuIHRleHQKKworICAgIGRlZiBkb21lbnVfd2ViZG9jcyhzZWxmLCAqYXJncyk6CisgICAgICAgIGltcG9ydCB3ZWJicm93c2VyCisgICAgICAgIG1ham9yLCBtaW5vciwgbWljcm8sIHN0YXRlLCBuYW5vID0gc3lzLnZlcnNpb25faW5mbworICAgICAgICBpZiBzdGF0ZSBpbiAoJ2FscGhhJywgJ2JldGEnKToKKyAgICAgICAgICAgIGRvY3ZlcnNpb24gPSAnZGV2L2RvYy9kZXZlbCcKKyAgICAgICAgZWxpZiBtaWNybyA9PSAwOgorICAgICAgICAgICAgZG9jdmVyc2lvbiA9ICdkb2MvJWQuJWQnICUgKG1ham9yLCBtaW5vcikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRvY3ZlcnNpb24gPSAnZG9jLyVkLiVkLiVkJyAlIChtYWpvciwgbWlub3IsIG1pY3JvKQorICAgICAgICB3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8lcyIgJSBkb2N2ZXJzaW9uKQorCisgICAgZGVmIGRvbWVudV93ZWJweXRob24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgICAgICB3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly93d3cucHl0aG9uLm9yZy8iKQorCisgICAgZGVmIGRvbWVudV93ZWJtYWNweXRob24oc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgd2ViYnJvd3NlcgorICAgICAgICB3ZWJicm93c2VyLm9wZW4oImh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sIikKKworICAgIGRlZiBpbnN0YWxsZG9jdW1lbnRhdGlvbihzZWxmKToKKyAgICAgICAgIyBUaGlzIGlzIHJhdGhlciBtdWNoIG9mIGEgaGFjay4gU29tZW9uZSBoYXMgdG8gdGVsbCB0aGUgSGVscCBWaWV3ZXIKKyAgICAgICAgIyBhYm91dCB0aGUgUHl0aG9uIGRvY3VtZW50YXRpb24sIHNvIHdoeSBub3QgdXMuIFRoZSBkb2N1bWVudGF0aW9uCisgICAgICAgICMgaXMgbG9jYXRlZCBpbiB0aGUgZnJhbWV3b3JrLCBidXQgdGhlcmUncyBhIHN5bWxpbmsgaW4gUHl0aG9uLmFwcC4KKyAgICAgICAgIyBBbmQgYXMgQUhSZWdpc3RlckhlbHBCb29rIHdhbnRzIGEgYnVuZGxlICh3aXRoIHRoZSByaWdodCBiaXRzIGluCisgICAgICAgICMgdGhlIHBsaXN0IGZpbGUpIHdlIHJlZmVyIGl0IHRvIFB5dGhvbi5hcHAKKyAgICAgICAgIworICAgICAgICAjIFRvIG1ha2UgbWF0dGVycyB3b3JzZSB3ZSBoYXZlIHRvIGxvb2sgaW4gdHdvIHBsYWNlczogZmlyc3QgaW4gdGhlIElERQorICAgICAgICAjIGl0c2VsZiwgdGhlbiBpbiB0aGUgUHl0aG9uIGFwcGxpY2F0aW9uIGluc2lkZSB0aGUgZnJhbWV3b3JrLgorICAgICAgICBoYXNfaGVscCA9IEZhbHNlCisgICAgICAgIGhhc19kb2MgPSBGYWxzZQorICAgICAgICBpZGVfcGF0aF9jb21wb25lbnRzID0gc3lzLmFyZ3ZbMF0uc3BsaXQoIi8iKQorICAgICAgICBpZiBpZGVfcGF0aF9jb21wb25lbnRzWy0zOl0gPT0gWyJDb250ZW50cyIsICJSZXNvdXJjZXMiLCAiUHl0aG9uSURFLnB5Il06CisgICAgICAgICAgICBpZGVfYXBwID0gIi8iLmpvaW4oaWRlX3BhdGhfY29tcG9uZW50c1s6LTNdKQorICAgICAgICAgICAgaGVscF9zb3VyY2UgPSBvcy5wYXRoLmpvaW4oaWRlX2FwcCwgJ0NvbnRlbnRzL1Jlc291cmNlcy9FbmdsaXNoLmxwcm9qL0RvY3VtZW50YXRpb24nKQorICAgICAgICAgICAgZG9jX3NvdXJjZSA9IG9zLnBhdGguam9pbihpZGVfYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovUHl0aG9uRG9jdW1lbnRhdGlvbicpCisgICAgICAgICAgICBoYXNfaGVscCA9IG9zLnBhdGguaXNkaXIoaGVscF9zb3VyY2UpCisgICAgICAgICAgICBoYXNfZG9jID0gb3MucGF0aC5pc2Rpcihkb2Nfc291cmNlKQorICAgICAgICAgICAgaWYgaGFzX2hlbHAgb3IgaGFzX2RvYzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICAgICAgICAgICAgICBBSC5BSFJlZ2lzdGVySGVscEJvb2soaWRlX2FwcCkKKyAgICAgICAgICAgICAgICBleGNlcHQgKEltcG9ydEVycm9yLCBNYWNPUy5FcnJvciksIGFyZzoKKyAgICAgICAgICAgICAgICAgICAgcGFzcyAjIFcuTWVzc2FnZSgiQ2Fubm90IHJlZ2lzdGVyIFB5dGhvbiBEb2N1bWVudGF0aW9uOiAlcyIgJSBzdHIoYXJnKSkKKyAgICAgICAgcHl0aG9uX2FwcCA9IG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnUmVzb3VyY2VzL1B5dGhvbi5hcHAnKQorICAgICAgICBpZiBub3QgaGFzX2hlbHA6CisgICAgICAgICAgICBoZWxwX3NvdXJjZSA9IG9zLnBhdGguam9pbihweXRob25fYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovRG9jdW1lbnRhdGlvbicpCisgICAgICAgICAgICBoYXNfaGVscCA9IG9zLnBhdGguaXNkaXIoaGVscF9zb3VyY2UpCisgICAgICAgIGlmIG5vdCBoYXNfZG9jOgorICAgICAgICAgICAgZG9jX3NvdXJjZSA9IG9zLnBhdGguam9pbihweXRob25fYXBwLCAnQ29udGVudHMvUmVzb3VyY2VzL0VuZ2xpc2gubHByb2ovUHl0aG9uRG9jdW1lbnRhdGlvbicpCisgICAgICAgICAgICBoYXNfZG9jID0gb3MucGF0aC5pc2Rpcihkb2Nfc291cmNlKQorICAgICAgICBpZiBoYXNfaGVscCBvciBoYXNfZG9jOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBBSAorICAgICAgICAgICAgICAgIEFILkFIUmVnaXN0ZXJIZWxwQm9vayhweXRob25fYXBwKQorICAgICAgICAgICAgZXhjZXB0IChJbXBvcnRFcnJvciwgTWFjT1MuRXJyb3IpLCBhcmc6CisgICAgICAgICAgICAgICAgcGFzcyAjIFcuTWVzc2FnZSgiQ2Fubm90IHJlZ2lzdGVyIFB5dGhvbiBEb2N1bWVudGF0aW9uOiAlcyIgJSBzdHIoYXJnKSkKKyAgICAgICAgcmV0dXJuIGhhc19oZWxwLCBoYXNfZG9jCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1NwbGFzaC5weSBiL01hYy9Ub29scy9JREUvU3BsYXNoLnB5CmluZGV4IDg2MDA5ZDIuLmFiMzZmYTQgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvU3BsYXNoLnB5CisrKyBiL01hYy9Ub29scy9JREUvU3BsYXNoLnB5CkBAIC0yNSw4OCArMjUsODggQEAKICVzCiBTZWU6IDxodHRwOi8vd3d3LnB5dGhvbi5vcmcvPiBmb3IgaW5mb3JtYXRpb24gYW5kIGRvY3VtZW50YXRpb24uIiIiCiAKLWZsYXV3ZWt1bCA9IFsJIkdvb2RkYXksIEJydWNlLiIsIAotCQkJIldoYXQncyBuZXc/IiwKLQkJCSJOdWRnZSwgbnVkZ2UsIHNheSBubyBtb3JlISIsIAotCQkJIk5vLCBubyBzaXIsIGl0J3Mgbm90IGRlYWQuIEl0J3MgcmVzdGluZy4iLAotCQkJIkFsYmF0cm9zISIsCi0JCQkiSXQncyAuIC4gLiIsCi0JCQkiSXMgeW91ciBuYW1lIG5vdCBCcnVjZSwgdGhlbj8iLAotCQkJIiIiQnV0IE1yIEYuRy4gU3VwZXJtYW4gaGFzIGEgc2VjcmV0IGlkZW50aXR5IC4gLiAuIAotd2hlbiB0cm91YmxlIHN0cmlrZXMgYXQgYW55IHRpbWUgLiAuIC4gCi1hdCBhbnkgcGxhY2UgLiAuIC4gaGUgaXMgcmVhZHkgdG8gYmVjb21lIC4gLiAuIAorZmxhdXdla3VsID0gWyAgICJHb29kZGF5LCBCcnVjZS4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIldoYXQncyBuZXc/IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJOdWRnZSwgbnVkZ2UsIHNheSBubyBtb3JlISIsCisgICAgICAgICAgICAgICAgICAgICAgICAiTm8sIG5vIHNpciwgaXQncyBub3QgZGVhZC4gSXQncyByZXN0aW5nLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAiQWxiYXRyb3MhIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJdCdzIC4gLiAuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICJJcyB5b3VyIG5hbWUgbm90IEJydWNlLCB0aGVuPyIsCisgICAgICAgICAgICAgICAgICAgICAgICAiIiJCdXQgTXIgRi5HLiBTdXBlcm1hbiBoYXMgYSBzZWNyZXQgaWRlbnRpdHkgLiAuIC4KK3doZW4gdHJvdWJsZSBzdHJpa2VzIGF0IGFueSB0aW1lIC4gLiAuCithdCBhbnkgcGxhY2UgLiAuIC4gaGUgaXMgcmVhZHkgdG8gYmVjb21lIC4gLiAuCiBCaWN5Y2xlIFJlcGFpciBNYW4hIiIiCi0JCQldCisgICAgICAgICAgICAgICAgICAgICAgICBdCiAKIGRlZiBza2lwZG91YmxlcmV0dXJucyh0ZXh0KToKLQlyZXR1cm4gc3RyaW5nLnJlcGxhY2UodGV4dCwgJ1xuXG4nLCAnXG4nKQorICAgIHJldHVybiBzdHJpbmcucmVwbGFjZSh0ZXh0LCAnXG5cbicsICdcbicpCiAKIGRlZiBubDJyZXR1cm4odGV4dCk6Ci0JcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRleHQsICdcbicsICdccicpCisgICAgcmV0dXJuIHN0cmluZy5yZXBsYWNlKHRleHQsICdcbicsICdccicpCiAKIGRlZiBVcGRhdGVTcGxhc2goZHJhd2RpYWxvZyA9IDAsIHdoYXQgPSAwKToKLQlpZiBkcmF3ZGlhbG9nOgotCQlzcGxhc2guRHJhd0RpYWxvZygpCi0JZHJhd3RleHQod2hhdCkKLQlzcGxhc2guR2V0RGlhbG9nV2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KHNwbGFzaC5HZXREaWFsb2dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQotCXNwbGFzaC5HZXREaWFsb2dXaW5kb3coKS5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKKyAgICBpZiBkcmF3ZGlhbG9nOgorICAgICAgICBzcGxhc2guRHJhd0RpYWxvZygpCisgICAgZHJhd3RleHQod2hhdCkKKyAgICBzcGxhc2guR2V0RGlhbG9nV2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KHNwbGFzaC5HZXREaWFsb2dQb3J0KCkuR2V0UG9ydEJvdW5kcygpKQorICAgIHNwbGFzaC5HZXREaWFsb2dXaW5kb3coKS5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKIAogZGVmIGRyYXd0ZXh0KHdoYXQgPSAwKToKLQlRZC5TZXRQb3J0KHNwbGFzaCkKLQlmb250SUQgPSBGbS5HZXRGTnVtKCJQeXRob24tU2FucyIpCi0JaWYgbm90IGZvbnRJRDoKLQkJZm9udElEID0gZ2VuZXZhCi0JUWQuVGV4dEZvbnQoZm9udElEKQotCVFkLlRleHRTaXplKDkpCi0JcmVjdCA9ICgxMCwgMTE1LCBfYWJvdXRfd2lkdGggLSAxMCwgX2Fib3V0X2hlaWdodCAtIDMwKQotCWlmIG5vdCB3aGF0OgotCQlpbXBvcnQgX19tYWluX18KLQkJYWJvdXR0eHQgPSBubDJyZXR1cm4oYWJvdXR0ZXh0MSAlICgKLQkJCQlfX21haW5fXy5fX3ZlcnNpb25fXywgc3lzLnZlcnNpb24sIHNraXBkb3VibGVyZXR1cm5zKHN5cy5jb3B5cmlnaHQpKSkKLQllbHNlOgotCQlpbXBvcnQgcmFuZG9tCi0JCWFib3V0dHh0ID0gbmwycmV0dXJuKHJhbmRvbS5jaG9pY2UoZmxhdXdla3VsKSkKLQlURS5URVRleHRCb3goYWJvdXR0eHQsIHJlY3QsIHRlSnVzdENlbnRlcikKKyAgICBRZC5TZXRQb3J0KHNwbGFzaCkKKyAgICBmb250SUQgPSBGbS5HZXRGTnVtKCJQeXRob24tU2FucyIpCisgICAgaWYgbm90IGZvbnRJRDoKKyAgICAgICAgZm9udElEID0gZ2VuZXZhCisgICAgUWQuVGV4dEZvbnQoZm9udElEKQorICAgIFFkLlRleHRTaXplKDkpCisgICAgcmVjdCA9ICgxMCwgMTE1LCBfYWJvdXRfd2lkdGggLSAxMCwgX2Fib3V0X2hlaWdodCAtIDMwKQorICAgIGlmIG5vdCB3aGF0OgorICAgICAgICBpbXBvcnQgX19tYWluX18KKyAgICAgICAgYWJvdXR0eHQgPSBubDJyZXR1cm4oYWJvdXR0ZXh0MSAlICgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fbWFpbl9fLl9fdmVyc2lvbl9fLCBzeXMudmVyc2lvbiwgc2tpcGRvdWJsZXJldHVybnMoc3lzLmNvcHlyaWdodCkpKQorICAgIGVsc2U6CisgICAgICAgIGltcG9ydCByYW5kb20KKyAgICAgICAgYWJvdXR0eHQgPSBubDJyZXR1cm4ocmFuZG9tLmNob2ljZShmbGF1d2VrdWwpKQorICAgIFRFLlRFVGV4dEJveChhYm91dHR4dCwgcmVjdCwgdGVKdXN0Q2VudGVyKQogCiBVcGRhdGVTcGxhc2goMSkKIAogZGVmIHdhaXQoKToKLQlmcm9tIENhcmJvbiBpbXBvcnQgRXZ0Ci0JZnJvbSBDYXJib24gaW1wb3J0IEV2ZW50cwotCWdsb2JhbCBzcGxhc2gKLQl0cnk6Ci0JCXNwbGFzaAotCWV4Y2VwdCBOYW1lRXJyb3I6Ci0JCXJldHVybgotCVFkLkluaXRDdXJzb3IoKQotCXRpbWUgPSBFdnQuVGlja0NvdW50KCkKLQl3aGF0dGV4dCA9IDAKLQlkcmF3dGV4dCh3aGF0dGV4dCkKLQl3aGlsZSBfa2VlcHNwbGFzaHNjcmVlbm9wZW46Ci0JCW9rLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5oaWdoTGV2ZWxFdmVudE1hc2spCi0JCWlmIG9rOgotCQkJIyBnb3QgYXBwbGUgZXZlbnQsIGJhY2sgdG8gbWFpbmxvb3AKLQkJCWJyZWFrCi0JCW9rLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5tRG93bk1hc2sgfCBFdmVudHMua2V5RG93bk1hc2sgfCBFdmVudHMudXBkYXRlTWFzaykKLQkJaWYgb2s6Ci0JCQlvaywgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChFdmVudHMubURvd25NYXNrIHwgRXZlbnRzLmtleURvd25NYXNrIHwgRXZlbnRzLnVwZGF0ZU1hc2ssIDMwKQotCQkJaWYgb2s6Ci0JCQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJCQlpZiB3aGF0ID09IEV2ZW50cy51cGRhdGVFdnQ6Ci0JCQkJCWlmIFdpbi5XaGljaFdpbmRvdyhtZXNzYWdlKSA9PSBzcGxhc2g6Ci0JCQkJCQlVcGRhdGVTcGxhc2goMSwgd2hhdHRleHQpCi0JCQkJZWxzZToKLQkJCQkJYnJlYWsKLQkJaWYgRXZ0LlRpY2tDb3VudCgpIC0gdGltZSA+IDM2MDoKLQkJCXdoYXR0ZXh0ID0gbm90IHdoYXR0ZXh0Ci0JCQlkcmF3dGV4dCh3aGF0dGV4dCkKLQkJCXRpbWUgPSBFdnQuVGlja0NvdW50KCkKLQlkZWwgc3BsYXNoCisgICAgZnJvbSBDYXJib24gaW1wb3J0IEV2dAorICAgIGZyb20gQ2FyYm9uIGltcG9ydCBFdmVudHMKKyAgICBnbG9iYWwgc3BsYXNoCisgICAgdHJ5OgorICAgICAgICBzcGxhc2gKKyAgICBleGNlcHQgTmFtZUVycm9yOgorICAgICAgICByZXR1cm4KKyAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICB0aW1lID0gRXZ0LlRpY2tDb3VudCgpCisgICAgd2hhdHRleHQgPSAwCisgICAgZHJhd3RleHQod2hhdHRleHQpCisgICAgd2hpbGUgX2tlZXBzcGxhc2hzY3JlZW5vcGVuOgorICAgICAgICBvaywgZXZlbnQgPSBFdnQuRXZlbnRBdmFpbChFdmVudHMuaGlnaExldmVsRXZlbnRNYXNrKQorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICMgZ290IGFwcGxlIGV2ZW50LCBiYWNrIHRvIG1haW5sb29wCisgICAgICAgICAgICBicmVhaworICAgICAgICBvaywgZXZlbnQgPSBFdnQuRXZlbnRBdmFpbChFdmVudHMubURvd25NYXNrIHwgRXZlbnRzLmtleURvd25NYXNrIHwgRXZlbnRzLnVwZGF0ZU1hc2spCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgb2ssIGV2ZW50ID0gRXZ0LldhaXROZXh0RXZlbnQoRXZlbnRzLm1Eb3duTWFzayB8IEV2ZW50cy5rZXlEb3duTWFzayB8IEV2ZW50cy51cGRhdGVNYXNrLCAzMCkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgICAgICAgICAgaWYgd2hhdCA9PSBFdmVudHMudXBkYXRlRXZ0OgorICAgICAgICAgICAgICAgICAgICBpZiBXaW4uV2hpY2hXaW5kb3cobWVzc2FnZSkgPT0gc3BsYXNoOgorICAgICAgICAgICAgICAgICAgICAgICAgVXBkYXRlU3BsYXNoKDEsIHdoYXR0ZXh0KQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGlmIEV2dC5UaWNrQ291bnQoKSAtIHRpbWUgPiAzNjA6CisgICAgICAgICAgICB3aGF0dGV4dCA9IG5vdCB3aGF0dGV4dAorICAgICAgICAgICAgZHJhd3RleHQod2hhdHRleHQpCisgICAgICAgICAgICB0aW1lID0gRXZ0LlRpY2tDb3VudCgpCisgICAgZGVsIHNwbGFzaAogCiAKIGRlZiBhYm91dCgpOgotCWdsb2JhbCBzcGxhc2gsIHNwbGFzaHJlc2ZpbGUsIF9rZWVwc3BsYXNoc2NyZWVub3BlbgotCV9rZWVwc3BsYXNoc2NyZWVub3BlbiA9IDEKLQlzcGxhc2ggPSBEbGcuR2V0TmV3RGlhbG9nKDQ2OCwgLTEpCi0Jc3BsYXNoLkRyYXdEaWFsb2coKQotCXdhaXQoKQorICAgIGdsb2JhbCBzcGxhc2gsIHNwbGFzaHJlc2ZpbGUsIF9rZWVwc3BsYXNoc2NyZWVub3BlbgorICAgIF9rZWVwc3BsYXNoc2NyZWVub3BlbiA9IDEKKyAgICBzcGxhc2ggPSBEbGcuR2V0TmV3RGlhbG9nKDQ2OCwgLTEpCisgICAgc3BsYXNoLkRyYXdEaWFsb2coKQorICAgIHdhaXQoKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XLnB5IGIvTWFjL1Rvb2xzL0lERS9XLnB5CmluZGV4IDM5N2IyMTEuLjNkZGViNzYgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvVy5weQorKysgYi9NYWMvVG9vbHMvSURFL1cucHkKQEAgLTE1LDI3ICsxNSwyNiBAQAogQWxlcnRFcnJvciA9ICdBbGVydEVycm9yJwogCiBkZWYgc2V0YXBwbGljYXRpb24oYXBwLCBzaWcpOgotCWdsb2JhbCBfYXBwbGljYXRpb24sIF9zaWduYXR1cmUKLQlfYXBwbGljYXRpb24gPSBhcHAKLQlfc2lnbmF0dXJlID0gc2lnCisgICAgZ2xvYmFsIF9hcHBsaWNhdGlvbiwgX3NpZ25hdHVyZQorICAgIF9hcHBsaWNhdGlvbiA9IGFwcAorICAgIF9zaWduYXR1cmUgPSBzaWcKIAogZGVmIGdldGFwcGxpY2F0aW9uKCk6Ci0JaWYgX2FwcGxpY2F0aW9uIGlzIE5vbmU6Ci0JCXJhaXNlIFdpZGdldHNFcnJvciwgJ1cgbm90IHByb3Blcmx5IGluaXRpYWxpemVkOiB1bmtub3duIEFwcGxpY2F0aW9uJwotCXJldHVybiBfYXBwbGljYXRpb24KKyAgICBpZiBfYXBwbGljYXRpb24gaXMgTm9uZToKKyAgICAgICAgcmFpc2UgV2lkZ2V0c0Vycm9yLCAnVyBub3QgcHJvcGVybHkgaW5pdGlhbGl6ZWQ6IHVua25vd24gQXBwbGljYXRpb24nCisgICAgcmV0dXJuIF9hcHBsaWNhdGlvbgogCiBkZWYgZ2V0ZGVmYXVsdGZvbnQoKToKLQlwcmVmcyA9IGdldGFwcGxpY2F0aW9uKCkuZ2V0cHJlZnMoKQotCWlmIG5vdCBwcmVmcy5kZWZhdWx0Zm9udDoKLQkJcHJlZnMuZGVmYXVsdGZvbnQgPSAoIkdlbmV2YSIsIDAsIDEwLCAoMCwgMCwgMCkpCi0JcmV0dXJuIHByZWZzLmRlZmF1bHRmb250CisgICAgcHJlZnMgPSBnZXRhcHBsaWNhdGlvbigpLmdldHByZWZzKCkKKyAgICBpZiBub3QgcHJlZnMuZGVmYXVsdGZvbnQ6CisgICAgICAgIHByZWZzLmRlZmF1bHRmb250ID0gKCJHZW5ldmEiLCAwLCAxMCwgKDAsIDAsIDApKQorICAgIHJldHVybiBwcmVmcy5kZWZhdWx0Zm9udAogCiBkZWYgTWVzc2FnZSh0ZXh0KToKLQlpbXBvcnQgRWFzeURpYWxvZ3MsIHN0cmluZwotCWZyb20gQ2FyYm9uIGltcG9ydCBRZAotCVFkLkluaXRDdXJzb3IoKQotCXRleHQgPSBzdHJpbmcucmVwbGFjZSh0ZXh0LCAiXG4iLCAiXHIiKQotCWlmIG5vdCB0ZXh0OgotCQl0ZXh0ID0gJzxBbGVydCB0ZXh0IG5vdCBzcGVjaWZpZWQ+JwotCUVhc3lEaWFsb2dzLk1lc3NhZ2UodGV4dCkKLQorICAgIGltcG9ydCBFYXN5RGlhbG9ncywgc3RyaW5nCisgICAgZnJvbSBDYXJib24gaW1wb3J0IFFkCisgICAgUWQuSW5pdEN1cnNvcigpCisgICAgdGV4dCA9IHN0cmluZy5yZXBsYWNlKHRleHQsICJcbiIsICJcciIpCisgICAgaWYgbm90IHRleHQ6CisgICAgICAgIHRleHQgPSAnPEFsZXJ0IHRleHQgbm90IHNwZWNpZmllZD4nCisgICAgRWFzeURpYWxvZ3MuTWVzc2FnZSh0ZXh0KQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XYXBwbGljYXRpb24ucHkgYi9NYWMvVG9vbHMvSURFL1dhcHBsaWNhdGlvbi5weQppbmRleCA1NTMzOTFlLi40Y2ZjNzdiIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1dhcHBsaWNhdGlvbi5weQorKysgYi9NYWMvVG9vbHMvSURFL1dhcHBsaWNhdGlvbi5weQpAQCAtMTEsNDcyICsxMSw0NzEgQEAKIGZyb20gQ2FyYm9uIGltcG9ydCBGaWxlCiAKIGlmIGhhc2F0dHIoV2luLCAiRnJvbnROb25GbG9hdGluZ1dpbmRvdyIpOgotCU15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnROb25GbG9hdGluZ1dpbmRvdworICAgIE15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnROb25GbG9hdGluZ1dpbmRvdwogZWxzZToKLQlNeUZyb250V2luZG93ID0gV2luLkZyb250V2luZG93CisgICAgTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udFdpbmRvdwogCiAKIEtJTExVTktOT1dOV0lORE9XUyA9IDAgICMgU2V0IHRvIDAgZm9yIGRlYnVnZ2luZy4KIAogY2xhc3MgQXBwbGljYXRpb24oRnJhbWVXb3JrLkFwcGxpY2F0aW9uKToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgc2lnbmF0dXJlPSdQeXRoJyk6Ci0JCSMgT3BlbiBvdXIgcmVzb3VyY2UgZmlsZSwgaWYgaXQgaXMgbm90IG9wZW4geWV0Ci0JCW1hY3Jlc291cmNlLm5lZWQoJ0NVUlMnLCA0NjgsICJXaWRnZXRzLnJzcmMiKQotCQlpbXBvcnQgVwotCQlXLnNldGFwcGxpY2F0aW9uKHNlbGYsIHNpZ25hdHVyZSkKLQkJRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCi0JCXNlbGYuX3N1c3BlbmRlZCA9IDAKLQkJc2VsZi5xdWl0dGluZyA9IDAKLQkJc2VsZi5kZWJ1Z2dlcl9xdWl0dGluZyA9IDEKLQkJc2VsZi5EZWJ1Z2dlclF1aXQgPSAnRGVidWdnZXJRdWl0RHVtbXlFeGNlcHRpb24nCi0JCXNlbGYuX2lkbGVmdW5jcyA9IFtdCi0JCSMgbWFwIGNlcnRhaW4gRiBrZXkgY29kZXMgdG8gZXF1aXZhbGVudCBjb21tYW5kLWxldHRlciBjb21ib3MgKEpKUykKLQkJc2VsZi5ma2V5bWFwcyA9IHsxMjI6InoiLCAxMjA6IngiLCA5OToiYyIsIDExODoidiJ9Ci0JCi0JZGVmIG1haW5sb29wKHNlbGYsIG1hc2s9RnJhbWVXb3JrLmV2ZXJ5RXZlbnQsIHdhaXQ9Tm9uZSk6Ci0JCWltcG9ydCBXCi0JCXNlbGYucXVpdHRpbmcgPSAwCi0JCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCXNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJdHJ5OgotCQkJd2hpbGUgbm90IHNlbGYucXVpdHRpbmc6Ci0JCQkJdHJ5OgotCQkJCQlzZWxmLmRvMWV2ZW50KG1hc2ssIHdhaXQpCi0JCQkJZXhjZXB0IFcuQWxlcnRFcnJvciwgZGV0YWlsOgotCQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQkJCVcuTWVzc2FnZShkZXRhaWwpCi0JCQkJZXhjZXB0IHNlbGYuRGVidWdnZXJRdWl0OgotCQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQkJZXhjZXB0OgotCQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQkJCWltcG9ydCBQeUVkaXQKLQkJCQkJUHlFZGl0LnRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soKQotCQlmaW5hbGx5OgotCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgxKQotCQotCWRlZiBkZWJ1Z2dlcl9tYWlubG9vcChzZWxmLCBtYXNrPUZyYW1lV29yay5ldmVyeUV2ZW50LCB3YWl0PU5vbmUpOgotCQlpbXBvcnQgVwotCQlzZWxmLmRlYnVnZ2VyX3F1aXR0aW5nID0gMAotCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQlzYXZleWllbGQgPSBNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCXRyeToKLQkJCXdoaWxlIG5vdCBzZWxmLnF1aXR0aW5nIGFuZCBub3Qgc2VsZi5kZWJ1Z2dlcl9xdWl0dGluZzoKLQkJCQl0cnk6Ci0JCQkJCXNlbGYuZG8xZXZlbnQobWFzaywgd2FpdCkKLQkJCQlleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6Ci0JCQkJCVcuTWVzc2FnZShkZXRhaWwpCi0JCQkJZXhjZXB0OgotCQkJCQlpbXBvcnQgUHlFZGl0Ci0JCQkJCVB5RWRpdC50cmFjZWJhY2t3aW5kb3cudHJhY2ViYWNrKCkKLQkJZmluYWxseToKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKLQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQotCQotCWRlZiBicmVhdGhlKHNlbGYsIHdhaXQ9MSk6Ci0JCWltcG9ydCBXCi0JCW9rLCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KEZyYW1lV29yay51cGRhdGVNYXNrIHwgCi0JCQkJRnJhbWVXb3JrLm1Eb3duTWFzayB8IEZyYW1lV29yay5vc01hc2sgfAotCQkJCUZyYW1lV29yay5hY3Rpdk1hc2ssIAotCQkJCXdhaXQpCi0JCWlmIG9rOgotCQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJCSNwcmludCBGcmFtZVdvcmsuZXZlbnRuYW1lW3doYXRdCi0JCQlpZiBGcmFtZVdvcmsuZXZlbnRuYW1lW3doYXRdID09ICdtb3VzZURvd24nOgotCQkJCXBhcnRjb2RlLCB3aWQgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKLQkJCQlpZiBGcmFtZVdvcmsucGFydG5hbWVbcGFydGNvZGVdIDw+ICdpbkRlc2snOgotCQkJCQlyZXR1cm4KLQkJCWVsc2U6Ci0JCQkJVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJCXNlbGYuZGlzcGF0Y2goZXZlbnQpCi0JCi0JZGVmIHJlZnJlc2h3aW5kb3dzKHNlbGYsIHdhaXQ9MSk6Ci0JCWltcG9ydCBXCi0JCXdoaWxlIDE6Ci0JCQlvaywgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChGcmFtZVdvcmsudXBkYXRlTWFzaywgd2FpdCkKLQkJCWlmIG5vdCBvazoKLQkJCQlicmVhawotCQkJc2VsZi5kaXNwYXRjaChldmVudCkKLQkKLQlkZWYgYWRkaWRsZWZ1bmMoc2VsZiwgZnVuYyk6Ci0JCXNlbGYuX2lkbGVmdW5jcy5hcHBlbmQoZnVuYykKLQkKLQlkZWYgcmVtb3ZlaWRsZWZ1bmMoc2VsZiwgZnVuYyk6Ci0JCXNlbGYuX2lkbGVmdW5jcy5yZW1vdmUoZnVuYykKLQkKLQlkZWYgaWRsZShzZWxmLCBldmVudCk6Ci0JCWlmIG5vdCBzZWxmLl9zdXNwZW5kZWQ6Ci0JCQlpZiBub3Qgc2VsZi5kb19mcm9udFdpbmRvd01ldGhvZCgiaWRsZSIsIGV2ZW50KToKLQkJCQlRZC5Jbml0Q3Vyc29yKCkKLQkJaWYgc2VsZi5faWRsZWZ1bmNzOgotCQkJZm9yIGZ1bmMgaW4gc2VsZi5faWRsZWZ1bmNzOgotCQkJCXRyeToKLQkJCQkJZnVuYygpCi0JCQkJZXhjZXB0OgotCQkJCQlpbXBvcnQgc3lzCi0JCQkJCXN5cy5zdGRlcnIud3JpdGUoImV4Y2VwdGlvbiBpbiBpZGxlIGZ1bmN0aW9uICVyOyBraWxsZWQ6XG4iICUgKGZ1bmMsKSkKLQkJCQkJdHJhY2ViYWNrLnByaW50X2V4YygpCi0JCQkJCXNlbGYuX2lkbGVmdW5jcy5yZW1vdmUoZnVuYykKLQkJCQkJYnJlYWsKLQkKLQlkZWYgZG9fZnJvbnRXaW5kb3dNZXRob2Qoc2VsZiwgYXR0ciwgKmFyZ3MpOgotCQl3aWQgPSBNeUZyb250V2luZG93KCkKLQkJaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCXdpbmRvdyA9IHNlbGYuX3dpbmRvd3Nbd2lkXQotCQkJaWYgaGFzYXR0cih3aW5kb3csIGF0dHIpOgotCQkJCWhhbmRsZXIgPSBnZXRhdHRyKHdpbmRvdywgYXR0cikKLQkJCQlhcHBseShoYW5kbGVyLCBhcmdzKQotCQkJCXJldHVybiAxCi0JCQkJCi0JZGVmIGdldGZyb250d2luZG93KHNlbGYpOgotCQl3aWQgPSBNeUZyb250V2luZG93KCkKLQkJaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCXJldHVybiBzZWxmLl93aW5kb3dzW3dpZF0KLQkJcmV0dXJuIE5vbmUKLQkKLQlkZWYgYXBwZW5kd2luZG93KHNlbGYsIHdpZCwgd2luZG93KToKLQkJc2VsZi5fd2luZG93c1t3aWRdID0gd2luZG93Ci0JCXNlbGYubWFrZW9wZW53aW5kb3dzbWVudSgpCi0JCQotCWRlZiByZW1vdmV3aW5kb3coc2VsZiwgd2lkKToKLQkJZGVsIHNlbGYuX3dpbmRvd3Nbd2lkXQotCQlzZWxmLm1ha2VvcGVud2luZG93c21lbnUoKQotCQotCWRlZiBtYWtlb3BlbndpbmRvd3NtZW51KHNlbGYpOgotCQkjIGR1bW15OyBjb3VsZCBiZSB0aGUgZnVsbCB2ZXJzaW9uIGZyb20gUHl0aG9uSURFTWFpbi5weQotCQlzZWxmLl9vcGVud2luZG93cyA9IHt9Ci0JCXNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAotCQlpZiBub3QgaGFzYXR0cihzZWxmLCAiX21lbnVzdG9jaGVjayIpOgotCQkJc2VsZi5fbWVudXN0b2NoZWNrID0gW10KLQkKLQlkZWYgZG9fa2V5KHNlbGYsIGV2ZW50KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJY2ggPSBjaHIobWVzc2FnZSAmIEZyYW1lV29yay5jaGFyQ29kZU1hc2spCi0JCXJlc3QgPSBtZXNzYWdlICYgfkZyYW1lV29yay5jaGFyQ29kZU1hc2sKLQkJa2V5Y29kZSA9IChtZXNzYWdlICYgRnJhbWVXb3JrLmtleUNvZGVNYXNrKSA+PiA4Ci0JCWlmIGtleWNvZGUgaW4gc2VsZi5ma2V5bWFwcy5rZXlzKCk6CQkjIEpKUwotCQkJY2ggPSBzZWxmLmZrZXltYXBzW2tleWNvZGVdCi0JCQltb2RpZmllcnMgPSBtb2RpZmllcnMgfCBGcmFtZVdvcmsuY21kS2V5Ci0JCXdpZCA9IE15RnJvbnRXaW5kb3coKQotCQlpZiBtb2RpZmllcnMgJiBGcmFtZVdvcmsuY21kS2V5IGFuZCBub3QgbW9kaWZpZXJzICYgRnJhbWVXb3JrLnNoaWZ0S2V5OgotCQkJaWYgd2lkIGFuZCBzZWxmLl93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCQlzZWxmLmNoZWNrbWVudXMoc2VsZi5fd2luZG93c1t3aWRdKQotCQkJZWxzZToKLQkJCQlzZWxmLmNoZWNrbWVudXMoTm9uZSkKLQkJCWV2ZW50ID0gKHdoYXQsIG9yZChjaCkgfCByZXN0LCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKQotCQkJcmVzdWx0ID0gTWVudVRvb2xib3guTWVudUtleShvcmQoY2gpKQotCQkJaWQgPSAocmVzdWx0Pj4xNikgJiAweGZmZmYJIyBIaSB3b3JkCi0JCQlpdGVtID0gcmVzdWx0ICYgMHhmZmZmCQkjIExvIHdvcmQKLQkJCWlmIGlkOgotCQkJCXNlbGYuZG9fcmF3bWVudShpZCwgaXRlbSwgTm9uZSwgZXZlbnQpCi0JCQkJcmV0dXJuCSMgaGVyZSEgd2UgaGFkIGEgbWVudWtleSEgCi0JCQkjZWxzZToKLQkJCSMJcHJpbnQgIlhYWCBDb21tYW5kLSVyIiAlIGNoCi0JCSMgU2VlIHdoZXRoZXIgdGhlIGZyb250IHdpbmRvdyB3YW50cyBpdAotCQlpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgotCQkJd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCi0JCQl0cnk6Ci0JCQkJZG9fY2hhciA9IHdpbmRvdy5kb19jaGFyCi0JCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQkJZG9fY2hhciA9IHNlbGYuZG9fY2hhcgotCQkJZG9fY2hhcihjaCwgZXZlbnQpCi0JCSMgZWxzZSBpdCB3YXNuJ3QgZm9yIHVzLCBzaWdoLi4uCi0JCi0JZGVmIGRvX2luTWVudUJhcihzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6Ci0JCVFkLkluaXRDdXJzb3IoKQotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlzZWxmLmNoZWNrb3BlbndpbmRvd3NtZW51KCkKLQkJd2lkID0gTXlGcm9udFdpbmRvdygpCi0JCWlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6Ci0JCQlzZWxmLmNoZWNrbWVudXMoc2VsZi5fd2luZG93c1t3aWRdKQotCQllbHNlOgotCQkJc2VsZi5jaGVja21lbnVzKE5vbmUpCi0JCXJlc3VsdCA9IE1lbnVUb29sYm94Lk1lbnVTZWxlY3Qod2hlcmUpCi0JCWlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmCSMgSGkgd29yZAotCQlpZiBpZCA+PSAweDgwMDA6Ci0JCQlpZCA9IC0weDEwMDAwICsgaWQKLQkJaXRlbSA9IHJlc3VsdCAmIDB4ZmZmZgkJIyBMbyB3b3JkCi0JCXNlbGYuZG9fcmF3bWVudShpZCwgaXRlbSwgd2luZG93LCBldmVudCkKLQkKLQlkZWYgZG9fdXBkYXRlRXZ0KHNlbGYsIGV2ZW50KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJd2lkID0gV2luLldoaWNoV2luZG93KG1lc3NhZ2UpCi0JCWlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6Ci0JCQl3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KLQkJCXdpbmRvdy5kb19yYXd1cGRhdGUod2lkLCBldmVudCkKLQkJZWxzZToKLQkJCWlmIEtJTExVTktOT1dOV0lORE9XUyBhbmQgd2lkOgotCQkJCXdpZC5IaWRlV2luZG93KCkKLQkJCQlpbXBvcnQgc3lzCi0JCQkJc3lzLnN0ZGVyci53cml0ZSgiWFhYIGtpbGxlZCB1bmtub3duIChjcmFzaGVkPykgUHl0aG9uIHdpbmRvdy5cbiIpCi0JCQllbHNlOgotCQkJCWlmIGhhc2F0dHIoTWFjT1MsICdIYW5kbGVFdmVudCcpOgotCQkJCQlNYWNPUy5IYW5kbGVFdmVudChldmVudCkKLQkJCQllbHNlOgotCQkJCQlwcmludCAnVW5leHBlY3RlZCB1cGRhdGVFdmVudDonLCBldmVudAotCQotCWRlZiBzdXNwZW5kcmVzdW1lKHNlbGYsIG9ub2ZmKToKLQkJcGFzcwotCQotCWRlZiBkb19zdXNwZW5kcmVzdW1lKHNlbGYsIGV2ZW50KToKLQkJc2VsZi5fc3VzcGVuZGVkID0gbm90IGV2ZW50WzFdICYgMQotCQlGcmFtZVdvcmsuQXBwbGljYXRpb24uZG9fc3VzcGVuZHJlc3VtZShzZWxmLCBldmVudCkKLQkKLQlkZWYgY2hlY2tvcGVud2luZG93c21lbnUoc2VsZik6Ci0JCWlmIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrOgotCQkJc2VsZi5vcGVud2luZG93c21lbnUubWVudS5DaGVja01lbnVJdGVtKHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrLCAwKQotCQl3aW5kb3cgPSBNeUZyb250V2luZG93KCkKLQkJaWYgd2luZG93OgotCQkJZm9yIGl0ZW0sIHdpZCBpbiBzZWxmLl9vcGVud2luZG93cy5pdGVtcygpOgotCQkJCWlmIHdpZCA9PSB3aW5kb3c6Ci0JCQkJCSNzZWxmLnB5dGhvbndpbmRvd3NtZW51aXRlbS5jaGVjaygxKQotCQkJCQlzZWxmLm9wZW53aW5kb3dzbWVudS5tZW51LkNoZWNrTWVudUl0ZW0oaXRlbSwgMSkKLQkJCQkJc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSBpdGVtCi0JCQkJCWJyZWFrCi0JCWVsc2U6Ci0JCQlzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyayA9IDAKLQkJI2lmIHNlbGYuX29wZW53aW5kb3dzOgotCQkjCXNlbGYucHl0aG9ud2luZG93c21lbnVpdGVtLmVuYWJsZSgxKQotCQkjZWxzZToKLQkJIwlzZWxmLnB5dGhvbndpbmRvd3NtZW51aXRlbS5lbmFibGUoMCkKLQkKLQlkZWYgY2hlY2ttZW51cyhzZWxmLCB3aW5kb3cpOgotCQlmb3IgaXRlbSBpbiBzZWxmLl9tZW51c3RvY2hlY2s6Ci0JCQljYWxsYmFjayA9IGl0ZW0ubWVudS5pdGVtc1tpdGVtLml0ZW0tMV1bMl0KLQkJCWlmIHR5cGUoY2FsbGJhY2spIDw+IFN0cmluZ1R5cGU6Ci0JCQkJaXRlbS5lbmFibGUoMSkKLQkJCWVsaWYgaGFzYXR0cih3aW5kb3csICJkb21lbnVfIiArIGNhbGxiYWNrKToKLQkJCQlpZiBoYXNhdHRyKHdpbmRvdywgImNhbl8iICsgY2FsbGJhY2spOgotCQkJCQljYW5oYW5kbGVyID0gZ2V0YXR0cih3aW5kb3csICJjYW5fIiArIGNhbGxiYWNrKQotCQkJCQlpZiBjYW5oYW5kbGVyKGl0ZW0pOgotCQkJCQkJaXRlbS5lbmFibGUoMSkKLQkJCQkJZWxzZToKLQkJCQkJCWl0ZW0uZW5hYmxlKDApCi0JCQkJZWxzZToKLQkJCQkJaXRlbS5lbmFibGUoMSkKLQkJCWVsc2U6Ci0JCQkJaXRlbS5lbmFibGUoMCkKLQkKLQlkZWYgZW5hYmxlbWVudWJhcihzZWxmLCBvbm9mZik6Ci0JCWZvciBtIGluIHNlbGYubWVudWJhci5tZW51cy52YWx1ZXMoKToKLQkJCWlmIG9ub2ZmOgotCQkJCW0ubWVudS5FbmFibGVNZW51SXRlbSgwKQotCQkJZWxpZiBtLm1lbnUuR2V0TWVudUl0ZW1UZXh0KDMpIDw+ICdDdXQnOiAjIGV3Li4uCi0JCQkJbS5tZW51LkRpc2FibGVNZW51SXRlbSgwKQotCQlNZW51VG9vbGJveC5EcmF3TWVudUJhcigpCi0JCi0JZGVmIG1ha2VtZW51YmFyKHNlbGYpOgotCQlzZWxmLm1lbnViYXIgPSBNZW51QmFyKHNlbGYpCi0JCUZyYW1lV29yay5BcHBsZU1lbnUoc2VsZi5tZW51YmFyLCBzZWxmLmdldGFib3V0dGV4dCgpLCBzZWxmLmRvX2Fib3V0KQotCQlzZWxmLm1ha2V1c2VybWVudXMoKQotCQotCWRlZiBzY3JpcHRzd2FsayhzZWxmLCB0b3AsIG1lbnUsIGRvbmU9Tm9uZSk6Ci0JCWlmIG1lbnUuaWQgPiAyMDA6Ci0JCQlpbXBvcnQgVwotCQkJVy5NZXNzYWdlKCJTY3JpcHRzIGZvbGRlciBub3QgY29tcGxldGVseSB0cmF2ZXJzZWQ6IHJ1bm5pbmcgb3V0IG9mIG1lbnVzIikKLQkJCXJldHVybiBGYWxzZQotCQlpZiBkb25lIGlzIE5vbmU6Ci0JCQlkb25lID0ge30KLQkJaWYgZG9uZS5oYXNfa2V5KHRvcCk6Ci0JCQlyZXR1cm4gVHJ1ZQotCQlkb25lW3RvcF0gPSAxCi0JCWltcG9ydCBvcywgc3RyaW5nCi0JCXRyeToKLQkJCW5hbWVzID0gb3MubGlzdGRpcih0b3ApCi0JCWV4Y2VwdCBvcy5lcnJvcjoKLQkJCUZyYW1lV29yay5NZW51SXRlbShtZW51LCAnKFNjcmlwdHMgRm9sZGVyIG5vdCBmb3VuZCknLCBOb25lLCBOb25lKQotCQkJcmV0dXJuIFRydWUKLQkJc2F2ZWRpciA9IG9zLmdldGN3ZCgpCi0JCW9zLmNoZGlyKHRvcCkKLQkJZm9yIG5hbWUgaW4gbmFtZXM6Ci0JCQlpZiBuYW1lID09ICJDVlMiOgotCQkJCWNvbnRpbnVlCi0JCQl0cnk6Ci0JCQkJZnNyLCBpc2RpciwgaXNhbGlhcyA9IEZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKG5hbWUsIDEpCi0JCQlleGNlcHQ6Ci0JCQkJIyBtYXliZSBhIGJyb2tlbiBhbGlhcwotCQkJCWNvbnRpbnVlCi0JCQlwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKLQkJCWlmIGRvbmUuaGFzX2tleShwYXRoKToKLQkJCQljb250aW51ZQotCQkJbmFtZSA9IHN0cmluZy5zdHJpcChuYW1lKQotCQkJaWYgb3MubmFtZSA9PSAicG9zaXgiOgotCQkJCW5hbWUgPSB1bmljb2RlKG5hbWUsICJ1dGYtOCIpCi0JCQlpZiBuYW1lWy0zOl0gPT0gJy0tLSc6Ci0JCQkJbWVudS5hZGRzZXBhcmF0b3IoKQotCQkJZWxpZiBpc2RpcjoKLQkJCQlzdWJtZW51ID0gRnJhbWVXb3JrLlN1Yk1lbnUobWVudSwgbmFtZSkKLQkJCQlpZiBub3Qgc2VsZi5zY3JpcHRzd2FsayhwYXRoLCBzdWJtZW51LCBkb25lKToKLQkJCQkJcmV0dXJuIEZhbHNlCi0JCQllbHNlOgotCQkJCWNyZWF0b3IsIHR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShwYXRoKQotCQkJCWlmIHR5cGUgPT0gJ1RFWFQnOgotCQkJCQlpZiBuYW1lWy0zOl0gPT0gJy5weSc6Ci0JCQkJCQluYW1lID0gbmFtZVs6LTNdCi0JCQkJCWl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obWVudSwgbmFtZSwgTm9uZSwgc2VsZi5kb21lbnVfc2NyaXB0KQotCQkJCQlzZWxmLl9zY3JpcHRzWyhtZW51LmlkLCBpdGVtLml0ZW0pXSA9IHBhdGgKLQkJCWRvbmVbcGF0aF0gPSAxCi0JCW9zLmNoZGlyKHNhdmVkaXIpCi0JCXJldHVybiBUcnVlCi0JCi0JZGVmIGRvbWVudV9zY3JpcHQoc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlwYXRoID0gc2VsZi5fc2NyaXB0c1soaWQsIGl0ZW0pXQotCQlpbXBvcnQgb3MKLQkJaWYgbm90IG9zLnBhdGguZXhpc3RzKHBhdGgpOgotCQkJc2VsZi5tYWtlc2NyaXB0c21lbnUoKQotCQkJaW1wb3J0IFcKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkZpbGUgbm90IGZvdW5kLiIKLQkJaWYgb3JkKEV2dC5HZXRLZXlzKClbN10pICYgNDoKLQkJCXNlbGYub3BlbnNjcmlwdChwYXRoKQotCQllbHNlOgotCQkJaW1wb3J0IFcsIE1hY09TLCBzeXMKLQkJCVcuU2V0Q3Vyc29yKCJ3YXRjaCIpCi0JCQlzeXMuYXJndiA9IFtwYXRoXQotCQkJI2N3ZCA9IG9zLmdldGN3ZCgpCi0JCQkjb3MuY2hkaXIob3MucGF0aC5kaXJuYW1lKHBhdGgpICsgJzonKQotCQkJdHJ5OgotCQkJCSMgeHh4IGlmIHRoZXJlIGlzIGEgc2NyaXB0IHdpbmRvdyBmb3IgdGhpcyBmaWxlLAotCQkJCSMgZXhlYyBpbiB0aGF0IHdpbmRvdydzIG5hbWVzcGFjZS4KLQkJCQkjIHh4eCB3aGF0IHRvIGRvIHdoZW4gaXQncyBub3Qgc2F2ZWQ/Pz8KLQkJCQkjIHByb210IHRvIHNhdmU/Ci0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goMCkKLQkJCQlleGVjZmlsZShwYXRoLCB7J19fbmFtZV9fJzogJ19fbWFpbl9fJywgJ19fZmlsZV9fJzogcGF0aH0pCi0JCQlleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6Ci0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQkJcmFpc2UgVy5BbGVydEVycm9yLCBkZXRhaWwKLQkJCWV4Y2VwdCBLZXlib2FyZEludGVycnVwdDoKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCWV4Y2VwdDoKLQkJCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQkJCU1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKLQkJCQlpbXBvcnQgUHlFZGl0Ci0JCQkJUHlFZGl0LnRyYWNlYmFja3dpbmRvdy50cmFjZWJhY2soMSkKLQkJCWVsc2U6Ci0JCQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goLTEpCi0JCQkjb3MuY2hkaXIoY3dkKQotCQotCWRlZiBvcGVuc2NyaXB0KHNlbGYsIGZpbGVuYW1lLCBsaW5lbm89Tm9uZSwgY2hhcm9mZnNldD0wLCBtb2RuYW1lPSIiKToKLQkJaW1wb3J0IG9zLCBQeUVkaXQsIFcKLQkJZWRpdG9yID0gc2VsZi5nZXRzY3JpcHQoZmlsZW5hbWUpCi0JCWlmIGVkaXRvcjoKLQkJCWVkaXRvci5zZWxlY3QoKQotCQllbGlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLQkJCWVkaXRvciA9IFB5RWRpdC5FZGl0b3IoZmlsZW5hbWUpCi0JCWVsaWYgZmlsZW5hbWVbLTM6XSA9PSAnLnB5JyBvciBmaWxlbmFtZVstNDpdID09ICcucHljJzoKLQkJCWltcG9ydCBpbXAKLQkJCWlmIG5vdCBtb2RuYW1lOgotCQkJCWlmIGZpbGVuYW1lWy0xXSA9PSAnYyc6Ci0JCQkJCW1vZG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKVs6LTRdCi0JCQkJZWxzZToKLQkJCQkJbW9kbmFtZSA9IG9zLnBhdGguYmFzZW5hbWUoZmlsZW5hbWUpWzotM10KLQkJCXRyeToKLQkJCQkjIFhYWCBUaGlzIGRvZXMgbm90IHdvcmsgY29ycmVjdGx5IHdpdGggcGFja2FnZXMhCi0JCQkJIyBYWFggVGhlIGRvY3Mgc2F5IHdlIHNob3VsZCBkbyBpdCBtYW51YWxseSwgcGFjaywgdGhlbiBzdWIsIHRoZW4gc3ViMiBldGMuIAotCQkJCSMgWFhYIEl0IHNheXMgd2Ugc2hvdWxkIHVzZSBpbXAubG9hZF9tb2R1bGUoKSwgYnV0IHRoYXQgKnJlbG9hZHMqIGEgcGFja2FnZSwKLQkJCQkjIFhYWCBhbmQgdGhhdCdzIHRoZSBsYXN0IHRoaW5nIHdlIHdhbnQgaGVyZS4KLQkJCQlmLCBmaWxlbmFtZSwgKHN1ZmYsIG1vZGUsIGR1bW15KSA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQotCQkJZXhjZXB0IEltcG9ydEVycm9yOgotCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKLQkJCWVsc2U6Ci0JCQkJaWYgbm90IGY6Ci0JCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKLQkJCQlmLmNsb3NlKCkKLQkJCWlmIHN1ZmYgPT0gJy5weSc6Ci0JCQkJc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJvZmZzZXQpCi0JCQkJcmV0dXJuCi0JCQllbHNlOgotCQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKLQkJZWxzZToKLQkJCXJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBcIiVzXCIiICUgZmlsZW5hbWUKLQkJaWYgbGluZW5vIGlzIG5vdCBOb25lOgotCQkJZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vLCBjaGFyb2Zmc2V0KQotCQlyZXR1cm4gZWRpdG9yCi0JCi0JZGVmIGdldHNjcmlwdChzZWxmLCBmaWxlbmFtZSk6Ci0JCWlmIGZpbGVuYW1lWzoxXSA9PSAnPCcgYW5kIGZpbGVuYW1lWy0xOl0gPT0gJz4nOgotCQkJZmlsZW5hbWUgPSBmaWxlbmFtZVsxOi0xXQotCQlpbXBvcnQgc3RyaW5nCi0JCWxvd3BhdGggPSBzdHJpbmcubG93ZXIoZmlsZW5hbWUpCi0JCWZvciB3aWQsIHdpbmRvdyBpbiBzZWxmLl93aW5kb3dzLml0ZW1zKCk6Ci0JCQlpZiBoYXNhdHRyKHdpbmRvdywgInBhdGgiKSBhbmQgdHlwZSh3aW5kb3cucGF0aCkgPT0gU3RyaW5nVHlwZSBhbmQgXAotCQkJCQlsb3dwYXRoID09IHN0cmluZy5sb3dlcih3aW5kb3cucGF0aCk6Ci0JCQkJcmV0dXJuIHdpbmRvdwotCQkJZWxpZiBoYXNhdHRyKHdpbmRvdywgInBhdGgiKSBhbmQgZmlsZW5hbWUgPT0gd2lkLkdldFdUaXRsZSgpOgotCQkJCXJldHVybiB3aW5kb3cKLQkKLQlkZWYgZ2V0cHJlZnMoc2VsZik6Ci0JCWltcG9ydCBNYWNQcmVmcwotCQlyZXR1cm4gTWFjUHJlZnMuR2V0UHJlZnMoc2VsZi5wcmVmZmlsZXBhdGgpCi0JCi0JZGVmIGRvX2VkaXRvcnByZWZzKHNlbGYsICphcmdzKToKLQkJaW1wb3J0IFB5RWRpdAotCQlQeUVkaXQuRWRpdG9yRGVmYXVsdFNldHRpbmdzKCkKLQkKLQlkZWYgZG9fc2V0d2luZG93Zm9udChzZWxmLCAqYXJncyk6Ci0JCWltcG9ydCBGb250U2V0dGluZ3MsIFcKLQkJcHJlZnMgPSBzZWxmLmdldHByZWZzKCkKLQkJc2V0dGluZ3MgPSBGb250U2V0dGluZ3MuRm9udERpYWxvZyhwcmVmcy5kZWZhdWx0Zm9udCkKLQkJaWYgc2V0dGluZ3M6Ci0JCQlwcmVmcy5kZWZhdWx0Zm9udCwgdGFic2V0dGluZ3MgPSBzZXR0aW5ncwotCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiTm90ZSB0aGF0IGNoYW5nZXMgd2lsbCBvbmx5IGFmZmVjdCBuZXcgd2luZG93cyEiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2lnbmF0dXJlPSdQeXRoJyk6CisgICAgICAgICMgT3BlbiBvdXIgcmVzb3VyY2UgZmlsZSwgaWYgaXQgaXMgbm90IG9wZW4geWV0CisgICAgICAgIG1hY3Jlc291cmNlLm5lZWQoJ0NVUlMnLCA0NjgsICJXaWRnZXRzLnJzcmMiKQorICAgICAgICBpbXBvcnQgVworICAgICAgICBXLnNldGFwcGxpY2F0aW9uKHNlbGYsIHNpZ25hdHVyZSkKKyAgICAgICAgRnJhbWVXb3JrLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuX3N1c3BlbmRlZCA9IDAKKyAgICAgICAgc2VsZi5xdWl0dGluZyA9IDAKKyAgICAgICAgc2VsZi5kZWJ1Z2dlcl9xdWl0dGluZyA9IDEKKyAgICAgICAgc2VsZi5EZWJ1Z2dlclF1aXQgPSAnRGVidWdnZXJRdWl0RHVtbXlFeGNlcHRpb24nCisgICAgICAgIHNlbGYuX2lkbGVmdW5jcyA9IFtdCisgICAgICAgICMgbWFwIGNlcnRhaW4gRiBrZXkgY29kZXMgdG8gZXF1aXZhbGVudCBjb21tYW5kLWxldHRlciBjb21ib3MgKEpKUykKKyAgICAgICAgc2VsZi5ma2V5bWFwcyA9IHsxMjI6InoiLCAxMjA6IngiLCA5OToiYyIsIDExODoidiJ9CisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZiwgbWFzaz1GcmFtZVdvcmsuZXZlcnlFdmVudCwgd2FpdD1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgc2VsZi5xdWl0dGluZyA9IDAKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgc2F2ZXlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWl0dGluZzoKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIHNlbGYuZG8xZXZlbnQobWFzaywgd2FpdCkKKyAgICAgICAgICAgICAgICBleGNlcHQgVy5BbGVydEVycm9yLCBkZXRhaWw6CisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgICAgICAgICAgVy5NZXNzYWdlKGRldGFpbCkKKyAgICAgICAgICAgICAgICBleGNlcHQgc2VsZi5EZWJ1Z2dlclF1aXQ6CisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICAgICAgICAgICAgICBQeUVkaXQudHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKDEpCisKKyAgICBkZWYgZGVidWdnZXJfbWFpbmxvb3Aoc2VsZiwgbWFzaz1GcmFtZVdvcmsuZXZlcnlFdmVudCwgd2FpdD1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgc2VsZi5kZWJ1Z2dlcl9xdWl0dGluZyA9IDAKKyAgICAgICAgaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgorICAgICAgICAgICAgc2F2ZXlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICB0cnk6CisgICAgICAgICAgICB3aGlsZSBub3Qgc2VsZi5xdWl0dGluZyBhbmQgbm90IHNlbGYuZGVidWdnZXJfcXVpdHRpbmc6CisgICAgICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgICAgICBzZWxmLmRvMWV2ZW50KG1hc2ssIHdhaXQpCisgICAgICAgICAgICAgICAgZXhjZXB0IFcuQWxlcnRFcnJvciwgZGV0YWlsOgorICAgICAgICAgICAgICAgICAgICBXLk1lc3NhZ2UoZGV0YWlsKQorICAgICAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICAgICAgICAgICAgICBQeUVkaXQudHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygpCisgICAgICAgIGZpbmFsbHk6CisgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKHNhdmV5aWVsZCkKKworICAgIGRlZiBicmVhdGhlKHNlbGYsIHdhaXQ9MSk6CisgICAgICAgIGltcG9ydCBXCisgICAgICAgIG9rLCBldmVudCA9IEV2dC5XYWl0TmV4dEV2ZW50KEZyYW1lV29yay51cGRhdGVNYXNrIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lV29yay5tRG93bk1hc2sgfCBGcmFtZVdvcmsub3NNYXNrIHwKKyAgICAgICAgICAgICAgICAgICAgICAgIEZyYW1lV29yay5hY3Rpdk1hc2ssCisgICAgICAgICAgICAgICAgICAgICAgICB3YWl0KQorICAgICAgICBpZiBvazoKKyAgICAgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgICAgICAjcHJpbnQgRnJhbWVXb3JrLmV2ZW50bmFtZVt3aGF0XQorICAgICAgICAgICAgaWYgRnJhbWVXb3JrLmV2ZW50bmFtZVt3aGF0XSA9PSAnbW91c2VEb3duJzoKKyAgICAgICAgICAgICAgICBwYXJ0Y29kZSwgd2lkID0gV2luLkZpbmRXaW5kb3cod2hlcmUpCisgICAgICAgICAgICAgICAgaWYgRnJhbWVXb3JrLnBhcnRuYW1lW3BhcnRjb2RlXSA8PiAnaW5EZXNrJzoKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFcuU2V0Q3Vyc29yKCd3YXRjaCcpCisgICAgICAgICAgICBzZWxmLmRpc3BhdGNoKGV2ZW50KQorCisgICAgZGVmIHJlZnJlc2h3aW5kb3dzKHNlbGYsIHdhaXQ9MSk6CisgICAgICAgIGltcG9ydCBXCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgZXZlbnQgPSBFdnQuV2FpdE5leHRFdmVudChGcmFtZVdvcmsudXBkYXRlTWFzaywgd2FpdCkKKyAgICAgICAgICAgIGlmIG5vdCBvazoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChldmVudCkKKworICAgIGRlZiBhZGRpZGxlZnVuYyhzZWxmLCBmdW5jKToKKyAgICAgICAgc2VsZi5faWRsZWZ1bmNzLmFwcGVuZChmdW5jKQorCisgICAgZGVmIHJlbW92ZWlkbGVmdW5jKHNlbGYsIGZ1bmMpOgorICAgICAgICBzZWxmLl9pZGxlZnVuY3MucmVtb3ZlKGZ1bmMpCisKKyAgICBkZWYgaWRsZShzZWxmLCBldmVudCk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9zdXNwZW5kZWQ6CisgICAgICAgICAgICBpZiBub3Qgc2VsZi5kb19mcm9udFdpbmRvd01ldGhvZCgiaWRsZSIsIGV2ZW50KToKKyAgICAgICAgICAgICAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICAgICAgaWYgc2VsZi5faWRsZWZ1bmNzOgorICAgICAgICAgICAgZm9yIGZ1bmMgaW4gc2VsZi5faWRsZWZ1bmNzOgorICAgICAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICAgICAgZnVuYygpCisgICAgICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgc3lzCisgICAgICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoImV4Y2VwdGlvbiBpbiBpZGxlIGZ1bmN0aW9uICVyOyBraWxsZWQ6XG4iICUgKGZ1bmMsKSkKKyAgICAgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX2lkbGVmdW5jcy5yZW1vdmUoZnVuYykKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKworICAgIGRlZiBkb19mcm9udFdpbmRvd01ldGhvZChzZWxmLCBhdHRyLCAqYXJncyk6CisgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICBpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgorICAgICAgICAgICAgd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCisgICAgICAgICAgICBpZiBoYXNhdHRyKHdpbmRvdywgYXR0cik6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIod2luZG93LCBhdHRyKQorICAgICAgICAgICAgICAgIGFwcGx5KGhhbmRsZXIsIGFyZ3MpCisgICAgICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBnZXRmcm9udHdpbmRvdyhzZWxmKToKKyAgICAgICAgd2lkID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd2luZG93c1t3aWRdCisgICAgICAgIHJldHVybiBOb25lCisKKyAgICBkZWYgYXBwZW5kd2luZG93KHNlbGYsIHdpZCwgd2luZG93KToKKyAgICAgICAgc2VsZi5fd2luZG93c1t3aWRdID0gd2luZG93CisgICAgICAgIHNlbGYubWFrZW9wZW53aW5kb3dzbWVudSgpCisKKyAgICBkZWYgcmVtb3Zld2luZG93KHNlbGYsIHdpZCk6CisgICAgICAgIGRlbCBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgc2VsZi5tYWtlb3BlbndpbmRvd3NtZW51KCkKKworICAgIGRlZiBtYWtlb3BlbndpbmRvd3NtZW51KHNlbGYpOgorICAgICAgICAjIGR1bW15OyBjb3VsZCBiZSB0aGUgZnVsbCB2ZXJzaW9uIGZyb20gUHl0aG9uSURFTWFpbi5weQorICAgICAgICBzZWxmLl9vcGVud2luZG93cyA9IHt9CisgICAgICAgIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gMAorICAgICAgICBpZiBub3QgaGFzYXR0cihzZWxmLCAiX21lbnVzdG9jaGVjayIpOgorICAgICAgICAgICAgc2VsZi5fbWVudXN0b2NoZWNrID0gW10KKworICAgIGRlZiBkb19rZXkoc2VsZiwgZXZlbnQpOgorICAgICAgICAod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAorICAgICAgICBjaCA9IGNocihtZXNzYWdlICYgRnJhbWVXb3JrLmNoYXJDb2RlTWFzaykKKyAgICAgICAgcmVzdCA9IG1lc3NhZ2UgJiB+RnJhbWVXb3JrLmNoYXJDb2RlTWFzaworICAgICAgICBrZXljb2RlID0gKG1lc3NhZ2UgJiBGcmFtZVdvcmsua2V5Q29kZU1hc2spID4+IDgKKyAgICAgICAgaWYga2V5Y29kZSBpbiBzZWxmLmZrZXltYXBzLmtleXMoKTogICAgICAgICAgICAgIyBKSlMKKyAgICAgICAgICAgIGNoID0gc2VsZi5ma2V5bWFwc1trZXljb2RlXQorICAgICAgICAgICAgbW9kaWZpZXJzID0gbW9kaWZpZXJzIHwgRnJhbWVXb3JrLmNtZEtleQorICAgICAgICB3aWQgPSBNeUZyb250V2luZG93KCkKKyAgICAgICAgaWYgbW9kaWZpZXJzICYgRnJhbWVXb3JrLmNtZEtleSBhbmQgbm90IG1vZGlmaWVycyAmIEZyYW1lV29yay5zaGlmdEtleToKKyAgICAgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja21lbnVzKHNlbGYuX3dpbmRvd3Nbd2lkXSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5jaGVja21lbnVzKE5vbmUpCisgICAgICAgICAgICBldmVudCA9ICh3aGF0LCBvcmQoY2gpIHwgcmVzdCwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykKKyAgICAgICAgICAgIHJlc3VsdCA9IE1lbnVUb29sYm94Lk1lbnVLZXkob3JkKGNoKSkKKyAgICAgICAgICAgIGlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmICAgICAgIyBIaSB3b3JkCisgICAgICAgICAgICBpdGVtID0gcmVzdWx0ICYgMHhmZmZmICAgICAgICAgICMgTG8gd29yZAorICAgICAgICAgICAgaWYgaWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4gICMgaGVyZSEgd2UgaGFkIGEgbWVudWtleSEKKyAgICAgICAgICAgICNlbHNlOgorICAgICAgICAgICAgIyAgICAgICBwcmludCAiWFhYIENvbW1hbmQtJXIiICUgY2gKKyAgICAgICAgIyBTZWUgd2hldGhlciB0aGUgZnJvbnQgd2luZG93IHdhbnRzIGl0CisgICAgICAgIGlmIHdpZCBhbmQgc2VsZi5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLl93aW5kb3dzW3dpZF0KKyAgICAgICAgICAgIHRyeToKKyAgICAgICAgICAgICAgICBkb19jaGFyID0gd2luZG93LmRvX2NoYXIKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBkb19jaGFyID0gc2VsZi5kb19jaGFyCisgICAgICAgICAgICBkb19jaGFyKGNoLCBldmVudCkKKyAgICAgICAgIyBlbHNlIGl0IHdhc24ndCBmb3IgdXMsIHNpZ2guLi4KKworICAgIGRlZiBkb19pbk1lbnVCYXIoc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICBRZC5Jbml0Q3Vyc29yKCkKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgc2VsZi5jaGVja29wZW53aW5kb3dzbWVudSgpCisgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICBpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgorICAgICAgICAgICAgc2VsZi5jaGVja21lbnVzKHNlbGYuX3dpbmRvd3Nbd2lkXSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2ttZW51cyhOb25lKQorICAgICAgICByZXN1bHQgPSBNZW51VG9vbGJveC5NZW51U2VsZWN0KHdoZXJlKQorICAgICAgICBpZCA9IChyZXN1bHQ+PjE2KSAmIDB4ZmZmZiAgICAgICMgSGkgd29yZAorICAgICAgICBpZiBpZCA+PSAweDgwMDA6CisgICAgICAgICAgICBpZCA9IC0weDEwMDAwICsgaWQKKyAgICAgICAgaXRlbSA9IHJlc3VsdCAmIDB4ZmZmZiAgICAgICAgICAjIExvIHdvcmQKKyAgICAgICAgc2VsZi5kb19yYXdtZW51KGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQorCisgICAgZGVmIGRvX3VwZGF0ZUV2dChzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHdpZCA9IFdpbi5XaGljaFdpbmRvdyhtZXNzYWdlKQorICAgICAgICBpZiB3aWQgYW5kIHNlbGYuX3dpbmRvd3MuaGFzX2tleSh3aWQpOgorICAgICAgICAgICAgd2luZG93ID0gc2VsZi5fd2luZG93c1t3aWRdCisgICAgICAgICAgICB3aW5kb3cuZG9fcmF3dXBkYXRlKHdpZCwgZXZlbnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpZiBLSUxMVU5LTk9XTldJTkRPV1MgYW5kIHdpZDoKKyAgICAgICAgICAgICAgICB3aWQuSGlkZVdpbmRvdygpCisgICAgICAgICAgICAgICAgaW1wb3J0IHN5cworICAgICAgICAgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoIlhYWCBraWxsZWQgdW5rbm93biAoY3Jhc2hlZD8pIFB5dGhvbiB3aW5kb3cuXG4iKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnSGFuZGxlRXZlbnQnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ1VuZXhwZWN0ZWQgdXBkYXRlRXZlbnQ6JywgZXZlbnQKKworICAgIGRlZiBzdXNwZW5kcmVzdW1lKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGRvX3N1c3BlbmRyZXN1bWUoc2VsZiwgZXZlbnQpOgorICAgICAgICBzZWxmLl9zdXNwZW5kZWQgPSBub3QgZXZlbnRbMV0gJiAxCisgICAgICAgIEZyYW1lV29yay5BcHBsaWNhdGlvbi5kb19zdXNwZW5kcmVzdW1lKHNlbGYsIGV2ZW50KQorCisgICAgZGVmIGNoZWNrb3BlbndpbmRvd3NtZW51KHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyazoKKyAgICAgICAgICAgIHNlbGYub3BlbndpbmRvd3NtZW51Lm1lbnUuQ2hlY2tNZW51SXRlbShzZWxmLl9vcGVud2luZG93c2NoZWNrbWFyaywgMCkKKyAgICAgICAgd2luZG93ID0gTXlGcm9udFdpbmRvdygpCisgICAgICAgIGlmIHdpbmRvdzoKKyAgICAgICAgICAgIGZvciBpdGVtLCB3aWQgaW4gc2VsZi5fb3BlbndpbmRvd3MuaXRlbXMoKToKKyAgICAgICAgICAgICAgICBpZiB3aWQgPT0gd2luZG93OgorICAgICAgICAgICAgICAgICAgICAjc2VsZi5weXRob253aW5kb3dzbWVudWl0ZW0uY2hlY2soMSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5vcGVud2luZG93c21lbnUubWVudS5DaGVja01lbnVJdGVtKGl0ZW0sIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX29wZW53aW5kb3dzY2hlY2ttYXJrID0gaXRlbQorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fb3BlbndpbmRvd3NjaGVja21hcmsgPSAwCisgICAgICAgICNpZiBzZWxmLl9vcGVud2luZG93czoKKyAgICAgICAgIyAgICAgICBzZWxmLnB5dGhvbndpbmRvd3NtZW51aXRlbS5lbmFibGUoMSkKKyAgICAgICAgI2Vsc2U6CisgICAgICAgICMgICAgICAgc2VsZi5weXRob253aW5kb3dzbWVudWl0ZW0uZW5hYmxlKDApCisKKyAgICBkZWYgY2hlY2ttZW51cyhzZWxmLCB3aW5kb3cpOgorICAgICAgICBmb3IgaXRlbSBpbiBzZWxmLl9tZW51c3RvY2hlY2s6CisgICAgICAgICAgICBjYWxsYmFjayA9IGl0ZW0ubWVudS5pdGVtc1tpdGVtLml0ZW0tMV1bMl0KKyAgICAgICAgICAgIGlmIHR5cGUoY2FsbGJhY2spIDw+IFN0cmluZ1R5cGU6CisgICAgICAgICAgICAgICAgaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgIGVsaWYgaGFzYXR0cih3aW5kb3csICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKHdpbmRvdywgImNhbl8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgICAgICAgICBjYW5oYW5kbGVyID0gZ2V0YXR0cih3aW5kb3csICJjYW5fIiArIGNhbGxiYWNrKQorICAgICAgICAgICAgICAgICAgICBpZiBjYW5oYW5kbGVyKGl0ZW0pOgorICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgICAgIGl0ZW0uZW5hYmxlKDApCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaXRlbS5lbmFibGUoMSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaXRlbS5lbmFibGUoMCkKKworICAgIGRlZiBlbmFibGVtZW51YmFyKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgZm9yIG0gaW4gc2VsZi5tZW51YmFyLm1lbnVzLnZhbHVlcygpOgorICAgICAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICAgICAgbS5tZW51LkVuYWJsZU1lbnVJdGVtKDApCisgICAgICAgICAgICBlbGlmIG0ubWVudS5HZXRNZW51SXRlbVRleHQoMykgPD4gJ0N1dCc6ICMgZXcuLi4KKyAgICAgICAgICAgICAgICBtLm1lbnUuRGlzYWJsZU1lbnVJdGVtKDApCisgICAgICAgIE1lbnVUb29sYm94LkRyYXdNZW51QmFyKCkKKworICAgIGRlZiBtYWtlbWVudWJhcihzZWxmKToKKyAgICAgICAgc2VsZi5tZW51YmFyID0gTWVudUJhcihzZWxmKQorICAgICAgICBGcmFtZVdvcmsuQXBwbGVNZW51KHNlbGYubWVudWJhciwgc2VsZi5nZXRhYm91dHRleHQoKSwgc2VsZi5kb19hYm91dCkKKyAgICAgICAgc2VsZi5tYWtldXNlcm1lbnVzKCkKKworICAgIGRlZiBzY3JpcHRzd2FsayhzZWxmLCB0b3AsIG1lbnUsIGRvbmU9Tm9uZSk6CisgICAgICAgIGlmIG1lbnUuaWQgPiAyMDA6CisgICAgICAgICAgICBpbXBvcnQgVworICAgICAgICAgICAgVy5NZXNzYWdlKCJTY3JpcHRzIGZvbGRlciBub3QgY29tcGxldGVseSB0cmF2ZXJzZWQ6IHJ1bm5pbmcgb3V0IG9mIG1lbnVzIikKKyAgICAgICAgICAgIHJldHVybiBGYWxzZQorICAgICAgICBpZiBkb25lIGlzIE5vbmU6CisgICAgICAgICAgICBkb25lID0ge30KKyAgICAgICAgaWYgZG9uZS5oYXNfa2V5KHRvcCk6CisgICAgICAgICAgICByZXR1cm4gVHJ1ZQorICAgICAgICBkb25lW3RvcF0gPSAxCisgICAgICAgIGltcG9ydCBvcywgc3RyaW5nCisgICAgICAgIHRyeToKKyAgICAgICAgICAgIG5hbWVzID0gb3MubGlzdGRpcih0b3ApCisgICAgICAgIGV4Y2VwdCBvcy5lcnJvcjoKKyAgICAgICAgICAgIEZyYW1lV29yay5NZW51SXRlbShtZW51LCAnKFNjcmlwdHMgRm9sZGVyIG5vdCBmb3VuZCknLCBOb25lLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuIFRydWUKKyAgICAgICAgc2F2ZWRpciA9IG9zLmdldGN3ZCgpCisgICAgICAgIG9zLmNoZGlyKHRvcCkKKyAgICAgICAgZm9yIG5hbWUgaW4gbmFtZXM6CisgICAgICAgICAgICBpZiBuYW1lID09ICJDVlMiOgorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgZnNyLCBpc2RpciwgaXNhbGlhcyA9IEZpbGUuRlNSZXNvbHZlQWxpYXNGaWxlKG5hbWUsIDEpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgIyBtYXliZSBhIGJyb2tlbiBhbGlhcworICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBwYXRoID0gZnNyLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgICAgIGlmIGRvbmUuaGFzX2tleShwYXRoKToKKyAgICAgICAgICAgICAgICBjb250aW51ZQorICAgICAgICAgICAgbmFtZSA9IHN0cmluZy5zdHJpcChuYW1lKQorICAgICAgICAgICAgaWYgb3MubmFtZSA9PSAicG9zaXgiOgorICAgICAgICAgICAgICAgIG5hbWUgPSB1bmljb2RlKG5hbWUsICJ1dGYtOCIpCisgICAgICAgICAgICBpZiBuYW1lWy0zOl0gPT0gJy0tLSc6CisgICAgICAgICAgICAgICAgbWVudS5hZGRzZXBhcmF0b3IoKQorICAgICAgICAgICAgZWxpZiBpc2RpcjoKKyAgICAgICAgICAgICAgICBzdWJtZW51ID0gRnJhbWVXb3JrLlN1Yk1lbnUobWVudSwgbmFtZSkKKyAgICAgICAgICAgICAgICBpZiBub3Qgc2VsZi5zY3JpcHRzd2FsayhwYXRoLCBzdWJtZW51LCBkb25lKToKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNyZWF0b3IsIHR5cGUgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShwYXRoKQorICAgICAgICAgICAgICAgIGlmIHR5cGUgPT0gJ1RFWFQnOgorICAgICAgICAgICAgICAgICAgICBpZiBuYW1lWy0zOl0gPT0gJy5weSc6CisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lID0gbmFtZVs6LTNdCisgICAgICAgICAgICAgICAgICAgIGl0ZW0gPSBGcmFtZVdvcmsuTWVudUl0ZW0obWVudSwgbmFtZSwgTm9uZSwgc2VsZi5kb21lbnVfc2NyaXB0KQorICAgICAgICAgICAgICAgICAgICBzZWxmLl9zY3JpcHRzWyhtZW51LmlkLCBpdGVtLml0ZW0pXSA9IHBhdGgKKyAgICAgICAgICAgIGRvbmVbcGF0aF0gPSAxCisgICAgICAgIG9zLmNoZGlyKHNhdmVkaXIpCisgICAgICAgIHJldHVybiBUcnVlCisKKyAgICBkZWYgZG9tZW51X3NjcmlwdChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHBhdGggPSBzZWxmLl9zY3JpcHRzWyhpZCwgaXRlbSldCisgICAgICAgIGltcG9ydCBvcworICAgICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBzZWxmLm1ha2VzY3JpcHRzbWVudSgpCisgICAgICAgICAgICBpbXBvcnQgVworICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiRmlsZSBub3QgZm91bmQuIgorICAgICAgICBpZiBvcmQoRXZ0LkdldEtleXMoKVs3XSkgJiA0OgorICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KHBhdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBpbXBvcnQgVywgTWFjT1MsIHN5cworICAgICAgICAgICAgVy5TZXRDdXJzb3IoIndhdGNoIikKKyAgICAgICAgICAgIHN5cy5hcmd2ID0gW3BhdGhdCisgICAgICAgICAgICAjY3dkID0gb3MuZ2V0Y3dkKCkKKyAgICAgICAgICAgICNvcy5jaGRpcihvcy5wYXRoLmRpcm5hbWUocGF0aCkgKyAnOicpCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyB4eHggaWYgdGhlcmUgaXMgYSBzY3JpcHQgd2luZG93IGZvciB0aGlzIGZpbGUsCisgICAgICAgICAgICAgICAgIyBleGVjIGluIHRoYXQgd2luZG93J3MgbmFtZXNwYWNlLgorICAgICAgICAgICAgICAgICMgeHh4IHdoYXQgdG8gZG8gd2hlbiBpdCdzIG5vdCBzYXZlZD8/PworICAgICAgICAgICAgICAgICMgcHJvbXQgdG8gc2F2ZT8KKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgwKQorICAgICAgICAgICAgICAgIGV4ZWNmaWxlKHBhdGgsIHsnX19uYW1lX18nOiAnX19tYWluX18nLCAnX19maWxlX18nOiBwYXRofSkKKyAgICAgICAgICAgIGV4Y2VwdCBXLkFsZXJ0RXJyb3IsIGRldGFpbDoKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgICAgICByYWlzZSBXLkFsZXJ0RXJyb3IsIGRldGFpbAorICAgICAgICAgICAgZXhjZXB0IEtleWJvYXJkSW50ZXJydXB0OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgICAgICAgICAgTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQorICAgICAgICAgICAgICAgIGltcG9ydCBQeUVkaXQKKyAgICAgICAgICAgICAgICBQeUVkaXQudHJhY2ViYWNrd2luZG93LnRyYWNlYmFjaygxKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICAgICAgICAgIE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgICAgICNvcy5jaGRpcihjd2QpCisKKyAgICBkZWYgb3BlbnNjcmlwdChzZWxmLCBmaWxlbmFtZSwgbGluZW5vPU5vbmUsIGNoYXJvZmZzZXQ9MCwgbW9kbmFtZT0iIik6CisgICAgICAgIGltcG9ydCBvcywgUHlFZGl0LCBXCisgICAgICAgIGVkaXRvciA9IHNlbGYuZ2V0c2NyaXB0KGZpbGVuYW1lKQorICAgICAgICBpZiBlZGl0b3I6CisgICAgICAgICAgICBlZGl0b3Iuc2VsZWN0KCkKKyAgICAgICAgZWxpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICBlZGl0b3IgPSBQeUVkaXQuRWRpdG9yKGZpbGVuYW1lKQorICAgICAgICBlbGlmIGZpbGVuYW1lWy0zOl0gPT0gJy5weScgb3IgZmlsZW5hbWVbLTQ6XSA9PSAnLnB5Yyc6CisgICAgICAgICAgICBpbXBvcnQgaW1wCisgICAgICAgICAgICBpZiBub3QgbW9kbmFtZToKKyAgICAgICAgICAgICAgICBpZiBmaWxlbmFtZVstMV0gPT0gJ2MnOgorICAgICAgICAgICAgICAgICAgICBtb2RuYW1lID0gb3MucGF0aC5iYXNlbmFtZShmaWxlbmFtZSlbOi00XQorICAgICAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgICAgIG1vZG5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKVs6LTNdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgIyBYWFggVGhpcyBkb2VzIG5vdCB3b3JrIGNvcnJlY3RseSB3aXRoIHBhY2thZ2VzIQorICAgICAgICAgICAgICAgICMgWFhYIFRoZSBkb2NzIHNheSB3ZSBzaG91bGQgZG8gaXQgbWFudWFsbHksIHBhY2ssIHRoZW4gc3ViLCB0aGVuIHN1YjIgZXRjLgorICAgICAgICAgICAgICAgICMgWFhYIEl0IHNheXMgd2Ugc2hvdWxkIHVzZSBpbXAubG9hZF9tb2R1bGUoKSwgYnV0IHRoYXQgKnJlbG9hZHMqIGEgcGFja2FnZSwKKyAgICAgICAgICAgICAgICAjIFhYWCBhbmQgdGhhdCdzIHRoZSBsYXN0IHRoaW5nIHdlIHdhbnQgaGVyZS4KKyAgICAgICAgICAgICAgICBmLCBmaWxlbmFtZSwgKHN1ZmYsIG1vZGUsIGR1bW15KSA9IGltcC5maW5kX21vZHVsZShtb2RuYW1lKQorICAgICAgICAgICAgZXhjZXB0IEltcG9ydEVycm9yOgorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgbm90IGY6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKKyAgICAgICAgICAgICAgICBmLmNsb3NlKCkKKyAgICAgICAgICAgIGlmIHN1ZmYgPT0gJy5weSc6CisgICAgICAgICAgICAgICAgc2VsZi5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJvZmZzZXQpCisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBmb3IgXCIlc1wiIiAlIG1vZG5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIkNhbid0IGZpbmQgZmlsZSBcIiVzXCIiICUgZmlsZW5hbWUKKyAgICAgICAgaWYgbGluZW5vIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgZWRpdG9yLnNlbGVjdGxpbmUobGluZW5vLCBjaGFyb2Zmc2V0KQorICAgICAgICByZXR1cm4gZWRpdG9yCisKKyAgICBkZWYgZ2V0c2NyaXB0KHNlbGYsIGZpbGVuYW1lKToKKyAgICAgICAgaWYgZmlsZW5hbWVbOjFdID09ICc8JyBhbmQgZmlsZW5hbWVbLTE6XSA9PSAnPic6CisgICAgICAgICAgICBmaWxlbmFtZSA9IGZpbGVuYW1lWzE6LTFdCisgICAgICAgIGltcG9ydCBzdHJpbmcKKyAgICAgICAgbG93cGF0aCA9IHN0cmluZy5sb3dlcihmaWxlbmFtZSkKKyAgICAgICAgZm9yIHdpZCwgd2luZG93IGluIHNlbGYuX3dpbmRvd3MuaXRlbXMoKToKKyAgICAgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCAicGF0aCIpIGFuZCB0eXBlKHdpbmRvdy5wYXRoKSA9PSBTdHJpbmdUeXBlIGFuZCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93cGF0aCA9PSBzdHJpbmcubG93ZXIod2luZG93LnBhdGgpOgorICAgICAgICAgICAgICAgIHJldHVybiB3aW5kb3cKKyAgICAgICAgICAgIGVsaWYgaGFzYXR0cih3aW5kb3csICJwYXRoIikgYW5kIGZpbGVuYW1lID09IHdpZC5HZXRXVGl0bGUoKToKKyAgICAgICAgICAgICAgICByZXR1cm4gd2luZG93CisKKyAgICBkZWYgZ2V0cHJlZnMoc2VsZik6CisgICAgICAgIGltcG9ydCBNYWNQcmVmcworICAgICAgICByZXR1cm4gTWFjUHJlZnMuR2V0UHJlZnMoc2VsZi5wcmVmZmlsZXBhdGgpCisKKyAgICBkZWYgZG9fZWRpdG9ycHJlZnMoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgUHlFZGl0CisgICAgICAgIFB5RWRpdC5FZGl0b3JEZWZhdWx0U2V0dGluZ3MoKQorCisgICAgZGVmIGRvX3NldHdpbmRvd2ZvbnQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBpbXBvcnQgRm9udFNldHRpbmdzLCBXCisgICAgICAgIHByZWZzID0gc2VsZi5nZXRwcmVmcygpCisgICAgICAgIHNldHRpbmdzID0gRm9udFNldHRpbmdzLkZvbnREaWFsb2cocHJlZnMuZGVmYXVsdGZvbnQpCisgICAgICAgIGlmIHNldHRpbmdzOgorICAgICAgICAgICAgcHJlZnMuZGVmYXVsdGZvbnQsIHRhYnNldHRpbmdzID0gc2V0dGluZ3MKKyAgICAgICAgICAgIHJhaXNlIFcuQWxlcnRFcnJvciwgIk5vdGUgdGhhdCBjaGFuZ2VzIHdpbGwgb25seSBhZmZlY3QgbmV3IHdpbmRvd3MhIgogCiAKIAogY2xhc3MgTWVudUJhcihGcmFtZVdvcmsuTWVudUJhcik6Ci0JCi0JcG9zc2libGVJRHMgPSByYW5nZSgxMCwgMjU2KQotCQotCWRlZiBnZXRuZXh0aWQoc2VsZik6Ci0JCWlkID0gc2VsZi5wb3NzaWJsZUlEc1swXQotCQlkZWwgc2VsZi5wb3NzaWJsZUlEc1swXQotCQlyZXR1cm4gaWQKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcGFyZW50ID0gTm9uZSk6Ci0JCXNlbGYuYmFyID0gTWVudVRvb2xib3guR2V0TWVudUJhcigpCi0JCU1lbnVUb29sYm94LkNsZWFyTWVudUJhcigpCi0JCXNlbGYubWVudXMgPSB7fQotCQlzZWxmLnBhcmVudCA9IHBhcmVudAotCQotCWRlZiBkaXNwYXRjaChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6Ci0JCWlmIHNlbGYubWVudXMuaGFzX2tleShpZCk6Ci0JCQlzZWxmLm1lbnVzW2lkXS5kaXNwYXRjaChpZCwgaXRlbSwgd2luZG93LCBldmVudCkKLQkKLQlkZWYgZGVsbWVudShzZWxmLCBpZCk6Ci0JCU1lbnVUb29sYm94LkRlbGV0ZU1lbnUoaWQpCi0JCWlmIGlkIGluIHNlbGYucG9zc2libGVJRHM6Ci0JCQlwcmludCAiWFhYIGR1cGxpY2F0ZSBtZW51IElEISIsIGlkCi0JCXNlbGYucG9zc2libGVJRHMuYXBwZW5kKGlkKQotCQorCisgICAgcG9zc2libGVJRHMgPSByYW5nZSgxMCwgMjU2KQorCisgICAgZGVmIGdldG5leHRpZChzZWxmKToKKyAgICAgICAgaWQgPSBzZWxmLnBvc3NpYmxlSURzWzBdCisgICAgICAgIGRlbCBzZWxmLnBvc3NpYmxlSURzWzBdCisgICAgICAgIHJldHVybiBpZAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudCA9IE5vbmUpOgorICAgICAgICBzZWxmLmJhciA9IE1lbnVUb29sYm94LkdldE1lbnVCYXIoKQorICAgICAgICBNZW51VG9vbGJveC5DbGVhck1lbnVCYXIoKQorICAgICAgICBzZWxmLm1lbnVzID0ge30KKyAgICAgICAgc2VsZi5wYXJlbnQgPSBwYXJlbnQKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBpZCwgaXRlbSwgd2luZG93LCBldmVudCk6CisgICAgICAgIGlmIHNlbGYubWVudXMuaGFzX2tleShpZCk6CisgICAgICAgICAgICBzZWxmLm1lbnVzW2lkXS5kaXNwYXRjaChpZCwgaXRlbSwgd2luZG93LCBldmVudCkKKworICAgIGRlZiBkZWxtZW51KHNlbGYsIGlkKToKKyAgICAgICAgTWVudVRvb2xib3guRGVsZXRlTWVudShpZCkKKyAgICAgICAgaWYgaWQgaW4gc2VsZi5wb3NzaWJsZUlEczoKKyAgICAgICAgICAgIHByaW50ICJYWFggZHVwbGljYXRlIG1lbnUgSUQhIiwgaWQKKyAgICAgICAgc2VsZi5wb3NzaWJsZUlEcy5hcHBlbmQoaWQpCisKIAogY2xhc3MgTWVudShGcmFtZVdvcmsuTWVudSk6Ci0JCi0JZGVmIGRpc3BhdGNoKHNlbGYsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KToKLQkJdGl0bGUsIHNob3J0Y3V0LCBjYWxsYmFjaywga2luZCA9IHNlbGYuaXRlbXNbaXRlbS0xXQotCQlpZiB0eXBlKGNhbGxiYWNrKSA9PSBTdHJpbmdUeXBlOgotCQkJY2FsbGJhY2sgPSBzZWxmLl9nZXRtZW51aGFuZGxlcihjYWxsYmFjaykKLQkJaWYgY2FsbGJhY2s6Ci0JCQlpbXBvcnQgVwotCQkJVy5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGlkLCBpdGVtLCB3aW5kb3csIGV2ZW50KQotCQotCWRlZiBfZ2V0bWVudWhhbmRsZXIoc2VsZiwgY2FsbGJhY2spOgotCQltZW51aGFuZGxlciA9IE5vbmUKLQkJd2lkID0gTXlGcm9udFdpbmRvdygpCi0JCWlmIHdpZCBhbmQgc2VsZi5iYXIucGFyZW50Ll93aW5kb3dzLmhhc19rZXkod2lkKToKLQkJCXdpbmRvdyA9IHNlbGYuYmFyLnBhcmVudC5fd2luZG93c1t3aWRdCi0JCQlpZiBoYXNhdHRyKHdpbmRvdywgImRvbWVudV8iICsgY2FsbGJhY2spOgotCQkJCW1lbnVoYW5kbGVyID0gZ2V0YXR0cih3aW5kb3csICJkb21lbnVfIiArIGNhbGxiYWNrKQotCQkJZWxpZiBoYXNhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spOgotCQkJCW1lbnVoYW5kbGVyID0gZ2V0YXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKQotCQllbGlmIGhhc2F0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjayk6Ci0JCQltZW51aGFuZGxlciA9IGdldGF0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjaykKLQkJcmV0dXJuIG1lbnVoYW5kbGVyCiAKKyAgICBkZWYgZGlzcGF0Y2goc2VsZiwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB0aXRsZSwgc2hvcnRjdXQsIGNhbGxiYWNrLCBraW5kID0gc2VsZi5pdGVtc1tpdGVtLTFdCisgICAgICAgIGlmIHR5cGUoY2FsbGJhY2spID09IFN0cmluZ1R5cGU6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2dldG1lbnVoYW5kbGVyKGNhbGxiYWNrKQorICAgICAgICBpZiBjYWxsYmFjazoKKyAgICAgICAgICAgIGltcG9ydCBXCisgICAgICAgICAgICBXLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgaWQsIGl0ZW0sIHdpbmRvdywgZXZlbnQpCisKKyAgICBkZWYgX2dldG1lbnVoYW5kbGVyKHNlbGYsIGNhbGxiYWNrKToKKyAgICAgICAgbWVudWhhbmRsZXIgPSBOb25lCisgICAgICAgIHdpZCA9IE15RnJvbnRXaW5kb3coKQorICAgICAgICBpZiB3aWQgYW5kIHNlbGYuYmFyLnBhcmVudC5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgICAgICB3aW5kb3cgPSBzZWxmLmJhci5wYXJlbnQuX3dpbmRvd3Nbd2lkXQorICAgICAgICAgICAgaWYgaGFzYXR0cih3aW5kb3csICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICBtZW51aGFuZGxlciA9IGdldGF0dHIod2luZG93LCAiZG9tZW51XyIgKyBjYWxsYmFjaykKKyAgICAgICAgICAgIGVsaWYgaGFzYXR0cihzZWxmLmJhci5wYXJlbnQsICJkb21lbnVfIiArIGNhbGxiYWNrKToKKyAgICAgICAgICAgICAgICBtZW51aGFuZGxlciA9IGdldGF0dHIoc2VsZi5iYXIucGFyZW50LCAiZG9tZW51XyIgKyBjYWxsYmFjaykKKyAgICAgICAgZWxpZiBoYXNhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spOgorICAgICAgICAgICAgbWVudWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYuYmFyLnBhcmVudCwgImRvbWVudV8iICsgY2FsbGJhY2spCisgICAgICAgIHJldHVybiBtZW51aGFuZGxlcgpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XYmFzZS5weSBiL01hYy9Ub29scy9JREUvV2Jhc2UucHkKaW5kZXggYTVkNTU2Yi4uNGVlZjEyMCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XYmFzZS5weQorKysgYi9NYWMvVG9vbHMvSURFL1diYXNlLnB5CkBAIC05LDc5MCArOSw3OTAgQEAKIAogCiBkZWYgX2ludFJlY3QoKGwsIHQsIHIsIGIpKToKLQlyZXR1cm4gKGludChsKSwgaW50KHQpLCBpbnQociksIGludChiKSkKKyAgICByZXR1cm4gKGludChsKSwgaW50KHQpLCBpbnQociksIGludChiKSkKIAogCiBjbGFzcyBXaWRnZXQ6Ci0JCi0JIiIiQmFzZSBjbGFzcyBmb3IgYWxsIHdpZGdldHMuIiIiCi0JCi0JX3NlbGVjdGFibGUgPSAwCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUpOgotCQlzZWxmLl93aWRnZXRzID0gW10KLQkJc2VsZi5fd2lkZ2V0c2RpY3QgPSB7fQotCQlzZWxmLl9wb3NzaXplID0gcG9zc2l6ZQotCQlzZWxmLl9ib3VuZHMgPSBOb25lCi0JCXNlbGYuX3Zpc2libGUgPSAxCi0JCXNlbGYuX2VuYWJsZWQgPSAwCi0JCXNlbGYuX3NlbGVjdGVkID0gMAotCQlzZWxmLl9hY3RpdmF0ZWQgPSAwCi0JCXNlbGYuX2NhbGxiYWNrID0gTm9uZQotCQlzZWxmLl9wYXJlbnQgPSBOb25lCi0JCXNlbGYuX3BhcmVudHdpbmRvdyA9IE5vbmUKLQkJc2VsZi5fYmluZGluZ3MgPSB7fQotCQlzZWxmLl9iYWNrY29sb3IgPSBOb25lCi0JCi0JZGVmIHNob3coc2VsZiwgb25vZmYpOgotCQlzZWxmLl92aXNpYmxlID0gb25vZmYKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuc2hvdyhvbm9mZikKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93IGlzIG5vdCBOb25lIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkIGlzIG5vdCBOb25lOgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCWlmIG9ub2ZmOgotCQkJCXNlbGYuZHJhdygpCi0JCQllbHNlOgotCQkJCVFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQkjIGRyYXcgeW91ciBzdHVmZiBoZXJlCi0JCQlwYXNzCi0JCi0JZGVmIGdldHBvc3NpemUoc2VsZik6Ci0JCXJldHVybiBzZWxmLl9wb3NzaXplCi0JCi0JZGVmIGdldGJvdW5kcyhzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2JvdW5kcwotCQotCWRlZiBtb3ZlKHNlbGYsIHgsIHkgPSBOb25lKToKLQkJIiIiYWJzb2x1dGUgbW92ZSIiIgotCQlpZiB5ID09IE5vbmU6Ci0JCQl4LCB5ID0geAotCQlpZiB0eXBlKHNlbGYuX3Bvc3NpemUpIDw+IFR1cGxlVHlwZToKLQkJCXJhaXNlIFdpZGdldHNFcnJvciwgImNhbid0IG1vdmUgd2lkZ2V0IHdpdGggYm91bmRzIGZ1bmN0aW9uIgotCQlsLCB0LCByLCBiID0gc2VsZi5fcG9zc2l6ZQotCQlzZWxmLnJlc2l6ZSh4LCB5LCByLCBiKQotCQotCWRlZiBybW92ZShzZWxmLCB4LCB5ID0gTm9uZSk6Ci0JCSIiInJlbGF0aXZlIG1vdmUiIiIKLQkJaWYgeSA9PSBOb25lOgotCQkJeCwgeSA9IHgKLQkJaWYgdHlwZShzZWxmLl9wb3NzaXplKSA8PiBUdXBsZVR5cGU6Ci0JCQlyYWlzZSBXaWRnZXRzRXJyb3IsICJjYW4ndCBtb3ZlIHdpZGdldCB3aXRoIGJvdW5kcyBmdW5jdGlvbiIKLQkJbCwgdCwgciwgYiA9IHNlbGYuX3Bvc3NpemUKLQkJc2VsZi5yZXNpemUobCArIHgsIHQgKyB5LCByLCBiKQotCQkKLQlkZWYgcmVzaXplKHNlbGYsICphcmdzKToKLQkJaWYgbGVuKGFyZ3MpID09IDE6Ci0JCQlpZiB0eXBlKGFyZ3NbMF0pID09IEZ1bmN0aW9uVHlwZSBvciB0eXBlKGFyZ3NbMF0pID09IE1ldGhvZFR5cGU6Ci0JCQkJc2VsZi5fcG9zc2l6ZSA9IGFyZ3NbMF0KLQkJCWVsc2U6Ci0JCQkJYXBwbHkoc2VsZi5yZXNpemUsIGFyZ3NbMF0pCi0JCWVsaWYgbGVuKGFyZ3MpID09IDI6Ci0JCQlzZWxmLl9wb3NzaXplID0gKDAsIDApICsgYXJncwotCQllbGlmIGxlbihhcmdzKSA9PSA0OgotCQkJc2VsZi5fcG9zc2l6ZSA9IGFyZ3MKLQkJZWxzZToKLQkJCXJhaXNlIFR5cGVFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiCi0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWRlbCBzZWxmLl9jYWxsYmFjawotCQlkZWwgc2VsZi5fcG9zc2l6ZQotCQlkZWwgc2VsZi5fYmluZGluZ3MKLQkJZGVsIHNlbGYuX3BhcmVudAotCQlkZWwgc2VsZi5fcGFyZW50d2luZG93Ci0JCi0JZGVmIGJpbmQoc2VsZiwga2V5LCBjYWxsYmFjayk6Ci0JCSIiImJpbmQgYSBrZXkgb3IgYW4gJ2V2ZW50JyB0byBhIGNhbGxiYWNrIiIiCi0JCWlmIGNhbGxiYWNrOgotCQkJc2VsZi5fYmluZGluZ3Nba2V5XSA9IGNhbGxiYWNrCi0JCWVsaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleShrZXkpOgotCQkJZGVsIHNlbGYuX2JpbmRpbmdzW2tleV0KLQkKLQlkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQotCQotCWRlZiBfY2FsY2JvdW5kcyhzZWxmKToKLQkJIyBjYWxjdWxhdGUgYWJzb2x1dGUgYm91bmRzIHJlbGF0aXZlIHRvIHRoZSB3aW5kb3cgb3JpZ2luIGZyb20gb3VyCi0JCSMgYWJzdHJhY3QgX3Bvc3NpemUgYXR0cmlidXRlLCB3aGljaCBpcyBlaXRoZXIgYSA0LXR1cGxlIG9yIGEgY2FsbGFibGUgb2JqZWN0Ci0JCW9sZGJvdW5kcyA9IHNlbGYuX2JvdW5kcwotCQlwbCwgcHQsIHByLCBwYiA9IHNlbGYuX3BhcmVudC5fYm91bmRzCi0JCWlmIGNhbGxhYmxlKHNlbGYuX3Bvc3NpemUpOgotCQkJIyBfcG9zc2l6ZSBpcyBjYWxsYWJsZSwgbGV0IGl0IGZpZ3VyZSBpdCBvdXQgYnkgaXRzZWxmOiBpdCBzaG91bGQgcmV0dXJuIAotCQkJIyB0aGUgYm91bmRzIHJlbGF0aXZlIHRvIG91ciBwYXJlbnQgd2lkZ2V0LgotCQkJd2lkdGggPSBwciAtIHBsCi0JCQloZWlnaHQgPSBwYiAtIHB0Ci0JCQlzZWxmLl9ib3VuZHMgPSBRZC5PZmZzZXRSZWN0KF9pbnRSZWN0KHNlbGYuX3Bvc3NpemUod2lkdGgsIGhlaWdodCkpLCBwbCwgcHQpCi0JCWVsc2U6Ci0JCQkjIF9wb3NzaXplIG11c3QgYmUgYSA0LXR1cGxlLiBUaGlzIGlzIHdoZXJlIHRoZSBhbGdvcml0aG0gYnkgUGV0ZXIgS3JpZW5zIGFuZAotCQkJIyBQZXRyIHZhbiBCbG9rbGFuZCBraWNrcyBpbi4gKCoqKiBQYXJ0cyBvZiB0aGlzIGFsZ29yaXRobSBhcmUgYXBwbGllZCBmb3IgCi0JCQkjIHBhdGVudHMgYnkgRXJpY3Nzb24sIFN3ZWRlbiAqKiopCi0JCQlsLCB0LCByLCBiID0gc2VsZi5fcG9zc2l6ZQotCQkJIyBkZXBlbmRpbmcgb24gdGhlIHZhbHVlcyBvZiBsKGVmdCksIHQob3ApLCByKHJpZ2h0KSBhbmQgYihvdHRvbSksIAotCQkJIyB0aGV5IG1lYW4gZGlmZmVyZW50IHRoaW5nczoKLQkJCWlmIGwgPCAtMToKLQkJCQkjIGwgaXMgbGVzcyB0aGFuIC0xLCB0aGlzIG1lYW4gaXQgbWVhc3VyZXMgZnJvbSB0aGUgKnJpZ2h0KiBvZiBpdCdzIHBhcmVudAotCQkJCWwgPSBwciArIGwKLQkJCWVsc2U6Ci0JCQkJIyBsIGlzIC0xIG9yIGdyZWF0ZXIsIHRoaXMgbWVhbiBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqbGVmdCogb2YgaXQncyBwYXJlbnQKLQkJCQlsID0gcGwgKyBsCi0JCQlpZiB0IDwgLTE6Ci0JCQkJIyB0IGlzIGxlc3MgdGhhbiAtMSwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICpib3R0b20qIG9mIGl0J3MgcGFyZW50Ci0JCQkJdCA9IHBiICsgdAotCQkJZWxzZToKLQkJCQkjIHQgaXMgLTEgb3IgZ3JlYXRlciwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICp0b3AqIG9mIGl0J3MgcGFyZW50Ci0JCQkJdCA9IHB0ICsgdAotCQkJaWYgciA+IDE6Ci0JCQkJIyByIGlzIGdyZWF0ZXIgdGhhbiAxLCB0aGlzIG1lYW5zIHIgaXMgdGhlICp3aWR0aCogb2YgdGhlIHdpZGdldAotCQkJCXIgPSBsICsgcgotCQkJZWxzZToKLQkJCQkjIHIgaXMgbGVzcyB0aGFuIDEsIHRoaXMgbWVhbnMgaXQgbWVhc3VyZXMgZnJvbSB0aGUgKnJpZ2h0KiBvZiBpdCdzIHBhcmVudAotCQkJCXIgPSBwciArIHIKLQkJCWlmIGIgPiAxOgotCQkJCSMgYiBpcyBncmVhdGVyIHRoYW4gMSwgdGhpcyBtZWFucyBiIGlzIHRoZSAqaGVpZ2h0KiBvZiB0aGUgd2lkZ2V0Ci0JCQkJYiA9IHQgKyBiCi0JCQllbHNlOgotCQkJCSMgYiBpcyBsZXNzIHRoYW4gMSwgdGhpcyBtZWFucyBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqYm90dG9tKiBvZiBpdCdzIHBhcmVudAotCQkJCWIgPSBwYiArIGIKLQkJCXNlbGYuX2JvdW5kcyA9IChsLCB0LCByLCBiKQotCQlpZiBvbGRib3VuZHMgYW5kIG9sZGJvdW5kcyA8PiBzZWxmLl9ib3VuZHM6Ci0JCQlzZWxmLmFkanVzdChvbGRib3VuZHMpCi0JCWZvciB3IGluIHNlbGYuX3dpZGdldHM6Ci0JCQl3Ll9jYWxjYm91bmRzKCkKLQkKLQlkZWYgdGVzdChzZWxmLCBwb2ludCk6Ci0JCWlmIFFkLlB0SW5SZWN0KHBvaW50LCBzZWxmLl9ib3VuZHMpOgotCQkJcmV0dXJuIDEKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCXBhc3MKLQkKLQlkZWYgZmluZHdpZGdldChzZWxmLCBwb2ludCwgb25seWVuYWJsZWQgPSAxKToKLQkJaWYgc2VsZi50ZXN0KHBvaW50KToKLQkJCWZvciB3IGluIHNlbGYuX3dpZGdldHM6Ci0JCQkJd2lkZ2V0ID0gdy5maW5kd2lkZ2V0KHBvaW50KQotCQkJCWlmIHdpZGdldCBpcyBub3QgTm9uZToKLQkJCQkJcmV0dXJuIHdpZGdldAotCQkJaWYgc2VsZi5fZW5hYmxlZCBvciBub3Qgb25seWVuYWJsZWQ6Ci0JCQkJcmV0dXJuIHNlbGYKLQkKLQlkZWYgZm9yYWxsKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzKToKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXJ2ID0gYXBwbHkody5mb3JhbGwsIChtZXRob2RuYW1lLCkgKyBhcmdzKQotCQkJaWYgcnY6IAotCQkJCXJldHVybiBydgotCQlpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KCI8IiArIG1ldGhvZG5hbWUgKyAiPiIpOgotCQkJY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPCIgKyBtZXRob2RuYW1lICsgIj4iXQotCQkJcnYgPSBhcHBseShjYWxsYmFjaywgYXJncykKLQkJCWlmIHJ2OiAKLQkJCQlyZXR1cm4gcnYKLQkJaWYgaGFzYXR0cihzZWxmLCBtZXRob2RuYW1lKToKLQkJCW1ldGhvZCA9IGdldGF0dHIoc2VsZiwgbWV0aG9kbmFtZSkKLQkJCXJldHVybiBhcHBseShtZXRob2QsIGFyZ3MpCi0JCi0JZGVmIGZvcmFsbF9idXRzZWxmKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzKToKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXJ2ID0gYXBwbHkody5mb3JhbGwsIChtZXRob2RuYW1lLCkgKyBhcmdzKQotCQkJaWYgcnY6IAotCQkJCXJldHVybiBydgotCQotCWRlZiBmb3JhbGxfZnJvbWJvdHRvbShzZWxmLCBtZXRob2RuYW1lLCAqYXJncyk6Ci0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjwiICsgbWV0aG9kbmFtZSArICI+Iik6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8IiArIG1ldGhvZG5hbWUgKyAiPiJdCi0JCQlydiA9IGFwcGx5KGNhbGxiYWNrLCBhcmdzKQotCQkJaWYgcnY6IAotCQkJCXJldHVybiBydgotCQlpZiBoYXNhdHRyKHNlbGYsIG1ldGhvZG5hbWUpOgotCQkJbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBtZXRob2RuYW1lKQotCQkJcnYgPSBhcHBseShtZXRob2QsIGFyZ3MpCi0JCQlpZiBydjogCi0JCQkJcmV0dXJuIHJ2Ci0JCWZvciB3IGluIHNlbGYuX3dpZGdldHM6Ci0JCQlydiA9IGFwcGx5KHcuZm9yYWxsX2Zyb21ib3R0b20sIChtZXRob2RuYW1lLCkgKyBhcmdzKQotCQkJaWYgcnY6IAotCQkJCXJldHVybiBydgotCQotCWRlZiBfYWRkd2lkZ2V0KHNlbGYsIGtleSwgd2lkZ2V0KToKLQkJaWYgd2lkZ2V0IGluIHNlbGYuX3dpZGdldHM6Ci0JCQlyYWlzZSBWYWx1ZUVycm9yLCAiZHVwbGljYXRlIHdpZGdldCIKLQkJaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpOgotCQkJc2VsZi5fcmVtb3Zld2lkZ2V0KGtleSkKLQkJc2VsZi5fd2lkZ2V0cy5hcHBlbmQod2lkZ2V0KQotCQlzZWxmLl93aWRnZXRzZGljdFtrZXldID0gd2lkZ2V0Ci0JCXdpZGdldC5fcGFyZW50ID0gc2VsZgotCQlzZWxmLl9zZXRwYXJlbnR3aW5kb3cod2lkZ2V0KQotCQlpZiBzZWxmLl9wYXJlbnR3aW5kb3cgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQ6Ci0JCQl3aWRnZXQuZm9yYWxsX2Zyb21ib3R0b20oIm9wZW4iKQotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qod2lkZ2V0Ll9ib3VuZHMpCi0JCi0JZGVmIF9zZXRwYXJlbnR3aW5kb3coc2VsZiwgd2lkZ2V0KToKLQkJd2lkZ2V0Ll9wYXJlbnR3aW5kb3cgPSBzZWxmLl9wYXJlbnR3aW5kb3cKLQkJZm9yIHcgaW4gd2lkZ2V0Ll93aWRnZXRzOgotCQkJc2VsZi5fc2V0cGFyZW50d2luZG93KHcpCi0JCi0JZGVmIF9yZW1vdmV3aWRnZXQoc2VsZiwga2V5KToKLQkJaWYgbm90IHNlbGYuX3dpZGdldHNkaWN0Lmhhc19rZXkoa2V5KToKLQkJCXJhaXNlIEtleUVycm9yLCAibm8gd2lkZ2V0IHdpdGgga2V5ICVyIiAlIChrZXksKQotCQl3aWRnZXQgPSBzZWxmLl93aWRnZXRzZGljdFtrZXldCi0JCWZvciBrIGluIHdpZGdldC5fd2lkZ2V0c2RpY3Qua2V5cygpOgotCQkJd2lkZ2V0Ll9yZW1vdmV3aWRnZXQoaykKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0ID09IHdpZGdldDoKLQkJCXdpZGdldC5zZWxlY3QoMCkKLQkJCXNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IE5vbmUKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qod2lkZ2V0Ll9ib3VuZHMpCi0JCXdpZGdldC5jbG9zZSgpCi0JCWRlbCBzZWxmLl93aWRnZXRzZGljdFtrZXldCi0JCXNlbGYuX3dpZGdldHMucmVtb3ZlKHdpZGdldCkKLQkKLQlkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsdWUpOgotCQlpZiB0eXBlKHZhbHVlKSA9PSBJbnN0YW5jZVR5cGUgYW5kIGlzaW5zdGFuY2UodmFsdWUsIFdpZGdldCkgYW5kCVwKLQkJCQlhdHRyIG5vdCBpbiAoIl9jdXJyZW50d2lkZ2V0IiwgIl9sYXN0cm9sbG92ZXIiLCAKLQkJCQkiX3BhcmVudCIsICJfcGFyZW50d2luZG93IiwgIl9kZWZhdWx0YnV0dG9uIik6Ci0JCQlpZiBoYXNhdHRyKHNlbGYsIGF0dHIpOgotCQkJCXJhaXNlIFZhbHVlRXJyb3IsICJDYW4ndCByZXBsYWNlIGV4aXN0aW5nIGF0dHJpYnV0ZTogIiArIGF0dHIKLQkJCXNlbGYuX2FkZHdpZGdldChhdHRyLCB2YWx1ZSkKLQkJc2VsZi5fX2RpY3RfX1thdHRyXSA9IHZhbHVlCi0JCi0JZGVmIF9fZGVsYXR0cl9fKHNlbGYsIGF0dHIpOgotCQlpZiBhdHRyID09ICJfd2lkZ2V0c2RpY3QiOgotCQkJcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW5ub3QgZGVsZXRlIGF0dHJpYnV0ZSBfd2lkZ2V0c2RpY3QiCi0JCWlmIHNlbGYuX3dpZGdldHNkaWN0Lmhhc19rZXkoYXR0cik6Ci0JCQlzZWxmLl9yZW1vdmV3aWRnZXQoYXR0cikKLQkJCWlmIHNlbGYuX19kaWN0X18uaGFzX2tleShhdHRyKToKLQkJCQlkZWwgc2VsZi5fX2RpY3RfX1thdHRyXQotCQllbGlmIHNlbGYuX19kaWN0X18uaGFzX2tleShhdHRyKToKLQkJCWRlbCBzZWxmLl9fZGljdF9fW2F0dHJdCi0JCWVsc2U6Ci0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgotCQotCWRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKLQkJc2VsZi5fYWRkd2lkZ2V0KGtleSwgdmFsdWUpCi0JCi0JZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6Ci0JCWlmIG5vdCBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGtleSk6Ci0JCQlyYWlzZSBLZXlFcnJvciwga2V5Ci0JCXJldHVybiBzZWxmLl93aWRnZXRzZGljdFtrZXldCi0JCi0JZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6Ci0JCXNlbGYuX3JlbW92ZXdpZGdldChrZXkpCi0JCi0JZGVmIFNldFBvcnQoc2VsZik6Ci0JCXNlbGYuX3BhcmVudHdpbmRvdy5TZXRQb3J0KCkKLQkJCiAKLQlkZWYgR2V0V2luZG93KHNlbGYpOgotCQlyZXR1cm4gc2VsZi5fcGFyZW50d2luZG93LkdldFdpbmRvdygpCi0JCQotCWRlZiBfX2RlbF9fKHNlbGYpOgotCQlpZiBERUJVRzoKLQkJCXByaW50ICIlcyBpbnN0YW5jZSBkZWxldGVkIiAlIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCi0JCi0JZGVmIF9kcmF3Ym91bmRzKHNlbGYpOgotCQlRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICIiIkJhc2UgY2xhc3MgZm9yIGFsbCB3aWRnZXRzLiIiIgorCisgICAgX3NlbGVjdGFibGUgPSAwCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSk6CisgICAgICAgIHNlbGYuX3dpZGdldHMgPSBbXQorICAgICAgICBzZWxmLl93aWRnZXRzZGljdCA9IHt9CisgICAgICAgIHNlbGYuX3Bvc3NpemUgPSBwb3NzaXplCisgICAgICAgIHNlbGYuX2JvdW5kcyA9IE5vbmUKKyAgICAgICAgc2VsZi5fdmlzaWJsZSA9IDEKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDAKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWQgPSAwCisgICAgICAgIHNlbGYuX2FjdGl2YXRlZCA9IDAKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBOb25lCisgICAgICAgIHNlbGYuX3BhcmVudCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGFyZW50d2luZG93ID0gTm9uZQorICAgICAgICBzZWxmLl9iaW5kaW5ncyA9IHt9CisgICAgICAgIHNlbGYuX2JhY2tjb2xvciA9IE5vbmUKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgc2VsZi5fdmlzaWJsZSA9IG9ub2ZmCisgICAgICAgIGZvciB3IGluIHNlbGYuX3dpZGdldHM6CisgICAgICAgICAgICB3LnNob3cob25vZmYpCisgICAgICAgIGlmIHNlbGYuX3BhcmVudHdpbmRvdyBpcyBub3QgTm9uZSBhbmQgc2VsZi5fcGFyZW50d2luZG93LndpZCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgICAgICBzZWxmLmRyYXcoKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZC5FcmFzZVJlY3Qoc2VsZi5fYm91bmRzKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICAjIGRyYXcgeW91ciBzdHVmZiBoZXJlCisgICAgICAgICAgICBwYXNzCisKKyAgICBkZWYgZ2V0cG9zc2l6ZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX3Bvc3NpemUKKworICAgIGRlZiBnZXRib3VuZHMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9ib3VuZHMKKworICAgIGRlZiBtb3ZlKHNlbGYsIHgsIHkgPSBOb25lKToKKyAgICAgICAgIiIiYWJzb2x1dGUgbW92ZSIiIgorICAgICAgICBpZiB5ID09IE5vbmU6CisgICAgICAgICAgICB4LCB5ID0geAorICAgICAgICBpZiB0eXBlKHNlbGYuX3Bvc3NpemUpIDw+IFR1cGxlVHlwZToKKyAgICAgICAgICAgIHJhaXNlIFdpZGdldHNFcnJvciwgImNhbid0IG1vdmUgd2lkZ2V0IHdpdGggYm91bmRzIGZ1bmN0aW9uIgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fcG9zc2l6ZQorICAgICAgICBzZWxmLnJlc2l6ZSh4LCB5LCByLCBiKQorCisgICAgZGVmIHJtb3ZlKHNlbGYsIHgsIHkgPSBOb25lKToKKyAgICAgICAgIiIicmVsYXRpdmUgbW92ZSIiIgorICAgICAgICBpZiB5ID09IE5vbmU6CisgICAgICAgICAgICB4LCB5ID0geAorICAgICAgICBpZiB0eXBlKHNlbGYuX3Bvc3NpemUpIDw+IFR1cGxlVHlwZToKKyAgICAgICAgICAgIHJhaXNlIFdpZGdldHNFcnJvciwgImNhbid0IG1vdmUgd2lkZ2V0IHdpdGggYm91bmRzIGZ1bmN0aW9uIgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fcG9zc2l6ZQorICAgICAgICBzZWxmLnJlc2l6ZShsICsgeCwgdCArIHksIHIsIGIpCisKKyAgICBkZWYgcmVzaXplKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbGVuKGFyZ3MpID09IDE6CisgICAgICAgICAgICBpZiB0eXBlKGFyZ3NbMF0pID09IEZ1bmN0aW9uVHlwZSBvciB0eXBlKGFyZ3NbMF0pID09IE1ldGhvZFR5cGU6CisgICAgICAgICAgICAgICAgc2VsZi5fcG9zc2l6ZSA9IGFyZ3NbMF0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYXBwbHkoc2VsZi5yZXNpemUsIGFyZ3NbMF0pCisgICAgICAgIGVsaWYgbGVuKGFyZ3MpID09IDI6CisgICAgICAgICAgICBzZWxmLl9wb3NzaXplID0gKDAsIDApICsgYXJncworICAgICAgICBlbGlmIGxlbihhcmdzKSA9PSA0OgorICAgICAgICAgICAgc2VsZi5fcG9zc2l6ZSA9IGFyZ3MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIndyb25nIG51bWJlciBvZiBhcmd1bWVudHMiCisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5fY2FsbGJhY2sKKyAgICAgICAgZGVsIHNlbGYuX3Bvc3NpemUKKyAgICAgICAgZGVsIHNlbGYuX2JpbmRpbmdzCisgICAgICAgIGRlbCBzZWxmLl9wYXJlbnQKKyAgICAgICAgZGVsIHNlbGYuX3BhcmVudHdpbmRvdworCisgICAgZGVmIGJpbmQoc2VsZiwga2V5LCBjYWxsYmFjayk6CisgICAgICAgICIiImJpbmQgYSBrZXkgb3IgYW4gJ2V2ZW50JyB0byBhIGNhbGxiYWNrIiIiCisgICAgICAgIGlmIGNhbGxiYWNrOgorICAgICAgICAgICAgc2VsZi5fYmluZGluZ3Nba2V5XSA9IGNhbGxiYWNrCisgICAgICAgIGVsaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgZGVsIHNlbGYuX2JpbmRpbmdzW2tleV0KKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQorICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgX2NhbGNib3VuZHMoc2VsZik6CisgICAgICAgICMgY2FsY3VsYXRlIGFic29sdXRlIGJvdW5kcyByZWxhdGl2ZSB0byB0aGUgd2luZG93IG9yaWdpbiBmcm9tIG91cgorICAgICAgICAjIGFic3RyYWN0IF9wb3NzaXplIGF0dHJpYnV0ZSwgd2hpY2ggaXMgZWl0aGVyIGEgNC10dXBsZSBvciBhIGNhbGxhYmxlIG9iamVjdAorICAgICAgICBvbGRib3VuZHMgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcGwsIHB0LCBwciwgcGIgPSBzZWxmLl9wYXJlbnQuX2JvdW5kcworICAgICAgICBpZiBjYWxsYWJsZShzZWxmLl9wb3NzaXplKToKKyAgICAgICAgICAgICMgX3Bvc3NpemUgaXMgY2FsbGFibGUsIGxldCBpdCBmaWd1cmUgaXQgb3V0IGJ5IGl0c2VsZjogaXQgc2hvdWxkIHJldHVybgorICAgICAgICAgICAgIyB0aGUgYm91bmRzIHJlbGF0aXZlIHRvIG91ciBwYXJlbnQgd2lkZ2V0LgorICAgICAgICAgICAgd2lkdGggPSBwciAtIHBsCisgICAgICAgICAgICBoZWlnaHQgPSBwYiAtIHB0CisgICAgICAgICAgICBzZWxmLl9ib3VuZHMgPSBRZC5PZmZzZXRSZWN0KF9pbnRSZWN0KHNlbGYuX3Bvc3NpemUod2lkdGgsIGhlaWdodCkpLCBwbCwgcHQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIF9wb3NzaXplIG11c3QgYmUgYSA0LXR1cGxlLiBUaGlzIGlzIHdoZXJlIHRoZSBhbGdvcml0aG0gYnkgUGV0ZXIgS3JpZW5zIGFuZAorICAgICAgICAgICAgIyBQZXRyIHZhbiBCbG9rbGFuZCBraWNrcyBpbi4gKCoqKiBQYXJ0cyBvZiB0aGlzIGFsZ29yaXRobSBhcmUgYXBwbGllZCBmb3IKKyAgICAgICAgICAgICMgcGF0ZW50cyBieSBFcmljc3NvbiwgU3dlZGVuICoqKikKKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9wb3NzaXplCisgICAgICAgICAgICAjIGRlcGVuZGluZyBvbiB0aGUgdmFsdWVzIG9mIGwoZWZ0KSwgdChvcCksIHIocmlnaHQpIGFuZCBiKG90dG9tKSwKKyAgICAgICAgICAgICMgdGhleSBtZWFuIGRpZmZlcmVudCB0aGluZ3M6CisgICAgICAgICAgICBpZiBsIDwgLTE6CisgICAgICAgICAgICAgICAgIyBsIGlzIGxlc3MgdGhhbiAtMSwgdGhpcyBtZWFuIGl0IG1lYXN1cmVzIGZyb20gdGhlICpyaWdodCogb2YgaXQncyBwYXJlbnQKKyAgICAgICAgICAgICAgICBsID0gcHIgKyBsCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICMgbCBpcyAtMSBvciBncmVhdGVyLCB0aGlzIG1lYW4gaXQgbWVhc3VyZXMgZnJvbSB0aGUgKmxlZnQqIG9mIGl0J3MgcGFyZW50CisgICAgICAgICAgICAgICAgbCA9IHBsICsgbAorICAgICAgICAgICAgaWYgdCA8IC0xOgorICAgICAgICAgICAgICAgICMgdCBpcyBsZXNzIHRoYW4gLTEsIHRoaXMgbWVhbiBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqYm90dG9tKiBvZiBpdCdzIHBhcmVudAorICAgICAgICAgICAgICAgIHQgPSBwYiArIHQKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyB0IGlzIC0xIG9yIGdyZWF0ZXIsIHRoaXMgbWVhbiBpdCBtZWFzdXJlcyBmcm9tIHRoZSAqdG9wKiBvZiBpdCdzIHBhcmVudAorICAgICAgICAgICAgICAgIHQgPSBwdCArIHQKKyAgICAgICAgICAgIGlmIHIgPiAxOgorICAgICAgICAgICAgICAgICMgciBpcyBncmVhdGVyIHRoYW4gMSwgdGhpcyBtZWFucyByIGlzIHRoZSAqd2lkdGgqIG9mIHRoZSB3aWRnZXQKKyAgICAgICAgICAgICAgICByID0gbCArIHIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgIyByIGlzIGxlc3MgdGhhbiAxLCB0aGlzIG1lYW5zIGl0IG1lYXN1cmVzIGZyb20gdGhlICpyaWdodCogb2YgaXQncyBwYXJlbnQKKyAgICAgICAgICAgICAgICByID0gcHIgKyByCisgICAgICAgICAgICBpZiBiID4gMToKKyAgICAgICAgICAgICAgICAjIGIgaXMgZ3JlYXRlciB0aGFuIDEsIHRoaXMgbWVhbnMgYiBpcyB0aGUgKmhlaWdodCogb2YgdGhlIHdpZGdldAorICAgICAgICAgICAgICAgIGIgPSB0ICsgYgorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAjIGIgaXMgbGVzcyB0aGFuIDEsIHRoaXMgbWVhbnMgaXQgbWVhc3VyZXMgZnJvbSB0aGUgKmJvdHRvbSogb2YgaXQncyBwYXJlbnQKKyAgICAgICAgICAgICAgICBiID0gcGIgKyBiCisgICAgICAgICAgICBzZWxmLl9ib3VuZHMgPSAobCwgdCwgciwgYikKKyAgICAgICAgaWYgb2xkYm91bmRzIGFuZCBvbGRib3VuZHMgPD4gc2VsZi5fYm91bmRzOgorICAgICAgICAgICAgc2VsZi5hZGp1c3Qob2xkYm91bmRzKQorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5fY2FsY2JvdW5kcygpCisKKyAgICBkZWYgdGVzdChzZWxmLCBwb2ludCk6CisgICAgICAgIGlmIFFkLlB0SW5SZWN0KHBvaW50LCBzZWxmLl9ib3VuZHMpOgorICAgICAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGZpbmR3aWRnZXQoc2VsZiwgcG9pbnQsIG9ubHllbmFibGVkID0gMSk6CisgICAgICAgIGlmIHNlbGYudGVzdChwb2ludCk6CisgICAgICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgICAgIHdpZGdldCA9IHcuZmluZHdpZGdldChwb2ludCkKKyAgICAgICAgICAgICAgICBpZiB3aWRnZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHJldHVybiB3aWRnZXQKKyAgICAgICAgICAgIGlmIHNlbGYuX2VuYWJsZWQgb3Igbm90IG9ubHllbmFibGVkOgorICAgICAgICAgICAgICAgIHJldHVybiBzZWxmCisKKyAgICBkZWYgZm9yYWxsKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKKyAgICAgICAgICAgIHJ2ID0gYXBwbHkody5mb3JhbGwsIChtZXRob2RuYW1lLCkgKyBhcmdzKQorICAgICAgICAgICAgaWYgcnY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisgICAgICAgIGlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjwiICsgbWV0aG9kbmFtZSArICI+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8IiArIG1ldGhvZG5hbWUgKyAiPiJdCisgICAgICAgICAgICBydiA9IGFwcGx5KGNhbGxiYWNrLCBhcmdzKQorICAgICAgICAgICAgaWYgcnY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgbWV0aG9kbmFtZSk6CisgICAgICAgICAgICBtZXRob2QgPSBnZXRhdHRyKHNlbGYsIG1ldGhvZG5hbWUpCisgICAgICAgICAgICByZXR1cm4gYXBwbHkobWV0aG9kLCBhcmdzKQorCisgICAgZGVmIGZvcmFsbF9idXRzZWxmKHNlbGYsIG1ldGhvZG5hbWUsICphcmdzKToKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKKyAgICAgICAgICAgIHJ2ID0gYXBwbHkody5mb3JhbGwsIChtZXRob2RuYW1lLCkgKyBhcmdzKQorICAgICAgICAgICAgaWYgcnY6CisgICAgICAgICAgICAgICAgcmV0dXJuIHJ2CisKKyAgICBkZWYgZm9yYWxsX2Zyb21ib3R0b20oc2VsZiwgbWV0aG9kbmFtZSwgKmFyZ3MpOgorICAgICAgICBpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KCI8IiArIG1ldGhvZG5hbWUgKyAiPiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPCIgKyBtZXRob2RuYW1lICsgIj4iXQorICAgICAgICAgICAgcnYgPSBhcHBseShjYWxsYmFjaywgYXJncykKKyAgICAgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgICAgIHJldHVybiBydgorICAgICAgICBpZiBoYXNhdHRyKHNlbGYsIG1ldGhvZG5hbWUpOgorICAgICAgICAgICAgbWV0aG9kID0gZ2V0YXR0cihzZWxmLCBtZXRob2RuYW1lKQorICAgICAgICAgICAgcnYgPSBhcHBseShtZXRob2QsIGFyZ3MpCisgICAgICAgICAgICBpZiBydjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKKyAgICAgICAgICAgIHJ2ID0gYXBwbHkody5mb3JhbGxfZnJvbWJvdHRvbSwgKG1ldGhvZG5hbWUsKSArIGFyZ3MpCisgICAgICAgICAgICBpZiBydjoKKyAgICAgICAgICAgICAgICByZXR1cm4gcnYKKworICAgIGRlZiBfYWRkd2lkZ2V0KHNlbGYsIGtleSwgd2lkZ2V0KToKKyAgICAgICAgaWYgd2lkZ2V0IGluIHNlbGYuX3dpZGdldHM6CisgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiZHVwbGljYXRlIHdpZGdldCIKKyAgICAgICAgaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgc2VsZi5fcmVtb3Zld2lkZ2V0KGtleSkKKyAgICAgICAgc2VsZi5fd2lkZ2V0cy5hcHBlbmQod2lkZ2V0KQorICAgICAgICBzZWxmLl93aWRnZXRzZGljdFtrZXldID0gd2lkZ2V0CisgICAgICAgIHdpZGdldC5fcGFyZW50ID0gc2VsZgorICAgICAgICBzZWxmLl9zZXRwYXJlbnR3aW5kb3cod2lkZ2V0KQorICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQ6CisgICAgICAgICAgICB3aWRnZXQuZm9yYWxsX2Zyb21ib3R0b20oIm9wZW4iKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qod2lkZ2V0Ll9ib3VuZHMpCisKKyAgICBkZWYgX3NldHBhcmVudHdpbmRvdyhzZWxmLCB3aWRnZXQpOgorICAgICAgICB3aWRnZXQuX3BhcmVudHdpbmRvdyA9IHNlbGYuX3BhcmVudHdpbmRvdworICAgICAgICBmb3IgdyBpbiB3aWRnZXQuX3dpZGdldHM6CisgICAgICAgICAgICBzZWxmLl9zZXRwYXJlbnR3aW5kb3codykKKworICAgIGRlZiBfcmVtb3Zld2lkZ2V0KHNlbGYsIGtleSk6CisgICAgICAgIGlmIG5vdCBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICByYWlzZSBLZXlFcnJvciwgIm5vIHdpZGdldCB3aXRoIGtleSAlciIgJSAoa2V5LCkKKyAgICAgICAgd2lkZ2V0ID0gc2VsZi5fd2lkZ2V0c2RpY3Rba2V5XQorICAgICAgICBmb3IgayBpbiB3aWRnZXQuX3dpZGdldHNkaWN0LmtleXMoKToKKyAgICAgICAgICAgIHdpZGdldC5fcmVtb3Zld2lkZ2V0KGspCisgICAgICAgIGlmIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9PSB3aWRnZXQ6CisgICAgICAgICAgICB3aWRnZXQuc2VsZWN0KDApCisgICAgICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPSBOb25lCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHdpZGdldC5fYm91bmRzKQorICAgICAgICB3aWRnZXQuY2xvc2UoKQorICAgICAgICBkZWwgc2VsZi5fd2lkZ2V0c2RpY3Rba2V5XQorICAgICAgICBzZWxmLl93aWRnZXRzLnJlbW92ZSh3aWRnZXQpCisKKyAgICBkZWYgX19zZXRhdHRyX18oc2VsZiwgYXR0ciwgdmFsdWUpOgorICAgICAgICBpZiB0eXBlKHZhbHVlKSA9PSBJbnN0YW5jZVR5cGUgYW5kIGlzaW5zdGFuY2UodmFsdWUsIFdpZGdldCkgYW5kICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyIG5vdCBpbiAoIl9jdXJyZW50d2lkZ2V0IiwgIl9sYXN0cm9sbG92ZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgIl9wYXJlbnQiLCAiX3BhcmVudHdpbmRvdyIsICJfZGVmYXVsdGJ1dHRvbiIpOgorICAgICAgICAgICAgaWYgaGFzYXR0cihzZWxmLCBhdHRyKToKKyAgICAgICAgICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiQ2FuJ3QgcmVwbGFjZSBleGlzdGluZyBhdHRyaWJ1dGU6ICIgKyBhdHRyCisgICAgICAgICAgICBzZWxmLl9hZGR3aWRnZXQoYXR0ciwgdmFsdWUpCisgICAgICAgIHNlbGYuX19kaWN0X19bYXR0cl0gPSB2YWx1ZQorCisgICAgZGVmIF9fZGVsYXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICBpZiBhdHRyID09ICJfd2lkZ2V0c2RpY3QiOgorICAgICAgICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IsICJjYW5ub3QgZGVsZXRlIGF0dHJpYnV0ZSBfd2lkZ2V0c2RpY3QiCisgICAgICAgIGlmIHNlbGYuX3dpZGdldHNkaWN0Lmhhc19rZXkoYXR0cik6CisgICAgICAgICAgICBzZWxmLl9yZW1vdmV3aWRnZXQoYXR0cikKKyAgICAgICAgICAgIGlmIHNlbGYuX19kaWN0X18uaGFzX2tleShhdHRyKToKKyAgICAgICAgICAgICAgICBkZWwgc2VsZi5fX2RpY3RfX1thdHRyXQorICAgICAgICBlbGlmIHNlbGYuX19kaWN0X18uaGFzX2tleShhdHRyKToKKyAgICAgICAgICAgIGRlbCBzZWxmLl9fZGljdF9fW2F0dHJdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorCisgICAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgorICAgICAgICBzZWxmLl9hZGR3aWRnZXQoa2V5LCB2YWx1ZSkKKworICAgIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgorICAgICAgICBpZiBub3Qgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgcmFpc2UgS2V5RXJyb3IsIGtleQorICAgICAgICByZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3Rba2V5XQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6CisgICAgICAgIHNlbGYuX3JlbW92ZXdpZGdldChrZXkpCisKKyAgICBkZWYgU2V0UG9ydChzZWxmKToKKyAgICAgICAgc2VsZi5fcGFyZW50d2luZG93LlNldFBvcnQoKQorCisKKyAgICBkZWYgR2V0V2luZG93KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fcGFyZW50d2luZG93LkdldFdpbmRvdygpCisKKyAgICBkZWYgX19kZWxfXyhzZWxmKToKKyAgICAgICAgaWYgREVCVUc6CisgICAgICAgICAgICBwcmludCAiJXMgaW5zdGFuY2UgZGVsZXRlZCIgJSBzZWxmLl9fY2xhc3NfXy5fX25hbWVfXworCisgICAgZGVmIF9kcmF3Ym91bmRzKHNlbGYpOgorICAgICAgICBRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQogCiAKIGNsYXNzIENsaWNrYWJsZVdpZGdldChXaWRnZXQpOgotCQotCSIiIkJhc2UgY2xhc3MgZm9yIGNsaWNrYWJsZSB3aWRnZXRzLiAobm90ZTogc2VsZi5fZW5hYmxlZCBtdXN0IGJlIHRydWUgdG8gcmVjZWl2ZSBjbGljayBldmVudHMuKSIiIgotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJcGFzcwotCQotCWRlZiBlbmFibGUoc2VsZiwgb25vZmYpOgotCQlzZWxmLl9lbmFibGVkID0gb25vZmYKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5kcmF3KCkKLQkKLQlkZWYgY2FsbGJhY2soc2VsZik6Ci0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJcmV0dXJuIENhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSkKLQkKKworICAgICIiIkJhc2UgY2xhc3MgZm9yIGNsaWNrYWJsZSB3aWRnZXRzLiAobm90ZTogc2VsZi5fZW5hYmxlZCBtdXN0IGJlIHRydWUgdG8gcmVjZWl2ZSBjbGljayBldmVudHMuKSIiIgorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZHJhdygpCisKKyAgICBkZWYgY2FsbGJhY2soc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgcmV0dXJuIENhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSkKKwogCiBjbGFzcyBTZWxlY3RhYmxlV2lkZ2V0KENsaWNrYWJsZVdpZGdldCk6CiAKLQkiIiJCYXNlIGNsYXNzIGZvciBzZWxlY3RhYmxlIHdpZGdldHMuIiIiCi0JCi0JX3NlbGVjdGFibGUgPSAxCi0JCi0JZGVmIHNlbGVjdChzZWxmLCBvbm9mZiwgaXNjbGljayA9IDApOgotCQlpZiBvbm9mZiA9PSBzZWxmLl9zZWxlY3RlZDoKLQkJCXJldHVybiAxCi0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxzZWxlY3Q+Iik6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8c2VsZWN0PiJdCi0JCQlpZiBjYWxsYmFjayhvbm9mZik6Ci0JCQkJcmV0dXJuIDEKLQkJc2VsZi5fc2VsZWN0ZWQgPSBvbm9mZgotCQlpZiBvbm9mZjoKLQkJCWlmIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZToKLQkJCQlzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQuc2VsZWN0KDApCi0JCQlzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPSBzZWxmCi0JCWVsc2U6Ci0JCQlzZWxmLl9wYXJlbnR3aW5kb3cuX2N1cnJlbnR3aWRnZXQgPSBOb25lCi0JCi0JZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6Ci0JCXBhc3MKLQkKLQlkZWYgZHJhd3NlbGZyYW1lKHNlbGYsIG9ub2ZmKToKLQkJaWYgbm90IHNlbGYuX3BhcmVudHdpbmRvdy5faGFzc2VsZnJhbWVzOgotCQkJcmV0dXJuCi0JCUFwcC5EcmF3VGhlbWVGb2N1c1JlY3Qoc2VsZi5fYm91bmRzLCBvbm9mZikKLQkKLQlkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCWlmIHNlbGYuX3NlbGVjdGVkOgotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoUWQuSW5zZXRSZWN0KG9sZGJvdW5kcywgLTMsIC0zKSkKLQkJCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCi0JCWVsc2U6Ci0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGRib3VuZHMpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisgICAgIiIiQmFzZSBjbGFzcyBmb3Igc2VsZWN0YWJsZSB3aWRnZXRzLiIiIgorCisgICAgX3NlbGVjdGFibGUgPSAxCisKKyAgICBkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6CisgICAgICAgIGlmIG9ub2ZmID09IHNlbGYuX3NlbGVjdGVkOgorICAgICAgICAgICAgcmV0dXJuIDEKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPHNlbGVjdD4iKToKKyAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxzZWxlY3Q+Il0KKyAgICAgICAgICAgIGlmIGNhbGxiYWNrKG9ub2ZmKToKKyAgICAgICAgICAgICAgICByZXR1cm4gMQorICAgICAgICBzZWxmLl9zZWxlY3RlZCA9IG9ub2ZmCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5fcGFyZW50d2luZG93Ll9jdXJyZW50d2lkZ2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldC5zZWxlY3QoMCkKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IHNlbGYKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5fY3VycmVudHdpZGdldCA9IE5vbmUKKworICAgIGRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgZHJhd3NlbGZyYW1lKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudHdpbmRvdy5faGFzc2VsZnJhbWVzOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIEFwcC5EcmF3VGhlbWVGb2N1c1JlY3Qoc2VsZi5fYm91bmRzLCBvbm9mZikKKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWQ6CisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChRZC5JbnNldFJlY3Qob2xkYm91bmRzLCAtMywgLTMpKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgLTMsIC0zKSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKIAogCiBjbGFzcyBfTGluZShXaWRnZXQpOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aGlja25lc3MgPSAxKToKLQkJV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYuX3RoaWNrbmVzcyA9IHRoaWNrbmVzcwotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5kcmF3KCkKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCVFkLlBhaW50UmVjdChzZWxmLl9ib3VuZHMpCi0JCi0JZGVmIF9kcmF3Ym91bmRzKHNlbGYpOgotCQlwYXNzCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGhpY2tuZXNzID0gMSk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl90aGlja25lc3MgPSB0aGlja25lc3MKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLl9jYWxjYm91bmRzKCkKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgUWQuUGFpbnRSZWN0KHNlbGYuX2JvdW5kcykKKworICAgIGRlZiBfZHJhd2JvdW5kcyhzZWxmKToKKyAgICAgICAgcGFzcwogCiBjbGFzcyBIb3Jpem9udGFsTGluZShfTGluZSk6Ci0JCi0JZGVmIF9jYWxjYm91bmRzKHNlbGYpOgotCQlXaWRnZXQuX2NhbGNib3VuZHMoc2VsZikKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlzZWxmLl9ib3VuZHMgPSBsLCB0LCByLCB0ICsgc2VsZi5fdGhpY2tuZXNzCisKKyAgICBkZWYgX2NhbGNib3VuZHMoc2VsZik6CisgICAgICAgIFdpZGdldC5fY2FsY2JvdW5kcyhzZWxmKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIHNlbGYuX2JvdW5kcyA9IGwsIHQsIHIsIHQgKyBzZWxmLl90aGlja25lc3MKIAogY2xhc3MgVmVydGljYWxMaW5lKF9MaW5lKToKLQkKLQlkZWYgX2NhbGNib3VuZHMoc2VsZik6Ci0JCVdpZGdldC5fY2FsY2JvdW5kcyhzZWxmKQotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCXNlbGYuX2JvdW5kcyA9IGwsIHQsIGwgKyBzZWxmLl90aGlja25lc3MsIGIKKworICAgIGRlZiBfY2FsY2JvdW5kcyhzZWxmKToKKyAgICAgICAgV2lkZ2V0Ll9jYWxjYm91bmRzKHNlbGYpCisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgc2VsZi5fYm91bmRzID0gbCwgdCwgbCArIHNlbGYuX3RoaWNrbmVzcywgYgogCiAKIGNsYXNzIEZyYW1lKFdpZGdldCk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHBhdHRlcm4gPSBRZC5HZXRRREdsb2JhbHNCbGFjaygpLCBjb2xvciA9ICgwLCAwLCAwKSk6Ci0JCVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9mcmFtZXBhdHRlcm4gPSBwYXR0ZXJuCi0JCXNlbGYuX2ZyYW1lY29sb3IgPSBjb2xvcgotCQotCWRlZiBzZXRjb2xvcihzZWxmLCBjb2xvcik6Ci0JCXNlbGYuX2ZyYW1lY29sb3IgPSBjb2xvcgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBzZXRwYXR0ZXJuKHNlbGYsIHBhdHRlcm4pOgotCQlzZWxmLl9mcmFtZXBhdHRlcm4gPSBwYXR0ZXJuCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZHJhdygpCi0JCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJcGVuc3RhdGUgPSBRZC5HZXRQZW5TdGF0ZSgpCi0JCQlRZC5QZW5QYXQoc2VsZi5fZnJhbWVwYXR0ZXJuKQotCQkJUWQuUkdCRm9yZUNvbG9yKHNlbGYuX2ZyYW1lY29sb3IpCi0JCQlRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQotCQkJUWQuUkdCRm9yZUNvbG9yKCgwLCAwLCAwKSkKLQkJCVFkLlNldFBlblN0YXRlKHBlbnN0YXRlKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHBhdHRlcm4gPSBRZC5HZXRRREdsb2JhbHNCbGFjaygpLCBjb2xvciA9ICgwLCAwLCAwKSk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl9mcmFtZXBhdHRlcm4gPSBwYXR0ZXJuCisgICAgICAgIHNlbGYuX2ZyYW1lY29sb3IgPSBjb2xvcgorCisgICAgZGVmIHNldGNvbG9yKHNlbGYsIGNvbG9yKToKKyAgICAgICAgc2VsZi5fZnJhbWVjb2xvciA9IGNvbG9yCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZHJhdygpCisKKyAgICBkZWYgc2V0cGF0dGVybihzZWxmLCBwYXR0ZXJuKToKKyAgICAgICAgc2VsZi5fZnJhbWVwYXR0ZXJuID0gcGF0dGVybgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmRyYXcoKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBwZW5zdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKKyAgICAgICAgICAgIFFkLlBlblBhdChzZWxmLl9mcmFtZXBhdHRlcm4pCisgICAgICAgICAgICBRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fZnJhbWVjb2xvcikKKyAgICAgICAgICAgIFFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisgICAgICAgICAgICBRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQorICAgICAgICAgICAgUWQuU2V0UGVuU3RhdGUocGVuc3RhdGUpCiAKIGRlZiBfZGFya2VuY29sb3IoKHIsIGcsIGIpKToKLQlyZXR1cm4gaW50KDAuNzUgKiByKSwgaW50KDAuNzUgKiBnKSwgaW50KDAuNzUgKiBiKQorICAgIHJldHVybiBpbnQoMC43NSAqIHIpLCBpbnQoMC43NSAqIGcpLCBpbnQoMC43NSAqIGIpCiAKIGNsYXNzIEJldmVsQm94KFdpZGdldCk6Ci0JCi0JIiIiJ1BsYXRpbnVtJyBiZXZlbGVkIHJlY3RhbmdsZS4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY29sb3IgPSAoMHhlMDAwLCAweGUwMDAsIDB4ZTAwMCkpOgotCQlXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fY29sb3IgPSBjb2xvcgotCQlzZWxmLl9kYXJrZXJjb2xvciA9IF9kYXJrZW5jb2xvcihjb2xvcikKLQkKLQlkZWYgc2V0Y29sb3Ioc2VsZiwgY29sb3IpOgotCQlzZWxmLl9jb2xvciA9IGNvbG9yCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZHJhdygpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlsLCB0LCByLCBiID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSkKLQkJCVFkLlJHQkZvcmVDb2xvcihzZWxmLl9jb2xvcikKLQkJCVFkLlBhaW50UmVjdCgobCwgdCwgciwgYikpCi0JCQlRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fZGFya2VyY29sb3IpCi0JCQlRZC5Nb3ZlVG8obCwgYikKLQkJCVFkLkxpbmVUbyhyLCBiKQotCQkJUWQuTGluZVRvKHIsIHQpCi0JCQlRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQorCisgICAgIiIiJ1BsYXRpbnVtJyBiZXZlbGVkIHJlY3RhbmdsZS4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjb2xvciA9ICgweGUwMDAsIDB4ZTAwMCwgMHhlMDAwKSk6CisgICAgICAgIFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl9jb2xvciA9IGNvbG9yCisgICAgICAgIHNlbGYuX2RhcmtlcmNvbG9yID0gX2RhcmtlbmNvbG9yKGNvbG9yKQorCisgICAgZGVmIHNldGNvbG9yKHNlbGYsIGNvbG9yKToKKyAgICAgICAgc2VsZi5fY29sb3IgPSBjb2xvcgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmRyYXcoKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBsLCB0LCByLCBiID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihzZWxmLl9jb2xvcikKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdCgobCwgdCwgciwgYikpCisgICAgICAgICAgICBRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fZGFya2VyY29sb3IpCisgICAgICAgICAgICBRZC5Nb3ZlVG8obCwgYikKKyAgICAgICAgICAgIFFkLkxpbmVUbyhyLCBiKQorICAgICAgICAgICAgUWQuTGluZVRvKHIsIHQpCisgICAgICAgICAgICBRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQogCiAKIGNsYXNzIEdyb3VwKFdpZGdldCk6Ci0JCi0JIiIiQSBjb250YWluZXIgZm9yIHN1YndpZGdldHMiIiIKKworICAgICIiIkEgY29udGFpbmVyIGZvciBzdWJ3aWRnZXRzIiIiCiAKIAogY2xhc3MgSG9yaXpvbnRhbFBhbmVzKFdpZGdldCk6Ci0JCi0JIiIiUGFuZXMsIGEuay5hLiBmcmFtZXMuIFdvcmtzIGEgYml0IGxpa2UgYSBncm91cC4gRGV2aWRlcyB0aGUgd2lkZ2V0IGFyZWEgaW50byAicGFuZXMiLAotCXdoaWNoIGNhbiBiZSByZXNpemVkIGJ5IHRoZSB1c2VyIGJ5IGNsaWNraW5nIGFuZCBkcmFnZ2luZyBiZXR3ZWVuIHRoZSBzdWJ3aWRnZXRzLiIiIgotCQotCV9kaXJlY3Rpb24gPSAxCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHBhbmVzaXplcyA9IE5vbmUsIGd1dHRlciA9IDgpOgotCQkiIiJwYW5lc2l6ZXMgc2hvdWxkIGJlIGEgdHVwbGUgb2YgbnVtYmVycy4gVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGUgaXMgdGhlIG51bWJlciBvZiBwYW5lcywgCi0JCXRoZSBpdGVtcyBpbiB0aGUgdHVwbGUgYXJlIHRoZSByZWxhdGl2ZSBzaXplcyBvZiB0aGVzZSBwYW5lczsgdGhlc2UgbnVtYmVycyBzaG91bGQgYWRkIHVwIAotCQl0byAxICh0aGUgdG90YWwgc2l6ZSBvZiBhbGwgcGFuZXMpLiIiIgotCQlXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fcGFuZXNpemVzID0gcGFuZXNpemVzCi0JCXNlbGYuX2d1dHRlciA9IGd1dHRlcgotCQlzZWxmLl9lbmFibGVkID0gMQotCQlzZWxmLnNldHVwcGFuZXMoKQotCQotCSNkZWYgb3BlbihzZWxmKToKLQkjCXNlbGYuaW5zdGFsbGJvdW5kcygpCi0JIwlDbGlja2FibGVXaWRnZXQub3BlbihzZWxmKQotCQotCWRlZiBfY2FsY2JvdW5kcyhzZWxmKToKLQkJIyBobW1tLiBJdCBzaG91bGQgbm90IG5lY2Nlc2FyeSBiZSBvdmVycmlkZSBfY2FsY2JvdW5kcyA6LSgKLQkJc2VsZi5pbnN0YWxsYm91bmRzKCkKLQkJV2lkZ2V0Ll9jYWxjYm91bmRzKHNlbGYpCi0JCi0JZGVmIHNldHVwcGFuZXMoc2VsZik6Ci0JCXBhbmVzaXplcyA9IHNlbGYuX3BhbmVzaXplcwotCQl0b3RhbCA9IDAKLQkJaWYgcGFuZXNpemVzIGlzIG5vdCBOb25lOgotCQkJI2lmIGxlbihzZWxmLl93aWRnZXRzKSA8PiBsZW4ocGFuZXNpemVzKToKLQkJCSMJcmFpc2UgVHlwZUVycm9yLCAnbnVtYmVyIG9mIHdpZGdldHMgZG9lcyBub3QgbWF0Y2ggbnVtYmVyIG9mIHBhbmVzJwotCQkJZm9yIHBhbmVzaXplIGluIHBhbmVzaXplczoKLQkJCQlpZiBub3QgMCA8IHBhbmVzaXplIDwgMToKLQkJCQkJcmFpc2UgVHlwZUVycm9yLCAncGFuZSBzaXplcyBtdXN0IGJlIGJldHdlZW4gMCBhbmQgMSwgbm90IGluY2x1ZGluZy4nCi0JCQkJdG90YWwgPSB0b3RhbCArIHBhbmVzaXplCi0JCQlpZiByb3VuZCh0b3RhbCwgNCkgPD4gMS4wOgotCQkJCXJhaXNlIFR5cGVFcnJvciwgJ3BhbmUgc2l6ZXMgbXVzdCBhZGQgdXAgdG8gMScKLQkJZWxzZToKLQkJCSMgWFhYIGRvZXMgbm90IHdvcmshCi0JCQlzdGVwID0gMS4wIC8gbGVuKHNlbGYuX3dpZGdldHMpCi0JCQlwYW5lc2l6ZXMgPSBbXQotCQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuX3dpZGdldHMpKToKLQkJCQlwYW5lc2l6ZXMuYXBwZW5kKHN0ZXApCi0JCWN1cnJlbnQgPSAwCi0JCXNlbGYuX3BhbmVzaXplcyA9IFtdCi0JCXNlbGYuX2d1dHRlcnMgPSBbXQotCQlmb3IgcGFuZXNpemUgaW4gcGFuZXNpemVzOgotCQkJaWYgY3VycmVudDoKLQkJCQlzZWxmLl9ndXR0ZXJzLmFwcGVuZChjdXJyZW50KQotCQkJc2VsZi5fcGFuZXNpemVzLmFwcGVuZCgoY3VycmVudCwgY3VycmVudCArIHBhbmVzaXplKSkKLQkJCWN1cnJlbnQgPSBjdXJyZW50ICsgcGFuZXNpemUKLQkJc2VsZi5tYWtlcGFuZWJvdW5kcygpCi0JCi0JZGVmIGdldHBhbmVzaXplcyhzZWxmKToKLQkJcmV0dXJuIG1hcChsYW1iZGEgKGZyLCB0byk6IHRvLWZyLCAgc2VsZi5fcGFuZXNpemVzKQotCQotCWJvdW5kc3RlbXBsYXRlID0gImxhbWJkYSB3aWR0aCwgaGVpZ2h0OiAoMCwgaGVpZ2h0ICogJXMgKyAlZCwgd2lkdGgsIGhlaWdodCAqICVzICsgJWQpIgotCQotCWRlZiBtYWtlcGFuZWJvdW5kcyhzZWxmKToKLQkJaGFsZmd1dHRlciA9IHNlbGYuX2d1dHRlciAvIDIKLQkJc2VsZi5fcGFuZWJvdW5kcyA9IFtdCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9wYW5lc2l6ZXMpKToKLQkJCXBhbmVzdGFydCwgcGFuZWVuZCA9IHNlbGYuX3BhbmVzaXplc1tpXQotCQkJYm91bmRzc3RyaW5nID0gc2VsZi5ib3VuZHN0ZW1wbGF0ZSAlIChyZXByKHBhbmVzdGFydCksIHBhbmVzdGFydCBhbmQgaGFsZmd1dHRlciwgCi0JCQkJCQkJcmVwcihwYW5lZW5kKSwgKHBhbmVlbmQgPD4gMS4wKSBhbmQgLWhhbGZndXR0ZXIpCi0JCQlzZWxmLl9wYW5lYm91bmRzLmFwcGVuZChldmFsKGJvdW5kc3N0cmluZykpCi0JCi0JZGVmIGluc3RhbGxib3VuZHMoc2VsZik6Ci0JCSNzZWxmLnNldHVwcGFuZXMoKQotCQlmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fd2lkZ2V0cykpOgotCQkJdyA9IHNlbGYuX3dpZGdldHNbaV0KLQkJCXcuX3Bvc3NpemUgPSBzZWxmLl9wYW5lYm91bmRzW2ldCi0JCQkjaWYgaGFzYXR0cih3LCAic2V0dXBwYW5lcyIpOgotCQkJIwl3LnNldHVwcGFuZXMoKQotCQkJaWYgaGFzYXR0cih3LCAiaW5zdGFsbGJvdW5kcyIpOgotCQkJCXcuaW5zdGFsbGJvdW5kcygpCi0JCi0JZGVmIHJvbGxvdmVyKHNlbGYsIHBvaW50LCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJb3JnbW91c2UgPSBwb2ludFtzZWxmLl9kaXJlY3Rpb25dCi0JCQloYWxmZ3V0dGVyID0gc2VsZi5fZ3V0dGVyIC8gMgotCQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQkJaWYgc2VsZi5fZGlyZWN0aW9uOgotCQkJCWJlZ2luLCBlbmQgPSB0LCBiCi0JCQllbHNlOgotCQkJCWJlZ2luLCBlbmQgPSBsLCByCi0JCQkKLQkJCWkgPSBzZWxmLmZpbmRndXR0ZXIob3JnbW91c2UsIGJlZ2luLCBlbmQpCi0JCQlpZiBpIGlzIE5vbmU6Ci0JCQkJU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCQllbHNlOgotCQkJCVNldEN1cnNvcihzZWxmLl9kaXJlY3Rpb24gYW5kICd2bW92ZXInIG9yICdobW92ZXInKQotCQotCWRlZiBmaW5kZ3V0dGVyKHNlbGYsIG9yZ21vdXNlLCBiZWdpbiwgZW5kKToKLQkJdG9sZXJhbmNlID0gbWF4KDQsIHNlbGYuX2d1dHRlcikgLyAyCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9ndXR0ZXJzKSk6Ci0JCQlwb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBzZWxmLl9ndXR0ZXJzW2ldCi0JCQlpZiBhYnMob3JnbW91c2UgLSBwb3MpIDw9IHRvbGVyYW5jZToKLQkJCQlicmVhawotCQllbHNlOgotCQkJcmV0dXJuCi0JCXJldHVybiBpCi0JCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQkjIHdoYXQgYSBtZXNzLi4uCi0JCW9yZ21vdXNlID0gcG9pbnRbc2VsZi5fZGlyZWN0aW9uXQotCQloYWxmZ3V0dGVyID0gc2VsZi5fZ3V0dGVyIC8gMgotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCWlmIHNlbGYuX2RpcmVjdGlvbjoKLQkJCWJlZ2luLCBlbmQgPSB0LCBiCi0JCWVsc2U6Ci0JCQliZWdpbiwgZW5kID0gbCwgcgotCQkKLQkJaSA9IHNlbGYuZmluZGd1dHRlcihvcmdtb3VzZSwgYmVnaW4sIGVuZCkKLQkJaWYgaSBpcyBOb25lOgotCQkJcmV0dXJuCi0JCQotCQlwb3MgPSBvcmdwb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBzZWxmLl9ndXR0ZXJzW2ldCSMgaW5pdCBwb3MgdG9vLCBmb3IgZmFzdCBjbGljayBvbiBib3JkZXIsIGJ1ZyBkb25lIGJ5IFBldHIKLQkJCi0JCW1pbnBvcyA9IHNlbGYuX3BhbmVzaXplc1tpXVswXQotCQltYXhwb3MgPSBzZWxmLl9wYW5lc2l6ZXNbaSsxXVsxXQotCQltaW5wb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBtaW5wb3MgKyA2NAotCQltYXhwb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBtYXhwb3MgLSA2NAotCQlpZiBtaW5wb3MgPiBvcmdwb3MgYW5kIG1heHBvcyA8IG9yZ3BvczoKLQkJCXJldHVybgotCQkKLQkJI1NldEN1cnNvcigiZmlzdCIpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCWlmIHNlbGYuX2RpcmVjdGlvbjoKLQkJCXJlY3QgPSBsLCBvcmdwb3MgLSAxLCByLCBvcmdwb3MKLQkJZWxzZToKLQkJCXJlY3QgPSBvcmdwb3MgLSAxLCB0LCBvcmdwb3MsIGIKLQkJCi0JCSMgdHJhY2sgbW91c2UgLS0tIFhYWCAgbW92ZSB0byBzZXBhcmF0ZSBtZXRob2Q/Ci0JCVFkLlBlbk1vZGUoUXVpY2tEcmF3LnNyY1hvcikKLQkJUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKLQkJUWQuUGFpbnRSZWN0KF9pbnRSZWN0KHJlY3QpKQotCQlsYXN0cG9zID0gTm9uZQotCQl3aGlsZSBFdnQuQnV0dG9uKCk6Ci0JCQlwb3MgPSBvcmdwb3MgLSBvcmdtb3VzZSArIEV2dC5HZXRNb3VzZSgpW3NlbGYuX2RpcmVjdGlvbl0KLQkJCXBvcyA9IG1heChwb3MsIG1pbnBvcykKLQkJCXBvcyA9IG1pbihwb3MsIG1heHBvcykKLQkJCWlmIHBvcyA9PSBsYXN0cG9zOgotCQkJCWNvbnRpbnVlCi0JCQlRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQotCQkJUWQuUGFpbnRSZWN0KF9pbnRSZWN0KHJlY3QpKQotCQkJaWYgc2VsZi5fZGlyZWN0aW9uOgotCQkJCXJlY3QgPSBsLCBwb3MgLSAxLCByLCBwb3MKLQkJCWVsc2U6Ci0JCQkJcmVjdCA9IHBvcyAtIDEsIHQsIHBvcywgYgotCQkJUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKLQkJCVFkLlBhaW50UmVjdChfaW50UmVjdChyZWN0KSkKLQkJCWxhc3Rwb3MgPSBwb3MKLQkJCXNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpCi0JCQlFdnQuV2FpdE5leHRFdmVudCgwLCAzKQotCQlRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCi0JCVFkLlBlbk5vcm1hbCgpCi0JCVNldEN1cnNvcigid2F0Y2giKQotCQkKLQkJbmV3cG9zID0gKHBvcyAtIGJlZ2luKSAvIGZsb2F0KGVuZCAtIGJlZ2luKQotCQlzZWxmLl9ndXR0ZXJzW2ldID0gbmV3cG9zCi0JCXNlbGYuX3BhbmVzaXplc1tpXSA9IHNlbGYuX3BhbmVzaXplc1tpXVswXSwgbmV3cG9zCi0JCXNlbGYuX3BhbmVzaXplc1tpKzFdID0gbmV3cG9zLCBzZWxmLl9wYW5lc2l6ZXNbaSsxXVsxXQotCQlzZWxmLm1ha2VwYW5lYm91bmRzKCkKLQkJc2VsZi5pbnN0YWxsYm91bmRzKCkKLQkJc2VsZi5fY2FsY2JvdW5kcygpCisKKyAgICAiIiJQYW5lcywgYS5rLmEuIGZyYW1lcy4gV29ya3MgYSBiaXQgbGlrZSBhIGdyb3VwLiBEZXZpZGVzIHRoZSB3aWRnZXQgYXJlYSBpbnRvICJwYW5lcyIsCisgICAgd2hpY2ggY2FuIGJlIHJlc2l6ZWQgYnkgdGhlIHVzZXIgYnkgY2xpY2tpbmcgYW5kIGRyYWdnaW5nIGJldHdlZW4gdGhlIHN1YndpZGdldHMuIiIiCisKKyAgICBfZGlyZWN0aW9uID0gMQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHBhbmVzaXplcyA9IE5vbmUsIGd1dHRlciA9IDgpOgorICAgICAgICAiIiJwYW5lc2l6ZXMgc2hvdWxkIGJlIGEgdHVwbGUgb2YgbnVtYmVycy4gVGhlIGxlbmd0aCBvZiB0aGUgdHVwbGUgaXMgdGhlIG51bWJlciBvZiBwYW5lcywKKyAgICAgICAgdGhlIGl0ZW1zIGluIHRoZSB0dXBsZSBhcmUgdGhlIHJlbGF0aXZlIHNpemVzIG9mIHRoZXNlIHBhbmVzOyB0aGVzZSBudW1iZXJzIHNob3VsZCBhZGQgdXAKKyAgICAgICAgdG8gMSAodGhlIHRvdGFsIHNpemUgb2YgYWxsIHBhbmVzKS4iIiIKKyAgICAgICAgV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisgICAgICAgIHNlbGYuX3BhbmVzaXplcyA9IHBhbmVzaXplcworICAgICAgICBzZWxmLl9ndXR0ZXIgPSBndXR0ZXIKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKyAgICAgICAgc2VsZi5zZXR1cHBhbmVzKCkKKworICAgICNkZWYgb3BlbihzZWxmKToKKyAgICAjICAgICAgIHNlbGYuaW5zdGFsbGJvdW5kcygpCisgICAgIyAgICAgICBDbGlja2FibGVXaWRnZXQub3BlbihzZWxmKQorCisgICAgZGVmIF9jYWxjYm91bmRzKHNlbGYpOgorICAgICAgICAjIGhtbW0uIEl0IHNob3VsZCBub3QgbmVjY2VzYXJ5IGJlIG92ZXJyaWRlIF9jYWxjYm91bmRzIDotKAorICAgICAgICBzZWxmLmluc3RhbGxib3VuZHMoKQorICAgICAgICBXaWRnZXQuX2NhbGNib3VuZHMoc2VsZikKKworICAgIGRlZiBzZXR1cHBhbmVzKHNlbGYpOgorICAgICAgICBwYW5lc2l6ZXMgPSBzZWxmLl9wYW5lc2l6ZXMKKyAgICAgICAgdG90YWwgPSAwCisgICAgICAgIGlmIHBhbmVzaXplcyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICNpZiBsZW4oc2VsZi5fd2lkZ2V0cykgPD4gbGVuKHBhbmVzaXplcyk6CisgICAgICAgICAgICAjICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ251bWJlciBvZiB3aWRnZXRzIGRvZXMgbm90IG1hdGNoIG51bWJlciBvZiBwYW5lcycKKyAgICAgICAgICAgIGZvciBwYW5lc2l6ZSBpbiBwYW5lc2l6ZXM6CisgICAgICAgICAgICAgICAgaWYgbm90IDAgPCBwYW5lc2l6ZSA8IDE6CisgICAgICAgICAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgJ3BhbmUgc2l6ZXMgbXVzdCBiZSBiZXR3ZWVuIDAgYW5kIDEsIG5vdCBpbmNsdWRpbmcuJworICAgICAgICAgICAgICAgIHRvdGFsID0gdG90YWwgKyBwYW5lc2l6ZQorICAgICAgICAgICAgaWYgcm91bmQodG90YWwsIDQpIDw+IDEuMDoKKyAgICAgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdwYW5lIHNpemVzIG11c3QgYWRkIHVwIHRvIDEnCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjIFhYWCBkb2VzIG5vdCB3b3JrIQorICAgICAgICAgICAgc3RlcCA9IDEuMCAvIGxlbihzZWxmLl93aWRnZXRzKQorICAgICAgICAgICAgcGFuZXNpemVzID0gW10KKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLl93aWRnZXRzKSk6CisgICAgICAgICAgICAgICAgcGFuZXNpemVzLmFwcGVuZChzdGVwKQorICAgICAgICBjdXJyZW50ID0gMAorICAgICAgICBzZWxmLl9wYW5lc2l6ZXMgPSBbXQorICAgICAgICBzZWxmLl9ndXR0ZXJzID0gW10KKyAgICAgICAgZm9yIHBhbmVzaXplIGluIHBhbmVzaXplczoKKyAgICAgICAgICAgIGlmIGN1cnJlbnQ6CisgICAgICAgICAgICAgICAgc2VsZi5fZ3V0dGVycy5hcHBlbmQoY3VycmVudCkKKyAgICAgICAgICAgIHNlbGYuX3BhbmVzaXplcy5hcHBlbmQoKGN1cnJlbnQsIGN1cnJlbnQgKyBwYW5lc2l6ZSkpCisgICAgICAgICAgICBjdXJyZW50ID0gY3VycmVudCArIHBhbmVzaXplCisgICAgICAgIHNlbGYubWFrZXBhbmVib3VuZHMoKQorCisgICAgZGVmIGdldHBhbmVzaXplcyhzZWxmKToKKyAgICAgICAgcmV0dXJuIG1hcChsYW1iZGEgKGZyLCB0byk6IHRvLWZyLCAgc2VsZi5fcGFuZXNpemVzKQorCisgICAgYm91bmRzdGVtcGxhdGUgPSAibGFtYmRhIHdpZHRoLCBoZWlnaHQ6ICgwLCBoZWlnaHQgKiAlcyArICVkLCB3aWR0aCwgaGVpZ2h0ICogJXMgKyAlZCkiCisKKyAgICBkZWYgbWFrZXBhbmVib3VuZHMoc2VsZik6CisgICAgICAgIGhhbGZndXR0ZXIgPSBzZWxmLl9ndXR0ZXIgLyAyCisgICAgICAgIHNlbGYuX3BhbmVib3VuZHMgPSBbXQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fcGFuZXNpemVzKSk6CisgICAgICAgICAgICBwYW5lc3RhcnQsIHBhbmVlbmQgPSBzZWxmLl9wYW5lc2l6ZXNbaV0KKyAgICAgICAgICAgIGJvdW5kc3N0cmluZyA9IHNlbGYuYm91bmRzdGVtcGxhdGUgJSAocmVwcihwYW5lc3RhcnQpLCBwYW5lc3RhcnQgYW5kIGhhbGZndXR0ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHIocGFuZWVuZCksIChwYW5lZW5kIDw+IDEuMCkgYW5kIC1oYWxmZ3V0dGVyKQorICAgICAgICAgICAgc2VsZi5fcGFuZWJvdW5kcy5hcHBlbmQoZXZhbChib3VuZHNzdHJpbmcpKQorCisgICAgZGVmIGluc3RhbGxib3VuZHMoc2VsZik6CisgICAgICAgICNzZWxmLnNldHVwcGFuZXMoKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fd2lkZ2V0cykpOgorICAgICAgICAgICAgdyA9IHNlbGYuX3dpZGdldHNbaV0KKyAgICAgICAgICAgIHcuX3Bvc3NpemUgPSBzZWxmLl9wYW5lYm91bmRzW2ldCisgICAgICAgICAgICAjaWYgaGFzYXR0cih3LCAic2V0dXBwYW5lcyIpOgorICAgICAgICAgICAgIyAgICAgICB3LnNldHVwcGFuZXMoKQorICAgICAgICAgICAgaWYgaGFzYXR0cih3LCAiaW5zdGFsbGJvdW5kcyIpOgorICAgICAgICAgICAgICAgIHcuaW5zdGFsbGJvdW5kcygpCisKKyAgICBkZWYgcm9sbG92ZXIoc2VsZiwgcG9pbnQsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBvcmdtb3VzZSA9IHBvaW50W3NlbGYuX2RpcmVjdGlvbl0KKyAgICAgICAgICAgIGhhbGZndXR0ZXIgPSBzZWxmLl9ndXR0ZXIgLyAyCisgICAgICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgICAgICBpZiBzZWxmLl9kaXJlY3Rpb246CisgICAgICAgICAgICAgICAgYmVnaW4sIGVuZCA9IHQsIGIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgYmVnaW4sIGVuZCA9IGwsIHIKKworICAgICAgICAgICAgaSA9IHNlbGYuZmluZGd1dHRlcihvcmdtb3VzZSwgYmVnaW4sIGVuZCkKKyAgICAgICAgICAgIGlmIGkgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBTZXRDdXJzb3IoImFycm93IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgU2V0Q3Vyc29yKHNlbGYuX2RpcmVjdGlvbiBhbmQgJ3Ztb3Zlcicgb3IgJ2htb3ZlcicpCisKKyAgICBkZWYgZmluZGd1dHRlcihzZWxmLCBvcmdtb3VzZSwgYmVnaW4sIGVuZCk6CisgICAgICAgIHRvbGVyYW5jZSA9IG1heCg0LCBzZWxmLl9ndXR0ZXIpIC8gMgorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5fZ3V0dGVycykpOgorICAgICAgICAgICAgcG9zID0gYmVnaW4gKyAoZW5kIC0gYmVnaW4pICogc2VsZi5fZ3V0dGVyc1tpXQorICAgICAgICAgICAgaWYgYWJzKG9yZ21vdXNlIC0gcG9zKSA8PSB0b2xlcmFuY2U6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICByZXR1cm4gaQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICAjIHdoYXQgYSBtZXNzLi4uCisgICAgICAgIG9yZ21vdXNlID0gcG9pbnRbc2VsZi5fZGlyZWN0aW9uXQorICAgICAgICBoYWxmZ3V0dGVyID0gc2VsZi5fZ3V0dGVyIC8gMgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGlmIHNlbGYuX2RpcmVjdGlvbjoKKyAgICAgICAgICAgIGJlZ2luLCBlbmQgPSB0LCBiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiZWdpbiwgZW5kID0gbCwgcgorCisgICAgICAgIGkgPSBzZWxmLmZpbmRndXR0ZXIob3JnbW91c2UsIGJlZ2luLCBlbmQpCisgICAgICAgIGlmIGkgaXMgTm9uZToKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgIHBvcyA9IG9yZ3BvcyA9IGJlZ2luICsgKGVuZCAtIGJlZ2luKSAqIHNlbGYuX2d1dHRlcnNbaV0gIyBpbml0IHBvcyB0b28sIGZvciBmYXN0IGNsaWNrIG9uIGJvcmRlciwgYnVnIGRvbmUgYnkgUGV0cgorCisgICAgICAgIG1pbnBvcyA9IHNlbGYuX3BhbmVzaXplc1tpXVswXQorICAgICAgICBtYXhwb3MgPSBzZWxmLl9wYW5lc2l6ZXNbaSsxXVsxXQorICAgICAgICBtaW5wb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBtaW5wb3MgKyA2NAorICAgICAgICBtYXhwb3MgPSBiZWdpbiArIChlbmQgLSBiZWdpbikgKiBtYXhwb3MgLSA2NAorICAgICAgICBpZiBtaW5wb3MgPiBvcmdwb3MgYW5kIG1heHBvcyA8IG9yZ3BvczoKKyAgICAgICAgICAgIHJldHVybgorCisgICAgICAgICNTZXRDdXJzb3IoImZpc3QiKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBpZiBzZWxmLl9kaXJlY3Rpb246CisgICAgICAgICAgICByZWN0ID0gbCwgb3JncG9zIC0gMSwgciwgb3JncG9zCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZWN0ID0gb3JncG9zIC0gMSwgdCwgb3JncG9zLCBiCisKKyAgICAgICAgIyB0cmFjayBtb3VzZSAtLS0gWFhYICBtb3ZlIHRvIHNlcGFyYXRlIG1ldGhvZD8KKyAgICAgICAgUWQuUGVuTW9kZShRdWlja0RyYXcuc3JjWG9yKQorICAgICAgICBRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQorICAgICAgICBRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCisgICAgICAgIGxhc3Rwb3MgPSBOb25lCisgICAgICAgIHdoaWxlIEV2dC5CdXR0b24oKToKKyAgICAgICAgICAgIHBvcyA9IG9yZ3BvcyAtIG9yZ21vdXNlICsgRXZ0LkdldE1vdXNlKClbc2VsZi5fZGlyZWN0aW9uXQorICAgICAgICAgICAgcG9zID0gbWF4KHBvcywgbWlucG9zKQorICAgICAgICAgICAgcG9zID0gbWluKHBvcywgbWF4cG9zKQorICAgICAgICAgICAgaWYgcG9zID09IGxhc3Rwb3M6CisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIFFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCisgICAgICAgICAgICBRZC5QYWludFJlY3QoX2ludFJlY3QocmVjdCkpCisgICAgICAgICAgICBpZiBzZWxmLl9kaXJlY3Rpb246CisgICAgICAgICAgICAgICAgcmVjdCA9IGwsIHBvcyAtIDEsIHIsIHBvcworICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZWN0ID0gcG9zIC0gMSwgdCwgcG9zLCBiCisgICAgICAgICAgICBRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQorICAgICAgICAgICAgUWQuUGFpbnRSZWN0KF9pbnRSZWN0KHJlY3QpKQorICAgICAgICAgICAgbGFzdHBvcyA9IHBvcworICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkKKyAgICAgICAgICAgIEV2dC5XYWl0TmV4dEV2ZW50KDAsIDMpCisgICAgICAgIFFkLlBhaW50UmVjdChfaW50UmVjdChyZWN0KSkKKyAgICAgICAgUWQuUGVuTm9ybWFsKCkKKyAgICAgICAgU2V0Q3Vyc29yKCJ3YXRjaCIpCisKKyAgICAgICAgbmV3cG9zID0gKHBvcyAtIGJlZ2luKSAvIGZsb2F0KGVuZCAtIGJlZ2luKQorICAgICAgICBzZWxmLl9ndXR0ZXJzW2ldID0gbmV3cG9zCisgICAgICAgIHNlbGYuX3BhbmVzaXplc1tpXSA9IHNlbGYuX3BhbmVzaXplc1tpXVswXSwgbmV3cG9zCisgICAgICAgIHNlbGYuX3BhbmVzaXplc1tpKzFdID0gbmV3cG9zLCBzZWxmLl9wYW5lc2l6ZXNbaSsxXVsxXQorICAgICAgICBzZWxmLm1ha2VwYW5lYm91bmRzKCkKKyAgICAgICAgc2VsZi5pbnN0YWxsYm91bmRzKCkKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCiAKIAogY2xhc3MgVmVydGljYWxQYW5lcyhIb3Jpem9udGFsUGFuZXMpOgotCSIiInNlZSBIb3Jpem9udGFsUGFuZXMiIiIKLQlfZGlyZWN0aW9uID0gMAotCWJvdW5kc3RlbXBsYXRlID0gImxhbWJkYSB3aWR0aCwgaGVpZ2h0OiAod2lkdGggKiAlcyArICVkLCAwLCB3aWR0aCAqICVzICsgJWQsIGhlaWdodCkiCisgICAgIiIic2VlIEhvcml6b250YWxQYW5lcyIiIgorICAgIF9kaXJlY3Rpb24gPSAwCisgICAgYm91bmRzdGVtcGxhdGUgPSAibGFtYmRhIHdpZHRoLCBoZWlnaHQ6ICh3aWR0aCAqICVzICsgJWQsIDAsIHdpZHRoICogJXMgKyAlZCwgaGVpZ2h0KSIKIAogCiBjbGFzcyBDb2xvclBpY2tlcihDbGlja2FibGVXaWRnZXQpOgotCQotCSIiIkNvbG9yIHBpY2tlciB3aWRnZXQuIEFsbG93cyB0aGUgdXNlciB0byBjaG9vc2UgYSBjb2xvci4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY29sb3IgPSAoMCwgMCwgMCksIGNhbGxiYWNrID0gTm9uZSk6Ci0JCUNsaWNrYWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9jb2xvciA9IGNvbG9yCi0JCXNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKLQkJc2VsZi5fZW5hYmxlZCA9IDEKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCWltcG9ydCBDb2xvclBpY2tlcgotCQluZXdjb2xvciwgb2sgPSBDb2xvclBpY2tlci5HZXRDb2xvcigiIiwgc2VsZi5fY29sb3IpCi0JCWlmIG9rOgotCQkJc2VsZi5fY29sb3IgPSBuZXdjb2xvcgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCXNlbGYuZHJhdygpCi0JCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCQlyZXR1cm4gQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBzZWxmLl9jb2xvcikKLQkKLQlkZWYgc2V0KHNlbGYsIGNvbG9yKToKLQkJc2VsZi5fY29sb3IgPSBjb2xvcgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCXJldHVybiBzZWxmLl9jb2xvcgotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1Jnbj1Ob25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCWlmIG5vdCB2aXNSZ246Ci0JCQkJdmlzUmduID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCi0JCQlRZC5QZW5QYXQoUWQuR2V0UURHbG9iYWxzR3JheSgpKQotCQkJcmVjdCA9IHNlbGYuX2JvdW5kcwotCQkJUWQuRnJhbWVSZWN0KHJlY3QpCi0JCQlyZWN0ID0gUWQuSW5zZXRSZWN0KHJlY3QsIDMsIDMpCi0JCQlRZC5QZW5Ob3JtYWwoKQotCQkJUWQuUkdCRm9yZUNvbG9yKHNlbGYuX2NvbG9yKQotCQkJUWQuUGFpbnRSZWN0KHJlY3QpCi0JCQlRZC5SR0JGb3JlQ29sb3IoKDAsIDAsIDApKQotCQkJCisKKyAgICAiIiJDb2xvciBwaWNrZXIgd2lkZ2V0LiBBbGxvd3MgdGhlIHVzZXIgdG8gY2hvb3NlIGEgY29sb3IuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY29sb3IgPSAoMCwgMCwgMCksIGNhbGxiYWNrID0gTm9uZSk6CisgICAgICAgIENsaWNrYWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl9jb2xvciA9IGNvbG9yCisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaW1wb3J0IENvbG9yUGlja2VyCisgICAgICAgIG5ld2NvbG9yLCBvayA9IENvbG9yUGlja2VyLkdldENvbG9yKCIiLCBzZWxmLl9jb2xvcikKKyAgICAgICAgaWYgb2s6CisgICAgICAgICAgICBzZWxmLl9jb2xvciA9IG5ld2NvbG9yCisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5kcmF3KCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIHJldHVybiBDYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIHNlbGYuX2NvbG9yKQorCisgICAgZGVmIHNldChzZWxmLCBjb2xvcik6CisgICAgICAgIHNlbGYuX2NvbG9yID0gY29sb3IKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb2xvcgorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduPU5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIFFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCisgICAgICAgICAgICByZWN0ID0gc2VsZi5fYm91bmRzCisgICAgICAgICAgICBRZC5GcmFtZVJlY3QocmVjdCkKKyAgICAgICAgICAgIHJlY3QgPSBRZC5JbnNldFJlY3QocmVjdCwgMywgMykKKyAgICAgICAgICAgIFFkLlBlbk5vcm1hbCgpCisgICAgICAgICAgICBRZC5SR0JGb3JlQ29sb3Ioc2VsZi5fY29sb3IpCisgICAgICAgICAgICBRZC5QYWludFJlY3QocmVjdCkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCisKIAogIyBtaXNjIHV0aWxzCiAKIGRlZiBDYWxsYmFja0NhbGwoY2FsbGJhY2ssIG11c3RmaXQsICphcmdzKToKLQkiIiJpbnRlcm5hbCBoZWxwZXIgcm91dGluZSBmb3IgVyIiIgotCSMgWFhYIHRoaXMgZnVuY3Rpb24gc2hvdWxkIGRpZS4KLQlpZiB0eXBlKGNhbGxiYWNrKSA9PSBGdW5jdGlvblR5cGU6Ci0JCWZ1bmMgPSBjYWxsYmFjawotCQltYXhhcmdzID0gZnVuYy5mdW5jX2NvZGUuY29fYXJnY291bnQKLQllbGlmIHR5cGUoY2FsbGJhY2spID09IE1ldGhvZFR5cGU6Ci0JCWZ1bmMgPSBjYWxsYmFjay5pbV9mdW5jCi0JCW1heGFyZ3MgPSBmdW5jLmZ1bmNfY29kZS5jb19hcmdjb3VudCAtIDEKLQllbHNlOgotCQlpZiBjYWxsYWJsZShjYWxsYmFjayk6Ci0JCQlyZXR1cm4gYXBwbHkoY2FsbGJhY2ssIGFyZ3MpCi0JCWVsc2U6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJ1bmNhbGxhYmxlIGNhbGxiYWNrIG9iamVjdCIKLQkKLQlpZiBmdW5jLmZ1bmNfZGVmYXVsdHM6Ci0JCW1pbmFyZ3MgPSBtYXhhcmdzIC0gbGVuKGZ1bmMuZnVuY19kZWZhdWx0cykKLQllbHNlOgotCQltaW5hcmdzID0gbWF4YXJncwotCWlmIG1pbmFyZ3MgPD0gbGVuKGFyZ3MpIDw9IG1heGFyZ3M6Ci0JCXJldHVybiBhcHBseShjYWxsYmFjaywgYXJncykKLQllbGlmIG5vdCBtdXN0Zml0IGFuZCBtaW5hcmdzID09IDA6Ci0JCXJldHVybiBjYWxsYmFjaygpCi0JZWxzZToKLQkJaWYgbXVzdGZpdDoKLQkJCXJhaXNlIFR5cGVFcnJvciwgImNhbGxiYWNrIGFjY2VwdHMgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50czogJXIiICUgbGVuKGFyZ3MpCi0JCWVsc2U6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJjYWxsYmFjayBhY2NlcHRzIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHM6IDAgb3IgJXIiICUgbGVuKGFyZ3MpCisgICAgIiIiaW50ZXJuYWwgaGVscGVyIHJvdXRpbmUgZm9yIFciIiIKKyAgICAjIFhYWCB0aGlzIGZ1bmN0aW9uIHNob3VsZCBkaWUuCisgICAgaWYgdHlwZShjYWxsYmFjaykgPT0gRnVuY3Rpb25UeXBlOgorICAgICAgICBmdW5jID0gY2FsbGJhY2sKKyAgICAgICAgbWF4YXJncyA9IGZ1bmMuZnVuY19jb2RlLmNvX2FyZ2NvdW50CisgICAgZWxpZiB0eXBlKGNhbGxiYWNrKSA9PSBNZXRob2RUeXBlOgorICAgICAgICBmdW5jID0gY2FsbGJhY2suaW1fZnVuYworICAgICAgICBtYXhhcmdzID0gZnVuYy5mdW5jX2NvZGUuY29fYXJnY291bnQgLSAxCisgICAgZWxzZToKKyAgICAgICAgaWYgY2FsbGFibGUoY2FsbGJhY2spOgorICAgICAgICAgICAgcmV0dXJuIGFwcGx5KGNhbGxiYWNrLCBhcmdzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAidW5jYWxsYWJsZSBjYWxsYmFjayBvYmplY3QiCisKKyAgICBpZiBmdW5jLmZ1bmNfZGVmYXVsdHM6CisgICAgICAgIG1pbmFyZ3MgPSBtYXhhcmdzIC0gbGVuKGZ1bmMuZnVuY19kZWZhdWx0cykKKyAgICBlbHNlOgorICAgICAgICBtaW5hcmdzID0gbWF4YXJncworICAgIGlmIG1pbmFyZ3MgPD0gbGVuKGFyZ3MpIDw9IG1heGFyZ3M6CisgICAgICAgIHJldHVybiBhcHBseShjYWxsYmFjaywgYXJncykKKyAgICBlbGlmIG5vdCBtdXN0Zml0IGFuZCBtaW5hcmdzID09IDA6CisgICAgICAgIHJldHVybiBjYWxsYmFjaygpCisgICAgZWxzZToKKyAgICAgICAgaWYgbXVzdGZpdDoKKyAgICAgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgImNhbGxiYWNrIGFjY2VwdHMgd3JvbmcgbnVtYmVyIG9mIGFyZ3VtZW50czogJXIiICUgbGVuKGFyZ3MpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJjYWxsYmFjayBhY2NlcHRzIHdyb25nIG51bWJlciBvZiBhcmd1bWVudHM6IDAgb3IgJXIiICUgbGVuKGFyZ3MpCiAKIAogZGVmIEhhc0Jhc2VDbGFzcyhvYmosIGNsYXNzXyk6Ci0JdHJ5OgotCQlyYWlzZSBvYmoKLQlleGNlcHQgY2xhc3NfOgotCQlyZXR1cm4gMQotCWV4Y2VwdDoKLQkJcGFzcwotCXJldHVybiAwCisgICAgdHJ5OgorICAgICAgICByYWlzZSBvYmoKKyAgICBleGNlcHQgY2xhc3NfOgorICAgICAgICByZXR1cm4gMQorICAgIGV4Y2VwdDoKKyAgICAgICAgcGFzcworICAgIHJldHVybiAwCiAKIAogIwogIyBUbyByZW1vdmUgdGhlIGRlcGVuZGVuY2Ugb2YgV2lkZ2V0cy5yc3JjIHdlIGhhcmRjb2RlIHRoZSBjdXJzb3IKICMgZGF0YSBiZWxvdy4KICNfY3Vyc29ycyA9IHsKLSMJIndhdGNoIgk6IFFkLkdldEN1cnNvcihRdWlja0RyYXcud2F0Y2hDdXJzb3IpLmRhdGEsCi0jCSJhcnJvdyIJOiBRZC5HZXRRREdsb2JhbHNBcnJvdygpLAotIwkiaUJlYW0iCTogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy5pQmVhbUN1cnNvcikuZGF0YSwKLSMJImNyb3NzIgk6IFFkLkdldEN1cnNvcihRdWlja0RyYXcuY3Jvc3NDdXJzb3IpLmRhdGEsCi0jCSJwbHVzIgkJOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LnBsdXNDdXJzb3IpLmRhdGEsCi0jCSJoYW5kIgk6IFFkLkdldEN1cnNvcig0NjgpLmRhdGEsCi0jCSJmaXN0IgkJOiBRZC5HZXRDdXJzb3IoNDY5KS5kYXRhLAotIwkiaG1vdmVyIgk6IFFkLkdldEN1cnNvcig0NzApLmRhdGEsCi0jCSJ2bW92ZXIiCTogUWQuR2V0Q3Vyc29yKDQ3MSkuZGF0YSwKLSMJInpvb21pbiIJOiBRZC5HZXRDdXJzb3IoNDcyKS5kYXRhLAotIwkiem9vbW91dCIJOiBRZC5HZXRDdXJzb3IoNDczKS5kYXRhLAotIwkiem9vbSIJOiBRZC5HZXRDdXJzb3IoNDc0KS5kYXRhLAorIyAgICAgICAid2F0Y2giIDogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy53YXRjaEN1cnNvcikuZGF0YSwKKyMgICAgICAgImFycm93IiA6IFFkLkdldFFER2xvYmFsc0Fycm93KCksCisjICAgICAgICJpQmVhbSIgOiBRZC5HZXRDdXJzb3IoUXVpY2tEcmF3LmlCZWFtQ3Vyc29yKS5kYXRhLAorIyAgICAgICAiY3Jvc3MiIDogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy5jcm9zc0N1cnNvcikuZGF0YSwKKyMgICAgICAgInBsdXMiICAgICAgICAgIDogUWQuR2V0Q3Vyc29yKFF1aWNrRHJhdy5wbHVzQ3Vyc29yKS5kYXRhLAorIyAgICAgICAiaGFuZCIgIDogUWQuR2V0Q3Vyc29yKDQ2OCkuZGF0YSwKKyMgICAgICAgImZpc3QiICAgICAgICAgIDogUWQuR2V0Q3Vyc29yKDQ2OSkuZGF0YSwKKyMgICAgICAgImhtb3ZlciIgICAgICAgIDogUWQuR2V0Q3Vyc29yKDQ3MCkuZGF0YSwKKyMgICAgICAgInZtb3ZlciIgICAgICAgIDogUWQuR2V0Q3Vyc29yKDQ3MSkuZGF0YSwKKyMgICAgICAgInpvb21pbiIgICAgICAgIDogUWQuR2V0Q3Vyc29yKDQ3MikuZGF0YSwKKyMgICAgICAgInpvb21vdXQiICAgICAgIDogUWQuR2V0Q3Vyc29yKDQ3MykuZGF0YSwKKyMgICAgICAgInpvb20iICA6IFFkLkdldEN1cnNvcig0NzQpLmRhdGEsCiAjfQogCiBfY3Vyc29ycyA9IHsKLQknYXJyb3cnOgotCSdceDAwXHgwMFx4NDBceDAwXHg2MFx4MDBceDcwXHgwMFx4NzhceDAwXHg3Y1x4MDBceDdlXHgwMFx4N2ZceDAwJwotCSdceDdmXHg4MFx4N2NceDAwXHg2Y1x4MDBceDQ2XHgwMFx4MDZceDAwXHgwM1x4MDBceDAzXHgwMFx4MDBceDAwJwotCSdceGMwXHgwMFx4ZTBceDAwXHhmMFx4MDBceGY4XHgwMFx4ZmNceDAwXHhmZVx4MDBceGZmXHgwMFx4ZmZceDgwJwotCSdceGZmXHhjMFx4ZmZceGUwXHhmZVx4MDBceGVmXHgwMFx4Y2ZceDAwXHg4N1x4ODBceDA3XHg4MFx4MDNceDgwJwotCSdceDAwXHgwMVx4MDBceDAxJywKLQknY3Jvc3MnOgotCSdceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHhmZlx4ZTBceDA0XHgwMFx4MDRceDAwJwotCSdceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJwotCSdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJwotCSdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJwotCSdceDAwXHgwNVx4MDBceDA1JywKLQknZmlzdCc6Ci0JJ1x4MDBceDAwXHgwMFx4MDBceDBkXHg4MFx4MTJceDcwXHgxMlx4NGNceDEyXHg0YVx4MjhceDBhXHgyOFx4MDInCi0JJ1x4NDhceDAyXHg0MFx4MDJceDIwXHgwMlx4MjBceDA0XHgxMFx4MDRceDA4XHgwOFx4MDRceDA4XHgwNFx4MDgnCi0JJ1x4MDBceDAwXHgwMFx4MDBceDBkXHg4MFx4MWZceGYwXHgxZlx4ZmNceDFmXHhmZVx4M2ZceGZlXHgzZlx4ZmUnCi0JJ1x4N2ZceGZlXHg3Zlx4ZmVceDNmXHhmZVx4M2ZceGZjXHgxZlx4ZmNceDBmXHhmOFx4MDdceGY4XHgwN1x4ZjgnCi0JJ1x4MDBceDA5XHgwMFx4MDgnLAotCSdoYW5kJzoKLQknXHgwMVx4ODBceDFhXHg3MFx4MjZceDQ4XHgyNlx4NGFceDEyXHg0ZFx4MTJceDQ5XHg2OFx4MDlceDk4XHgwMScKLQknXHg4OFx4MDJceDQwXHgwMlx4MjBceDAyXHgyMFx4MDRceDEwXHgwNFx4MDhceDA4XHgwNFx4MDhceDA0XHgwOCcKLQknXHgwMVx4ODBceDFiXHhmMFx4M2ZceGY4XHgzZlx4ZmFceDFmXHhmZlx4MWZceGZmXHg2Zlx4ZmZceGZmXHhmZicKLQknXHhmZlx4ZmVceDdmXHhmZVx4M2ZceGZlXHgzZlx4ZmNceDFmXHhmY1x4MGZceGY4XHgwN1x4ZjhceDA3XHhmOCcKLQknXHgwMFx4MDlceDAwXHgwOCcsCi0JJ2htb3Zlcic6Ci0JJ1x4MDBceDAwXHgwMVx4ODBceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDExXHg4OFx4MzFceDhjXHg3Zlx4ZmUnCi0JJ1x4MzFceDhjXHgxMVx4ODhceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDAxXHg4MFx4MDBceDAwXHgwMFx4MDAnCi0JJ1x4MDNceGMwXHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgxYlx4ZDhceDNiXHhkY1x4N2ZceGZlXHhmZlx4ZmYnCi0JJ1x4N2ZceGZlXHgzYlx4ZGNceDFiXHhkOFx4MDNceGMwXHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwMFx4MDAnCi0JJ1x4MDBceDA3XHgwMFx4MDcnLAotCSdpQmVhbSc6Ci0JJ1x4MGNceDYwXHgwMlx4ODBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDAnCi0JJ1x4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDJceDgwXHgwY1x4NjAnCi0JJ1x4MGNceDYwXHgwMlx4ODBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDAnCi0JJ1x4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDJceDgwXHgwY1x4NjAnCi0JJ1x4MDBceDA0XHgwMFx4MDcnLAotCSdwbHVzJzoKLQknXHgwMFx4MDBceDA3XHhjMFx4MDRceDYwXHgwNFx4NjBceDA0XHg2MFx4N2NceDdjXHg0M1x4ODZceDQyXHg4NicKLQknXHg0M1x4ODZceDdjXHg3ZVx4M2NceDdlXHgwNFx4NjBceDA0XHg2MFx4MDdceGUwXHgwM1x4ZTBceDAwXHgwMCcKLQknXHgwZlx4YzBceDBmXHhlMFx4MGZceGYwXHgwZlx4ZjBceGZmXHhmZlx4ZmZceGZlXHhmY1x4N2ZceGZjXHg3ZicKLQknXHhmY1x4N2ZceGZmXHhmZlx4N2ZceGZmXHg3Zlx4ZmZceDBmXHhmMFx4MGZceGYwXHgwN1x4ZjBceDAzXHhlMCcKLQknXHgwMFx4MDhceDAwXHgwOCcsCi0JJ3Ztb3Zlcic6Ci0JJ1x4MDBceDAwXHgwMVx4MDBceDAzXHg4MFx4MDdceGMwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHg3Zlx4ZmMnCi0JJ1x4N2ZceGZjXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwN1x4YzBceDAzXHg4MFx4MDFceDAwXHgwMFx4MDAnCi0JJ1x4MDFceDAwXHgwM1x4ODBceDA3XHhjMFx4MGZceGUwXHgwZlx4ZTBceDAzXHg4MFx4ZmZceGZlXHhmZlx4ZmUnCi0JJ1x4ZmZceGZlXHhmZlx4ZmVceDAzXHg4MFx4MGZceGUwXHgwZlx4ZTBceDA3XHhjMFx4MDNceDgwXHgwMVx4MDAnCi0JJ1x4MDBceDA3XHgwMFx4MDcnLAotCSd3YXRjaCc6Ci0JJ1x4M2ZceDAwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHg0MFx4ODBceDg0XHg0MFx4ODRceDQwXHg4NFx4NjAnCi0JJ1x4OWNceDYwXHg4MFx4NDBceDgwXHg0MFx4NDBceDgwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDAnCi0JJ1x4M2ZceDAwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHg3Zlx4ODBceGZmXHhjMFx4ZmZceGMwXHhmZlx4YzAnCi0JJ1x4ZmZceGMwXHhmZlx4YzBceGZmXHhjMFx4N2ZceDgwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDAnCi0JJ1x4MDBceDA4XHgwMFx4MDgnLAotCSd6b29tJzoKLQknXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0MFx4MjBceDgwXHgxMFx4ODBceDEwXHg4MFx4MTBceDgwXHgxMCcKLQknXHg0MFx4MjBceDQwXHgyMFx4MzBceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwZlx4MDBceDNmXHhjMFx4N2ZceGUwXHg3Zlx4ZTBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMCcKLQknXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwMFx4MDZceDAwXHgwNicsCi0JJ3pvb21pbic6Ci0JJ1x4MGZceDAwXHgzMFx4YzBceDQwXHgyMFx4NDZceDIwXHg4Nlx4MTBceDlmXHg5MFx4OWZceDkwXHg4Nlx4MTAnCi0JJ1x4NDZceDIwXHg0MFx4MjBceDMwXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCi0JJ1x4MGZceDAwXHgzZlx4YzBceDdmXHhlMFx4N2ZceGUwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjAnCi0JJ1x4N2ZceGUwXHg3Zlx4ZTBceDNmXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCi0JJ1x4MDBceDA2XHgwMFx4MDYnLAotCSd6b29tb3V0JzoKLQknXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0MFx4MjBceDgwXHgxMFx4OWZceDkwXHg5Zlx4OTBceDgwXHgxMCcKLQknXHg0MFx4MjBceDQwXHgyMFx4MzBceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwZlx4MDBceDNmXHhjMFx4N2ZceGUwXHg3Zlx4ZTBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMCcKLQknXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKLQknXHgwMFx4MDZceDAwXHgwNicsCisgICAgICAgICdhcnJvdyc6CisgICAgICAgICdceDAwXHgwMFx4NDBceDAwXHg2MFx4MDBceDcwXHgwMFx4NzhceDAwXHg3Y1x4MDBceDdlXHgwMFx4N2ZceDAwJworICAgICAgICAnXHg3Zlx4ODBceDdjXHgwMFx4NmNceDAwXHg0Nlx4MDBceDA2XHgwMFx4MDNceDAwXHgwM1x4MDBceDAwXHgwMCcKKyAgICAgICAgJ1x4YzBceDAwXHhlMFx4MDBceGYwXHgwMFx4ZjhceDAwXHhmY1x4MDBceGZlXHgwMFx4ZmZceDAwXHhmZlx4ODAnCisgICAgICAgICdceGZmXHhjMFx4ZmZceGUwXHhmZVx4MDBceGVmXHgwMFx4Y2ZceDAwXHg4N1x4ODBceDA3XHg4MFx4MDNceDgwJworICAgICAgICAnXHgwMFx4MDFceDAwXHgwMScsCisgICAgICAgICdjcm9zcyc6CisgICAgICAgICdceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHhmZlx4ZTBceDA0XHgwMFx4MDRceDAwJworICAgICAgICAnXHgwNFx4MDBceDA0XHgwMFx4MDRceDAwXHgwNFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKKyAgICAgICAgJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCisgICAgICAgICdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAnXHgwMFx4MDVceDAwXHgwNScsCisgICAgICAgICdmaXN0JzoKKyAgICAgICAgJ1x4MDBceDAwXHgwMFx4MDBceDBkXHg4MFx4MTJceDcwXHgxMlx4NGNceDEyXHg0YVx4MjhceDBhXHgyOFx4MDInCisgICAgICAgICdceDQ4XHgwMlx4NDBceDAyXHgyMFx4MDJceDIwXHgwNFx4MTBceDA0XHgwOFx4MDhceDA0XHgwOFx4MDRceDA4JworICAgICAgICAnXHgwMFx4MDBceDAwXHgwMFx4MGRceDgwXHgxZlx4ZjBceDFmXHhmY1x4MWZceGZlXHgzZlx4ZmVceDNmXHhmZScKKyAgICAgICAgJ1x4N2ZceGZlXHg3Zlx4ZmVceDNmXHhmZVx4M2ZceGZjXHgxZlx4ZmNceDBmXHhmOFx4MDdceGY4XHgwN1x4ZjgnCisgICAgICAgICdceDAwXHgwOVx4MDBceDA4JywKKyAgICAgICAgJ2hhbmQnOgorICAgICAgICAnXHgwMVx4ODBceDFhXHg3MFx4MjZceDQ4XHgyNlx4NGFceDEyXHg0ZFx4MTJceDQ5XHg2OFx4MDlceDk4XHgwMScKKyAgICAgICAgJ1x4ODhceDAyXHg0MFx4MDJceDIwXHgwMlx4MjBceDA0XHgxMFx4MDRceDA4XHgwOFx4MDRceDA4XHgwNFx4MDgnCisgICAgICAgICdceDAxXHg4MFx4MWJceGYwXHgzZlx4ZjhceDNmXHhmYVx4MWZceGZmXHgxZlx4ZmZceDZmXHhmZlx4ZmZceGZmJworICAgICAgICAnXHhmZlx4ZmVceDdmXHhmZVx4M2ZceGZlXHgzZlx4ZmNceDFmXHhmY1x4MGZceGY4XHgwN1x4ZjhceDA3XHhmOCcKKyAgICAgICAgJ1x4MDBceDA5XHgwMFx4MDgnLAorICAgICAgICAnaG1vdmVyJzoKKyAgICAgICAgJ1x4MDBceDAwXHgwMVx4ODBceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDExXHg4OFx4MzFceDhjXHg3Zlx4ZmUnCisgICAgICAgICdceDMxXHg4Y1x4MTFceDg4XHgwMVx4ODBceDAxXHg4MFx4MDFceDgwXHgwMVx4ODBceDAwXHgwMFx4MDBceDAwJworICAgICAgICAnXHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwM1x4YzBceDFiXHhkOFx4M2JceGRjXHg3Zlx4ZmVceGZmXHhmZicKKyAgICAgICAgJ1x4N2ZceGZlXHgzYlx4ZGNceDFiXHhkOFx4MDNceGMwXHgwM1x4YzBceDAzXHhjMFx4MDNceGMwXHgwMFx4MDAnCisgICAgICAgICdceDAwXHgwN1x4MDBceDA3JywKKyAgICAgICAgJ2lCZWFtJzoKKyAgICAgICAgJ1x4MGNceDYwXHgwMlx4ODBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDAnCisgICAgICAgICdceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAyXHg4MFx4MGNceDYwJworICAgICAgICAnXHgwY1x4NjBceDAyXHg4MFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMCcKKyAgICAgICAgJ1x4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDJceDgwXHgwY1x4NjAnCisgICAgICAgICdceDAwXHgwNFx4MDBceDA3JywKKyAgICAgICAgJ3BsdXMnOgorICAgICAgICAnXHgwMFx4MDBceDA3XHhjMFx4MDRceDYwXHgwNFx4NjBceDA0XHg2MFx4N2NceDdjXHg0M1x4ODZceDQyXHg4NicKKyAgICAgICAgJ1x4NDNceDg2XHg3Y1x4N2VceDNjXHg3ZVx4MDRceDYwXHgwNFx4NjBceDA3XHhlMFx4MDNceGUwXHgwMFx4MDAnCisgICAgICAgICdceDBmXHhjMFx4MGZceGUwXHgwZlx4ZjBceDBmXHhmMFx4ZmZceGZmXHhmZlx4ZmVceGZjXHg3Zlx4ZmNceDdmJworICAgICAgICAnXHhmY1x4N2ZceGZmXHhmZlx4N2ZceGZmXHg3Zlx4ZmZceDBmXHhmMFx4MGZceGYwXHgwN1x4ZjBceDAzXHhlMCcKKyAgICAgICAgJ1x4MDBceDA4XHgwMFx4MDgnLAorICAgICAgICAndm1vdmVyJzoKKyAgICAgICAgJ1x4MDBceDAwXHgwMVx4MDBceDAzXHg4MFx4MDdceGMwXHgwMVx4MDBceDAxXHgwMFx4MDFceDAwXHg3Zlx4ZmMnCisgICAgICAgICdceDdmXHhmY1x4MDFceDAwXHgwMVx4MDBceDAxXHgwMFx4MDdceGMwXHgwM1x4ODBceDAxXHgwMFx4MDBceDAwJworICAgICAgICAnXHgwMVx4MDBceDAzXHg4MFx4MDdceGMwXHgwZlx4ZTBceDBmXHhlMFx4MDNceDgwXHhmZlx4ZmVceGZmXHhmZScKKyAgICAgICAgJ1x4ZmZceGZlXHhmZlx4ZmVceDAzXHg4MFx4MGZceGUwXHgwZlx4ZTBceDA3XHhjMFx4MDNceDgwXHgwMVx4MDAnCisgICAgICAgICdceDAwXHgwN1x4MDBceDA3JywKKyAgICAgICAgJ3dhdGNoJzoKKyAgICAgICAgJ1x4M2ZceDAwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHg0MFx4ODBceDg0XHg0MFx4ODRceDQwXHg4NFx4NjAnCisgICAgICAgICdceDljXHg2MFx4ODBceDQwXHg4MFx4NDBceDQwXHg4MFx4M2ZceDAwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwJworICAgICAgICAnXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDBceDdmXHg4MFx4ZmZceGMwXHhmZlx4YzBceGZmXHhjMCcKKyAgICAgICAgJ1x4ZmZceGMwXHhmZlx4YzBceGZmXHhjMFx4N2ZceDgwXHgzZlx4MDBceDNmXHgwMFx4M2ZceDAwXHgzZlx4MDAnCisgICAgICAgICdceDAwXHgwOFx4MDBceDA4JywKKyAgICAgICAgJ3pvb20nOgorICAgICAgICAnXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0MFx4MjBceDgwXHgxMFx4ODBceDEwXHg4MFx4MTBceDgwXHgxMCcKKyAgICAgICAgJ1x4NDBceDIwXHg0MFx4MjBceDMwXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCisgICAgICAgICdceDBmXHgwMFx4M2ZceGMwXHg3Zlx4ZTBceDdmXHhlMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwJworICAgICAgICAnXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKKyAgICAgICAgJ1x4MDBceDA2XHgwMFx4MDYnLAorICAgICAgICAnem9vbWluJzoKKyAgICAgICAgJ1x4MGZceDAwXHgzMFx4YzBceDQwXHgyMFx4NDZceDIwXHg4Nlx4MTBceDlmXHg5MFx4OWZceDkwXHg4Nlx4MTAnCisgICAgICAgICdceDQ2XHgyMFx4NDBceDIwXHgzMFx4ZjBceDBmXHgzOFx4MDBceDFjXHgwMFx4MGVceDAwXHgwN1x4MDBceDAyJworICAgICAgICAnXHgwZlx4MDBceDNmXHhjMFx4N2ZceGUwXHg3Zlx4ZTBceGZmXHhmMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMCcKKyAgICAgICAgJ1x4N2ZceGUwXHg3Zlx4ZTBceDNmXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCisgICAgICAgICdceDAwXHgwNlx4MDBceDA2JywKKyAgICAgICAgJ3pvb21vdXQnOgorICAgICAgICAnXHgwZlx4MDBceDMwXHhjMFx4NDBceDIwXHg0MFx4MjBceDgwXHgxMFx4OWZceDkwXHg5Zlx4OTBceDgwXHgxMCcKKyAgICAgICAgJ1x4NDBceDIwXHg0MFx4MjBceDMwXHhmMFx4MGZceDM4XHgwMFx4MWNceDAwXHgwZVx4MDBceDA3XHgwMFx4MDInCisgICAgICAgICdceDBmXHgwMFx4M2ZceGMwXHg3Zlx4ZTBceDdmXHhlMFx4ZmZceGYwXHhmZlx4ZjBceGZmXHhmMFx4ZmZceGYwJworICAgICAgICAnXHg3Zlx4ZTBceDdmXHhlMFx4M2ZceGYwXHgwZlx4MzhceDAwXHgxY1x4MDBceDBlXHgwMFx4MDdceDAwXHgwMicKKyAgICAgICAgJ1x4MDBceDA2XHgwMFx4MDYnLAogfQogCiBkZWYgU2V0Q3Vyc29yKHdoYXQpOgotCSIiIlNldCB0aGUgY3Vyc29yc2hhcGUgdG8gYW55IG9mIHRoZXNlOiAnYXJyb3cnLCAnY3Jvc3MnLCAnZmlzdCcsICdoYW5kJywgJ2htb3ZlcicsICdpQmVhbScsIAotCSdwbHVzJywgJ3Ztb3ZlcicsICd3YXRjaCcsICd6b29tJywgJ3pvb21pbicsICd6b29tb3V0Jy4iIiIKLQlRZC5TZXRDdXJzb3IoX2N1cnNvcnNbd2hhdF0pCisgICAgIiIiU2V0IHRoZSBjdXJzb3JzaGFwZSB0byBhbnkgb2YgdGhlc2U6ICdhcnJvdycsICdjcm9zcycsICdmaXN0JywgJ2hhbmQnLCAnaG1vdmVyJywgJ2lCZWFtJywKKyAgICAncGx1cycsICd2bW92ZXInLCAnd2F0Y2gnLCAnem9vbScsICd6b29taW4nLCAnem9vbW91dCcuIiIiCisgICAgUWQuU2V0Q3Vyc29yKF9jdXJzb3JzW3doYXRdKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XY29udHJvbHMucHkgYi9NYWMvVG9vbHMvSURFL1djb250cm9scy5weQppbmRleCA1OGZjMzFiLi4wMGIwNmFjIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1djb250cm9scy5weQorKysgYi9NYWMvVG9vbHMvSURFL1djb250cm9scy5weQpAQCAtNCw0MzAgKzQsNDI5IEBACiAKIAogY2xhc3MgQ29udHJvbFdpZGdldChXYmFzZS5DbGlja2FibGVXaWRnZXQpOgotCQotCSIiIkJhc2VjbGFzcyBmb3IgYWxsIG5hdGl2ZSBjb250cm9scy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQ29udHJvbCIsIHByb2NJRCA9IDAsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwLCBtaW4gPSAwLCBtYXggPSAxLCB2aWV3c2l6ZSA9IDApOgotCQlXYmFzZS5DbGlja2FibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fY29udHJvbCA9IE5vbmUKLQkJc2VsZi5fdGl0bGUgPSB0aXRsZQotCQlzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCi0JCXNlbGYuX3Byb2NJRCA9IHByb2NJRAotCQlzZWxmLl92YWx1ZSA9IHZhbHVlCi0JCXNlbGYuX21pbiA9IG1pbgotCQlzZWxmLl9tYXggPSBtYXgKLQkJc2VsZi5fZW5hYmxlZCA9IDEKLQkJc2VsZi5fdmlld3NpemUgPSB2aWV3c2l6ZQotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJCi0JCSMgTmV3Q29udHJvbCBkb2Vzbid0IGFjY2VwdCAzMi1iaXQgdmFsdWUsIG1pbiwgb3IgbWF4LCBzbyBmb3IgY29uc2lzdGVuY3kKLQkJIyB3aXRoIHRoZSBuZXcgMzItYml0IHNldC9nZXQgbWV0aG9kcywgb3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgaW5pdGlhbGx5Ci0JCSMgc2V0IGFzIHplcm8sIGZvbGxvd2VkIGJ5IGEgMzItYml0IHNldCBvZiB0aGUgYWN0dWFsIHZhbHVlLgotCQkjIFZhbHVlcyBub3QgcmVwcmVzZW50YWJsZSBpbiAxNiBiaXRzIHdpbGwgZmFpbCBvbiBNYWNPUyA4LjEsIGhvd2V2ZXIKLQkJIyB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb250cm9sIHVzYWdlIHNob3VsZCBzdGlsbCBiZSBjb21wYXRpYmxlLgotCQlfdmFsdWUsIF9taW4sIF9tYXggPSBzZWxmLl92YWx1ZSwgc2VsZi5fbWluLCBzZWxmLl9tYXgKLQkJaWYgLTMyNzY4IDw9IF92YWx1ZSA8PSAzMjc2NzoKLQkJCWJpZ3ZhbHVlID0gTm9uZQotCQllbHNlOgotCQkJYmlndmFsdWUgPSBfdmFsdWUKLQkJCV92YWx1ZSA9IDAKLQkJaWYgLTMyNzY4IDw9IF9taW4gPD0gMzI3Njc6Ci0JCQliaWdtaW4gPSBOb25lCi0JCWVsc2U6Ci0JCQliaWdtaW4gPSBfbWluCi0JCQlfbWluID0gMAotCQlpZiAtMzI3NjggPD0gX21heCA8PSAzMjc2NzoKLQkJCWJpZ21heCA9IE5vbmUKLQkJZWxzZToKLQkJCWJpZ21heCA9IF9tYXgKLQkJCV9tYXggPSAwCi0JCXNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLCAKLQkJCQkJCXNlbGYuX2JvdW5kcywgCi0JCQkJCQlzZWxmLl90aXRsZSwgCi0JCQkJCQkxLCAKLQkJCQkJCV92YWx1ZSwgCi0JCQkJCQlfbWluLCAKLQkJCQkJCV9tYXgsIAotCQkJCQkJc2VsZi5fcHJvY0lELCAKLQkJCQkJCTApCi0JCWlmIGJpZ3ZhbHVlOgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZShiaWd2YWx1ZSkKLQkJaWYgYmlnbWluOgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKGJpZ21pbikKLQkJaWYgYmlnbWF4OgotCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNYXhpbXVtKGJpZ21heCkKLQkJaWYgc2VsZi5fdmlld3NpemU6Ci0JCQl0cnk6Ci0JCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUoc2VsZi5fdmlld3NpemUpCi0JCQkJIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKLQkJCQkjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCi0JCQlleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLQkJCQlwYXNzCi0JCXNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCi0JCi0JZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKLQkJc2VsZi5fY29udHJvbC5Nb3ZlQ29udHJvbChzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1sxXSkKLQkJc2VsZi5fY29udHJvbC5TaXplQ29udHJvbChzZWxmLl9ib3VuZHNbMl0gLSBzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1szXSAtIHNlbGYuX2JvdW5kc1sxXSkKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCVFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlzZWxmLl9jb250cm9sLlNob3dDb250cm9sKCkKLQkJCXNlbGYuR2V0V2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQotCQlzZWxmLl9jb250cm9sID0gTm9uZQotCQlXYmFzZS5DbGlja2FibGVXaWRnZXQuY2xvc2Uoc2VsZikKLQkKLQlkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKLQkJaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKLQkJCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQotCQkJc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCi0JCi0JZGVmIHNob3coc2VsZiwgb25vZmYpOgotCQlzZWxmLl92aXNpYmxlID0gb25vZmYKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuc2hvdyhvbm9mZikKLQkJaWYgb25vZmY6Ci0JCQlzZWxmLl9jb250cm9sLlNob3dDb250cm9sKCkKLQkJZWxzZToKLQkJCXNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQotCQotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCi0JCWlmIHNlbGYuX2VuYWJsZWQ6Ci0JCQlpZiBvbm9mZjoKLQkJCQlzZWxmLl9jb250cm9sLkFjdGl2YXRlQ29udHJvbCgpCi0JCQllbHNlOgotCQkJCXNlbGYuX2NvbnRyb2wuRGVhY3RpdmF0ZUNvbnRyb2woKQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQotCQotCWRlZiB0ZXN0KHNlbGYsIHBvaW50KToKLQkJaWYgUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2JvdW5kcykgYW5kIHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4gMQotCQkjY3RsdHlwZSwgY29udHJvbCA9IEN0bC5GaW5kQ29udHJvbChwb2ludCwgc2VsZi5fcGFyZW50d2luZG93LndpZCkKLQkJI2lmIHNlbGYuX2VuYWJsZWQgYW5kIGNvbnRyb2wgPT0gc2VsZi5fY29udHJvbDoKLQkJIwlyZXR1cm4gMQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQotCQlpZiBwYXJ0OgotCQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwKQotCQotCWRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xUaXRsZSh0aXRsZSkKLQkJc2VsZi5fdGl0bGUgPSB0aXRsZQotCQotCWRlZiBnZXR0aXRsZShzZWxmKToKLQkJcmV0dXJuIHNlbGYuX3RpdGxlCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQlpZiAtMzI3NjggPD0gdmFsdWUgPD0gMzI3Njc6Ci0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gdXNlCi0JCQkJIyB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIHBvc3NpYmxlLgotCQkJCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbFZhbHVlKHZhbHVlKQotCQkJZWxzZToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2wzMkJpdFZhbHVlKHZhbHVlKQotCQllbHNlOgotCQkJc2VsZi5fdmFsdWUgPSB2YWx1ZQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCWlmIHNlbGYuX2NvbnRyb2w6Ci0JCQl0cnk6Ci0JCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0VmFsdWUoKQotCQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKLQkJCQkjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCi0JCQlleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKLQkJCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQotCQllbHNlOgotCQkJcmV0dXJuIHNlbGYuX3ZhbHVlCisKKyAgICAiIiJCYXNlY2xhc3MgZm9yIGFsbCBuYXRpdmUgY29udHJvbHMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQ29udHJvbCIsIHByb2NJRCA9IDAsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwLCBtaW4gPSAwLCBtYXggPSAxLCB2aWV3c2l6ZSA9IDApOgorICAgICAgICBXYmFzZS5DbGlja2FibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5fY29udHJvbCA9IE5vbmUKKyAgICAgICAgc2VsZi5fdGl0bGUgPSB0aXRsZQorICAgICAgICBzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCisgICAgICAgIHNlbGYuX3Byb2NJRCA9IHByb2NJRAorICAgICAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCisgICAgICAgIHNlbGYuX21pbiA9IG1pbgorICAgICAgICBzZWxmLl9tYXggPSBtYXgKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKyAgICAgICAgc2VsZi5fdmlld3NpemUgPSB2aWV3c2l6ZQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgICAgICMgTmV3Q29udHJvbCBkb2Vzbid0IGFjY2VwdCAzMi1iaXQgdmFsdWUsIG1pbiwgb3IgbWF4LCBzbyBmb3IgY29uc2lzdGVuY3kKKyAgICAgICAgIyB3aXRoIHRoZSBuZXcgMzItYml0IHNldC9nZXQgbWV0aG9kcywgb3V0LW9mLXJhbmdlIHZhbHVlcyBhcmUgaW5pdGlhbGx5CisgICAgICAgICMgc2V0IGFzIHplcm8sIGZvbGxvd2VkIGJ5IGEgMzItYml0IHNldCBvZiB0aGUgYWN0dWFsIHZhbHVlLgorICAgICAgICAjIFZhbHVlcyBub3QgcmVwcmVzZW50YWJsZSBpbiAxNiBiaXRzIHdpbGwgZmFpbCBvbiBNYWNPUyA4LjEsIGhvd2V2ZXIKKyAgICAgICAgIyB0aGUgdmFzdCBtYWpvcml0eSBvZiBjb250cm9sIHVzYWdlIHNob3VsZCBzdGlsbCBiZSBjb21wYXRpYmxlLgorICAgICAgICBfdmFsdWUsIF9taW4sIF9tYXggPSBzZWxmLl92YWx1ZSwgc2VsZi5fbWluLCBzZWxmLl9tYXgKKyAgICAgICAgaWYgLTMyNzY4IDw9IF92YWx1ZSA8PSAzMjc2NzoKKyAgICAgICAgICAgIGJpZ3ZhbHVlID0gTm9uZQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYmlndmFsdWUgPSBfdmFsdWUKKyAgICAgICAgICAgIF92YWx1ZSA9IDAKKyAgICAgICAgaWYgLTMyNzY4IDw9IF9taW4gPD0gMzI3Njc6CisgICAgICAgICAgICBiaWdtaW4gPSBOb25lCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBiaWdtaW4gPSBfbWluCisgICAgICAgICAgICBfbWluID0gMAorICAgICAgICBpZiAtMzI3NjggPD0gX21heCA8PSAzMjc2NzoKKyAgICAgICAgICAgIGJpZ21heCA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGJpZ21heCA9IF9tYXgKKyAgICAgICAgICAgIF9tYXggPSAwCisgICAgICAgIHNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfbWluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIGlmIGJpZ3ZhbHVlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZShiaWd2YWx1ZSkKKyAgICAgICAgaWYgYmlnbWluOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKGJpZ21pbikKKyAgICAgICAgaWYgYmlnbWF4OgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNYXhpbXVtKGJpZ21heCkKKyAgICAgICAgaWYgc2VsZi5fdmlld3NpemU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUoc2VsZi5fdmlld3NpemUpCisgICAgICAgICAgICAgICAgIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKKyAgICAgICAgICAgICAgICAjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIHNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlkZUNvbnRyb2woKQorICAgICAgICBzZWxmLl9jb250cm9sLk1vdmVDb250cm9sKHNlbGYuX2JvdW5kc1swXSwgc2VsZi5fYm91bmRzWzFdKQorICAgICAgICBzZWxmLl9jb250cm9sLlNpemVDb250cm9sKHNlbGYuX2JvdW5kc1syXSAtIHNlbGYuX2JvdW5kc1swXSwgc2VsZi5fYm91bmRzWzNdIC0gc2VsZi5fYm91bmRzWzFdKQorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKKyAgICAgICAgc2VsZi5fY29udHJvbCA9IE5vbmUKKyAgICAgICAgV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisKKyAgICBkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQorICAgICAgICAgICAgc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCisKKyAgICBkZWYgc2hvdyhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX3Zpc2libGUgPSBvbm9mZgorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5zaG93KG9ub2ZmKQorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5IaWRlQ29udHJvbCgpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5BY3RpdmF0ZUNvbnRyb2woKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLkRlYWN0aXZhdGVDb250cm9sKCkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQorCisgICAgZGVmIHRlc3Qoc2VsZiwgcG9pbnQpOgorICAgICAgICBpZiBRZC5QdEluUmVjdChwb2ludCwgc2VsZi5fYm91bmRzKSBhbmQgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybiAxCisgICAgICAgICNjdGx0eXBlLCBjb250cm9sID0gQ3RsLkZpbmRDb250cm9sKHBvaW50LCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkKQorICAgICAgICAjaWYgc2VsZi5fZW5hYmxlZCBhbmQgY29udHJvbCA9PSBzZWxmLl9jb250cm9sOgorICAgICAgICAjICAgICAgIHJldHVybiAxCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCkKKyAgICAgICAgaWYgcGFydDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKKworICAgIGRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2w6CisgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xUaXRsZSh0aXRsZSkKKyAgICAgICAgc2VsZi5fdGl0bGUgPSB0aXRsZQorCisgICAgZGVmIGdldHRpdGxlKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fdGl0bGUKKworICAgIGRlZiBzZXQoc2VsZiwgdmFsdWUpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sOgorICAgICAgICAgICAgaWYgLTMyNzY4IDw9IHZhbHVlIDw9IDMyNzY3OgorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQorICAgICAgICAgICAgICAgICMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xWYWx1ZSh2YWx1ZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRWYWx1ZSh2YWx1ZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2w6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0VmFsdWUoKQorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICAgICAjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3ZhbHVlCiAKIAogY2xhc3MgQnV0dG9uKENvbnRyb2xXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIHB1c2ggYnV0dG9uLiIiIgotCQotCXByb2NJRCA9IENvbnRyb2xzLnB1c2hCdXRQcm9jIHwgQ29udHJvbHMudXNlV0ZvbnQKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiQnV0dG9uIiwgY2FsbGJhY2sgPSBOb25lKToKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSwgc2VsZi5wcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAxKQotCQlzZWxmLl9pc2RlZmF1bHQgPSAwCi0JCi0JZGVmIHB1c2goc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCSMgZW11bGF0ZSB0aGUgcHVzaGluZyBvZiB0aGUgYnV0dG9uCi0JCWltcG9ydCB0aW1lCi0JCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbChDb250cm9scy5rQ29udHJvbEJ1dHRvblBhcnQpCi0JCXNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKLQkJdGltZS5zbGVlcCgwLjEpCi0JCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgwKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKLQkKLQlkZWYgZW5hYmxlKHNlbGYsIG9ub2ZmKToKLQkJaWYgc2VsZi5fY29udHJvbCBhbmQgc2VsZi5fZW5hYmxlZCA8PiBvbm9mZjoKLQkJCXNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgobm90IG9ub2ZmKSBhbmQgMjU1KQotCQkJc2VsZi5fZW5hYmxlZCA9IG9ub2ZmCi0JCi0JZGVmIHNob3coc2VsZiwgb25vZmYpOgotCQlDb250cm9sV2lkZ2V0LnNob3coc2VsZiwgb25vZmYpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlzZWxmLl9jb250cm9sLkRyYXcxQ29udHJvbCgpCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCUNvbnRyb2xXaWRnZXQub3BlbihzZWxmKQotCQlpZiBzZWxmLl9pc2RlZmF1bHQ6Ci0JCQlzZWxmLl9zZXRkZWZhdWx0KHNlbGYuX2lzZGVmYXVsdCkKLQkKLQlkZWYgX3NldGRlZmF1bHQoc2VsZiwgb25vZmYpOgotCQljID0gc2VsZi5fY29udHJvbAotCQlpZiBjIGlzIG5vdCBOb25lOgotCQkJaWYgb25vZmY6Ci0JCQkJZGF0YSA9ICJceEZGIgotCQkJZWxzZToKLQkJCQlkYXRhID0gIlwwIgotCQkJIyBoaWRlIGJlZm9yZSBjaGFuZ2luZyBzdGF0ZSwgb3RoZXJ3aXNlIHRoZSBidXR0b24gaXNuJ3QgYWx3YXlzCi0JCQkjIHJlZHJhd24gY29ycmVjdGx5LCBhbHRob3VnaCBpdCdzIHF1aXRlIGRpZmZlcmVudCB1bmRlciBBcXVhCi0JCQkjIGFuZCBDbGFzc2ljLi4uCi0JCQljLkhpZGVDb250cm9sKCkKLQkJCWMuU2V0Q29udHJvbERhdGEoQ29udHJvbHMua0NvbnRyb2xOb1BhcnQsCi0JCQkJCUNvbnRyb2xzLmtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcsIGRhdGEpCi0JCQljLlNob3dDb250cm9sKCkKLQkJc2VsZi5faXNkZWZhdWx0ID0gb25vZmYKLQkKLQlkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6Ci0JCWlmIHNlbGYuX2lzZGVmYXVsdDoKLQkJCW9sZCA9IFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC00LCAtNCkKLQkJCW5ldyA9IFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC00LCAtNCkKLQkJCVFkLkVyYXNlUmVjdChvbGQpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGQpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChuZXcpCi0JCUNvbnRyb2xXaWRnZXQuYWRqdXN0KHNlbGYsIG9sZGJvdW5kcykKKworICAgICIiIlN0YW5kYXJkIHB1c2ggYnV0dG9uLiIiIgorCisgICAgcHJvY0lEID0gQ29udHJvbHMucHVzaEJ1dFByb2MgfCBDb250cm9scy51c2VXRm9udAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkJ1dHRvbiIsIGNhbGxiYWNrID0gTm9uZSk6CisgICAgICAgIENvbnRyb2xXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHNlbGYucHJvY0lELCBjYWxsYmFjaywgMCwgMCwgMSkKKyAgICAgICAgc2VsZi5faXNkZWZhdWx0ID0gMAorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgICMgZW11bGF0ZSB0aGUgcHVzaGluZyBvZiB0aGUgYnV0dG9uCisgICAgICAgIGltcG9ydCB0aW1lCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbChDb250cm9scy5rQ29udHJvbEJ1dHRvblBhcnQpCisgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKKyAgICAgICAgdGltZS5zbGVlcCgwLjEpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuSGlsaXRlQ29udHJvbCgwKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCkKKworICAgIGRlZiBlbmFibGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sIGFuZCBzZWxmLl9lbmFibGVkIDw+IG9ub2ZmOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5IaWxpdGVDb250cm9sKChub3Qgb25vZmYpIGFuZCAyNTUpCisgICAgICAgICAgICBzZWxmLl9lbmFibGVkID0gb25vZmYKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgQ29udHJvbFdpZGdldC5zaG93KHNlbGYsIG9ub2ZmKQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBzZWxmLl9jb250cm9sLkRyYXcxQ29udHJvbCgpCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgQ29udHJvbFdpZGdldC5vcGVuKHNlbGYpCisgICAgICAgIGlmIHNlbGYuX2lzZGVmYXVsdDoKKyAgICAgICAgICAgIHNlbGYuX3NldGRlZmF1bHQoc2VsZi5faXNkZWZhdWx0KQorCisgICAgZGVmIF9zZXRkZWZhdWx0KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgYyA9IHNlbGYuX2NvbnRyb2wKKyAgICAgICAgaWYgYyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgICAgIGRhdGEgPSAiXHhGRiIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGF0YSA9ICJcMCIKKyAgICAgICAgICAgICMgaGlkZSBiZWZvcmUgY2hhbmdpbmcgc3RhdGUsIG90aGVyd2lzZSB0aGUgYnV0dG9uIGlzbid0IGFsd2F5cworICAgICAgICAgICAgIyByZWRyYXduIGNvcnJlY3RseSwgYWx0aG91Z2ggaXQncyBxdWl0ZSBkaWZmZXJlbnQgdW5kZXIgQXF1YQorICAgICAgICAgICAgIyBhbmQgQ2xhc3NpYy4uLgorICAgICAgICAgICAgYy5IaWRlQ29udHJvbCgpCisgICAgICAgICAgICBjLlNldENvbnRyb2xEYXRhKENvbnRyb2xzLmtDb250cm9sTm9QYXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRyb2xzLmtDb250cm9sUHVzaEJ1dHRvbkRlZmF1bHRUYWcsIGRhdGEpCisgICAgICAgICAgICBjLlNob3dDb250cm9sKCkKKyAgICAgICAgc2VsZi5faXNkZWZhdWx0ID0gb25vZmYKKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgaWYgc2VsZi5faXNkZWZhdWx0OgorICAgICAgICAgICAgb2xkID0gUWQuSW5zZXRSZWN0KG9sZGJvdW5kcywgLTQsIC00KQorICAgICAgICAgICAgbmV3ID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgLTQsIC00KQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KG9sZCkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZCkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG5ldykKKyAgICAgICAgQ29udHJvbFdpZGdldC5hZGp1c3Qoc2VsZiwgb2xkYm91bmRzKQogCiAKIGNsYXNzIEJldmVsQnV0dG9uKEJ1dHRvbik6Ci0JcHJvY0lEID0gQ29udHJvbHMua0NvbnRyb2xCZXZlbEJ1dHRvbk5vcm1hbEJldmVsUHJvYyB8IENvbnRyb2xzLnVzZVdGb250CisgICAgcHJvY0lEID0gQ29udHJvbHMua0NvbnRyb2xCZXZlbEJ1dHRvbk5vcm1hbEJldmVsUHJvYyB8IENvbnRyb2xzLnVzZVdGb250CiAKIAogY2xhc3MgQ2hlY2tCb3goQ29udHJvbFdpZGdldCk6Ci0JCi0JIiIiU3RhbmRhcmQgY2hlY2tib3guIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkNoZWNrYm94IiwgY2FsbGJhY2sgPSBOb25lLCB2YWx1ZSA9IDApOgotCQlwcm9jSUQgPSBDb250cm9scy5jaGVja0JveFByb2MgfCBDb250cm9scy51c2VXRm9udAotCQlDb250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCBwcm9jSUQsIGNhbGxiYWNrLCB2YWx1ZSwgMCwgMSkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCXBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCkKLQkJaWYgcGFydDoKLQkJCXNlbGYudG9nZ2xlKCkKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5nZXQoKSkKLQkKLQlkZWYgcHVzaChzZWxmKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi50b2dnbGUoKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5nZXQoKSkKLQkKLQlkZWYgdG9nZ2xlKHNlbGYpOgotCQlzZWxmLnNldChub3Qgc2VsZi5nZXQoKSkKKworICAgICIiIlN0YW5kYXJkIGNoZWNrYm94LiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIkNoZWNrYm94IiwgY2FsbGJhY2sgPSBOb25lLCB2YWx1ZSA9IDApOgorICAgICAgICBwcm9jSUQgPSBDb250cm9scy5jaGVja0JveFByb2MgfCBDb250cm9scy51c2VXRm9udAorICAgICAgICBDb250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCBwcm9jSUQsIGNhbGxiYWNrLCB2YWx1ZSwgMCwgMSkKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQorICAgICAgICBpZiBwYXJ0OgorICAgICAgICAgICAgc2VsZi50b2dnbGUoKQorICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBzZWxmLmdldCgpKQorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYudG9nZ2xlKCkKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIHNlbGYuZ2V0KCkpCisKKyAgICBkZWYgdG9nZ2xlKHNlbGYpOgorICAgICAgICBzZWxmLnNldChub3Qgc2VsZi5nZXQoKSkKIAogCiBjbGFzcyBSYWRpb0J1dHRvbihDb250cm9sV2lkZ2V0KToKLQkKLQkiIiJTdGFuZGFyZCByYWRpb2J1dHRvbi4iIiIKLQkKLQkjIFhYWCBXZSBuZWVkIGEgcmFkaW9ncm91cCB3aWRnZXQ7IHRoaXMgaXMgdG9vIGtsdWRneS4KLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHRoZWJ1dHRvbnMsIGNhbGxiYWNrID0gTm9uZSwgdmFsdWUgPSAwKToKLQkJcHJvY0lEID0gQ29udHJvbHMucmFkaW9CdXRQcm9jIHwgQ29udHJvbHMudXNlV0ZvbnQKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIDAsIDEpCi0JCXNlbGYudGhlYnV0dG9ucyA9IHRoZWJ1dHRvbnMKLQkJdGhlYnV0dG9ucy5hcHBlbmQoc2VsZikKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYudGhlYnV0dG9ucyA9IE5vbmUKLQkJQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50KQotCQlpZiBwYXJ0OgotCQkJc2VsZi5zZXQoMSkKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgMSkKLQkKLQlkZWYgcHVzaChzZWxmKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5zZXQoMSkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIDEpCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCWZvciBidXR0b24gaW4gc2VsZi50aGVidXR0b25zOgotCQkJaWYgYnV0dG9uLl9jb250cm9sOgotCQkJCWJ1dHRvbi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUoYnV0dG9uID09IHNlbGYpCi0JCQllbHNlOgotCQkJCWJ1dHRvbi5fdmFsdWUgPSAoYnV0dG9uID09IHNlbGYpCisKKyAgICAiIiJTdGFuZGFyZCByYWRpb2J1dHRvbi4iIiIKKworICAgICMgWFhYIFdlIG5lZWQgYSByYWRpb2dyb3VwIHdpZGdldDsgdGhpcyBpcyB0b28ga2x1ZGd5LgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlLCB0aGVidXR0b25zLCBjYWxsYmFjayA9IE5vbmUsIHZhbHVlID0gMCk6CisgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnJhZGlvQnV0UHJvYyB8IENvbnRyb2xzLnVzZVdGb250CisgICAgICAgIENvbnRyb2xXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUsIHByb2NJRCwgY2FsbGJhY2ssIHZhbHVlLCAwLCAxKQorICAgICAgICBzZWxmLnRoZWJ1dHRvbnMgPSB0aGVidXR0b25zCisgICAgICAgIHRoZWJ1dHRvbnMuYXBwZW5kKHNlbGYpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYudGhlYnV0dG9ucyA9IE5vbmUKKyAgICAgICAgQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBwYXJ0ID0gc2VsZi5fY29udHJvbC5UcmFja0NvbnRyb2wocG9pbnQpCisgICAgICAgIGlmIHBhcnQ6CisgICAgICAgICAgICBzZWxmLnNldCgxKQorICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAxKQorCisgICAgZGVmIHB1c2goc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuc2V0KDEpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAxKQorCisgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisgICAgICAgIGZvciBidXR0b24gaW4gc2VsZi50aGVidXR0b25zOgorICAgICAgICAgICAgaWYgYnV0dG9uLl9jb250cm9sOgorICAgICAgICAgICAgICAgIGJ1dHRvbi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUoYnV0dG9uID09IHNlbGYpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGJ1dHRvbi5fdmFsdWUgPSAoYnV0dG9uID09IHNlbGYpCiAKIAogY2xhc3MgU2Nyb2xsYmFyKENvbnRyb2xXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIHNjcm9sbGJhci4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2s9Tm9uZSwgdmFsdWU9MCwgbWluPTAsIG1heD0wLCBsaXZlZmVlZGJhY2s9MSk6Ci0JCWlmIGxpdmVmZWVkYmFjazoKLQkJCXByb2NJRCA9IENvbnRyb2xzLmtDb250cm9sU2Nyb2xsQmFyTGl2ZVByb2MKLQkJZWxzZToKLQkJCXByb2NJRCA9IENvbnRyb2xzLnNjcm9sbEJhclByb2MKLQkJQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCAiIiwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIG1pbiwgbWF4KQotCQotCSMgaW50ZXJmYWNlCi0jCWRlZiBzZXQoc2VsZiwgdmFsdWUpOgotIwkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0jCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKLQkKLQlkZWYgdXAoc2VsZik6Ci0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnKycpCi0JCi0JZGVmIGRvd24oc2VsZik6Ci0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnLScpCi0JCi0JZGVmIHBhZ2V1cChzZWxmKToKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsICcrKycpCi0JCi0JZGVmIHBhZ2Vkb3duKHNlbGYpOgotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJy0tJykKLQkKLQlkZWYgc2V0bWluKHNlbGYsIG1pbik6Ci0JCWlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6Ci0JCQlpZiAtMzI3NjggPD0gbWluIDw9IDMyNzY3OgotCQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQotCQkJCSMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xNaW5pbXVtKG1pbikKLQkJCWVsc2U6Ci0JCQkJc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKG1pbikKLQkJZWxzZToKLQkJCXNlbGYuX21pbiA9IG1pbgotCQotCWRlZiBzZXRtYXgoc2VsZiwgbWF4KToKLQkJaWYgc2VsZi5fY29udHJvbCBpcyBub3QgTm9uZToKLQkJCWlmIC0zMjc2OCA8PSBtYXggPD0gMzI3Njc6Ci0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gdXNlCi0JCQkJIyB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIHBvc3NpYmxlLgotCQkJCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbE1heGltdW0obWF4KQotCQkJZWxzZToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2wzMkJpdE1heGltdW0obWF4KQotCQllbHNlOgotCQkJc2VsZi5fbWF4ID0gbWF4Ci0JCi0JZGVmIHNldHZpZXdzaXplKHNlbGYsIHZpZXdzaXplKToKLQkJaWYgc2VsZi5fY29udHJvbCBpcyBub3QgTm9uZToKLQkJCXRyeToKLQkJCQlzZWxmLl9jb250cm9sLlNldENvbnRyb2xWaWV3U2l6ZSh2aWV3c2l6ZSkKLQkJCQkjIE5vdCBhdmFpbGFibGUgaW4gTWFjT1MgOC4xLCBidXQgdGhhdCdzIE9LIHNpbmNlIGl0IG9ubHkgYWZmZWN0cwotCQkJCSMgcHJvcG9ydGlvbmFsIHNjcm9sbGJhcnMgd2hpY2ggd2VyZW4ndCBhdmFpbGFibGUgaW4gOC4xIGVpdGhlci4KLQkJCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJCXBhc3MKLQkJZWxzZToKLQkJCXNlbGYuX3ZpZXdzaXplID0gdmlld3NpemUKLQkKLQlkZWYgZ2V0bWluKHNlbGYpOgotCQl0cnk6Ci0JCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNaW5pbXVtKCkKLQkJCSMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKLQkJCSMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KLQkJZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6Ci0JCQlyZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWluaW11bSgpCi0JCi0JZGVmIGdldG1heChzZWxmKToKLQkJdHJ5OgotCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbDMyQml0TWF4aW11bSgpCi0JCQkjIE5vIDMyLWJpdCBjb250cm9sIHN1cHBvcnQgaW4gTWFjT1MgOC4xLCBzbyBmYWxsCi0JCQkjIGJhY2sgdG8gdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBuZWVkZWQuCi0JCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbE1heGltdW0oKQotCQotCSMgaW50ZXJuYWxzCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlkZWYgaGl0dGVyKGN0bCwgcGFydCwgc2VsZj1zZWxmKToKLQkJCWlmIHBhcnQ6Ci0JCQkJc2VsZi5faGl0KHBhcnQpCi0JCXBhcnQgPSBzZWxmLl9jb250cm9sLlRyYWNrQ29udHJvbChwb2ludCwgaGl0dGVyKQotCQotCWRlZiBfaGl0KHNlbGYsIHBhcnQpOgotCQl2YWx1ZSA9IE5vbmUKLQkJaWYgcGFydCA9PSBDb250cm9scy5pblRodW1iOgotCQkJdHJ5OgotCQkJCXZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRWYWx1ZSgpCi0JCQkJIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gZmFsbAotCQkJCSMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KLQkJCWV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgotCQkJCXZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQotCQllbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5VcEJ1dHRvbjoKLQkJCXZhbHVlID0gIisiCi0JCWVsaWYgcGFydCA9PSBDb250cm9scy5pbkRvd25CdXR0b246Ci0JCQl2YWx1ZSA9ICItIgotCQllbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5QYWdlVXA6Ci0JCQl2YWx1ZSA9ICIrKyIKLQkJZWxpZiBwYXJ0ID09IENvbnRyb2xzLmluUGFnZURvd246Ci0JCQl2YWx1ZSA9ICItLSIKLQkJaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCXNlbGYuX2NvbnRyb2wuRHJhdzFDb250cm9sKCkKLQkJCSNRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQlzZWxmLl9jb250cm9sLkhpZGVDb250cm9sKCkKLQkJc2VsZi5fY29udHJvbC5Nb3ZlQ29udHJvbChzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1sxXSkKLQkJc2VsZi5fY29udHJvbC5TaXplQ29udHJvbChzZWxmLl9ib3VuZHNbMl0gLSBzZWxmLl9ib3VuZHNbMF0sIHNlbGYuX2JvdW5kc1szXSAtIHNlbGYuX2JvdW5kc1sxXSkKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCVFkLkVyYXNlUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlpZiBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5fY29udHJvbC5TaG93Q29udHJvbCgpCi0JCQllbHNlOgotCQkJCVFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCi0JCQlzZWxmLkdldFdpbmRvdygpLlZhbGlkV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICAiIiJTdGFuZGFyZCBzY3JvbGxiYXIuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgY2FsbGJhY2s9Tm9uZSwgdmFsdWU9MCwgbWluPTAsIG1heD0wLCBsaXZlZmVlZGJhY2s9MSk6CisgICAgICAgIGlmIGxpdmVmZWVkYmFjazoKKyAgICAgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLmtDb250cm9sU2Nyb2xsQmFyTGl2ZVByb2MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnNjcm9sbEJhclByb2MKKyAgICAgICAgQ29udHJvbFdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCAiIiwgcHJvY0lELCBjYWxsYmFjaywgdmFsdWUsIG1pbiwgbWF4KQorCisgICAgIyBpbnRlcmZhY2UKKyMgICAgICAgZGVmIHNldChzZWxmLCB2YWx1ZSk6CisjICAgICAgICAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisjICAgICAgICAgICAgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsIHZhbHVlKQorCisgICAgZGVmIHVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJysnKQorCisgICAgZGVmIGRvd24oc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCAnLScpCisKKyAgICBkZWYgcGFnZXVwKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMSwgJysrJykKKworICAgIGRlZiBwYWdlZG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDEsICctLScpCisKKyAgICBkZWYgc2V0bWluKHNlbGYsIG1pbik6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiAtMzI3NjggPD0gbWluIDw9IDMyNzY3OgorICAgICAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIHVzZQorICAgICAgICAgICAgICAgICMgdGhlIDE2LWJpdCBpbnRlcmZhY2Ugd2hlbiBwb3NzaWJsZS4KKyAgICAgICAgICAgICAgICBzZWxmLl9jb250cm9sLlNldENvbnRyb2xNaW5pbXVtKG1pbikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sMzJCaXRNaW5pbXVtKG1pbikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX21pbiA9IG1pbgorCisgICAgZGVmIHNldG1heChzZWxmLCBtYXgpOgorICAgICAgICBpZiBzZWxmLl9jb250cm9sIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgLTMyNzY4IDw9IG1heCA8PSAzMjc2NzoKKyAgICAgICAgICAgICAgICAjIE5vIDMyLWJpdCBjb250cm9sIHN1cHBvcnQgaW4gTWFjT1MgOC4xLCBzbyB1c2UKKyAgICAgICAgICAgICAgICAjIHRoZSAxNi1iaXQgaW50ZXJmYWNlIHdoZW4gcG9zc2libGUuCisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sTWF4aW11bShtYXgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbDMyQml0TWF4aW11bShtYXgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9tYXggPSBtYXgKKworICAgIGRlZiBzZXR2aWV3c2l6ZShzZWxmLCB2aWV3c2l6ZSk6CisgICAgICAgIGlmIHNlbGYuX2NvbnRyb2wgaXMgbm90IE5vbmU6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmlld1NpemUodmlld3NpemUpCisgICAgICAgICAgICAgICAgIyBOb3QgYXZhaWxhYmxlIGluIE1hY09TIDguMSwgYnV0IHRoYXQncyBPSyBzaW5jZSBpdCBvbmx5IGFmZmVjdHMKKyAgICAgICAgICAgICAgICAjIHByb3BvcnRpb25hbCBzY3JvbGxiYXJzIHdoaWNoIHdlcmVuJ3QgYXZhaWxhYmxlIGluIDguMSBlaXRoZXIuCisgICAgICAgICAgICBleGNlcHQgTm90SW1wbGVtZW50ZWRFcnJvcjoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl92aWV3c2l6ZSA9IHZpZXdzaXplCisKKyAgICBkZWYgZ2V0bWluKHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNaW5pbXVtKCkKKyAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWluaW11bSgpCisKKyAgICBkZWYgZ2V0bWF4KHNlbGYpOgorICAgICAgICB0cnk6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRNYXhpbXVtKCkKKyAgICAgICAgICAgICMgTm8gMzItYml0IGNvbnRyb2wgc3VwcG9ydCBpbiBNYWNPUyA4LjEsIHNvIGZhbGwKKyAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgZXhjZXB0IE5vdEltcGxlbWVudGVkRXJyb3I6CisgICAgICAgICAgICByZXR1cm4gc2VsZi5fY29udHJvbC5HZXRDb250cm9sTWF4aW11bSgpCisKKyAgICAjIGludGVybmFscworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgZGVmIGhpdHRlcihjdGwsIHBhcnQsIHNlbGY9c2VsZik6CisgICAgICAgICAgICBpZiBwYXJ0OgorICAgICAgICAgICAgICAgIHNlbGYuX2hpdChwYXJ0KQorICAgICAgICBwYXJ0ID0gc2VsZi5fY29udHJvbC5UcmFja0NvbnRyb2wocG9pbnQsIGhpdHRlcikKKworICAgIGRlZiBfaGl0KHNlbGYsIHBhcnQpOgorICAgICAgICB2YWx1ZSA9IE5vbmUKKyAgICAgICAgaWYgcGFydCA9PSBDb250cm9scy5pblRodW1iOgorICAgICAgICAgICAgdHJ5OgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sMzJCaXRWYWx1ZSgpCisgICAgICAgICAgICAgICAgIyBObyAzMi1iaXQgY29udHJvbCBzdXBwb3J0IGluIE1hY09TIDguMSwgc28gZmFsbAorICAgICAgICAgICAgICAgICMgYmFjayB0byB0aGUgMTYtYml0IGludGVyZmFjZSB3aGVuIG5lZWRlZC4KKyAgICAgICAgICAgIGV4Y2VwdCBOb3RJbXBsZW1lbnRlZEVycm9yOgorICAgICAgICAgICAgICAgIHZhbHVlID0gc2VsZi5fY29udHJvbC5HZXRDb250cm9sVmFsdWUoKQorICAgICAgICBlbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5VcEJ1dHRvbjoKKyAgICAgICAgICAgIHZhbHVlID0gIisiCisgICAgICAgIGVsaWYgcGFydCA9PSBDb250cm9scy5pbkRvd25CdXR0b246CisgICAgICAgICAgICB2YWx1ZSA9ICItIgorICAgICAgICBlbGlmIHBhcnQgPT0gQ29udHJvbHMuaW5QYWdlVXA6CisgICAgICAgICAgICB2YWx1ZSA9ICIrKyIKKyAgICAgICAgZWxpZiBwYXJ0ID09IENvbnRyb2xzLmluUGFnZURvd246CisgICAgICAgICAgICB2YWx1ZSA9ICItLSIKKyAgICAgICAgaWYgdmFsdWUgaXMgbm90IE5vbmUgYW5kIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAxLCB2YWx1ZSkKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fY29udHJvbC5EcmF3MUNvbnRyb2woKQorICAgICAgICAgICAgI1FkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKKyAgICAgICAgc2VsZi5fY29udHJvbC5IaWRlQ29udHJvbCgpCisgICAgICAgIHNlbGYuX2NvbnRyb2wuTW92ZUNvbnRyb2woc2VsZi5fYm91bmRzWzBdLCBzZWxmLl9ib3VuZHNbMV0pCisgICAgICAgIHNlbGYuX2NvbnRyb2wuU2l6ZUNvbnRyb2woc2VsZi5fYm91bmRzWzJdIC0gc2VsZi5fYm91bmRzWzBdLCBzZWxmLl9ib3VuZHNbM10gLSBzZWxmLl9ib3VuZHNbMV0pCisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5FcmFzZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgaWYgc2VsZi5fYWN0aXZhdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuX2NvbnRyb2wuU2hvd0NvbnRyb2woKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQogCiAKIGRlZiBfc2NhbGViYXJ2YWx1ZShhYnNtaW4sIGFic21heCwgY3VybWluLCBjdXJtYXgpOgotCWlmIGN1cm1pbiA8PSBhYnNtaW4gYW5kIGN1cm1heCA+PSBhYnNtYXg6Ci0JCXJldHVybiBOb25lCi0JaWYgY3VybWluIDw9IGFic21pbjoKLQkJcmV0dXJuIDAKLQlpZiBjdXJtYXggPj0gYWJzbWF4OgotCQlyZXR1cm4gMzI3NjcKLQlwZXJjID0gZmxvYXQoY3VybWluLWFic21pbikgLyBmbG9hdCgoYWJzbWF4IC0gYWJzbWluKSAtIChjdXJtYXggLSBjdXJtaW4pKQotCXJldHVybiBpbnQocGVyYyozMjc2NykKLQorICAgIGlmIGN1cm1pbiA8PSBhYnNtaW4gYW5kIGN1cm1heCA+PSBhYnNtYXg6CisgICAgICAgIHJldHVybiBOb25lCisgICAgaWYgY3VybWluIDw9IGFic21pbjoKKyAgICAgICAgcmV0dXJuIDAKKyAgICBpZiBjdXJtYXggPj0gYWJzbWF4OgorICAgICAgICByZXR1cm4gMzI3NjcKKyAgICBwZXJjID0gZmxvYXQoY3VybWluLWFic21pbikgLyBmbG9hdCgoYWJzbWF4IC0gYWJzbWluKSAtIChjdXJtYXggLSBjdXJtaW4pKQorICAgIHJldHVybiBpbnQocGVyYyozMjc2NykKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV2tleXMucHkgYi9NYWMvVG9vbHMvSURFL1drZXlzLnB5CmluZGV4IDg3NmYwMmYuLjliYzQ1MjIgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvV2tleXMucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Xa2V5cy5weQpAQCAtMSw0NSArMSw0NSBAQAotc3BhY2VrZXkJCT0gJyAnCi1yZXR1cm5rZXkgCQk9ICdccicKLXRhYmtleSAJCT0gJ1x0JwotZW50ZXJrZXkgCQk9ICdcMDAzJwotYmFja3NwYWNla2V5IAk9ICdcMDEwJwotZGVsZXRla2V5IAkJPSAnXDE3NycKLWNsZWFya2V5CQk9ICdcMDMzJwotaGVscGtleSAJCT0gJ1wwMDUnCitzcGFjZWtleSAgICAgICAgICAgICAgICA9ICcgJworcmV0dXJua2V5ICAgICAgICAgICAgICAgPSAnXHInCit0YWJrZXkgICAgICAgICAgPSAnXHQnCitlbnRlcmtleSAgICAgICAgICAgICAgICA9ICdcMDAzJworYmFja3NwYWNla2V5ICAgID0gJ1wwMTAnCitkZWxldGVrZXkgICAgICAgICAgICAgICA9ICdcMTc3JworY2xlYXJrZXkgICAgICAgICAgICAgICAgPSAnXDAzMycKK2hlbHBrZXkgICAgICAgICAgICAgICAgID0gJ1wwMDUnCiAKLWxlZnRhcnJvd2tleSAJPSAnXDAzNCcKLXJpZ2h0YXJyb3drZXkgCT0gJ1wwMzUnCi11cGFycm93a2V5IAkJPSAnXDAzNicKLWRvd25hcnJvd2tleSAJPSAnXDAzNycKLWFycm93a2V5cyAJCT0gW2xlZnRhcnJvd2tleSwgcmlnaHRhcnJvd2tleSwgdXBhcnJvd2tleSwgZG93bmFycm93a2V5XQorbGVmdGFycm93a2V5ICAgID0gJ1wwMzQnCityaWdodGFycm93a2V5ICAgPSAnXDAzNScKK3VwYXJyb3drZXkgICAgICAgICAgICAgID0gJ1wwMzYnCitkb3duYXJyb3drZXkgICAgPSAnXDAzNycKK2Fycm93a2V5cyAgICAgICAgICAgICAgID0gW2xlZnRhcnJvd2tleSwgcmlnaHRhcnJvd2tleSwgdXBhcnJvd2tleSwgZG93bmFycm93a2V5XQogCi10b3BrZXkgCQk9ICdcMDAxJwotYm90dG9ta2V5IAkJPSAnXDAwNCcKLXBhZ2V1cGtleSAJCT0gJ1wwMTMnCi1wYWdlZG93bmtleSAJPSAnXDAxNCcKLXNjcm9sbGtleXMgCQk9IFt0b3BrZXksIGJvdHRvbWtleSwgcGFnZXVwa2V5LCBwYWdlZG93bmtleV0KK3RvcGtleSAgICAgICAgICA9ICdcMDAxJworYm90dG9ta2V5ICAgICAgICAgICAgICAgPSAnXDAwNCcKK3BhZ2V1cGtleSAgICAgICAgICAgICAgID0gJ1wwMTMnCitwYWdlZG93bmtleSAgICAgPSAnXDAxNCcKK3Njcm9sbGtleXMgICAgICAgICAgICAgID0gW3RvcGtleSwgYm90dG9ta2V5LCBwYWdldXBrZXksIHBhZ2Vkb3dua2V5XQogCiBuYXZpZ2F0aW9ua2V5cyA9IGFycm93a2V5cyArIHNjcm9sbGtleXMKIAoga2V5Y29kZXMgPSB7Ci0JInNwYWNlIgkJOiAnICcsCi0JInJldHVybiIJCTogJ1xyJywKLQkidGFiIiAJCQk6ICdcdCcsCi0JImVudGVyIiAJCTogJ1wwMDMnLAotCSJiYWNrc3BhY2UiCTogJ1wwMTAnLAotCSJkZWxldGUiCQk6ICdcMTc3JywKLQkiaGVscCIgCQk6ICdcMDA1JywKLQkibGVmdGFycm93IgkJOiAnXDAzNCcsCi0JInJpZ2h0YXJyb3ciIAk6ICdcMDM1JywKLQkidXBhcnJvdyIgCQk6ICdcMDM2JywKLQkiZG93bmFycm93Igk6ICdcMDM3JywKLQkidG9wIiAJCQk6ICdcMDAxJywKLQkiYm90dG9tIiAJCTogJ1wwMDQnLAotCSJwYWdldXAiIAkJOiAnXDAxMycsCi0JInBhZ2Vkb3duIiAJOiAnXDAxNCcKKyAgICAgICAgInNwYWNlIiAgICAgICAgIDogJyAnLAorICAgICAgICAicmV0dXJuIiAgICAgICAgICAgICAgICA6ICdccicsCisgICAgICAgICJ0YWIiICAgICAgICAgICAgICAgICAgIDogJ1x0JywKKyAgICAgICAgImVudGVyIiAgICAgICAgICAgICAgICAgOiAnXDAwMycsCisgICAgICAgICJiYWNrc3BhY2UiICAgICA6ICdcMDEwJywKKyAgICAgICAgImRlbGV0ZSIgICAgICAgICAgICAgICAgOiAnXDE3NycsCisgICAgICAgICJoZWxwIiAgICAgICAgICA6ICdcMDA1JywKKyAgICAgICAgImxlZnRhcnJvdyIgICAgICAgICAgICAgOiAnXDAzNCcsCisgICAgICAgICJyaWdodGFycm93IiAgICA6ICdcMDM1JywKKyAgICAgICAgInVwYXJyb3ciICAgICAgICAgICAgICAgOiAnXDAzNicsCisgICAgICAgICJkb3duYXJyb3ciICAgICA6ICdcMDM3JywKKyAgICAgICAgInRvcCIgICAgICAgICAgICAgICAgICAgOiAnXDAwMScsCisgICAgICAgICJib3R0b20iICAgICAgICAgICAgICAgIDogJ1wwMDQnLAorICAgICAgICAicGFnZXVwIiAgICAgICAgICAgICAgICA6ICdcMDEzJywKKyAgICAgICAgInBhZ2Vkb3duIiAgICAgIDogJ1wwMTQnCiB9CiAKIGtleW5hbWVzID0ge30KIGZvciBrLCB2IGluIGtleWNvZGVzLml0ZW1zKCk6Ci0Ja2V5bmFtZXNbdl0gPSBrCisgICAga2V5bmFtZXNbdl0gPSBrCiBkZWwgaywgdgpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9XbGlzdHMucHkgYi9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQppbmRleCAxYjY2YThiLi45YWViN2M0IDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQorKysgYi9NYWMvVG9vbHMvSURFL1dsaXN0cy5weQpAQCAtMTAsNTczICsxMCw1NzIgQEAKIAogCiBjbGFzcyBMaXN0KFdiYXNlLlNlbGVjdGFibGVXaWRnZXQpOgotCQotCSIiIlN0YW5kYXJkIGxpc3Qgd2lkZ2V0LiIiIgotCQotCUxERUZfSUQgPSAwCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGl0ZW1zID0gTm9uZSwgY2FsbGJhY2sgPSBOb25lLCBmbGFncyA9IDAsIGNvbHMgPSAxLCB0eXBpbmdjYXNlc2Vucz0wKToKLQkJaWYgaXRlbXMgaXMgTm9uZToKLQkJCWl0ZW1zID0gW10KLQkJc2VsZi5pdGVtcyA9IGl0ZW1zCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi5fc2VsZWN0ZWQgPSAwCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCXNlbGYuX2xpc3QgPSBOb25lCi0JCXNlbGYuX2NvbHMgPSBjb2xzCi0JCXNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKLQkJc2VsZi5fZmxhZ3MgPSBmbGFncwotCQlzZWxmLnR5cGluZ2Nhc2VzZW5zID0gdHlwaW5nY2FzZXNlbnMKLQkJc2VsZi5sYXN0dHlwaW5nID0gIiIKLQkJc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQotCQlzZWxmLnRpbWVsaW1pdCA9IDMwCi0JCXNlbGYuc2V0aXRlbXMoaXRlbXMpCi0JCXNlbGYuZHJhd2luZ21vZGUgPSAwCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJc2VsZi5jcmVhdGVsaXN0KCkKLQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQotCWRlZiBjcmVhdGVsaXN0KHNlbGYpOgotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJcmVjdCA9IHNlbGYuX2JvdW5kcwotCQlyZWN0ID0gcmVjdFswXSsxLCByZWN0WzFdKzEsIHJlY3RbMl0tMTYsIHJlY3RbM10tMQotCQlzZWxmLl92aWV3Ym91bmRzID0gcmVjdAotCQlzZWxmLl9saXN0ID0gTE5ldyhyZWN0LCAoMCwgMCwgc2VsZi5fY29scywgMCksICgwLCAwKSwgc2VsZi5MREVGX0lELCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAotCQkJCQkwLCAxLCAwLCAxKQotCQlpZiBzZWxmLmRyYXdpbmdtb2RlOgotCQkJc2VsZi5fbGlzdC5MU2V0RHJhd2luZ01vZGUoMCkKLQkJc2VsZi5fbGlzdC5zZWxGbGFncyA9IHNlbGYuX2ZsYWdzCi0JCXNlbGYuc2V0aXRlbXMoc2VsZi5pdGVtcykKLQkJaWYgaGFzYXR0cihzZWxmLCAiX3NlbCIpOgotCQkJc2VsZi5zZXRzZWxlY3Rpb24oc2VsZi5fc2VsKQotCQkJZGVsIHNlbGYuX3NlbAotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJIyBBcHBlYXJhbmNlIGZyYW1lcyBhcmUgZHJhd24gb3V0c2lkZSB0aGUgc3BlY2lmaWVkIGJvdW5kcywKLQkJIyBzbyB3ZSBhbHdheXMgbmVlZCB0byBvdXRzZXQgdGhlIGludmFsaWRhdGVkIGFyZWEuCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCiAKLQkJaWYgb2xkYm91bmRzWzoyXSA9PSBzZWxmLl9ib3VuZHNbOjJdOgotCQkJIyBzZXQgdmlzUmduIHRvIGVtcHR5LCB0byBwcmV2ZW50IG5hc3R5IGRyYXdpbmcgc2lkZSBlZmZlY3Qgb2YgTFNpemUoKQotCQkJUWQuUmVjdFJnbihzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24sICgwLCAwLCAwLCAwKSkKLQkJCSMgbGlzdCBzdGlsbCBoYXMgdGhlIHNhbWUgdXBwZXIvbGVmdCBjb29yZGluYXRlcywgdXNlIExTaXplCi0JCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCQl3aWR0aCA9IHIgLSBsIC0gMTcKLQkJCWhlaWdodCA9IGIgLSB0IC0gMgotCQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLl92aWV3Ym91bmRzCi0JCQlzZWxmLl92aWV3Ym91bmRzID0gdmwsIHZ0LCB2bCArIHdpZHRoLCB2dCArIGhlaWdodAotCQkJc2VsZi5fbGlzdC5MU2l6ZSh3aWR0aCwgaGVpZ2h0KQotCQkJIyBub3cgKndoeSogZG9lc24ndCB0aGUgbGlzdCBtYW5hZ2VyIHJlY2FsYyB0aGUgY2VsbHJlY3Q/Pz8KLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLDApKQotCQkJY2VsbGhlaWdodCA9IGIgLSB0Ci0JCQlzZWxmLl9saXN0LkxDZWxsU2l6ZSgod2lkdGgvc2VsZi5fY29scywgY2VsbGhlaWdodCkpCi0JCQkjIHJlc2V0IHZpc1JnbgotCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5DYWxjVmlzKCkKLQkJZWxzZToKLQkJCSMgb2ggd2VsbCwgc2luY2UgdGhlIGxpc3QgbWFuYWdlciBkb2Vzbid0IGhhdmUgYSBMTW92ZSBjYWxsLAotCQkJIyB3ZSBoYXZlIHRvIG1ha2UgdGhlIGxpc3QgYWxsIG92ZXIgYWdhaW4uLi4KLQkJCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJCXRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQotCQkJc2VsZi5fbGlzdCA9IE5vbmUKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKLQkJCXNlbGYuY3JlYXRlbGlzdCgpCi0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWwpCi0JCQlzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKLQkJCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2xpc3QgPSBOb25lCi0JCXNlbGYuX2NhbGxiYWNrID0gTm9uZQotCQlzZWxmLml0ZW1zID0gW10KLQkJV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlzZWxmLnNldGl0ZW1zKGl0ZW1zKQotCQotCWRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6Ci0JCXNlbGYuaXRlbXMgPSBpdGVtcwotCQl0aGVfbGlzdCA9IHNlbGYuX2xpc3QKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXJldHVybgotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCXRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQotCQl0aGVfbGlzdC5MRGVsUm93KDAsIDEpCi0JCXRoZV9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQotCQlzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgotCQlzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCi0JCWZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgotCQkJc2V0X2NlbGwoc2VsZl9pdGVtcmVwcihpdGVtc1tpXSksICgwLCBpKSkKLQkJc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCi0JCXNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCWlzZG91YmxlY2xpY2sgPSBzZWxmLl9saXN0LkxDbGljayhwb2ludCwgbW9kaWZpZXJzKQotCQlpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgaXNkb3VibGVjbGljaykKLQkJcmV0dXJuIDEKLQkKLQlkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKLQkJKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQluZXdzZWxlY3Rpb24gPSBbXQotCQlpZiBjaGFyID09IFdrZXlzLnVwYXJyb3drZXk6Ci0JCQlpZiBsZW4oc2VsKSA+PSAxIGFuZCBtaW4oc2VsKSA+IDA6Ci0JCQkJbmV3c2VsZWN0aW9uID0gW21pbihzZWwpIC0gMV0KLQkJCWVsc2U6Ci0JCQkJbmV3c2VsZWN0aW9uID0gWzBdCi0JCWVsaWYgY2hhciA9PSBXa2V5cy5kb3duYXJyb3drZXk6Ci0JCQlpZiBsZW4oc2VsKSA+PSAxIGFuZCBtYXgoc2VsKSA8IChsZW4oc2VsZi5pdGVtcykgLSAxKToKLQkJCQkJbmV3c2VsZWN0aW9uID0gW21heChzZWwpICsgMV0KLQkJCWVsc2U6Ci0JCQkJbmV3c2VsZWN0aW9uID0gW2xlbihzZWxmLml0ZW1zKSAtIDFdCi0JCWVsc2U6Ci0JCQltb2RpZmllcnMgPSAwCi0JCQlpZiAoc2VsZi5sYXN0dGltZSArIHNlbGYudGltZWxpbWl0KSA8IEV2dC5UaWNrQ291bnQoKToKLQkJCQlzZWxmLmxhc3R0eXBpbmcgPSAiIgotCQkJaWYgc2VsZi50eXBpbmdjYXNlc2VuczoKLQkJCQlzZWxmLmxhc3R0eXBpbmcgPSBzZWxmLmxhc3R0eXBpbmcgKyBjaGFyCi0JCQllbHNlOgotCQkJCXNlbGYubGFzdHR5cGluZyA9IHNlbGYubGFzdHR5cGluZyArIHN0cmluZy5sb3dlcihjaGFyKQotCQkJc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQotCQkJaSA9IHNlbGYuZmluZG1hdGNoKHNlbGYubGFzdHR5cGluZykKLQkJCW5ld3NlbGVjdGlvbiA9IFtpXQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuc2hpZnRLZXkgYW5kIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6Ci0JCQluZXdzZWxlY3Rpb24gPSBuZXdzZWxlY3Rpb24gKyBzZWwKLQkJc2VsZi5zZXRzZWxlY3Rpb24obmV3c2VsZWN0aW9uKQotCQlzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKLQkJc2VsZi5jbGljaygoLTEsIC0xKSwgMCkKLQkKLQlkZWYgZmluZG1hdGNoKHNlbGYsIHRhZyk6Ci0JCWxvd2VyID0gc3RyaW5nLmxvd2VyCi0JCWl0ZW1zID0gc2VsZi5pdGVtcwotCQl0eXBpbmdjYXNlc2VucyA9IHNlbGYudHlwaW5nY2FzZXNlbnMKLQkJdGFnbGVuID0gbGVuKHRhZykKLQkJbWF0Y2ggPSAnXDM3NycgKiAxMDAKLQkJbWF0Y2hfaSA9IC0xCi0JCWZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgotCQkJaXRlbSA9IHN0cihpdGVtc1tpXSkKLQkJCWlmIG5vdCB0eXBpbmdjYXNlc2VuczoKLQkJCQlpdGVtID0gbG93ZXIoaXRlbSkKLQkJCWlmIHRhZyA8PSBpdGVtIDwgbWF0Y2g6Ci0JCQkJbWF0Y2ggPSBpdGVtCi0JCQkJbWF0Y2hfaSA9IGkKLQkJaWYgbWF0Y2hfaSA+PSAwOgotCQkJcmV0dXJuIG1hdGNoX2kKLQkJZWxzZToKLQkJCXJldHVybiBsZW4oaXRlbXMpIC0gMQotCQotCWRlZiBkb21lbnVfY29weShzZWxmLCAqYXJncyk6Ci0JCXNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKLQkJc2VsaXRlbXMgPSBbXQotCQlmb3IgaSBpbiBzZWw6Ci0JCQlzZWxpdGVtcy5hcHBlbmQoc3RyKHNlbGYuaXRlbXNbaV0pKQotCQl0ZXh0ID0gc3RyaW5nLmpvaW4oc2VsaXRlbXMsICdccicpCi0JCWlmIHRleHQ6Ci0JCQlpZiBoYXNhdHRyKFNjcmFwLCAnUHV0U2NyYXAnKToKLQkJCQlTY3JhcC5aZXJvU2NyYXAoKQotCQkJCVNjcmFwLlB1dFNjcmFwKCdURVhUJywgdGV4dCkKLQkJCWVsc2U6Ci0JCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQkJCXNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKLQkJCQlzYy5QdXRTY3JhcEZsYXZvcignVEVYVCcsIDAsIHRleHQpCi0JCi0JZGVmIGNhbl9jb3B5KHNlbGYsICphcmdzKToKLQkJcmV0dXJuIGxlbihzZWxmLmdldHNlbGVjdGlvbigpKSA8PiAwCi0JCi0JZGVmIGRvbWVudV9zZWxlY3RhbGwoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLnNlbGVjdGFsbCgpCi0JCi0JZGVmIGNhbl9zZWxlY3RhbGwoc2VsZiwgKmFyZ3MpOgotCQlyZXR1cm4gbm90IHNlbGYuX2xpc3Quc2VsRmxhZ3MgJiBMaXN0cy5sT25seU9uZQotCQotCWRlZiBzZWxlY3RhbGwoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbihyYW5nZShsZW4oc2VsZi5pdGVtcykpKQotCQkJc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCi0JCQlzZWxmLmNsaWNrKCgtMSwgLTEpLCAwKQotCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6Ci0JCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQkJcmV0dXJuIHNlbGYuX3NlbAotCQkJcmV0dXJuIFtdCi0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXJldHVybiBpdGVtcwotCQotCWRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgc2VsZWN0aW9uKToKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXNlbGYuX3NlbCA9IHNlbGVjdGlvbgotCQkJcmV0dXJuCi0JCXNldF9zZWwgPSBzZWxmLl9saXN0LkxTZXRTZWxlY3QKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKLQkJCWlmIGkgaW4gc2VsZWN0aW9uOgotCQkJCXNldF9zZWwoMSwgKDAsIGkpKQotCQkJZWxzZToKLQkJCQlzZXRfc2VsKDAsICgwLCBpKSkKLQkJc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCi0JCi0JZGVmIGdldHNlbGVjdGVkb2JqZWN0cyhzZWxmKToKLQkJc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQlvYmplY3RzID0gW10KLQkJZm9yIGkgaW4gc2VsOgotCQkJb2JqZWN0cy5hcHBlbmQoc2VsZi5pdGVtc1tpXSkKLQkJcmV0dXJuIG9iamVjdHMKLQkKLQlkZWYgc2V0c2VsZWN0ZWRvYmplY3RzKHNlbGYsIG9iamVjdHMpOgotCQlzZWwgPSBbXQotCQlmb3IgbyBpbiBvYmplY3RzOgotCQkJdHJ5OgotCQkJCXNlbC5hcHBlbmQoc2VsZi5pdGVtcy5pbmRleChvKSkKLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JCXNlbGYuc2V0c2VsZWN0aW9uKHNlbCkKLQkKLQlkZWYgZ2V0dG9wY2VsbChzZWxmKToKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQl0ID0gdCArIDEKLQkJY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCAwKSkKLQkJY2VsbGhlaWdodCA9IGNiIC0gY3QKLQkJcmV0dXJuICh0IC0gY3QpIC8gY2VsbGhlaWdodAotCQotCWRlZiBzZXR0b3BjZWxsKHNlbGYsIHRvcGNlbGwpOgotCQl0b3AgPSBzZWxmLmdldHRvcGNlbGwoKQotCQlkaWZmID0gdG9wY2VsbCAtIHRvcAotCQlzZWxmLl9saXN0LkxTY3JvbGwoMCwgZGlmZikKLQkKLQlkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKLQkJaWYgc2VsZi5fdmlzaWJsZToKLQkJCWlmIG5vdCB2aXNSZ246Ci0JCQkJdmlzUmduID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkudmlzUmduCi0JCQlzZWxmLl9saXN0LkxVcGRhdGUodmlzUmduKQotCQkJc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBzZWxmLl9hY3RpdmF0ZWRdCi0JCQlBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKLQkJCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5kcmF3c2VsZnJhbWUoMSkKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKLQkJCXJldHVybgotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKLQkKLQlkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgotCQlzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5fbGlzdC5MQWN0aXZhdGUob25vZmYpCi0JCQkjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBvbm9mZl0KLQkJCSNBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKLQkJCWlmIHNlbGYuX3NlbGVjdGVkOgotCQkJCXNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCXJldHVybiBzZWxmLml0ZW1zCi0JCi0JZGVmIGl0ZW1yZXByKHNlbGYsIGl0ZW0pOgotCQlyZXR1cm4gc3RyKGl0ZW0pWzoyNTVdCi0JCi0JZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKLQkJcmV0dXJuIHNlbGYuaXRlbXNbaW5kZXhdCi0JCi0JZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCBpdGVtKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJc2VsZi5fbGlzdC5MU2V0Q2VsbChzZWxmLml0ZW1yZXByKGl0ZW0pLCAoMCwgaW5kZXgpKQotCQlzZWxmLml0ZW1zW2luZGV4XSA9IGl0ZW0KLQkKLQlkZWYgX19kZWxpdGVtX18oc2VsZiwgaW5kZXgpOgotCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQlzZWxmLl9saXN0LkxEZWxSb3coMSwgaW5kZXgpCi0JCWRlbCBzZWxmLml0ZW1zW2luZGV4XQotCQotCWRlZiBfX2dldHNsaWNlX18oc2VsZiwgYSwgYik6Ci0JCXJldHVybiBzZWxmLml0ZW1zW2E6Yl0KLQkKLQlkZWYgX19kZWxzbGljZV9fKHNlbGYsIGEsIGIpOgotCQlpZiBiLWE6Ci0JCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQkJc2VsZi5fbGlzdC5MRGVsUm93KGItYSwgYSkKLQkJCWRlbCBzZWxmLml0ZW1zW2E6Yl0KLQkKLQlkZWYgX19zZXRzbGljZV9fKHNlbGYsIGEsIGIsIGl0ZW1zKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJbCA9IGxlbihpdGVtcykKLQkJCXRoZV9saXN0ID0gc2VsZi5fbGlzdAotCQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQotCQkJaWYgYi1hOgotCQkJCWlmIGIgPiBsZW4oc2VsZi5pdGVtcyk6Ci0JCQkJCSMgZml4IGZvciBuZXcgMS41ICJmZWF0dXJlIiB3aGVyZSBiIGlzIHN5cy5tYXhpbnQgaW5zdGVhZCBvZiBsZW4oc2VsZikuLi4KLQkJCQkJIyBMRGVsUm93IGRvZXNuJ3QgbGlrZSBtYXhpbnQuCi0JCQkJCWIgPSBsZW4oc2VsZi5pdGVtcykKLQkJCQl0aGVfbGlzdC5MRGVsUm93KGItYSwgYSkKLQkJCXRoZV9saXN0LkxBZGRSb3cobCwgYSkKLQkJCXNlbGZfaXRlbXJlcHIgPSBzZWxmLml0ZW1yZXByCi0JCQlzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCi0JCQlmb3IgaSBpbiByYW5nZShsZW4oaXRlbXMpKToKLQkJCQlzZXRfY2VsbChzZWxmX2l0ZW1yZXByKGl0ZW1zW2ldKSwgKDAsIGkgKyBhKSkKLQkJCXNlbGYuaXRlbXNbYTpiXSA9IGl0ZW1zCi0JCQlzZWxmLnNldGRyYXdpbmdtb2RlKDEpCi0JCWVsc2U6Ci0JCQlzZWxmLml0ZW1zW2E6Yl0gPSBpdGVtcwotCQotCWRlZiBfX2xlbl9fKHNlbGYpOgotCQlyZXR1cm4gbGVuKHNlbGYuaXRlbXMpCi0JCi0JZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKLQkJaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgotCQkJaW5kZXggPSBsZW4oc2VsZi5pdGVtcykKLQkJCXNlbGYuX2xpc3QuTEFkZFJvdygxLCBpbmRleCkKLQkJCXNlbGYuX2xpc3QuTFNldENlbGwoc2VsZi5pdGVtcmVwcihpdGVtKSwgKDAsIGluZGV4KSkKLQkJc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSkKLQkKLQlkZWYgcmVtb3ZlKHNlbGYsIGl0ZW0pOgotCQlpbmRleCA9IHNlbGYuaXRlbXMuaW5kZXgoaXRlbSkKLQkJc2VsZi5fX2RlbGl0ZW1fXyhpbmRleCkKLQkKLQlkZWYgaW5kZXgoc2VsZiwgaXRlbSk6Ci0JCXJldHVybiBzZWxmLml0ZW1zLmluZGV4KGl0ZW0pCi0JCi0JZGVmIGluc2VydChzZWxmLCBpbmRleCwgaXRlbSk6Ci0JCWlmIGluZGV4IDwgMDoKLQkJCWluZGV4ID0gMAotCQlpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6Ci0JCQlzZWxmLl9saXN0LkxBZGRSb3coMSwgaW5kZXgpCi0JCQlzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCi0JCXNlbGYuaXRlbXMuaW5zZXJ0KGluZGV4LCBpdGVtKQotCQotCWRlZiBzZXRkcmF3aW5nbW9kZShzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi5kcmF3aW5nbW9kZSA9IHNlbGYuZHJhd2luZ21vZGUgLSAxCi0JCQlpZiBzZWxmLmRyYXdpbmdtb2RlID09IDAgYW5kIHNlbGYuX2xpc3QgaXMgbm90IE5vbmU6Ci0JCQkJc2VsZi5fbGlzdC5MU2V0RHJhd2luZ01vZGUoMSkKLQkJCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJCQlib3VuZHMgPSBsLCB0LCByLCBiID0gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSkKLQkJCQkJY2wsIGN0LCBjciwgY2IgPSBzZWxmLl9saXN0LkxSZWN0KCgwLCBsZW4oc2VsZi5pdGVtcyktMSkpCi0JCQkJCWlmIGNiIDwgYjoKLQkJCQkJCXNlbGYuU2V0UG9ydCgpCi0JCQkJCQlRZC5FcmFzZVJlY3QoKGwsIGNiLCBjciwgYikpCi0JCQkJCXNlbGYuX2xpc3QuTFVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCQkJCXNlbGYuR2V0V2luZG93KCkuVmFsaWRXaW5kb3dSZWN0KGJvdW5kcykKLQkJZWxzZToKLQkJCWlmIHNlbGYuZHJhd2luZ21vZGUgPT0gMCBhbmQgc2VsZi5fbGlzdCBpcyBub3QgTm9uZToKLQkJCQlzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQkJc2VsZi5kcmF3aW5nbW9kZSA9IHNlbGYuZHJhd2luZ21vZGUgKyAxCisgICAgIiIiU3RhbmRhcmQgbGlzdCB3aWRnZXQuIiIiCisKKyAgICBMREVGX0lEID0gMAorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGl0ZW1zID0gTm9uZSwgY2FsbGJhY2sgPSBOb25lLCBmbGFncyA9IDAsIGNvbHMgPSAxLCB0eXBpbmdjYXNlc2Vucz0wKToKKyAgICAgICAgaWYgaXRlbXMgaXMgTm9uZToKKyAgICAgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgc2VsZi5pdGVtcyA9IGl0ZW1zCisgICAgICAgIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWQgPSAwCisgICAgICAgIHNlbGYuX2VuYWJsZWQgPSAxCisgICAgICAgIHNlbGYuX2xpc3QgPSBOb25lCisgICAgICAgIHNlbGYuX2NvbHMgPSBjb2xzCisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5fZmxhZ3MgPSBmbGFncworICAgICAgICBzZWxmLnR5cGluZ2Nhc2VzZW5zID0gdHlwaW5nY2FzZXNlbnMKKyAgICAgICAgc2VsZi5sYXN0dHlwaW5nID0gIiIKKyAgICAgICAgc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQorICAgICAgICBzZWxmLnRpbWVsaW1pdCA9IDMwCisgICAgICAgIHNlbGYuc2V0aXRlbXMoaXRlbXMpCisgICAgICAgIHNlbGYuZHJhd2luZ21vZGUgPSAwCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICBzZWxmLmNyZWF0ZWxpc3QoKQorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDEpCisKKyAgICBkZWYgY3JlYXRlbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHJlY3QgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmVjdCA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE2LCByZWN0WzNdLTEKKyAgICAgICAgc2VsZi5fdmlld2JvdW5kcyA9IHJlY3QKKyAgICAgICAgc2VsZi5fbGlzdCA9IExOZXcocmVjdCwgKDAsIDAsIHNlbGYuX2NvbHMsIDApLCAoMCwgMCksIHNlbGYuTERFRl9JRCwgc2VsZi5fcGFyZW50d2luZG93LndpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMCwgMSkKKyAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZToKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIHNlbGYuX2xpc3Quc2VsRmxhZ3MgPSBzZWxmLl9mbGFncworICAgICAgICBzZWxmLnNldGl0ZW1zKHNlbGYuaXRlbXMpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbGYuX3NlbCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9zZWwKKworICAgIGRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgIyBBcHBlYXJhbmNlIGZyYW1lcyBhcmUgZHJhd24gb3V0c2lkZSB0aGUgc3BlY2lmaWVkIGJvdW5kcywKKyAgICAgICAgIyBzbyB3ZSBhbHdheXMgbmVlZCB0byBvdXRzZXQgdGhlIGludmFsaWRhdGVkIGFyZWEuCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCisKKyAgICAgICAgaWYgb2xkYm91bmRzWzoyXSA9PSBzZWxmLl9ib3VuZHNbOjJdOgorICAgICAgICAgICAgIyBzZXQgdmlzUmduIHRvIGVtcHR5LCB0byBwcmV2ZW50IG5hc3R5IGRyYXdpbmcgc2lkZSBlZmZlY3Qgb2YgTFNpemUoKQorICAgICAgICAgICAgUWQuUmVjdFJnbihzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24sICgwLCAwLCAwLCAwKSkKKyAgICAgICAgICAgICMgbGlzdCBzdGlsbCBoYXMgdGhlIHNhbWUgdXBwZXIvbGVmdCBjb29yZGluYXRlcywgdXNlIExTaXplCisgICAgICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgICAgICB3aWR0aCA9IHIgLSBsIC0gMTcKKyAgICAgICAgICAgIGhlaWdodCA9IGIgLSB0IC0gMgorICAgICAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLl92aWV3Ym91bmRzCisgICAgICAgICAgICBzZWxmLl92aWV3Ym91bmRzID0gdmwsIHZ0LCB2bCArIHdpZHRoLCB2dCArIGhlaWdodAorICAgICAgICAgICAgc2VsZi5fbGlzdC5MU2l6ZSh3aWR0aCwgaGVpZ2h0KQorICAgICAgICAgICAgIyBub3cgKndoeSogZG9lc24ndCB0aGUgbGlzdCBtYW5hZ2VyIHJlY2FsYyB0aGUgY2VsbHJlY3Q/Pz8KKyAgICAgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9saXN0LkxSZWN0KCgwLDApKQorICAgICAgICAgICAgY2VsbGhlaWdodCA9IGIgLSB0CisgICAgICAgICAgICBzZWxmLl9saXN0LkxDZWxsU2l6ZSgod2lkdGgvc2VsZi5fY29scywgY2VsbGhlaWdodCkpCisgICAgICAgICAgICAjIHJlc2V0IHZpc1JnbgorICAgICAgICAgICAgc2VsZi5fcGFyZW50d2luZG93LndpZC5DYWxjVmlzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgb2ggd2VsbCwgc2luY2UgdGhlIGxpc3QgbWFuYWdlciBkb2Vzbid0IGhhdmUgYSBMTW92ZSBjYWxsLAorICAgICAgICAgICAgIyB3ZSBoYXZlIHRvIG1ha2UgdGhlIGxpc3QgYWxsIG92ZXIgYWdhaW4uLi4KKyAgICAgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgICAgIHRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICAgICAgc2VsZi5fbGlzdCA9IE5vbmUKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIHNlbGYuY3JlYXRlbGlzdCgpCisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihzZWwpCisgICAgICAgICAgICBzZWxmLnNldHRvcGNlbGwodG9wY2VsbCkKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5fbGlzdCA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBOb25lCisgICAgICAgIHNlbGYuaXRlbXMgPSBbXQorICAgICAgICBXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisKKyAgICBkZWYgc2V0KHNlbGYsIGl0ZW1zKToKKyAgICAgICAgc2VsZi5zZXRpdGVtcyhpdGVtcykKKworICAgIGRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6CisgICAgICAgIHNlbGYuaXRlbXMgPSBpdGVtcworICAgICAgICB0aGVfbGlzdCA9IHNlbGYuX2xpc3QKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNldGRyYXdpbmdtb2RlKDApCisgICAgICAgIHRvcGNlbGwgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICB0aGVfbGlzdC5MRGVsUm93KDAsIDEpCisgICAgICAgIHRoZV9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQorICAgICAgICBzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgorICAgICAgICBzZXRfY2VsbCA9IHRoZV9saXN0LkxTZXRDZWxsCisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgc2V0X2NlbGwoc2VsZl9pdGVtcmVwcihpdGVtc1tpXSksICgwLCBpKSkKKyAgICAgICAgc2VsZi5zZXR0b3BjZWxsKHRvcGNlbGwpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaXNkb3VibGVjbGljayA9IHNlbGYuX2xpc3QuTENsaWNrKHBvaW50LCBtb2RpZmllcnMpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBpc2RvdWJsZWNsaWNrKQorICAgICAgICByZXR1cm4gMQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgbmV3c2VsZWN0aW9uID0gW10KKyAgICAgICAgaWYgY2hhciA9PSBXa2V5cy51cGFycm93a2V5OgorICAgICAgICAgICAgaWYgbGVuKHNlbCkgPj0gMSBhbmQgbWluKHNlbCkgPiAwOgorICAgICAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFttaW4oc2VsKSAtIDFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFswXQorICAgICAgICBlbGlmIGNoYXIgPT0gV2tleXMuZG93bmFycm93a2V5OgorICAgICAgICAgICAgaWYgbGVuKHNlbCkgPj0gMSBhbmQgbWF4KHNlbCkgPCAobGVuKHNlbGYuaXRlbXMpIC0gMSk6CisgICAgICAgICAgICAgICAgbmV3c2VsZWN0aW9uID0gW21heChzZWwpICsgMV0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgbmV3c2VsZWN0aW9uID0gW2xlbihzZWxmLml0ZW1zKSAtIDFdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBtb2RpZmllcnMgPSAwCisgICAgICAgICAgICBpZiAoc2VsZi5sYXN0dGltZSArIHNlbGYudGltZWxpbWl0KSA8IEV2dC5UaWNrQ291bnQoKToKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0eXBpbmcgPSAiIgorICAgICAgICAgICAgaWYgc2VsZi50eXBpbmdjYXNlc2VuczoKKyAgICAgICAgICAgICAgICBzZWxmLmxhc3R0eXBpbmcgPSBzZWxmLmxhc3R0eXBpbmcgKyBjaGFyCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHNlbGYubGFzdHR5cGluZyA9IHNlbGYubGFzdHR5cGluZyArIHN0cmluZy5sb3dlcihjaGFyKQorICAgICAgICAgICAgc2VsZi5sYXN0dGltZSA9IEV2dC5UaWNrQ291bnQoKQorICAgICAgICAgICAgaSA9IHNlbGYuZmluZG1hdGNoKHNlbGYubGFzdHR5cGluZykKKyAgICAgICAgICAgIG5ld3NlbGVjdGlvbiA9IFtpXQorICAgICAgICBpZiBtb2RpZmllcnMgJiBFdmVudHMuc2hpZnRLZXkgYW5kIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6CisgICAgICAgICAgICBuZXdzZWxlY3Rpb24gPSBuZXdzZWxlY3Rpb24gKyBzZWwKKyAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24obmV3c2VsZWN0aW9uKQorICAgICAgICBzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKKyAgICAgICAgc2VsZi5jbGljaygoLTEsIC0xKSwgMCkKKworICAgIGRlZiBmaW5kbWF0Y2goc2VsZiwgdGFnKToKKyAgICAgICAgbG93ZXIgPSBzdHJpbmcubG93ZXIKKyAgICAgICAgaXRlbXMgPSBzZWxmLml0ZW1zCisgICAgICAgIHR5cGluZ2Nhc2VzZW5zID0gc2VsZi50eXBpbmdjYXNlc2VucworICAgICAgICB0YWdsZW4gPSBsZW4odGFnKQorICAgICAgICBtYXRjaCA9ICdcMzc3JyAqIDEwMAorICAgICAgICBtYXRjaF9pID0gLTEKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICBpdGVtID0gc3RyKGl0ZW1zW2ldKQorICAgICAgICAgICAgaWYgbm90IHR5cGluZ2Nhc2VzZW5zOgorICAgICAgICAgICAgICAgIGl0ZW0gPSBsb3dlcihpdGVtKQorICAgICAgICAgICAgaWYgdGFnIDw9IGl0ZW0gPCBtYXRjaDoKKyAgICAgICAgICAgICAgICBtYXRjaCA9IGl0ZW0KKyAgICAgICAgICAgICAgICBtYXRjaF9pID0gaQorICAgICAgICBpZiBtYXRjaF9pID49IDA6CisgICAgICAgICAgICByZXR1cm4gbWF0Y2hfaQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIGxlbihpdGVtcykgLSAxCisKKyAgICBkZWYgZG9tZW51X2NvcHkoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCisgICAgICAgIHNlbGl0ZW1zID0gW10KKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgc2VsaXRlbXMuYXBwZW5kKHN0cihzZWxmLml0ZW1zW2ldKSkKKyAgICAgICAgdGV4dCA9IHN0cmluZy5qb2luKHNlbGl0ZW1zLCAnXHInKQorICAgICAgICBpZiB0ZXh0OgorICAgICAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6CisgICAgICAgICAgICAgICAgU2NyYXAuWmVyb1NjcmFwKCkKKyAgICAgICAgICAgICAgICBTY3JhcC5QdXRTY3JhcCgnVEVYVCcsIHRleHQpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgICAgICBzYyA9IFNjcmFwLkdldEN1cnJlbnRTY3JhcCgpCisgICAgICAgICAgICAgICAgc2MuUHV0U2NyYXBGbGF2b3IoJ1RFWFQnLCAwLCB0ZXh0KQorCisgICAgZGVmIGNhbl9jb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLmdldHNlbGVjdGlvbigpKSA8PiAwCisKKyAgICBkZWYgZG9tZW51X3NlbGVjdGFsbChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuc2VsZWN0YWxsKCkKKworICAgIGRlZiBjYW5fc2VsZWN0YWxsKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmUKKworICAgIGRlZiBzZWxlY3RhbGwoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9saXN0LnNlbEZsYWdzICYgTGlzdHMubE9ubHlPbmU6CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihyYW5nZShsZW4oc2VsZi5pdGVtcykpKQorICAgICAgICAgICAgc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCisgICAgICAgICAgICBzZWxmLmNsaWNrKCgtMSwgLTEpLCAwKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgICAgICByZXR1cm4gc2VsZi5fc2VsCisgICAgICAgICAgICByZXR1cm4gW10KKyAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBwb2ludCA9ICgwLDApCisgICAgICAgIHdoaWxlIDE6CisgICAgICAgICAgICBvaywgcG9pbnQgPSBzZWxmLl9saXN0LkxHZXRTZWxlY3QoMSwgcG9pbnQpCisgICAgICAgICAgICBpZiBub3Qgb2s6CisgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGl0ZW1zLmFwcGVuZChwb2ludFsxXSkKKyAgICAgICAgICAgIHBvaW50ID0gcG9pbnRbMF0sIHBvaW50WzFdKzEKKyAgICAgICAgcmV0dXJuIGl0ZW1zCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbGVjdGlvbik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9zZWwgPSBzZWxlY3Rpb24KKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZXRfc2VsID0gc2VsZi5fbGlzdC5MU2V0U2VsZWN0CisgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmLml0ZW1zKSk6CisgICAgICAgICAgICBpZiBpIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICBzZXRfc2VsKDEsICgwLCBpKSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2V0X3NlbCgwLCAoMCwgaSkpCisgICAgICAgIHNlbGYuX2xpc3QuTEF1dG9TY3JvbGwoKQorCisgICAgZGVmIGdldHNlbGVjdGVkb2JqZWN0cyhzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi5nZXRzZWxlY3Rpb24oKQorICAgICAgICBvYmplY3RzID0gW10KKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgb2JqZWN0cy5hcHBlbmQoc2VsZi5pdGVtc1tpXSkKKyAgICAgICAgcmV0dXJuIG9iamVjdHMKKworICAgIGRlZiBzZXRzZWxlY3RlZG9iamVjdHMoc2VsZiwgb2JqZWN0cyk6CisgICAgICAgIHNlbCA9IFtdCisgICAgICAgIGZvciBvIGluIG9iamVjdHM6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgc2VsLmFwcGVuZChzZWxmLml0ZW1zLmluZGV4KG8pKQorICAgICAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgICAgIHBhc3MKKyAgICAgICAgc2VsZi5zZXRzZWxlY3Rpb24oc2VsKQorCisgICAgZGVmIGdldHRvcGNlbGwoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgdCA9IHQgKyAxCisgICAgICAgIGNsLCBjdCwgY3IsIGNiID0gc2VsZi5fbGlzdC5MUmVjdCgoMCwgMCkpCisgICAgICAgIGNlbGxoZWlnaHQgPSBjYiAtIGN0CisgICAgICAgIHJldHVybiAodCAtIGN0KSAvIGNlbGxoZWlnaHQKKworICAgIGRlZiBzZXR0b3BjZWxsKHNlbGYsIHRvcGNlbGwpOgorICAgICAgICB0b3AgPSBzZWxmLmdldHRvcGNlbGwoKQorICAgICAgICBkaWZmID0gdG9wY2VsbCAtIHRvcAorICAgICAgICBzZWxmLl9saXN0LkxTY3JvbGwoMCwgZGlmZikKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFVwZGF0ZSh2aXNSZ24pCisgICAgICAgICAgICBzdGF0ZSA9IFtrVGhlbWVTdGF0ZUFjdGl2ZSwga1RoZW1lU3RhdGVJbmFjdGl2ZV1bbm90IHNlbGYuX2FjdGl2YXRlZF0KKyAgICAgICAgICAgIEFwcC5EcmF3VGhlbWVMaXN0Qm94RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQorICAgICAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX2FjdGl2YXRlZDoKKyAgICAgICAgICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZSgxKQorCisgICAgZGVmIHNlbGVjdChzZWxmLCBvbm9mZiwgaXNjbGljayA9IDApOgorICAgICAgICBpZiBXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LnNlbGVjdChzZWxmLCBvbm9mZik6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUob25vZmYpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5fbGlzdC5MQWN0aXZhdGUob25vZmYpCisgICAgICAgICAgICAjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBvbm9mZl0KKyAgICAgICAgICAgICNBcHAuRHJhd1RoZW1lTGlzdEJveEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkOgorICAgICAgICAgICAgICAgIHNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXMKKworICAgIGRlZiBpdGVtcmVwcihzZWxmLCBpdGVtKToKKyAgICAgICAgcmV0dXJuIHN0cihpdGVtKVs6MjU1XQorCisgICAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgcmV0dXJuIHNlbGYuaXRlbXNbaW5kZXhdCisKKyAgICBkZWYgX19zZXRpdGVtX18oc2VsZiwgaW5kZXgsIGl0ZW0pOgorICAgICAgICBpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCisgICAgICAgIHNlbGYuaXRlbXNbaW5kZXhdID0gaXRlbQorCisgICAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGluZGV4KToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgorICAgICAgICAgICAgc2VsZi5fbGlzdC5MRGVsUm93KDEsIGluZGV4KQorICAgICAgICBkZWwgc2VsZi5pdGVtc1tpbmRleF0KKworICAgIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgYSwgYik6CisgICAgICAgIHJldHVybiBzZWxmLml0ZW1zW2E6Yl0KKworICAgIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgYSwgYik6CisgICAgICAgIGlmIGItYToKKyAgICAgICAgICAgIGlmIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgICAgICBzZWxmLl9saXN0LkxEZWxSb3coYi1hLCBhKQorICAgICAgICAgICAgZGVsIHNlbGYuaXRlbXNbYTpiXQorCisgICAgZGVmIF9fc2V0c2xpY2VfXyhzZWxmLCBhLCBiLCBpdGVtcyk6CisgICAgICAgIGlmIHNlbGYuX3BhcmVudCBhbmQgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIGwgPSBsZW4oaXRlbXMpCisgICAgICAgICAgICB0aGVfbGlzdCA9IHNlbGYuX2xpc3QKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMCkKKyAgICAgICAgICAgIGlmIGItYToKKyAgICAgICAgICAgICAgICBpZiBiID4gbGVuKHNlbGYuaXRlbXMpOgorICAgICAgICAgICAgICAgICMgZml4IGZvciBuZXcgMS41ICJmZWF0dXJlIiB3aGVyZSBiIGlzIHN5cy5tYXhpbnQgaW5zdGVhZCBvZiBsZW4oc2VsZikuLi4KKyAgICAgICAgICAgICAgICAjIExEZWxSb3cgZG9lc24ndCBsaWtlIG1heGludC4KKyAgICAgICAgICAgICAgICAgICAgYiA9IGxlbihzZWxmLml0ZW1zKQorICAgICAgICAgICAgICAgIHRoZV9saXN0LkxEZWxSb3coYi1hLCBhKQorICAgICAgICAgICAgdGhlX2xpc3QuTEFkZFJvdyhsLCBhKQorICAgICAgICAgICAgc2VsZl9pdGVtcmVwciA9IHNlbGYuaXRlbXJlcHIKKyAgICAgICAgICAgIHNldF9jZWxsID0gdGhlX2xpc3QuTFNldENlbGwKKyAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKGxlbihpdGVtcykpOgorICAgICAgICAgICAgICAgIHNldF9jZWxsKHNlbGZfaXRlbXJlcHIoaXRlbXNbaV0pLCAoMCwgaSArIGEpKQorICAgICAgICAgICAgc2VsZi5pdGVtc1thOmJdID0gaXRlbXMKKyAgICAgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaXRlbXNbYTpiXSA9IGl0ZW1zCisKKyAgICBkZWYgX19sZW5fXyhzZWxmKToKKyAgICAgICAgcmV0dXJuIGxlbihzZWxmLml0ZW1zKQorCisgICAgZGVmIGFwcGVuZChzZWxmLCBpdGVtKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50IGFuZCBzZWxmLl9saXN0OgorICAgICAgICAgICAgaW5kZXggPSBsZW4oc2VsZi5pdGVtcykKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTEFkZFJvdygxLCBpbmRleCkKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldENlbGwoc2VsZi5pdGVtcmVwcihpdGVtKSwgKDAsIGluZGV4KSkKKyAgICAgICAgc2VsZi5pdGVtcy5hcHBlbmQoaXRlbSkKKworICAgIGRlZiByZW1vdmUoc2VsZiwgaXRlbSk6CisgICAgICAgIGluZGV4ID0gc2VsZi5pdGVtcy5pbmRleChpdGVtKQorICAgICAgICBzZWxmLl9fZGVsaXRlbV9fKGluZGV4KQorCisgICAgZGVmIGluZGV4KHNlbGYsIGl0ZW0pOgorICAgICAgICByZXR1cm4gc2VsZi5pdGVtcy5pbmRleChpdGVtKQorCisgICAgZGVmIGluc2VydChzZWxmLCBpbmRleCwgaXRlbSk6CisgICAgICAgIGlmIGluZGV4IDwgMDoKKyAgICAgICAgICAgIGluZGV4ID0gMAorICAgICAgICBpZiBzZWxmLl9wYXJlbnQgYW5kIHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBzZWxmLl9saXN0LkxBZGRSb3coMSwgaW5kZXgpCisgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXRDZWxsKHNlbGYuaXRlbXJlcHIoaXRlbSksICgwLCBpbmRleCkpCisgICAgICAgIHNlbGYuaXRlbXMuaW5zZXJ0KGluZGV4LCBpdGVtKQorCisgICAgZGVmIHNldGRyYXdpbmdtb2RlKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLmRyYXdpbmdtb2RlID0gc2VsZi5kcmF3aW5nbW9kZSAtIDEKKyAgICAgICAgICAgIGlmIHNlbGYuZHJhd2luZ21vZGUgPT0gMCBhbmQgc2VsZi5fbGlzdCBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICBzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgxKQorICAgICAgICAgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICAgICAgICAgIGJvdW5kcyA9IGwsIHQsIHIsIGIgPSBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKQorICAgICAgICAgICAgICAgICAgICBjbCwgY3QsIGNyLCBjYiA9IHNlbGYuX2xpc3QuTFJlY3QoKDAsIGxlbihzZWxmLml0ZW1zKS0xKSkKKyAgICAgICAgICAgICAgICAgICAgaWYgY2IgPCBiOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgICAgICAgICAgICAgIFFkLkVyYXNlUmVjdCgobCwgY2IsIGNyLCBiKSkKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5fbGlzdC5MVXBkYXRlKHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5WYWxpZFdpbmRvd1JlY3QoYm91bmRzKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZSA9PSAwIGFuZCBzZWxmLl9saXN0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgICAgICBzZWxmLmRyYXdpbmdtb2RlID0gc2VsZi5kcmF3aW5nbW9kZSArIDEKIAogCiBjbGFzcyBDdXN0b21MaXN0KExpc3QpOgotCQotCSIiIkJhc2UgY2xhc3MgZm9yIHdyaXRpbmcgY3VzdG9tIGxpc3QgZGVmaW5pdGlvbnMuIiIiCi0JCi0JX2NlbGxIZWlnaHQgPSAwCi0JCi0JZGVmIGNyZWF0ZWxpc3Qoc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLlNldFBvcnQoKQotCQlyZWN0ID0gc2VsZi5fYm91bmRzCi0JCXJlY3QgPSByZWN0WzBdKzEsIHJlY3RbMV0rMSwgcmVjdFsyXS0xNiwgcmVjdFszXS0xCi0JCXNlbGYuX3ZpZXdib3VuZHMgPSByZWN0Ci0JCXNlbGYuX2xpc3QgPSBDcmVhdGVDdXN0b21MaXN0KAotCQkJCXJlY3QsCi0JCQkJKDAsIDAsIDEsIDApLAotCQkJCSgwLCBzZWxmLl9jZWxsSGVpZ2h0KSwKLQkJCQkoa0xpc3REZWZVc2VyUHJvY1R5cGUsIHNlbGYubGlzdERlZmluaXRpb25GdW5jKSwKLQkJCQlzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAotCQkJCTAsIDEsIDAsIDEpCi0JCWlmIHNlbGYuZHJhd2luZ21vZGU6Ci0JCQlzZWxmLl9saXN0LkxTZXREcmF3aW5nTW9kZSgwKQotCQlzZWxmLl9saXN0LnNlbEZsYWdzID0gc2VsZi5fZmxhZ3MKLQkJc2VsZi5zZXRpdGVtcyhzZWxmLml0ZW1zKQotCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQlzZWxmLnNldHNlbGVjdGlvbihzZWxmLl9zZWwpCi0JCQlkZWwgc2VsZi5fc2VsCi0JCi0JZGVmIGxpc3REZWZpbml0aW9uRnVuYyhzZWxmLCBtZXNzYWdlLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJIiIiVGhlIExERUYgbWVzc2FnZSBkaXNwYXRjaGVyIHJvdXRpbmUsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCi0JCWlmIG1lc3NhZ2UgPT0gbEluaXRNc2c6Ci0JCQlzZWxmLmxpc3REZWZJbml0KHRoZUxpc3QpCi0JCWVsaWYgbWVzc2FnZSA9PSBsRHJhd01zZzoKLQkJCXNlbGYubGlzdERlZkRyYXcoc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAotCQkJCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQotCQllbGlmIG1lc3NhZ2UgPT0gbEhpbGl0ZU1zZzoKLQkJCXNlbGYubGlzdERlZkhpZ2hsaWdodChzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCi0JCWVsaWYgbWVzc2FnZSA9PSBsQ2xvc2VNc2c6Ci0JCQlzZWxmLmxpc3REZWZDbG9zZSh0aGVMaXN0KQotCQotCWRlZiBsaXN0RGVmSW5pdChzZWxmLCB0aGVMaXN0KToKLQkJcGFzcwotCWRlZiBsaXN0RGVmQ2xvc2Uoc2VsZiwgdGhlTGlzdCk6Ci0JCXBhc3MKLQlkZWYgbGlzdERlZkRyYXcoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLCAKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlwYXNzCi0JZGVmIGxpc3REZWZIaWdobGlnaHQoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLCAKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlwYXNzCisKKyAgICAiIiJCYXNlIGNsYXNzIGZvciB3cml0aW5nIGN1c3RvbSBsaXN0IGRlZmluaXRpb25zLiIiIgorCisgICAgX2NlbGxIZWlnaHQgPSAwCisKKyAgICBkZWYgY3JlYXRlbGlzdChzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHJlY3QgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmVjdCA9IHJlY3RbMF0rMSwgcmVjdFsxXSsxLCByZWN0WzJdLTE2LCByZWN0WzNdLTEKKyAgICAgICAgc2VsZi5fdmlld2JvdW5kcyA9IHJlY3QKKyAgICAgICAgc2VsZi5fbGlzdCA9IENyZWF0ZUN1c3RvbUxpc3QoCisgICAgICAgICAgICAgICAgICAgICAgICByZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDAsIDEsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIHNlbGYuX2NlbGxIZWlnaHQpLAorICAgICAgICAgICAgICAgICAgICAgICAgKGtMaXN0RGVmVXNlclByb2NUeXBlLCBzZWxmLmxpc3REZWZpbml0aW9uRnVuYyksCisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgMCwgMSkKKyAgICAgICAgaWYgc2VsZi5kcmF3aW5nbW9kZToKKyAgICAgICAgICAgIHNlbGYuX2xpc3QuTFNldERyYXdpbmdNb2RlKDApCisgICAgICAgIHNlbGYuX2xpc3Quc2VsRmxhZ3MgPSBzZWxmLl9mbGFncworICAgICAgICBzZWxmLnNldGl0ZW1zKHNlbGYuaXRlbXMpCisgICAgICAgIGlmIGhhc2F0dHIoc2VsZiwgIl9zZWwiKToKKyAgICAgICAgICAgIHNlbGYuc2V0c2VsZWN0aW9uKHNlbGYuX3NlbCkKKyAgICAgICAgICAgIGRlbCBzZWxmLl9zZWwKKworICAgIGRlZiBsaXN0RGVmaW5pdGlvbkZ1bmMoc2VsZiwgbWVzc2FnZSwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKKyAgICAgICAgIiIiVGhlIExERUYgbWVzc2FnZSBkaXNwYXRjaGVyIHJvdXRpbmUsIG5vIG5lZWQgdG8gb3ZlcnJpZGUuIiIiCisgICAgICAgIGlmIG1lc3NhZ2UgPT0gbEluaXRNc2c6CisgICAgICAgICAgICBzZWxmLmxpc3REZWZJbml0KHRoZUxpc3QpCisgICAgICAgIGVsaWYgbWVzc2FnZSA9PSBsRHJhd01zZzoKKyAgICAgICAgICAgIHNlbGYubGlzdERlZkRyYXcoc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpCisgICAgICAgIGVsaWYgbWVzc2FnZSA9PSBsSGlsaXRlTXNnOgorICAgICAgICAgICAgc2VsZi5saXN0RGVmSGlnaGxpZ2h0KHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KQorICAgICAgICBlbGlmIG1lc3NhZ2UgPT0gbENsb3NlTXNnOgorICAgICAgICAgICAgc2VsZi5saXN0RGVmQ2xvc2UodGhlTGlzdCkKKworICAgIGRlZiBsaXN0RGVmSW5pdChzZWxmLCB0aGVMaXN0KToKKyAgICAgICAgcGFzcworICAgIGRlZiBsaXN0RGVmQ2xvc2Uoc2VsZiwgdGhlTGlzdCk6CisgICAgICAgIHBhc3MKKyAgICBkZWYgbGlzdERlZkRyYXcoc2VsZiwgc2VsZWN0ZWQsIGNlbGxSZWN0LCB0aGVDZWxsLAorICAgICAgICAgICAgICAgICAgICBkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKKyAgICAgICAgcGFzcworICAgIGRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBUd29MaW5lTGlzdChDdXN0b21MaXN0KToKLQkKLQlfY2VsbEhlaWdodCA9IDI4Ci0JCi0JZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKLQkJCWRhdGFPZmZzZXQsIGRhdGFMZW4sIHRoZUxpc3QpOgotCQlzYXZlZFBvcnQgPSBRZC5HZXRQb3J0KCkKLQkJUWQuU2V0UG9ydCh0aGVMaXN0LkdldExpc3RQb3J0KCkpCi0JCXNhdmVkQ2xpcCA9IFFkLk5ld1JnbigpCi0JCVFkLkdldENsaXAoc2F2ZWRDbGlwKQotCQlRZC5DbGlwUmVjdChjZWxsUmVjdCkKLQkJc2F2ZWRQZW5TdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKLQkJUWQuUGVuTm9ybWFsKCkKLQkJUWQuRXJhc2VSZWN0KGNlbGxSZWN0KQotCQkKLQkJI2RyYXcgdGhlIGNlbGwgaWYgaXQgY29udGFpbnMgZGF0YQotCQlhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQotCQlsaW5lZmVlZCA9IGFzY2VudCArIGRlc2NlbnQgKyBsZWFkaW5nCi0JCQotCQlpZiBkYXRhTGVuOgotCQkJbGVmdCwgdG9wLCByaWdodCwgYm90dG9tID0gY2VsbFJlY3QKLQkJCWRhdGEgPSB0aGVMaXN0LkxHZXRDZWxsKGRhdGFMZW4sIHRoZUNlbGwpCi0JCQlsaW5lcyA9IGRhdGEuc3BsaXQoIlxyIikKLQkJCWxpbmUxID0gbGluZXNbMF0KLQkJCWlmIGxlbihsaW5lcykgPiAxOgotCQkJCWxpbmUyID0gbGluZXNbMV0KLQkJCWVsc2U6Ci0JCQkJbGluZTIgPSAiIgotCQkJUWQuTW92ZVRvKGludChsZWZ0ICsgNCksIGludCh0b3AgKyBhc2NlbnQpKQotCQkJUWQuRHJhd1RleHQobGluZTEsIDAsIGxlbihsaW5lMSkpCi0JCQlpZiBsaW5lMjoKLQkJCQlRZC5Nb3ZlVG8oaW50KGxlZnQgKyA0KSwgaW50KHRvcCArIGFzY2VudCArIGxpbmVmZWVkKSkKLQkJCQlRZC5EcmF3VGV4dChsaW5lMiwgMCwgbGVuKGxpbmUyKSkKLQkJCVFkLlBlblBhdCgiXHgxMVx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTEiKQotCQkJYm90dG9tID0gdG9wICsgdGhlTGlzdC5jZWxsU2l6ZVsxXQotCQkJUWQuTW92ZVRvKGxlZnQsIGJvdHRvbSAtIDEpCi0JCQlRZC5MaW5lVG8ocmlnaHQsIGJvdHRvbSAtIDEpCi0JCWlmIHNlbGVjdGVkOgotCQkJc2VsZi5saXN0RGVmSGlnaGxpZ2h0KHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKLQkJCQkJZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKLQkJI3Jlc3RvcmUgZ3JhcGhpY3MgZW52aXJvbm1lbnQKLQkJUWQuU2V0UG9ydChzYXZlZFBvcnQpCi0JCVFkLlNldENsaXAoc2F2ZWRDbGlwKQotCQlRZC5EaXNwb3NlUmduKHNhdmVkQ2xpcCkKLQkJUWQuU2V0UGVuU3RhdGUoc2F2ZWRQZW5TdGF0ZSkKLQkKLQlkZWYgbGlzdERlZkhpZ2hsaWdodChzZWxmLCBzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCi0JCQlkYXRhT2Zmc2V0LCBkYXRhTGVuLCB0aGVMaXN0KToKLQkJc2F2ZWRQb3J0ID0gUWQuR2V0UG9ydCgpCi0JCVFkLlNldFBvcnQodGhlTGlzdC5HZXRMaXN0UG9ydCgpKQotCQlzYXZlZENsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5HZXRDbGlwKHNhdmVkQ2xpcCkKLQkJUWQuQ2xpcFJlY3QoY2VsbFJlY3QpCi0JCXNhdmVkUGVuU3RhdGUgPSBRZC5HZXRQZW5TdGF0ZSgpCi0JCVFkLlBlbk5vcm1hbCgpCi0JCVFkLlBlbk1vZGUoaGlsaXRldHJhbnNmZXJtb2RlKQotCQlRZC5QYWludFJlY3QoY2VsbFJlY3QpCi0JCQotCQkjcmVzdG9yZSBncmFwaGljcyBlbnZpcm9ubWVudAotCQlRZC5TZXRQb3J0KHNhdmVkUG9ydCkKLQkJUWQuU2V0Q2xpcChzYXZlZENsaXApCi0JCVFkLkRpc3Bvc2VSZ24oc2F2ZWRDbGlwKQotCQlRZC5TZXRQZW5TdGF0ZShzYXZlZFBlblN0YXRlKQotCQorCisgICAgX2NlbGxIZWlnaHQgPSAyOAorCisgICAgZGVmIGxpc3REZWZEcmF3KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKKyAgICAgICAgc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuR2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkNsaXBSZWN0KGNlbGxSZWN0KQorICAgICAgICBzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBRZC5FcmFzZVJlY3QoY2VsbFJlY3QpCisKKyAgICAgICAgI2RyYXcgdGhlIGNlbGwgaWYgaXQgY29udGFpbnMgZGF0YQorICAgICAgICBhc2NlbnQsIGRlc2NlbnQsIGxlYWRpbmcsIHNpemUsIGhtID0gRm0uRm9udE1ldHJpY3MoKQorICAgICAgICBsaW5lZmVlZCA9IGFzY2VudCArIGRlc2NlbnQgKyBsZWFkaW5nCisKKyAgICAgICAgaWYgZGF0YUxlbjoKKyAgICAgICAgICAgIGxlZnQsIHRvcCwgcmlnaHQsIGJvdHRvbSA9IGNlbGxSZWN0CisgICAgICAgICAgICBkYXRhID0gdGhlTGlzdC5MR2V0Q2VsbChkYXRhTGVuLCB0aGVDZWxsKQorICAgICAgICAgICAgbGluZXMgPSBkYXRhLnNwbGl0KCJcciIpCisgICAgICAgICAgICBsaW5lMSA9IGxpbmVzWzBdCisgICAgICAgICAgICBpZiBsZW4obGluZXMpID4gMToKKyAgICAgICAgICAgICAgICBsaW5lMiA9IGxpbmVzWzFdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGxpbmUyID0gIiIKKyAgICAgICAgICAgIFFkLk1vdmVUbyhpbnQobGVmdCArIDQpLCBpbnQodG9wICsgYXNjZW50KSkKKyAgICAgICAgICAgIFFkLkRyYXdUZXh0KGxpbmUxLCAwLCBsZW4obGluZTEpKQorICAgICAgICAgICAgaWYgbGluZTI6CisgICAgICAgICAgICAgICAgUWQuTW92ZVRvKGludChsZWZ0ICsgNCksIGludCh0b3AgKyBhc2NlbnQgKyBsaW5lZmVlZCkpCisgICAgICAgICAgICAgICAgUWQuRHJhd1RleHQobGluZTIsIDAsIGxlbihsaW5lMikpCisgICAgICAgICAgICBRZC5QZW5QYXQoIlx4MTFceDExXHgxMVx4MTFceDExXHgxMVx4MTFceDExIikKKyAgICAgICAgICAgIGJvdHRvbSA9IHRvcCArIHRoZUxpc3QuY2VsbFNpemVbMV0KKyAgICAgICAgICAgIFFkLk1vdmVUbyhsZWZ0LCBib3R0b20gLSAxKQorICAgICAgICAgICAgUWQuTGluZVRvKHJpZ2h0LCBib3R0b20gLSAxKQorICAgICAgICBpZiBzZWxlY3RlZDoKKyAgICAgICAgICAgIHNlbGYubGlzdERlZkhpZ2hsaWdodChzZWxlY3RlZCwgY2VsbFJlY3QsIHRoZUNlbGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCkKKyAgICAgICAgI3Jlc3RvcmUgZ3JhcGhpY3MgZW52aXJvbm1lbnQKKyAgICAgICAgUWQuU2V0UG9ydChzYXZlZFBvcnQpCisgICAgICAgIFFkLlNldENsaXAoc2F2ZWRDbGlwKQorICAgICAgICBRZC5EaXNwb3NlUmduKHNhdmVkQ2xpcCkKKyAgICAgICAgUWQuU2V0UGVuU3RhdGUoc2F2ZWRQZW5TdGF0ZSkKKworICAgIGRlZiBsaXN0RGVmSGlnaGxpZ2h0KHNlbGYsIHNlbGVjdGVkLCBjZWxsUmVjdCwgdGhlQ2VsbCwKKyAgICAgICAgICAgICAgICAgICAgZGF0YU9mZnNldCwgZGF0YUxlbiwgdGhlTGlzdCk6CisgICAgICAgIHNhdmVkUG9ydCA9IFFkLkdldFBvcnQoKQorICAgICAgICBRZC5TZXRQb3J0KHRoZUxpc3QuR2V0TGlzdFBvcnQoKSkKKyAgICAgICAgc2F2ZWRDbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuR2V0Q2xpcChzYXZlZENsaXApCisgICAgICAgIFFkLkNsaXBSZWN0KGNlbGxSZWN0KQorICAgICAgICBzYXZlZFBlblN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBRZC5QZW5Nb2RlKGhpbGl0ZXRyYW5zZmVybW9kZSkKKyAgICAgICAgUWQuUGFpbnRSZWN0KGNlbGxSZWN0KQorCisgICAgICAgICNyZXN0b3JlIGdyYXBoaWNzIGVudmlyb25tZW50CisgICAgICAgIFFkLlNldFBvcnQoc2F2ZWRQb3J0KQorICAgICAgICBRZC5TZXRDbGlwKHNhdmVkQ2xpcCkKKyAgICAgICAgUWQuRGlzcG9zZVJnbihzYXZlZENsaXApCisgICAgICAgIFFkLlNldFBlblN0YXRlKHNhdmVkUGVuU3RhdGUpCisKIAogY2xhc3MgUmVzdWx0c1dpbmRvdzoKLQkKLQkiIiJTaW1wbGUgcmVzdWx0cyB3aW5kb3cuIFRoZSB1c2VyIGNhbm5vdCBtYWtlIHRoaXMgd2luZG93IGdvIGF3YXkgY29tcGxldGVseToKLQljbG9zaW5nIGl0IHdpbGwganVzdCBoaWRlIGl0LiBJdCB3aWxsIHJlbWFpbiBpbiB0aGUgd2luZG93cyBsaXN0LiBUaGUgb3duZXIgb2YgdGhpcyB3aW5kb3cKLQlzaG91bGQgY2FsbCB0aGUgZG9uZSgpIG1ldGhvZCB0byBpbmRpY2F0ZSBpdCdzIGRvbmUgd2l0aCBpdC4KLQkiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZT1Ob25lLCB0aXRsZT0iUmVzdWx0cyIsIGNhbGxiYWNrPU5vbmUpOgotCQlpbXBvcnQgVwotCQlpZiBwb3NzaXplIGlzIE5vbmU6Ci0JCQlwb3NzaXplID0gKDUwMCwgMjAwKQotCQlzZWxmLncgPSBXLldpbmRvdyhwb3NzaXplLCB0aXRsZSwgbWluc2l6ZT0oMjAwLCAxMDApKQotCQlzZWxmLncucmVzdWx0cyA9IFcuVHdvTGluZUxpc3QoKC0xLCAtMSwgMSwgLTE0KSwgY2FsbGJhY2s9Tm9uZSkKLQkJc2VsZi53LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmhpZGUpCi0JCXNlbGYudy5vcGVuKCkKLQkJc2VsZi5fZG9uZSA9IDAKLQkKLQlkZWYgZG9uZShzZWxmKToKLQkJc2VsZi5fZG9uZSA9IDEKLQkJaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKLQkJCXNlbGYudy5jbG9zZSgpCi0JCi0JZGVmIGhpZGUoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9kb25lOgotCQkJc2VsZi53LnNob3coMCkKLQkJCXJldHVybiAtMQotCQotCWRlZiBhcHBlbmQoc2VsZiwgbXNnKToKLQkJaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKLQkJCXNlbGYudy5zaG93KDEpCi0JCQlzZWxmLncuc2VsZWN0KCkKLQkJbXNnID0gc3RyaW5nLnJlcGxhY2UobXNnLCAnXG4nLCAnXHInKQotCQlzZWxmLncucmVzdWx0cy5hcHBlbmQobXNnKQotCQlzZWxmLncucmVzdWx0cy5zZXRzZWxlY3Rpb24oW2xlbihzZWxmLncucmVzdWx0cyktMV0pCi0JCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgotCQlyZXR1cm4gZ2V0YXR0cihzZWxmLncucmVzdWx0cywgYXR0cikKKworICAgICIiIlNpbXBsZSByZXN1bHRzIHdpbmRvdy4gVGhlIHVzZXIgY2Fubm90IG1ha2UgdGhpcyB3aW5kb3cgZ28gYXdheSBjb21wbGV0ZWx5OgorICAgIGNsb3NpbmcgaXQgd2lsbCBqdXN0IGhpZGUgaXQuIEl0IHdpbGwgcmVtYWluIGluIHRoZSB3aW5kb3dzIGxpc3QuIFRoZSBvd25lciBvZiB0aGlzIHdpbmRvdworICAgIHNob3VsZCBjYWxsIHRoZSBkb25lKCkgbWV0aG9kIHRvIGluZGljYXRlIGl0J3MgZG9uZSB3aXRoIGl0LgorICAgICIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemU9Tm9uZSwgdGl0bGU9IlJlc3VsdHMiLCBjYWxsYmFjaz1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgaWYgcG9zc2l6ZSBpcyBOb25lOgorICAgICAgICAgICAgcG9zc2l6ZSA9ICg1MDAsIDIwMCkKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3cocG9zc2l6ZSwgdGl0bGUsIG1pbnNpemU9KDIwMCwgMTAwKSkKKyAgICAgICAgc2VsZi53LnJlc3VsdHMgPSBXLlR3b0xpbmVMaXN0KCgtMSwgLTEsIDEsIC0xNCksIGNhbGxiYWNrPU5vbmUpCisgICAgICAgIHNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5oaWRlKQorICAgICAgICBzZWxmLncub3BlbigpCisgICAgICAgIHNlbGYuX2RvbmUgPSAwCisKKyAgICBkZWYgZG9uZShzZWxmKToKKyAgICAgICAgc2VsZi5fZG9uZSA9IDEKKyAgICAgICAgaWYgbm90IHNlbGYudy5pc3Zpc2libGUoKToKKyAgICAgICAgICAgIHNlbGYudy5jbG9zZSgpCisKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2RvbmU6CisgICAgICAgICAgICBzZWxmLncuc2hvdygwKQorICAgICAgICAgICAgcmV0dXJuIC0xCisKKyAgICBkZWYgYXBwZW5kKHNlbGYsIG1zZyk6CisgICAgICAgIGlmIG5vdCBzZWxmLncuaXN2aXNpYmxlKCk6CisgICAgICAgICAgICBzZWxmLncuc2hvdygxKQorICAgICAgICAgICAgc2VsZi53LnNlbGVjdCgpCisgICAgICAgIG1zZyA9IHN0cmluZy5yZXBsYWNlKG1zZywgJ1xuJywgJ1xyJykKKyAgICAgICAgc2VsZi53LnJlc3VsdHMuYXBwZW5kKG1zZykKKyAgICAgICAgc2VsZi53LnJlc3VsdHMuc2V0c2VsZWN0aW9uKFtsZW4oc2VsZi53LnJlc3VsdHMpLTFdKQorCisgICAgZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLncucmVzdWx0cywgYXR0cikKIAogCiBjbGFzcyBNdWx0aUxpc3QoTGlzdCk6Ci0JCi0JIiIiWFhYIEV4cGVyaW1hbnRhbCEhISIiIgotCQotCWRlZiBzZXRpdGVtcyhzZWxmLCBpdGVtcyk6Ci0JCXNlbGYuaXRlbXMgPSBpdGVtcwotCQlpZiBub3Qgc2VsZi5fcGFyZW50IG9yIG5vdCBzZWxmLl9saXN0OgotCQkJcmV0dXJuCi0JCXNlbGYuX2xpc3QuTERlbFJvdygwLCAxKQotCQlzZWxmLnNldGRyYXdpbmdtb2RlKDApCi0JCXNlbGYuX2xpc3QuTEFkZFJvdyhsZW4oc2VsZi5pdGVtcyksIDApCi0JCXNlbGZfaXRlbXJlcHIgPSBzZWxmLml0ZW1yZXByCi0JCXNldF9jZWxsID0gc2VsZi5fbGlzdC5MU2V0Q2VsbAotCQlmb3IgaSBpbiByYW5nZShsZW4oaXRlbXMpKToKLQkJCXJvdyA9IGl0ZW1zW2ldCi0JCQlmb3IgaiBpbiByYW5nZShsZW4ocm93KSk6Ci0JCQkJaXRlbSA9IHJvd1tqXQotCQkJCXNldF9jZWxsKHNlbGZfaXRlbXJlcHIoaXRlbSksIChqLCBpKSkKLQkJc2VsZi5zZXRkcmF3aW5nbW9kZSgxKQotCQotCWRlZiBnZXRzZWxlY3Rpb24oc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6Ci0JCQlpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6Ci0JCQkJcmV0dXJuIHNlbGYuX3NlbAotCQkJcmV0dXJuIFtdCi0JCWl0ZW1zID0gW10KLQkJcG9pbnQgPSAoMCwwKQotCQl3aGlsZSAxOgotCQkJb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQotCQkJaWYgbm90IG9rOgotCQkJCWJyZWFrCi0JCQlpdGVtcy5hcHBlbmQocG9pbnRbMV0pCi0JCQlwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCi0JCXJldHVybiBpdGVtcwotCQotCWRlZiBzZXRzZWxlY3Rpb24oc2VsZiwgc2VsZWN0aW9uKToKLQkJaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKLQkJCXNlbGYuX3NlbCA9IHNlbGVjdGlvbgotCQkJcmV0dXJuCi0JCXNldF9zZWwgPSBzZWxmLl9saXN0LkxTZXRTZWxlY3QKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXMpKToKLQkJCWZvciBqIGluIHJhbmdlKGxlbihzZWxmLml0ZW1zW2ldKSk6Ci0JCQkJaWYgaSBpbiBzZWxlY3Rpb246Ci0JCQkJCXNldF9zZWwoMSwgKGosIGkpKQotCQkJCWVsc2U6Ci0JCQkJCXNldF9zZWwoMCwgKGosIGkpKQotCQkjc2VsZi5fbGlzdC5MQXV0b1Njcm9sbCgpCiAKKyAgICAiIiJYWFggRXhwZXJpbWFudGFsISEhIiIiCisKKyAgICBkZWYgc2V0aXRlbXMoc2VsZiwgaXRlbXMpOgorICAgICAgICBzZWxmLml0ZW1zID0gaXRlbXMKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudCBvciBub3Qgc2VsZi5fbGlzdDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLl9saXN0LkxEZWxSb3coMCwgMSkKKyAgICAgICAgc2VsZi5zZXRkcmF3aW5nbW9kZSgwKQorICAgICAgICBzZWxmLl9saXN0LkxBZGRSb3cobGVuKHNlbGYuaXRlbXMpLCAwKQorICAgICAgICBzZWxmX2l0ZW1yZXByID0gc2VsZi5pdGVtcmVwcgorICAgICAgICBzZXRfY2VsbCA9IHNlbGYuX2xpc3QuTFNldENlbGwKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGl0ZW1zKSk6CisgICAgICAgICAgICByb3cgPSBpdGVtc1tpXQorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHJvdykpOgorICAgICAgICAgICAgICAgIGl0ZW0gPSByb3dbal0KKyAgICAgICAgICAgICAgICBzZXRfY2VsbChzZWxmX2l0ZW1yZXByKGl0ZW0pLCAoaiwgaSkpCisgICAgICAgIHNlbGYuc2V0ZHJhd2luZ21vZGUoMSkKKworICAgIGRlZiBnZXRzZWxlY3Rpb24oc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLl9wYXJlbnQgb3Igbm90IHNlbGYuX2xpc3Q6CisgICAgICAgICAgICBpZiBoYXNhdHRyKHNlbGYsICJfc2VsIik6CisgICAgICAgICAgICAgICAgcmV0dXJuIHNlbGYuX3NlbAorICAgICAgICAgICAgcmV0dXJuIFtdCisgICAgICAgIGl0ZW1zID0gW10KKyAgICAgICAgcG9pbnQgPSAoMCwwKQorICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgb2ssIHBvaW50ID0gc2VsZi5fbGlzdC5MR2V0U2VsZWN0KDEsIHBvaW50KQorICAgICAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICBpdGVtcy5hcHBlbmQocG9pbnRbMV0pCisgICAgICAgICAgICBwb2ludCA9IHBvaW50WzBdLCBwb2ludFsxXSsxCisgICAgICAgIHJldHVybiBpdGVtcworCisgICAgZGVmIHNldHNlbGVjdGlvbihzZWxmLCBzZWxlY3Rpb24pOgorICAgICAgICBpZiBub3Qgc2VsZi5fcGFyZW50IG9yIG5vdCBzZWxmLl9saXN0OgorICAgICAgICAgICAgc2VsZi5fc2VsID0gc2VsZWN0aW9uCisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2V0X3NlbCA9IHNlbGYuX2xpc3QuTFNldFNlbGVjdAorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5pdGVtcykpOgorICAgICAgICAgICAgZm9yIGogaW4gcmFuZ2UobGVuKHNlbGYuaXRlbXNbaV0pKToKKyAgICAgICAgICAgICAgICBpZiBpIGluIHNlbGVjdGlvbjoKKyAgICAgICAgICAgICAgICAgICAgc2V0X3NlbCgxLCAoaiwgaSkpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2V0X3NlbCgwLCAoaiwgaSkpCisgICAgICAgICNzZWxmLl9saXN0LkxBdXRvU2Nyb2xsKCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV21lbnVzLnB5IGIvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKaW5kZXggYmQxMTlhNS4uMDFhOGUxYyAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9XbWVudXMucHkKQEAgLTgsMjUyICs4LDI1MiBAQAogI19hcnJvd2Rvd24gPSBRZC5HZXRQaWN0dXJlKDQ3MykKIAogX2Fycm93cmlnaHQgPSBSZXMuUmVzb3VyY2UoCi0JJ1x4MDBJXHgwMFx4MDBceDAwXHgwMFx4MDBcblx4MDBcblx4MTFceDAxXHgwMVx4MDBcblx4MDBceDAwXHgwMCcKLQknXHgwMFx4MDBcblx4MDBcblx4OTBceDAwXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMCcKLQknXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMFx4MDBceDAwXHgwMFxuXHgwMFxuXHgwMFx4MDBceDEwXHgwMCcKLQknXHgxOFx4MDBceDFjXHgwMFx4MWVceDAwXHgxZlx4MDBceDFmXHgwMFx4MWVceDAwXHgxY1x4MDBceDE4XHgwMCcKLQknXHgxMFx4MDBceGZmJykKKyAgICAgICAgJ1x4MDBJXHgwMFx4MDBceDAwXHgwMFx4MDBcblx4MDBcblx4MTFceDAxXHgwMVx4MDBcblx4MDBceDAwXHgwMCcKKyAgICAgICAgJ1x4MDBceDAwXG5ceDAwXG5ceDkwXHgwMFx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFxuXHgwMFxuXHgwMFx4MDAnCisgICAgICAgICdceDAwXHgwMFx4MDBcblx4MDBcblx4MDBceDAwXHgwMFx4MDBceDAwXG5ceDAwXG5ceDAwXHgwMFx4MTBceDAwJworICAgICAgICAnXHgxOFx4MDBceDFjXHgwMFx4MWVceDAwXHgxZlx4MDBceDFmXHgwMFx4MWVceDAwXHgxY1x4MDBceDE4XHgwMCcKKyAgICAgICAgJ1x4MTBceDAwXHhmZicpCiAKIAogY2xhc3MgUG9wdXBDb250cm9sKFdjb250cm9scy5Db250cm9sV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6Ci0JCWlmIGl0ZW1zIGlzIE5vbmU6Ci0JCQlpdGVtcyA9IFtdCi0JCXByb2NJRCA9IENvbnRyb2xzLnBvcHVwTWVudVByb2N8Q29udHJvbHMucG9wdXBGaXhlZFdpZHRofENvbnRyb2xzLnVzZVdGb250Ci0JCVdjb250cm9scy5Db250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsICIiLCBwcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAwKQotCQlzZWxmLl9pdGVtcyA9IGl0ZW1zWzpdCi0JCi0JZGVmIHNldChzZWxmLCB2YWx1ZSk6Ci0JCXNlbGYuX2NvbnRyb2wuU2V0Q29udHJvbFZhbHVlKHZhbHVlKzEpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2NvbnRyb2wuR2V0Q29udHJvbFZhbHVlKCkgLSAxCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYubWVudSA9IG1lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJCi0JCWZvciBpIGluIHJhbmdlKGxlbihzZWxmLl9pdGVtcykpOgotCQkJaXRlbSA9IHNlbGYuX2l0ZW1zW2ldCi0JCQlpZiB0eXBlKGl0ZW0pID09IFN0cmluZ1R5cGU6Ci0JCQkJbWVudWl0ZW10ZXh0ID0gb2JqZWN0ID0gaXRlbQotCQkJZWxpZiB0eXBlKGl0ZW0pID09IFR1cGxlVHlwZSBhbmQgbGVuKGl0ZW0pID09IDI6Ci0JCQkJbWVudWl0ZW10ZXh0LCBvYmplY3QgPSBpdGVtCi0JCQkJc2VsZi5faXRlbXNbaV0gPSBvYmplY3QKLQkJCWVsc2U6Ci0JCQkJcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiaWxsZWdhbCBpdGVtbGlzdCBmb3IgcG9wdXAgbWVudSIKLQkJCW1lbnVpdGVtID0gRnJhbWVXb3JrLk1lbnVJdGVtKG1lbnUsIG1lbnVpdGVtdGV4dCwgTm9uZSwgTm9uZSkKLQkJCi0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLl9jb250cm9sID0gQ3RsLk5ld0NvbnRyb2woc2VsZi5fcGFyZW50d2luZG93LndpZCwgCi0JCQkJCQlzZWxmLl9ib3VuZHMsIAotCQkJCQkJc2VsZi5fdGl0bGUsIAotCQkJCQkJMSwgCi0JCQkJCQlzZWxmLl92YWx1ZSwgCi0JCQkJCQlzZWxmLm1lbnUuaWQsIAotCQkJCQkJc2VsZi5fbWF4LCAKLQkJCQkJCXNlbGYuX3Byb2NJRCwgCi0JCQkJCQkwKQotCQlzZWxmLlNldFBvcnQoKQotCQlzZWxmLmVuYWJsZShzZWxmLl9lbmFibGVkKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5tZW51LmRlbGV0ZSgpCi0JCXJldHVybiBXY29udHJvbHMuQ29udHJvbFdpZGdldC5jbG9zZShzZWxmKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50LCAtMSkKLQkJaWYgcGFydDoKLQkJCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5faXRlbXNbc2VsZi5nZXQoKV0pCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgIGlmIGl0ZW1zIGlzIE5vbmU6CisgICAgICAgICAgICBpdGVtcyA9IFtdCisgICAgICAgIHByb2NJRCA9IENvbnRyb2xzLnBvcHVwTWVudVByb2N8Q29udHJvbHMucG9wdXBGaXhlZFdpZHRofENvbnRyb2xzLnVzZVdGb250CisgICAgICAgIFdjb250cm9scy5Db250cm9sV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUsICIiLCBwcm9jSUQsIGNhbGxiYWNrLCAwLCAwLCAwKQorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zWzpdCisKKyAgICBkZWYgc2V0KHNlbGYsIHZhbHVlKToKKyAgICAgICAgc2VsZi5fY29udHJvbC5TZXRDb250cm9sVmFsdWUodmFsdWUrMSkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLl9jb250cm9sLkdldENvbnRyb2xWYWx1ZSgpIC0gMQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYubWVudSA9IG1lbnUgPSBGcmFtZVdvcmsuTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKKworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4oc2VsZi5faXRlbXMpKToKKyAgICAgICAgICAgIGl0ZW0gPSBzZWxmLl9pdGVtc1tpXQorICAgICAgICAgICAgaWYgdHlwZShpdGVtKSA9PSBTdHJpbmdUeXBlOgorICAgICAgICAgICAgICAgIG1lbnVpdGVtdGV4dCA9IG9iamVjdCA9IGl0ZW0KKyAgICAgICAgICAgIGVsaWYgdHlwZShpdGVtKSA9PSBUdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgorICAgICAgICAgICAgICAgIG1lbnVpdGVtdGV4dCwgb2JqZWN0ID0gaXRlbQorICAgICAgICAgICAgICAgIHNlbGYuX2l0ZW1zW2ldID0gb2JqZWN0CisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIHJhaXNlIFdiYXNlLldpZGdldHNFcnJvciwgImlsbGVnYWwgaXRlbWxpc3QgZm9yIHBvcHVwIG1lbnUiCisgICAgICAgICAgICBtZW51aXRlbSA9IEZyYW1lV29yay5NZW51SXRlbShtZW51LCBtZW51aXRlbXRleHQsIE5vbmUsIE5vbmUpCisKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYuX2NvbnRyb2wgPSBDdGwuTmV3Q29udHJvbChzZWxmLl9wYXJlbnR3aW5kb3cud2lkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX2JvdW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl90aXRsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYubWVudS5pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9tYXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcHJvY0lELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDApCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuZW5hYmxlKHNlbGYuX2VuYWJsZWQpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYubWVudS5kZWxldGUoKQorICAgICAgICByZXR1cm4gV2NvbnRyb2xzLkNvbnRyb2xXaWRnZXQuY2xvc2Uoc2VsZikKKworICAgIGRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKKyAgICAgICAgaWYgbm90IHNlbGYuX2VuYWJsZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgcGFydCA9IHNlbGYuX2NvbnRyb2wuVHJhY2tDb250cm9sKHBvaW50LCAtMSkKKyAgICAgICAgaWYgcGFydDoKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgc2VsZi5faXRlbXNbc2VsZi5nZXQoKV0pCiAKIAogY2xhc3MgUG9wdXBXaWRnZXQoV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0KToKLQkKLQkiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuIAotCUJ1aWxkcyB0aGUgbWVudSBpdGVtcyBvbiB0aGUgZmx5LCBnb29kIGZvciBkeW5hbWljIHBvcHVwIG1lbnVzLiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBpdGVtcz1Ob25lLCBjYWxsYmFjaz1Ob25lKToKLQkJV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCWlmIGl0ZW1zIGlzIE5vbmU6Ci0JCQlpdGVtcyA9IFtdCi0JCXNlbGYuX2l0ZW1zID0gaXRlbXMKLQkJc2VsZi5faXRlbXNkaWN0ID0ge30KLQkJc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjawotCQlzZWxmLl9lbmFibGVkID0gMQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCi0JCXNlbGYuX2l0ZW1zID0gTm9uZQotCQlzZWxmLl9pdGVtc2RpY3QgPSB7fQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJUWQuRnJhbWVSZWN0KHNlbGYuX2JvdW5kcykKLQkJCVFkLkVyYXNlUmVjdChRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAxLCAxKSkKLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJCWwgPSBsICsgMgotCQkJdCA9IHQgKyAzCi0JCQlwaWN0ZnJhbWUgPSAobCwgdCwgbCArIDEwLCB0ICsgMTApCi0JCQlRZC5EcmF3UGljdHVyZShfYXJyb3dyaWdodCwgcGljdGZyYW1lKQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5tZW51ID0gRnJhbWVXb3JrLk1lbnUoc2VsZi5fcGFyZW50d2luZG93LnBhcmVudC5tZW51YmFyLCAnRm9vJywgLTEpCi0JCXNlbGYuX2FkZGl0ZW1zKHNlbGYuX2l0ZW1zLCBzZWxmLm1lbnUpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJbCwgdCA9IFFkLkxvY2FsVG9HbG9iYWwoKGwrMSwgdCsxKSkKLQkJV2Jhc2UuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCXNlbGYubWVudS5tZW51LkVuYWJsZU1lbnVJdGVtKDApCi0JCXJlcGx5ID0gc2VsZi5tZW51Lm1lbnUuUG9wVXBNZW51U2VsZWN0KHQsIGwsIDEpCi0JCWlmIHJlcGx5OgotCQkJaWQgPSByZXBseSA+PiAxNgotCQkJaXRlbSA9IHJlcGx5ICYgMHhmZmZmCi0JCQlzZWxmLl9tZW51X2NhbGxiYWNrKGlkLCBpdGVtKQotCQlzZWxmLl9lbXB0eW1lbnUoKQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlzZWxmLl9pdGVtcyA9IGl0ZW1zCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2l0ZW1zCi0JCi0JZGVmIF9hZGRpdGVtcyhzZWxmLCBpdGVtcywgbWVudSk6Ci0JCWZyb20gRnJhbWVXb3JrIGltcG9ydCBTdWJNZW51LCBNZW51SXRlbQotCQltZW51X2lkID0gbWVudS5pZAotCQlmb3IgaXRlbSBpbiBpdGVtczoKLQkJCWlmIGl0ZW0gPT0gIi0iOgotCQkJCW1lbnUuYWRkc2VwYXJhdG9yKCkKLQkJCQljb250aW51ZQotCQkJZWxpZiB0eXBlKGl0ZW0pID09IExpc3RUeXBlOgotCQkJCXN1Ym1lbnUgPSBTdWJNZW51KG1lbnUsIGl0ZW1bMF0pCi0JCQkJc2VsZi5fYWRkaXRlbXMoaXRlbVsxOl0sIHN1Ym1lbnUpCi0JCQkJY29udGludWUKLQkJCWVsaWYgdHlwZShpdGVtKSA9PSBTdHJpbmdUeXBlOgotCQkJCW1lbnVpdGVtdGV4dCA9IG9iamVjdCA9IGl0ZW0KLQkJCWVsaWYgdHlwZShpdGVtKSA9PSBUdXBsZVR5cGUgYW5kIGxlbihpdGVtKSA9PSAyOgotCQkJCW1lbnVpdGVtdGV4dCwgb2JqZWN0ID0gaXRlbQotCQkJZWxzZToKLQkJCQlyYWlzZSBXYmFzZS5XaWRnZXRzRXJyb3IsICJpbGxlZ2FsIGl0ZW1saXN0IGZvciBwb3B1cCBtZW51IgotCQkJCi0JCQlpZiBtZW51aXRlbXRleHRbOjFdID09ICdcMCc6Ci0JCQkJY2hlY2sgPSBvcmQobWVudWl0ZW10ZXh0WzFdKQotCQkJCW1lbnVpdGVtdGV4dCA9IG1lbnVpdGVtdGV4dFsyOl0KLQkJCWVsc2U6Ci0JCQkJY2hlY2sgPSAwCi0JCQltZW51aXRlbSA9IE1lbnVJdGVtKG1lbnUsIG1lbnVpdGVtdGV4dCwgTm9uZSwgTm9uZSkKLQkJCWlmIGNoZWNrOgotCQkJCW1lbnVpdGVtLmNoZWNrKDEpCi0JCQlzZWxmLl9pdGVtc2RpY3RbKG1lbnVfaWQsIG1lbnVpdGVtLml0ZW0pXSA9IG9iamVjdAotCQotCWRlZiBfZW1wdHltZW51KHNlbGYpOgotCQltZW51cyA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhci5tZW51cwotCQlmb3IgaWQsIGl0ZW0gaW4gc2VsZi5faXRlbXNkaWN0LmtleXMoKToKLQkJCWlmIG1lbnVzLmhhc19rZXkoaWQpOgotCQkJCXNlbGYubWVudSA9IG1lbnVzW2lkXQotCQkJCXNlbGYubWVudS5kZWxldGUoKQotCQlzZWxmLl9pdGVtc2RpY3QgPSB7fQotCQotCWRlZiBfbWVudV9jYWxsYmFjayhzZWxmLCBpZCwgaXRlbSk6Ci0JCXRoaW5nID0gc2VsZi5faXRlbXNkaWN0WyhpZCwgaXRlbSldCi0JCWlmIGNhbGxhYmxlKHRoaW5nKToKLQkJCXRoaW5nKCkKLQkJZWxpZiBzZWxmLl9jYWxsYmFjazoKLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgdGhpbmcpCisKKyAgICAiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuCisgICAgQnVpbGRzIHRoZSBtZW51IGl0ZW1zIG9uIHRoZSBmbHksIGdvb2QgZm9yIGR5bmFtaWMgcG9wdXAgbWVudXMuIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgaXRlbXM9Tm9uZSwgY2FsbGJhY2s9Tm9uZSk6CisgICAgICAgIFdiYXNlLkNsaWNrYWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBpZiBpdGVtcyBpcyBOb25lOgorICAgICAgICAgICAgaXRlbXMgPSBbXQorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zCisgICAgICAgIHNlbGYuX2l0ZW1zZGljdCA9IHt9CisgICAgICAgIHNlbGYuX2NhbGxiYWNrID0gY2FsbGJhY2sKKyAgICAgICAgc2VsZi5fZW5hYmxlZCA9IDEKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgV2Jhc2UuQ2xpY2thYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCisgICAgICAgIHNlbGYuX2l0ZW1zID0gTm9uZQorICAgICAgICBzZWxmLl9pdGVtc2RpY3QgPSB7fQorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5GcmFtZVJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpKQorICAgICAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICAgICAgbCA9IGwgKyAyCisgICAgICAgICAgICB0ID0gdCArIDMKKyAgICAgICAgICAgIHBpY3RmcmFtZSA9IChsLCB0LCBsICsgMTAsIHQgKyAxMCkKKyAgICAgICAgICAgIFFkLkRyYXdQaWN0dXJlKF9hcnJvd3JpZ2h0LCBwaWN0ZnJhbWUpCisKKyAgICBkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgIGlmIG5vdCBzZWxmLl9lbmFibGVkOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYubWVudSA9IEZyYW1lV29yay5NZW51KHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhciwgJ0ZvbycsIC0xKQorICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGwsIHQgPSBRZC5Mb2NhbFRvR2xvYmFsKChsKzEsIHQrMSkpCisgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICBzZWxmLm1lbnUubWVudS5FbmFibGVNZW51SXRlbSgwKQorICAgICAgICByZXBseSA9IHNlbGYubWVudS5tZW51LlBvcFVwTWVudVNlbGVjdCh0LCBsLCAxKQorICAgICAgICBpZiByZXBseToKKyAgICAgICAgICAgIGlkID0gcmVwbHkgPj4gMTYKKyAgICAgICAgICAgIGl0ZW0gPSByZXBseSAmIDB4ZmZmZgorICAgICAgICAgICAgc2VsZi5fbWVudV9jYWxsYmFjayhpZCwgaXRlbSkKKyAgICAgICAgc2VsZi5fZW1wdHltZW51KCkKKworICAgIGRlZiBzZXQoc2VsZiwgaXRlbXMpOgorICAgICAgICBzZWxmLl9pdGVtcyA9IGl0ZW1zCisKKyAgICBkZWYgZ2V0KHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5faXRlbXMKKworICAgIGRlZiBfYWRkaXRlbXMoc2VsZiwgaXRlbXMsIG1lbnUpOgorICAgICAgICBmcm9tIEZyYW1lV29yayBpbXBvcnQgU3ViTWVudSwgTWVudUl0ZW0KKyAgICAgICAgbWVudV9pZCA9IG1lbnUuaWQKKyAgICAgICAgZm9yIGl0ZW0gaW4gaXRlbXM6CisgICAgICAgICAgICBpZiBpdGVtID09ICItIjoKKyAgICAgICAgICAgICAgICBtZW51LmFkZHNlcGFyYXRvcigpCisgICAgICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgICAgIGVsaWYgdHlwZShpdGVtKSA9PSBMaXN0VHlwZToKKyAgICAgICAgICAgICAgICBzdWJtZW51ID0gU3ViTWVudShtZW51LCBpdGVtWzBdKQorICAgICAgICAgICAgICAgIHNlbGYuX2FkZGl0ZW1zKGl0ZW1bMTpdLCBzdWJtZW51KQorICAgICAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgICAgICBlbGlmIHR5cGUoaXRlbSkgPT0gU3RyaW5nVHlwZToKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQgPSBvYmplY3QgPSBpdGVtCisgICAgICAgICAgICBlbGlmIHR5cGUoaXRlbSkgPT0gVHVwbGVUeXBlIGFuZCBsZW4oaXRlbSkgPT0gMjoKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQsIG9iamVjdCA9IGl0ZW0KKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiaWxsZWdhbCBpdGVtbGlzdCBmb3IgcG9wdXAgbWVudSIKKworICAgICAgICAgICAgaWYgbWVudWl0ZW10ZXh0WzoxXSA9PSAnXDAnOgorICAgICAgICAgICAgICAgIGNoZWNrID0gb3JkKG1lbnVpdGVtdGV4dFsxXSkKKyAgICAgICAgICAgICAgICBtZW51aXRlbXRleHQgPSBtZW51aXRlbXRleHRbMjpdCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGNoZWNrID0gMAorICAgICAgICAgICAgbWVudWl0ZW0gPSBNZW51SXRlbShtZW51LCBtZW51aXRlbXRleHQsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICBpZiBjaGVjazoKKyAgICAgICAgICAgICAgICBtZW51aXRlbS5jaGVjaygxKQorICAgICAgICAgICAgc2VsZi5faXRlbXNkaWN0WyhtZW51X2lkLCBtZW51aXRlbS5pdGVtKV0gPSBvYmplY3QKKworICAgIGRlZiBfZW1wdHltZW51KHNlbGYpOgorICAgICAgICBtZW51cyA9IHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhci5tZW51cworICAgICAgICBmb3IgaWQsIGl0ZW0gaW4gc2VsZi5faXRlbXNkaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmIG1lbnVzLmhhc19rZXkoaWQpOgorICAgICAgICAgICAgICAgIHNlbGYubWVudSA9IG1lbnVzW2lkXQorICAgICAgICAgICAgICAgIHNlbGYubWVudS5kZWxldGUoKQorICAgICAgICBzZWxmLl9pdGVtc2RpY3QgPSB7fQorCisgICAgZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKKyAgICAgICAgdGhpbmcgPSBzZWxmLl9pdGVtc2RpY3RbKGlkLCBpdGVtKV0KKyAgICAgICAgaWYgY2FsbGFibGUodGhpbmcpOgorICAgICAgICAgICAgdGhpbmcoKQorICAgICAgICBlbGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCB0aGluZykKIAogCiBjbGFzcyBQb3B1cE1lbnUoUG9wdXBXaWRnZXQpOgotCQotCSIiIlNpbXBsZSB0aXRsZS1sZXNzIHBvcHVwIHdpZGdldC4gU2hvdWxkIGJlIDE2eDE2IHBpeGVscy4gCi0JUHJlYnVpbGRzIHRoZSBtZW51IGl0ZW1zLCBnb29kIGZvciBzdGF0aWMgKG5vbiBjaGFuZ2luZykgcG9wdXAgbWVudXMuIiIiCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQlzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJc2VsZi5fYWRkaXRlbXMoc2VsZi5faXRlbXMsIHNlbGYubWVudSkKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCXNlbGYuX2VtcHR5bWVudSgpCi0JCVdiYXNlLldpZGdldC5jbG9zZShzZWxmKQotCQlzZWxmLl9pdGVtcyA9IE5vbmUKLQkJc2VsZi5faXRlbXNkaWN0ID0ge30KLQkJc2VsZi5tZW51ID0gTm9uZQotCQotCWRlZiBzZXQoc2VsZiwgaXRlbXMpOgotCQlpZiBzZWxmLl9pdGVtc2RpY3Q6Ci0JCQlzZWxmLl9lbXB0eW1lbnUoKQotCQlzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKLQkJc2VsZi5faXRlbXMgPSBpdGVtcwotCQlzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQotCQotCWRlZiBjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKToKLQkJaWYgbm90IHNlbGYuX2VuYWJsZWQ6Ci0JCQlyZXR1cm4KLQkJc2VsZi5TZXRQb3J0KCkKLQkJbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcwotCQlsLCB0ID0gUWQuTG9jYWxUb0dsb2JhbCgobCsxLCB0KzEpKQotCQlXYmFzZS5TZXRDdXJzb3IoImFycm93IikKLQkJc2VsZi5tZW51Lm1lbnUuRW5hYmxlTWVudUl0ZW0oMCkKLQkJcmVwbHkgPSBzZWxmLm1lbnUubWVudS5Qb3BVcE1lbnVTZWxlY3QodCwgbCwgMSkKLQkJaWYgcmVwbHk6Ci0JCQlpZCA9IHJlcGx5ID4+IDE2Ci0JCQlpdGVtID0gcmVwbHkgJiAweGZmZmYKLQkJCXNlbGYuX21lbnVfY2FsbGJhY2soaWQsIGl0ZW0pCisKKyAgICAiIiJTaW1wbGUgdGl0bGUtbGVzcyBwb3B1cCB3aWRnZXQuIFNob3VsZCBiZSAxNngxNiBwaXhlbHMuCisgICAgUHJlYnVpbGRzIHRoZSBtZW51IGl0ZW1zLCBnb29kIGZvciBzdGF0aWMgKG5vbiBjaGFuZ2luZykgcG9wdXAgbWVudXMuIiIiCisKKyAgICBkZWYgb3BlbihzZWxmKToKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisgICAgICAgIHNlbGYubWVudSA9IFdhcHBsaWNhdGlvbi5NZW51KHNlbGYuX3BhcmVudHdpbmRvdy5wYXJlbnQubWVudWJhciwgJ0ZvbycsIC0xKQorICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLl9lbXB0eW1lbnUoKQorICAgICAgICBXYmFzZS5XaWRnZXQuY2xvc2Uoc2VsZikKKyAgICAgICAgc2VsZi5faXRlbXMgPSBOb25lCisgICAgICAgIHNlbGYuX2l0ZW1zZGljdCA9IHt9CisgICAgICAgIHNlbGYubWVudSA9IE5vbmUKKworICAgIGRlZiBzZXQoc2VsZiwgaXRlbXMpOgorICAgICAgICBpZiBzZWxmLl9pdGVtc2RpY3Q6CisgICAgICAgICAgICBzZWxmLl9lbXB0eW1lbnUoKQorICAgICAgICBzZWxmLm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShzZWxmLl9wYXJlbnR3aW5kb3cucGFyZW50Lm1lbnViYXIsICdGb28nLCAtMSkKKyAgICAgICAgc2VsZi5faXRlbXMgPSBpdGVtcworICAgICAgICBzZWxmLl9hZGRpdGVtcyhzZWxmLl9pdGVtcywgc2VsZi5tZW51KQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGwsIHQgPSBRZC5Mb2NhbFRvR2xvYmFsKChsKzEsIHQrMSkpCisgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorICAgICAgICBzZWxmLm1lbnUubWVudS5FbmFibGVNZW51SXRlbSgwKQorICAgICAgICByZXBseSA9IHNlbGYubWVudS5tZW51LlBvcFVwTWVudVNlbGVjdCh0LCBsLCAxKQorICAgICAgICBpZiByZXBseToKKyAgICAgICAgICAgIGlkID0gcmVwbHkgPj4gMTYKKyAgICAgICAgICAgIGl0ZW0gPSByZXBseSAmIDB4ZmZmZgorICAgICAgICAgICAgc2VsZi5fbWVudV9jYWxsYmFjayhpZCwgaXRlbSkKIAogCiBjbGFzcyBGb250TWVudShQb3B1cE1lbnUpOgotCQotCSIiIkEgZm9udCBwb3B1cCBtZW51LiIiIgotCQotCW1lbnUgPSBOb25lCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIGNhbGxiYWNrKToKLQkJUG9wdXBNZW51Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCV9tYWtlZm9udG1lbnUoKQotCQlzZWxmLl9jYWxsYmFjayA9IGNhbGxiYWNrCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYuX2NhbGNib3VuZHMoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJZGVsIHNlbGYuX2NhbGxiYWNrCi0JCi0JZGVmIHNldChzZWxmKToKLQkJcmFpc2UgV2Jhc2UuV2lkZ2V0c0Vycm9yLCAiY2FuJ3QgY2hhbmdlIGZvbnQgbWVudSB3aWRnZXQiCi0JCi0JZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKLQkJZm9udG5hbWUgPSBzZWxmLm1lbnUubWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIGZvbnRuYW1lKQogCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlfbWFrZWZvbnRtZW51KCkKLQkJcmV0dXJuIFBvcHVwTWVudS5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQorICAgICIiIkEgZm9udCBwb3B1cCBtZW51LiIiIgorCisgICAgbWVudSA9IE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCBjYWxsYmFjayk6CisgICAgICAgIFBvcHVwTWVudS5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBfbWFrZWZvbnRtZW51KCkKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLl9lbmFibGVkID0gMQorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBkZWwgc2VsZi5fY2FsbGJhY2sKKworICAgIGRlZiBzZXQoc2VsZik6CisgICAgICAgIHJhaXNlIFdiYXNlLldpZGdldHNFcnJvciwgImNhbid0IGNoYW5nZSBmb250IG1lbnUgd2lkZ2V0IgorCisgICAgZGVmIF9tZW51X2NhbGxiYWNrKHNlbGYsIGlkLCBpdGVtKToKKyAgICAgICAgZm9udG5hbWUgPSBzZWxmLm1lbnUubWVudS5HZXRNZW51SXRlbVRleHQoaXRlbSkKKyAgICAgICAgaWYgc2VsZi5fY2FsbGJhY2s6CisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsIGZvbnRuYW1lKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBfbWFrZWZvbnRtZW51KCkKKyAgICAgICAgcmV0dXJuIFBvcHVwTWVudS5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQorCiAKIGRlZiBfbWFrZWZvbnRtZW51KCk6Ci0JIiIiaGVscGVyIGZvciBmb250IG1lbnUiIiIKLQlpZiBGb250TWVudS5tZW51IGlzIG5vdCBOb25lOgotCQlyZXR1cm4KLQlpbXBvcnQgVwotCUZvbnRNZW51Lm1lbnUgPSBXYXBwbGljYXRpb24uTWVudShXLmdldGFwcGxpY2F0aW9uKCkubWVudWJhciwgJ0ZvbycsIC0xKQotCVcuU2V0Q3Vyc29yKCd3YXRjaCcpCi0JZm9yIGkgaW4gcmFuZ2UoRm9udE1lbnUubWVudS5tZW51LkNvdW50TWVudUl0ZW1zKCksIDAsIC0xKToKLQkJRm9udE1lbnUubWVudS5tZW51LkRlbGV0ZU1lbnVJdGVtKGkpCi0JRm9udE1lbnUubWVudS5tZW51LkFwcGVuZFJlc01lbnUoJ0ZPTkQnKQorICAgICIiImhlbHBlciBmb3IgZm9udCBtZW51IiIiCisgICAgaWYgRm9udE1lbnUubWVudSBpcyBub3QgTm9uZToKKyAgICAgICAgcmV0dXJuCisgICAgaW1wb3J0IFcKKyAgICBGb250TWVudS5tZW51ID0gV2FwcGxpY2F0aW9uLk1lbnUoVy5nZXRhcHBsaWNhdGlvbigpLm1lbnViYXIsICdGb28nLCAtMSkKKyAgICBXLlNldEN1cnNvcignd2F0Y2gnKQorICAgIGZvciBpIGluIHJhbmdlKEZvbnRNZW51Lm1lbnUubWVudS5Db3VudE1lbnVJdGVtcygpLCAwLCAtMSk6CisgICAgICAgIEZvbnRNZW51Lm1lbnUubWVudS5EZWxldGVNZW51SXRlbShpKQorICAgIEZvbnRNZW51Lm1lbnUubWVudS5BcHBlbmRSZXNNZW51KCdGT05EJykKIAogCiBkZWYgX2dldGZvbnRsaXN0KCk6Ci0JZnJvbSBDYXJib24gaW1wb3J0IFJlcwotCWZvbnRuYW1lcyA9IFtdCi0JZm9yIGkgaW4gcmFuZ2UoMSwgUmVzLkNvdW50UmVzb3VyY2VzKCdGT05EJykgKyAxKToKLQkJciA9IFJlcy5HZXRJbmRSZXNvdXJjZSgnRk9ORCcsIGkpCi0JCWZvbnRuYW1lcy5hcHBlbmQoci5HZXRSZXNJbmZvKClbMl0pCi0JcmV0dXJuIGZvbnRuYW1lcworICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICBmb250bmFtZXMgPSBbXQorICAgIGZvciBpIGluIHJhbmdlKDEsIFJlcy5Db3VudFJlc291cmNlcygnRk9ORCcpICsgMSk6CisgICAgICAgIHIgPSBSZXMuR2V0SW5kUmVzb3VyY2UoJ0ZPTkQnLCBpKQorICAgICAgICBmb250bmFtZXMuYXBwZW5kKHIuR2V0UmVzSW5mbygpWzJdKQorICAgIHJldHVybiBmb250bmFtZXMKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV21pbmlhcHAucHkgYi9NYWMvVG9vbHMvSURFL1dtaW5pYXBwLnB5CmluZGV4IGUwOWUzMzQuLjBjNTE1ODMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9JREUvV21pbmlhcHAucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9XbWluaWFwcC5weQpAQCAtNSwxOCArNSwxOCBAQAogaW1wb3J0IG9zCiAKIGNsYXNzIFRlc3RBcHAoV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uKToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCWZyb20gQ2FyYm9uIGltcG9ydCBSZXMKLSMJCW1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUoIldpZGdldHMucnNyYyIpCi0JCXNlbGYuX21lbnVzdG9jaGVjayA9IFtdCi0JCXNlbGYucHJlZmZpbGVwYXRoID0gb3MucGF0aC5qb2luKCJQeXRob24iLCAiUHl0aG9uSURFIHByZWZlcmVuY2VzIikKLQkJV2FwcGxpY2F0aW9uLkFwcGxpY2F0aW9uLl9faW5pdF9fKHNlbGYsICdQeXRoJykKLQkJIyBvcGVuIGEgbmV3IHRleHQgZWRpdG9yCi0JCWltcG9ydCBQeUVkaXQKLQkJUHlFZGl0LkVkaXRvcigpCi0JCSMgc3RhcnQgdGhlIG1haW5sb29wCi0JCXNlbGYubWFpbmxvb3AoKQotCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYpOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgUmVzCisjICAgICAgICAgICAgICAgbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZSgiV2lkZ2V0cy5yc3JjIikKKyAgICAgICAgc2VsZi5fbWVudXN0b2NoZWNrID0gW10KKyAgICAgICAgc2VsZi5wcmVmZmlsZXBhdGggPSBvcy5wYXRoLmpvaW4oIlB5dGhvbiIsICJQeXRob25JREUgcHJlZmVyZW5jZXMiKQorICAgICAgICBXYXBwbGljYXRpb24uQXBwbGljYXRpb24uX19pbml0X18oc2VsZiwgJ1B5dGgnKQorICAgICAgICAjIG9wZW4gYSBuZXcgdGV4dCBlZGl0b3IKKyAgICAgICAgaW1wb3J0IFB5RWRpdAorICAgICAgICBQeUVkaXQuRWRpdG9yKCkKKyAgICAgICAgIyBzdGFydCB0aGUgbWFpbmxvb3AKKyAgICAgICAgc2VsZi5tYWlubG9vcCgpCisKIAogVGVzdEFwcCgpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1dxdWlja3RpbWUucHkgYi9NYWMvVG9vbHMvSURFL1dxdWlja3RpbWUucHkKaW5kZXggNDIxZDU1OC4uNjcxYWEwOSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XcXVpY2t0aW1lLnB5CisrKyBiL01hYy9Ub29scy9JREUvV3F1aWNrdGltZS5weQpAQCAtOSwxMDYgKzksMTA1IEBACiBfbW92aWVzaW5pdGlhbGl6ZWQgPSAwCiAKIGRlZiBFbnRlck1vdmllcygpOgotCWdsb2JhbCBfbW92aWVzaW5pdGlhbGl6ZWQKLQlpZiBub3QgX21vdmllc2luaXRpYWxpemVkOgotCQlRdC5FbnRlck1vdmllcygpCi0JCV9tb3ZpZXNpbml0aWFsaXplZCA9IDEKKyAgICBnbG9iYWwgX21vdmllc2luaXRpYWxpemVkCisgICAgaWYgbm90IF9tb3ZpZXNpbml0aWFsaXplZDoKKyAgICAgICAgUXQuRW50ZXJNb3ZpZXMoKQorICAgICAgICBfbW92aWVzaW5pdGlhbGl6ZWQgPSAxCiAKIGNsYXNzIE1vdmllKFcuV2lkZ2V0KToKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSk6Ci0JCUVudGVyTW92aWVzKCkKLQkJc2VsZi5tb3ZpZSA9IE5vbmUKLQkJc2VsZi5ydW5uaW5nID0gMAotCQlXLldpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQotCWRlZiBhZGp1c3Qoc2VsZiwgb2xkYm91bmRzKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCi0JCXNlbGYuY2FsY21vdmllYm94KCkKLQkKLQlkZWYgc2V0KHNlbGYsIHBhdGhfb3JfZnNzLCBzdGFydCA9IDApOgotCQlzZWxmLlNldFBvcnQoKQotCQlpZiBzZWxmLm1vdmllOgotCQkJI3NlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYubW92aWUuR2V0TW92aWVCb3goKSkKLQkJCVFkLlBhaW50UmVjdChzZWxmLm1vdmllLkdldE1vdmllQm94KCkpCi0JCXBhdGggPSBGaWxlLnBhdGhuYW1lKHBhdGgpCi0JCXNlbGYubW92aWV0aXRsZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKLQkJbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHBhdGhfb3JfZnNzLCAxKQotCQlzZWxmLm1vdmllLCBkdW1teSwgZHVtbXkgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCi0JCXNlbGYubW92aWVib3ggPSBzZWxmLm1vdmllLkdldE1vdmllQm94KCkKLQkJc2VsZi5jYWxjbW92aWVib3goKQotCQlRZC5PYnNjdXJlQ3Vyc29yKCkJIyBYWFggZG9lcyB0aGlzIHdvcmsgYXQgYWxsPwotCQlzZWxmLm1vdmllLkdvVG9CZWdpbm5pbmdPZk1vdmllKCkKLQkJaWYgc3RhcnQ6Ci0JCQlzZWxmLm1vdmllLlN0YXJ0TW92aWUoKQotCQkJc2VsZi5ydW5uaW5nID0gMQotCQllbHNlOgotCQkJc2VsZi5ydW5uaW5nID0gMAotCQkJc2VsZi5tb3ZpZS5Nb3ZpZXNUYXNrKDApCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYubW92aWUKLQkKLQlkZWYgZ2V0bW92aWV0aXRsZShzZWxmKToKLQkJcmV0dXJuIHNlbGYubW92aWV0aXRsZQotCQotCWRlZiBzdGFydChzZWxmKToKLQkJaWYgc2VsZi5tb3ZpZToKLQkJCVFkLk9ic2N1cmVDdXJzb3IoKQotCQkJc2VsZi5tb3ZpZS5TdGFydE1vdmllKCkKLQkJCXNlbGYucnVubmluZyA9IDEKLQkKLQlkZWYgc3RvcChzZWxmKToKLQkJaWYgc2VsZi5tb3ZpZToKLQkJCXNlbGYubW92aWUuU3RvcE1vdmllKCkKLQkJCXNlbGYucnVubmluZyA9IDAKLQkKLQlkZWYgcmV3aW5kKHNlbGYpOgotCQlpZiBzZWxmLm1vdmllOgotCQkJc2VsZi5tb3ZpZS5Hb1RvQmVnaW5uaW5nT2ZNb3ZpZSgpCi0JCi0JZGVmIGNhbGNtb3ZpZWJveChzZWxmKToKLQkJaWYgbm90IHNlbGYubW92aWU6Ci0JCQlyZXR1cm4KLQkJbWwsIG10LCBtciwgbWIgPSBzZWxmLm1vdmllYm94Ci0JCXdsLCB3dCwgd3IsIHdiID0gd2lkZ2V0Ym94ID0gc2VsZi5fYm91bmRzCi0JCW1oZWlnaHQgPSBtYiAtIG10Ci0JCW13aWR0aCA9IG1yIC0gbWwKLQkJd2hlaWdodCA9IHdiIC0gd3QKLQkJd3dpZHRoID0gd3IgLSB3bAotCQlpZiAobWhlaWdodCAqIDIgPCB3aGVpZ2h0KSBhbmQgKG13aWR0aCAqIDIgPCB3d2lkdGgpOgotCQkJc2NhbGUgPSAyCi0JCWVsaWYgbWhlaWdodCA+IHdoZWlnaHQgb3IgbXdpZHRoID4gd3dpZHRoOgotCQkJc2NhbGUgPSBtaW4oZmxvYXQod2hlaWdodCkgLyBtaGVpZ2h0LCBmbG9hdCh3d2lkdGgpIC8gbXdpZHRoKQotCQllbHNlOgotCQkJc2NhbGUgPSAxCi0JCW13aWR0aCwgbWhlaWdodCA9IG13aWR0aCAqIHNjYWxlLCBtaGVpZ2h0ICogc2NhbGUKLQkJbWwsIG10ID0gd2wgKyAod3dpZHRoIC0gbXdpZHRoKSAvIDIsIHd0ICsgKHdoZWlnaHQgLSBtaGVpZ2h0KSAvIDIKLQkJbXIsIG1iID0gbWwgKyBtd2lkdGgsIG10ICsgbWhlaWdodAotCQlzZWxmLm1vdmllLlNldE1vdmllQm94KChtbCwgbXQsIG1yLCBtYikpCi0JCi0JZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgotCQlpZiBzZWxmLm1vdmllOgotCQkJaWYgbm90IHNlbGYubW92aWUuSXNNb3ZpZURvbmUoKSBhbmQgc2VsZi5ydW5uaW5nOgotCQkJCVFkLk9ic2N1cmVDdXJzb3IoKQotCQkJCXdoaWxlIDE6Ci0JCQkJCXNlbGYubW92aWUuTW92aWVzVGFzaygwKQotCQkJCQlnb3RvbmUsIGV2ZW50ID0gRXZ0LkV2ZW50QXZhaWwoRXZlbnRzLmV2ZXJ5RXZlbnQpCi0JCQkJCWlmIGdvdG9uZSBvciBzZWxmLm1vdmllLklzTW92aWVEb25lKCk6Ci0JCQkJCQlicmVhawotCQkJZWxpZiBzZWxmLnJ1bm5pbmc6Ci0JCQkJYm94ID0gc2VsZi5tb3ZpZS5HZXRNb3ZpZUJveCgpCi0JCQkJc2VsZi5TZXRQb3J0KCkKLQkJCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChib3gpCi0JCQkJc2VsZi5tb3ZpZSA9IE5vbmUKLQkJCQlzZWxmLnJ1bm5pbmcgPSAwCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlRZC5QYWludFJlY3Qoc2VsZi5fYm91bmRzKQotCQkJaWYgc2VsZi5tb3ZpZToKLQkJCQlzZWxmLm1vdmllLlVwZGF0ZU1vdmllKCkKLQkJCQlzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKIAorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplKToKKyAgICAgICAgRW50ZXJNb3ZpZXMoKQorICAgICAgICBzZWxmLm1vdmllID0gTm9uZQorICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisgICAgICAgIFcuV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KG9sZGJvdW5kcykKKyAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICBzZWxmLmNhbGNtb3ZpZWJveCgpCisKKyAgICBkZWYgc2V0KHNlbGYsIHBhdGhfb3JfZnNzLCBzdGFydCA9IDApOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgI3NlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYubW92aWUuR2V0TW92aWVCb3goKSkKKyAgICAgICAgICAgIFFkLlBhaW50UmVjdChzZWxmLm1vdmllLkdldE1vdmllQm94KCkpCisgICAgICAgIHBhdGggPSBGaWxlLnBhdGhuYW1lKHBhdGgpCisgICAgICAgIHNlbGYubW92aWV0aXRsZSA9IG9zLnBhdGguYmFzZW5hbWUocGF0aCkKKyAgICAgICAgbW92aWVSZXNSZWYgPSBRdC5PcGVuTW92aWVGaWxlKHBhdGhfb3JfZnNzLCAxKQorICAgICAgICBzZWxmLm1vdmllLCBkdW1teSwgZHVtbXkgPSBRdC5OZXdNb3ZpZUZyb21GaWxlKG1vdmllUmVzUmVmLCAwLCBRdWlja1RpbWUubmV3TW92aWVBY3RpdmUpCisgICAgICAgIHNlbGYubW92aWVib3ggPSBzZWxmLm1vdmllLkdldE1vdmllQm94KCkKKyAgICAgICAgc2VsZi5jYWxjbW92aWVib3goKQorICAgICAgICBRZC5PYnNjdXJlQ3Vyc29yKCkgICAgICAjIFhYWCBkb2VzIHRoaXMgd29yayBhdCBhbGw/CisgICAgICAgIHNlbGYubW92aWUuR29Ub0JlZ2lubmluZ09mTW92aWUoKQorICAgICAgICBpZiBzdGFydDoKKyAgICAgICAgICAgIHNlbGYubW92aWUuU3RhcnRNb3ZpZSgpCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAxCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKKworICAgIGRlZiBnZXQoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLm1vdmllCisKKyAgICBkZWYgZ2V0bW92aWV0aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYubW92aWV0aXRsZQorCisgICAgZGVmIHN0YXJ0KHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgUWQuT2JzY3VyZUN1cnNvcigpCisgICAgICAgICAgICBzZWxmLm1vdmllLlN0YXJ0TW92aWUoKQorICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gMQorCisgICAgZGVmIHN0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYubW92aWU6CisgICAgICAgICAgICBzZWxmLm1vdmllLlN0b3BNb3ZpZSgpCisgICAgICAgICAgICBzZWxmLnJ1bm5pbmcgPSAwCisKKyAgICBkZWYgcmV3aW5kKHNlbGYpOgorICAgICAgICBpZiBzZWxmLm1vdmllOgorICAgICAgICAgICAgc2VsZi5tb3ZpZS5Hb1RvQmVnaW5uaW5nT2ZNb3ZpZSgpCisKKyAgICBkZWYgY2FsY21vdmllYm94KHNlbGYpOgorICAgICAgICBpZiBub3Qgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBtbCwgbXQsIG1yLCBtYiA9IHNlbGYubW92aWVib3gKKyAgICAgICAgd2wsIHd0LCB3ciwgd2IgPSB3aWRnZXRib3ggPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgbWhlaWdodCA9IG1iIC0gbXQKKyAgICAgICAgbXdpZHRoID0gbXIgLSBtbAorICAgICAgICB3aGVpZ2h0ID0gd2IgLSB3dAorICAgICAgICB3d2lkdGggPSB3ciAtIHdsCisgICAgICAgIGlmIChtaGVpZ2h0ICogMiA8IHdoZWlnaHQpIGFuZCAobXdpZHRoICogMiA8IHd3aWR0aCk6CisgICAgICAgICAgICBzY2FsZSA9IDIKKyAgICAgICAgZWxpZiBtaGVpZ2h0ID4gd2hlaWdodCBvciBtd2lkdGggPiB3d2lkdGg6CisgICAgICAgICAgICBzY2FsZSA9IG1pbihmbG9hdCh3aGVpZ2h0KSAvIG1oZWlnaHQsIGZsb2F0KHd3aWR0aCkgLyBtd2lkdGgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzY2FsZSA9IDEKKyAgICAgICAgbXdpZHRoLCBtaGVpZ2h0ID0gbXdpZHRoICogc2NhbGUsIG1oZWlnaHQgKiBzY2FsZQorICAgICAgICBtbCwgbXQgPSB3bCArICh3d2lkdGggLSBtd2lkdGgpIC8gMiwgd3QgKyAod2hlaWdodCAtIG1oZWlnaHQpIC8gMgorICAgICAgICBtciwgbWIgPSBtbCArIG13aWR0aCwgbXQgKyBtaGVpZ2h0CisgICAgICAgIHNlbGYubW92aWUuU2V0TW92aWVCb3goKG1sLCBtdCwgbXIsIG1iKSkKKworICAgIGRlZiBpZGxlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgIGlmIG5vdCBzZWxmLm1vdmllLklzTW92aWVEb25lKCkgYW5kIHNlbGYucnVubmluZzoKKyAgICAgICAgICAgICAgICBRZC5PYnNjdXJlQ3Vyc29yKCkKKyAgICAgICAgICAgICAgICB3aGlsZSAxOgorICAgICAgICAgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKKyAgICAgICAgICAgICAgICAgICAgZ290b25lLCBldmVudCA9IEV2dC5FdmVudEF2YWlsKEV2ZW50cy5ldmVyeUV2ZW50KQorICAgICAgICAgICAgICAgICAgICBpZiBnb3RvbmUgb3Igc2VsZi5tb3ZpZS5Jc01vdmllRG9uZSgpOgorICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGVsaWYgc2VsZi5ydW5uaW5nOgorICAgICAgICAgICAgICAgIGJveCA9IHNlbGYubW92aWUuR2V0TW92aWVCb3goKQorICAgICAgICAgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoYm94KQorICAgICAgICAgICAgICAgIHNlbGYubW92aWUgPSBOb25lCisgICAgICAgICAgICAgICAgc2VsZi5ydW5uaW5nID0gMAorCisgICAgZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6CisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBRZC5QYWludFJlY3Qoc2VsZi5fYm91bmRzKQorICAgICAgICAgICAgaWYgc2VsZi5tb3ZpZToKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmllLlVwZGF0ZU1vdmllKCkKKyAgICAgICAgICAgICAgICBzZWxmLm1vdmllLk1vdmllc1Rhc2soMCkKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9JREUvV3NvY2tldC5weSBiL01hYy9Ub29scy9JREUvV3NvY2tldC5weQppbmRleCA5MTM3OTdjLi5lYjU5MzZkIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1dzb2NrZXQucHkKKysrIGIvTWFjL1Rvb2xzL0lERS9Xc29ja2V0LnB5CkBAIC0xNywzNzUgKzE3LDM3NSBAQAogVkVSQk9TRSA9IDEKIAogY2xhc3MgU2VydmVyKGFzeW5jb3JlLmRpc3BhdGNoZXIpOgotCQotCSIiIkdlbmVyaWMgYXN5bmNocm9ub3VzIHNlcnZlciBjbGFzcyIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCBiYWNrbG9nPTEsIGhvc3Q9IiIpOgotCQkiIiJhcmd1bWVudHM6Ci0JCS0gcG9ydDogdGhlIHBvcnQgdG8gbGlzdGVuIHRvCi0JCS0gaGFuZGxlcl9jbGFzczogY2xhc3MgdG8gaGFuZGxlIHJlcXVlc3RzCi0JCS0gYmFja2xvZzogYmFja2xvZyBxdWV1ZSBzaXplIChvcHRpb25hbCkgKGRvbid0IGZ1bGx5IHVuZGVyc3RhbmQsIHNlZSBzb2NrZXQgZG9jcykKLQkJLSBob3N0OiBob3N0IG5hbWUgKG9wdGlvbmFsOiBjYW4gYmUgZW1wdHkgdG8gdXNlIGRlZmF1bHQgaG9zdCBuYW1lKQotCQkiIiIKLQkJaWYgVkVSQk9TRToKLQkJCXByaW50ICJTdGFydGluZyIsIHNlbGYuX19jbGFzc19fLl9fbmFtZV9fCi0JCXNlbGYuaGFuZGxlcl9jbGFzcyA9IGhhbmRsZXJfY2xhc3MKLQkJYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQotCQlzZWxmLmNyZWF0ZV9zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLQkJc2VsZi5iaW5kKChob3N0LCBwb3J0KSkKLQkJc2VsZi5saXN0ZW4oYmFja2xvZykKLQkKLQlkZWYgaGFuZGxlX2FjY2VwdChzZWxmKToKLQkJY29ubiwgYWRkciA9IHNlbGYuYWNjZXB0KCkKLQkJaWYgVkVSQk9TRToKLQkJCXByaW50ICdJbmNvbWluZyBDb25uZWN0aW9uIGZyb20gJXM6JWQnICUgYWRkcgotCQlzZWxmLmhhbmRsZXJfY2xhc3MoY29ubikKKworICAgICIiIkdlbmVyaWMgYXN5bmNocm9ub3VzIHNlcnZlciBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvcnQsIGhhbmRsZXJfY2xhc3MsIGJhY2tsb2c9MSwgaG9zdD0iIik6CisgICAgICAgICIiImFyZ3VtZW50czoKKyAgICAgICAgLSBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gdG8KKyAgICAgICAgLSBoYW5kbGVyX2NsYXNzOiBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMKKyAgICAgICAgLSBiYWNrbG9nOiBiYWNrbG9nIHF1ZXVlIHNpemUgKG9wdGlvbmFsKSAoZG9uJ3QgZnVsbHkgdW5kZXJzdGFuZCwgc2VlIHNvY2tldCBkb2NzKQorICAgICAgICAtIGhvc3Q6IGhvc3QgbmFtZSAob3B0aW9uYWw6IGNhbiBiZSBlbXB0eSB0byB1c2UgZGVmYXVsdCBob3N0IG5hbWUpCisgICAgICAgICIiIgorICAgICAgICBpZiBWRVJCT1NFOgorICAgICAgICAgICAgcHJpbnQgIlN0YXJ0aW5nIiwgc2VsZi5fX2NsYXNzX18uX19uYW1lX18KKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzID0gaGFuZGxlcl9jbGFzcworICAgICAgICBhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCisgICAgICAgIHNlbGYuY3JlYXRlX3NvY2tldChzb2NrZXQuQUZfSU5FVCwgc29ja2V0LlNPQ0tfU1RSRUFNKQorICAgICAgICBzZWxmLmJpbmQoKGhvc3QsIHBvcnQpKQorICAgICAgICBzZWxmLmxpc3RlbihiYWNrbG9nKQorCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAnSW5jb21pbmcgQ29ubmVjdGlvbiBmcm9tICVzOiVkJyAlIGFkZHIKKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzKGNvbm4pCiAKIAogY2xhc3MgUHJveHlTZXJ2ZXIoU2VydmVyKToKLQkKLQkiIiJHZW5lcmljIHByb3h5IHNlcnZlciBjbGFzcyIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCBwcm94eWFkZHI9Tm9uZSwgY2xvc2VwYXJ0bmVycz0wKToKLQkJIiIiYXJndW1lbnRzOgotCQktIHBvcnQ6IHRoZSBwb3J0IHRvIGxpc3RlbiB0bwotCQktIGhhbmRsZXJfY2xhc3M6IHByb3h5IGNsYXNzIHRvIGhhbmRsZSByZXF1ZXN0cwotCQktIHByb3h5YWRkcjogYSB0dXBsZSBjb250YWluaW5nIHRoZSBhZGRyZXNzIGFuZCAKLQkJICBwb3J0IG9mIGEgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0byAob3B0aW9uYWwpCi0JCS0gY2xvc2VwYXJ0bmVyczogYm9vbGVhbiwgc3BlY2lmaWVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsb3NlCi0JCSAgYWxsIHByb3h5IGNvbm5lY3Rpb25zIG9yIG5vdCAob3B0aW9uYWwpLiBodHRwIHNlZW1zIHRvICpub3QqCi0JCSAgd2FudCB0aGlzLCBidXQgdGVsbmV0IGRvZXMuLi4KLQkJIiIiCi0JCVNlcnZlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCAxLCAiIikKLQkJc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKLQkJc2VsZi5jbG9zZXBhcnRuZXJzID0gY2xvc2VwYXJ0bmVycwotCQotCWRlZiBoYW5kbGVfYWNjZXB0KHNlbGYpOgotCQljb25uLCBhZGRyID0gc2VsZi5hY2NlcHQoKQotCQlpZiBWRVJCT1NFOgotCQkJcHJpbnQgJ0luY29taW5nIENvbm5lY3Rpb24gZnJvbSAlczolZCcgJSBhZGRyCi0JCXNlbGYuaGFuZGxlcl9jbGFzcyhjb25uLCBzZWxmLnByb3h5YWRkciwgY2xvc2VwYXJ0bmVyPXNlbGYuY2xvc2VwYXJ0bmVycykKKworICAgICIiIkdlbmVyaWMgcHJveHkgc2VydmVyIGNsYXNzIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9ydCwgaGFuZGxlcl9jbGFzcywgcHJveHlhZGRyPU5vbmUsIGNsb3NlcGFydG5lcnM9MCk6CisgICAgICAgICIiImFyZ3VtZW50czoKKyAgICAgICAgLSBwb3J0OiB0aGUgcG9ydCB0byBsaXN0ZW4gdG8KKyAgICAgICAgLSBoYW5kbGVyX2NsYXNzOiBwcm94eSBjbGFzcyB0byBoYW5kbGUgcmVxdWVzdHMKKyAgICAgICAgLSBwcm94eWFkZHI6IGEgdHVwbGUgY29udGFpbmluZyB0aGUgYWRkcmVzcyBhbmQKKyAgICAgICAgICBwb3J0IG9mIGEgcmVtb3RlIGhvc3QgdG8gY29ubmVjdCB0byAob3B0aW9uYWwpCisgICAgICAgIC0gY2xvc2VwYXJ0bmVyczogYm9vbGVhbiwgc3BlY2lmaWVzIHdoZXRoZXIgd2Ugc2hvdWxkIGNsb3NlCisgICAgICAgICAgYWxsIHByb3h5IGNvbm5lY3Rpb25zIG9yIG5vdCAob3B0aW9uYWwpLiBodHRwIHNlZW1zIHRvICpub3QqCisgICAgICAgICAgd2FudCB0aGlzLCBidXQgdGVsbmV0IGRvZXMuLi4KKyAgICAgICAgIiIiCisgICAgICAgIFNlcnZlci5fX2luaXRfXyhzZWxmLCBwb3J0LCBoYW5kbGVyX2NsYXNzLCAxLCAiIikKKyAgICAgICAgc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKKyAgICAgICAgc2VsZi5jbG9zZXBhcnRuZXJzID0gY2xvc2VwYXJ0bmVycworCisgICAgZGVmIGhhbmRsZV9hY2NlcHQoc2VsZik6CisgICAgICAgIGNvbm4sIGFkZHIgPSBzZWxmLmFjY2VwdCgpCisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAnSW5jb21pbmcgQ29ubmVjdGlvbiBmcm9tICVzOiVkJyAlIGFkZHIKKyAgICAgICAgc2VsZi5oYW5kbGVyX2NsYXNzKGNvbm4sIHNlbGYucHJveHlhZGRyLCBjbG9zZXBhcnRuZXI9c2VsZi5jbG9zZXBhcnRuZXJzKQogCiAKIGNsYXNzIENvbm5lY3Rpb24oYXN5bmNvcmUuZGlzcGF0Y2hlcik6Ci0JCi0JIiIiR2VuZXJpYyBjb25uZWN0aW9uIGNsYXNzIiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCByZWFkZnVuYz1Ob25lLCB0ZXJtaW5hdG9yPU5vbmUpOgotCQkiIiJhcmd1bWVudHM6IAotCQktIHNvY2tfb3JfYWRkcmVzczogZWl0aGVyIGEgc29ja2V0LCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlIG5hbWUgCi0JCWFuZCBwb3J0IG51bWJlciBvZiBhIHJlbW90ZSBob3N0Ci0JCS0gcmVhZGZ1bmM6IGNhbGxiYWNrIGZ1bmN0aW9uIChvcHRpb25hbCkuIFdpbGwgYmUgY2FsbGVkIHdoZW5ldmVyCi0JCSAgdGhlcmUgaXMgc29tZSBkYXRhIGF2YWlsYWJsZSwgb3Igd2hlbiBhbiBhcHByb3ByYWl0ZSB0ZXJtaW5hdG9yCi0JCSAgaXMgZm91bmQuCi0JCS0gdGVybWluYXRvcjogc3RyaW5nIHdoaWNoIHNwZWNpZmllcyB3aGVuIGEgcmVhZCBpcyBjb21wbGV0ZSAob3B0aW9uYWwpIiIiCi0JCXNlbGYuX291dF9idWZmZXIgPSAiIgotCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQlzZWxmLnJlYWRmdW5jID0gcmVhZGZ1bmMKLQkJc2VsZi50ZXJtaW5hdG9yID0gdGVybWluYXRvcgotCQlhc3luY29yZS5kaXNwYXRjaGVyLl9faW5pdF9fKHNlbGYpCi0JCWlmIGhhc2F0dHIoc29ja19vcl9hZGRyZXNzLCAiZmlsZW5vIik6Ci0JCQlzZWxmLnNldF9zb2NrZXQoc29ja19vcl9hZGRyZXNzKQotCQllbHNlOgotCQkJc29jayA9IHNvY2tldC5zb2NrZXQoc29ja2V0LkFGX0lORVQsIHNvY2tldC5TT0NLX1NUUkVBTSkKLQkJCXNvY2suc2V0YmxvY2tpbmcoMCkKLQkJCXNlbGYuc2V0X3NvY2tldChzb2NrKQotCQkJaWYgc29ja19vcl9hZGRyZXNzOgotCQkJCXNlbGYuY29ubmVjdChzb2NrX29yX2FkZHJlc3MpCi0JCi0JIyBwdWJsaWMgbWV0aG9kcwotCWRlZiBzZW5kKHNlbGYsIGRhdGEpOgotCQlzZWxmLl9vdXRfYnVmZmVyID0gc2VsZi5fb3V0X2J1ZmZlciArIGRhdGEKLQkKLQlkZWYgcmVjdihzZWxmLCBieXRlcz0tMSk6Ci0JCWlmIGJ5dGVzID09IC0xOgotCQkJYnl0ZXMgPSBsZW4oc2VsZi5faW5fYnVmZmVyKQotCQlkYXRhID0gc2VsZi5faW5fYnVmZmVyWzpieXRlc10KLQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyW2J5dGVzOl0KLQkJcmV0dXJuIGRhdGEKLQkKLQlkZWYgc2V0X3Rlcm1pbmF0b3Ioc2VsZiwgdGVybWluYXRvcik6Ci0JCXNlbGYudGVybWluYXRvciA9IHRlcm1pbmF0b3IKLQkKLQkjIG92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0gCi0JZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgotCQlpZiBzZWxmLnJlYWRmdW5jOgotCQkJaWYgc2VsZi50ZXJtaW5hdG9yOgotCQkJCXNlbGYuX2luX2J1ZmZlciA9IHNlbGYuX2luX2J1ZmZlciArIGRhdGEKLQkJCQlwb3MgPSBzdHJpbmcuZmluZChzZWxmLl9pbl9idWZmZXIsIHNlbGYudGVybWluYXRvcikKLQkJCQlpZiBwb3MgPCAwOgotCQkJCQlyZXR1cm4KLQkJCQlkYXRhID0gc2VsZi5faW5fYnVmZmVyWzpwb3NdCi0JCQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyW3BvcyArIGxlbihzZWxmLnRlcm1pbmF0b3IpOl0KLQkJCQlzZWxmLnJlYWRmdW5jKGRhdGEpCi0JCQllbHNlOgotCQkJCXNlbGYucmVhZGZ1bmMoc2VsZi5faW5fYnVmZmVyICsgZGF0YSkKLQkJCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQllbHNlOgotCQkJc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyICsgZGF0YQotCQotCSMgaW50ZXJuYWwgbXVjawotCWRlZiBoYW5kbGVfcmVhZChzZWxmKToKLQkJZGF0YSA9IGFzeW5jb3JlLmRpc3BhdGNoZXIucmVjdihzZWxmLCBCVUZTSVpFKQotCQlpZiBkYXRhOgotCQkJaWYgVkVSQk9TRSA+IDI6Ci0JCQkJcHJpbnQgImluY29taW5nIC0+ICV4ICVyIiAlIChpZChzZWxmKSwgZGF0YSkKLQkJCXNlbGYuaGFuZGxlX2luY29taW5nX2RhdGEoZGF0YSkKLQkKLQlkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgotCQlpZiBzZWxmLl9vdXRfYnVmZmVyOgotCQkJc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5fb3V0X2J1ZmZlcls6QlVGU0laRV0pCi0JCQlpZiBWRVJCT1NFID4gMjoKLQkJCQlwcmludCAib3V0Z29pbmcgLT4gJXggJXIiICUgKGlkKHNlbGYpLCBzZWxmLl9vdXRfYnVmZmVyWzpzZW50XSkKLQkJCXNlbGYuX291dF9idWZmZXIgPSBzZWxmLl9vdXRfYnVmZmVyW3NlbnQ6XQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgc2VsZi5yZWFkZnVuYyBhbmQgc2VsZi5faW5fYnVmZmVyOgotCQkJc2VsZi5yZWFkZnVuYyhzZWxmLl9pbl9idWZmZXIpCi0JCQlzZWxmLl9pbl9idWZmZXIgPSAiIgotCQkjZWxpZiBWRVJCT1NFID4gMSBhbmQgc2VsZi5faW5fYnVmZmVyOgotCQkjCXByaW50ICItLS0gdGhlcmUgaXMgdW5yZWFkIGRhdGE6ICVyIiwgKHNlbGYuX2luX2J1ZmZlciwpCi0JCWFzeW5jb3JlLmRpc3BhdGNoZXIuY2xvc2Uoc2VsZikKLQkKLQlkZWYgaGFuZGxlX2Nsb3NlKHNlbGYpOgotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6Ci0JCXBhc3MKKworICAgICIiIkdlbmVyaWMgY29ubmVjdGlvbiBjbGFzcyIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCByZWFkZnVuYz1Ob25lLCB0ZXJtaW5hdG9yPU5vbmUpOgorICAgICAgICAiIiJhcmd1bWVudHM6CisgICAgICAgIC0gc29ja19vcl9hZGRyZXNzOiBlaXRoZXIgYSBzb2NrZXQsIG9yIGEgdHVwbGUgY29udGFpbmluZyB0aGUgbmFtZQorICAgICAgICBhbmQgcG9ydCBudW1iZXIgb2YgYSByZW1vdGUgaG9zdAorICAgICAgICAtIHJlYWRmdW5jOiBjYWxsYmFjayBmdW5jdGlvbiAob3B0aW9uYWwpLiBXaWxsIGJlIGNhbGxlZCB3aGVuZXZlcgorICAgICAgICAgIHRoZXJlIGlzIHNvbWUgZGF0YSBhdmFpbGFibGUsIG9yIHdoZW4gYW4gYXBwcm9wcmFpdGUgdGVybWluYXRvcgorICAgICAgICAgIGlzIGZvdW5kLgorICAgICAgICAtIHRlcm1pbmF0b3I6IHN0cmluZyB3aGljaCBzcGVjaWZpZXMgd2hlbiBhIHJlYWQgaXMgY29tcGxldGUgKG9wdGlvbmFsKSIiIgorICAgICAgICBzZWxmLl9vdXRfYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5faW5fYnVmZmVyID0gIiIKKyAgICAgICAgc2VsZi5yZWFkZnVuYyA9IHJlYWRmdW5jCisgICAgICAgIHNlbGYudGVybWluYXRvciA9IHRlcm1pbmF0b3IKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5fX2luaXRfXyhzZWxmKQorICAgICAgICBpZiBoYXNhdHRyKHNvY2tfb3JfYWRkcmVzcywgImZpbGVubyIpOgorICAgICAgICAgICAgc2VsZi5zZXRfc29ja2V0KHNvY2tfb3JfYWRkcmVzcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNvY2sgPSBzb2NrZXQuc29ja2V0KHNvY2tldC5BRl9JTkVULCBzb2NrZXQuU09DS19TVFJFQU0pCisgICAgICAgICAgICBzb2NrLnNldGJsb2NraW5nKDApCisgICAgICAgICAgICBzZWxmLnNldF9zb2NrZXQoc29jaykKKyAgICAgICAgICAgIGlmIHNvY2tfb3JfYWRkcmVzczoKKyAgICAgICAgICAgICAgICBzZWxmLmNvbm5lY3Qoc29ja19vcl9hZGRyZXNzKQorCisgICAgIyBwdWJsaWMgbWV0aG9kcworICAgIGRlZiBzZW5kKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9vdXRfYnVmZmVyID0gc2VsZi5fb3V0X2J1ZmZlciArIGRhdGEKKworICAgIGRlZiByZWN2KHNlbGYsIGJ5dGVzPS0xKToKKyAgICAgICAgaWYgYnl0ZXMgPT0gLTE6CisgICAgICAgICAgICBieXRlcyA9IGxlbihzZWxmLl9pbl9idWZmZXIpCisgICAgICAgIGRhdGEgPSBzZWxmLl9pbl9idWZmZXJbOmJ5dGVzXQorICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXJbYnl0ZXM6XQorICAgICAgICByZXR1cm4gZGF0YQorCisgICAgZGVmIHNldF90ZXJtaW5hdG9yKHNlbGYsIHRlcm1pbmF0b3IpOgorICAgICAgICBzZWxmLnRlcm1pbmF0b3IgPSB0ZXJtaW5hdG9yCisKKyAgICAjIG92ZXJyaWRlIHRoaXMgaWYgeW91IHdhbnQgdG8gY29udHJvbCB0aGUgaW5jb21pbmcgZGF0YSBzdHJlYW0KKyAgICBkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIHNlbGYucmVhZGZ1bmM6CisgICAgICAgICAgICBpZiBzZWxmLnRlcm1pbmF0b3I6CisgICAgICAgICAgICAgICAgc2VsZi5faW5fYnVmZmVyID0gc2VsZi5faW5fYnVmZmVyICsgZGF0YQorICAgICAgICAgICAgICAgIHBvcyA9IHN0cmluZy5maW5kKHNlbGYuX2luX2J1ZmZlciwgc2VsZi50ZXJtaW5hdG9yKQorICAgICAgICAgICAgICAgIGlmIHBvcyA8IDA6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9pbl9idWZmZXJbOnBvc10KKyAgICAgICAgICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXJbcG9zICsgbGVuKHNlbGYudGVybWluYXRvcik6XQorICAgICAgICAgICAgICAgIHNlbGYucmVhZGZ1bmMoZGF0YSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgc2VsZi5yZWFkZnVuYyhzZWxmLl9pbl9idWZmZXIgKyBkYXRhKQorICAgICAgICAgICAgICAgIHNlbGYuX2luX2J1ZmZlciA9ICIiCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLl9pbl9idWZmZXIgPSBzZWxmLl9pbl9idWZmZXIgKyBkYXRhCisKKyAgICAjIGludGVybmFsIG11Y2sKKyAgICBkZWYgaGFuZGxlX3JlYWQoc2VsZik6CisgICAgICAgIGRhdGEgPSBhc3luY29yZS5kaXNwYXRjaGVyLnJlY3Yoc2VsZiwgQlVGU0laRSkKKyAgICAgICAgaWYgZGF0YToKKyAgICAgICAgICAgIGlmIFZFUkJPU0UgPiAyOgorICAgICAgICAgICAgICAgIHByaW50ICJpbmNvbWluZyAtPiAleCAlciIgJSAoaWQoc2VsZiksIGRhdGEpCisgICAgICAgICAgICBzZWxmLmhhbmRsZV9pbmNvbWluZ19kYXRhKGRhdGEpCisKKyAgICBkZWYgaGFuZGxlX3dyaXRlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLl9vdXRfYnVmZmVyOgorICAgICAgICAgICAgc2VudCA9IHNlbGYuc29ja2V0LnNlbmQoc2VsZi5fb3V0X2J1ZmZlcls6QlVGU0laRV0pCisgICAgICAgICAgICBpZiBWRVJCT1NFID4gMjoKKyAgICAgICAgICAgICAgICBwcmludCAib3V0Z29pbmcgLT4gJXggJXIiICUgKGlkKHNlbGYpLCBzZWxmLl9vdXRfYnVmZmVyWzpzZW50XSkKKyAgICAgICAgICAgIHNlbGYuX291dF9idWZmZXIgPSBzZWxmLl9vdXRfYnVmZmVyW3NlbnQ6XQorCisgICAgZGVmIGNsb3NlKHNlbGYpOgorICAgICAgICBpZiBzZWxmLnJlYWRmdW5jIGFuZCBzZWxmLl9pbl9idWZmZXI6CisgICAgICAgICAgICBzZWxmLnJlYWRmdW5jKHNlbGYuX2luX2J1ZmZlcikKKyAgICAgICAgICAgIHNlbGYuX2luX2J1ZmZlciA9ICIiCisgICAgICAgICNlbGlmIFZFUkJPU0UgPiAxIGFuZCBzZWxmLl9pbl9idWZmZXI6CisgICAgICAgICMgICAgICAgcHJpbnQgIi0tLSB0aGVyZSBpcyB1bnJlYWQgZGF0YTogJXIiLCAoc2VsZi5faW5fYnVmZmVyLCkKKyAgICAgICAgYXN5bmNvcmUuZGlzcGF0Y2hlci5jbG9zZShzZWxmKQorCisgICAgZGVmIGhhbmRsZV9jbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgaGFuZGxlX2Nvbm5lY3Qoc2VsZik6CisgICAgICAgIHBhc3MKIAogCiBjbGFzcyBDb25uZWN0aW9uVUk6Ci0JCi0JIiIiR2x1ZSB0byBsZXQgYSBjb25uZWN0aW9uIHRlbGwgdGhpbmdzIHRvIHRoZSBVSSBpbiBhIHN0YW5kYXJkaXplZCB3YXkuCi0JCi0JVGhlIHByb3RvY29sbCBkZWZpbmVzIGZvdXIgZnVuY3Rpb25zLCB3aGljaCB0aGUgY29ubmVjdGlvbiB3aWxsIGNhbGw6Ci0JCi0JCWRlZiBzZXR0b3RhbChpbnQgdG90YWwpOiBnZXRzIGNhbGxlZCB3aGVuIHRoZSBjb25uZWN0aW9uIGtub3dzIHRoZSBkYXRhIHNpemUKLQkJZGVmIHNldGN1cnJlbnQoaW50IGN1cnJlbnQpOiBnZXRzIGNhbGxlZCB3aGVuIHNvbWUgbmV3IGRhdGEgaGFzIGFycml2ZWQKLQkJZGVmIGRvbmUoKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUKLQkJZGVmIGVycm9yKHR5cGUsIHZhbHVlLCB0Yik6IGdldHMgY2FsbGVkIHdoZW5ldmVuIGFuIGVycm9yIG9jY3VyZWQKLQkiIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgc2V0dG90YWxfZnVuYywgc2V0Y3VycmVudF9mdW5jLCBkb25lX2Z1bmMsIGVycm9yX2Z1bmMpOgotCQlzZWxmLnNldHRvdGFsID0gc2V0dG90YWxfZnVuYwotCQlzZWxmLnNldGN1cnJlbnQgPSBzZXRjdXJyZW50X2Z1bmMKLQkJc2VsZi5kb25lID0gZG9uZV9mdW5jCi0JCXNlbGYuZXJyb3IgPSBlcnJvcl9mdW5jCisKKyAgICAiIiJHbHVlIHRvIGxldCBhIGNvbm5lY3Rpb24gdGVsbCB0aGluZ3MgdG8gdGhlIFVJIGluIGEgc3RhbmRhcmRpemVkIHdheS4KKworICAgIFRoZSBwcm90b2NvbGwgZGVmaW5lcyBmb3VyIGZ1bmN0aW9ucywgd2hpY2ggdGhlIGNvbm5lY3Rpb24gd2lsbCBjYWxsOgorCisgICAgICAgICAgICBkZWYgc2V0dG90YWwoaW50IHRvdGFsKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgY29ubmVjdGlvbiBrbm93cyB0aGUgZGF0YSBzaXplCisgICAgICAgICAgICBkZWYgc2V0Y3VycmVudChpbnQgY3VycmVudCk6IGdldHMgY2FsbGVkIHdoZW4gc29tZSBuZXcgZGF0YSBoYXMgYXJyaXZlZAorICAgICAgICAgICAgZGVmIGRvbmUoKTogZ2V0cyBjYWxsZWQgd2hlbiB0aGUgdHJhbnNhY3Rpb24gaXMgY29tcGxldGUKKyAgICAgICAgICAgIGRlZiBlcnJvcih0eXBlLCB2YWx1ZSwgdGIpOiBnZXRzIGNhbGxlZCB3aGVuZXZlbiBhbiBlcnJvciBvY2N1cmVkCisgICAgIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgc2V0dG90YWxfZnVuYywgc2V0Y3VycmVudF9mdW5jLCBkb25lX2Z1bmMsIGVycm9yX2Z1bmMpOgorICAgICAgICBzZWxmLnNldHRvdGFsID0gc2V0dG90YWxfZnVuYworICAgICAgICBzZWxmLnNldGN1cnJlbnQgPSBzZXRjdXJyZW50X2Z1bmMKKyAgICAgICAgc2VsZi5kb25lID0gZG9uZV9mdW5jCisgICAgICAgIHNlbGYuZXJyb3IgPSBlcnJvcl9mdW5jCiAKIAogY2xhc3MgSFRUUEVycm9yKHNvY2tldC5lcnJvcik6IHBhc3MKIAogCiBjbGFzcyBIVFRQQ2xpZW50KENvbm5lY3Rpb24sIGh0dHBsaWIuSFRUUCk6Ci0JCi0JIiIiQXN5bmNocm9ub3VzIEhUVFAgY29ubmVjdGlvbiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCksIGRhdGFoYW5kbGVyLCB1aT1Ob25lKToKLQkJQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCAoaG9zdCwgcG9ydCkpCi0JCXNlbGYuZGF0YWhhbmRsZXIgPSBkYXRhaGFuZGxlcgotCQlzZWxmLnVpID0gdWkKLQkJc2VsZi5idWYgPSAiIgotCQlzZWxmLmRvbmVoZWFkZXJzID0gMAotCQlzZWxmLmRvbmUgPSAwCi0JCXNlbGYuaGVhZGVycyA9IE5vbmUKLQkJc2VsZi5sZW5ndGggPSBOb25lCi0JCXNlbGYucG9zID0gMAotCQotCWRlZiBnZXRyZXBseShzZWxmKToKLQkJcmFpc2UgVHlwZUVycm9yLCAiZ2V0cmVwbHkoKSBpcyBub3Qgc3VwcG9ydGVkIGluIGFzeW5jIEhUVFAgY29ubmVjdGlvbiIKLQkKLQlkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6Ci0JCWFzc2VydCBub3Qgc2VsZi5kb25lCi0JCWlmIG5vdCBzZWxmLmRvbmVoZWFkZXJzOgotCQkJc2VsZi5idWYgPSBzZWxmLmJ1ZiArIGRhdGEKLQkJCXBvcyA9IHN0cmluZy5maW5kKHNlbGYuYnVmLCAiXHJcblxyXG4iKQotCQkJaWYgcG9zID49IDA6Ci0JCQkJc2VsZi5oYW5kbGVfcmVwbHkoc2VsZi5idWZbOnBvcys0XSkKLQkJCQlsZW5ndGggPSBzZWxmLmhlYWRlcnMuZ2V0aGVhZGVyKCJDb250ZW50LUxlbmd0aCIpCi0JCQkJaWYgbGVuZ3RoIGlzIG5vdCBOb25lOgotCQkJCQlzZWxmLmxlbmd0aCA9IGludChsZW5ndGgpCi0JCQkJCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQkJCQlzZWxmLnVpLnNldHRvdGFsKHNlbGYubGVuZ3RoKQotCQkJCWVsc2U6Ci0JCQkJCXNlbGYubGVuZ3RoID0gLTEKLQkJCQlzZWxmLmRvbmVoZWFkZXJzID0gMQotCQkJCXNlbGYuaGFuZGxlX2RhdGEoc2VsZi5idWZbcG9zKzQ6XSkKLQkJCQlzZWxmLmJ1ZiA9ICIiCi0JCWVsc2U6Ci0JCQlzZWxmLmhhbmRsZV9kYXRhKGRhdGEpCi0JCi0JZGVmIGhhbmRsZV9yZXBseShzZWxmLCBkYXRhKToKLQkJZiA9IGNTdHJpbmdJTy5TdHJpbmdJTyhkYXRhKQotCQl2ZXIsIGNvZGUsIG1zZyA9IHN0cmluZy5zcGxpdChmLnJlYWRsaW5lKCksIE5vbmUsIDIpCi0JCWNvZGUgPSBpbnQoY29kZSkKLQkJbXNnID0gc3RyaW5nLnN0cmlwKG1zZykKLQkJaWYgY29kZSA8PiAyMDA6Ci0JCQkjIEhtLCB0aGlzIGlzIHdoYXQgKkkqIG5lZWQsIGJ1dCBwcm9iYWJseSBub3QgY29ycmVjdC4uLgotCQkJcmFpc2UgSFRUUEVycm9yLCAoY29kZSwgbXNnKQotCQlzZWxmLmhlYWRlcnMgPSBtaW1ldG9vbHMuTWVzc2FnZShmKQotCQotCWRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKLQkJc2VsZi5wb3MgPSBzZWxmLnBvcyArIGxlbihkYXRhKQotCQlpZiBzZWxmLnVpIGlzIG5vdCBOb25lOgotCQkJc2VsZi51aS5zZXRjdXJyZW50KHNlbGYucG9zKQotCQlzZWxmLmRhdGFoYW5kbGVyKGRhdGEpCi0JCWlmIHNlbGYucG9zID49IHNlbGYubGVuZ3RoOgotCQkJc2VsZi5kYXRhaGFuZGxlcigiIikKLQkJCXNlbGYuZG9uZSA9IDEKLQkJCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQkJc2VsZi51aS5kb25lKCkKLQkKLQlkZWYgaGFuZGxlX2Vycm9yKHNlbGYsIHR5cGUsIHZhbHVlLCB0Yik6Ci0JCWlmIHNlbGYudWkgaXMgbm90IE5vbmU6Ci0JCQlzZWxmLnVpLmVycm9yKHR5cGUsIHZhbHVlLCB0YikKLQkJZWxzZToKLQkJCUNvbm5lY3Rpb24uaGFuZGxlX2Vycm9yKHNlbGYsIHR5cGUsIHZhbHVlLCB0YikKLQkKLQlkZWYgbG9nKHNlbGYsIG1lc3NhZ2UpOgotCQlpZiBWRVJCT1NFOgotCQkJcHJpbnQgJ0xPRzonLCBtZXNzYWdlCisKKyAgICAiIiJBc3luY2hyb25vdXMgSFRUUCBjb25uZWN0aW9uIiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpLCBkYXRhaGFuZGxlciwgdWk9Tm9uZSk6CisgICAgICAgIENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgKGhvc3QsIHBvcnQpKQorICAgICAgICBzZWxmLmRhdGFoYW5kbGVyID0gZGF0YWhhbmRsZXIKKyAgICAgICAgc2VsZi51aSA9IHVpCisgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgc2VsZi5kb25laGVhZGVycyA9IDAKKyAgICAgICAgc2VsZi5kb25lID0gMAorICAgICAgICBzZWxmLmhlYWRlcnMgPSBOb25lCisgICAgICAgIHNlbGYubGVuZ3RoID0gTm9uZQorICAgICAgICBzZWxmLnBvcyA9IDAKKworICAgIGRlZiBnZXRyZXBseShzZWxmKToKKyAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAiZ2V0cmVwbHkoKSBpcyBub3Qgc3VwcG9ydGVkIGluIGFzeW5jIEhUVFAgY29ubmVjdGlvbiIKKworICAgIGRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgYXNzZXJ0IG5vdCBzZWxmLmRvbmUKKyAgICAgICAgaWYgbm90IHNlbGYuZG9uZWhlYWRlcnM6CisgICAgICAgICAgICBzZWxmLmJ1ZiA9IHNlbGYuYnVmICsgZGF0YQorICAgICAgICAgICAgcG9zID0gc3RyaW5nLmZpbmQoc2VsZi5idWYsICJcclxuXHJcbiIpCisgICAgICAgICAgICBpZiBwb3MgPj0gMDoKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9yZXBseShzZWxmLmJ1Zls6cG9zKzRdKQorICAgICAgICAgICAgICAgIGxlbmd0aCA9IHNlbGYuaGVhZGVycy5nZXRoZWFkZXIoIkNvbnRlbnQtTGVuZ3RoIikKKyAgICAgICAgICAgICAgICBpZiBsZW5ndGggaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgICAgIHNlbGYubGVuZ3RoID0gaW50KGxlbmd0aCkKKyAgICAgICAgICAgICAgICAgICAgaWYgc2VsZi51aSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudWkuc2V0dG90YWwoc2VsZi5sZW5ndGgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5sZW5ndGggPSAtMQorICAgICAgICAgICAgICAgIHNlbGYuZG9uZWhlYWRlcnMgPSAxCisgICAgICAgICAgICAgICAgc2VsZi5oYW5kbGVfZGF0YShzZWxmLmJ1Zltwb3MrNDpdKQorICAgICAgICAgICAgICAgIHNlbGYuYnVmID0gIiIKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaGFuZGxlX2RhdGEoZGF0YSkKKworICAgIGRlZiBoYW5kbGVfcmVwbHkoc2VsZiwgZGF0YSk6CisgICAgICAgIGYgPSBjU3RyaW5nSU8uU3RyaW5nSU8oZGF0YSkKKyAgICAgICAgdmVyLCBjb2RlLCBtc2cgPSBzdHJpbmcuc3BsaXQoZi5yZWFkbGluZSgpLCBOb25lLCAyKQorICAgICAgICBjb2RlID0gaW50KGNvZGUpCisgICAgICAgIG1zZyA9IHN0cmluZy5zdHJpcChtc2cpCisgICAgICAgIGlmIGNvZGUgPD4gMjAwOgorICAgICAgICAgICAgIyBIbSwgdGhpcyBpcyB3aGF0ICpJKiBuZWVkLCBidXQgcHJvYmFibHkgbm90IGNvcnJlY3QuLi4KKyAgICAgICAgICAgIHJhaXNlIEhUVFBFcnJvciwgKGNvZGUsIG1zZykKKyAgICAgICAgc2VsZi5oZWFkZXJzID0gbWltZXRvb2xzLk1lc3NhZ2UoZikKKworICAgIGRlZiBoYW5kbGVfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgc2VsZi5wb3MgPSBzZWxmLnBvcyArIGxlbihkYXRhKQorICAgICAgICBpZiBzZWxmLnVpIGlzIG5vdCBOb25lOgorICAgICAgICAgICAgc2VsZi51aS5zZXRjdXJyZW50KHNlbGYucG9zKQorICAgICAgICBzZWxmLmRhdGFoYW5kbGVyKGRhdGEpCisgICAgICAgIGlmIHNlbGYucG9zID49IHNlbGYubGVuZ3RoOgorICAgICAgICAgICAgc2VsZi5kYXRhaGFuZGxlcigiIikKKyAgICAgICAgICAgIHNlbGYuZG9uZSA9IDEKKyAgICAgICAgICAgIGlmIHNlbGYudWkgaXMgbm90IE5vbmU6CisgICAgICAgICAgICAgICAgc2VsZi51aS5kb25lKCkKKworICAgIGRlZiBoYW5kbGVfZXJyb3Ioc2VsZiwgdHlwZSwgdmFsdWUsIHRiKToKKyAgICAgICAgaWYgc2VsZi51aSBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIHNlbGYudWkuZXJyb3IodHlwZSwgdmFsdWUsIHRiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgQ29ubmVjdGlvbi5oYW5kbGVfZXJyb3Ioc2VsZiwgdHlwZSwgdmFsdWUsIHRiKQorCisgICAgZGVmIGxvZyhzZWxmLCBtZXNzYWdlKToKKyAgICAgICAgaWYgVkVSQk9TRToKKyAgICAgICAgICAgIHByaW50ICdMT0c6JywgbWVzc2FnZQogCiAKIGNsYXNzIFB5TWVzc2FnZToKLQkKLQlkZWYgX19pbml0X18oc2VsZik6Ci0JCXNlbGYuX2J1ZiA9ICIiCi0JCXNlbGYuX2xlbiA9IE5vbmUKLQkJc2VsZi5fY2hlY2tzdW0gPSBOb25lCi0JCi0JZGVmIGZlZWQoc2VsZiwgZGF0YSk6Ci0JCXNlbGYuX2J1ZiA9IHNlbGYuX2J1ZiArIGRhdGEKLQkJaWYgc2VsZi5fbGVuIGlzIE5vbmU6Ci0JCQlpZiBsZW4oc2VsZi5fYnVmKSA+PSA4OgotCQkJCWltcG9ydCBzdHJ1Y3QKLQkJCQlzZWxmLl9sZW4sIHNlbGYuX2NoZWNrc3VtID0gc3RydWN0LnVucGFjaygibGwiLCBzZWxmLl9idWZbOjhdKQotCQkJCXNlbGYuX2J1ZiA9IHNlbGYuX2J1Zls4Ol0KLQkJaWYgc2VsZi5fbGVuIGlzIG5vdCBOb25lOgotCQkJaWYgbGVuKHNlbGYuX2J1ZikgPj0gc2VsZi5fbGVuOgotCQkJCWltcG9ydCB6bGliCi0JCQkJZGF0YSA9IHNlbGYuX2J1Zls6c2VsZi5fbGVuXQotCQkJCWxlZnRvdmVyID0gc2VsZi5fYnVmW3NlbGYuX2xlbjpdCi0JCQkJc2VsZi5fYnVmID0gTm9uZQotCQkJCWFzc2VydCBzZWxmLl9jaGVja3N1bSA9PSB6bGliLmFkbGVyMzIoZGF0YSksICJjb3JydXB0IGRhdGEiCi0JCQkJc2VsZi5kYXRhID0gZGF0YQotCQkJCXJldHVybiAxLCBsZWZ0b3ZlcgotCQkJZWxzZToKLQkJCQlyZXR1cm4gMCwgTm9uZQotCQllbHNlOgotCQkJcmV0dXJuIDAsIE5vbmUKKworICAgIGRlZiBfX2luaXRfXyhzZWxmKToKKyAgICAgICAgc2VsZi5fYnVmID0gIiIKKyAgICAgICAgc2VsZi5fbGVuID0gTm9uZQorICAgICAgICBzZWxmLl9jaGVja3N1bSA9IE5vbmUKKworICAgIGRlZiBmZWVkKHNlbGYsIGRhdGEpOgorICAgICAgICBzZWxmLl9idWYgPSBzZWxmLl9idWYgKyBkYXRhCisgICAgICAgIGlmIHNlbGYuX2xlbiBpcyBOb25lOgorICAgICAgICAgICAgaWYgbGVuKHNlbGYuX2J1ZikgPj0gODoKKyAgICAgICAgICAgICAgICBpbXBvcnQgc3RydWN0CisgICAgICAgICAgICAgICAgc2VsZi5fbGVuLCBzZWxmLl9jaGVja3N1bSA9IHN0cnVjdC51bnBhY2soImxsIiwgc2VsZi5fYnVmWzo4XSkKKyAgICAgICAgICAgICAgICBzZWxmLl9idWYgPSBzZWxmLl9idWZbODpdCisgICAgICAgIGlmIHNlbGYuX2xlbiBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl9idWYpID49IHNlbGYuX2xlbjoKKyAgICAgICAgICAgICAgICBpbXBvcnQgemxpYgorICAgICAgICAgICAgICAgIGRhdGEgPSBzZWxmLl9idWZbOnNlbGYuX2xlbl0KKyAgICAgICAgICAgICAgICBsZWZ0b3ZlciA9IHNlbGYuX2J1ZltzZWxmLl9sZW46XQorICAgICAgICAgICAgICAgIHNlbGYuX2J1ZiA9IE5vbmUKKyAgICAgICAgICAgICAgICBhc3NlcnQgc2VsZi5fY2hlY2tzdW0gPT0gemxpYi5hZGxlcjMyKGRhdGEpLCAiY29ycnVwdCBkYXRhIgorICAgICAgICAgICAgICAgIHNlbGYuZGF0YSA9IGRhdGEKKyAgICAgICAgICAgICAgICByZXR1cm4gMSwgbGVmdG92ZXIKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcmV0dXJuIDAsIE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAwLCBOb25lCiAKIAogY2xhc3MgUHlDb25uZWN0aW9uKENvbm5lY3Rpb24pOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3MpOgotCQlDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcykKLQkJc2VsZi5jdXJyZW50bWVzc2FnZSA9IFB5TWVzc2FnZSgpCi0JCi0JZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgotCQl3aGlsZSBkYXRhOgotCQkJZG9uZSwgZGF0YSA9IHNlbGYuY3VycmVudG1lc3NhZ2UuZmVlZChkYXRhKQotCQkJaWYgZG9uZToKLQkJCQlpbXBvcnQgY1BpY2tsZQotCQkJCXNlbGYuaGFuZGxlX29iamVjdChjUGlja2xlLmxvYWRzKHNlbGYuY3VycmVudG1lc3NhZ2UuZGF0YSkpCi0JCQkJc2VsZi5jdXJyZW50bWVzc2FnZSA9IFB5TWVzc2FnZSgpCi0JCi0JZGVmIGhhbmRsZV9vYmplY3Qoc2VsZiwgb2JqZWN0KToKLQkJcHJpbnQgJ3VuaGFuZGxlZCBvYmplY3Q6JywgcmVwcihvYmplY3QpCi0JCi0JZGVmIHNlbmQoc2VsZiwgb2JqZWN0KToKLQkJaW1wb3J0IGNQaWNrbGUsIHpsaWIsIHN0cnVjdAotCQlkYXRhID0gY1BpY2tsZS5kdW1wcyhvYmplY3QsIDEpCi0JCWxlbmd0aCA9IGxlbihkYXRhKQotCQljaGVja3N1bSA9IHpsaWIuYWRsZXIzMihkYXRhKQotCQlkYXRhID0gc3RydWN0LnBhY2soImxsIiwgbGVuZ3RoLCBjaGVja3N1bSkgKyBkYXRhCi0JCUNvbm5lY3Rpb24uc2VuZChzZWxmLCBkYXRhKQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcyk6CisgICAgICAgIENvbm5lY3Rpb24uX19pbml0X18oc2VsZiwgc29ja19vcl9hZGRyZXNzKQorICAgICAgICBzZWxmLmN1cnJlbnRtZXNzYWdlID0gUHlNZXNzYWdlKCkKKworICAgIGRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKKyAgICAgICAgd2hpbGUgZGF0YToKKyAgICAgICAgICAgIGRvbmUsIGRhdGEgPSBzZWxmLmN1cnJlbnRtZXNzYWdlLmZlZWQoZGF0YSkKKyAgICAgICAgICAgIGlmIGRvbmU6CisgICAgICAgICAgICAgICAgaW1wb3J0IGNQaWNrbGUKKyAgICAgICAgICAgICAgICBzZWxmLmhhbmRsZV9vYmplY3QoY1BpY2tsZS5sb2FkcyhzZWxmLmN1cnJlbnRtZXNzYWdlLmRhdGEpKQorICAgICAgICAgICAgICAgIHNlbGYuY3VycmVudG1lc3NhZ2UgPSBQeU1lc3NhZ2UoKQorCisgICAgZGVmIGhhbmRsZV9vYmplY3Qoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgcHJpbnQgJ3VuaGFuZGxlZCBvYmplY3Q6JywgcmVwcihvYmplY3QpCisKKyAgICBkZWYgc2VuZChzZWxmLCBvYmplY3QpOgorICAgICAgICBpbXBvcnQgY1BpY2tsZSwgemxpYiwgc3RydWN0CisgICAgICAgIGRhdGEgPSBjUGlja2xlLmR1bXBzKG9iamVjdCwgMSkKKyAgICAgICAgbGVuZ3RoID0gbGVuKGRhdGEpCisgICAgICAgIGNoZWNrc3VtID0gemxpYi5hZGxlcjMyKGRhdGEpCisgICAgICAgIGRhdGEgPSBzdHJ1Y3QucGFjaygibGwiLCBsZW5ndGgsIGNoZWNrc3VtKSArIGRhdGEKKyAgICAgICAgQ29ubmVjdGlvbi5zZW5kKHNlbGYsIGRhdGEpCiAKIAogY2xhc3MgRWNobyhDb25uZWN0aW9uKToKLQkKLQkiIiJTaW1wbGUgZWNob2luZyBjb25uZWN0aW9uOiBpdCBzZW5kcyBldmVyeXRoaW5nIGJhY2sgaXQgcmVjZWl2ZXMuIiIiIAotCQotCWRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKLQkJc2VsZi5zZW5kKGRhdGEpCisKKyAgICAiIiJTaW1wbGUgZWNob2luZyBjb25uZWN0aW9uOiBpdCBzZW5kcyBldmVyeXRoaW5nIGJhY2sgaXQgcmVjZWl2ZXMuIiIiCisKKyAgICBkZWYgaGFuZGxlX2luY29taW5nX2RhdGEoc2VsZiwgZGF0YSk6CisgICAgICAgIHNlbGYuc2VuZChkYXRhKQogCiAKIGNsYXNzIFByb3h5KENvbm5lY3Rpb24pOgotCQotCSIiIkdlbmVyaWMgcHJveHkgY29ubmVjdGlvbiIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3M9Tm9uZSwgcHJveHlhZGRyPU5vbmUsIGNsb3NlcGFydG5lcj0wKToKLQkJIiIiYXJndW1lbnRzOgotCQktIHNvY2tfb3JfYWRkcmVzcyBpcyBlaXRoZXIgYSBzb2NrZXQgb3IgYSB0dXBsZSBjb250YWluaW5nIHRoZSAKLQkJbmFtZSBhbmQgcG9ydCBudW1iZXIgb2YgYSByZW1vdGUgaG9zdAotCQktIHByb3h5YWRkcjogYSB0dXBsZSBjb250YWluaW5nIGEgbmFtZSBhbmQgYSBwb3J0IG51bWJlciBvZiBhIAotCQkgIHJlbW90ZSBob3N0IChvcHRpb25hbCkuCi0JCS0gY2xvc2VwYXJ0bmVyOiBib29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB3ZSBzaG91bGQgY2xvc2UKLQkJICB0aGUgcHJveHkgY29ubmVjdGlvbiAob3B0aW9uYWwpIiIiCi0JCQotCQlDb25uZWN0aW9uLl9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcykKLQkJc2VsZi5vdGhlciA9IE5vbmUKLQkJc2VsZi5wcm94eWFkZHIgPSBwcm94eWFkZHIKLQkJc2VsZi5jbG9zZXBhcnRuZXIgPSBjbG9zZXBhcnRuZXIKLQkKLQlkZWYgY2xvc2Uoc2VsZik6Ci0JCWlmIHNlbGYub3RoZXI6Ci0JCQlvdGhlciA9IHNlbGYub3RoZXIKLQkJCXNlbGYub3RoZXIgPSBOb25lCi0JCQlvdGhlci5vdGhlciA9IE5vbmUKLQkJCWlmIHNlbGYuY2xvc2VwYXJ0bmVyOgotCQkJCW90aGVyLmNsb3NlKCkKLQkJQ29ubmVjdGlvbi5jbG9zZShzZWxmKQotCQotCWRlZiBoYW5kbGVfaW5jb21pbmdfZGF0YShzZWxmLCBkYXRhKToKLQkJaWYgbm90IHNlbGYub3RoZXI6Ci0JCQkjIHBhc3MgZGF0YSBmb3IgcG9zc2libGUgYXV0b21hdGljIHJlbW90ZSBob3N0IGRldGVjdGlvbgotCQkJIyAoc2VlIEhUVFBQcm94eSkKLQkJCWRhdGEgPSBzZWxmLmNvbm5lY3Rwcm94eShkYXRhKQotCQlzZWxmLm90aGVyLnNlbmQoZGF0YSkKLQkKLQlkZWYgY29ubmVjdHByb3h5KHNlbGYsIGRhdGEpOgotCQlvdGhlciA9IHNlbGYuX19jbGFzc19fKHNlbGYucHJveHlhZGRyLCBjbG9zZXBhcnRuZXI9c2VsZi5jbG9zZXBhcnRuZXIpCi0JCXNlbGYub3RoZXIgPSBvdGhlcgotCQlvdGhlci5vdGhlciA9IHNlbGYKLQkJcmV0dXJuIGRhdGEKKworICAgICIiIkdlbmVyaWMgcHJveHkgY29ubmVjdGlvbiIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHNvY2tfb3JfYWRkcmVzcz1Ob25lLCBwcm94eWFkZHI9Tm9uZSwgY2xvc2VwYXJ0bmVyPTApOgorICAgICAgICAiIiJhcmd1bWVudHM6CisgICAgICAgIC0gc29ja19vcl9hZGRyZXNzIGlzIGVpdGhlciBhIHNvY2tldCBvciBhIHR1cGxlIGNvbnRhaW5pbmcgdGhlCisgICAgICAgIG5hbWUgYW5kIHBvcnQgbnVtYmVyIG9mIGEgcmVtb3RlIGhvc3QKKyAgICAgICAgLSBwcm94eWFkZHI6IGEgdHVwbGUgY29udGFpbmluZyBhIG5hbWUgYW5kIGEgcG9ydCBudW1iZXIgb2YgYQorICAgICAgICAgIHJlbW90ZSBob3N0IChvcHRpb25hbCkuCisgICAgICAgIC0gY2xvc2VwYXJ0bmVyOiBib29sZWFuLCBzcGVjaWZpZXMgd2hldGhlciB3ZSBzaG91bGQgY2xvc2UKKyAgICAgICAgICB0aGUgcHJveHkgY29ubmVjdGlvbiAob3B0aW9uYWwpIiIiCisKKyAgICAgICAgQ29ubmVjdGlvbi5fX2luaXRfXyhzZWxmLCBzb2NrX29yX2FkZHJlc3MpCisgICAgICAgIHNlbGYub3RoZXIgPSBOb25lCisgICAgICAgIHNlbGYucHJveHlhZGRyID0gcHJveHlhZGRyCisgICAgICAgIHNlbGYuY2xvc2VwYXJ0bmVyID0gY2xvc2VwYXJ0bmVyCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIHNlbGYub3RoZXI6CisgICAgICAgICAgICBvdGhlciA9IHNlbGYub3RoZXIKKyAgICAgICAgICAgIHNlbGYub3RoZXIgPSBOb25lCisgICAgICAgICAgICBvdGhlci5vdGhlciA9IE5vbmUKKyAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VwYXJ0bmVyOgorICAgICAgICAgICAgICAgIG90aGVyLmNsb3NlKCkKKyAgICAgICAgQ29ubmVjdGlvbi5jbG9zZShzZWxmKQorCisgICAgZGVmIGhhbmRsZV9pbmNvbWluZ19kYXRhKHNlbGYsIGRhdGEpOgorICAgICAgICBpZiBub3Qgc2VsZi5vdGhlcjoKKyAgICAgICAgICAgICMgcGFzcyBkYXRhIGZvciBwb3NzaWJsZSBhdXRvbWF0aWMgcmVtb3RlIGhvc3QgZGV0ZWN0aW9uCisgICAgICAgICAgICAjIChzZWUgSFRUUFByb3h5KQorICAgICAgICAgICAgZGF0YSA9IHNlbGYuY29ubmVjdHByb3h5KGRhdGEpCisgICAgICAgIHNlbGYub3RoZXIuc2VuZChkYXRhKQorCisgICAgZGVmIGNvbm5lY3Rwcm94eShzZWxmLCBkYXRhKToKKyAgICAgICAgb3RoZXIgPSBzZWxmLl9fY2xhc3NfXyhzZWxmLnByb3h5YWRkciwgY2xvc2VwYXJ0bmVyPXNlbGYuY2xvc2VwYXJ0bmVyKQorICAgICAgICBzZWxmLm90aGVyID0gb3RoZXIKKyAgICAgICAgb3RoZXIub3RoZXIgPSBzZWxmCisgICAgICAgIHJldHVybiBkYXRhCiAKIAogY2xhc3MgSFRUUFByb3h5KFByb3h5KToKLQkKLQkiIiJTaW1wbGUsIHVzZWxlc3MsIGh0dHAgcHJveHkuIEl0IGZpZ3VyZXMgb3V0IGl0c2VsZiB3aGVyZSB0byBjb25uZWN0IHRvLiIiIgotCQotCWRlZiBjb25uZWN0cHJveHkoc2VsZiwgZGF0YSk6Ci0JCWlmIFZFUkJPU0U6Ci0JCQlwcmludCAiLS0tIHByb3h5IHJlcXVlc3QiLCByZXByKGRhdGEpCi0JCWFkZHIsIGRhdGEgPSBkZV9wcm94aWZ5KGRhdGEpCi0JCW90aGVyID0gUHJveHkoYWRkcikKLQkJc2VsZi5vdGhlciA9IG90aGVyCi0JCW90aGVyLm90aGVyID0gc2VsZgotCQlyZXR1cm4gZGF0YQorCisgICAgIiIiU2ltcGxlLCB1c2VsZXNzLCBodHRwIHByb3h5LiBJdCBmaWd1cmVzIG91dCBpdHNlbGYgd2hlcmUgdG8gY29ubmVjdCB0by4iIiIKKworICAgIGRlZiBjb25uZWN0cHJveHkoc2VsZiwgZGF0YSk6CisgICAgICAgIGlmIFZFUkJPU0U6CisgICAgICAgICAgICBwcmludCAiLS0tIHByb3h5IHJlcXVlc3QiLCByZXByKGRhdGEpCisgICAgICAgIGFkZHIsIGRhdGEgPSBkZV9wcm94aWZ5KGRhdGEpCisgICAgICAgIG90aGVyID0gUHJveHkoYWRkcikKKyAgICAgICAgc2VsZi5vdGhlciA9IG90aGVyCisgICAgICAgIG90aGVyLm90aGVyID0gc2VsZgorICAgICAgICByZXR1cm4gZGF0YQogCiAKICMgaGVscGVyIGZvciBIVFRQUHJveHkKIGRlZiBkZV9wcm94aWZ5KGRhdGEpOgotCWltcG9ydCByZQotCXJlcV9wYXR0ZXJuID0gIkdFVCBodHRwOi8vKFthLXpBLVowLTktXy5dKykoOihbMC05XSspKT8iCi0JbSA9IHJlLm1hdGNoKHJlcV9wYXR0ZXJuLCBkYXRhKQotCWhvc3QsIGR1bW15LCBwb3J0ID0gbS5ncm91cHMoKQotCWlmIG5vdCBwb3J0OgotCQlwb3J0ID0gODAKLQllbHNlOgotCQlwb3J0ID0gaW50KHBvcnQpCi0JIyBjaGFuZ2UgIkdFVCBodHRwOi8veHgueHgueHgveXkiIGludG8gIkdFVCAveXkiCi0JZGF0YSA9IHJlLnN1YihyZXFfcGF0dGVybiwgIkdFVCAiLCBkYXRhKQotCXJldHVybiAoaG9zdCwgcG9ydCksIGRhdGEKKyAgICBpbXBvcnQgcmUKKyAgICByZXFfcGF0dGVybiA9ICJHRVQgaHR0cDovLyhbYS16QS1aMC05LV8uXSspKDooWzAtOV0rKSk/IgorICAgIG0gPSByZS5tYXRjaChyZXFfcGF0dGVybiwgZGF0YSkKKyAgICBob3N0LCBkdW1teSwgcG9ydCA9IG0uZ3JvdXBzKCkKKyAgICBpZiBub3QgcG9ydDoKKyAgICAgICAgcG9ydCA9IDgwCisgICAgZWxzZToKKyAgICAgICAgcG9ydCA9IGludChwb3J0KQorICAgICMgY2hhbmdlICJHRVQgaHR0cDovL3h4Lnh4Lnh4L3l5IiBpbnRvICJHRVQgL3l5IgorICAgIGRhdGEgPSByZS5zdWIocmVxX3BhdHRlcm4sICJHRVQgIiwgZGF0YSkKKyAgICByZXR1cm4gKGhvc3QsIHBvcnQpLCBkYXRhCiAKIAogIyBpZiB3ZSdyZSBydW5uaW5nICJ1bmRlciBXIiwgbGV0J3MgcmVnaXN0ZXIgdGhlIHNvY2tldCBwb2xsZXIgdG8gdGhlIGV2ZW50IGxvb3AKIHRyeToKLQlpbXBvcnQgVworICAgIGltcG9ydCBXCiBleGNlcHQ6Ci0JcGFzcworICAgIHBhc3MKIGVsc2U6Ci0JVy5nZXRhcHBsaWNhdGlvbigpLmFkZGlkbGVmdW5jKGFzeW5jb3JlLnBvbGwpCisgICAgVy5nZXRhcHBsaWNhdGlvbigpLmFkZGlkbGVmdW5jKGFzeW5jb3JlLnBvbGwpCiAKIAogIyMgdGVzdGluZyBtdWNrCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1d0ZXh0LnB5IGIvTWFjL1Rvb2xzL0lERS9XdGV4dC5weQppbmRleCAzODk0ZTE2Li5iM2QyZjhlIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvSURFL1d0ZXh0LnB5CisrKyBiL01hYy9Ub29scy9JREUvV3RleHQucHkKQEAgLTE0LDY0MCArMTQsNjQwIEBACiAKIAogY2xhc3MgVGV4dEJveChXYmFzZS5XaWRnZXQpOgotCQotCSIiIkEgc3RhdGljIHRleHQgd2lkZ2V0IiIiCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQ9IiIsIGFsaWduPVRleHRFZGl0LnRlSnVzdExlZnQsIAotCQkJCWZvbnRzZXR0aW5ncz1Ob25lLAotCQkJCWJhY2tncm91bmRjb2xvcj0oMHhmZmZmLCAweGZmZmYsIDB4ZmZmZikKLQkJCQkpOgotCQlpZiBmb250c2V0dGluZ3MgaXMgTm9uZToKLQkJCWltcG9ydCBXCi0JCQlmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKLQkJV2Jhc2UuV2lkZ2V0Ll9faW5pdF9fKHNlbGYsIHBvc3NpemUpCi0JCXNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCXNlbGYudGV4dCA9IHRleHQKLQkJc2VsZi5hbGlnbiA9IGFsaWduCi0JCXNlbGYuX2JhY2tncm91bmRjb2xvciA9IGJhY2tncm91bmRjb2xvcgotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmZvbnRzZXR0aW5ncwotCQkJZm9udGlkID0gR2V0Rk51bShmb250KQotCQkJc2F2ZXN0YXRlID0gUWQuR2V0UGVuU3RhdGUoKQotCQkJUWQuVGV4dEZvbnQoZm9udGlkKQotCQkJUWQuVGV4dEZhY2Uoc3R5bGUpCi0JCQlRZC5UZXh0U2l6ZShzaXplKQotCQkJUWQuUkdCRm9yZUNvbG9yKGNvbG9yKQotCQkJUWQuUkdCQmFja0NvbG9yKHNlbGYuX2JhY2tncm91bmRjb2xvcikKLQkJCVRFLlRFVGV4dEJveChzZWxmLnRleHQsIHNlbGYuX2JvdW5kcywgc2VsZi5hbGlnbikKLQkJCVFkLlJHQkJhY2tDb2xvcigoMHhmZmZmLCAweGZmZmYsIDB4ZmZmZikpCi0JCQlRZC5TZXRQZW5TdGF0ZShzYXZlc3RhdGUpCi0JCi0JZGVmIGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYudGV4dAotCQotCWRlZiBzZXQoc2VsZiwgdGV4dCk6Ci0JCXNlbGYudGV4dCA9IHRleHQKLQkJaWYgc2VsZi5fcGFyZW50d2luZG93IGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cud2lkOgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCXNlbGYuZHJhdygpCisKKyAgICAiIiJBIHN0YXRpYyB0ZXh0IHdpZGdldCIiIgorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQ9IiIsIGFsaWduPVRleHRFZGl0LnRlSnVzdExlZnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udHNldHRpbmdzPU5vbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFja2dyb3VuZGNvbG9yPSgweGZmZmYsIDB4ZmZmZiwgMHhmZmZmKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICk6CisgICAgICAgIGlmIGZvbnRzZXR0aW5ncyBpcyBOb25lOgorICAgICAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgICAgIGZvbnRzZXR0aW5ncyA9IFcuZ2V0ZGVmYXVsdGZvbnQoKQorICAgICAgICBXYmFzZS5XaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi5mb250c2V0dGluZ3MgPSBmb250c2V0dGluZ3MKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBzZWxmLmFsaWduID0gYWxpZ24KKyAgICAgICAgc2VsZi5fYmFja2dyb3VuZGNvbG9yID0gYmFja2dyb3VuZGNvbG9yCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgaWYgc2VsZi5fdmlzaWJsZToKKyAgICAgICAgICAgIChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpID0gc2VsZi5mb250c2V0dGluZ3MKKyAgICAgICAgICAgIGZvbnRpZCA9IEdldEZOdW0oZm9udCkKKyAgICAgICAgICAgIHNhdmVzdGF0ZSA9IFFkLkdldFBlblN0YXRlKCkKKyAgICAgICAgICAgIFFkLlRleHRGb250KGZvbnRpZCkKKyAgICAgICAgICAgIFFkLlRleHRGYWNlKHN0eWxlKQorICAgICAgICAgICAgUWQuVGV4dFNpemUoc2l6ZSkKKyAgICAgICAgICAgIFFkLlJHQkZvcmVDb2xvcihjb2xvcikKKyAgICAgICAgICAgIFFkLlJHQkJhY2tDb2xvcihzZWxmLl9iYWNrZ3JvdW5kY29sb3IpCisgICAgICAgICAgICBURS5URVRleHRCb3goc2VsZi50ZXh0LCBzZWxmLl9ib3VuZHMsIHNlbGYuYWxpZ24pCisgICAgICAgICAgICBRZC5SR0JCYWNrQ29sb3IoKDB4ZmZmZiwgMHhmZmZmLCAweGZmZmYpKQorICAgICAgICAgICAgUWQuU2V0UGVuU3RhdGUoc2F2ZXN0YXRlKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGV4dAorCisgICAgZGVmIHNldChzZWxmLCB0ZXh0KToKKyAgICAgICAgc2VsZi50ZXh0ID0gdGV4dAorICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy53aWQ6CisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgc2VsZi5kcmF3KCkKIAogCiBjbGFzcyBfU2Nyb2xsV2lkZ2V0OgotCQotCSMgdG8gYmUgb3ZlcnJpZGRlbgotCWRlZiBnZXRzY3JvbGxyZWN0cyhzZWxmKToKLQkJIiIiUmV0dXJuIChkZXN0cmVjdCwgdmlld3JlY3QpLiIiIgotCQlyZXR1cm4gTm9uZSwgTm9uZQotCQotCSMgaW50ZXJuYWwgbWV0aG9kCi0JCi0JZGVmIHVwZGF0ZXNjcm9sbGJhcnMoc2VsZik6Ci0JCShkbCwgZHQsIGRyLCBkYiksICh2bCwgdnQsIHZyLCB2YikgPSBzZWxmLmdldHNjcm9sbHJlY3RzKCkKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ4OgotCQkJdmlld3dpZHRoID0gdnIgLSB2bAotCQkJZGVzdHdpZHRoID0gZHIgLSBkbAotCQkJYmFyID0gc2VsZi5fcGFyZW50Ll9iYXJ4Ci0JCQliYXIuc2V0bWF4KGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkKLQkJCQotCQkJIyBNYWNPUyA4LjEgZG9lc24ndCBhdXRvbWF0aWNhbGx5IGRpc2FibGUKLQkJCSMgc2Nyb2xsYmFycyB3aG9zZSBtYXggPD0gbWluCi0JCQliYXIuZW5hYmxlKGRlc3R3aWR0aCA+IHZpZXd3aWR0aCkKLQkJCQotCQkJYmFyLnNldHZpZXdzaXplKHZpZXd3aWR0aCkKLQkJCWJhci5zZXQodmwgLSBkbCkKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5OgotCQkJdmlld2hlaWdodCA9IHZiIC0gdnQKLQkJCWRlc3RoZWlnaHQgPSBkYiAtIGR0Ci0JCQliYXIgPSBzZWxmLl9wYXJlbnQuX2JhcnkKLQkJCWJhci5zZXRtYXgoZGVzdGhlaWdodCAtIHZpZXdoZWlnaHQpCi0JCQkKLQkJCSMgTWFjT1MgOC4xIGRvZXNuJ3QgYXV0b21hdGljYWxseSBkaXNhYmxlCi0JCQkjIHNjcm9sbGJhcnMgd2hvc2UgbWF4IDw9IG1pbgotCQkJYmFyLmVuYWJsZShkZXN0aGVpZ2h0ID4gdmlld2hlaWdodCkKLQkJCQotCQkJYmFyLnNldHZpZXdzaXplKHZpZXdoZWlnaHQpCi0JCQliYXIuc2V0KHZ0IC0gZHQpCisKKyAgICAjIHRvIGJlIG92ZXJyaWRkZW4KKyAgICBkZWYgZ2V0c2Nyb2xscmVjdHMoc2VsZik6CisgICAgICAgICIiIlJldHVybiAoZGVzdHJlY3QsIHZpZXdyZWN0KS4iIiIKKyAgICAgICAgcmV0dXJuIE5vbmUsIE5vbmUKKworICAgICMgaW50ZXJuYWwgbWV0aG9kCisKKyAgICBkZWYgdXBkYXRlc2Nyb2xsYmFycyhzZWxmKToKKyAgICAgICAgKGRsLCBkdCwgZHIsIGRiKSwgKHZsLCB2dCwgdnIsIHZiKSA9IHNlbGYuZ2V0c2Nyb2xscmVjdHMoKQorICAgICAgICBpZiBzZWxmLl9wYXJlbnQuX2Jhcng6CisgICAgICAgICAgICB2aWV3d2lkdGggPSB2ciAtIHZsCisgICAgICAgICAgICBkZXN0d2lkdGggPSBkciAtIGRsCisgICAgICAgICAgICBiYXIgPSBzZWxmLl9wYXJlbnQuX2JhcngKKyAgICAgICAgICAgIGJhci5zZXRtYXgoZGVzdHdpZHRoIC0gdmlld3dpZHRoKQorCisgICAgICAgICAgICAjIE1hY09TIDguMSBkb2Vzbid0IGF1dG9tYXRpY2FsbHkgZGlzYWJsZQorICAgICAgICAgICAgIyBzY3JvbGxiYXJzIHdob3NlIG1heCA8PSBtaW4KKyAgICAgICAgICAgIGJhci5lbmFibGUoZGVzdHdpZHRoID4gdmlld3dpZHRoKQorCisgICAgICAgICAgICBiYXIuc2V0dmlld3NpemUodmlld3dpZHRoKQorICAgICAgICAgICAgYmFyLnNldCh2bCAtIGRsKQorICAgICAgICBpZiBzZWxmLl9wYXJlbnQuX2Jhcnk6CisgICAgICAgICAgICB2aWV3aGVpZ2h0ID0gdmIgLSB2dAorICAgICAgICAgICAgZGVzdGhlaWdodCA9IGRiIC0gZHQKKyAgICAgICAgICAgIGJhciA9IHNlbGYuX3BhcmVudC5fYmFyeQorICAgICAgICAgICAgYmFyLnNldG1heChkZXN0aGVpZ2h0IC0gdmlld2hlaWdodCkKKworICAgICAgICAgICAgIyBNYWNPUyA4LjEgZG9lc24ndCBhdXRvbWF0aWNhbGx5IGRpc2FibGUKKyAgICAgICAgICAgICMgc2Nyb2xsYmFycyB3aG9zZSBtYXggPD0gbWluCisgICAgICAgICAgICBiYXIuZW5hYmxlKGRlc3RoZWlnaHQgPiB2aWV3aGVpZ2h0KQorCisgICAgICAgICAgICBiYXIuc2V0dmlld3NpemUodmlld2hlaWdodCkKKyAgICAgICAgICAgIGJhci5zZXQodnQgLSBkdCkKIAogCi1VTkRPTEFCRUxTID0gWwkjIEluZGV4ZWQgYnkgV0VHZXRVbmRvSW5mbygpIHZhbHVlCi0JTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiLAotCSJSdWxlciIsICJiYWNrc3BhY2UiLCAiZGVsZXRlIiwgInRyYW5zZm9ybSIsICJyZXNpemUiXQorVU5ET0xBQkVMUyA9IFsgICMgSW5kZXhlZCBieSBXRUdldFVuZG9JbmZvKCkgdmFsdWUKKyAgICAgICAgTm9uZSwgIiIsICJ0eXBpbmciLCAiQ3V0IiwgIlBhc3RlIiwgIkNsZWFyIiwgIkRyYWciLCAiU3R5bGUiLAorICAgICAgICAiUnVsZXIiLCAiYmFja3NwYWNlIiwgImRlbGV0ZSIsICJ0cmFuc2Zvcm0iLCAicmVzaXplIl0KIAogCiBjbGFzcyBFZGl0VGV4dChXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LCBfU2Nyb2xsV2lkZ2V0KToKLQkKLQkiIiJBIHRleHQgZWRpdCB3aWRnZXQsIG1haW5seSBmb3Igc2ltcGxlIGVudHJ5IGZpZWxkcy4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgCi0JCQkJY2FsbGJhY2s9Tm9uZSwgaW5zZXQ9KDMsIDMpLCAKLQkJCQlmb250c2V0dGluZ3M9Tm9uZSwKLQkJCQl0YWJzZXR0aW5ncyA9ICgzMiwgMCksCi0JCQkJcmVhZG9ubHkgPSAwKToKLQkJaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6Ci0JCQlpbXBvcnQgVwotCQkJZm9udHNldHRpbmdzID0gVy5nZXRkZWZhdWx0Zm9udCgpCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKLQkJc2VsZi50ZW1wdGV4dCA9IHRleHQKLQkJc2VsZi50ZWQgPSBOb25lCi0JCXNlbGYuc2VsZWN0aW9uID0gTm9uZQotCQlzZWxmLm9sZHNlbGVjdGlvbiA9IE5vbmUKLQkJc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjawotCQlzZWxmLmNoYW5nZWQgPSAwCi0JCXNlbGYuc2VsY2hhbmdlZCA9IDAKLQkJc2VsZi5fc2VsZWN0ZWQgPSAwCi0JCXNlbGYuX2VuYWJsZWQgPSAxCi0JCXNlbGYud3JhcCA9IDEKLQkJc2VsZi5yZWFkb25seSA9IHJlYWRvbmx5Ci0JCXNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCXNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncwotCQlpZiB0eXBlKGluc2V0KSA8PiBUdXBsZVR5cGU6Ci0JCQlzZWxmLmluc2V0ID0gKGluc2V0LCBpbnNldCkKLQkJZWxzZToKLQkJCXNlbGYuaW5zZXQgPSBpbnNldAotCQotCWRlZiBvcGVuKHNlbGYpOgotCQlpZiBub3QgaGFzYXR0cihzZWxmLl9wYXJlbnQsICJfYmFyeCIpOgotCQkJc2VsZi5fcGFyZW50Ll9iYXJ4ID0gTm9uZQotCQlpZiBub3QgaGFzYXR0cihzZWxmLl9wYXJlbnQsICJfYmFyeSIpOgotCQkJc2VsZi5fcGFyZW50Ll9iYXJ5ID0gTm9uZQotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJdmlld3JlY3QsIGRlc3RyZWN0ID0gc2VsZi5fY2FsY3RleHRib3VuZHMoKQotCQlmbGFncyA9IHNlbGYuX2dldGZsYWdzKCkKLQkJc2VsZi50ZWQgPSB3YXN0ZS5XRU5ldyhkZXN0cmVjdCwgdmlld3JlY3QsIGZsYWdzKQotCQlzZWxmLnRlZC5XRUluc3RhbGxUYWJIb29rcygpCi0JCXNlbGYudGVkLldFU2V0QWxpZ25tZW50KFdBU1RFY29uc3Qud2VGbHVzaExlZnQpCi0JCXNlbGYuc2V0Zm9udHNldHRpbmdzKHNlbGYuZm9udHNldHRpbmdzKQotCQlzZWxmLnNldHRhYnNldHRpbmdzKHNlbGYudGFic2V0dGluZ3MpCi0JCXNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2Uoc2VsZi50ZW1wdGV4dCkpCi0JCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCWlmIHNlbGYuc2VsZWN0aW9uOgotCQkJc2VsZi5zZXRzZWxlY3Rpb24oc2VsZi5zZWxlY3Rpb25bMF0sIHNlbGYuc2VsZWN0aW9uWzFdKQotCQkJc2VsZi5zZWxlY3Rpb24gPSBOb25lCi0JCWVsc2U6Ci0JCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnRlbXB0ZXh0ID0gTm9uZQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLmJpbmQoInBhZ2V1cCIsIHNlbGYuc2Nyb2xscGFnZXVwKQotCQlzZWxmLmJpbmQoInBhZ2Vkb3duIiwgc2VsZi5zY3JvbGxwYWdlZG93bikKLQkJc2VsZi5iaW5kKCJ0b3AiLCBzZWxmLnNjcm9sbHRvcCkKLQkJc2VsZi5iaW5kKCJib3R0b20iLCBzZWxmLnNjcm9sbGJvdHRvbSkKLQkJc2VsZi5zZWxjaGFuZ2VkID0gMAotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5fcGFyZW50Ll9iYXJ4ID0gTm9uZQotCQlzZWxmLl9wYXJlbnQuX2JhcnkgPSBOb25lCi0JCXNlbGYudGVkID0gTm9uZQotCQlzZWxmLnRlbXB0ZXh0ID0gTm9uZQotCQlXYmFzZS5TZWxlY3RhYmxlV2lkZ2V0LmNsb3NlKHNlbGYpCi0JCi0JZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKLQkJc2VsZi5jaGFuZ2VkID0gMQotCQotCWRlZiBzZWxlY3Rpb25jaGFuZ2VkKHNlbGYpOgotCQlzZWxmLnNlbGNoYW5nZWQgPSAxCi0JCXNlbGYub2xkc2VsZWN0aW9uID0gc2VsZi5nZXRzZWxlY3Rpb24oKQotCQotCWRlZiBnZXR0YWJzZXR0aW5ncyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGFic2V0dGluZ3MKLQkKLQlkZWYgc2V0dGFic2V0dGluZ3Moc2VsZiwgKHRhYnNpemUsIHRhYm1vZGUpKToKLQkJc2VsZi50YWJzZXR0aW5ncyA9ICh0YWJzaXplLCB0YWJtb2RlKQotCQlpZiBoYXNhdHRyKHNlbGYudGVkLCAiV0VTZXRUYWJTaXplIik6Ci0JCQlwb3J0ID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkKLQkJCWlmIHRhYm1vZGU6Ci0JCQkJKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmdldGZvbnRzZXR0aW5ncygpCi0JCQkJc2F2ZXNldHRpbmdzID0gR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQotCQkJCVNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIHN0eWxlLCBzaXplKSkKLQkJCQl0YWJzaXplID0gUWQuU3RyaW5nV2lkdGgoJyAnICogdGFic2l6ZSkKLQkJCQlTZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKLQkJCXRhYnNpemUgPSBtYXgodGFic2l6ZSwgMSkKLQkJCXNlbGYudGVkLldFU2V0VGFiU2l6ZSh0YWJzaXplKQotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCVFkLkVyYXNlUmVjdChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkpCi0JCQlzZWxmLnRlZC5XRVVwZGF0ZShwb3J0LnZpc1JnbikKLQkKLQlkZWYgZ2V0Zm9udHNldHRpbmdzKHNlbGYpOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgUmVzCi0JCShmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpID0gc2VsZi50ZWQuV0VHZXRSdW5JbmZvKDApWzRdCi0JCWZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQotCQlyZXR1cm4gKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikKLQkKLQlkZWYgc2V0Zm9udHNldHRpbmdzKHNlbGYsIChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJaWYgdHlwZShmb250KSA8PiBTdHJpbmdUeXBlOgotCQkJZm9udCA9IEZtLkdldEZvbnROYW1lKGZvbnQpCi0JCXNlbGYuZm9udHNldHRpbmdzID0gKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikKLQkJZm9udGlkID0gR2V0Rk51bShmb250KQotCQlyZWFkb25seSA9IHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgLTEpCi0JCWlmIHJlYWRvbmx5OgotCQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAwKQotCQl0cnk6Ci0JCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGSW5oaWJpdFJlY2FsLCAxKQotCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKDAsIHNlbGYudGVkLldFR2V0VGV4dExlbmd0aCgpKQotCQkJc2VsZi50ZWQuV0VTZXRTdHlsZShXQVNURWNvbnN0LndlRG9GYWNlLCAoMCwgMCwgMCwgKDAsIDAsIDApKSkKLQkJCXNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSB8IAotCQkJCQkJV0FTVEVjb25zdC53ZURvQ29sb3IgfCAKLQkJCQkJCVdBU1RFY29uc3Qud2VEb0ZvbnQgfCAKLQkJCQkJCVdBU1RFY29uc3Qud2VEb1NpemUsIAotCQkJCQkJKGZvbnRpZCwgc3R5bGUsIHNpemUsIGNvbG9yKSkKLQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDApCi0JCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJZmluYWxseToKLQkJCWlmIHJlYWRvbmx5OgotCQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMSkKLQkJdmlld3JlY3QgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJUWQuRXJhc2VSZWN0KHZpZXdyZWN0KQotCQlzZWxmLnRlZC5XRVVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIGFkanVzdChzZWxmLCBvbGRib3VuZHMpOgotCQlzZWxmLlNldFBvcnQoKQotCQkjIE5vdGU6IGlmIEFwcC5EcmF3VGhlbWVFZGl0VGV4dEZyYW1lIGlzIGV2ZXIgdXNlZCwgaXQgd2lsbCBiZSBuZWNlc3NhcnkKLQkJIyB0byB1bmNvbmRpdGlvbmFsbHkgb3V0c2V0IHRoZSBpbnZhbGlkYXRlZCByZWN0YW5nbGVzLCBzaW5jZSBBcHBlYXJhbmNlCi0JCSMgZnJhbWVzIGFyZSBkcmF3biBvdXRzaWRlIHRoZSBib3VuZHMuCi0JCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9wYXJlbnR3aW5kb3cuX2hhc3NlbGZyYW1lczoKLQkJCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChvbGRib3VuZHMsIC0zLCAtMykpCi0JCQlzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCAtMywgLTMpKQotCQllbHNlOgotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qob2xkYm91bmRzKQotCQkJc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3Qoc2VsZi5fYm91bmRzKQotCQl2aWV3cmVjdCwgZGVzdHJlY3QgPSBzZWxmLl9jYWxjdGV4dGJvdW5kcygpCi0JCXNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCi0JCXNlbGYudGVkLldFU2V0RGVzdFJlY3QoZGVzdHJlY3QpCi0JCWlmIHNlbGYud3JhcDoKLQkJCXNlbGYudGVkLldFQ2FsVGV4dCgpCi0JCWlmIHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKVszXSA8IHZpZXdyZWN0WzFdOgotCQkJc2VsZi5zZWx2aWV3KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQkjIGludGVyZmFjZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCSMgc2VsZWN0aW9uIHN0dWZmCi0JZGVmIHNlbHZpZXcoc2VsZik6Ci0JCXNlbGYudGVkLldFU2VsVmlldygpCi0JCi0JZGVmIHNlbGVjdGFsbChzZWxmKToKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwgc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIHNlbGVjdGxpbmUoc2VsZiwgbGluZW5vLCBjaGFyb2Zmc2V0ID0gMCk6Ci0JCW5ld3NlbHN0YXJ0LCBuZXdzZWxlbmQgPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShsaW5lbm8pCi0JCSMgQXV0b3Njcm9sbCBtYWtlcyB0aGUgKmVuZCogb2YgdGhlIHNlbGVjdGlvbiB2aXNpYmxlLCB3aGljaCwgCi0JCSMgaW4gdGhlIGNhc2Ugb2YgYSB3aG9sZSBsaW5lLCBpcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSAqbmV4dCogbGluZS4gCi0JCSMgU28gc29tZXRpbWVzIGl0IGxlYXZlcyBvdXIgbGluZSBqdXN0IGFib3ZlIHRoZSB2aWV3IHJlY3QuIAotCQkjIExldCdzIGZvb2wgV2FzdGUgYnkgaW5pdGlhbGx5IHNlbGVjdGluZyBvbmUgY2hhciBsZXNzOgotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCArIGNoYXJvZmZzZXQsIG5ld3NlbGVuZC0xKQotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCArIGNoYXJvZmZzZXQsIG5ld3NlbGVuZCkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQlkZWYgZ2V0c2VsZWN0aW9uKHNlbGYpOgotCQlpZiBzZWxmLnRlZDoKLQkJCXJldHVybiBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCWVsc2U6Ci0JCQlyZXR1cm4gc2VsZi5zZWxlY3Rpb24KLQkKLQlkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgotCQlzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQotCQlpZiBzZWxmLnRlZDoKLQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCQlzZWxmLnRlZC5XRVNlbFZpZXcoKQotCQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJZWxzZToKLQkJCXNlbGYuc2VsZWN0aW9uID0gc2Vsc3RhcnQsIHNlbGVuZAotCQotCWRlZiBvZmZzZXR0b2xpbmUoc2VsZiwgb2Zmc2V0KToKLQkJcmV0dXJuIHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKG9mZnNldCkKLQkKLQlkZWYgY291bnRsaW5lcyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFQ291bnRMaW5lcygpCi0JCi0JZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGFbc2Vsc3RhcnQ6c2VsZW5kXQotCQotCWRlZiBleHBhbmRzZWxlY3Rpb24oc2VsZik6Ci0JCW9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4ob2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCksIG1heChvbGRzZWxzdGFydCwgb2xkc2VsZW5kKQotCQlpZiBzZWxzdGFydCA8PiBzZWxlbmQgYW5kIGNocihzZWxmLnRlZC5XRUdldENoYXIoc2VsZW5kLTEpKSA9PSAnXHInOgotCQkJc2VsZW5kID0gc2VsZW5kIC0gMQotCQluZXdzZWxzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUZpbmRMaW5lKHNlbHN0YXJ0LCAxKQotCQlkdW1teSwgbmV3c2VsZW5kID0gc2VsZi50ZWQuV0VGaW5kTGluZShzZWxlbmQsIDEpCi0JCWlmIG9sZHNlbHN0YXJ0IDw+IG5ld3NlbHN0YXJ0IG9yICBvbGRzZWxlbmQgPD4gbmV3c2VsZW5kOgotCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24obmV3c2Vsc3RhcnQsIG5ld3NlbGVuZCkKLQkJCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCi0JZGVmIGluc2VydChzZWxmLCB0ZXh0KToKLQkJc2VsZi50ZWQuV0VJbnNlcnQodGV4dCwgTm9uZSwgTm9uZSkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCi0JIyB0ZXh0Ci0JZGVmIHNldChzZWxmLCB0ZXh0KToKLQkJaWYgbm90IHNlbGYudGVkOgotCQkJc2VsZi50ZW1wdGV4dCA9IHRleHQKLQkJZWxzZToKLQkJCXNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UodGV4dCkpCi0JCQlzZWxmLnRlZC5XRUNhbFRleHQoKQotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCXZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKLQkJCXNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCi0JCQlzZWxmLnRlZC5XRVNldERlc3RSZWN0KGRlc3RyZWN0KQotCQkJcmduID0gUWQuTmV3UmduKCkKLQkJCVFkLlJlY3RSZ24ocmduLCB2aWV3cmVjdCkKLQkJCVFkLkVyYXNlUmVjdCh2aWV3cmVjdCkKLQkJCXNlbGYuZHJhdyhyZ24pCi0JCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkJc2VsZi50ZXh0Y2hhbmdlZCgxKQotCQotCWRlZiBnZXQoc2VsZik6Ci0JCWlmIG5vdCBzZWxmLl9wYXJlbnQ6Ci0JCQlyZXR1cm4gc2VsZi50ZW1wdGV4dAotCQllbHNlOgotCQkJcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGEKLQkKLQkjIGV2ZW50cwotCWRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlpZiBzZWxmLl9lbmFibGVkIGFuZCBub3QgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleSBvciBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKLQkJCXNlbGYudGVkLldFS2V5KG9yZChjaGFyKSwgbW9kaWZpZXJzKQotCQkJaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6Ci0JCQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCQlpZiBjaGFyIG5vdCBpbiBXa2V5cy5zY3JvbGxrZXlzOgotCQkJCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCBjaGFyLCBtb2RpZmllcnMpCi0JCi0JZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5fZW5hYmxlZDoKLQkJCXJldHVybgotCQlzZWxmLnRlZC5XRUNsaWNrKHBvaW50LCBtb2RpZmllcnMsIEV2dC5UaWNrQ291bnQoKSkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJcmV0dXJuIDEKLQkKLQlkZWYgaWRsZShzZWxmKToKLQkJc2VsZi5TZXRQb3J0KCkKLQkJc2VsZi50ZWQuV0VJZGxlKCkKLQkKLQlkZWYgcm9sbG92ZXIoc2VsZiwgcG9pbnQsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlXYmFzZS5TZXRDdXJzb3IoImlCZWFtIikKLQkKLQlkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgotCQlzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJc2VsZi5TZXRQb3J0KCkKLQkJCQotCQkJIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0Ci0JCQkjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgotCQkJI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgb25vZmZdCi0JCQkjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQotCQkJCi0JCQlpZiBzZWxmLl9zZWxlY3RlZDoKLQkJCQlpZiBvbm9mZjoKLQkJCQkJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCQkJZWxzZToKLQkJCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKLQkJCQlzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKLQkKLQlkZWYgc2VsZWN0KHNlbGYsIG9ub2ZmLCBpc2NsaWNrID0gMCk6Ci0JCWlmIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuc2VsZWN0KHNlbGYsIG9ub2ZmKToKLQkJCXJldHVybgotCQlzZWxmLlNldFBvcnQoKQotCQlpZiBvbm9mZjoKLQkJCXNlbGYudGVkLldFQWN0aXZhdGUoKQotCQkJaWYgc2VsZi5fcGFyZW50d2luZG93Ll90YWJiYWJsZSBhbmQgbm90IGlzY2xpY2s6Ci0JCQkJc2VsZi5zZWxlY3RhbGwoKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKLQkJc2VsZi5kcmF3c2VsZnJhbWUob25vZmYpCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlpZiBub3QgdmlzUmduOgotCQkJCXZpc1JnbiA9IHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLnZpc1JnbgotCQkJc2VsZi50ZWQuV0VVcGRhdGUodmlzUmduKQogCi0JCQkjIERJU0FCTEVEISAgVGhlcmUgYXJlIHRvbyBtYW55IHBsYWNlcyB3aGVyZSBpdCBpcyBhc3N1bWVkIHRoYXQKLQkJCSMgdGhlIGZyYW1lIG9mIGFuIEVkaXRUZXh0IGl0ZW0gaXMgMSBwaXhlbCwgaW5zaWRlIHRoZSBib3VuZHMuCi0JCQkjc3RhdGUgPSBba1RoZW1lU3RhdGVBY3RpdmUsIGtUaGVtZVN0YXRlSW5hY3RpdmVdW25vdCBzZWxmLl9hY3RpdmF0ZWRdCi0JCQkjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQotCQkJUWQuRnJhbWVSZWN0KHNlbGYuX2JvdW5kcykKKyAgICAiIiJBIHRleHQgZWRpdCB3aWRnZXQsIG1haW5seSBmb3Igc2ltcGxlIGVudHJ5IGZpZWxkcy4iIiIKIAotCQkJaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX2FjdGl2YXRlZDoKLQkJCQlzZWxmLmRyYXdzZWxmcmFtZSgxKQotCQotCSMgc2Nyb2xsaW5nCi0JZGVmIHNjcm9sbHBhZ2V1cChzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoIisrIikKLQkKLQlkZWYgc2Nyb2xscGFnZWRvd24oc2VsZik6Ci0JCWlmIHNlbGYuX3BhcmVudC5fYmFyeSBhbmQgc2VsZi5fcGFyZW50Ll9iYXJ5Ll9lbmFibGVkOgotCQkJc2VsZi52c2Nyb2xsKCItLSIpCi0JCi0JZGVmIHNjcm9sbHRvcChzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1pbigpKQotCQlpZiBzZWxmLl9wYXJlbnQuX2JhcnggYW5kIHNlbGYuX3BhcmVudC5fYmFyeC5fZW5hYmxlZDoKLQkJCXNlbGYuaHNjcm9sbChzZWxmLl9wYXJlbnQuX2JhcnguZ2V0bWluKCkpCi0JCi0JZGVmIHNjcm9sbGJvdHRvbShzZWxmKToKLQkJaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6Ci0JCQlzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1heCgpKQotCQotCSMgbWVudSBoYW5kbGVycwotCWRlZiBkb21lbnVfY29weShzZWxmLCAqYXJncyk6Ci0JCXNlbGJlZ2luLCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCWlmIHNlbGJlZ2luID09IHNlbGVuZDoKLQkJCXJldHVybgotCQlpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQllbHNlOgotCQkJU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQotCQlzZWxmLnRlZC5XRUNvcHkoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQotCWRlZiBkb21lbnVfY3V0KHNlbGYsICphcmdzKToKLQkJc2VsYmVnaW4sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJaWYgc2VsYmVnaW4gPT0gc2VsZW5kOgotCQkJcmV0dXJuCi0JCWlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKLQkJCVNjcmFwLlplcm9TY3JhcCgpCi0JCWVsc2U6Ci0JCQlTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCi0JCXNlbGYudGVkLldFQ3V0KCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi5zZWx2aWV3KCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgZG9tZW51X3Bhc3RlKHNlbGYsICphcmdzKToKLQkJaWYgbm90IHNlbGYudGVkLldFQ2FuUGFzdGUoKToKLQkJCXJldHVybgotCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnRlZC5XRVBhc3RlKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgZG9tZW51X2NsZWFyKHNlbGYsICphcmdzKToKLQkJc2VsZi50ZWQuV0VEZWxldGUoKQotCQlzZWxmLnNlbHZpZXcoKQotCQlzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQotCQlzZWxmLnRleHRjaGFuZ2VkKCkKLQkJc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKLQkJaWYgc2VsZi5fY2FsbGJhY2s6Ci0JCQlXYmFzZS5DYWxsYmFja0NhbGwoc2VsZi5fY2FsbGJhY2ssIDAsICIiLCBOb25lKQotCQotCWRlZiBkb21lbnVfdW5kbyhzZWxmLCAqYXJncyk6Ci0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCWlmIG5vdCB3aGljaDogCi0JCQlyZXR1cm4KLQkJc2VsZi50ZWQuV0VVbmRvKCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCWlmIHNlbGYuX2NhbGxiYWNrOgotCQkJV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKLQkKLQlkZWYgY2FuX3VuZG8oc2VsZiwgbWVudWl0ZW0pOgotCQkjZG91bmRvID0gc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlVuZG8sIC0xKQotCQkjcHJpbnQgZG91bmRvCi0JCSNpZiBub3QgZG91bmRvOgotCQkjCXJldHVybiAwCi0JCXdoaWNoLCByZWRvID0gc2VsZi50ZWQuV0VHZXRVbmRvSW5mbygpCi0JCWlmIHdoaWNoIDwgbGVuKFVORE9MQUJFTFMpOgotCQkJd2hpY2ggPSBVTkRPTEFCRUxTW3doaWNoXQotCQllbHNlOgotCQkJd2hpY2ggPSAiIgotCQlpZiB3aGljaCA9PSBOb25lOiAKLQkJCXJldHVybiBOb25lCi0JCWlmIHJlZG86Ci0JCQl3aGljaCA9ICJSZWRvICIrd2hpY2gKLQkJZWxzZToKLQkJCXdoaWNoID0gIlVuZG8gIit3aGljaAotCQltZW51aXRlbS5zZXR0ZXh0KHdoaWNoKQotCQlyZXR1cm4gMQotCQotCWRlZiBkb21lbnVfc2VsZWN0YWxsKHNlbGYsICphcmdzKToKLQkJc2VsZi5zZWxlY3RhbGwoKQotCQotCSMgcHJpdmF0ZQotCWRlZiBnZXRzY3JvbGxyZWN0cyhzZWxmKToKLQkJcmV0dXJuIHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKSwgc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCi0JZGVmIHZzY3JvbGwoc2VsZiwgdmFsdWUpOgotCQlsaW5laGVpZ2h0ID0gc2VsZi50ZWQuV0VHZXRIZWlnaHQoMCwgMSkKLQkJZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJdmlld2hlaWdodCA9IHZyWzNdIC0gdnJbMV0KLQkJbWF4ZGVsdGEgPSB2clsxXSAtIGRyWzFdCi0JCW1pbmRlbHRhID0gdnJbM10gLSBkclszXQotCQlpZiB2YWx1ZSA9PSAiKyI6Ci0JCQlkZWx0YSA9IGxpbmVoZWlnaHQKLQkJZWxpZiB2YWx1ZSA9PSAiLSI6Ci0JCQlkZWx0YSA9IC0gbGluZWhlaWdodAotCQllbGlmIHZhbHVlID09ICIrKyI6Ci0JCQlkZWx0YSA9IHZpZXdoZWlnaHQgLSBsaW5laGVpZ2h0Ci0JCWVsaWYgdmFsdWUgPT0gIi0tIjoKLQkJCWRlbHRhID0gbGluZWhlaWdodCAtIHZpZXdoZWlnaHQKLQkJZWxzZToJIyBpbiB0aHVtYgotCQkJZGVsdGEgPSB2clsxXSAtIGRyWzFdIC0gdmFsdWUKLQkJZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQotCQlkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCi0JCWRlbHRhID0gaW50KGRlbHRhKQotCQlzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQlkZWYgaHNjcm9sbChzZWxmLCB2YWx1ZSk6Ci0JCWRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCXZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCWRlc3R3aWR0aCA9IGRyWzJdIC0gZHJbMF0KLQkJdmlld3dpZHRoID0gdnJbMl0gLSB2clswXQotCQl2aWV3b2Zmc2V0ID0gbWF4ZGVsdGEgPSB2clswXSAtIGRyWzBdCi0JCW1pbmRlbHRhID0gdnJbMl0gLSBkclsyXQotCQlpZiB2YWx1ZSA9PSAiKyI6Ci0JCQlkZWx0YSA9IDMyCi0JCWVsaWYgdmFsdWUgPT0gIi0iOgotCQkJZGVsdGEgPSAtIDMyCi0JCWVsaWYgdmFsdWUgPT0gIisrIjoKLQkJCWRlbHRhID0gMC41ICogKHZyWzJdIC0gdnJbMF0pCi0JCWVsaWYgdmFsdWUgPT0gIi0tIjoKLQkJCWRlbHRhID0gMC41ICogKHZyWzBdIC0gdnJbMl0pCi0JCWVsc2U6CSMgaW4gdGh1bWIKLQkJCWRlbHRhID0gdnJbMF0gLSBkclswXSAtIHZhbHVlCi0JCQkjY3VyID0gKDMyNzY3ICogdmlld29mZnNldCkgLyAoZGVzdHdpZHRoIC0gdmlld3dpZHRoKQotCQkJI2RlbHRhID0gKGN1ci12YWx1ZSkqKGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkvMzI3NjcKLQkJCSNpZiBhYnMoZGVsdGEgLSB2aWV3b2Zmc2V0KSA8PTI6Ci0JCQkjCSMgY29tcGVuc2F0ZSBmb3IgaXJyaXRhdGluZyByb3VuZGluZyBlcnJvcgotCQkJIwlkZWx0YSA9IHZpZXdvZmZzZXQKLQkJZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQotCQlkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCi0JCWRlbHRhID0gaW50KGRlbHRhKQotCQlzZWxmLnRlZC5XRVNjcm9sbChkZWx0YSwgMCkKLQkJc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKLQkKLQkjIHNvbWUgaW50ZXJuYWxzCi0JZGVmIF9nZXRmbGFncyhzZWxmKToKLQkJZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZAotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5Ci0JCWVsc2U6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbwotCQlyZXR1cm4gZmxhZ3MKLQkKLQlkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgotCQlyZXR1cm4gUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgc2VsZi5pbnNldFswXSwgc2VsZi5pbnNldFsxXSkKLQkKLQlkZWYgX2NhbGN0ZXh0Ym91bmRzKHNlbGYpOgotCQl2aWV3cmVjdCA9IGwsIHQsIHIsIGIgPSBzZWxmLl9nZXR2aWV3cmVjdCgpCi0JCWlmIHNlbGYudGVkOgotCQkJZGwsIGR0LCBkciwgZGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKLQkJCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQl5c2hpZnQgPSB0IC0gdnQKLQkJCWlmIChkYiAtIGR0KSA8IChiIC0gdCk6Ci0JCQkJZGVzdHJlY3QgPSB2aWV3cmVjdAotCQkJZWxzZToKLQkJCQlkZXN0cmVjdCA9IGwsIGR0ICsgeXNoaWZ0LCByLCBkYiArIHlzaGlmdAotCQllbHNlOgotCQkJZGVzdHJlY3QgPSB2aWV3cmVjdAotCQlyZXR1cm4gdmlld3JlY3QsIGRlc3RyZWN0Ci0JCQorICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhbGxiYWNrPU5vbmUsIGluc2V0PSgzLCAzKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzZXR0aW5ncyA9ICgzMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHkgPSAwKToKKyAgICAgICAgaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6CisgICAgICAgICAgICBpbXBvcnQgVworICAgICAgICAgICAgZm9udHNldHRpbmdzID0gVy5nZXRkZWZhdWx0Zm9udCgpCisgICAgICAgIFdiYXNlLlNlbGVjdGFibGVXaWRnZXQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSkKKyAgICAgICAgc2VsZi50ZW1wdGV4dCA9IHRleHQKKyAgICAgICAgc2VsZi50ZWQgPSBOb25lCisgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gTm9uZQorICAgICAgICBzZWxmLm9sZHNlbGVjdGlvbiA9IE5vbmUKKyAgICAgICAgc2VsZi5fY2FsbGJhY2sgPSBjYWxsYmFjaworICAgICAgICBzZWxmLmNoYW5nZWQgPSAwCisgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDAKKyAgICAgICAgc2VsZi5fc2VsZWN0ZWQgPSAwCisgICAgICAgIHNlbGYuX2VuYWJsZWQgPSAxCisgICAgICAgIHNlbGYud3JhcCA9IDEKKyAgICAgICAgc2VsZi5yZWFkb25seSA9IHJlYWRvbmx5CisgICAgICAgIHNlbGYuZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgICAgIHNlbGYudGFic2V0dGluZ3MgPSB0YWJzZXR0aW5ncworICAgICAgICBpZiB0eXBlKGluc2V0KSA8PiBUdXBsZVR5cGU6CisgICAgICAgICAgICBzZWxmLmluc2V0ID0gKGluc2V0LCBpbnNldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuaW5zZXQgPSBpbnNldAorCisgICAgZGVmIG9wZW4oc2VsZik6CisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3BhcmVudCwgIl9iYXJ4Iik6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnQuX2JhcnggPSBOb25lCisgICAgICAgIGlmIG5vdCBoYXNhdHRyKHNlbGYuX3BhcmVudCwgIl9iYXJ5Iik6CisgICAgICAgICAgICBzZWxmLl9wYXJlbnQuX2JhcnkgPSBOb25lCisgICAgICAgIHNlbGYuX2NhbGNib3VuZHMoKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICB2aWV3cmVjdCwgZGVzdHJlY3QgPSBzZWxmLl9jYWxjdGV4dGJvdW5kcygpCisgICAgICAgIGZsYWdzID0gc2VsZi5fZ2V0ZmxhZ3MoKQorICAgICAgICBzZWxmLnRlZCA9IHdhc3RlLldFTmV3KGRlc3RyZWN0LCB2aWV3cmVjdCwgZmxhZ3MpCisgICAgICAgIHNlbGYudGVkLldFSW5zdGFsbFRhYkhvb2tzKCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRBbGlnbm1lbnQoV0FTVEVjb25zdC53ZUZsdXNoTGVmdCkKKyAgICAgICAgc2VsZi5zZXRmb250c2V0dGluZ3Moc2VsZi5mb250c2V0dGluZ3MpCisgICAgICAgIHNlbGYuc2V0dGFic2V0dGluZ3Moc2VsZi50YWJzZXR0aW5ncykKKyAgICAgICAgc2VsZi50ZWQuV0VVc2VUZXh0KFJlcy5SZXNvdXJjZShzZWxmLnRlbXB0ZXh0KSkKKyAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgaWYgc2VsZi5zZWxlY3Rpb246CisgICAgICAgICAgICBzZWxmLnNldHNlbGVjdGlvbihzZWxmLnNlbGVjdGlvblswXSwgc2VsZi5zZWxlY3Rpb25bMV0pCisgICAgICAgICAgICBzZWxmLnNlbGVjdGlvbiA9IE5vbmUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudGVtcHRleHQgPSBOb25lCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuYmluZCgicGFnZXVwIiwgc2VsZi5zY3JvbGxwYWdldXApCisgICAgICAgIHNlbGYuYmluZCgicGFnZWRvd24iLCBzZWxmLnNjcm9sbHBhZ2Vkb3duKQorICAgICAgICBzZWxmLmJpbmQoInRvcCIsIHNlbGYuc2Nyb2xsdG9wKQorICAgICAgICBzZWxmLmJpbmQoImJvdHRvbSIsIHNlbGYuc2Nyb2xsYm90dG9tKQorICAgICAgICBzZWxmLnNlbGNoYW5nZWQgPSAwCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIHNlbGYuX3BhcmVudC5fYmFyeCA9IE5vbmUKKyAgICAgICAgc2VsZi5fcGFyZW50Ll9iYXJ5ID0gTm9uZQorICAgICAgICBzZWxmLnRlZCA9IE5vbmUKKyAgICAgICAgc2VsZi50ZW1wdGV4dCA9IE5vbmUKKyAgICAgICAgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQorCisgICAgZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorCisgICAgZGVmIHNlbGVjdGlvbmNoYW5nZWQoc2VsZik6CisgICAgICAgIHNlbGYuc2VsY2hhbmdlZCA9IDEKKyAgICAgICAgc2VsZi5vbGRzZWxlY3Rpb24gPSBzZWxmLmdldHNlbGVjdGlvbigpCisKKyAgICBkZWYgZ2V0dGFic2V0dGluZ3Moc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRhYnNldHRpbmdzCisKKyAgICBkZWYgc2V0dGFic2V0dGluZ3Moc2VsZiwgKHRhYnNpemUsIHRhYm1vZGUpKToKKyAgICAgICAgc2VsZi50YWJzZXR0aW5ncyA9ICh0YWJzaXplLCB0YWJtb2RlKQorICAgICAgICBpZiBoYXNhdHRyKHNlbGYudGVkLCAiV0VTZXRUYWJTaXplIik6CisgICAgICAgICAgICBwb3J0ID0gc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkKKyAgICAgICAgICAgIGlmIHRhYm1vZGU6CisgICAgICAgICAgICAgICAgKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLmdldGZvbnRzZXR0aW5ncygpCisgICAgICAgICAgICAgICAgc2F2ZXNldHRpbmdzID0gR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KQorICAgICAgICAgICAgICAgIFNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIHN0eWxlLCBzaXplKSkKKyAgICAgICAgICAgICAgICB0YWJzaXplID0gUWQuU3RyaW5nV2lkdGgoJyAnICogdGFic2l6ZSkKKyAgICAgICAgICAgICAgICBTZXRQb3J0Rm9udFNldHRpbmdzKHBvcnQsIHNhdmVzZXR0aW5ncykKKyAgICAgICAgICAgIHRhYnNpemUgPSBtYXgodGFic2l6ZSwgMSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0VGFiU2l6ZSh0YWJzaXplKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdChzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShwb3J0LnZpc1JnbikKKworICAgIGRlZiBnZXRmb250c2V0dGluZ3Moc2VsZik6CisgICAgICAgIGZyb20gQ2FyYm9uIGltcG9ydCBSZXMKKyAgICAgICAgKGZvbnQsIHN0eWxlLCBzaXplLCBjb2xvcikgPSBzZWxmLnRlZC5XRUdldFJ1bkluZm8oMClbNF0KKyAgICAgICAgZm9udCA9IEZtLkdldEZvbnROYW1lKGZvbnQpCisgICAgICAgIHJldHVybiAoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKQorCisgICAgZGVmIHNldGZvbnRzZXR0aW5ncyhzZWxmLCAoZm9udCwgc3R5bGUsIHNpemUsIGNvbG9yKSk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIHR5cGUoZm9udCkgPD4gU3RyaW5nVHlwZToKKyAgICAgICAgICAgIGZvbnQgPSBGbS5HZXRGb250TmFtZShmb250KQorICAgICAgICBzZWxmLmZvbnRzZXR0aW5ncyA9IChmb250LCBzdHlsZSwgc2l6ZSwgY29sb3IpCisgICAgICAgIGZvbnRpZCA9IEdldEZOdW0oZm9udCkKKyAgICAgICAgcmVhZG9ubHkgPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIC0xKQorICAgICAgICBpZiByZWFkb25seToKKyAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkluaGliaXRSZWNhbCwgMSkKKyAgICAgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbigwLCBzZWxmLnRlZC5XRUdldFRleHRMZW5ndGgoKSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDAsIDAsICgwLCAwLCAwKSkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2UgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvQ29sb3IgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvRm9udCB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXQVNURWNvbnN0LndlRG9TaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZvbnRpZCwgc3R5bGUsIHNpemUsIGNvbG9yKSkKKyAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZJbmhpYml0UmVjYWwsIDApCisgICAgICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGlmIHJlYWRvbmx5OgorICAgICAgICAgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMSkKKyAgICAgICAgdmlld3JlY3QgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgUWQuRXJhc2VSZWN0KHZpZXdyZWN0KQorICAgICAgICBzZWxmLnRlZC5XRVVwZGF0ZShzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgYWRqdXN0KHNlbGYsIG9sZGJvdW5kcyk6CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgICMgTm90ZTogaWYgQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUgaXMgZXZlciB1c2VkLCBpdCB3aWxsIGJlIG5lY2Vzc2FyeQorICAgICAgICAjIHRvIHVuY29uZGl0aW9uYWxseSBvdXRzZXQgdGhlIGludmFsaWRhdGVkIHJlY3RhbmdsZXMsIHNpbmNlIEFwcGVhcmFuY2UKKyAgICAgICAgIyBmcmFtZXMgYXJlIGRyYXduIG91dHNpZGUgdGhlIGJvdW5kcy4KKyAgICAgICAgaWYgc2VsZi5fc2VsZWN0ZWQgYW5kIHNlbGYuX3BhcmVudHdpbmRvdy5faGFzc2VsZnJhbWVzOgorICAgICAgICAgICAgc2VsZi5HZXRXaW5kb3coKS5JbnZhbFdpbmRvd1JlY3QoUWQuSW5zZXRSZWN0KG9sZGJvdW5kcywgLTMsIC0zKSkKKyAgICAgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIC0zLCAtMykpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChvbGRib3VuZHMpCisgICAgICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisgICAgICAgIHZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRWaWV3UmVjdCh2aWV3cmVjdCkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXREZXN0UmVjdChkZXN0cmVjdCkKKyAgICAgICAgaWYgc2VsZi53cmFwOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VDYWxUZXh0KCkKKyAgICAgICAgaWYgc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpWzNdIDwgdmlld3JlY3RbMV06CisgICAgICAgICAgICBzZWxmLnNlbHZpZXcoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorCisgICAgIyBpbnRlcmZhY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAjIHNlbGVjdGlvbiBzdHVmZgorICAgIGRlZiBzZWx2aWV3KHNlbGYpOgorICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorCisgICAgZGVmIHNlbGVjdGFsbChzZWxmKToKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oMCwgc2VsZi50ZWQuV0VHZXRUZXh0TGVuZ3RoKCkpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgc2VsZWN0bGluZShzZWxmLCBsaW5lbm8sIGNoYXJvZmZzZXQgPSAwKToKKyAgICAgICAgbmV3c2Vsc3RhcnQsIG5ld3NlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKGxpbmVubykKKyAgICAgICAgIyBBdXRvc2Nyb2xsIG1ha2VzIHRoZSAqZW5kKiBvZiB0aGUgc2VsZWN0aW9uIHZpc2libGUsIHdoaWNoLAorICAgICAgICAjIGluIHRoZSBjYXNlIG9mIGEgd2hvbGUgbGluZSwgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgKm5leHQqIGxpbmUuCisgICAgICAgICMgU28gc29tZXRpbWVzIGl0IGxlYXZlcyBvdXIgbGluZSBqdXN0IGFib3ZlIHRoZSB2aWV3IHJlY3QuCisgICAgICAgICMgTGV0J3MgZm9vbCBXYXN0ZSBieSBpbml0aWFsbHkgc2VsZWN0aW5nIG9uZSBjaGFyIGxlc3M6CisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKG5ld3NlbHN0YXJ0ICsgY2hhcm9mZnNldCwgbmV3c2VsZW5kLTEpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKG5ld3NlbHN0YXJ0ICsgY2hhcm9mZnNldCwgbmV3c2VsZW5kKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorCisgICAgZGVmIGdldHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmV0dXJuIHNlbGYuc2VsZWN0aW9uCisKKyAgICBkZWYgc2V0c2VsZWN0aW9uKHNlbGYsIHNlbHN0YXJ0LCBzZWxlbmQpOgorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLnRlZDoKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNlbFZpZXcoKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuc2VsZWN0aW9uID0gc2Vsc3RhcnQsIHNlbGVuZAorCisgICAgZGVmIG9mZnNldHRvbGluZShzZWxmLCBvZmZzZXQpOgorICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUob2Zmc2V0KQorCisgICAgZGVmIGNvdW50bGluZXMoc2VsZik6CisgICAgICAgIHJldHVybiBzZWxmLnRlZC5XRUNvdW50TGluZXMoKQorCisgICAgZGVmIGdldHNlbGVjdGVkdGV4dChzZWxmKToKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgcmV0dXJuIHNlbGYudGVkLldFR2V0VGV4dCgpLmRhdGFbc2Vsc3RhcnQ6c2VsZW5kXQorCisgICAgZGVmIGV4cGFuZHNlbGVjdGlvbihzZWxmKToKKyAgICAgICAgb2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihvbGRzZWxzdGFydCwgb2xkc2VsZW5kKSwgbWF4KG9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQpCisgICAgICAgIGlmIHNlbHN0YXJ0IDw+IHNlbGVuZCBhbmQgY2hyKHNlbGYudGVkLldFR2V0Q2hhcihzZWxlbmQtMSkpID09ICdccic6CisgICAgICAgICAgICBzZWxlbmQgPSBzZWxlbmQgLSAxCisgICAgICAgIG5ld3NlbHN0YXJ0LCBkdW1teSA9IHNlbGYudGVkLldFRmluZExpbmUoc2Vsc3RhcnQsIDEpCisgICAgICAgIGR1bW15LCBuZXdzZWxlbmQgPSBzZWxmLnRlZC5XRUZpbmRMaW5lKHNlbGVuZCwgMSkKKyAgICAgICAgaWYgb2xkc2Vsc3RhcnQgPD4gbmV3c2Vsc3RhcnQgb3IgIG9sZHNlbGVuZCA8PiBuZXdzZWxlbmQ6CisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihuZXdzZWxzdGFydCwgbmV3c2VsZW5kKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKworICAgIGRlZiBpbnNlcnQoc2VsZiwgdGV4dCk6CisgICAgICAgIHNlbGYudGVkLldFSW5zZXJ0KHRleHQsIE5vbmUsIE5vbmUpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorCisgICAgIyB0ZXh0CisgICAgZGVmIHNldChzZWxmLCB0ZXh0KToKKyAgICAgICAgaWYgbm90IHNlbGYudGVkOgorICAgICAgICAgICAgc2VsZi50ZW1wdGV4dCA9IHRleHQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudGVkLldFVXNlVGV4dChSZXMuUmVzb3VyY2UodGV4dCkpCisgICAgICAgICAgICBzZWxmLnRlZC5XRUNhbFRleHQoKQorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgICAgIHZpZXdyZWN0LCBkZXN0cmVjdCA9IHNlbGYuX2NhbGN0ZXh0Ym91bmRzKCkKKyAgICAgICAgICAgIHNlbGYudGVkLldFU2V0Vmlld1JlY3Qodmlld3JlY3QpCisgICAgICAgICAgICBzZWxmLnRlZC5XRVNldERlc3RSZWN0KGRlc3RyZWN0KQorICAgICAgICAgICAgcmduID0gUWQuTmV3UmduKCkKKyAgICAgICAgICAgIFFkLlJlY3RSZ24ocmduLCB2aWV3cmVjdCkKKyAgICAgICAgICAgIFFkLkVyYXNlUmVjdCh2aWV3cmVjdCkKKyAgICAgICAgICAgIHNlbGYuZHJhdyhyZ24pCisgICAgICAgICAgICBzZWxmLnVwZGF0ZXNjcm9sbGJhcnMoKQorICAgICAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgxKQorCisgICAgZGVmIGdldChzZWxmKToKKyAgICAgICAgaWYgbm90IHNlbGYuX3BhcmVudDoKKyAgICAgICAgICAgIHJldHVybiBzZWxmLnRlbXB0ZXh0CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXRUZXh0KCkuZGF0YQorCisgICAgIyBldmVudHMKKyAgICBkZWYga2V5KHNlbGYsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAgaWYgc2VsZi5fZW5hYmxlZCBhbmQgbm90IG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXkgb3IgY2hhciBpbiBXa2V5cy5hcnJvd2tleXM6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKKyAgICAgICAgICAgIGlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgorICAgICAgICAgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICAgICAgaWYgY2hhciBub3QgaW4gV2tleXMuc2Nyb2xsa2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgY2hhciwgbW9kaWZpZXJzKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnRlZC5XRUNsaWNrKHBvaW50LCBtb2RpZmllcnMsIEV2dC5UaWNrQ291bnQoKSkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBpZGxlKHNlbGYpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorCisgICAgZGVmIHJvbGxvdmVyKHNlbGYsIHBvaW50LCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgV2Jhc2UuU2V0Q3Vyc29yKCJpQmVhbSIpCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBzZWxmLl9hY3RpdmF0ZWQgPSBvbm9mZgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgc2VsZi5TZXRQb3J0KCkKKworICAgICAgICAgICAgIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgICAgICAjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgorICAgICAgICAgICAgI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgb25vZmZdCisgICAgICAgICAgICAjQXBwLkRyYXdUaGVtZUVkaXRUZXh0RnJhbWUoUWQuSW5zZXRSZWN0KHNlbGYuX2JvdW5kcywgMSwgMSksIHN0YXRlKQorCisgICAgICAgICAgICBpZiBzZWxmLl9zZWxlY3RlZDoKKyAgICAgICAgICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICAgICAgICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKKworICAgIGRlZiBzZWxlY3Qoc2VsZiwgb25vZmYsIGlzY2xpY2sgPSAwKToKKyAgICAgICAgaWYgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5zZWxlY3Qoc2VsZiwgb25vZmYpOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCisgICAgICAgICAgICBpZiBzZWxmLl9wYXJlbnR3aW5kb3cuX3RhYmJhYmxlIGFuZCBub3QgaXNjbGljazoKKyAgICAgICAgICAgICAgICBzZWxmLnNlbGVjdGFsbCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgICAgICBzZWxmLmRyYXdzZWxmcmFtZShvbm9mZikKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKKworICAgICAgICAgICAgIyBESVNBQkxFRCEgIFRoZXJlIGFyZSB0b28gbWFueSBwbGFjZXMgd2hlcmUgaXQgaXMgYXNzdW1lZCB0aGF0CisgICAgICAgICAgICAjIHRoZSBmcmFtZSBvZiBhbiBFZGl0VGV4dCBpdGVtIGlzIDEgcGl4ZWwsIGluc2lkZSB0aGUgYm91bmRzLgorICAgICAgICAgICAgI3N0YXRlID0gW2tUaGVtZVN0YXRlQWN0aXZlLCBrVGhlbWVTdGF0ZUluYWN0aXZlXVtub3Qgc2VsZi5fYWN0aXZhdGVkXQorICAgICAgICAgICAgI0FwcC5EcmF3VGhlbWVFZGl0VGV4dEZyYW1lKFFkLkluc2V0UmVjdChzZWxmLl9ib3VuZHMsIDEsIDEpLCBzdGF0ZSkKKyAgICAgICAgICAgIFFkLkZyYW1lUmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUoMSkKKworICAgICMgc2Nyb2xsaW5nCisgICAgZGVmIHNjcm9sbHBhZ2V1cChzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoIisrIikKKworICAgIGRlZiBzY3JvbGxwYWdlZG93bihzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoIi0tIikKKworICAgIGRlZiBzY3JvbGx0b3Aoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX3BhcmVudC5fYmFyeSBhbmQgc2VsZi5fcGFyZW50Ll9iYXJ5Ll9lbmFibGVkOgorICAgICAgICAgICAgc2VsZi52c2Nyb2xsKHNlbGYuX3BhcmVudC5fYmFyeS5nZXRtaW4oKSkKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ4IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnguX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLmhzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ4LmdldG1pbigpKQorCisgICAgZGVmIHNjcm9sbGJvdHRvbShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fcGFyZW50Ll9iYXJ5IGFuZCBzZWxmLl9wYXJlbnQuX2JhcnkuX2VuYWJsZWQ6CisgICAgICAgICAgICBzZWxmLnZzY3JvbGwoc2VsZi5fcGFyZW50Ll9iYXJ5LmdldG1heCgpKQorCisgICAgIyBtZW51IGhhbmRsZXJzCisgICAgZGVmIGRvbWVudV9jb3B5KHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsYmVnaW4sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgaWYgc2VsYmVnaW4gPT0gc2VsZW5kOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIGhhc2F0dHIoU2NyYXAsICdaZXJvU2NyYXAnKToKKyAgICAgICAgICAgIFNjcmFwLlplcm9TY3JhcCgpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBTY3JhcC5DbGVhckN1cnJlbnRTY3JhcCgpCisgICAgICAgIHNlbGYudGVkLldFQ29weSgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICBkZWYgZG9tZW51X2N1dChzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGJlZ2luLCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIGlmIHNlbGJlZ2luID09IHNlbGVuZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBoYXNhdHRyKFNjcmFwLCAnWmVyb1NjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgU2NyYXAuQ2xlYXJDdXJyZW50U2NyYXAoKQorICAgICAgICBzZWxmLnRlZC5XRUN1dCgpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgIiIsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X3Bhc3RlKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgbm90IHNlbGYudGVkLldFQ2FuUGFzdGUoKToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBzZWxmLnNlbHZpZXcoKQorICAgICAgICBzZWxmLnRlZC5XRVBhc3RlKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKKworICAgIGRlZiBkb21lbnVfY2xlYXIoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLnRlZC5XRURlbGV0ZSgpCisgICAgICAgIHNlbGYuc2VsdmlldygpCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisgICAgICAgIHNlbGYudGV4dGNoYW5nZWQoKQorICAgICAgICBzZWxmLnNlbGVjdGlvbmNoYW5nZWQoKQorICAgICAgICBpZiBzZWxmLl9jYWxsYmFjazoKKyAgICAgICAgICAgIFdiYXNlLkNhbGxiYWNrQ2FsbChzZWxmLl9jYWxsYmFjaywgMCwgIiIsIE5vbmUpCisKKyAgICBkZWYgZG9tZW51X3VuZG8oc2VsZiwgKmFyZ3MpOgorICAgICAgICB3aGljaCwgcmVkbyA9IHNlbGYudGVkLldFR2V0VW5kb0luZm8oKQorICAgICAgICBpZiBub3Qgd2hpY2g6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi50ZWQuV0VVbmRvKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKyAgICAgICAgc2VsZi50ZXh0Y2hhbmdlZCgpCisgICAgICAgIHNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCisgICAgICAgIGlmIHNlbGYuX2NhbGxiYWNrOgorICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKHNlbGYuX2NhbGxiYWNrLCAwLCAiIiwgTm9uZSkKKworICAgIGRlZiBjYW5fdW5kbyhzZWxmLCBtZW51aXRlbSk6CisgICAgICAgICNkb3VuZG8gPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgLTEpCisgICAgICAgICNwcmludCBkb3VuZG8KKyAgICAgICAgI2lmIG5vdCBkb3VuZG86CisgICAgICAgICMgICAgICAgcmV0dXJuIDAKKyAgICAgICAgd2hpY2gsIHJlZG8gPSBzZWxmLnRlZC5XRUdldFVuZG9JbmZvKCkKKyAgICAgICAgaWYgd2hpY2ggPCBsZW4oVU5ET0xBQkVMUyk6CisgICAgICAgICAgICB3aGljaCA9IFVORE9MQUJFTFNbd2hpY2hdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGljaCA9ICIiCisgICAgICAgIGlmIHdoaWNoID09IE5vbmU6CisgICAgICAgICAgICByZXR1cm4gTm9uZQorICAgICAgICBpZiByZWRvOgorICAgICAgICAgICAgd2hpY2ggPSAiUmVkbyAiK3doaWNoCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB3aGljaCA9ICJVbmRvICIrd2hpY2gKKyAgICAgICAgbWVudWl0ZW0uc2V0dGV4dCh3aGljaCkKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBkb21lbnVfc2VsZWN0YWxsKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5zZWxlY3RhbGwoKQorCisgICAgIyBwcml2YXRlCisgICAgZGVmIGdldHNjcm9sbHJlY3RzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpLCBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKworICAgIGRlZiB2c2Nyb2xsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgbGluZWhlaWdodCA9IHNlbGYudGVkLldFR2V0SGVpZ2h0KDAsIDEpCisgICAgICAgIGRyID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIHZyID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCisgICAgICAgIHZpZXdoZWlnaHQgPSB2clszXSAtIHZyWzFdCisgICAgICAgIG1heGRlbHRhID0gdnJbMV0gLSBkclsxXQorICAgICAgICBtaW5kZWx0YSA9IHZyWzNdIC0gZHJbM10KKyAgICAgICAgaWYgdmFsdWUgPT0gIisiOgorICAgICAgICAgICAgZGVsdGEgPSBsaW5laGVpZ2h0CisgICAgICAgIGVsaWYgdmFsdWUgPT0gIi0iOgorICAgICAgICAgICAgZGVsdGEgPSAtIGxpbmVoZWlnaHQKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiKysiOgorICAgICAgICAgICAgZGVsdGEgPSB2aWV3aGVpZ2h0IC0gbGluZWhlaWdodAorICAgICAgICBlbGlmIHZhbHVlID09ICItLSI6CisgICAgICAgICAgICBkZWx0YSA9IGxpbmVoZWlnaHQgLSB2aWV3aGVpZ2h0CisgICAgICAgIGVsc2U6ICAgIyBpbiB0aHVtYgorICAgICAgICAgICAgZGVsdGEgPSB2clsxXSAtIGRyWzFdIC0gdmFsdWUKKyAgICAgICAgZGVsdGEgPSBtaW4obWF4ZGVsdGEsIGRlbHRhKQorICAgICAgICBkZWx0YSA9IG1heChtaW5kZWx0YSwgZGVsdGEpCisgICAgICAgIGRlbHRhID0gaW50KGRlbHRhKQorICAgICAgICBzZWxmLnRlZC5XRVNjcm9sbCgwLCBkZWx0YSkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBoc2Nyb2xsKHNlbGYsIHZhbHVlKToKKyAgICAgICAgZHIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgdnIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgZGVzdHdpZHRoID0gZHJbMl0gLSBkclswXQorICAgICAgICB2aWV3d2lkdGggPSB2clsyXSAtIHZyWzBdCisgICAgICAgIHZpZXdvZmZzZXQgPSBtYXhkZWx0YSA9IHZyWzBdIC0gZHJbMF0KKyAgICAgICAgbWluZGVsdGEgPSB2clsyXSAtIGRyWzJdCisgICAgICAgIGlmIHZhbHVlID09ICIrIjoKKyAgICAgICAgICAgIGRlbHRhID0gMzIKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiLSI6CisgICAgICAgICAgICBkZWx0YSA9IC0gMzIKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiKysiOgorICAgICAgICAgICAgZGVsdGEgPSAwLjUgKiAodnJbMl0gLSB2clswXSkKKyAgICAgICAgZWxpZiB2YWx1ZSA9PSAiLS0iOgorICAgICAgICAgICAgZGVsdGEgPSAwLjUgKiAodnJbMF0gLSB2clsyXSkKKyAgICAgICAgZWxzZTogICAjIGluIHRodW1iCisgICAgICAgICAgICBkZWx0YSA9IHZyWzBdIC0gZHJbMF0gLSB2YWx1ZQorICAgICAgICAgICAgI2N1ciA9ICgzMjc2NyAqIHZpZXdvZmZzZXQpIC8gKGRlc3R3aWR0aCAtIHZpZXd3aWR0aCkKKyAgICAgICAgICAgICNkZWx0YSA9IChjdXItdmFsdWUpKihkZXN0d2lkdGggLSB2aWV3d2lkdGgpLzMyNzY3CisgICAgICAgICAgICAjaWYgYWJzKGRlbHRhIC0gdmlld29mZnNldCkgPD0yOgorICAgICAgICAgICAgIyAgICAgICAjIGNvbXBlbnNhdGUgZm9yIGlycml0YXRpbmcgcm91bmRpbmcgZXJyb3IKKyAgICAgICAgICAgICMgICAgICAgZGVsdGEgPSB2aWV3b2Zmc2V0CisgICAgICAgIGRlbHRhID0gbWluKG1heGRlbHRhLCBkZWx0YSkKKyAgICAgICAgZGVsdGEgPSBtYXgobWluZGVsdGEsIGRlbHRhKQorICAgICAgICBkZWx0YSA9IGludChkZWx0YSkKKyAgICAgICAgc2VsZi50ZWQuV0VTY3JvbGwoZGVsdGEsIDApCisgICAgICAgIHNlbGYudXBkYXRlc2Nyb2xsYmFycygpCisKKyAgICAjIHNvbWUgaW50ZXJuYWxzCisgICAgZGVmIF9nZXRmbGFncyhzZWxmKToKKyAgICAgICAgZmxhZ3MgPSBXQVNURWNvbnN0LndlRG9BdXRvU2Nyb2xsIHwgV0FTVEVjb25zdC53ZURvTW9ub1N0eWxlZAorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbworICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6CisgICAgICAgIHJldHVybiBRZC5JbnNldFJlY3Qoc2VsZi5fYm91bmRzLCBzZWxmLmluc2V0WzBdLCBzZWxmLmluc2V0WzFdKQorCisgICAgZGVmIF9jYWxjdGV4dGJvdW5kcyhzZWxmKToKKyAgICAgICAgdmlld3JlY3QgPSBsLCB0LCByLCBiID0gc2VsZi5fZ2V0dmlld3JlY3QoKQorICAgICAgICBpZiBzZWxmLnRlZDoKKyAgICAgICAgICAgIGRsLCBkdCwgZHIsIGRiID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICAgICAgeXNoaWZ0ID0gdCAtIHZ0CisgICAgICAgICAgICBpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgorICAgICAgICAgICAgICAgIGRlc3RyZWN0ID0gdmlld3JlY3QKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZGVzdHJlY3QgPSBsLCBkdCArIHlzaGlmdCwgciwgZGIgKyB5c2hpZnQKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGRlc3RyZWN0ID0gdmlld3JlY3QKKyAgICAgICAgcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAorCiAKIGNsYXNzIFRleHRFZGl0b3IoRWRpdFRleHQpOgotCQotCSIiIkEgdGV4dCBlZGl0IHdpZGdldC4iIiIKLQkKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgY2FsbGJhY2s9Tm9uZSwgd3JhcD0xLCBpbnNldD0oNCwgNCksCi0JCQkJZm9udHNldHRpbmdzPU5vbmUsCi0JCQkJdGFic2V0dGluZ3M9KDMyLCAwKSwKLQkJCQlyZWFkb25seT0wKToKLQkJRWRpdFRleHQuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dCwgY2FsbGJhY2ssIGluc2V0LCBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzLCByZWFkb25seSkKLQkJc2VsZi53cmFwID0gd3JhcAotCQotCWRlZiBfZ2V0ZmxhZ3Moc2VsZik6Ci0JCWZsYWdzID0gV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb01vbm9TdHlsZWQgfCBcCi0JCQkJV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZQotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5Ci0JCWVsc2U6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbwotCQlyZXR1cm4gZmxhZ3MKLQkKLQlkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgotCQlsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCi0JCXJldHVybiAobCArIDUsIHQgKyAyLCByLCBiIC0gMikKLQkKLQlkZWYgX2NhbGN0ZXh0Ym91bmRzKHNlbGYpOgotCQlpZiBzZWxmLndyYXA6Ci0JCQlyZXR1cm4gRWRpdFRleHQuX2NhbGN0ZXh0Ym91bmRzKHNlbGYpCi0JCWVsc2U6Ci0JCQl2aWV3cmVjdCA9IGwsIHQsIHIsIGIgPSBzZWxmLl9nZXR2aWV3cmVjdCgpCi0JCQlpZiBzZWxmLnRlZDoKLQkJCQlkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQkJCXZsLCB2dCwgdnIsIHZiID0gc2VsZi50ZWQuV0VHZXRWaWV3UmVjdCgpCi0JCQkJeHNoaWZ0ID0gbCAtIHZsCi0JCQkJeXNoaWZ0ID0gdCAtIHZ0Ci0JCQkJaWYgKGRiIC0gZHQpIDwgKGIgLSB0KToKLQkJCQkJeXNoaWZ0ID0gdCAtIGR0Ci0JCQkJZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCi0JCQllbHNlOgotCQkJCWRlc3RyZWN0ID0gKGwsIHQsIHIgKyA1MDAwLCBiKQotCQkJcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlpZiBzZWxmLl92aXNpYmxlOgotCQkJaWYgbm90IHZpc1JnbjoKLQkJCQl2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KLQkJCXNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKLQkJCWlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6Ci0JCQkJc2VsZi5kcmF3c2VsZnJhbWUoMSkKIAotCWRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6Ci0JCXNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCi0JCWlmIHNlbGYuX3Zpc2libGU6Ci0JCQlzZWxmLlNldFBvcnQoKQotCQkJIyBkb2Vzbid0IGRyYXcgZnJhbWUsIGFzIEVkaXRUZXh0LmFjdGl2YXRlIGRvZXMKLQkJCWlmIHNlbGYuX3NlbGVjdGVkOgotCQkJCWlmIG9ub2ZmOgotCQkJCQlzZWxmLnRlZC5XRUFjdGl2YXRlKCkKLQkJCQllbHNlOgotCQkJCQlzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQotCQkJCXNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQorICAgICIiIkEgdGV4dCBlZGl0IHdpZGdldC4iIiIKKworICAgIGRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLCBjYWxsYmFjaz1Ob25lLCB3cmFwPTEsIGluc2V0PSg0LCA0KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb250c2V0dGluZ3M9Tm9uZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJzZXR0aW5ncz0oMzIsIDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWRvbmx5PTApOgorICAgICAgICBFZGl0VGV4dC5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0LCBjYWxsYmFjaywgaW5zZXQsIGZvbnRzZXR0aW5ncywgdGFic2V0dGluZ3MsIHJlYWRvbmx5KQorICAgICAgICBzZWxmLndyYXAgPSB3cmFwCisKKyAgICBkZWYgX2dldGZsYWdzKHNlbGYpOgorICAgICAgICBmbGFncyA9IFdBU1RFY29uc3Qud2VEb0F1dG9TY3JvbGwgfCBXQVNURWNvbnN0LndlRG9Nb25vU3R5bGVkIHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvT3V0bGluZUhpbGl0ZQorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgZmxhZ3MgPSBmbGFncyB8IFdBU1RFY29uc3Qud2VEb1JlYWRPbmx5CisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvVW5kbworICAgICAgICByZXR1cm4gZmxhZ3MKKworICAgIGRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKKyAgICAgICAgcmV0dXJuIChsICsgNSwgdCArIDIsIHIsIGIgLSAyKQorCisgICAgZGVmIF9jYWxjdGV4dGJvdW5kcyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi53cmFwOgorICAgICAgICAgICAgcmV0dXJuIEVkaXRUZXh0Ll9jYWxjdGV4dGJvdW5kcyhzZWxmKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdmlld3JlY3QgPSBsLCB0LCByLCBiID0gc2VsZi5fZ2V0dmlld3JlY3QoKQorICAgICAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICAgICAgZGwsIGR0LCBkciwgZGIgPSBzZWxmLnRlZC5XRUdldERlc3RSZWN0KCkKKyAgICAgICAgICAgICAgICB2bCwgdnQsIHZyLCB2YiA9IHNlbGYudGVkLldFR2V0Vmlld1JlY3QoKQorICAgICAgICAgICAgICAgIHhzaGlmdCA9IGwgLSB2bAorICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSB2dAorICAgICAgICAgICAgICAgIGlmIChkYiAtIGR0KSA8IChiIC0gdCk6CisgICAgICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSBkdAorICAgICAgICAgICAgICAgIGRlc3RyZWN0ID0gKGRsICsgeHNoaWZ0LCBkdCArIHlzaGlmdCwgZHIgKyB4c2hpZnQsIGRiICsgeXNoaWZ0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKKyAgICAgICAgICAgIHJldHVybiB2aWV3cmVjdCwgZGVzdHJlY3QKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl92aXNpYmxlOgorICAgICAgICAgICAgaWYgbm90IHZpc1JnbjoKKyAgICAgICAgICAgICAgICB2aXNSZ24gPSBzZWxmLl9wYXJlbnR3aW5kb3cud2lkLkdldFdpbmRvd1BvcnQoKS52aXNSZ24KKyAgICAgICAgICAgIHNlbGYudGVkLldFVXBkYXRlKHZpc1JnbikKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkIGFuZCBzZWxmLl9hY3RpdmF0ZWQ6CisgICAgICAgICAgICAgICAgc2VsZi5kcmF3c2VsZnJhbWUoMSkKKworICAgIGRlZiBhY3RpdmF0ZShzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX2FjdGl2YXRlZCA9IG9ub2ZmCisgICAgICAgIGlmIHNlbGYuX3Zpc2libGU6CisgICAgICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICAgICAgIyBkb2Vzbid0IGRyYXcgZnJhbWUsIGFzIEVkaXRUZXh0LmFjdGl2YXRlIGRvZXMKKyAgICAgICAgICAgIGlmIHNlbGYuX3NlbGVjdGVkOgorICAgICAgICAgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUFjdGl2YXRlKCkKKyAgICAgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRURlYWN0aXZhdGUoKQorICAgICAgICAgICAgICAgIHNlbGYuZHJhd3NlbGZyYW1lKG9ub2ZmKQogCiAKIGltcG9ydCByZQpAQCAtNjU4LDQ3OSArNjU4LDQ3OSBAQAogCiAKIGNsYXNzIFB5RWRpdG9yKFRleHRFZGl0b3IpOgotCQotCSIiIkEgc3BlY2lhbGl6ZWQgUHl0aG9uIHNvdXJjZSBlZGl0IHdpZGdldCIiIgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0ZXh0PSIiLCBjYWxsYmFjaz1Ob25lLCBpbnNldD0oNCwgNCksCi0JCQkJZm9udHNldHRpbmdzPU5vbmUsCi0JCQkJdGFic2V0dGluZ3M9KDMyLCAwKSwKLQkJCQlyZWFkb25seT0wLAotCQkJCWRlYnVnZ2VyPU5vbmUsCi0JCQkJZmlsZT0nJyk6Ci0JCVRleHRFZGl0b3IuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dCwgY2FsbGJhY2ssIDAsIGluc2V0LCBmb250c2V0dGluZ3MsIHRhYnNldHRpbmdzLCByZWFkb25seSkKLQkJc2VsZi5iaW5kKCJjbWRbIiwgc2VsZi5kb21lbnVfc2hpZnRsZWZ0KQotCQlzZWxmLmJpbmQoImNtZF0iLCBzZWxmLmRvbWVudV9zaGlmdHJpZ2h0KQotCQlzZWxmLmJpbmQoImNtZHNoaWZ0WyIsIHNlbGYuZG9tZW51X3VuY29tbWVudCkKLQkJc2VsZi5iaW5kKCJjbWRzaGlmdF0iLCBzZWxmLmRvbWVudV9jb21tZW50KQotCQlzZWxmLmJpbmQoImNtZHNoaWZ0ZCIsIHNlbGYuYWxsZGlydHkpCi0JCXNlbGYuZmlsZSA9IGZpbGUJIyBvbmx5IGZvciBkZWJ1Z2dlciByZWZlcmVuY2UKLQkJc2VsZi5fZGVidWdnZXIgPSBkZWJ1Z2dlcgotCQlpZiBkZWJ1Z2dlcjoKLQkJCWRlYnVnZ2VyLnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCi0JCXNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCi0JCXNlbGYuZG9fZm9udGlmeSA9IDAKLQkKLQkjZGVmIG9wZW4oc2VsZik6Ci0JIwlUZXh0RWRpdG9yLm9wZW4oc2VsZikKLQkjCWlmIHNlbGYuZG9fZm9udGlmeToKLQkjCQlzZWxmLmZvbnRpZnkoKQotCSMJc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKLQkKLQlkZWYgX2dldGZsYWdzKHNlbGYpOgotCQlmbGFncyA9IChXQVNURWNvbnN0LndlRG9EcmF3T2Zmc2NyZWVuIHwgV0FTVEVjb25zdC53ZURvVXNlVGVtcE1lbSB8Ci0JCQkJV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUpCi0JCWlmIHNlbGYucmVhZG9ubHk6Ci0JCQlmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvUmVhZE9ubHkKLQkJZWxzZToKLQkJCWZsYWdzID0gZmxhZ3MgfCBXQVNURWNvbnN0LndlRG9VbmRvCi0JCXJldHVybiBmbGFncwotCQotCWRlZiB0ZXh0Y2hhbmdlZChzZWxmLCBhbGw9MCk6Ci0JCXNlbGYuY2hhbmdlZCA9IDEKLQkJaWYgYWxsOgotCQkJc2VsZi5fZGlydHkgPSAoMCwgTm9uZSkKLQkJCXJldHVybgotCQlvbGRzZWwgPSBzZWxmLm9sZHNlbGVjdGlvbgotCQlzZWwgPSBzZWxmLmdldHNlbGVjdGlvbigpCi0JCWlmIG5vdCBzZWw6Ci0JCQkjIFhYWCB3aGF0IHRvIGRvPwotCQkJcmV0dXJuCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWwKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCi0JCWlmIG9sZHNlbDoKLQkJCW9sZHNlbHN0YXJ0LCBvbGRzZWxlbmQgPSBtaW4ob2xkc2VsKSwgbWF4KG9sZHNlbCkKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIG9sZHNlbHN0YXJ0KSwgbWF4KHNlbGVuZCwgb2xkc2VsZW5kKQotCQlzdGFydGxpbmUgPSBzZWxmLm9mZnNldHRvbGluZShzZWxzdGFydCkKLQkJZW5kbGluZSA9IHNlbGYub2Zmc2V0dG9saW5lKHNlbGVuZCkKLQkJc2Vsc3RhcnQsIF8gPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShzdGFydGxpbmUpCi0JCV8sIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKGVuZGxpbmUpCi0JCWlmIHNlbHN0YXJ0ID4gMDoKLQkJCXNlbHN0YXJ0ID0gc2Vsc3RhcnQgLSAxCi0JCXNlbGYuX2RpcnR5ID0gKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCi0JZGVmIGlkbGUoc2VsZik6Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYudGVkLldFSWRsZSgpCi0JCWlmIG5vdCBzZWxmLmRvX2ZvbnRpZnk6Ci0JCQlyZXR1cm4KLQkJc3RhcnQsIGVuZCA9IHNlbGYuX2RpcnR5Ci0JCWlmIHN0YXJ0IGlzIE5vbmU6Ci0JCQlyZXR1cm4KLQkJdGV4dExlbmd0aCA9IHNlbGYudGVkLldFR2V0VGV4dExlbmd0aCgpCi0JCWlmIGVuZCBpcyBOb25lOgotCQkJZW5kID0gdGV4dExlbmd0aAotCQlpZiBzdGFydCA+PSBlbmQ6Ci0JCQlzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQotCQllbHNlOgotCQkJc2VsZi5mb250aWZ5KHN0YXJ0LCBlbmQpCi0JCQlzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQotCQotCWRlZiBhbGxkaXJ0eShzZWxmLCAqYXJncyk6Ci0JCXNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCi0JCi0JZGVmIGZvbnRpZnkoc2VsZiwgc3RhcnQ9MCwgZW5kPU5vbmUpOgotCQkjVy5TZXRDdXJzb3IoJ3dhdGNoJykKLQkJaWYgc2VsZi5yZWFkb25seToKLQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZSZWFkT25seSwgMCkKLQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRk91dGxpbmVIaWxpdGUsIDApCi0JCXNlbGYudGVkLldFRGVhY3RpdmF0ZSgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAwKQotCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgMCkKLQkJcHl0ZXh0ID0gc2VsZi5nZXQoKS5yZXBsYWNlKCJcciIsICJcbiIpCi0JCWlmIGVuZCBpcyBOb25lOgotCQkJZW5kID0gbGVuKHB5dGV4dCkKLQkJZWxzZToKLQkJCWVuZCA9IG1pbihlbmQsIGxlbihweXRleHQpKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzdGFydCwgZW5kKQotCQlzZWxmLnRlZC5XRVNldFN0eWxlKFdBU1RFY29uc3Qud2VEb0ZhY2UgfCBXQVNURWNvbnN0LndlRG9Db2xvciwgCi0JCQkJKDAsIDAsIDEyLCAoMCwgMCwgMCkpKQotCQkKLQkJdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KHB5dGV4dCwgc3RhcnQsIGVuZCkKLQkJc3R5bGVzID0gewotCQkJJ3N0cmluZyc6IChXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsIGtTdHJpbmdDb2xvcikpLAotCQkJJ2tleXdvcmQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDEsIDAsICgwLCAwLCAwKSkpLAotCQkJJ2NvbW1lbnQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLCAoMCwgMCwgMCwga0NvbW1lbnRDb2xvcikpLAotCQkJJ2lkZW50aWZpZXInOiAoV0FTVEVjb25zdC53ZURvQ29sb3IsICgwLCAwLCAwLCAoMHhiZmZmLCAwLCAwKSkpCi0JCX0KLQkJc2V0c2VsZWN0aW9uID0gc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24KLQkJc2V0c3R5bGUgPSBzZWxmLnRlZC5XRVNldFN0eWxlCi0JCWZvciB0YWcsIHN0YXJ0LCBlbmQsIHN1Ymxpc3QgaW4gdGFnczoKLQkJCXNldHNlbGVjdGlvbihzdGFydCwgZW5kKQotCQkJbW9kZSwgc3R5bGUgPSBzdHlsZXNbdGFnXQotCQkJc2V0c3R5bGUobW9kZSwgc3R5bGUpCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAxKQotCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGVW5kbywgMSkKLQkJc2VsZi50ZWQuV0VBY3RpdmF0ZSgpCi0JCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZPdXRsaW5lSGlsaXRlLCAxKQotCQlpZiBzZWxmLnJlYWRvbmx5OgotCQkJc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAxKQotCQotCWRlZiBkb21lbnVfc2hpZnRsZWZ0KHNlbGYpOgotCQlzZWxmLmV4cGFuZHNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQotCQlzbmlwcGV0ID0gc2VsZi5nZXRzZWxlY3RlZHRleHQoKQotCQlsaW5lcyA9IHN0cmluZy5zcGxpdChzbmlwcGV0LCAnXHInKQotCQlmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKLQkJCWlmIGxpbmVzW2ldWzoxXSA9PSAnXHQnOgotCQkJCWxpbmVzW2ldID0gbGluZXNbaV1bMTpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBkb21lbnVfc2hpZnRyaWdodChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIChub3QgbGluZXNbLTFdKSk6Ci0JCQlsaW5lc1tpXSA9ICdcdCcgKyBsaW5lc1tpXQotCQlzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCi0JCXNlbGYuaW5zZXJ0KHNuaXBwZXQpCi0JCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKLQkKLQlkZWYgZG9tZW51X3VuY29tbWVudChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6Ci0JCQltID0gY29tbWVudFBhdC5tYXRjaChsaW5lc1tpXSkKLQkJCWlmIG06Ci0JCQkJcG9zID0gbS5zdGFydCgxKQotCQkJCWxpbmVzW2ldID0gbGluZXNbaV1bOnBvc10gKyBsaW5lc1tpXVtwb3MrMTpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBkb21lbnVfY29tbWVudChzZWxmKToKLQkJc2VsZi5leHBhbmRzZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQotCQlzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKLQkJc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKLQkJbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKLQkJaW5kZW50ID0gMzAwMCAjIGFyYml0cmFyeSBsYXJnZSBudW1iZXIuLi4KLQkJZm9yIGxpbmUgaW4gbGluZXM6Ci0JCQlpZiBzdHJpbmcuc3RyaXAobGluZSk6Ci0JCQkJbSA9IGluZGVudFBhdC5tYXRjaChsaW5lKQotCQkJCWlmIG06Ci0JCQkJCWluZGVudCA9IG1pbihpbmRlbnQsIG0ucmVnc1swXVsxXSkKLQkJCQllbHNlOgotCQkJCQlpbmRlbnQgPSAwCi0JCQkJCWJyZWFrCi0JCWZvciBpIGluIHJhbmdlKGxlbihsaW5lcykgLSAobm90IGxpbmVzWy0xXSkpOgotCQkJbGluZXNbaV0gPSBsaW5lc1tpXVs6aW5kZW50XSArICIjIiArIGxpbmVzW2ldW2luZGVudDpdCi0JCXNuaXBwZXQgPSBzdHJpbmcuam9pbihsaW5lcywgJ1xyJykKLQkJc2VsZi5pbnNlcnQoc25pcHBldCkKLQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbHN0YXJ0ICsgbGVuKHNuaXBwZXQpKQotCQotCWRlZiBzZXRmaWxlKHNlbGYsIGZpbGUpOgotCQlzZWxmLmZpbGUgPSBmaWxlCi0JCi0JZGVmIHNldChzZWxmLCB0ZXh0LCBmaWxlID0gJycpOgotCQlvbGRmaWxlID0gc2VsZi5maWxlCi0JCXNlbGYuZmlsZSA9IGZpbGUKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBvbGRmaWxlKQotCQkJc2VsZi5fZGVidWdnZXIucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIGZpbGUpCi0JCVRleHRFZGl0b3Iuc2V0KHNlbGYsIHRleHQpCi0JCi0JZGVmIGNsb3NlKHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuX2RlYnVnZ2VyLnVucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIHNlbGYuZmlsZSkKLQkJCXNlbGYuX2RlYnVnZ2VyID0gTm9uZQotCQlUZXh0RWRpdG9yLmNsb3NlKHNlbGYpCQkKLQkKLQlkZWYgY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCWlmIG5vdCBzZWxmLl9lbmFibGVkOgotCQkJcmV0dXJuCi0JCWlmIHNlbGYuX2RlYnVnZ2VyIGFuZCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6Ci0JCQlzZWxmLmJyZWFraGl0KHBvaW50LCBtb2RpZmllcnMpCi0JCWVsaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlibCwgYnQsIGJyLCBiYiA9IHNlbGYuX2dldGJyZWFrcmVjdCgpCi0JCQlRZC5FcmFzZVJlY3QoKGJsLCBidCwgYnItMSwgYmIpKQotCQkJVGV4dEVkaXRvci5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQkJc2VsZi5kcmF3YnJlYWtwb2ludHMoKQotCQllbHNlOgotCQkJVGV4dEVkaXRvci5jbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzKQotCQkJaWYgc2VsZi50ZWQuV0VHZXRDbGlja0NvdW50KCkgPj0gMzoKLQkJCQkjIHNlbGVjdCBibG9jayB3aXRoIG91ciBpbmRlbnQKLQkJCQlsaW5lcyA9IHN0cmluZy5zcGxpdChzZWxmLmdldCgpLCAnXHInKQotCQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCi0JCQkJbGluZW5vID0gc2VsZi50ZWQuV0VPZmZzZXRUb0xpbmUoc2Vsc3RhcnQpCi0JCQkJdGFicyA9IDAKLQkJCQlsaW5lID0gbGluZXNbbGluZW5vXQotCQkJCXdoaWxlIGxpbmVbdGFiczpdIGFuZCBsaW5lW3RhYnNdID09ICdcdCc6Ci0JCQkJCXRhYnMgPSB0YWJzICsgMQotCQkJCXRhYnN0YWcgPSAnXHQnICogdGFicwotCQkJCWZyb21saW5lID0gMAotCQkJCXRvbGluZSA9IGxlbihsaW5lcykKLQkJCQlpZiB0YWJzOgotCQkJCQlmb3IgaSBpbiByYW5nZShsaW5lbm8gLSAxLCAtMSwgLTEpOgotCQkJCQkJbGluZSA9IGxpbmVzW2ldCi0JCQkJCQlpZiBsaW5lWzp0YWJzXSA8PiB0YWJzdGFnOgotCQkJCQkJCWZyb21saW5lID0gaSArIDEKLQkJCQkJCQlicmVhawotCQkJCQlmb3IgaSBpbiByYW5nZShsaW5lbm8gKyAxLCB0b2xpbmUpOgotCQkJCQkJbGluZSA9IGxpbmVzW2ldCi0JCQkJCQlpZiBsaW5lWzp0YWJzXSA8PiB0YWJzdGFnOgotCQkJCQkJCXRvbGluZSA9IGkgLSAxCi0JCQkJCQkJYnJlYWsKLQkJCQlzZWxzdGFydCwgZHVtbXkgPSBzZWxmLnRlZC5XRUdldExpbmVSYW5nZShmcm9tbGluZSkKLQkJCQlkdW1teSwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UodG9saW5lKQotCQkJCXNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCi0JCi0JZGVmIGJyZWFraGl0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgotCQlpZiBub3Qgc2VsZi5maWxlOgotCQkJcmV0dXJuCi0JCWRlc3RyZWN0ID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCi0JCW9mZnNldCwgZWRnZSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KHBvaW50KQotCQlsaW5lbm8gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShvZmZzZXQpICsgMQotCQlpZiBwb2ludFsxXSA8PSBkZXN0cmVjdFszXToKLQkJCXNlbGYuX2RlYnVnZ2VyLmNsZWFyX2JyZWFrc19hYm92ZShzZWxmLmZpbGUsIHNlbGYuY291bnRsaW5lcygpKQotCQkJc2VsZi5fZGVidWdnZXIudG9nZ2xlX2JyZWFrKHNlbGYuZmlsZSwgbGluZW5vKQotCQllbHNlOgotCQkJc2VsZi5fZGVidWdnZXIuY2xlYXJfYnJlYWtzX2Fib3ZlKHNlbGYuZmlsZSwgbGluZW5vKQotCQotCWRlZiBrZXkoc2VsZiwgY2hhciwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5IGFuZCBub3QgY2hhciBpbiBXa2V5cy5hcnJvd2tleXM6Ci0JCQlyZXR1cm4KLQkJaWYgY2hhciA9PSAnXHInOgotCQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJCXNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQotCQkJbGFzdGNoYXIgPSBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKHNlbHN0YXJ0LTEpKQotCQkJaWYgbGFzdGNoYXIgPD4gJ1xyJyBhbmQgc2Vsc3RhcnQ6Ci0JCQkJcG9zLCBkdW1teSA9IHNlbGYudGVkLldFRmluZExpbmUoc2Vsc3RhcnQsIDApCi0JCQkJbGluZXJlcyA9IFJlcy5SZXNvdXJjZSgnJykKLQkJCQlzZWxmLnRlZC5XRUNvcHlSYW5nZShwb3MsIHNlbHN0YXJ0LCBsaW5lcmVzLCBOb25lLCBOb25lKQotCQkJCWxpbmUgPSBsaW5lcmVzLmRhdGEgKyAnXG4nCi0JCQkJdGFiY291bnQgPSBzZWxmLmV4dHJhdGFicyhsaW5lKQotCQkJCXNlbGYudGVkLldFS2V5KG9yZCgnXHInKSwgMCkKLQkJCQlmb3IgaSBpbiByYW5nZSh0YWJjb3VudCk6Ci0JCQkJCXNlbGYudGVkLldFS2V5KG9yZCgnXHQnKSwgMCkKLQkJCWVsc2U6Ci0JCQkJc2VsZi50ZWQuV0VLZXkob3JkKCdccicpLCAwKQotCQllbGlmIGNoYXIgaW4gJyldfSc6Ci0JCQlzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKLQkJCXNlbGYuYmFsYW5jZXBhcmVucyhjaGFyKQotCQllbHNlOgotCQkJc2VsZi50ZWQuV0VLZXkob3JkKGNoYXIpLCBtb2RpZmllcnMpCi0JCWlmIGNoYXIgbm90IGluIFdrZXlzLm5hdmlnYXRpb25rZXlzOgotCQkJc2VsZi50ZXh0Y2hhbmdlZCgpCi0JCXNlbGYuc2VsZWN0aW9uY2hhbmdlZCgpCi0JCXNlbGYudXBkYXRlc2Nyb2xsYmFycygpCi0JCi0JZGVmIGJhbGFuY2VwYXJlbnMoc2VsZiwgY2hhcik6Ci0JCWlmIGNoYXIgPT0gJyknOgotCQkJdGFyZ2V0ID0gJygnCi0JCWVsaWYgY2hhciA9PSAnXSc6Ci0JCQl0YXJnZXQgPSAnWycKLQkJZWxpZiBjaGFyID09ICd9JzoKLQkJCXRhcmdldCA9ICd7JwotCQlyZWN1cnNpb25sZXZlbCA9IDEKLQkJc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKLQkJY291bnQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCkgLSAyCi0JCW1pbmNvdW50ID0gbWF4KDAsIGNvdW50IC0gMjA0OCkKLQkJbGFzdHF1b3RlID0gTm9uZQotCQl3aGlsZSBjb3VudCA+IG1pbmNvdW50OgotCQkJdGVzdGNoYXIgPSBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKGNvdW50KSkKLQkJCWlmIHRlc3RjaGFyIGluICJcIiciIGFuZCBjaHIoc2VsZi50ZWQuV0VHZXRDaGFyKGNvdW50IC0gMSkpIDw+ICdcXCc6Ci0JCQkJaWYgbGFzdHF1b3RlID09IHRlc3RjaGFyOgotCQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsIC0gMQotCQkJCQlsYXN0cXVvdGUgPSBOb25lCi0JCQkJZWxpZiBub3QgbGFzdHF1b3RlOgotCQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsICsgMQotCQkJCQlsYXN0cXVvdGUgPSB0ZXN0Y2hhcgotCQkJZWxpZiBub3QgbGFzdHF1b3RlIGFuZCB0ZXN0Y2hhciA9PSBjaGFyOgotCQkJCXJlY3Vyc2lvbmxldmVsID0gcmVjdXJzaW9ubGV2ZWwgKyAxCi0JCQllbGlmIG5vdCBsYXN0cXVvdGUgYW5kIHRlc3RjaGFyID09IHRhcmdldDoKLQkJCQlyZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsIC0gMQotCQkJCWlmIHJlY3Vyc2lvbmxldmVsID09IDA6Ci0JCQkJCWltcG9ydCB0aW1lCi0JCQkJCWF1dG9zY3JvbGwgPSBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgLTEpCi0JCQkJCWlmIGF1dG9zY3JvbGw6Ci0JCQkJCQlzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgMCkKLQkJCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oY291bnQsIGNvdW50ICsgMSkKLQkJCQkJc2VsZi5fcGFyZW50d2luZG93LndpZC5HZXRXaW5kb3dQb3J0KCkuUURGbHVzaFBvcnRCdWZmZXIoTm9uZSkgICMgbmVlZGVkIHVuZGVyIE9TWAotCQkJCQl0aW1lLnNsZWVwKDAuMikKLQkJCQkJc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKLQkJCQkJaWYgYXV0b3Njcm9sbDoKLQkJCQkJCXNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZBdXRvU2Nyb2xsLCAxKQotCQkJCQlicmVhawotCQkJY291bnQgPSBjb3VudCAtIDEKLQkKLQlkZWYgZXh0cmF0YWJzKHNlbGYsIGxpbmUpOgotCQl0YWJjb3VudCA9IDAKLQkJZm9yIGMgaW4gbGluZToKLQkJCWlmIGMgPD4gJ1x0JzoKLQkJCQlicmVhawotCQkJdGFiY291bnQgPSB0YWJjb3VudCArIDEKLQkJbGFzdCA9IDAKLQkJY2xlYW5saW5lID0gJycKLQkJdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KGxpbmUpCi0JCSMgc3RyaXAgY29tbWVudHMgYW5kIHN0cmluZ3MKLQkJZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgotCQkJaWYgdGFnIGluICgnc3RyaW5nJywgJ2NvbW1lbnQnKToKLQkJCQljbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6c3RhcnRdCi0JCQkJbGFzdCA9IGVuZAotCQljbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6XQotCQljbGVhbmxpbmUgPSBzdHJpbmcuc3RyaXAoY2xlYW5saW5lKQotCQlpZiBjbGVhbmxpbmUgYW5kIGNsZWFubGluZVstMV0gPT0gJzonOgotCQkJdGFiY291bnQgPSB0YWJjb3VudCArIDEKLQkJZWxzZToKLQkJCSMgZXh0cmEgaW5kZW50IGFmdGVyIHVuYmFsYW5jZWQgKCwgWyBvciB7Ci0JCQlmb3Igb3BlbiwgY2xvc2UgaW4gKCgnKCcsICcpJyksICgnWycsICddJyksICgneycsICd9JykpOgotCQkJCWNvdW50ID0gc3RyaW5nLmNvdW50KGNsZWFubGluZSwgb3BlbikKLQkJCQlpZiBjb3VudCBhbmQgY291bnQgPiBzdHJpbmcuY291bnQoY2xlYW5saW5lLCBjbG9zZSk6Ci0JCQkJCXRhYmNvdW50ID0gdGFiY291bnQgKyAyCi0JCQkJCWJyZWFrCi0JCXJldHVybiB0YWJjb3VudAotCQotCWRlZiByb2xsb3ZlcihzZWxmLCBwb2ludCwgb25vZmYpOgotCQlpZiBvbm9mZjoKLQkJCWlmIHNlbGYuX2RlYnVnZ2VyIGFuZCBzZWxmLnB0X2luX2JyZWFrcyhwb2ludCk6Ci0JCQkJV2Jhc2UuU2V0Q3Vyc29yKCJhcnJvdyIpCi0JCQllbHNlOgotCQkJCVdiYXNlLlNldEN1cnNvcigiaUJlYW0iKQotCQotCWRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgotCQlUZXh0RWRpdG9yLmRyYXcoc2VsZiwgdmlzUmduKQotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuZHJhd2JyZWFrcG9pbnRzKCkKLQkKLQlkZWYgc2hvd2JyZWFrcG9pbnRzKHNlbGYsIG9ub2ZmKToKLQkJaWYgKG5vdCBub3Qgc2VsZi5fZGVidWdnZXIpIDw+IG9ub2ZmOgotCQkJaWYgb25vZmY6Ci0JCQkJaWYgbm90IF9fZGVidWdfXzoKLQkJCQkJaW1wb3J0IFcKLQkJCQkJcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZGVidWcgaW4gXCJPcHRpbWl6ZSBieXRlY29kZVwiIG1vZGUuXHIoc2VlIFwiRGVmYXVsdCBzdGFydHVwIG9wdGlvbnNcIiBpbiBFZGl0UHl0aG9uUHJlZmVyZW5jZXMpIgotCQkJCWltcG9ydCBQeURlYnVnZ2VyCi0JCQkJc2VsZi5fZGVidWdnZXIgPSBQeURlYnVnZ2VyLmdldGRlYnVnZ2VyKCkKLQkJCQlzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgc2VsZi5maWxlKQotCQkJZWxpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCQlzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCi0JCQkJc2VsZi5fZGVidWdnZXIgPSBOb25lCi0JCQlzZWxmLmFkanVzdChzZWxmLl9ib3VuZHMpCi0JCi0JZGVmIHRvZ2dsZWJyZWFrcG9pbnRzKHNlbGYpOgotCQlzZWxmLnNob3dicmVha3BvaW50cyhub3Qgc2VsZi5fZGVidWdnZXIpCi0JCi0JZGVmIGNsZWFyYnJlYWtwb2ludHMoc2VsZik6Ci0JCWlmIHNlbGYuZmlsZToKLQkJCXNlbGYuX2RlYnVnZ2VyLmNsZWFyX2FsbF9maWxlX2JyZWFrcyhzZWxmLmZpbGUpCi0JCi0JZGVmIGVkaXRicmVha3BvaW50cyhzZWxmKToKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlzZWxmLl9kZWJ1Z2dlci5lZGl0X2JyZWFrcygpCi0JCQlzZWxmLl9kZWJ1Z2dlci5icmVha3N2aWV3ZXIuc2VsZWN0ZmlsZShzZWxmLmZpbGUpCi0JCi0JZGVmIGRyYXdicmVha3BvaW50cyhzZWxmLCBlcmFzZWFsbCA9IDApOgotCQlicmVha3JlY3QgPSBibCwgYnQsIGJyLCBiYiA9IHNlbGYuX2dldGJyZWFrcmVjdCgpCi0JCWJyID0gYnIgLSAxCi0JCXNlbGYuU2V0UG9ydCgpCi0JCVFkLlBlblBhdChRZC5HZXRRREdsb2JhbHNHcmF5KCkpCi0JCVFkLlBhaW50UmVjdCgoYnIsIGJ0LCBiciArIDEsIGJiKSkKLQkJUWQuUGVuTm9ybWFsKCkKLQkJc2VsZi5fcGFyZW50d2luZG93LnRlbXBjbGlwcmVjdChicmVha3JlY3QpCi0JCVFkLlJHQkZvcmVDb2xvcigoMHhmZmZmLCAwLCAwKSkKLQkJdHJ5OgotCQkJbGFzdHRvcCA9IGJ0Ci0JCQlzZWxmX3RlZCA9IHNlbGYudGVkCi0JCQlRZF9QYWludE92YWwgPSBRZC5QYWludE92YWwKLQkJCVFkX0VyYXNlUmVjdCA9IFFkLkVyYXNlUmVjdAotCQkJZm9yIGxpbmVubyBpbiBzZWxmLl9kZWJ1Z2dlci5nZXRfZmlsZV9icmVha3Moc2VsZi5maWxlKToKLQkJCQlzdGFydCwgZW5kID0gc2VsZl90ZWQuV0VHZXRMaW5lUmFuZ2UobGluZW5vIC0gMSkKLQkJCQlpZiBsaW5lbm8gPD4gc2VsZl90ZWQuV0VPZmZzZXRUb0xpbmUoc3RhcnQpICsgMToKLQkJCQkJIyBicmVha3BvaW50cyBiZXlvbmQgb3VyIHRleHQ6IGVyYXNlIHJlc3QsIGFuZCBiYWNrIG91dAotCQkJCQlRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgYmIpKQotCQkJCQlicmVhawotCQkJCSh4LCB5KSwgaCA9IHNlbGZfdGVkLldFR2V0UG9pbnQoc3RhcnQsIDApCi0JCQkJYm90dG9tID0geSArIGgKLQkJCQkjcHJpbnQgeSwgKGxhc3R0b3AsIGJvdHRvbSkKLQkJCQlpZiBib3R0b20gPiBsYXN0dG9wOgotCQkJCQlRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgeSArIGggKiBlcmFzZWFsbCkpCi0JCQkJCWxhc3R0b3AgPSBib3R0b20KLQkJCQlyZWRidWxsZXQgPSBibCArIDIsIHkgKyAzLCBibCArIDgsIHkgKyA5Ci0JCQkJUWRfUGFpbnRPdmFsKHJlZGJ1bGxldCkKLQkJCWVsc2U6Ci0JCQkJUWRfRXJhc2VSZWN0KChibCwgbGFzdHRvcCwgYnIsIGJiKSkKLQkJCVFkLlJHQkZvcmVDb2xvcigoMCwgMCwgMCkpCi0JCWZpbmFsbHk6Ci0JCQlzZWxmLl9wYXJlbnR3aW5kb3cucmVzdG9yZWNsaXAoKQotCQotCWRlZiB1cGRhdGVzY3JvbGxiYXJzKHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCXNlbGYuZHJhd2JyZWFrcG9pbnRzKDEpCi0JCVRleHRFZGl0b3IudXBkYXRlc2Nyb2xsYmFycyhzZWxmKQotCQotCWRlZiBwdF9pbl9icmVha3Moc2VsZiwgcG9pbnQpOgotCQlyZXR1cm4gUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2dldGJyZWFrcmVjdCgpKQotCQotCWRlZiBfZ2V0YnJlYWtyZWN0KHNlbGYpOgotCQlpZiBzZWxmLl9kZWJ1Z2dlcjoKLQkJCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJCXJldHVybiAobCsxLCB0KzEsIGwgKyAxMiwgYi0xKQotCQllbHNlOgotCQkJcmV0dXJuICgwLCAwLCAwLCAwKQotCQotCWRlZiBfZ2V0dmlld3JlY3Qoc2VsZik6Ci0JCWwsIHQsIHIsIGIgPSBzZWxmLl9ib3VuZHMKLQkJaWYgc2VsZi5fZGVidWdnZXI6Ci0JCQlyZXR1cm4gKGwgKyAxNywgdCArIDIsIHIsIGIgLSAyKQotCQllbHNlOgotCQkJcmV0dXJuIChsICsgNSwgdCArIDIsIHIsIGIgLSAyKQotCQotCWRlZiBfY2FsY3RleHRib3VuZHMoc2VsZik6Ci0JCXZpZXdyZWN0ID0gbCwgdCwgciwgYiA9IHNlbGYuX2dldHZpZXdyZWN0KCkKLQkJaWYgc2VsZi50ZWQ6Ci0JCQlkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQotCQkJdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKLQkJCXhzaGlmdCA9IGwgLSB2bAotCQkJeXNoaWZ0ID0gdCAtIHZ0Ci0JCQlpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgotCQkJCXlzaGlmdCA9IHQgLSBkdAotCQkJZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCi0JCWVsc2U6Ci0JCQlkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKLQkJcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAorCisgICAgIiIiQSBzcGVjaWFsaXplZCBQeXRob24gc291cmNlIGVkaXQgd2lkZ2V0IiIiCisKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGV4dD0iIiwgY2FsbGJhY2s9Tm9uZSwgaW5zZXQ9KDQsIDQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRzZXR0aW5ncz1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhYnNldHRpbmdzPSgzMiwgMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhZG9ubHk9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z2dlcj1Ob25lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU9JycpOgorICAgICAgICBUZXh0RWRpdG9yLl9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRleHQsIGNhbGxiYWNrLCAwLCBpbnNldCwgZm9udHNldHRpbmdzLCB0YWJzZXR0aW5ncywgcmVhZG9ubHkpCisgICAgICAgIHNlbGYuYmluZCgiY21kWyIsIHNlbGYuZG9tZW51X3NoaWZ0bGVmdCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRdIiwgc2VsZi5kb21lbnVfc2hpZnRyaWdodCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRzaGlmdFsiLCBzZWxmLmRvbWVudV91bmNvbW1lbnQpCisgICAgICAgIHNlbGYuYmluZCgiY21kc2hpZnRdIiwgc2VsZi5kb21lbnVfY29tbWVudCkKKyAgICAgICAgc2VsZi5iaW5kKCJjbWRzaGlmdGQiLCBzZWxmLmFsbGRpcnR5KQorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlICAgICAgICAjIG9ubHkgZm9yIGRlYnVnZ2VyIHJlZmVyZW5jZQorICAgICAgICBzZWxmLl9kZWJ1Z2dlciA9IGRlYnVnZ2VyCisgICAgICAgIGlmIGRlYnVnZ2VyOgorICAgICAgICAgICAgZGVidWdnZXIucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIHNlbGYuZmlsZSkKKyAgICAgICAgc2VsZi5fZGlydHkgPSAoMCwgTm9uZSkKKyAgICAgICAgc2VsZi5kb19mb250aWZ5ID0gMAorCisgICAgI2RlZiBvcGVuKHNlbGYpOgorICAgICMgICAgICAgVGV4dEVkaXRvci5vcGVuKHNlbGYpCisgICAgIyAgICAgICBpZiBzZWxmLmRvX2ZvbnRpZnk6CisgICAgIyAgICAgICAgICAgICAgIHNlbGYuZm9udGlmeSgpCisgICAgIyAgICAgICBzZWxmLl9kaXJ0eSA9IChOb25lLCBOb25lKQorCisgICAgZGVmIF9nZXRmbGFncyhzZWxmKToKKyAgICAgICAgZmxhZ3MgPSAoV0FTVEVjb25zdC53ZURvRHJhd09mZnNjcmVlbiB8IFdBU1RFY29uc3Qud2VEb1VzZVRlbXBNZW0gfAorICAgICAgICAgICAgICAgICAgICAgICAgV0FTVEVjb25zdC53ZURvQXV0b1Njcm9sbCB8IFdBU1RFY29uc3Qud2VEb091dGxpbmVIaWxpdGUpCisgICAgICAgIGlmIHNlbGYucmVhZG9ubHk6CisgICAgICAgICAgICBmbGFncyA9IGZsYWdzIHwgV0FTVEVjb25zdC53ZURvUmVhZE9ubHkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZsYWdzID0gZmxhZ3MgfCBXQVNURWNvbnN0LndlRG9VbmRvCisgICAgICAgIHJldHVybiBmbGFncworCisgICAgZGVmIHRleHRjaGFuZ2VkKHNlbGYsIGFsbD0wKToKKyAgICAgICAgc2VsZi5jaGFuZ2VkID0gMQorICAgICAgICBpZiBhbGw6CisgICAgICAgICAgICBzZWxmLl9kaXJ0eSA9ICgwLCBOb25lKQorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIG9sZHNlbCA9IHNlbGYub2xkc2VsZWN0aW9uCisgICAgICAgIHNlbCA9IHNlbGYuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgaWYgbm90IHNlbDoKKyAgICAgICAgICAgICMgWFhYIHdoYXQgdG8gZG8/CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbAorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgaWYgb2xkc2VsOgorICAgICAgICAgICAgb2xkc2Vsc3RhcnQsIG9sZHNlbGVuZCA9IG1pbihvbGRzZWwpLCBtYXgob2xkc2VsKQorICAgICAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgb2xkc2Vsc3RhcnQpLCBtYXgoc2VsZW5kLCBvbGRzZWxlbmQpCisgICAgICAgIHN0YXJ0bGluZSA9IHNlbGYub2Zmc2V0dG9saW5lKHNlbHN0YXJ0KQorICAgICAgICBlbmRsaW5lID0gc2VsZi5vZmZzZXR0b2xpbmUoc2VsZW5kKQorICAgICAgICBzZWxzdGFydCwgXyA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKHN0YXJ0bGluZSkKKyAgICAgICAgXywgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UoZW5kbGluZSkKKyAgICAgICAgaWYgc2Vsc3RhcnQgPiAwOgorICAgICAgICAgICAgc2Vsc3RhcnQgPSBzZWxzdGFydCAtIDEKKyAgICAgICAgc2VsZi5fZGlydHkgPSAoc2Vsc3RhcnQsIHNlbGVuZCkKKworICAgIGRlZiBpZGxlKHNlbGYpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLnRlZC5XRUlkbGUoKQorICAgICAgICBpZiBub3Qgc2VsZi5kb19mb250aWZ5OgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmLl9kaXJ0eQorICAgICAgICBpZiBzdGFydCBpcyBOb25lOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIHRleHRMZW5ndGggPSBzZWxmLnRlZC5XRUdldFRleHRMZW5ndGgoKQorICAgICAgICBpZiBlbmQgaXMgTm9uZToKKyAgICAgICAgICAgIGVuZCA9IHRleHRMZW5ndGgKKyAgICAgICAgaWYgc3RhcnQgPj0gZW5kOgorICAgICAgICAgICAgc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuZm9udGlmeShzdGFydCwgZW5kKQorICAgICAgICAgICAgc2VsZi5fZGlydHkgPSAoTm9uZSwgTm9uZSkKKworICAgIGRlZiBhbGxkaXJ0eShzZWxmLCAqYXJncyk6CisgICAgICAgIHNlbGYuX2RpcnR5ID0gKDAsIE5vbmUpCisKKyAgICBkZWYgZm9udGlmeShzZWxmLCBzdGFydD0wLCBlbmQ9Tm9uZSk6CisgICAgICAgICNXLlNldEN1cnNvcignd2F0Y2gnKQorICAgICAgICBpZiBzZWxmLnJlYWRvbmx5OgorICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRlJlYWRPbmx5LCAwKQorICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGT3V0bGluZUhpbGl0ZSwgMCkKKyAgICAgICAgc2VsZi50ZWQuV0VEZWFjdGl2YXRlKCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDApCisgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZVbmRvLCAwKQorICAgICAgICBweXRleHQgPSBzZWxmLmdldCgpLnJlcGxhY2UoIlxyIiwgIlxuIikKKyAgICAgICAgaWYgZW5kIGlzIE5vbmU6CisgICAgICAgICAgICBlbmQgPSBsZW4ocHl0ZXh0KQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgZW5kID0gbWluKGVuZCwgbGVuKHB5dGV4dCkpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHN0YXJ0LCBlbmQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U3R5bGUoV0FTVEVjb25zdC53ZURvRmFjZSB8IFdBU1RFY29uc3Qud2VEb0NvbG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgKDAsIDAsIDEyLCAoMCwgMCwgMCkpKQorCisgICAgICAgIHRhZ3MgPSBQeUZvbnRpZnkuZm9udGlmeShweXRleHQsIHN0YXJ0LCBlbmQpCisgICAgICAgIHN0eWxlcyA9IHsKKyAgICAgICAgICAgICAgICAnc3RyaW5nJzogKFdBU1RFY29uc3Qud2VEb0NvbG9yLCAoMCwgMCwgMCwga1N0cmluZ0NvbG9yKSksCisgICAgICAgICAgICAgICAgJ2tleXdvcmQnOiAoV0FTVEVjb25zdC53ZURvRmFjZSwgKDAsIDEsIDAsICgwLCAwLCAwKSkpLAorICAgICAgICAgICAgICAgICdjb21tZW50JzogKFdBU1RFY29uc3Qud2VEb0ZhY2UgfCBXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsIGtDb21tZW50Q29sb3IpKSwKKyAgICAgICAgICAgICAgICAnaWRlbnRpZmllcic6IChXQVNURWNvbnN0LndlRG9Db2xvciwgKDAsIDAsIDAsICgweGJmZmYsIDAsIDApKSkKKyAgICAgICAgfQorICAgICAgICBzZXRzZWxlY3Rpb24gPSBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbgorICAgICAgICBzZXRzdHlsZSA9IHNlbGYudGVkLldFU2V0U3R5bGUKKyAgICAgICAgZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgorICAgICAgICAgICAgc2V0c2VsZWN0aW9uKHN0YXJ0LCBlbmQpCisgICAgICAgICAgICBtb2RlLCBzdHlsZSA9IHN0eWxlc1t0YWddCisgICAgICAgICAgICBzZXRzdHlsZShtb2RlLCBzdHlsZSkKKyAgICAgICAgc2VsZi50ZWQuV0VTZXRTZWxlY3Rpb24oc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDEpCisgICAgICAgIHNlbGYudGVkLldFRmVhdHVyZUZsYWcoV0FTVEVjb25zdC53ZUZVbmRvLCAxKQorICAgICAgICBzZWxmLnRlZC5XRUFjdGl2YXRlKCkKKyAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRk91dGxpbmVIaWxpdGUsIDEpCisgICAgICAgIGlmIHNlbGYucmVhZG9ubHk6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGUmVhZE9ubHksIDEpCisKKyAgICBkZWYgZG9tZW51X3NoaWZ0bGVmdChzZWxmKToKKyAgICAgICAgc2VsZi5leHBhbmRzZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSk6CisgICAgICAgICAgICBpZiBsaW5lc1tpXVs6MV0gPT0gJ1x0JzoKKyAgICAgICAgICAgICAgICBsaW5lc1tpXSA9IGxpbmVzW2ldWzE6XQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBkb21lbnVfc2hpZnRyaWdodChzZWxmKToKKyAgICAgICAgc2VsZi5leHBhbmRzZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpLCBtYXgoc2Vsc3RhcnQsIHNlbGVuZCkKKyAgICAgICAgc25pcHBldCA9IHNlbGYuZ2V0c2VsZWN0ZWR0ZXh0KCkKKyAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc25pcHBldCwgJ1xyJykKKyAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGVuKGxpbmVzKSAtIChub3QgbGluZXNbLTFdKSk6CisgICAgICAgICAgICBsaW5lc1tpXSA9ICdcdCcgKyBsaW5lc1tpXQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBkb21lbnVfdW5jb21tZW50KHNlbGYpOgorICAgICAgICBzZWxmLmV4cGFuZHNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBtaW4oc2Vsc3RhcnQsIHNlbGVuZCksIG1heChzZWxzdGFydCwgc2VsZW5kKQorICAgICAgICBzbmlwcGV0ID0gc2VsZi5nZXRzZWxlY3RlZHRleHQoKQorICAgICAgICBsaW5lcyA9IHN0cmluZy5zcGxpdChzbmlwcGV0LCAnXHInKQorICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpKToKKyAgICAgICAgICAgIG0gPSBjb21tZW50UGF0Lm1hdGNoKGxpbmVzW2ldKQorICAgICAgICAgICAgaWYgbToKKyAgICAgICAgICAgICAgICBwb3MgPSBtLnN0YXJ0KDEpCisgICAgICAgICAgICAgICAgbGluZXNbaV0gPSBsaW5lc1tpXVs6cG9zXSArIGxpbmVzW2ldW3BvcysxOl0KKyAgICAgICAgc25pcHBldCA9IHN0cmluZy5qb2luKGxpbmVzLCAnXHInKQorICAgICAgICBzZWxmLmluc2VydChzbmlwcGV0KQorICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzZWxzdGFydCwgc2Vsc3RhcnQgKyBsZW4oc25pcHBldCkpCisKKyAgICBkZWYgZG9tZW51X2NvbW1lbnQoc2VsZik6CisgICAgICAgIHNlbGYuZXhwYW5kc2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0U2VsZWN0aW9uKCkKKyAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgIHNuaXBwZXQgPSBzZWxmLmdldHNlbGVjdGVkdGV4dCgpCisgICAgICAgIGxpbmVzID0gc3RyaW5nLnNwbGl0KHNuaXBwZXQsICdccicpCisgICAgICAgIGluZGVudCA9IDMwMDAgIyBhcmJpdHJhcnkgbGFyZ2UgbnVtYmVyLi4uCisgICAgICAgIGZvciBsaW5lIGluIGxpbmVzOgorICAgICAgICAgICAgaWYgc3RyaW5nLnN0cmlwKGxpbmUpOgorICAgICAgICAgICAgICAgIG0gPSBpbmRlbnRQYXQubWF0Y2gobGluZSkKKyAgICAgICAgICAgICAgICBpZiBtOgorICAgICAgICAgICAgICAgICAgICBpbmRlbnQgPSBtaW4oaW5kZW50LCBtLnJlZ3NbMF1bMV0pCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgaW5kZW50ID0gMAorICAgICAgICAgICAgICAgICAgICBicmVhaworICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4obGluZXMpIC0gKG5vdCBsaW5lc1stMV0pKToKKyAgICAgICAgICAgIGxpbmVzW2ldID0gbGluZXNbaV1bOmluZGVudF0gKyAiIyIgKyBsaW5lc1tpXVtpbmRlbnQ6XQorICAgICAgICBzbmlwcGV0ID0gc3RyaW5nLmpvaW4obGluZXMsICdccicpCisgICAgICAgIHNlbGYuaW5zZXJ0KHNuaXBwZXQpCisgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxzdGFydCArIGxlbihzbmlwcGV0KSkKKworICAgIGRlZiBzZXRmaWxlKHNlbGYsIGZpbGUpOgorICAgICAgICBzZWxmLmZpbGUgPSBmaWxlCisKKyAgICBkZWYgc2V0KHNlbGYsIHRleHQsIGZpbGUgPSAnJyk6CisgICAgICAgIG9sZGZpbGUgPSBzZWxmLmZpbGUKKyAgICAgICAgc2VsZi5maWxlID0gZmlsZQorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgIHNlbGYuX2RlYnVnZ2VyLnVucmVnaXN0ZXJfZWRpdG9yKHNlbGYsIG9sZGZpbGUpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgZmlsZSkKKyAgICAgICAgVGV4dEVkaXRvci5zZXQoc2VsZiwgdGV4dCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlciA9IE5vbmUKKyAgICAgICAgVGV4dEVkaXRvci5jbG9zZShzZWxmKQorCisgICAgZGVmIGNsaWNrKHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5fZW5hYmxlZDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9kZWJ1Z2dlciBhbmQgc2VsZi5wdF9pbl9icmVha3MocG9pbnQpOgorICAgICAgICAgICAgc2VsZi5icmVha2hpdChwb2ludCwgbW9kaWZpZXJzKQorICAgICAgICBlbGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgYmwsIGJ0LCBiciwgYmIgPSBzZWxmLl9nZXRicmVha3JlY3QoKQorICAgICAgICAgICAgUWQuRXJhc2VSZWN0KChibCwgYnQsIGJyLTEsIGJiKSkKKyAgICAgICAgICAgIFRleHRFZGl0b3IuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKyAgICAgICAgICAgIHNlbGYuZHJhd2JyZWFrcG9pbnRzKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFRleHRFZGl0b3IuY2xpY2soc2VsZiwgcG9pbnQsIG1vZGlmaWVycykKKyAgICAgICAgICAgIGlmIHNlbGYudGVkLldFR2V0Q2xpY2tDb3VudCgpID49IDM6CisgICAgICAgICAgICAgICAgIyBzZWxlY3QgYmxvY2sgd2l0aCBvdXIgaW5kZW50CisgICAgICAgICAgICAgICAgbGluZXMgPSBzdHJpbmcuc3BsaXQoc2VsZi5nZXQoKSwgJ1xyJykKKyAgICAgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICAgICAgICAgIGxpbmVubyA9IHNlbGYudGVkLldFT2Zmc2V0VG9MaW5lKHNlbHN0YXJ0KQorICAgICAgICAgICAgICAgIHRhYnMgPSAwCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVzW2xpbmVub10KKyAgICAgICAgICAgICAgICB3aGlsZSBsaW5lW3RhYnM6XSBhbmQgbGluZVt0YWJzXSA9PSAnXHQnOgorICAgICAgICAgICAgICAgICAgICB0YWJzID0gdGFicyArIDEKKyAgICAgICAgICAgICAgICB0YWJzdGFnID0gJ1x0JyAqIHRhYnMKKyAgICAgICAgICAgICAgICBmcm9tbGluZSA9IDAKKyAgICAgICAgICAgICAgICB0b2xpbmUgPSBsZW4obGluZXMpCisgICAgICAgICAgICAgICAgaWYgdGFiczoKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGluZW5vIC0gMSwgLTEsIC0xKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVs6dGFic10gPD4gdGFic3RhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tbGluZSA9IGkgKyAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgICAgICAgICAgZm9yIGkgaW4gcmFuZ2UobGluZW5vICsgMSwgdG9saW5lKToKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbmUgPSBsaW5lc1tpXQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgbGluZVs6dGFic10gPD4gdGFic3RhZzoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0b2xpbmUgPSBpIC0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgc2Vsc3RhcnQsIGR1bW15ID0gc2VsZi50ZWQuV0VHZXRMaW5lUmFuZ2UoZnJvbWxpbmUpCisgICAgICAgICAgICAgICAgZHVtbXksIHNlbGVuZCA9IHNlbGYudGVkLldFR2V0TGluZVJhbmdlKHRvbGluZSkKKyAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRVNldFNlbGVjdGlvbihzZWxzdGFydCwgc2VsZW5kKQorCisgICAgZGVmIGJyZWFraGl0KHNlbGYsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICBpZiBub3Qgc2VsZi5maWxlOgorICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGRlc3RyZWN0ID0gc2VsZi50ZWQuV0VHZXREZXN0UmVjdCgpCisgICAgICAgIG9mZnNldCwgZWRnZSA9IHNlbGYudGVkLldFR2V0T2Zmc2V0KHBvaW50KQorICAgICAgICBsaW5lbm8gPSBzZWxmLnRlZC5XRU9mZnNldFRvTGluZShvZmZzZXQpICsgMQorICAgICAgICBpZiBwb2ludFsxXSA8PSBkZXN0cmVjdFszXToKKyAgICAgICAgICAgIHNlbGYuX2RlYnVnZ2VyLmNsZWFyX2JyZWFrc19hYm92ZShzZWxmLmZpbGUsIHNlbGYuY291bnRsaW5lcygpKQorICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIudG9nZ2xlX2JyZWFrKHNlbGYuZmlsZSwgbGluZW5vKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIuY2xlYXJfYnJlYWtzX2Fib3ZlKHNlbGYuZmlsZSwgbGluZW5vKQorCisgICAgZGVmIGtleShzZWxmLCBjaGFyLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXkgYW5kIG5vdCBjaGFyIGluIFdrZXlzLmFycm93a2V5czoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBjaGFyID09ICdccic6CisgICAgICAgICAgICBzZWxzdGFydCwgc2VsZW5kID0gc2VsZi50ZWQuV0VHZXRTZWxlY3Rpb24oKQorICAgICAgICAgICAgc2Vsc3RhcnQsIHNlbGVuZCA9IG1pbihzZWxzdGFydCwgc2VsZW5kKSwgbWF4KHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICBsYXN0Y2hhciA9IGNocihzZWxmLnRlZC5XRUdldENoYXIoc2Vsc3RhcnQtMSkpCisgICAgICAgICAgICBpZiBsYXN0Y2hhciA8PiAnXHInIGFuZCBzZWxzdGFydDoKKyAgICAgICAgICAgICAgICBwb3MsIGR1bW15ID0gc2VsZi50ZWQuV0VGaW5kTGluZShzZWxzdGFydCwgMCkKKyAgICAgICAgICAgICAgICBsaW5lcmVzID0gUmVzLlJlc291cmNlKCcnKQorICAgICAgICAgICAgICAgIHNlbGYudGVkLldFQ29weVJhbmdlKHBvcywgc2Vsc3RhcnQsIGxpbmVyZXMsIE5vbmUsIE5vbmUpCisgICAgICAgICAgICAgICAgbGluZSA9IGxpbmVyZXMuZGF0YSArICdcbicKKyAgICAgICAgICAgICAgICB0YWJjb3VudCA9IHNlbGYuZXh0cmF0YWJzKGxpbmUpCisgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKCdccicpLCAwKQorICAgICAgICAgICAgICAgIGZvciBpIGluIHJhbmdlKHRhYmNvdW50KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VLZXkob3JkKCdcdCcpLCAwKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoJ1xyJyksIDApCisgICAgICAgIGVsaWYgY2hhciBpbiAnKV19JzoKKyAgICAgICAgICAgIHNlbGYudGVkLldFS2V5KG9yZChjaGFyKSwgbW9kaWZpZXJzKQorICAgICAgICAgICAgc2VsZi5iYWxhbmNlcGFyZW5zKGNoYXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBzZWxmLnRlZC5XRUtleShvcmQoY2hhciksIG1vZGlmaWVycykKKyAgICAgICAgaWYgY2hhciBub3QgaW4gV2tleXMubmF2aWdhdGlvbmtleXM6CisgICAgICAgICAgICBzZWxmLnRleHRjaGFuZ2VkKCkKKyAgICAgICAgc2VsZi5zZWxlY3Rpb25jaGFuZ2VkKCkKKyAgICAgICAgc2VsZi51cGRhdGVzY3JvbGxiYXJzKCkKKworICAgIGRlZiBiYWxhbmNlcGFyZW5zKHNlbGYsIGNoYXIpOgorICAgICAgICBpZiBjaGFyID09ICcpJzoKKyAgICAgICAgICAgIHRhcmdldCA9ICcoJworICAgICAgICBlbGlmIGNoYXIgPT0gJ10nOgorICAgICAgICAgICAgdGFyZ2V0ID0gJ1snCisgICAgICAgIGVsaWYgY2hhciA9PSAnfSc6CisgICAgICAgICAgICB0YXJnZXQgPSAneycKKyAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSAxCisgICAgICAgIHNlbHN0YXJ0LCBzZWxlbmQgPSBzZWxmLnRlZC5XRUdldFNlbGVjdGlvbigpCisgICAgICAgIGNvdW50ID0gbWluKHNlbHN0YXJ0LCBzZWxlbmQpIC0gMgorICAgICAgICBtaW5jb3VudCA9IG1heCgwLCBjb3VudCAtIDIwNDgpCisgICAgICAgIGxhc3RxdW90ZSA9IE5vbmUKKyAgICAgICAgd2hpbGUgY291bnQgPiBtaW5jb3VudDoKKyAgICAgICAgICAgIHRlc3RjaGFyID0gY2hyKHNlbGYudGVkLldFR2V0Q2hhcihjb3VudCkpCisgICAgICAgICAgICBpZiB0ZXN0Y2hhciBpbiAiXCInIiBhbmQgY2hyKHNlbGYudGVkLldFR2V0Q2hhcihjb3VudCAtIDEpKSA8PiAnXFwnOgorICAgICAgICAgICAgICAgIGlmIGxhc3RxdW90ZSA9PSB0ZXN0Y2hhcjoKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCAtIDEKKyAgICAgICAgICAgICAgICAgICAgbGFzdHF1b3RlID0gTm9uZQorICAgICAgICAgICAgICAgIGVsaWYgbm90IGxhc3RxdW90ZToKKyAgICAgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCArIDEKKyAgICAgICAgICAgICAgICAgICAgbGFzdHF1b3RlID0gdGVzdGNoYXIKKyAgICAgICAgICAgIGVsaWYgbm90IGxhc3RxdW90ZSBhbmQgdGVzdGNoYXIgPT0gY2hhcjoKKyAgICAgICAgICAgICAgICByZWN1cnNpb25sZXZlbCA9IHJlY3Vyc2lvbmxldmVsICsgMQorICAgICAgICAgICAgZWxpZiBub3QgbGFzdHF1b3RlIGFuZCB0ZXN0Y2hhciA9PSB0YXJnZXQ6CisgICAgICAgICAgICAgICAgcmVjdXJzaW9ubGV2ZWwgPSByZWN1cnNpb25sZXZlbCAtIDEKKyAgICAgICAgICAgICAgICBpZiByZWN1cnNpb25sZXZlbCA9PSAwOgorICAgICAgICAgICAgICAgICAgICBpbXBvcnQgdGltZQorICAgICAgICAgICAgICAgICAgICBhdXRvc2Nyb2xsID0gc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIC0xKQorICAgICAgICAgICAgICAgICAgICBpZiBhdXRvc2Nyb2xsOgorICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi50ZWQuV0VGZWF0dXJlRmxhZyhXQVNURWNvbnN0LndlRkF1dG9TY3JvbGwsIDApCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKGNvdW50LCBjb3VudCArIDEpCisgICAgICAgICAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy53aWQuR2V0V2luZG93UG9ydCgpLlFERmx1c2hQb3J0QnVmZmVyKE5vbmUpICAjIG5lZWRlZCB1bmRlciBPU1gKKyAgICAgICAgICAgICAgICAgICAgdGltZS5zbGVlcCgwLjIpCisgICAgICAgICAgICAgICAgICAgIHNlbGYudGVkLldFU2V0U2VsZWN0aW9uKHNlbHN0YXJ0LCBzZWxlbmQpCisgICAgICAgICAgICAgICAgICAgIGlmIGF1dG9zY3JvbGw6CisgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnRlZC5XRUZlYXR1cmVGbGFnKFdBU1RFY29uc3Qud2VGQXV0b1Njcm9sbCwgMSkKKyAgICAgICAgICAgICAgICAgICAgYnJlYWsKKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgLSAxCisKKyAgICBkZWYgZXh0cmF0YWJzKHNlbGYsIGxpbmUpOgorICAgICAgICB0YWJjb3VudCA9IDAKKyAgICAgICAgZm9yIGMgaW4gbGluZToKKyAgICAgICAgICAgIGlmIGMgPD4gJ1x0JzoKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGFiY291bnQgPSB0YWJjb3VudCArIDEKKyAgICAgICAgbGFzdCA9IDAKKyAgICAgICAgY2xlYW5saW5lID0gJycKKyAgICAgICAgdGFncyA9IFB5Rm9udGlmeS5mb250aWZ5KGxpbmUpCisgICAgICAgICMgc3RyaXAgY29tbWVudHMgYW5kIHN0cmluZ3MKKyAgICAgICAgZm9yIHRhZywgc3RhcnQsIGVuZCwgc3VibGlzdCBpbiB0YWdzOgorICAgICAgICAgICAgaWYgdGFnIGluICgnc3RyaW5nJywgJ2NvbW1lbnQnKToKKyAgICAgICAgICAgICAgICBjbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6c3RhcnRdCisgICAgICAgICAgICAgICAgbGFzdCA9IGVuZAorICAgICAgICBjbGVhbmxpbmUgPSBjbGVhbmxpbmUgKyBsaW5lW2xhc3Q6XQorICAgICAgICBjbGVhbmxpbmUgPSBzdHJpbmcuc3RyaXAoY2xlYW5saW5lKQorICAgICAgICBpZiBjbGVhbmxpbmUgYW5kIGNsZWFubGluZVstMV0gPT0gJzonOgorICAgICAgICAgICAgdGFiY291bnQgPSB0YWJjb3VudCArIDEKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgICMgZXh0cmEgaW5kZW50IGFmdGVyIHVuYmFsYW5jZWQgKCwgWyBvciB7CisgICAgICAgICAgICBmb3Igb3BlbiwgY2xvc2UgaW4gKCgnKCcsICcpJyksICgnWycsICddJyksICgneycsICd9JykpOgorICAgICAgICAgICAgICAgIGNvdW50ID0gc3RyaW5nLmNvdW50KGNsZWFubGluZSwgb3BlbikKKyAgICAgICAgICAgICAgICBpZiBjb3VudCBhbmQgY291bnQgPiBzdHJpbmcuY291bnQoY2xlYW5saW5lLCBjbG9zZSk6CisgICAgICAgICAgICAgICAgICAgIHRhYmNvdW50ID0gdGFiY291bnQgKyAyCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgIHJldHVybiB0YWJjb3VudAorCisgICAgZGVmIHJvbGxvdmVyKHNlbGYsIHBvaW50LCBvbm9mZik6CisgICAgICAgIGlmIG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5fZGVidWdnZXIgYW5kIHNlbGYucHRfaW5fYnJlYWtzKHBvaW50KToKKyAgICAgICAgICAgICAgICBXYmFzZS5TZXRDdXJzb3IoImFycm93IikKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgV2Jhc2UuU2V0Q3Vyc29yKCJpQmVhbSIpCisKKyAgICBkZWYgZHJhdyhzZWxmLCB2aXNSZ24gPSBOb25lKToKKyAgICAgICAgVGV4dEVkaXRvci5kcmF3KHNlbGYsIHZpc1JnbikKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLmRyYXdicmVha3BvaW50cygpCisKKyAgICBkZWYgc2hvd2JyZWFrcG9pbnRzKHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgKG5vdCBub3Qgc2VsZi5fZGVidWdnZXIpIDw+IG9ub2ZmOgorICAgICAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICAgICAgaWYgbm90IF9fZGVidWdfXzoKKyAgICAgICAgICAgICAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgICAgICAgICAgICAgcmFpc2UgVy5BbGVydEVycm9yLCAiQ2FuJ3QgZGVidWcgaW4gXCJPcHRpbWl6ZSBieXRlY29kZVwiIG1vZGUuXHIoc2VlIFwiRGVmYXVsdCBzdGFydHVwIG9wdGlvbnNcIiBpbiBFZGl0UHl0aG9uUHJlZmVyZW5jZXMpIgorICAgICAgICAgICAgICAgIGltcG9ydCBQeURlYnVnZ2VyCisgICAgICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIgPSBQeURlYnVnZ2VyLmdldGRlYnVnZ2VyKCkKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5yZWdpc3Rlcl9lZGl0b3Ioc2VsZiwgc2VsZi5maWxlKQorICAgICAgICAgICAgZWxpZiBzZWxmLl9kZWJ1Z2dlcjoKKyAgICAgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci51bnJlZ2lzdGVyX2VkaXRvcihzZWxmLCBzZWxmLmZpbGUpCisgICAgICAgICAgICAgICAgc2VsZi5fZGVidWdnZXIgPSBOb25lCisgICAgICAgICAgICBzZWxmLmFkanVzdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgdG9nZ2xlYnJlYWtwb2ludHMoc2VsZik6CisgICAgICAgIHNlbGYuc2hvd2JyZWFrcG9pbnRzKG5vdCBzZWxmLl9kZWJ1Z2dlcikKKworICAgIGRlZiBjbGVhcmJyZWFrcG9pbnRzKHNlbGYpOgorICAgICAgICBpZiBzZWxmLmZpbGU6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5jbGVhcl9hbGxfZmlsZV9icmVha3Moc2VsZi5maWxlKQorCisgICAgZGVmIGVkaXRicmVha3BvaW50cyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5lZGl0X2JyZWFrcygpCisgICAgICAgICAgICBzZWxmLl9kZWJ1Z2dlci5icmVha3N2aWV3ZXIuc2VsZWN0ZmlsZShzZWxmLmZpbGUpCisKKyAgICBkZWYgZHJhd2JyZWFrcG9pbnRzKHNlbGYsIGVyYXNlYWxsID0gMCk6CisgICAgICAgIGJyZWFrcmVjdCA9IGJsLCBidCwgYnIsIGJiID0gc2VsZi5fZ2V0YnJlYWtyZWN0KCkKKyAgICAgICAgYnIgPSBiciAtIDEKKyAgICAgICAgc2VsZi5TZXRQb3J0KCkKKyAgICAgICAgUWQuUGVuUGF0KFFkLkdldFFER2xvYmFsc0dyYXkoKSkKKyAgICAgICAgUWQuUGFpbnRSZWN0KChiciwgYnQsIGJyICsgMSwgYmIpKQorICAgICAgICBRZC5QZW5Ob3JtYWwoKQorICAgICAgICBzZWxmLl9wYXJlbnR3aW5kb3cudGVtcGNsaXByZWN0KGJyZWFrcmVjdCkKKyAgICAgICAgUWQuUkdCRm9yZUNvbG9yKCgweGZmZmYsIDAsIDApKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBsYXN0dG9wID0gYnQKKyAgICAgICAgICAgIHNlbGZfdGVkID0gc2VsZi50ZWQKKyAgICAgICAgICAgIFFkX1BhaW50T3ZhbCA9IFFkLlBhaW50T3ZhbAorICAgICAgICAgICAgUWRfRXJhc2VSZWN0ID0gUWQuRXJhc2VSZWN0CisgICAgICAgICAgICBmb3IgbGluZW5vIGluIHNlbGYuX2RlYnVnZ2VyLmdldF9maWxlX2JyZWFrcyhzZWxmLmZpbGUpOgorICAgICAgICAgICAgICAgIHN0YXJ0LCBlbmQgPSBzZWxmX3RlZC5XRUdldExpbmVSYW5nZShsaW5lbm8gLSAxKQorICAgICAgICAgICAgICAgIGlmIGxpbmVubyA8PiBzZWxmX3RlZC5XRU9mZnNldFRvTGluZShzdGFydCkgKyAxOgorICAgICAgICAgICAgICAgICAgICAjIGJyZWFrcG9pbnRzIGJleW9uZCBvdXIgdGV4dDogZXJhc2UgcmVzdCwgYW5kIGJhY2sgb3V0CisgICAgICAgICAgICAgICAgICAgIFFkX0VyYXNlUmVjdCgoYmwsIGxhc3R0b3AsIGJyLCBiYikpCisgICAgICAgICAgICAgICAgICAgIGJyZWFrCisgICAgICAgICAgICAgICAgKHgsIHkpLCBoID0gc2VsZl90ZWQuV0VHZXRQb2ludChzdGFydCwgMCkKKyAgICAgICAgICAgICAgICBib3R0b20gPSB5ICsgaAorICAgICAgICAgICAgICAgICNwcmludCB5LCAobGFzdHRvcCwgYm90dG9tKQorICAgICAgICAgICAgICAgIGlmIGJvdHRvbSA+IGxhc3R0b3A6CisgICAgICAgICAgICAgICAgICAgIFFkX0VyYXNlUmVjdCgoYmwsIGxhc3R0b3AsIGJyLCB5ICsgaCAqIGVyYXNlYWxsKSkKKyAgICAgICAgICAgICAgICAgICAgbGFzdHRvcCA9IGJvdHRvbQorICAgICAgICAgICAgICAgIHJlZGJ1bGxldCA9IGJsICsgMiwgeSArIDMsIGJsICsgOCwgeSArIDkKKyAgICAgICAgICAgICAgICBRZF9QYWludE92YWwocmVkYnVsbGV0KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBRZF9FcmFzZVJlY3QoKGJsLCBsYXN0dG9wLCBiciwgYmIpKQorICAgICAgICAgICAgUWQuUkdCRm9yZUNvbG9yKCgwLCAwLCAwKSkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIHNlbGYuX3BhcmVudHdpbmRvdy5yZXN0b3JlY2xpcCgpCisKKyAgICBkZWYgdXBkYXRlc2Nyb2xsYmFycyhzZWxmKToKKyAgICAgICAgaWYgc2VsZi5fZGVidWdnZXI6CisgICAgICAgICAgICBzZWxmLmRyYXdicmVha3BvaW50cygxKQorICAgICAgICBUZXh0RWRpdG9yLnVwZGF0ZXNjcm9sbGJhcnMoc2VsZikKKworICAgIGRlZiBwdF9pbl9icmVha3Moc2VsZiwgcG9pbnQpOgorICAgICAgICByZXR1cm4gUWQuUHRJblJlY3QocG9pbnQsIHNlbGYuX2dldGJyZWFrcmVjdCgpKQorCisgICAgZGVmIF9nZXRicmVha3JlY3Qoc2VsZik6CisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgbCwgdCwgciwgYiA9IHNlbGYuX2JvdW5kcworICAgICAgICAgICAgcmV0dXJuIChsKzEsIHQrMSwgbCArIDEyLCBiLTEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByZXR1cm4gKDAsIDAsIDAsIDApCisKKyAgICBkZWYgX2dldHZpZXdyZWN0KHNlbGYpOgorICAgICAgICBsLCB0LCByLCBiID0gc2VsZi5fYm91bmRzCisgICAgICAgIGlmIHNlbGYuX2RlYnVnZ2VyOgorICAgICAgICAgICAgcmV0dXJuIChsICsgMTcsIHQgKyAyLCByLCBiIC0gMikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHJldHVybiAobCArIDUsIHQgKyAyLCByLCBiIC0gMikKKworICAgIGRlZiBfY2FsY3RleHRib3VuZHMoc2VsZik6CisgICAgICAgIHZpZXdyZWN0ID0gbCwgdCwgciwgYiA9IHNlbGYuX2dldHZpZXdyZWN0KCkKKyAgICAgICAgaWYgc2VsZi50ZWQ6CisgICAgICAgICAgICBkbCwgZHQsIGRyLCBkYiA9IHNlbGYudGVkLldFR2V0RGVzdFJlY3QoKQorICAgICAgICAgICAgdmwsIHZ0LCB2ciwgdmIgPSBzZWxmLnRlZC5XRUdldFZpZXdSZWN0KCkKKyAgICAgICAgICAgIHhzaGlmdCA9IGwgLSB2bAorICAgICAgICAgICAgeXNoaWZ0ID0gdCAtIHZ0CisgICAgICAgICAgICBpZiAoZGIgLSBkdCkgPCAoYiAtIHQpOgorICAgICAgICAgICAgICAgIHlzaGlmdCA9IHQgLSBkdAorICAgICAgICAgICAgZGVzdHJlY3QgPSAoZGwgKyB4c2hpZnQsIGR0ICsgeXNoaWZ0LCBkciArIHhzaGlmdCwgZGIgKyB5c2hpZnQpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBkZXN0cmVjdCA9IChsLCB0LCByICsgNTAwMCwgYikKKyAgICAgICAgcmV0dXJuIHZpZXdyZWN0LCBkZXN0cmVjdAogCiAKIGRlZiBHZXRGTnVtKGZvbnRuYW1lKToKLQkiIiJTYW1lIGFzIEZtLkdldEZOdW0oKSwgYnV0IG1hcHMgYSBtaXNzaW5nIGZvbnQgdG8gTW9uYWNvIGluc3RlYWQgb2YgdGhlIHN5c3RlbSBmb250LiIiIgotCWlmIGZvbnRuYW1lIDw+IEZtLkdldEZvbnROYW1lKDApOgotCQlmb250aWQgPSBGbS5HZXRGTnVtKGZvbnRuYW1lKQotCQlpZiBmb250aWQgPT0gMDoKLQkJCWZvbnRpZCA9IEZvbnRzLm1vbmFjbwotCWVsc2U6Ci0JCWZvbnRpZCA9IDAKLQlyZXR1cm4gZm9udGlkCisgICAgIiIiU2FtZSBhcyBGbS5HZXRGTnVtKCksIGJ1dCBtYXBzIGEgbWlzc2luZyBmb250IHRvIE1vbmFjbyBpbnN0ZWFkIG9mIHRoZSBzeXN0ZW0gZm9udC4iIiIKKyAgICBpZiBmb250bmFtZSA8PiBGbS5HZXRGb250TmFtZSgwKToKKyAgICAgICAgZm9udGlkID0gRm0uR2V0Rk51bShmb250bmFtZSkKKyAgICAgICAgaWYgZm9udGlkID09IDA6CisgICAgICAgICAgICBmb250aWQgPSBGb250cy5tb25hY28KKyAgICBlbHNlOgorICAgICAgICBmb250aWQgPSAwCisgICAgcmV0dXJuIGZvbnRpZAogCiAjIGIvdyBjb21wYXQuIEFueW9uZSB1c2luZyB0aGlzPwogR2V0Rk5hbWUgPSBGbS5HZXRGb250TmFtZQogCiBkZWYgR2V0UG9ydEZvbnRTZXR0aW5ncyhwb3J0KToKLQlyZXR1cm4gRm0uR2V0Rm9udE5hbWUocG9ydC5HZXRQb3J0VGV4dEZvbnQoKSksIHBvcnQuR2V0UG9ydFRleHRGYWNlKCksIHBvcnQuR2V0UG9ydFRleHRTaXplKCkKKyAgICByZXR1cm4gRm0uR2V0Rm9udE5hbWUocG9ydC5HZXRQb3J0VGV4dEZvbnQoKSksIHBvcnQuR2V0UG9ydFRleHRGYWNlKCksIHBvcnQuR2V0UG9ydFRleHRTaXplKCkKIAogZGVmIFNldFBvcnRGb250U2V0dGluZ3MocG9ydCwgKGZvbnQsIGZhY2UsIHNpemUpKToKLQlzYXZlcG9ydCA9IFFkLkdldFBvcnQoKQotCVFkLlNldFBvcnQocG9ydCkKLQlRZC5UZXh0Rm9udChHZXRGTnVtKGZvbnQpKQotCVFkLlRleHRGYWNlKGZhY2UpCi0JUWQuVGV4dFNpemUoc2l6ZSkKLQlRZC5TZXRQb3J0KHNhdmVwb3J0KQorICAgIHNhdmVwb3J0ID0gUWQuR2V0UG9ydCgpCisgICAgUWQuU2V0UG9ydChwb3J0KQorICAgIFFkLlRleHRGb250KEdldEZOdW0oZm9udCkpCisgICAgUWQuVGV4dEZhY2UoZmFjZSkKKyAgICBRZC5UZXh0U2l6ZShzaXplKQorICAgIFFkLlNldFBvcnQoc2F2ZXBvcnQpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvSURFL1d0cmFjZWJhY2sucHkgYi9NYWMvVG9vbHMvSURFL1d0cmFjZWJhY2sucHkKaW5kZXggOTBhMjVmZS4uZTg0MzQ5ZCAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9XdHJhY2ViYWNrLnB5CisrKyBiL01hYy9Ub29scy9JREUvV3RyYWNlYmFjay5weQpAQCAtNywxODIgKzcsMTgxIEBACiAKIAogY2xhc3MgVHJhY2VCYWNrOgotCQotCWRlZiBfX2luaXRfXyhzZWxmLCB0aXRsZSA9ICJUcmFjZWJhY2siKToKLQkJYXBwID0gVy5nZXRhcHBsaWNhdGlvbigpICAjIGNoZWNrcyBpZiBXIGlzIHByb3Blcmx5IGluaXRpYWxpemVkCi0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQlzZWxmLncgPSBOb25lCi0JCXNlbGYuY2xvc2VkID0gMQotCQlzZWxmLnN0YXJ0ID0gMAotCQlzZWxmLmxhc3R3aW5kb3d0aXRsZSA9ICIiCi0JCXNlbGYuYm91bmRzID0gKDM2MCwgMjk4KQotCQotCWRlZiB0cmFjZWJhY2soc2VsZiwgc3RhcnQgPSAwLCBsYXN0d2luZG93dGl0bGUgPSAiIik6Ci0JCXRyeToKLQkJCXNlbGYubGFzdHdpbmRvd3RpdGxlID0gbGFzdHdpbmRvd3RpdGxlCi0JCQlzZWxmLnN0YXJ0ID0gc3RhcnQKLQkJCXNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IHN5cy5leGNfaW5mbygpCi0JCQlpZiBzZWxmLnR5cGUgaXMgbm90IFN5bnRheEVycm9yOgotCQkJCXNlbGYuc2hvdygpCi0JCQkJaWYgdHlwZShzZWxmLnR5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKLQkJCQkJZXJyb3J0ZXh0ID0gc2VsZi50eXBlLl9fbmFtZV9fCi0JCQkJZWxzZToKLQkJCQkJZXJyb3J0ZXh0ID0gc3RyKHNlbGYudHlwZSkKLQkJCQl2YWx1ZSA9IHN0cihzZWxmLnZhbHVlKQotCQkJCWlmIHNlbGYudmFsdWUgYW5kIHZhbHVlOgotCQkJCQllcnJvcnRleHQgPSBlcnJvcnRleHQgKyAiOiAiICsgdmFsdWUKLQkJCQlzZWxmLncudGV4dC5zZXQoZXJyb3J0ZXh0KQotCQkJCXNlbGYuYnVpbGR0Ymxpc3QoKQotCQkJCXNlbGYudy5saXN0LnNldChzZWxmLnRleHRsaXN0KQotCQkJCXNlbGYudy5saXN0LnNldHNlbGVjdGlvbihbbGVuKHNlbGYudGV4dGxpc3QpIC0gMV0pCi0JCQkJc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQotCQkJCXNlbGYuY2xvc2VkID0gMAotCQkJZWxzZToKLQkJCQlzZWxmLnN5bnRheGVycm9yKCkKLQkJZXhjZXB0OgotCQkJdHJhY2ViYWNrLnByaW50X2V4YygpCi0JCi0JZGVmIHN5bnRheGVycm9yKHNlbGYpOgotCQl0cnk6Ci0JCQl2YWx1ZSwgKGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubywgbGluZSkgPSBzZWxmLnZhbHVlCi0JCWV4Y2VwdDoKLQkJCWZpbGVuYW1lID0gIiIKLQkJCWxpbmVubyA9IE5vbmUKLQkJCXZhbHVlID0gc2VsZi52YWx1ZQotCQlpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgotCQkJZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQotCQllbGlmIG5vdCBmaWxlbmFtZToKLQkJCWZpbGVuYW1lID0gIjx1bmtub3duPiIKLQkJaWYgZmlsZW5hbWUgYW5kIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLQkJCWZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChmaWxlbmFtZSlbMV0KLQkJaWYgbGluZW5vIGFuZCBjaGFybm8gaXMgbm90IE5vbmU6Ci0JCQljaGFybm8gPSBjaGFybm8gLSAxCi0JCQl0ZXh0ID0gc3RyKHZhbHVlKSArICdcckZpbGU6ICInICsgc3RyKGZpbGVuYW1lKSArICciLCBsaW5lICcgKyBzdHIobGluZW5vKSArICdcclxyJyArIGxpbmVbOmNoYXJub10gKyAiXHhhNSIgKyBsaW5lW2NoYXJubzotMV0KLQkJZWxzZToKLQkJCXRleHQgPSBzdHIodmFsdWUpICsgJ1xyRmlsZTogIicgKyBzdHIoZmlsZW5hbWUpICsgJyInCi0JCXNlbGYuc3ludGF4ZGlhbG9nID0gVy5Nb2RhbERpYWxvZygoMzYwLCAxMjApLCAiU3ludGF4IEVycm9yIikKLQkJc2VsZi5zeW50YXhkaWFsb2cudGV4dCA9IFcuVGV4dEJveCgoMTAsIDEwLCAtMTAsIC00MCksIHRleHQpCi0JCXNlbGYuc3ludGF4ZGlhbG9nLmNhbmNlbCA9IFcuQnV0dG9uKCgtMTkwLCAtMzIsIDgwLCAxNiksICJDYW5jZWwiLCBzZWxmLnN5bnRheGNsb3NlKQotCQlzZWxmLnN5bnRheGRpYWxvZy5lZGl0ID0gVy5CdXR0b24oKC0xMDAsIC0zMiwgODAsIDE2KSwgIkVkaXQiLCBzZWxmLnN5bnRheGVkaXQpCi0JCXNlbGYuc3ludGF4ZGlhbG9nLnNldGRlZmF1bHRidXR0b24oc2VsZi5zeW50YXhkaWFsb2cuZWRpdCkKLQkJc2VsZi5zeW50YXhkaWFsb2cuYmluZCgiY21kLiIsIHNlbGYuc3ludGF4ZGlhbG9nLmNhbmNlbC5wdXNoKQotCQlzZWxmLnN5bnRheGRpYWxvZy5vcGVuKCkKLQkKLQlkZWYgc3ludGF4Y2xvc2Uoc2VsZik6Ci0JCXNlbGYuc3ludGF4ZGlhbG9nLmNsb3NlKCkKLQkJZGVsIHNlbGYuc3ludGF4ZGlhbG9nCi0JCi0JZGVmIHN5bnRheGVkaXQoc2VsZik6Ci0JCXRyeToKLQkJCXZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKLQkJZXhjZXB0OgotCQkJZmlsZW5hbWUgPSAiIgotCQkJbGluZW5vID0gTm9uZQotCQlpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgotCQkJZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQotCQllbGlmIG5vdCBmaWxlbmFtZToKLQkJCWZpbGVuYW1lID0gIjx1bmtub3duPiIKLQkJc2VsZi5zeW50YXhjbG9zZSgpCi0JCWlmIGxpbmVubzoKLQkJCWlmIGNoYXJubyBpcyBOb25lOgotCQkJCWNoYXJubyA9IDEKLQkJCVcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubyAtIDEpCi0JCWVsc2U6Ci0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSkKLQkKLQlkZWYgc2hvdyhzZWxmKToKLQkJaWYgc2VsZi5jbG9zZWQ6Ci0JCQlzZWxmLnNldHVwd2lkZ2V0cygpCi0JCQlzZWxmLncub3BlbigpCi0JCWVsc2U6Ci0JCQlzZWxmLncud2lkLlNob3dXaW5kb3coKQotCQkJc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQotCQotCWRlZiBoaWRlKHNlbGYpOgotCQlpZiBzZWxmLmNsb3NlZDoKLQkJCXJldHVybgotCQlzZWxmLncuY2xvc2UoKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKLQkJc2VsZi5jbG9zZWQgPSAxCi0JCXNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IE5vbmUsIE5vbmUsIE5vbmUKLQkJc2VsZi50Ymxpc3QgPSBOb25lCi0JCi0JZGVmIGFjdGl2YXRlKHNlbGYsIG9ub2ZmKToKLQkJaWYgb25vZmY6Ci0JCQlpZiBzZWxmLmNsb3NlZDoKLQkJCQlzZWxmLnRyYWNlYmFjaygpCi0JCQlzZWxmLmNsb3NlZCA9IDAKLQkJCXNlbGYuY2hlY2tidXR0b25zKCkKLQkKLQlkZWYgc2V0dXB3aWRnZXRzKHNlbGYpOgotCQlzZWxmLncgPSBXLldpbmRvdyhzZWxmLmJvdW5kcywgc2VsZi50aXRsZSwgbWluc2l6ZSA9ICgzMTYsIDE2OCkpCi0JCXNlbGYudy50ZXh0ID0gVy5UZXh0Qm94KCgxMCwgMTAsIC0xMCwgMzApKQotCQlzZWxmLncudGJ0aXRsZSA9IFcuVGV4dEJveCgoMTAsIDQwLCAtMTAsIDEwKSwgIlRyYWNlYmFjayAoaW5uZXJtb3N0IGxhc3QpOiIpCi0JCXNlbGYudy5saXN0ID0gVy5Ud29MaW5lTGlzdCgoMTAsIDYwLCAtMTAsIC00MCksIGNhbGxiYWNrID0gc2VsZi5saXN0aGl0KQotCQkKLQkJc2VsZi53LmVkaXRidXR0b24gPSBXLkJ1dHRvbigoMTAsIC0zMCwgNjAsIDE2KSwgIkVkaXQiLCBzZWxmLmVkaXQpCi0JCXNlbGYudy5lZGl0YnV0dG9uLmVuYWJsZSgwKQotCQkKLQkJc2VsZi53LmJyb3dzZWxvY2Fsc2J1dHRvbiA9IFcuQnV0dG9uKCg4MCwgLTMwLCAxMDAsIDE2KSwgIkJyb3dzZSBsb2NhbHNceGM5Iiwgc2VsZi5icm93c2Vsb2NhbHMpCi0JCXNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKDApCi0JCQotCQlzZWxmLncucG9zdG1vcnRlbWJ1dHRvbiA9IFcuQnV0dG9uKCgxOTAsIC0zMCwgMTAwLCAxNiksICJQb3N0IG1vcnRlbVx4YzkiLCBzZWxmLnBvc3Rtb3J0ZW0pCi0JCQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLncuZWRpdGJ1dHRvbikKLQkJc2VsZi53LmJpbmQoImNtZGIiLCBzZWxmLncuYnJvd3NlbG9jYWxzYnV0dG9uLnB1c2gpCi0JCXNlbGYudy5iaW5kKCI8Y2xvc2U+Iiwgc2VsZi5jbG9zZSkKLQkJc2VsZi53LmJpbmQoIjxhY3RpdmF0ZT4iLCBzZWxmLmFjdGl2YXRlKQotCQotCWRlZiBidWlsZHRibGlzdChzZWxmKToKLQkJdGIgPSBzZWxmLnRiCi0JCWZvciBpIGluIHJhbmdlKHNlbGYuc3RhcnQpOgotCQkJaWYgdGIudGJfbmV4dCBpcyBOb25lOgotCQkJCWJyZWFrCi0JCQl0YiA9IHRiLnRiX25leHQKLQkJc2VsZi50Ymxpc3QgPSB0cmFjZWJhY2suZXh0cmFjdF90Yih0YikKLQkJc2VsZi50ZXh0bGlzdCA9IFtdCi0JCWZvciBmaWxlbmFtZSwgbGluZW5vLCBmdW5jLCBsaW5lIGluIHNlbGYudGJsaXN0OgotCQkJdGJsaW5lID0gIiIKLQkJCWlmIG9zLnBhdGguZXhpc3RzKGZpbGVuYW1lKToKLQkJCQlmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpWzFdCi0JCQl0YmxpbmUgPSAnRmlsZSAiJXMiLCBsaW5lICVyLCBpbiAlcicgJSAoZmlsZW5hbWUsIGxpbmVubywgZnVuYykKLQkJCWlmIGxpbmU6Ci0JCQkJdGJsaW5lID0gdGJsaW5lICsgJ1xyICAgICAgJyArIGxpbmUKLQkJCXNlbGYudGV4dGxpc3QuYXBwZW5kKHRibGluZVs6MjU1XSkKLQkKLQlkZWYgZWRpdChzZWxmKToKLQkJc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKLQkJZm9yIGkgaW4gc2VsOgotCQkJZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSA9IHNlbGYudGJsaXN0W2ldCi0JCQlXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQotCQotCWRlZiBicm93c2Vsb2NhbHMoc2VsZik6Ci0JCXNlbCA9IHNlbGYudy5saXN0LmdldHNlbGVjdGlvbigpCi0JCWZvciBpIGluIHNlbDoKLQkJCXRiID0gc2VsZi50YgotCQkJZm9yIGogaW4gcmFuZ2UoaSArIHNlbGYuc3RhcnQpOgotCQkJCXRiID0gdGIudGJfbmV4dAotCQkJc2VsZi5icm93c2UodGIudGJfZnJhbWUuZl9sb2NhbHMpCi0JCi0JZGVmIGJyb3dzZShzZWxmLCBvYmplY3QpOgotCQlpbXBvcnQgUHlCcm93c2VyCi0JCVB5QnJvd3Nlci5Ccm93c2VyKG9iamVjdCkKLQkKLQlkZWYgcG9zdG1vcnRlbShzZWxmKToKLQkJaW1wb3J0IFB5RGVidWdnZXIKLQkJUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YikKLQkKLQlkZWYgbGlzdGhpdChzZWxmLCBpc2RibCk6Ci0JCWlmIGlzZGJsOgotCQkJc2VsZi53LmVkaXRidXR0b24ucHVzaCgpCi0JCWVsc2U6Ci0JCQlzZWxmLmNoZWNrYnV0dG9ucygpCi0JCi0JZGVmIGNoZWNrYnV0dG9ucyhzZWxmKToKLQkJaGF2ZWZpbGUgPSBsZW4oc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkpID4gMAotCQlzZWxmLncuZWRpdGJ1dHRvbi5lbmFibGUoaGF2ZWZpbGUpCi0JCXNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKGhhdmVmaWxlKQotCQlzZWxmLncuc2V0ZGVmYXVsdGJ1dHRvbihoYXZlZmlsZSBhbmQgc2VsZi53LmVkaXRidXR0b24gb3Igc2VsZi53LnBvc3Rtb3J0ZW1idXR0b24pCiAKKyAgICBkZWYgX19pbml0X18oc2VsZiwgdGl0bGUgPSAiVHJhY2ViYWNrIik6CisgICAgICAgIGFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKSAgIyBjaGVja3MgaWYgVyBpcyBwcm9wZXJseSBpbml0aWFsaXplZAorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi53ID0gTm9uZQorICAgICAgICBzZWxmLmNsb3NlZCA9IDEKKyAgICAgICAgc2VsZi5zdGFydCA9IDAKKyAgICAgICAgc2VsZi5sYXN0d2luZG93dGl0bGUgPSAiIgorICAgICAgICBzZWxmLmJvdW5kcyA9ICgzNjAsIDI5OCkKKworICAgIGRlZiB0cmFjZWJhY2soc2VsZiwgc3RhcnQgPSAwLCBsYXN0d2luZG93dGl0bGUgPSAiIik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHNlbGYubGFzdHdpbmRvd3RpdGxlID0gbGFzdHdpbmRvd3RpdGxlCisgICAgICAgICAgICBzZWxmLnN0YXJ0ID0gc3RhcnQKKyAgICAgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IHN5cy5leGNfaW5mbygpCisgICAgICAgICAgICBpZiBzZWxmLnR5cGUgaXMgbm90IFN5bnRheEVycm9yOgorICAgICAgICAgICAgICAgIHNlbGYuc2hvdygpCisgICAgICAgICAgICAgICAgaWYgdHlwZShzZWxmLnR5cGUpID09IHR5cGVzLkNsYXNzVHlwZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3J0ZXh0ID0gc2VsZi50eXBlLl9fbmFtZV9fCisgICAgICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICAgICAgZXJyb3J0ZXh0ID0gc3RyKHNlbGYudHlwZSkKKyAgICAgICAgICAgICAgICB2YWx1ZSA9IHN0cihzZWxmLnZhbHVlKQorICAgICAgICAgICAgICAgIGlmIHNlbGYudmFsdWUgYW5kIHZhbHVlOgorICAgICAgICAgICAgICAgICAgICBlcnJvcnRleHQgPSBlcnJvcnRleHQgKyAiOiAiICsgdmFsdWUKKyAgICAgICAgICAgICAgICBzZWxmLncudGV4dC5zZXQoZXJyb3J0ZXh0KQorICAgICAgICAgICAgICAgIHNlbGYuYnVpbGR0Ymxpc3QoKQorICAgICAgICAgICAgICAgIHNlbGYudy5saXN0LnNldChzZWxmLnRleHRsaXN0KQorICAgICAgICAgICAgICAgIHNlbGYudy5saXN0LnNldHNlbGVjdGlvbihbbGVuKHNlbGYudGV4dGxpc3QpIC0gMV0pCisgICAgICAgICAgICAgICAgc2VsZi53LndpZC5TZWxlY3RXaW5kb3coKQorICAgICAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBzZWxmLnN5bnRheGVycm9yKCkKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisKKyAgICBkZWYgc3ludGF4ZXJyb3Ioc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiIgorICAgICAgICAgICAgbGluZW5vID0gTm9uZQorICAgICAgICAgICAgdmFsdWUgPSBzZWxmLnZhbHVlCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZSBhbmQgc2VsZi5sYXN0d2luZG93dGl0bGU6CisgICAgICAgICAgICBmaWxlbmFtZSA9IHNlbGYubGFzdHdpbmRvd3RpdGxlCisgICAgICAgIGVsaWYgbm90IGZpbGVuYW1lOgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiPHVua25vd24+IgorICAgICAgICBpZiBmaWxlbmFtZSBhbmQgb3MucGF0aC5leGlzdHMoZmlsZW5hbWUpOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorICAgICAgICBpZiBsaW5lbm8gYW5kIGNoYXJubyBpcyBub3QgTm9uZToKKyAgICAgICAgICAgIGNoYXJubyA9IGNoYXJubyAtIDEKKyAgICAgICAgICAgIHRleHQgPSBzdHIodmFsdWUpICsgJ1xyRmlsZTogIicgKyBzdHIoZmlsZW5hbWUpICsgJyIsIGxpbmUgJyArIHN0cihsaW5lbm8pICsgJ1xyXHInICsgbGluZVs6Y2hhcm5vXSArICJceGE1IiArIGxpbmVbY2hhcm5vOi0xXQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgdGV4dCA9IHN0cih2YWx1ZSkgKyAnXHJGaWxlOiAiJyArIHN0cihmaWxlbmFtZSkgKyAnIicKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cgPSBXLk1vZGFsRGlhbG9nKCgzNjAsIDEyMCksICJTeW50YXggRXJyb3IiKQorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy50ZXh0ID0gVy5UZXh0Qm94KCgxMCwgMTAsIC0xMCwgLTQwKSwgdGV4dCkKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cuY2FuY2VsID0gVy5CdXR0b24oKC0xOTAsIC0zMiwgODAsIDE2KSwgIkNhbmNlbCIsIHNlbGYuc3ludGF4Y2xvc2UpCisgICAgICAgIHNlbGYuc3ludGF4ZGlhbG9nLmVkaXQgPSBXLkJ1dHRvbigoLTEwMCwgLTMyLCA4MCwgMTYpLCAiRWRpdCIsIHNlbGYuc3ludGF4ZWRpdCkKKyAgICAgICAgc2VsZi5zeW50YXhkaWFsb2cuc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLnN5bnRheGRpYWxvZy5lZGl0KQorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy5iaW5kKCJjbWQuIiwgc2VsZi5zeW50YXhkaWFsb2cuY2FuY2VsLnB1c2gpCisgICAgICAgIHNlbGYuc3ludGF4ZGlhbG9nLm9wZW4oKQorCisgICAgZGVmIHN5bnRheGNsb3NlKHNlbGYpOgorICAgICAgICBzZWxmLnN5bnRheGRpYWxvZy5jbG9zZSgpCisgICAgICAgIGRlbCBzZWxmLnN5bnRheGRpYWxvZworCisgICAgZGVmIHN5bnRheGVkaXQoc2VsZik6CisgICAgICAgIHRyeToKKyAgICAgICAgICAgIHZhbHVlLCAoZmlsZW5hbWUsIGxpbmVubywgY2hhcm5vLCBsaW5lKSA9IHNlbGYudmFsdWUKKyAgICAgICAgZXhjZXB0OgorICAgICAgICAgICAgZmlsZW5hbWUgPSAiIgorICAgICAgICAgICAgbGluZW5vID0gTm9uZQorICAgICAgICBpZiBub3QgZmlsZW5hbWUgYW5kIHNlbGYubGFzdHdpbmRvd3RpdGxlOgorICAgICAgICAgICAgZmlsZW5hbWUgPSBzZWxmLmxhc3R3aW5kb3d0aXRsZQorICAgICAgICBlbGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIGZpbGVuYW1lID0gIjx1bmtub3duPiIKKyAgICAgICAgc2VsZi5zeW50YXhjbG9zZSgpCisgICAgICAgIGlmIGxpbmVubzoKKyAgICAgICAgICAgIGlmIGNoYXJubyBpcyBOb25lOgorICAgICAgICAgICAgICAgIGNoYXJubyA9IDEKKyAgICAgICAgICAgIFcuZ2V0YXBwbGljYXRpb24oKS5vcGVuc2NyaXB0KGZpbGVuYW1lLCBsaW5lbm8sIGNoYXJubyAtIDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSkKKworICAgIGRlZiBzaG93KHNlbGYpOgorICAgICAgICBpZiBzZWxmLmNsb3NlZDoKKyAgICAgICAgICAgIHNlbGYuc2V0dXB3aWRnZXRzKCkKKyAgICAgICAgICAgIHNlbGYudy5vcGVuKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYudy53aWQuU2hvd1dpbmRvdygpCisgICAgICAgICAgICBzZWxmLncud2lkLlNlbGVjdFdpbmRvdygpCisKKyAgICBkZWYgaGlkZShzZWxmKToKKyAgICAgICAgaWYgc2VsZi5jbG9zZWQ6CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi53LmNsb3NlKCkKKworICAgIGRlZiBjbG9zZShzZWxmKToKKyAgICAgICAgc2VsZi5ib3VuZHMgPSBzZWxmLncuZ2V0Ym91bmRzKCkKKyAgICAgICAgc2VsZi5jbG9zZWQgPSAxCisgICAgICAgIHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YiA9IE5vbmUsIE5vbmUsIE5vbmUKKyAgICAgICAgc2VsZi50Ymxpc3QgPSBOb25lCisKKyAgICBkZWYgYWN0aXZhdGUoc2VsZiwgb25vZmYpOgorICAgICAgICBpZiBvbm9mZjoKKyAgICAgICAgICAgIGlmIHNlbGYuY2xvc2VkOgorICAgICAgICAgICAgICAgIHNlbGYudHJhY2ViYWNrKCkKKyAgICAgICAgICAgIHNlbGYuY2xvc2VkID0gMAorICAgICAgICAgICAgc2VsZi5jaGVja2J1dHRvbnMoKQorCisgICAgZGVmIHNldHVwd2lkZ2V0cyhzZWxmKToKKyAgICAgICAgc2VsZi53ID0gVy5XaW5kb3coc2VsZi5ib3VuZHMsIHNlbGYudGl0bGUsIG1pbnNpemUgPSAoMzE2LCAxNjgpKQorICAgICAgICBzZWxmLncudGV4dCA9IFcuVGV4dEJveCgoMTAsIDEwLCAtMTAsIDMwKSkKKyAgICAgICAgc2VsZi53LnRidGl0bGUgPSBXLlRleHRCb3goKDEwLCA0MCwgLTEwLCAxMCksICJUcmFjZWJhY2sgKGlubmVybW9zdCBsYXN0KToiKQorICAgICAgICBzZWxmLncubGlzdCA9IFcuVHdvTGluZUxpc3QoKDEwLCA2MCwgLTEwLCAtNDApLCBjYWxsYmFjayA9IHNlbGYubGlzdGhpdCkKKworICAgICAgICBzZWxmLncuZWRpdGJ1dHRvbiA9IFcuQnV0dG9uKCgxMCwgLTMwLCA2MCwgMTYpLCAiRWRpdCIsIHNlbGYuZWRpdCkKKyAgICAgICAgc2VsZi53LmVkaXRidXR0b24uZW5hYmxlKDApCisKKyAgICAgICAgc2VsZi53LmJyb3dzZWxvY2Fsc2J1dHRvbiA9IFcuQnV0dG9uKCg4MCwgLTMwLCAxMDAsIDE2KSwgIkJyb3dzZSBsb2NhbHNceGM5Iiwgc2VsZi5icm93c2Vsb2NhbHMpCisgICAgICAgIHNlbGYudy5icm93c2Vsb2NhbHNidXR0b24uZW5hYmxlKDApCisKKyAgICAgICAgc2VsZi53LnBvc3Rtb3J0ZW1idXR0b24gPSBXLkJ1dHRvbigoMTkwLCAtMzAsIDEwMCwgMTYpLCAiUG9zdCBtb3J0ZW1ceGM5Iiwgc2VsZi5wb3N0bW9ydGVtKQorCisgICAgICAgIHNlbGYudy5zZXRkZWZhdWx0YnV0dG9uKHNlbGYudy5lZGl0YnV0dG9uKQorICAgICAgICBzZWxmLncuYmluZCgiY21kYiIsIHNlbGYudy5icm93c2Vsb2NhbHNidXR0b24ucHVzaCkKKyAgICAgICAgc2VsZi53LmJpbmQoIjxjbG9zZT4iLCBzZWxmLmNsb3NlKQorICAgICAgICBzZWxmLncuYmluZCgiPGFjdGl2YXRlPiIsIHNlbGYuYWN0aXZhdGUpCisKKyAgICBkZWYgYnVpbGR0Ymxpc3Qoc2VsZik6CisgICAgICAgIHRiID0gc2VsZi50YgorICAgICAgICBmb3IgaSBpbiByYW5nZShzZWxmLnN0YXJ0KToKKyAgICAgICAgICAgIGlmIHRiLnRiX25leHQgaXMgTm9uZToKKyAgICAgICAgICAgICAgICBicmVhaworICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgIHNlbGYudGJsaXN0ID0gdHJhY2ViYWNrLmV4dHJhY3RfdGIodGIpCisgICAgICAgIHNlbGYudGV4dGxpc3QgPSBbXQorICAgICAgICBmb3IgZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSBpbiBzZWxmLnRibGlzdDoKKyAgICAgICAgICAgIHRibGluZSA9ICIiCisgICAgICAgICAgICBpZiBvcy5wYXRoLmV4aXN0cyhmaWxlbmFtZSk6CisgICAgICAgICAgICAgICAgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKVsxXQorICAgICAgICAgICAgdGJsaW5lID0gJ0ZpbGUgIiVzIiwgbGluZSAlciwgaW4gJXInICUgKGZpbGVuYW1lLCBsaW5lbm8sIGZ1bmMpCisgICAgICAgICAgICBpZiBsaW5lOgorICAgICAgICAgICAgICAgIHRibGluZSA9IHRibGluZSArICdcciAgICAgICcgKyBsaW5lCisgICAgICAgICAgICBzZWxmLnRleHRsaXN0LmFwcGVuZCh0YmxpbmVbOjI1NV0pCisKKyAgICBkZWYgZWRpdChzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmVubywgZnVuYywgbGluZSA9IHNlbGYudGJsaXN0W2ldCisgICAgICAgICAgICBXLmdldGFwcGxpY2F0aW9uKCkub3BlbnNjcmlwdChmaWxlbmFtZSwgbGluZW5vKQorCisgICAgZGVmIGJyb3dzZWxvY2FscyhzZWxmKToKKyAgICAgICAgc2VsID0gc2VsZi53Lmxpc3QuZ2V0c2VsZWN0aW9uKCkKKyAgICAgICAgZm9yIGkgaW4gc2VsOgorICAgICAgICAgICAgdGIgPSBzZWxmLnRiCisgICAgICAgICAgICBmb3IgaiBpbiByYW5nZShpICsgc2VsZi5zdGFydCk6CisgICAgICAgICAgICAgICAgdGIgPSB0Yi50Yl9uZXh0CisgICAgICAgICAgICBzZWxmLmJyb3dzZSh0Yi50Yl9mcmFtZS5mX2xvY2FscykKKworICAgIGRlZiBicm93c2Uoc2VsZiwgb2JqZWN0KToKKyAgICAgICAgaW1wb3J0IFB5QnJvd3NlcgorICAgICAgICBQeUJyb3dzZXIuQnJvd3NlcihvYmplY3QpCisKKyAgICBkZWYgcG9zdG1vcnRlbShzZWxmKToKKyAgICAgICAgaW1wb3J0IFB5RGVidWdnZXIKKyAgICAgICAgUHlEZWJ1Z2dlci5wb3N0bW9ydGVtKHNlbGYudHlwZSwgc2VsZi52YWx1ZSwgc2VsZi50YikKKworICAgIGRlZiBsaXN0aGl0KHNlbGYsIGlzZGJsKToKKyAgICAgICAgaWYgaXNkYmw6CisgICAgICAgICAgICBzZWxmLncuZWRpdGJ1dHRvbi5wdXNoKCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuY2hlY2tidXR0b25zKCkKKworICAgIGRlZiBjaGVja2J1dHRvbnMoc2VsZik6CisgICAgICAgIGhhdmVmaWxlID0gbGVuKHNlbGYudy5saXN0LmdldHNlbGVjdGlvbigpKSA+IDAKKyAgICAgICAgc2VsZi53LmVkaXRidXR0b24uZW5hYmxlKGhhdmVmaWxlKQorICAgICAgICBzZWxmLncuYnJvd3NlbG9jYWxzYnV0dG9uLmVuYWJsZShoYXZlZmlsZSkKKyAgICAgICAgc2VsZi53LnNldGRlZmF1bHRidXR0b24oaGF2ZWZpbGUgYW5kIHNlbGYudy5lZGl0YnV0dG9uIG9yIHNlbGYudy5wb3N0bW9ydGVtYnV0dG9uKQpkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL0lERS9Xd2luZG93cy5weSBiL01hYy9Ub29scy9JREUvV3dpbmRvd3MucHkKaW5kZXggZDY0NmJjZi4uY2I4ZDg1NSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL0lERS9Xd2luZG93cy5weQorKysgYi9NYWMvVG9vbHMvSURFL1d3aW5kb3dzLnB5CkBAIC04LDYyOSArOCw2MjkgQEAKIGZyb20gdHlwZXMgaW1wb3J0IEluc3RhbmNlVHlwZSwgU3RyaW5nVHlwZQogCiBpZiBoYXNhdHRyKFdpbiwgIkZyb250Tm9uRmxvYXRpbmdXaW5kb3ciKToKLQlNeUZyb250V2luZG93ID0gV2luLkZyb250Tm9uRmxvYXRpbmdXaW5kb3cKKyAgICBNeUZyb250V2luZG93ID0gV2luLkZyb250Tm9uRmxvYXRpbmdXaW5kb3cKIGVsc2U6Ci0JTXlGcm9udFdpbmRvdyA9IFdpbi5Gcm9udFdpbmRvdworICAgIE15RnJvbnRXaW5kb3cgPSBXaW4uRnJvbnRXaW5kb3cKIAogCiBjbGFzcyBXaW5kb3coRnJhbWVXb3JrLldpbmRvdywgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldCk6Ci0JCi0Jd2luZG93a2luZCA9IFdpbmRvd3MuZG9jdW1lbnRQcm9jCi0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlPSIiLCBtaW5zaXplPU5vbmUsIG1heHNpemU9Tm9uZSwgCi0JCQl0YWJiYWJsZT0xLCBzaG93PTEsIGZvbnRzZXR0aW5ncz1Ob25lKToKLQkJaW1wb3J0IFcKLQkJaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6Ci0JCQlmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKLQkJc2VsZi5fZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCi0JCVcuU2VsZWN0YWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQotCQlzZWxmLl9nbG9iYWxib3VuZHMgPSBsLCB0LCByLCBiID0gc2VsZi5nZXR3aW5kb3dib3VuZHMocG9zc2l6ZSwgbWluc2l6ZSkKLQkJc2VsZi5fYm91bmRzID0gKDAsIDAsIHIgLSBsLCBiIC0gdCkKLQkJc2VsZi5fdGFiY2hhaW4gPSBbXQotCQlzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQotCQlzZWxmLnRpdGxlID0gdGl0bGUKLQkJc2VsZi5fcGFyZW50d2luZG93ID0gc2VsZgotCQlzZWxmLl90YWJiYWJsZSA9IHRhYmJhYmxlCi0JCXNlbGYuX2RlZmF1bHRidXR0b24gPSBOb25lCi0JCXNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSAwCi0JCXNlbGYuX3Nob3cgPSBzaG93Ci0JCXNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKLQkJc2VsZi5oYXNjbG9zZWJveCA9IDEKLQkJIyBYWFggdGhlIGZvbGxvd2luZyBpcyBub3QgcmVhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKLQkJIyAgbmV3IChzeXN0ZW0gPj0gNy41KSB3aW5kb3cgcHJvY3MuIAotCQlpZiBtaW5zaXplOgotCQkJc2VsZi5faGFzZ3Jvd2JveCA9IDEKLQkJCXNlbGYud2luZG93a2luZCA9IHNlbGYud2luZG93a2luZCB8IDgKLQkJCWwsIHQgPSBtaW5zaXplCi0JCQlpZiBtYXhzaXplOgotCQkJCXIsIGIgPSBtYXhzaXplWzBdICsgMSwgbWF4c2l6ZVsxXSArIDEKLQkJCWVsc2U6Ci0JCQkJciwgYiA9IDMyMDAwLCAzMjAwMAotCQkJc2VsZi5ncm93bGltaXQgPSAobCwgdCwgciwgYikKLQkJZWxzZToKLQkJCXNlbGYuX2hhc2dyb3dib3ggPSAwCi0JCQlpZiAoc2VsZi53aW5kb3draW5kID09IDAgb3Igc2VsZi53aW5kb3draW5kID49IDgpIGFuZCBzZWxmLndpbmRvd2tpbmQgPCAxMDAwOgotCQkJCXNlbGYud2luZG93a2luZCA9IHNlbGYud2luZG93a2luZCB8IDQKLQkJRnJhbWVXb3JrLldpbmRvdy5fX2luaXRfXyhzZWxmLCBXLmdldGFwcGxpY2F0aW9uKCkpCi0JCi0JZGVmIGdldHRpdGxlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi50aXRsZQotCQotCWRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6Ci0JCXNlbGYudGl0bGUgPSB0aXRsZQotCQlpZiBzZWxmLndpZDoKLQkJCXNlbGYud2lkLlNldFdUaXRsZSh0aXRsZSkKLQkKLQlkZWYgZ2V0d2luZG93Ym91bmRzKHNlbGYsIHNpemUsIG1pbnNpemUgPSBOb25lKToKLQkJcmV0dXJuIHdpbmRvd2JvdW5kcyhzaXplLCBtaW5zaXplKQkKLQkKLQlkZWYgZ2V0Y3VycmVudHdpZGdldChzZWxmKToKLQkJcmV0dXJuIHNlbGYuX2N1cnJlbnR3aWRnZXQKLQkKLQlkZWYgc2hvdyhzZWxmLCBvbm9mZik6Ci0JCWlmIG9ub2ZmOgotCQkJc2VsZi53aWQuU2hvd1dpbmRvdygpCi0JCWVsc2U6Ci0JCQlzZWxmLndpZC5IaWRlV2luZG93KCkKLQkKLQlkZWYgaXN2aXNpYmxlKHNlbGYpOgotCQlyZXR1cm4gc2VsZi53aWQuSXNXaW5kb3dWaXNpYmxlKCkKLQkKLQlkZWYgc2VsZWN0KHNlbGYpOgotCQlzZWxmLndpZC5TZWxlY3RXaW5kb3coKQotCQkjIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UsIEkgbmVlZCBpdCB3aGVuCi0JCSMgYW4gZWRpdG9yIGdldHMgc2VsZWN0ZWQsIGFuZCBpbW1lZGlhdGVseSBzY3JvbGxlZAotCQkjIHRvIGEgY2VydGFpbiBsaW5lLCB3YXN0ZSBzY3JvbGwgYXNzdW1lcyBldmVyeXRoaW5nIAotCQkjIHRvIGJlIGluIHRhY3QuCi0JCXNlbGYuZG9fcmF3dXBkYXRlKHNlbGYud2lkLCAiRHVtbXlFdmVudCIpCi0JCi0JZGVmIG9wZW4oc2VsZik6Ci0JCXNlbGYud2lkID0gV2luLk5ld0NXaW5kb3coc2VsZi5fZ2xvYmFsYm91bmRzLCBzZWxmLnRpdGxlLCBzZWxmLl9zaG93LAotCQkJc2VsZi53aW5kb3draW5kLCAtMSwgc2VsZi5oYXNjbG9zZWJveCwgMCkKLQkJc2VsZi5TZXRQb3J0KCkKLQkJZm9udG5hbWUsIGZvbnRzdHlsZSwgZm9udHNpemUsIGZvbnRjb2xvciA9IHNlbGYuX2ZvbnRzZXR0aW5ncwotCQlmbnVtID0gRm0uR2V0Rk51bShmb250bmFtZSkKLQkJaWYgZm51bSA9PSAwOgotCQkJZm51bSA9IEZtLkdldEZOdW0oIkdlbmV2YSIpCi0JCVFkLlRleHRGb250KGZudW0pCi0JCVFkLlRleHRGYWNlKGZvbnRzdHlsZSkKLQkJUWQuVGV4dFNpemUoZm9udHNpemUpCi0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxvcGVuPiIpOgotCQkJY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPG9wZW4+Il0KLQkJCWNhbGxiYWNrKCkKLQkJZm9yIHcgaW4gc2VsZi5fd2lkZ2V0czoKLQkJCXcuZm9yYWxsX2Zyb21ib3R0b20oIm9wZW4iKQotCQlzZWxmLl9tYWtldGFiY2hhaW4oKQotCQlpZiBzZWxmLl90YWJiYWJsZToKLQkJCXNlbGYuYmluZCgndGFiJywgc2VsZi5uZXh0d2lkZ2V0KQotCQkJc2VsZi5iaW5kKCdzaGlmdHRhYicsIHNlbGYucHJldmlvdXN3aWRnZXQpCi0JCWVsc2U6Ci0JCQlzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCi0JCWlmIHNlbGYuX3RhYmNoYWluOgotCQkJc2VsZi5fdGFiY2hhaW5bMF0uc2VsZWN0KDEpCi0JCXNlbGYuZG9fcG9zdG9wZW4oKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgbm90IHNlbGYud2lkOgotCQkJcmV0dXJuCSMgd2UgYXJlIGFscmVhZHkgY2xvc2VkCi0JCWlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxjbG9zZT4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbG9zZT4iXQotCQkJdHJ5OgotCQkJCXJ2ID0gY2FsbGJhY2soKQotCQkJZXhjZXB0OgotCQkJCXByaW50ICdlcnJvciBpbiA8Y2xvc2U+IGNhbGxiYWNrJwotCQkJCXRyYWNlYmFjay5wcmludF9leGMoKQotCQkJZWxzZToKLQkJCQlpZiBydjoKLQkJCQkJcmV0dXJuIHJ2Ci0JCSNmb3Iga2V5IGluIHNlbGYuX3dpZGdldHNkaWN0LmtleXMoKToKLQkJIwlzZWxmLl9yZW1vdmV3aWRnZXQoa2V5KQotCQlzZWxmLmZvcmFsbF9idXRzZWxmKCJjbG9zZSIpCi0JCVdiYXNlLlNlbGVjdGFibGVXaWRnZXQuY2xvc2Uoc2VsZikKLQkJc2VsZi5fdGFiY2hhaW4gPSBbXQotCQlzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQotCQlzZWxmLndpZC5IaWRlV2luZG93KCkKLQkJc2VsZi5kb19wb3N0Y2xvc2UoKQotCQotCWRlZiBkb21lbnVfY2xvc2Uoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLmNsb3NlKCkKLQkKLQlkZWYgZ2V0Ym91bmRzKHNlbGYpOgotCQlyZXR1cm4gc2VsZi5fZ2xvYmFsYm91bmRzCi0JCi0JZGVmIHNldGJvdW5kcyhzZWxmLCBib3VuZHMpOgotCQlsLCB0LCByLCBiID0gYm91bmRzCi0JCXNlbGYubW92ZShsLCB0KQotCQlzZWxmLnJlc2l6ZShyLWwsIGItdCkKLQkKLQlkZWYgbW92ZShzZWxmLCB4LCB5ID0gTm9uZSk6Ci0JCSIiImFic29sdXRlIG1vdmUiIiIKLQkJaWYgeSA9PSBOb25lOgotCQkJeCwgeSA9IHgKLQkJc2VsZi53aWQuTW92ZVdpbmRvdyh4LCB5LCAwKQotCQotCWRlZiByZXNpemUoc2VsZiwgeCwgeSA9IE5vbmUpOgotCQlpZiBub3Qgc2VsZi5faGFzZ3Jvd2JveDoKLQkJCXJldHVybiAgIyBoYW5kcyBvZmYhCi0JCWlmIHkgPT0gTm9uZToKLQkJCXgsIHkgPSB4Ci0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKLQkJc2VsZi53aWQuU2l6ZVdpbmRvdyh4LCB5LCAxKQotCQlzZWxmLl9jYWxjYm91bmRzKCkKLQkKLQlkZWYgdGVzdChzZWxmLCBwb2ludCk6Ci0JCXJldHVybiAxCi0JCi0JZGVmIGRyYXcoc2VsZiwgdmlzUmduID0gTm9uZSk6Ci0JCWlmIHNlbGYuX2hhc2dyb3dib3g6Ci0JCQlzZWxmLnRlbXBjbGlwcmVjdChzZWxmLmdldGdyb3dyZWN0KCkpCi0JCQlzZWxmLndpZC5EcmF3R3Jvd0ljb24oKQotCQkJc2VsZi5yZXN0b3JlY2xpcCgpCi0JCi0JZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgotCQlzZWxmLlNldFBvcnQoKQotCQlwb2ludCA9IEV2dC5HZXRNb3VzZSgpCi0JCXdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCwgMCkKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8aWRsZT4iXQotCQkJaWYgY2FsbGJhY2soKToKLQkJCQlyZXR1cm4KLQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCAiaWRsZSIpOgotCQkJaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6Ci0JCQkJY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGlkbGU+Il0KLQkJCQlpZiBjYWxsYmFjaygpOgotCQkJCQlyZXR1cm4KLQkJCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuaWRsZSgpOgotCQkJCXJldHVybgotCQlpZiB3aWRnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIod2lkZ2V0LCAicm9sbG92ZXIiKToKLQkJCWlmIDE6CSNzZWxmLl9sYXN0cm9sbG92ZXIgPD4gd2lkZ2V0OgotCQkJCWlmIHNlbGYuX2xhc3Ryb2xsb3ZlcjoKLQkJCQkJc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKHBvaW50LCAwKQotCQkJCXNlbGYuX2xhc3Ryb2xsb3ZlciA9IHdpZGdldAotCQkJCXNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3Zlcihwb2ludCwgMSkKLQkJZWxzZToKLQkJCWlmIHNlbGYuX2xhc3Ryb2xsb3ZlcjoKLQkJCQlzZWxmLl9sYXN0cm9sbG92ZXIucm9sbG92ZXIocG9pbnQsIDApCi0JCQlzZWxmLl9sYXN0cm9sbG92ZXIgPSBOb25lCi0JCQlXYmFzZS5TZXRDdXJzb3IoImFycm93IikKIAotCWRlZiB4eHhfX19zZWxlY3Qoc2VsZiwgd2lkZ2V0KToKLQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCA9PSB3aWRnZXQ6Ci0JCQlyZXR1cm4KLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPHNlbGVjdD4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxzZWxlY3Q+Il0KLQkJCWlmIGNhbGxiYWNrKHdpZGdldCk6Ci0JCQkJcmV0dXJuCi0JCWlmIHdpZGdldCBpcyBOb25lOgotCQkJaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZToKLQkJCQlzZWxmLl9jdXJyZW50d2lkZ2V0LnNlbGVjdCgwKQotCQllbGlmIHR5cGUod2lkZ2V0KSA9PSBJbnN0YW5jZVR5cGUgYW5kIHdpZGdldC5fc2VsZWN0YWJsZToKLQkJCXdpZGdldC5zZWxlY3QoMSkKLQkJZWxpZiB3aWRnZXQgPT0gLTEgb3Igd2lkZ2V0ID09IDE6Ci0JCQlpZiBsZW4oc2VsZi5fdGFiY2hhaW4pIDw9IDE6Ci0JCQkJcmV0dXJuCi0JCQl0ZW1wID0gc2VsZi5fdGFiY2hhaW5bKHNlbGYuX3RhYmNoYWluLmluZGV4KHNlbGYuX2N1cnJlbnR3aWRnZXQpICsgd2lkZ2V0KSAlIGxlbihzZWxmLl90YWJjaGFpbildCi0JCQl0ZW1wLnNlbGVjdCgxKQotCQllbHNlOgotCQkJcmFpc2UgVHlwZUVycm9yLCAiV2lkZ2V0IGlzIG5vdCBzZWxlY3RhYmxlIgotCQotCWRlZiBzZXRkZWZhdWx0YnV0dG9uKHNlbGYsIG5ld2RlZmF1bHRidXR0b24gPSBOb25lLCAqa2V5cyk6Ci0JCWlmIG5ld2RlZmF1bHRidXR0b24gPT0gc2VsZi5fZGVmYXVsdGJ1dHRvbjoKLQkJCXJldHVybgotCQlpZiBzZWxmLl9kZWZhdWx0YnV0dG9uOgotCQkJc2VsZi5fZGVmYXVsdGJ1dHRvbi5fc2V0ZGVmYXVsdCgwKQotCQlpZiBub3QgbmV3ZGVmYXVsdGJ1dHRvbjoKLQkJCXNlbGYuYmluZCgicmV0dXJuIiwgTm9uZSkKLQkJCXNlbGYuYmluZCgiZW50ZXIiLCBOb25lKQotCQkJcmV0dXJuCi0JCWltcG9ydCBXY29udHJvbHMKLQkJaWYgbm90IGlzaW5zdGFuY2UobmV3ZGVmYXVsdGJ1dHRvbiwgV2NvbnRyb2xzLkJ1dHRvbik6Ci0JCQlyYWlzZSBUeXBlRXJyb3IsICJ3aWRnZXQgaXMgbm90IGEgYnV0dG9uIgotCQlzZWxmLl9kZWZhdWx0YnV0dG9uID0gbmV3ZGVmYXVsdGJ1dHRvbgotCQlzZWxmLl9kZWZhdWx0YnV0dG9uLl9zZXRkZWZhdWx0KDEpCi0JCWlmIG5vdCBrZXlzOgotCQkJc2VsZi5iaW5kKCJyZXR1cm4iLCBzZWxmLl9kZWZhdWx0YnV0dG9uLnB1c2gpCi0JCQlzZWxmLmJpbmQoImVudGVyIiwgc2VsZi5fZGVmYXVsdGJ1dHRvbi5wdXNoKQotCQllbHNlOgotCQkJZm9yIGtleSBpbiBrZXlzOgotCQkJCXNlbGYuYmluZChrZXksIHNlbGYuX2RlZmF1bHRidXR0b24ucHVzaCkKLQkKLQlkZWYgbmV4dHdpZGdldChzZWxmKToKLQkJc2VsZi54eHhfX19zZWxlY3QoMSkKLQkKLQlkZWYgcHJldmlvdXN3aWRnZXQoc2VsZik6Ci0JCXNlbGYueHh4X19fc2VsZWN0KC0xKQotCQotCWRlZiBkcmF3d2lkZ2V0Ym91bmRzKHNlbGYsIG9ub2ZmKToKLQkJc2VsZi5fZHJhd3dpZGdldGJvdW5kcyA9IG9ub2ZmCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuX2JvdW5kcykKLQkKLQlkZWYgX2RyYXdib3VuZHMoc2VsZik6Ci0JCXBhc3MKKyAgICB3aW5kb3draW5kID0gV2luZG93cy5kb2N1bWVudFByb2MKIAotCWRlZiBfbWFrZXRhYmNoYWluKHNlbGYpOgotCQkjIFhYWCBUaGlzIGhhcyB0byBjaGFuZ2UsIGl0J3Mgbm8gZ29vZCB3aGVuIHdlIGFyZSBhZGRpbmcgb3IgZGVsZXRpbmcgd2lkZ2V0cy4KLQkJIyBYWFggUGVyaGFwcyB3ZSBzaG91bGRuJ3Qga2VlcCBhICJ0YWJjaGFpbiIgYXQgYWxsLgotCQlzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCi0JCXNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyhzZWxmLl93aWRnZXRzKQotCQlpZiBzZWxmLl9oYXNzZWxmcmFtZXMgYW5kIGxlbihzZWxmLl90YWJjaGFpbikgPiAxOgotCQkJc2VsZi5faGFzc2VsZnJhbWVzID0gMQotCQllbHNlOgotCQkJc2VsZi5faGFzc2VsZnJhbWVzID0gMAotCQotCWRlZiBfY29sbGVjdHNlbGVjdGFibGV3aWRnZXRzKHNlbGYsIHdpZGdldHMpOgotCQlpbXBvcnQgVwotCQlmb3IgdyBpbiB3aWRnZXRzOgotCQkJaWYgdy5fc2VsZWN0YWJsZToKLQkJCQlzZWxmLl90YWJjaGFpbi5hcHBlbmQodykKLQkJCQlpZiBpc2luc3RhbmNlKHcsIFcuTGlzdCk6Ci0JCQkJCXNlbGYuX2hhc3NlbGZyYW1lcyA9IDEKLQkJCXNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyh3Ll93aWRnZXRzKQotCQotCWRlZiBfY2FsY2JvdW5kcyhzZWxmKToKLQkJc2VsZi5fcG9zc2l6ZSA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKClbMjpdCi0JCXcsIGggPSBzZWxmLl9wb3NzaXplCi0JCXNlbGYuX2JvdW5kcyA9ICgwLCAwLCB3LCBoKQotCQlzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCi0JCWwsIHQsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJc2VsZi5fZ2xvYmFsYm91bmRzID0gbCwgdCwgbCArIHcsIHQgKyBoCi0JCWZvciB3IGluIHNlbGYuX3dpZGdldHM6Ci0JCQl3Ll9jYWxjYm91bmRzKCkKLQkKLQkjIEZyYW1lV29yayBvdmVycmlkZSBtZXRob2RzCi0JZGVmIGRvX2luRHJhZyhzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6Ci0JCXdoZXJlID0gZXZlbnRbM10KLQkJc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQotCQl3YXNfbCwgd2FzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJd2luZG93LkRyYWdXaW5kb3cod2hlcmUsIHNlbGYuZHJhZ2xpbWl0KQotCQlzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCi0JCWlzX2wsIGlzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKLQkJc2VsZi5fZ2xvYmFsYm91bmRzID0gUWQuT2Zmc2V0UmVjdChzZWxmLl9nbG9iYWxib3VuZHMsIAotCQkJCQlpc19sIC0gd2FzX2wsIGlzX3QgLSB3YXNfdCkKLQkKLQlkZWYgZG9fY2hhcihzZWxmLCBjaGFyLCBldmVudCk6Ci0JCWltcG9ydCBXa2V5cwotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlrZXkgPSBjaGFyCi0JCWlmIFdrZXlzLmtleW5hbWVzLmhhc19rZXkoa2V5KToKLQkJCWtleSA9IFdrZXlzLmtleW5hbWVzW2tleV0KLQkJaWYgbW9kaWZpZXJzICYgRXZlbnRzLnNoaWZ0S2V5OgotCQkJa2V5ID0gJ3NoaWZ0JyArIGtleQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5OgotCQkJa2V5ID0gJ2NtZCcgKyBrZXkKLQkJaWYgbW9kaWZpZXJzICYgRXZlbnRzLmNvbnRyb2xLZXk6Ci0JCQlrZXkgPSAnY29udHJvbCcgKyBrZXkKLQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGtleT4iKToKLQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxrZXk+Il0KLQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpOgotCQkJCXJldHVybgotCQlpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KGtleSk6Ci0JCQljYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzW2tleV0KLQkJCVdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpCi0JCWVsaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZToKLQkJCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzLmhhc19rZXkoa2V5KToKLQkJCQljYWxsYmFjayA9IHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzW2tleV0KLQkJCQlXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KQotCQkJZWxzZToKLQkJCQlpZiBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8a2V5PiIpOgotCQkJCQljYWxsYmFjayA9IHNlbGYuX2N1cnJlbnR3aWRnZXQuX2JpbmRpbmdzWyI8a2V5PiJdCi0JCQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgY2hhciwgZXZlbnQpOgotCQkJCQkJcmV0dXJuCi0JCQkJc2VsZi5fY3VycmVudHdpZGdldC5rZXkoY2hhciwgZXZlbnQpCi0JCi0JZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzLCBldmVudCk6Ci0JCXdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCkKLQkJaWYgd2lkZ2V0IGlzIG5vdCBOb25lOgotCQkJaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsaWNrPiIpOgotCQkJCWNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbGljaz4iXQotCQkJCWlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgcG9pbnQsIG1vZGlmaWVycyk6Ci0JCQkJCXJldHVybgotCQkJaWYgd2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8Y2xpY2s+Iik6Ci0JCQkJY2FsbGJhY2sgPSB3aWRnZXQuX2JpbmRpbmdzWyI8Y2xpY2s+Il0KLQkJCQlpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIHBvaW50LCBtb2RpZmllcnMpOgotCQkJCQlyZXR1cm4KLQkJCWlmIHdpZGdldC5fc2VsZWN0YWJsZToKLQkJCQl3aWRnZXQuc2VsZWN0KDEsIDEpCi0JCQl3aWRnZXQuY2xpY2socG9pbnQsIG1vZGlmaWVycykKLQkKLQlkZWYgZG9fdXBkYXRlKHNlbGYsIHdpbmRvdywgZXZlbnQpOgotCQlRZC5FcmFzZVJnbih3aW5kb3cuR2V0V2luZG93UG9ydCgpLnZpc1JnbikKLQkJc2VsZi5mb3JhbGxfZnJvbWJvdHRvbSgiZHJhdyIsIHdpbmRvdy5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQotCQlpZiBzZWxmLl9kcmF3d2lkZ2V0Ym91bmRzOgotCQkJc2VsZi5mb3JhbGxfZnJvbWJvdHRvbSgiX2RyYXdib3VuZHMiKQotCQotCWRlZiBkb19hY3RpdmF0ZShzZWxmLCBvbm9mZiwgZXZlbnQpOgotCQlpZiBub3Qgb25vZmY6Ci0JCQlpZiBzZWxmLl9sYXN0cm9sbG92ZXI6Ci0JCQkJc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKCgwLCAwKSwgMCkKLQkJCQlzZWxmLl9sYXN0cm9sbG92ZXIgPSBOb25lCi0JCXNlbGYuU2V0UG9ydCgpCi0JCXNlbGYuZm9yYWxsKCJhY3RpdmF0ZSIsIG9ub2ZmKQotCQlzZWxmLmRyYXcoKQotCQotCWRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6Ci0JCXNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKLQkJc2VsZi5fY2FsY2JvdW5kcygpCi0JCi0JZGVmIGRvX2luR29Bd2F5KHNlbGYsIHBhcnRjb2RlLCB3aW5kb3csIGV2ZW50KToKLQkJd2hlcmUgPSBldmVudFszXQotCQljbG9zZWFsbCA9IGV2ZW50WzRdICYgRXZlbnRzLm9wdGlvbktleQotCQlpZiB3aW5kb3cuVHJhY2tHb0F3YXkod2hlcmUpOgotCQkJaWYgbm90IGNsb3NlYWxsOgotCQkJCXNlbGYuY2xvc2UoKQotCQkJZWxzZToKLQkJCQlmb3Igd2luZG93IGluIHNlbGYucGFyZW50Ll93aW5kb3dzLnZhbHVlcygpOgotCQkJCQlydiA9IHdpbmRvdy5jbG9zZSgpCi0JCQkJCWlmIHJ2IGFuZCBydiA+IDA6Ci0JCQkJCQlyZXR1cm4KLQkKLQkjIHV0aWxpdGllcwotCWRlZiB0ZW1wY2xpcHJlY3Qoc2VsZiwgdGVtcGNsaXByZWN0KToKLQkJdGVtcGNsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5SZWN0UmduKHRlbXBjbGlwLCB0ZW1wY2xpcHJlY3QpCi0JCXNlbGYudGVtcGNsaXAodGVtcGNsaXApCi0JCVFkLkRpc3Bvc2VSZ24odGVtcGNsaXApCi0JCi0JZGVmIHRlbXBjbGlwKHNlbGYsIHRlbXBjbGlwKToKLQkJaWYgbm90IGhhc2F0dHIoc2VsZiwgInNhdmVjbGlwIik6Ci0JCQlzZWxmLnNhdmVjbGlwID0gW10KLQkJc2F2ZWNsaXAgPSBRZC5OZXdSZ24oKQotCQlRZC5HZXRDbGlwKHNhdmVjbGlwKQotCQlzZWxmLnNhdmVjbGlwLmFwcGVuZChzYXZlY2xpcCkKLQkJUWQuU2V0Q2xpcCh0ZW1wY2xpcCkKLQkKLQlkZWYgcmVzdG9yZWNsaXAoc2VsZik6Ci0JCVFkLlNldENsaXAoc2VsZi5zYXZlY2xpcFstMV0pCi0JCVFkLkRpc3Bvc2VSZ24oc2VsZi5zYXZlY2xpcFstMV0pCi0JCWRlbCBzZWxmLnNhdmVjbGlwWy0xXQotCQotCWRlZiBnZXRncm93cmVjdChzZWxmKToKLQkJbCwgdCwgciwgYiA9IHNlbGYud2lkLkdldFdpbmRvd1BvcnQoKS5HZXRQb3J0Qm91bmRzKCkKLQkJcmV0dXJuIChyIC0gMTUsIGIgLSAxNSwgciwgYikKLQkKLQlkZWYgaGFzX2tleShzZWxmLCBrZXkpOgotCQlyZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpCi0JCi0JZGVmIF9fZ2V0YXR0cl9fKHNlbGYsIGF0dHIpOgotCQlnbG9iYWwgX3N1Y2Nlc3Njb3VudCwgX2ZhaWxjb3VudCwgX21hZ2ljY291bnQKLQkJaWYgc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShhdHRyKToKLQkJCV9zdWNjZXNzY291bnQgPSBfc3VjY2Vzc2NvdW50ICsgMQotCQkJcmV0dXJuIHNlbGYuX3dpZGdldHNkaWN0W2F0dHJdCi0JCWlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgaXMgTm9uZSBvciAoYXR0cls6N10gPD4gJ2RvbWVudV8nIGFuZCAKLQkJCQlhdHRyWzo0XSA8PiAnY2FuXycgYW5kIGF0dHIgPD4gJ2luc2VydCcpOgotCQkJX2ZhaWxjb3VudCA9IF9mYWlsY291bnQgKyAxCi0JCQlyYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgotCQkjIHNwZWNpYWwgY2FzZTogaWYgYSBkb21lbnVfeHh4LCBjYW5feHh4IG9yIGluc2VydCBtZXRob2QgaXMgYXNrZWQgZm9yLCAKLQkJIyBzZWUgaWYgdGhlIGFjdGl2ZSB3aWRnZXQgc3VwcG9ydHMgaXQKLQkJX21hZ2ljY291bnQgPSBfbWFnaWNjb3VudCArIDEKLQkJcmV0dXJuIGdldGF0dHIoc2VsZi5fY3VycmVudHdpZGdldCwgYXR0cikKKyAgICBkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGU9IiIsIG1pbnNpemU9Tm9uZSwgbWF4c2l6ZT1Ob25lLAorICAgICAgICAgICAgICAgICAgICB0YWJiYWJsZT0xLCBzaG93PTEsIGZvbnRzZXR0aW5ncz1Ob25lKToKKyAgICAgICAgaW1wb3J0IFcKKyAgICAgICAgaWYgZm9udHNldHRpbmdzIGlzIE5vbmU6CisgICAgICAgICAgICBmb250c2V0dGluZ3MgPSBXLmdldGRlZmF1bHRmb250KCkKKyAgICAgICAgc2VsZi5fZm9udHNldHRpbmdzID0gZm9udHNldHRpbmdzCisgICAgICAgIFcuU2VsZWN0YWJsZVdpZGdldC5fX2luaXRfXyhzZWxmLCBwb3NzaXplKQorICAgICAgICBzZWxmLl9nbG9iYWxib3VuZHMgPSBsLCB0LCByLCBiID0gc2VsZi5nZXR3aW5kb3dib3VuZHMocG9zc2l6ZSwgbWluc2l6ZSkKKyAgICAgICAgc2VsZi5fYm91bmRzID0gKDAsIDAsIHIgLSBsLCBiIC0gdCkKKyAgICAgICAgc2VsZi5fdGFiY2hhaW4gPSBbXQorICAgICAgICBzZWxmLl9jdXJyZW50d2lkZ2V0ID0gTm9uZQorICAgICAgICBzZWxmLnRpdGxlID0gdGl0bGUKKyAgICAgICAgc2VsZi5fcGFyZW50d2luZG93ID0gc2VsZgorICAgICAgICBzZWxmLl90YWJiYWJsZSA9IHRhYmJhYmxlCisgICAgICAgIHNlbGYuX2RlZmF1bHRidXR0b24gPSBOb25lCisgICAgICAgIHNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSAwCisgICAgICAgIHNlbGYuX3Nob3cgPSBzaG93CisgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKKyAgICAgICAgc2VsZi5oYXNjbG9zZWJveCA9IDEKKyAgICAgICAgIyBYWFggdGhlIGZvbGxvd2luZyBpcyBub3QgcmVhbGx5IGNvbXBhdGlibGUgd2l0aCB0aGUKKyAgICAgICAgIyAgbmV3IChzeXN0ZW0gPj0gNy41KSB3aW5kb3cgcHJvY3MuCisgICAgICAgIGlmIG1pbnNpemU6CisgICAgICAgICAgICBzZWxmLl9oYXNncm93Ym94ID0gMQorICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gc2VsZi53aW5kb3draW5kIHwgOAorICAgICAgICAgICAgbCwgdCA9IG1pbnNpemUKKyAgICAgICAgICAgIGlmIG1heHNpemU6CisgICAgICAgICAgICAgICAgciwgYiA9IG1heHNpemVbMF0gKyAxLCBtYXhzaXplWzFdICsgMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByLCBiID0gMzIwMDAsIDMyMDAwCisgICAgICAgICAgICBzZWxmLmdyb3dsaW1pdCA9IChsLCB0LCByLCBiKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faGFzZ3Jvd2JveCA9IDAKKyAgICAgICAgICAgIGlmIChzZWxmLndpbmRvd2tpbmQgPT0gMCBvciBzZWxmLndpbmRvd2tpbmQgPj0gOCkgYW5kIHNlbGYud2luZG93a2luZCA8IDEwMDA6CisgICAgICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gc2VsZi53aW5kb3draW5kIHwgNAorICAgICAgICBGcmFtZVdvcmsuV2luZG93Ll9faW5pdF9fKHNlbGYsIFcuZ2V0YXBwbGljYXRpb24oKSkKKworICAgIGRlZiBnZXR0aXRsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYudGl0bGUKKworICAgIGRlZiBzZXR0aXRsZShzZWxmLCB0aXRsZSk6CisgICAgICAgIHNlbGYudGl0bGUgPSB0aXRsZQorICAgICAgICBpZiBzZWxmLndpZDoKKyAgICAgICAgICAgIHNlbGYud2lkLlNldFdUaXRsZSh0aXRsZSkKKworICAgIGRlZiBnZXR3aW5kb3dib3VuZHMoc2VsZiwgc2l6ZSwgbWluc2l6ZSA9IE5vbmUpOgorICAgICAgICByZXR1cm4gd2luZG93Ym91bmRzKHNpemUsIG1pbnNpemUpCisKKyAgICBkZWYgZ2V0Y3VycmVudHdpZGdldChzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYuX2N1cnJlbnR3aWRnZXQKKworICAgIGRlZiBzaG93KHNlbGYsIG9ub2ZmKToKKyAgICAgICAgaWYgb25vZmY6CisgICAgICAgICAgICBzZWxmLndpZC5TaG93V2luZG93KCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2lkLkhpZGVXaW5kb3coKQorCisgICAgZGVmIGlzdmlzaWJsZShzZWxmKToKKyAgICAgICAgcmV0dXJuIHNlbGYud2lkLklzV2luZG93VmlzaWJsZSgpCisKKyAgICBkZWYgc2VsZWN0KHNlbGYpOgorICAgICAgICBzZWxmLndpZC5TZWxlY3RXaW5kb3coKQorICAgICAgICAjIG5vdCBzdXJlIGlmIHRoaXMgaXMgdGhlIGJlc3QgcGxhY2UsIEkgbmVlZCBpdCB3aGVuCisgICAgICAgICMgYW4gZWRpdG9yIGdldHMgc2VsZWN0ZWQsIGFuZCBpbW1lZGlhdGVseSBzY3JvbGxlZAorICAgICAgICAjIHRvIGEgY2VydGFpbiBsaW5lLCB3YXN0ZSBzY3JvbGwgYXNzdW1lcyBldmVyeXRoaW5nCisgICAgICAgICMgdG8gYmUgaW4gdGFjdC4KKyAgICAgICAgc2VsZi5kb19yYXd1cGRhdGUoc2VsZi53aWQsICJEdW1teUV2ZW50IikKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBzZWxmLndpZCA9IFdpbi5OZXdDV2luZG93KHNlbGYuX2dsb2JhbGJvdW5kcywgc2VsZi50aXRsZSwgc2VsZi5fc2hvdywKKyAgICAgICAgICAgICAgICBzZWxmLndpbmRvd2tpbmQsIC0xLCBzZWxmLmhhc2Nsb3NlYm94LCAwKQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBmb250bmFtZSwgZm9udHN0eWxlLCBmb250c2l6ZSwgZm9udGNvbG9yID0gc2VsZi5fZm9udHNldHRpbmdzCisgICAgICAgIGZudW0gPSBGbS5HZXRGTnVtKGZvbnRuYW1lKQorICAgICAgICBpZiBmbnVtID09IDA6CisgICAgICAgICAgICBmbnVtID0gRm0uR2V0Rk51bSgiR2VuZXZhIikKKyAgICAgICAgUWQuVGV4dEZvbnQoZm51bSkKKyAgICAgICAgUWQuVGV4dEZhY2UoZm9udHN0eWxlKQorICAgICAgICBRZC5UZXh0U2l6ZShmb250c2l6ZSkKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPG9wZW4+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8b3Blbj4iXQorICAgICAgICAgICAgY2FsbGJhY2soKQorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5mb3JhbGxfZnJvbWJvdHRvbSgib3BlbiIpCisgICAgICAgIHNlbGYuX21ha2V0YWJjaGFpbigpCisgICAgICAgIGlmIHNlbGYuX3RhYmJhYmxlOgorICAgICAgICAgICAgc2VsZi5iaW5kKCd0YWInLCBzZWxmLm5leHR3aWRnZXQpCisgICAgICAgICAgICBzZWxmLmJpbmQoJ3NoaWZ0dGFiJywgc2VsZi5wcmV2aW91c3dpZGdldCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuX2hhc3NlbGZyYW1lcyA9IDAKKyAgICAgICAgaWYgc2VsZi5fdGFiY2hhaW46CisgICAgICAgICAgICBzZWxmLl90YWJjaGFpblswXS5zZWxlY3QoMSkKKyAgICAgICAgc2VsZi5kb19wb3N0b3BlbigpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLndpZDoKKyAgICAgICAgICAgIHJldHVybiAgIyB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsb3NlPiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPGNsb3NlPiJdCisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgcnYgPSBjYWxsYmFjaygpCisgICAgICAgICAgICBleGNlcHQ6CisgICAgICAgICAgICAgICAgcHJpbnQgJ2Vycm9yIGluIDxjbG9zZT4gY2FsbGJhY2snCisgICAgICAgICAgICAgICAgdHJhY2ViYWNrLnByaW50X2V4YygpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGlmIHJ2OgorICAgICAgICAgICAgICAgICAgICByZXR1cm4gcnYKKyAgICAgICAgI2ZvciBrZXkgaW4gc2VsZi5fd2lkZ2V0c2RpY3Qua2V5cygpOgorICAgICAgICAjICAgICAgIHNlbGYuX3JlbW92ZXdpZGdldChrZXkpCisgICAgICAgIHNlbGYuZm9yYWxsX2J1dHNlbGYoImNsb3NlIikKKyAgICAgICAgV2Jhc2UuU2VsZWN0YWJsZVdpZGdldC5jbG9zZShzZWxmKQorICAgICAgICBzZWxmLl90YWJjaGFpbiA9IFtdCisgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQgPSBOb25lCisgICAgICAgIHNlbGYud2lkLkhpZGVXaW5kb3coKQorICAgICAgICBzZWxmLmRvX3Bvc3RjbG9zZSgpCisKKyAgICBkZWYgZG9tZW51X2Nsb3NlKHNlbGYsICphcmdzKToKKyAgICAgICAgc2VsZi5jbG9zZSgpCisKKyAgICBkZWYgZ2V0Ym91bmRzKHNlbGYpOgorICAgICAgICByZXR1cm4gc2VsZi5fZ2xvYmFsYm91bmRzCisKKyAgICBkZWYgc2V0Ym91bmRzKHNlbGYsIGJvdW5kcyk6CisgICAgICAgIGwsIHQsIHIsIGIgPSBib3VuZHMKKyAgICAgICAgc2VsZi5tb3ZlKGwsIHQpCisgICAgICAgIHNlbGYucmVzaXplKHItbCwgYi10KQorCisgICAgZGVmIG1vdmUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICAiIiJhYnNvbHV0ZSBtb3ZlIiIiCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIHNlbGYud2lkLk1vdmVXaW5kb3coeCwgeSwgMCkKKworICAgIGRlZiByZXNpemUoc2VsZiwgeCwgeSA9IE5vbmUpOgorICAgICAgICBpZiBub3Qgc2VsZi5faGFzZ3Jvd2JveDoKKyAgICAgICAgICAgIHJldHVybiAgIyBoYW5kcyBvZmYhCisgICAgICAgIGlmIHkgPT0gTm9uZToKKyAgICAgICAgICAgIHgsIHkgPSB4CisgICAgICAgIHNlbGYuU2V0UG9ydCgpCisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKKyAgICAgICAgc2VsZi53aWQuU2l6ZVdpbmRvdyh4LCB5LCAxKQorICAgICAgICBzZWxmLl9jYWxjYm91bmRzKCkKKworICAgIGRlZiB0ZXN0KHNlbGYsIHBvaW50KToKKyAgICAgICAgcmV0dXJuIDEKKworICAgIGRlZiBkcmF3KHNlbGYsIHZpc1JnbiA9IE5vbmUpOgorICAgICAgICBpZiBzZWxmLl9oYXNncm93Ym94OgorICAgICAgICAgICAgc2VsZi50ZW1wY2xpcHJlY3Qoc2VsZi5nZXRncm93cmVjdCgpKQorICAgICAgICAgICAgc2VsZi53aWQuRHJhd0dyb3dJY29uKCkKKyAgICAgICAgICAgIHNlbGYucmVzdG9yZWNsaXAoKQorCisgICAgZGVmIGlkbGUoc2VsZiwgKmFyZ3MpOgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBwb2ludCA9IEV2dC5HZXRNb3VzZSgpCisgICAgICAgIHdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCwgMCkKKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8aWRsZT4iXQorICAgICAgICAgICAgaWYgY2FsbGJhY2soKToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBub3QgTm9uZSBhbmQgaGFzYXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCAiaWRsZSIpOgorICAgICAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGlkbGU+Iik6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGlkbGU+Il0KKyAgICAgICAgICAgICAgICBpZiBjYWxsYmFjaygpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHNlbGYuX2N1cnJlbnR3aWRnZXQuaWRsZSgpOgorICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB3aWRnZXQgaXMgbm90IE5vbmUgYW5kIGhhc2F0dHIod2lkZ2V0LCAicm9sbG92ZXIiKToKKyAgICAgICAgICAgIGlmIDE6ICAgI3NlbGYuX2xhc3Ryb2xsb3ZlciA8PiB3aWRnZXQ6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgICAgICBzZWxmLl9sYXN0cm9sbG92ZXIucm9sbG92ZXIocG9pbnQsIDApCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyID0gd2lkZ2V0CisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyLnJvbGxvdmVyKHBvaW50LCAxKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3Zlcihwb2ludCwgMCkKKyAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3ZlciA9IE5vbmUKKyAgICAgICAgICAgIFdiYXNlLlNldEN1cnNvcigiYXJyb3ciKQorCisgICAgZGVmIHh4eF9fX3NlbGVjdChzZWxmLCB3aWRnZXQpOgorICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0ID09IHdpZGdldDoKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiBzZWxmLl9iaW5kaW5ncy5oYXNfa2V5KCI8c2VsZWN0PiIpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1siPHNlbGVjdD4iXQorICAgICAgICAgICAgaWYgY2FsbGJhY2sod2lkZ2V0KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgd2lkZ2V0IGlzIE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQuc2VsZWN0KDApCisgICAgICAgIGVsaWYgdHlwZSh3aWRnZXQpID09IEluc3RhbmNlVHlwZSBhbmQgd2lkZ2V0Ll9zZWxlY3RhYmxlOgorICAgICAgICAgICAgd2lkZ2V0LnNlbGVjdCgxKQorICAgICAgICBlbGlmIHdpZGdldCA9PSAtMSBvciB3aWRnZXQgPT0gMToKKyAgICAgICAgICAgIGlmIGxlbihzZWxmLl90YWJjaGFpbikgPD0gMToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIHRlbXAgPSBzZWxmLl90YWJjaGFpblsoc2VsZi5fdGFiY2hhaW4uaW5kZXgoc2VsZi5fY3VycmVudHdpZGdldCkgKyB3aWRnZXQpICUgbGVuKHNlbGYuX3RhYmNoYWluKV0KKyAgICAgICAgICAgIHRlbXAuc2VsZWN0KDEpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICByYWlzZSBUeXBlRXJyb3IsICJXaWRnZXQgaXMgbm90IHNlbGVjdGFibGUiCisKKyAgICBkZWYgc2V0ZGVmYXVsdGJ1dHRvbihzZWxmLCBuZXdkZWZhdWx0YnV0dG9uID0gTm9uZSwgKmtleXMpOgorICAgICAgICBpZiBuZXdkZWZhdWx0YnV0dG9uID09IHNlbGYuX2RlZmF1bHRidXR0b246CisgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fZGVmYXVsdGJ1dHRvbjoKKyAgICAgICAgICAgIHNlbGYuX2RlZmF1bHRidXR0b24uX3NldGRlZmF1bHQoMCkKKyAgICAgICAgaWYgbm90IG5ld2RlZmF1bHRidXR0b246CisgICAgICAgICAgICBzZWxmLmJpbmQoInJldHVybiIsIE5vbmUpCisgICAgICAgICAgICBzZWxmLmJpbmQoImVudGVyIiwgTm9uZSkKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpbXBvcnQgV2NvbnRyb2xzCisgICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKG5ld2RlZmF1bHRidXR0b24sIFdjb250cm9scy5CdXR0b24pOgorICAgICAgICAgICAgcmFpc2UgVHlwZUVycm9yLCAid2lkZ2V0IGlzIG5vdCBhIGJ1dHRvbiIKKyAgICAgICAgc2VsZi5fZGVmYXVsdGJ1dHRvbiA9IG5ld2RlZmF1bHRidXR0b24KKyAgICAgICAgc2VsZi5fZGVmYXVsdGJ1dHRvbi5fc2V0ZGVmYXVsdCgxKQorICAgICAgICBpZiBub3Qga2V5czoKKyAgICAgICAgICAgIHNlbGYuYmluZCgicmV0dXJuIiwgc2VsZi5fZGVmYXVsdGJ1dHRvbi5wdXNoKQorICAgICAgICAgICAgc2VsZi5iaW5kKCJlbnRlciIsIHNlbGYuX2RlZmF1bHRidXR0b24ucHVzaCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGZvciBrZXkgaW4ga2V5czoKKyAgICAgICAgICAgICAgICBzZWxmLmJpbmQoa2V5LCBzZWxmLl9kZWZhdWx0YnV0dG9uLnB1c2gpCisKKyAgICBkZWYgbmV4dHdpZGdldChzZWxmKToKKyAgICAgICAgc2VsZi54eHhfX19zZWxlY3QoMSkKKworICAgIGRlZiBwcmV2aW91c3dpZGdldChzZWxmKToKKyAgICAgICAgc2VsZi54eHhfX19zZWxlY3QoLTEpCisKKyAgICBkZWYgZHJhd3dpZGdldGJvdW5kcyhzZWxmLCBvbm9mZik6CisgICAgICAgIHNlbGYuX2RyYXd3aWRnZXRib3VuZHMgPSBvbm9mZgorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLkdldFdpbmRvdygpLkludmFsV2luZG93UmVjdChzZWxmLl9ib3VuZHMpCisKKyAgICBkZWYgX2RyYXdib3VuZHMoc2VsZik6CisgICAgICAgIHBhc3MKKworICAgIGRlZiBfbWFrZXRhYmNoYWluKHNlbGYpOgorICAgICAgICAjIFhYWCBUaGlzIGhhcyB0byBjaGFuZ2UsIGl0J3Mgbm8gZ29vZCB3aGVuIHdlIGFyZSBhZGRpbmcgb3IgZGVsZXRpbmcgd2lkZ2V0cy4KKyAgICAgICAgIyBYWFggUGVyaGFwcyB3ZSBzaG91bGRuJ3Qga2VlcCBhICJ0YWJjaGFpbiIgYXQgYWxsLgorICAgICAgICBzZWxmLl9oYXNzZWxmcmFtZXMgPSAwCisgICAgICAgIHNlbGYuX2NvbGxlY3RzZWxlY3RhYmxld2lkZ2V0cyhzZWxmLl93aWRnZXRzKQorICAgICAgICBpZiBzZWxmLl9oYXNzZWxmcmFtZXMgYW5kIGxlbihzZWxmLl90YWJjaGFpbikgPiAxOgorICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMAorCisgICAgZGVmIF9jb2xsZWN0c2VsZWN0YWJsZXdpZGdldHMoc2VsZiwgd2lkZ2V0cyk6CisgICAgICAgIGltcG9ydCBXCisgICAgICAgIGZvciB3IGluIHdpZGdldHM6CisgICAgICAgICAgICBpZiB3Ll9zZWxlY3RhYmxlOgorICAgICAgICAgICAgICAgIHNlbGYuX3RhYmNoYWluLmFwcGVuZCh3KQorICAgICAgICAgICAgICAgIGlmIGlzaW5zdGFuY2UodywgVy5MaXN0KToKKyAgICAgICAgICAgICAgICAgICAgc2VsZi5faGFzc2VsZnJhbWVzID0gMQorICAgICAgICAgICAgc2VsZi5fY29sbGVjdHNlbGVjdGFibGV3aWRnZXRzKHcuX3dpZGdldHMpCisKKyAgICBkZWYgX2NhbGNib3VuZHMoc2VsZik6CisgICAgICAgIHNlbGYuX3Bvc3NpemUgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpWzI6XQorICAgICAgICB3LCBoID0gc2VsZi5fcG9zc2l6ZQorICAgICAgICBzZWxmLl9ib3VuZHMgPSAoMCwgMCwgdywgaCkKKyAgICAgICAgc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQorICAgICAgICBsLCB0LCByLCBiID0gR2V0UmduQm91bmRzKHNjcmF0Y2hSZWdpb24pCisgICAgICAgIHNlbGYuX2dsb2JhbGJvdW5kcyA9IGwsIHQsIGwgKyB3LCB0ICsgaAorICAgICAgICBmb3IgdyBpbiBzZWxmLl93aWRnZXRzOgorICAgICAgICAgICAgdy5fY2FsY2JvdW5kcygpCisKKyAgICAjIEZyYW1lV29yayBvdmVycmlkZSBtZXRob2RzCisgICAgZGVmIGRvX2luRHJhZyhzZWxmLCBwYXJ0Y29kZSwgd2luZG93LCBldmVudCk6CisgICAgICAgIHdoZXJlID0gZXZlbnRbM10KKyAgICAgICAgc2VsZi53aWQuR2V0V2luZG93Q29udGVudFJnbihzY3JhdGNoUmVnaW9uKQorICAgICAgICB3YXNfbCwgd2FzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKKyAgICAgICAgd2luZG93LkRyYWdXaW5kb3cod2hlcmUsIHNlbGYuZHJhZ2xpbWl0KQorICAgICAgICBzZWxmLndpZC5HZXRXaW5kb3dDb250ZW50UmduKHNjcmF0Y2hSZWdpb24pCisgICAgICAgIGlzX2wsIGlzX3QsIHIsIGIgPSBHZXRSZ25Cb3VuZHMoc2NyYXRjaFJlZ2lvbikKKyAgICAgICAgc2VsZi5fZ2xvYmFsYm91bmRzID0gUWQuT2Zmc2V0UmVjdChzZWxmLl9nbG9iYWxib3VuZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2wgLSB3YXNfbCwgaXNfdCAtIHdhc190KQorCisgICAgZGVmIGRvX2NoYXIoc2VsZiwgY2hhciwgZXZlbnQpOgorICAgICAgICBpbXBvcnQgV2tleXMKKyAgICAgICAgKHdoYXQsIG1lc3NhZ2UsIHdoZW4sIHdoZXJlLCBtb2RpZmllcnMpID0gZXZlbnQKKyAgICAgICAga2V5ID0gY2hhcgorICAgICAgICBpZiBXa2V5cy5rZXluYW1lcy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICBrZXkgPSBXa2V5cy5rZXluYW1lc1trZXldCisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5zaGlmdEtleToKKyAgICAgICAgICAgIGtleSA9ICdzaGlmdCcgKyBrZXkKKyAgICAgICAgaWYgbW9kaWZpZXJzICYgRXZlbnRzLmNtZEtleToKKyAgICAgICAgICAgIGtleSA9ICdjbWQnICsga2V5CisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jb250cm9sS2V5OgorICAgICAgICAgICAga2V5ID0gJ2NvbnRyb2wnICsga2V5CisgICAgICAgIGlmIHNlbGYuX2JpbmRpbmdzLmhhc19rZXkoIjxrZXk+Iik6CisgICAgICAgICAgICBjYWxsYmFjayA9IHNlbGYuX2JpbmRpbmdzWyI8a2V5PiJdCisgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleShrZXkpOgorICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9iaW5kaW5nc1trZXldCisgICAgICAgICAgICBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KQorICAgICAgICBlbGlmIHNlbGYuX2N1cnJlbnR3aWRnZXQgaXMgbm90IE5vbmU6CisgICAgICAgICAgICBpZiBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KGtleSk6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1trZXldCisgICAgICAgICAgICAgICAgV2Jhc2UuQ2FsbGJhY2tDYWxsKGNhbGxiYWNrLCAwLCBjaGFyLCBldmVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldC5fYmluZGluZ3MuaGFzX2tleSgiPGtleT4iKToKKyAgICAgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSBzZWxmLl9jdXJyZW50d2lkZ2V0Ll9iaW5kaW5nc1siPGtleT4iXQorICAgICAgICAgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIGNoYXIsIGV2ZW50KToKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgICAgIHNlbGYuX2N1cnJlbnR3aWRnZXQua2V5KGNoYXIsIGV2ZW50KQorCisgICAgZGVmIGRvX2NvbnRlbnRjbGljayhzZWxmLCBwb2ludCwgbW9kaWZpZXJzLCBldmVudCk6CisgICAgICAgIHdpZGdldCA9IHNlbGYuZmluZHdpZGdldChwb2ludCkKKyAgICAgICAgaWYgd2lkZ2V0IGlzIG5vdCBOb25lOgorICAgICAgICAgICAgaWYgc2VsZi5fYmluZGluZ3MuaGFzX2tleSgiPGNsaWNrPiIpOgorICAgICAgICAgICAgICAgIGNhbGxiYWNrID0gc2VsZi5fYmluZGluZ3NbIjxjbGljaz4iXQorICAgICAgICAgICAgICAgIGlmIFdiYXNlLkNhbGxiYWNrQ2FsbChjYWxsYmFjaywgMCwgcG9pbnQsIG1vZGlmaWVycyk6CisgICAgICAgICAgICAgICAgICAgIHJldHVybgorICAgICAgICAgICAgaWYgd2lkZ2V0Ll9iaW5kaW5ncy5oYXNfa2V5KCI8Y2xpY2s+Iik6CisgICAgICAgICAgICAgICAgY2FsbGJhY2sgPSB3aWRnZXQuX2JpbmRpbmdzWyI8Y2xpY2s+Il0KKyAgICAgICAgICAgICAgICBpZiBXYmFzZS5DYWxsYmFja0NhbGwoY2FsbGJhY2ssIDAsIHBvaW50LCBtb2RpZmllcnMpOgorICAgICAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGlmIHdpZGdldC5fc2VsZWN0YWJsZToKKyAgICAgICAgICAgICAgICB3aWRnZXQuc2VsZWN0KDEsIDEpCisgICAgICAgICAgICB3aWRnZXQuY2xpY2socG9pbnQsIG1vZGlmaWVycykKKworICAgIGRlZiBkb191cGRhdGUoc2VsZiwgd2luZG93LCBldmVudCk6CisgICAgICAgIFFkLkVyYXNlUmduKHdpbmRvdy5HZXRXaW5kb3dQb3J0KCkudmlzUmduKQorICAgICAgICBzZWxmLmZvcmFsbF9mcm9tYm90dG9tKCJkcmF3Iiwgd2luZG93LkdldFdpbmRvd1BvcnQoKS52aXNSZ24pCisgICAgICAgIGlmIHNlbGYuX2RyYXd3aWRnZXRib3VuZHM6CisgICAgICAgICAgICBzZWxmLmZvcmFsbF9mcm9tYm90dG9tKCJfZHJhd2JvdW5kcyIpCisKKyAgICBkZWYgZG9fYWN0aXZhdGUoc2VsZiwgb25vZmYsIGV2ZW50KToKKyAgICAgICAgaWYgbm90IG9ub2ZmOgorICAgICAgICAgICAgaWYgc2VsZi5fbGFzdHJvbGxvdmVyOgorICAgICAgICAgICAgICAgIHNlbGYuX2xhc3Ryb2xsb3Zlci5yb2xsb3ZlcigoMCwgMCksIDApCisgICAgICAgICAgICAgICAgc2VsZi5fbGFzdHJvbGxvdmVyID0gTm9uZQorICAgICAgICBzZWxmLlNldFBvcnQoKQorICAgICAgICBzZWxmLmZvcmFsbCgiYWN0aXZhdGUiLCBvbm9mZikKKyAgICAgICAgc2VsZi5kcmF3KCkKKworICAgIGRlZiBkb19wb3N0cmVzaXplKHNlbGYsIHdpZHRoLCBoZWlnaHQsIHdpbmRvdyk6CisgICAgICAgIHNlbGYuR2V0V2luZG93KCkuSW52YWxXaW5kb3dSZWN0KHNlbGYuZ2V0Z3Jvd3JlY3QoKSkKKyAgICAgICAgc2VsZi5fY2FsY2JvdW5kcygpCisKKyAgICBkZWYgZG9faW5Hb0F3YXkoc2VsZiwgcGFydGNvZGUsIHdpbmRvdywgZXZlbnQpOgorICAgICAgICB3aGVyZSA9IGV2ZW50WzNdCisgICAgICAgIGNsb3NlYWxsID0gZXZlbnRbNF0gJiBFdmVudHMub3B0aW9uS2V5CisgICAgICAgIGlmIHdpbmRvdy5UcmFja0dvQXdheSh3aGVyZSk6CisgICAgICAgICAgICBpZiBub3QgY2xvc2VhbGw6CisgICAgICAgICAgICAgICAgc2VsZi5jbG9zZSgpCisgICAgICAgICAgICBlbHNlOgorICAgICAgICAgICAgICAgIGZvciB3aW5kb3cgaW4gc2VsZi5wYXJlbnQuX3dpbmRvd3MudmFsdWVzKCk6CisgICAgICAgICAgICAgICAgICAgIHJ2ID0gd2luZG93LmNsb3NlKCkKKyAgICAgICAgICAgICAgICAgICAgaWYgcnYgYW5kIHJ2ID4gMDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybgorCisgICAgIyB1dGlsaXRpZXMKKyAgICBkZWYgdGVtcGNsaXByZWN0KHNlbGYsIHRlbXBjbGlwcmVjdCk6CisgICAgICAgIHRlbXBjbGlwID0gUWQuTmV3UmduKCkKKyAgICAgICAgUWQuUmVjdFJnbih0ZW1wY2xpcCwgdGVtcGNsaXByZWN0KQorICAgICAgICBzZWxmLnRlbXBjbGlwKHRlbXBjbGlwKQorICAgICAgICBRZC5EaXNwb3NlUmduKHRlbXBjbGlwKQorCisgICAgZGVmIHRlbXBjbGlwKHNlbGYsIHRlbXBjbGlwKToKKyAgICAgICAgaWYgbm90IGhhc2F0dHIoc2VsZiwgInNhdmVjbGlwIik6CisgICAgICAgICAgICBzZWxmLnNhdmVjbGlwID0gW10KKyAgICAgICAgc2F2ZWNsaXAgPSBRZC5OZXdSZ24oKQorICAgICAgICBRZC5HZXRDbGlwKHNhdmVjbGlwKQorICAgICAgICBzZWxmLnNhdmVjbGlwLmFwcGVuZChzYXZlY2xpcCkKKyAgICAgICAgUWQuU2V0Q2xpcCh0ZW1wY2xpcCkKKworICAgIGRlZiByZXN0b3JlY2xpcChzZWxmKToKKyAgICAgICAgUWQuU2V0Q2xpcChzZWxmLnNhdmVjbGlwWy0xXSkKKyAgICAgICAgUWQuRGlzcG9zZVJnbihzZWxmLnNhdmVjbGlwWy0xXSkKKyAgICAgICAgZGVsIHNlbGYuc2F2ZWNsaXBbLTFdCisKKyAgICBkZWYgZ2V0Z3Jvd3JlY3Qoc2VsZik6CisgICAgICAgIGwsIHQsIHIsIGIgPSBzZWxmLndpZC5HZXRXaW5kb3dQb3J0KCkuR2V0UG9ydEJvdW5kcygpCisgICAgICAgIHJldHVybiAociAtIDE1LCBiIC0gMTUsIHIsIGIpCisKKyAgICBkZWYgaGFzX2tleShzZWxmLCBrZXkpOgorICAgICAgICByZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3QuaGFzX2tleShrZXkpCisKKyAgICBkZWYgX19nZXRhdHRyX18oc2VsZiwgYXR0cik6CisgICAgICAgIGdsb2JhbCBfc3VjY2Vzc2NvdW50LCBfZmFpbGNvdW50LCBfbWFnaWNjb3VudAorICAgICAgICBpZiBzZWxmLl93aWRnZXRzZGljdC5oYXNfa2V5KGF0dHIpOgorICAgICAgICAgICAgX3N1Y2Nlc3Njb3VudCA9IF9zdWNjZXNzY291bnQgKyAxCisgICAgICAgICAgICByZXR1cm4gc2VsZi5fd2lkZ2V0c2RpY3RbYXR0cl0KKyAgICAgICAgaWYgc2VsZi5fY3VycmVudHdpZGdldCBpcyBOb25lIG9yIChhdHRyWzo3XSA8PiAnZG9tZW51XycgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICBhdHRyWzo0XSA8PiAnY2FuXycgYW5kIGF0dHIgPD4gJ2luc2VydCcpOgorICAgICAgICAgICAgX2ZhaWxjb3VudCA9IF9mYWlsY291bnQgKyAxCisgICAgICAgICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvciwgYXR0cgorICAgICAgICAjIHNwZWNpYWwgY2FzZTogaWYgYSBkb21lbnVfeHh4LCBjYW5feHh4IG9yIGluc2VydCBtZXRob2QgaXMgYXNrZWQgZm9yLAorICAgICAgICAjIHNlZSBpZiB0aGUgYWN0aXZlIHdpZGdldCBzdXBwb3J0cyBpdAorICAgICAgICBfbWFnaWNjb3VudCA9IF9tYWdpY2NvdW50ICsgMQorICAgICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9jdXJyZW50d2lkZ2V0LCBhdHRyKQogCiBfc3VjY2Vzc2NvdW50ID0gMAogX2ZhaWxjb3VudCA9IDAKIF9tYWdpY2NvdW50ID0gMAogCiBjbGFzcyBEaWFsb2coV2luZG93KToKLQkKLQl3aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKLQkKLQkjIHRoaXMgX19pbml0X18gc2VlbXMgcmVkdW5kYW50LCBidXQgaXQncyBub3Q6IGl0IGhhcyBsZXNzIGFyZ3MKLQlkZWYgX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUgPSAiIik6Ci0JCVdpbmRvdy5fX2luaXRfXyhzZWxmLCBwb3NzaXplLCB0aXRsZSkKLQkKLQlkZWYgY2FuX2Nsb3NlKHNlbGYsICphcmdzKToKLQkJcmV0dXJuIDAKLQkKLQlkZWYgZ2V0d2luZG93Ym91bmRzKHNlbGYsIHNpemUsIG1pbnNpemUgPSBOb25lKToKLQkJc2NyZWVuYm91bmRzID0gc2wsIHN0LCBzciwgc2IgPSBRZC5HZXRRREdsb2JhbHNTY3JlZW5CaXRzKCkuYm91bmRzCi0JCXcsIGggPSBzaXplCi0JCWwgPSBzbCArIChzciAtIHNsIC0gdykgLyAyCi0JCXQgPSBzdCArIChzYiAtIHN0IC0gaCkgLyAzCi0JCXJldHVybiBsLCB0LCBsICsgdywgdCArIGgKKworICAgIHdpbmRvd2tpbmQgPSBXaW5kb3dzLm1vdmFibGVEQm94UHJvYworCisgICAgIyB0aGlzIF9faW5pdF9fIHNlZW1zIHJlZHVuZGFudCwgYnV0IGl0J3Mgbm90OiBpdCBoYXMgbGVzcyBhcmdzCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgorICAgICAgICBXaW5kb3cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCisKKyAgICBkZWYgY2FuX2Nsb3NlKHNlbGYsICphcmdzKToKKyAgICAgICAgcmV0dXJuIDAKKworICAgIGRlZiBnZXR3aW5kb3dib3VuZHMoc2VsZiwgc2l6ZSwgbWluc2l6ZSA9IE5vbmUpOgorICAgICAgICBzY3JlZW5ib3VuZHMgPSBzbCwgc3QsIHNyLCBzYiA9IFFkLkdldFFER2xvYmFsc1NjcmVlbkJpdHMoKS5ib3VuZHMKKyAgICAgICAgdywgaCA9IHNpemUKKyAgICAgICAgbCA9IHNsICsgKHNyIC0gc2wgLSB3KSAvIDIKKyAgICAgICAgdCA9IHN0ICsgKHNiIC0gc3QgLSBoKSAvIDMKKyAgICAgICAgcmV0dXJuIGwsIHQsIGwgKyB3LCB0ICsgaAogCiAKIGNsYXNzIE1vZGFsRGlhbG9nKERpYWxvZyk6Ci0JCi0JZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgotCQlEaWFsb2cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCi0JCWlmIHRpdGxlOgotCQkJc2VsZi53aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKLQkJZWxzZToKLQkJCXNlbGYud2luZG93a2luZCA9IFdpbmRvd3MuZEJveFByb2MKLQkKLQlkZWYgb3BlbihzZWxmKToKLQkJaW1wb3J0IFcKLQkJRGlhbG9nLm9wZW4oc2VsZikKLQkJc2VsZi5hcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQkJc2VsZi5kb25lID0gMAotCQlNZW51LkhpbGl0ZU1lbnUoMCkKLQkJYXBwID0gc2VsZi5wYXJlbnQKLQkJYXBwLmVuYWJsZW1lbnViYXIoMCkKLQkJdHJ5OgotCQkJc2VsZi5tYWlubG9vcCgpCi0JCWZpbmFsbHk6Ci0JCQlhcHAuZW5hYmxlbWVudWJhcigxKQotCQotCWRlZiBjbG9zZShzZWxmKToKLQkJaWYgbm90IHNlbGYud2lkOgotCQkJcmV0dXJuCSMgd2UgYXJlIGFscmVhZHkgY2xvc2VkCi0JCXNlbGYuZG9uZSA9IDEKLQkJZGVsIHNlbGYuYXBwCi0JCURpYWxvZy5jbG9zZShzZWxmKQotCQotCWRlZiBtYWlubG9vcChzZWxmKToKLQkJaWYgaGFzYXR0cihNYWNPUywgJ0VuYWJsZUFwcHN3aXRjaCcpOgotCQkJc2F2ZXlpZWxkID0gTWFjT1MuRW5hYmxlQXBwc3dpdGNoKC0xKQotCQl3aGlsZSBub3Qgc2VsZi5kb25lOgotCQkJI3NlbGYuZG8xZXZlbnQoKQotCQkJc2VsZi5kbzFldmVudCgJRXZlbnRzLmtleURvd25NYXNrICsgCi0JCQkJCQlFdmVudHMuYXV0b0tleU1hc2sgKyAKLQkJCQkJCUV2ZW50cy5hY3Rpdk1hc2sgKyAKLQkJCQkJCUV2ZW50cy51cGRhdGVNYXNrICsgCi0JCQkJCQlFdmVudHMubURvd25NYXNrICsKLQkJCQkJCUV2ZW50cy5tVXBNYXNrLCAKLQkJCQkJCTEwKQotCQlpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6Ci0JCQlNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQotCQotCWRlZiBkbzFldmVudChzZWxmLCBtYXNrID0gRXZlbnRzLmV2ZXJ5RXZlbnQsIHdhaXQgPSAwKToKLQkJb2ssIGV2ZW50ID0gc2VsZi5hcHAuZ2V0ZXZlbnQobWFzaywgd2FpdCkKLQkJaWYgRGxnLklzRGlhbG9nRXZlbnQoZXZlbnQpOgotCQkJaWYgc2VsZi5hcHAuZG9fZGlhbG9nZXZlbnQoZXZlbnQpOgotCQkJCXJldHVybgotCQlpZiBvazoKLQkJCXNlbGYuZGlzcGF0Y2goZXZlbnQpCi0JCWVsc2U6Ci0JCQlzZWxmLmFwcC5pZGxlKGV2ZW50KQotCQotCWRlZiBkb19rZXlEb3duKHNlbGYsIGV2ZW50KToKLQkJc2VsZi5kb19rZXkoZXZlbnQpCi0JCi0JZGVmIGRvX2F1dG9LZXkoc2VsZiwgZXZlbnQpOgotCQlpZiBub3QgZXZlbnRbLTFdICYgRXZlbnRzLmNtZEtleToKLQkJCXNlbGYuZG9fa2V5KGV2ZW50KQotCQotCWRlZiBkb19rZXkoc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQkjdyA9IFdpbi5Gcm9udFdpbmRvdygpCi0JCSNpZiB3IDw+IHNlbGYud2lkOgotCQkjCXJldHVybgotCQljID0gY2hyKG1lc3NhZ2UgJiBFdmVudHMuY2hhckNvZGVNYXNrKQotCQlpZiBtb2RpZmllcnMgJiBFdmVudHMuY21kS2V5OgotCQkJc2VsZi5hcHAuY2hlY2ttZW51cyhzZWxmKQotCQkJcmVzdWx0ID0gTWVudS5NZW51S2V5KG9yZChjKSkKLQkJCWlkID0gKHJlc3VsdD4+MTYpICYgMHhmZmZmCSMgSGkgd29yZAotCQkJaXRlbSA9IHJlc3VsdCAmIDB4ZmZmZgkJIyBMbyB3b3JkCi0JCQlpZiBpZDoKLQkJCQlzZWxmLmFwcC5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKLQkJCQlyZXR1cm4KLQkJc2VsZi5kb19jaGFyKGMsIGV2ZW50KQotCQotCWRlZiBkb19tb3VzZURvd24oc2VsZiwgZXZlbnQpOgotCQkod2hhdCwgbWVzc2FnZSwgd2hlbiwgd2hlcmUsIG1vZGlmaWVycykgPSBldmVudAotCQlwYXJ0Y29kZSwgd2lkID0gV2luLkZpbmRXaW5kb3cod2hlcmUpCi0JCSMKLQkJIyBGaW5kIHRoZSBjb3JyZWN0IG5hbWUuCi0JCSMKLQkJaWYgRnJhbWVXb3JrLnBhcnRuYW1lLmhhc19rZXkocGFydGNvZGUpOgotCQkJbmFtZSA9ICJkb18iICsgRnJhbWVXb3JrLnBhcnRuYW1lW3BhcnRjb2RlXQotCQllbHNlOgotCQkJbmFtZSA9ICJkb18lZCIgJSBwYXJ0Y29kZQotCQkKLQkJaWYgbmFtZSA9PSAiZG9faW5EZXNrIjoKLQkJCWlmIGhhc2F0dHIoTWFjT1MsICJIYW5kbGVFdmVudCIpOgotCQkJCU1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQotCQkJZWxzZToKLQkJCQlwcmludCAnVW5leHBlY3RlZCBpbkRlc2sgZXZlbnQ6JywgZXZlbnQKLQkJCXJldHVybgotCQlpZiB3aWQgPT0gc2VsZi53aWQ6Ci0JCQl0cnk6Ci0JCQkJaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgbmFtZSkKLQkJCWV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLQkJCQloYW5kbGVyID0gc2VsZi5hcHAuZG9fdW5rbm93bnBhcnRjb2RlCi0JCWVsc2U6Ci0JCQkjTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCi0JCQlpZiBuYW1lID09ICdkb19pbk1lbnVCYXInOgotCQkJCWhhbmRsZXIgPSBnZXRhdHRyKHNlbGYucGFyZW50LCBuYW1lKQotCQkJZWxzZToKLQkJCQlyZXR1cm4JCQotCQloYW5kbGVyKHBhcnRjb2RlLCB3aWQsIGV2ZW50KQotCQotCWRlZiBkaXNwYXRjaChzZWxmLCBldmVudCk6Ci0JCSh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50Ci0JCWlmIEZyYW1lV29yay5ldmVudG5hbWUuaGFzX2tleSh3aGF0KToKLQkJCW5hbWUgPSAiZG9fIiArIEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0KLQkJZWxzZToKLQkJCW5hbWUgPSAiZG9fJWQiICUgd2hhdAotCQl0cnk6Ci0JCQloYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQotCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQl0cnk6Ci0JCQkJaGFuZGxlciA9IGdldGF0dHIoc2VsZi5hcHAsIG5hbWUpCi0JCQlleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0JCQkJaGFuZGxlciA9IHNlbGYuYXBwLmRvX3Vua25vd25ldmVudAotCQloYW5kbGVyKGV2ZW50KQotCQorCisgICAgZGVmIF9faW5pdF9fKHNlbGYsIHBvc3NpemUsIHRpdGxlID0gIiIpOgorICAgICAgICBEaWFsb2cuX19pbml0X18oc2VsZiwgcG9zc2l6ZSwgdGl0bGUpCisgICAgICAgIGlmIHRpdGxlOgorICAgICAgICAgICAgc2VsZi53aW5kb3draW5kID0gV2luZG93cy5tb3ZhYmxlREJveFByb2MKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYud2luZG93a2luZCA9IFdpbmRvd3MuZEJveFByb2MKKworICAgIGRlZiBvcGVuKHNlbGYpOgorICAgICAgICBpbXBvcnQgVworICAgICAgICBEaWFsb2cub3BlbihzZWxmKQorICAgICAgICBzZWxmLmFwcCA9IFcuZ2V0YXBwbGljYXRpb24oKQorICAgICAgICBzZWxmLmRvbmUgPSAwCisgICAgICAgIE1lbnUuSGlsaXRlTWVudSgwKQorICAgICAgICBhcHAgPSBzZWxmLnBhcmVudAorICAgICAgICBhcHAuZW5hYmxlbWVudWJhcigwKQorICAgICAgICB0cnk6CisgICAgICAgICAgICBzZWxmLm1haW5sb29wKCkKKyAgICAgICAgZmluYWxseToKKyAgICAgICAgICAgIGFwcC5lbmFibGVtZW51YmFyKDEpCisKKyAgICBkZWYgY2xvc2Uoc2VsZik6CisgICAgICAgIGlmIG5vdCBzZWxmLndpZDoKKyAgICAgICAgICAgIHJldHVybiAgIyB3ZSBhcmUgYWxyZWFkeSBjbG9zZWQKKyAgICAgICAgc2VsZi5kb25lID0gMQorICAgICAgICBkZWwgc2VsZi5hcHAKKyAgICAgICAgRGlhbG9nLmNsb3NlKHNlbGYpCisKKyAgICBkZWYgbWFpbmxvb3Aoc2VsZik6CisgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICdFbmFibGVBcHBzd2l0Y2gnKToKKyAgICAgICAgICAgIHNhdmV5aWVsZCA9IE1hY09TLkVuYWJsZUFwcHN3aXRjaCgtMSkKKyAgICAgICAgd2hpbGUgbm90IHNlbGYuZG9uZToKKyAgICAgICAgICAgICNzZWxmLmRvMWV2ZW50KCkKKyAgICAgICAgICAgIHNlbGYuZG8xZXZlbnQoICBFdmVudHMua2V5RG93bk1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLmF1dG9LZXlNYXNrICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50cy5hY3Rpdk1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLnVwZGF0ZU1hc2sgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXZlbnRzLm1Eb3duTWFzayArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudHMubVVwTWFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwKQorICAgICAgICBpZiBoYXNhdHRyKE1hY09TLCAnRW5hYmxlQXBwc3dpdGNoJyk6CisgICAgICAgICAgICBNYWNPUy5FbmFibGVBcHBzd2l0Y2goc2F2ZXlpZWxkKQorCisgICAgZGVmIGRvMWV2ZW50KHNlbGYsIG1hc2sgPSBFdmVudHMuZXZlcnlFdmVudCwgd2FpdCA9IDApOgorICAgICAgICBvaywgZXZlbnQgPSBzZWxmLmFwcC5nZXRldmVudChtYXNrLCB3YWl0KQorICAgICAgICBpZiBEbGcuSXNEaWFsb2dFdmVudChldmVudCk6CisgICAgICAgICAgICBpZiBzZWxmLmFwcC5kb19kaWFsb2dldmVudChldmVudCk6CisgICAgICAgICAgICAgICAgcmV0dXJuCisgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgc2VsZi5kaXNwYXRjaChldmVudCkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHNlbGYuYXBwLmlkbGUoZXZlbnQpCisKKyAgICBkZWYgZG9fa2V5RG93bihzZWxmLCBldmVudCk6CisgICAgICAgIHNlbGYuZG9fa2V5KGV2ZW50KQorCisgICAgZGVmIGRvX2F1dG9LZXkoc2VsZiwgZXZlbnQpOgorICAgICAgICBpZiBub3QgZXZlbnRbLTFdICYgRXZlbnRzLmNtZEtleToKKyAgICAgICAgICAgIHNlbGYuZG9fa2V5KGV2ZW50KQorCisgICAgZGVmIGRvX2tleShzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgICN3ID0gV2luLkZyb250V2luZG93KCkKKyAgICAgICAgI2lmIHcgPD4gc2VsZi53aWQ6CisgICAgICAgICMgICAgICAgcmV0dXJuCisgICAgICAgIGMgPSBjaHIobWVzc2FnZSAmIEV2ZW50cy5jaGFyQ29kZU1hc2spCisgICAgICAgIGlmIG1vZGlmaWVycyAmIEV2ZW50cy5jbWRLZXk6CisgICAgICAgICAgICBzZWxmLmFwcC5jaGVja21lbnVzKHNlbGYpCisgICAgICAgICAgICByZXN1bHQgPSBNZW51Lk1lbnVLZXkob3JkKGMpKQorICAgICAgICAgICAgaWQgPSAocmVzdWx0Pj4xNikgJiAweGZmZmYgICAgICAjIEhpIHdvcmQKKyAgICAgICAgICAgIGl0ZW0gPSByZXN1bHQgJiAweGZmZmYgICAgICAgICAgIyBMbyB3b3JkCisgICAgICAgICAgICBpZiBpZDoKKyAgICAgICAgICAgICAgICBzZWxmLmFwcC5kb19yYXdtZW51KGlkLCBpdGVtLCBOb25lLCBldmVudCkKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgc2VsZi5kb19jaGFyKGMsIGV2ZW50KQorCisgICAgZGVmIGRvX21vdXNlRG93bihzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIHBhcnRjb2RlLCB3aWQgPSBXaW4uRmluZFdpbmRvdyh3aGVyZSkKKyAgICAgICAgIworICAgICAgICAjIEZpbmQgdGhlIGNvcnJlY3QgbmFtZS4KKyAgICAgICAgIworICAgICAgICBpZiBGcmFtZVdvcmsucGFydG5hbWUuaGFzX2tleShwYXJ0Y29kZSk6CisgICAgICAgICAgICBuYW1lID0gImRvXyIgKyBGcmFtZVdvcmsucGFydG5hbWVbcGFydGNvZGVdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBuYW1lID0gImRvXyVkIiAlIHBhcnRjb2RlCisKKyAgICAgICAgaWYgbmFtZSA9PSAiZG9faW5EZXNrIjoKKyAgICAgICAgICAgIGlmIGhhc2F0dHIoTWFjT1MsICJIYW5kbGVFdmVudCIpOgorICAgICAgICAgICAgICAgIE1hY09TLkhhbmRsZUV2ZW50KGV2ZW50KQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBwcmludCAnVW5leHBlY3RlZCBpbkRlc2sgZXZlbnQ6JywgZXZlbnQKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICBpZiB3aWQgPT0gc2VsZi53aWQ6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZiwgbmFtZSkKKyAgICAgICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKKyAgICAgICAgICAgICAgICBoYW5kbGVyID0gc2VsZi5hcHAuZG9fdW5rbm93bnBhcnRjb2RlCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICAjTWFjT1MuSGFuZGxlRXZlbnQoZXZlbnQpCisgICAgICAgICAgICBpZiBuYW1lID09ICdkb19pbk1lbnVCYXInOgorICAgICAgICAgICAgICAgIGhhbmRsZXIgPSBnZXRhdHRyKHNlbGYucGFyZW50LCBuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgaGFuZGxlcihwYXJ0Y29kZSwgd2lkLCBldmVudCkKKworICAgIGRlZiBkaXNwYXRjaChzZWxmLCBldmVudCk6CisgICAgICAgICh3aGF0LCBtZXNzYWdlLCB3aGVuLCB3aGVyZSwgbW9kaWZpZXJzKSA9IGV2ZW50CisgICAgICAgIGlmIEZyYW1lV29yay5ldmVudG5hbWUuaGFzX2tleSh3aGF0KToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fIiArIEZyYW1lV29yay5ldmVudG5hbWVbd2hhdF0KKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG5hbWUgPSAiZG9fJWQiICUgd2hhdAorICAgICAgICB0cnk6CisgICAgICAgICAgICBoYW5kbGVyID0gZ2V0YXR0cihzZWxmLCBuYW1lKQorICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IGdldGF0dHIoc2VsZi5hcHAsIG5hbWUpCisgICAgICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6CisgICAgICAgICAgICAgICAgaGFuZGxlciA9IHNlbGYuYXBwLmRvX3Vua25vd25ldmVudAorICAgICAgICBoYW5kbGVyKGV2ZW50KQorCiAKIGRlZiBGcm9udFdpbmRvd0luc2VydChzdHVmZik6Ci0JaWYgbm90IHN0dWZmOgotCQlyZXR1cm4KLQlpZiB0eXBlKHN0dWZmKSA8PiBTdHJpbmdUeXBlOgotCQlyYWlzZSBUeXBlRXJyb3IsICdzdHJpbmcgZXhwZWN0ZWQnCi0JaW1wb3J0IFcKLQlhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKLQl3aWQgPSBNeUZyb250V2luZG93KCkKLQlpZiB3aWQgYW5kIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6Ci0JCXdpbmRvdyA9IGFwcC5fd2luZG93c1t3aWRdCi0JCWlmIGhhc2F0dHIod2luZG93LCAiaW5zZXJ0Iik6Ci0JCQl0cnk6Ci0JCQkJd2luZG93Lmluc2VydChzdHVmZikKLQkJCQlyZXR1cm4KLQkJCWV4Y2VwdDoKLQkJCQlwYXNzCi0JaW1wb3J0IEVhc3lEaWFsb2dzCi0JaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCi0JCQkiQ2FuJ3QgZmluZCB3aW5kb3cgb3Igd2lkZ2V0IHRvIGluc2VydCB0ZXh0IGludG87IGNvcHkgdG8gY2xpcGJvYXJkIGluc3RlYWQ/IiwgCi0JCQkxKSA9PSAxOgotCQlmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKLQkJaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6Ci0JCQlTY3JhcC5aZXJvU2NyYXAoKQotCQkJU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCBzdHVmZikKLQkJZWxzZToKLQkJCVNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKLQkJCXNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKLQkJCXNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgc3R1ZmYpCisgICAgaWYgbm90IHN0dWZmOgorICAgICAgICByZXR1cm4KKyAgICBpZiB0eXBlKHN0dWZmKSA8PiBTdHJpbmdUeXBlOgorICAgICAgICByYWlzZSBUeXBlRXJyb3IsICdzdHJpbmcgZXhwZWN0ZWQnCisgICAgaW1wb3J0IFcKKyAgICBhcHAgPSBXLmdldGFwcGxpY2F0aW9uKCkKKyAgICB3aWQgPSBNeUZyb250V2luZG93KCkKKyAgICBpZiB3aWQgYW5kIGFwcC5fd2luZG93cy5oYXNfa2V5KHdpZCk6CisgICAgICAgIHdpbmRvdyA9IGFwcC5fd2luZG93c1t3aWRdCisgICAgICAgIGlmIGhhc2F0dHIod2luZG93LCAiaW5zZXJ0Iik6CisgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgd2luZG93Lmluc2VydChzdHVmZikKKyAgICAgICAgICAgICAgICByZXR1cm4KKyAgICAgICAgICAgIGV4Y2VwdDoKKyAgICAgICAgICAgICAgICBwYXNzCisgICAgaW1wb3J0IEVhc3lEaWFsb2dzCisgICAgaWYgRWFzeURpYWxvZ3MuQXNrWWVzTm9DYW5jZWwoCisgICAgICAgICAgICAgICAgICAgICJDYW4ndCBmaW5kIHdpbmRvdyBvciB3aWRnZXQgdG8gaW5zZXJ0IHRleHQgaW50bzsgY29weSB0byBjbGlwYm9hcmQgaW5zdGVhZD8iLAorICAgICAgICAgICAgICAgICAgICAxKSA9PSAxOgorICAgICAgICBmcm9tIENhcmJvbiBpbXBvcnQgU2NyYXAKKyAgICAgICAgaWYgaGFzYXR0cihTY3JhcCwgJ1B1dFNjcmFwJyk6CisgICAgICAgICAgICBTY3JhcC5aZXJvU2NyYXAoKQorICAgICAgICAgICAgU2NyYXAuUHV0U2NyYXAoJ1RFWFQnLCBzdHVmZikKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIFNjcmFwLkNsZWFyQ3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgIHNjID0gU2NyYXAuR2V0Q3VycmVudFNjcmFwKCkKKyAgICAgICAgICAgIHNjLlB1dFNjcmFwRmxhdm9yKCdURVhUJywgMCwgc3R1ZmYpCiAKIAotIyBub3QgcXVpdGUgYmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb24gaW4gRnJhbWVXb3JrCQorIyBub3QgcXVpdGUgYmFzZWQgb24gdGhlIHNhbWUgZnVuY3Rpb24gaW4gRnJhbWVXb3JrCiBfd2luZG93Y291bnRlciA9IDAKIAogZGVmIGdldG5leHR3aW5kb3dwb3MoKToKLQlnbG9iYWwgX3dpbmRvd2NvdW50ZXIKLQlyb3dzID0gOAotCWwgPSA0ICogKHJvd3MgKyAxIC0gKF93aW5kb3djb3VudGVyICUgcm93cykgKyBfd2luZG93Y291bnRlciAvIHJvd3MpCi0JdCA9IDQ0ICsgMjAgKiAoX3dpbmRvd2NvdW50ZXIgJSByb3dzKQotCV93aW5kb3djb3VudGVyID0gX3dpbmRvd2NvdW50ZXIgKyAxCi0JcmV0dXJuIGwsIHQKKyAgICBnbG9iYWwgX3dpbmRvd2NvdW50ZXIKKyAgICByb3dzID0gOAorICAgIGwgPSA0ICogKHJvd3MgKyAxIC0gKF93aW5kb3djb3VudGVyICUgcm93cykgKyBfd2luZG93Y291bnRlciAvIHJvd3MpCisgICAgdCA9IDQ0ICsgMjAgKiAoX3dpbmRvd2NvdW50ZXIgJSByb3dzKQorICAgIF93aW5kb3djb3VudGVyID0gX3dpbmRvd2NvdW50ZXIgKyAxCisgICAgcmV0dXJuIGwsIHQKIAogZGVmIHdpbmRvd2JvdW5kcyhwcmVmZXJyZWRzaXplLCBtaW5zaXplPU5vbmUpOgotCSJSZXR1cm4gc2Vuc2libGUgd2luZG93IGJvdW5kcyIKLQkKLQlnbG9iYWwgX3dpbmRvd2NvdW50ZXIKLQlpZiBsZW4ocHJlZmVycmVkc2l6ZSkgPT0gNDoKLQkJYm91bmRzID0gbCwgdCwgciwgYiA9IHByZWZlcnJlZHNpemUKLQkJZGVza3RvcFJnbiA9IFdpbi5HZXRHcmF5UmduKCkKLQkJdGVtcFJnbiA9IFFkLk5ld1JnbigpCi0JCVFkLlJlY3RSZ24odGVtcFJnbiwgYm91bmRzKQotCQl1bmlvbiA9IFFkLlVuaW9uUmduKHRlbXBSZ24sIGRlc2t0b3BSZ24sIHRlbXBSZ24pCi0JCWVxdWFsID0gUWQuRXF1YWxSZ24odGVtcFJnbiwgZGVza3RvcFJnbikKLQkJUWQuRGlzcG9zZVJnbih0ZW1wUmduKQotCQlpZiBlcXVhbDoKLQkJCXJldHVybiBib3VuZHMKLQkJZWxzZToKLQkJCXByZWZlcnJlZHNpemUgPSByIC0gbCwgYiAtIHQKLQlpZiBub3QgbWluc2l6ZToKLQkJbWluc2l6ZSA9IHByZWZlcnJlZHNpemUKLQltaW53aWR0aCwgbWluaGVpZ2h0ID0gbWluc2l6ZQotCXdpZHRoLCBoZWlnaHQgPSBwcmVmZXJyZWRzaXplCi0JCi0Jc2wsIHN0LCBzciwgc2IgPSBzY3JlZW5ib3VuZHMgPSBRZC5JbnNldFJlY3QoUWQuR2V0UURHbG9iYWxzU2NyZWVuQml0cygpLmJvdW5kcywgNCwgNCkKLQlsLCB0ID0gZ2V0bmV4dHdpbmRvd3BvcygpCi0JaWYgKGwgKyB3aWR0aCkgPiBzcjoKLQkJX3dpbmRvd2NvdW50ZXIgPSAwCi0JCWwsIHQgPSBnZXRuZXh0d2luZG93cG9zKCkKLQlyID0gbCArIHdpZHRoCi0JYiA9IHQgKyBoZWlnaHQKLQlpZiAodCArIGhlaWdodCkgPiBzYjoKLQkJYiA9IHNiCi0JCWlmIChiIC0gdCkgPCBtaW5oZWlnaHQ6Ci0JCQliID0gdCArIG1pbmhlaWdodAotCXJldHVybiBsLCB0LCByLCBiCisgICAgIlJldHVybiBzZW5zaWJsZSB3aW5kb3cgYm91bmRzIgorCisgICAgZ2xvYmFsIF93aW5kb3djb3VudGVyCisgICAgaWYgbGVuKHByZWZlcnJlZHNpemUpID09IDQ6CisgICAgICAgIGJvdW5kcyA9IGwsIHQsIHIsIGIgPSBwcmVmZXJyZWRzaXplCisgICAgICAgIGRlc2t0b3BSZ24gPSBXaW4uR2V0R3JheVJnbigpCisgICAgICAgIHRlbXBSZ24gPSBRZC5OZXdSZ24oKQorICAgICAgICBRZC5SZWN0UmduKHRlbXBSZ24sIGJvdW5kcykKKyAgICAgICAgdW5pb24gPSBRZC5VbmlvblJnbih0ZW1wUmduLCBkZXNrdG9wUmduLCB0ZW1wUmduKQorICAgICAgICBlcXVhbCA9IFFkLkVxdWFsUmduKHRlbXBSZ24sIGRlc2t0b3BSZ24pCisgICAgICAgIFFkLkRpc3Bvc2VSZ24odGVtcFJnbikKKyAgICAgICAgaWYgZXF1YWw6CisgICAgICAgICAgICByZXR1cm4gYm91bmRzCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmVmZXJyZWRzaXplID0gciAtIGwsIGIgLSB0CisgICAgaWYgbm90IG1pbnNpemU6CisgICAgICAgIG1pbnNpemUgPSBwcmVmZXJyZWRzaXplCisgICAgbWlud2lkdGgsIG1pbmhlaWdodCA9IG1pbnNpemUKKyAgICB3aWR0aCwgaGVpZ2h0ID0gcHJlZmVycmVkc2l6ZQorCisgICAgc2wsIHN0LCBzciwgc2IgPSBzY3JlZW5ib3VuZHMgPSBRZC5JbnNldFJlY3QoUWQuR2V0UURHbG9iYWxzU2NyZWVuQml0cygpLmJvdW5kcywgNCwgNCkKKyAgICBsLCB0ID0gZ2V0bmV4dHdpbmRvd3BvcygpCisgICAgaWYgKGwgKyB3aWR0aCkgPiBzcjoKKyAgICAgICAgX3dpbmRvd2NvdW50ZXIgPSAwCisgICAgICAgIGwsIHQgPSBnZXRuZXh0d2luZG93cG9zKCkKKyAgICByID0gbCArIHdpZHRoCisgICAgYiA9IHQgKyBoZWlnaHQKKyAgICBpZiAodCArIGhlaWdodCkgPiBzYjoKKyAgICAgICAgYiA9IHNiCisgICAgICAgIGlmIChiIC0gdCkgPCBtaW5oZWlnaHQ6CisgICAgICAgICAgICBiID0gdCArIG1pbmhlaWdodAorICAgIHJldHVybiBsLCB0LCByLCBiCiAKIHNjcmF0Y2hSZWdpb24gPSBRZC5OZXdSZ24oKQogCiAjIHV0aWwgLS0gbW92ZSBzb21ld2hlcmUgY29udmVuaWVudD8/PwogZGVmIEdldFJnbkJvdW5kcyh0aGVfUmduKToKLQkodCwgbCwgYiwgcikgPSBzdHJ1Y3QudW5wYWNrKCJoaGhoIiwgdGhlX1Jnbi5kYXRhWzI6MTBdKQotCXJldHVybiAobCwgdCwgciwgYikKKyAgICAodCwgbCwgYiwgcikgPSBzdHJ1Y3QudW5wYWNrKCJoaGhoIiwgdGhlX1Jnbi5kYXRhWzI6MTBdKQorICAgIHJldHVybiAobCwgdCwgciwgYikKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvZGlyZWN0aXZlcy5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvZGlyZWN0aXZlcy5weQppbmRleCAzZWY5NjYxLi43ZjYxNDJlIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvbWFjZnJlZXplL2RpcmVjdGl2ZXMucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9kaXJlY3RpdmVzLnB5CkBAIC0xNywyNyArMTcsMjYgQEAKIFJFUFJPRz1yZS5jb21waWxlKERJUkVDVElWRV9SRSkKIAogZGVmIGZpbmRmcmVlemVkaXJlY3RpdmVzKHByb2dyYW0pOgotCWV4dHJhX21vZHVsZXMgPSBbXQotCWV4Y2x1ZGVfbW9kdWxlcyA9IFtdCi0Jb3B0aW9uYWxfbW9kdWxlcyA9IFtdCi0JZXh0cmFfcGF0aCA9IFtdCi0JcHJvZ2RpciwgZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KHByb2dyYW0pCi0JZnAgPSBvcGVuKHByb2dyYW0pCi0JZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6Ci0JCW1hdGNoID0gUkVQUk9HLm1hdGNoKGxpbmUpCi0JCWlmIG1hdGNoOgotCQkJZGlyZWN0aXZlID0gbWF0Y2guZ3JvdXAoMSkKLQkJCWFyZ3VtZW50ID0gbWF0Y2guZ3JvdXAoMikKLQkJCWlmIGRpcmVjdGl2ZSA9PSAnaW5jbHVkZSc6Ci0JCQkJZXh0cmFfbW9kdWxlcy5hcHBlbmQoYXJndW1lbnQpCi0JCQllbGlmIGRpcmVjdGl2ZSA9PSAnZXhjbHVkZSc6Ci0JCQkJZXhjbHVkZV9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKLQkJCWVsaWYgZGlyZWN0aXZlID09ICdvcHRpb25hbCc6Ci0JCQkJb3B0aW9uYWxfbW9kdWxlcy5hcHBlbmQoYXJndW1lbnQpCi0JCQllbGlmIGRpcmVjdGl2ZSA9PSAncGF0aCc6Ci0JCQkJYXJndW1lbnQgPSBvcy5wYXRoLmpvaW4ocHJvZ2RpciwgYXJndW1lbnQpCi0JCQkJZXh0cmFfcGF0aC5hcHBlbmQoYXJndW1lbnQpCi0JCQllbHNlOgotCQkJCXByaW50ICcqKiBVbmtub3duIGRpcmVjdGl2ZScsIGxpbmUKLQlyZXR1cm4gZXh0cmFfbW9kdWxlcywgZXhjbHVkZV9tb2R1bGVzLCBvcHRpb25hbF9tb2R1bGVzLCBleHRyYV9wYXRoCi0JCisgICAgZXh0cmFfbW9kdWxlcyA9IFtdCisgICAgZXhjbHVkZV9tb2R1bGVzID0gW10KKyAgICBvcHRpb25hbF9tb2R1bGVzID0gW10KKyAgICBleHRyYV9wYXRoID0gW10KKyAgICBwcm9nZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocHJvZ3JhbSkKKyAgICBmcCA9IG9wZW4ocHJvZ3JhbSkKKyAgICBmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKKyAgICAgICAgbWF0Y2ggPSBSRVBST0cubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbWF0Y2g6CisgICAgICAgICAgICBkaXJlY3RpdmUgPSBtYXRjaC5ncm91cCgxKQorICAgICAgICAgICAgYXJndW1lbnQgPSBtYXRjaC5ncm91cCgyKQorICAgICAgICAgICAgaWYgZGlyZWN0aXZlID09ICdpbmNsdWRlJzoKKyAgICAgICAgICAgICAgICBleHRyYV9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsaWYgZGlyZWN0aXZlID09ICdleGNsdWRlJzoKKyAgICAgICAgICAgICAgICBleGNsdWRlX21vZHVsZXMuYXBwZW5kKGFyZ3VtZW50KQorICAgICAgICAgICAgZWxpZiBkaXJlY3RpdmUgPT0gJ29wdGlvbmFsJzoKKyAgICAgICAgICAgICAgICBvcHRpb25hbF9tb2R1bGVzLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsaWYgZGlyZWN0aXZlID09ICdwYXRoJzoKKyAgICAgICAgICAgICAgICBhcmd1bWVudCA9IG9zLnBhdGguam9pbihwcm9nZGlyLCBhcmd1bWVudCkKKyAgICAgICAgICAgICAgICBleHRyYV9wYXRoLmFwcGVuZChhcmd1bWVudCkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJyoqIFVua25vd24gZGlyZWN0aXZlJywgbGluZQorICAgIHJldHVybiBleHRyYV9tb2R1bGVzLCBleGNsdWRlX21vZHVsZXMsIG9wdGlvbmFsX21vZHVsZXMsIGV4dHJhX3BhdGgKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKaW5kZXggOGEyY2E3Ni4uYjJjZjcyZSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNmcmVlemUucHkKQEAgLTI2LDUwICsyNiw1MCBAQAogIwogCiBkZWYgbWFpbigpOgotCWlmIGxlbihzeXMuYXJndikgPCAyOgotCQlnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnID0gbWFjZnJlZXplZ3VpLmRpYWxvZygpCi0JZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6Ci0JCWdlbnR5cGUsIHByb2dyYW0sIG91dHB1dCwgZGVidWcgPSBtYWNmcmVlemVndWkuZGlhbG9nKHN5cy5hcmd2WzFdKQotCWVsc2U6Ci0JCUVhc3lEaWFsb2cuTWVzc2FnZSgKLQkJICAiUGxlYXNlIHBhc3MgYSBzaW5nbGUgc2NyaXB0LiBBZGRpdGlvbmFsIG1vZHVsZXMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGRpcmVjdGl2ZXMiKQotCQlzeXMuZXhpdCgwKQotCW11c3R3YWl0ID0gcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnPWRlYnVnKQotCWlmIG11c3R3YWl0OgotCQlzeXMuZXhpdCgxKQorICAgIGlmIGxlbihzeXMuYXJndikgPCAyOgorICAgICAgICBnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnID0gbWFjZnJlZXplZ3VpLmRpYWxvZygpCisgICAgZWxpZiBsZW4oc3lzLmFyZ3YpID09IDI6CisgICAgICAgIGdlbnR5cGUsIHByb2dyYW0sIG91dHB1dCwgZGVidWcgPSBtYWNmcmVlemVndWkuZGlhbG9nKHN5cy5hcmd2WzFdKQorICAgIGVsc2U6CisgICAgICAgIEVhc3lEaWFsb2cuTWVzc2FnZSgKKyAgICAgICAgICAiUGxlYXNlIHBhc3MgYSBzaW5nbGUgc2NyaXB0LiBBZGRpdGlvbmFsIG1vZHVsZXMgY2FuIGJlIHNwZWNpZmllZCB3aXRoIGRpcmVjdGl2ZXMiKQorICAgICAgICBzeXMuZXhpdCgwKQorICAgIG11c3R3YWl0ID0gcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIGRlYnVnPWRlYnVnKQorICAgIGlmIG11c3R3YWl0OgorICAgICAgICBzeXMuZXhpdCgxKQogCiBkZWYgcHJvY2VzcyhnZW50eXBlLCBwcm9ncmFtLCBvdXRwdXQsIG1vZHVsZXM9Tm9uZSwgbW9kdWxlX2ZpbGVzPU5vbmUsIGRlYnVnPTAsIHdpdGhfaWZkZWY9MCk6Ci0JaWYgbW9kdWxlcyBpcyBOb25lOgotCQltb2R1bGVzID0gW10KLQlpZiBtb2R1bGVfZmlsZXMgaXMgTm9uZToKLQkJbW9kdWxlX2ZpbGVzID0gW10KLQltb2R1bGVfZGljdCwgbWlzc2luZyA9IG1hY21vZHVsZWZpbmRlci5wcm9jZXNzKHByb2dyYW0sIG1vZHVsZXMsIG1vZHVsZV9maWxlcywgZGVidWcpCi0JaWYgbWlzc2luZzoKLQkJbWlzc2luZy5zb3J0KCkKLQkJcHJpbnQgJyoqIE1pc3NpbmcgbW9kdWxlczonLCBzdHJpbmcuam9pbihtaXNzaW5nLCAnICcpCi0JCXN5cy5leGl0KDEpCi0JIwotCSMgQW5kIGdlbmVyYXRlCi0JIwotCWlmIGdlbnR5cGUgPT0gJ2luZm8nOgotCQlpbXBvcnQgbWFjZ2VuX2luZm8KLQkJbWFjZ2VuX2luZm8uZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCkKLQkJcmV0dXJuIDEJCSMgU28gdGhlIHVzZXIgY2FuIGluc3BlY3QgaXQKLQllbGlmIGdlbnR5cGUgPT0gJ3NvdXJjZSc6Ci0JCWltcG9ydCBtYWNnZW5fc3JjCi0JCXdhcm5pbmdzID0gbWFjZ2VuX3NyYy5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1Zywgd2l0aF9pZmRlZikKLQkJcmV0dXJuIHdhcm5pbmdzCi0JZWxpZiBnZW50eXBlID09ICdyZXNvdXJjZSc6Ci0JCWltcG9ydCBtYWNnZW5fcnNyYwotCQltYWNnZW5fcnNyYy5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1ZykKLQkJd2FybmluZ3MgPSBtYWNnZW5fcnNyYy53YXJuaW5ncyhtb2R1bGVfZGljdCkKLQkJcmV0dXJuIHdhcm5pbmdzCi0JZWxpZiBnZW50eXBlID09ICdhcHBsZXQnOgotCQlpbXBvcnQgbWFjZ2VuX2JpbgotCQlhcmNoaXRlY3R1cmUgPSAnZmF0JyAjIHVzZXIgc2hvdWxkIGNob29zZQotCQltYWNnZW5fYmluLmdlbmVyYXRlKHByb2dyYW0sIG91dHB1dCwgbW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSwgZGVidWcpCi0JZWxzZToKLQkJcmFpc2UgJ3Vua25vd24gZ2VudHlwZScsIGdlbnR5cGUKKyAgICBpZiBtb2R1bGVzIGlzIE5vbmU6CisgICAgICAgIG1vZHVsZXMgPSBbXQorICAgIGlmIG1vZHVsZV9maWxlcyBpcyBOb25lOgorICAgICAgICBtb2R1bGVfZmlsZXMgPSBbXQorICAgIG1vZHVsZV9kaWN0LCBtaXNzaW5nID0gbWFjbW9kdWxlZmluZGVyLnByb2Nlc3MocHJvZ3JhbSwgbW9kdWxlcywgbW9kdWxlX2ZpbGVzLCBkZWJ1ZykKKyAgICBpZiBtaXNzaW5nOgorICAgICAgICBtaXNzaW5nLnNvcnQoKQorICAgICAgICBwcmludCAnKiogTWlzc2luZyBtb2R1bGVzOicsIHN0cmluZy5qb2luKG1pc3NpbmcsICcgJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICAjCisgICAgIyBBbmQgZ2VuZXJhdGUKKyAgICAjCisgICAgaWYgZ2VudHlwZSA9PSAnaW5mbyc6CisgICAgICAgIGltcG9ydCBtYWNnZW5faW5mbworICAgICAgICBtYWNnZW5faW5mby5nZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0KQorICAgICAgICByZXR1cm4gMSAgICAgICAgICAgICAgICAjIFNvIHRoZSB1c2VyIGNhbiBpbnNwZWN0IGl0CisgICAgZWxpZiBnZW50eXBlID09ICdzb3VyY2UnOgorICAgICAgICBpbXBvcnQgbWFjZ2VuX3NyYworICAgICAgICB3YXJuaW5ncyA9IG1hY2dlbl9zcmMuZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCwgZGVidWcsIHdpdGhfaWZkZWYpCisgICAgICAgIHJldHVybiB3YXJuaW5ncworICAgIGVsaWYgZ2VudHlwZSA9PSAncmVzb3VyY2UnOgorICAgICAgICBpbXBvcnQgbWFjZ2VuX3JzcmMKKyAgICAgICAgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUob3V0cHV0LCBtb2R1bGVfZGljdCwgZGVidWcpCisgICAgICAgIHdhcm5pbmdzID0gbWFjZ2VuX3JzcmMud2FybmluZ3MobW9kdWxlX2RpY3QpCisgICAgICAgIHJldHVybiB3YXJuaW5ncworICAgIGVsaWYgZ2VudHlwZSA9PSAnYXBwbGV0JzoKKyAgICAgICAgaW1wb3J0IG1hY2dlbl9iaW4KKyAgICAgICAgYXJjaGl0ZWN0dXJlID0gJ2ZhdCcgIyB1c2VyIHNob3VsZCBjaG9vc2UKKyAgICAgICAgbWFjZ2VuX2Jpbi5nZW5lcmF0ZShwcm9ncmFtLCBvdXRwdXQsIG1vZHVsZV9kaWN0LCBhcmNoaXRlY3R1cmUsIGRlYnVnKQorICAgIGVsc2U6CisgICAgICAgIHJhaXNlICd1bmtub3duIGdlbnR5cGUnLCBnZW50eXBlCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2ZyZWV6ZWd1aS5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CmluZGV4IDVkZDM0MzUuLjQxZDBlYzggMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZnJlZXplZ3VpLnB5CkBAIC0zMCwxMjEgKzMwLDEyMSBAQAogSVRFTV9HRU5JTkZPPTIwCiAKIFJBRElPX0dST1VQSU5HPXsKLQlJVEVNX0dFTlNPVVJDRTogSVRFTV9HRU5TT1VSQ0VfSVRFTVMsCi0JSVRFTV9HRU5SRVNPVVJDRTogSVRFTV9HRU5SRVNPVVJDRV9JVEVNUywKLQlJVEVNX0dFTkFQUExFVDogSVRFTV9HRU5BUFBMRVRfSVRFTVMsCi0JSVRFTV9HRU5JTkZPOiAoKQorICAgICAgICBJVEVNX0dFTlNPVVJDRTogSVRFTV9HRU5TT1VSQ0VfSVRFTVMsCisgICAgICAgIElURU1fR0VOUkVTT1VSQ0U6IElURU1fR0VOUkVTT1VSQ0VfSVRFTVMsCisgICAgICAgIElURU1fR0VOQVBQTEVUOiBJVEVNX0dFTkFQUExFVF9JVEVNUywKKyAgICAgICAgSVRFTV9HRU5JTkZPOiAoKQogfQogCiBkZWYgZGlhbG9nKHNjcmlwdD1Ob25lKToKIAotCSMgSW52ZW50IHRoZSB2YXJpb3VzIG5hbWVzCi0JaWYgbm90IHNjcmlwdDoKLQkJZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlNjcmlwdD8iLCAiVEVYVCIpCi0JCWlmIG5vdCBvazoKLQkJCXN5cy5leGl0KDApCi0JCXNjcmlwdCA9IGZzcy5hc19wYXRobmFtZSgpCi0JYmFzZW5hbWUsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQoc2NyaXB0KQotCWlmIGV4dDoKLQkJYXBwbGV0bmFtZSA9IGJhc2VuYW1lCi0JCXJzcmNuYW1lID0gYmFzZW5hbWUgKyAnbW9kdWxlcy5yc3JjJwotCWVsc2U6Ci0JCWFwcGxldG5hbWUgPSBzY3JpcHQgKyAnLmFwcGxldCcKLQkJcnNyY25hbWUgPSBzY3JpcHQgKyAnbW9kdWxlcy5yc3JjJwotCWRpcm5hbWUsIGJhc2ViYXNlID0gb3MucGF0aC5zcGxpdChiYXNlbmFtZSkKLQlkaXJuYW1lID0gb3MucGF0aC5qb2luKGRpcm5hbWUsICdidWlsZC4nK2Jhc2ViYXNlKQotCQotCSMgR2V0IHRoZSBkaWFsb2csIHBvc3NpYmx5IG9wZW5pbmcgdGhlIHJlc291cmNlIGZpbGUgKGlmIG5lZWRlZCkKLQltYWNyZXNvdXJjZS5uZWVkKCdETE9HJywgSURfTUFJTkRJQUxPRywgJ21hY2ZyZWV6ZS5yc3JjJykKLQlkID0gRGxnLkdldE5ld0RpYWxvZyhJRF9NQUlORElBTE9HLCAtMSkKLQlpZiBkID09IE5vbmU6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoIkRpYWxvZyByZXNvdXJjZSBub3QgZm91bmQgb3IgZmF1bHR5IikKLQkJc3lzLmV4aXQoMSkKLQkKLQkjIEZpbGwgdGhlIGRpYWxvZwotCWQuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oSVRFTV9PSykKLQlkLlNldERpYWxvZ0NhbmNlbEl0ZW0oSVRFTV9DQU5DRUwpCi0JCi0JX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TQ1JJUFROQU1FLCBzY3JpcHQpCi0JX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TT1VSQ0VESVJOQU1FLCBkaXJuYW1lKQotCV9kaWFsb2dzZXRmaWxlKGQsIElURU1fUkVTT1VSQ0VOQU1FLCByc3JjbmFtZSkKLQlfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX0FQUExFVE5BTUUsIGFwcGxldG5hbWUpCisgICAgIyBJbnZlbnQgdGhlIHZhcmlvdXMgbmFtZXMKKyAgICBpZiBub3Qgc2NyaXB0OgorICAgICAgICBmc3MsIG9rID0gbWFjZnMuUHJvbXB0R2V0RmlsZSgiU2NyaXB0PyIsICJURVhUIikKKyAgICAgICAgaWYgbm90IG9rOgorICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgc2NyaXB0ID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICBiYXNlbmFtZSwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChzY3JpcHQpCisgICAgaWYgZXh0OgorICAgICAgICBhcHBsZXRuYW1lID0gYmFzZW5hbWUKKyAgICAgICAgcnNyY25hbWUgPSBiYXNlbmFtZSArICdtb2R1bGVzLnJzcmMnCisgICAgZWxzZToKKyAgICAgICAgYXBwbGV0bmFtZSA9IHNjcmlwdCArICcuYXBwbGV0JworICAgICAgICByc3JjbmFtZSA9IHNjcmlwdCArICdtb2R1bGVzLnJzcmMnCisgICAgZGlybmFtZSwgYmFzZWJhc2UgPSBvcy5wYXRoLnNwbGl0KGJhc2VuYW1lKQorICAgIGRpcm5hbWUgPSBvcy5wYXRoLmpvaW4oZGlybmFtZSwgJ2J1aWxkLicrYmFzZWJhc2UpCiAKLQlnZW50eXBlID0gSVRFTV9HRU5TT1VSQ0UKLQlfZGlhbG9ncmFkaW9ncm91cChkLCBJVEVNX0dFTlNPVVJDRSkKKyAgICAjIEdldCB0aGUgZGlhbG9nLCBwb3NzaWJseSBvcGVuaW5nIHRoZSByZXNvdXJjZSBmaWxlIChpZiBuZWVkZWQpCisgICAgbWFjcmVzb3VyY2UubmVlZCgnRExPRycsIElEX01BSU5ESUFMT0csICdtYWNmcmVlemUucnNyYycpCisgICAgZCA9IERsZy5HZXROZXdEaWFsb2coSURfTUFJTkRJQUxPRywgLTEpCisgICAgaWYgZCA9PSBOb25lOgorICAgICAgICBFYXN5RGlhbG9ncy5NZXNzYWdlKCJEaWFsb2cgcmVzb3VyY2Ugbm90IGZvdW5kIG9yIGZhdWx0eSIpCisgICAgICAgIHN5cy5leGl0KDEpCiAKLQkjIEludGVyYWN0Ci0JZC5HZXREaWFsb2dXaW5kb3coKS5TZXRXVGl0bGUoIlN0YW5kYWxvbmUgYXBwbGljYXRpb24gY3JlYXRpb24gb3B0aW9ucyIpCi0JZC5HZXREaWFsb2dXaW5kb3coKS5TaG93V2luZG93KCkKLQlkLkRyYXdEaWFsb2coKQotCXdoaWxlIDE6Ci0JCWl0ZW0gPSBEbGcuTW9kYWxEaWFsb2coTm9uZSkKLQkJaWYgaXRlbSA9PSBJVEVNX09LOgotCQkJYnJlYWsKLQkJZWxpZiBpdGVtID09IElURU1fQ0FOQ0VMOgotCQkJc3lzLmV4aXQoMCkKLQkJZWxpZiBpdGVtIGluIFJBRElPX0dST1VQSU5HLmtleXMoKToKLQkJCWdlbnR5cGUgPSBpdGVtCi0JCQlfZGlhbG9ncmFkaW9ncm91cChkLCBpdGVtKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9TQ1JJUFRCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuUHJvbXB0R2V0RmlsZSgiU2NyaXB0PyIpCi0JCQlpZiBvazoKLQkJCQlzY3JpcHQgPSBmc3MuYXNfcGF0aG5hbWUoKQotCQkJCV9kaWFsb2dzZXRmaWxlKGQsIElURU1fU0NSSVBUTkFNRSwgc2NyaXB0KQotCQllbGlmIGl0ZW0gPT0gSVRFTV9TT1VSQ0VESVJCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJPdXRwdXQgZm9sZGVyIG5hbWUiLCBvcy5wYXRoLnNwbGl0KGRpcm5hbWUpWzFdKQotCQkJaWYgb2s6Ci0JCQkJZGlybmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9TT1VSQ0VESVJOQU1FLCBkaXJuYW1lKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9SRVNPVVJDRUJST1dTRToKLQkJCWZzcywgb2sgPSBtYWNmcy5TdGFuZGFyZFB1dEZpbGUoIlJlc291cmNlIG91dHB1dCBmaWxlIiwgb3MucGF0aC5zcGxpdChyc3JjbmFtZSlbMV0pCi0JCQlpZiBvazoKLQkJCQlyc3JjbmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9SRVNPVVJDRU5BTUUsIHJzcmNuYW1lKQotCQllbGlmIGl0ZW0gPT0gSVRFTV9BUFBMRVRCUk9XU0U6Ci0JCQlmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJBcHBsZXQgb3V0cHV0IGZpbGUiLCBvcy5wYXRoLnNwbGl0KGFwcGxldG5hbWUpWzFdKQotCQkJaWYgb2s6Ci0JCQkJYXBwbGV0bmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCQkJX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9BUFBMRVROQU1FLCBhcHBsZXRuYW1lKQotCQllbHNlOgotCQkJcGFzcwotCXRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKElURU1fREVCVUcpCi0JZGVidWcgPSBEbGcuR2V0RGlhbG9nSXRlbVRleHQoaCkKLQl0cnk6Ci0JCWRlYnVnID0gc3RyaW5nLmF0b2koc3RyaW5nLnN0cmlwKGRlYnVnKSkKLQlleGNlcHQgVmFsdWVFcnJvcjoKLQkJRWFzeURpYWxvZ3MuTWVzc2FnZSgiSWxsZWdhbCBkZWJ1ZyB2YWx1ZSAlciwgc2V0IHRvIHplcm8uIiUoZGVidWcsKSkKLQkJZGVidWcgPSAwCi0JaWYgZ2VudHlwZSA9PSBJVEVNX0dFTlNPVVJDRToKLQkJcmV0dXJuICdzb3VyY2UnLCBzY3JpcHQsIGRpcm5hbWUsIGRlYnVnCi0JZWxpZiBnZW50eXBlID09IElURU1fR0VOUkVTT1VSQ0U6Ci0JCXJldHVybiAncmVzb3VyY2UnLCBzY3JpcHQsIHJzcmNuYW1lLCBkZWJ1ZwotCWVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTkFQUExFVDoKLQkJcmV0dXJuICdhcHBsZXQnLCBzY3JpcHQsIGFwcGxldG5hbWUsIGRlYnVnCi0JZWxpZiBnZW50eXBlID09IElURU1fR0VOSU5GTzoKLQkJcmV0dXJuICdpbmZvJywgc2NyaXB0LCAnJywgZGVidWcKLQlyYWlzZSAnRXJyb3IgaW4gZ2VudHlwZScsIGdlbnR5cGUKKyAgICAjIEZpbGwgdGhlIGRpYWxvZworICAgIGQuU2V0RGlhbG9nRGVmYXVsdEl0ZW0oSVRFTV9PSykKKyAgICBkLlNldERpYWxvZ0NhbmNlbEl0ZW0oSVRFTV9DQU5DRUwpCisKKyAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NDUklQVE5BTUUsIHNjcmlwdCkKKyAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NPVVJDRURJUk5BTUUsIGRpcm5hbWUpCisgICAgX2RpYWxvZ3NldGZpbGUoZCwgSVRFTV9SRVNPVVJDRU5BTUUsIHJzcmNuYW1lKQorICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fQVBQTEVUTkFNRSwgYXBwbGV0bmFtZSkKKworICAgIGdlbnR5cGUgPSBJVEVNX0dFTlNPVVJDRQorICAgIF9kaWFsb2dyYWRpb2dyb3VwKGQsIElURU1fR0VOU09VUkNFKQorCisgICAgIyBJbnRlcmFjdAorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2V0V1RpdGxlKCJTdGFuZGFsb25lIGFwcGxpY2F0aW9uIGNyZWF0aW9uIG9wdGlvbnMiKQorICAgIGQuR2V0RGlhbG9nV2luZG93KCkuU2hvd1dpbmRvdygpCisgICAgZC5EcmF3RGlhbG9nKCkKKyAgICB3aGlsZSAxOgorICAgICAgICBpdGVtID0gRGxnLk1vZGFsRGlhbG9nKE5vbmUpCisgICAgICAgIGlmIGl0ZW0gPT0gSVRFTV9PSzoKKyAgICAgICAgICAgIGJyZWFrCisgICAgICAgIGVsaWYgaXRlbSA9PSBJVEVNX0NBTkNFTDoKKyAgICAgICAgICAgIHN5cy5leGl0KDApCisgICAgICAgIGVsaWYgaXRlbSBpbiBSQURJT19HUk9VUElORy5rZXlzKCk6CisgICAgICAgICAgICBnZW50eXBlID0gaXRlbQorICAgICAgICAgICAgX2RpYWxvZ3JhZGlvZ3JvdXAoZCwgaXRlbSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fU0NSSVBUQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlByb21wdEdldEZpbGUoIlNjcmlwdD8iKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgc2NyaXB0ID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgICAgICAgICBfZGlhbG9nc2V0ZmlsZShkLCBJVEVNX1NDUklQVE5BTUUsIHNjcmlwdCkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fU09VUkNFRElSQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlN0YW5kYXJkUHV0RmlsZSgiT3V0cHV0IGZvbGRlciBuYW1lIiwgb3MucGF0aC5zcGxpdChkaXJuYW1lKVsxXSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGRpcm5hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fU09VUkNFRElSTkFNRSwgZGlybmFtZSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fUkVTT1VSQ0VCUk9XU0U6CisgICAgICAgICAgICBmc3MsIG9rID0gbWFjZnMuU3RhbmRhcmRQdXRGaWxlKCJSZXNvdXJjZSBvdXRwdXQgZmlsZSIsIG9zLnBhdGguc3BsaXQocnNyY25hbWUpWzFdKQorICAgICAgICAgICAgaWYgb2s6CisgICAgICAgICAgICAgICAgcnNyY25hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fUkVTT1VSQ0VOQU1FLCByc3JjbmFtZSkKKyAgICAgICAgZWxpZiBpdGVtID09IElURU1fQVBQTEVUQlJPV1NFOgorICAgICAgICAgICAgZnNzLCBvayA9IG1hY2ZzLlN0YW5kYXJkUHV0RmlsZSgiQXBwbGV0IG91dHB1dCBmaWxlIiwgb3MucGF0aC5zcGxpdChhcHBsZXRuYW1lKVsxXSkKKyAgICAgICAgICAgIGlmIG9rOgorICAgICAgICAgICAgICAgIGFwcGxldG5hbWUgPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgICAgICAgICAgICAgIF9kaWFsb2dzZXRmaWxlKGQsIElURU1fQVBQTEVUTkFNRSwgYXBwbGV0bmFtZSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBhc3MKKyAgICB0cCwgaCwgcmVjdCA9IGQuR2V0RGlhbG9nSXRlbShJVEVNX0RFQlVHKQorICAgIGRlYnVnID0gRGxnLkdldERpYWxvZ0l0ZW1UZXh0KGgpCisgICAgdHJ5OgorICAgICAgICBkZWJ1ZyA9IHN0cmluZy5hdG9pKHN0cmluZy5zdHJpcChkZWJ1ZykpCisgICAgZXhjZXB0IFZhbHVlRXJyb3I6CisgICAgICAgIEVhc3lEaWFsb2dzLk1lc3NhZ2UoIklsbGVnYWwgZGVidWcgdmFsdWUgJXIsIHNldCB0byB6ZXJvLiIlKGRlYnVnLCkpCisgICAgICAgIGRlYnVnID0gMAorICAgIGlmIGdlbnR5cGUgPT0gSVRFTV9HRU5TT1VSQ0U6CisgICAgICAgIHJldHVybiAnc291cmNlJywgc2NyaXB0LCBkaXJuYW1lLCBkZWJ1ZworICAgIGVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTlJFU09VUkNFOgorICAgICAgICByZXR1cm4gJ3Jlc291cmNlJywgc2NyaXB0LCByc3JjbmFtZSwgZGVidWcKKyAgICBlbGlmIGdlbnR5cGUgPT0gSVRFTV9HRU5BUFBMRVQ6CisgICAgICAgIHJldHVybiAnYXBwbGV0Jywgc2NyaXB0LCBhcHBsZXRuYW1lLCBkZWJ1ZworICAgIGVsaWYgZ2VudHlwZSA9PSBJVEVNX0dFTklORk86CisgICAgICAgIHJldHVybiAnaW5mbycsIHNjcmlwdCwgJycsIGRlYnVnCisgICAgcmFpc2UgJ0Vycm9yIGluIGdlbnR5cGUnLCBnZW50eXBlCiAKIGRlZiBfZGlhbG9ncmFkaW9ncm91cChkLCBpdGVtKToKLQlmb3IgayBpbiBSQURJT19HUk9VUElORy5rZXlzKCk6Ci0JCXN1Yml0ZW1zID0gUkFESU9fR1JPVVBJTkdba10KLQkJdHAsIGgsIHJlY3QgPSBkLkdldERpYWxvZ0l0ZW0oaykKLQkJaWYgayA9PSBpdGVtOgotCQkJaC5hc19Db250cm9sKCkuU2V0Q29udHJvbFZhbHVlKDEpCi0JCQlmb3IgaTIgaW4gc3ViaXRlbXM6Ci0JCQkJZC5TaG93RGlhbG9nSXRlbShpMikKLQkJZWxzZToKLQkJCWguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZSgwKQotCQkJZm9yIGkyIGluIHN1Yml0ZW1zOgotCQkJCWQuSGlkZURpYWxvZ0l0ZW0oaTIpCisgICAgZm9yIGsgaW4gUkFESU9fR1JPVVBJTkcua2V5cygpOgorICAgICAgICBzdWJpdGVtcyA9IFJBRElPX0dST1VQSU5HW2tdCisgICAgICAgIHRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKGspCisgICAgICAgIGlmIGsgPT0gaXRlbToKKyAgICAgICAgICAgIGguYXNfQ29udHJvbCgpLlNldENvbnRyb2xWYWx1ZSgxKQorICAgICAgICAgICAgZm9yIGkyIGluIHN1Yml0ZW1zOgorICAgICAgICAgICAgICAgIGQuU2hvd0RpYWxvZ0l0ZW0oaTIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBoLmFzX0NvbnRyb2woKS5TZXRDb250cm9sVmFsdWUoMCkKKyAgICAgICAgICAgIGZvciBpMiBpbiBzdWJpdGVtczoKKyAgICAgICAgICAgICAgICBkLkhpZGVEaWFsb2dJdGVtKGkyKQogCiBkZWYgX2RpYWxvZ3NldGZpbGUoZCwgaXRlbSwgZmlsZSk6Ci0JaWYgbGVuKGZpbGUpID4gMzI6Ci0JCWZpbGUgPSAnXDMxMTonICsgb3MucGF0aC5zcGxpdChmaWxlKVsxXQotCXRwLCBoLCByZWN0ID0gZC5HZXREaWFsb2dJdGVtKGl0ZW0pCi0JRGxnLlNldERpYWxvZ0l0ZW1UZXh0KGgsIGZpbGUpCi0JCQkKKyAgICBpZiBsZW4oZmlsZSkgPiAzMjoKKyAgICAgICAgZmlsZSA9ICdcMzExOicgKyBvcy5wYXRoLnNwbGl0KGZpbGUpWzFdCisgICAgdHAsIGgsIHJlY3QgPSBkLkdldERpYWxvZ0l0ZW0oaXRlbSkKKyAgICBEbGcuU2V0RGlhbG9nSXRlbVRleHQoaCwgZmlsZSkKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQl0eXBlLCBzY3JpcHQsIGZpbGUsIGRlYnVnID0gZGlhbG9nKCkKLQlwcmludCB0eXBlLCBzY3JpcHQsIGZpbGUsICdkZWJ1Zz0lZCclZGVidWcKLQlzeXMuZXhpdCgxKQorICAgIHR5cGUsIHNjcmlwdCwgZmlsZSwgZGVidWcgPSBkaWFsb2coKQorICAgIHByaW50IHR5cGUsIHNjcmlwdCwgZmlsZSwgJ2RlYnVnPSVkJyVkZWJ1ZworICAgIHN5cy5leGl0KDEpCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9iaW4ucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9iaW4ucHkKaW5kZXggODczNWUxNy4uYmZjZGM4YiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fYmluLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX2Jpbi5weQpAQCAtMTQsMjA4ICsxNCwyMDggQEAKIAogCiBkZWYgZ2VuZXJhdGUoaW5wdXQsIG91dHB1dCwgbW9kdWxlX2RpY3Q9Tm9uZSwgYXJjaGl0ZWN0dXJlPSdmYXQnLCBkZWJ1Zz0wKToKLQkjIHRyeSB0byByZW1vdmUgb2xkIGZpbGUKLQl0cnk6Ci0JCW9zLnJlbW92ZShvdXRwdXQpCi0JZXhjZXB0OgotCQlwYXNzCi0JCi0JaWYgbW9kdWxlX2RpY3QgaXMgTm9uZToKLQkJaW1wb3J0IG1hY21vZHVsZWZpbmRlcgotCQlwcmludCAiU2VhcmNoaW5nIGZvciBtb2R1bGVzLi4uIgotCQltb2R1bGVfZGljdCwgbWlzc2luZyA9IG1hY21vZHVsZWZpbmRlci5wcm9jZXNzKGlucHV0LCBbXSwgW10sIDEpCi0JCWlmIG1pc3Npbmc6Ci0JCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJCW1pc3Npbmcuc29ydCgpCi0JCQlhbnN3ZXIgPSBFYXN5RGlhbG9ncy5Bc2tZZXNOb0NhbmNlbCgiU29tZSBtb2R1bGVzIGNvdWxkIG5vdCBiZSBmb3VuZDsgY29udGludWUgYW55d2F5P1xuKCVzKSIgCi0JCQkJCSUgc3RyaW5nLmpvaW4obWlzc2luZywgIiwgIikpCi0JCQlpZiBhbnN3ZXIgPD4gMToKLQkJCQlzeXMuZXhpdCgwKQotCQotCWFwcGxldHRlbXBsYXRlcGF0aCA9IGJ1aWxkdG9vbHMuZmluZHRlbXBsYXRlKCkKLQljb3JlcGF0aCA9IGZpbmRweXRob25jb3JlKCkKLQkKLQlkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzID0gZmluZGZyYWdtZW50cyhtb2R1bGVfZGljdCwgYXJjaGl0ZWN0dXJlKQotCQotCXByaW50ICdBZGRpbmcgIl9fbWFpbl9fIicKLQlidWlsZHRvb2xzLnByb2Nlc3MoYXBwbGV0dGVtcGxhdGVwYXRoLCBpbnB1dCwgb3V0cHV0LCAwKQotCQotCW91dHB1dHJlZiA9IFJlcy5GU3BPcGVuUmVzRmlsZShvdXRwdXQsIDMpCi0JdHJ5OgotCQlSZXMuVXNlUmVzRmlsZShvdXRwdXRyZWYpCi0JCQotCQlwcmludCAiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIgotCQlhZGRweXRob25tb2R1bGVzKG1vZHVsZV9kaWN0KQotCQkKLQkJcHJpbnQgIkFkZGluZyBQeXRob25Db3JlIHJlc291cmNlcyIKLQkJY29weXJlcyhjb3JlcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnLCAnUG9wdCcsICdHVVwyNjdJJ10sIDEpCi0JCQotCQlwcmludCAiQWRkaW5nIHJlc291cmNlcyBmcm9tIHNoYXJlZCBsaWJyYXJpZXMiCi0JCWZvciBwcGNwYXRoLCBjZm02OGtwYXRoIGluIGV4dHJhcmVzZmlsZXM6Ci0JCQlpZiBvcy5wYXRoLmV4aXN0cyhwcGNwYXRoKToKLQkJCQljb3B5cmVzKHBwY3BhdGgsIG91dHB1dHJlZiwgWydjZnJnJ10sIDEpCi0JCQllbGlmIG9zLnBhdGguZXhpc3RzKGNmbTY4a3BhdGgpOgotCQkJCWNvcHlyZXMoY2ZtNjhrcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnXSwgMSkKLQkJCi0JCXByaW50ICJGaXhpbmcgc3lzLnBhdGggcHJlZnMiCi0JCVJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKLQkJdHJ5OgotCQkJcmVzID0gUmVzLkdldDFSZXNvdXJjZSgnU1RSIycsIDIyOCkgIyBmcm9tIFB5dGhvbkNvcmUKLQkJZXhjZXB0IFJlcy5FcnJvcjogcGFzcwotCQllbHNlOgotCQkJcmVzLlJlbW92ZVJlc291cmNlKCkKLQkJIyBzZXR0aW5nIHByZWYgZmlsZSBuYW1lIHRvIGVtcHR5IHN0cmluZwotCQlyZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoJ1NUUiAnLCAiUHl0aG9uUHJlZmVyZW5jZUZpbGVOYW1lIikKLQkJcmVzLmRhdGEgPSBQc3RyaW5nKCIiKQotCQlyZXMuQ2hhbmdlZFJlc291cmNlKCkKLQkJc3lzcGF0aHByZWYgPSAiJChBUFBMSUNBVElPTikiCi0JCXJlcyA9IFJlcy5SZXNvdXJjZSgiXDAwMFwwMDEiICsgUHN0cmluZyhzeXNwYXRocHJlZikpCi0JCXJlcy5BZGRSZXNvdXJjZSgiU1RSIyIsIDIyOSwgInN5cy5wYXRoIHByZWZlcmVuY2UiKQotCQkKLQkJcHJpbnQgIkNyZWF0aW5nICdQWUQgJyByZXNvdXJjZXMiCi0JCWZvciBtb2RuYW1lLCAocHBjZnJhZywgY2ZtNjhrZnJhZykgaW4gZHluYW1pY21vZHVsZXMuaXRlbXMoKToKLQkJCXJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKHBwY2ZyYWcpICsgUHN0cmluZyhjZm02OGtmcmFnKSkKLQkJCWlkID0gMAotCQkJd2hpbGUgaWQgPCAxMjg6Ci0JCQkJaWQgPSBSZXMuVW5pcXVlMUlEKCdQWUQgJykKLQkJCXJlcy5BZGRSZXNvdXJjZSgnUFlEICcsIGlkLCBtb2RuYW1lKQotCWZpbmFsbHk6Ci0JCVJlcy5DbG9zZVJlc0ZpbGUob3V0cHV0cmVmKQotCXByaW50ICJNZXJnaW5nIGNvZGUgZnJhZ21lbnRzIgotCWNmbWZpbGUubWVyZ2VjZm1maWxlcyhbYXBwbGV0dGVtcGxhdGVwYXRoLCBjb3JlcGF0aF0gKyBkeW5hbWljZmlsZXMua2V5cygpLCAKLQkJCW91dHB1dCwgYXJjaGl0ZWN0dXJlKQotCQotCXByaW50ICJkb25lISIKKyAgICAjIHRyeSB0byByZW1vdmUgb2xkIGZpbGUKKyAgICB0cnk6CisgICAgICAgIG9zLnJlbW92ZShvdXRwdXQpCisgICAgZXhjZXB0OgorICAgICAgICBwYXNzCisKKyAgICBpZiBtb2R1bGVfZGljdCBpcyBOb25lOgorICAgICAgICBpbXBvcnQgbWFjbW9kdWxlZmluZGVyCisgICAgICAgIHByaW50ICJTZWFyY2hpbmcgZm9yIG1vZHVsZXMuLi4iCisgICAgICAgIG1vZHVsZV9kaWN0LCBtaXNzaW5nID0gbWFjbW9kdWxlZmluZGVyLnByb2Nlc3MoaW5wdXQsIFtdLCBbXSwgMSkKKyAgICAgICAgaWYgbWlzc2luZzoKKyAgICAgICAgICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgICAgICAgICAgbWlzc2luZy5zb3J0KCkKKyAgICAgICAgICAgIGFuc3dlciA9IEVhc3lEaWFsb2dzLkFza1llc05vQ2FuY2VsKCJTb21lIG1vZHVsZXMgY291bGQgbm90IGJlIGZvdW5kOyBjb250aW51ZSBhbnl3YXk/XG4oJXMpIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICUgc3RyaW5nLmpvaW4obWlzc2luZywgIiwgIikpCisgICAgICAgICAgICBpZiBhbnN3ZXIgPD4gMToKKyAgICAgICAgICAgICAgICBzeXMuZXhpdCgwKQorCisgICAgYXBwbGV0dGVtcGxhdGVwYXRoID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQorICAgIGNvcmVwYXRoID0gZmluZHB5dGhvbmNvcmUoKQorCisgICAgZHluYW1pY21vZHVsZXMsIGR5bmFtaWNmaWxlcywgZXh0cmFyZXNmaWxlcyA9IGZpbmRmcmFnbWVudHMobW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSkKKworICAgIHByaW50ICdBZGRpbmcgIl9fbWFpbl9fIicKKyAgICBidWlsZHRvb2xzLnByb2Nlc3MoYXBwbGV0dGVtcGxhdGVwYXRoLCBpbnB1dCwgb3V0cHV0LCAwKQorCisgICAgb3V0cHV0cmVmID0gUmVzLkZTcE9wZW5SZXNGaWxlKG91dHB1dCwgMykKKyAgICB0cnk6CisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKKworICAgICAgICBwcmludCAiQWRkaW5nIFB5dGhvbiBtb2R1bGVzIgorICAgICAgICBhZGRweXRob25tb2R1bGVzKG1vZHVsZV9kaWN0KQorCisgICAgICAgIHByaW50ICJBZGRpbmcgUHl0aG9uQ29yZSByZXNvdXJjZXMiCisgICAgICAgIGNvcHlyZXMoY29yZXBhdGgsIG91dHB1dHJlZiwgWydjZnJnJywgJ1BvcHQnLCAnR1VcMjY3SSddLCAxKQorCisgICAgICAgIHByaW50ICJBZGRpbmcgcmVzb3VyY2VzIGZyb20gc2hhcmVkIGxpYnJhcmllcyIKKyAgICAgICAgZm9yIHBwY3BhdGgsIGNmbTY4a3BhdGggaW4gZXh0cmFyZXNmaWxlczoKKyAgICAgICAgICAgIGlmIG9zLnBhdGguZXhpc3RzKHBwY3BhdGgpOgorICAgICAgICAgICAgICAgIGNvcHlyZXMocHBjcGF0aCwgb3V0cHV0cmVmLCBbJ2NmcmcnXSwgMSkKKyAgICAgICAgICAgIGVsaWYgb3MucGF0aC5leGlzdHMoY2ZtNjhrcGF0aCk6CisgICAgICAgICAgICAgICAgY29weXJlcyhjZm02OGtwYXRoLCBvdXRwdXRyZWYsIFsnY2ZyZyddLCAxKQorCisgICAgICAgIHByaW50ICJGaXhpbmcgc3lzLnBhdGggcHJlZnMiCisgICAgICAgIFJlcy5Vc2VSZXNGaWxlKG91dHB1dHJlZikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgcmVzID0gUmVzLkdldDFSZXNvdXJjZSgnU1RSIycsIDIyOCkgIyBmcm9tIFB5dGhvbkNvcmUKKyAgICAgICAgZXhjZXB0IFJlcy5FcnJvcjogcGFzcworICAgICAgICBlbHNlOgorICAgICAgICAgICAgcmVzLlJlbW92ZVJlc291cmNlKCkKKyAgICAgICAgIyBzZXR0aW5nIHByZWYgZmlsZSBuYW1lIHRvIGVtcHR5IHN0cmluZworICAgICAgICByZXMgPSBSZXMuR2V0MU5hbWVkUmVzb3VyY2UoJ1NUUiAnLCAiUHl0aG9uUHJlZmVyZW5jZUZpbGVOYW1lIikKKyAgICAgICAgcmVzLmRhdGEgPSBQc3RyaW5nKCIiKQorICAgICAgICByZXMuQ2hhbmdlZFJlc291cmNlKCkKKyAgICAgICAgc3lzcGF0aHByZWYgPSAiJChBUFBMSUNBVElPTikiCisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZSgiXDAwMFwwMDEiICsgUHN0cmluZyhzeXNwYXRocHJlZikpCisgICAgICAgIHJlcy5BZGRSZXNvdXJjZSgiU1RSIyIsIDIyOSwgInN5cy5wYXRoIHByZWZlcmVuY2UiKQorCisgICAgICAgIHByaW50ICJDcmVhdGluZyAnUFlEICcgcmVzb3VyY2VzIgorICAgICAgICBmb3IgbW9kbmFtZSwgKHBwY2ZyYWcsIGNmbTY4a2ZyYWcpIGluIGR5bmFtaWNtb2R1bGVzLml0ZW1zKCk6CisgICAgICAgICAgICByZXMgPSBSZXMuUmVzb3VyY2UoUHN0cmluZyhwcGNmcmFnKSArIFBzdHJpbmcoY2ZtNjhrZnJhZykpCisgICAgICAgICAgICBpZCA9IDAKKyAgICAgICAgICAgIHdoaWxlIGlkIDwgMTI4OgorICAgICAgICAgICAgICAgIGlkID0gUmVzLlVuaXF1ZTFJRCgnUFlEICcpCisgICAgICAgICAgICByZXMuQWRkUmVzb3VyY2UoJ1BZRCAnLCBpZCwgbW9kbmFtZSkKKyAgICBmaW5hbGx5OgorICAgICAgICBSZXMuQ2xvc2VSZXNGaWxlKG91dHB1dHJlZikKKyAgICBwcmludCAiTWVyZ2luZyBjb2RlIGZyYWdtZW50cyIKKyAgICBjZm1maWxlLm1lcmdlY2ZtZmlsZXMoW2FwcGxldHRlbXBsYXRlcGF0aCwgY29yZXBhdGhdICsgZHluYW1pY2ZpbGVzLmtleXMoKSwKKyAgICAgICAgICAgICAgICAgICAgb3V0cHV0LCBhcmNoaXRlY3R1cmUpCisKKyAgICBwcmludCAiZG9uZSEiCiAKIAogZGVmIGZpbmRmcmFnbWVudHMobW9kdWxlX2RpY3QsIGFyY2hpdGVjdHVyZSk6Ci0JZHluYW1pY21vZHVsZXMgPSB7fQotCWR5bmFtaWNmaWxlcyA9IHt9Ci0JZXh0cmFyZXNmaWxlcyA9IFtdCi0JZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgotCQlpZiBtb2R1bGUuZ2V0dHlwZSgpIDw+ICdkeW5hbWljJzoKLQkJCWNvbnRpbnVlCi0JCXBhdGggPSByZXNvbHZlYWxpYXNmaWxlKG1vZHVsZS5fX2ZpbGVfXykKLQkJZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKLSMjCQlwcGNmaWxlLCBjZm02OGtmaWxlID0gbWFrZWZpbGVuYW1lcyhmaWxlbmFtZSkKLQkJcHBjZmlsZSA9IGZpbGVuYW1lCi0JCWNmbTY4a2ZpbGUgPSAiZHVtbXkuY2ZtNjhrLnNsYiIKLQkJCi0JCSMgcHBjIHN0dWZmCi0JCXBwY3BhdGggPSBvcy5wYXRoLmpvaW4oZGlyLCBwcGNmaWxlKQotCQlpZiBhcmNoaXRlY3R1cmUgPD4gJ202OGsnOgotCQkJcHBjZnJhZywgZHluYW1pY2ZpbGVzID0gZ2V0ZnJhZ25hbWUocHBjcGF0aCwgZHluYW1pY2ZpbGVzKQotCQllbHNlOgotCQkJcHBjZnJhZyA9ICJfbm9fZnJhZ21lbnRfIgotCQkKLQkJIyA2OGsgc3R1ZmYKLQkJY2ZtNjhrcGF0aCA9IG9zLnBhdGguam9pbihkaXIsIGNmbTY4a2ZpbGUpCi0JCWlmIGFyY2hpdGVjdHVyZSA8PiAncHdwYyc6Ci0JCQljZm02OGtmcmFnLCBkeW5hbWljZmlsZXMgPSBnZXRmcmFnbmFtZShjZm02OGtwYXRoLCBkeW5hbWljZmlsZXMpCi0JCWVsc2U6Ci0JCQljZm02OGtmcmFnID0gIl9ub19mcmFnbWVudF8iCi0JCQotCQlkeW5hbWljbW9kdWxlc1tuYW1lXSA9IHBwY2ZyYWcsIGNmbTY4a2ZyYWcKLQkJaWYgKHBwY3BhdGgsIGNmbTY4a3BhdGgpIG5vdCBpbiBleHRyYXJlc2ZpbGVzOgotCQkJZXh0cmFyZXNmaWxlcy5hcHBlbmQoKHBwY3BhdGgsIGNmbTY4a3BhdGgpKQotCXJldHVybiBkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzCisgICAgZHluYW1pY21vZHVsZXMgPSB7fQorICAgIGR5bmFtaWNmaWxlcyA9IHt9CisgICAgZXh0cmFyZXNmaWxlcyA9IFtdCisgICAgZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgorICAgICAgICBpZiBtb2R1bGUuZ2V0dHlwZSgpIDw+ICdkeW5hbWljJzoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIHBhdGggPSByZXNvbHZlYWxpYXNmaWxlKG1vZHVsZS5fX2ZpbGVfXykKKyAgICAgICAgZGlyLCBmaWxlbmFtZSA9IG9zLnBhdGguc3BsaXQocGF0aCkKKyMjICAgICAgICAgICAgICBwcGNmaWxlLCBjZm02OGtmaWxlID0gbWFrZWZpbGVuYW1lcyhmaWxlbmFtZSkKKyAgICAgICAgcHBjZmlsZSA9IGZpbGVuYW1lCisgICAgICAgIGNmbTY4a2ZpbGUgPSAiZHVtbXkuY2ZtNjhrLnNsYiIKKworICAgICAgICAjIHBwYyBzdHVmZgorICAgICAgICBwcGNwYXRoID0gb3MucGF0aC5qb2luKGRpciwgcHBjZmlsZSkKKyAgICAgICAgaWYgYXJjaGl0ZWN0dXJlIDw+ICdtNjhrJzoKKyAgICAgICAgICAgIHBwY2ZyYWcsIGR5bmFtaWNmaWxlcyA9IGdldGZyYWduYW1lKHBwY3BhdGgsIGR5bmFtaWNmaWxlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHBwY2ZyYWcgPSAiX25vX2ZyYWdtZW50XyIKKworICAgICAgICAjIDY4ayBzdHVmZgorICAgICAgICBjZm02OGtwYXRoID0gb3MucGF0aC5qb2luKGRpciwgY2ZtNjhrZmlsZSkKKyAgICAgICAgaWYgYXJjaGl0ZWN0dXJlIDw+ICdwd3BjJzoKKyAgICAgICAgICAgIGNmbTY4a2ZyYWcsIGR5bmFtaWNmaWxlcyA9IGdldGZyYWduYW1lKGNmbTY4a3BhdGgsIGR5bmFtaWNmaWxlcykKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIGNmbTY4a2ZyYWcgPSAiX25vX2ZyYWdtZW50XyIKKworICAgICAgICBkeW5hbWljbW9kdWxlc1tuYW1lXSA9IHBwY2ZyYWcsIGNmbTY4a2ZyYWcKKyAgICAgICAgaWYgKHBwY3BhdGgsIGNmbTY4a3BhdGgpIG5vdCBpbiBleHRyYXJlc2ZpbGVzOgorICAgICAgICAgICAgZXh0cmFyZXNmaWxlcy5hcHBlbmQoKHBwY3BhdGgsIGNmbTY4a3BhdGgpKQorICAgIHJldHVybiBkeW5hbWljbW9kdWxlcywgZHluYW1pY2ZpbGVzLCBleHRyYXJlc2ZpbGVzCiAKIAogZGVmIGdldGZyYWduYW1lKHBhdGgsIGR5bmFtaWNmaWxlcyk6Ci0JaWYgbm90IGR5bmFtaWNmaWxlcy5oYXNfa2V5KHBhdGgpOgotCQlpZiBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLQkJCWxpYiA9IGNmbWZpbGUuQ2ZyZ1Jlc291cmNlKHBhdGgpCi0JCQlmcmFnbmFtZSA9IGxpYi5mcmFnbWVudHNbMF0ubmFtZQotCQllbHNlOgotCQkJcHJpbnQgInNoYXJlZCBsaWIgbm90IGZvdW5kOiIsIHBhdGgKLQkJCWZyYWduYW1lID0gIl9ub19mcmFnbWVudF8iCi0JCWR5bmFtaWNmaWxlc1twYXRoXSA9IGZyYWduYW1lCi0JZWxzZToKLQkJZnJhZ25hbWUgPSBkeW5hbWljZmlsZXNbcGF0aF0KLQlyZXR1cm4gZnJhZ25hbWUsIGR5bmFtaWNmaWxlcworICAgIGlmIG5vdCBkeW5hbWljZmlsZXMuaGFzX2tleShwYXRoKToKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMocGF0aCk6CisgICAgICAgICAgICBsaWIgPSBjZm1maWxlLkNmcmdSZXNvdXJjZShwYXRoKQorICAgICAgICAgICAgZnJhZ25hbWUgPSBsaWIuZnJhZ21lbnRzWzBdLm5hbWUKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIHByaW50ICJzaGFyZWQgbGliIG5vdCBmb3VuZDoiLCBwYXRoCisgICAgICAgICAgICBmcmFnbmFtZSA9ICJfbm9fZnJhZ21lbnRfIgorICAgICAgICBkeW5hbWljZmlsZXNbcGF0aF0gPSBmcmFnbmFtZQorICAgIGVsc2U6CisgICAgICAgIGZyYWduYW1lID0gZHluYW1pY2ZpbGVzW3BhdGhdCisgICAgcmV0dXJuIGZyYWduYW1lLCBkeW5hbWljZmlsZXMKIAogCiBkZWYgYWRkcHl0aG9ubW9kdWxlcyhtb2R1bGVfZGljdCk6Ci0JIyBYWFggc2hvdWxkIHJlYWxseSB1c2UgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUoKSwgdGhpcyBkb2VzIHRoZSBzYW1lLCBidXQgc2tpcHMgX19tYWluX18KLQlpdGVtcyA9IG1vZHVsZV9kaWN0Lml0ZW1zKCkKLQlpdGVtcy5zb3J0KCkKLQlmb3IgbmFtZSwgbW9kdWxlIGluIGl0ZW1zOgotCQltdHlwZSA9IG1vZHVsZS5nZXR0eXBlKCkKLQkJaWYgbXR5cGUgbm90IGluIFsnbW9kdWxlJywgJ3BhY2thZ2UnXSBvciBuYW1lID09ICJfX21haW5fXyI6Ci0JCQljb250aW51ZQotCQlsb2NhdGlvbiA9IG1vZHVsZS5fX2ZpbGVfXwotCQkKLQkJaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6Ci0JCQkjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKLQkJCWxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQotCQlpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgotCQkJcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCi0JCQljb250aW51ZQotCQkKLQkJcHJpbnQgJ0FkZGluZyBtb2R1bGUgIiVzIicgJSBuYW1lCi0JCWlkLCBuYW1lID0gcHlfcmVzb3VyY2UuZnJvbXB5ZmlsZShsb2NhdGlvbiwgbmFtZSwgcHJlbG9hZD0wLCAKLQkJCQlpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKKyAgICAjIFhYWCBzaG91bGQgcmVhbGx5IHVzZSBtYWNnZW5fcnNyYy5nZW5lcmF0ZSgpLCB0aGlzIGRvZXMgdGhlIHNhbWUsIGJ1dCBza2lwcyBfX21haW5fXworICAgIGl0ZW1zID0gbW9kdWxlX2RpY3QuaXRlbXMoKQorICAgIGl0ZW1zLnNvcnQoKQorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gaXRlbXM6CisgICAgICAgIG10eXBlID0gbW9kdWxlLmdldHR5cGUoKQorICAgICAgICBpZiBtdHlwZSBub3QgaW4gWydtb2R1bGUnLCAncGFja2FnZSddIG9yIG5hbWUgPT0gIl9fbWFpbl9fIjoKKyAgICAgICAgICAgIGNvbnRpbnVlCisgICAgICAgIGxvY2F0aW9uID0gbW9kdWxlLl9fZmlsZV9fCisKKyAgICAgICAgaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6CisgICAgICAgICAgICAjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKKyAgICAgICAgICAgIGxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQorICAgICAgICBpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgorICAgICAgICAgICAgcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCisgICAgICAgICAgICBjb250aW51ZQorCisgICAgICAgIHByaW50ICdBZGRpbmcgbW9kdWxlICIlcyInICUgbmFtZQorICAgICAgICBpZCwgbmFtZSA9IHB5X3Jlc291cmNlLmZyb21weWZpbGUobG9jYXRpb24sIG5hbWUsIHByZWxvYWQ9MCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGlzcGFja2FnZT1tdHlwZT09J3BhY2thZ2UnKQogCiBkZWYgUHN0cmluZyhzdHIpOgotCWlmIGxlbihzdHIpID4gMjU1OgotCQlyYWlzZSBUeXBlRXJyb3IsICJTdHIyNTUgbXVzdCBiZSBhdCBtb3N0IDI1NSBjaGFycyBsb25nIgotCXJldHVybiBjaHIobGVuKHN0cikpICsgc3RyCisgICAgaWYgbGVuKHN0cikgPiAyNTU6CisgICAgICAgIHJhaXNlIFR5cGVFcnJvciwgIlN0cjI1NSBtdXN0IGJlIGF0IG1vc3QgMjU1IGNoYXJzIGxvbmciCisgICAgcmV0dXJuIGNocihsZW4oc3RyKSkgKyBzdHIKIAogIyNkZWYgbWFrZWZpbGVuYW1lcyhuYW1lKToKLSMjCWxuYW1lID0gc3RyaW5nLmxvd2VyKG5hbWUpCi0jIwlwb3MgPSBzdHJpbmcuZmluZChsbmFtZSwgIi5wcGMuIikKLSMjCWlmIHBvcyA+IDA6Ci0jIwkJcmV0dXJuIG5hbWUsIG5hbWVbOnBvc10gKyAnLkNGTTY4Sy4nICsgbmFtZVtwb3MrNTpdCi0jIwlwb3MgPSBzdHJpbmcuZmluZChsbmFtZSwgIi5jZm02OGsuIikKLSMjCWlmIHBvcyA+IDA6Ci0jIwkJcmV0dXJuIG5hbWVbOnBvc10gKyAnLnBwYy4nICsgbmFtZVtwb3MrODpdLCBuYW1lCi0jIwlyYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgbWFrZSBwcGMvY2ZtNjhrIGZpbGVuYW1lcyIKKyMjICAgICAgbG5hbWUgPSBzdHJpbmcubG93ZXIobmFtZSkKKyMjICAgICAgcG9zID0gc3RyaW5nLmZpbmQobG5hbWUsICIucHBjLiIpCisjIyAgICAgIGlmIHBvcyA+IDA6CisjIyAgICAgICAgICAgICAgcmV0dXJuIG5hbWUsIG5hbWVbOnBvc10gKyAnLkNGTTY4Sy4nICsgbmFtZVtwb3MrNTpdCisjIyAgICAgIHBvcyA9IHN0cmluZy5maW5kKGxuYW1lLCAiLmNmbTY4ay4iKQorIyMgICAgICBpZiBwb3MgPiAwOgorIyMgICAgICAgICAgICAgIHJldHVybiBuYW1lWzpwb3NdICsgJy5wcGMuJyArIG5hbWVbcG9zKzg6XSwgbmFtZQorIyMgICAgICByYWlzZSBWYWx1ZUVycm9yLCAiY2FuJ3QgbWFrZSBwcGMvY2ZtNjhrIGZpbGVuYW1lcyIKIAogZGVmIGNvcHlyZXMoaW5wdXQsIG91dHB1dCwgKmFyZ3MsICoqa3dhcmdzKToKLQlvcGVuZWRpbiA9IG9wZW5lZG91dCA9IDAKLQlpZiB0eXBlKGlucHV0KSA9PSB0eXBlcy5TdHJpbmdUeXBlOgotCQlpbnB1dCA9IFJlcy5GU3BPcGVuUmVzRmlsZShpbnB1dCwgMSkKLQkJb3BlbmVkaW4gPSAxCi0JaWYgdHlwZShvdXRwdXQpID09IHR5cGVzLlN0cmluZ1R5cGU6Ci0JCW91dHB1dCA9IFJlcy5GU3BPcGVuUmVzRmlsZShvdXRwdXQsIDMpCi0JCW9wZW5lZG91dCA9IDEKLQl0cnk6Ci0JCWFwcGx5KGJ1aWxkdG9vbHMuY29weXJlcywgKGlucHV0LCBvdXRwdXQpICsgYXJncywga3dhcmdzKQotCWZpbmFsbHk6Ci0JCWlmIG9wZW5lZGluOgotCQkJUmVzLkNsb3NlUmVzRmlsZShpbnB1dCkKLQkJaWYgb3BlbmVkb3V0OgotCQkJUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCisgICAgb3BlbmVkaW4gPSBvcGVuZWRvdXQgPSAwCisgICAgaWYgdHlwZShpbnB1dCkgPT0gdHlwZXMuU3RyaW5nVHlwZToKKyAgICAgICAgaW5wdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoaW5wdXQsIDEpCisgICAgICAgIG9wZW5lZGluID0gMQorICAgIGlmIHR5cGUob3V0cHV0KSA9PSB0eXBlcy5TdHJpbmdUeXBlOgorICAgICAgICBvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUob3V0cHV0LCAzKQorICAgICAgICBvcGVuZWRvdXQgPSAxCisgICAgdHJ5OgorICAgICAgICBhcHBseShidWlsZHRvb2xzLmNvcHlyZXMsIChpbnB1dCwgb3V0cHV0KSArIGFyZ3MsIGt3YXJncykKKyAgICBmaW5hbGx5OgorICAgICAgICBpZiBvcGVuZWRpbjoKKyAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUoaW5wdXQpCisgICAgICAgIGlmIG9wZW5lZG91dDoKKyAgICAgICAgICAgIFJlcy5DbG9zZVJlc0ZpbGUob3V0cHV0KQogCiBkZWYgZmluZHB5dGhvbmNvcmUoKToKLQkiIiJmaW5kIHRoZSBQeXRob25Db3JlIHNoYXJlZCBsaWJyYXJ5LCBwb3NzaWJseSBhc2tpbmcgdGhlIHVzZXIgaWYgd2UgY2FuJ3QgZmluZCBpdCIiIgotCQotCXRyeToKLQkJdlJlZk51bSwgZGlySUQgPSBtYWNmcy5GaW5kRm9sZGVyKGtPblN5c3RlbURpc2ssIGtTaGFyZWRMaWJyYXJpZXNGb2xkZXJUeXBlLCAwKQotCWV4Y2VwdCBtYWNmcy5lcnJvcjoKLQkJZXh0cGF0aCA9ICI6IgotCWVsc2U6Ci0JCWV4dHBhdGggPSBtYWNmcy5GU1NwZWMoKHZSZWZOdW0sIGRpcklELCAiIikpLmFzX3BhdGhuYW1lKCkKLQl2ZXJzaW9uID0gc3RyaW5nLnNwbGl0KHN5cy52ZXJzaW9uKVswXQotCWlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAnY2FyYm9uJzoKLQkJY29yZW5hbWUgPSAiUHl0aG9uQ29yZUNhcmJvbiAiICsgdmVyc2lvbgotCWVsaWYgTWFjT1MucnVudGltZW1vZGVsID09ICdwcGMnOgotCQljb3JlbmFtZSA9ICJQeXRob25Db3JlICIgKyB2ZXJzaW9uCi0JZWxzZToKLQkJcmFpc2UgIlVua25vd24gTWFjT1MucnVudGltZW1vZGVsIiwgTWFjT1MucnVudGltZW1vZGVsCi0JY29yZXBhdGggPSBvcy5wYXRoLmpvaW4oZXh0cGF0aCwgY29yZW5hbWUpCi0JaWYgbm90IG9zLnBhdGguZXhpc3RzKGNvcmVwYXRoKToKLQkJY29yZXBhdGggPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJQbGVhc2UgbG9jYXRlIFB5dGhvbkNvcmU6IiwgCi0JCQl0eXBlTGlzdD0oInNobGIiLCkpCi0JCWlmIG5vdCBjb3JlcGF0aDoKLQkJCXJhaXNlIEtleWJvYXJkSW50ZXJydXB0LCAiY2FuY2VsbGVkIgotCXJldHVybiByZXNvbHZlYWxpYXNmaWxlKGNvcmVwYXRoKQorICAgICIiImZpbmQgdGhlIFB5dGhvbkNvcmUgc2hhcmVkIGxpYnJhcnksIHBvc3NpYmx5IGFza2luZyB0aGUgdXNlciBpZiB3ZSBjYW4ndCBmaW5kIGl0IiIiCisKKyAgICB0cnk6CisgICAgICAgIHZSZWZOdW0sIGRpcklEID0gbWFjZnMuRmluZEZvbGRlcihrT25TeXN0ZW1EaXNrLCBrU2hhcmVkTGlicmFyaWVzRm9sZGVyVHlwZSwgMCkKKyAgICBleGNlcHQgbWFjZnMuZXJyb3I6CisgICAgICAgIGV4dHBhdGggPSAiOiIKKyAgICBlbHNlOgorICAgICAgICBleHRwYXRoID0gbWFjZnMuRlNTcGVjKCh2UmVmTnVtLCBkaXJJRCwgIiIpKS5hc19wYXRobmFtZSgpCisgICAgdmVyc2lvbiA9IHN0cmluZy5zcGxpdChzeXMudmVyc2lvbilbMF0KKyAgICBpZiBNYWNPUy5ydW50aW1lbW9kZWwgPT0gJ2NhcmJvbic6CisgICAgICAgIGNvcmVuYW1lID0gIlB5dGhvbkNvcmVDYXJib24gIiArIHZlcnNpb24KKyAgICBlbGlmIE1hY09TLnJ1bnRpbWVtb2RlbCA9PSAncHBjJzoKKyAgICAgICAgY29yZW5hbWUgPSAiUHl0aG9uQ29yZSAiICsgdmVyc2lvbgorICAgIGVsc2U6CisgICAgICAgIHJhaXNlICJVbmtub3duIE1hY09TLnJ1bnRpbWVtb2RlbCIsIE1hY09TLnJ1bnRpbWVtb2RlbAorICAgIGNvcmVwYXRoID0gb3MucGF0aC5qb2luKGV4dHBhdGgsIGNvcmVuYW1lKQorICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhjb3JlcGF0aCk6CisgICAgICAgIGNvcmVwYXRoID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iUGxlYXNlIGxvY2F0ZSBQeXRob25Db3JlOiIsCisgICAgICAgICAgICAgICAgdHlwZUxpc3Q9KCJzaGxiIiwpKQorICAgICAgICBpZiBub3QgY29yZXBhdGg6CisgICAgICAgICAgICByYWlzZSBLZXlib2FyZEludGVycnVwdCwgImNhbmNlbGxlZCIKKyAgICByZXR1cm4gcmVzb2x2ZWFsaWFzZmlsZShjb3JlcGF0aCkKIAogZGVmIHJlc29sdmVhbGlhc2ZpbGUocGF0aCk6Ci0JdHJ5OgotCQlmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShwYXRoKQotCWV4Y2VwdCBtYWNmcy5lcnJvcjoKLQkJcGFzcwotCWVsc2U6Ci0JCXBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQotCXJldHVybiBwYXRoCisgICAgdHJ5OgorICAgICAgICBmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShwYXRoKQorICAgIGV4Y2VwdCBtYWNmcy5lcnJvcjoKKyAgICAgICAgcGFzcworICAgIGVsc2U6CisgICAgICAgIHBhdGggPSBmc3MuYXNfcGF0aG5hbWUoKQorICAgIHJldHVybiBwYXRoCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9pbmZvLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5faW5mby5weQppbmRleCAyZDk4NGMxLi5kMmVkYjkyIDEwMDY0NAotLS0gYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9pbmZvLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX2luZm8ucHkKQEAgLTEsOCArMSw4IEBACiAiIiJtYWNnZW5faW5mbyAtIEdlbmVyYXRlIGluZm9ybWF0aW9uYWwgb3V0cHV0IiIiCiAKIGRlZiBnZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0KToKLQlmb3IgbmFtZSBpbiBtb2R1bGVfZGljdC5rZXlzKCk6Ci0JCXByaW50ICdJbmNsdWRlICUtMjBzXHQnJW5hbWUsCi0JCW1vZHVsZSA9IG1vZHVsZV9kaWN0W25hbWVdCi0JCXByaW50IG1vZHVsZS5nZXR0eXBlKCksICdcdCcsIHJlcHIobW9kdWxlKQotCXJldHVybiAwCisgICAgZm9yIG5hbWUgaW4gbW9kdWxlX2RpY3Qua2V5cygpOgorICAgICAgICBwcmludCAnSW5jbHVkZSAlLTIwc1x0JyVuYW1lLAorICAgICAgICBtb2R1bGUgPSBtb2R1bGVfZGljdFtuYW1lXQorICAgICAgICBwcmludCBtb2R1bGUuZ2V0dHlwZSgpLCAnXHQnLCByZXByKG1vZHVsZSkKKyAgICByZXR1cm4gMApkaWZmIC0tZ2l0IGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fcnNyYy5weSBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX3JzcmMucHkKaW5kZXggMDNmYzBhZi4uMzRjMTdmZiAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fcnNyYy5weQorKysgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9yc3JjLnB5CkBAIC01LDMzICs1LDMyIEBACiBpbXBvcnQgc3lzCiAKIGRlZiBnZW5lcmF0ZShvdXRwdXQsIG1vZHVsZV9kaWN0LCBkZWJ1Zz0wLCBwcmVsb2FkPTEpOgotCWZzaWQgPSBweV9yZXNvdXJjZS5jcmVhdGUob3V0cHV0KQotCQotCWZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKLQkJbXR5cGUgPSBtb2R1bGUuZ2V0dHlwZSgpCi0JCWlmIG10eXBlIG5vdCBpbiBbJ21vZHVsZScsICdwYWNrYWdlJ106Ci0JCQljb250aW51ZQotCQlsb2NhdGlvbiA9IG1vZHVsZS5fX2ZpbGVfXwotCQkKLQkJaWYgbG9jYXRpb25bLTQ6XSA9PSAnLnB5Yyc6Ci0JCQkjIEF0dGVtcHQgY29ycmVzcG9uZGluZyAucHkKLQkJCWxvY2F0aW9uID0gbG9jYXRpb25bOi0xXQotCQlpZiBsb2NhdGlvblstMzpdICE9ICcucHknOgotCQkJcHJpbnQgJyoqKiBza2lwcGluZycsIGxvY2F0aW9uCi0JCQljb250aW51ZQotCQkJCi0JCWlkLCBuYW1lID0gcHlfcmVzb3VyY2UuZnJvbXB5ZmlsZShsb2NhdGlvbiwgbmFtZSwgcHJlbG9hZD1wcmVsb2FkLCAKLQkJCQlpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKLQkJaWYgZGVidWcgPiAwOgotCQkJcHJpbnQgJ1BZQyByZXNvdXJjZSAlNWRcdCVzXHQlcyclKGlkLCBuYW1lLCBsb2NhdGlvbikKLQkKLQlSZXMuQ2xvc2VSZXNGaWxlKGZzaWQpCi0JCisgICAgZnNpZCA9IHB5X3Jlc291cmNlLmNyZWF0ZShvdXRwdXQpCisKKyAgICBmb3IgbmFtZSwgbW9kdWxlIGluIG1vZHVsZV9kaWN0Lml0ZW1zKCk6CisgICAgICAgIG10eXBlID0gbW9kdWxlLmdldHR5cGUoKQorICAgICAgICBpZiBtdHlwZSBub3QgaW4gWydtb2R1bGUnLCAncGFja2FnZSddOgorICAgICAgICAgICAgY29udGludWUKKyAgICAgICAgbG9jYXRpb24gPSBtb2R1bGUuX19maWxlX18KKworICAgICAgICBpZiBsb2NhdGlvblstNDpdID09ICcucHljJzoKKyAgICAgICAgICAgICMgQXR0ZW1wdCBjb3JyZXNwb25kaW5nIC5weQorICAgICAgICAgICAgbG9jYXRpb24gPSBsb2NhdGlvbls6LTFdCisgICAgICAgIGlmIGxvY2F0aW9uWy0zOl0gIT0gJy5weSc6CisgICAgICAgICAgICBwcmludCAnKioqIHNraXBwaW5nJywgbG9jYXRpb24KKyAgICAgICAgICAgIGNvbnRpbnVlCisKKyAgICAgICAgaWQsIG5hbWUgPSBweV9yZXNvdXJjZS5mcm9tcHlmaWxlKGxvY2F0aW9uLCBuYW1lLCBwcmVsb2FkPXByZWxvYWQsCisgICAgICAgICAgICAgICAgICAgICAgICBpc3BhY2thZ2U9bXR5cGU9PSdwYWNrYWdlJykKKyAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgcHJpbnQgJ1BZQyByZXNvdXJjZSAlNWRcdCVzXHQlcyclKGlkLCBuYW1lLCBsb2NhdGlvbikKKworICAgIFJlcy5DbG9zZVJlc0ZpbGUoZnNpZCkKKwogZGVmIHdhcm5pbmdzKG1vZHVsZV9kaWN0KToKLQlwcm9ibGVtcyA9IDAKLQlmb3IgbmFtZSwgbW9kdWxlIGluIG1vZHVsZV9kaWN0Lml0ZW1zKCk6Ci0JCWlmIG1vZHVsZS5nZXR0eXBlKCkgbm90IGluICgnYnVpbHRpbicsICdtb2R1bGUnLCAncGFja2FnZScpOgotCQkJcHJvYmxlbXMgPSBwcm9ibGVtcyArIDEKLQkJCXByaW50ICdXYXJuaW5nOiAlcyBub3QgaW5jbHVkZWQ6ICVzICVzJyUobmFtZSwgbW9kdWxlLmdldHR5cGUoKSwgbW9kdWxlKQotCXJldHVybiBwcm9ibGVtcwotCQorICAgIHByb2JsZW1zID0gMAorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKKyAgICAgICAgaWYgbW9kdWxlLmdldHR5cGUoKSBub3QgaW4gKCdidWlsdGluJywgJ21vZHVsZScsICdwYWNrYWdlJyk6CisgICAgICAgICAgICBwcm9ibGVtcyA9IHByb2JsZW1zICsgMQorICAgICAgICAgICAgcHJpbnQgJ1dhcm5pbmc6ICVzIG5vdCBpbmNsdWRlZDogJXMgJXMnJShuYW1lLCBtb2R1bGUuZ2V0dHlwZSgpLCBtb2R1bGUpCisgICAgcmV0dXJuIHByb2JsZW1zCmRpZmYgLS1naXQgYS9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9zcmMucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbl9zcmMucHkKaW5kZXggMDg5NzI3YS4uMzAxZTg1ZSAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5fc3JjLnB5CisrKyBiL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuX3NyYy5weQpAQCAtMTYsOTggKzE2LDk4IEBACiBCVU5ETEVfVEVNUExBVEU9b3MucGF0aC5qb2luKFRFTVBMQVRFRElSLCAnOmZyb3plbmJ1bmRsZS5yc3JjJykKIAogZGVmIGdlbmVyYXRlKG91dHB1dCwgbW9kdWxlX2RpY3QsIGRlYnVnPTAsIHdpdGhfaWZkZWY9MCk6Ci0JcHJvYmxlbXMgPSAwCi0Jb3V0cHV0X2NyZWF0ZWQ9MAotCWlmIG5vdCBvcy5wYXRoLmV4aXN0cyhvdXRwdXQpOgotCQlwcmludCAnQ3JlYXRpbmcgcHJvamVjdCBmb2xkZXInLCBvdXRwdXQKLQkJb3MubWtkaXIob3V0cHV0KQotCQlvdXRwdXRfY3JlYXRlZCA9IDEKLQkjIFJlc29sdmUgYWxpYXNlcywgaWYgbmVlZGVkCi0JdHJ5OgotCQlmc3MsIGR1bW15MSwgZHVtbXkyID0gbWFjZnMuUmVzb2x2ZUFsaWFzRmlsZShvdXRwdXQpCi0JZXhjZXB0IG1hY2ZzLmVycm9yOgotCQlwYXNzCi0JZWxzZToKLQkJbmV3bmFtZSA9IGZzcy5hc19wYXRobmFtZSgpCi0JCWlmIG5ld25hbWUgIT0gb3V0cHV0OgotCQkJaWYgZGVidWc6Ci0JCQkJcHJpbnQgJ0FsaWFzJywgb3V0cHV0Ci0JCQkJcHJpbnQgJ1Jlc29sdmVkIHRvJywgbmV3bmFtZQotCQkJb3V0cHV0ID0gbmV3bmFtZQkKLQkjIENvbnN0cnVjdCB0aGUgZmlsZW5hbWVzCi0JZHVtbXksIG91dGZpbGUgPSBvcy5wYXRoLnNwbGl0KG91dHB1dCkKLQlidWlsZCwgZXh0ID0gb3MucGF0aC5zcGxpdGV4dChvdXRmaWxlKQotCWlmIGJ1aWxkID09ICdidWlsZCcgYW5kIGV4dFswXSA9PSAnLic6Ci0JCSMgVGhpcyBpcyBwcm9iYWJseSBhIGdvb2QgbmFtZSBmb3IgdGhlIHByb2plY3QKLQkJcHJvam5hbWUgPSBleHRbMTpdCi0JZWxzZToKLQkJcHJvam5hbWUgPSAnZnJvemVuYXBwbGV0LnByaicKLQljb25maWdfbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXQsICc6bWFjZnJvemVuY29uZmlnLmMnKQotCXByb2plY3RfbmFtZSA9IG9zLnBhdGguam9pbihvdXRwdXQsICc6JyArIHByb2puYW1lICsgJy5wcmonKQotCXJlc291cmNlX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOmZyb3plbm1vZHVsZXMucnNyYycpCi0JYnVuZGxlX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOmZyb3plbmJ1bmRsZS5yc3JjJykKKyAgICBwcm9ibGVtcyA9IDAKKyAgICBvdXRwdXRfY3JlYXRlZD0wCisgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKG91dHB1dCk6CisgICAgICAgIHByaW50ICdDcmVhdGluZyBwcm9qZWN0IGZvbGRlcicsIG91dHB1dAorICAgICAgICBvcy5ta2RpcihvdXRwdXQpCisgICAgICAgIG91dHB1dF9jcmVhdGVkID0gMQorICAgICMgUmVzb2x2ZSBhbGlhc2VzLCBpZiBuZWVkZWQKKyAgICB0cnk6CisgICAgICAgIGZzcywgZHVtbXkxLCBkdW1teTIgPSBtYWNmcy5SZXNvbHZlQWxpYXNGaWxlKG91dHB1dCkKKyAgICBleGNlcHQgbWFjZnMuZXJyb3I6CisgICAgICAgIHBhc3MKKyAgICBlbHNlOgorICAgICAgICBuZXduYW1lID0gZnNzLmFzX3BhdGhuYW1lKCkKKyAgICAgICAgaWYgbmV3bmFtZSAhPSBvdXRwdXQ6CisgICAgICAgICAgICBpZiBkZWJ1ZzoKKyAgICAgICAgICAgICAgICBwcmludCAnQWxpYXMnLCBvdXRwdXQKKyAgICAgICAgICAgICAgICBwcmludCAnUmVzb2x2ZWQgdG8nLCBuZXduYW1lCisgICAgICAgICAgICBvdXRwdXQgPSBuZXduYW1lCisgICAgIyBDb25zdHJ1Y3QgdGhlIGZpbGVuYW1lcworICAgIGR1bW15LCBvdXRmaWxlID0gb3MucGF0aC5zcGxpdChvdXRwdXQpCisgICAgYnVpbGQsIGV4dCA9IG9zLnBhdGguc3BsaXRleHQob3V0ZmlsZSkKKyAgICBpZiBidWlsZCA9PSAnYnVpbGQnIGFuZCBleHRbMF0gPT0gJy4nOgorICAgICAgICAjIFRoaXMgaXMgcHJvYmFibHkgYSBnb29kIG5hbWUgZm9yIHRoZSBwcm9qZWN0CisgICAgICAgIHByb2puYW1lID0gZXh0WzE6XQorICAgIGVsc2U6CisgICAgICAgIHByb2puYW1lID0gJ2Zyb3plbmFwcGxldC5wcmonCisgICAgY29uZmlnX25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOm1hY2Zyb3plbmNvbmZpZy5jJykKKyAgICBwcm9qZWN0X25hbWUgPSBvcy5wYXRoLmpvaW4ob3V0cHV0LCAnOicgKyBwcm9qbmFtZSArICcucHJqJykKKyAgICByZXNvdXJjZV9uYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJzpmcm96ZW5tb2R1bGVzLnJzcmMnKQorICAgIGJ1bmRsZV9uYW1lID0gb3MucGF0aC5qb2luKG91dHB1dCwgJzpmcm96ZW5idW5kbGUucnNyYycpCiAKLQkjIEZpbGwgdGhlIG91dHB1dCBmb2xkZXIsIGlmIG5lZWRlZC4KLQlpZiBvdXRwdXRfY3JlYXRlZDoKLQkJIyBDcmVhdGUgdGhlIHByb2plY3QsIGlmIG5lZWRlZAotCQlpZiBub3Qgb3MucGF0aC5leGlzdHMocHJvamVjdF9uYW1lKToKLQkJCXByaW50ICdDcmVhdGluZyBwcm9qZWN0JywgcHJvamVjdF9uYW1lCi0JCQlpZiBub3Qgb3MucGF0aC5leGlzdHMoUFJPSkVDVF9URU1QTEFURSk6Ci0JCQkJcHJpbnQgJyoqIE5vIHRlbXBsYXRlIENvZGVXYXJyaW9yIHByb2plY3QgZm91bmQgYXQnLCBQUk9KRUNUX1RFTVBMQVRFCi0JCQkJcHJpbnQgJyAgIFRvIGdlbmVyYXRlIHN0YW5kYWxvbmUgUHl0aG9uIGFwcGxpY2F0aW9ucyBmcm9tIHNvdXJjZSB5b3UgbmVlZCcKLQkJCQlwcmludCAnICAgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uIENoZWNrIGh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sJwotCQkJCXByaW50ICcgICBmb3IgZGV0YWlscy4nCi0JCQkJcHJvYmxlbXMgPSAxCi0JCQllbHNlOgkJCi0JCQkJbWFjb3N0b29scy5jb3B5KFBST0pFQ1RfVEVNUExBVEUsIHByb2plY3RfbmFtZSkKLQkJCQlwcmludCAnQSB0ZW1wbGF0ZSBDb2RlV2FycmlvciBwcm9qZWN0IGhhcyBiZWVuIGNvcGllZCB0bycsIHByb2plY3RfbmFtZQotCQkJCXByaW50ICdJdCBpcyB1cCB0byB5b3UgdG8gbWFrZSB0aGUgZm9sbG93aW5nIGNoYW5nZXM6JwotCQkJCXByaW50ICctIENoYW5nZSB0aGUgb3V0cHV0IGZpbGUgbmFtZScKLQkJCQlwcmludCAnLSBDaGFuZ2UgdGhlIHNlYXJjaCBwYXRoLCB1bmxlc3MgdGhlIGZvbGRlciBpcyBpbiB0aGUgcHl0aG9uIGhvbWUnCi0JCQkJcHJpbnQgJy0gQWRkIHNvdXJjZWZpbGVzL2xpYnJhcmllcyBmb3IgYW55IGV4dGVuc2lvbiBtb2R1bGVzIHVzZWQnCi0JCQkJcHJpbnQgJy0gUmVtb3ZlIHVudXNlZCBzb3VyY2VzLCB0byBzcGVlZCB1cCB0aGUgYnVpbGQgcHJvY2VzcycKLQkJCQlwcmludCAnLSBSZW1vdmUgdW51c2VkIHJlc291cmNlIGZpbGVzIChsaWtlIHRjbC90aykgZm9yIGEgc21hbGxlciBiaW5hcnknCi0JCQkJcHJvYmxlbXMgPSAxCi0JCQkJbWFjb3N0b29scy5jb3B5KEJVTkRMRV9URU1QTEFURSwgYnVuZGxlX25hbWUpCi0JCQkJcHJpbnQgJ0EgdGVtcGxhdGUgYnVuZGxlIGZpbGUgaGFzIGFsc28gYmVlbiBjb3BpZWQgdG8nLCBidW5kbGVfbmFtZQotCQkJCXByaW50ICdZb3UgbWF5IHdhbnQgdG8gYWRhcHQgc2lnbmF0dXJlLCBzaXplIHJlc291cmNlLCBldGMnCisgICAgIyBGaWxsIHRoZSBvdXRwdXQgZm9sZGVyLCBpZiBuZWVkZWQuCisgICAgaWYgb3V0cHV0X2NyZWF0ZWQ6CisgICAgICAgICMgQ3JlYXRlIHRoZSBwcm9qZWN0LCBpZiBuZWVkZWQKKyAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHByb2plY3RfbmFtZSk6CisgICAgICAgICAgICBwcmludCAnQ3JlYXRpbmcgcHJvamVjdCcsIHByb2plY3RfbmFtZQorICAgICAgICAgICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKFBST0pFQ1RfVEVNUExBVEUpOgorICAgICAgICAgICAgICAgIHByaW50ICcqKiBObyB0ZW1wbGF0ZSBDb2RlV2FycmlvciBwcm9qZWN0IGZvdW5kIGF0JywgUFJPSkVDVF9URU1QTEFURQorICAgICAgICAgICAgICAgIHByaW50ICcgICBUbyBnZW5lcmF0ZSBzdGFuZGFsb25lIFB5dGhvbiBhcHBsaWNhdGlvbnMgZnJvbSBzb3VyY2UgeW91IG5lZWQnCisgICAgICAgICAgICAgICAgcHJpbnQgJyAgIGEgZnVsbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiBDaGVjayBodHRwOi8vd3d3LmN3aS5ubC9+amFjay9tYWNweXRob24uaHRtbCcKKyAgICAgICAgICAgICAgICBwcmludCAnICAgZm9yIGRldGFpbHMuJworICAgICAgICAgICAgICAgIHByb2JsZW1zID0gMQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBtYWNvc3Rvb2xzLmNvcHkoUFJPSkVDVF9URU1QTEFURSwgcHJvamVjdF9uYW1lKQorICAgICAgICAgICAgICAgIHByaW50ICdBIHRlbXBsYXRlIENvZGVXYXJyaW9yIHByb2plY3QgaGFzIGJlZW4gY29waWVkIHRvJywgcHJvamVjdF9uYW1lCisgICAgICAgICAgICAgICAgcHJpbnQgJ0l0IGlzIHVwIHRvIHlvdSB0byBtYWtlIHRoZSBmb2xsb3dpbmcgY2hhbmdlczonCisgICAgICAgICAgICAgICAgcHJpbnQgJy0gQ2hhbmdlIHRoZSBvdXRwdXQgZmlsZSBuYW1lJworICAgICAgICAgICAgICAgIHByaW50ICctIENoYW5nZSB0aGUgc2VhcmNoIHBhdGgsIHVubGVzcyB0aGUgZm9sZGVyIGlzIGluIHRoZSBweXRob24gaG9tZScKKyAgICAgICAgICAgICAgICBwcmludCAnLSBBZGQgc291cmNlZmlsZXMvbGlicmFyaWVzIGZvciBhbnkgZXh0ZW5zaW9uIG1vZHVsZXMgdXNlZCcKKyAgICAgICAgICAgICAgICBwcmludCAnLSBSZW1vdmUgdW51c2VkIHNvdXJjZXMsIHRvIHNwZWVkIHVwIHRoZSBidWlsZCBwcm9jZXNzJworICAgICAgICAgICAgICAgIHByaW50ICctIFJlbW92ZSB1bnVzZWQgcmVzb3VyY2UgZmlsZXMgKGxpa2UgdGNsL3RrKSBmb3IgYSBzbWFsbGVyIGJpbmFyeScKKyAgICAgICAgICAgICAgICBwcm9ibGVtcyA9IDEKKyAgICAgICAgICAgICAgICBtYWNvc3Rvb2xzLmNvcHkoQlVORExFX1RFTVBMQVRFLCBidW5kbGVfbmFtZSkKKyAgICAgICAgICAgICAgICBwcmludCAnQSB0ZW1wbGF0ZSBidW5kbGUgZmlsZSBoYXMgYWxzbyBiZWVuIGNvcGllZCB0bycsIGJ1bmRsZV9uYW1lCisgICAgICAgICAgICAgICAgcHJpbnQgJ1lvdSBtYXkgd2FudCB0byBhZGFwdCBzaWduYXR1cmUsIHNpemUgcmVzb3VyY2UsIGV0YycKIAotCQotCSMgQ3JlYXRlIHRoZSByZXNvdXJjZSBmaWxlCi0JbWFjZ2VuX3JzcmMuZ2VuZXJhdGUocmVzb3VyY2VfbmFtZSwgbW9kdWxlX2RpY3QsIGRlYnVnPWRlYnVnKQotCQotCSMgQ3JlYXRlIHRoZSBjb25maWcuYyBmaWxlCi0JaWYgbm90IG9zLnBhdGguZXhpc3RzKENPTkZJR19URU1QTEFURSk6Ci0JCXByaW50ICcqKiBObyB0ZW1wbGF0ZSBjb25maWcuYyBmb3VuZCBhdCcsIFBST0pFQ1RfVEVNUExBVEUKLQkJcHJpbnQgJyAgIFRvIGdlbmVyYXRlIHN0YW5kYWxvbmUgUHl0aG9uIGFwcGxpY2F0aW9ucyBmcm9tIHNvdXJjZSB5b3UgbmVlZCcKLQkJcHJpbnQgJyAgIGEgZnVsbCBzb3VyY2UgZGlzdHJpYnV0aW9uLiBDaGVjayBodHRwOi8vd3d3LmN3aS5ubC9+amFjay9tYWNweXRob24uaHRtbCcKLQkJcHJpbnQgJyAgIGZvciBkZXRhaWxzLicKLQkJcHJvYmxlbXMgPSAxCi0JZWxzZToKLQkJIyBGaW5kIGVsZWdpYmxlIG1vZHVsZXMgKGJ1aWx0aW5zIGFuZCBkeW5hbWljYWxseSBsb2FkZWQgbW9kdWxlcykKLQkJY19tb2R1bGVzID0gW10KLQkJZm9yIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5rZXlzKCk6Ci0JCQlpZiBtb2R1bGVfZGljdFttb2R1bGVdLmdldHR5cGUoKSBpbiAoJ2J1aWx0aW4nLCAnZHluYW1pYycpOgotCQkJCSMgaWYgdGhlIG1vZHVsZSBpcyBpbiBhIHBhY2thZ2Ugd2UgaGF2ZSBubyBjaG9pY2UgYnV0Ci0JCQkJIyB0byBwdXQgaXQgYXQgdGhlIHRvcGxldmVsIGluIHRoZSBmcm96ZW4gYXBwbGljYXRpb24uCi0JCQkJaWYgJy4nIGluIG1vZHVsZToKLQkJCQkJbW9kdWxlID0gbW9kdWxlLnNwbGl0KCcuJylbLTFdCi0JCQkJY19tb2R1bGVzLmFwcGVuZChtb2R1bGUpCi0JCWlmcCA9IG9wZW4oQ09ORklHX1RFTVBMQVRFKQotCQlvZnAgPSBvcGVuKGNvbmZpZ19uYW1lLCAndycpCi0JCW1ha2Vjb25maWcubWFrZWNvbmZpZyhpZnAsIG9mcCwgY19tb2R1bGVzLCB3aXRoX2lmZGVmKQotCQlpZnAuY2xvc2UoKQotCQlvZnAuY2xvc2UoKQotCQlNYWNPUy5TZXRDcmVhdG9yQW5kVHlwZShjb25maWdfbmFtZSwgJ0NXSUUnLCAnVEVYVCcpCi0JCi0JaWYgd2FybmluZ3MobW9kdWxlX2RpY3QpOgotCQlwcm9ibGVtcyA9IDEKLQlyZXR1cm4gcHJvYmxlbXMKLQkKKworICAgICMgQ3JlYXRlIHRoZSByZXNvdXJjZSBmaWxlCisgICAgbWFjZ2VuX3JzcmMuZ2VuZXJhdGUocmVzb3VyY2VfbmFtZSwgbW9kdWxlX2RpY3QsIGRlYnVnPWRlYnVnKQorCisgICAgIyBDcmVhdGUgdGhlIGNvbmZpZy5jIGZpbGUKKyAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoQ09ORklHX1RFTVBMQVRFKToKKyAgICAgICAgcHJpbnQgJyoqIE5vIHRlbXBsYXRlIGNvbmZpZy5jIGZvdW5kIGF0JywgUFJPSkVDVF9URU1QTEFURQorICAgICAgICBwcmludCAnICAgVG8gZ2VuZXJhdGUgc3RhbmRhbG9uZSBQeXRob24gYXBwbGljYXRpb25zIGZyb20gc291cmNlIHlvdSBuZWVkJworICAgICAgICBwcmludCAnICAgYSBmdWxsIHNvdXJjZSBkaXN0cmlidXRpb24uIENoZWNrIGh0dHA6Ly93d3cuY3dpLm5sL35qYWNrL21hY3B5dGhvbi5odG1sJworICAgICAgICBwcmludCAnICAgZm9yIGRldGFpbHMuJworICAgICAgICBwcm9ibGVtcyA9IDEKKyAgICBlbHNlOgorICAgICAgICAjIEZpbmQgZWxlZ2libGUgbW9kdWxlcyAoYnVpbHRpbnMgYW5kIGR5bmFtaWNhbGx5IGxvYWRlZCBtb2R1bGVzKQorICAgICAgICBjX21vZHVsZXMgPSBbXQorICAgICAgICBmb3IgbW9kdWxlIGluIG1vZHVsZV9kaWN0LmtleXMoKToKKyAgICAgICAgICAgIGlmIG1vZHVsZV9kaWN0W21vZHVsZV0uZ2V0dHlwZSgpIGluICgnYnVpbHRpbicsICdkeW5hbWljJyk6CisgICAgICAgICAgICAgICAgIyBpZiB0aGUgbW9kdWxlIGlzIGluIGEgcGFja2FnZSB3ZSBoYXZlIG5vIGNob2ljZSBidXQKKyAgICAgICAgICAgICAgICAjIHRvIHB1dCBpdCBhdCB0aGUgdG9wbGV2ZWwgaW4gdGhlIGZyb3plbiBhcHBsaWNhdGlvbi4KKyAgICAgICAgICAgICAgICBpZiAnLicgaW4gbW9kdWxlOgorICAgICAgICAgICAgICAgICAgICBtb2R1bGUgPSBtb2R1bGUuc3BsaXQoJy4nKVstMV0KKyAgICAgICAgICAgICAgICBjX21vZHVsZXMuYXBwZW5kKG1vZHVsZSkKKyAgICAgICAgaWZwID0gb3BlbihDT05GSUdfVEVNUExBVEUpCisgICAgICAgIG9mcCA9IG9wZW4oY29uZmlnX25hbWUsICd3JykKKyAgICAgICAgbWFrZWNvbmZpZy5tYWtlY29uZmlnKGlmcCwgb2ZwLCBjX21vZHVsZXMsIHdpdGhfaWZkZWYpCisgICAgICAgIGlmcC5jbG9zZSgpCisgICAgICAgIG9mcC5jbG9zZSgpCisgICAgICAgIE1hY09TLlNldENyZWF0b3JBbmRUeXBlKGNvbmZpZ19uYW1lLCAnQ1dJRScsICdURVhUJykKKworICAgIGlmIHdhcm5pbmdzKG1vZHVsZV9kaWN0KToKKyAgICAgICAgcHJvYmxlbXMgPSAxCisgICAgcmV0dXJuIHByb2JsZW1zCisKIGRlZiB3YXJuaW5ncyhtb2R1bGVfZGljdCk6Ci0JcHJvYmxlbXMgPSAwCi0JZm9yIG5hbWUsIG1vZHVsZSBpbiBtb2R1bGVfZGljdC5pdGVtcygpOgotCQlpZiBtb2R1bGUuZ2V0dHlwZSgpIG5vdCBpbiAoJ2J1aWx0aW4nLCAnbW9kdWxlJywgJ2R5bmFtaWMnLCAncGFja2FnZScpOgotCQkJcHJvYmxlbXMgPSBwcm9ibGVtcyArIDEKLQkJCXByaW50ICdXYXJuaW5nOiAlcyBub3QgaW5jbHVkZWQ6ICVzICVzJyUobmFtZSwgbW9kdWxlLmdldHR5cGUoKSwgbW9kdWxlKQotCXJldHVybiBwcm9ibGVtcworICAgIHByb2JsZW1zID0gMAorICAgIGZvciBuYW1lLCBtb2R1bGUgaW4gbW9kdWxlX2RpY3QuaXRlbXMoKToKKyAgICAgICAgaWYgbW9kdWxlLmdldHR5cGUoKSBub3QgaW4gKCdidWlsdGluJywgJ21vZHVsZScsICdkeW5hbWljJywgJ3BhY2thZ2UnKToKKyAgICAgICAgICAgIHByb2JsZW1zID0gcHJvYmxlbXMgKyAxCisgICAgICAgICAgICBwcmludCAnV2FybmluZzogJXMgbm90IGluY2x1ZGVkOiAlcyAlcyclKG5hbWUsIG1vZHVsZS5nZXR0eXBlKCksIG1vZHVsZSkKKyAgICByZXR1cm4gcHJvYmxlbXMKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuZXJhdGUucHkgYi9NYWMvVG9vbHMvbWFjZnJlZXplL21hY2dlbmVyYXRlLnB5CmluZGV4IGRmYTIwNDcuLjEyMzQzYzMgMTAwNjQ0Ci0tLSBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjZ2VuZXJhdGUucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNnZW5lcmF0ZS5weQpAQCAtMSw4ICsxLDggQEAKICIiIm1hY2dlbmVyYXRlIC0gR2VuZXJhdGUgdGhlIG91dCBmb3IgbWFjZnJlZXplIiIiCiAKIGRlZiBnZW5lcmF0ZShwcm9ncmFtLCBtb2R1bGVfZGljdCk6Ci0JZm9yIG5hbWUgaW4gbW9kdWxlX2RpY3Qua2V5cygpOgotCQlwcmludCAnSW5jbHVkZSAlLTIwc1x0JyVuYW1lLAotCQltb2R1bGUgPSBtb2R1bGVfZGljdFtuYW1lXQotCQlwcmludCBtb2R1bGUuZ2V0dHlwZSgpLCAnXHQnLCByZXByKG1vZHVsZSkKLQlyZXR1cm4gMAorICAgIGZvciBuYW1lIGluIG1vZHVsZV9kaWN0LmtleXMoKToKKyAgICAgICAgcHJpbnQgJ0luY2x1ZGUgJS0yMHNcdCclbmFtZSwKKyAgICAgICAgbW9kdWxlID0gbW9kdWxlX2RpY3RbbmFtZV0KKyAgICAgICAgcHJpbnQgbW9kdWxlLmdldHR5cGUoKSwgJ1x0JywgcmVwcihtb2R1bGUpCisgICAgcmV0dXJuIDAKZGlmZiAtLWdpdCBhL01hYy9Ub29scy9tYWNmcmVlemUvbWFjbW9kdWxlZmluZGVyLnB5IGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKaW5kZXggMjg1ZjUxZi4uM2Y0ZTBiNyAxMDA2NDQKLS0tIGEvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKKysrIGIvTWFjL1Rvb2xzL21hY2ZyZWV6ZS9tYWNtb2R1bGVmaW5kZXIucHkKQEAgLTcsNDAgKzcsNDAgQEAKIGltcG9ydCBkaXJlY3RpdmVzCiAKIHRyeToKLQkjIFRoaXMgd2lsbCB3b3JrIGlmIHdlIGFyZSBmcm96ZW4gb3Vyc2VsdmVzCi0JaW1wb3J0IG1vZHVsZWZpbmRlcgorICAgICMgVGhpcyB3aWxsIHdvcmsgaWYgd2UgYXJlIGZyb3plbiBvdXJzZWx2ZXMKKyAgICBpbXBvcnQgbW9kdWxlZmluZGVyCiBleGNlcHQgSW1wb3J0RXJyb3I6Ci0JIyBBbmQgdGhpcyB3aWxsIHdvcmsgb3RoZXJ3aXNlCi0JX0ZSRUVaRURJUj1vcy5wYXRoLmpvaW4oc3lzLnByZWZpeCwgJzpUb29sczpmcmVlemUnKQotCXN5cy5wYXRoLmluc2VydCgwLCBfRlJFRVpFRElSKQotCWltcG9ydCBtb2R1bGVmaW5kZXIKKyAgICAjIEFuZCB0aGlzIHdpbGwgd29yayBvdGhlcndpc2UKKyAgICBfRlJFRVpFRElSPW9zLnBhdGguam9pbihzeXMucHJlZml4LCAnOlRvb2xzOmZyZWV6ZScpCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIF9GUkVFWkVESVIpCisgICAgaW1wb3J0IG1vZHVsZWZpbmRlcgogCiAjCiAjIE1vZHVsZXMgdGhhdCBtdXN0IGJlIGluY2x1ZGVkLCBhbmQgbW9kdWxlcyB0aGF0IG5lZWQgbm90IGJlIGluY2x1ZGVkCiAjIChidXQgYXJlIGlmIHRoZXkgYXJlIGZvdW5kKQogIwogTUFDX0lOQ0xVREVfTU9EVUxFUz1bJ3NpdGUnXQotTUFDX01BWU1JU1NfTU9EVUxFUz1bJ3Bvc2l4JywgJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLCAKLQkJJ3dpbjMyYXBpJywgJ2NlJywgJ193aW5yZWcnLAotCQknbnR1cmwycGF0aCcsICdwd2QnLCAnc2l0ZWN1c3RvbWl6ZScsCi0JCSdvcmcucHl0aG9uLmNvcmUnLAotCQkncmlzY29zJywgJ3Jpc2Nvc2Vudmlyb24nLCAncmlzY29zcGF0aCcKLQkJXQorTUFDX01BWU1JU1NfTU9EVUxFUz1bJ3Bvc2l4JywgJ29zMicsICdudCcsICdudHBhdGgnLCAnZG9zJywgJ2Rvc3BhdGgnLAorICAgICAgICAgICAgICAgICd3aW4zMmFwaScsICdjZScsICdfd2lucmVnJywKKyAgICAgICAgICAgICAgICAnbnR1cmwycGF0aCcsICdwd2QnLCAnc2l0ZWN1c3RvbWl6ZScsCisgICAgICAgICAgICAgICAgJ29yZy5weXRob24uY29yZScsCisgICAgICAgICAgICAgICAgJ3Jpc2NvcycsICdyaXNjb3NlbnZpcm9uJywgJ3Jpc2Nvc3BhdGgnCisgICAgICAgICAgICAgICAgXQogCiAjIEFuIGV4Y2VwdGlvbjoKIE1pc3Npbmc9Im1hY21vZHVsZWZpbmRlci5NaXNzaW5nIgogCiBjbGFzcyBNb2R1bGUobW9kdWxlZmluZGVyLk1vZHVsZSk6Ci0JCi0JZGVmIGdldHR5cGUoc2VsZik6Ci0JCSIiIlJldHVybiB0eXBlIG9mIG1vZHVsZSIiIgotCQlpZiBzZWxmLl9fcGF0aF9fOgotCQkJcmV0dXJuICdwYWNrYWdlJwotCQlpZiBzZWxmLl9fY29kZV9fOgotCQkJcmV0dXJuICdtb2R1bGUnCi0JCWlmIHNlbGYuX19maWxlX186Ci0JCQlyZXR1cm4gJ2R5bmFtaWMnCi0JCXJldHVybiAnYnVpbHRpbicKKworICAgIGRlZiBnZXR0eXBlKHNlbGYpOgorICAgICAgICAiIiJSZXR1cm4gdHlwZSBvZiBtb2R1bGUiIiIKKyAgICAgICAgaWYgc2VsZi5fX3BhdGhfXzoKKyAgICAgICAgICAgIHJldHVybiAncGFja2FnZScKKyAgICAgICAgaWYgc2VsZi5fX2NvZGVfXzoKKyAgICAgICAgICAgIHJldHVybiAnbW9kdWxlJworICAgICAgICBpZiBzZWxmLl9fZmlsZV9fOgorICAgICAgICAgICAgcmV0dXJuICdkeW5hbWljJworICAgICAgICByZXR1cm4gJ2J1aWx0aW4nCiAKIGNsYXNzIE1vZHVsZUZpbmRlcihtb2R1bGVmaW5kZXIuTW9kdWxlRmluZGVyKToKIApAQCAtNDksNjQgKzQ5LDY0IEBACiAgICAgICAgICAgICByZXR1cm4gc2VsZi5tb2R1bGVzW2ZxbmFtZV0KICAgICAgICAgc2VsZi5tb2R1bGVzW2ZxbmFtZV0gPSBtID0gTW9kdWxlKGZxbmFtZSkKICAgICAgICAgcmV0dXJuIG0KLSAgICAgICAgCisKIGRlZiBwcm9jZXNzKHByb2dyYW0sIG1vZHVsZXM9Tm9uZSwgbW9kdWxlX2ZpbGVzPU5vbmUsIGRlYnVnPTApOgotCWlmIG1vZHVsZXMgaXMgTm9uZToKLQkJbW9kdWxlcyA9IFtdCi0JaWYgbW9kdWxlX2ZpbGVzIGlzIE5vbmU6Ci0JCW1vZHVsZV9maWxlcyA9IFtdCi0JbWlzc2luZyA9IFtdCi0JIwotCSMgQWRkIHRoZSBzdGFuZGFyZCBtb2R1bGVzIG5lZWRlZCBmb3Igc3RhcnR1cAotCSMKLQltb2R1bGVzID0gbW9kdWxlcyArIE1BQ19JTkNMVURFX01PRFVMRVMKLQkjCi0JIyBzZWFyY2ggdGhlIG1haW4gc291cmNlIGZvciBkaXJlY3RpdmVzCi0JIwotCWV4dHJhX21vZHVsZXMsIGV4Y2x1ZGVfbW9kdWxlcywgb3B0aW9uYWxfbW9kdWxlcywgZXh0cmFfcGF0aCA9IFwKLQkJCWRpcmVjdGl2ZXMuZmluZGZyZWV6ZWRpcmVjdGl2ZXMocHJvZ3JhbSkKLQlmb3IgbSBpbiBleHRyYV9tb2R1bGVzOgotCQlpZiBvcy5zZXAgaW4gbToKLQkJCSMgSXQgaXMgYSBmaWxlCi0JCQltb2R1bGVfZmlsZXMuYXBwZW5kKG0pCi0JCWVsc2U6Ci0JCQltb2R1bGVzLmFwcGVuZChtKQorICAgIGlmIG1vZHVsZXMgaXMgTm9uZToKKyAgICAgICAgbW9kdWxlcyA9IFtdCisgICAgaWYgbW9kdWxlX2ZpbGVzIGlzIE5vbmU6CisgICAgICAgIG1vZHVsZV9maWxlcyA9IFtdCisgICAgbWlzc2luZyA9IFtdCisgICAgIworICAgICMgQWRkIHRoZSBzdGFuZGFyZCBtb2R1bGVzIG5lZWRlZCBmb3Igc3RhcnR1cAorICAgICMKKyAgICBtb2R1bGVzID0gbW9kdWxlcyArIE1BQ19JTkNMVURFX01PRFVMRVMKKyAgICAjCisgICAgIyBzZWFyY2ggdGhlIG1haW4gc291cmNlIGZvciBkaXJlY3RpdmVzCisgICAgIworICAgIGV4dHJhX21vZHVsZXMsIGV4Y2x1ZGVfbW9kdWxlcywgb3B0aW9uYWxfbW9kdWxlcywgZXh0cmFfcGF0aCA9IFwKKyAgICAgICAgICAgICAgICAgICAgZGlyZWN0aXZlcy5maW5kZnJlZXplZGlyZWN0aXZlcyhwcm9ncmFtKQorICAgIGZvciBtIGluIGV4dHJhX21vZHVsZXM6CisgICAgICAgIGlmIG9zLnNlcCBpbiBtOgorICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUKKyAgICAgICAgICAgIG1vZHVsZV9maWxlcy5hcHBlbmQobSkKKyAgICAgICAgZWxzZToKKyAgICAgICAgICAgIG1vZHVsZXMuYXBwZW5kKG0pCiAgICAgIyBjb2xsZWN0IGFsbCBtb2R1bGVzIG9mIHRoZSBwcm9ncmFtCi0JcGF0aCA9IHN5cy5wYXRoWzpdCi0JZGlyID0gb3MucGF0aC5kaXJuYW1lKHByb2dyYW0pCi0JcGF0aFswXSA9IGRpcgkjICJjdXJyZW50IGRpciIKLQlwYXRoID0gZXh0cmFfcGF0aCArIHBhdGgKLQkjCi0JIyBDcmVhdGUgdGhlIG1vZHVsZSBmaW5kZXIgYW5kIGxldCBpdCBkbyBpdHMgd29yawotCSMKLQltb2RmaW5kZXIgPSBNb2R1bGVGaW5kZXIocGF0aCwgCi0JCQlleGNsdWRlcz1leGNsdWRlX21vZHVsZXMsIGRlYnVnPWRlYnVnKQotCWZvciBtIGluIG1vZHVsZXM6Ci0JCW1vZGZpbmRlci5pbXBvcnRfaG9vayhtKQotCWZvciBtIGluIG1vZHVsZV9maWxlczoKLQkJbW9kZmluZGVyLmxvYWRfZmlsZShtKQotCW1vZGZpbmRlci5ydW5fc2NyaXB0KHByb2dyYW0pCi0JbW9kdWxlX2RpY3QgPSBtb2RmaW5kZXIubW9kdWxlcwotCSMKLQkjIFRlbGwgdGhlIHVzZXIgYWJvdXQgbWlzc2luZyBtb2R1bGVzCi0JIwotCW1heW1pc3MgPSBleGNsdWRlX21vZHVsZXMgKyBvcHRpb25hbF9tb2R1bGVzICsgTUFDX01BWU1JU1NfTU9EVUxFUwotCWZvciBtIGluIG1vZGZpbmRlci5iYWRtb2R1bGVzLmtleXMoKToKLQkJaWYgbm90IG0gaW4gbWF5bWlzczoKLQkJCWlmIGRlYnVnID4gMDoKLQkJCQlwcmludCAnTWlzc2luZycsIG0KLQkJCW1pc3NpbmcuYXBwZW5kKG0pCi0JIwotCSMgV2FybiB0aGUgdXNlciBhYm91dCB1bnVzZWQgYnVpbHRpbnMKLQkjCi0JZm9yIG0gaW4gc3lzLmJ1aWx0aW5fbW9kdWxlX25hbWVzOgotCQlpZiBtIGluICgnX19tYWluX18nLCAnX19idWlsdGluX18nKToKLQkJCXBhc3MKLQkJZWxpZiBub3QgbW9kdWxlX2RpY3QuaGFzX2tleShtKToKLQkJCWlmIGRlYnVnID4gMDoKLQkJCQlwcmludCAnVW51c2VkJywgbQotCQllbGlmIG1vZHVsZV9kaWN0W21dLmdldHR5cGUoKSAhPSAnYnVpbHRpbic6Ci0JCQkjIFhYWFggQ2FuIHRoaXMgaGFwcGVuPwotCQkJaWYgZGVidWcgPiAwOgotCQkJCXByaW50ICdDb25mbGljdCcsIG0KLQlyZXR1cm4gbW9kdWxlX2RpY3QsIG1pc3NpbmcKKyAgICBwYXRoID0gc3lzLnBhdGhbOl0KKyAgICBkaXIgPSBvcy5wYXRoLmRpcm5hbWUocHJvZ3JhbSkKKyAgICBwYXRoWzBdID0gZGlyICAgIyAiY3VycmVudCBkaXIiCisgICAgcGF0aCA9IGV4dHJhX3BhdGggKyBwYXRoCisgICAgIworICAgICMgQ3JlYXRlIHRoZSBtb2R1bGUgZmluZGVyIGFuZCBsZXQgaXQgZG8gaXRzIHdvcmsKKyAgICAjCisgICAgbW9kZmluZGVyID0gTW9kdWxlRmluZGVyKHBhdGgsCisgICAgICAgICAgICAgICAgICAgIGV4Y2x1ZGVzPWV4Y2x1ZGVfbW9kdWxlcywgZGVidWc9ZGVidWcpCisgICAgZm9yIG0gaW4gbW9kdWxlczoKKyAgICAgICAgbW9kZmluZGVyLmltcG9ydF9ob29rKG0pCisgICAgZm9yIG0gaW4gbW9kdWxlX2ZpbGVzOgorICAgICAgICBtb2RmaW5kZXIubG9hZF9maWxlKG0pCisgICAgbW9kZmluZGVyLnJ1bl9zY3JpcHQocHJvZ3JhbSkKKyAgICBtb2R1bGVfZGljdCA9IG1vZGZpbmRlci5tb2R1bGVzCisgICAgIworICAgICMgVGVsbCB0aGUgdXNlciBhYm91dCBtaXNzaW5nIG1vZHVsZXMKKyAgICAjCisgICAgbWF5bWlzcyA9IGV4Y2x1ZGVfbW9kdWxlcyArIG9wdGlvbmFsX21vZHVsZXMgKyBNQUNfTUFZTUlTU19NT0RVTEVTCisgICAgZm9yIG0gaW4gbW9kZmluZGVyLmJhZG1vZHVsZXMua2V5cygpOgorICAgICAgICBpZiBub3QgbSBpbiBtYXltaXNzOgorICAgICAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgICAgIHByaW50ICdNaXNzaW5nJywgbQorICAgICAgICAgICAgbWlzc2luZy5hcHBlbmQobSkKKyAgICAjCisgICAgIyBXYXJuIHRoZSB1c2VyIGFib3V0IHVudXNlZCBidWlsdGlucworICAgICMKKyAgICBmb3IgbSBpbiBzeXMuYnVpbHRpbl9tb2R1bGVfbmFtZXM6CisgICAgICAgIGlmIG0gaW4gKCdfX21haW5fXycsICdfX2J1aWx0aW5fXycpOgorICAgICAgICAgICAgcGFzcworICAgICAgICBlbGlmIG5vdCBtb2R1bGVfZGljdC5oYXNfa2V5KG0pOgorICAgICAgICAgICAgaWYgZGVidWcgPiAwOgorICAgICAgICAgICAgICAgIHByaW50ICdVbnVzZWQnLCBtCisgICAgICAgIGVsaWYgbW9kdWxlX2RpY3RbbV0uZ2V0dHlwZSgpICE9ICdidWlsdGluJzoKKyAgICAgICAgICAgICMgWFhYWCBDYW4gdGhpcyBoYXBwZW4/CisgICAgICAgICAgICBpZiBkZWJ1ZyA+IDA6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0NvbmZsaWN0JywgbQorICAgIHJldHVybiBtb2R1bGVfZGljdCwgbWlzc2luZwpkaWZmIC0tZ2l0IGEvTWFjL3NjcmlwdHMvQnVpbGRBcHBsZXQucHkgYi9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQppbmRleCBlOTU0ODU0Li5jYjJhZWQ4IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQorKysgYi9NYWMvc2NyaXB0cy9CdWlsZEFwcGxldC5weQpAQCAtMTcsMTE3ICsxNywxMTcgQEAKIGltcG9ydCBnZXRvcHQKIAogZGVmIG1haW4oKToKLQl0cnk6Ci0JCWJ1aWxkYXBwbGV0KCkKLQlleGNlcHQgYnVpbGR0b29scy5CdWlsZEVycm9yLCBkZXRhaWw6Ci0JCUVhc3lEaWFsb2dzLk1lc3NhZ2UoZGV0YWlsKQorICAgIHRyeToKKyAgICAgICAgYnVpbGRhcHBsZXQoKQorICAgIGV4Y2VwdCBidWlsZHRvb2xzLkJ1aWxkRXJyb3IsIGRldGFpbDoKKyAgICAgICAgRWFzeURpYWxvZ3MuTWVzc2FnZShkZXRhaWwpCiAKIAogZGVmIGJ1aWxkYXBwbGV0KCk6Ci0JYnVpbGR0b29scy5ERUJVRz0xCi0JCi0JIyBGaW5kIHRoZSB0ZW1wbGF0ZQotCSMgKHRoZXJlJ3Mgbm8gcG9pbnQgaW4gcHJvY2VlZGluZyBpZiB3ZSBjYW4ndCBmaW5kIGl0KQotCQotCXRlbXBsYXRlID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQotCQotCSMgQXNrIGZvciBzb3VyY2UgdGV4dCBpZiBub3Qgc3BlY2lmaWVkIGluIHN5cy5hcmd2WzE6XQotCQotCWlmIG5vdCBzeXMuYXJndlsxOl06Ci0JCWZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0nU2VsZWN0IFB5dGhvbiBzb3VyY2Ugb3IgYXBwbGV0OicsIAotCQkJdHlwZUxpc3Q9KCdURVhUJywgJ0FQUEwnKSkKLQkJaWYgbm90IGZpbGVuYW1lOgotCQkJcmV0dXJuCi0JCXRwLCB0ZiA9IG9zLnBhdGguc3BsaXQoZmlsZW5hbWUpCi0JCWlmIHRmWy0zOl0gPT0gJy5weSc6Ci0JCQl0ZiA9IHRmWzotM10KLQkJZWxzZToKLQkJCXRmID0gdGYgKyAnLmFwcGxldCcKLQkJZHN0ZmlsZW5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSdTYXZlIGFwcGxpY2F0aW9uIGFzOicsIAotCQkJc2F2ZWRGaWxlTmFtZT10ZikKLQkJaWYgbm90IGRzdGZpbGVuYW1lOiByZXR1cm4KLQkJY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoZmlsZW5hbWUpCi0JCWlmIHRwID09ICdBUFBMJzoKLQkJCWJ1aWxkdG9vbHMudXBkYXRlKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUpCi0JCWVsc2U6Ci0JCQlidWlsZHRvb2xzLnByb2Nlc3ModGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSwgMSkKLQllbHNlOgotCQkKLQkJU0hPUlRPUFRTID0gIm86cjpuZTp2P1AiCi0JCUxPTkdPUFRTPSgib3V0cHV0PSIsICJyZXNvdXJjZT0iLCAibm9hcmd2IiwgImV4dHJhPSIsICJ2ZXJib3NlIiwgImhlbHAiLCAicHl0aG9uPSIpCi0JCXRyeToKLQkJCW9wdGlvbnMsIGFyZ3MgPSBnZXRvcHQuZ2V0b3B0KHN5cy5hcmd2WzE6XSwgU0hPUlRPUFRTLCBMT05HT1BUUykKLQkJZXhjZXB0IGdldG9wdC5lcnJvcjoKLQkJCXVzYWdlKCkKLQkJaWYgb3B0aW9ucyBhbmQgbGVuKGFyZ3MpID4gMToKLQkJCXN5cy5zdGRlcnIud3JpdGUoIkNhbm5vdCB1c2Ugb3B0aW9ucyB3aGVuIHNwZWNpZnlpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMiKQotCQkJc3lzLmV4aXQoMSkKLQkJZHN0ZmlsZW5hbWUgPSBOb25lCi0JCXJzcmNmaWxlbmFtZSA9IE5vbmUKLQkJcmF3ID0gMAotCQlleHRyYXMgPSBbXQotCQl2ZXJib3NlID0gTm9uZQotCQlmb3Igb3B0LCBhcmcgaW4gb3B0aW9uczoKLQkJCWlmIG9wdCBpbiAoJy1vJywgJy0tb3V0cHV0Jyk6Ci0JCQkJZHN0ZmlsZW5hbWUgPSBhcmcKLQkJCWVsaWYgb3B0IGluICgnLXInLCAnLS1yZXNvdXJjZScpOgotCQkJCXJzcmNmaWxlbmFtZSA9IGFyZwotCQkJZWxpZiBvcHQgaW4gKCctbicsICctLW5vYXJndicpOgotCQkJCXJhdyA9IDEKLQkJCWVsaWYgb3B0IGluICgnLWUnLCAnLS1leHRyYScpOgotCQkJCWlmICc6JyBpbiBhcmc6Ci0JCQkJCWFyZyA9IGFyZy5zcGxpdCgnOicpCi0JCQkJZXh0cmFzLmFwcGVuZChhcmcpCi0JCQllbGlmIG9wdCBpbiAoJy1QJywgJy0tcHl0aG9uJyk6Ci0JCQkJIyBUaGlzIGlzIGEgdmVyeSBkaXJ0eSB0cmljay4gV2Ugc2V0IHN5cy5leGVjdXRhYmxlCi0JCQkJIyBzbyB0aGF0IGJ1bmRsZWJ1aWxkZXIgd2lsbCB1c2UgdGhpcyBpbiB0aGUgIyEgbGluZQotCQkJCSMgZm9yIHRoZSBhcHBsZXQgYm9vdHN0cmFwLgotCQkJCXN5cy5leGVjdXRhYmxlID0gYXJnCi0JCQllbGlmIG9wdCBpbiAoJy12JywgJy0tdmVyYm9zZScpOgotCQkJCXZlcmJvc2UgPSBWZXJib3NlKCkKLQkJCWVsaWYgb3B0IGluICgnLT8nLCAnLS1oZWxwJyk6Ci0JCQkJdXNhZ2UoKQotCQkjIE9uIE9TOSBhbHdheXMgYmUgdmVyYm9zZQotCQlpZiBzeXMucGxhdGZvcm0gPT0gJ21hYycgYW5kIG5vdCB2ZXJib3NlOgotCQkJdmVyYm9zZSA9ICdkZWZhdWx0JwotCQkjIExvb3Agb3ZlciBhbGwgZmlsZXMgdG8gYmUgcHJvY2Vzc2VkCi0JCWZvciBmaWxlbmFtZSBpbiBhcmdzOgotCQkJY3IsIHRwID0gTWFjT1MuR2V0Q3JlYXRvckFuZFR5cGUoZmlsZW5hbWUpCi0JCQlpZiB0cCA9PSAnQVBQTCc6Ci0JCQkJYnVpbGR0b29scy51cGRhdGUodGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSkKLQkJCWVsc2U6Ci0JCQkJYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUsIDEsCi0JCQkJCXJzcmNuYW1lPXJzcmNmaWxlbmFtZSwgb3RoZXJzPWV4dHJhcywgcmF3PXJhdywgcHJvZ3Jlc3M9dmVyYm9zZSkKKyAgICBidWlsZHRvb2xzLkRFQlVHPTEKKworICAgICMgRmluZCB0aGUgdGVtcGxhdGUKKyAgICAjICh0aGVyZSdzIG5vIHBvaW50IGluIHByb2NlZWRpbmcgaWYgd2UgY2FuJ3QgZmluZCBpdCkKKworICAgIHRlbXBsYXRlID0gYnVpbGR0b29scy5maW5kdGVtcGxhdGUoKQorCisgICAgIyBBc2sgZm9yIHNvdXJjZSB0ZXh0IGlmIG5vdCBzcGVjaWZpZWQgaW4gc3lzLmFyZ3ZbMTpdCisKKyAgICBpZiBub3Qgc3lzLmFyZ3ZbMTpdOgorICAgICAgICBmaWxlbmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9J1NlbGVjdCBQeXRob24gc291cmNlIG9yIGFwcGxldDonLAorICAgICAgICAgICAgICAgIHR5cGVMaXN0PSgnVEVYVCcsICdBUFBMJykpCisgICAgICAgIGlmIG5vdCBmaWxlbmFtZToKKyAgICAgICAgICAgIHJldHVybgorICAgICAgICB0cCwgdGYgPSBvcy5wYXRoLnNwbGl0KGZpbGVuYW1lKQorICAgICAgICBpZiB0ZlstMzpdID09ICcucHknOgorICAgICAgICAgICAgdGYgPSB0Zls6LTNdCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICB0ZiA9IHRmICsgJy5hcHBsZXQnCisgICAgICAgIGRzdGZpbGVuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0nU2F2ZSBhcHBsaWNhdGlvbiBhczonLAorICAgICAgICAgICAgICAgIHNhdmVkRmlsZU5hbWU9dGYpCisgICAgICAgIGlmIG5vdCBkc3RmaWxlbmFtZTogcmV0dXJuCisgICAgICAgIGNyLCB0cCA9IE1hY09TLkdldENyZWF0b3JBbmRUeXBlKGZpbGVuYW1lKQorICAgICAgICBpZiB0cCA9PSAnQVBQTCc6CisgICAgICAgICAgICBidWlsZHRvb2xzLnVwZGF0ZSh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRzdGZpbGVuYW1lKQorICAgICAgICBlbHNlOgorICAgICAgICAgICAgYnVpbGR0b29scy5wcm9jZXNzKHRlbXBsYXRlLCBmaWxlbmFtZSwgZHN0ZmlsZW5hbWUsIDEpCisgICAgZWxzZToKKworICAgICAgICBTSE9SVE9QVFMgPSAibzpyOm5lOnY/UCIKKyAgICAgICAgTE9OR09QVFM9KCJvdXRwdXQ9IiwgInJlc291cmNlPSIsICJub2FyZ3YiLCAiZXh0cmE9IiwgInZlcmJvc2UiLCAiaGVscCIsICJweXRob249IikKKyAgICAgICAgdHJ5OgorICAgICAgICAgICAgb3B0aW9ucywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCBTSE9SVE9QVFMsIExPTkdPUFRTKQorICAgICAgICBleGNlcHQgZ2V0b3B0LmVycm9yOgorICAgICAgICAgICAgdXNhZ2UoKQorICAgICAgICBpZiBvcHRpb25zIGFuZCBsZW4oYXJncykgPiAxOgorICAgICAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2Fubm90IHVzZSBvcHRpb25zIHdoZW4gc3BlY2lmeWluZyBtdWx0aXBsZSBpbnB1dCBmaWxlcyIpCisgICAgICAgICAgICBzeXMuZXhpdCgxKQorICAgICAgICBkc3RmaWxlbmFtZSA9IE5vbmUKKyAgICAgICAgcnNyY2ZpbGVuYW1lID0gTm9uZQorICAgICAgICByYXcgPSAwCisgICAgICAgIGV4dHJhcyA9IFtdCisgICAgICAgIHZlcmJvc2UgPSBOb25lCisgICAgICAgIGZvciBvcHQsIGFyZyBpbiBvcHRpb25zOgorICAgICAgICAgICAgaWYgb3B0IGluICgnLW8nLCAnLS1vdXRwdXQnKToKKyAgICAgICAgICAgICAgICBkc3RmaWxlbmFtZSA9IGFyZworICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctcicsICctLXJlc291cmNlJyk6CisgICAgICAgICAgICAgICAgcnNyY2ZpbGVuYW1lID0gYXJnCisgICAgICAgICAgICBlbGlmIG9wdCBpbiAoJy1uJywgJy0tbm9hcmd2Jyk6CisgICAgICAgICAgICAgICAgcmF3ID0gMQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctZScsICctLWV4dHJhJyk6CisgICAgICAgICAgICAgICAgaWYgJzonIGluIGFyZzoKKyAgICAgICAgICAgICAgICAgICAgYXJnID0gYXJnLnNwbGl0KCc6JykKKyAgICAgICAgICAgICAgICBleHRyYXMuYXBwZW5kKGFyZykKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgnLVAnLCAnLS1weXRob24nKToKKyAgICAgICAgICAgICAgICAjIFRoaXMgaXMgYSB2ZXJ5IGRpcnR5IHRyaWNrLiBXZSBzZXQgc3lzLmV4ZWN1dGFibGUKKyAgICAgICAgICAgICAgICAjIHNvIHRoYXQgYnVuZGxlYnVpbGRlciB3aWxsIHVzZSB0aGlzIGluIHRoZSAjISBsaW5lCisgICAgICAgICAgICAgICAgIyBmb3IgdGhlIGFwcGxldCBib290c3RyYXAuCisgICAgICAgICAgICAgICAgc3lzLmV4ZWN1dGFibGUgPSBhcmcKKyAgICAgICAgICAgIGVsaWYgb3B0IGluICgnLXYnLCAnLS12ZXJib3NlJyk6CisgICAgICAgICAgICAgICAgdmVyYm9zZSA9IFZlcmJvc2UoKQorICAgICAgICAgICAgZWxpZiBvcHQgaW4gKCctPycsICctLWhlbHAnKToKKyAgICAgICAgICAgICAgICB1c2FnZSgpCisgICAgICAgICMgT24gT1M5IGFsd2F5cyBiZSB2ZXJib3NlCisgICAgICAgIGlmIHN5cy5wbGF0Zm9ybSA9PSAnbWFjJyBhbmQgbm90IHZlcmJvc2U6CisgICAgICAgICAgICB2ZXJib3NlID0gJ2RlZmF1bHQnCisgICAgICAgICMgTG9vcCBvdmVyIGFsbCBmaWxlcyB0byBiZSBwcm9jZXNzZWQKKyAgICAgICAgZm9yIGZpbGVuYW1lIGluIGFyZ3M6CisgICAgICAgICAgICBjciwgdHAgPSBNYWNPUy5HZXRDcmVhdG9yQW5kVHlwZShmaWxlbmFtZSkKKyAgICAgICAgICAgIGlmIHRwID09ICdBUFBMJzoKKyAgICAgICAgICAgICAgICBidWlsZHRvb2xzLnVwZGF0ZSh0ZW1wbGF0ZSwgZmlsZW5hbWUsIGRzdGZpbGVuYW1lKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICBidWlsZHRvb2xzLnByb2Nlc3ModGVtcGxhdGUsIGZpbGVuYW1lLCBkc3RmaWxlbmFtZSwgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHJzcmNuYW1lPXJzcmNmaWxlbmFtZSwgb3RoZXJzPWV4dHJhcywgcmF3PXJhdywgcHJvZ3Jlc3M9dmVyYm9zZSkKIAogZGVmIHVzYWdlKCk6Ci0JcHJpbnQgIkJ1aWxkQXBwbGV0IGNyZWF0ZXMgYW4gYXBwbGljYXRpb24gZnJvbSBhIFB5dGhvbiBzb3VyY2UgZmlsZSIKLQlwcmludCAiVXNhZ2U6IgotCXByaW50ICIgIEJ1aWxkQXBwbGV0ICAgICBpbnRlcmFjdGl2ZSwgc2luZ2xlIGZpbGUsIG5vIG9wdGlvbnMiCi0JcHJpbnQgIiAgQnVpbGRBcHBsZXQgc3JjMS5weSBzcmMyLnB5IC4uLiAgIG5vbi1pbnRlcmFjdGl2ZSBtdWx0aXBsZSBmaWxlIgotCXByaW50ICIgIEJ1aWxkQXBwbGV0IFtvcHRpb25zXSBzcmMucHkgICAgbm9uLWludGVyYWN0aXZlIHNpbmdsZSBmaWxlIgotCXByaW50ICJPcHRpb25zOiIKLQlwcmludCAiICAtLW91dHB1dCBvICAgICAgICBPdXRwdXQgZmlsZTsgZGVmYXVsdCBiYXNlZCBvbiBzb3VyY2UgZmlsZW5hbWUsIHNob3J0IC1vIgotCXByaW50ICIgIC0tcmVzb3VyY2UgciAgICAgIFJlc291cmNlIGZpbGU7IGRlZmF1bHQgYmFzZWQgb24gc291cmNlIGZpbGVuYW1lLCBzaG9ydCAtciIKLQlwcmludCAiICAtLW5vYXJndiAgICAgICAgICBCdWlsZCBhcHBsZXQgd2l0aG91dCBkcmFnLWFuZC1kcm9wIHN5cy5hcmd2IGVtdWxhdGlvbiwgc2hvcnQgLW4sIE9TWCBvbmx5IgotCXByaW50ICIgIC0tZXh0cmEgc3JjWzpkc3RdIEV4dHJhIGZpbGUgdG8gcHV0IGluIC5hcHAgYnVuZGxlLCBzaG9ydCAtZSwgT1NYIG9ubHkiCi0JcHJpbnQgIiAgLS12ZXJib3NlICAgICAgICAgVmVyYm9zZSwgc2hvcnQgLXYiCi0JcHJpbnQgIiAgLS1oZWxwICAgICAgICAgICAgVGhpcyBtZXNzYWdlLCBzaG9ydCAtPyIKLQlzeXMuZXhpdCgxKQorICAgIHByaW50ICJCdWlsZEFwcGxldCBjcmVhdGVzIGFuIGFwcGxpY2F0aW9uIGZyb20gYSBQeXRob24gc291cmNlIGZpbGUiCisgICAgcHJpbnQgIlVzYWdlOiIKKyAgICBwcmludCAiICBCdWlsZEFwcGxldCAgICAgaW50ZXJhY3RpdmUsIHNpbmdsZSBmaWxlLCBubyBvcHRpb25zIgorICAgIHByaW50ICIgIEJ1aWxkQXBwbGV0IHNyYzEucHkgc3JjMi5weSAuLi4gICBub24taW50ZXJhY3RpdmUgbXVsdGlwbGUgZmlsZSIKKyAgICBwcmludCAiICBCdWlsZEFwcGxldCBbb3B0aW9uc10gc3JjLnB5ICAgIG5vbi1pbnRlcmFjdGl2ZSBzaW5nbGUgZmlsZSIKKyAgICBwcmludCAiT3B0aW9uczoiCisgICAgcHJpbnQgIiAgLS1vdXRwdXQgbyAgICAgICAgT3V0cHV0IGZpbGU7IGRlZmF1bHQgYmFzZWQgb24gc291cmNlIGZpbGVuYW1lLCBzaG9ydCAtbyIKKyAgICBwcmludCAiICAtLXJlc291cmNlIHIgICAgICBSZXNvdXJjZSBmaWxlOyBkZWZhdWx0IGJhc2VkIG9uIHNvdXJjZSBmaWxlbmFtZSwgc2hvcnQgLXIiCisgICAgcHJpbnQgIiAgLS1ub2FyZ3YgICAgICAgICAgQnVpbGQgYXBwbGV0IHdpdGhvdXQgZHJhZy1hbmQtZHJvcCBzeXMuYXJndiBlbXVsYXRpb24sIHNob3J0IC1uLCBPU1ggb25seSIKKyAgICBwcmludCAiICAtLWV4dHJhIHNyY1s6ZHN0XSBFeHRyYSBmaWxlIHRvIHB1dCBpbiAuYXBwIGJ1bmRsZSwgc2hvcnQgLWUsIE9TWCBvbmx5IgorICAgIHByaW50ICIgIC0tdmVyYm9zZSAgICAgICAgIFZlcmJvc2UsIHNob3J0IC12IgorICAgIHByaW50ICIgIC0taGVscCAgICAgICAgICAgIFRoaXMgbWVzc2FnZSwgc2hvcnQgLT8iCisgICAgc3lzLmV4aXQoMSkKIAogY2xhc3MgVmVyYm9zZToKLQkiIiJUaGlzIGNsYXNzIG1pbWljcyBFYXN5RGlhbG9ncy5Qcm9ncmVzc0JhciBidXQgcHJpbnRzIHRvIHN0ZGVyciIiIgotCWRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0JCWlmIGFyZ3MgYW5kIGFyZ3NbMF06Ci0JCQlzZWxmLmxhYmVsKGFyZ3NbMF0pCi0JCQotCWRlZiBzZXQoc2VsZiwgKmFyZ3MpOgotCQlwYXNzCi0JCQotCWRlZiBpbmMoc2VsZiwgKmFyZ3MpOgotCQlwYXNzCi0JCQotCWRlZiBsYWJlbChzZWxmLCBzdHIpOgotCQlzeXMuc3RkZXJyLndyaXRlKHN0cisnXG4nKQorICAgICIiIlRoaXMgY2xhc3MgbWltaWNzIEVhc3lEaWFsb2dzLlByb2dyZXNzQmFyIGJ1dCBwcmludHMgdG8gc3RkZXJyIiIiCisgICAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKKyAgICAgICAgaWYgYXJncyBhbmQgYXJnc1swXToKKyAgICAgICAgICAgIHNlbGYubGFiZWwoYXJnc1swXSkKKworICAgIGRlZiBzZXQoc2VsZiwgKmFyZ3MpOgorICAgICAgICBwYXNzCisKKyAgICBkZWYgaW5jKHNlbGYsICphcmdzKToKKyAgICAgICAgcGFzcworCisgICAgZGVmIGxhYmVsKHNlbGYsIHN0cik6CisgICAgICAgIHN5cy5zdGRlcnIud3JpdGUoc3RyKydcbicpCiAKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9iZ2VuYWxsLnB5IGIvTWFjL3NjcmlwdHMvYmdlbmFsbC5weQppbmRleCA2NDkwMjY1Li4xZmU1ZjM0IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9iZ2VuYWxsLnB5CisrKyBiL01hYy9zY3JpcHRzL2JnZW5hbGwucHkKQEAgLTUsNTIgKzUsNTIgQEAKIGltcG9ydCBzdHJpbmcKIAogZGVmIGJnZW5vbmUoZGlybmFtZSwgc2hvcnRuYW1lKToKLQlvcy5jaGRpcihkaXJuYW1lKQotCXByaW50ICclczonJXNob3J0bmFtZQotCSMgU2lnaCwgd2UgZG9uJ3Qgd2FudCB0byBsb3NlIENWUyBoaXN0b3J5LCBzbyB0d28KLQkjIG1vZHVsZXMgaGF2ZSBmdW5ueSBuYW1lczoKLQlpZiBzaG9ydG5hbWUgPT0gJ2NhcmJvbmV2dCc6Ci0JCW1vZHVsZW5hbWUgPSAnQ2FyYm9uRXZ0c2NhbicKLQllbGlmIHNob3J0bmFtZSA9PSAnaWJjYXJib24nOgotCQltb2R1bGVuYW1lID0gJ0lCQ2FyYm9uc2NhbicKLQllbHNlOgotCQltb2R1bGVuYW1lID0gc2hvcnRuYW1lICsgJ3NjYW4nCi0JdHJ5OgotCQltID0gX19pbXBvcnRfXyhtb2R1bGVuYW1lKQotCWV4Y2VwdDoKLQkJcHJpbnQgIkVycm9yOiIsIHNob3J0bmFtZSwgc3lzLmV4Y19pbmZvKClbMV0KLQkJcmV0dXJuIDAKLQl0cnk6Ci0JCW0ubWFpbigpCi0JZXhjZXB0OgotCQlwcmludCAiRXJyb3I6Iiwgc2hvcnRuYW1lLCBzeXMuZXhjX2luZm8oKVsxXQotCQlyZXR1cm4gMAotCXJldHVybiAxCi0JCisgICAgb3MuY2hkaXIoZGlybmFtZSkKKyAgICBwcmludCAnJXM6JyVzaG9ydG5hbWUKKyAgICAjIFNpZ2gsIHdlIGRvbid0IHdhbnQgdG8gbG9zZSBDVlMgaGlzdG9yeSwgc28gdHdvCisgICAgIyBtb2R1bGVzIGhhdmUgZnVubnkgbmFtZXM6CisgICAgaWYgc2hvcnRuYW1lID09ICdjYXJib25ldnQnOgorICAgICAgICBtb2R1bGVuYW1lID0gJ0NhcmJvbkV2dHNjYW4nCisgICAgZWxpZiBzaG9ydG5hbWUgPT0gJ2liY2FyYm9uJzoKKyAgICAgICAgbW9kdWxlbmFtZSA9ICdJQkNhcmJvbnNjYW4nCisgICAgZWxzZToKKyAgICAgICAgbW9kdWxlbmFtZSA9IHNob3J0bmFtZSArICdzY2FuJworICAgIHRyeToKKyAgICAgICAgbSA9IF9faW1wb3J0X18obW9kdWxlbmFtZSkKKyAgICBleGNlcHQ6CisgICAgICAgIHByaW50ICJFcnJvcjoiLCBzaG9ydG5hbWUsIHN5cy5leGNfaW5mbygpWzFdCisgICAgICAgIHJldHVybiAwCisgICAgdHJ5OgorICAgICAgICBtLm1haW4oKQorICAgIGV4Y2VwdDoKKyAgICAgICAgcHJpbnQgIkVycm9yOiIsIHNob3J0bmFtZSwgc3lzLmV4Y19pbmZvKClbMV0KKyAgICAgICAgcmV0dXJuIDAKKyAgICByZXR1cm4gMQorCiBkZWYgbWFpbigpOgotCXN1Y2Nlc3MgPSBbXQotCWZhaWx1cmUgPSBbXQotCXN5cy5wYXRoLmluc2VydCgwLCBvcy5jdXJkaXIpCi0JaWYgbGVuKHN5cy5hcmd2KSA+IDE6Ci0JCXNyY2RpciA9IHN5cy5hcmd2WzFdCi0JZWxzZToKLQkJc3JjZGlyID0gb3MucGF0aC5qb2luKG9zLnBhdGguam9pbihzeXMucHJlZml4LCAnTWFjJyksICdNb2R1bGVzJykKLQlzcmNkaXIgPSBvcy5wYXRoLmFic3BhdGgoc3JjZGlyKQotCWNvbnRlbnRzID0gb3MubGlzdGRpcihzcmNkaXIpCi0JZm9yIG5hbWUgaW4gY29udGVudHM6Ci0JCW1vZHVsZWRpciA9IG9zLnBhdGguam9pbihzcmNkaXIsIG5hbWUpCi0JCXNjYW5tb2R1bGUgPSBvcy5wYXRoLmpvaW4obW9kdWxlZGlyLCBuYW1lICsnc2Nhbi5weScpCi0JCWlmIG9zLnBhdGguZXhpc3RzKHNjYW5tb2R1bGUpOgotCQkJaWYgYmdlbm9uZShtb2R1bGVkaXIsIG5hbWUpOgotCQkJCXN1Y2Nlc3MuYXBwZW5kKG5hbWUpCi0JCQllbHNlOgotCQkJCWZhaWx1cmUuYXBwZW5kKG5hbWUpCi0JcHJpbnQgJ0RvbmU6Jywgc3RyaW5nLmpvaW4oc3VjY2VzcywgJyAnKQotCWlmIGZhaWx1cmU6Ci0JCXByaW50ICdGYWlsZWQ6Jywgc3RyaW5nLmpvaW4oZmFpbHVyZSwgJyAnKQotCQlyZXR1cm4gMAotCXJldHVybiAxCi0JCisgICAgc3VjY2VzcyA9IFtdCisgICAgZmFpbHVyZSA9IFtdCisgICAgc3lzLnBhdGguaW5zZXJ0KDAsIG9zLmN1cmRpcikKKyAgICBpZiBsZW4oc3lzLmFyZ3YpID4gMToKKyAgICAgICAgc3JjZGlyID0gc3lzLmFyZ3ZbMV0KKyAgICBlbHNlOgorICAgICAgICBzcmNkaXIgPSBvcy5wYXRoLmpvaW4ob3MucGF0aC5qb2luKHN5cy5wcmVmaXgsICdNYWMnKSwgJ01vZHVsZXMnKQorICAgIHNyY2RpciA9IG9zLnBhdGguYWJzcGF0aChzcmNkaXIpCisgICAgY29udGVudHMgPSBvcy5saXN0ZGlyKHNyY2RpcikKKyAgICBmb3IgbmFtZSBpbiBjb250ZW50czoKKyAgICAgICAgbW9kdWxlZGlyID0gb3MucGF0aC5qb2luKHNyY2RpciwgbmFtZSkKKyAgICAgICAgc2Nhbm1vZHVsZSA9IG9zLnBhdGguam9pbihtb2R1bGVkaXIsIG5hbWUgKydzY2FuLnB5JykKKyAgICAgICAgaWYgb3MucGF0aC5leGlzdHMoc2Nhbm1vZHVsZSk6CisgICAgICAgICAgICBpZiBiZ2Vub25lKG1vZHVsZWRpciwgbmFtZSk6CisgICAgICAgICAgICAgICAgc3VjY2Vzcy5hcHBlbmQobmFtZSkKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgZmFpbHVyZS5hcHBlbmQobmFtZSkKKyAgICBwcmludCAnRG9uZTonLCBzdHJpbmcuam9pbihzdWNjZXNzLCAnICcpCisgICAgaWYgZmFpbHVyZToKKyAgICAgICAgcHJpbnQgJ0ZhaWxlZDonLCBzdHJpbmcuam9pbihmYWlsdXJlLCAnICcpCisgICAgICAgIHJldHVybiAwCisgICAgcmV0dXJuIDEKKwogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLQlydiA9IG1haW4oKQotCXN5cy5leGl0KG5vdCBydikKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCisgICAgcnYgPSBtYWluKCkKKyAgICBzeXMuZXhpdChub3QgcnYpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy9idWlsZHBrZy5weSBiL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CmluZGV4IGE5YzcwYzEuLjdmNjM1YTAgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CisrKyBiL01hYy9zY3JpcHRzL2J1aWxkcGtnLnB5CkBAIC0zLDM0ICszLDM0IEBACiAiIiJidWlsZHBrZy5weSAtLSBCdWlsZCBPUyBYIHBhY2thZ2VzIGZvciBBcHBsZSdzIEluc3RhbGxlci5hcHAuCiAKIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGNvbW1hbmQtbGluZSB0b29sIGZvciBidWlsZGluZyBwYWNrYWdlcyB0byBiZQotaW5zdGFsbGVkIHdpdGggdGhlIE1hYyBPUyBYIEluc3RhbGxlci5hcHAgYXBwbGljYXRpb24uIAoraW5zdGFsbGVkIHdpdGggdGhlIE1hYyBPUyBYIEluc3RhbGxlci5hcHAgYXBwbGljYXRpb24uCiAKLUl0IGlzIG11Y2ggaW5zcGlyZWQgYnkgQXBwbGUncyBHVUkgdG9vbCBjYWxsZWQgUGFja2FnZU1ha2VyLmFwcCwgdGhhdCAKLXNlZW1zIHRvIGJlIHBhcnQgb2YgdGhlIE9TIFggZGV2ZWxvcGVyIHRvb2xzIGluc3RhbGxlZCBpbiB0aGUgZm9sZGVyIAotL0RldmVsb3Blci9BcHBsaWNhdGlvbnMuIEJ1dCBhcHBhcmVudGx5IHRoZXJlIGFyZSBvdGhlciBmcmVlIHRvb2xzIHRvIAotZG8gdGhlIHNhbWUgdGhpbmcgd2hpY2ggYXJlIGFsc28gbmFtZWQgUGFja2FnZU1ha2VyIGxpa2UgQnJpYW4gSGlsbCdzIAotb25lOiAKK0l0IGlzIG11Y2ggaW5zcGlyZWQgYnkgQXBwbGUncyBHVUkgdG9vbCBjYWxsZWQgUGFja2FnZU1ha2VyLmFwcCwgdGhhdAorc2VlbXMgdG8gYmUgcGFydCBvZiB0aGUgT1MgWCBkZXZlbG9wZXIgdG9vbHMgaW5zdGFsbGVkIGluIHRoZSBmb2xkZXIKKy9EZXZlbG9wZXIvQXBwbGljYXRpb25zLiBCdXQgYXBwYXJlbnRseSB0aGVyZSBhcmUgb3RoZXIgZnJlZSB0b29scyB0bworZG8gdGhlIHNhbWUgdGhpbmcgd2hpY2ggYXJlIGFsc28gbmFtZWQgUGFja2FnZU1ha2VyIGxpa2UgQnJpYW4gSGlsbCdzCitvbmU6CiAKICAgaHR0cDovL3BlcnNvbmFscGFnZXMudGRzLm5ldC9+YnJpYW5faGlsbC9wYWNrYWdlbWFrZXIuaHRtbAogCi1CZXdhcmUgb2YgdGhlIG11bHRpLXBhY2thZ2UgZmVhdHVyZXMgb2YgSW5zdGFsbGVyLmFwcCAod2hpY2ggYXJlIG5vdCAKLXlldCBzdXBwb3J0ZWQgaGVyZSkgdGhhdCBjYW4gcG90ZW50aWFsbHkgc2NyZXctdXAgeW91ciBpbnN0YWxsYXRpb24gCitCZXdhcmUgb2YgdGhlIG11bHRpLXBhY2thZ2UgZmVhdHVyZXMgb2YgSW5zdGFsbGVyLmFwcCAod2hpY2ggYXJlIG5vdAoreWV0IHN1cHBvcnRlZCBoZXJlKSB0aGF0IGNhbiBwb3RlbnRpYWxseSBzY3Jldy11cCB5b3VyIGluc3RhbGxhdGlvbgogYW5kIGFyZSBkaXNjdXNzZWQgaW4gdGhlc2UgYXJ0aWNsZXMgb24gU3RlcHdpc2U6CiAKICAgaHR0cDovL3d3dy5zdGVwd2lzZS5jb20vQXJ0aWNsZXMvVGVjaG5pY2FsL1BhY2thZ2VzL0luc3RhbGxlcldvZXMuaHRtbAogICBodHRwOi8vd3d3LnN0ZXB3aXNlLmNvbS9BcnRpY2xlcy9UZWNobmljYWwvUGFja2FnZXMvSW5zdGFsbGVyT25YLmh0bWwKIAotQmVzaWRlIHVzaW5nIHRoZSBQYWNrYWdlTWFrZXIgY2xhc3MgZGlyZWN0bHksIGJ5IGltcG9ydGluZyBpdCBpbnNpZGUgCitCZXNpZGUgdXNpbmcgdGhlIFBhY2thZ2VNYWtlciBjbGFzcyBkaXJlY3RseSwgYnkgaW1wb3J0aW5nIGl0IGluc2lkZQogYW5vdGhlciBtb2R1bGUsIHNheSwgdGhlcmUgYXJlIGFkZGl0aW9uYWwgd2F5cyBvZiB1c2luZyB0aGlzIG1vZHVsZToKLXRoZSB0b3AtbGV2ZWwgYnVpbGRQYWNrYWdlKCkgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaG9ydGN1dCB0byB0aGUgc2FtZSAKK3RoZSB0b3AtbGV2ZWwgYnVpbGRQYWNrYWdlKCkgZnVuY3Rpb24gcHJvdmlkZXMgYSBzaG9ydGN1dCB0byB0aGUgc2FtZQogZmVhdHVyZSBhbmQgaXMgYWxzbyBjYWxsZWQgd2hlbiB1c2luZyB0aGlzIG1vZHVsZSBmcm9tIHRoZSBjb21tYW5kLQogbGluZS4KIAogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKLSAgICBOT1RFOiBGb3Igbm93IHlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhpcyBldmVuIG9uIGEgbm9uLU9TIFggCisgICAgTk9URTogRm9yIG5vdyB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gcnVuIHRoaXMgZXZlbiBvbiBhIG5vbi1PUyBYCiAgICAgICAgICAgc3lzdGVtIGFuZCBnZXQgc29tZXRoaW5nIHNpbWlsYXIgdG8gYSBwYWNrYWdlLCBidXQgd2l0aG91dAotICAgICAgICAgIHRoZSByZWFsIGFyY2hpdmUgKG5lZWRzIHBheCkgYW5kIGJvbSBmaWxlcyAobmVlZHMgbWtib20pIAotICAgICAgICAgIGluc2lkZSEgVGhpcyBpcyBvbmx5IGZvciBwcm92aWRpbmcgYSBjaGFuY2UgZm9yIHRlc3RpbmcgdG8gCisgICAgICAgICAgdGhlIHJlYWwgYXJjaGl2ZSAobmVlZHMgcGF4KSBhbmQgYm9tIGZpbGVzIChuZWVkcyBta2JvbSkKKyAgICAgICAgICBpbnNpZGUhIFRoaXMgaXMgb25seSBmb3IgcHJvdmlkaW5nIGEgY2hhbmNlIGZvciB0ZXN0aW5nIHRvCiAgICAgICAgICAgZm9sa3Mgd2l0aG91dCBPUyBYLgogICAgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKIApAQCAtMzksNyArMzksNyBAQAogICAtIGhhbmRsZSBtdWx0aS12b2x1bWUgcGFja2FnZXMgKD8pCiAgIC0gaW50ZWdyYXRlIGludG8gZGlzdHV0aWxzICg/KQogCi1EaW51IEMuIEdoZXJtYW4sIAorRGludSBDLiBHaGVybWFuLAogZ2hlcm1hbkBldXJvcGVtYWlsLmNvbQogTm92ZW1iZXIgMjAwMQogCkBAIC0xMjAsMTQgKzEyMCwxNCBAQAogICAgICIiIkEgY2xhc3MgdG8gZ2VuZXJhdGUgcGFja2FnZXMgZm9yIE1hYyBPUyBYLgogCiAgICAgVGhpcyBpcyBpbnRlbmRlZCB0byBjcmVhdGUgT1MgWCBwYWNrYWdlcyAod2l0aCBleHRlbnNpb24gLnBrZykKLSAgICBjb250YWluaW5nIGFyY2hpdmVzIG9mIGFyYml0cmFyeSBmaWxlcyB0aGF0IHRoZSBJbnN0YWxsZXIuYXBwIAorICAgIGNvbnRhaW5pbmcgYXJjaGl2ZXMgb2YgYXJiaXRyYXJ5IGZpbGVzIHRoYXQgdGhlIEluc3RhbGxlci5hcHAKICAgICB3aWxsIGJlIGFibGUgdG8gaGFuZGxlLgogCi0gICAgQXMgb2Ygbm93LCBQYWNrYWdlTWFrZXIgaW5zdGFuY2VzIG5lZWQgdG8gYmUgY3JlYXRlZCB3aXRoIHRoZSAKLSAgICB0aXRsZSwgdmVyc2lvbiBhbmQgZGVzY3JpcHRpb24gb2YgdGhlIHBhY2thZ2UgdG8gYmUgYnVpbHQuIAotICAgIFRoZSBwYWNrYWdlIGlzIGJ1aWx0IGFmdGVyIGNhbGxpbmcgdGhlIGluc3RhbmNlIG1ldGhvZCAKLSAgICBidWlsZChyb290LCAqKm9wdGlvbnMpLiBJdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyB0aGUgY29uc3RydWN0b3IncyAKLSAgICB0aXRsZSBhcmd1bWVudCBwbHVzIGEgJy5wa2cnIGV4dGVuc2lvbiBhbmQgaXMgbG9jYXRlZCBpbiB0aGUgc2FtZSAKKyAgICBBcyBvZiBub3csIFBhY2thZ2VNYWtlciBpbnN0YW5jZXMgbmVlZCB0byBiZSBjcmVhdGVkIHdpdGggdGhlCisgICAgdGl0bGUsIHZlcnNpb24gYW5kIGRlc2NyaXB0aW9uIG9mIHRoZSBwYWNrYWdlIHRvIGJlIGJ1aWx0LgorICAgIFRoZSBwYWNrYWdlIGlzIGJ1aWx0IGFmdGVyIGNhbGxpbmcgdGhlIGluc3RhbmNlIG1ldGhvZAorICAgIGJ1aWxkKHJvb3QsICoqb3B0aW9ucykuIEl0IGhhcyB0aGUgc2FtZSBuYW1lIGFzIHRoZSBjb25zdHJ1Y3RvcidzCisgICAgdGl0bGUgYXJndW1lbnQgcGx1cyBhICcucGtnJyBleHRlbnNpb24gYW5kIGlzIGxvY2F0ZWQgaW4gdGhlIHNhbWUKICAgICBwYXJlbnQgZm9sZGVyIHRoYXQgY29udGFpbnMgdGhlIHJvb3QgZm9sZGVyLgogCiAgICAgRS5nLiB0aGlzIHdpbGwgY3JlYXRlIGEgcGFja2FnZSBmb2xkZXIgL215L3NwYWNlL2Rpc3R1dGlscy5wa2cvOgpAQCAtMTY1LDcgKzE2NSw3IEBACiAgICAgICAgIGluZm8gPSB7IlRpdGxlIjogdGl0bGUsICJWZXJzaW9uIjogdmVyc2lvbiwgIkRlc2NyaXB0aW9uIjogZGVzY30KICAgICAgICAgc2VsZi5wYWNrYWdlSW5mbyA9IGNvcHkuZGVlcGNvcHkoc2VsZi5wYWNrYWdlSW5mb0RlZmF1bHRzKQogICAgICAgICBzZWxmLnBhY2thZ2VJbmZvLnVwZGF0ZShpbmZvKQotICAgICAgICAKKwogICAgICAgICAjIHZhcmlhYmxlcyBzZXQgbGF0ZXIKICAgICAgICAgc2VsZi5wYWNrYWdlUm9vdEZvbGRlciA9IE5vbmUKICAgICAgICAgc2VsZi5wYWNrYWdlUmVzb3VyY2VGb2xkZXIgPSBOb25lCkBAIC0xNzYsOCArMTc2LDggQEAKICAgICBkZWYgYnVpbGQoc2VsZiwgcm9vdCwgcmVzb3VyY2VzPU5vbmUsICoqb3B0aW9ucyk6CiAgICAgICAgICIiIkNyZWF0ZSBhIHBhY2thZ2UgZm9yIHNvbWUgZ2l2ZW4gcm9vdCBmb2xkZXIuCiAKLSAgICAgICAgV2l0aCBubyAncmVzb3VyY2VzJyBhcmd1bWVudCBzZXQgaXQgaXMgYXNzdW1lZCB0byBiZSB0aGUgc2FtZSAKLSAgICAgICAgYXMgdGhlIHJvb3QgZGlyZWN0b3J5LiBPcHRpb24gaXRlbXMgcmVwbGFjZSB0aGUgZGVmYXVsdCBvbmVzIAorICAgICAgICBXaXRoIG5vICdyZXNvdXJjZXMnIGFyZ3VtZW50IHNldCBpdCBpcyBhc3N1bWVkIHRvIGJlIHRoZSBzYW1lCisgICAgICAgIGFzIHRoZSByb290IGRpcmVjdG9yeS4gT3B0aW9uIGl0ZW1zIHJlcGxhY2UgdGhlIGRlZmF1bHQgb25lcwogICAgICAgICBpbiB0aGUgcGFja2FnZSBpbmZvLgogICAgICAgICAiIiIKIApAQCAtMTk1LDEyICsxOTUsMTIgQEAKICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VJbmZvW2tdID0gdgogICAgICAgICAgICAgZWxpZiBub3QgayBpbiBbIk91dHB1dERpciJdOgogICAgICAgICAgICAgICAgIHJhaXNlIEVycm9yLCAiVW5rbm93biBwYWNrYWdlIG9wdGlvbjogJXMiICUgawotICAgICAgICAKKwogICAgICAgICAjIENoZWNrIHdoZXJlIHdlIHNob3VsZCBsZWF2ZSB0aGUgb3V0cHV0LiBEZWZhdWx0IGlzIGN1cnJlbnQgZGlyZWN0b3J5CiAgICAgICAgIG91dHB1dGRpciA9IG9wdGlvbnMuZ2V0KCJPdXRwdXREaXIiLCBvcy5nZXRjd2QoKSkKICAgICAgICAgcGFja2FnZU5hbWUgPSBzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdCiAgICAgICAgIHNlbGYuUGFja2FnZVJvb3RGb2xkZXIgPSBvcy5wYXRoLmpvaW4ob3V0cHV0ZGlyLCBwYWNrYWdlTmFtZSArICIucGtnIikKLSAKKwogICAgICAgICAjIGRvIHdoYXQgbmVlZHMgdG8gYmUgZG9uZQogICAgICAgICBzZWxmLl9tYWtlRm9sZGVycygpCiAgICAgICAgIHNlbGYuX2FkZEluZm8oKQpAQCAtMjE1LDcgKzIxNSw3IEBACiAgICAgICAgICJDcmVhdGUgcGFja2FnZSBmb2xkZXIgc3RydWN0dXJlLiIKIAogICAgICAgICAjIE5vdCBzdXJlIGlmIHRoZSBwYWNrYWdlIG5hbWUgc2hvdWxkIGNvbnRhaW4gdGhlIHZlcnNpb24gb3Igbm90Li4uCi0gICAgICAgICMgcGFja2FnZU5hbWUgPSAiJXMtJXMiICUgKHNlbGYucGFja2FnZUluZm9bIlRpdGxlIl0sIAorICAgICAgICAjIHBhY2thZ2VOYW1lID0gIiVzLSVzIiAlIChzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdLAogICAgICAgICAjICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLnBhY2thZ2VJbmZvWyJWZXJzaW9uIl0pICMgPz8KIAogICAgICAgICBjb250Rm9sZGVyID0gam9pbihzZWxmLlBhY2thZ2VSb290Rm9sZGVyLCAiQ29udGVudHMiKQpAQCAtMjY3LDcgKzI2Nyw3IEBACiAgICAgICAgIHNlbGYuYXJjaFBhdGggPSBqb2luKHNlbGYucGFja2FnZVJlc291cmNlRm9sZGVyLCBiYXNlKQogICAgICAgICBjbWQgPSAicGF4IC13IC1mICVzICVzIiAlIChzZWxmLmFyY2hQYXRoLCAiLiIpCiAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCi0gICAgICAgIAorCiAgICAgICAgICMgY29tcHJlc3MgYXJjaGl2ZQogICAgICAgICBjbWQgPSAiZ3ppcCAlcyIgJSBzZWxmLmFyY2hQYXRoCiAgICAgICAgIHJlcyA9IG9zLnN5c3RlbShjbWQpCkBAIC0yNzcsOCArMjc3LDggQEAKICAgICBkZWYgX2FkZFJlc291cmNlcyhzZWxmKToKICAgICAgICAgIkFkZCBXZWxjb21lL1JlYWRNZS9MaWNlbnNlIGZpbGVzLCAubHByb2ogZm9sZGVycyBhbmQgc2NyaXB0cy4iCiAKLSAgICAgICAgIyBDdXJyZW50bHkgd2UganVzdCBjb3B5IGV2ZXJ5dGhpbmcgdGhhdCBtYXRjaGVzIHRoZSBhbGxvd2VkIAotICAgICAgICAjIGZpbGVuYW1lcy4gU28sIGl0J3MgbGVmdCB0byBJbnN0YWxsZXIuYXBwIHRvIGRlYWwgd2l0aCB0aGUgCisgICAgICAgICMgQ3VycmVudGx5IHdlIGp1c3QgY29weSBldmVyeXRoaW5nIHRoYXQgbWF0Y2hlcyB0aGUgYWxsb3dlZAorICAgICAgICAjIGZpbGVuYW1lcy4gU28sIGl0J3MgbGVmdCB0byBJbnN0YWxsZXIuYXBwIHRvIGRlYWwgd2l0aCB0aGUKICAgICAgICAgIyBzYW1lIGZpbGUgYXZhaWxhYmxlIGluIG11bHRpcGxlIGZvcm1hdHMuLi4KIAogICAgICAgICBpZiBub3Qgc2VsZi5yZXNvdXJjZUZvbGRlcjoKQEAgLTMzNyw5ICszMzcsOSBAQAogICAgIGRlZiBfYWRkU2l6ZXMoc2VsZik6CiAgICAgICAgICJXcml0ZSAuc2l6ZXMgZmlsZSB3aXRoIGluZm8gYWJvdXQgbnVtYmVyIGFuZCBzaXplIG9mIGZpbGVzLiIKIAotICAgICAgICAjIE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCwgYnV0ICdpbnN0YWxsZWRTaXplJyBhbmQgCi0gICAgICAgICMgJ3ppcHBlZFNpemUnIGFyZSBub3cgaW4gQnl0ZXMuIE1heWJlIGJsb2NrcyBhcmUgbmVlZGVkPyAKLSAgICAgICAgIyBXZWxsLCBJbnN0YWxsZXIuYXBwIGRvZXNuJ3Qgc2VlbSB0byBjYXJlIGFueXdheSwgc2F5aW5nIAorICAgICAgICAjIE5vdCBzdXJlIGlmIHRoaXMgaXMgY29ycmVjdCwgYnV0ICdpbnN0YWxsZWRTaXplJyBhbmQKKyAgICAgICAgIyAnemlwcGVkU2l6ZScgYXJlIG5vdyBpbiBCeXRlcy4gTWF5YmUgYmxvY2tzIGFyZSBuZWVkZWQ/CisgICAgICAgICMgV2VsbCwgSW5zdGFsbGVyLmFwcCBkb2Vzbid0IHNlZW0gdG8gY2FyZSBhbnl3YXksIHNheWluZwogICAgICAgICAjIHRoZSBpbnN0YWxsYXRpb24gbmVlZHMgMTAwKyBNQi4uLgogCiAgICAgICAgIG51bUZpbGVzID0gMApAQCAtMzUzLDcgKzM1Myw3IEBACiAKICAgICAgICAgdHJ5OgogICAgICAgICAgICAgemlwcGVkU2l6ZSA9IG9zLnN0YXQoc2VsZi5hcmNoUGF0aCsgIi5neiIpWzZdCi0gICAgICAgIGV4Y2VwdCBPU0Vycm9yOiAjIGlnbm9yZSBlcnJvciAKKyAgICAgICAgZXhjZXB0IE9TRXJyb3I6ICMgaWdub3JlIGVycm9yCiAgICAgICAgICAgICBwYXNzCiAgICAgICAgIGJhc2UgPSBzZWxmLnBhY2thZ2VJbmZvWyJUaXRsZSJdICsgIi5zaXplcyIKICAgICAgICAgZiA9IG9wZW4oam9pbihzZWxmLnBhY2thZ2VSZXNvdXJjZUZvbGRlciwgYmFzZSksICJ3IikKQEAgLTM3MCw3ICszNzAsNyBAQAogCiBkZWYgYnVpbGRQYWNrYWdlKCphcmdzLCAqKm9wdGlvbnMpOgogICAgICJBIFNob3J0Y3V0IGZ1bmN0aW9uIGZvciBidWlsZGluZyBhIHBhY2thZ2UuIgotICAgIAorCiAgICAgbyA9IG9wdGlvbnMKICAgICB0aXRsZSwgdmVyc2lvbiwgZGVzYyA9IG9bIlRpdGxlIl0sIG9bIlZlcnNpb24iXSwgb1siRGVzY3JpcHRpb24iXQogICAgIHBtID0gUGFja2FnZU1ha2VyKHRpdGxlLCB2ZXJzaW9uLCBkZXNjKQpAQCAtMzkxLDkgKzM5MSw5IEBACiBkZWYgdGVzdDEoKToKICAgICAiVGVzdCBmb3IgdGhlIHJlcG9ydGxhYiBkaXN0cmlidXRpb24gd2l0aCBtb2RpZmllZCBvcHRpb25zLiIKIAotICAgIHBtID0gUGFja2FnZU1ha2VyKCJyZXBvcnRsYWIiLCAiMS4xMCIsIAorICAgIHBtID0gUGFja2FnZU1ha2VyKCJyZXBvcnRsYWIiLCAiMS4xMCIsCiAgICAgICAgICAgICAgICAgICAgICAgIlJlcG9ydExhYidzIE9wZW4gU291cmNlIFBERiB0b29sa2l0LiIpCi0gICAgcG0uYnVpbGQocm9vdD0iL1VzZXJzL2RpbnUvRGVza3RvcC9yZXBvcnRsYWIiLCAKKyAgICBwbS5idWlsZChyb290PSIvVXNlcnMvZGludS9EZXNrdG9wL3JlcG9ydGxhYiIsCiAgICAgICAgICAgICAgRGVmYXVsdExvY2F0aW9uPSIvQXBwbGljYXRpb25zL1JlcG9ydExhYiIsCiAgICAgICAgICAgICAgUmVsb2NhdGFibGU9IllFUyIpCiAKQEAgLTQwMSw5ICs0MDEsOSBAQAogICAgICJTaG9ydGN1dCB0ZXN0IGZvciB0aGUgcmVwb3J0bGFiIGRpc3RyaWJ1dGlvbiB3aXRoIG1vZGlmaWVkIG9wdGlvbnMuIgogCiAgICAgYnVpbGRQYWNrYWdlKAotICAgICAgICAiL1VzZXJzL2RpbnUvRGVza3RvcC9yZXBvcnRsYWIiLCAKLSAgICAgICAgVGl0bGU9InJlcG9ydGxhYiIsIAotICAgICAgICBWZXJzaW9uPSIxLjEwIiwgCisgICAgICAgICIvVXNlcnMvZGludS9EZXNrdG9wL3JlcG9ydGxhYiIsCisgICAgICAgIFRpdGxlPSJyZXBvcnRsYWIiLAorICAgICAgICBWZXJzaW9uPSIxLjEwIiwKICAgICAgICAgRGVzY3JpcHRpb249IlJlcG9ydExhYidzIE9wZW4gU291cmNlIFBERiB0b29sa2l0LiIsCiAgICAgICAgIERlZmF1bHRMb2NhdGlvbj0iL0FwcGxpY2F0aW9ucy9SZXBvcnRMYWIiLAogICAgICAgICBSZWxvY2F0YWJsZT0iWUVTIikKZGlmZiAtLWdpdCBhL01hYy9zY3JpcHRzL2NhY2hlcnNyYy5weSBiL01hYy9zY3JpcHRzL2NhY2hlcnNyYy5weQppbmRleCBlNjUyNGM5Li5lMmVlZDhiIDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9jYWNoZXJzcmMucHkKKysrIGIvTWFjL3NjcmlwdHMvY2FjaGVyc3JjLnB5CkBAIC0xMCwzNiArMTAsMzUgQEAKIGltcG9ydCBnZXRvcHQKIAogY2xhc3MgTm9BcmdzRXJyb3IoRXhjZXB0aW9uKToKLQlwYXNzCi0JCisgICAgcGFzcworCiBkZWYgaGFuZGxlcigodmVyYm9zZSwgZm9yY2UpLCBkaXJuYW1lLCBmbmFtZXMpOgotCWZvciBmbiBpbiBmbmFtZXM6Ci0JCWlmIGZuWy01Ol0gPT0gJy5yc3JjJyBhbmQgZm5bLTEzOl0gIT0gJy5yc3JjLmRmLnJzcmMnOgotCQkJaWYgZm9yY2U6Ci0JCQkJdHJ5OgotCQkJCQlvcy51bmxpbmsob3MucGF0aC5qb2luKGRpcm5hbWUsIGZuICsgJy5kZi5yc3JjJykpCi0JCQkJZXhjZXB0IElPRXJyb3I6Ci0JCQkJCXBhc3MKLQkJCW1hY3Jlc291cmNlLm9wZW5fcGF0aG5hbWUob3MucGF0aC5qb2luKGRpcm5hbWUsIGZuKSwgdmVyYm9zZT12ZXJib3NlKQotCQkJCisgICAgZm9yIGZuIGluIGZuYW1lczoKKyAgICAgICAgaWYgZm5bLTU6XSA9PSAnLnJzcmMnIGFuZCBmblstMTM6XSAhPSAnLnJzcmMuZGYucnNyYyc6CisgICAgICAgICAgICBpZiBmb3JjZToKKyAgICAgICAgICAgICAgICB0cnk6CisgICAgICAgICAgICAgICAgICAgIG9zLnVubGluayhvcy5wYXRoLmpvaW4oZGlybmFtZSwgZm4gKyAnLmRmLnJzcmMnKSkKKyAgICAgICAgICAgICAgICBleGNlcHQgSU9FcnJvcjoKKyAgICAgICAgICAgICAgICAgICAgcGFzcworICAgICAgICAgICAgbWFjcmVzb3VyY2Uub3Blbl9wYXRobmFtZShvcy5wYXRoLmpvaW4oZGlybmFtZSwgZm4pLCB2ZXJib3NlPXZlcmJvc2UpCisKIGRlZiBtYWluKCk6Ci0JdHJ5OgotCQlvcHRzLCBhcmdzID0gZ2V0b3B0LmdldG9wdChzeXMuYXJndlsxOl0sICd2ZicpCi0JCWlmIG5vdCBhcmdzOgotCQkJcmFpc2UgTm9BcmdzRXJyb3IKLQlleGNlcHQgKGdldG9wdC5HZXRvcHRFcnJvciwgTm9BcmdzRXJyb3IpOgotCQlzeXMuc3RkZXJyLndyaXRlKCdVc2FnZTogY2FjaGVyc3JjLnB5IGRpcm5hbWUgLi4uXG4nKQotCQlzeXMuZXhpdCgxKQotCXZlcmJvc2UgPSAwCi0JZm9yY2UgPSAwCi0JZm9yIG8sIHYgaW4gb3B0czoKLQkJaWYgbyA9PSAnLXYnOgotCQkJdmVyYm9zZSA9IDEKLQkJaWYgbyA9PSAnLWYnOgotCQkJZm9yY2UgPSAxCi0JZm9yIGRpciBpbiBzeXMuYXJndlsxOl06Ci0JCW9zLnBhdGgud2FsayhkaXIsIGhhbmRsZXIsICh2ZXJib3NlLCBmb3JjZSkpCi0JCQorICAgIHRyeToKKyAgICAgICAgb3B0cywgYXJncyA9IGdldG9wdC5nZXRvcHQoc3lzLmFyZ3ZbMTpdLCAndmYnKQorICAgICAgICBpZiBub3QgYXJnczoKKyAgICAgICAgICAgIHJhaXNlIE5vQXJnc0Vycm9yCisgICAgZXhjZXB0IChnZXRvcHQuR2V0b3B0RXJyb3IsIE5vQXJnc0Vycm9yKToKKyAgICAgICAgc3lzLnN0ZGVyci53cml0ZSgnVXNhZ2U6IGNhY2hlcnNyYy5weSBkaXJuYW1lIC4uLlxuJykKKyAgICAgICAgc3lzLmV4aXQoMSkKKyAgICB2ZXJib3NlID0gMAorICAgIGZvcmNlID0gMAorICAgIGZvciBvLCB2IGluIG9wdHM6CisgICAgICAgIGlmIG8gPT0gJy12JzoKKyAgICAgICAgICAgIHZlcmJvc2UgPSAxCisgICAgICAgIGlmIG8gPT0gJy1mJzoKKyAgICAgICAgICAgIGZvcmNlID0gMQorICAgIGZvciBkaXIgaW4gc3lzLmFyZ3ZbMTpdOgorICAgICAgICBvcy5wYXRoLndhbGsoZGlyLCBoYW5kbGVyLCAodmVyYm9zZSwgZm9yY2UpKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICBtYWluKCkKZGlmZiAtLWdpdCBhL01hYy9zY3JpcHRzL2dlbmFsbHN1aXRlcy5weSBiL01hYy9zY3JpcHRzL2dlbmFsbHN1aXRlcy5weQppbmRleCA4ODRkNGE0Li5hNTU2ODQ3IDEwMDY0NAotLS0gYS9NYWMvc2NyaXB0cy9nZW5hbGxzdWl0ZXMucHkKKysrIGIvTWFjL3NjcmlwdHMvZ2VuYWxsc3VpdGVzLnB5CkBAIC0yMiwzMiArMjIsMzEgQEAKIFRFUk1JTkFMPSIvQXBwbGljYXRpb25zL1V0aWxpdGllcy9UZXJtaW5hbC5hcHAiCiAKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlX2Zyb21yZXNvdXJjZShBUFBMRVNDUklQVCwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N0ZFN1aXRlcycpLAotCWJhc2Vwa2duYW1lPSdfYnVpbHRpblN1aXRlcycsCi0JZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQorICAgICAgICBvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N0ZFN1aXRlcycpLAorICAgICAgICBiYXNlcGtnbmFtZT0nX2J1aWx0aW5TdWl0ZXMnLAorICAgICAgICBlZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCiBnZW5zdWl0ZW1vZHVsZS5wcm9jZXNzZmlsZShTWVNURU1FVkVOVFMsCi0Jb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdTeXN0ZW1FdmVudHMnKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVsoJ0Rpc2tfMmRfRm9sZGVyXzJkX0ZpbGVfU3VpdGUnLCAnRGlza19Gb2xkZXJfRmlsZV9TdWl0ZScpXSwgCi0JdmVyYm9zZT12ZXJib3NlKQorICAgICAgICBvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1N5c3RlbUV2ZW50cycpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bKCdEaXNrXzJkX0ZvbGRlcl8yZF9GaWxlX1N1aXRlJywgJ0Rpc2tfRm9sZGVyX0ZpbGVfU3VpdGUnKV0sCisgICAgICAgIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKENPREVXQVJSSU9SLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnQ29kZVdhcnJpb3InKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIG91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnQ29kZVdhcnJpb3InKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKEVYUExPUkVSLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnRXhwbG9yZXInKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVtdLCB2ZXJib3NlPXZlcmJvc2UpCisgICAgICAgIG91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnRXhwbG9yZXInKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKEZJTkRFUiwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ0ZpbmRlcicpLAotCWJhc2Vwa2duYW1lPSdTdGRTdWl0ZXMnLAotCWVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdGaW5kZXInKSwKKyAgICAgICAgYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCisgICAgICAgIGVkaXRfbW9kbmFtZXM9W10sIHZlcmJvc2U9dmVyYm9zZSkKIGdlbnN1aXRlbW9kdWxlLnByb2Nlc3NmaWxlKE5FVFNDQVBFLAotCW91dHB1dD1vcy5wYXRoLmpvaW4oRFNURElSLCAnTmV0c2NhcGUnKSwKLQliYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKLQllZGl0X21vZG5hbWVzPVsoJ1dvcmxkV2lkZVdlYl9zdWl0ZV8yY19fYXNfZCcsICdXb3JsZFdpZGVXZWJfc3VpdGUnKV0sIHZlcmJvc2U9dmVyYm9zZSkKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdOZXRzY2FwZScpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bKCdXb3JsZFdpZGVXZWJfc3VpdGVfMmNfX2FzX2QnLCAnV29ybGRXaWRlV2ViX3N1aXRlJyldLCB2ZXJib3NlPXZlcmJvc2UpCiBnZW5zdWl0ZW1vZHVsZS5wcm9jZXNzZmlsZShURVJNSU5BTCwKLQlvdXRwdXQ9b3MucGF0aC5qb2luKERTVERJUiwgJ1Rlcm1pbmFsJyksCi0JYmFzZXBrZ25hbWU9J1N0ZFN1aXRlcycsCi0JZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQotCQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKKyAgICAgICAgb3V0cHV0PW9zLnBhdGguam9pbihEU1RESVIsICdUZXJtaW5hbCcpLAorICAgICAgICBiYXNlcGtnbmFtZT0nU3RkU3VpdGVzJywKKyAgICAgICAgZWRpdF9tb2RuYW1lcz1bXSwgdmVyYm9zZT12ZXJib3NlKQpkaWZmIC0tZ2l0IGEvTWFjL3NjcmlwdHMvbWtlc3RycmVzLnB5IGIvTWFjL3NjcmlwdHMvbWtlc3RycmVzLnB5CmluZGV4IGZhYTIwM2IuLjcxNWI4YzYgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL21rZXN0cnJlcy5weQorKysgYi9NYWMvc2NyaXB0cy9ta2VzdHJyZXMucHkKQEAgLTEwLDE0OSArMTAsMTQ4IEBACiBzbUFsbFNjcmlwdHMgPSAtMwogCiBFUlJOT19QUk9HPSIjZGVmaW5lWyBcdF0rIiBcCi0JCSAgICIoW0EtWjAtOWEtel9dKykiIFwKLQkJICAgIlsgXHRdKyIgXAotCQkgICAiKFswLTldKykiIFwKLQkJICAgIlsgXHRdKi9cKlsgXHRdKiIgXAotCQkgICAiKC4qKSIgXAotCQkgICAiWyBcdF0qXCovIgotCQkgICAKKyAgICAgICAgICAgICAgICAgICAiKFtBLVowLTlhLXpfXSspIiBcCisgICAgICAgICAgICAgICAgICAgIlsgXHRdKyIgXAorICAgICAgICAgICAgICAgICAgICIoWzAtOV0rKSIgXAorICAgICAgICAgICAgICAgICAgICJbIFx0XSovXCpbIFx0XSoiIFwKKyAgICAgICAgICAgICAgICAgICAiKC4qKSIgXAorICAgICAgICAgICAgICAgICAgICJbIFx0XSpcKi8iCisKIEVSUk9SU19QUk9HPSJbIFx0XSoiIFwKLQkJCSIoW0EtWjAtOWEtel9dKykiIFwKLQkJCSJbIFx0XSo9WyBcdF0qIiBcCi0JCQkiKFstMC05XSspIiBcCi0JCQkiWywgXHRdKi9cKlsgXHRdKiIgXAotCQkJIiguKikiIFwKLQkJCSJbIFx0XSpcKi8iCi0JCSAgIAorICAgICAgICAgICAgICAgICAgICAgICAgIihbQS1aMC05YS16X10rKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlsgXHRdKj1bIFx0XSoiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICIoWy0wLTldKykiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICJbLCBcdF0qL1wqWyBcdF0qIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiKC4qKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlsgXHRdKlwqLyIKKwogRVJST1JTX1BST0dfMj0iWyBcdF0qIiBcCi0JCQkiKFtBLVowLTlhLXpfXSspIiBcCi0JCQkiWyBcdF0qPVsgXHRdKiIgXAotCQkJIihbLTAtOV0rKSIgXAotCQkJIlssIFx0XSoiCisgICAgICAgICAgICAgICAgICAgICAgICAiKFtBLVowLTlhLXpfXSspIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAiWyBcdF0qPVsgXHRdKiIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIihbLTAtOV0rKSIgXAorICAgICAgICAgICAgICAgICAgICAgICAgIlssIFx0XSoiCiAKIGRlZiBQc3RyaW5nKHN0cik6Ci0JaWYgbGVuKHN0cikgPiAyNTU6Ci0JCXJhaXNlIFZhbHVlRXJyb3IsICdTdHJpbmcgdG9vIGxhcmdlJwotCXJldHVybiBjaHIobGVuKHN0cikpK3N0cgotCQorICAgIGlmIGxlbihzdHIpID4gMjU1OgorICAgICAgICByYWlzZSBWYWx1ZUVycm9yLCAnU3RyaW5nIHRvbyBsYXJnZScKKyAgICByZXR1cm4gY2hyKGxlbihzdHIpKStzdHIKKwogZGVmIHdyaXRlZXN0cihkc3QsIGVkaWN0KToKLQkiIiJDcmVhdGUgRXN0ciByZXNvdXJjZSBmaWxlIGdpdmVuIGEgZGljdGlvbmFyeSBvZiBlcnJvcnMuIiIiCi0JCi0Jb3MudW5saW5rKGRzdC5hc19wYXRobmFtZSgpKQotCVJlcy5GU3BDcmVhdGVSZXNGaWxlKGRzdCwgJ1JTRUQnLCAncnNyYycsIHNtQWxsU2NyaXB0cykKLQlvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKLQlSZXMuVXNlUmVzRmlsZShvdXRwdXQpCi0JZm9yIG51bSBpbiBlZGljdC5rZXlzKCk6Ci0JCXJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKGVkaWN0W251bV1bMF0pKQotCQlyZXMuQWRkUmVzb3VyY2UoJ0VzdHInLCBudW0sICcnKQotCQlyZXMuV3JpdGVSZXNvdXJjZSgpCi0JUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCi0JCisgICAgIiIiQ3JlYXRlIEVzdHIgcmVzb3VyY2UgZmlsZSBnaXZlbiBhIGRpY3Rpb25hcnkgb2YgZXJyb3JzLiIiIgorCisgICAgb3MudW5saW5rKGRzdC5hc19wYXRobmFtZSgpKQorICAgIFJlcy5GU3BDcmVhdGVSZXNGaWxlKGRzdCwgJ1JTRUQnLCAncnNyYycsIHNtQWxsU2NyaXB0cykKKyAgICBvdXRwdXQgPSBSZXMuRlNwT3BlblJlc0ZpbGUoZHN0LCBXUklURSkKKyAgICBSZXMuVXNlUmVzRmlsZShvdXRwdXQpCisgICAgZm9yIG51bSBpbiBlZGljdC5rZXlzKCk6CisgICAgICAgIHJlcyA9IFJlcy5SZXNvdXJjZShQc3RyaW5nKGVkaWN0W251bV1bMF0pKQorICAgICAgICByZXMuQWRkUmVzb3VyY2UoJ0VzdHInLCBudW0sICcnKQorICAgICAgICByZXMuV3JpdGVSZXNvdXJjZSgpCisgICAgUmVzLkNsb3NlUmVzRmlsZShvdXRwdXQpCisKIGRlZiB3cml0ZXB5dGhvbihmcCwgZGljdCk6Ci0JayA9IGRpY3Qua2V5cygpCi0Jay5zb3J0KCkKLQlmb3IgaSBpbiBrOgotCQlmcC53cml0ZSgiJXNcdD1cdCVkXHQjJXNcbiIlKGRpY3RbaV1bMV0sIGksIGRpY3RbaV1bMF0pKQotCQorICAgIGsgPSBkaWN0LmtleXMoKQorICAgIGsuc29ydCgpCisgICAgZm9yIGkgaW4gazoKKyAgICAgICAgZnAud3JpdGUoIiVzXHQ9XHQlZFx0IyVzXG4iJShkaWN0W2ldWzFdLCBpLCBkaWN0W2ldWzBdKSkKKwogCiBkZWYgcGFyc2VfZXJybm9faChmcCwgZGljdCk6Ci0JZXJybm9fcHJvZyA9IHJlLmNvbXBpbGUoRVJSTk9fUFJPRykKLQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKLQkJbSA9IGVycm5vX3Byb2cubWF0Y2gobGluZSkKLQkJaWYgbToKLQkJCW51bWJlciA9IHN0cmluZy5hdG9pKG0uZ3JvdXAoMikpCi0JCQluYW1lID0gbS5ncm91cCgxKQotCQkJZGVzYyA9IHN0cmluZy5zdHJpcChtLmdyb3VwKDMpKQotCQkJCi0JCQlpZiBub3QgZGljdC5oYXNfa2V5KG51bWJlcik6Ci0JCQkJZGljdFtudW1iZXJdID0gZGVzYywgbmFtZQotCQkJZWxzZToKLQkJCQlwcmludCAnRFVQTElDQVRFJywgbnVtYmVyCi0JCQkJcHJpbnQgJ1x0JywgZGljdFtudW1iZXJdCi0JCQkJcHJpbnQgJ1x0JywgKGRlc2MsIG5hbWUpCi0JCQkJCQkJCQorICAgIGVycm5vX3Byb2cgPSByZS5jb21waWxlKEVSUk5PX1BST0cpCisgICAgZm9yIGxpbmUgaW4gZnAucmVhZGxpbmVzKCk6CisgICAgICAgIG0gPSBlcnJub19wcm9nLm1hdGNoKGxpbmUpCisgICAgICAgIGlmIG06CisgICAgICAgICAgICBudW1iZXIgPSBzdHJpbmcuYXRvaShtLmdyb3VwKDIpKQorICAgICAgICAgICAgbmFtZSA9IG0uZ3JvdXAoMSkKKyAgICAgICAgICAgIGRlc2MgPSBzdHJpbmcuc3RyaXAobS5ncm91cCgzKSkKKworICAgICAgICAgICAgaWYgbm90IGRpY3QuaGFzX2tleShudW1iZXIpOgorICAgICAgICAgICAgICAgIGRpY3RbbnVtYmVyXSA9IGRlc2MsIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0RVUExJQ0FURScsIG51bWJlcgorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIGRpY3RbbnVtYmVyXQorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIChkZXNjLCBuYW1lKQorCiBkZWYgcGFyc2VfZXJyb3JzX2goZnAsIGRpY3QpOgotCWVycm5vX3Byb2cgPSByZS5jb21waWxlKEVSUk9SU19QUk9HKQotCWVycm5vX3Byb2dfMiA9IHJlLmNvbXBpbGUoRVJST1JTX1BST0dfMikKLQlmb3IgbGluZSBpbiBmcC5yZWFkbGluZXMoKToKLQkJbWF0Y2ggPSAwCi0JCW0gPSBlcnJub19wcm9nLm1hdGNoKGxpbmUpCi0JCW0yID0gZXJybm9fcHJvZ18yLm1hdGNoKGxpbmUpCi0JCWlmIG06Ci0JCQludW1iZXIgPSBzdHJpbmcuYXRvaShtLmdyb3VwKDIpKQotCQkJbmFtZSA9IG0uZ3JvdXAoMSkKLQkJCWRlc2MgPSBzdHJpbmcuc3RyaXAobS5ncm91cCgzKSkKLQkJCW1hdGNoPTEKLQkJZWxpZiBtMjoKLQkJCW51bWJlciA9IHN0cmluZy5hdG9pKG0yLmdyb3VwKDIpKQotCQkJbmFtZSA9IG0yLmdyb3VwKDEpCi0JCQlkZXNjID0gbmFtZQotCQkJbWF0Y2g9MQotCQlpZiBtYXRjaDoKLQkJCWlmIG51bWJlciA+IDA6IGNvbnRpbnVlCi0JCQkKLQkJCWlmIG5vdCBkaWN0Lmhhc19rZXkobnVtYmVyKToKLQkJCQlkaWN0W251bWJlcl0gPSBkZXNjLCBuYW1lCi0JCQllbHNlOgotCQkJCXByaW50ICdEVVBMSUNBVEUnLCBudW1iZXIKLQkJCQlwcmludCAnXHQnLCBkaWN0W251bWJlcl0KLQkJCQlwcmludCAnXHQnLCAoZGVzYywgbmFtZSkKLQkJCQlpZiBsZW4oZGVzYykgPiBsZW4oZGljdFtudW1iZXJdWzBdKToKLQkJCQkJcHJpbnQgJ1BpY2sgc2Vjb25kIG9uZScKLQkJCQkJZGljdFtudW1iZXJdID0gZGVzYywgbmFtZQotCQkJCisgICAgZXJybm9fcHJvZyA9IHJlLmNvbXBpbGUoRVJST1JTX1BST0cpCisgICAgZXJybm9fcHJvZ18yID0gcmUuY29tcGlsZShFUlJPUlNfUFJPR18yKQorICAgIGZvciBsaW5lIGluIGZwLnJlYWRsaW5lcygpOgorICAgICAgICBtYXRjaCA9IDAKKyAgICAgICAgbSA9IGVycm5vX3Byb2cubWF0Y2gobGluZSkKKyAgICAgICAgbTIgPSBlcnJub19wcm9nXzIubWF0Y2gobGluZSkKKyAgICAgICAgaWYgbToKKyAgICAgICAgICAgIG51bWJlciA9IHN0cmluZy5hdG9pKG0uZ3JvdXAoMikpCisgICAgICAgICAgICBuYW1lID0gbS5ncm91cCgxKQorICAgICAgICAgICAgZGVzYyA9IHN0cmluZy5zdHJpcChtLmdyb3VwKDMpKQorICAgICAgICAgICAgbWF0Y2g9MQorICAgICAgICBlbGlmIG0yOgorICAgICAgICAgICAgbnVtYmVyID0gc3RyaW5nLmF0b2kobTIuZ3JvdXAoMikpCisgICAgICAgICAgICBuYW1lID0gbTIuZ3JvdXAoMSkKKyAgICAgICAgICAgIGRlc2MgPSBuYW1lCisgICAgICAgICAgICBtYXRjaD0xCisgICAgICAgIGlmIG1hdGNoOgorICAgICAgICAgICAgaWYgbnVtYmVyID4gMDogY29udGludWUKKworICAgICAgICAgICAgaWYgbm90IGRpY3QuaGFzX2tleShudW1iZXIpOgorICAgICAgICAgICAgICAgIGRpY3RbbnVtYmVyXSA9IGRlc2MsIG5hbWUKKyAgICAgICAgICAgIGVsc2U6CisgICAgICAgICAgICAgICAgcHJpbnQgJ0RVUExJQ0FURScsIG51bWJlcgorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIGRpY3RbbnVtYmVyXQorICAgICAgICAgICAgICAgIHByaW50ICdcdCcsIChkZXNjLCBuYW1lKQorICAgICAgICAgICAgICAgIGlmIGxlbihkZXNjKSA+IGxlbihkaWN0W251bWJlcl1bMF0pOgorICAgICAgICAgICAgICAgICAgICBwcmludCAnUGljayBzZWNvbmQgb25lJworICAgICAgICAgICAgICAgICAgICBkaWN0W251bWJlcl0gPSBkZXNjLCBuYW1lCisKIGRlZiBtYWluKCk6Ci0JZGljdCA9IHt9Ci0JcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJXaGVyZSBpcyBHVVNJIHN5cy9lcnJuby5oPyIpCi0JaWYgcGF0aG5hbWU6Ci0JCWZwID0gb3BlbihwYXRobmFtZSkKLQkJcGFyc2VfZXJybm9faChmcCwgZGljdCkKLQkJZnAuY2xvc2UoKQotCQotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iU2VsZWN0IGNlcnJubyAoTVNMKSBvciBjYW5jZWwiKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUpCi0JCXBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IldoZXJlIGlzIE1hY0Vycm9ycy5oPyIpCi0JaWYgcGF0aG5hbWU6Ci0JCWZwID0gb3BlbihwYXRobmFtZSkKLQkJcGFyc2VfZXJyb3JzX2goZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JPcGVuKG1lc3NhZ2U9IldoZXJlIGlzIG1rZXN0cnJlcy1NYWNFcnJvcnMuaD8iKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUpCi0JCXBhcnNlX2Vycm9yc19oKGZwLCBkaWN0KQotCQlmcC5jbG9zZSgpCi0JCi0JaWYgbm90IGRpY3Q6Ci0JCXJldHVybgotCQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlJlc291cmNlIG91dHB1dCBmaWxlPyIsIHNhdmVkRmlsZU5hbWU9ImVycm9ycy5yc3JjIikKLQlpZiBwYXRobmFtZToKLQkJd3JpdGVlc3RyKGZzcywgZGljdCkKLQkKLQlwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlB5dGhvbiBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJtYWNlcnJvcnMucHkiKQotCWlmIHBhdGhuYW1lOgotCQlmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKLQkJd3JpdGVweXRob24oZnAsIGRpY3QpCi0JCWZwLmNsb3NlKCkKLQkJZnNzLlNldENyZWF0b3JUeXBlKCdQeXRoJywgJ1RFWFQnKQorICAgIGRpY3QgPSB7fQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iV2hlcmUgaXMgR1VTSSBzeXMvZXJybm8uaD8iKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUpCisgICAgICAgIHBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKIAotCXBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvclNhdmUobWVzc2FnZT0iVGV4dCBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJlcnJvcnMudHh0IikKLQlpZiBwYXRobmFtZToKLQkJZnAgPSBvcGVuKHBhdGhuYW1lLCAidyIpCi0JCQotCQlrID0gZGljdC5rZXlzKCkKLQkJay5zb3J0KCkKLQkJZm9yIGkgaW4gazoKLQkJCWZwLndyaXRlKCIlZFx0JXNcdCVzXG4iJShpLCBkaWN0W2ldWzFdLCBkaWN0W2ldWzBdKSkKLQkJZnAuY2xvc2UoKQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iU2VsZWN0IGNlcnJubyAoTVNMKSBvciBjYW5jZWwiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUpCisgICAgICAgIHBhcnNlX2Vycm5vX2goZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKIAotCQorICAgIHBhdGhuYW1lID0gRWFzeURpYWxvZ3MuQXNrRmlsZUZvck9wZW4obWVzc2FnZT0iV2hlcmUgaXMgTWFjRXJyb3JzLmg/IikKKyAgICBpZiBwYXRobmFtZToKKyAgICAgICAgZnAgPSBvcGVuKHBhdGhuYW1lKQorICAgICAgICBwYXJzZV9lcnJvcnNfaChmcCwgZGljdCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yT3BlbihtZXNzYWdlPSJXaGVyZSBpcyBta2VzdHJyZXMtTWFjRXJyb3JzLmg/IikKKyAgICBpZiBwYXRobmFtZToKKyAgICAgICAgZnAgPSBvcGVuKHBhdGhuYW1lKQorICAgICAgICBwYXJzZV9lcnJvcnNfaChmcCwgZGljdCkKKyAgICAgICAgZnAuY2xvc2UoKQorCisgICAgaWYgbm90IGRpY3Q6CisgICAgICAgIHJldHVybgorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSJSZXNvdXJjZSBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJlcnJvcnMucnNyYyIpCisgICAgaWYgcGF0aG5hbWU6CisgICAgICAgIHdyaXRlZXN0cihmc3MsIGRpY3QpCisKKyAgICBwYXRobmFtZSA9IEVhc3lEaWFsb2dzLkFza0ZpbGVGb3JTYXZlKG1lc3NhZ2U9IlB5dGhvbiBvdXRwdXQgZmlsZT8iLCBzYXZlZEZpbGVOYW1lPSJtYWNlcnJvcnMucHkiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKKyAgICAgICAgd3JpdGVweXRob24oZnAsIGRpY3QpCisgICAgICAgIGZwLmNsb3NlKCkKKyAgICAgICAgZnNzLlNldENyZWF0b3JUeXBlKCdQeXRoJywgJ1RFWFQnKQorCisgICAgcGF0aG5hbWUgPSBFYXN5RGlhbG9ncy5Bc2tGaWxlRm9yU2F2ZShtZXNzYWdlPSJUZXh0IG91dHB1dCBmaWxlPyIsIHNhdmVkRmlsZU5hbWU9ImVycm9ycy50eHQiKQorICAgIGlmIHBhdGhuYW1lOgorICAgICAgICBmcCA9IG9wZW4ocGF0aG5hbWUsICJ3IikKKworICAgICAgICBrID0gZGljdC5rZXlzKCkKKyAgICAgICAgay5zb3J0KCkKKyAgICAgICAgZm9yIGkgaW4gazoKKyAgICAgICAgICAgIGZwLndyaXRlKCIlZFx0JXNcdCVzXG4iJShpLCBkaWN0W2ldWzFdLCBkaWN0W2ldWzBdKSkKKyAgICAgICAgZnAuY2xvc2UoKQorCisKIGlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0JbWFpbigpCi0JCisgICAgbWFpbigpCmRpZmYgLS1naXQgYS9NYWMvc2NyaXB0cy96YXBweWNmaWxlcy5weSBiL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CmluZGV4IDAzNDkyMjAuLmE4MTkzYzEgMTAwNjQ0Ci0tLSBhL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CisrKyBiL01hYy9zY3JpcHRzL3phcHB5Y2ZpbGVzLnB5CkBAIC04LDMwICs4LDI5IEBACiBkb2l0ID0gMQogCiBkZWYgbWFpbigpOgotCWlmIG5vdCBzeXMuYXJndlsxOl06Ci0JCWlmIG9zLm5hbWUgPT0gJ21hYyc6Ci0JCQlpbXBvcnQgRWFzeURpYWxvZ3MKLQkJCWRpciA9IEVhc3lEaWFsb2dzLkFza0ZvbGRlcihtZXNzYWdlPSdEaXJlY3RvcnkgdG8gemFwIHB5YyBmaWxlcyBpbicpCi0JCQlpZiBub3QgZGlyOgotCQkJCXN5cy5leGl0KDApCi0JCQl6YXBweWMoZGlyKQotCQllbHNlOgotCQkJcHJpbnQgJ1VzYWdlOiB6YXBweWMgZGlyIC4uLicKLQkJCXN5cy5leGl0KDEpCi0JZm9yIGRpciBpbiBzeXMuYXJndlsxOl06Ci0JCXphcHB5YyhkaXIpCisgICAgaWYgbm90IHN5cy5hcmd2WzE6XToKKyAgICAgICAgaWYgb3MubmFtZSA9PSAnbWFjJzoKKyAgICAgICAgICAgIGltcG9ydCBFYXN5RGlhbG9ncworICAgICAgICAgICAgZGlyID0gRWFzeURpYWxvZ3MuQXNrRm9sZGVyKG1lc3NhZ2U9J0RpcmVjdG9yeSB0byB6YXAgcHljIGZpbGVzIGluJykKKyAgICAgICAgICAgIGlmIG5vdCBkaXI6CisgICAgICAgICAgICAgICAgc3lzLmV4aXQoMCkKKyAgICAgICAgICAgIHphcHB5YyhkaXIpCisgICAgICAgIGVsc2U6CisgICAgICAgICAgICBwcmludCAnVXNhZ2U6IHphcHB5YyBkaXIgLi4uJworICAgICAgICAgICAgc3lzLmV4aXQoMSkKKyAgICBmb3IgZGlyIGluIHN5cy5hcmd2WzE6XToKKyAgICAgICAgemFwcHljKGRpcikKIAogZGVmIHphcHB5YyhkaXIpOgotCW9zLnBhdGgud2FsayhkaXIsIHdhbGtlciwgTm9uZSkKLQkKKyAgICBvcy5wYXRoLndhbGsoZGlyLCB3YWxrZXIsIE5vbmUpCisKIGRlZiB3YWxrZXIoZHVtbXksIHRvcCwgbmFtZXMpOgotCWZvciBuYW1lIGluIG5hbWVzOgotCQlpZiBuYW1lWy00Ol0gaW4gKCcucHljJywgJy5weW8nKToKLQkJCXBhdGggPSBvcy5wYXRoLmpvaW4odG9wLCBuYW1lKQotCQkJcHJpbnQgJ1phcHBpbmcnLCBwYXRoCi0JCQlpZiBkb2l0OgotCQkJCW9zLnVubGluayhwYXRoKQotCQkJCQorICAgIGZvciBuYW1lIGluIG5hbWVzOgorICAgICAgICBpZiBuYW1lWy00Ol0gaW4gKCcucHljJywgJy5weW8nKToKKyAgICAgICAgICAgIHBhdGggPSBvcy5wYXRoLmpvaW4odG9wLCBuYW1lKQorICAgICAgICAgICAgcHJpbnQgJ1phcHBpbmcnLCBwYXRoCisgICAgICAgICAgICBpZiBkb2l0OgorICAgICAgICAgICAgICAgIG9zLnVubGluayhwYXRoKQorCiBpZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotCW1haW4oKQotCQorICAgIG1haW4oKQo=